commit 9f9c9a70cce4655844c33b8758c33fce09bfcf4f
Author: IQ.Lvbs history cleanup
Date: Sat Aug 22 23:42:42 2026 -0500
IQ.Pilot Prebuilt Release @ ab07000
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..bd9b84ed6
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,57 @@
+* text=auto eol=lf
+
+# to move existing files into LFS:
+# git add --renormalize .
+selfdrive/assets/icons/iq/rotate-ccw.svg -filter -diff -merge -text
+selfdrive/assets/icons/iq/rotate-ccw.png -filter -diff -merge -text
+selfdrive/assets/icons/iq/rotate-cw.svg -filter -diff -merge -text
+selfdrive/assets/icons/iq/rotate-cw.png -filter -diff -merge -text
+selfdrive/assets/icons/iq/square-parking.svg -filter -diff -merge -text
+selfdrive/assets/icons/iq/square-parking.png -filter -diff -merge -text
+
+# Keep this icon in regular git (not LFS) for lightweight branding iteration.
+selfdrive/assets/icons_mici/experimental_mode_mici.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/experimental_mode_tizi.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/iqdynamic_mode_mici.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/iqstandard_mode_mici.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/iqstandard_mode_tizi.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_center.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/konn3kt_icon.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png -filter -diff -merge -text
+iqpilot/selfdrive/assets -filter -diff -merge -text
+selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/setup/green_button.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/setup/green_button_pressed.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/setup/green_dm.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/setup/green_info.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png -filter -diff -merge -text
+selfdrive/assets/images/spinner_comma.png -filter -diff -merge -text
+selfdrive/assets/images/k3_spinner.png -filter -diff -merge -text
+selfdrive/assets/icons/camera.png -filter -diff -merge -text
+selfdrive/assets/fonts/Syncopate-Regular.ttf -filter -diff -merge -text
+selfdrive/assets/fonts/Tektur-Variable.ttf -filter -diff -merge -text
+tools/jotpluggler/assets/bootstrap-icons.ttf -filter -diff -merge -text
+
+
+
+# IQ assets, including icon_longitudinal.png, should stay in normal git (not LFS).
+iqpilot/selfdrive/assets/** -filter -diff -merge -text
+
+# mici UI icons stored as plain PNG — gitlab LFS server lacks these objects
+selfdrive/assets/icons_mici/buttons/button_circle_pressed.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/models.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/brightness.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/camera.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/keyboard/enter.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/sd_card.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/software.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/trips.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/settings/vehicle.png -filter -diff -merge -text
+selfdrive/assets/icons_mici/speedometer.png -filter -diff -merge -text
+
+selfdrive/assets/icons/iq/*.png -filter -diff -merge -text
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..80fb9e9ee
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,180 @@
+venv/
+.venv/
+!artifacts/runtime/ble/rootfs/usr/local/venv/
+!artifacts/runtime/ble/rootfs/usr/local/venv/**
+# Runtime install dir for proprietary bundles — rewritten by ensure_private_installed
+# on every service start. Tracking anything under it keeps the working tree
+# perpetually dirty and sends the updater into an apply/restart loop that kills
+# ble-transportd (and comma.service) every few minutes.
+/.iqpilot/
+.ci_cache
+.env
+.clang-format
+http-client.private.env.json
+.DS_Store
+.tags
+.ipynb_checkpoints
+.idea
+.overlay_init
+.overlay_consistent
+.sconsign.dblite
+a.out
+.hypothesis
+.cache/
+
+/docs_site/
+
+*.mp4
+*.dylib
+*.DSYM
+*.d
+!artifacts/runtime/ble/rootfs/etc/udev/rules.d/
+!artifacts/runtime/ble/rootfs/etc/udev/rules.d/**
+*.pyc
+!artifacts/iqpilot_*_private/**/*.pyc
+*.pyo
+.*.swp
+.*.swo
+.*.un~
+*.tmp
+*.o
+*.o-*
+*.os
+*.os-*
+*.so
+!artifacts/iqpilot_*_private/**/*.so
+!artifacts/runtime/ble/rootfs/usr/local/venv/**/*.so
+artifacts/iqpilot_private/
+artifacts/iqpilot_*_private/python/iqpilot_private/**/*.cpython-*-darwin.so
+*.a
+*.clb
+*.class
+*.pyxbldc
+*.vcd
+*.mo
+*_pyx.cpp
+*.stats
+config.json
+clcache
+compile_commands.json
+compare_runtime*.html
+
+selfdrive/pandad/pandad
+cereal/services.h
+cereal/gen
+cereal/messaging/bridge
+selfdrive/ui/translations/tmp
+selfdrive/car/tests/cars_dump
+system/camerad/camerad
+system/camerad/test/ae_gray_test
+
+.coverage*
+coverage.xml
+htmlcov
+pandaextra
+
+.mypy_cache/
+flycheck_*
+
+cppcheck_report.txt
+comma*.sh
+
+selfdrive/modeld/models/*.pkl
+!selfdrive/modeld/models/driving_vision_tinygrad.pkl
+!selfdrive/modeld/models/driving_policy_tinygrad.pkl
+!selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl
+!selfdrive/modeld/models/driving_vision_metadata.pkl
+!selfdrive/modeld/models/driving_policy_metadata.pkl
+!selfdrive/modeld/models/dmonitoring_model_metadata.pkl
+iqpilot/modeld*/thneed/compile
+iqpilot/modeld*/models/*.thneed
+iqpilot/modeld*/models/*.pkl
+
+# openpilot log files
+*.bz2
+*.zst
+
+build/
+
+!**/.gitkeep
+
+poetry.toml
+Pipfile
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+.claude/
+PLAN.md
+TASK.md
+
+### JetBrains ###
+!.idea/customTargets.xml
+!.idea/tools/*
+!.run/*
+/.antigravitycli/
+/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/_iqcrypto.cpython-312-aarch64-linux-gnu.so
+/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc_handshake.cpython-312-aarch64-linux-gnu.so
+/artifacts/iqpilot_alc_bundle.json
+/iqpilot/selfdrive/iqlocd/iqlocd
+/iqpilot/selfdrive/iqlocd/models/generated/car.cpp
+/iqpilot/selfdrive/iqlocd/models/generated/car.h
+/tools/scripts/debug/
+!scripts/iqpilot/iqos_usrlocal_larch64.tar.zst
+
+# pretty-build capture logs (model compile / mpc + dbc codegen stdout+stderr)
+*_tinygrad.pkl.log
+*_metadata.pkl.log
+selfdrive/controls/lib/*_mpc_lib/gen.log
+tools/cabana/dbc/*.json.log
+iqpilot/selfdrive/iqlocd/models/generated/
+osmaps_build/
+
+# --- local scratch/debug + large model artifacts (never commit) ---
+/infinite_driver/
+/konn3kt_private/
+/_pq*.py
+/bus_topo.py
+/cluster_bus.py
+/real_cluster_bus.py
+/dbg_big.py
+/decode_*.py
+/dtc_decoder.py
+/eps_decode.py
+/extract_nm_*.py
+/ffff_map.py
+/kmatrix_*.py
+/mcd_*.py
+/shot_*.py
+/verify_crc.py
+/CODEX_HANDOFF_*.md
+/SUNNYPILOT_REMEDIATION_PLAN.md
+/prompt.md
+/iqos44_bluetooth_gamepad_spec.md
+tools/mac_egpu/*.pkl
+selfdrive/ui/tests/test_ui/nav_demo_report/
+**/__pycache__/
+*.pyc
+*.mlpackage/
+
+
+# fetcher: closed-source precompiled component — ship only the obfuscated .so
+/iqpilot/models_private_src/fetcher.py
+
+/tools/iqmacvisiond/macos/dist/
diff --git a/.lfsconfig-comma b/.lfsconfig-comma
new file mode 100644
index 000000000..42dfa2d94
--- /dev/null
+++ b/.lfsconfig-comma
@@ -0,0 +1,4 @@
+[lfs]
+ url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs
+ pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git
+ locksverify = false
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..484d284d0
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,230 @@
+# IQ.Pilot User Changelog
+
+This changelog is written for everyday drivers and focuses on what you will notice on the road, as well as changes under-the-hood.
+
+## IQ.Pilot 1.0c
+
+
+**Navigate on IQ.Pilot**
+
+Navigate on IQ.Pilot is here. Search for a destination, pick from route alternatives, and let IQ.Pilot guide you turn by turn with live rerouting when you miss an exit. Along with on-screen-maps, you can see your position, the route, and upcoming turns all at once without leaving the driving view. Speed, turn, and highway exit handling are route-aware, so IQ.Pilot knows what's coming before you do. Mapbox is included at no cost to you for enhanced online map data and routing. On supported vehicles, Navigate on IQ.Pilot will command turn signals automatically based on the route. Map Curve speed control pulls limit data from OpenStreetMaps when offline and Mapbox when available.
+
+When approaching a highway exit, IQ.Pilot now initiates the lane change toward the exit. If your car has Blind Spot Monitoring (BSM), it can perform the lane change fully automatically, there's no blinker nudge required. Without BSM, you confirm with a brief blinker push and IQ.Pilot takes it from there.
+
+**Speed Limit Control (SLC)**
+
+IQ.Pilot can now read and act on speed limits from your car's dash, Mapbox, TomTom, HERE, (included at no cost to our users!) and offline maps. You pick what mode you want in settings: display only, warn you when you're over, or actually adjust your cruise speed. You also pick which source wins when they disagree (dash, Mapbox, map data, highest, or lowest reported limit). There's a look ahead setting so IQ.Pilot can start reacting to an upcoming speed change before you hit the sign to decelerate to the limit before crossing into the new speed limit.
+
+SLC can now also raise your cruise speed automatically when the speed limit increases, not just lower it. Toggle "confirm higher speed limit" off to enable this, SLC will adjust up to a higher accepted limit with a small prompt, without any confirmation input needed.
+
+**Camera Alerts (Speed Cameras, Red Light Cameras, and Surveillance / ALPR Cameras)**
+
+IQ.Pilot now detects upcoming speed cameras, red light cameras, and ALPR/surveillance cameras (including Flock Safety cameras) sourced from OpenStreetMap's and alerts you before you reach them. Each camera type has its own toggle so you can pick what you want to be warned about. Speed cameras can also trigger a speed reduction to the limit when detected if enabled. Camera data is sourced from OSM and is updated periodically.
+
+**Direct Flock / ALPR Camera Detection (Bluetooth & WiFi)**
+
+Beyond map data, IQ.Pilot can now spot Flock Safety and similar ALPR cameras directly over the air by their Bluetooth and WiFi signatures as you approach them. Because it's sensing the actual hardware rather than relying on a map, this works anywhere, including fully offline and even for cameras that haven't been mapped yet, so you get a heads-up the moment one is nearby. When IQ.Pilot picks up a camera directly, that live detection takes priority over map data, so you see a single clear "Flock Camera Detected" alert instead of a duplicate. It shares the same Flock camera alert toggle, runs quietly in the background only when that's enabled, and is built to stay out of the way of your Bluetooth (phone link, game controllers) and WiFi connections.
+
+**IQ.Dynamic and Driving Behavior**
+
+In IQ.Dynamic blended mode, when IQ.Pilot sees a stop light ahead, and the model agrees you need to stop, and there's no lead car to track, it will now commit (force) to stopping on its own, no lead car required. Gas pedal overrides it instantly. The stop prediction horizon is adjustable in IQ.Dynamic settings. Behavior for curves, low-speed driving, stopped leads, speed-limit fallbacks, and vision-based stops is now configurable. On-device IQ.Dynamic tuning is accessible by double-tapping IQ.Dynamic in longitudinal mode selection.
+
+Force Stops now include "Smooth Stops" under the same toggle thank's to SpysyWeeb! With Force Stops on, all stops including model predicted stops at signs and lights now use the smooth landing law, so every stop settles gently rather than dropping in hard. The minimum force stop distance slider enforces minimum distance when configured.
+
+IQ.Dynamic on supported Volkswagen platforms including MQB, and PQ now support blending OEM Stock Radar ACC with IQ.Dynamic to allow for a blended longitudinal experience while maintaining E2E IQ.Pilot functionality.
+
+**Driving Models**
+
+IQ.Pilot updated to a new default driving model, `Pop!`
+
+IQ.Pilot also has the latest bleeding-edge models, as always, including the latest TobyRL model, NoPP model, DeeperRL model, DeepRLv3/4/5 models, OP Model 16 Deep, and all future RL models as they are released.
+
+IQ.Pilot maintains supports for all legacy models like `Notre Dame (v1/3)`, `FarmVille`, `WD40`, etc.
+
+**Dashcam, Live View, and Alerts**
+
+- WebSSH now connects in under 15 seconds and connects the first time, every time.
+- Live View in the Konn3kt app now processes full-resolution HDR input from the Comma 4 driver camera for a noticeably sharper, and more accurate picture. Live View performance was optimized, and microphone audio (one way) streaming is now included.
+- You can fully disable dashcam recording from the Konn3kt app. Turning it off stops all recording, no logs, no video, no audio, full stop.
+- Audible alerts now ramp in volume smoothly instead of cutting in abruptly for enhanced auditory alerts.
+- On-road live streaming, with Two-Way Audio streaming from your IQ.Pilot devices camera feed live through the Konn3kt app. Onroad choppiness fixed, keyframe-on-demand enabled for instant camera switches, and variable network-condition-adaptive bitrate.
+- Konn3kt can now take a snapshot from any camera (road, driver, or wide) on-demand, both onroad and offroad, and returns it as a JPEG instantly for a glance.
+
+**Volkswagen**
+
+Volkswagen support got a significant overhaul:
+
+- Lateral and longitudinal tuning greatly improved.
+- Accelerator override behavior now matches stock feel.
+- MQB SnG handling improved for supported non-EPB ACC FtS vehicles.
+- IQ.Pilot now supports all VW PQ and MQB CC-only and (A)CC-less cars, including CC-only PQ cars without an ADAS gateway.
+- Volkswagen Passat B7 (PQ) with TRW450 now supports Stop-and-Go.
+- Volkswagen MEB/MQBevo now only go on-road when in Drive and no longer in Park for 15 minutes after parking the car.
+- Added Passat (PQ) model year ECU fingerprint.
+- Konn3kt can now check EPS compatibility and LKAS coding status on VW MQB vehicles with a comma power.
+- Konn3kt can enable LKAS coding on supported VW MQB vehicles with EPS that didn't ship with factory LKAS with a comma power.
+- Volkswagen MQB/PQ now supports full Radar Blending with IQ.Dynamic for an enhanced E2E + Highway experience. (limited by OEM ACC minimum speed)
+
+**Volkswagen MEB and MQBevo**
+
+IQ.Pilot now **officially** supports the Volkswagen MEB and MQBevo platforms! Including the ID.4, ID.3, ID.5, and Golf MK8 through model year 2025, as long as you have a compatible camera or gateway harness. Both LKAS and ACC are supported. This is the foundation of the `release-meb` branch, which is auto-synced from `release` and tailored specifically for these platforms.
+
+**Toyota/Lexus**
+
+Support added for Stop-and-Go and SDSU for Toyota/Lexus vehicles.
+
+**Hyundai/Kia**
+
+Fingerprint coverage expanded to cover more Hyundai/Kia variants that were previously unrecognized, and proper CAN-FD handling for newer HKG.
+
+**UI — Comma 4 (mici)**
+
+The Comma 4's offroad UI has been completely redesigned and has had major performance optimizations, it contains the same settings that BIG UI contains on Comma 3x/3 devices.
+
+**UI — Comma 3x and Comma 3 (tizi/tici)**
+
+The tizi/tici (Comma 3x and Comma 3) onroad and offroad UI has been fully redesigned as well, matching the new IQ.Pilot design language with a brand new home screen, status bar, settings menu's, and should be a much better experience.
+
+**UI Improvements**
+
+IQ.Pilot's on-road UI got a number of improvements:
+
+- The Steering Assistance border now has a lower portion that distinguishes lateral only engagement from full engagement.
+- IQLong Personality can now be cycled on-road by tapping the driver-monitoring icon on BIG UI devices. The icon color reflects the currently selected personality as well as an on screen current profile confirmation.
+- IQLong mode IQ.Standard has been renamed to IQ.Chill to lessen confusion on long modes.
+- IQLong mode can now be cycled on-road by tapping the nucleus icon in the top right corner on BIG UI devices. The icon changes to reflect IQ.Chill/Dynamic/Pilot.
+- Fixed augmented road view calibration showing invalid calibration data on the model path / tracked lane lines by refreshing the matrix cache correctly for calibration to properly update on startup with Navigation enabled.
+- Live Konn3kt accent color sync: whatever color you pick in the Konn3kt app flows to your device UI instantly.
+- Revamped Branch switcher to properly switch branches, and updater has had bugfixes to fix install issues where the device claims to have updated but has not actually updated.
+
+
+**IQ.OS 4.9.1**
+
+IQ.OS 4.9.1 is bundled with IQ.Pilot 1.0c. IQ.OS is available for all supported devices: Comma 3, Comma 3x, Comma 4, Konik A1/M, and Mr.One C3/C3 Lite. It's a lightweight OS based on Ubuntu 24.04, includes Bluetooth (BLE), has a much smaller install footprint, and is continuously optimized for IQ.Pilot.
+
+- Konn3kt now stays online regardless of IQ.Pilot's status. If IQ.Pilot fails to boot, Konn3kt remains available so you can switch branches, SSH in, and recover remotely without a physical connection, including over cellular.
+- Bug causing konn3kt setup time on a fresh install dropped from ~30 minutes fixed, setup dropped down to ~10 seconds.
+- Automatic LocalAPI configuration in Konn3kt.
+- Fixed Upstream Comma 4/3x/3 AGNOS Wi-Fi driver crash causing random crashes while driving.
+- Fixed Comma 4 green-dot-matrix text aliasing issue.
+- Fixed Comma 4 display calibration not showing for accurate colors.
+
+**Updater: Pre-download Mode**
+
+A new "Update Install Mode" setting in Software settings gives you control over how updates are applied:
+
+- **Predownload Only** — updates download in the background but wait for you to confirm before installing.
+- **Predownload + Preinstall** — downloads and installs automatically on next boot, as it was before.
+
+**Konn3kt Services**
+
+Konn3kt's WebApp has migrated to `app.konn3kt.com`
+
+Connection stability between Konn3kt and IQ.Pilot (Konn3ktion) is greatly improved.
+
+**eSIM**
+
+eSIM detection, provisioning, and profile management groundwork is now built into the device. The app can detect whether your device has an embedded SIM, provision it, and manage profiles without a physical SIM swap. eSIM support requires a compatible data plan; Contact IQ.Pilot support in the discord for known working eSIM carriers and plans. Note: eSIM is experimental and generally requires a hotspot-style data plan or an MVNO that does not IMEI filter.
+
+**Additional 1.0c Updates**
+
+**Navigate on IQ.Pilot and Offline Maps**
+
+- Added Home, Work, and Recent destination shortcuts, route cancellation, saved-destination management, and course-up map rotation.
+- Added an interactive off-road map with panning and current-location display, plus on-screen maneuver artwork for turns, merges, forks, off-ramps, continuation instructions, and arrival.
+- Added navigation-memory handling so important fork and exit guidance remains available when a model output briefly omits it.
+- Added full offline routing through a packaged Valhalla runtime. Navigation can now operate without Mapbox or an active internet connection.
+- Added simultaneous installation of multiple offline regions, including offline raster tiles for the displayed map as well as routing and road metadata.
+- Added separate Online On-Screen Maps and Offline On-Screen Maps controls, resumable regional downloads, combined routing-and-tile download progress, automatic mapd v2 region recognition and missing-data restoration.
+- Added a hosted regional tile-bundle service with a fallback source, background tile decoding, and bounded texture caching to keep map work off the UI render path.
+- Reduced navigation CPU, GPU, and memory overhead so maps can remain open for long drives without competing with the driving model.
+
+**IQ Speed Assist and Camera Alerts**
+
+- Added the new IQ Speed Assist architecture, with TomTom data alongside dashboard, Mapbox, and offline OpenStreetMap sources.
+- Added optional cruise-set-speed mirroring, percentage-based offset zones for low, medium, and higher speed ranges, and earlier, smoother upcoming-speed-limit reactions in the longitudinal cruise envelope.
+- Added clearer on-road SLC source, state, pending-limit, and adaptation feedback.
+- Added individual controls for speed, red-light, and Flock/ALPR alerts, plus optional speed-camera slowdown using the detected limit and a configurable safety factor.
+- Added haptic speed-camera feedback on supported Hyundai, Kia, and Genesis vehicles.
+
+**Construction Zone Assist**
+
+- Added optional camera-based Construction Zone Assist, which detects bright-orange work-zone barrels and markers.
+- Added an adjustable work-zone target speed (60 mph by default), plus daylight, road-speed, and active-zone checks to reduce unrelated reflective detections.
+- Added lightweight processing designed to run alongside the driving and driver-monitoring models.
+
+**IQ.Dynamic, Stops, and Longitudinal Control**
+
+- Added separate IQ.Dynamic road-speed and lead-speed thresholds, configurable curve, low-speed, slower-lead, stopped-lead, and model-predicted-stop activation, and an adjustable model-stop prediction horizon.
+- Added automatic Volkswagen stock-radar set-speed and following-gap synchronization when radar blending is enabled on supported PQ vehicles.
+- Added an independent custom stopping-distance adjustment, smoother stopped-lead pull-away, and end-to-end launch assistance when the model predicts an opening path.
+- Added dedicated departure chimes for an opening path and a pulling-away lead, Experimental Lead MPC, and end-to-end cruise convergence toward the selected speed as the road opens.
+- Added configurable end-to-end set-speed selection using either a preset or the driver’s current target, per-platform stopping overrides, accelerator-override longitudinal control on supported vehicles, and predictive reactions to speed limits and curves.
+
+**Steering, Lane Changes, and Environment View**
+
+- Added an on-road Always-On Lateral control path for supported Hyundai LFA buttons and Bluetooth-controller commands for testing or controlling it in Joystick Mode.
+- Added continuous lane changes while the blinker is held, while retaining driver confirmation for subsequent maneuvers.
+- Added configurable model-action smoothing, angle-based lateral control, optional VW ALC torque blending, a dedicated Volkswagen PQ HCA7 torque controller, and live-learned curvature correction for supported Volkswagen MEB configurations.
+- Added an optional Environment View that can replace the model scene and render 3D object boxes, a ground grid, lane lines, road edges, and the planned path.
+- Added a precompiled Qualcomm IQ.Vision model and bandwidth-efficient camera preprocessing to reduce contention with the primary driving model.
+
+**Driving Models and IQModeld**
+
+- Added the unified IQModeld runtime and native bridge for current combined models and legacy split models.
+- Added fused vision-and-policy execution for supported supercombo bundles, zero-copy camera-frame handling through the tinygrad runner, and unified combined-artifact, combined-split, fused, tinygrad, and ONNX runner support.
+- Added current-model redownload, manifest refresh when published models change, a clear Driving Model Updating state, and engagement gating until the selected model is ready.
+
+**Home, On-Road UI, and Visuals**
+
+- Added dedicated Routes, Navigation, Video, and status surfaces, a selectable home-panel widget, 60 fps off-road BIG UI presentation, and device-specific frame pacing.
+- Added Comma 4 anti-aliasing, augmented-road presentation, driver-camera orientation improvements, and an expanded status bar with temperature, vehicle state, Konn3kt status, and connected Wi-Fi network name.
+- Added the installed IQ.OS version to Software settings, tappable branch information in the BIG UI header, smooth edge-swipe navigation, transitions, parallax, shadows, animated controls, and a seamless build-spinner-to-UI transition.
+- Added a glowing primary-lead orb, IQ.Pilot teal and pink acceleration-bar styling, a top-bar Silent Mode bell, Night Mode display sleep after sunset, and screen recording through Konn3kt.
+
+**Dashcam and Route Viewer**
+
+- Increased qcamera resolution by 5× while balancing storage and upload use.
+- Added crash-safe route writes, frequent durable checkpoints, power-loss preservation, and boot-time recovery for incomplete recordings.
+- Added an on-device Routes screen with date, duration, camera availability, cloud-upload state, and local, uploading, uploaded, and cloud-only badges.
+- Added local playback of road, wide, and driver video with synchronized audio; cloud-only route discovery and streaming through Konn3kt; and synchronized telemetry, model path, steering angle, driver-monitoring, vehicle speed, and cruise-set-speed overlays.
+- Added qlog-only route visualization, fullscreen playback, auto-hiding controls, loading feedback, scrubbing, fast-forward speeds, hardware HEVC decode, local-time presentation, bounded playback buffering, and screen-awake behavior during playback.
+
+**Live View, Audio, and WebSSH**
+
+- Added a Live View indicator on the driving screen, dual-camera picture-in-picture streaming, and live model-path overlay while both the device and Konn3kt use cellular.
+- Added instant keyframe requests, network-adaptive encoder bitrate, and full-resolution HDR driver-camera input on Comma 4.
+
+**Konn3kt Services, Bluetooth, and Backup**
+
+- Added independent device services that stay available when IQ.Pilot is stopped or cannot enter its main UI, including OS-level recovery over Wi-Fi and cellular.
+- Added a dedicated `iquploaderd` route-and-log uploader, automatic IQ.Pilot crash-log uploads, Volkswagen and Tesla odometer display, backup-and-restore services, encrypted backup archives, backup status, and Konn3kt RPC support for compatible Volkswagen coding and diagnostics.
+- Added direct Bluetooth Low Energy control across comma 3, comma 3X, comma 4, Konik, and Mr.One hardware, including authenticated requests, replay protection, settings synchronization, automatic discovery and pairing, and fallback when internet connectivity is unavailable.
+- Added BLE control for supported IQ.Pilot, vehicle, display, network, navigation, and driving settings; live propagation to active services; and setup-stage Wi-Fi scanning, Wi-Fi connection, network status, channel selection, install start, setup progress, and installation status.
+
+**Volkswagen PQ and MQB**
+
+- Added Always-On Lateral for ECAN, non-ECAN/ACAN, CC-only, and CC-less PQ configurations; SEAT Alhambra TRW460i Stop-and-Go with automatic resume; and Stop-and-Go for additional electronic-parking-brake configurations.
+- Added MQB-A0 automatic resume and steering-lockout options, standstill handling for supported non-EPB ACC vehicles, and ACC-command suppression while braking.
+- Added dedicated PQ radar engagement, cancellation, set-speed, acceleration, and following-gap management; automatic PQ EPS-patch detection; and patch-aware minimum-steering-speed handling.
+- Added a PQ firmware tool with backup, dump upload, patch detection, programming, and recovery; persistent PQ LKAS coding over TP2.0/KWP; model-year ECU fingerprinting; expanded Passat identification; distance-button mapping; dashboard personality presentation; and continued MQB lateral control while cruise is faulted.
+- Added stock lateral handoff when IQ.Pilot lateral is inactive, explicit Volkswagen readiness handling, and Volkswagen odometer persistence with cloud backup.
+
+**Platform Support**
+
+- Added MEB/MQBevo steering ratios, steering behavior, zero-speed steering where supported, ACC-HUD handling, and Drive/Park state handling. Supported configurations include ID.3, ID.4, ID.5, and Golf Mk8 through model year 2025.
+- Added Honda-specific final-stopping deceleration control, Subaru Creep from Standstill, and guarded Tesla vehicle-bus parsing for supported harnesses.
+- Added more Hyundai/Kia/Genesis CAN-FD and HDA2 handling, radar-track and corner-radar controls, Camera SCC and platform-specific cruise controls, Auto Cruise Control and Auto Engage, custom steering and steering-rate controls, lane-change steering-rate controls, and expanded parameter/fingerprint diagnostics.
+
+**IQ.OS, Power, Network, and Recovery**
+
+- Updated the bundled platform to IQ.OS 4.9.1, with device-specific boot and display support, Comma 4 display calibration, HDR camera and display-color support, USB 3 logging, USB link-error recovery, 2 GB compressed zram swap, and consistent startup runtime packaging.
+- Added FastSleep deep standby, including five-minute idle entry after parking, low-voltage entry, staged voltage shutdown thresholds, suspension of high-power services, Konn3kt recovery connectivity during standby, voltage-aware power decisions, and immediate wake on ignition or charging.
+- Added zero-touch Bluetooth onboarding, Konn3kt pairing-code presentation, IQ.OS update confirmation, Bluetooth game-controller support for Joystick Mode, and Bluetooth operation independent of the main IQ.Pilot process.
+- Added a redesigned Network settings experience, explicit Wi-Fi Disconnect, cellular reconnection after APN changes, Comma 3X SIM electrical-probe recovery, and QR/manual eSIM activation with profile listing, refresh, enable, disable, and deletion.
+- Added Force On-Road for a temporary ten-minute parked diagnostic session, an Update & Reboot recovery-screen action, and USB Storage mode.
+
+**Updater, Reliability, and Performance**
+
+- Added Konn3kt confirmation before IQ.OS updates, interrupted submodule/artifact-preparation recovery, precompiled release preparation for comma 3, comma 3X, and comma 4, and crash-screen update-and-reboot without entering the full UI.
+- Added independent model, navigation, map, uploader, backup, and perception services; navigation/map recovery that does not block engagement; power-state coordination; startup parameter ownership and permission normalization; message-queue dead-reader cleanup; lower shared-memory use; and clearer build, process-state, and diagnostic output.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..16c9b47c9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,107 @@
+IQ.Lvbs License v0.1a
+
+Copyright (c) 2026 IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. All Rights Reserved.
+
+DEFINITIONS
+
+"Software" refers to IQ.Pilot, konn3kt, and all associated source code,
+documentation, and assets owned by the Copyright Holder.
+
+"Open Components" refers to portions of the Software explicitly marked as
+open source.
+
+"Proprietary Components" refers to all portions of the Software not made
+available to the public in source form.
+
+"Copyright Holder" refers to IQ.Lvbs LLC, a part of Project Teal Lvbs Inc.
+
+GRANT OF LICENSE
+
+Subject to the terms of this license, you are granted a limited,
+non-exclusive, revocable license to:
+
+1. View, study, and learn from the Open Components
+2. Modify the Open Components for personal, internal, or open-source public use
+3. Run the Software for personal, non-commercial purposes
+
+RESTRICTIONS
+
+You may NOT:
+
+1. Claim ownership of any part of the Software, excluding your own
+ modifications that do not incorporate Proprietary Components.
+
+2. Reverse engineer, decompile, disassemble, or in any way attempt to
+ circumvent the obfuscation of the Proprietary Components.
+
+3. Use the Software or any derivative for commercial purposes without
+ explicit written permission from the Copyright Holder.
+
+4. Remove or alter any copyright notices or this license.
+
+5. Sublicense, sell, or transfer rights to the Software.
+
+6. Use the Software and/or its source code to compete with or create a
+ substantially similar product.
+
+7. Use the Software in closed source software not licensed by IQ.Lvbs LLC.
+
+CONSEQUENCES OF VIOLATION
+
+In the event any Restriction is violated, any product created using inspiration from, or source code from, IQ.Pilot or Konn3kt shall be subject to a licensing fee determined solely by the Copyright Holder. Additionally, the violating party hereby grants IQ.Lvbs LLC an exclusive, irrevocable, worldwide, royalty-free license to use any and all assets from the infringing product on IQ.Lvbs webpages, advertising materials, and in any other manner IQ.Lvbs sees fit.
+
+OWNERSHIP
+
+All rights, title, and interest in the Software remain exclusively with the
+Copyright Holder. Any modifications, improvements, or derivative works you
+create based on the Software are owned by the Copyright Holder. By
+contributing modifications, you irrevocably assign all rights to the
+Copyright Holder.
+
+PROPRIETARY COMPONENTS
+
+The Proprietary Components are provided in binary or obfuscated form only.
+Reverse engineering, decompilation, or disassembly of Proprietary Components
+is strictly prohibited. Violation of this provision entitles IQ.Lvbs LLC to
+pursue all available legal remedies to protect its intellectual property and
+trade secrets.
+
+NO WARRANTY
+
+THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT
+HOLDER DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+NON-INFRINGEMENT.
+
+LIMITATION OF LIABILITY
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR
+OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE. THE USER ACCEPTS FULL
+RESPONSIBILITY FOR ANY AND ALL LIABILITIES WHEN USING IQ.LVBS SOFTWARE.
+
+TERMINATION
+
+This license terminates automatically if you violate any of its terms. Upon
+termination, you must destroy all copies of the Software in your possession.
+
+The Copyright Holder reserves the right to revoke this license at any time
+for any reason.
+
+GOVERNING LAW
+
+This license shall be governed by the laws of the State of Illinois, United
+States of America. Any disputes arising under this license shall be subject
+to the exclusive jurisdiction of the courts located in The State of Illinois, United States.
+
+---
+
+For commercial licensing inquiries, contact: support@iqlvbs.com
+
+IQ.Pilot is a fork of Stock OpenPilot maintained by Comma.ai, Inc. licensed under the following notice:
+Copyright (c) 2018, Comma.ai, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 000000000..b6e8c82d2
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,107 @@
+IQ.Lvbs License v0.1a
+
+Copyright (c) 2026 IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. All Rights Reserved.
+
+DEFINITIONS
+
+"Software" refers to IQ.Pilot, konn3kt, and all associated source code,
+documentation, and assets owned by the Copyright Holder.
+
+"Open Components" refers to portions of the Software explicitly marked as
+open source.
+
+"Proprietary Components" refers to all portions of the Software not made
+available to the public in source form.
+
+"Copyright Holder" refers to IQ.Lvbs LLC, a part of Project Teal Lvbs Inc.
+
+GRANT OF LICENSE
+
+Subject to the terms of this license, you are granted a limited,
+non-exclusive, revocable license to:
+
+1. View, study, and learn from the Open Components
+2. Modify the Open Components for personal, internal, or open-source public use
+3. Run the Software for personal, non-commercial purposes
+
+RESTRICTIONS
+
+You may NOT:
+
+1. Claim ownership of any part of the Software, excluding your own
+ modifications that do not incorporate Proprietary Components.
+
+2. Reverse engineer, decompile, disassemble, or in any way attempt to
+ circumvent the obfuscation of the Proprietary Components.
+
+3. Use the Software or any derivative for commercial purposes without
+ explicit written permission from the Copyright Holder.
+
+4. Remove or alter any copyright notices or this license.
+
+5. Sublicense, sell, or transfer rights to the Software.
+
+6. Use the Software and/or its source code to compete with or create a
+ substantially similar product.
+
+7. Use the Software in closed source software not licensed by IQ.Lvbs LLC.
+
+CONSEQUENCES OF VIOLATION
+
+In the event any Restriction is violated, any product created using inspiration from, or source code from, IQ.Pilot or Konn3kt shall be subject to a licensing fee determined solely by the Copyright Holder. Additionally, the violating party hereby grants IQ.Lvbs LLC an exclusive, irrevocable, worldwide, royalty-free license to use any and all assets from the infringing product on IQ.Lvbs webpages, advertising materials, and in any other manner IQ.Lvbs sees fit.
+
+OWNERSHIP
+
+All rights, title, and interest in the Software remain exclusively with the
+Copyright Holder. Any modifications, improvements, or derivative works you
+create based on the Software are owned by the Copyright Holder. By
+contributing modifications, you irrevocably assign all rights to the
+Copyright Holder.
+
+PROPRIETARY COMPONENTS
+
+The Proprietary Components are provided in binary or obfuscated form only.
+Reverse engineering, decompilation, or disassembly of Proprietary Components
+is strictly prohibited. Violation of this provision entitles IQ.Lvbs LLC to
+pursue all available legal remedies to protect its intellectual property and
+trade secrets.
+
+NO WARRANTY
+
+THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT
+HOLDER DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+NON-INFRINGEMENT.
+
+LIMITATION OF LIABILITY
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR
+OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE. THE USER ACCEPTS FULL
+RESPONSIBILITY FOR ANY AND ALL LIABILITIES WHEN USING IQ.LVBS SOFTWARE.
+
+TERMINATION
+
+This license terminates automatically if you violate any of its terms. Upon
+termination, you must destroy all copies of the Software in your possession.
+
+The Copyright Holder reserves the right to revoke this license at any time
+for any reason.
+
+GOVERNING LAW
+
+This license shall be governed by the laws of the State of Illinois, United
+States of America. Any disputes arising under this license shall be subject
+to the exclusive jurisdiction of the courts located in Henry County, Illinois.
+
+---
+
+For commercial licensing inquiries, contact: support@iqlvbs.com
+
+IQ.Pilot is a fork of Stock OpenPilot maintained by Comma.ai, Inc. licensed under the following notice:
+Copyright (c) 2018, Comma.ai, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..6380bdc7e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,63 @@
+# IQ.Pilot:
+
+
+
+## Join Our Public Beta at: https://discord.iqlvbs.com
+
+## Running IQ.Pilot
+* A modern comma, or clone device to run this software (Comma 3, 3x, 4, Konik A1/M, Mr.One C3, C3 Lite)
+* One of [the supported cars](https://gitlvb.teallvbs.xyz/IQ.Lvbs/IQ.Pilot/src/branch/release/iqdbc_repo/docs/CARS.md).
+* A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car
+#### Wondering if IQ.Pilot supports your car? IQ.Pilot supports every car [stock openpilot](https://gitlvb.teallvbs.xyz/IQ.Lvbs/IQ.Pilot/src/branch/release/iqdbc_repo/docs/CARS.md) supports!
+## Installation
+#### Installing Via Installer URL:
+#### Enter the following into your device custom URL box to install IQ.Pilot:
+`installer.iqlvbs.com/release`
+#### Having Trouble? If your device is currently running AGNOS 13.1 or older, you should install latest stock openpilot, then install IQ.Pilot, or try one of the alternative methods listed below!
+
+
+## Alternative Methods of Installation:
+#### Enabling SSH:
+* In your device's settings, go into "Developer Settings"
+* Enable the "Enable SSH" toggle if it is not already on.
+* Next to "SSH Keys", click on "Add" and then enter your GitHub username.
+* Run the command below (replace your_email@example.com with your GitHub account email, then paste the output [here](https://github.com/settings/keys) after clicking on "New SSH Key", then reboot your comma device.
+#### SSH Key Command: `ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519 -N "" && cat ~/.ssh/id_ed25519.pub`
+#### Note: If you have already setup SSH and can SSH into your device, skip this section.
+
+#### Installing Via SSH:
+#### Once you are connected to your device via SSH, you can paste the following command below to install IQ.Pilot:
+`cd .. && rm -rf openpilot && git clone https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot openpilot -b release && cd openpilot && sudo reboot`
+#### If you'd like to backup your previous installation as well, paste the following command below to install IQ.Pilot:
+`cd .. && mv openpilot openpilot_backup_X && git clone https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot -b release && cd openpilot && sudo reboot`
+#### Alternatively, you can use your existing fork's built in tools to switch your branch as well:
+`git remote add iqpilot https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot && op switch iqpilot release`
+
+---
+
+## Releases
+
+| Branch | Status | Description |
+|---|---|---------------------------------------------------------------------------------------------------------------------------------------------------|
+| `beta` | Pre-release | Preview of the next release in progress. Expect bugs. Use it if you want early access, just know things can break. |
+| `release` | **Stable 1.0c** | Current stable production release of IQ.Pilot. |
+| `release-meb` | **Stable 1.0c** | Up to date with `release`, built specifically for VW MEB and MQBevo platform vehicles (ID.4, ID.3, ID.5, Golf MK8, Tiguan/Atlas 2024+, and more). |
+
+---
+#### Side Note: Beta's are releases of IQ.Pilot that are released publically for beta testing by the IQ.Pilot team, expect bugs, and unstable behavior, for stability please use release.
+
+## 📊 User Data
+### IQ.Pilot uploads your data to Konn3kt, by IQ.Lvbs.
+#### Konn3kt is the most secure, encrypted, feature rich management platform for your IQ.Pilot device. Konn3kt has dual end-to-end encryption, your data is encrypted in transit, and at rest, you, and only you have access to your device, and your data.
+
+#### IQ.Pilot allows users to disable uploading entirely if they wish.
+#### Konn3kt encrypts your logs, and video data with dual end-to-end encryption, ensuring that your data is accessible to you, and only you, not even accessible to IQ.Lvbs.
+
+## Terms of Service / Privacy Policy / Licensing
+#### IQ.Pilot is subject to the License found in this repository, [Terms of Service](https://konn3kt.com/tos), and, [Privacy Policy](https://konn3kt.com/privacy).
+
+
+## Support IQ.Pilot?
+Sorry, I have better things to do than ask my users for donations. - Teal
+
+- IQ.Lvbs, by Project Teal Lvbs
diff --git a/RELEASES.md b/RELEASES.md
new file mode 100644
index 000000000..04bd2f483
--- /dev/null
+++ b/RELEASES.md
@@ -0,0 +1,7 @@
+IQ.Pilot 1.0c
+========================
+* Navigation;)
+
+IQ.Pilot 1.0b
+========================
+* Major Refactor!
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..2dd09dbbb
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,52 @@
+# Security Policy
+
+## Supported Versions
+
+| Component | Version | Supported |
+| --------- | ------- | --------- |
+| IQ.Pilot | latest | TRUE |
+| konn3kt | latest | TRUE |
+
+## Scope
+
+This security policy covers the following components, but applies to all IQ.Lvbs software:
+
+- **IQ.Pilot**
+- **konn3kt**
+
+## Reporting a Vulnerability
+
+If you discover a security vulnerability in IQ.Pilot or konn3kt, please report it responsibly, abuse is against the terms of service for IQ.Lvbs software.
+
+**Email:** security@iqlvbs.com
+
+Please include:
+
+- A description of the vulnerability and its impact, and potential impact
+- Steps to reproduce the issue
+- Affected component(s)
+- Any relevant logs, screenshots, or proof of concept code that can assist with reproduction.
+
+## Response Timeline
+
+- **Acknowledgment:** Within 168 hours of receipt
+- **Initial Assessment:** Within 1-14 days
+- **Resolution Target:** Depends on severity; critical issues are prioritized immediately
+
+## Responsible Disclosure
+
+We ask that you:
+
+- Allow reasonable time for us to investigate and address the issue.
+- Avoid accessing or modifying other users' data, this is against IQ.Lvbs policy, and illegal in many jurisdictions.
+- Do not exploit vulnerabilities beyond what is necessary to demonstrate the issue.
+
+## Out of Scope
+
+- Issues in third-party dependencies unless the vulnerability is triggered by our specific usage
+
+## Recognition
+
+We appreciate and recognize security researchers who help keep IQ.Lvbs software safe. With your permission, we will credit you in our release notes when a reported vulnerability is fixed.
+
+- IQ.Lvbs, a part of Project Teal Lvbs Inc ©️
diff --git a/TOOLS_UPSTREAM_SYNC_PLAN.md b/TOOLS_UPSTREAM_SYNC_PLAN.md
new file mode 100644
index 000000000..f701c70f3
--- /dev/null
+++ b/TOOLS_UPSTREAM_SYNC_PLAN.md
@@ -0,0 +1,433 @@
+# Upstream sync plan — `tools/cabana` and `tools/jotpluggler`
+
+Hand-port the current upstream (commaai/openpilot) versions of Cabana and jotpluggler into
+iqpilot without losing konn3kt integration. iqpilot does not use comma connect: every route
+list, route-file listing, JWT and live-CAN path goes through `api-iqlabs.konn3kt.com`, and the
+DBC source is `iqdbc`, not `opendbc_repo`.
+
+Reference clone used for this analysis: `/tmp/openpilot-upstream` @ `e7b1ee3a5`
+("jp: fix segment range parsing", 2026-08-05).
+
+---
+
+## 1. Where we actually are
+
+Baselines were established by blob-matching every iqpilot file against upstream history, not by
+reading commit messages.
+
+| Tool | iqpilot baseline | Upstream HEAD | Gap |
+|---|---|---|---|
+| `tools/cabana` | `bcdeec313` (2025-12-16, #36884) | `e7b1ee3a5` (2026-08-05) | **53 commits, ~8 months** |
+| `tools/jotpluggler` | `61608db78` (2026-07-15, #38353) | `e7b1ee3a5` | **6 commits, ~3 weeks** |
+| `tools/plotjuggler` | `a46ff01ca` (2026-01-19) | `e7b1ee3a5` | 14 commits (secondary scope) |
+
+Cabana is the real work. jotpluggler was hand-ported in May–July 2026 (`4b68073c4`, `b26218e85`,
+`2cd89a198`) and is nearly current — most of its files are **byte-identical** to upstream HEAD.
+
+A critical structural fact: upstream moved the whole tree under a nested `openpilot/` package
+(`#38219`/`#38220`/`#38223`, 2026-06-21) and moved the HAL to `common/hardware/` (`#38202`).
+iqpilot has **not** adopted either. Every ported file needs a de-prefix pass:
+
+- `#include "openpilot/cereal/..."` → `"cereal/..."`
+- `#include "common/hardware/hw.h"` → `"system/hardware/hw.h"`
+- `#include "json11/json11.hpp"` → `"third_party/json11/json11.hpp"`
+- `repo_root() / "openpilot" / "tools" / ...` → `repo_root() / "tools" / ...`
+- SCons nodes `#openpilot/common`, `#openpilot/cereal` → `#common`, `#cereal`
+- `opendbc_repo/opendbc/dbc` → `iqdbc/dbc`; `#opendbc_repo` → `#iqdbc_repo`
+
+---
+
+## 2. konn3kt invariants — the contract the port must not break
+
+These are the only genuinely IQ-owned surfaces. Everything else in both trees is upstream code we
+are behind on. **Anything not on this list should be taken from upstream verbatim** (modulo §1).
+
+### Cabana
+
+| File | What is IQ-owned | Disposition |
+|---|---|---|
+| `utils/api.{cc,h}` | `CommaApi::BASE_URL = API_HOST ?: https://api-iqlabs.konn3kt.com`; RSA-signed device JWT; Qt `HttpRequest` | **Delete** — fold into `tools/replay/api.{cc,h}` (§3.A) |
+| `streams/routes.{cc,h}` | konn3kt device list + route listing | Rewrite on upstream HEAD shape, konn3kt endpoints |
+| `konn3kt_canproxy.py` | `canlived → konn3kt relay → local ZMQ → Cabana` proxy | Keep; must stay wired to the Device/ZMQ stream (§3.C) |
+| `SConscript` | iqdbc paths, non-nested paths, `PrettyAction`, extra libs | Rebase onto upstream, re-apply IQ deltas |
+| `mainwin.cc` | "Load DBC from commaai/**iqdbc**" menu | Re-apply rename only |
+| `dbc/generate_dbc_json.py` | `from iqdbc.car import ...` | Re-apply rename only |
+| `assets/assets.cc` (tracked) | bootstrap-icons LFS bypass | See §3.K |
+| `dbc/car_fingerprint_to_dbc.json` (+`.log`) | tracked build product | Keep tracked |
+| `.gitignore`, `README.md` | binary name, iqdbc, konn3kt route examples | Re-apply |
+
+### jotpluggler
+
+All IQ deltas are already carrying `// IQ.Pilot patch:` comments — preserve that convention.
+
+| File | IQ patch |
+|---|---|
+| `SConscript` | `.venv` site-packages injection; `iqdbc.dbc.generator.generator.create_all()` instead of upstream `get_generated_dbcs()`; no `bootstrap_icons` module; explicit `avformat/avcodec/avutil/x264/yuv/z/bz2/zstd/curl/ssl/crypto` + `OpenCL`/`va`/`va-drm`/`drm`; `PrettyAction`; guards `imgui.MESA_DIR` existence |
+| `icons.cc` | vendored `tools/jotpluggler/assets/bootstrap-icons.ttf` (third_party/bootstrap is LFS, TTF not checked in) |
+| `common.cc` | iqpilot `common/util.h` has no `check_system`; inline `std::system` + stderr |
+| `runtime.cc` | no `common/yuv.h`; vendored libyuv lacks `NV12ToABGR` → `NV12ToARGB` + `ARGBToABGR` |
+| `sketch_layout.cc` | `PyDownloader::getRouteFiles` → `CommaApi2::httpGet(BASE_URL + "/v1/route//files")`; `androidLog` (cereal not renamed); iqdbc paths |
+| `app.{cc,h}`, `layout.cc`, `layout_io.cc`, `map.cc`, `custom_series.cc` | path/include de-prefixing; `LogOrigin::Android`; iqdbc |
+| `dbc.h` | empty-multiplex guard (`mux.empty() ? 0 : std::stoi(mux)`) — a genuine bugfix, **upstream this** |
+| `generate_event_extractors.py` | `getBusTimeDEPRECATED()` (iqpilot cereal keeps a flat field, not upstream's `deprecated :group`) |
+| `pluggle.py` | iqpilot-only launcher (upstream has none) |
+
+---
+
+## 3. Conflict matrix — upstream change vs konn3kt
+
+### A. File downloading / API moved from C++ to Python (`#37497`, `#38430`) — **highest impact**
+
+Upstream cabana HEAD calls `PyDownloader::getDevices()`, `getDeviceRoutes()`, `getRouteFiles()`
+(`tools/replay/py_downloader.h`), which shell into `openpilot/tools/lib/`. iqpilot's replay has
+**no** `py_downloader`; it keeps a C++/libcurl path in `tools/replay/api.{cc,h}`
+(`CommaApi2::BASE_URL`, `create_token(use_jwt)`, `httpGet`). jotpluggler already bridges this gap
+in `sketch_layout.cc` — **reuse that pattern**, don't invent a second one.
+
+Resolution: extend `tools/replay/api.{cc,h}` with
+
+```
+std::string getDevices(); // GET /v1/me/devices/
+std::string getDeviceRoutes(dongle_id, start_ms, end_ms, preserved);
+ // GET /v1/devices//routes_segments?start=&end=
+ // GET /v1/devices//routes/preserved
+std::string getRouteFiles(route); // GET /v1/route//files (already reachable via httpGet)
+```
+
+returning the same JSON shapes upstream's `PyDownloader` returns, then port upstream's `routes.cc`
+verbatim with `PyDownloader::` → `CommaApi2::`. Upstream's HEAD `routes.cc` is already Qt-free
+(json11 + `strptime`/`strftime` for the preserved-route ISO timestamps) — that code ports as-is.
+
+Auth semantics to preserve: `create_token(!Hardware::PC())` — device RSA-JWT on device,
+`~/.comma/auth.json` `access_token` on a PC. Upstream's Python path only ever does the latter.
+
+Consequence: `tools/cabana/utils/api.{cc,h}` (Qt `QNetworkAccessManager` + duplicate JWT code)
+**gets deleted**, which drops `Qt5Network` from the cabana link and converges with §3.B.
+
+### B. de-Qt: `#37519`, `#37521`, `#37522`, `#37523`, `#38357`, `#38359`, `#38360`
+
+The bulk of the 53-commit gap. `QString`→`std::string` through the DBC core, new Qt-free
+`core/{can_data,color,message_id,settings}.h`, Qt/core split in `dbc/dbcqt.{cc,h}`, QtXml dropped
+(bootstrap SVG symbol extraction hand-rolled in `utils/util.cc`), QtConcurrent dropped, QtSerialBus
+dropped (SocketCAN now raw `linux/can` sockets, `#37553` excludes it on macOS).
+
+**Zero konn3kt content.** Pure upstream adoption. It is also why almost every cabana file shows a
+large diff — those are not IQ changes, they are upstream changes we lack.
+
+Net effect on `SConscript`: `qt_modules` goes from
+`["Widgets","Gui","Core","Network","Concurrent","DBus","Xml"]` → `["Widgets","Gui","Core"]`,
+and `Qt5SerialBus` / `QtSerialBus` framework drop out.
+
+### C. `--zmq` bridge path (`#38484`) — **breaks konn3kt_canproxy if ported blind**
+
+Upstream HEAD `DeviceStream::start()` forks `cereal/messaging/bridge /"can/"` and
+`streamThread()` then always subscribes on `127.0.0.1`. `bridge ` is
+`zmq_to_msgq` (see `cereal/messaging/bridge.cc:60`) — it ZMQ-subscribes from `` and republishes
+to local msgq.
+
+iqpilot's documented remote-CAN workflow is the opposite direction:
+`konn3kt_canproxy.py` sets `ZMQ=1` and **publishes** capnp `Event` frames on a local ZMQ `can`
+socket; the user then picks *Live → Device → ZMQ → 127.0.0.1*. Under upstream HEAD semantics that
+forks a bridge which subscribes to the same loopback endpoint the proxy publishes on and
+republishes into msgq, while cabana reads ZMQ — the proxy path stops being the thing cabana reads.
+
+Resolution: keep the pre-`#38484` direct-attach semantics as an explicit IQ escape hatch. Port
+upstream's bridge-forking code, but subscribe to `zmq_address` directly (no bridge fork) when the
+stream is started in "attach to an existing ZMQ publisher" mode — either by treating loopback
+addresses as attach-mode, or by adding a third radio button next to MSGQ/ZMQ. Mark it
+`// IQ.Pilot patch:` and state why (konn3kt_canproxy). **This must be re-verified end-to-end on a
+real device before the sync is called done** (§5.3).
+
+### D. libyuv removed, `common/yuv.h` added (`#38306`)
+
+jotpluggler already patches around this. Cabana's `cameraview.cc` does NV12 conversion too.
+Decision: port `common/yuv.h` into iqpilot once, then **delete** the `runtime.cc` IQ patch and take
+upstream's `cameraview.cc` verbatim. One-time cost, removes a recurring patch site.
+
+### E. Vendored native deps via `comma-deps-*` wheels (`#37327`, `#37994`, `#37681`, `#38308`)
+
+Upstream `SConstruct` now exports `ffmpeg_libs` and pulls capnproto/ffmpeg/zstd/zeromq/json11/
+libusb/imgui/bootstrap-icons from pip wheels. iqpilot pins `imgui`/`libusb` from
+`git.konn3kt.com/IQ.Lvbs/dependencies`, vendors json11 in `third_party/json11`, and has **no**
+`bootstrap_icons` module and **no** `ffmpeg_libs` export.
+
+Resolution: add an `ffmpeg_libs` list + `Export` to iqpilot's `SConstruct` mirroring upstream's
+(`avformat avcodec swresample avutil` [+ `x264 z` [+ `va va-drm drm`]]) so both tool SConscripts can
+take upstream's form nearly verbatim instead of hand-listing libs. Keep `third_party/json11`.
+Do **not** chase the wheels.
+
+### F. `androidLog` → `operatingSystemLog` (`#38209`)
+
+iqpilot cereal still has `androidLog`. Keep the existing `sketch_layout.cc` / `app.h` IQ patch.
+Renaming cereal is out of scope (it is a schema change with device-side blast radius).
+
+### G. Tests: catch2 dropped (`#38408`), unittest conversion (`#38387`, `#38384`)
+
+Upstream deleted `tools/cabana/tests/test_runner.cc` and split a deliberately Qt-free
+`tests/test_dbc_core` target (objects built from the **base** env, linking no Qt — it exists
+specifically to stop Qt creeping back into the DBC core). Adopt that shape; drop `test_runner.cc`.
+jotpluggler gains `test_jotpluggler.py`.
+
+### H. `cabana` launcher script + `_cabana` binary (`#37814`, `c02cf706a`, `05cf8023a`)
+
+Upstream builds `Program('_cabana')` and ships `tools/cabana/cabana` as a bash launcher that
+installs Qt if missing and runs `scons -u openpilot/tools/cabana/_cabana openpilot/cereal/messaging/bridge`.
+iqpilot builds `Program('cabana')` — so `tools/cabana/cabana` is currently a **committed binary**.
+Adopting upstream's split means: `.gitignore` `cabana` → `_cabana`, and the launcher's scons
+targets de-prefixed to `tools/cabana/_cabana cereal/messaging/bridge`.
+
+### I. `assets.cc` / bootstrap icons (`#37994`, `71290f380`, `15267e408`)
+
+Upstream generates `assets/assets.cc` at build time (`rcc` over an `assets.generated.qrc` that
+interpolates the packaged bootstrap-icons SVG path) and gitignores it. iqpilot tracks the generated
+14.9k-line `assets.cc` because the icons package isn't available.
+
+Recommended: vendor the bootstrap-icons **SVG** next to the already-vendored TTF
+(`tools/jotpluggler/assets/bootstrap-icons.ttf`), add a tiny local shim module exposing
+`SVG_PATH`/`TTF_PATH`, adopt upstream's generation, and untrack `assets.cc`. This also lets
+jotpluggler's `icons.cc` IQ patch collapse back to upstream's `BOOTSTRAP_ICONS_TTF` define.
+Acceptable fallback: keep tracking `assets.cc` and keep both patches.
+
+---
+
+## Status
+
+**Phases 0–2 are done and landed.** Both tools are at upstream `e7b1ee3a5` (2026-08-05) with
+konn3kt preserved. Departures from the plan as written, and what remains:
+
+- §3.I resolved better than planned: `third_party/bootstrap/bootstrap-icons.svg` turned out to be
+ **tracked already**, so upstream's build-time embedding was adopted as-is — no vendored SVG, and
+ the 14.9k-line generated `assets.cc` is gone (it was never tracked; it was a gitignored build
+ product).
+- §3.D done both ways: `common/yuv.{cc,h}` ported, and `tools/replay/framereader.cc` moved off
+ libyuv too, so the jotpluggler `runtime.cc` patch disappeared entirely.
+- Unplanned dependency found during the port: upstream's `#38430` also added download/decompress/
+ parse instrumentation to `LogReader`, which jotpluggler's load-stats panel reads. Ported into
+ iqpilot's `LogReader` around its own FileReader/decompress steps (so decompress is timed
+ separately, unlike upstream where the Python downloader does it inline).
+- §3.C landed as a **three-mode** `DeviceStream` (`Msgq` / `Zmq` / `Bridge`) rather than an
+ escape hatch. Upstream's ZMQ path forks a bridge that republishes to **msgq** while still
+ setting `ZMQ=1` and subscribing over **ZMQ** — that combination reads nothing. Keeping the modes
+ explicit preserves upstream's bridge convenience *and* the direct attach `konn3kt_canproxy.py`
+ needs, and fixes that inconsistency. `--bridge ` is a new flag.
+- Also de-comma'd beyond the plan: jotpluggler's "Useradmin" / "comma connect" buttons became a
+ single **konn3kt** link (`KONN3KT_APP_HOST`, default `https://konn3kt.com`, same
+ `/` path shape `tools/lib/logreader.py` already parses).
+
+### Phase 3 verification actually performed (macOS arm64, live konn3kt)
+
+- **konn3kt API, live, real credentials** — every endpoint the port builds returns 200 with real
+ data: `/v1/me/devices/` (2 devices), `/v1/devices//routes_segments?start=&end=` (1776
+ routes), `/v1/devices//routes/preserved` (16), `/v1/route//files` (48 logs / 48 qlogs
+ / 48 qcameras).
+- **Real route in the real GUI** — `_cabana --qcam 0f53129ed44f6920|000001a5--07db1da02e` loaded
+ **48 valid segments** and came up as a foreground Cocoa app (not offscreen).
+- **Live CAN over the ZMQ attach** — a local publisher mimicking `konn3kt_canproxy.py` fed
+ `_cabana --zmq 127.0.0.1`; cabana ingested **2179 CAN frames** and wrote them to
+ `~/cabana_live_stream/.../rlog`. This is the exact path `#38484` would have broken.
+- **Fixed while verifying:** `utils::icon()` painted a null QPixmap whenever an empty icon id was
+ requested (`ToolButton("")` in `chartswidget.cc`), logging two `QPainter` warnings on every
+ dark-theme macOS start. Pre-existing upstream bug, not a port regression; guarded here and worth
+ upstreaming alongside the `dbc.h` mux fix.
+
+**Still outstanding:**
+- **Phase 3.3 (device half):** the konn3kt relay accepts the websocket and authorizes the stream,
+ but `0f53129ed44f6920` emits no frames because `canlived` only runs while the `CanLiveStreaming`
+ param is set. Needs a device with that enabled to close the loop.
+- **Phase 3.5:** cabana has not been built for larch64.
+- Charts/video widgets were not visually inspected — `screencapture` is blocked by macOS
+ screen-recording permission for the terminal, so GUI rendering is evidenced by process state and
+ the ingested-frame log rather than by a screenshot.
+
+Tests added: `tools/replay/tests/test_api.cc` (konn3kt endpoint paths + error envelope),
+`tools/cabana/test_cabana_konn3kt.py`, `tools/jotpluggler/test_jotpluggler.py`, and
+`tools/test_tools_local_route.py` (synthesizes a local route and drives both tools headlessly).
+
+## 4. Execution plan
+
+Land each phase as its own commit. Build after every sub-step — do not batch §4.2.
+
+### Phase 0 — infrastructure (no tool code)
+
+0.1 `SConstruct`: add and `Export` `ffmpeg_libs`.
+0.2 Port `common/yuv.h`; drop the `runtime.cc` libyuv patch.
+0.3 Vendor bootstrap-icons SVG + local `bootstrap_icons` shim (`SVG_PATH`, `TTF_PATH`).
+0.4 `tools/replay/api.{cc,h}`: add `getDevices()`, `getDeviceRoutes()`, `getRouteFiles()` against
+ the konn3kt endpoints, matching upstream `PyDownloader` JSON shapes.
+
+**Gate:** `scons -u -j8 tools/replay` clean; a scratch binary lists real devices from
+`api-iqlabs.konn3kt.com` with both a device JWT and a PC `auth.json` token.
+
+### Phase 1 — jotpluggler (6 commits; do first, it validates the whole pattern cheaply)
+
+1.1 `3f49e2d33` thumbnail source — add `thumbnail.{cc,h}`; `common.h` `kSpecialItemSpecs` 5→6;
+ `common.cc` `PaneKind::Thumbnail`; `layout_io.cc` `"thumbnail"`; `app.{cc,h}` `ThumbnailView`
+ + `ThumbnailFrame`; `session.cc` `setThumbnails`. Re-apply the json11/path/`Android` patches.
+1.2 `576de9c7e` build speedup — take upstream `generate_event_extractors.py` **wholesale**
+ (iqpilot's copy has diverged: `event_base_slots`, `static_enums`, single-use scalar getters)
+ and re-apply only the `getBusTimeDEPRECATED()` patch.
+1.3 `e7b1ee3a5` segment-range parsing — empty-begin guard in `sketch_layout.cc`.
+1.4 `6b47a5b6b` decompress-in-downloader — iqpilot has no `PyDownloader`; confirm the replay-side
+ decompression path is unaffected (expected no-op).
+1.5 `fef29ad22`/`911f07ee8` — add `test_jotpluggler.py`.
+
+**Gate:** `scons -u -j8 tools/jotpluggler`; `./tools/jotpluggler/pluggle.py ` opens,
+thumbnails render, CAN series decode against iqdbc, a saved layout round-trips.
+
+### Phase 2 — cabana (53 commits). Bottom-up, one layer per build.
+
+2.1 **DBC core** — `dbc/{dbc,dbcfile,dbcmanager}.{cc,h}`, new `core/{can_data,color,message_id,settings}.h`,
+ new `dbc/dbcqt.{cc,h}`. Re-apply iqdbc rename in `dbc/generate_dbc_json.py`.
+2.2 **Streams** — `abstractstream`, `livestream`, `replaystream`, `pandastream`, `socketcanstream`
+ (raw `linux/can`, macOS-excluded), `devicestream`. Re-apply the §3.C canproxy escape hatch.
+2.3 **Routes** — port upstream HEAD `streams/routes.{cc,h}`, swap `PyDownloader::` → `CommaApi2::`.
+ **Delete `utils/api.{cc,h}`.**
+2.4 **Widgets** — `binaryview`, `historylog`, `videowidget`, `signalview`, `detailwidget`,
+ `messageswidget`, `mainwin` (re-apply the iqdbc menu label), `streamselector`, `commands`,
+ `settings`, `cameraview`, `chart/*`, `tools/*`, `utils/{util,export,elidedlabel}`.
+2.5 **SConscript** — rebase on upstream; re-apply: non-nested paths, `iqdbc/dbc` +
+ `#iqdbc_repo`, `PrettyAction` wrappers, `third_party/json11`, `ffmpeg_libs` from Phase 0.1.
+ Qt modules collapse to `Widgets/Gui/Core` (+Charts).
+2.6 **Tests** — adopt the Qt-free `tests/test_dbc_core` target; drop `tests/test_runner.cc`.
+2.7 **Launcher** — adopt `cabana` bash script + `Program('_cabana')`; de-prefix its scons targets;
+ fix `.gitignore` (`cabana` → `_cabana`, `*.generated.qrc`, `bootstrap_icons.cc`).
+
+**Gate (each sub-step):** `scons -u -j8 tools/cabana` clean, no new warnings.
+
+### Phase 3 — konn3kt verification (the part that actually proves the sync)
+
+3.1 Remote-routes dialog against `api-iqlabs.konn3kt.com`: device list populates; all five periods
+ (7d / 14d / 30d / 6mo / **Preserved**) return routes with correct start times and durations.
+ Preserved uses ISO timestamps, the rest use `*_utc_millis` — both paths must be exercised.
+3.2 Open a konn3kt route end-to-end: route-file listing, log download + decompression, qcam/fcam
+ video, iqdbc DBC load, chart, CSV export.
+3.3 **Remote live CAN:** `canlived` on device → konn3kt relay → `konn3kt_canproxy.py` on laptop →
+ Cabana *Live → Device → ZMQ → 127.0.0.1*. Frames must decode. Per prior work this is the
+ untested leg of the canlive feature — run it on `gutek-a1`.
+3.4 Local live CAN: panda stream, MSGQ device stream, SocketCAN (Linux only).
+3.5 larch64 device build, if cabana is still expected to build on-device.
+
+### Phase 4 — plotjuggler (secondary, 14 commits)
+
+Only `juggle.py`, `layouts/`, `README.md` diverge, and the only IQ delta is the `iqdbc.car.fingerprints`
+import plus non-nested paths. Cheap; fold in after Phase 3 or skip.
+
+---
+
+## 5. Risks and rules
+
+- **Don't batch Phase 2.** ~40 files change; a single "port everything then build" pass produces an
+ unbisectable wall of link errors. One layer, one build.
+- **`git add` only ported files.** The tree currently contains built artifacts (`*.o`, `*.a`,
+ `moc_*.cc`, `tools/cabana/cabana`, `tools/jotpluggler/jotpluggler`,
+ `generated_event_extractors.h`, `generated_dbcs/`). Never `git add -A` here.
+- `dbc/car_fingerprint_to_dbc.json` is a tracked build product regenerated by scons — expect churn
+ on every build; keep it tracked so cabana doesn't need iqdbc importable at runtime.
+- Dropping `Qt5Network/Concurrent/DBus/Xml/SerialBus` changes the larch64 link set; verify the
+ device build before assuming the SConscript is done.
+- §3.C is the one place where a faithful upstream port actively regresses a konn3kt feature. If
+ Phase 3.3 can't be run on hardware in this pass, **do not** land 2.2 with upstream's bridge fork
+ as the only ZMQ path.
+- Upstream candidate: the `dbc.h` empty-multiplex-indicator guard is a real upstream bug fix worth
+ sending back.
+
+## 6. Explicit non-goals
+
+- Adopting upstream's nested `openpilot/` tree layout.
+- Migrating iqpilot's replay to `PyDownloader` / `tools/lib` Python downloading.
+- Renaming cereal `androidLog` → `operatingSystemLog`.
+- Converging on the `comma-deps-*` pip wheels.
+
+---
+
+## Appendix A — cabana commits to port (`bcdeec313..e7b1ee3a5`, 53)
+
+```
+4cfdcea1d 2026-07-28 cabana: fix macOS build and --zmq bridge path (#38484) <- §3.C
+6b47a5b6b 2026-07-23 tools: decompress in the python downloader (#38430) <- §3.A
+75d590fb9 2026-07-21 replace catch2 tests for 20% faster builds (#38408) <- §3.G
+e124d6df9 2026-07-19 more dead code gc
+a04c045cd 2026-07-17 cabana: de-Qt, part 3 (#38360) <- §3.B
+5d23a78c7 2026-07-16 cabana: de-Qt, part 2 (#38359) <- §3.B
+06a73f538 2026-07-16 cabana: de-Qt, part 1 (#38357) <- §3.B
+39117a587 2026-07-08 remove submodule symlinks (#38312)
+f283f6703 2026-07-08 Revert "try removing submodule symlinks (#38310)"
+b827c0f55 2026-07-08 try removing submodule symlinks (#38310)
+1e49eac4d 2026-07-08 rm libyuv (#38306) <- §3.D
+9877f6ac0 2026-07-08 ffmpeg: use shared libraries (#38308) <- §3.E
+05cf8023a 2026-07-07 fix cabana <- §3.H
+c02cf706a 2026-07-07 fix cabana launch script <- §3.H
+5edc0bd89 2026-06-21 mv root dirs into nested openpilot (#38219) <- §1 (de-prefix)
+20e0f21b5 2026-06-21 prefix paths with openpilot (#38223) <- §1 (de-prefix)
+37eda06c9 2026-06-21 move cereal/ into nested openpilot (#38220) <- §1 (de-prefix)
+bfd8d4868 2026-06-06 cabana: fix "seperated" typo in findsignal placeholders (#38142)
+5408c86b7 2026-05-28 Cabana: Fixed internal typos and method casing (#38099)
+15267e408 2026-05-11 cabana: gitignore generated file <- §3.I
+bea893820 2026-05-10 use packaged bootstrap icons (#37994) <- §3.I
+bd1c7f39e 2026-05-07 scons build cleanups (#37981)
+0584a5f5e 2026-04-12 add bridge target to cabana run script (#37814) <- §3.H
+31e4fe55a 2026-03-22 tools: setup ffmpeg hwaccel (#37718)
+a8b5c7450 2026-03-21 prep for imgui tools (#37712)
+240e0036d 2026-03-20 macOS: fix build (#37686)
+a68ea44af 2026-03-14 cabana: use vendored libusb from commaai/dependencies (#37681) <- §3.E
+5e7f5dd84 2026-03-14 replay/cabana: remove unused openssl dependency (#37680)
+ee9da82aa 2026-03-13 cleanup build paths (#37667)
+71290f380 2026-03-08 cabana: gitignore assets.cc <- §3.I
+e42ee228c 2026-03-08 gitignore cleanups (#37615)
+5e1a576f3 2026-03-07 cabana: exclude SocketCAN on macOS (#37553) <- §3.B
+0c452dbaf 2026-03-03 cabana: fix right pane width limitation (#37527)
+06b2c68e0 2026-03-01 macOS: fix cabana builds (#37518)
+3478ac133 2026-03-01 cabana: remove QtSerialBus (#37523) <- §3.B
+ce04d25f7 2026-03-01 cabana: remove QtConcurrent (#37522) <- §3.B
+0c7abf385 2026-03-01 cabana: remove QtXml (#37521) <- §3.B
+0b9ab8bb9 2026-03-01 cabana: replace Qt types with stdlib (#37519) <- §3.B (largest)
+885658512 2026-02-28 new demo route (#37457)
+e7cc70f3f 2026-02-28 consolidate file downloading from C++ to Python (#37497) <- §3.A
+276713ddf 2026-02-27 add back bz2 support with vendored bzip2 (#37459)
+238fca233 2026-02-25 tools: fix darwin compile errors (#37399)
+8810948ec 2026-02-24 CI: ensure no brew (#37387)
+76d084d87 2026-02-23 switch to system compilers (GCC on Linux, Apple Clang on macOS) (#37355)
+f4a36f7f7 2026-02-22 rm cpp bz2 (#37332)
+4bffe422e 2026-02-22 vendor capnproto and ffmpeg via dependencies repo (#37327) <- §3.E
+c98ba4ff4 2026-02-20 Qt is optional (#37295)
+037e6e749 2026-02-17 cabana: fix crash when zmq address is used (#37222)
+af1583cdf 2026-02-12 Reapply tgwarp w NV12 fix (#37168)
+45099e7fc 2026-02-10 Revert tgwarp again (#37161)
+667f3bb32 2026-02-07 Revert "revert tg calib and opencl cleanup (#37113)" (#37115)
+51312afd3 2026-02-07 revert tg calib and opencl cleanup (#37113)
+d5cbb89d8 2026-02-06 Remove all the OpenCL (#37105)
+```
+
+## Appendix B — jotpluggler commits to port (`61608db78..e7b1ee3a5`, 6)
+
+```
+e7b1ee3a5 2026-08-05 jp: fix segment range parsing
+6b47a5b6b 2026-07-23 tools: decompress in the python downloader (#38430)
+576de9c7e 2026-07-21 speed up jotpluggler build (#38406)
+911f07ee8 2026-07-21 convert tests to unittest (#38387)
+fef29ad22 2026-07-19 start porting tests to unittest style (#38384)
+3f49e2d33 2026-07-18 jp: add thumbnail source (#38363)
+```
+
+## Appendix C — how the baselines were established
+
+Blob-hash matching, not commit archaeology: for each iqpilot file, walk upstream history
+newest-first and report the newest commit whose blob for that path is byte-identical. Files with no
+match are IQ-modified or IQ-new; the minimum over the untouched files bounds the fork point.
+
+```
+cd /tmp/openpilot-upstream
+git log --format='%H %ad %s' --date=short -30 -- openpilot/tools/cabana tools/cabana > /tmp/cab_commits.txt
+for f in $(cd $LOCAL/tools/cabana && find . -type f \( -name '*.cc' -o -name '*.h' \) -not -name 'moc_*' | sed 's|^\./||' | sort); do
+ h=$(git hash-object "$LOCAL/tools/cabana/$f") || continue
+ while read -r c d rest; do
+ b=$(git rev-parse "$c:openpilot/tools/cabana/$f" 2>/dev/null || git rev-parse "$c:tools/cabana/$f" 2>/dev/null)
+ [ "$b" = "$h" ] && { echo "$f -> ${c:0:9} $d $rest"; break; }
+ done < /tmp/cab_commits.txt
+done
+```
+
+Cross-checked against the last upstream-authored commits in iqpilot's own history
+(`bcdeec313 Reduce pub-sub memory usage by 10x (#36884)` for cabana) and against feature markers
+(`virtual std::string routeName` first appears in `0b9ab8bb9`, 2026-03-01 — absent from iqpilot,
+confirming the fork predates it).
diff --git a/artifacts/__init__.py b/artifacts/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_alc_private/manifest.json b/artifacts/iqpilot_alc_private/manifest.json
new file mode 100644
index 000000000..fb42059df
--- /dev/null
+++ b/artifacts/iqpilot_alc_private/manifest.json
@@ -0,0 +1,43 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/iqlvbs/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "16990383c7ba1d2f3d33e5e4c1746019101bc79bed867721b51de853a68002ed",
+ "size": 401688
+ },
+ "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "bd060a8527d21501ce866f24d055f1c8bb03209b2730eb745b786780aace0aae",
+ "size": 69688
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.konn3kt.iqlvbs.alc": {
+ "path": "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.iqlvbs.vehicle_state": {
+ "path": "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": "IVz01J4HpdUHDrjPP9yB+9ksGFberB9MeFiCNLcv8hMzXCLIjIATl3JXTwpBqU8Kad/q683nkhgL5IJ3tCKdCw==",
+ "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so": "/aW/StEMRpge+zzihQDK7VPLmKhgwCucX8JielvPnPTud/mk0pmCy5pE8fB+TbwtWZCBfVhEd1bidRgsBqZfBA=="
+ }
+}
diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_alc_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/__init__.py b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..ffc616041
Binary files /dev/null and b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..c86c5cda4
Binary files /dev/null and b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_commander_private/manifest.json b/artifacts/iqpilot_commander_private/manifest.json
new file mode 100644
index 000000000..e2776727b
--- /dev/null
+++ b/artifacts/iqpilot_commander_private/manifest.json
@@ -0,0 +1,33 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/iqlvbs/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "384571df8380e5eef92806f3fdb6c9d1bc879af2ebdce9259bcfc486d506a4d0",
+ "size": 68080
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.konn3kt.iqlvbs.iqlvbs_commander": {
+ "path": "python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so": "cH88ob+s+ZRJaNgbrRN2CQqCiQMBlo9yXdBvN3gteSC7OYlJ5z8OZND7eZSEfeeq2O7E8ZeZDs9WDU0WfP8DCw=="
+ }
+}
diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_commander_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/__init__.py b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..e93281f7b
Binary files /dev/null and b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/manifest.json b/artifacts/iqpilot_hephaestusd_private/manifest.json
new file mode 100644
index 000000000..80bdbbd09
--- /dev/null
+++ b/artifacts/iqpilot_hephaestusd_private/manifest.json
@@ -0,0 +1,195 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/backups/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "e79be61e50cd0830197f44f8a6840b86a74b8059da45da65a4696587168ac466",
+ "size": 135536
+ },
+ "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "ebfeedba6cc5cac6dca1cf8125879fcb2d6afdbaec31a98dd46c3d346f55c982",
+ "size": 67664
+ },
+ "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "11ffe8f261b78990aa743b43aed3a5534105da848be1450026090ae873ad0a2e",
+ "size": 204624
+ },
+ "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "e62a6438c18b231f83cc873ac8170a64e670c8912ffba13edf47f163886aef19",
+ "size": 69752
+ },
+ "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "07195ca6d4e1ff26441e860d954e9c79e3da608244d110bfa62b3aa0818a79dc",
+ "size": 203072
+ },
+ "python/iqpilot_private/konn3kt/flockd/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "d18b8d67100f5906339dde577bc14f567168ff62e1b9166c011af853c016191e",
+ "size": 202168
+ },
+ "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "1a601a0de826fb41fadb3cef9e8b8645d99e41507befc36e87d077d49efd3025",
+ "size": 68080
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": {
+ "mode": 420,
+ "sha256": "c3063f3d380627f604b0ae1cdd20fbfdfa7b64d212c86f20abd470230af8e169",
+ "size": 2100238
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "57dbd02e130361d33c8a52635261ce85f3a91c577b70d5fad8a0e9e7557f9d46",
+ "size": 268064
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "1febeeb24421c82a64416a7ab04def21d57a39acf0caaf2103b4ebfbae655fc2",
+ "size": 406216
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "42656c3b54f6392e2311e4039296e4906558fd8c63ba6be04b157445b96d38c9",
+ "size": 68048
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "acdf51e90428e4487f0daf6e0e43110ef5fc1c7705d16aa3b9880618030f41f3",
+ "size": 335728
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "95afe64579cac0148c3de23867a333651dfed4606c218208dcf37b40a1cc6450",
+ "size": 271680
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "fd983039accfaa30abf3d46f41c70241d1c3fcf4e21a1de7d3270ab9fce9b03c",
+ "size": 134408
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "cc299f0d560bbd611cab099923bb1817229df3cbc15cef22d6909091e9de826b",
+ "size": 3581928
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "0dbcb5d9ec1af832bcaceaa3ae96a4785a432778c1fb3cdc8b74e62b5d915158",
+ "size": 136448
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "cabf37e151994a223f890627c0128990e56505bc704108f050d2422e118a273a",
+ "size": 68136
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "10af02f5daf288e465bcaa64509972a1a0b268f779b1c12c58bf63c79e52eb96",
+ "size": 67840
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "855f128d248c94fbd00f550f7dd388ccf1a487935d7f11cac00e5240b526d674",
+ "size": 135648
+ },
+ "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "8de50d50308777ff9dc22d4d5232cba38f2f332207313999ec8aaa67e5004f4e",
+ "size": 269568
+ },
+ "python/iqpilot_private/konn3kt/uploaderd/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "11d16de5d29a37f64351acabfa6372966447a88cd7d799580a6f2f1fa745c15a",
+ "size": 204184
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.konn3kt.backups.backup_orchestrator": {
+ "path": "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.flockd.flockd": {
+ "path": "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.hephaestus.ble_transportd": {
+ "path": "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.hephaestus.cloud_routes": {
+ "path": "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.hephaestus.hephaestusd": {
+ "path": "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.hephaestus.manage_hephaestusd": {
+ "path": "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.hephaestus.motd": {
+ "path": "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.konn3kt.uploaderd.iquploaderd": {
+ "path": "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "1DjE26Z6yX6VuP+Jx/DxxS2PjWXSXLd+bS1RgYEo9WNOEHENVDv1xeoyXjFmrXe6/QTILJpv+LnqWegfVSnFBQ==",
+ "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "ytsUI7NI3t/9m+zEfMCbXVCIggeKSk8lnTrVYWQr0uryX5tTtQXyR+f+rIPSZWzzHu80z3GE0jmnQEEN2m6XCA==",
+ "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "Y57ZaVfeeB1Mnu4vFIQNSZIuob+jmBkuuZ86Zc0sOWvqgkE8gT41pivlipr/R/du5+HSqXvTv/iuQS8ekTBpCg==",
+ "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "PGjuQc316L/r8sSGF0Hg5EnFWj/Bhk27UYBgGvQ8xxLvoVJIkRKVJ/ZFLFZo6rdEWrd0GQECUYeR9ewU6ufFAA==",
+ "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "CVrgu0dEypYq6IIA38Lh/w4KKVNpP5+dfV0dkOpDA4UkyH2IoX3Wiywpz3o1jfjrSXE3oiPdk52qRE+pzLLxDQ==",
+ "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "+grQAam3UiFIBqGcvuAI+7aYW6UCU83YLlxCkPoo6YaX9SitDVqQk6bNQwqxYUzuUZ2s8BdhlbgseTuImRZMBw==",
+ "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "yhxeGAidy3Auu+i2wZgxD1bK18VeWknYuQQpeiylNyWNfzN/xPUDGFyyV0CpNY3FqEqH8LcHLzsa8Bz4JTbWDw==",
+ "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "OX/9GfQQf/krppHPChnXqvvHCs+8LqdpnRtRxJ9AYeqRLwNMrTgCSLOsU3YGlHiF78U5jIldNdkr4aOGBHRVAg==",
+ "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "n06LgyR6cPqHLaGsiEXlSFiNKFkT3S14mPEz+xtLw0y3bAuNod5Jpp6KiVuoTcVdzHjXPFWwYLgqbtDxSZe/BQ==",
+ "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "JJ8eaFR2wkJW4/gw31a35LvyHLKTLfPwFwIC3cE5Y4AYbLkrVuVbizPefhUrcFMF0ZxzjQulU0YNAL7EMbzOAA==",
+ "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "Vr/pX91mN1D0Qcl9PNJiT2DUq9LxP13qjO5g7Ve/KDPwAqL9nKJXeAqbhKXIqFyRHp82PAHKaVhHsF39QtLRAA==",
+ "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "yjHeFmvqDWSEXIft0n93zTSZemP4L9hmXZtauDFL7bRnGHMnTVvrq7olJJoXvQITVGyGzDl+BuDF5pjOKau+AQ==",
+ "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "7sVJ5qadF1T48RP8FlwynsJEC0w6OtN+BGBf93YABFXgYDPY/YAMm5aAicR6YmGvgkFqtfCf5g8ozdrz5fIuBg==",
+ "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "54+MaaeOIEbj+uZrcphTbHQ8K1jm4gRe2JYZyYNkwxPcT6dkcWLM6NZiNVzXiD6Ph87hTxUbecJnhVeT80pDAw==",
+ "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "xJnkGTaVVWne7p83UhTU2C/miZg4XR7pLrd6A7j7TvetRCFvQPxyuAeFi5lJsKKwhaWV3dInGZcVWrGV+kV0AA==",
+ "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "P+LVQJc3vD5Z9i/jxNxziNbgCiGrI+5P9saUGHMPMKUoWhVEBAAVU8xuVyd6GjSd8M5VrximPVrJyMCE9fEfAw==",
+ "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "vfDMFKWuTD2XSE7JF/qmHxcOXgdXRZN9fi3FTSffmr6t22Tz0N7v8MwVayiPKrYNt2gHixFZ9aAkvF2SC+yDBg==",
+ "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "Orgr5aTB5g3NRH8AdsuNkpcmIfSQDBFHzegDN875SxuvHuCOfsVVYgx2TtRiT0wqSR9hlQQwhelyRHRQjcMCAQ==",
+ "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "tZNbbDyMxkFOcrvWCEBQz6ZTGdLZVesuz0dbUMO1OBaSYAG4MRBQ5y9fZwRQZAvcEa+NMlNZK2SGoC6r5BxgDA==",
+ "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "sgYjdE7ZRvdKlehs1/h3z/n14fksR+Z+KhCzi0BvFPcbMcx0Pod/L42IQeEDfcQfoFBURPNoI1OTwWc31H/NAQ=="
+ }
+}
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..86354b636
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..dd2ce74e0
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..30328babd
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..33eb1805a
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..a16510003
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..5713e2e15
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..c4be8a76c
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip
new file mode 100644
index 000000000..ffe483400
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..24d362d19
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..520fa348c
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..9240a8d66
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..a8bee2a86
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..ea41b12e2
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..3be2eb085
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..27b8f0a33
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..ee371a8ff
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..2cf1d2e87
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..bbf30475c
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..9eb411b7a
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..5c6e64cbb
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..1e5ca4493
Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/manifest.json b/artifacts/iqpilot_iqvd_private/manifest.json
new file mode 100644
index 000000000..3f3bb1744
--- /dev/null
+++ b/artifacts/iqpilot_iqvd_private/manifest.json
@@ -0,0 +1,75 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "48bad6268fabc23a9be62fcd7f61240ebcbabd5e3c6afcf7d3328bd33d93d3a2",
+ "size": 67616
+ },
+ "python/iqpilot_private/iqvd/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "674c4ecd09e36af6c2b9a41285e78914ee94a0e8c4de728904171dd59e02edda",
+ "size": 135576
+ },
+ "python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "7ce45dfb9a6ffe8e5426f261cf7e9b3a3825e3d284a0675013d43697e73d56d9",
+ "size": 67616
+ },
+ "python/iqpilot_private/iqvd/offload/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "439f88b68d220912db2f7e9a43d41827d298f68b113e7c5e5858adea3a05e963",
+ "size": 135296
+ },
+ "python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "0199f81ce365fb956d729c61c20c8eaa0120448171db6b83544f3dd1a0861877",
+ "size": 68232
+ },
+ "python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "678ebcdd9a97fe527970bbb93021d2ae8f4f9935444b6558dd61b399ab3fe3e9",
+ "size": 135976
+ },
+ "python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "a8d24107433a037d19876b2240e980b09c89f560ba960dda5e28c16665a03ca6",
+ "size": 68120
+ },
+ "python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "943e0ef218eed109289d208ea76407e223a4e8b81659f0ec79dc090fbd7ed329",
+ "size": 204568
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.iqvd.iqvd": {
+ "path": "python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so": "YPDPJiSbuWXyg3MpOJXzZtejR5sazfra6c/AFVm+tzE+i9OA9/OPS5qvpFSaHOBPaVZYtsmxkOFq4Q5GJlYOAg==",
+ "python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so": "H+2OPwV0XS7biX05P6fBzRBCN1Cjnq9eH6YSLk+9BX8OPbdiyJTbDpt8YZYk4nU0LO5FF4dMkEXzFRsewB7BAw==",
+ "python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so": "vbv8RlHm7LGdrojZuRhs+2StjASHEC1GbkZspXh6FCbmyKmW7F9B5GzHjIwr7HVFSNX6u+ELPPKebfnIsOkmAQ==",
+ "python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so": "pfDu4/OifTpFWqMD/hyQN+p+9syWaiAavHCkvxG9++0VvHDwKsBPJFxRk8r3vBdylSz4zkIFXlqPPt/hNuzJAg==",
+ "python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so": "Ll6azxnD3jGmyPPjd+yTmAVCl+CwM2iSdSqpYtTtzqPIb6GFBp0FfF5w+FTpacKjoQ4i3cXV4gdUVOf3qRWzCg==",
+ "python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so": "ww5BVRLiGB+LkqREN1f7njOrrgOcWghyTXNXTJTJHYeLx5AgIrvsqg1PH7+nq1LuSvk+LHDTOSUAcs7JIDh3DQ==",
+ "python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so": "3OzAWo66E+qe/H+HtGEP1i73WLW9SPa9+zeb8fOWBe7Nlsx7WrgGcURBq0VTycv2v3QLNLEluei/rnQEYBRMCA==",
+ "python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so": "C64cBnuSM2wm6vCEO9W3cNqbB4P7Yuy78pFUXxn8iesCQD0hbZ1+w8IuH4VuxB88ubLRLQt2GZ8LYIESb+HYAg=="
+ }
+}
diff --git a/artifacts/iqpilot_iqvd_private/models/yolov8n.safetensors b/artifacts/iqpilot_iqvd_private/models/yolov8n.safetensors
new file mode 100644
index 000000000..186d6fd31
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/models/yolov8n.safetensors differ
diff --git a/artifacts/iqpilot_iqvd_private/models/yolov8n_qcom.pkl b/artifacts/iqpilot_iqvd_private/models/yolov8n_qcom.pkl
new file mode 100644
index 000000000..fce21e97e
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/models/yolov8n_qcom.pkl differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..d7a4479f3
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.py b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..db25f80ff
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..a5f6cbc73
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.py b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..0e75f6819
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..f4e614ed8
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..f34cba010
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..a09d623ea
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..2e3553369
Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_maps_private/manifest.json b/artifacts/iqpilot_maps_private/manifest.json
new file mode 100644
index 000000000..0e5cad0c2
--- /dev/null
+++ b/artifacts/iqpilot_maps_private/manifest.json
@@ -0,0 +1,34 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "f7cbc5f8aa87cfb7edf0e3aac69893132e9af9502a684a282ee510b69ada3568",
+ "size": 67616
+ },
+ "python/iqpilot_private/maps/__init__.py": {
+ "mode": 420,
+ "sha256": "5128931b54d4f1ff131185e7711d56a788b5e2cb71e3c8154a2f79fef184b452",
+ "size": 118
+ },
+ "python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "39fdad3afca4fa8cf848a03495e6f89f11ee21a4e75ec815774ee3f119576cb2",
+ "size": 67856
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.maps.git_auth": {
+ "path": "python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so": "bN3jbaaSHL7++7hBCWbpAWKJVgRdgBvtv6lTHEHeyBVVIJUYot1j/eEr+ilJEbIYzSHm7sK7rO/AwWBk10CWAw==",
+ "python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so": "EC7a8gmfNquIzXiR08p2kzD3kAd0Rp00ey/hnZOaQRAZ2ziD9BpPf9IK0AawuH2SPE7JNxab4T35PhhhRnbpCg=="
+ }
+}
diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_maps_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..19844e3cc
Binary files /dev/null and b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.py b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..bf6f429b7
Binary files /dev/null and b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_model_selector_private/manifest.json b/artifacts/iqpilot_model_selector_private/manifest.json
new file mode 100644
index 000000000..7b41bcb63
--- /dev/null
+++ b/artifacts/iqpilot_model_selector_private/manifest.json
@@ -0,0 +1,52 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "7e758a0beaf3cbe79e42f90fd26b299518cc08c8c77081a0e938af6bc2d0d6bb",
+ "size": 67616
+ },
+ "python/iqpilot_private/models/__init__.py": {
+ "mode": 420,
+ "sha256": "5128931b54d4f1ff131185e7711d56a788b5e2cb71e3c8154a2f79fef184b452",
+ "size": 118
+ },
+ "python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "e6304dce5745990f888615cf1dcffd1d7999fd29655305a6071159d1dfc6f469",
+ "size": 136176
+ },
+ "python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "3e0d4d4c67ba5920a43106c011c6e6db2e4e7704d220978be3b34ac8ecc84739",
+ "size": 67864
+ },
+ "python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "e1516afc6c6d8213cd33d27069a8c6b6f5b4c7c9013772b3ec0bd74629878339",
+ "size": 137200
+ },
+ "python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "9893dccb4b99429dde00edcb16555b59103263a7be46ec76164f97462c3934c1",
+ "size": 274096
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.models.manager": {
+ "path": "python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": "Otp/bhI6d4HMKzf34+A5XEhtFFsnGpw35c73IjjiO5M55JPRezqkEl1NqNWhOXGC6z33ogl8M6vqEQLiBGpdAg==",
+ "python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": "oC5sSq9qY2AvC9RI85Ts3tHyXv4K28Z6VyZUBbPlYKGymyDSrRq61+cXDXFWnxNRrNiP+6e+ul0XgcM4GtxNBg==",
+ "python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": "mPec9Doi0XJ+o/q/e65Y9464A+vfMpvWlI5g/CBA0EKuxuNEGekDqzWa92w4FzEPX5c/luwWtUgMBNgF+TS2Cg==",
+ "python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": "CmRB3GasUFKV3tLeJgJg0LcQwcO0wZTT1O99hGCjIDf2bHd14NXGMsGVoAizBHbnM+bL6gqcH8zq/69CrJZGDg==",
+ "python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": "yNAlwoYAQzy5ig3Mqh4Vhjug0TaQywZ8ORbP6YHnZFRbOqggKgX29qKQ0+LOVDrktGZwwegqnLdjpseXxT29Aw=="
+ }
+}
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..80cee14e3
Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.py b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..5368650d6
Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..5cb2bd0ce
Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..ece6a71fd
Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..d7a7b6a8c
Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/manifest.json b/artifacts/iqpilot_navd_private/manifest.json
new file mode 100644
index 000000000..e64b1c5dd
--- /dev/null
+++ b/artifacts/iqpilot_navd_private/manifest.json
@@ -0,0 +1,124 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "449495db52a85f8d0b0e2bb3128ee480598f8bdb5a44ec13153877fe8b372a91",
+ "size": 67616
+ },
+ "python/iqpilot_private/navd/__init__.py": {
+ "mode": 420,
+ "sha256": "3faeaa3363b2f50fa135ad4c1f2466853d684d562120425f77a58039837fd8fb",
+ "size": 69
+ },
+ "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "ae2b25f52f7c7b02f3c977bbf46f5e9e938bfeda78bdb60f2f897eb04d698e43",
+ "size": 136944
+ },
+ "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "f6ad0590f2a0bdbed56e7126203df2f6cdad86074f76ab9dded38b9e1600c8af",
+ "size": 135936
+ },
+ "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "b4ed48cada1dfb3383ff8ee106a7d93967bf65115d4c528b60dc3d73112a2f0e",
+ "size": 135608
+ },
+ "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "e68aca6829cb00c5eda5330e1dfedd6269381ea5831abaca1055adf6df1f53ff",
+ "size": 69728
+ },
+ "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "ebd30c5c34fbbe82d7d24343a2e791919e526997d192fd1441df749b15526704",
+ "size": 68088
+ },
+ "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "6e69c5fcac3c302e401b3ed3735b42f3de4af4e0d188d15a7add7aa02920f4c5",
+ "size": 135440
+ },
+ "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "55c88f8c5996dd7094c0feaf454fe0f1aec97276aed8926d7e8f6d1597de5a83",
+ "size": 664480
+ },
+ "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "b971e1093f5713a633636d6ee74891206a2d5abfb492406c7ae5df7a66bdc0d9",
+ "size": 135560
+ },
+ "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "882ccc23c3de2e4e34c685a7abb00075f6c5be634eaf7e81cab86461c624449d",
+ "size": 136368
+ },
+ "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "df0bf89d492dba3b6c3792dde1bcb30a60e692f62519be7c62a517ef514ec276",
+ "size": 136072
+ },
+ "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "0311a1fbde1510b31055606db21a7c5f74e6872f9f1aabd6fb4a0a501395eaef",
+ "size": 600528
+ },
+ "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "1f08c7c462b4cb08a8de9140d968ef5dc74b31afffe16c9f8fad4e0271bec6cc",
+ "size": 135752
+ },
+ "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "aea71be79c99884a0aeaaf8e5c0f70e37bb4f0c0123025cd07df830189774ba9",
+ "size": 69832
+ },
+ "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "5c7dd6ef7dafb9a35662ee3d22c08b17b02807df736bf146af88cb260f5bbf09",
+ "size": 201384
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.navd.iqmapd": {
+ "path": "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.navd.navd": {
+ "path": "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.navd.navrenderd": {
+ "path": "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ },
+ "iqpilot_private.navd.web_server": {
+ "path": "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": "E3+Gd+btNi+4qFqM+nFMfWgCLJhP21ZgIwZrE/CJjqafB1htd/qOhh9QtrulS46HW5geZ/nwW3jlxPbFeNubBw==",
+ "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": "hHQQCCPcxRXdO9vko9476AYbgbfNwhi9bVYpoOzQQStPC8DbIO0QN/RRzaJVGr2kgJGZlXDmnGl85m7EHgC1BA==",
+ "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": "Wz5yfWlMeoASj274KqrCWwEJD/wtm5WyxLenceYu7MkXaMlN1QyztvJhq8Y8K8Jfis7R5fQ/aAnlsQgWTIVEBg==",
+ "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": "6WFWUXmkyy21rh/9xa7s7S7CTiCRnywOahU859T6iP0447NkVxHRYmXAVCH1/vRDPXASHRNPyUk8oSDLIGK1Ag==",
+ "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": "ZUsjQ/AGPa5pVKAv3IkycDPIVBWh+4jBNor/xrUi7BBPHki8G6T1grv3exeHhr2WF2JiqN727ge3JaqvlU1KDQ==",
+ "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": "t+VHmWhxf7oKcR5e+tJe6hPKy6xz0bMY84WEhujwcwBlWgIXscfc9aNSP6e4N7GITW7cOn+RlDRTTfwQsA6PDA==",
+ "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": "qOrpSi2I+aFLKN4WjBljfzbk2U1rvOgDuyV+p7IvshugeUOoqTKiYYSG9xwyi2/eB/syyfiVFoqAg+ETFXXPDA==",
+ "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": "PcFJWRYrb52pJCbTdsAPm3IC0OR9zt/7P0uc1GlQr4CVGvzfXukbnt/7sSeL8T29w7drf9MfGkpRe4BjbWwtDw==",
+ "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": "gp1noPJ35MRVcQL3t4wKbsEH0L0+n9Yf8Zty+VCY7uy9EsK8211kW2YIw7Lcyw879VLLbVntHIWz/BMankSeAw==",
+ "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": "N6yH0R8V/Cw1J3hYPfFeZXByolRwtACwNe2wHMzPEQ69UTWnSNFRXWjOLCEvtwB8Z+iglAqFx8uztZ6wXZKUCQ==",
+ "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": "oQQU70Yp8wzkqB9Ktm2KDEHNVZfB3otqIoG2mkqQNh6QdtVKXraIv6cAbt2Zjob5914C06El2z+NPZQE5NjODQ==",
+ "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": "ayPdxCUGA/o+AavLMd9mGDY6zYnZk54gAEVaMQXFYlztjXiREC+IEmV1iETOYcsEFAxr8qtUFfcwZ3p7rXljCw==",
+ "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": "Rh0wUjYjRabedjFSnsE9BAjILjA1+RHMdfuCqTye1AlhFlXVUQMRo6Ier6Z71kyiOYw+CXCOrHUF9fP69cP4DQ==",
+ "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": "13bqig90oceup9ovo8weu9UpdQN/l/pq7REFm8dwwgqquuh8jJFkzNz7dvIhDlaxIGAQwzWJe4+QzIQfhg0jAA==",
+ "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": "Vm1Inx4XY0BOmLuNizOCRNAl4tPDcvJ/4A+TwVSr1cZuMg7pg1jeFg613e6cFM6t08hYvPsysXc2+gD69zkcBA=="
+ }
+}
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_navd_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..d69fb38e7
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.py b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.py
new file mode 100644
index 000000000..5161d7261
--- /dev/null
+++ b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright ©️ Project Teal Lvbs Licensed Under MIT License
+"""
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..54844133e
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..d89198be5
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..471549ccd
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..aa225592c
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..ed72552c6
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..eebfd4e36
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..a71abd796
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..e768be835
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..e375d9528
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..f50b41597
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..358a74a70
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..ac3768f15
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..c87314137
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..0c2597fb4
Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_updater_private/manifest.json b/artifacts/iqpilot_updater_private/manifest.json
new file mode 100644
index 000000000..d90e7f434
--- /dev/null
+++ b/artifacts/iqpilot_updater_private/manifest.json
@@ -0,0 +1,34 @@
+{
+ "python/iqpilot_private/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/updater/__init__.py": {
+ "mode": 420,
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "size": 0
+ },
+ "python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "167d0e1863f674915dbccc7b289368fbf080a169ac1f2559848157469406c0ac",
+ "size": 67616
+ },
+ "python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": {
+ "mode": 493,
+ "sha256": "a9c2e23e2a9bf56b4c18f57ca1fccc78eb75d1d00dd0c6b0fbbcb6bd31405508",
+ "size": 70056
+ },
+ "runtime": {
+ "entries": {
+ "iqpilot_private.updater.git_remote": {
+ "path": "python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so",
+ "type": "python-module"
+ }
+ }
+ },
+ "signatures": {
+ "python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": "tCpaz+su6ncEbjlAW/DUtNen5cJyBy3tie9desujFTToKo1KLcua6dF3n5fqoXBdzJz78RuRev3/9iYxrkvbAg==",
+ "python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": "ZUgATP10Dv92lJmIZ1LpF4gntYF651G+ox1U/wxNZdpcS+wbETOmxwx/PtYph+nbCz9VsCc0ueD21AUcNNwhAQ=="
+ }
+}
diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_updater_private/python/iqpilot_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/__init__.py b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..f4d800405
Binary files /dev/null and b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so
new file mode 100755
index 000000000..4004df4e0
Binary files /dev/null and b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so differ
diff --git a/artifacts/iqpilot_valhalla_runtime/manifest.json b/artifacts/iqpilot_valhalla_runtime/manifest.json
new file mode 100644
index 000000000..130eba222
--- /dev/null
+++ b/artifacts/iqpilot_valhalla_runtime/manifest.json
@@ -0,0 +1,234 @@
+{
+ "valhalla_runtime/bin/valhalla_service": {
+ "sha256": "6bef5c4ca7e1eb385ac1ae00d9ee20924a81a33f3e59c2b644d31430720d408d",
+ "size": 10754496
+ },
+ "valhalla_runtime/lib/libLerc.so.4": {
+ "sha256": "8148fbb2d121a08abf6ffe493a4994086eb43a785059871dbee1647ce115305b",
+ "size": 526288
+ },
+ "valhalla_runtime/lib/libbrotlicommon.so.1": {
+ "sha256": "016600f673a5d1a565cf98f608d8425033593ab78827eccc3384596f70386c8c",
+ "size": 198784
+ },
+ "valhalla_runtime/lib/libbrotlidec.so.1": {
+ "sha256": "b7895f0fd4ad47408cb01fcb959ae6792804c15512526166f9bf48358714d0b5",
+ "size": 67688
+ },
+ "valhalla_runtime/lib/libbsd.so.0": {
+ "sha256": "6c5348ee0e1777f13e148b7492fa311b6f65adb0dc21a001a67ebc18948e6b3e",
+ "size": 133944
+ },
+ "valhalla_runtime/lib/libcap.so.2": {
+ "sha256": "c2f7d3a8594ea3a24b8ffcea8f929e8fbd0d6c24256f8ece625f0be6a3d4e1f0",
+ "size": 67704
+ },
+ "valhalla_runtime/lib/libcom_err.so.2": {
+ "sha256": "6a9d07af8817ed06466027a77fc7f2e8972a4a0e68895738d9acdc35470f416e",
+ "size": 67432
+ },
+ "valhalla_runtime/lib/libcrypto.so.3": {
+ "sha256": "3d51e64ad7113b2ab863b9582866ad2b31e545d1fe9f197c634a65a8f2611786",
+ "size": 4597928
+ },
+ "valhalla_runtime/lib/libcurl-gnutls.so.4": {
+ "sha256": "d739419f4c0abc68119f407f24f3eca0283ad510ed022c90f5f7b0c2a04d249d",
+ "size": 732568
+ },
+ "valhalla_runtime/lib/libcurl.so.4": {
+ "sha256": "b9764fa500494d831b6b5766e9191d1946f1dcd76f2a011aee9707f0831f0828",
+ "size": 798104
+ },
+ "valhalla_runtime/lib/libczmq.so.4": {
+ "sha256": "5a066a2015cf9fd5fca00a82702802538c3500e5bc26123e60da433d421ef308",
+ "size": 526736
+ },
+ "valhalla_runtime/lib/libdeflate.so.0": {
+ "sha256": "fc8c2ebe21ec4eebfccabcd6618b216a1bcf9a55dfc38c5af26e3b0ab835f4eb",
+ "size": 67384
+ },
+ "valhalla_runtime/lib/libffi.so.8": {
+ "sha256": "9dd873a938c4d7df76912d01f6a28aa4aa73d583bd20485a0dbfe5aa9673a191",
+ "size": 67944
+ },
+ "valhalla_runtime/lib/libgcrypt.so.20": {
+ "sha256": "763eeb8f170de52b8bc7268eaf433f72f03c980c04511130229a338a0ee2bb06",
+ "size": 1000536
+ },
+ "valhalla_runtime/lib/libgeotiff.so.5": {
+ "sha256": "8777a15c365f87f0d20d177600bea9cf23633e04841914e5fba7245603bf59fa",
+ "size": 264144
+ },
+ "valhalla_runtime/lib/libgmp.so.10": {
+ "sha256": "39b6701812ed7135f28df49352b3f6664c7a9f56880a3fe50c1b87cd7681db9b",
+ "size": 526632
+ },
+ "valhalla_runtime/lib/libgnutls.so.30": {
+ "sha256": "6b12c4675dbf7fca76bd47228f22b19f4218bc8c72e2f8b5cb6de172dee14961",
+ "size": 2171912
+ },
+ "valhalla_runtime/lib/libgpg-error.so.0": {
+ "sha256": "ff2dccba4993ef97775b70c1ed1144f70dfe8581ee48c1eb25c76878c6cdfdf7",
+ "size": 198648
+ },
+ "valhalla_runtime/lib/libgssapi_krb5.so.2": {
+ "sha256": "35790a9f5a49b1368614a485cb6ba7cc54cb34560831da1bda657f2502641624",
+ "size": 334304
+ },
+ "valhalla_runtime/lib/libhogweed.so.6": {
+ "sha256": "0495ad11a2266d7300436d57859fc8ebceac79e5235a393c42ae91d6fc23ce84",
+ "size": 329656
+ },
+ "valhalla_runtime/lib/libidn2.so.0": {
+ "sha256": "34a2427db57d47458b460ab15a24e7de73b56fbc7b458af837556445f60ffb4e",
+ "size": 132968
+ },
+ "valhalla_runtime/lib/libjbig.so.0": {
+ "sha256": "edfa3b74da686481be974c3f514dbe8487ad8faf258b634ab4227d98b33cb888",
+ "size": 78448
+ },
+ "valhalla_runtime/lib/libjpeg.so.8": {
+ "sha256": "d45014b67ae6df2f15c8fb3e86d37b78375deede47ef73b7c61e8b6b28c8223f",
+ "size": 395264
+ },
+ "valhalla_runtime/lib/libk5crypto.so.3": {
+ "sha256": "35b10e68ef45885838026423e2ea0b4a9fc12fa804081f9806b95bc18512094f",
+ "size": 198920
+ },
+ "valhalla_runtime/lib/libkeyutils.so.1": {
+ "sha256": "a58e06275e8e2010be20f367b7f2263e56130c04cb83523f29ae94555705ea59",
+ "size": 67432
+ },
+ "valhalla_runtime/lib/libkrb5.so.3": {
+ "sha256": "b411523bb29d8aef30f208c91bcead2bd8b8a64067e891686e33fe6a00369663",
+ "size": 859904
+ },
+ "valhalla_runtime/lib/libkrb5support.so.0": {
+ "sha256": "05fe1c19d3717a12d3a6237daa8c71604237f30b723c0a9bc40b7b759a69f9a2",
+ "size": 68192
+ },
+ "valhalla_runtime/lib/liblber.so.2": {
+ "sha256": "92e756c779c3fa77c4e8ad1ef0d97ebc2eaeccb2f9829da521691c52df4129d5",
+ "size": 67792
+ },
+ "valhalla_runtime/lib/libldap.so.2": {
+ "sha256": "6d3332e01734a21c0b1b18e993d6117a31f8227d3859556397704f266e18e262",
+ "size": 396656
+ },
+ "valhalla_runtime/lib/liblz4.so.1": {
+ "sha256": "d1482a2f74152881d8b83708fedae7bca039f5608024f1178dc21a17df9887a7",
+ "size": 133136
+ },
+ "valhalla_runtime/lib/liblzma.so.5": {
+ "sha256": "cb4d37d810d354f1c3be46bd2897ba47c9f7388da7e6470a79e3accfa8e81f41",
+ "size": 198584
+ },
+ "valhalla_runtime/lib/libmd.so.0": {
+ "sha256": "30d117046ce9405745e0d0d4722cff121f532913180bbb9425b38d076319ac08",
+ "size": 67584
+ },
+ "valhalla_runtime/lib/libnettle.so.8": {
+ "sha256": "8fd8ed433f1b993fe8b8aa8d3fa5342955ab581dc5ce418381872cd3df3dbb11",
+ "size": 395272
+ },
+ "valhalla_runtime/lib/libnghttp2.so.14": {
+ "sha256": "943724df4606c5eaeb47b2371da22d08fa3870249cfe90c84cef8e57ed6d8db5",
+ "size": 198768
+ },
+ "valhalla_runtime/lib/libnorm.so.1": {
+ "sha256": "31ec03ead2addce2d5e017e641750bd9612a9250faac2b408b669de1182428b7",
+ "size": 395208
+ },
+ "valhalla_runtime/lib/libp11-kit.so.0": {
+ "sha256": "10a0b7558d6cac2d777cc39a673f85ada4bfc4be7d8a2f2516e00999154b68a4",
+ "size": 1889776
+ },
+ "valhalla_runtime/lib/libpgm-5.3.so.0": {
+ "sha256": "bd9cf5ac5a861376c67579b8b62357df29722242aa3b47c849ae1faec24e4e92",
+ "size": 330392
+ },
+ "valhalla_runtime/lib/libprime_server.so.0": {
+ "sha256": "e8a7afac9407ab2119bd1d4183037577dc19e87068a09bb7d0424895f07fa4f6",
+ "size": 6565856
+ },
+ "valhalla_runtime/lib/libproj.so.25": {
+ "sha256": "7db50e4d982d2535c39403f27596a53ac98f1bd5f9877d43f2bd828a023a732c",
+ "size": 3740296
+ },
+ "valhalla_runtime/lib/libprotobuf-lite.so.32": {
+ "sha256": "e87c7af5028f82824bbff41f892c7d6d1f9c844870890bc3621f338f280007b4",
+ "size": 854904
+ },
+ "valhalla_runtime/lib/libpsl.so.5": {
+ "sha256": "95bd0ee93925255421d4f2adc621ac26e451fae04f613c8edd368c288be43488",
+ "size": 132888
+ },
+ "valhalla_runtime/lib/libresolv.so.2": {
+ "sha256": "e79ba5df3dc6e7d1bc67b16a49f13337ba46bbb01be1c896f0bdfd8e91c8e9f7",
+ "size": 67720
+ },
+ "valhalla_runtime/lib/librtmp.so.1": {
+ "sha256": "0e449c6660fb3dc7e06c56034f41106e9cf48a3baf5d30c1e0b53a48276d0c51",
+ "size": 133928
+ },
+ "valhalla_runtime/lib/libsasl2.so.2": {
+ "sha256": "f936a889bcc2d8b5ac8b89e2b37e4359bbd87cbbe87bd2b2002358dfffe04cce",
+ "size": 133800
+ },
+ "valhalla_runtime/lib/libsharpyuv.so.0": {
+ "sha256": "aa4617020b4bc450ef4382ea93ab3d6bef6571433498794a9b88a5675d52fe6d",
+ "size": 67520
+ },
+ "valhalla_runtime/lib/libsodium.so.23": {
+ "sha256": "3b72f199720e9382acdc372a944fdee980dac2f7fe2e8f6b1eed38843bc6544f",
+ "size": 264384
+ },
+ "valhalla_runtime/lib/libsqlite3.so.0": {
+ "sha256": "43ba1659a6113bb4360f4a6da9e465bca6403d7d1f376015d5a57901ee5639b6",
+ "size": 1526192
+ },
+ "valhalla_runtime/lib/libssh.so.4": {
+ "sha256": "41b9c6f2b4ad8930bc089f8f8e3b483d2d8f0760f9a7aca721a207c1286e7bde",
+ "size": 466056
+ },
+ "valhalla_runtime/lib/libssl.so.3": {
+ "sha256": "f23c6de6c41fb0ecc159f1af052cae3b525de697fae242290e656a242e7bc25d",
+ "size": 737192
+ },
+ "valhalla_runtime/lib/libsystemd.so.0": {
+ "sha256": "f1db21e4bb449d1844ac033d7b6f2e3921e140f386370a4a32f9043ea1437b9e",
+ "size": 989464
+ },
+ "valhalla_runtime/lib/libtasn1.so.6": {
+ "sha256": "039d653f8fdfa01240882b0033aca6887e1e9e6dc39acbea51d658fa75437955",
+ "size": 133048
+ },
+ "valhalla_runtime/lib/libtiff.so.6": {
+ "sha256": "96c0ab894fc511a760a08d33e53083aa9fc95f7bdfd3c3bd81cfdbdf26b592db",
+ "size": 591816
+ },
+ "valhalla_runtime/lib/libunistring.so.5": {
+ "sha256": "639c4c15f94e960450b69475d7282e4760fd5895a6a4f4e85f44bb15b74e512c",
+ "size": 1771448
+ },
+ "valhalla_runtime/lib/libuuid.so.1": {
+ "sha256": "58d35ebee086e9f858cd3e597236f1d744e587a216330e3f1d5f1e9ad011c55c",
+ "size": 67576
+ },
+ "valhalla_runtime/lib/libwebp.so.7": {
+ "sha256": "d921459ab6508b3239218b0e4c2e44dbd2e702aeff4273190bf25d2036373930",
+ "size": 395616
+ },
+ "valhalla_runtime/lib/libz.so.1": {
+ "sha256": "170380b4e7ab28ec86eb090b48df90f84089392cb72fecd5067e5b7a4dc5239f",
+ "size": 133272
+ },
+ "valhalla_runtime/lib/libzmq.so.5": {
+ "sha256": "1d986e7d5a45493b6adce97808ec5307d6c625ea4921e074023481521c2af4d9",
+ "size": 659312
+ },
+ "valhalla_runtime/lib/libzstd.so.1": {
+ "sha256": "fe726238b170b83aa83bf1f8a79109b8b61b9eb45234304511d093bbe5f5fb20",
+ "size": 657432
+ }
+}
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/bin/valhalla_service b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/bin/valhalla_service
new file mode 100755
index 000000000..5079b847c
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/bin/valhalla_service differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libLerc.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libLerc.so.4
new file mode 100644
index 000000000..bb7ed607b
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libLerc.so.4 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlicommon.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlicommon.so.1
new file mode 100644
index 000000000..abf0f2119
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlicommon.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlidec.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlidec.so.1
new file mode 100644
index 000000000..408f42eca
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlidec.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbsd.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbsd.so.0
new file mode 100644
index 000000000..1bdd2de12
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbsd.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcap.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcap.so.2
new file mode 100644
index 000000000..a44fd1ff1
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcap.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcom_err.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcom_err.so.2
new file mode 100644
index 000000000..b35b04b2f
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcom_err.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcrypto.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcrypto.so.3
new file mode 100644
index 000000000..cae87834e
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcrypto.so.3 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl-gnutls.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl-gnutls.so.4
new file mode 100644
index 000000000..8633971a0
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl-gnutls.so.4 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl.so.4
new file mode 100644
index 000000000..5c8bc4381
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl.so.4 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libczmq.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libczmq.so.4
new file mode 100644
index 000000000..6492ee5b3
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libczmq.so.4 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libdeflate.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libdeflate.so.0
new file mode 100644
index 000000000..dc310b344
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libdeflate.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libffi.so.8 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libffi.so.8
new file mode 100644
index 000000000..b61badf40
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libffi.so.8 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgcrypt.so.20 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgcrypt.so.20
new file mode 100644
index 000000000..12edbbeb1
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgcrypt.so.20 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgeotiff.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgeotiff.so.5
new file mode 100644
index 000000000..2f0ee5f90
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgeotiff.so.5 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgmp.so.10 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgmp.so.10
new file mode 100644
index 000000000..bc27e7805
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgmp.so.10 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgnutls.so.30 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgnutls.so.30
new file mode 100644
index 000000000..918f69314
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgnutls.so.30 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgpg-error.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgpg-error.so.0
new file mode 100644
index 000000000..902811740
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgpg-error.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgssapi_krb5.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgssapi_krb5.so.2
new file mode 100644
index 000000000..9971c8381
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgssapi_krb5.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libhogweed.so.6 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libhogweed.so.6
new file mode 100644
index 000000000..9e2729217
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libhogweed.so.6 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libidn2.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libidn2.so.0
new file mode 100644
index 000000000..cc368662a
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libidn2.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjbig.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjbig.so.0
new file mode 100644
index 000000000..401a46bfa
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjbig.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjpeg.so.8 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjpeg.so.8
new file mode 100644
index 000000000..11a9d2e43
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjpeg.so.8 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libk5crypto.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libk5crypto.so.3
new file mode 100644
index 000000000..d5ebf4147
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libk5crypto.so.3 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkeyutils.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkeyutils.so.1
new file mode 100644
index 000000000..d94048b4b
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkeyutils.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5.so.3
new file mode 100644
index 000000000..4138f0102
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5.so.3 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5support.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5support.so.0
new file mode 100644
index 000000000..6946197cf
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5support.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblber.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblber.so.2
new file mode 100644
index 000000000..9ea129ee9
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblber.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libldap.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libldap.so.2
new file mode 100644
index 000000000..3c4871c4f
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libldap.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblz4.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblz4.so.1
new file mode 100644
index 000000000..1b3cb2ee1
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblz4.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblzma.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblzma.so.5
new file mode 100644
index 000000000..c14c6ffbd
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblzma.so.5 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libmd.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libmd.so.0
new file mode 100644
index 000000000..890210262
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libmd.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnettle.so.8 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnettle.so.8
new file mode 100644
index 000000000..4e32dde37
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnettle.so.8 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnghttp2.so.14 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnghttp2.so.14
new file mode 100644
index 000000000..f211c1a82
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnghttp2.so.14 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnorm.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnorm.so.1
new file mode 100644
index 000000000..2c3c240ec
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnorm.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libp11-kit.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libp11-kit.so.0
new file mode 100644
index 000000000..21760a0b9
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libp11-kit.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpgm-5.3.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpgm-5.3.so.0
new file mode 100644
index 000000000..bb659d72d
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpgm-5.3.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprime_server.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprime_server.so.0
new file mode 100644
index 000000000..3883d0a23
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprime_server.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libproj.so.25 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libproj.so.25
new file mode 100644
index 000000000..d8f30ad0c
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libproj.so.25 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprotobuf-lite.so.32 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprotobuf-lite.so.32
new file mode 100644
index 000000000..81b6b10af
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprotobuf-lite.so.32 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpsl.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpsl.so.5
new file mode 100644
index 000000000..9c4ea4fd7
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpsl.so.5 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libresolv.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libresolv.so.2
new file mode 100644
index 000000000..06360ad60
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libresolv.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/librtmp.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/librtmp.so.1
new file mode 100644
index 000000000..01d7d1ac6
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/librtmp.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsasl2.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsasl2.so.2
new file mode 100644
index 000000000..badf01bec
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsasl2.so.2 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsharpyuv.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsharpyuv.so.0
new file mode 100644
index 000000000..110fc6ad1
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsharpyuv.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsodium.so.23 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsodium.so.23
new file mode 100644
index 000000000..a87cb1166
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsodium.so.23 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsqlite3.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsqlite3.so.0
new file mode 100644
index 000000000..247df7fb0
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsqlite3.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssh.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssh.so.4
new file mode 100644
index 000000000..2ef5c4a4c
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssh.so.4 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssl.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssl.so.3
new file mode 100644
index 000000000..7b76fec8c
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssl.so.3 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsystemd.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsystemd.so.0
new file mode 100644
index 000000000..a5a91c085
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsystemd.so.0 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtasn1.so.6 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtasn1.so.6
new file mode 100644
index 000000000..145a1902d
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtasn1.so.6 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtiff.so.6 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtiff.so.6
new file mode 100644
index 000000000..e4146021a
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtiff.so.6 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libunistring.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libunistring.so.5
new file mode 100644
index 000000000..b44518b9f
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libunistring.so.5 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libuuid.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libuuid.so.1
new file mode 100644
index 000000000..0e10134e9
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libuuid.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libwebp.so.7 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libwebp.so.7
new file mode 100644
index 000000000..dd228789b
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libwebp.so.7 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libz.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libz.so.1
new file mode 100644
index 000000000..16dce3683
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libz.so.1 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzmq.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzmq.so.5
new file mode 100644
index 000000000..daaff4150
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzmq.so.5 differ
diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzstd.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzstd.so.1
new file mode 100644
index 000000000..5e592595e
Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzstd.so.1 differ
diff --git a/artifacts/offline_nav_assets/iqpilot_offline_maps_california_20260309233945.tar.zst.sha256 b/artifacts/offline_nav_assets/iqpilot_offline_maps_california_20260309233945.tar.zst.sha256
new file mode 100644
index 000000000..1f9530bbf
--- /dev/null
+++ b/artifacts/offline_nav_assets/iqpilot_offline_maps_california_20260309233945.tar.zst.sha256
@@ -0,0 +1 @@
+94b50010dc5be730b389d856cd143d2e21e9a0a31cf4bee01740a0503dbcda0c artifacts/offline_nav_assets/iqpilot_offline_maps_california_20260309233945.tar.zst
diff --git a/artifacts/offline_nav_assets/iqpilot_offline_maps_illinois_20260309233729.tar.zst.sha256 b/artifacts/offline_nav_assets/iqpilot_offline_maps_illinois_20260309233729.tar.zst.sha256
new file mode 100644
index 000000000..7726d057b
--- /dev/null
+++ b/artifacts/offline_nav_assets/iqpilot_offline_maps_illinois_20260309233729.tar.zst.sha256
@@ -0,0 +1 @@
+239ec72f8df0e72e6a2f6432779cb758494e8fa248fdb8fb0fada47e631d98f2 artifacts/offline_nav_assets/iqpilot_offline_maps_illinois_20260309233729.tar.zst
diff --git a/artifacts/runtime/apply_boot_branding.py b/artifacts/runtime/apply_boot_branding.py
new file mode 100644
index 000000000..284657a45
--- /dev/null
+++ b/artifacts/runtime/apply_boot_branding.py
@@ -0,0 +1,317 @@
+#!/usr/bin/env python3
+
+from __future__ import annotations
+
+import argparse
+import hashlib
+import json
+import os
+import shutil
+import subprocess
+import sys
+import time
+from collections.abc import Callable
+from pathlib import Path
+
+_COLOR = sys.stdout.isatty() and os.environ.get("NO_COLOR") is None
+
+
+def _paint(text: str, code: str) -> str:
+ return f"\033[{code}m{text}\033[0m" if _COLOR else text
+
+
+ROOT = Path(__file__).resolve().parents[2]
+ASSET_DIR = ROOT / "artifacts" / "runtime" / "boot_branding"
+BG_ASSET = ASSET_DIR / "bg.jpg"
+SPLASH_BMP_ASSET = ASSET_DIR / "splash_embedded.bmp"
+
+BG_TARGET = Path("/usr/comma/bg.jpg")
+SPLASH_TARGET = Path("/dev/block/bootdevice/by-name/splash")
+SPLASH_BMP_OFFSET = 16384
+
+PASSWD_PATH = Path("/etc/passwd")
+SHADOW_PATH = Path("/etc/shadow")
+IQ_USER = "iq"
+IQ_GECOS = "IQ.Pilot"
+SOURCE_USER = "comma"
+
+STATE_DIR = Path("/data/iqpilot_boot_branding")
+BACKUP_DIR = STATE_DIR / "backups"
+META_PATH = BACKUP_DIR / "metadata.json"
+BG_BACKUP = BACKUP_DIR / "bg.jpg.orig"
+SPLASH_BACKUP = BACKUP_DIR / "splash.partition.orig.img"
+
+
+def sha256_bytes(data: bytes) -> str:
+ return hashlib.sha256(data).hexdigest()
+
+
+def sha256_path(path: Path) -> str:
+ h = hashlib.sha256()
+ with path.open("rb") as f:
+ for chunk in iter(lambda: f.read(1024 * 1024), b""):
+ h.update(chunk)
+ return h.hexdigest()
+
+
+def run(cmd: list[str], capture_output: bool = False) -> str:
+ res = subprocess.run(cmd, check=True, text=True, capture_output=capture_output)
+ return res.stdout.strip() if capture_output else ""
+
+
+def get_root_mount_options() -> str:
+ return run(["findmnt", "-no", "OPTIONS", "/"], capture_output=True)
+
+
+def remount_root(mode: str) -> None:
+ run(["mount", "-o", mode, "/"])
+
+
+def splash_size() -> int:
+ return int(run(["blockdev", "--getsize64", str(SPLASH_TARGET)], capture_output=True))
+
+
+def read_splash_bytes(offset: int, size: int) -> bytes:
+ with SPLASH_TARGET.open("rb") as f:
+ f.seek(offset)
+ return f.read(size)
+
+
+def write_splash_bytes(offset: int, data: bytes) -> None:
+ with SPLASH_TARGET.open("r+b", buffering=0) as f:
+ f.seek(offset)
+ f.write(data)
+ f.flush()
+ os.fsync(f.fileno())
+
+
+def backup_if_missing() -> None:
+ BACKUP_DIR.mkdir(parents=True, exist_ok=True)
+
+ if not BG_BACKUP.exists():
+ shutil.copy2(BG_TARGET, BG_BACKUP)
+
+ if not SPLASH_BACKUP.exists():
+ with SPLASH_TARGET.open("rb") as src, SPLASH_BACKUP.open("wb") as dst:
+ remaining = splash_size()
+ while remaining > 0:
+ chunk = src.read(min(1024 * 1024, remaining))
+ if not chunk:
+ break
+ dst.write(chunk)
+ remaining -= len(chunk)
+
+ if not META_PATH.exists():
+ splash_backup_hash = sha256_path(SPLASH_BACKUP)
+ meta = {
+ "bg_backup_sha256": sha256_path(BG_BACKUP),
+ "splash_backup_sha256": splash_backup_hash,
+ "bg_asset_sha256": sha256_path(BG_ASSET) if BG_ASSET.exists() else None,
+ "splash_asset_sha256": sha256_path(SPLASH_BMP_ASSET) if SPLASH_BMP_ASSET.exists() else None,
+ "splash_bmp_offset": SPLASH_BMP_OFFSET,
+ }
+ META_PATH.write_text(json.dumps(meta, indent=2) + "\n", encoding="utf-8")
+
+
+def _line_for_user(text: str, user: str) -> str | None:
+ prefix = f"{user}:"
+ for line in text.splitlines():
+ if line.startswith(prefix):
+ return line
+ return None
+
+
+def _expected_passwd_line(source_passwd_line: str) -> str:
+ """Build the iq passwd line by cloning comma's UID/GID/home/shell."""
+ fields = source_passwd_line.split(":")
+ if len(fields) < 7:
+ raise ValueError(f"malformed passwd line for {SOURCE_USER!r}: {source_passwd_line!r}")
+ _name, passwd_x, uid, gid, _gecos, home, shell = fields[:7]
+ return f"{IQ_USER}:{passwd_x}:{uid}:{gid}:{IQ_GECOS}:{home}:{shell}"
+
+
+def _expected_shadow_line(days_since_epoch: int) -> str:
+ return f"{IQ_USER}:!:{days_since_epoch}:0:99999:7:::"
+
+
+def _replace_or_append(text: str, user: str, new_line: str) -> str:
+ prefix = f"{user}:"
+ out: list[str] = []
+ replaced = False
+ for line in text.splitlines():
+ if line.startswith(prefix):
+ if not replaced:
+ out.append(new_line)
+ replaced = True
+ continue
+ out.append(line)
+ if not replaced:
+ out.append(new_line)
+ return "\n".join(out) + "\n"
+
+
+def ensure_iq_user(
+ passwd_path: Path | None = None,
+ shadow_path: Path | None = None,
+ remount: Callable[[str], None] | None = None,
+ root_opts: str | None = None,
+ now: Callable[[], float] | None = None,
+) -> bool:
+ """Ensure an `iq` user exists as a UID-1000 alias of `comma`.
+
+ Idempotent: returns False when /etc/passwd and /etc/shadow already have a
+ correctly-shaped `iq` entry, True when either file was modified.
+ """
+ passwd_path = passwd_path if passwd_path is not None else PASSWD_PATH
+ shadow_path = shadow_path if shadow_path is not None else SHADOW_PATH
+ remount = remount if remount is not None else remount_root
+ now = now if now is not None else time.time
+
+ passwd_text = passwd_path.read_text(encoding="utf-8") if passwd_path.exists() else ""
+ shadow_text = shadow_path.read_text(encoding="utf-8") if shadow_path.exists() else ""
+
+ source_line = _line_for_user(passwd_text, SOURCE_USER)
+ if source_line is None:
+ # Without a comma user to clone from we'd create a broken iq entry; bail.
+ return False
+
+ expected_passwd = _expected_passwd_line(source_line)
+ passwd_line = _line_for_user(passwd_text, IQ_USER)
+ shadow_line = _line_for_user(shadow_text, IQ_USER)
+
+ passwd_ok = passwd_line == expected_passwd
+ shadow_ok = shadow_line is not None and shadow_line.startswith(f"{IQ_USER}:!:")
+ if passwd_ok and shadow_ok:
+ return False
+
+ days = int(now() // 86400)
+ new_passwd = _replace_or_append(passwd_text, IQ_USER, expected_passwd)
+ new_shadow = _replace_or_append(shadow_text, IQ_USER, _expected_shadow_line(days))
+
+ opts = root_opts if root_opts is not None else get_root_mount_options()
+ remounted = False
+ try:
+ remount("remount,rw")
+ remounted = True
+ if not passwd_ok:
+ passwd_path.write_text(new_passwd, encoding="utf-8")
+ if not shadow_ok:
+ shadow_path.write_text(new_shadow, encoding="utf-8")
+ finally:
+ if remounted:
+ remount(f"remount,{opts}")
+
+ return True
+
+
+def apply_branding() -> bool:
+ if not BG_ASSET.exists() or not SPLASH_BMP_ASSET.exists():
+ return False
+
+ backup_if_missing()
+
+ bg_asset_bytes = BG_ASSET.read_bytes()
+ splash_asset_bytes = SPLASH_BMP_ASSET.read_bytes()
+
+ current_bg_hash = sha256_path(BG_TARGET)
+ current_splash_hash = sha256_bytes(read_splash_bytes(SPLASH_BMP_OFFSET, len(splash_asset_bytes)))
+
+ bg_asset_hash = sha256_bytes(bg_asset_bytes)
+ splash_asset_hash = sha256_bytes(splash_asset_bytes)
+
+ if current_bg_hash == bg_asset_hash and current_splash_hash == splash_asset_hash:
+ return False
+
+ root_opts = get_root_mount_options()
+ remounted = False
+ try:
+ if current_bg_hash != bg_asset_hash:
+ remount_root("remount,rw")
+ remounted = True
+ BG_TARGET.write_bytes(bg_asset_bytes)
+
+ if current_splash_hash != splash_asset_hash:
+ write_splash_bytes(SPLASH_BMP_OFFSET, splash_asset_bytes)
+ run(["sync"])
+ finally:
+ if remounted:
+ remount_root(f"remount,{root_opts}")
+
+ return True
+
+
+def restore_branding() -> bool:
+ if not BG_BACKUP.exists() or not SPLASH_BACKUP.exists():
+ return False
+
+ root_opts = get_root_mount_options()
+ remounted = False
+ try:
+ remount_root("remount,rw")
+ remounted = True
+ shutil.copy2(BG_BACKUP, BG_TARGET)
+
+ with SPLASH_BACKUP.open("rb") as src, SPLASH_TARGET.open("r+b", buffering=0) as dst:
+ while True:
+ chunk = src.read(1024 * 1024)
+ if not chunk:
+ break
+ dst.write(chunk)
+ dst.flush()
+ os.fsync(dst.fileno())
+ run(["sync"])
+ finally:
+ if remounted:
+ remount_root(f"remount,{root_opts}")
+
+ return True
+
+
+def status() -> dict[str, object]:
+ result: dict[str, object] = {
+ "bg_asset_exists": BG_ASSET.exists(),
+ "splash_asset_exists": SPLASH_BMP_ASSET.exists(),
+ "bg_backup_exists": BG_BACKUP.exists(),
+ "splash_backup_exists": SPLASH_BACKUP.exists(),
+ }
+ if BG_ASSET.exists() and BG_TARGET.exists():
+ result["bg_asset_sha256"] = sha256_path(BG_ASSET)
+ result["bg_current_sha256"] = sha256_path(BG_TARGET)
+ if SPLASH_BMP_ASSET.exists() and SPLASH_TARGET.exists():
+ splash_asset_bytes = SPLASH_BMP_ASSET.read_bytes()
+ result["splash_asset_sha256"] = sha256_bytes(splash_asset_bytes)
+ result["splash_current_sha256"] = sha256_bytes(read_splash_bytes(SPLASH_BMP_OFFSET, len(splash_asset_bytes)))
+ return result
+
+
+def main() -> int:
+ if os.geteuid() != 0:
+ raise SystemExit("apply_boot_branding.py must run as root")
+
+ parser = argparse.ArgumentParser()
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument("--restore", action="store_true")
+ group.add_argument("--status", action="store_true")
+ args = parser.parse_args()
+
+ if args.status:
+ print(json.dumps(status(), indent=2))
+ return 0
+
+ changed = restore_branding() if args.restore else apply_branding()
+
+ try:
+ iq_changed = ensure_iq_user()
+ except Exception as e: # noqa: BLE001
+ iq_changed = False
+ print(_paint(f"ensure_iq_user failed: {e}", "1;38;5;203"))
+
+ if changed or iq_changed:
+ print(_paint("changed", "38;5;114"))
+ else:
+ print(_paint("no-change", "2;38;5;246"))
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/artifacts/runtime/boot_branding/bg.jpg b/artifacts/runtime/boot_branding/bg.jpg
new file mode 100644
index 000000000..90851aefe
Binary files /dev/null and b/artifacts/runtime/boot_branding/bg.jpg differ
diff --git a/artifacts/runtime/boot_branding/splash_embedded.bmp b/artifacts/runtime/boot_branding/splash_embedded.bmp
new file mode 100644
index 000000000..71b3dab6f
Binary files /dev/null and b/artifacts/runtime/boot_branding/splash_embedded.bmp differ
diff --git a/artifacts/runtime/ensure_private_installed.sh b/artifacts/runtime/ensure_private_installed.sh
new file mode 100644
index 000000000..6593075ae
--- /dev/null
+++ b/artifacts/runtime/ensure_private_installed.sh
@@ -0,0 +1,381 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." >/dev/null && pwd )"
+INSTALL_ROOT="${ROOT_DIR}/.iqpilot"
+BUNDLES_ROOT="${INSTALL_ROOT}/bundles"
+VERIFY_SCRIPT="${ROOT_DIR}/artifacts/runtime/verify_proprietary_bundle.py"
+
+manifest_hash() {
+ local manifest_path="$1"
+ if command -v sha256sum >/dev/null 2>&1; then
+ sha256sum "${manifest_path}" | awk '{print $1}'
+ else
+ shasum -a 256 "${manifest_path}" | awk '{print $1}'
+ fi
+}
+
+NAVD_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_navd_private"
+HEPHA_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_hephaestusd_private"
+MODEL_SELECTOR_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_model_selector_private"
+ALC_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_alc_private"
+COMMANDER_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_commander_private"
+UPDATER_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_updater_private"
+VALHALLA_RUNTIME_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_valhalla_runtime"
+BUNDLE_INSTALL_NAVD="${BUNDLES_ROOT}/iqpilot_navd_private"
+BUNDLE_INSTALL_HEPHA="${BUNDLES_ROOT}/iqpilot_hephaestusd_private"
+BUNDLE_INSTALL_MODEL_SELECTOR="${BUNDLES_ROOT}/iqpilot_model_selector_private"
+BUNDLE_INSTALL_ALC="${BUNDLES_ROOT}/iqpilot_alc_private"
+BUNDLE_INSTALL_COMMANDER="${BUNDLES_ROOT}/iqpilot_commander_private"
+BUNDLE_INSTALL_UPDATER="${BUNDLES_ROOT}/iqpilot_updater_private"
+BUNDLE_INSTALL_VALHALLA_RUNTIME="${BUNDLES_ROOT}/iqpilot_valhalla_runtime"
+NAVD_STATE_FILE="${INSTALL_ROOT}/.installed_navd_manifest.sha256"
+HEPHA_STATE_FILE="${INSTALL_ROOT}/.installed_hephaestusd_manifest.sha256"
+MODEL_SELECTOR_STATE_FILE="${INSTALL_ROOT}/.installed_model_selector_manifest.sha256"
+ALC_STATE_FILE="${INSTALL_ROOT}/.installed_alc_manifest.sha256"
+COMMANDER_STATE_FILE="${INSTALL_ROOT}/.installed_commander_manifest.sha256"
+UPDATER_STATE_FILE="${INSTALL_ROOT}/.installed_updater_manifest.sha256"
+VALHALLA_RUNTIME_STATE_FILE="${INSTALL_ROOT}/.installed_valhalla_runtime_manifest.sha256"
+NAVD_SENTINEL_BASE="${BUNDLE_INSTALL_NAVD}/python/iqpilot_private/navd/navd"
+HEPHA_SENTINEL_BASE="${BUNDLE_INSTALL_HEPHA}/python/iqpilot_private/konn3kt/hephaestus/hephaestusd"
+MODEL_SELECTOR_SENTINEL_BASE="${BUNDLE_INSTALL_MODEL_SELECTOR}/python/iqpilot_private/models/manager"
+ALC_SENTINEL_BASE="${BUNDLE_INSTALL_ALC}/python/iqpilot_private/konn3kt/iqlvbs/alc"
+COMMANDER_SENTINEL_BASE="${BUNDLE_INSTALL_COMMANDER}/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander"
+UPDATER_SENTINEL_BASE="${BUNDLE_INSTALL_UPDATER}/python/iqpilot_private/updater/git_remote"
+VALHALLA_RUNTIME_SENTINEL="${BUNDLE_INSTALL_VALHALLA_RUNTIME}/valhalla_runtime/bin/valhalla_service"
+
+NAVD_HASH=""
+HEPHA_HASH=""
+MODEL_SELECTOR_HASH=""
+ALC_HASH=""
+COMMANDER_HASH=""
+UPDATER_HASH=""
+VALHALLA_RUNTIME_HASH=""
+NEED_INSTALL=0
+HAVE_BUNDLE=0
+
+seed_hepha_ble_runtime() {
+ if [ ! -f "${HEPHA_BUNDLE}/manifest.json" ]; then
+ return 0
+ fi
+
+ PYTHONPATH="${ROOT_DIR}" python3 <<'PY'
+from pathlib import Path
+import os
+import secrets
+
+BLE_ENABLE_PARAM = "Konn3ktBleTransportEnabled"
+PRIMARY_AUTH_DIR = Path("/data/konn3kt_ble")
+FALLBACK_AUTH_DIR = Path("/data/openpilot/.konn3kt_ble")
+
+
+def ensure_dir(path: Path, mode: int) -> bool:
+ try:
+ path.mkdir(parents=True, exist_ok=True)
+ try:
+ os.chmod(path, mode)
+ except Exception:
+ pass
+ return True
+ except Exception:
+ return False
+
+
+def write_if_missing(path: Path, contents: str, mode: int) -> None:
+ if path.exists():
+ return
+ path.write_text(contents, encoding="utf-8")
+ try:
+ os.chmod(path, mode)
+ except Exception:
+ pass
+
+
+def seed_ble_enable_param() -> None:
+ try:
+ from openpilot.common.params import Params
+ params = Params()
+ if params.get(BLE_ENABLE_PARAM) is None:
+ params.put_bool(BLE_ENABLE_PARAM, True)
+ return
+ except Exception:
+ pass
+
+ param_path = Path("/data/params/d") / BLE_ENABLE_PARAM
+ if ensure_dir(param_path.parent, 0o755):
+ try:
+ if not param_path.exists():
+ param_path.write_bytes(b"1")
+ except Exception:
+ pass
+
+
+def seed_ble_auth_artifacts() -> None:
+ auth_dir = None
+ for candidate in (PRIMARY_AUTH_DIR, FALLBACK_AUTH_DIR):
+ if ensure_dir(candidate, 0o700):
+ auth_dir = candidate
+ break
+
+ if auth_dir is None:
+ return
+
+ write_if_missing(auth_dir / "approved_clients.json", "{}\n", 0o600)
+ write_if_missing(auth_dir / "install_credentials.json", "{}\n", 0o600)
+ write_if_missing(auth_dir / "dev_secret", f"{secrets.token_hex(32)}\n", 0o600)
+
+
+seed_ble_enable_param()
+seed_ble_auth_artifacts()
+PY
+
+ if [ -d /usr/lib/python3/dist-packages/gi ]; then
+ ln -sfn /usr/lib/python3/dist-packages/gi "${ROOT_DIR}/gi"
+ fi
+}
+
+module_present() {
+ local base_path="$1"
+ if [ -f "${base_path}.pyc" ]; then
+ return 0
+ fi
+ if compgen -G "${base_path}".*.so >/dev/null; then
+ return 0
+ fi
+ return 1
+}
+
+apply_manifest_modes() {
+ local bundle_root="$1"
+ if [ ! -f "${bundle_root}/manifest.json" ]; then
+ return 0
+ fi
+
+ python3 - "${bundle_root}" <<'PY'
+from pathlib import Path
+import json
+import os
+import sys
+
+root = Path(sys.argv[1])
+manifest = json.loads((root / "manifest.json").read_text(encoding="utf-8"))
+for rel, meta in manifest.items():
+ if rel in {"signatures", "runtime"} or not isinstance(meta, dict) or "mode" not in meta:
+ continue
+ path = root / rel
+ if path.exists():
+ os.chmod(path, int(meta["mode"]))
+PY
+}
+
+installed_bundle_valid() {
+ local bundle_root="$1"
+ if [ ! -f "${bundle_root}/manifest.json" ]; then
+ return 1
+ fi
+ apply_manifest_modes "${bundle_root}" || return 1
+ python3 "${VERIFY_SCRIPT}" "${bundle_root}" >/dev/null 2>&1
+}
+
+if [ -f "${NAVD_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${NAVD_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ NAVD_HASH="$(manifest_hash "${NAVD_BUNDLE}/manifest.json")"
+ NAVD_DST_HASH=""
+ if [ -f "${NAVD_STATE_FILE}" ]; then
+ NAVD_DST_HASH="$(cat "${NAVD_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if ! module_present "${NAVD_SENTINEL_BASE}" || [ "${NAVD_HASH}" != "${NAVD_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_NAVD}"; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ -f "${HEPHA_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${HEPHA_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ HEPHA_HASH="$(manifest_hash "${HEPHA_BUNDLE}/manifest.json")"
+ HEPHA_DST_HASH=""
+ if [ -f "${HEPHA_STATE_FILE}" ]; then
+ HEPHA_DST_HASH="$(cat "${HEPHA_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if ! module_present "${HEPHA_SENTINEL_BASE}" || [ "${HEPHA_HASH}" != "${HEPHA_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_HEPHA}"; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ -f "${MODEL_SELECTOR_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${MODEL_SELECTOR_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ MODEL_SELECTOR_HASH="$(manifest_hash "${MODEL_SELECTOR_BUNDLE}/manifest.json")"
+ MODEL_SELECTOR_DST_HASH=""
+ if [ -f "${MODEL_SELECTOR_STATE_FILE}" ]; then
+ MODEL_SELECTOR_DST_HASH="$(cat "${MODEL_SELECTOR_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if ! module_present "${MODEL_SELECTOR_SENTINEL_BASE}" || [ "${MODEL_SELECTOR_HASH}" != "${MODEL_SELECTOR_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_MODEL_SELECTOR}"; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ -f "${ALC_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${ALC_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ ALC_HASH="$(manifest_hash "${ALC_BUNDLE}/manifest.json")"
+ ALC_DST_HASH=""
+ if [ -f "${ALC_STATE_FILE}" ]; then
+ ALC_DST_HASH="$(cat "${ALC_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if ! module_present "${ALC_SENTINEL_BASE}" || [ "${ALC_HASH}" != "${ALC_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_ALC}"; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ -f "${COMMANDER_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${COMMANDER_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ COMMANDER_HASH="$(manifest_hash "${COMMANDER_BUNDLE}/manifest.json")"
+ COMMANDER_DST_HASH=""
+ if [ -f "${COMMANDER_STATE_FILE}" ]; then
+ COMMANDER_DST_HASH="$(cat "${COMMANDER_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if ! module_present "${COMMANDER_SENTINEL_BASE}" || [ "${COMMANDER_HASH}" != "${COMMANDER_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_COMMANDER}"; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ -f "${UPDATER_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${UPDATER_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ UPDATER_HASH="$(manifest_hash "${UPDATER_BUNDLE}/manifest.json")"
+ UPDATER_DST_HASH=""
+ if [ -f "${UPDATER_STATE_FILE}" ]; then
+ UPDATER_DST_HASH="$(cat "${UPDATER_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if ! module_present "${UPDATER_SENTINEL_BASE}" || [ "${UPDATER_HASH}" != "${UPDATER_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_UPDATER}"; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ -f "${VALHALLA_RUNTIME_BUNDLE}/manifest.json" ]; then
+ apply_manifest_modes "${VALHALLA_RUNTIME_BUNDLE}" || true
+ HAVE_BUNDLE=1
+ VALHALLA_RUNTIME_HASH="$(manifest_hash "${VALHALLA_RUNTIME_BUNDLE}/manifest.json")"
+ VALHALLA_RUNTIME_DST_HASH=""
+ if [ -f "${VALHALLA_RUNTIME_STATE_FILE}" ]; then
+ VALHALLA_RUNTIME_DST_HASH="$(cat "${VALHALLA_RUNTIME_STATE_FILE}" 2>/dev/null || true)"
+ fi
+ if [ ! -x "${VALHALLA_RUNTIME_SENTINEL}" ] || [ "${VALHALLA_RUNTIME_HASH}" != "${VALHALLA_RUNTIME_DST_HASH}" ]; then
+ NEED_INSTALL=1
+ fi
+fi
+
+if [ "${HAVE_BUNDLE}" -eq 0 ]; then
+ exit 0
+fi
+
+if [ "${NEED_INSTALL}" -eq 0 ]; then
+ seed_hepha_ble_runtime || true
+ exit 0
+fi
+
+TMP_ROOT="${INSTALL_ROOT}.tmp.$$"
+echo "Installing bundled private artifacts..."
+rm -rf "${TMP_ROOT}"
+mkdir -p "${TMP_ROOT}"
+mkdir -p "${TMP_ROOT}/bundles"
+
+if [ -d "${INSTALL_ROOT}" ]; then
+ cp -a "${INSTALL_ROOT}"/. "${TMP_ROOT}/"
+fi
+
+if [ -f "${NAVD_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${NAVD_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_navd_private"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_navd_private"
+ cp -a "${NAVD_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_navd_private/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_navd_private"
+fi
+
+if [ -f "${HEPHA_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${HEPHA_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private"
+ cp -a "${HEPHA_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private"
+fi
+
+if [ -f "${MODEL_SELECTOR_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${MODEL_SELECTOR_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_model_selector_private"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_model_selector_private"
+ cp -a "${MODEL_SELECTOR_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_model_selector_private/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_model_selector_private"
+fi
+
+if [ -f "${ALC_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${ALC_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_alc_private"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_alc_private"
+ cp -a "${ALC_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_alc_private/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_alc_private"
+fi
+
+if [ -f "${COMMANDER_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${COMMANDER_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_commander_private"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_commander_private"
+ cp -a "${COMMANDER_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_commander_private/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_commander_private"
+fi
+
+if [ -f "${UPDATER_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${UPDATER_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_updater_private"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_updater_private"
+ cp -a "${UPDATER_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_updater_private/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_updater_private"
+fi
+
+if [ -f "${VALHALLA_RUNTIME_BUNDLE}/manifest.json" ]; then
+ python3 "${VERIFY_SCRIPT}" "${VALHALLA_RUNTIME_BUNDLE}"
+ rm -rf "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime"
+ mkdir -p "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime"
+ cp -a "${VALHALLA_RUNTIME_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime/"
+ apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime"
+fi
+
+if [ -d "${INSTALL_ROOT}" ]; then
+ rm -rf "${INSTALL_ROOT}.bak"
+ mv "${INSTALL_ROOT}" "${INSTALL_ROOT}.bak"
+fi
+
+mv "${TMP_ROOT}" "${INSTALL_ROOT}"
+
+if [ -d "${INSTALL_ROOT}.bak" ]; then
+ rm -rf "${INSTALL_ROOT}.bak"
+fi
+
+if [ -n "${NAVD_HASH}" ]; then
+ printf '%s\n' "${NAVD_HASH}" > "${NAVD_STATE_FILE}"
+fi
+if [ -n "${HEPHA_HASH}" ]; then
+ printf '%s\n' "${HEPHA_HASH}" > "${HEPHA_STATE_FILE}"
+fi
+if [ -n "${MODEL_SELECTOR_HASH}" ]; then
+ printf '%s\n' "${MODEL_SELECTOR_HASH}" > "${MODEL_SELECTOR_STATE_FILE}"
+fi
+if [ -n "${ALC_HASH}" ]; then
+ printf '%s\n' "${ALC_HASH}" > "${ALC_STATE_FILE}"
+fi
+if [ -n "${COMMANDER_HASH}" ]; then
+ printf '%s\n' "${COMMANDER_HASH}" > "${COMMANDER_STATE_FILE}"
+fi
+if [ -n "${UPDATER_HASH}" ]; then
+ printf '%s\n' "${UPDATER_HASH}" > "${UPDATER_STATE_FILE}"
+fi
+if [ -n "${VALHALLA_RUNTIME_HASH}" ]; then
+ printf '%s\n' "${VALHALLA_RUNTIME_HASH}" > "${VALHALLA_RUNTIME_STATE_FILE}"
+fi
+
+seed_hepha_ble_runtime || true
+
+echo "Private artifacts installed."
diff --git a/artifacts/runtime/test_apply_boot_branding.py b/artifacts/runtime/test_apply_boot_branding.py
new file mode 100644
index 000000000..e741bf143
--- /dev/null
+++ b/artifacts/runtime/test_apply_boot_branding.py
@@ -0,0 +1,216 @@
+#!/usr/bin/env python3
+
+from __future__ import annotations
+
+from pathlib import Path
+
+import pytest
+
+from artifacts.runtime import apply_boot_branding as abb
+
+
+COMMA_HOME = "/home/comma"
+
+EXISTING_PASSWD = (
+ "root:x:0:0:root:/root:/bin/bash\n"
+ "daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n"
+ f"comma:x:1000:1000:comma:{COMMA_HOME}:/bin/bash\n"
+ "nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n"
+)
+
+EXISTING_SHADOW = (
+ "root:*:19000:0:99999:7:::\n"
+ "daemon:*:19000:0:99999:7:::\n"
+ "comma:$6$abc$xyz:19000:0:99999:7:::\n"
+ "nobody:!:19000:0:99999:7:::\n"
+)
+
+EXPECTED_PASSWD_LINE = f"iq:x:1000:1000:IQ.Pilot:{COMMA_HOME}:/bin/bash"
+
+
+@pytest.fixture
+def etc(tmp_path: Path) -> tuple[Path, Path]:
+ passwd = tmp_path / "passwd"
+ shadow = tmp_path / "shadow"
+ passwd.write_text(EXISTING_PASSWD, encoding="utf-8")
+ shadow.write_text(EXISTING_SHADOW, encoding="utf-8")
+ return passwd, shadow
+
+
+@pytest.fixture
+def fake_remount():
+ calls: list[str] = []
+
+ def _remount(mode: str) -> None:
+ calls.append(mode)
+
+ _remount.calls = calls
+ return _remount
+
+
+def _frozen_now() -> float:
+ return 1779494400.0
+
+
+def test_fresh_install_adds_iq_user(etc, fake_remount):
+ passwd, shadow = etc
+
+ changed = abb.ensure_iq_user(
+ passwd_path=passwd,
+ shadow_path=shadow,
+ remount=fake_remount,
+ root_opts="ro,relatime",
+ now=_frozen_now,
+ )
+
+ assert changed is True
+ passwd_text = passwd.read_text(encoding="utf-8")
+ shadow_text = shadow.read_text(encoding="utf-8")
+
+ assert EXPECTED_PASSWD_LINE in passwd_text.splitlines()
+ assert any(l.startswith("iq:!:") and l.endswith(":0:99999:7:::") for l in shadow_text.splitlines())
+
+ for original_line in EXISTING_PASSWD.splitlines():
+ assert original_line in passwd_text.splitlines()
+ for original_line in EXISTING_SHADOW.splitlines():
+ assert original_line in shadow_text.splitlines()
+
+ assert fake_remount.calls == ["remount,rw", "remount,ro,relatime"]
+
+
+def test_second_boot_is_noop(etc, fake_remount):
+ passwd, shadow = etc
+
+ abb.ensure_iq_user(passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now)
+ passwd_after_first = passwd.read_text(encoding="utf-8")
+ shadow_after_first = shadow.read_text(encoding="utf-8")
+ fake_remount.calls.clear()
+
+ changed = abb.ensure_iq_user(
+ passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now,
+ )
+
+ assert changed is False
+ assert passwd.read_text(encoding="utf-8") == passwd_after_first
+ assert shadow.read_text(encoding="utf-8") == shadow_after_first
+ assert fake_remount.calls == [] # no remount when nothing to do
+
+
+def test_partial_state_self_heals(etc, fake_remount):
+ passwd, shadow = etc
+ passwd.write_text(EXISTING_PASSWD + EXPECTED_PASSWD_LINE + "\n", encoding="utf-8")
+ # shadow lacks iq
+
+ changed = abb.ensure_iq_user(
+ passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now,
+ )
+
+ assert changed is True
+ iq_passwd_lines = [l for l in passwd.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")]
+ iq_shadow_lines = [l for l in shadow.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")]
+ assert iq_passwd_lines == [EXPECTED_PASSWD_LINE] # not duplicated
+ assert len(iq_shadow_lines) == 1
+ assert iq_shadow_lines[0].startswith("iq:!:")
+
+
+def test_malformed_iq_passwd_line_replaced(etc, fake_remount):
+ passwd, shadow = etc
+ wrong = "iq:x:1000:1000:old:/root:/bin/sh"
+ passwd.write_text(EXISTING_PASSWD + wrong + "\n", encoding="utf-8")
+
+ changed = abb.ensure_iq_user(
+ passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now,
+ )
+
+ assert changed is True
+ iq_lines = [l for l in passwd.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")]
+ assert iq_lines == [EXPECTED_PASSWD_LINE]
+
+
+def test_remount_ro_restored_on_write_failure(tmp_path, fake_remount):
+ passwd = tmp_path / "ro_passwd"
+ passwd.write_text(EXISTING_PASSWD, encoding="utf-8")
+ passwd.chmod(0o444) # force write to raise
+
+ shadow = tmp_path / "shadow"
+ shadow.write_text(EXISTING_SHADOW, encoding="utf-8")
+
+ with pytest.raises(PermissionError):
+ abb.ensure_iq_user(
+ passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now,
+ )
+
+ assert fake_remount.calls == ["remount,rw", "remount,ro"]
+
+
+def test_does_not_alter_existing_branding_flow(monkeypatch, etc, fake_remount, capsys):
+ passwd, shadow = etc
+
+ monkeypatch.setattr(abb, "PASSWD_PATH", passwd)
+ monkeypatch.setattr(abb, "SHADOW_PATH", shadow)
+ monkeypatch.setattr(abb, "remount_root", fake_remount)
+ monkeypatch.setattr(abb, "get_root_mount_options", lambda: "ro,relatime")
+ monkeypatch.setattr(abb.os, "geteuid", lambda: 0)
+ monkeypatch.setattr(abb, "apply_branding", lambda: False) # no assets → branding no-op
+ monkeypatch.setattr("sys.argv", ["apply_boot_branding.py"])
+
+ rc = abb.main()
+ out = capsys.readouterr().out.strip().splitlines()
+
+ assert rc == 0
+ assert out[-1] == "changed" # iq_changed flips combined result
+ assert EXPECTED_PASSWD_LINE in passwd.read_text(encoding="utf-8").splitlines()
+
+
+def test_iq_home_tracks_commas_actual_home(tmp_path, fake_remount):
+ passwd = tmp_path / "passwd"
+ shadow = tmp_path / "shadow"
+ unusual_home = "/data/some/relocated/home/comma"
+ passwd.write_text(
+ "root:x:0:0:root:/root:/bin/bash\n"
+ f"comma:x:1000:1000:comma:{unusual_home}:/bin/zsh\n",
+ encoding="utf-8",
+ )
+ shadow.write_text("comma:$6$x$y:19000:0:99999:7:::\n", encoding="utf-8")
+
+ changed = abb.ensure_iq_user(
+ passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now,
+ )
+
+ assert changed is True
+ iq_line = [l for l in passwd.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")][0]
+ # iq inherits comma's home, shell, UID, GID — not a hardcoded path
+ assert iq_line == f"iq:x:1000:1000:IQ.Pilot:{unusual_home}:/bin/zsh"
+
+
+def test_skips_when_comma_user_absent(tmp_path, fake_remount):
+ passwd = tmp_path / "passwd"
+ shadow = tmp_path / "shadow"
+ passwd.write_text("root:x:0:0:root:/root:/bin/bash\n", encoding="utf-8")
+ shadow.write_text("root:*:19000:0:99999:7:::\n", encoding="utf-8")
+
+ changed = abb.ensure_iq_user(
+ passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now,
+ )
+
+ assert changed is False
+ assert "iq:" not in passwd.read_text(encoding="utf-8")
+ assert "iq:" not in shadow.read_text(encoding="utf-8")
+ assert fake_remount.calls == []
+
+
+def test_ensure_iq_user_failure_is_swallowed_by_main(monkeypatch, capsys):
+ def boom(*a, **kw):
+ raise RuntimeError("simulated failure")
+
+ monkeypatch.setattr(abb, "ensure_iq_user", boom)
+ monkeypatch.setattr(abb.os, "geteuid", lambda: 0)
+ monkeypatch.setattr(abb, "apply_branding", lambda: True)
+ monkeypatch.setattr("sys.argv", ["apply_boot_branding.py"])
+
+ rc = abb.main()
+ out = capsys.readouterr().out
+
+ assert rc == 0
+ assert "ensure_iq_user failed: simulated failure" in out
+ assert "changed" in out # branding ran, so combined result is still "changed"
diff --git a/artifacts/runtime/verify_proprietary_bundle.py b/artifacts/runtime/verify_proprietary_bundle.py
new file mode 100644
index 000000000..d0a97252c
--- /dev/null
+++ b/artifacts/runtime/verify_proprietary_bundle.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+import argparse
+import hashlib
+import json
+import stat
+from pathlib import Path
+
+
+def parse_args() -> argparse.Namespace:
+ p = argparse.ArgumentParser(description="Verify IQ Pilot proprietary bundle manifest")
+ p.add_argument("bundle_root", help="Bundle directory containing manifest.json")
+ return p.parse_args()
+
+
+def sha256(path: Path) -> str:
+ h = hashlib.sha256()
+ with path.open("rb") as f:
+ while True:
+ b = f.read(1024 * 1024)
+ if not b:
+ break
+ h.update(b)
+ return h.hexdigest()
+
+
+def main() -> None:
+ args = parse_args()
+ root = Path(args.bundle_root).resolve()
+ manifest_path = root / "manifest.json"
+ if not manifest_path.exists():
+ raise SystemExit(f"manifest not found: {manifest_path}")
+
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
+ failures: list[str] = []
+
+ for rel, meta in manifest.items():
+ if rel in {"signatures", "runtime"}:
+ continue
+ f = root / rel
+ if not f.exists():
+ failures.append(f"missing: {rel}")
+ continue
+
+ got = sha256(f)
+ exp = str(meta["sha256"])
+ if got != exp:
+ failures.append(f"sha256 mismatch: {rel}")
+
+ got_size = f.stat().st_size
+ exp_size = int(meta["size"])
+ if got_size != exp_size:
+ failures.append(f"size mismatch: {rel} ({got_size} != {exp_size})")
+
+ if "mode" in meta:
+ got_mode = stat.S_IMODE(f.stat().st_mode)
+ exp_mode = int(meta["mode"])
+ if got_mode != exp_mode:
+ failures.append(f"mode mismatch: {rel} ({got_mode:o} != {exp_mode:o})")
+
+ if failures:
+ print("FAILED")
+ for x in failures:
+ print(x)
+ raise SystemExit(1)
+
+ print("OK")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/cereal/README.md b/cereal/README.md
new file mode 100644
index 000000000..45e859c09
--- /dev/null
+++ b/cereal/README.md
@@ -0,0 +1,95 @@
+# What is cereal?
+
+cereal is the messaging system for openpilot. It uses [msgq](https://github.com/commaai/msgq) as a pub/sub backend, and [Cap'n proto](https://capnproto.org/capnp-tool.html) for serialization of the structs.
+
+
+## Messaging Spec
+
+You'll find the message types in [log.capnp](log.capnp). It uses [Cap'n proto](https://capnproto.org/capnp-tool.html) and defines one struct called `Event`.
+
+All `Events` have a `logMonoTime` and a `valid`. Then a big union defines the packet type.
+
+### Best Practices
+
+- **All fields must describe quantities in SI units**, unless otherwise specified in the field name.
+- In the context of the message they are in, field names should be completely unambiguous.
+- All values should be easy to plot and be human-readable with minimal parsing.
+
+### Maintaining backwards-compatibility
+
+When making changes to the messaging spec you want to maintain backwards-compatibility, such that old logs can
+be parsed with a new version of cereal. Adding structs and adding members to structs is generally safe, most other
+things are not. Read more details [here](https://capnproto.org/language.html).
+
+### Custom forks
+
+Forks of [openpilot](https://github.com/commaai/openpilot) might want to add things to the messaging
+spec, however this could conflict with future changes made in mainline cereal/openpilot. Rebasing against mainline openpilot
+then means breaking backwards-compatibility with all old logs of your fork. So we added reserved events in
+[custom.capnp](custom.capnp) that we will leave empty in mainline cereal/openpilot. **If you only modify those, you can ensure your
+fork will remain backwards-compatible with all versions of mainline openpilot and your fork.**
+
+An example of compatible changes:
+```diff
+diff --git a/cereal/custom.capnp b/cereal/custom.capnp
+index 3348e859e..3365c7b98 100644
+--- a/cereal/custom.capnp
++++ b/cereal/custom.capnp
+@@ -10,7 +10,11 @@ $Cxx.namespace("cereal");
+ # DO rename the structs
+ # DON'T change the identifier (e.g. @0x81c2f05a394cf4af)
+
+-struct CustomReserved0 @0x81c2f05a394cf4af {
++struct SteeringInfo @0x81c2f05a394cf4af {
++ active @0 :Bool;
++ steeringAngleDeg @1 :Float32;
++ steeringRateDeg @2 :Float32;
++ steeringAccelDeg @3 :Float32;
+ }
+
+ struct CustomReserved1 @0xaedffd8f31e7b55d {
+diff --git a/cereal/log.capnp b/cereal/log.capnp
+index 1209f3fd9..b189f58b6 100644
+--- a/cereal/log.capnp
++++ b/cereal/log.capnp
+@@ -2558,14 +2558,14 @@ struct Event {
+
+ # DO change the name of the field
+ # DON'T change anything after the "@"
+- customReservedRawData0 @124 :Data;
++ rawCanData @124 :Data;
+ customReservedRawData1 @125 :Data;
+ customReservedRawData2 @126 :Data;
+
+ # DO change the name of the field and struct
+ # DON'T change the ID (e.g. @107)
+ # DON'T change which struct it points to
+- customReserved0 @107 :Custom.CustomReserved0;
++ steeringInfo @107 :Custom.SteeringInfo;
+ customReserved1 @108 :Custom.CustomReserved1;
+ customReserved2 @109 :Custom.CustomReserved2;
+ customReserved3 @110 :Custom.CustomReserved3;
+```
+
+---
+
+Example
+---
+```python
+import cereal.messaging as messaging
+
+# in subscriber
+sm = messaging.SubMaster(['sensorEvents'])
+while 1:
+ sm.update()
+ print(sm['sensorEvents'])
+
+```
+
+```python
+# in publisher
+pm = messaging.PubMaster(['sensorEvents'])
+dat = messaging.new_message('sensorEvents', size=1)
+dat.sensorEvents[0] = {"gyro": {"v": [0.1, -0.1, 0.1]}}
+pm.send('sensorEvents', dat)
+```
diff --git a/cereal/__init__.py b/cereal/__init__.py
new file mode 100644
index 000000000..93f4d7722
--- /dev/null
+++ b/cereal/__init__.py
@@ -0,0 +1,11 @@
+import os
+import capnp
+from importlib.resources import as_file, files
+
+capnp.remove_import_hook()
+
+with as_file(files("cereal")) as fspath:
+ CEREAL_PATH = fspath.as_posix()
+ log = capnp.load(os.path.join(CEREAL_PATH, "log.capnp"))
+ car = capnp.load(os.path.join(CEREAL_PATH, "car.capnp"))
+ custom = capnp.load(os.path.join(CEREAL_PATH, "custom.capnp"))
diff --git a/cereal/car.capnp b/cereal/car.capnp
new file mode 120000
index 000000000..658a09dfd
--- /dev/null
+++ b/cereal/car.capnp
@@ -0,0 +1 @@
+../iqdbc_repo/iqdbc/car/car.capnp
\ No newline at end of file
diff --git a/cereal/custom.capnp b/cereal/custom.capnp
new file mode 100644
index 000000000..a79382d38
--- /dev/null
+++ b/cereal/custom.capnp
@@ -0,0 +1,921 @@
+using Cxx = import "./include/c++.capnp";
+$Cxx.namespace("cereal");
+
+@0xb526ba661d550a59;
+
+# Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+
+# custom.capnp: a home for reserved structs used by IQ-specific extensions.
+
+struct AlwaysOnLateral {
+ state @0 :AlwaysOnLateralState;
+ enabled @1 :Bool;
+ active @2 :Bool;
+ available @3 :Bool;
+
+ enum AlwaysOnLateralState {
+ disabled @0;
+ paused @1;
+ enabled @2;
+ softDisabling @3;
+ overriding @4;
+ }
+}
+
+# Same struct as Log.RadarState.LeadData
+struct LeadData {
+ dRel @0 :Float32;
+ yRel @1 :Float32;
+ vRel @2 :Float32;
+ aRel @3 :Float32;
+ vLead @4 :Float32;
+ dPath @6 :Float32;
+ vLat @7 :Float32;
+ vLeadK @8 :Float32;
+ aLeadK @9 :Float32;
+ fcw @10 :Bool;
+ status @11 :Bool;
+ aLeadTau @12 :Float32;
+ modelProb @13 :Float32;
+ radar @14 :Bool;
+ radarTrackId @15 :Int32 = -1;
+
+ aLeadDEPRECATED @5 :Float32;
+}
+
+struct IQState @0xfb0932cf1bde8c5a {
+ aol @0 :AlwaysOnLateral;
+
+ enum AudibleAlert {
+ none @0;
+
+ engage @1;
+ disengage @2;
+ refuse @3;
+
+ warningSoft @4;
+ warningImmediate @5;
+
+ prompt @6;
+ promptRepeat @7;
+ promptDistracted @8;
+
+ # unused, these are reserved for upstream events so we don't collide
+ reserved9 @9;
+ reserved10 @10;
+ reserved11 @11;
+ reserved12 @12;
+ reserved13 @13;
+ reserved14 @14;
+ reserved15 @15;
+ reserved16 @16;
+ reserved17 @17;
+ reserved18 @18;
+ reserved19 @19;
+ reserved20 @20;
+ reserved21 @21;
+ reserved22 @22;
+ reserved23 @23;
+ reserved24 @24;
+ reserved25 @25;
+ reserved26 @26;
+ reserved27 @27;
+ reserved28 @28;
+ reserved29 @29;
+ reserved30 @30;
+
+ promptSingleLow @31;
+ promptSingleHigh @32;
+ }
+}
+
+struct IQModelManager @0xe91d6987759290bb {
+ activeBundle @0 :ModelBundle;
+ selectedBundle @1 :ModelBundle;
+ availableBundles @2 :List(ModelBundle);
+
+ struct DownloadUri {
+ uri @0 :Text;
+ sha256 @1 :Text;
+ }
+
+ enum DownloadStatus {
+ notDownloading @0;
+ downloading @1;
+ downloaded @2;
+ cached @3;
+ failed @4;
+ }
+
+ struct DownloadProgress {
+ status @0 :DownloadStatus;
+ progress @1 :Float32;
+ eta @2 :UInt32;
+ }
+
+ struct Artifact {
+ fileName @0 :Text;
+ downloadUri @1 :DownloadUri;
+ downloadProgress @2 :DownloadProgress;
+ }
+
+ struct Model {
+ type @0 :Type;
+ artifact @1 :Artifact; # Main artifact
+ metadata @2 :Artifact; # Metadata artifact
+
+ enum Type {
+ supercombo @0;
+ navigation @1;
+ vision @2;
+ policy @3;
+ offPolicy @4;
+ onPolicy @5;
+ }
+ }
+
+ enum Runner {
+ snpe @0;
+ tinygrad @1;
+ stock @2;
+ }
+
+ struct Override {
+ key @0 :Text;
+ value @1 :Text;
+ }
+
+ struct ModelBundle {
+ index @0 :UInt32;
+ internalName @1 :Text;
+ displayName @2 :Text;
+ models @3 :List(Model);
+ status @4 :DownloadStatus;
+ generation @5 :UInt32;
+ environment @6 :Text;
+ runner @7 :Runner;
+ is20hz @8 :Bool;
+ ref @9 :Text;
+ minimumSelectorVersion @10 :UInt32;
+ overrides @11 :List(Override);
+ }
+}
+
+struct IQPlan @0xda401323ae805f2b {
+ iqDynamic @0 :IQDynamicControl;
+ longitudinalPlanSource @1 :LongitudinalPlanSource;
+ iqNavState @2 :IQNavPlanState;
+ speedLimit @3 :SpeedLimit;
+ vTarget @4 :Float32;
+ aTarget @5 :Float32;
+ events @6 :List(IQOnroadEvent.Event);
+ e2eAlerts @7 :E2eAlerts;
+
+ struct IQDynamicControl {
+ state @0 :IQDynamicControlState;
+ enabled @1 :Bool;
+ active @2 :Bool;
+
+ enum IQDynamicControlState {
+ acc @0;
+ blended @1;
+ }
+ }
+
+ struct IQNavPlanState {
+ nav @0 :Nav;
+
+ struct Nav {
+ engaged @0 :Bool;
+ provider @1 :IQNavState.LongitudinalProvider;
+ state @2 :IQNavState.LongitudinalState;
+ speedTarget @3 :Float32;
+ accelTarget @4 :Float32;
+ valid @5 :Bool;
+ }
+ }
+
+ struct SpeedLimit {
+ resolver @0 :Resolver;
+ assist @1 :Assist;
+
+ struct Resolver {
+ speedLimit @0 :Float32;
+ distToSpeedLimit @1 :Float32;
+ source @2 :Source;
+ speedLimitOffset @3 :Float32;
+ speedLimitLast @4 :Float32;
+ speedLimitFinal @5 :Float32;
+ speedLimitFinalLast @6 :Float32;
+ speedLimitValid @7 :Bool;
+ speedLimitLastValid @8 :Bool;
+ }
+
+ struct Assist {
+ state @0 :AssistState;
+ enabled @1 :Bool;
+ active @2 :Bool;
+ vTarget @3 :Float32;
+ aTarget @4 :Float32;
+ }
+
+ enum Source {
+ none @0;
+ car @1;
+ map @2;
+ }
+
+ enum AssistState {
+ disabled @0;
+ inactive @1; # No speed limit set or not enabled by parameter.
+ preActive @2;
+ pending @3; # Awaiting new speed limit.
+ adapting @4; # Reducing speed to match new speed limit.
+ active @5; # Cruising at speed limit.
+ }
+ }
+
+ enum LongitudinalPlanSource {
+ cruise @0;
+ nav @1;
+ speedLimitAssist @2;
+ }
+
+ struct E2eAlerts {
+ pathOpen @0 :Bool;
+ leadPullaway @1 :Bool;
+ }
+}
+
+struct IQOnroadEvent @0xf4621d3ee9233bc9 {
+ events @0 :List(Event);
+
+ struct Event {
+ name @0 :EventName;
+
+ # event types
+ enable @1 :Bool;
+ noEntry @2 :Bool;
+ warning @3 :Bool; # alerts presented only when enabled or soft disabling
+ userDisable @4 :Bool;
+ softDisable @5 :Bool;
+ immediateDisable @6 :Bool;
+ preEnable @7 :Bool;
+ permanent @8 :Bool; # alerts presented regardless of openpilot state
+ overrideLateral @10 :Bool;
+ overrideLongitudinal @9 :Bool;
+ }
+
+ # Grouped by IQ.Pilot subsystem. Ordinals are IQ-native and are not stable
+ # across schema revisions; all consumers reference members by name.
+ enum EventName {
+ # lateral / LKAS engagement core
+ alcEngaged @0;
+ alcDisengaged @1;
+ alcEngagedSilent @2;
+ alcDisengagedSilent @3;
+ steerManually @4;
+ speedManually @5;
+ latMismatch @6;
+ steeringOverrideReengageAlc @7;
+
+ # silent pause conditions (gear / door / belt / brake)
+ gearNotDriveSilent @8;
+ reverseSilent @9;
+ doorAjarSilent @10;
+ seatbeltUnbuckledSilent @11;
+ parkBrakeSilent @12;
+ brakeHoldSilent @13;
+
+ # alert-only notices
+ carModeMismatchNotice @14;
+ pedalHeldNotice @15;
+
+ # lane-turn desires
+ modelTurnLeft @16;
+ modelTurnRight @17;
+
+ # navigation maneuvers
+ navTurnLeft @18;
+ navTurnRight @19;
+ navExitLeft @20;
+ navExitRight @21;
+
+ # speed limit / speed camera
+ speedLimitPreActive @22;
+ speedLimitActive @23;
+ speedLimitChanged @24;
+ speedLimitPending @25;
+ speedCameraAhead @26;
+
+ # miscellaneous
+ hyundaiRadarTracksConfirmed @27;
+ experimentalToggled @28;
+ e2eChime @29;
+
+ # construction zone assist
+ constructionZoneDetected @30;
+
+ # model management
+ modelUpdating @31;
+ }
+}
+
+struct IQCarParams @0xd4189b5c8aca9f78 {
+ # Ordinals are IQ-native; all consumers access by name. Live copies self-heal
+ # via CLEAR_ON_MANAGER_START on the "IQCarParams" param; the persistent cache
+ # is versioned separately (see IQCarParamsPersistentV2).
+ iqSafetyFlags @0 :Int16; # iqpilot custom safety flags (read in C++ panda_safety)
+ flags @1 :UInt32; # car-specific iqpilot quirks
+ pcmCruiseSpeed @2 :Bool;
+ enableGasInterceptor @3 :Bool;
+
+ iqLateralNet @4 :LateralNet;
+ longitudinalStoppingSpeedOverride @5 :Float32; # m/s; zero keeps the upstream default
+ stoppingDecelRateOverride @6 :Float32; # m/s^3; zero keeps the upstream default
+ longActiveWithGasOverride @7 :Bool; # keep long control active while the driver is on the gas
+
+ struct LateralNet {
+ fuzzyFingerprint @0 :Bool;
+ model @1 :Model;
+
+ struct Model {
+ name @0 :Text;
+ path @1 :Text;
+ }
+ }
+}
+
+struct IQCarControl @0xdc6c97009c7ba28f {
+ aol @0 :AlwaysOnLateral;
+ params @1 :List(Param);
+ leadOne @2 :LeadData;
+ leadTwo @3 :LeadData;
+ angleOffsetDeg @4 :Float32;
+
+ radarBlendActive @5 :Bool; # feature enabled + PQ + alpha long active
+ radarEngageReq @6 :Bool; # want stock radar cruise engaged (RadarHandler sends SET on bus 2)
+ radarCancelReq @7 :Bool; # cancel stock radar cruise now (1kph stop / brake / teardown)
+ useRadarAccel @8 :Bool; # chill mode + radar active -> pass radar ACS_Sollbeschl as ACC_System payload
+ radarSetSpeedKph @9 :Float32; # OP set speed (km/h) to sync radar ACA_V_Wunsch toward via GRA_Up/Down
+ radarGapBars @10 :UInt8; # OP follow-distance bars to mirror to radar GRA_Zeitluecke
+
+ struct Param {
+ key @0 :Text;
+ type @2 :ParamType;
+ value @3 :Data;
+
+ valueDEPRECATED @1 :Text; # The data type change may cause issues with backwards compatibility.
+ }
+
+ enum ParamType {
+ string @0;
+ bool @1;
+ int @2;
+ float @3;
+ time @4;
+ json @5;
+ bytes @6;
+ }
+}
+
+# IQ.Pilot device backup/restore state. Ordinals are IQ-native and were
+# renumbered/reordered from earlier revisions; persisted BackupInfo blobs are
+# not backward compatible across this change and reset on first run. Every
+# consumer accesses fields by name.
+struct IQBackupManager @0x9f371a75483cf0a3 {
+ saveProgress @0 :Float32;
+ loadProgress @1 :Float32;
+ savePhase @2 :Phase;
+ loadPhase @3 :Phase;
+ activeSnapshot @4 :Snapshot;
+ snapshotLog @5 :List(Snapshot);
+ faultText @6 :Text;
+
+ enum Phase {
+ idle @0;
+ completed @1;
+ inProgress @2;
+ failed @3;
+ }
+
+ # nested struct names diverge from any upstream schema; field names below are the
+ # cloud backup JSON contract (to_dict keys) and MUST stay stable for restore.
+ struct BuildStamp {
+ build @0 :UInt16;
+ major @1 :UInt16;
+ minor @2 :UInt16;
+ patch @3 :UInt16;
+ branch @4 :Text;
+ }
+
+ struct MetaField {
+ value @0 :Text;
+ key @1 :Text;
+ tags @2 :List(Text);
+ }
+
+ struct Snapshot {
+ version @0 :UInt32;
+ isEncrypted @1 :Bool;
+ deviceId @2 :Text;
+ config @3 :Text;
+ createdAt @4 :Text; # ISO timestamp
+ updatedAt @5 :Text; # ISO timestamp
+ iqpilotVersion @6 :BuildStamp;
+ backupMetadata @7 :List(MetaField);
+ }
+}
+
+struct IQCarState @0xb1c39318bb6bc2b3 {
+ speedLimit @0 :Float32;
+ accelPressed @1 :Bool;
+ decelPressed @2 :Bool;
+ alcOverrideAlert @3 :Bool;
+
+ # VW PQ stock ACC radar feedback for the IQ.Dynamics radar_manager (Blend feature)
+ accRadarStaAdr @4 :UInt8; # ACC_System.ACS_Sta_ADR (0 not-active, 1 active, 2 passive, 3 irrev_Fehler)
+ accRadarFehler @5 :Bool; # ACC_System.ACS_Fehler (stored fault -> radar dead for the drive)
+}
+
+struct IQLiveData @0xf2e2b608e51f4b0e {
+ speedLimitValid @0 :Bool;
+ speedLimit @1 :Float32;
+ speedLimitAheadValid @2 :Bool;
+ speedLimitAhead @3 :Float32;
+ speedLimitAheadDistance @4 :Float32;
+ roadName @5 :Text;
+}
+
+struct IQLiveLocation @0xc04dbadb81776876 {
+ ecefPosition @0 :VectorSample;
+ geodeticPosition @1 :VectorSample;
+ ecefVelocity @2 :VectorSample;
+ nedVelocity @3 :VectorSample;
+ bodyVelocity @4 :VectorSample;
+ bodyAcceleration @5 :VectorSample;
+
+ ecefOrientation @6 :VectorSample;
+ alignedOrientationEcef @7 :VectorSample;
+ nedOrientation @8 :VectorSample;
+ bodyAngularRate @9 :VectorSample;
+ alignedOrientationNed @10 :VectorSample;
+ alignedVelocity @11 :VectorSample;
+ alignedAcceleration @12 :VectorSample;
+ alignedAngularRate @13 :VectorSample;
+
+ solutionState @14 :SolutionState;
+ unixTimestampMillis @15 :Int64;
+ inputsHealthy @16 :Bool = true;
+ visionHealthy @17 :Bool = true;
+ gpsHealthy @18 :Bool = true;
+ sensorsHealthy @19 :Bool = true;
+ deviceStable @20 :Bool = true;
+ secondsSinceReset @21 :Float64;
+ excessiveResets @22 :Bool;
+ timeToFirstFix @23 :Float32;
+ debugState @24 :VectorSample;
+ gpsWeek @25 :Int32;
+ gpsTimeOfWeek @26 :Float64;
+
+ enum SolutionState {
+ booting @0;
+ coarse @1;
+ ready @2;
+ }
+
+ struct VectorSample {
+ values @0 :List(Float64);
+ deviations @1 :List(Float64);
+ isValid @2 :Bool;
+ }
+}
+
+enum IQTurnSignalDirection {
+ none @0;
+ turnLeft @1;
+ turnRight @2;
+}
+
+struct IQDriveModelData @0xcdf0f7f14f46cb86 {
+ turnSignalDirection @0 :IQTurnSignalDirection;
+}
+
+enum NavDirection {
+ none @0;
+ left @1;
+ right @2;
+}
+
+struct IQNavState @0xaae9afb364368cd9 {
+ # Navigation state and guidance information
+ active @0 :Bool; # Whether navigation is currently active
+ destinationValid @1 :Bool; # Whether we have a valid destination
+
+ # Current position and route info
+ distanceRemaining @2 :Float32; # Total distance remaining to destination (m)
+ timeRemaining @3 :Float32; # Estimated time remaining to destination (s)
+ currentSegmentIndex @4 :UInt32; # Index of current route segment
+ totalSegments @5 :UInt32; # Total number of segments in route
+
+ # Next maneuver information
+ nextManeuverValid @6 :Bool; # Whether next maneuver data is valid
+ nextManeuverDistance @7 :Float32; # Distance to next maneuver (m)
+ nextManeuverType @8 :ManeuverType; # Type of next maneuver
+ nextManeuverDirection @9 :IQTurnSignalDirection; # Direction for next maneuver
+ nextManeuverDescription @10 :Text; # Human-readable maneuver description
+ nextManeuverAngle @21 :Float32; # Turn angle in degrees (for angle-adaptive enforcement)
+
+ # Turn desire control for lateral planning
+ shouldSendTurnDesire @11 :Bool; # Whether to send turn desires to model
+ turnDesireDirection @12 :IQTurnSignalDirection; # Direction for turn desire
+
+ # Lane change desire control for highway exits/ramps (>45 mph)
+ shouldSendLaneChangeDesire @22 :Bool; # Whether to send lane change desires for high-speed exits
+ laneChangeDesireDirection @23 :IQTurnSignalDirection; # Direction for lane change desire
+
+ # Speed guidance for longitudinal planning
+ targetSpeed @13 :Float32; # Target speed for upcoming maneuver (m/s)
+ targetSpeedValid @14 :Bool; # Whether target speed is valid
+
+ # Destination info
+ destinationLatitude @15 :Float64;
+ destinationLongitude @16 :Float64;
+ destinationName @17 :Text;
+
+ # Lane positioning guidance for exits/turns
+ shouldSendLanePositioning @18 :Bool; # Whether to send lane positioning desires (keepLeft/keepRight)
+ lanePositioningDirection @19 :IQTurnSignalDirection; # Direction for lane positioning
+
+ # Lane tracking debug info (model vs GPS comparison for testing)
+ laneDebugInfo @20 :LaneDebugInfo;
+
+ # Navigation-specific UI event fields (separate from model/desire system)
+ navTurnDesireDirection @24 :NavDirection; # For "Navigation: Turning Left/Right" UI alerts
+ navLaneChangeDesireDirection @25 :NavDirection; # For "Navigation: Initiating Lane Change" UI alerts
+ navLanePositioningDirection @26 :NavDirection; # For future lane positioning UI alerts
+ navSpeedTargetActive @27 :Bool; # For "Navigation: Reducing Speed" UI alert
+
+ # Second next maneuver information (for "Then" section in navigation banner UI)
+ secondNextManeuverValid @28 :Bool; # Whether second next maneuver data is valid
+ secondNextManeuverType @29 :ManeuverType; # Type of second next maneuver
+ secondNextManeuverDirection @30 :NavDirection; # Direction for second next maneuver
+ secondNextManeuverDistance @31 :Float32; # Distance to second next maneuver (m)
+ nextManeuverModifier @32 :Text; # Raw Mapbox modifier for next maneuver (slight_left, sharp_right, etc.)
+ secondNextManeuverModifier @33 :Text; # Raw Mapbox modifier for second next maneuver
+ longitudinalProvider @34 :LongitudinalProvider; # Active source of nav longitudinal influence
+ longitudinalState @35 :LongitudinalState; # Current nav longitudinal state machine output
+ longitudinalEngaged @36 :Bool; # Whether nav longitudinal influence is currently active
+ speedTarget @37 :Float32; # Nav longitudinal speed target (m/s)
+ accelTarget @38 :Float32; # Nav longitudinal accel target (m/s^2)
+ valid @39 :Bool; # Whether nav longitudinal target is valid
+ maneuverPhase @40 :ManeuverPhase; # IQ nav maneuver phase for desire/FSM integration
+ maneuverDirection @41 :NavDirection; # Direction of active IQ nav maneuver phase
+ command @42 :Command; # Short-lived IQ nav command trigger for desire/FSM integration
+ commandDirection @43 :NavDirection; # Direction associated with current IQ nav command
+ commandIndex @44 :UInt32; # Monotonic counter incremented when nav emits a new IQ command
+ cameraValid @45 :Bool; # Whether a speed camera ahead is currently detected
+ cameraType @46 :CameraType; # Type of the upcoming speed camera
+ cameraDistance @47 :Float32; # Distance to the upcoming camera (m)
+ cameraSpeedLimit @48 :Float32; # Enforced speed limit at the camera (m/s)
+
+ enum CameraType {
+ none @0;
+ fixedSpeed @1; # Fixed speed camera
+ mobileSpeed @2; # Mobile/handheld speed camera
+ sectionStart @3; # Average-speed (section) zone start
+ sectionEnd @4; # Average-speed (section) zone end
+ averageZone @5; # Within an average-speed zone
+ redLight @6; # Red-light camera
+ bump @7; # Speed bump
+ alpr @8; # ALPR / Flock surveillance camera (DeFlock/OSM surveillance:type=ALPR)
+ }
+
+ enum ManeuverType {
+ none @0;
+ turn @1; # Regular turn at intersection
+ exit @2; # Highway exit
+ merge @3; # Merge onto highway
+ fork @4; # Road fork
+ continueStraight @5; # Continue straight
+ arrive @6; # Arrive at destination
+ roundabout @7; # Enter/exit roundabout
+ }
+
+ enum LongitudinalProvider {
+ none @0;
+ route @1;
+ mapbox @2;
+ vision @3;
+ offlineOsm @4;
+ camera @5;
+ }
+
+ enum LongitudinalState {
+ disabled @0;
+ enabled @1;
+ entering @2;
+ active @3;
+ leaving @4;
+ overriding @5;
+ }
+
+ enum ManeuverPhase {
+ none @0;
+ turnPrepare @1;
+ turnActive @2;
+ highwayPrepare @3;
+ highwayCommit @4;
+ }
+
+ enum Command {
+ none @0;
+ laneChange @1;
+ }
+
+ struct LaneDebugInfo {
+ modelLane @0 :Text; # "left", "middle", "right", "unknown"
+ modelConfidence @1 :Float32; # 0.0-1.0
+ gpsLane @2 :Text; # "left", "middle", "right", "unknown"
+ gpsConfidence @3 :Float32; # 0.0-1.0
+ lateralOffset @4 :Float32; # Meters from road centerline (negative=left, positive=right)
+ gpsAccuracy @5 :Float32; # GPS position accuracy (meters)
+ agreement @6 :Bool; # Do model and GPS agree?
+ }
+}
+
+struct IQNavRenderState @0xf6e4a54ca6c92276 {
+ active @0 :Bool;
+ currentLatitude @1 :Float64;
+ currentLongitude @2 :Float64;
+ bearingDeg @3 :Float32;
+ routePolyline @4 :List(NavPoint);
+ routePolylineSimplified @5 :List(NavPoint);
+ nextManeuverLatitude @6 :Float64;
+ nextManeuverLongitude @7 :Float64;
+ nextManeuverType @8 :IQNavState.ManeuverType;
+ nextManeuverDirection @9 :NavDirection;
+ nextManeuverDistance @10 :Float32;
+ destinationLatitude @11 :Float64;
+ destinationLongitude @12 :Float64;
+ zoomHint @13 :Float32;
+
+ struct NavPoint {
+ latitude @0 :Float64;
+ longitude @1 :Float64;
+ }
+}
+
+struct IQPerfTrace @0xa8e2e4a8c6f4d3b2 {
+ process @0 :Text;
+ eventClass @1 :Text;
+ severity @2 :Severity;
+ frameId @3 :UInt32;
+ totalTimeUs @4 :UInt32;
+ rkRemainingUs @5 :Int32;
+ batchSize @6 :UInt16;
+ droppedFrames @7 :UInt16;
+ backlog @8 :UInt16;
+ flags @9 :UInt32;
+ samples @10 :List(Sample);
+ missingServices @11 :List(Text);
+ topProcesses @12 :List(Text);
+ detail @13 :Text;
+
+ enum Severity {
+ info @0;
+ warning @1;
+ error @2;
+ critical @3;
+ }
+
+ struct Sample {
+ frameId @0 :UInt32;
+ loopDtUs @1 :UInt32;
+ updateUs @2 :UInt32;
+ stateControlUs @3 :UInt32;
+ publishUs @4 :UInt32;
+ tailWorkUs @5 :UInt32;
+ rkRemainingUs @6 :Int32;
+ staleCarControlUs @7 :UInt32;
+ staleCarControlFrames @8 :UInt16;
+ sendcanGapUs @9 :UInt32;
+ modelEvalUs @10 :UInt32;
+ modelDroppedFrames @11 :UInt16;
+ modelBacklog @12 :UInt16;
+ textureDecodeUs @13 :UInt32;
+ textureUploadUs @14 :UInt32;
+ textureUnloadUs @15 :UInt32;
+ texturePruneUs @16 :UInt32;
+ textureConsumeUs @17 :UInt32;
+ textureBatchSize @18 :UInt16;
+ textureBytes @19 :UInt32;
+ textureCacheBefore @20 :UInt16;
+ textureCacheAfter @21 :UInt16;
+ textureUnloaded @22 :UInt16;
+ memoryUsagePercent @23 :UInt16;
+ gpuUsagePercent @24 :UInt16;
+ cpuUsagePercent @25 :UInt16;
+ flags @26 :UInt32;
+ }
+}
+
+struct IQConstructionZone @0xb54d6e69da4ddc9f {
+ state @0 :State;
+ active @1 :Bool;
+ orangeFraction @2 :Float32; # hot-orange fraction of ROI chroma samples this analysis
+ secondsSinceHit @3 :Float32; # time since last frame that passed the hit threshold
+
+ enum State {
+ inactive @0;
+ pending @1; # hits seen, not yet enough persistence to enter
+ active @2;
+ }
+}
+
+struct IQVehicleTracks @0xb877ef4b20a4ae22 {
+ frameId @0 :UInt32;
+ frameWidth @1 :UInt16;
+ frameHeight @2 :UInt16;
+ processingMs @3 :Float32;
+ tracks @4 :List(Track);
+ wide @5 :Bool;
+
+ struct Track {
+ # box corners normalized [0,1] in the road-camera frame
+ x1 @0 :Float32;
+ y1 @1 :Float32;
+ x2 @2 :Float32;
+ y2 @3 :Float32;
+ prob @4 :Float32;
+ label @5 :Label;
+
+ enum Label {
+ car @0;
+ motorcycle @1;
+ bus @2;
+ truck @3;
+ person @4;
+ bicycle @5;
+ stopSign @6;
+ trafficLight @7;
+ }
+ }
+}
+
+struct IQEnvironment @0xfd960244a79e2804 {
+ frameId @0 :UInt32;
+ offloaded @1 :Bool;
+ modelValid @2 :Bool;
+ objects @3 :List(Object);
+
+ struct Object {
+ x @0 :Float32;
+ y @1 :Float32;
+ z @2 :Float32;
+ width @3 :Float32;
+ height @4 :Float32;
+ length @5 :Float32;
+ prob @6 :Float32;
+ label @7 :Label;
+
+ enum Label {
+ car @0;
+ motorcycle @1;
+ bus @2;
+ truck @3;
+ person @4;
+ bicycle @5;
+ stopSign @6;
+ trafficLight @7;
+ }
+ }
+}
+
+struct CustomReserved14 @0xa6e5a1ce8ca5258e {
+}
+
+struct CustomReserved15 @0xdb8042111e62cc87 {
+}
+
+struct CustomReserved16 @0xf59900ccf47b651a {
+}
+
+# pfeiferj/mapd v2 output schema (struct ids must match the mapd binary exactly).
+struct MapdDownloadLocationDetails @0xff889853e7b0987f {
+ location @0 :Text;
+ totalFiles @1 :UInt32;
+ downloadedFiles @2 :UInt32;
+}
+
+struct MapdDownloadProgress @0xfaa35dcac85073a2 {
+ active @0 :Bool;
+ cancelled @1 :Bool;
+ totalFiles @2 :UInt32;
+ downloadedFiles @3 :UInt32;
+ locations @4 :List(Text);
+ locationDetails @5 :List(MapdDownloadLocationDetails);
+}
+
+struct MapdPathPoint @0xd6f78acca1bc3939 {
+ latitude @0 :Float64;
+ longitude @1 :Float64;
+ curvature @2 :Float32;
+ targetVelocity @3 :Float32;
+}
+
+enum MapdRoadContext {
+ freeway @0;
+ city @1;
+ unknown @2;
+}
+
+enum MapdWaySelectionType {
+ current @0;
+ predicted @1;
+ possible @2;
+ extended @3;
+ fail @4;
+}
+
+enum MapdInputType {
+ download @0;
+ setTargetLateralAccel @1;
+ setSpeedLimitOffset @2;
+ setSpeedLimitControl @3;
+ setMapCurveSpeedControl @4;
+ setVisionCurveSpeedControl @5;
+ setLogLevel @6;
+ setVisionCurveTargetLatA @7;
+ setVisionCurveMinTargetV @8;
+ reloadSettings @9;
+ saveSettings @10;
+ setEnableSpeed @11;
+ setVisionCurveUseEnableSpeed @12;
+ setMapCurveUseEnableSpeed @13;
+ setSpeedLimitUseEnableSpeed @14;
+ setHoldLastSeenSpeedLimit @15;
+ setTargetSpeedJerk @16;
+ setTargetSpeedAccel @17;
+ setTargetSpeedTimeOffset @18;
+ setDefaultLaneWidth @19;
+ setMapCurveTargetLatA @20;
+ loadDefaultSettings @21;
+ loadRecommendedSettings @22;
+ setSlowDownForNextSpeedLimit @23;
+ setSpeedUpForNextSpeedLimit @24;
+ setHoldSpeedLimitWhileChangingSetSpeed @25;
+ loadPersistentSettings @26;
+ cancelDownload @27;
+ setLogJson @28;
+ setLogSource @29;
+ setExternalSpeedLimitControl @30;
+ setExternalSpeedLimit @31;
+ setSpeedLimitPriority @32;
+ setSpeedLimitChangeRequiresAccept @33;
+ acceptSpeedLimit @34;
+ setPressGasToAcceptSpeedLimit @35;
+ setAdjustSetSpeedToAcceptSpeedLimit @36;
+ setAcceptSpeedLimitTimeout @37;
+ setPressGasToOverrideSpeedLimit @38;
+}
+
+struct MapdExtendedOut @0x8d12e6a08c60a1a1 {
+ downloadProgress @0 :MapdDownloadProgress;
+ settings @1 :Text;
+ path @2 :List(MapdPathPoint);
+}
+
+struct MapdIn @0xb9ceb3ea89cecc23 {
+ type @0 :MapdInputType;
+ float @1 :Float32;
+ str @2 :Text;
+ bool @3 :Bool;
+}
+
+struct MapdOut @0xd615f9fe1608a3c0 {
+ wayName @0 :Text;
+ wayRef @1 :Text;
+ roadName @2 :Text;
+ speedLimit @3 :Float32;
+ nextSpeedLimit @4 :Float32;
+ nextSpeedLimitDistance @5 :Float32;
+ hazard @6 :Text;
+ nextHazard @7 :Text;
+ nextHazardDistance @8 :Float32;
+ advisorySpeed @9 :Float32;
+ nextAdvisorySpeed @10 :Float32;
+ nextAdvisorySpeedDistance @11 :Float32;
+ oneWay @12 :Bool;
+ lanes @13 :UInt8;
+ tileLoaded @14 :Bool;
+ speedLimitSuggestedSpeed @15 :Float32;
+ suggestedSpeed @16 :Float32;
+ estimatedRoadWidth @17 :Float32;
+ roadContext @18 :MapdRoadContext;
+ distanceFromWayCenter @19 :Float32;
+ visionCurveSpeed @20 :Float32;
+ mapCurveSpeed @21 :Float32;
+ waySelectionType @22 :MapdWaySelectionType;
+ speedLimitAccepted @23 :Bool;
+}
diff --git a/cereal/include/c++.capnp b/cereal/include/c++.capnp
new file mode 100644
index 000000000..2bda54717
--- /dev/null
+++ b/cereal/include/c++.capnp
@@ -0,0 +1,26 @@
+# Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
+# Licensed under the MIT License:
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+@0xbdf87d7bb8304e81;
+$namespace("capnp::annotations");
+
+annotation namespace(file): Text;
+annotation name(field, enumerant, struct, enum, interface, method, param, group, union): Text;
diff --git a/cereal/legacy.capnp b/cereal/legacy.capnp
new file mode 100644
index 000000000..a8fa5e4a1
--- /dev/null
+++ b/cereal/legacy.capnp
@@ -0,0 +1,574 @@
+using Cxx = import "./include/c++.capnp";
+$Cxx.namespace("cereal");
+
+@0x80ef1ec4889c2a63;
+
+# legacy.capnp: a home for deprecated structs
+
+struct LogRotate @0x9811e1f38f62f2d1 {
+ segmentNum @0 :Int32;
+ path @1 :Text;
+}
+
+struct LiveUI @0xc08240f996aefced {
+ rearViewCam @0 :Bool;
+ alertText1 @1 :Text;
+ alertText2 @2 :Text;
+ awarenessStatus @3 :Float32;
+}
+
+struct UiLayoutState @0x88dcce08ad29dda0 {
+ activeApp @0 :App;
+ sidebarCollapsed @1 :Bool;
+ mapEnabled @2 :Bool;
+ mockEngaged @3 :Bool;
+
+ enum App @0x9917470acf94d285 {
+ home @0;
+ music @1;
+ nav @2;
+ settings @3;
+ none @4;
+ }
+}
+
+struct OrbslamCorrection @0x8afd33dc9b35e1aa {
+ correctionMonoTime @0 :UInt64;
+ prePositionECEF @1 :List(Float64);
+ postPositionECEF @2 :List(Float64);
+ prePoseQuatECEF @3 :List(Float32);
+ postPoseQuatECEF @4 :List(Float32);
+ numInliers @5 :UInt32;
+}
+
+struct EthernetPacket @0xa99a9d5b33cf5859 {
+ pkt @0 :Data;
+ ts @1 :Float32;
+}
+
+struct CellInfo @0xcff7566681c277ce {
+ timestamp @0 :UInt64;
+ repr @1 :Text; # android toString() for now
+}
+
+struct WifiScan @0xd4df5a192382ba0b {
+ bssid @0 :Text;
+ ssid @1 :Text;
+ capabilities @2 :Text;
+ frequency @3 :Int32;
+ level @4 :Int32;
+ timestamp @5 :Int64;
+
+ centerFreq0 @6 :Int32;
+ centerFreq1 @7 :Int32;
+ channelWidth @8 :ChannelWidth;
+ operatorFriendlyName @9 :Text;
+ venueName @10 :Text;
+ is80211mcResponder @11 :Bool;
+ passpoint @12 :Bool;
+
+ distanceCm @13 :Int32;
+ distanceSdCm @14 :Int32;
+
+ enum ChannelWidth @0xcb6a279f015f6b51 {
+ w20Mhz @0;
+ w40Mhz @1;
+ w80Mhz @2;
+ w160Mhz @3;
+ w80Plus80Mhz @4;
+ }
+}
+
+struct LiveEventData @0x94b7baa90c5c321e {
+ name @0 :Text;
+ value @1 :Int32;
+}
+
+struct ModelData @0xb8aad62cffef28a9 {
+ frameId @0 :UInt32;
+ frameAge @12 :UInt32;
+ frameDropPerc @13 :Float32;
+ timestampEof @9 :UInt64;
+ modelExecutionTime @14 :Float32;
+ gpuExecutionTime @16 :Float32;
+ rawPred @15 :Data;
+
+ path @1 :PathData;
+ leftLane @2 :PathData;
+ rightLane @3 :PathData;
+ lead @4 :LeadData;
+ freePath @6 :List(Float32);
+
+ settings @5 :ModelSettings;
+ leadFuture @7 :LeadData;
+ speed @8 :List(Float32);
+ meta @10 :MetaData;
+ longitudinal @11 :LongitudinalData;
+
+ struct PathData @0x8817eeea389e9f08 {
+ points @0 :List(Float32);
+ prob @1 :Float32;
+ std @2 :Float32;
+ stds @3 :List(Float32);
+ poly @4 :List(Float32);
+ validLen @5 :Float32;
+ }
+
+ struct LeadData @0xd1c9bef96d26fa91 {
+ dist @0 :Float32;
+ prob @1 :Float32;
+ std @2 :Float32;
+ relVel @3 :Float32;
+ relVelStd @4 :Float32;
+ relY @5 :Float32;
+ relYStd @6 :Float32;
+ relA @7 :Float32;
+ relAStd @8 :Float32;
+ }
+
+ struct ModelSettings @0xa26e3710efd3e914 {
+ bigBoxX @0 :UInt16;
+ bigBoxY @1 :UInt16;
+ bigBoxWidth @2 :UInt16;
+ bigBoxHeight @3 :UInt16;
+ boxProjection @4 :List(Float32);
+ yuvCorrection @5 :List(Float32);
+ inputTransform @6 :List(Float32);
+ }
+
+ struct MetaData @0x9744f25fb60f2bf8 {
+ engagedProb @0 :Float32;
+ desirePrediction @1 :List(Float32);
+ brakeDisengageProb @2 :Float32;
+ gasDisengageProb @3 :Float32;
+ steerOverrideProb @4 :Float32;
+ desireState @5 :List(Float32);
+ }
+
+ struct LongitudinalData @0xf98f999c6a071122 {
+ distances @2 :List(Float32);
+ speeds @0 :List(Float32);
+ accelerations @1 :List(Float32);
+ }
+}
+
+struct ECEFPoint @0xc25bbbd524983447 {
+ x @0 :Float64;
+ y @1 :Float64;
+ z @2 :Float64;
+}
+
+struct ECEFPointDEPRECATED @0xe10e21168db0c7f7 {
+ x @0 :Float32;
+ y @1 :Float32;
+ z @2 :Float32;
+}
+
+struct GPSPlannerPoints @0xab54c59699f8f9f3 {
+ curPosDEPRECATED @0 :ECEFPointDEPRECATED;
+ pointsDEPRECATED @1 :List(ECEFPointDEPRECATED);
+ curPos @6 :ECEFPoint;
+ points @7 :List(ECEFPoint);
+ valid @2 :Bool;
+ trackName @3 :Text;
+ speedLimit @4 :Float32;
+ accelTarget @5 :Float32;
+}
+
+struct GPSPlannerPlan @0xf5ad1d90cdc1dd6b {
+ valid @0 :Bool;
+ poly @1 :List(Float32);
+ trackName @2 :Text;
+ speed @3 :Float32;
+ acceleration @4 :Float32;
+ pointsDEPRECATED @5 :List(ECEFPointDEPRECATED);
+ points @6 :List(ECEFPoint);
+ xLookahead @7 :Float32;
+}
+
+struct UiNavigationEvent @0x90c8426c3eaddd3b {
+ type @0: Type;
+ status @1: Status;
+ distanceTo @2: Float32;
+ endRoadPointDEPRECATED @3: ECEFPointDEPRECATED;
+ endRoadPoint @4: ECEFPoint;
+
+ enum Type @0xe8db07dcf8fcea05 {
+ none @0;
+ laneChangeLeft @1;
+ laneChangeRight @2;
+ mergeLeft @3;
+ mergeRight @4;
+ turnLeft @5;
+ turnRight @6;
+ }
+
+ enum Status @0xb9aa88c75ef99a1f {
+ none @0;
+ passive @1;
+ approaching @2;
+ active @3;
+ }
+}
+
+struct LiveLocationData @0xb99b2bc7a57e8128 {
+ status @0 :UInt8;
+
+ # 3D fix
+ lat @1 :Float64;
+ lon @2 :Float64;
+ alt @3 :Float32; # m
+
+ # speed
+ speed @4 :Float32; # m/s
+
+ # NED velocity components
+ vNED @5 :List(Float32);
+
+ # roll, pitch, heading (x,y,z)
+ roll @6 :Float32; # WRT to center of earth?
+ pitch @7 :Float32; # WRT to center of earth?
+ heading @8 :Float32; # WRT to north?
+
+ # what are these?
+ wanderAngle @9 :Float32;
+ trackAngle @10 :Float32;
+
+ # car frame -- https://upload.wikimedia.org/wikipedia/commons/f/f5/RPY_angles_of_cars.png
+
+ # gyro, in car frame, deg/s
+ gyro @11 :List(Float32);
+
+ # accel, in car frame, m/s^2
+ accel @12 :List(Float32);
+
+ accuracy @13 :Accuracy;
+
+ source @14 :SensorSource;
+ # if we are fixing a location in the past
+ fixMonoTime @15 :UInt64;
+
+ gpsWeek @16 :Int32;
+ timeOfWeek @17 :Float64;
+
+ positionECEF @18 :List(Float64);
+ poseQuatECEF @19 :List(Float32);
+ pitchCalibration @20 :Float32;
+ yawCalibration @21 :Float32;
+ imuFrame @22 :List(Float32);
+
+ struct Accuracy @0x943dc4625473b03f {
+ pNEDError @0 :List(Float32);
+ vNEDError @1 :List(Float32);
+ rollError @2 :Float32;
+ pitchError @3 :Float32;
+ headingError @4 :Float32;
+ ellipsoidSemiMajorError @5 :Float32;
+ ellipsoidSemiMinorError @6 :Float32;
+ ellipsoidOrientationError @7 :Float32;
+ }
+
+ enum SensorSource @0xc871d3cc252af657 {
+ applanix @0;
+ kalman @1;
+ orbslam @2;
+ timing @3;
+ dummy @4;
+ }
+}
+
+struct OrbOdometry @0xd7700859ed1f5b76 {
+ # timing first
+ startMonoTime @0 :UInt64;
+ endMonoTime @1 :UInt64;
+
+ # fundamental matrix and error
+ f @2: List(Float64);
+ err @3: Float64;
+
+ # number of inlier points
+ inliers @4: Int32;
+
+ # for debug only
+ # indexed by endMonoTime features
+ # value is startMonoTime feature match
+ # -1 if no match
+ matches @5: List(Int16);
+}
+
+struct OrbFeatures @0xcd60164a8a0159ef {
+ timestampEof @0 :UInt64;
+ # transposed arrays of normalized image coordinates
+ # len(xs) == len(ys) == len(descriptors) * 32
+ xs @1 :List(Float32);
+ ys @2 :List(Float32);
+ descriptors @3 :Data;
+ octaves @4 :List(Int8);
+
+ # match index to last OrbFeatures
+ # -1 if no match
+ timestampLastEof @5 :UInt64;
+ matches @6: List(Int16);
+}
+
+struct OrbFeaturesSummary @0xd500d30c5803fa4f {
+ timestampEof @0 :UInt64;
+ timestampLastEof @1 :UInt64;
+
+ featureCount @2 :UInt16;
+ matchCount @3 :UInt16;
+ computeNs @4 :UInt64;
+}
+
+struct OrbKeyFrame @0xc8233c0345e27e24 {
+ # this is a globally unique id for the KeyFrame
+ id @0: UInt64;
+
+ # this is the location of the KeyFrame
+ pos @1: ECEFPoint;
+
+ # these are the features in the world
+ # len(dpos) == len(descriptors) * 32
+ dpos @2 :List(ECEFPoint);
+ descriptors @3 :Data;
+}
+
+struct KalmanOdometry @0x92e21bb7ea38793a {
+ trans @0 :List(Float32); # m/s in device frame
+ rot @1 :List(Float32); # rad/s in device frame
+ transStd @2 :List(Float32); # std m/s in device frame
+ rotStd @3 :List(Float32); # std rad/s in device frame
+}
+
+struct OrbObservation @0x9b326d4e436afec7 {
+ observationMonoTime @0 :UInt64;
+ normalizedCoordinates @1 :List(Float32);
+ locationECEF @2 :List(Float64);
+ matchDistance @3: UInt32;
+}
+
+struct CalibrationFeatures @0x8fdfadb254ea867a {
+ frameId @0 :UInt32;
+
+ p0 @1 :List(Float32);
+ p1 @2 :List(Float32);
+ status @3 :List(Int8);
+}
+
+struct NavStatus @0xbd8822120928120c {
+ isNavigating @0 :Bool;
+ currentAddress @1 :Address;
+
+ struct Address @0xce7cd672cacc7814 {
+ title @0 :Text;
+ lat @1 :Float64;
+ lng @2 :Float64;
+ house @3 :Text;
+ address @4 :Text;
+ street @5 :Text;
+ city @6 :Text;
+ state @7 :Text;
+ country @8 :Text;
+ }
+}
+
+struct NavUpdate @0xdb98be6565516acb {
+ isNavigating @0 :Bool;
+ curSegment @1 :Int32;
+ segments @2 :List(Segment);
+
+ struct LatLng @0x9eaef9187cadbb9b {
+ lat @0 :Float64;
+ lng @1 :Float64;
+ }
+
+ struct Segment @0xa5b39b4fc4d7da3f {
+ from @0 :LatLng;
+ to @1 :LatLng;
+ updateTime @2 :Int32;
+ distance @3 :Int32;
+ crossTime @4 :Int32;
+ exitNo @5 :Int32;
+ instruction @6 :Instruction;
+
+ parts @7 :List(LatLng);
+
+ enum Instruction @0xc5417a637451246f {
+ turnLeft @0;
+ turnRight @1;
+ keepLeft @2;
+ keepRight @3;
+ straight @4;
+ roundaboutExitNumber @5;
+ roundaboutExit @6;
+ roundaboutTurnLeft @7;
+ unkn8 @8;
+ roundaboutStraight @9;
+ unkn10 @10;
+ roundaboutTurnRight @11;
+ unkn12 @12;
+ roundaboutUturn @13;
+ unkn14 @14;
+ arrive @15;
+ exitLeft @16;
+ exitRight @17;
+ unkn18 @18;
+ uturn @19;
+ # ...
+ }
+ }
+}
+
+struct TrafficEvent @0xacfa74a094e62626 {
+ type @0 :Type;
+ distance @1 :Float32;
+ action @2 :Action;
+ resuming @3 :Bool;
+
+ enum Type @0xd85d75253435bf4b {
+ stopSign @0;
+ lightRed @1;
+ lightYellow @2;
+ lightGreen @3;
+ stopLight @4;
+ }
+
+ enum Action @0xa6f6ce72165ccb49 {
+ none @0;
+ yield @1;
+ stop @2;
+ resumeReady @3;
+ }
+
+}
+
+
+struct AndroidGnss @0xdfdf30d03fc485bd {
+ union {
+ measurements @0 :Measurements;
+ navigationMessage @1 :NavigationMessage;
+ }
+
+ struct Measurements @0xa20710d4f428d6cd {
+ clock @0 :Clock;
+ measurements @1 :List(Measurement);
+
+ struct Clock @0xa0e27b453a38f450 {
+ timeNanos @0 :Int64;
+ hardwareClockDiscontinuityCount @1 :Int32;
+
+ hasTimeUncertaintyNanos @2 :Bool;
+ timeUncertaintyNanos @3 :Float64;
+
+ hasLeapSecond @4 :Bool;
+ leapSecond @5 :Int32;
+
+ hasFullBiasNanos @6 :Bool;
+ fullBiasNanos @7 :Int64;
+
+ hasBiasNanos @8 :Bool;
+ biasNanos @9 :Float64;
+
+ hasBiasUncertaintyNanos @10 :Bool;
+ biasUncertaintyNanos @11 :Float64;
+
+ hasDriftNanosPerSecond @12 :Bool;
+ driftNanosPerSecond @13 :Float64;
+
+ hasDriftUncertaintyNanosPerSecond @14 :Bool;
+ driftUncertaintyNanosPerSecond @15 :Float64;
+ }
+
+ struct Measurement @0xd949bf717d77614d {
+ svId @0 :Int32;
+ constellation @1 :Constellation;
+
+ timeOffsetNanos @2 :Float64;
+ state @3 :Int32;
+ receivedSvTimeNanos @4 :Int64;
+ receivedSvTimeUncertaintyNanos @5 :Int64;
+ cn0DbHz @6 :Float64;
+ pseudorangeRateMetersPerSecond @7 :Float64;
+ pseudorangeRateUncertaintyMetersPerSecond @8 :Float64;
+ accumulatedDeltaRangeState @9 :Int32;
+ accumulatedDeltaRangeMeters @10 :Float64;
+ accumulatedDeltaRangeUncertaintyMeters @11 :Float64;
+
+ hasCarrierFrequencyHz @12 :Bool;
+ carrierFrequencyHz @13 :Float32;
+ hasCarrierCycles @14 :Bool;
+ carrierCycles @15 :Int64;
+ hasCarrierPhase @16 :Bool;
+ carrierPhase @17 :Float64;
+ hasCarrierPhaseUncertainty @18 :Bool;
+ carrierPhaseUncertainty @19 :Float64;
+ hasSnrInDb @20 :Bool;
+ snrInDb @21 :Float64;
+
+ multipathIndicator @22 :MultipathIndicator;
+
+ enum Constellation @0x9ef1f3ff0deb5ffb {
+ unknown @0;
+ gps @1;
+ sbas @2;
+ glonass @3;
+ qzss @4;
+ beidou @5;
+ galileo @6;
+ }
+
+ enum State @0xcbb9490adce12d72 {
+ unknown @0;
+ codeLock @1;
+ bitSync @2;
+ subframeSync @3;
+ towDecoded @4;
+ msecAmbiguous @5;
+ symbolSync @6;
+ gloStringSync @7;
+ gloTodDecoded @8;
+ bdsD2BitSync @9;
+ bdsD2SubframeSync @10;
+ galE1bcCodeLock @11;
+ galE1c2ndCodeLock @12;
+ galE1bPageSync @13;
+ sbasSync @14;
+ }
+
+ enum MultipathIndicator @0xc04e7b6231d4caa8 {
+ unknown @0;
+ detected @1;
+ notDetected @2;
+ }
+ }
+ }
+
+ struct NavigationMessage @0xe2517b083095fd4e {
+ type @0 :Int32;
+ svId @1 :Int32;
+ messageId @2 :Int32;
+ submessageId @3 :Int32;
+ data @4 :Data;
+ status @5 :Status;
+
+ enum Status @0xec1ff7996b35366f {
+ unknown @0;
+ parityPassed @1;
+ parityRebuilt @2;
+ }
+ }
+}
+
+struct LidarPts @0xe3d6685d4e9d8f7a {
+ r @0 :List(UInt16); # uint16 m*500.0
+ theta @1 :List(UInt16); # uint16 deg*100.0
+ reflect @2 :List(UInt8); # uint8 0-255
+
+ # For storing out of file.
+ idx @3 :UInt64;
+
+ # For storing in file
+ pkt @4 :Data;
+}
+
+
diff --git a/cereal/log.capnp b/cereal/log.capnp
new file mode 100644
index 000000000..056b9caf3
--- /dev/null
+++ b/cereal/log.capnp
@@ -0,0 +1,2738 @@
+using Cxx = import "./include/c++.capnp";
+$Cxx.namespace("cereal");
+
+using Car = import "car.capnp";
+using Legacy = import "legacy.capnp";
+using Custom = import "custom.capnp";
+
+@0xf3b1f17e25a4285b;
+
+# Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+
+const logVersion :Int32 = 1;
+
+struct Map(Key, Value) {
+ entries @0 :List(Entry);
+ struct Entry {
+ key @0 :Key;
+ value @1 :Value;
+ }
+}
+
+struct OnroadEvent @0xc4fa6047f024e718 {
+ name @0 :EventName;
+
+ # event types
+ enable @1 :Bool;
+ noEntry @2 :Bool;
+ warning @3 :Bool; # alerts presented only when enabled or soft disabling
+ userDisable @4 :Bool;
+ softDisable @5 :Bool;
+ immediateDisable @6 :Bool;
+ preEnable @7 :Bool;
+ permanent @8 :Bool; # alerts presented regardless of openpilot state
+ overrideLateral @10 :Bool;
+ overrideLongitudinal @9 :Bool;
+
+ enum EventName @0x91f1992a1f77fb03 {
+ canError @0;
+ steerUnavailable @1;
+ wrongGear @2;
+ doorOpen @3;
+ seatbeltNotLatched @4;
+ espDisabled @5;
+ wrongCarMode @6;
+ steerTempUnavailable @7;
+ reverseGear @8;
+ buttonCancel @9;
+ buttonEnable @10;
+ pedalPressed @11; # exits active state
+ preEnableStandstill @12; # added during pre-enable state with brake
+ gasPressedOverride @13; # added when user is pressing gas with no disengage on gas
+ steerOverride @14;
+ steerDisengage @94; # exits active state
+ cruiseDisabled @15;
+ speedTooLow @16;
+ outOfSpace @17;
+ overheat @18;
+ calibrationIncomplete @19;
+ calibrationInvalid @20;
+ calibrationRecalibrating @21;
+ controlsMismatch @22;
+ pcmEnable @23;
+ pcmDisable @24;
+ radarFault @25;
+ radarTempUnavailable @93;
+ brakeHold @26;
+ parkBrake @27;
+ manualRestart @28;
+ joystickDebug @29;
+ longitudinalManeuver @30;
+ steerTempUnavailableSilent @31;
+ resumeRequired @32;
+ preDriverDistracted @33;
+ promptDriverDistracted @34;
+ driverDistracted @35;
+ preDriverUnresponsive @36;
+ promptDriverUnresponsive @37;
+ driverUnresponsive @38;
+ belowSteerSpeed @39;
+ lowBattery @40;
+ accFaulted @41;
+ sensorDataInvalid @42;
+ commIssue @43;
+ commIssueAvgFreq @44;
+ tooDistracted @45;
+ posenetInvalid @46;
+ preLaneChangeLeft @48;
+ preLaneChangeRight @49;
+ laneChange @50;
+ lowMemory @51;
+ stockAeb @52;
+ stockLkas @98;
+ lateralManeuver @99;
+ cruiseFaultLateralAllowed @100;
+ ldw @53;
+ carUnrecognized @54;
+ invalidLkasSetting @55;
+ speedTooHigh @56;
+ laneChangeBlocked @57;
+ relayMalfunction @58;
+ stockFcw @59;
+ startup @60;
+ startupNoCar @61;
+ startupNoControl @62;
+ startupNoSecOcKey @63;
+ startupMaster @64;
+ fcw @65;
+ steerSaturated @66;
+ belowEngageSpeed @67;
+ noGps @68;
+ wrongCruiseMode @69;
+ modeldLagging @70;
+ deviceFalling @71;
+ fanMalfunction @72;
+ cameraMalfunction @73;
+ cameraFrameRate @74;
+ processNotRunning @75;
+ dashcamMode @76;
+ selfdriveInitializing @77;
+ usbError @78;
+ cruiseMismatch @79;
+ canBusMissing @80;
+ selfdrivedLagging @81;
+ resumeBlocked @82;
+ steerTimeLimit @83;
+ vehicleSensorsInvalid @84;
+ locationdTemporaryError @85;
+ locationdPermanentError @86;
+ paramsdTemporaryError @87;
+ paramsdPermanentError @88;
+ actuatorsApiUnavailable @89;
+ espActive @90;
+ personalityChanged @91;
+ aeb @92;
+ userBookmark @95;
+ excessiveActuation @96;
+ audioFeedback @97;
+
+ soundsUnavailableDEPRECATED @47;
+ }
+}
+
+enum LongitudinalPersonality {
+ aggressive @0;
+ standard @1;
+ relaxed @2;
+}
+
+struct InitData {
+ kernelArgs @0 :List(Text);
+ kernelVersion @15 :Text;
+ osVersion @18 :Text;
+
+ dongleId @2 :Text;
+ bootlogId @22 :Text;
+
+ deviceType @3 :DeviceType;
+ version @4 :Text;
+ gitCommit @10 :Text;
+ gitCommitDate @21 :Text;
+ gitBranch @11 :Text;
+ gitRemote @13 :Text;
+
+ # this is source commit for prebuilt branches
+ gitSrcCommit @23 :Text;
+ gitSrcCommitDate @24 :Text;
+
+ androidProperties @16 :Map(Text, Text);
+
+ pandaInfo @8 :PandaInfo;
+
+ dirty @9 :Bool;
+ passive @12 :Bool;
+ params @17 :Map(Text, Data);
+
+ commands @19 :Map(Text, Data);
+
+ wallTimeNanos @20 :UInt64;
+
+ ufsHealth @25 :UfsHealth;
+
+ struct UfsHealth {
+ preEolInfo @0 :UInt8;
+ lifeTimeEstimateA @1 :UInt8;
+ lifeTimeEstimateB @2 :UInt8;
+ vendorHealthReport @3 :Data;
+ }
+
+ enum DeviceType {
+ unknown @0;
+ neo @1;
+ chffrAndroid @2;
+ chffrIos @3;
+ tici @4;
+ pc @5;
+ tizi @6;
+ mici @7;
+ }
+
+ struct PandaInfo {
+ hasPanda @0 :Bool;
+ dongleId @1 :Text;
+ stVersion @2 :Text;
+ espVersion @3 :Text;
+ }
+
+ # ***** deprecated stuff *****
+ gctxDEPRECATED @1 :Text;
+ androidBuildInfo @5 :AndroidBuildInfo;
+ androidSensorsDEPRECATED @6 :List(AndroidSensor);
+ chffrAndroidExtraDEPRECATED @7 :ChffrAndroidExtra;
+ iosBuildInfoDEPRECATED @14 :IosBuildInfo;
+
+ struct AndroidBuildInfo {
+ board @0 :Text;
+ bootloader @1 :Text;
+ brand @2 :Text;
+ device @3 :Text;
+ display @4 :Text;
+ fingerprint @5 :Text;
+ hardware @6 :Text;
+ host @7 :Text;
+ id @8 :Text;
+ manufacturer @9 :Text;
+ model @10 :Text;
+ product @11 :Text;
+ radioVersion @12 :Text;
+ serial @13 :Text;
+ supportedAbis @14 :List(Text);
+ tags @15 :Text;
+ time @16 :Int64;
+ type @17 :Text;
+ user @18 :Text;
+
+ versionCodename @19 :Text;
+ versionRelease @20 :Text;
+ versionSdk @21 :Int32;
+ versionSecurityPatch @22 :Text;
+ }
+
+ struct AndroidSensor {
+ id @0 :Int32;
+ name @1 :Text;
+ vendor @2 :Text;
+ version @3 :Int32;
+ handle @4 :Int32;
+ type @5 :Int32;
+ maxRange @6 :Float32;
+ resolution @7 :Float32;
+ power @8 :Float32;
+ minDelay @9 :Int32;
+ fifoReservedEventCount @10 :UInt32;
+ fifoMaxEventCount @11 :UInt32;
+ stringType @12 :Text;
+ maxDelay @13 :Int32;
+ }
+
+ struct ChffrAndroidExtra {
+ allCameraCharacteristics @0 :Map(Text, Text);
+ }
+
+ struct IosBuildInfo {
+ appVersion @0 :Text;
+ appBuild @1 :UInt32;
+ osVersion @2 :Text;
+ deviceModel @3 :Text;
+ }
+}
+
+struct FrameData {
+ frameId @0 :UInt32;
+ frameIdSensor @25 :UInt32;
+ requestId @28 :UInt32;
+ encodeId @1 :UInt32;
+
+ # Timestamps
+ timestampEof @2 :UInt64;
+ timestampSof @8 :UInt64;
+ processingTime @23 :Float32;
+
+ # Exposure
+ integLines @4 :Int32;
+ highConversionGain @20 :Bool;
+ gain @15 :Float32; # This includes highConversionGain if enabled
+ measuredGreyFraction @21 :Float32;
+ targetGreyFraction @22 :Float32;
+ exposureValPercent @27 :Float32;
+
+ transform @10 :List(Float32);
+
+ image @6 :Data;
+
+ temperaturesC @24 :List(Float32);
+
+ enum FrameTypeDEPRECATED {
+ unknown @0;
+ neo @1;
+ chffrAndroid @2;
+ front @3;
+ }
+
+ sensor @26 :ImageSensor;
+ enum ImageSensor {
+ unknown @0;
+ ar0231 @1;
+ ox03c10 @2;
+ os04c10 @3;
+ }
+
+ frameLengthDEPRECATED @3 :Int32;
+ globalGainDEPRECATED @5 :Int32;
+ frameTypeDEPRECATED @7 :FrameTypeDEPRECATED;
+ androidCaptureResultDEPRECATED @9 :AndroidCaptureResult;
+ lensPosDEPRECATED @11 :Int32;
+ lensSagDEPRECATED @12 :Float32;
+ lensErrDEPRECATED @13 :Float32;
+ lensTruePosDEPRECATED @14 :Float32;
+ focusValDEPRECATED @16 :List(Int16);
+ focusConfDEPRECATED @17 :List(UInt8);
+ sharpnessScoreDEPRECATED @18 :List(UInt16);
+ recoverStateDEPRECATED @19 :Int32;
+ struct AndroidCaptureResult {
+ sensitivity @0 :Int32;
+ frameDuration @1 :Int64;
+ exposureTime @2 :Int64;
+ rollingShutterSkew @3 :UInt64;
+ colorCorrectionTransform @4 :List(Int32);
+ colorCorrectionGains @5 :List(Float32);
+ displayRotation @6 :Int8;
+ }
+}
+
+struct Thumbnail {
+ frameId @0 :UInt32;
+ timestampEof @1 :UInt64;
+ thumbnail @2 :Data;
+ encoding @3 :Encoding;
+
+ enum Encoding {
+ unknown @0;
+ jpeg @1;
+ keyframe @2;
+ }
+}
+
+struct GPSNMEAData {
+ timestamp @0 :Int64;
+ localWallTime @1 :UInt64;
+ nmea @2 :Text;
+}
+
+# android sensor_event_t
+struct SensorEventData {
+ version @0 :Int32;
+ sensor @1 :Int32;
+ type @2 :Int32;
+ timestamp @3 :Int64;
+ uncalibratedDEPRECATED @10 :Bool;
+
+ union {
+ acceleration @4 :SensorVec;
+ magnetic @5 :SensorVec;
+ orientation @6 :SensorVec;
+ gyro @7 :SensorVec;
+ pressure @9 :SensorVec;
+ magneticUncalibrated @11 :SensorVec;
+ gyroUncalibrated @12 :SensorVec;
+ proximity @13: Float32;
+ light @14: Float32;
+ temperature @15: Float32;
+ }
+ source @8 :SensorSource;
+
+ struct SensorVec {
+ v @0 :List(Float32);
+ status @1 :Int8;
+ }
+
+ enum SensorSource {
+ android @0;
+ iOS @1;
+ fiber @2;
+ velodyne @3; # Velodyne IMU
+ bno055 @4; # Bosch accelerometer
+ lsm6ds3 @5; # includes LSM6DS3 and LSM6DS3TR, TR = tape reel
+ bmp280 @6; # barometer
+ mmc3416x @7; # magnetometer
+ bmx055 @8;
+ rpr0521 @9;
+ lsm6ds3trc @10;
+ mmc5603nj @11;
+ }
+}
+
+# android struct GpsLocation
+struct GpsLocationData {
+ # Contains module-specific flags.
+ flags @0 :UInt16;
+
+ # Represents latitude in degrees.
+ latitude @1 :Float64;
+
+ # Represents longitude in degrees.
+ longitude @2 :Float64;
+
+ # Represents altitude in meters above the WGS 84 reference ellipsoid.
+ altitude @3 :Float64;
+
+ # Represents speed in meters per second.
+ speed @4 :Float32;
+
+ # Represents heading in degrees.
+ bearingDeg @5 :Float32;
+
+ # Represents expected horizontal accuracy in meters.
+ horizontalAccuracy @6 :Float32;
+
+ unixTimestampMillis @7 :Int64;
+
+ source @8 :SensorSource;
+
+ # Represents NED velocity in m/s.
+ vNED @9 :List(Float32);
+
+ # Represents expected vertical accuracy in meters. (presumably 1 sigma?)
+ verticalAccuracy @10 :Float32;
+
+ # Represents bearing accuracy in degrees. (presumably 1 sigma?)
+ bearingAccuracyDeg @11 :Float32;
+
+ # Represents velocity accuracy in m/s. (presumably 1 sigma?)
+ speedAccuracy @12 :Float32;
+
+ hasFix @13 :Bool;
+ satelliteCount @14 :Int8;
+
+ enum SensorSource {
+ android @0;
+ iOS @1;
+ car @2;
+ velodyne @3; # Velodyne IMU
+ fusion @4;
+ external @5;
+ ublox @6;
+ trimble @7;
+ qcomdiag @8;
+ unicore @9;
+ }
+}
+
+enum Desire {
+ none @0;
+ turnLeft @1;
+ turnRight @2;
+ laneChangeLeft @3;
+ laneChangeRight @4;
+ keepLeft @5;
+ keepRight @6;
+}
+
+enum LaneChangeState {
+ off @0;
+ preLaneChange @1;
+ laneChangeStarting @2;
+ laneChangeFinishing @3;
+}
+
+enum LaneChangeDirection {
+ none @0;
+ left @1;
+ right @2;
+}
+
+struct CanData {
+ address @0 :UInt32;
+ dat @2 :Data;
+ src @3 :UInt8;
+ busTimeDEPRECATED @1 :UInt16;
+}
+
+struct DeviceState @0xa4d8b5af2aa492eb {
+ deviceType @45 :InitData.DeviceType;
+
+ networkType @22 :NetworkType;
+ networkInfo @31 :NetworkInfo;
+ networkStrength @24 :NetworkStrength;
+ networkStats @43 :NetworkStats;
+ networkMetered @41 :Bool;
+ lastAthenaPingTime @32 :UInt64;
+
+ started @11 :Bool;
+ startedMonoTime @13 :UInt64;
+
+ # system utilization
+ freeSpacePercent @7 :Float32;
+ memoryUsagePercent @19 :Int8;
+ gpuUsagePercent @33 :Int8;
+ cpuUsagePercent @34 :List(Int8); # per-core cpu usage
+
+ # power
+ offroadPowerUsageUwh @23 :UInt32;
+ carBatteryCapacityUwh @25 :UInt32;
+ powerDrawW @40 :Float32;
+ somPowerDrawW @42 :Float32;
+
+ # device thermals
+ cpuTempC @26 :List(Float32);
+ gpuTempC @27 :List(Float32);
+ dspTempC @49 :Float32;
+ memoryTempC @28 :Float32;
+ modemTempC @36 :List(Float32);
+ pmicTempC @39 :List(Float32);
+ intakeTempC @46 :Float32;
+ exhaustTempC @47 :Float32;
+ caseTempC @48 :Float32;
+ maxTempC @44 :Float32; # max of other temps, used to control fan
+ thermalZones @38 :List(ThermalZone);
+ thermalStatus @14 :ThermalStatus;
+
+ fanSpeedPercentDesired @10 :UInt16;
+ screenBrightnessPercent @37 :Int8;
+
+ struct ThermalZone {
+ name @0 :Text;
+ temp @1 :Float32;
+ }
+
+ enum ThermalStatus {
+ green @0;
+ yellow @1;
+ red @2;
+ danger @3;
+ }
+
+ enum NetworkType {
+ none @0;
+ wifi @1;
+ cell2G @2;
+ cell3G @3;
+ cell4G @4;
+ cell5G @5;
+ ethernet @6;
+ }
+
+ enum NetworkStrength {
+ unknown @0;
+ poor @1;
+ moderate @2;
+ good @3;
+ great @4;
+ }
+
+ struct NetworkInfo {
+ technology @0 :Text;
+ operator @1 :Text;
+ band @2 :Text;
+ channel @3 :UInt16;
+ extra @4 :Text;
+ state @5 :Text;
+ }
+
+ struct NetworkStats {
+ wwanTx @0 :Int64;
+ wwanRx @1 :Int64;
+ }
+
+ # deprecated
+ cpu0DEPRECATED @0 :UInt16;
+ cpu1DEPRECATED @1 :UInt16;
+ cpu2DEPRECATED @2 :UInt16;
+ cpu3DEPRECATED @3 :UInt16;
+ memDEPRECATED @4 :UInt16;
+ gpuDEPRECATED @5 :UInt16;
+ batDEPRECATED @6 :UInt32;
+ pa0DEPRECATED @21 :UInt16;
+ cpuUsagePercentDEPRECATED @20 :Int8;
+ batteryStatusDEPRECATED @9 :Text;
+ batteryVoltageDEPRECATED @16 :Int32;
+ batteryTempCDEPRECATED @29 :Float32;
+ batteryPercentDEPRECATED @8 :Int16;
+ batteryCurrentDEPRECATED @15 :Int32;
+ chargingErrorDEPRECATED @17 :Bool;
+ chargingDisabledDEPRECATED @18 :Bool;
+ usbOnlineDEPRECATED @12 :Bool;
+ ambientTempCDEPRECATED @30 :Float32;
+ nvmeTempCDEPRECATED @35 :List(Float32);
+}
+
+struct PandaState @0xa7649e2575e4591e {
+ ignitionLine @2 :Bool;
+ rxBufferOverflow @7 :UInt32;
+ txBufferOverflow @8 :UInt32;
+ pandaType @10 :PandaType;
+ ignitionCan @13 :Bool;
+ faultStatus @15 :FaultStatus;
+ powerSaveEnabled @16 :Bool;
+ uptime @17 :UInt32;
+ faults @18 :List(FaultType);
+ heartbeatLost @22 :Bool;
+ interruptLoad @25 :Float32;
+ fanPower @28 :UInt8;
+
+ spiErrorCount @33 :UInt16;
+
+ harnessStatus @21 :HarnessStatus;
+ sbu1Voltage @35 :Float32;
+ sbu2Voltage @36 :Float32;
+
+ # can health
+ canState0 @29 :PandaCanState;
+ canState1 @30 :PandaCanState;
+ canState2 @31 :PandaCanState;
+
+ # safety stuff
+ controlsAllowed @3 :Bool;
+ safetyRxInvalid @19 :UInt32;
+ safetyTxBlocked @24 :UInt32;
+ safetyModel @14 :Car.CarParams.SafetyModel;
+ safetyParam @27 :UInt16;
+ alternativeExperience @23 :Int16;
+ safetyRxChecksInvalid @32 :Bool;
+
+ voltage @0 :UInt32;
+ current @1 :UInt32;
+
+ enum FaultStatus {
+ none @0;
+ faultTemp @1;
+ faultPerm @2;
+ }
+
+ enum FaultType {
+ relayMalfunction @0;
+ unusedInterruptHandled @1;
+ interruptRateCan1 @2;
+ interruptRateCan2 @3;
+ interruptRateCan3 @4;
+ interruptRateTach @5;
+ interruptRateGmlanDEPRECATED @6;
+ interruptRateInterrupts @7;
+ interruptRateSpiDma @8;
+ interruptRateSpiCs @9;
+ interruptRateUart1 @10;
+ interruptRateUart2 @11;
+ interruptRateUart3 @12;
+ interruptRateUart5 @13;
+ interruptRateUartDma @14;
+ interruptRateUsb @15;
+ interruptRateTim1 @16;
+ interruptRateTim3 @17;
+ registerDivergent @18;
+ interruptRateKlineInit @19;
+ interruptRateClockSource @20;
+ interruptRateTick @21;
+ interruptRateExti @22;
+ interruptRateSpi @23;
+ interruptRateUart7 @24;
+ sirenMalfunction @25;
+ heartbeatLoopWatchdog @26;
+ # Update max fault type in boardd when adding faults
+ }
+
+ enum PandaType @0x8a58adf93e5b3751 {
+ unknown @0;
+ whitePanda @1;
+ greyPanda @2;
+ blackPanda @3;
+ pedal @4;
+ uno @5;
+ dos @6;
+ redPanda @7;
+ redPandaV2 @8;
+ tres @9;
+ cuatro @10;
+ }
+
+ enum HarnessStatus {
+ notConnected @0;
+ normal @1;
+ flipped @2;
+ }
+
+ struct PandaCanState {
+ busOff @0 :Bool;
+ busOffCnt @1 :UInt32;
+ errorWarning @2 :Bool;
+ errorPassive @3 :Bool;
+ lastError @4 :LecErrorCode;
+ lastStoredError @5 :LecErrorCode;
+ lastDataError @6 :LecErrorCode;
+ lastDataStoredError @7 :LecErrorCode;
+ receiveErrorCnt @8 :UInt8;
+ transmitErrorCnt @9 :UInt8;
+ totalErrorCnt @10 :UInt32;
+ totalTxLostCnt @11 :UInt32;
+ totalRxLostCnt @12 :UInt32;
+ totalTxCnt @13 :UInt32;
+ totalRxCnt @14 :UInt32;
+ totalFwdCnt @15 :UInt32;
+ canSpeed @16 :UInt16;
+ canDataSpeed @17 :UInt16;
+ canfdEnabled @18 :Bool;
+ brsEnabled @19 :Bool;
+ canfdNonIso @20 :Bool;
+ irq0CallRate @21 :UInt32;
+ irq1CallRate @22 :UInt32;
+ irq2CallRate @23 :UInt32;
+ canCoreResetCnt @24 :UInt32;
+
+ enum LecErrorCode {
+ noError @0;
+ stuffError @1;
+ formError @2;
+ ackError @3;
+ bit1Error @4;
+ bit0Error @5;
+ crcError @6;
+ noChange @7;
+ }
+ }
+
+ gasInterceptorDetectedDEPRECATED @4 :Bool;
+ startedSignalDetectedDEPRECATED @5 :Bool;
+ hasGpsDEPRECATED @6 :Bool;
+ gmlanSendErrsDEPRECATED @9 :UInt32;
+ fanSpeedRpmDEPRECATED @11 :UInt16;
+ usbPowerModeDEPRECATED @12 :PeripheralState.UsbPowerModeDEPRECATED;
+ safetyParamDEPRECATED @20 :Int16;
+ safetyParam2DEPRECATED @26 :UInt32;
+ fanStallCountDEPRECATED @34 :UInt8;
+}
+
+struct PeripheralState {
+ pandaType @0 :PandaState.PandaType;
+ voltage @1 :UInt32;
+ current @2 :UInt32;
+ fanSpeedRpm @3 :UInt16;
+
+ usbPowerModeDEPRECATED @4 :UsbPowerModeDEPRECATED;
+ enum UsbPowerModeDEPRECATED @0xa8883583b32c9877 {
+ none @0;
+ client @1;
+ cdp @2;
+ dcp @3;
+ }
+}
+
+struct RadarState @0x9a185389d6fdd05f {
+ mdMonoTime @6 :UInt64;
+ carStateMonoTime @11 :UInt64;
+ radarErrors @13 :Car.RadarData.Error;
+
+ leadOne @3 :LeadData;
+ leadTwo @4 :LeadData;
+
+ struct LeadData {
+ dRel @0 :Float32;
+ yRel @1 :Float32;
+ vRel @2 :Float32;
+ aRel @3 :Float32;
+ vLead @4 :Float32;
+ dPath @6 :Float32;
+ vLat @7 :Float32;
+ vLeadK @8 :Float32;
+ aLeadK @9 :Float32;
+ fcw @10 :Bool;
+ status @11 :Bool;
+ aLeadTau @12 :Float32;
+ modelProb @13 :Float32;
+ radar @14 :Bool;
+ radarTrackId @15 :Int32 = -1;
+
+ aLeadDEPRECATED @5 :Float32;
+ }
+
+ # deprecated
+ ftMonoTimeDEPRECATED @7 :UInt64;
+ warpMatrixDEPRECATED @0 :List(Float32);
+ angleOffsetDEPRECATED @1 :Float32;
+ calStatusDEPRECATED @2 :Int8;
+ calCycleDEPRECATED @8 :Int32;
+ calPercDEPRECATED @9 :Int8;
+ canMonoTimesDEPRECATED @10 :List(UInt64);
+ cumLagMsDEPRECATED @5 :Float32;
+ radarErrorsDEPRECATED @12 :List(Car.RadarData.ErrorDEPRECATED);
+}
+
+struct LiveCalibrationData {
+ calStatus @11 :Status;
+ calCycle @2 :Int32;
+ calPerc @3 :Int8;
+ validBlocks @9 :Int32;
+
+ # view_frame_from_road_frame
+ # ui's is inversed needs new
+ extrinsicMatrix @4 :List(Float32);
+ # the direction of travel vector in device frame
+ rpyCalib @7 :List(Float32);
+ rpyCalibSpread @8 :List(Float32);
+ wideFromDeviceEuler @10 :List(Float32);
+ height @12 :List(Float32);
+
+ warpMatrixDEPRECATED @0 :List(Float32);
+ calStatusDEPRECATED @1 :Int8;
+ warpMatrix2DEPRECATED @5 :List(Float32);
+ warpMatrixBigDEPRECATED @6 :List(Float32);
+
+ enum Status {
+ uncalibrated @0;
+ calibrated @1;
+ invalid @2;
+ recalibrating @3;
+ }
+}
+
+struct LiveTracksDEPRECATED {
+ trackId @0 :Int32;
+ dRel @1 :Float32;
+ yRel @2 :Float32;
+ vRel @3 :Float32;
+ aRel @4 :Float32;
+ timeStamp @5 :Float32;
+ status @6 :Float32;
+ currentTime @7 :Float32;
+ stationary @8 :Bool;
+ oncoming @9 :Bool;
+}
+
+struct SelfdriveState {
+ # high level system state
+ state @0 :OpenpilotState;
+ enabled @1 :Bool;
+ active @2 :Bool;
+ engageable @9 :Bool; # can OP be engaged?
+
+ # UI alerts
+ alertText1 @3 :Text;
+ alertText2 @4 :Text;
+ alertStatus @5 :AlertStatus;
+ alertSize @6 :AlertSize;
+ alertType @7 :Text;
+ alertSound @8 :Car.CarControl.HUDControl.AudibleAlert;
+ alertHudVisual @12 :Car.CarControl.HUDControl.VisualAlert;
+
+ # configurable driving settings
+ experimentalMode @10 :Bool;
+ personality @11 :LongitudinalPersonality;
+
+ enum OpenpilotState @0xdbe58b96d2d1ac61 {
+ disabled @0;
+ preEnabled @1;
+ enabled @2;
+ softDisabling @3;
+ overriding @4; # superset of overriding with steering or accelerator
+ }
+
+ enum AlertStatus @0xa0d0dcd113193c62 {
+ normal @0;
+ userPrompt @1;
+ critical @2;
+ }
+
+ enum AlertSize @0xe98bb99d6e985f64 {
+ none @0;
+ small @1;
+ mid @2;
+ full @3;
+ }
+}
+
+struct ControlsState @0x97ff69c53601abf1 {
+ longitudinalPlanMonoTime @28 :UInt64;
+ lateralPlanMonoTime @50 :UInt64;
+
+ longControlState @30 :Car.CarControl.Actuators.LongControlState;
+ upAccelCmd @4 :Float32;
+ uiAccelCmd @5 :Float32;
+ ufAccelCmd @33 :Float32;
+ curvature @37 :Float32; # path curvature from vehicle model
+ desiredCurvature @61 :Float32; # lag adjusted curvatures used by lateral controllers
+ forceDecel @51 :Bool;
+
+ lateralControlState :union {
+ pidState @53 :LateralPIDState;
+ angleState @58 :LateralAngleState;
+ debugState @59 :LateralDebugState;
+ torqueState @60 :LateralTorqueState;
+
+ curvatureStateDEPRECATED @65 :LateralCurvatureState;
+ lqrStateDEPRECATED @55 :LateralLQRState;
+ indiStateDEPRECATED @52 :LateralINDIState;
+ }
+
+ struct LateralINDIState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ steeringRateDeg @2 :Float32;
+ steeringAccelDeg @3 :Float32;
+ rateSetPoint @4 :Float32;
+ accelSetPoint @5 :Float32;
+ accelError @6 :Float32;
+ delayedOutput @7 :Float32;
+ delta @8 :Float32;
+ output @9 :Float32;
+ saturated @10 :Bool;
+ steeringAngleDesiredDeg @11 :Float32;
+ steeringRateDesiredDeg @12 :Float32;
+ }
+
+ struct LateralPIDState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ steeringRateDeg @2 :Float32;
+ angleError @3 :Float32;
+ p @4 :Float32;
+ i @5 :Float32;
+ f @6 :Float32;
+ output @7 :Float32;
+ saturated @8 :Bool;
+ steeringAngleDesiredDeg @9 :Float32;
+ }
+
+ struct LateralTorqueState {
+ active @0 :Bool;
+ error @1 :Float32;
+ errorRate @8 :Float32;
+ p @2 :Float32;
+ i @3 :Float32;
+ d @4 :Float32;
+ f @5 :Float32;
+ output @6 :Float32;
+ saturated @7 :Bool;
+ actualLateralAccel @9 :Float32;
+ desiredLateralAccel @10 :Float32;
+ desiredLateralJerk @11 :Float32;
+ version @12 :Int32;
+ }
+
+ struct LateralLQRState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ i @2 :Float32;
+ output @3 :Float32;
+ lqrOutput @4 :Float32;
+ saturated @5 :Bool;
+ steeringAngleDesiredDeg @6 :Float32;
+ }
+
+ struct LateralAngleState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ output @2 :Float32;
+ saturated @3 :Bool;
+ steeringAngleDesiredDeg @4 :Float32;
+ }
+
+ struct LateralCurvatureState {
+ active @0 :Bool;
+ actualCurvature @1 :Float32;
+ desiredCurvature @2 :Float32;
+ error @3 :Float32;
+ p @4 :Float32;
+ i @5 :Float32;
+ f @6 :Float32;
+ output @7 :Float32;
+ saturated @8 :Bool;
+ }
+
+ struct LateralDebugState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ output @2 :Float32;
+ saturated @3 :Bool;
+ }
+
+ # deprecated
+ vEgoDEPRECATED @0 :Float32;
+ vEgoRawDEPRECATED @32 :Float32;
+ aEgoDEPRECATED @1 :Float32;
+ canMonoTimeDEPRECATED @16 :UInt64;
+ radarStateMonoTimeDEPRECATED @17 :UInt64;
+ mdMonoTimeDEPRECATED @18 :UInt64;
+ yActualDEPRECATED @6 :Float32;
+ yDesDEPRECATED @7 :Float32;
+ upSteerDEPRECATED @8 :Float32;
+ uiSteerDEPRECATED @9 :Float32;
+ ufSteerDEPRECATED @34 :Float32;
+ aTargetMinDEPRECATED @10 :Float32;
+ aTargetMaxDEPRECATED @11 :Float32;
+ rearViewCamDEPRECATED @23 :Bool;
+ driverMonitoringOnDEPRECATED @43 :Bool;
+ hudLeadDEPRECATED @14 :Int32;
+ alertSoundDEPRECATED @45 :Text;
+ angleModelBiasDEPRECATED @27 :Float32;
+ gpsPlannerActiveDEPRECATED @40 :Bool;
+ decelForTurnDEPRECATED @47 :Bool;
+ decelForModelDEPRECATED @54 :Bool;
+ awarenessStatusDEPRECATED @26 :Float32;
+ angleSteersDEPRECATED @13 :Float32;
+ vCurvatureDEPRECATED @46 :Float32;
+ mapValidDEPRECATED @49 :Bool;
+ jerkFactorDEPRECATED @12 :Float32;
+ steerOverrideDEPRECATED @20 :Bool;
+ steeringAngleDesiredDegDEPRECATED @29 :Float32;
+ canMonoTimesDEPRECATED @21 :List(UInt64);
+ desiredCurvatureRateDEPRECATED @62 :Float32;
+ canErrorCounterDEPRECATED @57 :UInt32;
+ vPidDEPRECATED @2 :Float32;
+ alertBlinkingRateDEPRECATED @42 :Float32;
+ alertText1DEPRECATED @24 :Text;
+ alertText2DEPRECATED @25 :Text;
+ alertStatusDEPRECATED @38 :SelfdriveState.AlertStatus;
+ alertSizeDEPRECATED @39 :SelfdriveState.AlertSize;
+ alertTypeDEPRECATED @44 :Text;
+ alertSound2DEPRECATED @56 :Car.CarControl.HUDControl.AudibleAlert;
+ engageableDEPRECATED @41 :Bool; # can OP be engaged?
+ stateDEPRECATED @31 :SelfdriveState.OpenpilotState;
+ enabledDEPRECATED @19 :Bool;
+ activeDEPRECATED @36 :Bool;
+ experimentalModeDEPRECATED @64 :Bool;
+ personalityDEPRECATED @66 :LongitudinalPersonality;
+ vCruiseDEPRECATED @22 :Float32; # actual set speed
+ vCruiseClusterDEPRECATED @63 :Float32; # set speed to display in the UI
+ startMonoTimeDEPRECATED @48 :UInt64;
+ cumLagMsDEPRECATED @15 :Float32;
+ aTargetDEPRECATED @35 :Float32;
+ vTargetLeadDEPRECATED @3 :Float32;
+}
+
+struct DrivingModelData {
+ frameId @0 :UInt32;
+ frameIdExtra @1 :UInt32;
+ frameDropPerc @6 :Float32;
+ modelExecutionTime @7 :Float32;
+
+ action @2 :ModelDataV2.Action;
+
+ laneLineMeta @3 :LaneLineMeta;
+ meta @4 :MetaData;
+
+ path @5 :PolyPath;
+
+ struct PolyPath {
+ xCoefficients @0 :List(Float32);
+ yCoefficients @1 :List(Float32);
+ zCoefficients @2 :List(Float32);
+ }
+
+ struct LaneLineMeta {
+ leftY @0 :Float32;
+ rightY @1 :Float32;
+ leftProb @2 :Float32;
+ rightProb @3 :Float32;
+ }
+
+ struct MetaData {
+ laneChangeState @0 :LaneChangeState;
+ laneChangeDirection @1 :LaneChangeDirection;
+ }
+}
+
+# All SI units and in device frame
+struct XYZTData @0xc3cbae1fd505ae80 {
+ x @0 :List(Float32);
+ y @1 :List(Float32);
+ z @2 :List(Float32);
+ t @3 :List(Float32);
+ xStd @4 :List(Float32);
+ yStd @5 :List(Float32);
+ zStd @6 :List(Float32);
+}
+
+struct ModelDataV2 {
+ frameId @0 :UInt32;
+ frameIdExtra @20 :UInt32;
+ frameAge @1 :UInt32;
+ frameDropPerc @2 :Float32;
+ timestampEof @3 :UInt64;
+ modelExecutionTime @15 :Float32;
+ rawPredictions @16 :Data;
+
+ # predicted future position, orientation, etc..
+ position @4 :XYZTData;
+ orientation @5 :XYZTData;
+ velocity @6 :XYZTData;
+ orientationRate @7 :XYZTData;
+ acceleration @19 :XYZTData;
+
+ # prediction lanelines and road edges
+ laneLines @8 :List(XYZTData);
+ laneLineProbs @9 :List(Float32);
+ laneLineStds @13 :List(Float32);
+ roadEdges @10 :List(XYZTData);
+ roadEdgeStds @14 :List(Float32);
+
+ # predicted lead cars
+ leads @11 :List(LeadDataV2);
+ leadsV3 @18 :List(LeadDataV3);
+
+ meta @12 :MetaData;
+ confidence @23: ConfidenceClass;
+
+ # Model perceived motion
+ temporalPoseDEPRECATED @21 :Pose;
+
+ # e2e lateral planner
+ action @26: Action;
+
+ gpuExecutionTimeDEPRECATED @17 :Float32;
+ navEnabledDEPRECATED @22 :Bool;
+ locationMonoTimeDEPRECATED @24 :UInt64;
+ lateralPlannerSolutionDEPRECATED @25: LateralPlannerSolution;
+
+ struct LeadDataV2 {
+ prob @0 :Float32; # probability that car is your lead at time t
+ t @1 :Float32;
+
+ # x and y are relative position in device frame
+ # v is norm relative speed
+ # a is norm relative acceleration
+ xyva @2 :List(Float32);
+ xyvaStd @3 :List(Float32);
+ }
+
+ struct LeadDataV3 {
+ prob @0 :Float32; # probability that car is your lead at time t
+ probTime @1 :Float32;
+ t @2 :List(Float32);
+
+ # x and y are relative position in device frame
+ # v absolute norm speed
+ # a is derivative of v
+ x @3 :List(Float32);
+ xStd @4 :List(Float32);
+ y @5 :List(Float32);
+ yStd @6 :List(Float32);
+ v @7 :List(Float32);
+ vStd @8 :List(Float32);
+ a @9 :List(Float32);
+ aStd @10 :List(Float32);
+ }
+
+
+ struct MetaData {
+ engagedProb @0 :Float32;
+ desirePrediction @1 :List(Float32);
+ desireState @5 :List(Float32);
+ disengagePredictions @6 :DisengagePredictions;
+ hardBrakePredicted @7 :Bool;
+ laneChangeState @8 :LaneChangeState;
+ laneChangeDirection @9 :LaneChangeDirection;
+
+
+ # deprecated
+ brakeDisengageProbDEPRECATED @2 :Float32;
+ gasDisengageProbDEPRECATED @3 :Float32;
+ steerOverrideProbDEPRECATED @4 :Float32;
+ }
+
+ enum ConfidenceClass {
+ red @0;
+ yellow @1;
+ green @2;
+ }
+
+ struct DisengagePredictions {
+ t @0 :List(Float32);
+ brakeDisengageProbs @1 :List(Float32);
+ gasDisengageProbs @2 :List(Float32);
+ steerOverrideProbs @3 :List(Float32);
+ brake3MetersPerSecondSquaredProbs @4 :List(Float32);
+ brake4MetersPerSecondSquaredProbs @5 :List(Float32);
+ brake5MetersPerSecondSquaredProbs @6 :List(Float32);
+ gasPressProbs @7 :List(Float32);
+ brakePressProbs @8 :List(Float32);
+ }
+
+ struct Pose {
+ trans @0 :List(Float32); # m/s in device frame
+ rot @1 :List(Float32); # rad/s in device frame
+ transStd @2 :List(Float32); # std m/s in device frame
+ rotStd @3 :List(Float32); # std rad/s in device frame
+ }
+
+ struct LateralPlannerSolution {
+ x @0 :List(Float32);
+ y @1 :List(Float32);
+ yaw @2 :List(Float32);
+ yawRate @3 :List(Float32);
+ xStd @4 :List(Float32);
+ yStd @5 :List(Float32);
+ yawStd @6 :List(Float32);
+ yawRateStd @7 :List(Float32);
+ }
+
+ struct Action {
+ desiredCurvature @0 :Float32;
+ desiredAcceleration @1 :Float32;
+ shouldStop @2 :Bool;
+ }
+}
+
+struct EncodeIndex {
+ # picture from camera
+ frameId @0 :UInt32;
+ type @1 :Type;
+ # index of encoder from start of route
+ encodeId @2 :UInt32;
+ # minute long segment this frame is in
+ segmentNum @3 :Int32;
+ # index into camera file in segment in presentation order
+ segmentId @4 :UInt32;
+ # index into camera file in segment in encode order
+ segmentIdEncode @5 :UInt32;
+ timestampSof @6 :UInt64;
+ timestampEof @7 :UInt64;
+
+ # encoder metadata
+ flags @8 :UInt32;
+ len @9 :UInt32;
+
+ enum Type {
+ bigBoxLossless @0;
+ fullHEVC @1;
+ qcameraH264 @6;
+ livestreamH264 @7;
+
+ # deprecated
+ bigBoxHEVCDEPRECATED @2;
+ chffrAndroidH264DEPRECATED @3;
+ fullLosslessClipDEPRECATED @4;
+ frontDEPRECATED @5;
+
+ }
+}
+
+struct AndroidLogEntry {
+ id @0 :UInt8;
+ ts @1 :UInt64;
+ priority @2 :UInt8;
+ pid @3 :Int32;
+ tid @4 :Int32;
+ tag @5 :Text;
+ message @6 :Text;
+}
+
+struct DriverAssistance {
+ # Lane Departure Warnings
+ leftLaneDeparture @0 :Bool;
+ rightLaneDeparture @1 :Bool;
+
+ # FCW, AEB, etc. will go here
+}
+
+struct LateralManeuverPlan {
+ desiredCurvature @0 :Float32; # 1/m
+}
+
+struct LongitudinalPlan @0xe00b5b3eba12876c {
+ modelMonoTime @9 :UInt64;
+ hasLead @7 :Bool;
+ fcw @8 :Bool;
+ longitudinalPlanSource @15 :LongitudinalPlanSource;
+ processingDelay @29 :Float32;
+
+ # desired speed/accel/jerk over next 2.5s
+ accels @32 :List(Float32);
+ speeds @33 :List(Float32);
+ jerks @34 :List(Float32);
+ aTarget @18 :Float32;
+ shouldStop @37: Bool;
+ allowThrottle @38: Bool;
+ allowBrake @39: Bool;
+ leadDistance @40 :Float32;
+
+
+ solverExecutionTime @35 :Float32;
+
+ # lead trajectories the MPC solved against (13 points at T_IDXS)
+ leadTrajectoryX0 @41 :List(Float32);
+ leadTrajectoryV0 @42 :List(Float32);
+ leadTrajectoryX1 @43 :List(Float32);
+ leadTrajectoryV1 @44 :List(Float32);
+
+ enum LongitudinalPlanSource {
+ cruise @0;
+ lead0 @1;
+ lead1 @2;
+ lead2 @3;
+ e2e @4;
+ }
+
+ # deprecated
+ vCruiseDEPRECATED @16 :Float32;
+ aCruiseDEPRECATED @17 :Float32;
+ vTargetDEPRECATED @3 :Float32;
+ vTargetFutureDEPRECATED @14 :Float32;
+ vStartDEPRECATED @26 :Float32;
+ aStartDEPRECATED @27 :Float32;
+ vMaxDEPRECATED @20 :Float32;
+ radarStateMonoTimeDEPRECATED @10 :UInt64;
+ jerkFactorDEPRECATED @6 :Float32;
+ hasLeftLaneDEPRECATED @23 :Bool;
+ hasRightLaneDEPRECATED @24 :Bool;
+ aTargetMinDEPRECATED @4 :Float32;
+ aTargetMaxDEPRECATED @5 :Float32;
+ lateralValidDEPRECATED @0 :Bool;
+ longitudinalValidDEPRECATED @2 :Bool;
+ dPolyDEPRECATED @1 :List(Float32);
+ laneWidthDEPRECATED @11 :Float32;
+ vCurvatureDEPRECATED @21 :Float32;
+ decelForTurnDEPRECATED @22 :Bool;
+ mapValidDEPRECATED @25 :Bool;
+ radarValidDEPRECATED @28 :Bool;
+ radarCanErrorDEPRECATED @30 :Bool;
+ commIssueDEPRECATED @31 :Bool;
+ eventsDEPRECATED @13 :List(Car.OnroadEventDEPRECATED);
+ gpsTrajectoryDEPRECATED @12 :GpsTrajectory;
+ gpsPlannerActiveDEPRECATED @19 :Bool;
+ personalityDEPRECATED @36 :LongitudinalPersonality;
+
+ struct GpsTrajectory {
+ x @0 :List(Float32);
+ y @1 :List(Float32);
+ }
+}
+struct UiPlan {
+ frameId @2 :UInt32;
+ position @0 :XYZTData;
+ accel @1 :List(Float32);
+}
+
+struct LateralPlan @0xe1e9318e2ae8b51e {
+ modelMonoTime @31 :UInt64;
+ laneWidthDEPRECATED @0 :Float32;
+ lProbDEPRECATED @5 :Float32;
+ rProbDEPRECATED @7 :Float32;
+ dPathPoints @20 :List(Float32);
+ dProbDEPRECATED @21 :Float32;
+
+ mpcSolutionValid @9 :Bool;
+ desire @17 :Desire;
+ laneChangeState @18 :LaneChangeState;
+ laneChangeDirection @19 :LaneChangeDirection;
+ useLaneLines @29 :Bool;
+
+ # desired curvatures over next 2.5s in rad/m
+ psis @26 :List(Float32);
+ curvatures @27 :List(Float32);
+ curvatureRates @28 :List(Float32);
+
+ solverExecutionTime @30 :Float32;
+ solverCost @32 :Float32;
+ solverState @33 :SolverState;
+
+ struct SolverState {
+ x @0 :List(List(Float32));
+ u @1 :List(Float32);
+ }
+
+ # deprecated
+ curvatureDEPRECATED @22 :Float32;
+ curvatureRateDEPRECATED @23 :Float32;
+ rawCurvatureDEPRECATED @24 :Float32;
+ rawCurvatureRateDEPRECATED @25 :Float32;
+ cProbDEPRECATED @3 :Float32;
+ dPolyDEPRECATED @1 :List(Float32);
+ cPolyDEPRECATED @2 :List(Float32);
+ lPolyDEPRECATED @4 :List(Float32);
+ rPolyDEPRECATED @6 :List(Float32);
+ modelValidDEPRECATED @12 :Bool;
+ commIssueDEPRECATED @15 :Bool;
+ posenetValidDEPRECATED @16 :Bool;
+ sensorValidDEPRECATED @14 :Bool;
+ paramsValidDEPRECATED @10 :Bool;
+ steeringAngleDegDEPRECATED @8 :Float32; # deg
+ steeringRateDegDEPRECATED @13 :Float32; # deg/s
+ angleOffsetDegDEPRECATED @11 :Float32;
+}
+
+struct LiveLocationKalman {
+
+ # More info on reference frames:
+ # https://github.com/commaai/openpilot/tree/master/common/transformations
+
+ positionECEF @0 : Measurement;
+ positionGeodetic @1 : Measurement;
+ velocityECEF @2 : Measurement;
+ velocityNED @3 : Measurement;
+ velocityDevice @4 : Measurement;
+ accelerationDevice @5: Measurement;
+
+
+ # These angles are all eulers and roll, pitch, yaw
+ # orientationECEF transforms to rot matrix: ecef_from_device
+ orientationECEF @6 : Measurement;
+ calibratedOrientationECEF @20 : Measurement;
+ orientationNED @7 : Measurement;
+ angularVelocityDevice @8 : Measurement;
+
+ # orientationNEDCalibrated transforms to rot matrix: NED_from_calibrated
+ calibratedOrientationNED @9 : Measurement;
+
+ # Calibrated frame is simply device frame
+ # aligned with the vehicle
+ velocityCalibrated @10 : Measurement;
+ accelerationCalibrated @11 : Measurement;
+ angularVelocityCalibrated @12 : Measurement;
+
+ gpsWeek @13 :Int32;
+ gpsTimeOfWeek @14 :Float64;
+ status @15 :Status;
+ unixTimestampMillis @16 :Int64;
+ inputsOK @17 :Bool = true;
+ posenetOK @18 :Bool = true;
+ gpsOK @19 :Bool = true;
+ sensorsOK @21 :Bool = true;
+ deviceStable @22 :Bool = true;
+ timeSinceReset @23 :Float64;
+ excessiveResets @24 :Bool;
+ timeToFirstFix @25 :Float32;
+
+ filterState @26 : Measurement;
+
+ enum Status {
+ uninitialized @0;
+ uncalibrated @1;
+ valid @2;
+ }
+
+ struct Measurement {
+ value @0 : List(Float64);
+ std @1 : List(Float64);
+ valid @2 : Bool;
+ }
+}
+
+
+struct LivePose {
+ # More info on reference frames:
+ # https://github.com/commaai/openpilot/tree/master/common/transformations
+ orientationNED @0 :XYZMeasurement;
+ velocityDevice @1 :XYZMeasurement;
+ accelerationDevice @2 :XYZMeasurement;
+ angularVelocityDevice @3 :XYZMeasurement;
+
+ inputsOK @4 :Bool = false;
+ posenetOK @5 :Bool = false;
+ sensorsOK @6 :Bool = false;
+
+ debugFilterState @7 :FilterState;
+
+ struct XYZMeasurement {
+ x @0 :Float32;
+ y @1 :Float32;
+ z @2 :Float32;
+ xStd @3 :Float32;
+ yStd @4 :Float32;
+ zStd @5 :Float32;
+ valid @6 :Bool;
+ }
+
+ struct FilterState {
+ value @0 : List(Float64);
+ std @1 : List(Float64);
+ valid @2 : Bool;
+
+ observations @3 :List(Observation);
+
+ struct Observation {
+ kind @0 :Int32;
+ value @1 :List(Float32);
+ error @2 :List(Float32);
+ }
+ }
+}
+
+struct ProcLog {
+ cpuTimes @0 :List(CPUTimes);
+ mem @1 :Mem;
+ procs @2 :List(Process);
+
+ struct Process {
+ pid @0 :Int32;
+ name @1 :Text;
+ state @2 :UInt8;
+ ppid @3 :Int32;
+
+ cpuUser @4 :Float32;
+ cpuSystem @5 :Float32;
+ cpuChildrenUser @6 :Float32;
+ cpuChildrenSystem @7 :Float32;
+ priority @8 :Int64;
+ nice @9 :Int32;
+ numThreads @10 :Int32;
+ startTime @11 :Float64;
+
+ memVms @12 :UInt64;
+ memRss @13 :UInt64;
+
+ processor @14 :Int32;
+
+ cmdline @15 :List(Text);
+ exe @16 :Text;
+ }
+
+ struct CPUTimes {
+ cpuNum @0 :Int64;
+ user @1 :Float32;
+ nice @2 :Float32;
+ system @3 :Float32;
+ idle @4 :Float32;
+ iowait @5 :Float32;
+ irq @6 :Float32;
+ softirq @7 :Float32;
+ }
+
+ struct Mem {
+ total @0 :UInt64;
+ free @1 :UInt64;
+ available @2 :UInt64;
+ buffers @3 :UInt64;
+ cached @4 :UInt64;
+ active @5 :UInt64;
+ inactive @6 :UInt64;
+ shared @7 :UInt64;
+ }
+}
+
+struct GnssMeasurements {
+ measTime @0 :UInt64;
+ gpsWeek @1 :Int16;
+ gpsTimeOfWeek @2 :Float64;
+
+ correctedMeasurements @3 :List(CorrectedMeasurement);
+ ephemerisStatuses @9 :List(EphemerisStatus);
+
+ kalmanPositionECEF @4 :LiveLocationKalman.Measurement;
+ kalmanVelocityECEF @5 :LiveLocationKalman.Measurement;
+ positionECEF @6 :LiveLocationKalman.Measurement;
+ velocityECEF @7 :LiveLocationKalman.Measurement;
+ timeToFirstFix @8 :Float32;
+ # Todo sync this with timing pulse of ublox
+
+ struct EphemerisStatus {
+ constellationId @0 :ConstellationId;
+ svId @1 :UInt8;
+ type @2 :EphemerisType;
+ source @3 :EphemerisSource;
+ gpsWeek @4 : UInt16;
+ tow @5 :Float64;
+ }
+
+ struct CorrectedMeasurement {
+ constellationId @0 :ConstellationId;
+ svId @1 :UInt8;
+ # Is 0 when not Glonass constellation.
+ glonassFrequency @2 :Int8;
+ pseudorange @3 :Float64;
+ pseudorangeStd @4 :Float64;
+ pseudorangeRate @5 :Float64;
+ pseudorangeRateStd @6 :Float64;
+ # Satellite position and velocity [x,y,z]
+ satPos @7 :List(Float64);
+ satVel @8 :List(Float64);
+ ephemerisSourceDEPRECATED @9 :EphemerisSourceDEPRECATED;
+ }
+
+ struct EphemerisSourceDEPRECATED {
+ type @0 :EphemerisType;
+ # first epoch in file:
+ gpsWeek @1 :Int16; # -1 if Nav
+ gpsTimeOfWeek @2 :Int32; # -1 if Nav. Integer for seconds is good enough for logs.
+ }
+
+ enum ConstellationId {
+ # Satellite Constellation using the Ublox gnssid as index
+ gps @0;
+ sbas @1;
+ galileo @2;
+ beidou @3;
+ imes @4;
+ qznss @5;
+ glonass @6;
+ }
+
+ enum EphemerisType {
+ nav @0;
+ # Different ultra-rapid files:
+ nasaUltraRapid @1;
+ glonassIacUltraRapid @2;
+ qcom @3;
+ }
+
+ enum EphemerisSource {
+ gnssChip @0;
+ internet @1;
+ cache @2;
+ unknown @3;
+ }
+}
+
+struct UbloxGnss {
+ union {
+ measurementReport @0 :MeasurementReport;
+ ephemeris @1 :Ephemeris;
+ ionoData @2 :IonoData;
+ hwStatus @3 :HwStatus;
+ hwStatus2 @4 :HwStatus2;
+ glonassEphemeris @5 :GlonassEphemeris;
+ satReport @6 :SatReport;
+ }
+
+ struct SatReport {
+ #received time of week in gps time in seconds and gps week
+ iTow @0 :UInt32;
+ svs @1 :List(SatInfo);
+
+ struct SatInfo {
+ svId @0 :UInt8;
+ gnssId @1 :UInt8;
+ flagsBitfield @2 :UInt32;
+ cno @3 :UInt8;
+ elevationDeg @4 :Int8;
+ azimuthDeg @5 :Int16;
+ pseudorangeResidual @6 :Float32;
+ }
+ }
+
+ struct MeasurementReport {
+ #received time of week in gps time in seconds and gps week
+ rcvTow @0 :Float64;
+ gpsWeek @1 :UInt16;
+ # leap seconds in seconds
+ leapSeconds @2 :UInt16;
+ # receiver status
+ receiverStatus @3 :ReceiverStatus;
+ # num of measurements to follow
+ numMeas @4 :UInt8;
+ measurements @5 :List(Measurement);
+
+ struct ReceiverStatus {
+ # leap seconds have been determined
+ leapSecValid @0 :Bool;
+ # Clock reset applied
+ clkReset @1 :Bool;
+ }
+
+ struct Measurement {
+ svId @0 :UInt8;
+ trackingStatus @1 :TrackingStatus;
+ # pseudorange in meters
+ pseudorange @2 :Float64;
+ # carrier phase measurement in cycles
+ carrierCycles @3 :Float64;
+ # doppler measurement in Hz
+ doppler @4 :Float32;
+ # GNSS id, 0 is gps
+ gnssId @5 :UInt8;
+ glonassFrequencyIndex @6 :UInt8;
+ # carrier phase locktime counter in ms
+ locktime @7 :UInt16;
+ # Carrier-to-noise density ratio (signal strength) in dBHz
+ cno @8 :UInt8;
+ # pseudorange standard deviation in meters
+ pseudorangeStdev @9 :Float32;
+ # carrier phase standard deviation in cycles
+ carrierPhaseStdev @10 :Float32;
+ # doppler standard deviation in Hz
+ dopplerStdev @11 :Float32;
+ sigId @12 :UInt8;
+
+ struct TrackingStatus {
+ # pseudorange valid
+ pseudorangeValid @0 :Bool;
+ # carrier phase valid
+ carrierPhaseValid @1 :Bool;
+ # half cycle valid
+ halfCycleValid @2 :Bool;
+ # half cycle subtracted from phase
+ halfCycleSubtracted @3 :Bool;
+ }
+ }
+ }
+
+ struct Ephemeris {
+ # This is according to the rinex (2?) format
+ svId @0 :UInt16;
+ year @1 :UInt16;
+ month @2 :UInt16;
+ day @3 :UInt16;
+ hour @4 :UInt16;
+ minute @5 :UInt16;
+ second @6 :Float32;
+ af0 @7 :Float64;
+ af1 @8 :Float64;
+ af2 @9 :Float64;
+
+ iode @10 :Float64;
+ crs @11 :Float64;
+ deltaN @12 :Float64;
+ m0 @13 :Float64;
+
+ cuc @14 :Float64;
+ ecc @15 :Float64;
+ cus @16 :Float64;
+ a @17 :Float64; # note that this is not the root!!
+
+ toe @18 :Float64;
+ cic @19 :Float64;
+ omega0 @20 :Float64;
+ cis @21 :Float64;
+
+ i0 @22 :Float64;
+ crc @23 :Float64;
+ omega @24 :Float64;
+ omegaDot @25 :Float64;
+
+ iDot @26 :Float64;
+ codesL2 @27 :Float64;
+ gpsWeekDEPRECATED @28 :Float64;
+ l2 @29 :Float64;
+
+ svAcc @30 :Float64;
+ svHealth @31 :Float64;
+ tgd @32 :Float64;
+ iodc @33 :Float64;
+
+ transmissionTime @34 :Float64;
+ fitInterval @35 :Float64;
+
+ toc @36 :Float64;
+
+ ionoCoeffsValid @37 :Bool;
+ ionoAlpha @38 :List(Float64);
+ ionoBeta @39 :List(Float64);
+
+ towCount @40 :UInt32;
+ toeWeek @41 :UInt16;
+ tocWeek @42 :UInt16;
+ }
+
+ struct IonoData {
+ svHealth @0 :UInt32;
+ tow @1 :Float64;
+ gpsWeek @2 :Float64;
+
+ ionoAlpha @3 :List(Float64);
+ ionoBeta @4 :List(Float64);
+
+ healthValid @5 :Bool;
+ ionoCoeffsValid @6 :Bool;
+ }
+
+ struct HwStatus {
+ noisePerMS @0 :UInt16;
+ agcCnt @1 :UInt16;
+ aStatus @2 :AntennaSupervisorState;
+ aPower @3 :AntennaPowerStatus;
+ jamInd @4 :UInt8;
+ flags @5 :UInt8;
+
+ enum AntennaSupervisorState {
+ init @0;
+ dontknow @1;
+ ok @2;
+ short @3;
+ open @4;
+ }
+
+ enum AntennaPowerStatus {
+ off @0;
+ on @1;
+ dontknow @2;
+ }
+ }
+
+ struct HwStatus2 {
+ ofsI @0 :Int8;
+ magI @1 :UInt8;
+ ofsQ @2 :Int8;
+ magQ @3 :UInt8;
+ cfgSource @4 :ConfigSource;
+ lowLevCfg @5 :UInt32;
+ postStatus @6 :UInt32;
+
+ enum ConfigSource {
+ undefined @0;
+ rom @1;
+ otp @2;
+ configpins @3;
+ flash @4;
+ }
+ }
+
+ struct GlonassEphemeris {
+ svId @0 :UInt16;
+ year @1 :UInt16;
+ dayInYear @2 :UInt16;
+ hour @3 :UInt16;
+ minute @4 :UInt16;
+ second @5 :Float32;
+
+ x @6 :Float64;
+ xVel @7 :Float64;
+ xAccel @8 :Float64;
+ y @9 :Float64;
+ yVel @10 :Float64;
+ yAccel @11 :Float64;
+ z @12 :Float64;
+ zVel @13 :Float64;
+ zAccel @14 :Float64;
+
+ svType @15 :UInt8;
+ svURA @16 :Float32;
+ age @17 :UInt8;
+
+ svHealth @18 :UInt8;
+ tkDEPRECATED @19 :UInt16;
+ tb @20 :UInt16;
+
+ tauN @21 :Float64;
+ deltaTauN @22 :Float64;
+ gammaN @23 :Float64;
+
+ p1 @24 :UInt8;
+ p2 @25 :UInt8;
+ p3 @26 :UInt8;
+ p4 @27 :UInt8;
+
+ freqNumDEPRECATED @28 :UInt32;
+
+ n4 @29 :UInt8;
+ nt @30 :UInt16;
+ freqNum @31 :Int16;
+ tkSeconds @32 :UInt32;
+ }
+}
+
+struct QcomGnss @0xde94674b07ae51c1 {
+ logTs @0 :UInt64;
+ union {
+ measurementReport @1 :MeasurementReport;
+ clockReport @2 :ClockReport;
+ drMeasurementReport @3 :DrMeasurementReport;
+ drSvPoly @4 :DrSvPolyReport;
+ rawLog @5 :Data;
+ }
+
+ enum MeasurementSource @0xd71a12b6faada7ee {
+ gps @0;
+ glonass @1;
+ beidou @2;
+ unknown3 @3;
+ unknown4 @4;
+ unknown5 @5;
+ sbas @6;
+ }
+
+ enum SVObservationState @0xe81e829a0d6c83e9 {
+ idle @0;
+ search @1;
+ searchVerify @2;
+ bitEdge @3;
+ trackVerify @4;
+ track @5;
+ restart @6;
+ dpo @7;
+ glo10msBe @8;
+ glo10msAt @9;
+ }
+
+ struct MeasurementStatus @0xe501010e1bcae83b {
+ subMillisecondIsValid @0 :Bool;
+ subBitTimeIsKnown @1 :Bool;
+ satelliteTimeIsKnown @2 :Bool;
+ bitEdgeConfirmedFromSignal @3 :Bool;
+ measuredVelocity @4 :Bool;
+ fineOrCoarseVelocity @5 :Bool;
+ lockPointValid @6 :Bool;
+ lockPointPositive @7 :Bool;
+ lastUpdateFromDifference @8 :Bool;
+ lastUpdateFromVelocityDifference @9 :Bool;
+ strongIndicationOfCrossCorelation @10 :Bool;
+ tentativeMeasurement @11 :Bool;
+ measurementNotUsable @12 :Bool;
+ sirCheckIsNeeded @13 :Bool;
+ probationMode @14 :Bool;
+
+ glonassMeanderBitEdgeValid @15 :Bool;
+ glonassTimeMarkValid @16 :Bool;
+
+ gpsRoundRobinRxDiversity @17 :Bool;
+ gpsRxDiversity @18 :Bool;
+ gpsLowBandwidthRxDiversityCombined @19 :Bool;
+ gpsHighBandwidthNu4 @20 :Bool;
+ gpsHighBandwidthNu8 @21 :Bool;
+ gpsHighBandwidthUniform @22 :Bool;
+ multipathIndicator @23 :Bool;
+
+ imdJammingIndicator @24 :Bool;
+ lteB13TxJammingIndicator @25 :Bool;
+ freshMeasurementIndicator @26 :Bool;
+
+ multipathEstimateIsValid @27 :Bool;
+ directionIsValid @28 :Bool;
+ }
+
+ struct MeasurementReport @0xf580d7d86b7b8692 {
+ source @0 :MeasurementSource;
+
+ fCount @1 :UInt32;
+
+ gpsWeek @2 :UInt16;
+ glonassCycleNumber @3 :UInt8;
+ glonassNumberOfDays @4 :UInt16;
+
+ milliseconds @5 :UInt32;
+ timeBias @6 :Float32;
+ clockTimeUncertainty @7 :Float32;
+ clockFrequencyBias @8 :Float32;
+ clockFrequencyUncertainty @9 :Float32;
+
+ sv @10 :List(SV);
+
+ struct SV @0xf10c595ae7bb2c27 {
+ svId @0 :UInt8;
+ observationState @2 :SVObservationState;
+ observations @3 :UInt8;
+ goodObservations @4 :UInt8;
+ gpsParityErrorCount @5 :UInt16;
+ glonassFrequencyIndex @1 :Int8;
+ glonassHemmingErrorCount @6 :UInt8;
+ filterStages @7 :UInt8;
+ carrierNoise @8 :UInt16;
+ latency @9 :Int16;
+ predetectInterval @10 :UInt8;
+ postdetections @11 :UInt16;
+
+ unfilteredMeasurementIntegral @12 :UInt32;
+ unfilteredMeasurementFraction @13 :Float32;
+ unfilteredTimeUncertainty @14 :Float32;
+ unfilteredSpeed @15 :Float32;
+ unfilteredSpeedUncertainty @16 :Float32;
+ measurementStatus @17 :MeasurementStatus;
+ multipathEstimate @18 :UInt32;
+ azimuth @19 :Float32;
+ elevation @20 :Float32;
+ carrierPhaseCyclesIntegral @21 :Int32;
+ carrierPhaseCyclesFraction @22 :UInt16;
+ fineSpeed @23 :Float32;
+ fineSpeedUncertainty @24 :Float32;
+ cycleSlipCount @25 :UInt8;
+ }
+
+ }
+
+ struct ClockReport @0xca965e4add8f4f0b {
+ hasFCount @0 :Bool;
+ fCount @1 :UInt32;
+
+ hasGpsWeek @2 :Bool;
+ gpsWeek @3 :UInt16;
+ hasGpsMilliseconds @4 :Bool;
+ gpsMilliseconds @5 :UInt32;
+ gpsTimeBias @6 :Float32;
+ gpsClockTimeUncertainty @7 :Float32;
+ gpsClockSource @8 :UInt8;
+
+ hasGlonassYear @9 :Bool;
+ glonassYear @10 :UInt8;
+ hasGlonassDay @11 :Bool;
+ glonassDay @12 :UInt16;
+ hasGlonassMilliseconds @13 :Bool;
+ glonassMilliseconds @14 :UInt32;
+ glonassTimeBias @15 :Float32;
+ glonassClockTimeUncertainty @16 :Float32;
+ glonassClockSource @17 :UInt8;
+
+ bdsWeek @18 :UInt16;
+ bdsMilliseconds @19 :UInt32;
+ bdsTimeBias @20 :Float32;
+ bdsClockTimeUncertainty @21 :Float32;
+ bdsClockSource @22 :UInt8;
+
+ galWeek @23 :UInt16;
+ galMilliseconds @24 :UInt32;
+ galTimeBias @25 :Float32;
+ galClockTimeUncertainty @26 :Float32;
+ galClockSource @27 :UInt8;
+
+ clockFrequencyBias @28 :Float32;
+ clockFrequencyUncertainty @29 :Float32;
+ frequencySource @30 :UInt8;
+ gpsLeapSeconds @31 :UInt8;
+ gpsLeapSecondsUncertainty @32 :UInt8;
+ gpsLeapSecondsSource @33 :UInt8;
+
+ gpsToGlonassTimeBiasMilliseconds @34 :Float32;
+ gpsToGlonassTimeBiasMillisecondsUncertainty @35 :Float32;
+ gpsToBdsTimeBiasMilliseconds @36 :Float32;
+ gpsToBdsTimeBiasMillisecondsUncertainty @37 :Float32;
+ bdsToGloTimeBiasMilliseconds @38 :Float32;
+ bdsToGloTimeBiasMillisecondsUncertainty @39 :Float32;
+ gpsToGalTimeBiasMilliseconds @40 :Float32;
+ gpsToGalTimeBiasMillisecondsUncertainty @41 :Float32;
+ galToGloTimeBiasMilliseconds @42 :Float32;
+ galToGloTimeBiasMillisecondsUncertainty @43 :Float32;
+ galToBdsTimeBiasMilliseconds @44 :Float32;
+ galToBdsTimeBiasMillisecondsUncertainty @45 :Float32;
+
+ hasRtcTime @46 :Bool;
+ systemRtcTime @47 :UInt32;
+ fCountOffset @48 :UInt32;
+ lpmRtcCount @49 :UInt32;
+ clockResets @50 :UInt32;
+ }
+
+ struct DrMeasurementReport @0x8053c39445c6c75c {
+
+ reason @0 :UInt8;
+ seqNum @1 :UInt8;
+ seqMax @2 :UInt8;
+ rfLoss @3 :UInt16;
+
+ systemRtcValid @4 :Bool;
+ fCount @5 :UInt32;
+ clockResets @6 :UInt32;
+ systemRtcTime @7 :UInt64;
+
+ gpsLeapSeconds @8 :UInt8;
+ gpsLeapSecondsUncertainty @9 :UInt8;
+ gpsToGlonassTimeBiasMilliseconds @10 :Float32;
+ gpsToGlonassTimeBiasMillisecondsUncertainty @11 :Float32;
+
+ gpsWeek @12 :UInt16;
+ gpsMilliseconds @13 :UInt32;
+ gpsTimeBiasMs @14 :UInt32;
+ gpsClockTimeUncertaintyMs @15 :UInt32;
+ gpsClockSource @16 :UInt8;
+
+ glonassClockSource @17 :UInt8;
+ glonassYear @18 :UInt8;
+ glonassDay @19 :UInt16;
+ glonassMilliseconds @20 :UInt32;
+ glonassTimeBias @21 :Float32;
+ glonassClockTimeUncertainty @22 :Float32;
+
+ clockFrequencyBias @23 :Float32;
+ clockFrequencyUncertainty @24 :Float32;
+ frequencySource @25 :UInt8;
+
+ source @26 :MeasurementSource;
+
+ sv @27 :List(SV);
+
+ struct SV @0xf08b81df8cbf459c {
+ svId @0 :UInt8;
+ glonassFrequencyIndex @1 :Int8;
+ observationState @2 :SVObservationState;
+ observations @3 :UInt8;
+ goodObservations @4 :UInt8;
+ filterStages @5 :UInt8;
+ predetectInterval @6 :UInt8;
+ cycleSlipCount @7 :UInt8;
+ postdetections @8 :UInt16;
+
+ measurementStatus @9 :MeasurementStatus;
+
+ carrierNoise @10 :UInt16;
+ rfLoss @11 :UInt16;
+ latency @12 :Int16;
+
+ filteredMeasurementFraction @13 :Float32;
+ filteredMeasurementIntegral @14 :UInt32;
+ filteredTimeUncertainty @15 :Float32;
+ filteredSpeed @16 :Float32;
+ filteredSpeedUncertainty @17 :Float32;
+
+ unfilteredMeasurementFraction @18 :Float32;
+ unfilteredMeasurementIntegral @19 :UInt32;
+ unfilteredTimeUncertainty @20 :Float32;
+ unfilteredSpeed @21 :Float32;
+ unfilteredSpeedUncertainty @22 :Float32;
+
+ multipathEstimate @23 :UInt32;
+ azimuth @24 :Float32;
+ elevation @25 :Float32;
+ dopplerAcceleration @26 :Float32;
+ fineSpeed @27 :Float32;
+ fineSpeedUncertainty @28 :Float32;
+
+ carrierPhase @29 :Float64;
+ fCount @30 :UInt32;
+
+ parityErrorCount @31 :UInt16;
+ goodParity @32 :Bool;
+ }
+ }
+
+ struct DrSvPolyReport @0xb1fb80811a673270 {
+ svId @0 :UInt16;
+ frequencyIndex @1 :Int8;
+
+ hasPosition @2 :Bool;
+ hasIono @3 :Bool;
+ hasTropo @4 :Bool;
+ hasElevation @5 :Bool;
+ polyFromXtra @6 :Bool;
+ hasSbasIono @7 :Bool;
+
+ iode @8 :UInt16;
+ t0 @9 :Float64;
+ xyz0 @10 :List(Float64);
+ xyzN @11 :List(Float64);
+ other @12 :List(Float32);
+
+ positionUncertainty @13 :Float32;
+ ionoDelay @14 :Float32;
+ ionoDot @15 :Float32;
+ sbasIonoDelay @16 :Float32;
+ sbasIonoDot @17 :Float32;
+ tropoDelay @18 :Float32;
+ elevation @19 :Float32;
+ elevationDot @20 :Float32;
+ elevationUncertainty @21 :Float32;
+ velocityCoeff @22 :List(Float64);
+
+ gpsWeek @23 :UInt16;
+ gpsTow @24 :Float64;
+ }
+}
+
+struct Clocks {
+ wallTimeNanos @3 :UInt64; # unix epoch time
+
+ bootTimeNanosDEPRECATED @0 :UInt64;
+ monotonicNanosDEPRECATED @1 :UInt64;
+ monotonicRawNanosDEPRECATD @2 :UInt64;
+ modemUptimeMillisDEPRECATED @4 :UInt64;
+}
+
+struct LiveMpcData {
+ x @0 :List(Float32);
+ y @1 :List(Float32);
+ psi @2 :List(Float32);
+ curvature @3 :List(Float32);
+ qpIterations @4 :UInt32;
+ calculationTime @5 :UInt64;
+ cost @6 :Float64;
+}
+
+struct LiveLongitudinalMpcData {
+ xEgo @0 :List(Float32);
+ vEgo @1 :List(Float32);
+ aEgo @2 :List(Float32);
+ xLead @3 :List(Float32);
+ vLead @4 :List(Float32);
+ aLead @5 :List(Float32);
+ aLeadTau @6 :Float32; # lead accel time constant
+ qpIterations @7 :UInt32;
+ mpcId @8 :UInt32;
+ calculationTime @9 :UInt64;
+ cost @10 :Float64;
+}
+
+struct Joystick {
+ # convenient for debug and live tuning
+ axes @0: List(Float32);
+ buttons @1: List(Bool);
+}
+
+struct DriverStateV2 {
+ frameId @0 :UInt32;
+ modelExecutionTime @1 :Float32;
+ gpuExecutionTime @8 :Float32;
+ rawPredictions @3 :Data;
+
+ wheelOnRightProb @5 :Float32;
+ leftDriverData @6 :DriverData;
+ rightDriverData @7 :DriverData;
+
+ struct DriverData {
+ faceOrientation @0 :List(Float32);
+ faceOrientationStd @1 :List(Float32);
+ facePosition @2 :List(Float32);
+ facePositionStd @3 :List(Float32);
+ faceProb @4 :Float32;
+ leftEyeProb @5 :Float32;
+ rightEyeProb @6 :Float32;
+ leftBlinkProb @7 :Float32;
+ rightBlinkProb @8 :Float32;
+ sunglassesProb @9 :Float32;
+ phoneProb @13 :Float32;
+ notReadyProbDEPRECATED @12 :List(Float32);
+ occludedProbDEPRECATED @10 :Float32;
+ readyProbDEPRECATED @11 :List(Float32);
+ }
+
+ dspExecutionTimeDEPRECATED @2 :Float32;
+ poorVisionProbDEPRECATED @4 :Float32;
+}
+
+struct DriverStateDEPRECATED @0xb83c6cc593ed0a00 {
+ frameId @0 :UInt32;
+ modelExecutionTime @14 :Float32;
+ dspExecutionTime @16 :Float32;
+ rawPredictions @15 :Data;
+
+ faceOrientation @3 :List(Float32);
+ facePosition @4 :List(Float32);
+ faceProb @5 :Float32;
+ leftEyeProb @6 :Float32;
+ rightEyeProb @7 :Float32;
+ leftBlinkProb @8 :Float32;
+ rightBlinkProb @9 :Float32;
+ faceOrientationStd @11 :List(Float32);
+ facePositionStd @12 :List(Float32);
+ sunglassesProb @13 :Float32;
+ poorVision @17 :Float32;
+ partialFace @18 :Float32;
+ distractedPose @19 :Float32;
+ distractedEyes @20 :Float32;
+ eyesOnRoad @21 :Float32;
+ phoneUse @22 :Float32;
+ occludedProb @23 :Float32;
+
+ readyProb @24 :List(Float32);
+ notReadyProb @25 :List(Float32);
+
+ irPwrDEPRECATED @10 :Float32;
+ descriptorDEPRECATED @1 :List(Float32);
+ stdDEPRECATED @2 :Float32;
+}
+
+struct DriverMonitoringState @0xb83cda094a1da284 {
+ events @18 :List(OnroadEvent);
+ faceDetected @1 :Bool;
+ isDistracted @2 :Bool;
+ distractedType @17 :UInt32;
+ awarenessStatus @3 :Float32;
+ posePitchOffset @6 :Float32;
+ posePitchValidCount @7 :UInt32;
+ poseYawOffset @8 :Float32;
+ poseYawValidCount @9 :UInt32;
+ stepChange @10 :Float32;
+ awarenessActive @11 :Float32;
+ awarenessPassive @12 :Float32;
+ isLowStd @13 :Bool;
+ hiStdCount @14 :UInt32;
+ isActiveMode @16 :Bool;
+ isRHD @4 :Bool;
+ uncertainCount @19 :UInt32;
+ phoneProbOffset @20 :Float32;
+ phoneProbValidCount @21 :UInt32;
+
+ isPreviewDEPRECATED @15 :Bool;
+ rhdCheckedDEPRECATED @5 :Bool;
+ eventsDEPRECATED @0 :List(Car.OnroadEventDEPRECATED);
+}
+
+struct Boot {
+ wallTimeNanos @0 :UInt64;
+ pstore @4 :Map(Text, Data);
+ commands @5 :Map(Text, Data);
+ launchLog @3 :Text;
+
+ lastKmsgDEPRECATED @1 :Data;
+ lastPmsgDEPRECATED @2 :Data;
+}
+
+struct LiveParametersData {
+ valid @0 :Bool;
+ gyroBias @1 :Float32;
+ angleOffsetDeg @2 :Float32;
+ angleOffsetAverageDeg @3 :Float32;
+ stiffnessFactor @4 :Float32;
+ steerRatio @5 :Float32;
+ sensorValid @6 :Bool;
+ posenetSpeed @8 :Float32;
+ posenetValid @9 :Bool;
+ angleOffsetFastStd @10 :Float32;
+ angleOffsetAverageStd @11 :Float32;
+ stiffnessFactorStd @12 :Float32;
+ steerRatioStd @13 :Float32;
+ roll @14 :Float32;
+ debugFilterState @16 :FilterState;
+
+ angleOffsetValid @17 :Bool = true;
+ angleOffsetAverageValid @18 :Bool = true;
+ steerRatioValid @19 :Bool = true;
+ stiffnessFactorValid @20 :Bool = true;
+
+ yawRateDEPRECATED @7 :Float32;
+ filterStateDEPRECATED @15 :LiveLocationKalman.Measurement;
+
+ struct FilterState {
+ value @0 : List(Float64);
+ std @1 : List(Float64);
+ }
+}
+
+struct LiveTorqueParametersData {
+ liveValid @0 :Bool;
+ latAccelFactorRaw @1 :Float32;
+ latAccelOffsetRaw @2 :Float32;
+ frictionCoefficientRaw @3 :Float32;
+ latAccelFactorFiltered @4 :Float32;
+ latAccelOffsetFiltered @5 :Float32;
+ frictionCoefficientFiltered @6 :Float32;
+ totalBucketPoints @7 :Float32;
+ decay @8 :Float32;
+ maxResets @9 :Float32;
+ points @10 :List(List(Float32));
+ version @11 :Int32;
+ useParams @12 :Bool;
+ calPerc @13 :Int8;
+}
+
+struct LiveDelayData {
+ lateralDelay @0 :Float32;
+ validBlocks @1 :Int32;
+ status @2 :Status;
+
+ lateralDelayEstimate @3 :Float32;
+ lateralDelayEstimateStd @5 :Float32;
+ points @4 :List(Float32);
+ calPerc @6 :Int8;
+ version @7 :Int32;
+
+ enum Status {
+ unestimated @0;
+ estimated @1;
+ invalid @2;
+ }
+}
+
+struct LiveMapDataDEPRECATED {
+ speedLimitValid @0 :Bool;
+ speedLimit @1 :Float32;
+ speedAdvisoryValid @12 :Bool;
+ speedAdvisory @13 :Float32;
+ speedLimitAheadValid @14 :Bool;
+ speedLimitAhead @15 :Float32;
+ speedLimitAheadDistance @16 :Float32;
+ curvatureValid @2 :Bool;
+ curvature @3 :Float32;
+ wayId @4 :UInt64;
+ roadX @5 :List(Float32);
+ roadY @6 :List(Float32);
+ lastGps @7: GpsLocationData;
+ roadCurvatureX @8 :List(Float32);
+ roadCurvature @9 :List(Float32);
+ distToTurn @10 :Float32;
+ mapValid @11 :Bool;
+}
+
+struct CameraOdometry {
+ frameId @4 :UInt32;
+ timestampEof @5 :UInt64;
+ trans @0 :List(Float32); # m/s in device frame
+ rot @1 :List(Float32); # rad/s in device frame
+ transStd @2 :List(Float32); # std m/s in device frame
+ rotStd @3 :List(Float32); # std rad/s in device frame
+ wideFromDeviceEuler @6 :List(Float32);
+ wideFromDeviceEulerStd @7 :List(Float32);
+ roadTransformTrans @8 :List(Float32);
+ roadTransformTransStd @9 :List(Float32);
+}
+
+struct Sentinel {
+ enum SentinelType {
+ endOfSegment @0;
+ endOfRoute @1;
+ startOfSegment @2;
+ startOfRoute @3;
+ }
+ type @0 :SentinelType;
+ signal @1 :Int32;
+}
+
+struct UIDebug {
+ drawTimeMillis @0 :Float32;
+}
+
+struct ManagerState {
+ processes @0 :List(ProcessState);
+
+ struct ProcessState {
+ name @0 :Text;
+ pid @1 :Int32;
+ running @2 :Bool;
+ shouldBeRunning @4 :Bool;
+ exitCode @3 :Int32;
+ }
+}
+
+struct UploaderState {
+ immediateQueueSize @0 :UInt32;
+ immediateQueueCount @1 :UInt32;
+ rawQueueSize @2 :UInt32;
+ rawQueueCount @3 :UInt32;
+
+ # stats for last successfully uploaded file
+ lastTime @4 :Float32; # s
+ lastSpeed @5 :Float32; # MB/s
+ lastFilename @6 :Text;
+}
+
+struct NavInstruction {
+ maneuverPrimaryText @0 :Text;
+ maneuverSecondaryText @1 :Text;
+ maneuverDistance @2 :Float32; # m
+ maneuverType @3 :Text; # TODO: Make Enum
+ maneuverModifier @4 :Text; # TODO: Make Enum
+
+ distanceRemaining @5 :Float32; # m
+ timeRemaining @6 :Float32; # s
+ timeRemainingTypical @7 :Float32; # s
+
+ lanes @8 :List(Lane);
+ showFull @9 :Bool;
+
+ speedLimit @10 :Float32; # m/s
+ speedLimitSign @11 :SpeedLimitSign;
+
+ allManeuvers @12 :List(Maneuver);
+
+ struct Lane {
+ directions @0 :List(Direction);
+ active @1 :Bool;
+ activeDirection @2 :Direction;
+ }
+
+ enum Direction {
+ none @0;
+ left @1;
+ right @2;
+ straight @3;
+ slightLeft @4;
+ slightRight @5;
+ }
+
+ enum SpeedLimitSign {
+ mutcd @0; # US Style
+ vienna @1; # EU Style
+ }
+
+ struct Maneuver {
+ distance @0 :Float32;
+ type @1 :Text;
+ modifier @2 :Text;
+ }
+}
+
+struct NavRoute {
+ coordinates @0 :List(Coordinate);
+
+ struct Coordinate {
+ latitude @0 :Float32;
+ longitude @1 :Float32;
+ }
+}
+
+struct MapRenderState {
+ locationMonoTime @0 :UInt64;
+ renderTime @1 :Float32;
+ frameId @2: UInt32;
+}
+
+struct NavModelData {
+ frameId @0 :UInt32;
+ locationMonoTime @6 :UInt64;
+ modelExecutionTime @1 :Float32;
+ dspExecutionTime @2 :Float32;
+ features @3 :List(Float32);
+ # predicted future position
+ position @4 :XYData;
+ desirePrediction @5 :List(Float32);
+
+ # All SI units and in device frame
+ struct XYData {
+ x @0 :List(Float32);
+ y @1 :List(Float32);
+ xStd @2 :List(Float32);
+ yStd @3 :List(Float32);
+ }
+}
+
+struct EncodeData {
+ idx @0 :EncodeIndex;
+ data @1 :Data;
+ header @2 :Data;
+ unixTimestampNanos @3 :UInt64;
+ width @4 :UInt32;
+ height @5 :UInt32;
+}
+
+struct DebugAlert {
+ alertText1 @0 :Text;
+ alertText2 @1 :Text;
+}
+
+struct UserBookmark @0xfe346a9de48d9b50 {
+}
+
+struct SoundPressure @0xdc24138990726023 {
+ soundPressure @0 :Float32;
+
+ # uncalibrated, A-weighted
+ soundPressureWeighted @3 :Float32;
+ soundPressureWeightedDb @1 :Float32;
+
+ filteredSoundPressureWeightedDbDEPRECATED @2 :Float32;
+}
+
+struct AudioData {
+ data @0 :Data;
+ sampleRate @1 :UInt32;
+}
+
+struct AudioFeedback {
+ audio @0 :AudioData;
+ blockNum @1 :UInt16;
+}
+
+struct Touch {
+ sec @0 :Int64;
+ usec @1 :Int64;
+ type @2 :UInt8;
+ code @3 :Int32;
+ value @4 :Int32;
+}
+
+struct Event {
+ logMonoTime @0 :UInt64; # nanoseconds
+ valid @67 :Bool = true;
+
+ union {
+ # *********** log metadata ***********
+ initData @1 :InitData;
+ sentinel @73 :Sentinel;
+
+ # *********** bootlog ***********
+ boot @60 :Boot;
+
+ # ********** openpilot daemon msgs **********
+ gpsNMEA @3 :GPSNMEAData;
+ can @5 :List(CanData);
+ controlsState @7 :ControlsState;
+ selfdriveState @130 :SelfdriveState;
+ gyroscope @99 :SensorEventData;
+ accelerometer @98 :SensorEventData;
+ magnetometer @95 :SensorEventData;
+ lightSensor @96 :SensorEventData;
+ temperatureSensor @97 :SensorEventData;
+ pandaStates @81 :List(PandaState);
+ peripheralState @80 :PeripheralState;
+ radarState @13 :RadarState;
+ liveTracks @131 :Car.RadarData;
+ sendcan @17 :List(CanData);
+ liveCalibration @19 :LiveCalibrationData;
+ carState @22 :Car.CarState;
+ carControl @23 :Car.CarControl;
+ carOutput @127 :Car.CarOutput;
+ longitudinalPlan @24 :LongitudinalPlan;
+ lateralManeuverPlan @162 :LateralManeuverPlan;
+ driverAssistance @132 :DriverAssistance;
+ ubloxGnss @34 :UbloxGnss;
+ ubloxRaw @39 :Data;
+ qcomGnss @31 :QcomGnss;
+ gpsLocationExternal @48 :GpsLocationData;
+ gpsLocation @21 :GpsLocationData;
+ gnssMeasurements @91 :GnssMeasurements;
+ liveParameters @61 :LiveParametersData;
+ liveTorqueParameters @94 :LiveTorqueParametersData;
+ liveDelay @146 : LiveDelayData;
+ cameraOdometry @63 :CameraOdometry;
+ thumbnail @66: Thumbnail;
+ onroadEvents @134: List(OnroadEvent);
+ carParams @69: Car.CarParams;
+ driverMonitoringState @71: DriverMonitoringState;
+ livePose @129 :LivePose;
+ modelV2 @75 :ModelDataV2;
+ drivingModelData @128 :DrivingModelData;
+ driverStateV2 @92 :DriverStateV2;
+
+ # camera stuff, each camera state has a matching encode idx
+ roadCameraState @2 :FrameData;
+ driverCameraState @70: FrameData;
+ wideRoadCameraState @74: FrameData;
+ roadEncodeIdx @15 :EncodeIndex;
+ driverEncodeIdx @76 :EncodeIndex;
+ wideRoadEncodeIdx @77 :EncodeIndex;
+ qRoadEncodeIdx @90 :EncodeIndex;
+
+ livestreamRoadEncodeIdx @117 :EncodeIndex;
+ livestreamWideRoadEncodeIdx @118 :EncodeIndex;
+ livestreamDriverEncodeIdx @119 :EncodeIndex;
+
+ # microphone data
+ soundPressure @103 :SoundPressure;
+ rawAudioData @147 :AudioData;
+ webrtcAudioData @152 :AudioData;
+
+ # systems stuff
+ androidLog @20 :AndroidLogEntry;
+ managerState @78 :ManagerState;
+ uploaderState @79 :UploaderState;
+ procLog @33 :ProcLog;
+ clocks @35 :Clocks;
+ deviceState @6 :DeviceState;
+ logMessage @18 :Text;
+ errorLogMessage @85 :Text;
+
+ # touch frame
+ touch @135 :List(Touch);
+
+ # navigation
+ navInstruction @82 :NavInstruction;
+ navRoute @83 :NavRoute;
+ navThumbnail @84: Thumbnail;
+ mapRenderState @105: MapRenderState;
+
+ # UI services
+ uiDebug @102 :UIDebug;
+
+ # driving feedback
+ userBookmark @93 :UserBookmark;
+ bookmarkButton @148 :UserBookmark;
+ audioFeedback @149 :AudioFeedback;
+
+ # *********** debug ***********
+ testJoystick @52 :Joystick;
+ roadEncodeData @86 :EncodeData;
+ driverEncodeData @87 :EncodeData;
+ wideRoadEncodeData @88 :EncodeData;
+ qRoadEncodeData @89 :EncodeData;
+ alertDebug @133 :DebugAlert;
+
+ livestreamRoadEncodeData @120 :EncodeData;
+ livestreamWideRoadEncodeData @121 :EncodeData;
+ livestreamDriverEncodeData @122 :EncodeData;
+
+ # *********** Custom: reserved for forks ***********
+
+ # DO change the name of the field
+ # DON'T change anything after the "@"
+ customReservedRawData0 @124 :Data;
+ customReservedRawData1 @125 :Data;
+ customReservedRawData2 @126 :Data;
+
+ # DO change the name of the field and struct
+ # DON'T change the ID (e.g. @107)
+ # DON'T change which struct it points to
+ customReservedState107 @107 :Custom.IQState;
+ customReservedModelManager108 @108 :Custom.IQModelManager;
+ customReservedPlan109 @109 :Custom.IQPlan;
+ customReservedEvents110 @110 :Custom.IQOnroadEvent;
+ customReservedCarParams111 @111 :Custom.IQCarParams;
+ customReservedCarControl112 @112 :Custom.IQCarControl;
+ customReservedBackupManager113 @113 :Custom.IQBackupManager;
+ customReservedCarState114 @114 :Custom.IQCarState;
+ customReservedLiveData115 @115 :Custom.IQLiveData;
+ customReservedDriveModel116 @116 :Custom.IQDriveModelData;
+ backupManagerK3 @151 :Custom.IQBackupManager;
+ iqNavState @150 :Custom.IQNavState;
+ iqState @153 :Custom.IQState;
+ iqModelManager @154 :Custom.IQModelManager;
+ iqPlan @155 :Custom.IQPlan;
+ iqOnroadEvents @156 :Custom.IQOnroadEvent;
+ iqCarParams @157 :Custom.IQCarParams;
+ iqCarControl @158 :Custom.IQCarControl;
+ iqCarState @159 :Custom.IQCarState;
+ iqLiveData @160 :Custom.IQLiveData;
+ iqDriveModelData @161 :Custom.IQDriveModelData;
+ iqNavRenderState @163 :Custom.IQNavRenderState;
+ iqLiveLocation @164 :Custom.IQLiveLocation;
+ iqPerfTrace @136 :Custom.IQPerfTrace;
+ iqConstructionZone @137 :Custom.IQConstructionZone;
+ iqVehicleTracks @138 :Custom.IQVehicleTracks;
+ iqEnvironment @139 :Custom.IQEnvironment;
+ customReserved14 @140 :Custom.CustomReserved14;
+ customReserved15 @141 :Custom.CustomReserved15;
+ customReserved16 @142 :Custom.CustomReserved16;
+ mapdExtendedOut @143 :Custom.MapdExtendedOut;
+ mapdIn @144 :Custom.MapdIn;
+ mapdOut @145 :Custom.MapdOut;
+
+ # *********** legacy + deprecated ***********
+ model @9 :Legacy.ModelData; # TODO: rename modelV2 and mark this as deprecated
+ liveMpcDEPRECATED @36 :LiveMpcData;
+ liveLongitudinalMpcDEPRECATED @37 :LiveLongitudinalMpcData;
+ liveLocationKalmanLegacyDEPRECATED @51 :Legacy.LiveLocationData;
+ orbslamCorrectionDEPRECATED @45 :Legacy.OrbslamCorrection;
+ liveUIDEPRECATED @14 :Legacy.LiveUI;
+ sensorEventDEPRECATED @4 :SensorEventData;
+ liveEventDEPRECATED @8 :List(Legacy.LiveEventData);
+ liveLocationDEPRECATED @25 :Legacy.LiveLocationData;
+ ethernetDataDEPRECATED @26 :List(Legacy.EthernetPacket);
+ cellInfoDEPRECATED @28 :List(Legacy.CellInfo);
+ wifiScanDEPRECATED @29 :List(Legacy.WifiScan);
+ uiNavigationEventDEPRECATED @50 :Legacy.UiNavigationEvent;
+ liveMapDataDEPRECATED @62 :LiveMapDataDEPRECATED;
+ gpsPlannerPointsDEPRECATED @40 :Legacy.GPSPlannerPoints;
+ gpsPlannerPlanDEPRECATED @41 :Legacy.GPSPlannerPlan;
+ applanixRawDEPRECATED @42 :Data;
+ androidGnssDEPRECATED @30 :Legacy.AndroidGnss;
+ lidarPtsDEPRECATED @32 :Legacy.LidarPts;
+ navStatusDEPRECATED @38 :Legacy.NavStatus;
+ trafficEventsDEPRECATED @43 :List(Legacy.TrafficEvent);
+ liveLocationTimingDEPRECATED @44 :Legacy.LiveLocationData;
+ liveLocationCorrectedDEPRECATED @46 :Legacy.LiveLocationData;
+ navUpdateDEPRECATED @27 :Legacy.NavUpdate;
+ orbObservationDEPRECATED @47 :List(Legacy.OrbObservation);
+ locationDEPRECATED @49 :Legacy.LiveLocationData;
+ orbOdometryDEPRECATED @53 :Legacy.OrbOdometry;
+ orbFeaturesDEPRECATED @54 :Legacy.OrbFeatures;
+ applanixLocationDEPRECATED @55 :Legacy.LiveLocationData;
+ orbKeyFrameDEPRECATED @56 :Legacy.OrbKeyFrame;
+ orbFeaturesSummaryDEPRECATED @58 :Legacy.OrbFeaturesSummary;
+ featuresDEPRECATED @10 :Legacy.CalibrationFeatures;
+ kalmanOdometryDEPRECATED @65 :Legacy.KalmanOdometry;
+ uiLayoutStateDEPRECATED @57 :Legacy.UiLayoutState;
+ pandaStateDEPRECATED @12 :PandaState;
+ driverStateDEPRECATED @59 :DriverStateDEPRECATED;
+ sensorEventsDEPRECATED @11 :List(SensorEventData);
+ lateralPlanDEPRECATED @64 :LateralPlan;
+ navModelDEPRECATED @104 :NavModelData;
+ uiPlanDEPRECATED @106 :UiPlan;
+ liveLocationKalman @72 :LiveLocationKalman;
+ liveTracksDEPRECATED @16 :List(LiveTracksDEPRECATED);
+ onroadEventsDEPRECATED @68: List(Car.OnroadEventDEPRECATED);
+ gyroscope2DEPRECATED @100 :SensorEventData;
+ accelerometer2DEPRECATED @101 :SensorEventData;
+ temperatureSensor2DEPRECATED @123 :SensorEventData;
+ }
+}
diff --git a/cereal/messaging/__init__.py b/cereal/messaging/__init__.py
new file mode 100644
index 000000000..2c925b4cc
--- /dev/null
+++ b/cereal/messaging/__init__.py
@@ -0,0 +1,269 @@
+# must be built with scons
+from msgq import fake_event_handle, drain_sock_raw, MultiplePublishersError, IpcError, \
+ Context, Poller, SubSocket, PubSocket, SocketEventHandle, toggle_fake_events, \
+ set_fake_prefix, get_fake_prefix, delete_fake_prefix, wait_for_one_event
+import msgq
+import os
+import capnp
+import time
+
+from typing import Optional, List, Union, Dict
+
+from cereal import log
+from cereal.services import SERVICE_LIST
+from openpilot.common.utils import MovingAverage
+
+NO_TRAVERSAL_LIMIT = 2**64-1
+
+
+def pub_sock(endpoint: str) -> PubSocket:
+ service = SERVICE_LIST.get(endpoint)
+ segment_size = service.queue_size if service else 0
+ return msgq.pub_sock(endpoint, segment_size)
+
+
+def sub_sock(endpoint: str, poller: Optional[Poller] = None, addr: str = "127.0.0.1",
+ conflate: bool = False, timeout: Optional[int] = None) -> SubSocket:
+ service = SERVICE_LIST.get(endpoint)
+ segment_size = service.queue_size if service else 0
+ return msgq.sub_sock(endpoint, poller=poller, addr=addr, conflate=conflate,
+ timeout=timeout, segment_size=segment_size)
+
+
+def reset_context():
+ msgq.context = Context()
+
+
+def log_from_bytes(dat: bytes, struct: capnp.lib.capnp._StructModule = log.Event) -> capnp.lib.capnp._DynamicStructReader:
+ with struct.from_bytes(dat, traversal_limit_in_words=NO_TRAVERSAL_LIMIT) as msg:
+ return msg
+
+
+def new_message(service: Optional[str], size: Optional[int] = None, **kwargs) -> capnp.lib.capnp._DynamicStructBuilder:
+ args = {
+ 'valid': False,
+ 'logMonoTime': int(time.monotonic() * 1e9),
+ **kwargs
+ }
+ dat = log.Event.new_message(**args)
+ if service is not None:
+ if size is None:
+ dat.init(service)
+ else:
+ dat.init(service, size)
+ return dat
+
+
+def drain_sock(sock: SubSocket, wait_for_one: bool = False) -> List[capnp.lib.capnp._DynamicStructReader]:
+ """Receive all message currently available on the queue"""
+ msgs = drain_sock_raw(sock, wait_for_one=wait_for_one)
+ return [log_from_bytes(m) for m in msgs]
+
+
+# TODO: print when we drop packets?
+def recv_sock(sock: SubSocket, wait: bool = False) -> Optional[capnp.lib.capnp._DynamicStructReader]:
+ """Same as drain sock, but only returns latest message. Consider using conflate instead."""
+ dat = None
+
+ while 1:
+ if wait and dat is None:
+ recv = sock.receive()
+ else:
+ recv = sock.receive(non_blocking=True)
+
+ if recv is None: # Timeout hit
+ break
+
+ dat = recv
+
+ if dat is not None:
+ dat = log_from_bytes(dat)
+
+ return dat
+
+
+def recv_one(sock: SubSocket) -> Optional[capnp.lib.capnp._DynamicStructReader]:
+ dat = sock.receive()
+ if dat is not None:
+ dat = log_from_bytes(dat)
+ return dat
+
+
+def recv_one_or_none(sock: SubSocket) -> Optional[capnp.lib.capnp._DynamicStructReader]:
+ dat = sock.receive(non_blocking=True)
+ if dat is not None:
+ dat = log_from_bytes(dat)
+ return dat
+
+
+def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
+ """Keep receiving until we get a message"""
+ while True:
+ dat = sock.receive()
+ if dat is not None:
+ return log_from_bytes(dat)
+
+
+class FrequencyTracker:
+ def __init__(self, service_freq: float, update_freq: float, is_poll: bool):
+ freq = max(min(service_freq, update_freq), 1.)
+ if is_poll:
+ min_freq = max_freq = freq
+ else:
+ max_freq = min(freq, update_freq)
+ if service_freq >= 2 * update_freq:
+ min_freq = update_freq
+ elif update_freq >= 2* service_freq:
+ min_freq = freq
+ else:
+ min_freq = min(freq, freq / 2.)
+
+ self.min_freq = min_freq * 0.8
+ self.max_freq = max_freq * 1.2
+ self.avg_dt = MovingAverage(int(10 * freq))
+ self.recent_avg_dt = MovingAverage(int(freq))
+ self.prev_time = 0.0
+
+ def record_recv_time(self, cur_time: float) -> None:
+ # TODO: Handle case where cur_time is less than prev_time
+ if self.prev_time > 1e-5:
+ dt = cur_time - self.prev_time
+
+ self.avg_dt.add_value(dt)
+ self.recent_avg_dt.add_value(dt)
+
+ self.prev_time = cur_time
+
+ @property
+ def valid(self) -> bool:
+ if self.avg_dt.count == 0:
+ return False
+
+ avg_freq = 1.0 / self.avg_dt.get_average()
+ if self.min_freq <= avg_freq <= self.max_freq:
+ return True
+
+ avg_freq_recent = 1.0 / self.recent_avg_dt.get_average()
+ return self.min_freq <= avg_freq_recent <= self.max_freq
+
+
+class SubMaster:
+ def __init__(self, services: List[str], poll: Optional[str] = None,
+ ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None,
+ ignore_valid: Optional[List[str]] = None, addr: str = "127.0.0.1", frequency: Optional[float] = None):
+ self.frame = -1
+ self.services = services
+ self.seen = {s: False for s in services}
+ self.updated = {s: False for s in services}
+ self.recv_time = {s: 0. for s in services}
+ self.recv_frame = {s: 0 for s in services}
+ self.sock = {}
+ self.data = {}
+ self.logMonoTime = {s: 0 for s in services}
+
+ # zero-frequency / on-demand services are always alive and presumed valid; all others must pass checks
+ on_demand = {s: SERVICE_LIST[s].frequency <= 1e-5 for s in services}
+ self.static_freq_services = set(s for s in services if not on_demand[s])
+ self.alive = {s: on_demand[s] for s in services}
+ self.freq_ok = {s: on_demand[s] for s in services}
+ self.valid = {s: on_demand[s] for s in services}
+
+ self.freq_tracker: Dict[str, FrequencyTracker] = {}
+ self.poller = Poller()
+ polled_services = set([poll, ] if poll is not None else services)
+ self.non_polled_services = set(services) - polled_services
+
+ self.ignore_average_freq = [] if ignore_avg_freq is None else ignore_avg_freq
+ self.ignore_alive = [] if ignore_alive is None else ignore_alive
+ self.ignore_valid = [] if ignore_valid is None else ignore_valid
+
+ self.simulation = bool(int(os.getenv("SIMULATION", "0")))
+
+ # if freq and poll aren't specified, assume the max to be conservative
+ assert frequency is None or poll is None, "Do not specify 'frequency' - frequency of the polled service will be used."
+ self.update_freq = frequency or max([SERVICE_LIST[s].frequency for s in polled_services])
+
+ for s in services:
+ p = self.poller if s not in self.non_polled_services else None
+ self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True)
+
+ try:
+ data = new_message(s)
+ except capnp.lib.capnp.KjException:
+ data = new_message(s, 0) # lists
+
+ self.data[s] = getattr(data.as_reader(), s)
+ self.freq_tracker[s] = FrequencyTracker(SERVICE_LIST[s].frequency, self.update_freq, s == poll)
+
+ def __getitem__(self, s: str) -> capnp.lib.capnp._DynamicStructReader:
+ return self.data[s]
+
+ def _check_avg_freq(self, s: str) -> bool:
+ return SERVICE_LIST[s].frequency > 0.99 and (s not in self.ignore_average_freq) and (s not in self.ignore_alive)
+
+ def update(self, timeout: int = 100) -> None:
+ msgs = []
+ for sock in self.poller.poll(timeout):
+ msgs.append(recv_one_or_none(sock))
+
+ # non-blocking receive for non-polled sockets
+ for s in self.non_polled_services:
+ msgs.append(recv_one_or_none(self.sock[s]))
+ self.update_msgs(time.monotonic(), msgs)
+
+ def update_msgs(self, cur_time: float, msgs: List[capnp.lib.capnp._DynamicStructReader]) -> None:
+ self.frame += 1
+ self.updated = dict.fromkeys(self.services, False)
+ for msg in msgs:
+ if msg is None:
+ continue
+
+ s = msg.which()
+ self.seen[s] = True
+ self.updated[s] = True
+
+ self.freq_tracker[s].record_recv_time(cur_time)
+ self.recv_time[s] = cur_time
+ self.recv_frame[s] = self.frame
+ self.data[s] = getattr(msg, s)
+ self.logMonoTime[s] = msg.logMonoTime
+ self.valid[s] = msg.valid
+
+ for s in self.static_freq_services:
+ # alive if delay is within 10x the expected frequency; checks relaxed in simulator
+ self.alive[s] = (cur_time - self.recv_time[s]) < (10. / SERVICE_LIST[s].frequency) or (self.seen[s] and self.simulation)
+ self.freq_ok[s] = self.freq_tracker[s].valid or self.simulation
+
+ def all_alive(self, service_list: Optional[List[str]] = None) -> bool:
+ return all(self.alive[s] for s in (service_list or self.services) if s not in self.ignore_alive)
+
+ def all_freq_ok(self, service_list: Optional[List[str]] = None) -> bool:
+ return all(self.freq_ok[s] for s in (service_list or self.services) if self._check_avg_freq(s))
+
+ def all_valid(self, service_list: Optional[List[str]] = None) -> bool:
+ return all(self.valid[s] for s in (service_list or self.services) if s not in self.ignore_valid)
+
+ def all_checks(self, service_list: Optional[List[str]] = None) -> bool:
+ return self.all_alive(service_list) and self.all_freq_ok(service_list) and self.all_valid(service_list)
+
+
+class PubMaster:
+ def __init__(self, services: List[str]):
+ self.sock = {}
+ for s in services:
+ self.sock[s] = pub_sock(s)
+
+ def send(self, s: str, dat: Union[bytes, capnp.lib.capnp._DynamicStructBuilder]) -> None:
+ if not isinstance(dat, bytes):
+ dat = dat.to_bytes()
+ self.sock[s].send(dat)
+
+ def wait_for_readers_to_update(self, s: str, timeout: int, dt: float = 0.05) -> bool:
+ for _ in range(int(timeout*(1./dt))):
+ if self.sock[s].all_readers_updated():
+ return True
+ time.sleep(dt)
+ return False
+
+ def all_readers_updated(self, s: str) -> bool:
+ return self.sock[s].all_readers_updated() # type: ignore
diff --git a/cereal/messaging/bridge b/cereal/messaging/bridge
new file mode 100755
index 000000000..ea2573d19
Binary files /dev/null and b/cereal/messaging/bridge differ
diff --git a/cereal/messaging/tests/__init__.py b/cereal/messaging/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/cereal/messaging/tests/test_messaging.py b/cereal/messaging/tests/test_messaging.py
new file mode 100644
index 000000000..583eb8b0d
--- /dev/null
+++ b/cereal/messaging/tests/test_messaging.py
@@ -0,0 +1,185 @@
+import os
+import capnp
+import multiprocessing
+import numbers
+import random
+import threading
+import time
+from parameterized import parameterized
+import pytest
+
+from cereal import log, car
+import cereal.messaging as messaging
+from cereal.services import SERVICE_LIST
+
+events = [evt for evt in log.Event.schema.union_fields if evt in SERVICE_LIST.keys()]
+
+def random_sock():
+ return random.choice(events)
+
+def random_socks(num_socks=10):
+ return list({random_sock() for _ in range(num_socks)})
+
+def random_bytes(length=1000):
+ return bytes([random.randrange(0xFF) for _ in range(length)])
+
+def zmq_sleep(t=1):
+ if "ZMQ" in os.environ:
+ time.sleep(t)
+
+
+# TODO: this should take any capnp struct and returrn a msg with random populated data
+def random_carstate():
+ fields = ["vEgo", "aEgo", "brake", "steeringAngleDeg"]
+ msg = messaging.new_message("carState")
+ cs = msg.carState
+ for f in fields:
+ setattr(cs, f, random.random() * 10)
+ return msg
+
+# TODO: this should compare any capnp structs
+def assert_carstate(cs1, cs2):
+ for f in car.CarState.schema.non_union_fields:
+ # TODO: check all types
+ val1, val2 = getattr(cs1, f), getattr(cs2, f)
+ if isinstance(val1, numbers.Number):
+ assert val1 == val2, f"{f}: sent '{val1}' vs recvd '{val2}'"
+
+def delayed_send(delay, sock, dat):
+ def send_func():
+ sock.send(dat)
+ threading.Timer(delay, send_func).start()
+
+
+class TestMessaging:
+ def setUp(self):
+ # TODO: ZMQ tests are too slow; all sleeps will need to be
+ # replaced with logic to block on the necessary condition
+ if "ZMQ" in os.environ:
+ pytest.skip()
+
+ # ZMQ pub socket takes too long to die
+ # sleep to prevent multiple publishers error between tests
+ zmq_sleep()
+
+ @parameterized.expand(events)
+ def test_new_message(self, evt):
+ try:
+ msg = messaging.new_message(evt)
+ except capnp.lib.capnp.KjException:
+ msg = messaging.new_message(evt, random.randrange(200))
+ assert (time.monotonic() - msg.logMonoTime) < 0.1
+ assert not msg.valid
+ assert evt == msg.which()
+
+ @parameterized.expand(events)
+ def test_pub_sock(self, evt):
+ messaging.pub_sock(evt)
+
+ @parameterized.expand(events)
+ def test_sub_sock(self, evt):
+ messaging.sub_sock(evt)
+
+ @parameterized.expand([
+ (messaging.drain_sock, capnp._DynamicStructReader),
+ (messaging.drain_sock_raw, bytes),
+ ])
+ def test_drain_sock(self, func, expected_type):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sub_sock = messaging.sub_sock(sock, timeout=1000)
+ zmq_sleep()
+
+ # no wait and no msgs in queue
+ msgs = func(sub_sock)
+ assert isinstance(msgs, list)
+ assert len(msgs) == 0
+
+ # no wait but msgs are queued up
+ num_msgs = random.randrange(3, 10)
+ for _ in range(num_msgs):
+ pub_sock.send(messaging.new_message(sock).to_bytes())
+ time.sleep(0.1)
+ msgs = func(sub_sock)
+ assert isinstance(msgs, list)
+ assert all(isinstance(msg, expected_type) for msg in msgs)
+ assert len(msgs) == num_msgs
+
+ def test_recv_sock(self):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sub_sock = messaging.sub_sock(sock, timeout=100)
+ zmq_sleep()
+
+ # no wait and no msg in queue, socket should timeout
+ recvd = messaging.recv_sock(sub_sock)
+ assert recvd is None
+
+ # no wait and one msg in queue
+ msg = random_carstate()
+ pub_sock.send(msg.to_bytes())
+ time.sleep(0.01)
+ recvd = messaging.recv_sock(sub_sock)
+ assert isinstance(recvd, capnp._DynamicStructReader)
+ # https://github.com/python/mypy/issues/13038
+ assert_carstate(msg.carState, recvd.carState)
+
+ def test_recv_one(self):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sub_sock = messaging.sub_sock(sock, timeout=1000)
+ zmq_sleep()
+
+ # no msg in queue, socket should timeout
+ recvd = messaging.recv_one(sub_sock)
+ assert recvd is None
+
+ # one msg in queue
+ msg = random_carstate()
+ pub_sock.send(msg.to_bytes())
+ recvd = messaging.recv_one(sub_sock)
+ assert isinstance(recvd, capnp._DynamicStructReader)
+ assert_carstate(msg.carState, recvd.carState)
+
+ @pytest.mark.xfail(condition="ZMQ" in os.environ, reason='ZMQ detected')
+ def test_recv_one_or_none(self):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sub_sock = messaging.sub_sock(sock)
+ zmq_sleep()
+
+ # no msg in queue, socket shouldn't block
+ recvd = messaging.recv_one_or_none(sub_sock)
+ assert recvd is None
+
+ # one msg in queue
+ msg = random_carstate()
+ pub_sock.send(msg.to_bytes())
+ recvd = messaging.recv_one_or_none(sub_sock)
+ assert isinstance(recvd, capnp._DynamicStructReader)
+ assert_carstate(msg.carState, recvd.carState)
+
+ def test_recv_one_retry(self):
+ sock = "carState"
+ sock_timeout = 0.1
+ pub_sock = messaging.pub_sock(sock)
+ sub_sock = messaging.sub_sock(sock, timeout=round(sock_timeout*1000))
+ zmq_sleep()
+
+ # this test doesn't work with ZMQ since multiprocessing interrupts it
+ if "ZMQ" not in os.environ:
+ # wait 5 socket timeouts and make sure it's still retrying
+ p = multiprocessing.Process(target=messaging.recv_one_retry, args=(sub_sock,))
+ p.start()
+ time.sleep(sock_timeout*5)
+ assert p.is_alive()
+ p.terminate()
+
+ # wait 5 socket timeouts before sending
+ msg = random_carstate()
+ start_time = time.monotonic()
+ delayed_send(sock_timeout*5, pub_sock, msg.to_bytes())
+ recvd = messaging.recv_one_retry(sub_sock)
+ assert (time.monotonic() - start_time) >= sock_timeout*5
+ assert isinstance(recvd, capnp._DynamicStructReader)
+ assert_carstate(msg.carState, recvd.carState)
diff --git a/cereal/messaging/tests/test_pub_sub_master.py b/cereal/messaging/tests/test_pub_sub_master.py
new file mode 100644
index 000000000..5e26b4970
--- /dev/null
+++ b/cereal/messaging/tests/test_pub_sub_master.py
@@ -0,0 +1,160 @@
+import random
+import time
+from typing import Sized, cast
+
+import cereal.messaging as messaging
+from cereal.messaging.tests.test_messaging import events, random_sock, random_socks, \
+ random_bytes, random_carstate, assert_carstate, \
+ zmq_sleep
+from cereal.services import SERVICE_LIST
+
+
+class TestSubMaster:
+
+ def setup_method(self):
+ # ZMQ pub socket takes too long to die
+ # sleep to prevent multiple publishers error between tests
+ zmq_sleep(3)
+
+ def test_init(self):
+ sm = messaging.SubMaster(events)
+ for p in [sm.updated, sm.recv_time, sm.recv_frame, sm.alive,
+ sm.sock, sm.data, sm.logMonoTime, sm.valid]:
+ assert len(cast(Sized, p)) == len(events)
+
+ def test_init_state(self):
+ socks = random_socks()
+ sm = messaging.SubMaster(socks)
+ assert sm.frame == -1
+ assert not any(sm.updated.values())
+ assert not any(sm.seen.values())
+ on_demand = {s: SERVICE_LIST[s].frequency <= 1e-5 for s in sm.services}
+ assert all(sm.alive[s] == sm.valid[s] == sm.freq_ok[s] == on_demand[s] for s in sm.services)
+ assert all(t == 0. for t in sm.recv_time.values())
+ assert all(f == 0 for f in sm.recv_frame.values())
+ assert all(t == 0 for t in sm.logMonoTime.values())
+
+ for p in [sm.updated, sm.recv_time, sm.recv_frame, sm.alive,
+ sm.sock, sm.data, sm.logMonoTime, sm.valid]:
+ assert len(cast(Sized, p)) == len(socks)
+
+ def test_getitem(self):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sm = messaging.SubMaster([sock,])
+ zmq_sleep()
+
+ msg = random_carstate()
+ pub_sock.send(msg.to_bytes())
+ sm.update(1000)
+ assert_carstate(msg.carState, sm[sock])
+
+ # TODO: break this test up to individually test SubMaster.update and SubMaster.update_msgs
+ def test_update(self):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sm = messaging.SubMaster([sock,])
+ zmq_sleep()
+
+ for i in range(10):
+ msg = messaging.new_message(sock)
+ pub_sock.send(msg.to_bytes())
+ sm.update(1000)
+ assert sm.frame == i
+ assert all(sm.updated.values())
+
+ def test_update_timeout(self):
+ sock = random_sock()
+ sm = messaging.SubMaster([sock,])
+ timeout = random.randrange(1000, 3000)
+ start_time = time.monotonic()
+ sm.update(timeout)
+ t = time.monotonic() - start_time
+ assert t >= timeout/1000.
+ assert t < 3
+ assert not any(sm.updated.values())
+
+ def test_avg_frequency_checks(self):
+ for poll in (True, False):
+ sm = messaging.SubMaster(["modelV2", "carParams", "carState", "cameraOdometry", "liveCalibration"],
+ poll=("modelV2" if poll else None),
+ frequency=(20. if not poll else None))
+
+ checks = {
+ "carState": (20, 20),
+ "modelV2": (20, 20 if poll else 10),
+ "cameraOdometry": (20, 10),
+ "liveCalibration": (4, 4),
+ "carParams": (None, None),
+ "userBookmark": (None, None),
+ }
+
+ for service, (max_freq, min_freq) in checks.items():
+ if max_freq is not None:
+ assert sm._check_avg_freq(service)
+ assert sm.freq_tracker[service].max_freq == max_freq*1.2
+ assert sm.freq_tracker[service].min_freq == min_freq*0.8
+ else:
+ assert not sm._check_avg_freq(service)
+
+ def test_alive(self):
+ pass
+
+ def test_ignore_alive(self):
+ pass
+
+ def test_valid(self):
+ pass
+
+ # SubMaster should always conflate
+ def test_conflate(self):
+ sock = "carState"
+ pub_sock = messaging.pub_sock(sock)
+ sm = messaging.SubMaster([sock,])
+
+ n = 10
+ for i in range(n+1):
+ msg = messaging.new_message(sock)
+ msg.carState.vEgo = i
+ pub_sock.send(msg.to_bytes())
+ time.sleep(0.01)
+ sm.update(1000)
+ assert sm[sock].vEgo == n
+
+
+class TestPubMaster:
+
+ def setup_method(self):
+ # ZMQ pub socket takes too long to die
+ # sleep to prevent multiple publishers error between tests
+ zmq_sleep(3)
+
+ def test_init(self):
+ messaging.PubMaster(events)
+
+ def test_send(self):
+ socks = random_socks()
+ pm = messaging.PubMaster(socks)
+ sub_socks = {s: messaging.sub_sock(s, conflate=True, timeout=1000) for s in socks}
+ zmq_sleep()
+
+ # PubMaster accepts either a capnp msg builder or bytes
+ for capnp in [True, False]:
+ for i in range(100):
+ sock = socks[i % len(socks)]
+
+ if capnp:
+ try:
+ msg = messaging.new_message(sock)
+ except Exception:
+ msg = messaging.new_message(sock, random.randrange(50))
+ else:
+ msg = random_bytes()
+
+ pm.send(sock, msg)
+ recvd = sub_socks[sock].receive()
+
+ if capnp:
+ msg.clear_write_flag()
+ msg = msg.to_bytes()
+ assert msg == recvd, i
diff --git a/cereal/messaging/tests/test_services.py b/cereal/messaging/tests/test_services.py
new file mode 100644
index 000000000..d35826755
--- /dev/null
+++ b/cereal/messaging/tests/test_services.py
@@ -0,0 +1,27 @@
+import os
+import tempfile
+from typing import Dict
+from parameterized import parameterized
+
+from cereal import log
+import cereal.services as services
+from cereal.services import SERVICE_LIST
+
+
+class TestServices:
+
+ @parameterized.expand(SERVICE_LIST.keys())
+ def test_services(self, s):
+ service = SERVICE_LIST[s]
+ assert service.frequency <= 104
+ assert service.decimation != 0
+
+ def test_generated_header(self):
+ with tempfile.NamedTemporaryFile(suffix=".h") as f:
+ ret = os.system(f"python3 {services.__file__} > {f.name} && clang++ {f.name} -std=c++11")
+ assert ret == 0, "generated services header is not valid C"
+
+ def test_all_services_exist_in_log_union(self):
+ event_fields = set(log.Event.schema.union_fields)
+ missing = sorted(s for s in SERVICE_LIST if s not in event_fields)
+ assert not missing, f"services missing from log.capnp Event union: {missing}"
diff --git a/cereal/messaging/tests/validate_sp_cereal_upstream.py b/cereal/messaging/tests/validate_sp_cereal_upstream.py
new file mode 100755
index 000000000..9ccd6533c
--- /dev/null
+++ b/cereal/messaging/tests/validate_sp_cereal_upstream.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python3
+import argparse
+import sys
+from typing import Any, List, Tuple
+
+DEBUG = False
+
+
+def print_debug(string: str) -> None:
+ if DEBUG:
+ print(string)
+
+
+def create_schema_instance(struct: Any, prop: Tuple[str, Any]) -> Any:
+ """
+ Create a new instance of a schema type, handling different field types.
+
+ Args:
+ struct: The Cap'n Proto schema structure
+ prop: A tuple containing the field name and field metadata
+
+ Returns:
+ A new initialized schema instance
+ """
+ struct_instance = struct.new_message()
+ field_name, field_metadata = prop
+
+ try:
+ field_type = field_metadata.proto.slot.type.which()
+
+ # Initialize different types of fields
+ if field_type in ('list', 'text', 'data'):
+ struct_instance.init(field_name, 1)
+ print_debug(f"Initialized list/text/data field: {field_name}")
+ elif field_type in ('struct', 'object'):
+ struct_instance.init(field_name)
+ print_debug(f"Initialized struct/object field: {field_name}")
+
+ return struct_instance
+
+ except Exception as e:
+ print(f"Error creating instance for {field_name}: {e}")
+ return None
+
+
+def get_schema_fields(schema_struct: Any) -> List[Tuple[str, Any]]:
+ """
+ Retrieve all fields from a given schema structure.
+
+ Args:
+ schema_struct: The Cap'n Proto schema structure
+
+ Returns:
+ A list of field names and their metadata
+ """
+ try:
+ # Get all fields from the schema
+ schema_fields = list(schema_struct.schema.fields.items())
+
+ print_debug("Discovered schema fields:")
+ for field_name, field_metadata in schema_fields:
+ print_debug(f"- {field_name}")
+
+ return schema_fields
+
+ except Exception as e:
+ print(f"Error retrieving schema fields: {e}")
+ return []
+
+
+def generate_schema_instances(schema_struct: Any) -> List[Any]:
+ """
+ Generate instances for all fields in a given schema.
+
+ Args:
+ schema_struct: The Cap'n Proto schema structure
+
+ Returns:
+ A list of schema instances
+ """
+ schema_fields = get_schema_fields(schema_struct)
+ instances = []
+
+ for field_prop in schema_fields:
+ try:
+ instance = create_schema_instance(schema_struct, field_prop)
+ if instance is not None:
+ instances.append(instance)
+ except Exception as e:
+ print(f"Skipping field due to error: {e}")
+
+ print(f"Generated {len(instances)} schema instances")
+ return instances
+
+
+def persist_instances(instances: List[Any], filename: str) -> None:
+ """
+ Write schema instances to a binary file.
+
+ Args:
+ instances: List of schema instances
+ filename: Output file path
+ """
+ try:
+ with open(filename, 'wb') as f:
+ for instance in instances:
+ f.write(instance.to_bytes())
+
+ print(f"Successfully wrote {len(instances)} instances to {filename}")
+
+ except Exception as e:
+ print(f"Error persisting instances: {e}")
+ sys.exit(1)
+
+
+def read_instances(filename: str, schema_type: Any) -> List[Any]:
+ """
+ Read schema instances from a binary file.
+
+ Args:
+ filename: Input file path
+ schema_type: The schema type to use for reading
+
+ Returns:
+ A list of read schema instances
+ """
+ try:
+ with open(filename, 'rb') as f:
+ data = f.read()
+
+ instances = list(schema_type.read_multiple_bytes(data))
+
+ print(f"Read {len(instances)} instances from {filename}")
+ return instances
+
+ except Exception as e:
+ print(f"Error reading instances: {e}")
+ sys.exit(1)
+
+
+def compare_schemas(original_instances: List[Any], read_instances: List[Any]) -> bool:
+ """
+ Compare original and read-back instances to detect potential breaking changes.
+
+ Args:
+ original_instances: List of originally generated instances
+ read_instances: List of instances read back from file
+
+ Returns:
+ Boolean indicating whether schemas appear compatible
+ """
+ if len(original_instances) != len(read_instances):
+ print("❌ Schema Compatibility Warning: Instance count mismatch")
+ return False
+
+ compatible = True
+ for struct in read_instances:
+ try:
+ getattr(struct, struct.which()) # Attempting to access the field to validate readability
+ except Exception as e:
+ print(f"❌ Structural change detected: {struct.which()} is not readable.\nFull error: {e}")
+ compatible = False
+
+ return compatible
+
+
+def main():
+ """
+ CLI entry point for schema compatibility testing.
+ """
+ # Setup argument parser
+ parser = argparse.ArgumentParser(
+ description='Cap\'n Proto Schema Compatibility Testing Tool',
+ epilog='Test schema compatibility by generating and reading back instances.'
+ )
+
+ # Add mutually exclusive group for generation or reading mode
+ mode_group = parser.add_mutually_exclusive_group(required=True)
+ mode_group.add_argument('-g', '--generate', action='store_true',
+ help='Generate schema instances')
+ mode_group.add_argument('-r', '--read', action='store_true',
+ help='Read and validate schema instances')
+
+ # Common arguments
+ parser.add_argument('-f', '--file',
+ default='schema_instances.bin',
+ help='Output/input binary file (default: schema_instances.bin)')
+
+ # Parse arguments
+ args = parser.parse_args()
+
+ # Import the schema dynamically
+ try:
+ from cereal import log
+ schema_type = log.Event
+ except ImportError:
+ print("Error: Unable to import schema. Ensure 'cereal' is installed.")
+ sys.exit(1)
+
+ # Execute based on mode
+ if args.generate:
+ print("🔧 Generating Schema Instances")
+ instances = generate_schema_instances(schema_type)
+ persist_instances(instances, args.file)
+ print("✅ Instance generation complete")
+
+ elif args.read:
+ print("🔍 Reading and Validating Schema Instances")
+ generated_instances = generate_schema_instances(schema_type)
+ read_back_instances = read_instances(args.file, schema_type)
+
+ # Compare schemas
+ if compare_schemas(generated_instances, read_back_instances):
+ print("✅ Schema Compatibility: No breaking changes detected")
+ sys.exit(0)
+ else:
+ print("❌ Potential Schema Breaking Changes Detected")
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/cereal/services.py b/cereal/services.py
new file mode 100755
index 000000000..50f8e8063
--- /dev/null
+++ b/cereal/services.py
@@ -0,0 +1,158 @@
+#!/usr/bin/env python3
+from enum import IntEnum
+from typing import Optional
+
+
+# TODO: this should be automatically determined using the capnp schema
+class QueueSize(IntEnum):
+ BIG = 10 * 1024 * 1024 # 10MB - video frames, large AI outputs
+ MEDIUM = 2 * 1024 * 1024 # 2MB - high freq (CAN), livestream
+ SMALL = 250 * 1024 # 250KB - most services
+
+
+class Service:
+ def __init__(self, should_log: bool, frequency: float, decimation: Optional[int] = None,
+ queue_size: QueueSize = QueueSize.SMALL):
+ self.should_log = should_log
+ self.frequency = frequency
+ self.decimation = decimation
+ self.queue_size = queue_size
+
+
+_services: dict[str, tuple] = {
+ # service: (should_log, frequency, qlog decimation (optional))
+ # note: the "EncodeIdx" packets will still be in the log
+ "gyroscope": (True, 104., 104),
+ "accelerometer": (True, 104., 104),
+ "magnetometer": (True, 25.),
+ "lightSensor": (True, 100., 100),
+ "temperatureSensor": (True, 2., 200),
+ "gpsNMEA": (True, 9.),
+ "deviceState": (True, 2., 1),
+ "touch": (True, 20., 1),
+ "can": (True, 100., 2053, QueueSize.BIG), # decimation gives ~3 msgs in a full segment
+ "controlsState": (True, 100., 10, QueueSize.MEDIUM),
+ "selfdriveState": (True, 100., 10),
+ "pandaStates": (True, 10., 1),
+ "peripheralState": (True, 2., 1),
+ "radarState": (True, 20., 5),
+ "roadEncodeIdx": (False, 20., 1),
+ "liveTracks": (True, 20.),
+ "sendcan": (True, 100., 139, QueueSize.MEDIUM),
+ "logMessage": (True, 0., None, QueueSize.MEDIUM),
+ "errorLogMessage": (True, 0., 1, QueueSize.MEDIUM),
+ "liveCalibration": (True, 4., 4),
+ "liveTorqueParameters": (True, 4., 1),
+ "liveDelay": (True, 4., 1),
+ "androidLog": (True, 0.),
+ "carState": (True, 100., 10),
+ "carControl": (True, 100., 10),
+ "carOutput": (True, 100., 10),
+ "longitudinalPlan": (True, 20., 10),
+ "lateralManeuverPlan": (True, 20.),
+ "driverAssistance": (True, 20., 20),
+ "procLog": (True, 0.5, 15, QueueSize.MEDIUM),
+ "gpsLocationExternal": (True, 10., 10),
+ "gpsLocation": (True, 1., 1),
+ "ubloxGnss": (True, 10.),
+ "qcomGnss": (True, 2.),
+ "gnssMeasurements": (True, 10., 10),
+ "clocks": (True, 0.1, 1),
+ "ubloxRaw": (True, 20.),
+ "livePose": (True, 20., 4),
+ "liveParameters": (True, 20., 5),
+ "cameraOdometry": (True, 20., 10),
+ "thumbnail": (True, 1 / 60., 1),
+ "onroadEvents": (True, 1., 1),
+ "carParams": (True, 0.02, 1),
+ "roadCameraState": (True, 20., 20),
+ "driverCameraState": (True, 20., 20),
+ "driverEncodeIdx": (False, 20., 1),
+ "driverStateV2": (True, 20., 10),
+ "driverMonitoringState": (True, 20., 10),
+ "wideRoadEncodeIdx": (False, 20., 1),
+ "wideRoadCameraState": (True, 20., 20),
+ "drivingModelData": (True, 20., 10),
+ "modelV2": (True, 20., None, QueueSize.MEDIUM),
+ "managerState": (True, 2., 1),
+ "uploaderState": (True, 0., 1),
+ "navInstruction": (True, 1., 10),
+ "navRoute": (True, 0.),
+ "navThumbnail": (True, 0.),
+ "qRoadEncodeIdx": (False, 20.),
+ "userBookmark": (True, 0., 1),
+ "soundPressure": (True, 10., 10),
+ "rawAudioData": (False, 20.),
+ "webrtcAudioData": (False, 50.),
+ "bookmarkButton": (True, 0., 1),
+ "audioFeedback": (True, 0., 1),
+ "roadEncodeData": (False, 20., None, QueueSize.BIG),
+ "driverEncodeData": (False, 20., None, QueueSize.BIG),
+ "wideRoadEncodeData": (False, 20., None, QueueSize.BIG),
+ "qRoadEncodeData": (False, 20., None, QueueSize.BIG),
+
+ # iqpilot
+ "iqModelManager": (False, 1., 1, QueueSize.MEDIUM),
+ "backupManagerK3": (False, 1., 1),
+ "iqCarParams": (True, 0.02, 1),
+ "iqCarControl": (True, 100., 10),
+ "iqCarState": (True, 100., 10),
+ "iqLiveData": (True, 1., 1),
+ "iqConstructionZone": (True, 2., 2),
+ "iqVehicleTracks": (True, 4., 4),
+ "iqEnvironment": (True, 4., 4),
+ "mapdOut": (True, 20., 20, QueueSize.MEDIUM),
+ "mapdExtendedOut": (False, 1., -1, QueueSize.MEDIUM),
+ "mapdIn": (False, 1., -1, QueueSize.MEDIUM),
+ "iqNavState": (True, 5., 10),
+ "iqNavRenderState": (True, 5., 10, QueueSize.MEDIUM),
+ "iqState": (True, 100., 10),
+ "iqPlan": (True, 20., 10),
+ "iqOnroadEvents": (True, 1., 1),
+ "iqDriveModelData": (True, 20., None, QueueSize.MEDIUM),
+ "iqLiveLocation": (True, 20.),
+ "liveLocationKalman": (True, 20.),
+ "iqPerfTrace": (True, 0., 1, QueueSize.SMALL),
+
+ # debug
+ "uiDebug": (True, 0., 1),
+ "testJoystick": (True, 0.),
+ "alertDebug": (True, 20., 5),
+ "livestreamWideRoadEncodeIdx": (False, 20.),
+ "livestreamRoadEncodeIdx": (False, 20.),
+ "livestreamDriverEncodeIdx": (False, 20.),
+ "livestreamWideRoadEncodeData": (False, 20., None, QueueSize.MEDIUM),
+ "livestreamRoadEncodeData": (False, 20., None, QueueSize.MEDIUM),
+ "livestreamDriverEncodeData": (False, 20., None, QueueSize.MEDIUM),
+ "customReservedRawData0": (True, 0.),
+ "customReservedRawData1": (True, 0.),
+ "customReservedRawData2": (True, 0.),
+}
+SERVICE_LIST = {name: Service(*vals) for
+ idx, (name, vals) in enumerate(_services.items())}
+
+
+def build_header():
+ h = ""
+ h += "/* THIS IS AN AUTOGENERATED FILE, PLEASE EDIT services.py */\n"
+ h += "#ifndef __SERVICES_H\n"
+ h += "#define __SERVICES_H\n"
+
+ h += "#include \n"
+ h += "#include \n"
+
+ h += "struct service { std::string name; bool should_log; float frequency; int decimation; size_t queue_size; };\n"
+ h += "static std::map services = {\n"
+ for k, v in SERVICE_LIST.items():
+ should_log = "true" if v.should_log else "false"
+ decimation = -1 if v.decimation is None else v.decimation
+ h += ' { "%s", {"%s", %s, %f, %d, %d}},\n' % \
+ (k, k, should_log, v.frequency, decimation, v.queue_size)
+ h += "};\n"
+
+ h += "#endif\n"
+ return h
+
+
+if __name__ == "__main__":
+ print(build_header())
diff --git a/common/.gitignore b/common/.gitignore
new file mode 100644
index 000000000..ce1da4c53
--- /dev/null
+++ b/common/.gitignore
@@ -0,0 +1 @@
+*.cpp
diff --git a/common/__init__.py b/common/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/common/api/__init__.py b/common/api/__init__.py
new file mode 100644
index 000000000..865b2dba9
--- /dev/null
+++ b/common/api/__init__.py
@@ -0,0 +1,26 @@
+import openpilot.common.api.comma_connect
+
+
+class Api:
+ def __init__(self, dongle_id):
+ self.service = openpilot.common.api.comma_connect.CommaConnectApi(dongle_id)
+
+ def request(self, method, endpoint, **params):
+ return self.service.request(method, endpoint, **params)
+
+ def get(self, *args, **kwargs):
+ return self.service.get(*args, **kwargs)
+
+ def post(self, *args, **kwargs):
+ return self.service.post(*args, **kwargs)
+
+ def get_token(self, payload_extra=None, expiry_hours=1):
+ return self.service.get_token(payload_extra, expiry_hours)
+
+
+def api_get(endpoint, method='GET', timeout=None, access_token=None, session=None, **params):
+ return openpilot.common.api.comma_connect.CommaConnectApi(None).api_get(endpoint, method, timeout, access_token, session, **params)
+
+
+def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]:
+ return openpilot.common.api.comma_connect.CommaConnectApi(None).get_key_pair()
diff --git a/common/api/base.py b/common/api/base.py
new file mode 100644
index 000000000..7e5332901
--- /dev/null
+++ b/common/api/base.py
@@ -0,0 +1,84 @@
+import jwt
+import os
+import requests
+import unicodedata
+from datetime import datetime, timedelta, UTC
+from functools import lru_cache
+from openpilot.system.hardware.hw import Paths
+from openpilot.system.version import get_version
+
+# name: jwt signature algorithm
+KEYS = {"id_rsa": "RS256",
+ "id_ecdsa": "ES256"}
+
+
+@lru_cache(maxsize=4)
+def load_signing_key(private_key: str):
+ # PyJWT re-parses a PEM string on every encode; an RSA parse is ~40ms, so cache the key object
+ try:
+ from cryptography.hazmat.primitives.serialization import load_pem_private_key
+ return load_pem_private_key(private_key.encode(), password=None)
+ except Exception:
+ return private_key
+
+
+class BaseApi:
+ def __init__(self, dongle_id, api_host, user_agent="openpilot-"):
+ self.dongle_id = dongle_id
+ self.api_host = api_host
+ self.user_agent = user_agent
+ self.jwt_algorithm, self.private_key, _ = self.get_key_pair()
+
+ def get(self, *args, **kwargs):
+ return self.request('GET', *args, **kwargs)
+
+ def post(self, *args, **kwargs):
+ return self.request('POST', *args, **kwargs)
+
+ def request(self, method, endpoint, timeout=None, access_token=None, **params):
+ return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params)
+
+ def _get_token(self, payload_extra=None, expiry_hours=1, **extra_payload):
+ now = datetime.now(UTC).replace(tzinfo=None)
+ payload = {
+ 'identity': self.dongle_id,
+ 'nbf': now,
+ 'iat': now,
+ 'exp': now + timedelta(hours=expiry_hours),
+ **extra_payload
+ }
+ if payload_extra is not None:
+ payload.update(payload_extra)
+ key = load_signing_key(self.private_key) if self.private_key else self.private_key
+ token = jwt.encode(payload, key, algorithm=self.jwt_algorithm)
+ if isinstance(token, bytes):
+ token = token.decode('utf8')
+ return token
+
+ def get_token(self, payload_extra=None, expiry_hours=1):
+ return self._get_token(payload_extra, expiry_hours)
+
+ def remove_non_ascii_chars(self, text):
+ normalized_text = unicodedata.normalize('NFD', text)
+ ascii_encoded_text = normalized_text.encode('ascii', 'ignore')
+ return ascii_encoded_text.decode()
+
+ def api_get(self, endpoint, method='GET', timeout=None, access_token=None, session=None, json=None, **params):
+ headers = {}
+ if access_token is not None:
+ headers['Authorization'] = "JWT " + access_token
+
+ version = self.remove_non_ascii_chars(get_version())
+ headers['User-Agent'] = self.user_agent + version
+
+ # TODO: add session to Api
+ req = requests if session is None else session
+ return req.request(method, f"{self.api_host}/{endpoint}", timeout=timeout, headers=headers, json=json, params=params)
+
+ @staticmethod
+ def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]:
+ for key in KEYS:
+ if os.path.isfile(Paths.persist_root() + f'/comma/{key}') and os.path.isfile(Paths.persist_root() + f'/comma/{key}.pub'):
+ with open(Paths.persist_root() + f'/comma/{key}') as private, open(Paths.persist_root() + f'/comma/{key}.pub') as public:
+ return KEYS[key], private.read(), public.read()
+ return None, None, None
diff --git a/common/api/comma_connect.py b/common/api/comma_connect.py
new file mode 100644
index 000000000..04935ad52
--- /dev/null
+++ b/common/api/comma_connect.py
@@ -0,0 +1,11 @@
+import os
+
+from openpilot.common.api.base import BaseApi
+
+API_HOST = os.getenv('API_HOST', 'https://api-iqlabs.konn3kt.com')
+
+
+class CommaConnectApi(BaseApi):
+ def __init__(self, dongle_id):
+ super().__init__(dongle_id, API_HOST)
+ self.user_agent = "openpilot-"
diff --git a/common/basedir.py b/common/basedir.py
new file mode 100644
index 000000000..6b4811e53
--- /dev/null
+++ b/common/basedir.py
@@ -0,0 +1,4 @@
+import os
+
+
+BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
diff --git a/common/constants.py b/common/constants.py
new file mode 100644
index 000000000..7ca425c4b
--- /dev/null
+++ b/common/constants.py
@@ -0,0 +1,23 @@
+import numpy as np
+
+# conversions
+class CV:
+ # Speed
+ MPH_TO_KPH = 1.609344
+ KPH_TO_MPH = 1. / MPH_TO_KPH
+ MS_TO_KPH = 3.6
+ KPH_TO_MS = 1. / MS_TO_KPH
+ MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH
+ MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS
+ MS_TO_KNOTS = 1.9438
+ KNOTS_TO_MS = 1. / MS_TO_KNOTS
+
+ # Angle
+ DEG_TO_RAD = np.pi / 180.
+ RAD_TO_DEG = 1. / DEG_TO_RAD
+
+ # Mass
+ LB_TO_KG = 0.453592
+
+
+ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2
diff --git a/common/file_chunker.py b/common/file_chunker.py
new file mode 100644
index 000000000..57dfc3553
--- /dev/null
+++ b/common/file_chunker.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+import sys
+import math
+import os
+from pathlib import Path
+
+CHUNK_SIZE = 45 * 1024 * 1024 # 45MB, under GitHub's 50MB limit
+
+def get_chunk_name(name, idx, num_chunks):
+ return f"{name}.chunk{idx+1:02d}of{num_chunks:02d}"
+
+def get_manifest_path(name):
+ return f"{name}.chunkmanifest"
+
+def _chunk_paths(path, num_chunks):
+ return [get_manifest_path(path)] + [get_chunk_name(path, i, num_chunks) for i in range(num_chunks)]
+
+def get_chunk_targets(path, file_size):
+ num_chunks = math.ceil(file_size / CHUNK_SIZE)
+ return _chunk_paths(path, num_chunks)
+
+def chunk_file(path, targets):
+ manifest_path, *chunk_paths = targets
+ with open(path, 'rb') as f:
+ data = f.read()
+ actual_num_chunks = max(1, math.ceil(len(data) / CHUNK_SIZE))
+ assert len(chunk_paths) >= actual_num_chunks, f"Allowed {len(chunk_paths)} chunks but needs at least {actual_num_chunks}, for path {path}"
+ for i, chunk_path in enumerate(chunk_paths):
+ with open(chunk_path, 'wb') as f:
+ f.write(data[i * CHUNK_SIZE:(i + 1) * CHUNK_SIZE])
+ Path(manifest_path).write_text(str(len(chunk_paths)))
+ os.remove(path)
+
+def get_existing_chunks(path):
+ if os.path.isfile(path):
+ return [path]
+ if os.path.isfile(manifest := get_manifest_path(path)):
+ num_chunks = int(Path(manifest).read_text().strip())
+ return _chunk_paths(path, num_chunks)
+ raise FileNotFoundError(path)
+
+def read_file_chunked(path):
+ manifest_path = get_manifest_path(path)
+ if os.path.isfile(manifest_path):
+ num_chunks = int(Path(manifest_path).read_text().strip())
+ return b''.join(Path(get_chunk_name(path, i, num_chunks)).read_bytes() for i in range(num_chunks))
+ if os.path.isfile(path):
+ return Path(path).read_bytes()
+ raise FileNotFoundError(path)
+
+
+if __name__ == "__main__":
+ path = sys.argv[1]
+ chunk_paths = get_chunk_targets(path, os.path.getsize(path))
+ chunk_file(path, chunk_paths)
diff --git a/common/file_helpers.py b/common/file_helpers.py
new file mode 100644
index 000000000..b7857fbc5
--- /dev/null
+++ b/common/file_helpers.py
@@ -0,0 +1 @@
+from openpilot.common.utils import CallbackReader, get_upload_stream
diff --git a/common/filter_simple.py b/common/filter_simple.py
new file mode 100644
index 000000000..30839f66e
--- /dev/null
+++ b/common/filter_simple.py
@@ -0,0 +1,71 @@
+from collections import deque
+
+import numpy as np
+
+
+class FirstOrderFilter:
+ def __init__(self, x0, rc, dt, initialized=True):
+ self.x = x0
+ self.dt = dt
+ self.update_alpha(rc)
+ self.initialized = initialized
+
+ def update_alpha(self, rc):
+ self.alpha = self.dt / (rc + self.dt)
+
+ def update(self, x):
+ if self.initialized:
+ self.x = (1. - self.alpha) * self.x + self.alpha * x
+ else:
+ self.initialized = True
+ self.x = x
+ return self.x
+
+
+class BounceFilter(FirstOrderFilter):
+ def __init__(self, x0, rc, dt, initialized=True, bounce=2):
+ self.velocity = FirstOrderFilter(0.0, 0.15, dt)
+ self.bounce = bounce
+ super().__init__(x0, rc, dt, initialized)
+
+ def update(self, x):
+ super().update(x)
+ scale = self.dt / (1.0 / 60.0) # tuned at 60 fps
+ self.velocity.x += (x - self.x) * self.bounce * scale * self.dt
+ self.velocity.update(0.0)
+ if abs(self.velocity.x) < 1e-5:
+ self.velocity.x = 0.0
+ self.x += self.velocity.x
+ return self.x
+
+
+class MyMovingAverage:
+ def __init__(self, window_size, value=None):
+ self.window_size = window_size
+ if value is not None:
+ self.values = deque([value] * window_size, maxlen=window_size)
+ self.sum = value * window_size
+ self.result = value
+ else:
+ self.values = deque(maxlen=window_size)
+ self.sum = 0
+ self.result = 0
+
+ def set(self, value):
+ self.values.clear()
+ self.values.append(value)
+ self.sum = value
+ self.result = value
+ return value
+
+ def set_all(self, value):
+ self.values = deque([value] * self.window_size, maxlen=self.window_size)
+ self.sum = value * self.window_size
+ self.result = value
+ return value
+
+ def process(self, value, median=False):
+ self.values.append(value)
+ self.sum = sum(self.values)
+ self.result = float(np.median(self.values)) if median else float(self.sum) / len(self.values)
+ return self.result
diff --git a/common/git.py b/common/git.py
new file mode 100644
index 000000000..6b662e571
--- /dev/null
+++ b/common/git.py
@@ -0,0 +1,42 @@
+from functools import cache
+import subprocess
+from openpilot.common.utils import run_cmd, run_cmd_default
+
+
+@cache
+def get_commit(cwd: str | None = None, branch: str = "HEAD") -> str:
+ return run_cmd_default(["git", "rev-parse", branch], cwd=cwd)
+
+
+@cache
+def get_commit_date(cwd: str | None = None, commit: str = "HEAD") -> str:
+ return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit], cwd=cwd)
+
+
+@cache
+def get_short_branch(cwd: str | None = None) -> str:
+ return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"], cwd=cwd)
+
+
+@cache
+def get_branch(cwd: str | None = None) -> str:
+ return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd=cwd)
+
+
+@cache
+def get_origin(cwd: str | None = None) -> str:
+ try:
+ local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"], cwd=cwd)
+ tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"], cwd=cwd)
+ return run_cmd(["git", "config", "remote." + tracking_remote + ".url"], cwd=cwd)
+ except subprocess.CalledProcessError: # Not on a branch, fallback
+ return run_cmd_default(["git", "config", "--get", "remote.origin.url"], cwd=cwd)
+
+
+@cache
+def get_normalized_origin(cwd: str | None = None) -> str:
+ return get_origin(cwd) \
+ .replace("git@", "", 1) \
+ .replace(".git", "", 1) \
+ .replace("https://", "", 1) \
+ .replace(":", "/", 1)
diff --git a/common/git_creds.py b/common/git_creds.py
new file mode 100644
index 000000000..d9a669d15
--- /dev/null
+++ b/common/git_creds.py
@@ -0,0 +1,209 @@
+import base64
+import json
+import os
+import subprocess
+
+from openpilot.common.params import Params
+
+PARAM = "GitAuthBlob"
+KEY_DIR = "/data/konn3kt"
+KEY_PATH = os.path.join(KEY_DIR, "git_auth.key")
+HELPER_PATH = os.path.join(KEY_DIR, "git_credential_helper.py")
+DEFAULT_REPO_DIR = "/data/openpilot"
+
+_HELPER_SCRIPT = '''#!/usr/bin/env python3
+import json
+import os
+import sys
+
+KEY_PATH = "{key_path}"
+
+
+def main() -> None:
+ if len(sys.argv) < 2 or sys.argv[1] != "get":
+ return
+ # drain git's request on stdin (terminated by a blank line)
+ for line in sys.stdin:
+ if not line.strip():
+ break
+ params_dir = os.environ.get("PARAMS_DIR", "/data/params/d")
+ blob_path = os.path.join(params_dir, "GitAuthBlob")
+ try:
+ with open(KEY_PATH, "rb") as f:
+ key = f.read().strip()
+ with open(blob_path, "rb") as f:
+ blob = f.read()
+ if not blob:
+ return
+ from cryptography.fernet import Fernet
+ data = json.loads(Fernet(key).decrypt(blob).decode())
+ username = data.get("u", "")
+ token = data.get("t", "")
+ if username and token:
+ sys.stdout.write("username=%s\\npassword=%s\\n" % (username, token))
+ except Exception:
+ return
+
+
+if __name__ == "__main__":
+ main()
+'''
+
+
+def _load_or_create_key() -> bytes:
+ from cryptography.fernet import Fernet
+ try:
+ with open(KEY_PATH, "rb") as f:
+ return f.read().strip()
+ except FileNotFoundError:
+ pass
+ key = Fernet.generate_key()
+ os.makedirs(KEY_DIR, exist_ok=True)
+ # write atomically with restrictive perms
+ tmp = KEY_PATH + ".tmp"
+ fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
+ with os.fdopen(fd, "wb") as f:
+ f.write(key)
+ os.replace(tmp, KEY_PATH)
+ return key
+
+
+def set_credentials(username: str, token: str) -> None:
+ """Encrypt and store credentials. Empty username AND token clears them."""
+ username = (username or "").strip()
+ token = (token or "").strip()
+ if not username and not token:
+ clear_credentials()
+ return
+ from cryptography.fernet import Fernet
+ blob = Fernet(_load_or_create_key()).encrypt(
+ json.dumps({"u": username, "t": token}).encode()
+ )
+ Params().put(PARAM, blob)
+ try:
+ install_credential_helper(DEFAULT_REPO_DIR)
+ except Exception:
+ pass
+
+
+def get_credentials() -> tuple[str, str] | None:
+ """Return (username, token), or None if unset / unreadable."""
+ blob = Params().get(PARAM)
+ if not blob:
+ return None
+ try:
+ from cryptography.fernet import Fernet
+ data = json.loads(Fernet(_load_or_create_key()).decrypt(blob).decode())
+ return data.get("u", ""), data.get("t", "")
+ except Exception:
+ return None
+
+
+def clear_credentials() -> None:
+ Params().remove(PARAM)
+
+
+def has_credentials() -> bool:
+ return get_credentials() is not None
+
+
+def _auth_header(username: str, token: str) -> str:
+ return "Authorization: Basic " + base64.b64encode(f"{username}:{token}".encode()).decode()
+
+
+def ssh_to_https(url: str) -> str:
+ """Convert an SSH git URL to its HTTPS equivalent. Returns url unchanged if it
+ is not an SSH URL. A leading ssh. host label is dropped (ssh.host -> host)."""
+ url = url.strip()
+ host = path = ""
+ if url.startswith("ssh://"):
+ rest = url[len("ssh://"):]
+ rest = rest.split("@", 1)[-1] # drop user@
+ hostport, _, path = rest.partition("/")
+ host = hostport.split(":", 1)[0] # drop :port
+ elif url.startswith("git@") or ("@" in url and ":" in url.split("@", 1)[-1] and "://" not in url):
+ rest = url.split("@", 1)[-1] # host:owner/repo.git
+ host, _, path = rest.partition(":")
+ else:
+ return url # already https/http or unrecognised
+ if host.startswith("ssh."):
+ host = host[len("ssh."):]
+ return f"https://{host}/{path}"
+
+
+def install_credential_helper(repo_dir: str = DEFAULT_REPO_DIR) -> None:
+ if get_credentials() is None:
+ return
+
+ origin = subprocess.run(
+ ["git", "-C", repo_dir, "config", "--get", "remote.origin.url"],
+ capture_output=True, text=True, check=False,
+ ).stdout.strip()
+ if not origin:
+ return
+ https = ssh_to_https(origin)
+ if not https.startswith("https://"):
+ return
+
+ from urllib.parse import urlsplit
+ parts = urlsplit(https)
+ if not parts.hostname:
+ return
+ scope = f"{parts.scheme}://{parts.hostname}"
+
+ try:
+ os.makedirs(KEY_DIR, exist_ok=True)
+ tmp = HELPER_PATH + ".tmp"
+ fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o755)
+ with os.fdopen(fd, "w") as f:
+ f.write(_HELPER_SCRIPT.format(key_path=KEY_PATH))
+ os.replace(tmp, HELPER_PATH)
+ except Exception:
+ return
+
+ helper_cmd = f"!/usr/bin/env python3 {HELPER_PATH}"
+ subprocess.run(
+ ["git", "-C", repo_dir, "config", f"credential.{scope}.helper", helper_cmd],
+ check=False, capture_output=True,
+ )
+
+
+def configure(repo_dir: str) -> None:
+ """Apply on-device credentials to the git repo at repo_dir before a remote op.
+
+ No-op when no credentials are stored. If the origin is an SSH URL it is
+ rewritten in-place to the HTTPS equivalent so the Basic-auth header applies.
+ The header is injected via GIT_CONFIG_* env (never persisted to .git/config).
+ Idempotent."""
+ creds = get_credentials()
+ if creds is None:
+ return
+ username, token = creds
+
+ try:
+ install_credential_helper(repo_dir)
+ except Exception:
+ pass
+
+ origin = subprocess.run(
+ ["git", "-C", repo_dir, "config", "--get", "remote.origin.url"],
+ capture_output=True, text=True, check=False,
+ ).stdout.strip()
+ if not origin:
+ return
+
+ https = ssh_to_https(origin)
+ if https != origin and https.startswith("https://"):
+ subprocess.run(
+ ["git", "-C", repo_dir, "config", "remote.origin.url", https],
+ check=False, capture_output=True,
+ )
+
+ if not https.startswith("https://"):
+ return # header auth only works over https
+
+ # scope to this exact repo URL prefix (trailing slash => component boundary)
+ key = https if https.endswith("/") else https + "/"
+ os.environ["GIT_CONFIG_COUNT"] = "1"
+ os.environ["GIT_CONFIG_KEY_0"] = f"http.{key}.extraHeader"
+ os.environ["GIT_CONFIG_VALUE_0"] = _auth_header(username, token)
diff --git a/common/gpio.py b/common/gpio.py
new file mode 100644
index 000000000..8f025a2da
--- /dev/null
+++ b/common/gpio.py
@@ -0,0 +1,89 @@
+import os
+import fcntl
+import ctypes
+from functools import cache
+
+def gpio_init(pin: int, output: bool) -> None:
+ try:
+ with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f:
+ f.write(b"out" if output else b"in")
+ except Exception as e:
+ print(f"Failed to set gpio {pin} direction: {e}")
+
+def gpio_set(pin: int, high: bool) -> None:
+ try:
+ with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f:
+ f.write(b"1" if high else b"0")
+ except Exception as e:
+ print(f"Failed to set gpio {pin} value: {e}")
+
+def gpio_read(pin: int) -> bool | None:
+ val = None
+ try:
+ with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f:
+ val = bool(int(f.read().strip()))
+ except Exception as e:
+ print(f"Failed to set gpio {pin} value: {e}")
+
+ return val
+
+def gpio_export(pin: int) -> None:
+ if os.path.isdir(f"/sys/class/gpio/gpio{pin}"):
+ return
+
+ try:
+ with open("/sys/class/gpio/export", 'w') as f:
+ f.write(str(pin))
+ except Exception:
+ print(f"Failed to export gpio {pin}")
+
+@cache
+def get_irq_action(irq: int) -> list[str]:
+ try:
+ with open(f"/sys/kernel/irq/{irq}/actions") as f:
+ actions = f.read().strip().split(',')
+ return actions
+ except FileNotFoundError:
+ return []
+
+def get_irqs_for_action(action: str) -> list[str]:
+ ret = []
+ with open("/proc/interrupts") as f:
+ for l in f.readlines():
+ irq = l.split(':')[0].strip()
+ if irq.isdigit() and action in get_irq_action(irq):
+ ret.append(irq)
+ return ret
+
+# *** gpiochip ***
+
+class gpioevent_data(ctypes.Structure):
+ _fields_ = [
+ ("timestamp", ctypes.c_uint64),
+ ("id", ctypes.c_uint32),
+ ]
+
+class gpioevent_request(ctypes.Structure):
+ _fields_ = [
+ ("lineoffset", ctypes.c_uint32),
+ ("handleflags", ctypes.c_uint32),
+ ("eventflags", ctypes.c_uint32),
+ ("label", ctypes.c_char * 32),
+ ("fd", ctypes.c_int)
+ ]
+
+def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int:
+ GPIOEVENT_REQUEST_BOTH_EDGES = 0x3
+ GPIOHANDLE_REQUEST_INPUT = 0x1
+ GPIO_GET_LINEEVENT_IOCTL = 0xc030b404
+
+ rq = gpioevent_request()
+ rq.lineoffset = pin
+ rq.handleflags = GPIOHANDLE_REQUEST_INPUT
+ rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES
+ rq.label = label.encode('utf-8')[:31] + b'\0'
+
+ fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY)
+ fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq)
+ os.close(fd)
+ return int(rq.fd)
diff --git a/common/gps.py b/common/gps.py
new file mode 100644
index 000000000..6f96d72e9
--- /dev/null
+++ b/common/gps.py
@@ -0,0 +1,8 @@
+from openpilot.common.params import Params
+
+
+def get_gps_location_service(params: Params) -> str:
+ if params.get_bool("UbloxAvailable"):
+ return "gpsLocationExternal"
+ else:
+ return "gpsLocation"
diff --git a/common/i2c.py b/common/i2c.py
new file mode 100644
index 000000000..1dfaa659a
--- /dev/null
+++ b/common/i2c.py
@@ -0,0 +1,81 @@
+import os
+import fcntl
+import ctypes
+
+# I2C constants from /usr/include/linux/i2c-dev.h
+I2C_SLAVE = 0x0703
+I2C_SLAVE_FORCE = 0x0706
+I2C_SMBUS = 0x0720
+
+# SMBus transfer types
+I2C_SMBUS_READ = 1
+I2C_SMBUS_WRITE = 0
+I2C_SMBUS_BYTE_DATA = 2
+I2C_SMBUS_I2C_BLOCK_DATA = 8
+
+I2C_SMBUS_BLOCK_MAX = 32
+
+
+class _I2cSmbusData(ctypes.Union):
+ _fields_ = [
+ ("byte", ctypes.c_uint8),
+ ("word", ctypes.c_uint16),
+ ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)),
+ ]
+
+
+class _I2cSmbusIoctlData(ctypes.Structure):
+ _fields_ = [
+ ("read_write", ctypes.c_uint8),
+ ("command", ctypes.c_uint8),
+ ("size", ctypes.c_uint32),
+ ("data", ctypes.POINTER(_I2cSmbusData)),
+ ]
+
+
+class SMBus:
+ def __init__(self, bus: int):
+ self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR)
+
+ def __enter__(self) -> 'SMBus':
+ return self
+
+ def __exit__(self, *args) -> None:
+ self.close()
+
+ def close(self) -> None:
+ if hasattr(self, '_fd') and self._fd >= 0:
+ os.close(self._fd)
+ self._fd = -1
+
+ def _set_address(self, addr: int, force: bool = False) -> None:
+ ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE
+ fcntl.ioctl(self._fd, ioctl_arg, addr)
+
+ def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None:
+ ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data))
+ fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data)
+
+ def read_byte_data(self, addr: int, register: int, force: bool = False) -> int:
+ self._set_address(addr, force)
+ data = _I2cSmbusData()
+ self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data)
+ return int(data.byte)
+
+ def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None:
+ self._set_address(addr, force)
+ data = _I2cSmbusData()
+ data.byte = value & 0xFF
+ self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data)
+
+ def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]:
+ self._set_address(addr, force)
+ if not (0 <= length <= I2C_SMBUS_BLOCK_MAX):
+ raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}")
+
+ data = _I2cSmbusData()
+ data.block[0] = length
+ self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data)
+ read_len = int(data.block[0]) or length
+ read_len = min(read_len, length)
+ return [int(b) for b in data.block[1 : read_len + 1]]
diff --git a/common/iq_perf.py b/common/iq_perf.py
new file mode 100644
index 000000000..e81bbdfdc
--- /dev/null
+++ b/common/iq_perf.py
@@ -0,0 +1,187 @@
+#!/usr/bin/env python3
+from __future__ import annotations
+
+import time
+from collections import deque
+from dataclasses import dataclass
+from typing import Any
+
+import cereal.messaging as messaging
+from cereal import custom
+from openpilot.common.swaglog import cloudlog
+
+
+TRACE_SERVICE = "iqPerfTrace"
+MAX_TRACE_SAMPLES = 16
+_SHARED_PM: messaging.PubMaster | None = None
+
+
+@dataclass(slots=True)
+class PerfSample:
+ frame_id: int = 0
+ loop_dt_us: int = 0
+ update_us: int = 0
+ state_control_us: int = 0
+ publish_us: int = 0
+ tail_work_us: int = 0
+ rk_remaining_us: int = 0
+ stale_carcontrol_us: int = 0
+ stale_carcontrol_frames: int = 0
+ sendcan_gap_us: int = 0
+ model_eval_us: int = 0
+ model_dropped_frames: int = 0
+ model_backlog: int = 0
+ texture_decode_us: int = 0
+ texture_upload_us: int = 0
+ texture_unload_us: int = 0
+ texture_prune_us: int = 0
+ texture_consume_us: int = 0
+ texture_batch_size: int = 0
+ texture_bytes: int = 0
+ texture_cache_before: int = 0
+ texture_cache_after: int = 0
+ texture_unloaded: int = 0
+ memory_usage_percent: int = 0
+ gpu_usage_percent: int = 0
+ cpu_usage_percent: int = 0
+ flags: int = 0
+
+
+class PerfTraceRing:
+ def __init__(self, size: int = MAX_TRACE_SAMPLES):
+ self._samples: deque[PerfSample] = deque(maxlen=size)
+
+ def push(self, sample: PerfSample) -> None:
+ self._samples.append(sample)
+
+ def snapshot(self) -> list[PerfSample]:
+ return list(self._samples)
+
+
+class PerfTraceEmitter:
+ _SEVERITY_MAP = {
+ "info": custom.IQPerfTrace.Severity.info,
+ "warning": custom.IQPerfTrace.Severity.warning,
+ "error": custom.IQPerfTrace.Severity.error,
+ "critical": custom.IQPerfTrace.Severity.critical,
+ }
+
+ def __init__(self, process_name: str, pubmaster: messaging.PubMaster | None = None):
+ self.process_name = process_name
+ self._pm: messaging.PubMaster | None = pubmaster
+ self._last_emit_mono: dict[str, float] = {}
+ self._disabled = False
+
+ def _pubmaster(self) -> messaging.PubMaster:
+ global _SHARED_PM
+ if self._pm is not None:
+ return self._pm
+ if _SHARED_PM is None:
+ _SHARED_PM = messaging.PubMaster([TRACE_SERVICE])
+ self._pm = _SHARED_PM
+ return self._pm
+
+ @staticmethod
+ def _clamp_uint(value: int, bits: int) -> int:
+ return max(0, min(value, (1 << bits) - 1))
+
+ @staticmethod
+ def _clamp_int(value: int, bits: int) -> int:
+ lo = -(1 << (bits - 1))
+ hi = (1 << (bits - 1)) - 1
+ return max(lo, min(value, hi))
+
+ def emit(self, event_class: str, *,
+ severity: str = "warning",
+ frame_id: int = 0,
+ total_time_us: int = 0,
+ rk_remaining_us: int = 0,
+ batch_size: int = 0,
+ dropped_frames: int = 0,
+ backlog: int = 0,
+ flags: int = 0,
+ samples: list[PerfSample] | None = None,
+ missing_services: list[str] | None = None,
+ top_processes: list[str] | None = None,
+ detail: str = "",
+ min_interval_s: float = 0.0,
+ mirror_cloudlog: bool = True) -> bool:
+ if self._disabled:
+ return False
+ now = time.monotonic()
+ last_emit = self._last_emit_mono.get(event_class, 0.0)
+ if min_interval_s > 0.0 and (now - last_emit) < min_interval_s:
+ return False
+ self._last_emit_mono[event_class] = now
+
+ msg = messaging.new_message(TRACE_SERVICE)
+ trace = msg.iqPerfTrace
+ trace.process = self.process_name
+ trace.eventClass = event_class
+ trace.severity = self._SEVERITY_MAP.get(severity, custom.IQPerfTrace.Severity.warning)
+ trace.frameId = self._clamp_uint(int(frame_id), 32)
+ trace.totalTimeUs = self._clamp_uint(int(total_time_us), 32)
+ trace.rkRemainingUs = self._clamp_int(int(rk_remaining_us), 32)
+ trace.batchSize = self._clamp_uint(int(batch_size), 16)
+ trace.droppedFrames = self._clamp_uint(int(dropped_frames), 16)
+ trace.backlog = self._clamp_uint(int(backlog), 16)
+ trace.flags = self._clamp_uint(int(flags), 32)
+ trace.missingServices = list(missing_services or [])
+ trace.topProcesses = list(top_processes or [])
+ trace.detail = detail
+
+ trace_samples = samples or []
+ samples_builder = trace.init("samples", len(trace_samples))
+ for i, sample in enumerate(trace_samples):
+ builder = samples_builder[i]
+ builder.frameId = self._clamp_uint(int(sample.frame_id), 32)
+ builder.loopDtUs = self._clamp_uint(int(sample.loop_dt_us), 32)
+ builder.updateUs = self._clamp_uint(int(sample.update_us), 32)
+ builder.stateControlUs = self._clamp_uint(int(sample.state_control_us), 32)
+ builder.publishUs = self._clamp_uint(int(sample.publish_us), 32)
+ builder.tailWorkUs = self._clamp_uint(int(sample.tail_work_us), 32)
+ builder.rkRemainingUs = self._clamp_int(int(sample.rk_remaining_us), 32)
+ builder.staleCarControlUs = self._clamp_uint(int(sample.stale_carcontrol_us), 32)
+ builder.staleCarControlFrames = self._clamp_uint(int(sample.stale_carcontrol_frames), 16)
+ builder.sendcanGapUs = self._clamp_uint(int(sample.sendcan_gap_us), 32)
+ builder.modelEvalUs = self._clamp_uint(int(sample.model_eval_us), 32)
+ builder.modelDroppedFrames = self._clamp_uint(int(sample.model_dropped_frames), 16)
+ builder.modelBacklog = self._clamp_uint(int(sample.model_backlog), 16)
+ builder.textureDecodeUs = self._clamp_uint(int(sample.texture_decode_us), 32)
+ builder.textureUploadUs = self._clamp_uint(int(sample.texture_upload_us), 32)
+ builder.textureUnloadUs = self._clamp_uint(int(sample.texture_unload_us), 32)
+ builder.texturePruneUs = self._clamp_uint(int(sample.texture_prune_us), 32)
+ builder.textureConsumeUs = self._clamp_uint(int(sample.texture_consume_us), 32)
+ builder.textureBatchSize = self._clamp_uint(int(sample.texture_batch_size), 16)
+ builder.textureBytes = self._clamp_uint(int(sample.texture_bytes), 32)
+ builder.textureCacheBefore = self._clamp_uint(int(sample.texture_cache_before), 16)
+ builder.textureCacheAfter = self._clamp_uint(int(sample.texture_cache_after), 16)
+ builder.textureUnloaded = self._clamp_uint(int(sample.texture_unloaded), 16)
+ builder.memoryUsagePercent = self._clamp_uint(int(sample.memory_usage_percent), 16)
+ builder.gpuUsagePercent = self._clamp_uint(int(sample.gpu_usage_percent), 16)
+ builder.cpuUsagePercent = self._clamp_uint(int(sample.cpu_usage_percent), 16)
+ builder.flags = self._clamp_uint(int(sample.flags), 32)
+
+ try:
+ self._pubmaster().send(TRACE_SERVICE, msg)
+ except messaging.MultiplePublishersError:
+ self._disabled = True
+ cloudlog.error(f"iq_perf_trace disabled for {self.process_name}: duplicate publisher for {TRACE_SERVICE}")
+ return False
+ except Exception:
+ cloudlog.exception(f"iq_perf_trace publish failed for {self.process_name}")
+ return False
+
+ if mirror_cloudlog:
+ cloudlog.event(
+ "iq_perf_trace",
+ process=self.process_name,
+ event_class=event_class,
+ severity=severity,
+ frame_id=int(frame_id),
+ total_time_us=int(total_time_us),
+ dropped_frames=int(dropped_frames),
+ flags=int(flags),
+ detail=detail,
+ )
+ return True
diff --git a/common/issue_debug.py b/common/issue_debug.py
new file mode 100644
index 000000000..3a8b437fc
--- /dev/null
+++ b/common/issue_debug.py
@@ -0,0 +1,44 @@
+import os
+import threading
+import time
+from datetime import datetime
+from pathlib import Path
+
+from openpilot.system.hardware import PC
+from openpilot.system.hardware.hw import Paths
+
+
+DEBUG_FILENAME = "iqpilot_issue_debug.txt"
+DEBUG_PATH = Path(Paths.comma_home()) / "community" / DEBUG_FILENAME if PC else Path("/data/community") / DEBUG_FILENAME
+
+_lock = threading.Lock()
+_last_log_times: dict[str, float] = {}
+
+
+def log_issue(tag: str, message: str) -> None:
+ try:
+ DEBUG_PATH.parent.mkdir(parents=True, exist_ok=True)
+ with _lock:
+ with open(DEBUG_PATH, "a", encoding="utf-8") as f:
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
+ f.write(f"[{timestamp}] [{tag}] {message}\n")
+ except OSError:
+ pass
+
+
+def log_issue_limited(key: str, tag: str, message: str, interval_sec: float = 1.0) -> None:
+ now = time.monotonic()
+ with _lock:
+ last = _last_log_times.get(key, 0.0)
+ if now - last < interval_sec:
+ return
+ _last_log_times[key] = now
+
+ log_issue(tag, message)
+
+
+def clear_issue_debug_log() -> None:
+ try:
+ os.remove(DEBUG_PATH)
+ except OSError:
+ pass
diff --git a/common/logging_extra.py b/common/logging_extra.py
new file mode 100644
index 000000000..ceaf083cd
--- /dev/null
+++ b/common/logging_extra.py
@@ -0,0 +1,249 @@
+import io
+import os
+import sys
+import copy
+import json
+import time
+import uuid
+import socket
+import logging
+import traceback
+import numpy as np
+from threading import local
+from collections import OrderedDict
+from contextlib import contextmanager
+
+LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ
+
+def json_handler(obj):
+ if isinstance(obj, np.bool_):
+ return bool(obj)
+ # if isinstance(obj, (datetime.date, datetime.time)):
+ # return obj.isoformat()
+ return repr(obj)
+
+def json_robust_dumps(obj):
+ return json.dumps(obj, default=json_handler)
+
+class NiceOrderedDict(OrderedDict):
+ def __str__(self):
+ return json_robust_dumps(self)
+
+class SwagFormatter(logging.Formatter):
+ def __init__(self, swaglogger):
+ logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y')
+
+ self.swaglogger = swaglogger
+ self.host = socket.gethostname()
+
+ def format_dict(self, record):
+ record_dict = NiceOrderedDict()
+
+ if isinstance(record.msg, dict):
+ record_dict['msg'] = record.msg
+ else:
+ try:
+ record_dict['msg'] = record.getMessage()
+ except (ValueError, TypeError):
+ record_dict['msg'] = [record.msg]+record.args
+
+ record_dict['ctx'] = self.swaglogger.get_ctx()
+
+ if record.exc_info:
+ record_dict['exc_info'] = self.formatException(record.exc_info)
+
+ record_dict['level'] = record.levelname
+ record_dict['levelnum'] = record.levelno
+ record_dict['name'] = record.name
+ record_dict['filename'] = record.filename
+ record_dict['lineno'] = record.lineno
+ record_dict['pathname'] = record.pathname
+ record_dict['module'] = record.module
+ record_dict['funcName'] = record.funcName
+ record_dict['host'] = self.host
+ record_dict['process'] = record.process
+ record_dict['thread'] = record.thread
+ record_dict['threadName'] = record.threadName
+ record_dict['created'] = record.created
+
+ return record_dict
+
+ def format(self, record):
+ if self.swaglogger is None:
+ raise Exception("must set swaglogger before calling format()")
+ return json_robust_dumps(self.format_dict(record))
+
+class SwagLogFileFormatter(SwagFormatter):
+ def fix_kv(self, k, v):
+ # append type to names to preserve legacy naming in logs
+ # avoids overlapping key namespaces with different types
+ # e.g. log.info() creates 'msg' -> 'msg$s'
+ # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i'
+ # because overlapping namespace 'msg' caused problems
+ if isinstance(v, (str, bytes)):
+ k += "$s"
+ elif isinstance(v, float):
+ k += "$f"
+ elif isinstance(v, bool):
+ k += "$b"
+ elif isinstance(v, int):
+ k += "$i"
+ elif isinstance(v, dict):
+ nv = {}
+ for ik, iv in v.items():
+ ik, iv = self.fix_kv(ik, iv)
+ nv[ik] = iv
+ v = nv
+ elif isinstance(v, list):
+ k += "$a"
+ return k, v
+
+ def format(self, record):
+ if isinstance(record, str):
+ v = json.loads(record)
+ else:
+ v = self.format_dict(record)
+
+ mk, mv = self.fix_kv('msg', v['msg'])
+ del v['msg']
+ v[mk] = mv
+ v['id'] = uuid.uuid4().hex
+
+ return json_robust_dumps(v)
+
+class SwagErrorFilter(logging.Filter):
+ def filter(self, record):
+ return record.levelno < logging.ERROR
+
+def _tmpfunc():
+ return 0
+
+def _srcfile():
+ return os.path.normcase(_tmpfunc.__code__.co_filename)
+
+class SwagLogger(logging.Logger):
+ def __init__(self):
+ logging.Logger.__init__(self, "swaglog")
+
+ self.global_ctx = {}
+
+ self.log_local = local()
+ self.log_local.ctx = {}
+
+ def local_ctx(self):
+ try:
+ return self.log_local.ctx
+ except AttributeError:
+ self.log_local.ctx = {}
+ return self.log_local.ctx
+
+ def get_ctx(self):
+ return dict(self.local_ctx(), **self.global_ctx)
+
+ @contextmanager
+ def ctx(self, **kwargs):
+ old_ctx = self.local_ctx()
+ self.log_local.ctx = copy.copy(old_ctx) or {}
+ self.log_local.ctx.update(kwargs)
+ try:
+ yield
+ finally:
+ self.log_local.ctx = old_ctx
+
+ def bind(self, **kwargs):
+ self.local_ctx().update(kwargs)
+
+ def bind_global(self, **kwargs):
+ self.global_ctx.update(kwargs)
+
+ def event(self, event, *args, **kwargs):
+ evt = NiceOrderedDict()
+ evt['event'] = event
+ if args:
+ evt['args'] = args
+ evt.update(kwargs)
+ if 'error' in kwargs:
+ self.error(evt)
+ elif 'debug' in kwargs:
+ self.debug(evt)
+ else:
+ self.info(evt)
+
+ def timestamp(self, event_name):
+ if LOG_TIMESTAMPS:
+ t = time.monotonic()
+ tstp = NiceOrderedDict()
+ tstp['timestamp'] = NiceOrderedDict()
+ tstp['timestamp']["event"] = event_name
+ tstp['timestamp']["time"] = t*1e9
+ self.debug(tstp)
+
+ def findCaller(self, stack_info=False, stacklevel=1):
+ """
+ Find the stack frame of the caller so that we can note the source
+ file name, line number and function name.
+ """
+ f = sys._getframe(3)
+ #On some versions of IronPython, currentframe() returns None if
+ #IronPython isn't run with -X:Frames.
+ if f is not None:
+ f = f.f_back
+ orig_f = f
+ while f and stacklevel > 1:
+ f = f.f_back
+ stacklevel -= 1
+ if not f:
+ f = orig_f
+ rv = "(unknown file)", 0, "(unknown function)", None
+ while hasattr(f, "f_code"):
+ co = f.f_code
+ filename = os.path.normcase(co.co_filename)
+
+ if filename == _srcfile:
+ f = f.f_back
+ continue
+ sinfo = None
+ if stack_info:
+ sio = io.StringIO()
+ sio.write('Stack (most recent call last):\n')
+ traceback.print_stack(f, file=sio)
+ sinfo = sio.getvalue()
+ if sinfo[-1] == '\n':
+ sinfo = sinfo[:-1]
+ sio.close()
+ rv = (co.co_filename, f.f_lineno, co.co_name, sinfo)
+ break
+ return rv
+
+if __name__ == "__main__":
+ log = SwagLogger()
+
+ stdout_handler = logging.StreamHandler(sys.stdout)
+ stdout_handler.setLevel(logging.INFO)
+ stdout_handler.addFilter(SwagErrorFilter())
+ log.addHandler(stdout_handler)
+
+ stderr_handler = logging.StreamHandler(sys.stderr)
+ stderr_handler.setLevel(logging.ERROR)
+ log.addHandler(stderr_handler)
+
+ log.info("asdasd %s", "a")
+ log.info({'wut': 1})
+ log.warning("warning")
+ log.error("error")
+ log.critical("critical")
+ log.event("test", x="y")
+
+ with log.ctx():
+ stdout_handler.setFormatter(SwagFormatter(log))
+ stderr_handler.setFormatter(SwagFormatter(log))
+ log.bind(user="some user")
+ log.info("in req")
+ print("")
+ log.warning("warning")
+ print("")
+ log.error("error")
+ print("")
+ log.critical("critical")
+ print("")
+ log.event("do_req", a=1, b="c")
diff --git a/common/markdown.py b/common/markdown.py
new file mode 100644
index 000000000..f0f056d96
--- /dev/null
+++ b/common/markdown.py
@@ -0,0 +1,45 @@
+HTML_REPLACEMENTS = [
+ (r'&', r'&'),
+ (r'"', r'"'),
+]
+
+def parse_markdown(text: str, tab_length: int = 2) -> str:
+ lines = text.split("\n")
+ output: list[str] = []
+ list_level = 0
+
+ def end_outstanding_lists(level: int, end_level: int) -> int:
+ while level > end_level:
+ level -= 1
+ output.append("")
+ if level > 0:
+ output.append("")
+ return end_level
+
+ for i, line in enumerate(lines):
+ if i + 1 < len(lines) and lines[i + 1].startswith("==="): # heading
+ output.append(f"{line} ")
+ elif line.startswith("==="):
+ pass
+ elif line.lstrip().startswith("* "): # list
+ line_level = 1 + line.count(" " * tab_length, 0, line.index("*"))
+ if list_level >= line_level:
+ list_level = end_outstanding_lists(list_level, line_level)
+ else:
+ list_level += 1
+ if list_level > 1:
+ output[-1] = output[-1].replace("", "")
+ output.append("")
+ output.append(f"{line.replace('*', '', 1).lstrip()} ")
+ else:
+ list_level = end_outstanding_lists(list_level, 0)
+ if len(line) > 0:
+ output.append(line)
+
+ end_outstanding_lists(list_level, 0)
+ output_str = "\n".join(output) + "\n"
+
+ for (fr, to) in HTML_REPLACEMENTS:
+ output_str = output_str.replace(fr, to)
+
+ return output_str
diff --git a/common/mock/__init__.py b/common/mock/__init__.py
new file mode 100644
index 000000000..4b01dfe84
--- /dev/null
+++ b/common/mock/__init__.py
@@ -0,0 +1,50 @@
+"""
+Utilities for generating mock messages for testing.
+example in common/tests/test_mock.py
+"""
+
+
+import functools
+import threading
+from cereal.messaging import PubMaster
+from cereal.services import SERVICE_LIST
+from openpilot.common.mock.generators import generate_livePose
+from openpilot.common.realtime import Ratekeeper
+
+
+MOCK_GENERATOR = {
+ "livePose": generate_livePose
+}
+
+
+def generate_messages_loop(services: list[str], done: threading.Event):
+ pm = PubMaster(services)
+ rk = Ratekeeper(100)
+ i = 0
+ while not done.is_set():
+ for s in services:
+ should_send = i % (100/SERVICE_LIST[s].frequency) == 0
+ if should_send:
+ message = MOCK_GENERATOR[s]()
+ pm.send(s, message)
+ i += 1
+ rk.keep_time()
+
+
+def mock_messages(services: list[str] | str):
+ if isinstance(services, str):
+ services = [services]
+
+ def decorator(func):
+ @functools.wraps(func)
+ def wrapper(*args, **kwargs):
+ done = threading.Event()
+ t = threading.Thread(target=generate_messages_loop, args=(services, done))
+ t.start()
+ try:
+ return func(*args, **kwargs)
+ finally:
+ done.set()
+ t.join()
+ return wrapper
+ return decorator
diff --git a/common/mock/generators.py b/common/mock/generators.py
new file mode 100644
index 000000000..5cd9c88a5
--- /dev/null
+++ b/common/mock/generators.py
@@ -0,0 +1,14 @@
+from cereal import messaging
+
+
+def generate_livePose():
+ msg = messaging.new_message('livePose')
+ meas = {'x': 0.0, 'y': 0.0, 'z': 0.0, 'xStd': 0.0, 'yStd': 0.0, 'zStd': 0.0, 'valid': True}
+ msg.livePose.orientationNED = meas
+ msg.livePose.velocityDevice = meas
+ msg.livePose.angularVelocityDevice = meas
+ msg.livePose.accelerationDevice = meas
+ msg.livePose.inputsOK = True
+ msg.livePose.posenetOK = True
+ msg.livePose.sensorsOK = True
+ return msg
diff --git a/common/params.py b/common/params.py
new file mode 100644
index 000000000..231522062
--- /dev/null
+++ b/common/params.py
@@ -0,0 +1,144 @@
+try:
+ from openpilot.common.params_pyx import Params, ParamKeyFlag, ParamKeyType, UnknownKeyName
+except ImportError:
+ import os
+ import threading
+ from enum import IntEnum, IntFlag
+
+ class UnknownKeyName(Exception):
+ pass
+
+ class ParamKeyFlag(IntFlag):
+ # must stay in lockstep with enum ParamKeyFlag in common/params.h
+ PERSISTENT = 0x02
+ CLEAR_ON_MANAGER_START = 0x04
+ CLEAR_ON_ONROAD_TRANSITION = 0x08
+ CLEAR_ON_OFFROAD_TRANSITION = 0x10
+ DONT_LOG = 0x20
+ DEVELOPMENT_ONLY = 0x40
+ CLEAR_ON_IGNITION_ON = 0x80
+ ALL = 0xFFFFFFFF
+
+ class ParamKeyType(IntEnum):
+ STRING = 0
+ BOOL = 1
+ INT = 2
+ FLOAT = 3
+ TIME = 4
+ JSON = 5
+ BYTES = 6
+
+ class Params:
+ def __init__(self, path: str = ""):
+ root = path or os.environ.get("PARAMS_ROOT", "/data/params")
+ # keys live under /d (comma.sh sets up the d -> d_tmp symlink on a fresh boot)
+ self._d = os.path.join(root, "d")
+ self._lock = threading.Lock()
+
+ def _p(self, key):
+ if isinstance(key, bytes):
+ key = key.decode()
+ return os.path.join(self._d, key)
+
+ def check_key(self, key):
+ return True
+
+ def get(self, key, block: bool = False, return_default: bool = False, encoding=None):
+ try:
+ with open(self._p(key), "rb") as f:
+ dat = f.read()
+ except (FileNotFoundError, NotADirectoryError, IsADirectoryError):
+ return None
+ if encoding is not None:
+ return dat.decode(encoding)
+ # params_pyx returns string-typed values decoded; default to utf-8, fall back to raw bytes
+ try:
+ return dat.decode("utf-8")
+ except UnicodeDecodeError:
+ return dat
+
+ def get_bool(self, key, block: bool = False) -> bool:
+ try:
+ with open(self._p(key), "rb") as f:
+ return f.read() == b"1"
+ except (FileNotFoundError, NotADirectoryError, IsADirectoryError):
+ return False
+
+ def get_int(self, key, block: bool = False) -> int:
+ value = self.get(key, block=block)
+ return int(value) if value else 0
+
+ def get_float(self, key, block: bool = False) -> float:
+ value = self.get(key, block=block)
+ return float(value) if value else 0.0
+
+ def put(self, key, dat):
+ if isinstance(dat, str):
+ dat = dat.encode("utf-8")
+ with self._lock:
+ os.makedirs(self._d, exist_ok=True)
+ p = self._p(key)
+ tmp = p + ".tmp"
+ with open(tmp, "wb") as f:
+ f.write(dat)
+ f.flush()
+ os.fsync(f.fileno())
+ os.rename(tmp, p)
+
+ def put_bool(self, key, val: bool):
+ self.put(key, b"1" if val else b"0")
+
+ def put_int(self, key, val: int):
+ self.put(key, str(val))
+
+ def put_float(self, key, val: float):
+ self.put(key, str(val))
+
+ def put_nonblocking(self, key, dat):
+ self.put(key, dat)
+
+ def put_bool_nonblocking(self, key, val: bool):
+ self.put_bool(key, val)
+
+ def put_int_nonblocking(self, key, val: int):
+ self.put_int(key, val)
+
+ def put_float_nonblocking(self, key, val: float):
+ self.put_float(key, val)
+
+ def remove(self, key):
+ try:
+ os.remove(self._p(key))
+ except FileNotFoundError:
+ pass
+
+ def clear_all(self, tx_type=None):
+ pass
+
+ def get_param_path(self, key: str = "") -> str:
+ return self._p(key) if key else self._d
+
+ def all_keys(self):
+ try:
+ return [k.encode() for k in os.listdir(self._d)]
+ except FileNotFoundError:
+ return []
+
+assert Params
+assert ParamKeyFlag
+assert ParamKeyType
+assert UnknownKeyName
+
+if __name__ == "__main__":
+ import sys
+
+ params = Params()
+ key = sys.argv[1]
+ assert params.check_key(key), f"unknown param: {key}"
+
+ if len(sys.argv) == 3:
+ val = sys.argv[2]
+ print(f"SET: {key} = {val}")
+ params.put(key, val)
+ elif len(sys.argv) == 2:
+ print(f"GET: {key} = {params.get(key)}")
diff --git a/common/params_pyx.so b/common/params_pyx.so
new file mode 100755
index 000000000..b78cfcc9c
Binary files /dev/null and b/common/params_pyx.so differ
diff --git a/common/pid.py b/common/pid.py
new file mode 100644
index 000000000..b3d64d6fc
--- /dev/null
+++ b/common/pid.py
@@ -0,0 +1,57 @@
+import numpy as np
+from numbers import Number
+
+class PIDController:
+ def __init__(self, k_p, k_i, k_d=0., pos_limit=1e308, neg_limit=-1e308, rate=100):
+ self._k_p: list[list[float]] = [[0], [k_p]] if isinstance(k_p, Number) else k_p
+ self._k_i: list[list[float]] = [[0], [k_i]] if isinstance(k_i, Number) else k_i
+ self._k_d: list[list[float]] = [[0], [k_d]] if isinstance(k_d, Number) else k_d
+
+ self.set_limits(pos_limit, neg_limit)
+
+ self.i_dt = 1.0 / rate
+ self.speed = 0.0
+
+ self.reset()
+
+ @property
+ def k_p(self):
+ return np.interp(self.speed, self._k_p[0], self._k_p[1])
+
+ @property
+ def k_i(self):
+ return np.interp(self.speed, self._k_i[0], self._k_i[1])
+
+ @property
+ def k_d(self):
+ return np.interp(self.speed, self._k_d[0], self._k_d[1])
+
+ def reset(self):
+ self.p = 0.0
+ self.i = 0.0
+ self.d = 0.0
+ self.f = 0.0
+ self.control = 0
+
+ def set_limits(self, pos_limit, neg_limit):
+ self.pos_limit = pos_limit
+ self.neg_limit = neg_limit
+
+ def update(self, error, error_rate=0.0, speed=0.0, feedforward=0., freeze_integrator=False):
+ self.speed = speed
+ self.p = self.k_p * float(error)
+ self.d = self.k_d * error_rate
+ self.f = feedforward
+
+ if not freeze_integrator:
+ i = self.i + self.k_i * self.i_dt * error
+
+ # Don't allow windup if already clipping
+ test_control = self.p + i + self.d + self.f
+ i_upperbound = self.i if test_control > self.pos_limit else self.pos_limit
+ i_lowerbound = self.i if test_control < self.neg_limit else self.neg_limit
+ self.i = np.clip(i, i_lowerbound, i_upperbound)
+
+ control = self.p + self.i + self.d + self.f
+ self.control = np.clip(control, self.neg_limit, self.pos_limit)
+ return self.control
diff --git a/common/prefix.py b/common/prefix.py
new file mode 100644
index 000000000..d0a5f9262
--- /dev/null
+++ b/common/prefix.py
@@ -0,0 +1,61 @@
+import os
+import platform
+import shutil
+import uuid
+
+
+from openpilot.common.params import Params
+from openpilot.system.hardware import PC
+from openpilot.system.hardware.hw import Paths
+from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT
+
+class OpenpilotPrefix:
+ def __init__(self, prefix: str | None = None, create_dirs_on_enter: bool = True, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False):
+ self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15])
+ shm_path = "/tmp" if platform.system() == "Darwin" else "/dev/shm"
+ self.msgq_path = os.path.join(shm_path, "msgq_" + self.prefix)
+ self.create_dirs_on_enter = create_dirs_on_enter
+ self.clean_dirs_on_exit = clean_dirs_on_exit
+ self.shared_download_cache = shared_download_cache
+
+ def __enter__(self):
+ self.original_prefix = os.environ.get('OPENPILOT_PREFIX', None)
+ os.environ['OPENPILOT_PREFIX'] = self.prefix
+
+ if self.create_dirs_on_enter:
+ self.create_dirs()
+
+ if self.shared_download_cache:
+ os.environ["COMMA_CACHE"] = DEFAULT_DOWNLOAD_CACHE_ROOT
+
+ return self
+
+ def __exit__(self, exc_type, exc_obj, exc_tb):
+ if self.clean_dirs_on_exit:
+ self.clean_dirs()
+ try:
+ del os.environ['OPENPILOT_PREFIX']
+ if self.original_prefix is not None:
+ os.environ['OPENPILOT_PREFIX'] = self.original_prefix
+ except KeyError:
+ pass
+ return False
+
+ def create_dirs(self):
+ try:
+ os.mkdir(self.msgq_path)
+ except FileExistsError:
+ pass
+ os.makedirs(Paths.log_root(), exist_ok=True)
+
+ def clean_dirs(self):
+ symlink_path = Params().get_param_path()
+ if os.path.exists(symlink_path):
+ shutil.rmtree(os.path.realpath(symlink_path), ignore_errors=True)
+ os.remove(symlink_path)
+ shutil.rmtree(self.msgq_path, ignore_errors=True)
+ if PC:
+ shutil.rmtree(Paths.log_root(), ignore_errors=True)
+ if not os.environ.get("COMMA_CACHE", False):
+ shutil.rmtree(Paths.download_cache_root(), ignore_errors=True)
+ shutil.rmtree(Paths.comma_home(), ignore_errors=True)
diff --git a/common/realtime.py b/common/realtime.py
new file mode 100644
index 000000000..bb5153bbb
--- /dev/null
+++ b/common/realtime.py
@@ -0,0 +1,117 @@
+"""Utilities for reading real time clocks and keeping soft real time constraints."""
+import gc
+import os
+import sys
+import time
+
+from setproctitle import getproctitle
+
+from openpilot.common.utils import MovingAverage
+from openpilot.system.hardware import PC
+
+
+# time step for each process
+DT_CTRL = 0.01 # controlsd
+DT_MDL = 0.05 # model
+DT_HW = 0.5 # hardwared and manager
+DT_DMON = 0.05 # driver monitoring
+
+
+class Priority:
+ # CORE 2
+ # - modeld = 55
+ # - camerad = 54
+ CTRL_LOW = 51 # plannerd & radard
+
+ # CORE 3
+ # - pandad = 55
+ CTRL_HIGH = 53
+
+
+def set_core_affinity(cores: list[int]) -> None:
+ if sys.platform == 'linux' and not PC:
+ os.sched_setaffinity(0, cores)
+
+
+def config_realtime_process(cores: int | list[int], priority: int) -> None:
+ gc.disable()
+ if sys.platform == 'linux' and not PC:
+ os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(priority))
+ c = cores if isinstance(cores, list) else [cores, ]
+ set_core_affinity(c)
+
+
+def lock_memory() -> None:
+ """mlockall this process so memory reclaim/compaction can't stall it. RT control
+ procs only (locking ui/modeld would worsen pressure). Best-effort."""
+ if sys.platform != 'linux' or PC:
+ return
+ try:
+ import ctypes
+ import resource
+ resource.setrlimit(resource.RLIMIT_MEMLOCK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
+ MCL_CURRENT, MCL_FUTURE = 0x1, 0x2
+ libc = ctypes.CDLL("libc.so.6", use_errno=True)
+ if libc.mlockall(MCL_CURRENT | MCL_FUTURE) != 0:
+ raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno()))
+ except Exception as e:
+ try:
+ from openpilot.common.swaglog import cloudlog
+ cloudlog.warning(f"lock_memory (mlockall) failed: {e}")
+ except Exception:
+ pass
+
+
+class Ratekeeper:
+ def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None:
+ """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative."""
+ self._interval = 1. / rate
+ self._print_delay_threshold = print_delay_threshold
+ self._frame = 0
+ self._remaining = 0.0
+ self._process_name = getproctitle()
+ self._last_monitor_time = -1.
+ self._next_frame_time = -1.
+
+ self.avg_dt = MovingAverage(100)
+ self.avg_dt.add_value(self._interval)
+
+ @property
+ def frame(self) -> int:
+ return self._frame
+
+ @property
+ def remaining(self) -> float:
+ return self._remaining
+
+ @property
+ def lagging(self) -> bool:
+ expected_dt = self._interval * (1 / 0.9)
+ return self.avg_dt.get_average() > expected_dt
+
+ # Maintain loop rate by calling this at the end of each loop
+ def keep_time(self) -> bool:
+ lagged = self.monitor_time()
+ if self._remaining > 0:
+ time.sleep(self._remaining)
+ return lagged
+
+ # Monitors the cumulative lag, but does not enforce a rate
+ def monitor_time(self) -> bool:
+ if self._last_monitor_time < 0:
+ self._next_frame_time = time.monotonic() + self._interval
+ self._last_monitor_time = time.monotonic()
+
+ prev = self._last_monitor_time
+ self._last_monitor_time = time.monotonic()
+ self.avg_dt.add_value(self._last_monitor_time - prev)
+
+ lagged = False
+ remaining = self._next_frame_time - time.monotonic()
+ self._next_frame_time += self._interval
+ if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold:
+ print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms")
+ lagged = True
+ self._frame += 1
+ self._remaining = remaining
+ return lagged
diff --git a/common/simple_kalman.py b/common/simple_kalman.py
new file mode 100644
index 000000000..194b27204
--- /dev/null
+++ b/common/simple_kalman.py
@@ -0,0 +1,54 @@
+import numpy as np
+
+
+def get_kalman_gain(dt, A, C, Q, R, iterations=100):
+ P = np.zeros_like(Q)
+ for _ in range(iterations):
+ P = A.dot(P).dot(A.T) + dt * Q
+ S = C.dot(P).dot(C.T) + R
+ K = P.dot(C.T).dot(np.linalg.inv(S))
+ P = (np.eye(len(P)) - K.dot(C)).dot(P)
+ return K
+
+
+class KF1D:
+ # this EKF assumes constant covariance matrix, so calculations are much simpler
+ # the Kalman gain also needs to be precomputed using the control module
+
+ def __init__(self, x0, A, C, K):
+ self.x0_0 = x0[0][0]
+ self.x1_0 = x0[1][0]
+ self.A0_0 = A[0][0]
+ self.A0_1 = A[0][1]
+ self.A1_0 = A[1][0]
+ self.A1_1 = A[1][1]
+ self.C0_0 = C[0]
+ self.C0_1 = C[1]
+ self.K0_0 = K[0][0]
+ self.K1_0 = K[1][0]
+
+ self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0
+ self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1
+ self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0
+ self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1
+
+ # K matrix needs to be pre-computed as follow:
+ # import control
+ # (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R)
+ # self.K = np.transpose(K)
+
+ def update(self, meas):
+ #self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas)
+ x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas
+ x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas
+ self.x0_0 = x0_0
+ self.x1_0 = x1_0
+ return [self.x0_0, self.x1_0]
+
+ @property
+ def x(self):
+ return [[self.x0_0], [self.x1_0]]
+
+ def set_x(self, x):
+ self.x0_0 = x[0][0]
+ self.x1_0 = x[1][0]
diff --git a/common/spinner.py b/common/spinner.py
new file mode 100755
index 000000000..12a816eaf
--- /dev/null
+++ b/common/spinner.py
@@ -0,0 +1,52 @@
+import os
+import subprocess
+from openpilot.common.basedir import BASEDIR
+
+
+class Spinner:
+ def __init__(self):
+ try:
+ self.spinner_proc = subprocess.Popen(["./spinner.py"],
+ stdin=subprocess.PIPE,
+ cwd=os.path.join(BASEDIR, "system", "ui"),
+ close_fds=True)
+ except OSError:
+ self.spinner_proc = None
+
+ def __enter__(self):
+ return self
+
+ def update(self, spinner_text: str):
+ if self.spinner_proc is not None:
+ self.spinner_proc.stdin.write(spinner_text.encode('utf8') + b"\n")
+ try:
+ self.spinner_proc.stdin.flush()
+ except BrokenPipeError:
+ pass
+
+ def update_progress(self, cur: float, total: float):
+ self.update(str(round(100 * cur / total)))
+
+ def close(self):
+ if self.spinner_proc is not None:
+ self.spinner_proc.kill()
+ try:
+ self.spinner_proc.communicate(timeout=2.)
+ except subprocess.TimeoutExpired:
+ print("WARNING: failed to kill spinner")
+ self.spinner_proc = None
+
+ def __del__(self):
+ self.close()
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.close()
+
+
+if __name__ == "__main__":
+ import time
+ with Spinner() as s:
+ s.update("Spinner text")
+ time.sleep(5.0)
+ print("gone")
+ time.sleep(5.0)
diff --git a/common/stat_live.py b/common/stat_live.py
new file mode 100644
index 000000000..3901c448d
--- /dev/null
+++ b/common/stat_live.py
@@ -0,0 +1,73 @@
+import numpy as np
+
+class RunningStat:
+ # tracks realtime mean and standard deviation without storing any data
+ def __init__(self, priors=None, max_trackable=-1):
+ self.max_trackable = max_trackable
+ if priors is not None:
+ # initialize from history
+ self.M = priors[0]
+ self.S = priors[1]
+ self.n = priors[2]
+ self.M_last = self.M
+ self.S_last = self.S
+
+ else:
+ self.reset()
+
+ def reset(self):
+ self.M = 0.
+ self.S = 0.
+ self.M_last = 0.
+ self.S_last = 0.
+ self.n = 0
+
+ def push_data(self, new_data):
+ # short term memory hack
+ if self.max_trackable < 0 or self.n < self.max_trackable:
+ self.n += 1
+ if self.n == 0:
+ self.M_last = new_data
+ self.M = self.M_last
+ self.S_last = 0.
+ else:
+ self.M = self.M_last + (new_data - self.M_last) / self.n
+ self.S = self.S_last + (new_data - self.M_last) * (new_data - self.M)
+ self.M_last = self.M
+ self.S_last = self.S
+
+ def mean(self):
+ return self.M
+
+ def variance(self):
+ if self.n >= 2:
+ return self.S / (self.n - 1.)
+ else:
+ return 0
+
+ def std(self):
+ return np.sqrt(self.variance())
+
+ def params_to_save(self):
+ return [self.M, self.S, self.n]
+
+class RunningStatFilter:
+ def __init__(self, raw_priors=None, filtered_priors=None, max_trackable=-1):
+ self.raw_stat = RunningStat(raw_priors, -1)
+ self.filtered_stat = RunningStat(filtered_priors, max_trackable)
+
+ def reset(self):
+ self.raw_stat.reset()
+ self.filtered_stat.reset()
+
+ def push_and_update(self, new_data):
+ _std_last = self.raw_stat.std()
+ self.raw_stat.push_data(new_data)
+ _delta_std = self.raw_stat.std() - _std_last
+ if _delta_std <= 0:
+ self.filtered_stat.push_data(new_data)
+ else:
+ pass
+ # self.filtered_stat.push_data(self.filtered_stat.mean())
+
+# class SequentialBayesian():
diff --git a/common/swaglog.py b/common/swaglog.py
new file mode 100644
index 000000000..d68bbf7a9
--- /dev/null
+++ b/common/swaglog.py
@@ -0,0 +1,165 @@
+import logging
+import os
+import sys
+import time
+import warnings
+from pathlib import Path
+from logging.handlers import BaseRotatingHandler
+
+import zmq
+
+from openpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter
+from openpilot.system.hardware.hw import Paths
+
+
+def get_file_handler():
+ Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True)
+ base_filename = os.path.join(Paths.swaglog_root(), "swaglog")
+ handler = SwaglogRotatingFileHandler(base_filename)
+ return handler
+
+class SwaglogRotatingFileHandler(BaseRotatingHandler):
+ def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None):
+ super().__init__(base_filename, mode="a", encoding=encoding, delay=True)
+ self.base_filename = base_filename
+ self.interval = interval # seconds
+ self.max_bytes = max_bytes
+ self.backup_count = backup_count
+ self.log_files = self.get_existing_logfiles()
+ log_indexes = [f.split(".")[-1] for f in self.log_files]
+ self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1])
+ self.last_rollover = None
+ self.doRollover()
+
+ def _open(self):
+ self.last_rollover = time.monotonic()
+ self.last_file_idx += 1
+ next_filename = f"{self.base_filename}.{self.last_file_idx:010}"
+ stream = open(next_filename, self.mode, encoding=self.encoding)
+ self.log_files.insert(0, next_filename)
+ return stream
+
+ def get_existing_logfiles(self):
+ log_files = list()
+ base_dir = os.path.dirname(self.base_filename)
+ for fn in os.listdir(base_dir):
+ fp = os.path.join(base_dir, fn)
+ if fp.startswith(self.base_filename) and os.path.isfile(fp):
+ log_files.append(fp)
+ return sorted(log_files)
+
+ def shouldRollover(self, record):
+ size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes
+ time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic()
+ return size_exceeded or time_exceeded
+
+ def doRollover(self):
+ if self.stream:
+ self.stream.close()
+ self.stream = self._open()
+
+ if self.backup_count > 0:
+ while len(self.log_files) > self.backup_count:
+ to_delete = self.log_files.pop()
+ if os.path.exists(to_delete): # just being safe, should always exist
+ os.remove(to_delete)
+
+class UnixDomainSocketHandler(logging.Handler):
+ def __init__(self, formatter):
+ logging.Handler.__init__(self)
+ self.setFormatter(formatter)
+ self.pid = None
+
+ self.zctx = None
+ self.sock = None
+
+ def __del__(self):
+ self.close()
+
+ def close(self):
+ if self.sock is not None:
+ self.sock.close()
+ if self.zctx is not None:
+ self.zctx.term()
+
+ def connect(self):
+ self.zctx = zmq.Context()
+ self.sock = self.zctx.socket(zmq.PUSH)
+ self.sock.setsockopt(zmq.LINGER, 10)
+ self.sock.connect(Paths.swaglog_ipc())
+ self.pid = os.getpid()
+
+ def emit(self, record):
+ if os.getpid() != self.pid:
+ # TODO suppresses warning about forking proc with zmq socket, fix root cause
+ warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*")
+ self.connect()
+
+ msg = self.format(record).rstrip('\n')
+ # print("SEND".format(repr(msg)))
+ try:
+ s = chr(record.levelno)+msg
+ self.sock.send(s.encode('utf8'), zmq.NOBLOCK)
+ except zmq.error.Again:
+ # drop :/
+ pass
+
+
+class ForwardingHandler(logging.Handler):
+ def __init__(self, target_logger):
+ super().__init__()
+ self.target_logger = target_logger
+
+ def emit(self, record):
+ self.target_logger.handle(record)
+
+
+def add_file_handler(log):
+ """
+ Function to add the file log handler to swaglog.
+ This can be used to store logs when logmessaged is not running.
+ """
+ handler = get_file_handler()
+ handler.setFormatter(SwagLogFileFormatter(log))
+ log.addHandler(handler)
+
+
+cloudlog = log = SwagLogger()
+log.setLevel(logging.DEBUG)
+
+
+class PrettyConsoleFormatter(logging.Formatter):
+ # StreamHandler writes to stderr, so tty-gate on that
+ _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None
+
+ def format(self, record):
+ msg = record.getMessage()
+ if not self._COLOR:
+ return f"{record.filename}: {msg}"
+ lvl = record.levelno
+ if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT"
+ elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR"
+ elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN"
+ elif lvl >= 20: lc, ln = "\033[38;5;110m", "info"
+ else: lc, ln = "\033[38;5;244m", " dbg"
+ body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg
+ src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m "
+ return f"{lc}{ln:>4}\033[0m {src}{body}"
+
+
+outhandler = logging.StreamHandler()
+outhandler.setFormatter(PrettyConsoleFormatter())
+
+print_level = os.environ.get('LOGPRINT', 'warning')
+if print_level == 'debug':
+ outhandler.setLevel(logging.DEBUG)
+elif print_level == 'info':
+ outhandler.setLevel(logging.INFO)
+elif print_level == 'warning':
+ outhandler.setLevel(logging.WARNING)
+
+ipchandler = UnixDomainSocketHandler(SwagFormatter(log))
+
+log.addHandler(outhandler)
+# logs are sent through IPC before writing to disk to prevent disk I/O blocking
+log.addHandler(ipchandler)
diff --git a/common/tests/.gitignore b/common/tests/.gitignore
new file mode 100644
index 000000000..6cddfc7bd
--- /dev/null
+++ b/common/tests/.gitignore
@@ -0,0 +1 @@
+test_common
diff --git a/common/tests/__init__.py b/common/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/common/tests/test_file_helpers.py b/common/tests/test_file_helpers.py
new file mode 100644
index 000000000..c2b880f87
--- /dev/null
+++ b/common/tests/test_file_helpers.py
@@ -0,0 +1,19 @@
+import os
+from uuid import uuid4
+
+from openpilot.common.utils import atomic_write
+
+
+class TestFileHelpers:
+ def run_atomic_write_func(self, atomic_write_func):
+ path = f"/tmp/tmp{uuid4()}"
+ with atomic_write_func(path) as f:
+ f.write("test")
+ assert not os.path.exists(path)
+
+ with open(path) as f:
+ assert f.read() == "test"
+ os.remove(path)
+
+ def test_atomic_write(self):
+ self.run_atomic_write_func(atomic_write)
diff --git a/common/tests/test_markdown.py b/common/tests/test_markdown.py
new file mode 100644
index 000000000..7e04bf292
--- /dev/null
+++ b/common/tests/test_markdown.py
@@ -0,0 +1,15 @@
+import os
+
+from openpilot.common.basedir import BASEDIR
+from openpilot.common.markdown import parse_markdown
+
+
+class TestMarkdown:
+ def test_all_release_notes(self):
+ with open(os.path.join(BASEDIR, "CHANGELOG.md")) as f:
+ release_notes = f.read().split("\n\n")
+ assert len(release_notes) > 10
+
+ for rn in release_notes:
+ md = parse_markdown(rn)
+ assert len(md) > 0
diff --git a/common/tests/test_params.py b/common/tests/test_params.py
new file mode 100644
index 000000000..e77724181
--- /dev/null
+++ b/common/tests/test_params.py
@@ -0,0 +1,145 @@
+import pytest
+import datetime
+import os
+import threading
+import time
+import uuid
+
+from openpilot.common.params import Params, ParamKeyFlag, UnknownKeyName
+
+class TestParams:
+ def setup_method(self):
+ self.params = Params()
+
+ def test_params_put_and_get(self):
+ self.params.put("DongleId", "cb38263377b873ee")
+ assert self.params.get("DongleId") == "cb38263377b873ee"
+
+ def test_params_non_ascii(self):
+ st = b"\xe1\x90\xff"
+ self.params.put("CarParams", st)
+ assert self.params.get("CarParams") == st
+
+ def test_params_get_cleared_manager_start(self):
+ self.params.put("CarParams", b"test")
+ self.params.put("DongleId", "cb38263377b873ee")
+ assert self.params.get("CarParams") == b"test"
+
+ undefined_param = self.params.get_param_path(uuid.uuid4().hex)
+ with open(undefined_param, "w") as f:
+ f.write("test")
+ assert os.path.isfile(undefined_param)
+
+ self.params.clear_all(ParamKeyFlag.CLEAR_ON_MANAGER_START)
+ assert self.params.get("CarParams") is None
+ assert self.params.get("DongleId") is not None
+ assert not os.path.isfile(undefined_param)
+
+ def test_params_two_things(self):
+ self.params.put("DongleId", "bob")
+ self.params.put("AthenadPid", 123)
+ assert self.params.get("DongleId") == "bob"
+ assert self.params.get("AthenadPid") == 123
+
+ def test_params_get_block(self):
+ def _delayed_writer():
+ time.sleep(0.1)
+ self.params.put("CarParams", b"test")
+ threading.Thread(target=_delayed_writer).start()
+ assert self.params.get("CarParams") is None
+ assert self.params.get("CarParams", block=True) == b"test"
+
+ def test_params_unknown_key_fails(self):
+ with pytest.raises(UnknownKeyName):
+ self.params.get("swag")
+
+ with pytest.raises(UnknownKeyName):
+ self.params.get_bool("swag")
+
+ with pytest.raises(UnknownKeyName):
+ self.params.put("swag", "abc")
+
+ with pytest.raises(UnknownKeyName):
+ self.params.put_bool("swag", True)
+
+ def test_remove_not_there(self):
+ assert self.params.get("CarParams") is None
+ self.params.remove("CarParams")
+ assert self.params.get("CarParams") is None
+
+ def test_get_bool(self):
+ self.params.remove("IsMetric")
+ assert not self.params.get_bool("IsMetric")
+
+ self.params.put_bool("IsMetric", True)
+ assert self.params.get_bool("IsMetric")
+
+ self.params.put_bool("IsMetric", False)
+ assert not self.params.get_bool("IsMetric")
+
+ self.params.put("IsMetric", True)
+ assert self.params.get_bool("IsMetric")
+
+ self.params.put("IsMetric", False)
+ assert not self.params.get_bool("IsMetric")
+
+ def test_navigation_disabled_default(self):
+ self.params.remove("NavigationEnabled")
+ assert not self.params.get_bool("NavigationEnabled")
+
+ def test_put_non_blocking_with_get_block(self):
+ q = Params()
+ def _delayed_writer():
+ time.sleep(0.1)
+ Params().put_nonblocking("CarParams", b"test")
+ threading.Thread(target=_delayed_writer).start()
+ assert q.get("CarParams") is None
+ assert q.get("CarParams", True) == b"test"
+
+ def test_put_bool_non_blocking_with_get_block(self):
+ q = Params()
+ def _delayed_writer():
+ time.sleep(0.1)
+ Params().put_bool_nonblocking("CarParams", True)
+ threading.Thread(target=_delayed_writer).start()
+ assert q.get("CarParams") is None
+ assert q.get("CarParams", True) == b"1"
+
+ def test_params_all_keys(self):
+ keys = Params().all_keys()
+
+ # sanity checks
+ assert len(keys) > 20
+ assert len(keys) == len(set(keys))
+ assert b"CarParams" in keys
+
+ def test_params_default_value(self):
+ self.params.remove("LanguageSetting")
+ self.params.remove("LongitudinalPersonality")
+ self.params.remove("LiveParameters")
+
+ assert self.params.get("LanguageSetting") is None
+ assert self.params.get("LanguageSetting", return_default=False) is None
+ assert isinstance(self.params.get("LanguageSetting", return_default=True), str)
+ assert isinstance(self.params.get("LongitudinalPersonality", return_default=True), int)
+ assert self.params.get("LiveParameters") is None
+ assert self.params.get("LiveParameters", return_default=True) is None
+
+ def test_params_get_type(self):
+ # json
+ self.params.put("ApiCache_FirehoseStats", {"a": 0})
+ assert self.params.get("ApiCache_FirehoseStats") == {"a": 0}
+
+ # int
+ self.params.put("BootCount", 1441)
+ assert self.params.get("BootCount") == 1441
+
+ # bool
+ self.params.put("AdbEnabled", True)
+ assert self.params.get("AdbEnabled")
+ assert isinstance(self.params.get("AdbEnabled"), bool)
+
+ # time
+ now = datetime.datetime.now(datetime.UTC)
+ self.params.put("InstallDate", now)
+ assert self.params.get("InstallDate") == now
diff --git a/common/tests/test_simple_kalman.py b/common/tests/test_simple_kalman.py
new file mode 100644
index 000000000..e44ac2cc5
--- /dev/null
+++ b/common/tests/test_simple_kalman.py
@@ -0,0 +1,29 @@
+from openpilot.common.simple_kalman import KF1D
+
+
+class TestSimpleKalman:
+ def setup_method(self):
+ dt = 0.01
+ x0_0 = 0.0
+ x1_0 = 0.0
+ A0_0 = 1.0
+ A0_1 = dt
+ A1_0 = 0.0
+ A1_1 = 1.0
+ C0_0 = 1.0
+ C0_1 = 0.0
+ K0_0 = 0.12287673
+ K1_0 = 0.29666309
+
+ self.kf = KF1D(x0=[[x0_0], [x1_0]],
+ A=[[A0_0, A0_1], [A1_0, A1_1]],
+ C=[C0_0, C0_1],
+ K=[[K0_0], [K1_0]])
+
+ def test_getter_setter(self):
+ self.kf.set_x([[1.0], [1.0]])
+ assert self.kf.x == [[1.0], [1.0]]
+
+ def test_update_returns_state(self):
+ x = self.kf.update(100)
+ assert x == [i[0] for i in self.kf.x]
diff --git a/common/text_window.py b/common/text_window.py
new file mode 100755
index 000000000..358243d1f
--- /dev/null
+++ b/common/text_window.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+import os
+import time
+import subprocess
+from openpilot.common.basedir import BASEDIR
+
+
+class TextWindow:
+ def __init__(self, text):
+ try:
+ self.text_proc = subprocess.Popen(["./text.py", text],
+ stdin=subprocess.PIPE,
+ cwd=os.path.join(BASEDIR, "system", "ui"),
+ close_fds=True)
+ except OSError:
+ self.text_proc = None
+
+ def get_status(self):
+ if self.text_proc is not None:
+ self.text_proc.poll()
+ return self.text_proc.returncode
+ return None
+
+ def __enter__(self):
+ return self
+
+ def close(self):
+ if self.text_proc is not None:
+ self.text_proc.terminate()
+ self.text_proc = None
+
+ def wait_for_exit(self):
+ if self.text_proc is not None:
+ while True:
+ if self.get_status() == 1:
+ return
+ time.sleep(0.1)
+
+ def __del__(self):
+ self.close()
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.close()
+
+
+if __name__ == "__main__":
+ text = """Traceback (most recent call last):
+ File "./controlsd.py", line 608, in
+ main()
+ File "./controlsd.py", line 604, in main
+ controlsd_thread(sm, pm, logcan)
+ File "./controlsd.py", line 455, in controlsd_thread
+ 1/0
+ZeroDivisionError: division by zero"""
+ print(text)
+
+ with TextWindow(text) as s:
+ for _ in range(100):
+ if s.get_status() == 1:
+ print("Got exit button")
+ break
+ time.sleep(0.1)
+ print("gone")
diff --git a/common/time_helpers.py b/common/time_helpers.py
new file mode 100644
index 000000000..8564e270c
--- /dev/null
+++ b/common/time_helpers.py
@@ -0,0 +1,15 @@
+import datetime
+from pathlib import Path
+
+MIN_DATE = datetime.datetime(year=2025, month=2, day=21)
+
+def min_date():
+ # on systemd systems, the default time is the systemd build time
+ systemd_path = Path("/lib/systemd/systemd")
+ if systemd_path.exists():
+ d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime)
+ return max(MIN_DATE, d + datetime.timedelta(days=1))
+ return MIN_DATE
+
+def system_time_valid():
+ return datetime.datetime.now() > min_date()
diff --git a/common/timeout.py b/common/timeout.py
new file mode 100644
index 000000000..d0b0ce063
--- /dev/null
+++ b/common/timeout.py
@@ -0,0 +1,27 @@
+import signal
+
+class TimeoutException(Exception):
+ pass
+
+class Timeout:
+ """
+ Timeout context manager.
+ For example this code will raise a TimeoutException:
+ with Timeout(seconds=5, error_msg="Sleep was too long"):
+ time.sleep(10)
+ """
+ def __init__(self, seconds, error_msg=None):
+ if error_msg is None:
+ error_msg = f'Timed out after {seconds} seconds'
+ self.seconds = seconds
+ self.error_msg = error_msg
+
+ def handle_timeout(self, signume, frame):
+ raise TimeoutException(self.error_msg)
+
+ def __enter__(self):
+ signal.signal(signal.SIGALRM, self.handle_timeout)
+ signal.alarm(self.seconds)
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ signal.alarm(0)
diff --git a/common/transformations/.gitignore b/common/transformations/.gitignore
new file mode 100644
index 000000000..a67290f09
--- /dev/null
+++ b/common/transformations/.gitignore
@@ -0,0 +1,2 @@
+transformations
+transformations.cpp
diff --git a/common/transformations/README.md b/common/transformations/README.md
new file mode 100644
index 000000000..42a060da8
--- /dev/null
+++ b/common/transformations/README.md
@@ -0,0 +1,70 @@
+
+Reference Frames
+------
+Many reference frames are used throughout. This
+folder contains all helper functions needed to
+transform between them. Generally this is done
+by generating a rotation matrix and multiplying.
+
+
+| Name | [x, y, z] | Units | Notes |
+| :-------------: |:-------------:| :-----:| :----: |
+| Geodetic | [Latitude, Longitude, Altitude] | geodetic coordinates | Sometimes used as [lon, lat, alt], avoid this frame. |
+| ECEF | [x, y, z] | meters | We use **ITRF14 (IGS14)**, NOT NAD83. This is the global Mesh3D frame. |
+| NED | [North, East, Down] | meters | Relative to earth's surface, useful for visualizing. |
+| Device | [Forward, Right, Down] | meters | This is the Mesh3D local frame. Relative to camera, **not imu.** |
+| Calibrated | [Forward, Right, Down] | meters | This is the frame the model outputs are in. More details below. |
+| Car | [Forward, Right, Down] | meters | This is useful for estimating position of points on the road. More details below. |
+| View | [Right, Down, Forward] | meters | Like device frame, but according to camera conventions. |
+| Camera | [u, v, focal] | pixels | Like view frame, but 2d on the camera image.|
+| Normalized Camera | [u / focal, v / focal, 1] | / | |
+| Model | [u, v, focal] | pixels | The sampled rectangle of the full camera frame the model uses. |
+| Normalized Model | [u / focal, v / focal, 1] | / | |
+
+
+
+
+Orientation Conventions
+------
+Quaternions, rotation matrices and euler angles are three
+equivalent representations of orientation and all three are
+used throughout the code base.
+
+For euler angles the preferred convention is [roll, pitch, yaw]
+which corresponds to rotations around the [x, y, z] axes. All
+euler angles should always be in radians or radians/s unless
+for plotting or display purposes. For quaternions the hamilton
+notations is preferred which is [qw , qx , qy , qz ]. All quaternions
+should always be normalized with a strictly positive qw . **These
+quaternions are a unique representation of orientation whereas euler angles
+or rotation matrices are not.**
+
+To rotate from one frame into another with euler angles the
+convention is to rotate around roll, then pitch and then yaw,
+while rotating around the rotated axes, not the original axes.
+
+
+Car frame
+------
+Device frame is aligned with the road-facing camera used by openpilot. However, when controlling the vehicle it is helpful to think in a reference frame aligned with the vehicle. These two reference frames can be different.
+
+The orientation of car frame is defined to be aligned with the car's direction of travel and the road plane when the vehicle is driving on a flat road and not turning. The origin of car frame is defined to be directly below device frame (in car frame), such that it is on the road plane. The position and orientation of this frame is not necessarily always aligned with the direction of travel or the road plane due to suspension movements and other effects.
+
+
+Calibrated frame
+------
+It is helpful for openpilot's driving model to take in images that look similar when mounted differently in different cars. To achieve this we "calibrate" the images by transforming it into calibrated frame. Calibrated frame is defined to be aligned with car frame in pitch and yaw, and aligned with device frame in roll. It also has the same origin as device frame.
+
+
+Example
+------
+To transform global Mesh3D positions and orientations (positions_ecef, quats_ecef) into the local frame described by the
+first position and orientation from Mesh3D one would do:
+```
+ecef_from_local = rot_from_quat(quats_ecef[0])
+local_from_ecef = ecef_from_local.T
+positions_local = np.einsum('ij,kj->ki', local_from_ecef, postions_ecef - positions_ecef[0])
+rotations_global = rot_from_quat(quats_ecef)
+rotations_local = np.einsum('ij,kjl->kil', local_from_ecef, rotations_global)
+eulers_local = euler_from_rot(rotations_local)
+```
diff --git a/common/transformations/__init__.py b/common/transformations/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/common/transformations/camera.py b/common/transformations/camera.py
new file mode 100644
index 000000000..2e68b5e37
--- /dev/null
+++ b/common/transformations/camera.py
@@ -0,0 +1,179 @@
+import itertools
+import numpy as np
+from dataclasses import dataclass
+
+import openpilot.common.transformations.orientation as orient
+
+## -- hardcoded hardware params --
+@dataclass(frozen=True)
+class CameraConfig:
+ width: int
+ height: int
+ focal_length: float
+
+ @property
+ def size(self):
+ return (self.width, self.height)
+
+ @property
+ def intrinsics(self):
+ # aka 'K' aka camera_frame_from_view_frame
+ return np.array([
+ [self.focal_length, 0.0, float(self.width)/2],
+ [0.0, self.focal_length, float(self.height)/2],
+ [0.0, 0.0, 1.0]
+ ])
+
+ @property
+ def intrinsics_inv(self):
+ # aka 'K_inv' aka view_frame_from_camera_frame
+ return np.linalg.inv(self.intrinsics)
+
+@dataclass(frozen=True)
+class _NoneCameraConfig(CameraConfig):
+ width: int = 0
+ height: int = 0
+ focal_length: float = 0
+
+@dataclass(frozen=True)
+class DeviceCameraConfig:
+ fcam: CameraConfig
+ dcam: CameraConfig
+ ecam: CameraConfig
+
+ def all_cams(self):
+ for cam in ['fcam', 'dcam', 'ecam']:
+ if not isinstance(getattr(self, cam), _NoneCameraConfig):
+ yield cam, getattr(self, cam)
+
+_ar_ox_fisheye = CameraConfig(1928, 1208, 567.0) # focal length probably wrong? magnification is not consistent across frame
+_os_fisheye = CameraConfig(2688 // 2, 1520 // 2, 567.0 / 4 * 3)
+_ar_ox_config = DeviceCameraConfig(CameraConfig(1928, 1208, 2648.0), _ar_ox_fisheye, _ar_ox_fisheye)
+_os_config = DeviceCameraConfig(CameraConfig(2688 // 2, 1520 // 2, 1522.0 * 3 / 4), _os_fisheye, _os_fisheye)
+_neo_config = DeviceCameraConfig(CameraConfig(1164, 874, 910.0), CameraConfig(816, 612, 650.0), _NoneCameraConfig())
+
+DEVICE_CAMERAS = {
+ # A "device camera" is defined by a device type and sensor
+
+ # sensor type was never set on eon/neo/two
+ ("neo", "unknown"): _neo_config,
+ # unknown here is AR0231, field was added with OX03C10 support
+ ("tici", "unknown"): _ar_ox_config,
+
+ # before deviceState.deviceType was set, assume tici AR config
+ ("unknown", "ar0231"): _ar_ox_config,
+ ("unknown", "ox03c10"): _ar_ox_config,
+
+ # simulator (emulates a tici)
+ ("pc", "unknown"): _ar_ox_config,
+}
+prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', _ar_ox_config), ('ox03c10', _ar_ox_config), ('os04c10', _os_config)))
+DEVICE_CAMERAS.update({(d, c[0]): c[1] for d, c in prods})
+
+# device/mesh : x->forward, y-> right, z->down
+# view : x->right, y->down, z->forward
+device_frame_from_view_frame = np.array([
+ [ 0., 0., 1.],
+ [ 1., 0., 0.],
+ [ 0., 1., 0.]
+])
+view_frame_from_device_frame = device_frame_from_view_frame.T
+
+
+# aka 'extrinsic_matrix'
+# road : x->forward, y -> left, z->up
+def get_view_frame_from_road_frame(roll, pitch, yaw, height):
+ device_from_road = orient.rot_from_euler([roll, pitch, yaw]).dot(np.diag([1, -1, -1]))
+ view_from_road = view_frame_from_device_frame.dot(device_from_road)
+ return np.hstack((view_from_road, [[0], [height], [0]]))
+
+
+
+# aka 'extrinsic_matrix'
+def get_view_frame_from_calib_frame(roll, pitch, yaw, height):
+ device_from_calib= orient.rot_from_euler([roll, pitch, yaw])
+ view_from_calib = view_frame_from_device_frame.dot(device_from_calib)
+ return np.hstack((view_from_calib, [[0], [height], [0]]))
+
+
+def vp_from_ke(m):
+ """
+ Computes the vanishing point from the product of the intrinsic and extrinsic
+ matrices C = KE.
+
+ The vanishing point is defined as lim x->infinity C (x, 0, 0, 1).T
+ """
+ return (m[0, 0]/m[2, 0], m[1, 0]/m[2, 0])
+
+
+def roll_from_ke(m):
+ # note: different from calibration.h/RollAnglefromKE: i think that one's just wrong
+ return np.arctan2(-(m[1, 0] - m[1, 1] * m[2, 0] / m[2, 1]),
+ -(m[0, 0] - m[0, 1] * m[2, 0] / m[2, 1]))
+
+
+def normalize(img_pts, intrinsics):
+ # normalizes image coordinates
+ # accepts single pt or array of pts
+ intrinsics_inv = np.linalg.inv(intrinsics)
+ img_pts = np.array(img_pts)
+ input_shape = img_pts.shape
+ img_pts = np.atleast_2d(img_pts)
+ img_pts = np.hstack((img_pts, np.ones((img_pts.shape[0], 1))))
+ img_pts_normalized = img_pts.dot(intrinsics_inv.T)
+ img_pts_normalized[(img_pts < 0).any(axis=1)] = np.nan
+ return img_pts_normalized[:, :2].reshape(input_shape)
+
+
+def denormalize(img_pts, intrinsics, width=np.inf, height=np.inf):
+ # denormalizes image coordinates
+ # accepts single pt or array of pts
+ img_pts = np.array(img_pts)
+ input_shape = img_pts.shape
+ img_pts = np.atleast_2d(img_pts)
+ img_pts = np.hstack((img_pts, np.ones((img_pts.shape[0], 1), dtype=img_pts.dtype)))
+ img_pts_denormalized = img_pts.dot(intrinsics.T)
+ if np.isfinite(width):
+ img_pts_denormalized[img_pts_denormalized[:, 0] > width] = np.nan
+ img_pts_denormalized[img_pts_denormalized[:, 0] < 0] = np.nan
+ if np.isfinite(height):
+ img_pts_denormalized[img_pts_denormalized[:, 1] > height] = np.nan
+ img_pts_denormalized[img_pts_denormalized[:, 1] < 0] = np.nan
+ return img_pts_denormalized[:, :2].reshape(input_shape)
+
+
+def get_calib_from_vp(vp, intrinsics):
+ vp_norm = normalize(vp, intrinsics)
+ yaw_calib = np.arctan(vp_norm[0])
+ pitch_calib = -np.arctan(vp_norm[1]*np.cos(yaw_calib))
+ roll_calib = 0
+ return roll_calib, pitch_calib, yaw_calib
+
+
+def device_from_ecef(pos_ecef, orientation_ecef, pt_ecef):
+ # device from ecef frame
+ # device frame is x -> forward, y-> right, z -> down
+ # accepts single pt or array of pts
+ input_shape = pt_ecef.shape
+ pt_ecef = np.atleast_2d(pt_ecef)
+ ecef_from_device_rot = orient.rotations_from_quats(orientation_ecef)
+ device_from_ecef_rot = ecef_from_device_rot.T
+ pt_ecef_rel = pt_ecef - pos_ecef
+ pt_device = np.einsum('jk,ik->ij', device_from_ecef_rot, pt_ecef_rel)
+ return pt_device.reshape(input_shape)
+
+
+def img_from_device(pt_device):
+ # img coordinates from pts in device frame
+ # first transforms to view frame, then to img coords
+ # accepts single pt or array of pts
+ input_shape = pt_device.shape
+ pt_device = np.atleast_2d(pt_device)
+ pt_view = np.einsum('jk,ik->ij', view_frame_from_device_frame, pt_device)
+
+ # This function should never return negative depths
+ pt_view[pt_view[:, 2] < 0] = np.nan
+
+ pt_img = pt_view/pt_view[:, 2:3]
+ return pt_img.reshape(input_shape)[:, :2]
+
diff --git a/common/transformations/coordinates.py b/common/transformations/coordinates.py
new file mode 100644
index 000000000..696e7de2e
--- /dev/null
+++ b/common/transformations/coordinates.py
@@ -0,0 +1,18 @@
+from openpilot.common.transformations.orientation import numpy_wrap
+from openpilot.common.transformations.transformations import (ecef2geodetic_single,
+ geodetic2ecef_single)
+from openpilot.common.transformations.transformations import LocalCoord as LocalCoord_single
+
+
+class LocalCoord(LocalCoord_single):
+ ecef2ned = numpy_wrap(LocalCoord_single.ecef2ned_single, (3,), (3,))
+ ned2ecef = numpy_wrap(LocalCoord_single.ned2ecef_single, (3,), (3,))
+ geodetic2ned = numpy_wrap(LocalCoord_single.geodetic2ned_single, (3,), (3,))
+ ned2geodetic = numpy_wrap(LocalCoord_single.ned2geodetic_single, (3,), (3,))
+
+
+geodetic2ecef = numpy_wrap(geodetic2ecef_single, (3,), (3,))
+ecef2geodetic = numpy_wrap(ecef2geodetic_single, (3,), (3,))
+
+geodetic_from_ecef = ecef2geodetic
+ecef_from_geodetic = geodetic2ecef
diff --git a/common/transformations/model.py b/common/transformations/model.py
new file mode 100644
index 000000000..ea1dff30e
--- /dev/null
+++ b/common/transformations/model.py
@@ -0,0 +1,70 @@
+import numpy as np
+
+from openpilot.common.transformations.orientation import rot_from_euler
+from openpilot.common.transformations.camera import get_view_frame_from_calib_frame, view_frame_from_device_frame, _ar_ox_fisheye
+
+# segnet
+SEGNET_SIZE = (512, 384)
+
+# MED model
+MEDMODEL_INPUT_SIZE = (512, 256)
+MEDMODEL_YUV_SIZE = (MEDMODEL_INPUT_SIZE[0], MEDMODEL_INPUT_SIZE[1] * 3 // 2)
+MEDMODEL_CY = 47.6
+
+medmodel_fl = 910.0
+medmodel_intrinsics = np.array([
+ [medmodel_fl, 0.0, 0.5 * MEDMODEL_INPUT_SIZE[0]],
+ [0.0, medmodel_fl, MEDMODEL_CY],
+ [0.0, 0.0, 1.0]])
+
+
+# BIG model
+BIGMODEL_INPUT_SIZE = (1024, 512)
+BIGMODEL_YUV_SIZE = (BIGMODEL_INPUT_SIZE[0], BIGMODEL_INPUT_SIZE[1] * 3 // 2)
+
+bigmodel_fl = 910.0
+bigmodel_intrinsics = np.array([
+ [bigmodel_fl, 0.0, 0.5 * BIGMODEL_INPUT_SIZE[0]],
+ [0.0, bigmodel_fl, 256 + MEDMODEL_CY],
+ [0.0, 0.0, 1.0]])
+
+
+# SBIG model (big model with the size of small model)
+SBIGMODEL_INPUT_SIZE = (512, 256)
+SBIGMODEL_YUV_SIZE = (SBIGMODEL_INPUT_SIZE[0], SBIGMODEL_INPUT_SIZE[1] * 3 // 2)
+
+sbigmodel_fl = 455.0
+sbigmodel_intrinsics = np.array([
+ [sbigmodel_fl, 0.0, 0.5 * SBIGMODEL_INPUT_SIZE[0]],
+ [0.0, sbigmodel_fl, 0.5 * (256 + MEDMODEL_CY)],
+ [0.0, 0.0, 1.0]])
+
+DM_INPUT_SIZE = (1440, 960)
+dmonitoringmodel_fl = _ar_ox_fisheye.focal_length
+dmonitoringmodel_intrinsics = np.array([
+ [dmonitoringmodel_fl, 0.0, DM_INPUT_SIZE[0]/2],
+ [0.0, dmonitoringmodel_fl, DM_INPUT_SIZE[1]/2 - (_ar_ox_fisheye.height - DM_INPUT_SIZE[1])/2],
+ [0.0, 0.0, 1.0]])
+
+bigmodel_frame_from_calib_frame = np.dot(bigmodel_intrinsics,
+ get_view_frame_from_calib_frame(0, 0, 0, 0))
+
+
+sbigmodel_frame_from_calib_frame = np.dot(sbigmodel_intrinsics,
+ get_view_frame_from_calib_frame(0, 0, 0, 0))
+
+medmodel_frame_from_calib_frame = np.dot(medmodel_intrinsics,
+ get_view_frame_from_calib_frame(0, 0, 0, 0))
+
+medmodel_frame_from_bigmodel_frame = np.dot(medmodel_intrinsics, np.linalg.inv(bigmodel_intrinsics))
+
+calib_from_medmodel = np.linalg.inv(medmodel_frame_from_calib_frame[:, :3])
+calib_from_sbigmodel = np.linalg.inv(sbigmodel_frame_from_calib_frame[:, :3])
+
+# This function is verified to give similar results to xx.uncommon.utils.transform_img
+def get_warp_matrix(device_from_calib_euler: np.ndarray, intrinsics: np.ndarray, bigmodel_frame: bool = False) -> np.ndarray:
+ calib_from_model = calib_from_sbigmodel if bigmodel_frame else calib_from_medmodel
+ device_from_calib = rot_from_euler(device_from_calib_euler)
+ camera_from_calib = intrinsics @ view_frame_from_device_frame @ device_from_calib
+ warp_matrix: np.ndarray = camera_from_calib @ calib_from_model
+ return warp_matrix
diff --git a/common/transformations/orientation.py b/common/transformations/orientation.py
new file mode 100644
index 000000000..86e6a6c34
--- /dev/null
+++ b/common/transformations/orientation.py
@@ -0,0 +1,52 @@
+import numpy as np
+from collections.abc import Callable
+
+from openpilot.common.transformations.transformations import (ecef_euler_from_ned_single,
+ euler2quat_single,
+ euler2rot_single,
+ ned_euler_from_ecef_single,
+ quat2euler_single,
+ quat2rot_single,
+ rot2euler_single,
+ rot2quat_single)
+
+
+def numpy_wrap(function, input_shape, output_shape) -> Callable[..., np.ndarray]:
+ """Wrap a function to take either an input or list of inputs and return the correct shape"""
+ def f(*inps):
+ *args, inp = inps
+ inp = np.array(inp)
+ shape = inp.shape
+
+ if len(shape) == len(input_shape):
+ out_shape = output_shape
+ else:
+ out_shape = (shape[0],) + output_shape
+
+ # Add empty dimension if inputs is not a list
+ if len(shape) == len(input_shape):
+ inp.shape = (1, ) + inp.shape
+
+ result = np.asarray([function(*args, i) for i in inp])
+ result.shape = out_shape
+ return result
+ return f
+
+
+euler2quat = numpy_wrap(euler2quat_single, (3,), (4,))
+quat2euler = numpy_wrap(quat2euler_single, (4,), (3,))
+quat2rot = numpy_wrap(quat2rot_single, (4,), (3, 3))
+rot2quat = numpy_wrap(rot2quat_single, (3, 3), (4,))
+euler2rot = numpy_wrap(euler2rot_single, (3,), (3, 3))
+rot2euler = numpy_wrap(rot2euler_single, (3, 3), (3,))
+ecef_euler_from_ned = numpy_wrap(ecef_euler_from_ned_single, (3,), (3,))
+ned_euler_from_ecef = numpy_wrap(ned_euler_from_ecef_single, (3,), (3,))
+
+quats_from_rotations = rot2quat
+quat_from_rot = rot2quat
+rotations_from_quats = quat2rot
+rot_from_quat = quat2rot
+euler_from_rot = rot2euler
+euler_from_quat = quat2euler
+rot_from_euler = euler2rot
+quat_from_euler = euler2quat
diff --git a/common/transformations/tests/__init__.py b/common/transformations/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/common/transformations/tests/test_coordinates.py b/common/transformations/tests/test_coordinates.py
new file mode 100644
index 000000000..0b5d1c36d
--- /dev/null
+++ b/common/transformations/tests/test_coordinates.py
@@ -0,0 +1,137 @@
+import numpy as np
+
+import openpilot.common.transformations.coordinates as coord
+
+geodetic_positions = np.array([[37.7610403, -122.4778699, 115],
+ [27.4840915, -68.5867592, 2380],
+ [32.4916858, -113.652821, -6],
+ [15.1392514, 103.6976037, 24],
+ [24.2302229, 44.2835412, 1650]])
+
+ecef_positions = np.array([[-2711076.55270557, -4259167.14692758, 3884579.87669935],
+ [ 2068042.69652729, -5273435.40316622, 2927004.89190746],
+ [-2160412.60461669, -4932588.89873832, 3406542.29652851],
+ [-1458247.92550567, 5983060.87496612, 1654984.6099885 ],
+ [ 4167239.10867871, 4064301.90363223, 2602234.6065749 ]])
+
+ecef_positions_offset = np.array([[-2711004.46961115, -4259099.33540613, 3884605.16002147],
+ [ 2068074.30639499, -5273413.78835412, 2927012.48741131],
+ [-2160344.53748176, -4932586.20092211, 3406636.2962545 ],
+ [-1458211.98517094, 5983151.11161276, 1655077.02698447],
+ [ 4167271.20055269, 4064398.22619263, 2602238.95265847]])
+
+
+ned_offsets = np.array([[78.722153649976391, 24.396208657446344, 60.343017506838436],
+ [10.699003365155221, 37.319278617604269, 4.1084100025050407],
+ [95.282646251726959, 61.266689955574428, -25.376506058505054],
+ [68.535769283630003, -56.285970011848889, -100.54840137956515],
+ [-33.066609321880179, 46.549821994306861, -84.062540548335591]])
+
+ecef_init_batch = np.array([2068042.69652729, -5273435.40316622, 2927004.89190746])
+ecef_positions_offset_batch = np.array([[ 2068089.41454771, -5273434.46829148, 2927074.04783672],
+ [ 2068103.31628647, -5273393.92275431, 2927102.08725987],
+ [ 2068108.49939636, -5273359.27047121, 2927045.07091581],
+ [ 2068075.12395611, -5273381.69432566, 2927041.08207992],
+ [ 2068060.72033399, -5273430.6061505, 2927094.54928305]])
+
+ned_offsets_batch = np.array([[ 53.88103168, 43.83445935, -46.27488057],
+ [ 93.83378995, 71.57943024, -30.23113187],
+ [ 57.26725796, 89.05602684, 23.02265814],
+ [ 49.71775195, 49.79767572, 17.15351015],
+ [ 78.56272609, 18.53100158, -43.25290759]])
+
+
+class TestNED:
+ def test_small_distances(self):
+ start_geodetic = np.array([33.8042184, -117.888593, 0.0])
+ local_coord = coord.LocalCoord.from_geodetic(start_geodetic)
+
+ start_ned = local_coord.geodetic2ned(start_geodetic)
+ np.testing.assert_array_equal(start_ned, np.zeros(3,))
+
+ west_geodetic = start_geodetic + [0, -0.0005, 0]
+ west_ned = local_coord.geodetic2ned(west_geodetic)
+ assert np.abs(west_ned[0]) < 1e-3
+ assert west_ned[1] < 0
+
+ southwest_geodetic = start_geodetic + [-0.0005, -0.002, 0]
+ southwest_ned = local_coord.geodetic2ned(southwest_geodetic)
+ assert southwest_ned[0] < 0
+ assert southwest_ned[1] < 0
+
+ def test_ecef_geodetic(self):
+ # testing single
+ np.testing.assert_allclose(ecef_positions[0], coord.geodetic2ecef(geodetic_positions[0]), rtol=1e-9)
+ np.testing.assert_allclose(geodetic_positions[0, :2], coord.ecef2geodetic(ecef_positions[0])[:2], rtol=1e-9)
+ np.testing.assert_allclose(geodetic_positions[0, 2], coord.ecef2geodetic(ecef_positions[0])[2], rtol=1e-9, atol=1e-4)
+
+ np.testing.assert_allclose(geodetic_positions[:, :2], coord.ecef2geodetic(ecef_positions)[:, :2], rtol=1e-9)
+ np.testing.assert_allclose(geodetic_positions[:, 2], coord.ecef2geodetic(ecef_positions)[:, 2], rtol=1e-9, atol=1e-4)
+ np.testing.assert_allclose(ecef_positions, coord.geodetic2ecef(geodetic_positions), rtol=1e-9)
+
+
+ def test_ned(self):
+ for ecef_pos in ecef_positions:
+ converter = coord.LocalCoord.from_ecef(ecef_pos)
+ ecef_pos_moved = ecef_pos + [25, -25, 25]
+ ecef_pos_moved_double_converted = converter.ned2ecef(converter.ecef2ned(ecef_pos_moved))
+ np.testing.assert_allclose(ecef_pos_moved, ecef_pos_moved_double_converted, rtol=1e-9)
+
+ for geo_pos in geodetic_positions:
+ converter = coord.LocalCoord.from_geodetic(geo_pos)
+ geo_pos_moved = geo_pos + np.array([0, 0, 10])
+ geo_pos_double_converted_moved = converter.ned2geodetic(converter.geodetic2ned(geo_pos) + np.array([0, 0, -10]))
+ np.testing.assert_allclose(geo_pos_moved[:2], geo_pos_double_converted_moved[:2], rtol=1e-9, atol=1e-6)
+ np.testing.assert_allclose(geo_pos_moved[2], geo_pos_double_converted_moved[2], rtol=1e-9, atol=1e-4)
+
+ def test_ned_saved_results(self):
+ for i, ecef_pos in enumerate(ecef_positions):
+ converter = coord.LocalCoord.from_ecef(ecef_pos)
+ np.testing.assert_allclose(converter.ned2ecef(ned_offsets[i]),
+ ecef_positions_offset[i],
+ rtol=1e-9, atol=1e-4)
+ np.testing.assert_allclose(converter.ecef2ned(ecef_positions_offset[i]),
+ ned_offsets[i],
+ rtol=1e-9, atol=1e-4)
+
+ def test_ned_batch(self):
+ converter = coord.LocalCoord.from_ecef(ecef_init_batch)
+ np.testing.assert_allclose(converter.ecef2ned(ecef_positions_offset_batch),
+ ned_offsets_batch,
+ rtol=1e-9, atol=1e-7)
+ np.testing.assert_allclose(converter.ned2ecef(ned_offsets_batch),
+ ecef_positions_offset_batch,
+ rtol=1e-9, atol=1e-7)
+
+ def test_errors(self):
+ # Test wrong shape/type for geodetic2ecef
+ # numpy_wrap raises IndexError for scalar input
+ with np.testing.assert_raises(IndexError):
+ coord.geodetic2ecef(1.0)
+
+ with np.testing.assert_raises_regex(ValueError, "Geodetic must be size 3"):
+ coord.geodetic2ecef([0, 0])
+
+ with np.testing.assert_raises_regex(ValueError, "Geodetic must be size 3"):
+ coord.geodetic2ecef([0, 0, 0, 0])
+
+ with np.testing.assert_raises(TypeError):
+ coord.geodetic2ecef(['a', 'b', 'c'])
+
+ # Test LocalCoord constructor errors
+ with np.testing.assert_raises(ValueError):
+ coord.LocalCoord.from_geodetic([0, 0])
+
+ with np.testing.assert_raises(ValueError):
+ coord.LocalCoord.from_geodetic(1)
+
+ with np.testing.assert_raises(TypeError):
+ coord.LocalCoord.from_geodetic(['a', 'b', 'c'])
+
+ # Test wrong shape/type for ecef2geodetic
+ with np.testing.assert_raises(ValueError):
+ coord.ecef2geodetic([1, 2])
+ with np.testing.assert_raises(ValueError):
+ coord.ecef2geodetic([1, 2, 3, 4])
+ with np.testing.assert_raises(IndexError):
+ coord.ecef2geodetic(1.0)
diff --git a/common/transformations/tests/test_orientation.py b/common/transformations/tests/test_orientation.py
new file mode 100644
index 000000000..1bf94115c
--- /dev/null
+++ b/common/transformations/tests/test_orientation.py
@@ -0,0 +1,91 @@
+import numpy as np
+import pytest
+
+from openpilot.common.transformations.orientation import euler2quat, quat2euler, euler2rot, rot2euler, \
+ rot2quat, quat2rot, \
+ ned_euler_from_ecef
+
+eulers = np.array([[ 1.46520501, 2.78688383, 2.92780854],
+ [ 4.86909526, 3.60618161, 4.30648981],
+ [ 3.72175965, 2.68763705, 5.43895988],
+ [ 5.92306687, 5.69573614, 0.81100357],
+ [ 0.67838374, 5.02402037, 2.47106426]])
+
+quats = np.array([[ 0.66855182, -0.71500939, 0.19539353, 0.06017818],
+ [ 0.43163717, 0.70013301, 0.28209145, 0.49389021],
+ [ 0.44121991, -0.08252646, 0.34257534, 0.82532207],
+ [ 0.88578382, -0.04515356, -0.32936046, 0.32383617],
+ [ 0.06578165, 0.61282835, 0.07126891, 0.78424163]])
+
+ecef_positions = np.array([[-2711076.55270557, -4259167.14692758, 3884579.87669935],
+ [ 2068042.69652729, -5273435.40316622, 2927004.89190746],
+ [-2160412.60461669, -4932588.89873832, 3406542.29652851],
+ [-1458247.92550567, 5983060.87496612, 1654984.6099885 ],
+ [ 4167239.10867871, 4064301.90363223, 2602234.6065749 ]])
+
+ned_eulers = np.array([[ 0.46806039, -0.4881889 , 1.65697808],
+ [-2.14525969, -0.36533066, 0.73813479],
+ [-1.39523364, -0.58540761, -1.77376356],
+ [-1.84220435, 0.61828016, -1.03310421],
+ [ 2.50450101, 0.36304151, 0.33136365]])
+
+
+class TestOrientation:
+ def test_quat_euler(self):
+ for i, eul in enumerate(eulers):
+ np.testing.assert_allclose(quats[i], euler2quat(eul), rtol=1e-7)
+ np.testing.assert_allclose(quats[i], euler2quat(quat2euler(quats[i])), rtol=1e-6)
+ for i, eul in enumerate(eulers):
+ np.testing.assert_allclose(quats[i], euler2quat(list(eul)), rtol=1e-7)
+ np.testing.assert_allclose(quats[i], euler2quat(quat2euler(list(quats[i]))), rtol=1e-6)
+ np.testing.assert_allclose(quats, euler2quat(eulers), rtol=1e-7)
+ np.testing.assert_allclose(quats, euler2quat(quat2euler(quats)), rtol=1e-6)
+
+ def test_rot_euler(self):
+ for eul in eulers:
+ np.testing.assert_allclose(euler2quat(eul), euler2quat(rot2euler(euler2rot(eul))), rtol=1e-7)
+ for eul in eulers:
+ np.testing.assert_allclose(euler2quat(eul), euler2quat(rot2euler(euler2rot(list(eul)))), rtol=1e-7)
+ np.testing.assert_allclose(euler2quat(eulers), euler2quat(rot2euler(euler2rot(eulers))), rtol=1e-7)
+
+ def test_rot_quat(self):
+ for quat in quats:
+ np.testing.assert_allclose(quat, rot2quat(quat2rot(quat)), rtol=1e-7)
+ for quat in quats:
+ np.testing.assert_allclose(quat, rot2quat(quat2rot(list(quat))), rtol=1e-7)
+ np.testing.assert_allclose(quats, rot2quat(quat2rot(quats)), rtol=1e-7)
+
+ def test_euler_ned(self):
+ for i in range(len(eulers)):
+ np.testing.assert_allclose(ned_eulers[i], ned_euler_from_ecef(ecef_positions[i], eulers[i]), rtol=1e-7)
+ #np.testing.assert_allclose(eulers[i], ecef_euler_from_ned(ecef_positions[i], ned_eulers[i]), rtol=1e-7)
+ # np.testing.assert_allclose(ned_eulers, ned_euler_from_ecef(ecef_positions, eulers), rtol=1e-7)
+
+ def test_inputs(self):
+ with pytest.raises(ValueError):
+ euler2quat([1, 2])
+
+ with pytest.raises(ValueError):
+ quat2rot([1, 2, 3])
+
+ with pytest.raises(IndexError):
+ rot2quat(np.zeros((2, 2)))
+
+ def test_euler_rot_consistency(self):
+ rpy = [0.1, 0.2, 0.3]
+ R = euler2rot(rpy)
+
+ # R -> q -> R
+ q = rot2quat(R)
+ R_new = quat2rot(q)
+ np.testing.assert_allclose(R, R_new, atol=1e-15)
+
+ # q -> R -> Euler (quat2euler) -> R
+ rpy_new = quat2euler(q)
+ R_new2 = euler2rot(rpy_new)
+ np.testing.assert_allclose(R, R_new2, atol=1e-15)
+
+ # R -> Euler (rot2euler) -> R
+ rpy_from_rot = rot2euler(R)
+ R_new3 = euler2rot(rpy_from_rot)
+ np.testing.assert_allclose(R, R_new3, atol=1e-15)
diff --git a/common/transformations/transformations.py b/common/transformations/transformations.py
new file mode 100644
index 000000000..5cb6220f9
--- /dev/null
+++ b/common/transformations/transformations.py
@@ -0,0 +1,342 @@
+import numpy as np
+
+
+# Constants
+a = 6378137.0
+b = 6356752.3142
+esq = 6.69437999014e-3
+e1sq = 6.73949674228e-3
+
+
+def geodetic2ecef_single(g):
+ """
+ Convert geodetic coordinates (latitude, longitude, altitude) to ECEF.
+ """
+ try:
+ if len(g) != 3:
+ raise ValueError("Geodetic must be size 3")
+ except TypeError:
+ raise ValueError("Geodetic must be a sequence of length 3") from None
+
+ lat, lon, alt = g
+ lat = np.radians(lat)
+ lon = np.radians(lon)
+ xi = np.sqrt(1.0 - esq * np.sin(lat)**2)
+ x = (a / xi + alt) * np.cos(lat) * np.cos(lon)
+ y = (a / xi + alt) * np.cos(lat) * np.sin(lon)
+ z = (a / xi * (1.0 - esq) + alt) * np.sin(lat)
+ return np.array([x, y, z])
+
+
+def ecef2geodetic_single(e):
+ """
+ Convert ECEF to geodetic coordinates using Ferrari's solution.
+ """
+ x, y, z = e
+ r = np.sqrt(x**2 + y**2)
+ Esq = a**2 - b**2
+ F = 54 * b**2 * z**2
+ G = r**2 + (1 - esq) * z**2 - esq * Esq
+ C = (esq**2 * F * r**2) / (G**3)
+ S = np.cbrt(1 + C + np.sqrt(C**2 + 2 * C))
+ P = F / (3 * (S + 1 / S + 1)**2 * G**2)
+ Q = np.sqrt(1 + 2 * esq**2 * P)
+ r_0 = -(P * esq * r) / (1 + Q) + np.sqrt(0.5 * a**2 * (1 + 1.0 / Q) - P * (1 - esq) * z**2 / (Q * (1 + Q)) - 0.5 * P * r**2)
+ U = np.sqrt((r - esq * r_0)**2 + z**2)
+ V = np.sqrt((r - esq * r_0)**2 + (1 - esq) * z**2)
+ Z_0 = b**2 * z / (a * V)
+ h = U * (1 - b**2 / (a * V))
+ lat = np.arctan((z + e1sq * Z_0) / r)
+ lon = np.arctan2(y, x)
+ return np.array([np.degrees(lat), np.degrees(lon), h])
+
+
+def euler2quat_single(euler):
+ """
+ Convert Euler angles (roll, pitch, yaw) to a quaternion.
+ Rotation order: Z-Y-X (yaw, pitch, roll).
+ """
+ phi, theta, psi = euler
+
+ c_phi, s_phi = np.cos(phi / 2), np.sin(phi / 2)
+ c_theta, s_theta = np.cos(theta / 2), np.sin(theta / 2)
+ c_psi, s_psi = np.cos(psi / 2), np.sin(psi / 2)
+
+ w = c_phi * c_theta * c_psi + s_phi * s_theta * s_psi
+ x = s_phi * c_theta * c_psi - c_phi * s_theta * s_psi
+ y = c_phi * s_theta * c_psi + s_phi * c_theta * s_psi
+ z = c_phi * c_theta * s_psi - s_phi * s_theta * c_psi
+
+ if w < 0:
+ return np.array([-w, -x, -y, -z])
+ return np.array([w, x, y, z])
+
+
+def quat2euler_single(q):
+ """
+ Convert a quaternion to Euler angles (roll, pitch, yaw).
+ """
+ w, x, y, z = q
+ gamma = np.arctan2(2 * (w * x + y * z), 1 - 2 * (x**2 + y**2))
+ sin_arg = 2 * (w * y - z * x)
+ sin_arg = np.clip(sin_arg, -1.0, 1.0)
+ theta = np.arcsin(sin_arg)
+ psi = np.arctan2(2 * (w * z + x * y), 1 - 2 * (y**2 + z**2))
+ return np.array([gamma, theta, psi])
+
+
+def quat2rot_single(q):
+ """
+ Convert a quaternion to a 3x3 rotation matrix.
+ """
+ w, x, y, z = q
+ xx, yy, zz = x * x, y * y, z * z
+ xy, xz, yz = x * y, x * z, y * z
+ wx, wy, wz = w * x, w * y, w * z
+
+ mat = np.array([
+ [1 - 2 * (yy + zz), 2 * (xy - wz), 2 * (xz + wy)],
+ [2 * (xy + wz), 1 - 2 * (xx + zz), 2 * (yz - wx)],
+ [2 * (xz - wy), 2 * (yz + wx), 1 - 2 * (xx + yy)]
+ ])
+ return mat
+
+
+def rot2quat_single(rot):
+ """
+ Convert a 3x3 rotation matrix to a quaternion.
+ """
+ trace = np.trace(rot)
+ if trace > 0:
+ s = 0.5 / np.sqrt(trace + 1.0)
+ w = 0.25 / s
+ x = (rot[2, 1] - rot[1, 2]) * s
+ y = (rot[0, 2] - rot[2, 0]) * s
+ z = (rot[1, 0] - rot[0, 1]) * s
+ else:
+ if rot[0, 0] > rot[1, 1] and rot[0, 0] > rot[2, 2]:
+ s = 2.0 * np.sqrt(1.0 + rot[0, 0] - rot[1, 1] - rot[2, 2])
+ w = (rot[2, 1] - rot[1, 2]) / s
+ x = 0.25 * s
+ y = (rot[0, 1] + rot[1, 0]) / s
+ z = (rot[0, 2] + rot[2, 0]) / s
+ elif rot[1, 1] > rot[2, 2]:
+ s = 2.0 * np.sqrt(1.0 + rot[1, 1] - rot[0, 0] - rot[2, 2])
+ w = (rot[0, 2] - rot[2, 0]) / s
+ x = (rot[0, 1] + rot[1, 0]) / s
+ y = 0.25 * s
+ z = (rot[1, 2] + rot[2, 1]) / s
+ else:
+ s = 2.0 * np.sqrt(1.0 + rot[2, 2] - rot[0, 0] - rot[1, 1])
+ w = (rot[1, 0] - rot[0, 1]) / s
+ x = (rot[0, 2] + rot[2, 0]) / s
+ y = (rot[1, 2] + rot[2, 1]) / s
+ z = 0.25 * s
+
+ if w < 0:
+ return np.array([-w, -x, -y, -z])
+ return np.array([w, x, y, z])
+
+
+def euler2rot_single(euler):
+ """
+ Convert Euler angles (roll, pitch, yaw) to a 3x3 rotation matrix.
+ Rotation order: Z-Y-X (yaw, pitch, roll).
+ """
+ phi, theta, psi = euler
+
+ cx, sx = np.cos(phi), np.sin(phi)
+ cy, sy = np.cos(theta), np.sin(theta)
+ cz, sz = np.cos(psi), np.sin(psi)
+
+ Rx = np.array([[1, 0, 0], [0, cx, -sx], [0, sx, cx]])
+ Ry = np.array([[cy, 0, sy], [0, 1, 0], [-sy, 0, cy]])
+ Rz = np.array([[cz, -sz, 0], [sz, cz, 0], [0, 0, 1]])
+
+ return Rz @ Ry @ Rx
+
+
+def rot2euler_single(rot):
+ """
+ Convert a 3x3 rotation matrix to Euler angles (roll, pitch, yaw).
+ """
+ return quat2euler_single(rot2quat_single(rot))
+
+
+def rot_matrix(roll, pitch, yaw):
+ """
+ Create a 3x3 rotation matrix from roll, pitch, and yaw angles.
+ """
+ return euler2rot_single([roll, pitch, yaw])
+
+
+def axis_angle_to_rot(axis, angle):
+ """
+ Convert an axis-angle representation to a 3x3 rotation matrix.
+ """
+ c = np.cos(angle / 2)
+ s = np.sin(angle / 2)
+ q = np.array([c, s*axis[0], s*axis[1], s*axis[2]])
+ return quat2rot_single(q)
+
+
+class LocalCoord:
+ """
+ A class to handle conversions between ECEF and local NED coordinates.
+ """
+ def __init__(self, geodetic=None, ecef=None):
+ """
+ Initialize LocalCoord with either geodetic or ECEF coordinates.
+ """
+ if geodetic is not None:
+ self.init_ecef = geodetic2ecef_single(geodetic)
+ lat, lon, _ = geodetic
+ elif ecef is not None:
+ self.init_ecef = np.array(ecef)
+ lat, lon, _ = ecef2geodetic_single(ecef)
+ else:
+ raise ValueError("Must provide geodetic or ecef")
+
+ lat = np.radians(lat)
+ lon = np.radians(lon)
+
+ self.ned2ecef_matrix = np.array([
+ [-np.sin(lat) * np.cos(lon), -np.sin(lon), -np.cos(lat) * np.cos(lon)],
+ [-np.sin(lat) * np.sin(lon), np.cos(lon), -np.cos(lat) * np.sin(lon)],
+ [np.cos(lat), 0, -np.sin(lat)]
+ ])
+ self.ecef2ned_matrix = self.ned2ecef_matrix.T
+
+ @classmethod
+ def from_geodetic(cls, geodetic):
+ """
+ Create a LocalCoord instance from geodetic coordinates.
+ """
+ return cls(geodetic=geodetic)
+
+ @classmethod
+ def from_ecef(cls, ecef):
+ """
+ Create a LocalCoord instance from ECEF coordinates.
+ """
+ return cls(ecef=ecef)
+
+ def ecef2ned_single(self, ecef):
+ """
+ Convert a single ECEF point to NED coordinates relative to the origin.
+ """
+ return self.ecef2ned_matrix @ (ecef - self.init_ecef)
+
+ def ned2ecef_single(self, ned):
+ """
+ Convert a single NED point to ECEF coordinates.
+ """
+ return self.ned2ecef_matrix @ ned + self.init_ecef
+
+ def geodetic2ned_single(self, geodetic):
+ """
+ Convert a single geodetic point to NED coordinates.
+ """
+ ecef = geodetic2ecef_single(geodetic)
+ return self.ecef2ned_single(ecef)
+
+ def ned2geodetic_single(self, ned):
+ """
+ Convert a single NED point to geodetic coordinates.
+ """
+ ecef = self.ned2ecef_single(ned)
+ return ecef2geodetic_single(ecef)
+
+ @property
+ def ned_from_ecef_matrix(self):
+ """
+ Returns the rotation matrix from ECEF to NED coordinates.
+ """
+ return self.ecef2ned_matrix
+
+ @property
+ def ecef_from_ned_matrix(self):
+ """
+ Returns the rotation matrix from NED to ECEF coordinates.
+ """
+ return self.ned2ecef_matrix
+
+
+def ecef_euler_from_ned_single(ecef_init, ned_pose):
+ """
+ Convert NED Euler angles (roll, pitch, yaw) at a given ECEF origin
+ to equivalent ECEF Euler angles.
+ """
+ converter = LocalCoord(ecef=ecef_init)
+ zero = np.array(ecef_init)
+
+ x0 = converter.ned2ecef_single([1, 0, 0]) - zero
+ y0 = converter.ned2ecef_single([0, 1, 0]) - zero
+ z0 = converter.ned2ecef_single([0, 0, 1]) - zero
+
+ phi, theta, psi = ned_pose
+
+ x1 = axis_angle_to_rot(z0, psi) @ x0
+ y1 = axis_angle_to_rot(z0, psi) @ y0
+ z1 = axis_angle_to_rot(z0, psi) @ z0
+
+ x2 = axis_angle_to_rot(y1, theta) @ x1
+ y2 = axis_angle_to_rot(y1, theta) @ y1
+ z2 = axis_angle_to_rot(y1, theta) @ z1
+
+ x3 = axis_angle_to_rot(x2, phi) @ x2
+ y3 = axis_angle_to_rot(x2, phi) @ y2
+
+ x0 = np.array([1.0, 0, 0])
+ y0 = np.array([0, 1.0, 0])
+ z0 = np.array([0, 0, 1.0])
+
+ psi_out = np.arctan2(np.dot(x3, y0), np.dot(x3, x0))
+ theta_out = np.arctan2(-np.dot(x3, z0), np.sqrt(np.dot(x3, x0)**2 + np.dot(x3, y0)**2))
+
+ y2 = axis_angle_to_rot(z0, psi_out) @ y0
+ z2 = axis_angle_to_rot(y2, theta_out) @ z0
+
+ phi_out = np.arctan2(np.dot(y3, z2), np.dot(y3, y2))
+
+ return np.array([phi_out, theta_out, psi_out])
+
+
+def ned_euler_from_ecef_single(ecef_init, ecef_pose):
+ """
+ Convert ECEF Euler angles (roll, pitch, yaw) at a given ECEF origin
+ to equivalent NED Euler angles.
+ """
+ converter = LocalCoord(ecef=ecef_init)
+
+ x0 = np.array([1.0, 0, 0])
+ y0 = np.array([0, 1.0, 0])
+ z0 = np.array([0, 0, 1.0])
+
+ phi, theta, psi = ecef_pose
+
+ x1 = axis_angle_to_rot(z0, psi) @ x0
+ y1 = axis_angle_to_rot(z0, psi) @ y0
+ z1 = axis_angle_to_rot(z0, psi) @ z0
+
+ x2 = axis_angle_to_rot(y1, theta) @ x1
+ y2 = axis_angle_to_rot(y1, theta) @ y1
+ z2 = axis_angle_to_rot(y1, theta) @ z1
+
+ x3 = axis_angle_to_rot(x2, phi) @ x2
+ y3 = axis_angle_to_rot(x2, phi) @ y2
+
+ zero = np.array(ecef_init)
+ x0 = converter.ned2ecef_single([1, 0, 0]) - zero
+ y0 = converter.ned2ecef_single([0, 1, 0]) - zero
+ z0 = converter.ned2ecef_single([0, 0, 1]) - zero
+
+ psi_out = np.arctan2(np.dot(x3, y0), np.dot(x3, x0))
+ theta_out = np.arctan2(-np.dot(x3, z0), np.sqrt(np.dot(x3, x0)**2 + np.dot(x3, y0)**2))
+
+ y2 = axis_angle_to_rot(z0, psi_out) @ y0
+ z2 = axis_angle_to_rot(y2, theta_out) @ z0
+
+ phi_out = np.arctan2(np.dot(y3, z2), np.dot(y3, y2))
+
+ return np.array([phi_out, theta_out, psi_out])
diff --git a/common/utils.py b/common/utils.py
new file mode 100644
index 000000000..e0aa1605d
--- /dev/null
+++ b/common/utils.py
@@ -0,0 +1,271 @@
+import io
+import os
+import tempfile
+import contextlib
+import subprocess
+import time
+import functools
+from subprocess import Popen, PIPE, TimeoutExpired
+import zstandard as zstd
+
+LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change
+
+class Timer:
+ """Simple lap timer for profiling sequential operations."""
+
+ def __init__(self):
+ self._start = self._lap = time.monotonic()
+ self._sections = {}
+
+ def lap(self, name):
+ now = time.monotonic()
+ self._sections[name] = now - self._lap
+ self._lap = now
+
+ @property
+ def total(self):
+ return time.monotonic() - self._start
+
+ def fmt(self, duration):
+ parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items())
+ total = self.total
+ realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A"
+ return f"{duration}s in {total:.1f}s ({realtime}) | {parts}"
+
+def sudo_write(val: str, path: str) -> None:
+ try:
+ with open(path, 'w') as f:
+ f.write(str(val))
+ except PermissionError:
+ os.system(f"sudo chmod a+w {path}")
+ try:
+ with open(path, 'w') as f:
+ f.write(str(val))
+ except PermissionError:
+ # fallback for debugfs files
+ os.system(f"sudo su -c 'echo {val} > {path}'")
+
+
+def sudo_read(path: str) -> str:
+ try:
+ return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip()
+ except Exception:
+ return ""
+
+
+class MovingAverage:
+ def __init__(self, window_size: int):
+ self.window_size: int = window_size
+ self.buffer: list[float] = [0.0] * window_size
+ self.index: int = 0
+ self.count: int = 0
+ self.sum: float = 0.0
+
+ def add_value(self, new_value: float):
+ # Update the sum: subtract the value being replaced and add the new value
+ self.sum -= self.buffer[self.index]
+ self.buffer[self.index] = new_value
+ self.sum += new_value
+
+ # Update the index in a circular manner
+ self.index = (self.index + 1) % self.window_size
+
+ # Track the number of added values (for partial windows)
+ self.count = min(self.count + 1, self.window_size)
+
+ def get_average(self) -> float:
+ if self.count == 0:
+ return float('nan')
+ return self.sum / self.count
+
+
+class CallbackReader:
+ """Wraps a file, but overrides the read method to also
+ call a callback function with the number of bytes read so far."""
+
+ def __init__(self, f, callback, *args):
+ self.f = f
+ self.callback = callback
+ self.cb_args = args
+ self.total_read = 0
+
+ def __getattr__(self, attr):
+ return getattr(self.f, attr)
+
+ def read(self, *args, **kwargs):
+ chunk = self.f.read(*args, **kwargs)
+ self.total_read += len(chunk)
+ self.callback(*self.cb_args, self.total_read)
+ return chunk
+
+
+@contextlib.contextmanager
+def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None,
+ overwrite: bool = False):
+ """Write to a file atomically using a temporary file in the same directory as the destination file."""
+ dir_name = os.path.dirname(path)
+
+ if not overwrite and os.path.exists(path):
+ raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.")
+
+ with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file:
+ yield tmp_file
+ tmp_file_name = tmp_file.name
+ os.replace(tmp_file_name, path)
+
+
+def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]:
+ if not should_compress:
+ file_size = os.path.getsize(filepath)
+ file_stream = open(filepath, "rb")
+ return file_stream, file_size
+
+ # Compress the file on the fly
+ compressed_stream = io.BytesIO()
+ compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL)
+
+ with open(filepath, "rb") as f:
+ compressor.copy_stream(f, compressed_stream)
+ compressed_size = compressed_stream.tell()
+ compressed_stream.seek(0)
+ return compressed_stream, compressed_size
+
+
+# remove all keys that end in DEPRECATED
+def strip_deprecated_keys(d):
+ for k in list(d.keys()):
+ if isinstance(k, str):
+ if k.endswith('DEPRECATED'):
+ d.pop(k)
+ elif isinstance(d[k], dict):
+ strip_deprecated_keys(d[k])
+ return d
+
+
+def run_cmd(cmd: list[str], cwd=None, env=None) -> str:
+ return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip()
+
+
+def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str:
+ try:
+ return run_cmd(cmd, cwd=cwd, env=env)
+ except subprocess.CalledProcessError:
+ return default
+
+
+@contextlib.contextmanager
+def managed_proc(cmd: list[str], env: dict[str, str]):
+ proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE)
+ try:
+ yield proc
+ finally:
+ if proc.poll() is None:
+ proc.terminate()
+ try:
+ proc.wait(timeout=5)
+ except TimeoutExpired:
+ proc.kill()
+
+
+def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None):
+ rows = [list(row) for row in tabular_data]
+
+ def fmt(val):
+ if isinstance(val, str):
+ return val
+ if isinstance(val, (bool, int)):
+ return str(val)
+ try:
+ return format(val, floatfmt)
+ except (TypeError, ValueError):
+ return str(val)
+
+ formatted = [[fmt(c) for c in row] for row in rows]
+ hdrs = [str(h) for h in headers] if headers else None
+
+ ncols = max((len(r) for r in formatted), default=0)
+ if hdrs:
+ ncols = max(ncols, len(hdrs))
+ if ncols == 0:
+ return ""
+
+ for r in formatted:
+ r.extend([""] * (ncols - len(r)))
+ if hdrs:
+ hdrs.extend([""] * (ncols - len(hdrs)))
+
+ widths = [0] * ncols
+ if hdrs:
+ for i in range(ncols):
+ widths[i] = len(hdrs[i])
+ for row in formatted:
+ for i in range(ncols):
+ widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n')))
+
+ def _align(s, w):
+ if stralign == "center":
+ return s.center(w)
+ return s.ljust(w)
+
+ if tablefmt == "html":
+ parts = [""]
+ if hdrs:
+ parts.append("")
+ parts.append("" + "".join(f"{h} " for h in hdrs) + " ")
+ parts.append(" ")
+ parts.append("")
+ for row in formatted:
+ parts.append("" + "".join(f"{c} " for c in row) + " ")
+ parts.append(" ")
+ parts.append("
")
+ return "\n".join(parts)
+
+ if tablefmt == "simple_grid":
+ def _sep(left, mid, right):
+ return left + mid.join("─" * (w + 2) for w in widths) + right
+
+ top, mid_sep, bot = _sep("┌", "┬", "┐"), _sep("├", "┼", "┤"), _sep("└", "┴", "┘")
+
+ def _fmt_row(cells):
+ split = [c.split('\n') for c in cells]
+ nlines = max(len(s) for s in split)
+ for s in split:
+ s.extend([""] * (nlines - len(s)))
+ return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)]
+
+ lines = [top]
+ if hdrs:
+ lines.extend(_fmt_row(hdrs))
+ lines.append(mid_sep)
+ for ri, row in enumerate(formatted):
+ lines.extend(_fmt_row(row))
+ lines.append(mid_sep if ri < len(formatted) - 1 else bot)
+ return "\n".join(lines)
+
+ gap = " "
+ lines = []
+ if hdrs:
+ lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True)))
+ lines.append(gap.join("-" * w for w in widths))
+ for row in formatted:
+ lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols)))
+ return "\n".join(lines)
+
+
+def retry(attempts=3, delay=1.0, ignore_failure=False):
+ def decorator(func):
+ @functools.wraps(func)
+ def wrapper(*args, **kwargs):
+ for _ in range(attempts):
+ try:
+ return func(*args, **kwargs)
+ except Exception:
+ print(f"{func.__name__} failed, trying again")
+ time.sleep(delay)
+
+ if ignore_failure:
+ print(f"{func.__name__} failed after retry")
+ else:
+ raise Exception(f"{func.__name__} failed after retry")
+ return wrapper
+ return decorator
diff --git a/common/version.h b/common/version.h
new file mode 100644
index 000000000..ff4e21c7c
--- /dev/null
+++ b/common/version.h
@@ -0,0 +1,3 @@
+// required by installer.comma.ai: stock AGNOS setup 409s "Incompatible openpilot version"
+// on comma 4 (mici) if this header is missing or the version predates mici support
+#define COMMA_VERSION "0.10.4"
diff --git a/common/version.py b/common/version.py
new file mode 100644
index 000000000..33deae729
--- /dev/null
+++ b/common/version.py
@@ -0,0 +1,5 @@
+from openpilot.common.git import get_normalized_origin
+
+
+def get_version() -> str:
+ return "IQ.Pilot 1.0c"
diff --git a/compile_commands.json b/compile_commands.json
new file mode 100644
index 000000000..279f34096
--- /dev/null
+++ b/compile_commands.json
@@ -0,0 +1,722 @@
+[
+ {
+ "command": "clang++ -o common/params.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu common/params.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/params.cc",
+ "output": "/data/openpilot/common/params.o"
+ },
+ {
+ "command": "clang++ -o common/swaglog.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu common/swaglog.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/swaglog.cc",
+ "output": "/data/openpilot/common/swaglog.o"
+ },
+ {
+ "command": "clang++ -o common/util.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu common/util.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/util.cc",
+ "output": "/data/openpilot/common/util.o"
+ },
+ {
+ "command": "clang++ -o common/ratekeeper.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu common/ratekeeper.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/ratekeeper.cc",
+ "output": "/data/openpilot/common/ratekeeper.o"
+ },
+ {
+ "command": "clang++ -o common/clutil.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu common/clutil.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/clutil.cc",
+ "output": "/data/openpilot/common/clutil.o"
+ },
+ {
+ "command": "clang++ -o common/yuv.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu common/yuv.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/yuv.cc",
+ "output": "/data/openpilot/common/yuv.o"
+ },
+ {
+ "command": "clang++ -o common/params_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include common/params_pyx.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/common/params_pyx.cpp",
+ "output": "/data/openpilot/common/params_pyx.o"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/ipc.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/ipc.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/ipc.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/ipc.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/event.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/event.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/event.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/event.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/impl_zmq.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/impl_zmq.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/impl_zmq.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/impl_zmq.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/impl_msgq.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/impl_msgq.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/impl_msgq.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/impl_msgq.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/impl_fake.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/impl_fake.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/impl_fake.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/impl_fake.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/msgq.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/msgq.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/msgq.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/msgq.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/ipc_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include msgq_repo/msgq/ipc_pyx.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/ipc_pyx.cpp",
+ "output": "/data/openpilot/msgq_repo/msgq/ipc_pyx.o"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/visionipc/visionipc.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/visionipc/visionipc.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/visionipc/visionipc_server.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/visionipc/visionipc_server.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc_server.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc_server.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/visionipc/visionipc_client.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/visionipc/visionipc_client.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc_client.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc_client.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/visionipc/visionbuf.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/visionipc/visionbuf.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/visionipc/visionbuf.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/visionipc/visionbuf.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/visionipc/visionbuf_ion.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DSWAGLOG=\"\\\"common/swaglog.h\\\"\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu msgq_repo/msgq/visionipc/visionbuf_ion.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/visionipc/visionbuf_ion.cc",
+ "output": "/data/openpilot/msgq_repo/msgq/visionipc/visionbuf_ion.os"
+ },
+ {
+ "command": "clang++ -o msgq_repo/msgq/visionipc/visionipc_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include msgq_repo/msgq/visionipc/visionipc_pyx.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc_pyx.cpp",
+ "output": "/data/openpilot/msgq_repo/msgq/visionipc/visionipc_pyx.o"
+ },
+ {
+ "command": "clang++ -o cereal/gen/cpp/log.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/gen/cpp/log.capnp.c++",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/gen/cpp/log.capnp.c++",
+ "output": "/data/openpilot/cereal/gen/cpp/log.capnp.o"
+ },
+ {
+ "command": "clang++ -o cereal/gen/cpp/car.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/gen/cpp/car.capnp.c++",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/gen/cpp/car.capnp.c++",
+ "output": "/data/openpilot/cereal/gen/cpp/car.capnp.o"
+ },
+ {
+ "command": "clang++ -o cereal/gen/cpp/legacy.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/gen/cpp/legacy.capnp.c++",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/gen/cpp/legacy.capnp.c++",
+ "output": "/data/openpilot/cereal/gen/cpp/legacy.capnp.o"
+ },
+ {
+ "command": "clang++ -o cereal/gen/cpp/custom.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/gen/cpp/custom.capnp.c++",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/gen/cpp/custom.capnp.c++",
+ "output": "/data/openpilot/cereal/gen/cpp/custom.capnp.o"
+ },
+ {
+ "command": "clang++ -o cereal/messaging/bridge.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/messaging/bridge.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/messaging/bridge.cc",
+ "output": "/data/openpilot/cereal/messaging/bridge.o"
+ },
+ {
+ "command": "clang++ -o cereal/messaging/msgq_to_zmq.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/messaging/msgq_to_zmq.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/messaging/msgq_to_zmq.cc",
+ "output": "/data/openpilot/cereal/messaging/msgq_to_zmq.o"
+ },
+ {
+ "command": "clang++ -o cereal/messaging/socketmaster.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu cereal/messaging/socketmaster.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/cereal/messaging/socketmaster.cc",
+ "output": "/data/openpilot/cereal/messaging/socketmaster.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -mcpu=cortex-m4 -mhard-float -DSTM32F4 -DSTM32F413xx -Iboard/stm32f4/inc -mfpu=fpv4-sp-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32f4/stm32f4_flash.ld -fsingle-precision-constant -Os -g -o panda/board/stm32f4/board/obj/pandastartup_stm32f413xx.o -c panda/board/stm32f4/startup_stm32f413xx.s",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/stm32f4/startup_stm32f413xx.s",
+ "output": "/data/openpilot/panda/board/stm32f4/board/obj/pandastartup_stm32f413xx.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/pandarsa.o -c -mcpu=cortex-m4 -mhard-float -DSTM32F4 -DSTM32F413xx -Iboard/stm32f4/inc -mfpu=fpv4-sp-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32f4/stm32f4_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/rsa.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/rsa.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/pandarsa.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/pandasha.o -c -mcpu=cortex-m4 -mhard-float -DSTM32F4 -DSTM32F413xx -Iboard/stm32f4/inc -mfpu=fpv4-sp-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32f4/stm32f4_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/sha.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/sha.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/pandasha.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/board/obj/pandabootstub.o -c -mcpu=cortex-m4 -mhard-float -DSTM32F4 -DSTM32F413xx -Iboard/stm32f4/inc -mfpu=fpv4-sp-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32f4/stm32f4_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/bootstub.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/bootstub.c",
+ "output": "/data/openpilot/panda/board/board/obj/pandabootstub.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/board/obj/pandamain.o -c -mcpu=cortex-m4 -mhard-float -DSTM32F4 -DSTM32F413xx -Iboard/stm32f4/inc -mfpu=fpv4-sp-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32f4/stm32f4_flash.ld -fsingle-precision-constant -Os -g -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/main.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/main.c",
+ "output": "/data/openpilot/panda/board/board/obj/pandamain.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -o panda/board/stm32h7/board/obj/panda_h7startup_stm32h7x5xx.o -c panda/board/stm32h7/startup_stm32h7x5xx.s",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/stm32h7/startup_stm32h7x5xx.s",
+ "output": "/data/openpilot/panda/board/stm32h7/board/obj/panda_h7startup_stm32h7x5xx.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/panda_h7rsa.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/rsa.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/rsa.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/panda_h7rsa.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/panda_h7sha.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/sha.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/sha.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/panda_h7sha.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/board/obj/panda_h7bootstub.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/bootstub.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/bootstub.c",
+ "output": "/data/openpilot/panda/board/board/obj/panda_h7bootstub.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/board/obj/panda_h7main.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/main.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/main.c",
+ "output": "/data/openpilot/panda/board/board/obj/panda_h7main.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_JUNGLE -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -o panda/board/stm32h7/board/obj/panda_jungle_h7startup_stm32h7x5xx.o -c panda/board/stm32h7/startup_stm32h7x5xx.s",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/stm32h7/startup_stm32h7x5xx.s",
+ "output": "/data/openpilot/panda/board/stm32h7/board/obj/panda_jungle_h7startup_stm32h7x5xx.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/panda_jungle_h7rsa.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_JUNGLE -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/rsa.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/rsa.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/panda_jungle_h7rsa.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/panda_jungle_h7sha.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_JUNGLE -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/sha.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/sha.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/panda_jungle_h7sha.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/board/obj/panda_jungle_h7bootstub.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_JUNGLE -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/bootstub.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/bootstub.c",
+ "output": "/data/openpilot/panda/board/board/obj/panda_jungle_h7bootstub.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/jungle/board/obj/panda_jungle_h7main.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_JUNGLE -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/jungle/main.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/jungle/main.c",
+ "output": "/data/openpilot/panda/board/jungle/board/obj/panda_jungle_h7main.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_BODY -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -o panda/board/stm32h7/board/obj/body_h7startup_stm32h7x5xx.o -c panda/board/stm32h7/startup_stm32h7x5xx.s",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/stm32h7/startup_stm32h7x5xx.s",
+ "output": "/data/openpilot/panda/board/stm32h7/board/obj/body_h7startup_stm32h7x5xx.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/body_h7rsa.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_BODY -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/rsa.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/rsa.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/body_h7rsa.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/crypto/board/obj/body_h7sha.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_BODY -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/crypto/sha.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/crypto/sha.c",
+ "output": "/data/openpilot/panda/crypto/board/obj/body_h7sha.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/board/obj/body_h7bootstub.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_BODY -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -DBOOTSTUB -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/bootstub.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/bootstub.c",
+ "output": "/data/openpilot/panda/board/board/obj/body_h7bootstub.o"
+ },
+ {
+ "command": "arm-none-eabi-gcc -o panda/board/body/board/obj/body_h7main.o -c -mcpu=cortex-m7 -mhard-float -DSTM32H7 -DSTM32H725xx -Iboard/stm32h7/inc -mfpu=fpv5-d16 -DPANDA_BODY -DALLOW_DEBUG -Wall -Wextra -Wstrict-prototypes -Werror -mlittle-endian -mthumb -nostdlib -fno-builtin -std=gnu11 -fmax-errors=1 -Tpanda/board/stm32h7/stm32h7x5_flash.ld -fsingle-precision-constant -Os -g -Ipanda -Ipanda/board/stm32f4/inc -Ipanda/board/stm32h7/inc -Iiqdbc_repo panda/board/body/main.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/panda/board/body/main.c",
+ "output": "/data/openpilot/panda/board/body/board/obj/body_h7main.o"
+ },
+ {
+ "command": "clang++ -o rednose/helpers/ekf_load.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu rednose/helpers/ekf_load.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/rednose/helpers/ekf_load.cc",
+ "output": "/data/openpilot/rednose/helpers/ekf_load.os"
+ },
+ {
+ "command": "clang++ -o rednose/helpers/ekf_sym.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu rednose/helpers/ekf_sym.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/rednose/helpers/ekf_sym.cc",
+ "output": "/data/openpilot/rednose/helpers/ekf_sym.os"
+ },
+ {
+ "command": "clang++ -o rednose/helpers/ekf_sym_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include rednose/helpers/ekf_sym_pyx.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/rednose/helpers/ekf_sym_pyx.cpp",
+ "output": "/data/openpilot/rednose/helpers/ekf_sym_pyx.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/logger.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/logger.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/logger.cc",
+ "output": "/data/openpilot/system/loggerd/logger.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/zstd_writer.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/zstd_writer.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/zstd_writer.cc",
+ "output": "/data/openpilot/system/loggerd/zstd_writer.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/video_writer.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/video_writer.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/video_writer.cc",
+ "output": "/data/openpilot/system/loggerd/video_writer.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/encoder/encoder.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/encoder/encoder.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/encoder/encoder.cc",
+ "output": "/data/openpilot/system/loggerd/encoder/encoder.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/encoder/v4l_encoder.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/encoder/v4l_encoder.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/encoder/v4l_encoder.cc",
+ "output": "/data/openpilot/system/loggerd/encoder/v4l_encoder.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/encoder/jpeg_encoder.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/encoder/jpeg_encoder.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/encoder/jpeg_encoder.cc",
+ "output": "/data/openpilot/system/loggerd/encoder/jpeg_encoder.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/loggerd.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/loggerd.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/loggerd.cc",
+ "output": "/data/openpilot/system/loggerd/loggerd.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/encoderd.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/encoderd.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/encoderd.cc",
+ "output": "/data/openpilot/system/loggerd/encoderd.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/bootlog.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/bootlog.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/bootlog.cc",
+ "output": "/data/openpilot/system/loggerd/bootlog.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/encoder/qcom_decoder_hwdec.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu tools/replay/qcom_decoder.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/tools/replay/qcom_decoder.cc",
+ "output": "/data/openpilot/system/loggerd/encoder/qcom_decoder_hwdec.o"
+ },
+ {
+ "command": "clang++ -o system/loggerd/encoder/v4l_decode.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/loggerd/encoder/v4l_decode.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/loggerd/encoder/v4l_decode.cc",
+ "output": "/data/openpilot/system/loggerd/encoder/v4l_decode.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/cameras/camera_qcom2.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/cameras/camera_qcom2.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/cameras/camera_qcom2.cc",
+ "output": "/data/openpilot/system/camerad/cameras/camera_qcom2.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/cameras/camera_common.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/cameras/camera_common.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/cameras/camera_common.cc",
+ "output": "/data/openpilot/system/camerad/cameras/camera_common.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/cameras/spectra.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/cameras/spectra.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/cameras/spectra.cc",
+ "output": "/data/openpilot/system/camerad/cameras/spectra.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/cameras/cdm.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/cameras/cdm.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/cameras/cdm.cc",
+ "output": "/data/openpilot/system/camerad/cameras/cdm.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/sensors/ar0231.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/sensors/ar0231.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/sensors/ar0231.cc",
+ "output": "/data/openpilot/system/camerad/sensors/ar0231.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/sensors/ox03c10.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/sensors/ox03c10.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/sensors/ox03c10.cc",
+ "output": "/data/openpilot/system/camerad/sensors/ox03c10.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/sensors/os04c10.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/sensors/os04c10.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/sensors/os04c10.cc",
+ "output": "/data/openpilot/system/camerad/sensors/os04c10.o"
+ },
+ {
+ "command": "clang++ -o system/camerad/main.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu system/camerad/main.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/system/camerad/main.cc",
+ "output": "/data/openpilot/system/camerad/main.o"
+ },
+ {
+ "command": "clang++ -o third_party/json11/json11.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unqualified-std-cast-call -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu third_party/json11/json11.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/third_party/json11/json11.cpp",
+ "output": "/data/openpilot/third_party/json11/json11.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/pandad/panda.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/pandad/panda.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/pandad/panda.cc",
+ "output": "/data/openpilot/selfdrive/pandad/panda.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/pandad/panda_comms.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/pandad/panda_comms.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/pandad/panda_comms.cc",
+ "output": "/data/openpilot/selfdrive/pandad/panda_comms.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/pandad/spi.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/pandad/spi.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/pandad/spi.cc",
+ "output": "/data/openpilot/selfdrive/pandad/spi.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/pandad/main.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/pandad/main.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/pandad/main.cc",
+ "output": "/data/openpilot/selfdrive/pandad/main.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/pandad/pandad.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/pandad/pandad.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/pandad/pandad.cc",
+ "output": "/data/openpilot/selfdrive/pandad/pandad.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/pandad/panda_safety.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/pandad/panda_safety.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/pandad/panda_safety.cc",
+ "output": "/data/openpilot/selfdrive/pandad/panda_safety.o"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o -c -std=gnu11 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.os"
+ },
+ {
+ "command": "clang -o selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o -c -std=gnu11 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c",
+ "output": "/data/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/locationd/models/generated/pose.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/locationd/models/generated/pose.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/locationd/models/generated/pose.cpp",
+ "output": "/data/openpilot/selfdrive/locationd/models/generated/pose.os"
+ },
+ {
+ "command": "clang++ -o selfdrive/locationd/models/generated/car.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/locationd/models/generated/car.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/locationd/models/generated/car.cpp",
+ "output": "/data/openpilot/selfdrive/locationd/models/generated/car.os"
+ },
+ {
+ "command": "clang++ -o selfdrive/modeld/models/commonmodel.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/transform.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/loadyuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/modeld/models/commonmodel.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/modeld/models/commonmodel.cc",
+ "output": "/data/openpilot/selfdrive/modeld/models/commonmodel.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/modeld/transforms/loadyuv.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/transform.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/loadyuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/modeld/transforms/loadyuv.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/modeld/transforms/loadyuv.cc",
+ "output": "/data/openpilot/selfdrive/modeld/transforms/loadyuv.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/modeld/transforms/transform.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/transform.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/loadyuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu selfdrive/modeld/transforms/transform.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/modeld/transforms/transform.cc",
+ "output": "/data/openpilot/selfdrive/modeld/transforms/transform.o"
+ },
+ {
+ "command": "clang++ -o selfdrive/modeld/models/commonmodel_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/transform.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/selfdrive/modeld/transforms/loadyuv.cl\\\" -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include selfdrive/modeld/models/commonmodel_pyx.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/selfdrive/modeld/models/commonmodel_pyx.cpp",
+ "output": "/data/openpilot/selfdrive/modeld/models/commonmodel_pyx.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/common/transformations/orientation.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/transformations/orientation.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/common/transformations/orientation.cc",
+ "output": "/data/openpilot/iqpilot/common/transformations/orientation.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/common/transformations/coordinates.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/transformations/coordinates.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/common/transformations/coordinates.cc",
+ "output": "/data/openpilot/iqpilot/common/transformations/coordinates.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqmodeld/native/iqmodel.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqmodeld/native/iqmodel.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel.cc",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqmodeld/transforms/yuv.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqmodeld/transforms/yuv.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cc",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cc",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.cpp",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqlocd/models/generated/orbit.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqlocd/models/generated/orbit.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/generated/orbit.cpp",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/generated/orbit.os"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqlocd/models/generated/car.os -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -fPIC -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqlocd/models/generated/car.cpp",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/generated/car.cpp",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/generated/car.os"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqlocd/atlas_loc_core.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqlocd/atlas_loc_core.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqlocd/atlas_loc_core.cc",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqlocd/atlas_loc_core.o"
+ },
+ {
+ "command": "clang++ -o iqpilot/selfdrive/iqlocd/models/orbit_kf.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Imsgq -Ithird_party -Ithird_party/json11 -Ithird_party/linux/include -Ithird_party/acados/include -Ithird_party/acados/include/blasfeo/include -Ithird_party/acados/include/hpipm/include -Ithird_party/catch2/include -Ithird_party/libyuv/include -Ithird_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqlocd/models/orbit_kf.cc",
+ "directory": "/data/openpilot",
+ "file": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/orbit_kf.cc",
+ "output": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/orbit_kf.o"
+ }
+]
diff --git a/conftest.py b/conftest.py
new file mode 100644
index 000000000..0a10faa3c
--- /dev/null
+++ b/conftest.py
@@ -0,0 +1,112 @@
+import contextlib
+import gc
+import os
+import pytest
+
+from openpilot.common.prefix import OpenpilotPrefix
+from openpilot.system.manager import manager
+from openpilot.system.hardware import TICI, HARDWARE
+
+# TODO: pytest-cpp doesn't support FAIL, and we need to create test translations in sessionstart
+# pending https://github.com/pytest-dev/pytest-cpp/pull/147
+collect_ignore = [
+ "selfdrive/ui/tests/test_translations",
+ "selfdrive/test/process_replay/test_processes.py",
+ "selfdrive/test/process_replay/test_regen.py",
+]
+collect_ignore_glob = [
+ "selfdrive/debug/*.py",
+ "selfdrive/modeld/*.py",
+ "iqpilot/modeld*/*.py",
+]
+
+
+def pytest_sessionstart(session):
+ # TODO: fix tests and enable test order randomization
+ if session.config.pluginmanager.hasplugin('randomly'):
+ session.config.option.randomly_reorganize = False
+
+
+@pytest.hookimpl(hookwrapper=True, trylast=True)
+def pytest_runtest_call(item):
+ # ensure we run as a hook after capturemanager's
+ if item.get_closest_marker("nocapture") is not None:
+ capmanager = item.config.pluginmanager.getplugin("capturemanager")
+ with capmanager.global_and_fixture_disabled():
+ yield
+ else:
+ yield
+
+
+@contextlib.contextmanager
+def clean_env():
+ starting_env = dict(os.environ)
+ yield
+ os.environ.clear()
+ os.environ.update(starting_env)
+
+
+@pytest.fixture(scope="function", autouse=True)
+def openpilot_function_fixture(request):
+ with clean_env():
+ # setup a clean environment for each test
+ with OpenpilotPrefix(shared_download_cache=request.node.get_closest_marker("shared_download_cache") is not None) as prefix:
+ prefix = os.environ["OPENPILOT_PREFIX"]
+
+ yield
+
+ # ensure the test doesn't change the prefix
+ assert "OPENPILOT_PREFIX" in os.environ and prefix == os.environ["OPENPILOT_PREFIX"]
+
+ # cleanup any started processes
+ manager.manager_cleanup()
+
+ # some processes disable gc for performance, re-enable here
+ if not gc.isenabled():
+ gc.enable()
+ gc.collect()
+
+# If you use setUpClass, the environment variables won't be cleared properly,
+# so we need to hook both the function and class pytest fixtures
+@pytest.fixture(scope="class", autouse=True)
+def openpilot_class_fixture():
+ with clean_env():
+ yield
+
+
+@pytest.fixture(scope="function")
+def tici_setup_fixture(request, openpilot_function_fixture):
+ """Ensure a consistent state for tests on-device. Needs the openpilot function fixture to run first."""
+ if 'skip_tici_setup' in request.keywords:
+ return
+ HARDWARE.initialize_hardware()
+ HARDWARE.set_power_save(False)
+ os.system("pkill -9 -f hephaestusd")
+
+
+@pytest.hookimpl(tryfirst=True)
+def pytest_collection_modifyitems(config, items):
+ skipper = pytest.mark.skip(reason="Skipping tici test on PC")
+ for item in items:
+ if "tici" in item.keywords:
+ if not TICI:
+ item.add_marker(skipper)
+ else:
+ item.fixturenames.append('tici_setup_fixture')
+
+ if "xdist_group_class_property" in item.keywords:
+ class_property_name = item.get_closest_marker('xdist_group_class_property').args[0]
+ class_property_value = getattr(item.cls, class_property_name)
+ item.add_marker(pytest.mark.xdist_group(class_property_value))
+
+
+@pytest.hookimpl(trylast=True)
+def pytest_configure(config):
+ config_line = "xdist_group_class_property: group tests by a property of the class that contains them"
+ config.addinivalue_line("markers", config_line)
+
+ config_line = "nocapture: don't capture test output"
+ config.addinivalue_line("markers", config_line)
+
+ config_line = "shared_download_cache: share download cache between tests"
+ config.addinivalue_line("markers", config_line)
diff --git a/iqdbc b/iqdbc
new file mode 120000
index 000000000..7baddc7f5
--- /dev/null
+++ b/iqdbc
@@ -0,0 +1 @@
+iqdbc_repo/iqdbc
\ No newline at end of file
diff --git a/iqdbc_repo/.gitignore b/iqdbc_repo/.gitignore
new file mode 100644
index 000000000..0f5ebf6c1
--- /dev/null
+++ b/iqdbc_repo/.gitignore
@@ -0,0 +1,35 @@
+.cache/
+/build/
+*.pyc
+*.os
+*.o
+*.so
+*.a
+*.tmp
+*.dylib
+.*.swp
+.DS_Store
+.sconsign.dblite
+.hypothesis
+*.egg-info/
+*.html
+*.gcda
+*.gcno
+*.dump
+*.gcov
+/dist/
+.vscode/
+__pycache__/
+mull.yml
+*.profraw
+
+iqdbc/can/build/
+iqdbc/can/obj/
+iqdbc/dbc/*_generated.dbc
+
+cppcheck-addon-ctu-file-list
+iqdbc/safety/tests/coverage-out
+
+compile_commands.json
+.mull/
+/iqdbc/car/volkswagen/tests/test_mqb_iq_alc_state.py
diff --git a/iqdbc_repo/LICENSE b/iqdbc_repo/LICENSE
new file mode 100644
index 000000000..31df1b948
--- /dev/null
+++ b/iqdbc_repo/LICENSE
@@ -0,0 +1,106 @@
+IQ.Lvbs License v0.1a
+
+Copyright (c) 2026 IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. All Rights Reserved.
+
+DEFINITIONS
+
+"Software" refers to IQ.Pilot, konn3kt, and all associated source code,
+documentation, and assets owned by the Copyright Holder.
+
+"Open Components" refers to portions of the Software explicitly marked as
+open source.
+
+"Proprietary Components" refers to all portions of the Software not made
+available to the public in source form.
+
+"Copyright Holder" refers to IQ.Lvbs LLC, a part of Project Teal Lvbs Inc.
+
+GRANT OF LICENSE
+
+Subject to the terms of this license, you are granted a limited,
+non-exclusive, revocable license to:
+
+1. View, study, and learn from the Open Components
+2. Modify the Open Components for personal, internal, or open-source public use
+3. Run the Software for personal, non-commercial purposes
+
+RESTRICTIONS
+
+You may NOT:
+
+1. Claim ownership of any part of the Software, excluding your own
+ modifications that do not incorporate Proprietary Components.
+
+2. Reverse engineer, decompile, disassemble, or in any way attempt to
+ circumvent the obfuscation of the Proprietary Components.
+
+3. Use the Software or any derivative for commercial purposes without
+ explicit written permission from the Copyright Holder.
+
+4. Remove or alter any copyright notices or this license.
+
+5. Sublicense, sell, or transfer rights to the Software.
+
+6. Use the Software and/or its source code to compete with or create a
+ substantially similar product.
+
+7. Use the Software in closed source software not licensed by IQ.Lvbs LLC.
+
+CONSEQUENCES OF VIOLATION
+
+In the event any Restriction is violated, any product created using inspiration from, or source code from, IQ.Pilot or Konn3kt shall be subject to a licensing fee determined solely by the Copyright Holder. Additionally, the violating party hereby grants IQ.Lvbs LLC an exclusive, irrevocable, worldwide, royalty-free license to use any and all assets from the infringing product on IQ.Lvbs webpages, advertising materials, and in any other manner IQ.Lvbs sees fit.
+
+OWNERSHIP
+
+All rights, title, and interest in the Software remain exclusively with the
+Copyright Holder. Any modifications, improvements, or derivative works you
+create based on the Software are owned by the Copyright Holder. By
+contributing modifications, you irrevocably assign all rights to the
+Copyright Holder.
+
+PROPRIETARY COMPONENTS
+
+The Proprietary Components are provided in binary or obfuscated form only.
+Reverse engineering, decompilation, or disassembly of Proprietary Components
+is strictly prohibited. Violation of this provision entitles IQ.Lvbs LLC to
+pursue all available legal remedies to protect its intellectual property and
+trade secrets.
+
+NO WARRANTY
+
+THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT
+HOLDER DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+NON-INFRINGEMENT.
+
+LIMITATION OF LIABILITY
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR
+OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE. THE USER ACCEPTS FULL
+RESPONSIBILITY FOR ANY AND ALL LIABILITIES WHEN USING IQ.LVBS SOFTWARE.
+
+TERMINATION
+
+This license terminates automatically if you violate any of its terms. Upon
+termination, you must destroy all copies of the Software in your possession.
+
+The Copyright Holder reserves the right to revoke this license at any time
+for any reason.
+
+GOVERNING LAW
+
+This license shall be governed by the laws of the State of Illinois, United
+States of America. Any disputes arising under this license shall be subject
+to the exclusive jurisdiction of the courts located in Henry County, Illinois.
+
+---
+
+For commercial licensing inquiries, contact: support@iqlvbs.com
+
+Copyright (c) 2020, Comma.ai, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/iqdbc_repo/LICENSE.md b/iqdbc_repo/LICENSE.md
new file mode 100644
index 000000000..31df1b948
--- /dev/null
+++ b/iqdbc_repo/LICENSE.md
@@ -0,0 +1,106 @@
+IQ.Lvbs License v0.1a
+
+Copyright (c) 2026 IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. All Rights Reserved.
+
+DEFINITIONS
+
+"Software" refers to IQ.Pilot, konn3kt, and all associated source code,
+documentation, and assets owned by the Copyright Holder.
+
+"Open Components" refers to portions of the Software explicitly marked as
+open source.
+
+"Proprietary Components" refers to all portions of the Software not made
+available to the public in source form.
+
+"Copyright Holder" refers to IQ.Lvbs LLC, a part of Project Teal Lvbs Inc.
+
+GRANT OF LICENSE
+
+Subject to the terms of this license, you are granted a limited,
+non-exclusive, revocable license to:
+
+1. View, study, and learn from the Open Components
+2. Modify the Open Components for personal, internal, or open-source public use
+3. Run the Software for personal, non-commercial purposes
+
+RESTRICTIONS
+
+You may NOT:
+
+1. Claim ownership of any part of the Software, excluding your own
+ modifications that do not incorporate Proprietary Components.
+
+2. Reverse engineer, decompile, disassemble, or in any way attempt to
+ circumvent the obfuscation of the Proprietary Components.
+
+3. Use the Software or any derivative for commercial purposes without
+ explicit written permission from the Copyright Holder.
+
+4. Remove or alter any copyright notices or this license.
+
+5. Sublicense, sell, or transfer rights to the Software.
+
+6. Use the Software and/or its source code to compete with or create a
+ substantially similar product.
+
+7. Use the Software in closed source software not licensed by IQ.Lvbs LLC.
+
+CONSEQUENCES OF VIOLATION
+
+In the event any Restriction is violated, any product created using inspiration from, or source code from, IQ.Pilot or Konn3kt shall be subject to a licensing fee determined solely by the Copyright Holder. Additionally, the violating party hereby grants IQ.Lvbs LLC an exclusive, irrevocable, worldwide, royalty-free license to use any and all assets from the infringing product on IQ.Lvbs webpages, advertising materials, and in any other manner IQ.Lvbs sees fit.
+
+OWNERSHIP
+
+All rights, title, and interest in the Software remain exclusively with the
+Copyright Holder. Any modifications, improvements, or derivative works you
+create based on the Software are owned by the Copyright Holder. By
+contributing modifications, you irrevocably assign all rights to the
+Copyright Holder.
+
+PROPRIETARY COMPONENTS
+
+The Proprietary Components are provided in binary or obfuscated form only.
+Reverse engineering, decompilation, or disassembly of Proprietary Components
+is strictly prohibited. Violation of this provision entitles IQ.Lvbs LLC to
+pursue all available legal remedies to protect its intellectual property and
+trade secrets.
+
+NO WARRANTY
+
+THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT
+HOLDER DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+NON-INFRINGEMENT.
+
+LIMITATION OF LIABILITY
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR
+OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE. THE USER ACCEPTS FULL
+RESPONSIBILITY FOR ANY AND ALL LIABILITIES WHEN USING IQ.LVBS SOFTWARE.
+
+TERMINATION
+
+This license terminates automatically if you violate any of its terms. Upon
+termination, you must destroy all copies of the Software in your possession.
+
+The Copyright Holder reserves the right to revoke this license at any time
+for any reason.
+
+GOVERNING LAW
+
+This license shall be governed by the laws of the State of Illinois, United
+States of America. Any disputes arising under this license shall be subject
+to the exclusive jurisdiction of the courts located in Henry County, Illinois.
+
+---
+
+For commercial licensing inquiries, contact: support@iqlvbs.com
+
+Copyright (c) 2020, Comma.ai, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/iqdbc_repo/conftest.py b/iqdbc_repo/conftest.py
new file mode 100644
index 000000000..cf76ee368
--- /dev/null
+++ b/iqdbc_repo/conftest.py
@@ -0,0 +1,97 @@
+# pytest attempts to execute shell scripts while collecting
+collect_ignore_glob = [
+ "iqdbc/safety/tests/misra/*.sh",
+ "iqdbc/safety/tests/misra/cppcheck/",
+]
+
+# --- host test harness -------------------------------------------------------
+# tesla/volkswagen carstate+carcontroller import the closed-source ALC / odometer
+# runtime via import_verified_module(), which gates on a rootfs integrity manifest
+# that only exists on-device. Off-device (host CI / dev), install minimal stubs so
+# the whole car interface set is importable and test_car_interfaces can collect and
+# run. On-device the manifest is present and these stubs are never installed, so the
+# real verified modules are used.
+import os as _os
+
+if not _os.path.exists("/usr/libexec/iqpilot/runtime_integrity.json"):
+ import sys as _sys
+ import types as _types
+
+ def _stub_module(name, attrs):
+ mod = _types.ModuleType(name)
+ for key, value in attrs.items():
+ setattr(mod, key, value)
+ _sys.modules[name] = mod
+
+ _noop = lambda *args, **kwargs: None # noqa: E731
+
+ class _VehicleOdometerStoreStub:
+ def __init__(self, *args, **kwargs):
+ pass
+
+ def record(self, km):
+ return km
+
+ _stub_module("iqpilot_private.konn3kt.iqlvbs.vehicle_state",
+ {"VehicleOdometerStore": _VehicleOdometerStoreStub})
+ _stub_module("iqpilot_private.konn3kt.iqlvbs.alc", {
+ "angle_lateral_control_enabled": lambda *a, **k: False,
+ "update_vw_alc": _noop,
+ "append_private_apd": _noop,
+ "update_mqb_carstate_alc_state": _noop,
+ "update_mlb_carstate_alc_state": _noop,
+ "update_pq_carstate_alc_state": _noop,
+ })
+ _stub_module("iqpilot_private.konn3kt.iqlvbs.iqlvbs_commander", {
+ "update_turn_signals": _noop,
+ })
+ _stub_module("iqpilot_private.konn3kt.hephaestus.vw_pq_flasher", {})
+
+ try:
+ from openpilot.system.proprietary_runtime import _verified_import as _vi
+ _real_import_verified_module = _vi.import_verified_module
+
+ def _import_verified_module(bundle, module):
+ return _sys.modules.get(module) or _real_import_verified_module(bundle, module)
+
+ _vi.import_verified_module = _import_verified_module
+ except Exception:
+ pass
+# --- end host test harness ---------------------------------------------------
+
+_ABSTRACT_BASES = frozenset(("CarSafetyTest", "AolSafetyTestBase", "SafetyTest", "SafetyTestBase"))
+
+def _method_from_base(cls, method_name):
+ for klass in cls.__mro__:
+ if method_name in klass.__dict__:
+ return klass.__name__ in _ABSTRACT_BASES
+ return True
+
+_NEEDS_LKAS = frozenset((
+ "test_enable_control_allowed_with_aol_button",
+ "test_enable_control_allowed_with_aol_button_and_disable_with_main_cruise",
+ "test_engage_with_brake_pressed_0_aol_button",
+))
+_NEEDS_ACC_STATE = frozenset((
+ "test_enable_control_allowed_with_manual_acc_main_on_state",
+ "test_enable_control_allowed_with_aol_button_and_disable_with_main_cruise",
+ "test_engage_with_brake_pressed_1_acc_main_on",
+))
+
+def pytest_collection_modifyitems(items):
+ keep = []
+ for item in items:
+ cls = item.cls
+ if cls is None:
+ keep.append(item)
+ continue
+ if cls.__name__.endswith("Base"):
+ continue
+ if "regen" in item.name and _method_from_base(cls, "_user_regen_msg"):
+ continue
+ if item.name in _NEEDS_LKAS and _method_from_base(cls, "_lkas_button_msg"):
+ continue
+ if item.name in _NEEDS_ACC_STATE and _method_from_base(cls, "_acc_state_msg"):
+ continue
+ keep.append(item)
+ items[:] = keep
diff --git a/iqdbc_repo/credits/CREDITS.MD b/iqdbc_repo/credits/CREDITS.MD
new file mode 100644
index 000000000..c2909f699
--- /dev/null
+++ b/iqdbc_repo/credits/CREDITS.MD
@@ -0,0 +1,55 @@
+## IQ.Pilot Car-Port Credits
+
+This file is intended to track per-platform and per-tuning attribution inside the car-port-side included inside of IQ.Pilot.
+
+It does not replace the repository-wide license files for IQ.Pilot itself or any other components not listed here.
+
+## Credits:
+
+### Hyundai / Kia / Genesis (HKG) - carrotpilot
+
+#### Contributors
+
+Full credit for the Hyundai / Kia / Genesis port and its HKG-specific tuning belongs to:
+
+- carrotpilot
+- ajouatom
+
+#### Attribution
+
+This repository carries the carrotpilot HKG implementation from `ajouatom/openpilot`, imported from commit `b54d44efd514bc61f86f08b01c23a6c190885c07`. IQ.Lvbs claims no copyright, credit, or authorship over that implementation.
+
+#### Upstream License Notice
+
+The HKG work attributed above is acknowledged here under LICENSE notice:
+
+```text
+Copyright (c) 2018, Comma.ai, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+```
+
+#### Scope
+
+This licensing is limited to the Hyundai/Kia/Genesis car, DBC, and safety implementations and the supporting schema and compatibility changes required by that port.
+
+### Honda
+
+#### Contributors
+
+Full credit for the Honda-specific tuning lineage carried in this tree belongs to:
+
+- MVL-Boston on GitHub
+- mvl3c on Discord
+
+#### Attribution
+
+This repository carries Honda tuning work derived from MVL's tuning effort's, that originated from, and/or is verbatim their work, and are accredited as such, IQ.Lvbs claims no copyright, credit, or authorship of the components listed below.
+
+#### Scope
+
+This licensing is limited to `iqdbc_repo/iqdbc/car/honda` and `iqdbc_repo/iqdbc/iqpilot/car/honda`.
diff --git a/iqdbc_repo/iqdbc/__init__.py b/iqdbc_repo/iqdbc/__init__.py
new file mode 100644
index 000000000..fcee77210
--- /dev/null
+++ b/iqdbc_repo/iqdbc/__init__.py
@@ -0,0 +1,6 @@
+import os
+
+DBC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dbc')
+
+# -I include path for e.g. "#include "
+INCLUDE_PATH = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
diff --git a/iqdbc_repo/iqdbc/can/__init__.py b/iqdbc_repo/iqdbc/can/__init__.py
new file mode 100644
index 000000000..f4f57ddd2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/__init__.py
@@ -0,0 +1,8 @@
+from iqdbc.can.packer import CANPacker
+from iqdbc.can.parser import CANParser, CANDefine
+
+__all__ = [
+ "CANDefine",
+ "CANParser",
+ "CANPacker",
+]
diff --git a/iqdbc_repo/iqdbc/can/dbc.py b/iqdbc_repo/iqdbc/can/dbc.py
new file mode 100644
index 000000000..524207633
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/dbc.py
@@ -0,0 +1,217 @@
+import re
+import os
+from collections.abc import Callable
+from dataclasses import dataclass
+from functools import cache
+
+from iqdbc import DBC_PATH
+
+# TODO: these should just be passed in along with the DBC file
+from iqdbc.car.honda.hondacan import honda_checksum
+from iqdbc.car.toyota.toyotacan import toyota_checksum
+from iqdbc.car.subaru.subarucan import subaru_checksum
+from iqdbc.car.chrysler.chryslercan import chrysler_checksum, fca_giorgio_checksum
+from iqdbc.car.hyundai.hyundaicanfd import hkg_can_fd_checksum
+from iqdbc.car.volkswagen.mlbcan import volkswagen_mlb_checksum
+from iqdbc.car.volkswagen.mqbcan import volkswagen_mqb_meb_checksum, volkswagen_mqb_meb_gen2_checksum, xor_checksum
+from iqdbc.car.tesla.teslacan import tesla_checksum
+from iqdbc.car.body.bodycan import body_checksum
+from iqdbc.car.psa.psacan import psa_checksum
+
+
+class SignalType:
+ DEFAULT = 0
+ COUNTER = 1
+ HONDA_CHECKSUM = 2
+ TOYOTA_CHECKSUM = 3
+ BODY_CHECKSUM = 4
+ VOLKSWAGEN_MQB_MEB_CHECKSUM = 5
+ XOR_CHECKSUM = 6
+ SUBARU_CHECKSUM = 7
+ CHRYSLER_CHECKSUM = 8
+ HKG_CAN_FD_CHECKSUM = 9
+ FCA_GIORGIO_CHECKSUM = 10
+ TESLA_CHECKSUM = 11
+ PSA_CHECKSUM = 12
+ VOLKSWAGEN_MLB_CHECKSUM = 13
+ VOLKSWAGEN_MQB_MEB_GEN2_CHECKSUM = 14
+
+
+@dataclass
+class Signal:
+ name: str
+ start_bit: int
+ msb: int
+ lsb: int
+ size: int
+ is_signed: bool
+ factor: float
+ offset: float
+ is_little_endian: bool
+ type: int = SignalType.DEFAULT
+ calc_checksum: 'Callable[[int, Signal, bytearray], int] | None' = None
+
+
+@dataclass
+class Msg:
+ name: str
+ address: int
+ size: int
+ sigs: dict[str, Signal]
+
+
+@dataclass
+class Val:
+ name: str
+ address: int
+ def_val: str
+ sigs: dict[str, Signal] | None = None
+
+
+BO_RE = re.compile(r"^BO_ (\w+) (\w+) *: (\w+) (\w+)")
+SG_RE = re.compile(r"^SG_ (\w+) : (\d+)\|(\d+)@(\d)([+-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[[0-9.+\-eE]+\|[0-9.+\-eE]+\] \".*\" .*")
+SGM_RE = re.compile(r"^SG_ (\w+) (\w+) *: (\d+)\|(\d+)@(\d)([+-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[[0-9.+\-eE]+\|[0-9.+\-eE]+\] \".*\" .*")
+VAL_RE = re.compile(r"^VAL_ (\w+) (\w+) (.*);")
+VAL_SPLIT_RE = re.compile(r'["]+')
+
+
+@cache
+class DBC:
+ def __init__(self, name: str):
+ dbc_path = name
+ if not os.path.exists(dbc_path):
+ dbc_path = os.path.join(DBC_PATH, name + ".dbc")
+
+ self._parse(dbc_path)
+
+ def _parse(self, path: str):
+ self.name = os.path.basename(path).replace(".dbc", "")
+ with open(path) as f:
+ lines = f.readlines()
+
+ checksum_state = get_checksum_state(self.name)
+ be_bits = [j + i * 8 for i in range(64) for j in range(7, -1, -1)]
+ self.msgs: dict[int, Msg] = {}
+ self.addr_to_msg: dict[int, Msg] = {}
+ self.name_to_msg: dict[str, Msg] = {}
+ self.vals: list[Val] = []
+ address = 0
+ signals_temp: dict[int, dict[str, Signal]] = {}
+ for line_num, line in enumerate(lines, 1):
+ line = line.strip()
+ if line.startswith("BO_ "):
+ m = BO_RE.match(line)
+ if not m:
+ continue
+ address = int(m.group(1), 0)
+ msg_name = m.group(2)
+ size = int(m.group(3), 0)
+ sigs = {}
+ self.msgs[address] = Msg(msg_name, address, size, sigs)
+ self.addr_to_msg[address] = self.msgs[address]
+ self.name_to_msg[msg_name] = self.msgs[address]
+ signals_temp[address] = sigs
+ elif line.startswith("SG_ "):
+ m = SG_RE.search(line)
+ offset = 0
+ if not m:
+ m = SGM_RE.search(line)
+ if not m:
+ continue
+ offset = 1
+ sig_name = m.group(1)
+ start_bit = int(m.group(2 + offset))
+ size = int(m.group(3 + offset))
+ is_little_endian = m.group(4 + offset) == "1"
+ is_signed = m.group(5 + offset) == "-"
+ factor = float(m.group(6 + offset))
+ offset_val = float(m.group(7 + offset))
+
+ if is_little_endian:
+ lsb = start_bit
+ msb = start_bit + size - 1
+ else:
+ idx = be_bits.index(start_bit)
+ lsb = be_bits[idx + size - 1]
+ msb = start_bit
+
+ sig = Signal(sig_name, start_bit, msb, lsb, size, is_signed, factor, offset_val, is_little_endian)
+ set_signal_type(sig, checksum_state, self.name, line_num)
+ signals_temp[address][sig_name] = sig
+ elif line.startswith("VAL_ "):
+ m = VAL_RE.search(line)
+ if not m:
+ continue
+ val_addr = int(m.group(1), 0)
+ sgname = m.group(2)
+ defs = m.group(3)
+ words = [w.strip() for w in VAL_SPLIT_RE.split(defs) if w.strip()]
+ words = [w.upper().replace(" ", "_") for w in words]
+ val_def = " ".join(words).strip()
+ self.vals.append(Val(sgname, val_addr, val_def))
+ for addr, sigs in signals_temp.items():
+ self.msgs[addr].sigs = sigs
+
+
+# ***** checksum functions *****
+
+def tesla_setup_signal(sig: Signal, dbc_name: str, line_num: int) -> None:
+ if sig.name.endswith("Counter"):
+ sig.type = SignalType.COUNTER
+ elif sig.name.endswith("Checksum"):
+ sig.type = SignalType.TESLA_CHECKSUM
+ sig.calc_checksum = tesla_checksum
+
+
+@dataclass
+class ChecksumState:
+ checksum_size: int
+ counter_size: int
+ checksum_start_bit: int
+ counter_start_bit: int
+ little_endian: bool
+ checksum_type: int
+ calc_checksum: Callable[[int, Signal, bytearray], int] | None
+ setup_signal: Callable[[Signal, str, int], None] | None = None
+
+
+def get_checksum_state(dbc_name: str) -> ChecksumState | None:
+ if dbc_name.startswith(("honda_", "acura_")):
+ return ChecksumState(4, 2, 3, 5, False, SignalType.HONDA_CHECKSUM, honda_checksum)
+ elif dbc_name.startswith(("toyota_", "lexus_")):
+ return ChecksumState(8, -1, 7, -1, False, SignalType.TOYOTA_CHECKSUM, toyota_checksum)
+ elif dbc_name.startswith("hyundai_canfd_generated"):
+ return ChecksumState(16, -1, 0, -1, True, SignalType.HKG_CAN_FD_CHECKSUM, hkg_can_fd_checksum)
+ elif dbc_name.startswith("vw_meb_2024"):
+ return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_GEN2_CHECKSUM, volkswagen_mqb_meb_gen2_checksum)
+ elif dbc_name.startswith(("vw_mqb", "vw_mqbevo", "vw_meb")):
+ return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_CHECKSUM, volkswagen_mqb_meb_checksum)
+ elif dbc_name.startswith("vw_mlb"):
+ return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MLB_CHECKSUM, volkswagen_mlb_checksum)
+ elif dbc_name.startswith("vw_pq"):
+ return ChecksumState(8, 4, 0, -1, True, SignalType.XOR_CHECKSUM, xor_checksum)
+ elif dbc_name.startswith("subaru_global_"):
+ return ChecksumState(8, -1, 0, -1, True, SignalType.SUBARU_CHECKSUM, subaru_checksum)
+ elif dbc_name.startswith("chrysler_"):
+ return ChecksumState(8, -1, 7, -1, False, SignalType.CHRYSLER_CHECKSUM, chrysler_checksum)
+ elif dbc_name.startswith("fca_giorgio"):
+ return ChecksumState(8, -1, 7, -1, False, SignalType.FCA_GIORGIO_CHECKSUM, fca_giorgio_checksum)
+ elif dbc_name.startswith("comma_body"):
+ return ChecksumState(8, 4, 7, 3, False, SignalType.BODY_CHECKSUM, body_checksum)
+ elif dbc_name.startswith(("tesla_model3_party", "tesla_model3_vehicle")):
+ return ChecksumState(8, -1, 0, -1, True, SignalType.TESLA_CHECKSUM, tesla_checksum, tesla_setup_signal)
+ elif dbc_name.startswith("psa_"):
+ return ChecksumState(4, 4, 7, 3, False, SignalType.PSA_CHECKSUM, psa_checksum)
+ return None
+
+
+def set_signal_type(sig: Signal, chk: ChecksumState | None, dbc_name: str, line_num: int) -> None:
+ sig.calc_checksum = None
+ if chk:
+ if chk.setup_signal:
+ chk.setup_signal(sig, dbc_name, line_num)
+ if sig.name == "CHECKSUM":
+ sig.type = chk.checksum_type
+ sig.calc_checksum = chk.calc_checksum
+ elif sig.name == "COUNTER":
+ sig.type = SignalType.COUNTER
diff --git a/iqdbc_repo/iqdbc/can/packer.py b/iqdbc_repo/iqdbc/can/packer.py
new file mode 100644
index 000000000..8b716b601
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/packer.py
@@ -0,0 +1,71 @@
+import math
+
+from iqdbc.car.carlog import carlog
+from iqdbc.can.dbc import DBC, Signal, SignalType
+
+
+class CANPacker:
+ def __init__(self, dbc_name: str):
+ self.dbc = DBC(dbc_name)
+ self.counters: dict[int, int] = {}
+
+ def pack(self, address: int, values: dict[str, float]) -> bytearray:
+ msg = self.dbc.addr_to_msg.get(address)
+ if msg is None:
+ carlog.error(f"msg not found for {address=}")
+ return bytearray()
+ dat = bytearray(msg.size)
+ counter_set = False
+ for name, value in values.items():
+ sig = msg.sigs.get(name)
+ if sig is None:
+ carlog.error(f"unknown signal {name=} in {msg.name}")
+ continue
+ ival = int(math.floor((value - sig.offset) / sig.factor + 0.5))
+ if ival < 0:
+ ival = (1 << sig.size) + ival
+ set_value(dat, sig, ival)
+ if sig.type == SignalType.COUNTER or sig.name == "COUNTER":
+ self.counters[address] = int(value)
+ counter_set = True
+ sig_counter = next((s for s in msg.sigs.values() if s.type == SignalType.COUNTER or s.name == "COUNTER"), None)
+ if sig_counter and not counter_set:
+ if address not in self.counters:
+ self.counters[address] = 0
+ set_value(dat, sig_counter, self.counters[address])
+ self.counters[address] = (self.counters[address] + 1) % (1 << sig_counter.size)
+ sig_checksum = next((s for s in msg.sigs.values() if s.type > SignalType.COUNTER), None)
+ if sig_checksum and sig_checksum.calc_checksum:
+ checksum = sig_checksum.calc_checksum(address, sig_checksum, dat)
+ set_value(dat, sig_checksum, checksum)
+ return dat
+
+ def make_can_msg(self, name_or_addr, bus: int, values: dict[str, float]):
+ if isinstance(name_or_addr, int):
+ addr = name_or_addr
+ else:
+ msg = self.dbc.name_to_msg.get(name_or_addr)
+ if msg is None:
+ carlog.error(f"msg not found for {name_or_addr=}")
+ return 0, b'', bus
+ addr = msg.address
+ dat = self.pack(addr, values)
+ if len(dat) == 0:
+ return 0, b'', bus
+ return addr, bytes(dat), bus
+
+
+def set_value(msg: bytearray, sig: Signal, ival: int) -> None:
+ i = sig.lsb // 8
+ bits = sig.size
+ if sig.size < 64:
+ ival &= (1 << sig.size) - 1
+ while 0 <= i < len(msg) and bits > 0:
+ shift = sig.lsb % 8 if (sig.lsb // 8) == i else 0
+ size = min(bits, 8 - shift)
+ mask = ((1 << size) - 1) << shift
+ msg[i] &= ~mask
+ msg[i] |= (ival & ((1 << size) - 1)) << shift
+ bits -= size
+ ival >>= size
+ i = i + 1 if sig.is_little_endian else i - 1
diff --git a/iqdbc_repo/iqdbc/can/parser.py b/iqdbc_repo/iqdbc/can/parser.py
new file mode 100644
index 000000000..ab21ce84c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/parser.py
@@ -0,0 +1,280 @@
+import math
+import numbers
+import time
+from collections import defaultdict, deque
+from dataclasses import dataclass, field
+
+from iqdbc.car.carlog import carlog
+from iqdbc.can.dbc import DBC, Signal
+
+
+MAX_BAD_COUNTER = 5
+CAN_INVALID_CNT = 5
+
+
+def get_raw_value(dat: bytes | bytearray, sig: Signal) -> int:
+ ret = 0
+ i = sig.msb // 8
+ bits = sig.size
+ while 0 <= i < len(dat) and bits > 0:
+ lsb = sig.lsb if (sig.lsb // 8) == i else i * 8
+ msb = sig.msb if (sig.msb // 8) == i else (i + 1) * 8 - 1
+ size = msb - lsb + 1
+ d = (dat[i] >> (lsb - (i * 8))) & ((1 << size) - 1)
+ ret |= d << (bits - size)
+ bits -= size
+ i = i - 1 if sig.is_little_endian else i + 1
+ return ret
+
+
+@dataclass
+class MessageState:
+ address: int
+ name: str
+ size: int
+ signals: list[Signal]
+ ignore_alive: bool = False
+ ignore_checksum: bool = False
+ ignore_counter: bool = False
+ frequency: float = 0.0
+ timeout_threshold: float = 1e5 # default to 1Hz threshold
+ vals: list[float] = field(default_factory=list)
+ all_vals: list[list[float]] = field(default_factory=list)
+ timestamps: deque[int] = field(default_factory=lambda: deque(maxlen=500))
+ counter: int = 0
+ counter_fail: int = 0
+ first_seen_nanos: int = 0
+ last_warning_log_nanos: int = 0
+
+ def rate_limited_log(self, last_update_nanos: int, msg: str) -> None:
+ if (last_update_nanos - self.last_warning_log_nanos) >= 1_000_000_000:
+ carlog.warning(f"CANParser: {hex(self.address)} {self.name} {msg}")
+ self.last_warning_log_nanos = last_update_nanos
+
+ def parse(self, nanos: int, dat: bytes) -> bool:
+ tmp_vals: list[float] = [0.0] * len(self.signals)
+ checksum_failed = False
+ counter_failed = False
+
+ if self.first_seen_nanos == 0:
+ self.first_seen_nanos = nanos
+
+ for i, sig in enumerate(self.signals):
+ tmp = get_raw_value(dat, sig)
+ if sig.is_signed:
+ tmp -= ((tmp >> (sig.size - 1)) & 0x1) * (1 << sig.size)
+
+ if not self.ignore_checksum and sig.calc_checksum is not None:
+ expected_checksum = sig.calc_checksum(self.address, sig, bytearray(dat))
+ if tmp != expected_checksum:
+ checksum_failed = True
+ self.rate_limited_log(nanos, f"checksum failed: received {hex(tmp)}, calculated {hex(expected_checksum)}")
+
+ if not self.ignore_counter and sig.type == 1: # COUNTER
+ if not self.update_counter(tmp, sig.size):
+ counter_failed = True
+
+ tmp_vals[i] = tmp * sig.factor + sig.offset
+
+ # must have good counter and checksum to update data
+ if checksum_failed or counter_failed:
+ return False
+
+ if not self.vals:
+ self.vals = [0.0] * len(self.signals)
+ self.all_vals = [[] for _ in self.signals]
+
+ for i, v in enumerate(tmp_vals):
+ self.vals[i] = v
+ self.all_vals[i].append(v)
+
+ self.timestamps.append(nanos)
+
+ if self.frequency < 1e-5 and len(self.timestamps) >= 3:
+ dt = (self.timestamps[-1] - self.timestamps[0]) * 1e-9
+ if (dt > 1.0 or (self.timestamps.maxlen is not None and len(self.timestamps) >= self.timestamps.maxlen)) and dt != 0:
+ self.frequency = min(len(self.timestamps) / dt, 100.0)
+ self.timeout_threshold = (1_000_000_000 / self.frequency) * 10
+ return True
+
+ def update_counter(self, cur_count: int, cnt_size: int) -> bool:
+ if ((self.counter + 1) & ((1 << cnt_size) - 1)) != cur_count:
+ self.counter_fail = min(self.counter_fail + 1, MAX_BAD_COUNTER)
+ elif self.counter_fail > 0:
+ self.counter_fail -= 1
+ self.counter = cur_count
+ return self.counter_fail < MAX_BAD_COUNTER
+
+ def valid(self, current_nanos: int, bus_timeout: bool) -> bool:
+ if self.ignore_alive:
+ return True
+ if not self.timestamps:
+ return False
+ if (current_nanos - self.timestamps[-1]) > self.timeout_threshold:
+ return False
+ return True
+
+
+class VLDict(dict):
+ def __init__(self, parser):
+ super().__init__()
+ self.parser = parser
+
+ def __getitem__(self, key):
+ if key not in self:
+ self.parser._add_message(key)
+ return super().__getitem__(key)
+
+
+class CANParser:
+ def __init__(self, dbc_name: str, messages: list[tuple[str | int, int]], bus: int):
+ self.dbc_name: str = dbc_name
+ self.bus: int = bus
+ self.dbc: DBC = DBC(dbc_name)
+
+ self.vl: dict[int | str, dict[str, float]] = VLDict(self)
+ self.vl_all: dict[int | str, dict[str, list[float]]] = {}
+ self.ts_nanos: dict[int | str, dict[str, int]] = {}
+ self.dat: dict[int | str, bytes] = {}
+ self.addresses: set[int] = set()
+ self.message_states: dict[int, MessageState] = {}
+
+ for name_or_addr, freq in messages:
+ if isinstance(name_or_addr, numbers.Number):
+ msg = self.dbc.addr_to_msg.get(int(name_or_addr))
+ else:
+ msg = self.dbc.name_to_msg.get(name_or_addr)
+ if msg is None:
+ raise RuntimeError(f"could not find message {name_or_addr!r} in DBC {dbc_name}")
+ if msg.address in self.addresses:
+ raise RuntimeError("Duplicate Message Check: %d" % msg.address)
+
+ self._add_message(name_or_addr, freq)
+
+ self.can_invalid_cnt: int = CAN_INVALID_CNT
+ self.last_nonempty_nanos: int = 0
+ self._last_update_nanos: int = 0
+
+ def _add_message(self, name_or_addr: str | int, freq: int | None = None, ignore_counter: bool = False) -> None:
+ if isinstance(name_or_addr, numbers.Number):
+ msg = self.dbc.addr_to_msg.get(int(name_or_addr))
+ else:
+ msg = self.dbc.name_to_msg.get(name_or_addr)
+ assert msg is not None
+ assert msg.address not in self.addresses
+
+ self.addresses.add(msg.address)
+ signal_names = list(msg.sigs.keys())
+ signals_dict = {s: 0.0 for s in signal_names}
+ dict.__setitem__(self.vl, msg.address, signals_dict)
+ dict.__setitem__(self.vl, msg.name, signals_dict)
+ self.vl_all[msg.address] = defaultdict(list)
+ self.vl_all[msg.name] = self.vl_all[msg.address]
+ self.ts_nanos[msg.address] = {s: 0 for s in signal_names}
+ self.ts_nanos[msg.name] = self.ts_nanos[msg.address]
+ state = MessageState(
+ address=msg.address,
+ name=msg.name,
+ size=msg.size,
+ signals=list(msg.sigs.values()),
+ ignore_alive=freq is not None and math.isnan(freq),
+ ignore_counter=ignore_counter,
+ )
+ state.first_seen_nanos = time.monotonic_ns()
+ if freq is not None and freq > 0:
+ state.frequency = freq
+ else:
+ # if frequency not specified, assume 1Hz until we learn it
+ freq = 1
+ state.timeout_threshold = (1_000_000_000 / freq) * 10
+
+ self.message_states[msg.address] = state
+
+ @property
+ def bus_timeout(self) -> bool:
+ ignore_alive = all(s.ignore_alive for s in self.message_states.values())
+ bus_timeout_threshold = 500 * 1_000_000
+ for st in self.message_states.values():
+ if st.timeout_threshold > 0:
+ bus_timeout_threshold = min(bus_timeout_threshold, st.timeout_threshold)
+ return ((self._last_update_nanos - self.last_nonempty_nanos) > bus_timeout_threshold) and not ignore_alive
+
+ @property
+ def can_valid(self) -> bool:
+ valid = True
+ counters_valid = True
+ bus_timeout = self.bus_timeout
+ for state in self.message_states.values():
+ if state.counter_fail >= MAX_BAD_COUNTER:
+ counters_valid = False
+ state.rate_limited_log(self._last_update_nanos, f"counter invalid, {state.counter_fail=} {MAX_BAD_COUNTER=}")
+ if not state.valid(self._last_update_nanos, bus_timeout):
+ valid = False
+ state.rate_limited_log(self._last_update_nanos, "not valid (timeout or missing)")
+
+ # TODO: probably only want to increment this once per update() call
+ self.can_invalid_cnt = 0 if valid else min(self.can_invalid_cnt + 1, CAN_INVALID_CNT)
+ return self.can_invalid_cnt < CAN_INVALID_CNT and counters_valid
+
+ def update(self, strings, sendcan: bool = False):
+ if strings and not isinstance(strings[0], list | tuple):
+ strings = [strings]
+
+ for addr in self.addresses:
+ for k in self.vl_all[addr]:
+ self.vl_all[addr][k].clear()
+
+ updated_addrs: set[int] = set()
+ for entry in strings:
+ t = entry[0]
+ frames = entry[1]
+ bus_empty = True
+ for address, dat, src in frames:
+ if src != self.bus:
+ continue
+ bus_empty = False
+ state = self.message_states.get(address)
+ if state is None or len(dat) > 64:
+ continue
+ if state.parse(t, dat):
+ updated_addrs.add(address)
+
+ vl_addr = self.vl[address]
+ vl_all_addr = self.vl_all[address]
+ ts_addr = self.ts_nanos[address]
+ raw_dat = bytes(dat)
+ self.dat[address] = raw_dat
+ self.dat[state.name] = raw_dat
+
+ for i, sig in enumerate(state.signals):
+ vl_addr[sig.name] = state.vals[i]
+ vl_all_addr[sig.name] = state.all_vals[i]
+ ts_addr[sig.name] = state.timestamps[-1]
+
+ if not bus_empty:
+ self.last_nonempty_nanos = t
+
+ self._last_update_nanos = t
+
+ return updated_addrs
+
+
+class CANDefine:
+ def __init__(self, dbc_name: str):
+ dbc = DBC(dbc_name)
+
+ dv = defaultdict(dict)
+ for val in dbc.vals:
+ sgname = val.name
+ address = val.address
+ msg = dbc.addr_to_msg.get(address)
+ if msg is None:
+ raise KeyError(address)
+ msgname = msg.name
+ parts = val.def_val.split()
+ values = [int(v) for v in parts[::2]]
+ defs = parts[1::2]
+ dv[address][sgname] = dict(zip(values, defs, strict=True))
+ dv[msgname][sgname] = dv[address][sgname]
+
+ self.dv = dict(dv)
diff --git a/iqdbc_repo/iqdbc/can/tests/.gitignore b/iqdbc_repo/iqdbc/can/tests/.gitignore
new file mode 100644
index 000000000..192fb0945
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/.gitignore
@@ -0,0 +1 @@
+*.bz2
diff --git a/iqdbc_repo/iqdbc/can/tests/__init__.py b/iqdbc_repo/iqdbc/can/tests/__init__.py
new file mode 100644
index 000000000..e1a91cab0
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/__init__.py
@@ -0,0 +1,8 @@
+import glob
+import os
+
+from iqdbc import DBC_PATH
+
+ALL_DBCS = [os.path.basename(dbc).split('.')[0] for dbc in
+ glob.glob(f"{DBC_PATH}/*.dbc")]
+TEST_DBC = os.path.abspath(os.path.join(os.path.dirname(__file__), "test.dbc"))
diff --git a/iqdbc_repo/iqdbc/can/tests/benchmark.py b/iqdbc_repo/iqdbc/can/tests/benchmark.py
new file mode 100755
index 000000000..8497421b1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/benchmark.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+import time
+from iqdbc.can import CANPacker, CANParser
+
+
+def _benchmark(checks, n):
+ parser = CANParser('toyota_new_mc_pt_generated', checks, 0)
+ packer = CANPacker('toyota_new_mc_pt_generated')
+
+ t1 = time.process_time_ns()
+ can_msgs = []
+ for i in range(10000):
+ values = {"ACC_CONTROL": {"ACC_TYPE": 1, "ALLOW_LONG_PRESS": 3}}
+ msgs = [packer.make_can_msg(k, 0, v) for k, v in values.items()]
+ can_msgs.append([int(0.01 * i * 1e9), msgs])
+ t2 = time.process_time_ns()
+ pack_dt = t2 - t1
+
+ ets = []
+ for _ in range(25):
+ if n > 1:
+ strings = []
+ for i in range(0, len(can_msgs), n):
+ strings.append(can_msgs[i:i + n])
+ t1 = time.process_time_ns()
+ for m in strings:
+ parser.update(m)
+ t2 = time.process_time_ns()
+ else:
+ t1 = time.process_time_ns()
+ for m in can_msgs:
+ parser.update([m])
+ t2 = time.process_time_ns()
+
+ ets.append(t2 - t1)
+
+ et = sum(ets) / len(ets)
+ avg_nanos = et / len(can_msgs)
+ print('[%d] %.1fms to pack, %.1fms to parse %s messages, avg: %dns' % (n, pack_dt/1e6, et/1e6, len(can_msgs), avg_nanos))
+
+
+if __name__ == "__main__":
+ # python -m cProfile -s cumulative benchmark.py
+ _benchmark([('ACC_CONTROL', 10)], 1)
+ _benchmark([('ACC_CONTROL', 10)], 5)
+ _benchmark([('ACC_CONTROL', 10)], 10)
diff --git a/iqdbc_repo/iqdbc/can/tests/test.dbc b/iqdbc_repo/iqdbc/can/tests/test.dbc
new file mode 100644
index 000000000..05104fb06
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/test.dbc
@@ -0,0 +1,27 @@
+CM_ "This DBC is used for the CAN parser and packer tests.";
+
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 316 Brake_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX
+ SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX
+ SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 245 CAN_FD_MESSAGE: 32 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|1] "" XXX
+ SG_ SIGNED : 22|16@0- (1,0) [0|1] "" XXX
+ SG_ 64_BIT_LE : 159|64@1+ (1,0) [0|1] "" XXX
+ SG_ 64_BIT_BE : 80|64@0+ (1,0) [0|1] "" XXX
+
+VAL_ 80 NON_EXISTENT_ADDR 0 "test";
diff --git a/iqdbc_repo/iqdbc/can/tests/test_checksums.py b/iqdbc_repo/iqdbc/can/tests/test_checksums.py
new file mode 100644
index 000000000..7c3e35405
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/test_checksums.py
@@ -0,0 +1,556 @@
+import copy
+from iqdbc.can import CANPacker, CANParser
+
+
+class TestCanChecksums:
+
+ def verify_checksum(self, subtests, dbc_file: str, msg_name: str, msg_addr: int, test_messages: list[bytes],
+ checksum_field: str = 'CHECKSUM', counter_field = 'COUNTER'):
+ """
+ Verify that iqdbc calculates payload CRCs/checksums matching those received in known-good sample messages
+ Depends on all non-zero bits in the sample message having a corresponding DBC signal, add UNKNOWN signals if needed
+ """
+ parser = CANParser(dbc_file, [(msg_name, 0)], 0)
+ packer = CANPacker(dbc_file)
+
+ for data in test_messages:
+ expected_msg = (msg_addr, data, 0)
+ parser.update([0, [expected_msg]])
+ expected = copy.deepcopy(parser.vl[msg_name])
+
+ modified = copy.deepcopy(expected)
+ modified.pop(checksum_field, None)
+ modified_msg = packer.make_can_msg(msg_name, 0, modified)
+
+ parser.update([0, [modified_msg]])
+ tested = parser.vl[msg_name]
+ with subtests.test(counter=expected[counter_field]):
+ assert tested[checksum_field] == expected[checksum_field]
+
+ def verify_fca_giorgio_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes]):
+ """Test modified SAE J1850 CRCs, with special final XOR cases for EPS messages"""
+ assert len(test_messages) == 3
+ self.verify_checksum(subtests, "fca_giorgio", msg_name, msg_addr, test_messages)
+
+ def test_fca_giorgio_eps_1(self, subtests):
+ self.verify_fca_giorgio_crc(subtests, "EPS_1", 0xDE, [
+ b'\x17\x51\x97\xcc\x00\xdf',
+ b'\x17\x51\x97\xc9\x01\xa3',
+ b'\x17\x51\x97\xcc\x02\xe5',
+ ])
+
+ def test_fca_giorgio_eps_2(self, subtests):
+ self.verify_fca_giorgio_crc(subtests, "EPS_2", 0x106, [
+ b'\x7c\x43\x57\x60\x00\x00\xa1',
+ b'\x7c\x63\x58\xe0\x00\x01\xd5',
+ b'\x7c\x63\x58\xe0\x00\x02\xf2',
+ ])
+
+ def test_fca_giorgio_eps_3(self, subtests):
+ self.verify_fca_giorgio_crc(subtests, "EPS_3", 0x122, [
+ b'\x7b\x30\x00\xf8',
+ b'\x7b\x10\x01\x90',
+ b'\x7b\xf0\x02\x6e',
+ ])
+
+ def test_fca_giorgio_abs_2(self, subtests):
+ self.verify_fca_giorgio_crc(subtests, "ABS_2", 0xFE, [
+ b'\x7e\x38\x00\x7d\x10\x31\x80\x32',
+ b'\x7e\x38\x00\x7d\x10\x31\x81\x2f',
+ b'\x7e\x38\x00\x7d\x20\x31\x82\x20',
+ ])
+
+ def test_honda_checksum(self):
+ """Test checksums for Honda standard and extended CAN ids"""
+ # TODO: refactor to use self.verify_checksum()
+ dbc_file = "honda_civic_hatchback_ex_2017_can_generated"
+ msgs = [("LKAS_HUD", 0), ("LKAS_HUD_A", 0)]
+ parser = CANParser(dbc_file, msgs, 0)
+ packer = CANPacker(dbc_file)
+
+ values = {
+ 'LKAS_READY': 1,
+ 'LKAS_STATE_CHANGE': 1,
+ 'STEERING_REQUIRED': 1,
+ 'SOLID_LANES': 1,
+ 'BEEP': 0,
+ }
+
+ # known correct checksums according to the above values
+ checksum_std = [11, 10, 9, 8]
+ checksum_ext = [4, 3, 2, 1]
+
+ for std, ext in zip(checksum_std, checksum_ext, strict=True):
+ msgs = [
+ packer.make_can_msg("LKAS_HUD", 0, values),
+ packer.make_can_msg("LKAS_HUD_A", 0, values),
+ ]
+ parser.update([0, msgs])
+
+ assert parser.vl['LKAS_HUD']['CHECKSUM'] == std
+ assert parser.vl['LKAS_HUD_A']['CHECKSUM'] == ext
+
+ def verify_volkswagen_mqb_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes], counter_field: str = 'COUNTER'):
+ """Test AUTOSAR E2E Profile 2 CRCs"""
+ assert len(test_messages) == 16 # All counter values must be tested
+ self.verify_checksum(subtests, "vw_mqb", msg_name, msg_addr, test_messages, counter_field=counter_field)
+
+ def test_volkswagen_mqb_crc_lwi_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "LWI_01", 0x86, [
+ b'\x6b\x00\xbd\x00\x00\x00\x00\x00',
+ b'\xee\x01\x0a\x00\x00\x00\x00\x00',
+ b'\xd8\x02\xa9\x00\x00\x00\x00\x00',
+ b'\x03\x03\xbe\xa2\x12\x00\x00\x00',
+ b'\x7b\x04\x31\x20\x03\x00\x00\x00',
+ b'\x8b\x05\xe2\x85\x09\x00\x00\x00',
+ b'\x63\x06\x13\x21\x00\x00\x00\x00',
+ b'\x66\x07\x05\x00\x00\x00\x00\x00',
+ b'\x49\x08\x0d\x00\x00\x00\x00\x00',
+ b'\x5f\x09\x7e\x60\x01\x00\x00\x00',
+ b'\xaf\x0a\x72\x20\x00\x00\x00\x00',
+ b'\x59\x0b\x1b\x00\x00\x00\x00\x00',
+ b'\xa8\x0c\x06\x00\x00\x00\x00\x00',
+ b'\xbc\x0d\x72\x20\x00\x00\x00\x00',
+ b'\xf9\x0e\x0f\x00\x00\x00\x00\x00',
+ b'\x60\x0f\x62\xc0\x00\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_airbag_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "Airbag_01", 0x40, [
+ b'\xaf\x00\x00\x80\xc0\x00\x20\x3e',
+ b'\x54\x01\x00\x80\xc0\x00\x20\x1a',
+ b'\x54\x02\x00\x80\xc0\x00\x60\x00',
+ b'\x31\x03\x00\x80\xc0\x00\x60\xf2',
+ b'\xe0\x04\x00\x80\xc0\x00\x60\xcc',
+ b'\xb3\x05\x00\x80\xc0\x00\x40\xde',
+ b'\xa4\x06\x00\x80\xc0\x00\x40\x18',
+ b'\x94\x07\x00\x80\xc0\x00\x20\x38',
+ b'\x2d\x08\x00\x80\xc0\x00\x60\xae',
+ b'\xc2\x09\x00\x80\xc0\x00\x00\x1c',
+ b'\x1f\x0a\x00\x80\xc0\x00\x60\x2c',
+ b'\x7f\x0b\x00\x80\xc0\x00\x00\x00',
+ b'\x03\x0c\x00\x80\xc0\x00\x40\xd6',
+ b'\x56\x0d\x00\x80\xc0\x00\x20\x50',
+ b'\x4a\x0e\x00\x80\xc0\x00\x20\xf2',
+ b'\xe5\x0f\x00\x80\xc0\x00\x40\xf6',
+ ])
+
+ def test_volkswagen_mqb_crc_lh_eps_03(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "LH_EPS_03", 0x9F, [
+ b'\x11\x30\x2e\x00\x05\x1c\x80\x30',
+ b'\x5b\x31\x8e\x03\x05\x53\x00\x30',
+ b'\xcb\x32\xd3\x06\x05\x73\x00\x30',
+ b'\xf2\x33\x28\x00\x05\x26\x00\x30',
+ b'\x0b\x34\x44\x00\x05\x5b\x80\x30',
+ b'\xed\x35\x80\x00\x03\x34\x00\x30',
+ b'\xf0\x36\x88\x00\x05\x3d\x80\x30',
+ b'\x9e\x37\x44\x03\x05\x41\x00\x30',
+ b'\x68\x38\x06\x01\x05\x18\x80\x30',
+ b'\x87\x39\x51\x00\x05\x11\x80\x30',
+ b'\x8c\x3a\x29\x00\x05\xac\x00\x30',
+ b'\x08\x3b\xbd\x00\x05\x8e\x00\x30',
+ b'\xd4\x3c\x19\x00\x05\x05\x80\x30',
+ b'\x29\x3d\x54\x00\x05\x5b\x00\x30',
+ b'\xa1\x3e\x49\x01\x03\x04\x80\x30',
+ b'\xe2\x3f\x05\x00\x05\x0a\x00\x30',
+ ])
+
+ def test_volkswagen_mqb_crc_getriebe_11(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "Getriebe_11", 0xAD, [
+ b'\xf8\xe0\xbf\xff\x5f\x20\x20\x20',
+ b'\xb0\xe1\xbf\xff\xc6\x98\x21\x80',
+ b'\xd2\xe2\xbf\xff\x5f\x20\x20\x20',
+ b'\x00\xe3\xbf\xff\xaa\x20\x20\x10',
+ b'\xf1\xe4\xbf\xff\x5f\x20\x20\x20',
+ b'\xc4\xe5\xbf\xff\x5f\x20\x20\x20',
+ b'\xda\xe6\xbf\xff\x5f\x20\x20\x20',
+ b'\x85\xe7\xbf\xff\x5f\x20\x20\x20',
+ b'\x12\xe8\xbf\xff\x5f\x20\x20\x20',
+ b'\x45\xe9\xbf\xff\xaa\x20\x20\x10',
+ b'\x03\xea\xbf\xff\xcc\x20\x20\x10',
+ b'\xfc\xeb\xbf\xff\x5f\x20\x21\x20',
+ b'\xfe\xec\xbf\xff\xad\x20\x20\x10',
+ b'\xbd\xed\xbf\xff\xaa\x20\x20\x10',
+ b'\x67\xee\xbf\xff\xaa\x20\x20\x10',
+ b'\x36\xef\xbf\xff\xaa\x20\x20\x10',
+ ], counter_field="COUNTER_DISABLED") # see iqdbc#1235
+
+ def test_volkswagen_mqb_crc_esp_21(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ESP_21", 0xFD, [
+ b'\x66\xd0\x1f\x80\x45\x05\x00\x00',
+ b'\x87\xd1\x1f\x80\x52\x05\x00\x00',
+ b'\xcd\xd2\x1f\x80\x50\x06\x00\x00',
+ b'\xfd\xd3\x1f\x80\x35\x02\x00\x00',
+ b'\xfa\xd4\x1f\x80\x22\x05\x00\x00',
+ b'\xfd\xd5\x1f\x80\x84\x04\x00\x00',
+ b'\x2e\xd6\x1f\x80\xf0\x03\x00\x00',
+ b'\x9f\xd7\x1f\x80\x00\x00\x00\x00',
+ b'\x1e\xd8\x1f\x80\xb3\x03\x00\x00',
+ b'\x61\xd9\x1f\x80\x6d\x05\x00\x00',
+ b'\x44\xda\x1f\x80\x47\x02\x00\x00',
+ b'\x86\xdb\x1f\x80\x3a\x02\x00\x00',
+ b'\x39\xdc\x1f\x80\xcb\x01\x00\x00',
+ b'\x19\xdd\x1f\x80\x00\x00\x00\x00',
+ b'\x8c\xde\x1f\x80\xba\x04\x00\x00',
+ b'\xfb\xdf\x1f\x80\x46\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_esp_02(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ESP_02", 0x101, [
+ b'\xf2\x00\x7e\xff\xa1\x2a\x40\x00',
+ b'\xd3\x01\x7d\x00\xa2\x0c\x02\x00',
+ b'\x03\x02\x7a\x06\xa2\x49\x42\x00',
+ b'\xfd\x03\x70\xfb\xa1\xde\x00\x00',
+ b'\x8e\x04\x7b\xf7\xa1\xd2\x01\x00',
+ b'\x0f\x05\x7d\xfd\xa1\x31\x40\x00',
+ b'\xb6\x06\x7d\x01\xa2\x0a\x40\x00',
+ b'\xe8\x07\x7e\xfd\xa1\x12\x40\x00',
+ b'\x74\x08\x7a\x01\xa2\x40\x01\x00',
+ b'\xe3\x09\x81\x00\xa2\xb5\x01\x00',
+ b'\xab\x0a\x74\x09\xa2\x9f\x42\x00',
+ b'\xf3\x0b\x80\x12\xa2\x94\x00\x00',
+ b'\x88\x0c\x7f\x07\xa2\x46\x00\x00',
+ b'\x6f\x0d\x7f\xff\xa1\x53\x40\x00',
+ b'\x38\x0e\x73\xd6\xa1\x6a\x40\x00',
+ b'\x49\x0f\x85\x12\xa2\xf6\x01\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_esp_05(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ESP_05", 0x106, [
+ b'\x90\x80\x64\x00\x00\x00\xe7\x10',
+ b'\xf4\x81\x64\x00\x00\x00\xe7\x10',
+ b'\x90\x82\x63\x00\x00\x00\xe8\x10',
+ b'\xa0\x83\x63\x00\x00\x00\xe6\x10',
+ b'\xe7\x84\x63\x00\x00\x00\xe8\x10',
+ b'\x2e\x85\x78\x04\x00\x00\xea\x30',
+ b'\x7b\x86\x63\x00\x00\x00\xe6\x10',
+ b'\x71\x87\x79\x04\x00\x00\xd0\x30',
+ b'\x50\x88\x79\x04\x00\x00\xea\x30',
+ b'\x81\x89\x64\x00\x00\x00\xe1\x10',
+ b'\x6a\x8a\x68\x00\x00\x04\xd0\x10',
+ b'\x17\x8b\x6a\x04\x00\x00\xe6\x10',
+ b'\xc7\x8c\x63\x00\x00\x00\xd1\x10',
+ b'\x53\x8d\x64\x04\x00\x00\xe2\x10',
+ b'\x24\x8e\x63\x00\x00\x00\xe7\x10',
+ b'\x3f\x8f\x82\x04\x00\x00\xe6\x30',
+ ])
+
+ def test_volkswagen_mqb_crc_esp_10(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ESP_10", 0x116, [
+ b'\x2d\x00\xd5\x98\x9f\x26\x25\x0f',
+ b'\x24\x01\x60\x63\x2c\x5e\x3b\x0f',
+ b'\x08\x02\xb2\x2f\xee\x9a\x29\x0f',
+ b'\x7c\x03\x17\x07\x1d\xe5\x8c\x0f',
+ b'\xaa\x04\xd6\xe3\xeb\x98\xe8\x0f',
+ b'\x4e\x05\xbb\xd9\x65\x43\xca\x0f',
+ b'\x59\x06\x78\xbd\x25\xc6\xf2\xff',
+ b'\xaf\x07\x42\x85\x53\xbe\xbe\x0f',
+ b'\x2a\x08\xa6\xcd\x95\x8c\x12\x0f',
+ b'\xce\x09\x6e\x17\x6d\x1b\x2f\x0f',
+ b'\x60\x0a\xd3\xe6\x3a\x8d\xf0\x0f',
+ b'\xc5\x0b\xfc\x69\x57\x50\x21\x0f',
+ b'\x70\x0c\xde\xf3\x9d\xe9\x6b\xff',
+ b'\x62\x0d\xc4\x1a\xdb\x61\x7a\x0f',
+ b'\x76\x0e\x79\x69\xe3\x32\x67\x0f',
+ b'\x15\x0f\x51\x59\x56\x35\xb1\x0f',
+ ])
+
+ def test_volkswagen_mqb_crc_acc_10(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ACC_10", 0x117, [
+ b'\x9b\x00\x00\x40\x68\x00\x00\xff',
+ b'\xff\x01\x00\x40\x68\x00\x00\xff',
+ b'\x53\x02\x00\x40\x68\x00\x00\xff',
+ b'\x37\x03\x00\x40\x68\x00\x00\xff',
+ b'\x24\x04\x00\x40\x68\x00\x00\xff',
+ b'\x40\x05\x00\x40\x68\x00\x00\xff',
+ b'\xec\x06\x00\x40\x68\x00\x00\xff',
+ b'\x88\x07\x00\x40\x68\x00\x00\xff',
+ b'\xca\x08\x00\x40\x68\x00\x00\xff',
+ b'\xae\x09\x00\x40\x68\x00\x00\xff',
+ b'\x02\x0a\x00\x40\x68\x00\x00\xff',
+ b'\x66\x0b\x00\x40\x68\x00\x00\xff',
+ b'\x75\x0c\x00\x40\x68\x00\x00\xff',
+ b'\x11\x0d\x00\x40\x68\x00\x00\xff',
+ b'\xbd\x0e\x00\x40\x68\x00\x00\xff',
+ b'\xd9\x0f\x00\x40\x68\x00\x00\xff',
+ ])
+
+ def test_volkswagen_mqb_crc_tsk_06(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "TSK_06", 0x120, [
+ b'\xc1\x00\x00\x02\x00\x08\xff\x21',
+ b'\x34\x01\x00\x02\x00\x08\xff\x21',
+ b'\xcc\x02\x00\x02\x00\x08\xff\x21',
+ b'\x1e\x03\x00\x02\x00\x08\xff\x21',
+ b'\x48\x04\x00\x02\x00\x08\xff\x21',
+ b'\x4a\x05\x00\x02\x00\x08\xff\x21',
+ b'\xa5\x06\x00\x02\x00\x08\xff\x21',
+ b'\xa7\x07\x00\x02\x00\x08\xff\x21',
+ b'\xfe\x08\x00\x02\x00\x08\xff\x21',
+ b'\xa8\x09\x00\x02\x00\x08\xff\x21',
+ b'\x73\x0a\x00\x02\x00\x08\xff\x21',
+ b'\xdf\x0b\x00\x02\x00\x08\xff\x21',
+ b'\x05\x0c\x00\x02\x00\x08\xff\x21',
+ b'\xb5\x0d\x00\x02\x00\x08\xff\x21',
+ b'\xde\x0e\x00\x02\x00\x08\xff\x21',
+ b'\x0b\x0f\x00\x02\x00\x08\xff\x21',
+ ])
+
+ def test_volkswagen_mqb_crc_motor_20(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "Motor_20", 0x121, [
+ b'\xb9\x00\x00\xc0\x39\x46\x7e\xfe',
+ b'\x85\x31\x20\x00\x1a\x46\x7e\xfe',
+ b'\xc7\x12\x00\x40\x1a\x46\x7e\xfe',
+ b'\x53\x93\x00\x00\x19\x46\x7e\xfe',
+ b'\xa4\x34\x00\x80\x1a\x46\x7e\xfe',
+ b'\x0e\x55\x20\x60\x18\x46\x7e\xfe',
+ b'\x3f\x06\x00\xc0\x37\x4c\x7e\xfe',
+ b'\x0c\x07\x00\x40\x39\x46\x7e\xfe',
+ b'\x2a\x08\x00\x00\x3a\x46\x7e\xfe',
+ b'\x7f\x49\x20\x80\x1a\x46\x7e\xfe',
+ b'\x2f\x0a\x00\xc0\x39\x46\x7e\xfe',
+ b'\x70\xbb\x00\x00\x17\x46\x7e\xfe',
+ b'\x06\x0c\x00\x00\x39\x46\x7e\xfe',
+ b'\x4b\x9d\x20\xe0\x16\x4c\x7e\xfe',
+ b'\x73\xfe\x00\x40\x16\x46\x7e\xfe',
+ b'\xaf\x0f\x20\x80\x39\x4c\x7e\xfe',
+ ])
+
+ def test_volkswagen_mqb_crc_acc_06(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ACC_06", 0x122, [
+ b'\x14\x80\x00\xfe\x07\x00\x00\x18',
+ b'\x9f\x81\x00\xfe\x07\x00\x00\x18',
+ b'\x0a\x82\x00\xfe\x07\x00\x00\x28',
+ b'\x40\x83\x00\xfe\x07\x00\x00\x18',
+ b'\x2d\x84\x00\xfe\x07\x00\x00\x28',
+ b'\xdb\x85\x00\xfe\x07\x00\x00\x18',
+ b'\x4d\x86\x00\xfe\x07\x00\x00\x28',
+ b'\x35\x87\x00\xfe\x07\x00\x00\x18',
+ b'\x23\x88\x00\xfe\x07\x00\x00\x28',
+ b'\x4a\x89\x00\xfe\x07\x00\x00\x28',
+ b'\xe1\x8a\x00\xfe\x07\x00\x00\x28',
+ b'\x30\x8b\x00\xfe\x07\x00\x00\x28',
+ b'\x60\x8c\x00\xfe\x07\x00\x00\x28',
+ b'\x0d\x8d\x00\xfe\x07\x00\x00\x18',
+ b'\x8c\x8e\x00\xfe\x07\x00\x00\x18',
+ b'\x6f\x8f\x00\xfe\x07\x00\x00\x28',
+ ])
+
+ def test_volkswagen_mqb_crc_hca_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "HCA_01", 0x126, [
+ b'\x00\x30\x0d\xc0\x05\xfe\x07\x00',
+ b'\x3e\x31\x54\xc0\x05\xfe\x07\x00',
+ b'\xa7\x32\xbb\x40\x05\xfe\x07\x00',
+ b'\x96\x33\x29\xc0\x05\xfe\x07\x00',
+ b'\x5f\x34\x00\x00\x03\xfe\x07\x00',
+ b'\x3b\x35\xae\x40\x05\xfe\x07\x00',
+ b'\xc7\x36\x7a\x40\x05\xfe\x07\x00',
+ b'\x6f\x37\x76\x40\x05\xfe\x07\x00',
+ b'\xb1\x38\x00\x00\x03\xfe\x07\x00',
+ b'\xd5\x39\x00\x00\x03\xfe\x07\x00',
+ b'\xba\x3a\x69\xc0\x05\xfe\x07\x00',
+ b'\x65\x3b\x10\x40\x05\xfe\x07\x00',
+ b'\x49\x3c\x72\xc0\x05\xfe\x07\x00',
+ b'\xc6\x3d\xdf\x40\x05\xfe\x07\x00',
+ b'\x1d\x3e\x2c\xc1\x05\xfe\x07\x00',
+ b'\x9b\x3f\x20\x40\x05\xfe\x07\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_gra_acc_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "GRA_ACC_01", 0x12B, [
+ b'\x86\x40\x80\x2a\x00\x00\x00\x00',
+ b'\xf4\x41\x80\x2a\x00\x00\x00\x00',
+ b'\x50\x42\x80\x2a\x00\x00\x00\x00',
+ b'\x08\x43\x80\x2a\x00\x00\x00\x00',
+ b'\x88\x44\x80\x2a\x00\x00\x00\x00',
+ b'\x2d\x45\x80\x2a\x00\x00\x00\x00',
+ b'\x34\x46\x80\x2a\x00\x00\x00\x00',
+ b'\x11\x47\x80\x2a\x00\x00\x00\x00',
+ b'\xc4\x48\x80\x2a\x00\x00\x00\x00',
+ b'\xcc\x49\x80\x2a\x00\x00\x00\x00',
+ b'\xdc\x4a\x80\x2a\x00\x00\x00\x00',
+ b'\x79\x4b\x80\x2a\x00\x00\x00\x00',
+ b'\x3c\x4c\x80\x2a\x00\x00\x00\x00',
+ b'\x68\x4d\x80\x2a\x00\x00\x00\x00',
+ b'\x27\x4e\x80\x2a\x00\x00\x00\x00',
+ b'\x0d\x4f\x80\x2a\x00\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_acc_07(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ACC_07", 0x12E, [
+ b'\xac\xe0\x7f\x00\xfe\x00\xc0\xff',
+ b'\xa2\xe1\x7f\x00\xfe\x00\xc0\xff',
+ b'\x6b\xe2\x7f\x00\xfe\x00\xc0\xff',
+ b'\xf2\xe3\x7f\x00\xfe\x00\xc0\xff',
+ b'\xd5\xe4\x7f\x00\xfe\x00\xc0\xff',
+ b'\x35\xe5\x7f\x00\xfe\x00\xc0\xff',
+ b'\x7f\xe6\x7f\x00\xfe\x00\xc0\xff',
+ b'\x6c\xe7\x7f\x00\xfe\x00\xc0\xff',
+ b'\x05\xe8\x7f\x00\xfe\x00\xc0\xff',
+ b'\x79\xe9\x7f\x00\xfe\x00\xc0\xff',
+ b'\x25\xea\x7f\x00\xfe\x00\xc0\xff',
+ b'\xd1\xeb\x7f\x00\xfe\x00\xc0\xff',
+ b'\x72\xec\x7f\x00\xfe\x00\xc0\xff',
+ b'\x58\xed\x7f\x00\xfe\x00\xc0\xff',
+ b'\x82\xee\x7f\x00\xfe\x00\xc0\xff',
+ b'\x85\xef\x7f\x00\xfe\x00\xc0\xff',
+ ])
+
+ def test_volkswagen_mqb_crc_motor_ev_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "Motor_EV_01", 0x187, [
+ b'\x70\x80\x15\x00\x00\x00\x00\xF0',
+ b'\x07\x81\x15\x00\x00\x00\x00\xF0',
+ b'\x7A\x82\x15\x00\x00\x00\x00\xF0',
+ b'\x26\x83\x15\x00\x00\x00\x00\xF0',
+ b'\xBE\x84\x15\x00\x00\x00\x00\xF0',
+ b'\x5A\x85\x15\x00\x00\x00\x00\xF0',
+ b'\xFC\x86\x15\x00\x00\x00\x00\xF0',
+ b'\x9E\x87\x15\x00\x00\x00\x00\xF0',
+ b'\xAF\x88\x15\x00\x00\x00\x00\xF0',
+ b'\x35\x89\x15\x00\x00\x00\x00\xF0',
+ b'\xC5\x8A\x15\x00\x00\x00\x00\xF0',
+ b'\x11\x8B\x15\x00\x00\x00\x00\xF0',
+ b'\xD0\x8C\x15\x00\x00\x00\x00\xF0',
+ b'\xE8\x8D\x15\x00\x00\x00\x00\xF0',
+ b'\xF5\x8E\x15\x00\x00\x00\x00\xF0',
+ b'\x00\x8F\x15\x00\x00\x00\x00\xF0',
+ ])
+
+ def test_volkswagen_mqb_crc_esp_33(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ESP_33", 0x1AB, [
+ b'\x64\x00\x80\x02\x00\x00\x00\x00',
+ b'\x19\x01\x00\x00\x00\x00\x00\x00',
+ b'\xfc\x02\x00\x10\x01\x00\x00\x00',
+ b'\x8b\x03\x80\x02\x00\x00\x00\x00',
+ b'\xa4\x04\x00\x10\x01\x00\x00\x00',
+ b'\x97\x05\x00\x02\x00\x00\x01\x00',
+ b'\xd5\x06\x80\x02\x00\x00\x01\x00',
+ b'\xa0\x07\x80\x02\x00\x00\x01\x00',
+ b'\x89\x08\x00\x00\x00\x00\x00\x00',
+ b'\xe3\x09\x00\x00\x00\x00\x00\x00',
+ b'\x0e\x0a\x00\x00\x00\x00\x00\x00',
+ b'\x90\x0b\x00\x00\x00\x00\x00\x00',
+ b'\x32\x0c\x00\x10\x01\x00\x00\x00',
+ b'\x30\x0d\x00\x00\x00\x00\x00\x00',
+ b'\xc2\x0e\x00\x10\x01\x00\x00\x00',
+ b'\x68\x0f\x80\x02\x00\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_acc_02(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ACC_02", 0x30C, [
+ b'\x82\xf0\x3f\x00\x40\x30\x00\x40',
+ b'\xe6\xf1\x3f\x00\x40\x30\x00\x40',
+ b'\x4a\xf2\x3f\x00\x40\x30\x00\x40',
+ b'\x2e\xf3\x3f\x00\x40\x30\x00\x40',
+ b'\x3d\xf4\x3f\x00\x40\x30\x00\x40',
+ b'\x59\xf5\x3f\x00\x40\x30\x00\x40',
+ b'\xf5\xf6\x3f\x00\x40\x30\x00\x40',
+ b'\x91\xf7\x3f\x00\x40\x30\x00\x40',
+ b'\xd3\xf8\x3f\x00\x40\x30\x00\x40',
+ b'\xb7\xf9\x3f\x00\x40\x30\x00\x40',
+ b'\x1b\xfa\x3f\x00\x40\x30\x00\x40',
+ b'\x7f\xfb\x3f\x00\x40\x30\x00\x40',
+ b'\x6c\xfc\x3f\x00\x40\x30\x00\x40',
+ b'\x08\xfd\x3f\x00\x40\x30\x00\x40',
+ b'\xa4\xfe\x3f\x00\x40\x30\x00\x40',
+ b'\xc0\xff\x3f\x00\x40\x30\x00\x40',
+ ])
+
+ def test_volkswagen_mqb_crc_swa_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "SWA_01", 0x30F, [
+ b'\x10\x00\x10\x00\x00\x00\x00\x00',
+ b'\x74\x01\x10\x00\x00\x00\x00\x00',
+ b'\xD8\x02\x10\x00\x00\x00\x00\x00',
+ b'\xBC\x03\x10\x00\x00\x00\x00\x00',
+ b'\xAF\x04\x10\x00\x00\x00\x00\x00',
+ b'\xCB\x05\x10\x00\x00\x00\x00\x00',
+ b'\x67\x06\x10\x00\x00\x00\x00\x00',
+ b'\x03\x07\x10\x00\x00\x00\x00\x00',
+ b'\x41\x08\x10\x00\x00\x00\x00\x00',
+ b'\x25\x09\x10\x00\x00\x00\x00\x00',
+ b'\x89\x0A\x10\x00\x00\x00\x00\x00',
+ b'\xED\x0B\x10\x00\x00\x00\x00\x00',
+ b'\xFE\x0C\x10\x00\x00\x00\x00\x00',
+ b'\x9A\x0D\x10\x00\x00\x00\x00\x00',
+ b'\x36\x0E\x10\x00\x00\x00\x00\x00',
+ b'\x52\x0F\x10\x00\x00\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_acc_04(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ACC_04", 0x324, [
+ b'\xba\x00\x00\x00\x00\x00\x00\x10',
+ b'\xde\x01\x00\x00\x00\x00\x00\x10',
+ b'\x72\x02\x00\x00\x00\x00\x00\x10',
+ b'\x16\x03\x00\x00\x00\x00\x00\x10',
+ b'\x05\x04\x00\x00\x00\x00\x00\x10',
+ b'\x44\x05\x00\x00\x00\x00\x00\x00',
+ b'\xe8\x06\x00\x00\x00\x00\x00\x00',
+ b'\xa9\x07\x00\x00\x00\x00\x00\x10',
+ b'\xeb\x08\x00\x00\x00\x00\x00\x10',
+ b'\x8f\x09\x00\x00\x00\x00\x00\x10',
+ b'\x06\x0a\x00\x00\x00\x00\x00\x00',
+ b'\x47\x0b\x00\x00\x00\x00\x00\x10',
+ b'\x71\x0c\x00\x00\x00\x00\x00\x00',
+ b'\x15\x0d\x00\x00\x00\x00\x00\x00',
+ b'\xb9\x0e\x00\x00\x00\x00\x00\x00',
+ b'\xdd\x0f\x00\x00\x00\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_klemmen_status_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "Klemmen_Status_01", 0x3C0, [
+ b'\x74\x00\x03\x00',
+ b'\xc1\x01\x03\x00',
+ b'\x31\x02\x03\x00',
+ b'\x84\x03\x03\x00',
+ b'\xfe\x04\x03\x00',
+ b'\x4b\x05\x03\x00',
+ b'\xbb\x06\x03\x00',
+ b'\x0e\x07\x03\x00',
+ b'\x4f\x08\x03\x00',
+ b'\xfa\x09\x03\x00',
+ b'\x0a\x0a\x03\x00',
+ b'\xbf\x0b\x03\x00',
+ b'\xc5\x0c\x03\x00',
+ b'\x70\x0d\x03\x00',
+ b'\x80\x0e\x03\x00',
+ b'\x35\x0f\x03\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_licht_anf_01(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "Licht_Anf_01", 0x3D5, [
+ b'\xc8\x00\x00\x04\x00\x00\x00\x00',
+ b'\x9f\x01\x00\x04\x00\x00\x00\x00',
+ b'\x5e\x02\x00\x04\x00\x00\x00\x00',
+ b'\x52\x03\x00\x04\x00\x00\x00\x00',
+ b'\xf2\x04\x00\x04\x00\x00\x00\x00',
+ b'\x79\x05\x00\x04\x00\x00\x00\x00',
+ b'\xe6\x06\x00\x04\x00\x00\x00\x00',
+ b'\xfd\x07\x00\x04\x00\x00\x00\x00',
+ b'\xf8\x08\x00\x04\x00\x00\x00\x00',
+ b'\xc6\x09\x00\x04\x00\x00\x00\x00',
+ b'\xf5\x0a\x00\x04\x00\x00\x00\x00',
+ b'\x1a\x0b\x00\x04\x00\x00\x00\x00',
+ b'\x65\x0c\x00\x04\x00\x00\x00\x00',
+ b'\x41\x0d\x00\x04\x00\x00\x00\x00',
+ b'\x7f\x0e\x00\x04\x00\x00\x00\x00',
+ b'\x98\x0f\x00\x04\x00\x00\x00\x00',
+ ])
+
+ def test_volkswagen_mqb_crc_esp_20(self, subtests):
+ self.verify_volkswagen_mqb_crc(subtests, "ESP_20", 0x65D, [
+ b'\x98\x30\x2b\x10\x00\x00\x22\x81',
+ b'\xc8\x31\x2b\x10\x00\x00\x22\x81',
+ b'\x9d\x32\x2b\x10\x00\x00\x22\x81',
+ b'\x1f\x33\x2b\x10\x00\x00\x22\x81',
+ b'\x6e\x34\x2b\x10\x00\x00\x22\x81',
+ b'\x61\x35\x2b\x10\x00\x00\x22\x81',
+ b'\x6f\x36\x2b\x10\x00\x00\x22\x81',
+ b'\xe5\x37\x2b\x10\x00\x00\x22\x81',
+ b'\xf8\x38\x2b\x10\x00\x00\x22\x81',
+ b'\xe1\x39\x2b\x10\x00\x00\x22\x81',
+ b'\xaa\x3a\x2b\x10\x00\x00\x22\x81',
+ b'\xe6\x3b\x2b\x10\x00\x00\x22\x81',
+ b'\xef\x3c\x2b\x10\x00\x00\x22\x81',
+ b'\xbb\x3d\x2b\x10\x00\x00\x22\x81',
+ b'\x9b\x3e\x2b\x10\x00\x00\x22\x81',
+ b'\x72\x3f\x2b\x10\x00\x00\x22\x81',
+ ])
diff --git a/iqdbc_repo/iqdbc/can/tests/test_dbc_exceptions.py b/iqdbc_repo/iqdbc/can/tests/test_dbc_exceptions.py
new file mode 100644
index 000000000..1b16fdbba
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/test_dbc_exceptions.py
@@ -0,0 +1,29 @@
+import pytest
+
+from iqdbc.can import CANDefine, CANPacker, CANParser
+from iqdbc.can.tests import TEST_DBC
+
+
+class TestCanParserPackerExceptions:
+ def test_civic_exceptions(self):
+ dbc_file = "honda_civic_touring_2016_can_generated"
+ dbc_invalid = dbc_file + "abcdef"
+ msgs = [("STEERING_CONTROL", 50)]
+ with pytest.raises(FileNotFoundError):
+ CANParser(dbc_invalid, msgs, 0)
+ with pytest.raises(FileNotFoundError):
+ CANPacker(dbc_invalid)
+ with pytest.raises(FileNotFoundError):
+ CANDefine(dbc_invalid)
+ with pytest.raises(KeyError):
+ CANDefine(TEST_DBC)
+
+ parser = CANParser(dbc_file, msgs, 0)
+ with pytest.raises(IndexError):
+ parser.update([b''])
+
+ # Everything is supposed to work below
+ CANParser(dbc_file, msgs, 0)
+ CANParser(dbc_file, [], 0)
+ CANPacker(dbc_file)
+ CANDefine(dbc_file)
diff --git a/iqdbc_repo/iqdbc/can/tests/test_dbc_parser.py b/iqdbc_repo/iqdbc/can/tests/test_dbc_parser.py
new file mode 100644
index 000000000..3e6005388
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/test_dbc_parser.py
@@ -0,0 +1,21 @@
+from iqdbc.can import CANParser
+from iqdbc.can.tests import ALL_DBCS
+
+
+class TestDBCParser:
+ def test_enough_dbcs(self):
+ # sanity check that we're running on the real DBCs
+ assert len(ALL_DBCS) > 20
+
+ def test_parse_all_dbcs(self, subtests):
+ """
+ Dynamic DBC parser checks:
+ - Checksum and counter length, start bit, endianness
+ - Duplicate message addresses and names
+ - Signal out of bounds
+ - All BO_, SG_, VAL_ lines for syntax errors
+ """
+
+ for dbc in ALL_DBCS:
+ with subtests.test(dbc=dbc):
+ CANParser(dbc, [], 0)
diff --git a/iqdbc_repo/iqdbc/can/tests/test_define.py b/iqdbc_repo/iqdbc/can/tests/test_define.py
new file mode 100644
index 000000000..dec8cf55d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/test_define.py
@@ -0,0 +1,27 @@
+from iqdbc.can import CANDefine
+from iqdbc.can.tests import ALL_DBCS
+
+
+class TestCANDefine:
+ def test_civic(self):
+
+ dbc_file = "honda_civic_touring_2016_can_generated"
+ defs = CANDefine(dbc_file)
+
+ assert defs.dv[399] == defs.dv['STEER_STATUS']
+ assert defs.dv[399] == {'STEER_STATUS':
+ {7: 'PERMANENT_FAULT',
+ 6: 'TMP_FAULT',
+ 5: 'FAULT_1',
+ 4: 'NO_TORQUE_ALERT_2',
+ 3: 'LOW_SPEED_LOCKOUT',
+ 2: 'NO_TORQUE_ALERT_1',
+ 1: 'DRIVER_STEERING',
+ 0: 'NORMAL'}
+ }
+
+ def test_all_dbcs(self, subtests):
+ # Asserts no exceptions on all DBCs
+ for dbc in ALL_DBCS:
+ with subtests.test(dbc=dbc):
+ CANDefine(dbc)
diff --git a/iqdbc_repo/iqdbc/can/tests/test_packer_parser.py b/iqdbc_repo/iqdbc/can/tests/test_packer_parser.py
new file mode 100644
index 000000000..8dc59e58e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/can/tests/test_packer_parser.py
@@ -0,0 +1,394 @@
+import pytest
+import random
+
+from iqdbc.can import CANPacker, CANParser
+from iqdbc.can.tests import TEST_DBC
+
+MAX_BAD_COUNTER = 5
+
+
+class TestCanParserPacker:
+ def test_packer(self):
+ packer = CANPacker(TEST_DBC)
+
+ for b in range(6):
+ for i in range(256):
+ values = {"COUNTER": i}
+ addr, dat, bus = packer.make_can_msg("CAN_FD_MESSAGE", b, values)
+ assert addr == 245
+ assert bus == b
+ assert dat[0] == i
+
+ def test_packer_counter(self):
+ msgs = [("CAN_FD_MESSAGE", 0), ]
+ packer = CANPacker(TEST_DBC)
+ parser = CANParser(TEST_DBC, msgs, 0)
+
+ # packer should increment the counter
+ for i in range(1000):
+ msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
+ parser.update([0, [msg]])
+ assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == (i % 256)
+
+ # setting COUNTER should override
+ for _ in range(100):
+ cnt = random.randint(0, 255)
+ msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {
+ "COUNTER": cnt,
+ "SIGNED": 0
+ })
+ parser.update([0, [msg]])
+ assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == cnt
+
+ # then, should resume counting from the override value
+ cnt = parser.vl["CAN_FD_MESSAGE"]["COUNTER"]
+ for i in range(100):
+ msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
+ parser.update([0, [msg]])
+ assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == ((cnt + i) % 256)
+
+ def test_parser_can_valid(self):
+ msgs = [("CAN_FD_MESSAGE", 10), ]
+ packer = CANPacker(TEST_DBC)
+ parser = CANParser(TEST_DBC, msgs, 0)
+
+ # shouldn't be valid initially
+ assert not parser.can_valid
+
+ # not valid until the message is seen
+ for _ in range(100):
+ parser.update([0, []])
+ assert not parser.can_valid
+
+ # valid once seen
+ for i in range(1, 100):
+ t = int(0.01 * i * 1e9)
+ msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
+ parser.update([t, [msg]])
+ assert parser.can_valid
+
+ def test_lazy_add_not_ignore_alive(self):
+ """
+ Accessing an undeclared message via parser.vl[...] lazily adds it via
+ _add_message(key) with the default freq=None, which is NOT the same as
+ declaring it with math.nan (ignore_alive=True). It's treated as "assume
+ ~1Hz, must be seen within ~10s" — so if that message is never fed, the
+ parser is permanently invalid. Declaring an optional/rarely-sent message
+ with math.nan (or gating the .vl[...] read entirely) is required to avoid
+ this; see iqdbc/car/volkswagen/carstate.py's Diagnose_1/EPB_1 bugs.
+ """
+ parser = CANParser(TEST_DBC, [], 0)
+ assert parser.can_valid
+
+ # lazily add STEERING_CONTROL by reading it, without ever declaring it
+ # or feeding any CAN data for it
+ _ = parser.vl["STEERING_CONTROL"]
+ state = parser.message_states[parser.dbc.name_to_msg["STEERING_CONTROL"].address]
+ assert not state.ignore_alive
+
+ # never becomes valid again, no matter how many times it's checked
+ # (can_valid debounces over MAX_BAD_COUNTER reads before flipping false)
+ for _ in range(MAX_BAD_COUNTER):
+ parser.can_valid
+ for _ in range(20):
+ assert not parser.can_valid
+
+ def test_parser_updated_list(self):
+ msgs = [("CAN_FD_MESSAGE", 10), ]
+ parser = CANParser(TEST_DBC, msgs, 0)
+ packer = CANPacker(TEST_DBC)
+
+ msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
+ ret = parser.update([0, [msg]])
+ assert ret == {245}
+
+ ret = parser.update([])
+ assert len(ret) == 0
+
+ def test_parser_counter_can_valid(self):
+ """
+ Tests number of allowed bad counters + ensures CAN stays invalid
+ while receiving invalid messages + that we can recover
+ """
+ msgs = [
+ ("STEERING_CONTROL", 0),
+ ]
+ packer = CANPacker("honda_civic_touring_2016_can_generated")
+ parser = CANParser("honda_civic_touring_2016_can_generated", msgs, 0)
+
+ msg = packer.make_can_msg("STEERING_CONTROL", 0, {"COUNTER": 0})
+
+ # bad static counter, invalid once it's seen MAX_BAD_COUNTER messages
+ for idx in range(0x1000):
+ parser.update([0, [msg]])
+ assert ((idx + 1) < MAX_BAD_COUNTER) == parser.can_valid
+
+ # one to recover
+ msg = packer.make_can_msg("STEERING_CONTROL", 0, {"COUNTER": 1})
+ parser.update([0, [msg]])
+ assert parser.can_valid
+
+ def test_parser_no_partial_update(self):
+ """
+ Ensure that the CANParser doesn't partially update messages with invalid signals (COUNTER/CHECKSUM).
+ Previously, the signal update loop would only break once it got to one of these invalid signals,
+ after already updating most/all of the signals.
+ """
+ msgs = [
+ ("STEERING_CONTROL", 0),
+ ]
+ packer = CANPacker("honda_civic_touring_2016_can_generated")
+ parser = CANParser("honda_civic_touring_2016_can_generated", msgs, 0)
+
+ def rx_steering_msg(values, bad_checksum=False):
+ msg = packer.make_can_msg("STEERING_CONTROL", 0, values)
+ if bad_checksum:
+ # add 1 to checksum
+ dat = bytearray(msg[1])
+ dat[4] = (dat[4] & 0xF0) | ((dat[4] & 0x0F) + 1)
+ msg = (msg[0], bytes(dat), msg[2])
+
+ parser.update([0, [msg]])
+
+ rx_steering_msg({"STEER_TORQUE": 100}, bad_checksum=False)
+ assert parser.vl["STEERING_CONTROL"]["STEER_TORQUE"] == 100
+ assert parser.vl_all["STEERING_CONTROL"]["STEER_TORQUE"] == [100]
+
+ for _ in range(5):
+ rx_steering_msg({"STEER_TORQUE": 200}, bad_checksum=True)
+ assert parser.vl["STEERING_CONTROL"]["STEER_TORQUE"] == 100
+ assert parser.vl_all["STEERING_CONTROL"]["STEER_TORQUE"] == []
+
+ # Even if CANParser doesn't update instantaneous vl, make sure it didn't add invalid values to vl_all
+ rx_steering_msg({"STEER_TORQUE": 300}, bad_checksum=False)
+ assert parser.vl["STEERING_CONTROL"]["STEER_TORQUE"] == 300
+ assert parser.vl_all["STEERING_CONTROL"]["STEER_TORQUE"] == [300]
+
+ def test_packer_parser(self):
+ msgs = [
+ ("Brake_Status", 0),
+ ("CAN_FD_MESSAGE", 0),
+ ("STEERING_CONTROL", 0),
+ ]
+ packer = CANPacker(TEST_DBC)
+ parser = CANParser(TEST_DBC, msgs, 0)
+
+ for steer in range(-256, 255):
+ for active in (1, 0):
+ values = {
+ "STEERING_CONTROL": {
+ "STEER_TORQUE": steer,
+ "STEER_TORQUE_REQUEST": active,
+ },
+ "Brake_Status": {
+ "Signal1": 61042322657536.0,
+ },
+ "CAN_FD_MESSAGE": {
+ "SIGNED": steer,
+ "64_BIT_LE": random.randint(0, 100),
+ "64_BIT_BE": random.randint(0, 100),
+ },
+ }
+
+ msgs = [packer.make_can_msg(k, 0, v) for k, v in values.items()]
+ parser.update([0, msgs])
+
+ for k, v in values.items():
+ for key, val in v.items():
+ assert parser.vl[k][key] == pytest.approx(val)
+
+ # also check address
+ for sig in ("STEER_TORQUE", "STEER_TORQUE_REQUEST", "COUNTER", "CHECKSUM"):
+ assert parser.vl["STEERING_CONTROL"][sig] == parser.vl[228][sig]
+
+ def test_scale_offset(self):
+ """Test that both scale and offset are correctly preserved"""
+ dbc_file = "honda_civic_touring_2016_can_generated"
+ msgs = [("VSA_STATUS", 50)]
+ parser = CANParser(dbc_file, msgs, 0)
+ packer = CANPacker(dbc_file)
+
+ for brake in range(100):
+ values = {"USER_BRAKE": brake}
+ msgs = packer.make_can_msg("VSA_STATUS", 0, values)
+ parser.update([0, [msgs]])
+
+ assert parser.vl["VSA_STATUS"]["USER_BRAKE"] == pytest.approx(brake)
+
+ def test_subaru(self):
+ # Subaru is little endian
+
+ dbc_file = "subaru_global_2017_generated"
+
+ msgs = [("ES_LKAS", 50)]
+
+ parser = CANParser(dbc_file, msgs, 0)
+ packer = CANPacker(dbc_file)
+
+ idx = 0
+ for steer in range(-256, 255):
+ for active in [1, 0]:
+ values = {
+ "LKAS_Output": steer,
+ "LKAS_Request": active,
+ "SET_1": 1
+ }
+
+ msgs = packer.make_can_msg("ES_LKAS", 0, values)
+ parser.update([0, [msgs]])
+
+ assert parser.vl["ES_LKAS"]["LKAS_Output"] == pytest.approx(steer)
+ assert parser.vl["ES_LKAS"]["LKAS_Request"] == pytest.approx(active)
+ assert parser.vl["ES_LKAS"]["SET_1"] == pytest.approx(1)
+ assert parser.vl["ES_LKAS"]["COUNTER"] == pytest.approx(idx % 16)
+ idx += 1
+
+ def test_bus_timeout(self):
+ """Test CAN bus timeout detection"""
+ dbc_file = "honda_civic_touring_2016_can_generated"
+
+ freq = 100
+ msgs = [("VSA_STATUS", freq), ("STEER_MOTOR_TORQUE", freq/2)]
+
+ parser = CANParser(dbc_file, msgs, 0)
+ packer = CANPacker(dbc_file)
+
+ i = 0
+
+ def send_msg(blank=False):
+ nonlocal i
+ i += 1
+ t = i*((1 / freq) * 1e9)
+
+ if blank:
+ msgs = []
+ else:
+ msgs = [packer.make_can_msg("VSA_STATUS", 0, {}), ]
+
+ parser.update([t, msgs])
+
+ # all good, no timeout
+ for _ in range(1000):
+ send_msg()
+ assert not parser.bus_timeout, str(_)
+
+ # timeout after 10 blank msgs
+ for n in range(200):
+ send_msg(blank=True)
+ assert (n >= 10) == parser.bus_timeout
+
+ # no timeout immediately after seen again
+ send_msg()
+ assert not parser.bus_timeout
+
+ def test_updated(self):
+ """Test updated value dict"""
+ dbc_file = "honda_civic_touring_2016_can_generated"
+ msgs = [("VSA_STATUS", 50)]
+ parser = CANParser(dbc_file, msgs, 0)
+ packer = CANPacker(dbc_file)
+
+ # Make sure nothing is updated
+ assert len(parser.vl_all["VSA_STATUS"]["USER_BRAKE"]) == 0
+
+ idx = 0
+ for _ in range(10):
+ # Ensure CANParser holds the values of any duplicate messages over multiple frames
+ user_brake_vals = [random.randrange(100) for _ in range(random.randrange(5, 10))]
+ half_idx = len(user_brake_vals) // 2
+ can_msgs = [[], []]
+ for frame, brake_vals in enumerate((user_brake_vals[:half_idx], user_brake_vals[half_idx:])):
+ for user_brake in brake_vals:
+ values = {"USER_BRAKE": user_brake}
+ can_msgs[frame].append(packer.make_can_msg("VSA_STATUS", 0, values))
+ idx += 1
+
+ parser.update([[0, m] for m in can_msgs])
+ vl_all = parser.vl_all["VSA_STATUS"]["USER_BRAKE"]
+
+ assert vl_all == user_brake_vals
+ if len(user_brake_vals):
+ assert vl_all[-1] == parser.vl["VSA_STATUS"]["USER_BRAKE"]
+
+ def test_timestamp_nanos(self):
+ """Test message timestamp dict"""
+ dbc_file = "honda_civic_touring_2016_can_generated"
+
+ msgs = [
+ ("VSA_STATUS", 50),
+ ("POWERTRAIN_DATA", 100),
+ ]
+
+ parser = CANParser(dbc_file, msgs, 0)
+ packer = CANPacker(dbc_file)
+
+ # Check the default timestamp is zero
+ for msg in ("VSA_STATUS", "POWERTRAIN_DATA"):
+ ts_nanos = parser.ts_nanos[msg].values()
+ assert set(ts_nanos) == {0}
+
+ # Check:
+ # - timestamp is only updated for correct messages
+ # - timestamp is correct for multiple runs
+ # - timestamp is from the latest message if updating multiple strings
+ for _ in range(10):
+ can_strings = []
+ log_mono_time = 0
+ for i in range(10):
+ log_mono_time = int(0.01 * i * 1e+9)
+ can_msg = packer.make_can_msg("VSA_STATUS", 0, {})
+ can_strings.append((log_mono_time, [can_msg]))
+ parser.update(can_strings)
+
+ ts_nanos = parser.ts_nanos["VSA_STATUS"].values()
+ assert set(ts_nanos) == {log_mono_time}
+ ts_nanos = parser.ts_nanos["POWERTRAIN_DATA"].values()
+ assert set(ts_nanos) == {0}
+
+ def test_nonexistent_messages(self):
+ # Ensure we don't allow messages not in the DBC
+ existing_messages = ("STEERING_CONTROL", 228, "CAN_FD_MESSAGE", 245)
+
+ for msg in existing_messages:
+ CANParser(TEST_DBC, [(msg, 0)], 0)
+ with pytest.raises(RuntimeError):
+ new_msg = msg + "1" if isinstance(msg, str) else msg + 1
+ CANParser(TEST_DBC, [(new_msg, 0)], 0)
+
+ def test_track_all_signals(self):
+ parser = CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 0)], 0)
+ assert parser.vl["ACC_CONTROL"] == {
+ "ACCEL_CMD": 0,
+ "ALLOW_LONG_PRESS": 0,
+ "ACC_MALFUNCTION": 0,
+ "RADAR_DIRTY": 0,
+ "DISTANCE": 0,
+ "MINI_CAR": 0,
+ "ACC_TYPE": 0,
+ "CANCEL_REQ": 0,
+ "ACC_CUT_IN": 0,
+ "LEAD_VEHICLE_STOPPED": 0,
+ "PERMIT_BRAKING": 0,
+ "RELEASE_STANDSTILL": 0,
+ "ITS_CONNECT_LEAD": 0,
+ "ACCEL_CMD_ALT": 0,
+ "CHECKSUM": 0,
+ }
+
+ def test_disallow_duplicate_messages(self):
+ CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 5)], 0)
+
+ with pytest.raises(RuntimeError):
+ CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 5), ("ACC_CONTROL", 10)], 0)
+
+ with pytest.raises(RuntimeError):
+ CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 10), ("ACC_CONTROL", 10)], 0)
+
+ def test_allow_undefined_msgs(self):
+ # TODO: we should throw an exception for these, but we need good
+ # discovery tests in openpilot first
+ packer = CANPacker("toyota_nodsu_pt_generated")
+
+ assert packer.make_can_msg("ACC_CONTROL", 0, {"UNKNOWN_SIGNAL": 0}) == (835, b'\x00\x00\x00\x00\x00\x00\x00N', 0)
+ assert packer.make_can_msg("UNKNOWN_MESSAGE", 0, {"UNKNOWN_SIGNAL": 0}) == (0, b'', 0)
+ assert packer.make_can_msg(0, 0, {"UNKNOWN_SIGNAL": 0}) == (0, b'', 0)
diff --git a/iqdbc_repo/iqdbc/car/__init__.py b/iqdbc_repo/iqdbc/car/__init__.py
new file mode 100644
index 000000000..a77c8212f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/__init__.py
@@ -0,0 +1,252 @@
+# functions common among cars
+import numpy as np
+from dataclasses import dataclass, field
+from enum import IntFlag, ReprEnum, StrEnum, EnumType, auto
+from dataclasses import replace
+
+from iqdbc.car import structs, uds
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.docs_definitions import CarDocs, ExtraCarDocs
+
+DT_CTRL = 0.01 # car state and control loop timestep (s)
+
+# kg of standard extra cargo to count for drive, gas, etc...
+STD_CARGO_KG = 136.
+
+ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+
+def apply_hysteresis(val: float, val_steady: float, hyst_gap: float) -> float:
+ if val > val_steady + hyst_gap:
+ val_steady = val - hyst_gap
+ elif val < val_steady - hyst_gap:
+ val_steady = val + hyst_gap
+ return val_steady
+
+
+def create_button_events(cur_btn: int, prev_btn: int, buttons_dict: dict[int, structs.CarState.ButtonEvent.Type],
+ unpressed_btn: int = 0) -> list[structs.CarState.ButtonEvent]:
+ events: list[structs.CarState.ButtonEvent] = []
+
+ if cur_btn == prev_btn:
+ return events
+
+ # Add events for button presses, multiple when a button switches without going to unpressed
+ for pressed, btn in ((False, prev_btn), (True, cur_btn)):
+ if btn != unpressed_btn:
+ events.append(structs.CarState.ButtonEvent(pressed=pressed,
+ type=buttons_dict.get(btn, ButtonType.unknown)))
+ return events
+
+
+def gen_empty_fingerprint():
+ return {i: {} for i in range(8)}
+
+
+# these params were derived for the Civic and used to calculate params for other cars
+class VehicleDynamicsParams:
+ MASS = 1326. + STD_CARGO_KG
+ WHEELBASE = 2.70
+ CENTER_TO_FRONT = WHEELBASE * 0.4
+ CENTER_TO_REAR = WHEELBASE - CENTER_TO_FRONT
+ ROTATIONAL_INERTIA = 2500
+ TIRE_STIFFNESS_FRONT = 192150
+ TIRE_STIFFNESS_REAR = 202500
+
+
+# TODO: get actual value, for now starting with reasonable value for
+# civic and scaling by mass and wheelbase
+def scale_rot_inertia(mass, wheelbase):
+ return VehicleDynamicsParams.ROTATIONAL_INERTIA * mass * wheelbase ** 2 / (VehicleDynamicsParams.MASS * VehicleDynamicsParams.WHEELBASE ** 2)
+
+
+# TODO: start from empirically derived lateral slip stiffness for the civic and scale by
+# mass and CG position, so all cars will have approximately similar dyn behaviors
+def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor):
+ center_to_rear = wheelbase - center_to_front
+ tire_stiffness_front = (VehicleDynamicsParams.TIRE_STIFFNESS_FRONT * tire_stiffness_factor) * mass / VehicleDynamicsParams.MASS * \
+ (center_to_rear / wheelbase) / (VehicleDynamicsParams.CENTER_TO_REAR / VehicleDynamicsParams.WHEELBASE)
+
+ tire_stiffness_rear = (VehicleDynamicsParams.TIRE_STIFFNESS_REAR * tire_stiffness_factor) * mass / VehicleDynamicsParams.MASS * \
+ (center_to_front / wheelbase) / (VehicleDynamicsParams.CENTER_TO_FRONT / VehicleDynamicsParams.WHEELBASE)
+
+ return tire_stiffness_front, tire_stiffness_rear
+
+
+DbcDict = dict[StrEnum, str]
+
+
+class Bus(StrEnum):
+ pt = auto()
+ aux = auto()
+ cam = auto()
+ radar = auto()
+ adas = auto()
+ alt = auto()
+ body = auto()
+ chassis = auto()
+ loopback = auto()
+ main = auto()
+ party = auto()
+ ap_party = auto()
+
+
+def rate_limit(new_value, last_value, dw_step, up_step):
+ return float(np.clip(new_value, last_value + dw_step, last_value + up_step))
+
+
+def make_tester_present_msg(addr, bus, subaddr=None, suppress_response=False):
+ dat = [0x02, uds.SERVICE_TYPE.TESTER_PRESENT]
+ if subaddr is not None:
+ dat.insert(0, subaddr)
+ dat.append(0x80 if suppress_response else 0x0) # sub-function
+
+ dat.extend([0x0] * (8 - len(dat)))
+ return CanData(addr, bytes(dat), bus)
+
+
+def get_safety_config(safety_model: structs.CarParams.SafetyModel, safety_param: int | None = None) -> structs.CarParams.SafetyConfig:
+ ret = structs.CarParams.SafetyConfig()
+ ret.safetyModel = safety_model
+ if safety_param is not None:
+ ret.safetyParam = safety_param
+ return ret
+
+
+class CanBusBase:
+ offset: int
+
+ def __init__(self, CP, fingerprint: dict[int, dict[int, int]] | None) -> None:
+ if CP is None:
+ assert fingerprint is not None
+ num = max([k for k, v in fingerprint.items() if len(v)], default=0) // 4 + 1
+ else:
+ num = len(CP.safetyConfigs)
+ self.offset = 4 * (num - 1)
+
+
+class CanSignalRateCalculator:
+ """
+ Calculates the instantaneous rate of a CAN signal by using the counter
+ variable and the known frequency of the CAN message that contains it.
+ """
+ def __init__(self, frequency: int):
+ self.frequency = frequency
+ self.previous_value = 0
+ self.rate = 0
+
+ def update(self, current_value: float, updated: bool):
+ if updated:
+ self.rate = (current_value - self.previous_value) * self.frequency
+
+ self.previous_value = current_value
+
+ return self.rate
+
+
+@dataclass(frozen=True, kw_only=True)
+class CarSpecs:
+ mass: float # kg, curb weight
+ wheelbase: float # meters
+ steerRatio: float
+ centerToFrontRatio: float = 0.5
+ minSteerSpeed: float = 0.0 # m/s
+ minEnableSpeed: float = -1.0 # m/s
+ tireStiffnessFactor: float = 1.0
+
+ def override(self, **kwargs):
+ return replace(self, **kwargs)
+
+
+class Freezable:
+ _frozen: bool = False
+
+ def freeze(self):
+ if not self._frozen:
+ self._frozen = True
+
+ def __setattr__(self, *args, **kwargs):
+ if self._frozen:
+ raise Exception("cannot modify frozen object")
+ super().__setattr__(*args, **kwargs)
+
+
+@dataclass(order=True)
+class PlatformConfigBase(Freezable):
+ car_docs: list[CarDocs] | list[ExtraCarDocs]
+ specs: CarSpecs
+
+ dbc_dict: DbcDict
+
+ flags: int = 0
+ iq_flags: int = 0
+
+ platform_str: str | None = None
+
+ origin_car_docs: list[CarDocs] | list[ExtraCarDocs] = field(init=False)
+
+ def __hash__(self) -> int:
+ return hash(self.platform_str)
+
+ def override(self, **kwargs):
+ return replace(self, **kwargs)
+
+ def init(self):
+ pass
+
+ def __post_init__(self):
+ self.origin_car_docs = self.car_docs
+ self.init()
+
+ def get_all_docs(self):
+ return self.origin_car_docs
+
+
+@dataclass(order=True)
+class PlatformConfig(PlatformConfigBase):
+ car_docs: list[CarDocs]
+ specs: CarSpecs
+ dbc_dict: DbcDict
+
+
+@dataclass(order=True)
+class ExtraPlatformConfig(PlatformConfigBase):
+ car_docs: list[ExtraCarDocs]
+ specs: CarSpecs = CarSpecs(mass=0., wheelbase=0., steerRatio=0.)
+ dbc_dict: DbcDict = field(default_factory=lambda: dict())
+
+
+class PlatformsType(EnumType):
+ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **kwds):
+ for key in classdict._member_names.keys():
+ cfg: PlatformConfig = classdict[key]
+ cfg.platform_str = key
+ cfg.freeze()
+ return super().__new__(metacls, cls, bases, classdict, boundary=boundary, _simple=_simple, **kwds)
+
+
+class Platforms(str, ReprEnum, metaclass=PlatformsType):
+ config: PlatformConfigBase
+
+ def __new__(cls, platform_config: PlatformConfig):
+ member = str.__new__(cls, platform_config.platform_str)
+ member.config = platform_config
+ member._value_ = platform_config.platform_str
+ return member
+
+ def __repr__(self):
+ return f"<{self.__class__.__name__}.{self.name}>"
+
+ @classmethod
+ def create_dbc_map(cls) -> dict[str, DbcDict]:
+ return {p: p.config.dbc_dict for p in cls}
+
+ @classmethod
+ def with_flags(cls, flags: IntFlag) -> set['Platforms']:
+ return {p for p in cls if p.config.flags & flags}
+
+ @classmethod
+ def with_iq_flags(cls, iq_flags: IntFlag) -> set['Platforms']:
+ return {p for p in cls if p.config.iq_flags & iq_flags}
diff --git a/iqdbc_repo/iqdbc/car/body/__init__.py b/iqdbc_repo/iqdbc/car/body/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/body/bodycan.py b/iqdbc_repo/iqdbc/car/body/bodycan.py
new file mode 100644
index 000000000..2a7ee8996
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/body/bodycan.py
@@ -0,0 +1,17 @@
+from iqdbc.car.crc import CRC8BODY
+
+
+def create_control(packer, torque_l, torque_r):
+ values = {
+ "TORQUE_L": torque_l,
+ "TORQUE_R": torque_r,
+ }
+
+ return packer.make_can_msg("TORQUE_CMD", 0, values)
+
+
+def body_checksum(address: int, sig, d: bytearray) -> int:
+ crc = 0xFF
+ for i in range(len(d) - 2, -1, -1):
+ crc = CRC8BODY[crc ^ d[i]]
+ return crc
diff --git a/iqdbc_repo/iqdbc/car/body/carcontroller.py b/iqdbc_repo/iqdbc/car/body/carcontroller.py
new file mode 100644
index 000000000..7b222028d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/body/carcontroller.py
@@ -0,0 +1,82 @@
+import numpy as np
+
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, DT_CTRL
+from iqdbc.car.common.pid import PIDController
+from iqdbc.car.body import bodycan
+from iqdbc.car.body.values import SPEED_FROM_RPM
+from iqdbc.car.interfaces import CarControllerBase
+
+MAX_TORQUE = 500
+MAX_TORQUE_RATE = 50
+MAX_ANGLE_ERROR = np.radians(7)
+MAX_POS_INTEGRATOR = 0.2 # meters
+MAX_TURN_INTEGRATOR = 0.1 # meters
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ super().__init__(dbc_names, CP, CP_IQ)
+ 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.torque_r_filtered = 0.
+ self.torque_l_filtered = 0.
+
+ @staticmethod
+ def deadband_filter(torque, deadband):
+ if torque > 0:
+ torque += deadband
+ else:
+ torque -= deadband
+ return torque
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+
+ torque_l = 0
+ torque_r = 0
+
+ if CC.enabled:
+ # 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_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl + CS.out.wheelSpeeds.fr) / 2.
+ speed_error = speed_desired - speed_measured
+
+ torque = self.wheeled_speed_pid.update(speed_error, freeze_integrator=False)
+
+ speed_diff_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl - CS.out.wheelSpeeds.fr)
+ turn_error = speed_diff_measured - speed_diff_desired
+ freeze_integrator = ((turn_error < 0 and self.turn_pid.error_integral <= -MAX_TURN_INTEGRATOR) or
+ (turn_error > 0 and self.turn_pid.error_integral >= MAX_TURN_INTEGRATOR))
+ torque_diff = self.turn_pid.update(turn_error, freeze_integrator=freeze_integrator)
+
+ # Combine 2 PIDs outputs
+ torque_r = torque + torque_diff
+ torque_l = torque - torque_diff
+
+ # Torque rate limits
+ self.torque_r_filtered = np.clip(self.deadband_filter(torque_r, 10),
+ self.torque_r_filtered - MAX_TORQUE_RATE,
+ self.torque_r_filtered + MAX_TORQUE_RATE)
+ self.torque_l_filtered = np.clip(self.deadband_filter(torque_l, 10),
+ self.torque_l_filtered - MAX_TORQUE_RATE,
+ self.torque_l_filtered + MAX_TORQUE_RATE)
+ torque_r = int(np.clip(self.torque_r_filtered, -MAX_TORQUE, MAX_TORQUE))
+ torque_l = int(np.clip(self.torque_l_filtered, -MAX_TORQUE, MAX_TORQUE))
+
+ can_sends = []
+ can_sends.append(bodycan.create_control(self.packer, torque_l, torque_r))
+
+ new_actuators = CC.actuators.as_builder()
+ new_actuators.accel = torque_l
+ new_actuators.torque = torque_r
+ new_actuators.torqueOutputCan = torque_r
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/body/carstate.py b/iqdbc_repo/iqdbc/car/body/carstate.py
new file mode 100644
index 000000000..f929b22f6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/body/carstate.py
@@ -0,0 +1,36 @@
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.body.values import DBC
+
+
+class CarState(CarStateBase):
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.main]
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ ret.wheelSpeeds.fl = cp.vl['MOTORS_DATA']['SPEED_L']
+ ret.wheelSpeeds.fr = cp.vl['MOTORS_DATA']['SPEED_R']
+
+ ret.vEgoRaw = ((ret.wheelSpeeds.fl + ret.wheelSpeeds.fr) / 2.) * self.CP.wheelSpeedFactor
+
+ ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
+ ret.standstill = False
+
+ ret.steerFaultPermanent = any([cp.vl['VAR_VALUES']['MOTOR_ERR_L'], cp.vl['VAR_VALUES']['MOTOR_ERR_R'],
+ cp.vl['VAR_VALUES']['FAULT']])
+
+ ret.charging = cp.vl["BODY_DATA"]["CHARGER_CONNECTED"] == 1
+ ret.fuelGauge = cp.vl["BODY_DATA"]["BATT_PERCENTAGE"] / 100
+
+ # irrelevant for non-car
+ ret.gearShifter = structs.CarState.GearShifter.drive
+ ret.cruiseState.enabled = True
+ ret.cruiseState.available = True
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {Bus.main: CANParser(DBC[CP.carFingerprint][Bus.main], [], 0)}
diff --git a/iqdbc_repo/iqdbc/car/body/fingerprints.py b/iqdbc_repo/iqdbc/car/body/fingerprints.py
new file mode 100644
index 000000000..a87cb7e53
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/body/fingerprints.py
@@ -0,0 +1,28 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.body.values import CAR
+
+Ecu = CarParams.Ecu
+
+# debug ecu fw version is the git hash of the firmware
+
+
+FINGERPRINTS = {
+ CAR.COMMA_BODY: [{
+ 513: 8, 516: 8, 514: 3, 515: 4
+ }],
+}
+
+FW_VERSIONS = {
+ CAR.COMMA_BODY: {
+ (Ecu.engine, 0x720, None): [
+ b'0.0.01',
+ b'0.3.00a',
+ b'02/27/2022',
+ ],
+ (Ecu.debug, 0x721, None): [
+ b'166bd860',
+ b'dc780f85',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/body/interface.py b/iqdbc_repo/iqdbc/car/body/interface.py
new file mode 100644
index 000000000..1510bb0b5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/body/interface.py
@@ -0,0 +1,30 @@
+import math
+from iqdbc.car import get_safety_config, structs
+from iqdbc.car.body.carcontroller import CarController
+from iqdbc.car.body.carstate import CarState
+from iqdbc.car.body.values import SPEED_FROM_RPM
+from iqdbc.car.interfaces import CarInterfaceBase
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.notCar = True
+ ret.brand = "body"
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.body)]
+
+ ret.minSteerSpeed = -math.inf
+ ret.maxLateralAccel = math.inf # TODO: set to a reasonable value
+ ret.steerLimitTimer = 1.0
+ ret.steerActuatorDelay = 0.
+
+ ret.wheelSpeedFactor = SPEED_FROM_RPM
+
+ ret.radarUnavailable = True
+ ret.openpilotLongitudinalControl = True
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/body/values.py b/iqdbc_repo/iqdbc/car/body/values.py
new file mode 100644
index 000000000..2a410b929
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/body/values.py
@@ -0,0 +1,40 @@
+from iqdbc.car import Bus, CarSpecs, PlatformConfig, Platforms
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarDocs
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
+
+Ecu = CarParams.Ecu
+
+SPEED_FROM_RPM = 0.008587
+
+
+class CarControllerParams:
+ ANGLE_DELTA_BP = [0., 5., 15.]
+ ANGLE_DELTA_V = [5., .8, .15] # windup limit
+ ANGLE_DELTA_VU = [5., 3.5, 0.4] # unwind limit
+ LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower
+ STEER_THRESHOLD = 1.0
+
+ def __init__(self, CP):
+ pass
+
+
+class CAR(Platforms):
+ COMMA_BODY = PlatformConfig(
+ [CarDocs("comma body", package="All", video="https://youtu.be/VT-i3yRsX2s?t=2736")],
+ CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44),
+ {Bus.main: 'comma_body'},
+ )
+
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE],
+ bus=0,
+ ),
+ ],
+)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/can_definitions.py b/iqdbc_repo/iqdbc/car/can_definitions.py
new file mode 100644
index 000000000..2dba7f26a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/can_definitions.py
@@ -0,0 +1,15 @@
+from collections.abc import Callable
+from typing import NamedTuple, Protocol
+
+
+class CanData(NamedTuple):
+ address: int
+ dat: bytes
+ src: int
+
+
+CanSendCallable = Callable[[list[CanData]], None]
+
+
+class CanRecvCallable(Protocol):
+ def __call__(self, wait_for_one: bool = False) -> list[list[CanData]]: ...
diff --git a/iqdbc_repo/iqdbc/car/car.capnp b/iqdbc_repo/iqdbc/car/car.capnp
new file mode 100644
index 000000000..48a71b75e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/car.capnp
@@ -0,0 +1,839 @@
+using Cxx = import "./include/c++.capnp";
+$Cxx.namespace("cereal");
+
+@0x8e2af1e708af8b8d;
+
+# ******* events causing controls state machine transition *******
+
+# IMPORTANT: This struct is to not be modified so old logs can be parsed
+struct OnroadEventDEPRECATED @0x9b1657f34caf3ad3 {
+ name @0 :EventName;
+
+ # event types
+ enable @1 :Bool;
+ noEntry @2 :Bool;
+ warning @3 :Bool; # alerts presented only when enabled or soft disabling
+ userDisable @4 :Bool;
+ softDisable @5 :Bool;
+ immediateDisable @6 :Bool;
+ preEnable @7 :Bool;
+ permanent @8 :Bool; # alerts presented regardless of openpilot state
+ overrideLateral @10 :Bool;
+ overrideLongitudinal @9 :Bool;
+
+ enum EventName @0xbaa8c5d505f727de {
+ canError @0;
+ steerUnavailable @1;
+ wrongGear @4;
+ doorOpen @5;
+ seatbeltNotLatched @6;
+ espDisabled @7;
+ wrongCarMode @8;
+ steerTempUnavailable @9;
+ reverseGear @10;
+ buttonCancel @11;
+ buttonEnable @12;
+ pedalPressed @13; # exits active state
+ preEnableStandstill @73; # added during pre-enable state with brake
+ gasPressedOverride @108; # added when user is pressing gas with no disengage on gas
+ steerOverride @114;
+ cruiseDisabled @14;
+ speedTooLow @17;
+ outOfSpace @18;
+ overheat @19;
+ calibrationIncomplete @20;
+ calibrationInvalid @21;
+ calibrationRecalibrating @117;
+ controlsMismatch @22;
+ pcmEnable @23;
+ pcmDisable @24;
+ radarFault @26;
+ brakeHold @28;
+ parkBrake @29;
+ manualRestart @30;
+ joystickDebug @34;
+ longitudinalManeuver @124;
+ steerTempUnavailableSilent @35;
+ resumeRequired @36;
+ preDriverDistracted @37;
+ promptDriverDistracted @38;
+ driverDistracted @39;
+ preDriverUnresponsive @43;
+ promptDriverUnresponsive @44;
+ driverUnresponsive @45;
+ belowSteerSpeed @46;
+ lowBattery @48;
+ accFaulted @51;
+ sensorDataInvalid @52;
+ commIssue @53;
+ commIssueAvgFreq @109;
+ tooDistracted @54;
+ posenetInvalid @55;
+ preLaneChangeLeft @57;
+ preLaneChangeRight @58;
+ laneChange @59;
+ lowMemory @63;
+ stockAeb @64;
+ ldw @65;
+ carUnrecognized @66;
+ invalidLkasSetting @69;
+ speedTooHigh @70;
+ laneChangeBlocked @71;
+ relayMalfunction @72;
+ stockFcw @74;
+ startup @75;
+ startupNoCar @76;
+ startupNoControl @77;
+ startupNoSecOcKey @125;
+ startupMaster @78;
+ fcw @79;
+ steerSaturated @80;
+ belowEngageSpeed @84;
+ noGps @85;
+ wrongCruiseMode @87;
+ modeldLagging @89;
+ deviceFalling @90;
+ fanMalfunction @91;
+ cameraMalfunction @92;
+ cameraFrameRate @110;
+ processNotRunning @95;
+ dashcamMode @96;
+ selfdriveInitializing @98;
+ usbError @99;
+ cruiseMismatch @106;
+ canBusMissing @111;
+ selfdrivedLagging @112;
+ resumeBlocked @113;
+ steerTimeLimit @115;
+ vehicleSensorsInvalid @116;
+ locationdTemporaryError @103;
+ locationdPermanentError @118;
+ paramsdTemporaryError @50;
+ paramsdPermanentError @119;
+ actuatorsApiUnavailable @120;
+ espActive @121;
+ personalityChanged @122;
+ aeb @123;
+
+ radarCanErrorDEPRECATED @15;
+ communityFeatureDisallowedDEPRECATED @62;
+ radarCommIssueDEPRECATED @67;
+ driverMonitorLowAccDEPRECATED @68;
+ gasUnavailableDEPRECATED @3;
+ dataNeededDEPRECATED @16;
+ modelCommIssueDEPRECATED @27;
+ ipasOverrideDEPRECATED @33;
+ geofenceDEPRECATED @40;
+ driverMonitorOnDEPRECATED @41;
+ driverMonitorOffDEPRECATED @42;
+ calibrationProgressDEPRECATED @47;
+ invalidGiraffeHondaDEPRECATED @49;
+ invalidGiraffeToyotaDEPRECATED @60;
+ internetConnectivityNeededDEPRECATED @61;
+ whitePandaUnsupportedDEPRECATED @81;
+ commIssueWarningDEPRECATED @83;
+ focusRecoverActiveDEPRECATED @86;
+ neosUpdateRequiredDEPRECATED @88;
+ modelLagWarningDEPRECATED @93;
+ startupOneplusDEPRECATED @82;
+ startupFuzzyFingerprintDEPRECATED @97;
+ noTargetDEPRECATED @25;
+ brakeUnavailableDEPRECATED @2;
+ plannerErrorDEPRECATED @32;
+ gpsMalfunctionDEPRECATED @94;
+ roadCameraErrorDEPRECATED @100;
+ driverCameraErrorDEPRECATED @101;
+ wideRoadCameraErrorDEPRECATED @102;
+ highCpuUsageDEPRECATED @105;
+ startupNoFwDEPRECATED @104;
+ lowSpeedLockoutDEPRECATED @31;
+ lkasDisabledDEPRECATED @107;
+ soundsUnavailableDEPRECATED @56;
+ }
+}
+
+struct CarState {
+ # CAN health
+ canValid @26 :Bool; # invalid counter/checksums
+ canTimeout @40 :Bool; # CAN bus dropped out
+ canErrorCounter @48 :UInt32;
+
+ # process meta
+ cumLagMs @50 :Float32;
+
+ # car speed
+ vEgo @1 :Float32; # best estimate of speed
+ aEgo @16 :Float32; # best estimate of aCAN cceleration
+ vEgoRaw @17 :Float32; # unfiltered speed from wheel speed sensors
+ vEgoCluster @44 :Float32; # best estimate of speed shown on car's instrument cluster, used for UI
+
+ vCruise @53 :Float32; # actual set speed
+ vCruiseCluster @54 :Float32; # set speed to display in the UI
+
+ yawRate @22 :Float32; # best estimate of yaw rate
+ standstill @18 :Bool;
+ wheelSpeeds @2 :WheelSpeeds;
+
+ gasPressed @4 :Bool; # this is user pedal only
+
+ # brake pedal, 0.0-1.0
+ brake @5 :Float32; # this is user pedal only
+ brakePressed @6 :Bool; # this is user pedal only
+ regenBraking @45 :Bool; # this is user pedal only
+ parkingBrake @39 :Bool;
+ brakeHoldActive @38 :Bool;
+
+ # steering wheel
+ steeringAngleDeg @7 :Float32;
+ steeringAngleOffsetDeg @37 :Float32; # Offset between sensors in case there multiple
+ steeringRateDeg @15 :Float32; # optional
+ steeringTorque @8 :Float32; # Native CAN units, only needed on cars where it's used for control
+ steeringTorqueEps @27 :Float32; # Native CAN units, only needed on cars where it's used for control
+ steeringPressed @9 :Bool; # is the user overring the steering wheel?
+ steeringDisengage @58 :Bool; # more force than steeringPressed, disengages for applicable brands
+ steerFaultTemporary @35 :Bool;
+ steerFaultPermanent @36 :Bool;
+ steeringCurvature @64 :Float32;
+
+ invalidLkasSetting @55 :Bool; # stock LKAS is incorrectly configured (i.e. on or off)
+ stockAeb @30 :Bool;
+ stockLkas @59 :Bool;
+ stockFcw @31 :Bool;
+ espDisabled @32 :Bool;
+ accFaulted @42 :Bool;
+ carFaultedNonCritical @47 :Bool; # some ECU is faulted, but car remains controllable
+ espActive @51 :Bool;
+ vehicleSensorsInvalid @52 :Bool; # invalid steering angle readings, etc.
+ lowSpeedAlert @56 :Bool; # lost steering control due to a dynamic min steering speed
+ blockPcmEnable @60 :Bool; # whether to allow PCM to enable this frame
+ lateralAvailable @61 :Bool; # lateral control is available even if cruise is faulted
+ cruiseFaultLateralMode @62 :Bool; # cruise is faulted but lateral control is still active
+ carNotReady @95 :Bool; # car is transiently refusing engagement, not a fault
+ radarDisableFailed @66 :Bool;
+ # Physical vehicle odometer in kilometers. Zero means unavailable on this platform.
+ odometer @67 :Float64;
+
+ # cruise state
+ cruiseState @10 :CruiseState;
+
+ # gear
+ gearShifter @14 :GearShifter;
+
+ # button presses
+ buttonEvents @11 :List(ButtonEvent);
+ buttonEnable @57 :Bool; # user is requesting enable, usually one frame. set if pcmCruise=False
+ leftBlinker @20 :Bool;
+ rightBlinker @21 :Bool;
+ genericToggle @23 :Bool;
+
+ # lock info
+ doorOpen @24 :Bool; # ideally includes all doors
+ seatbeltUnlatched @25 :Bool; # driver seatbelt
+
+ # blindspot sensors
+ leftBlindspot @33 :Bool; # Is there something blocking the left lane change
+ rightBlindspot @34 :Bool; # Is there something blocking the right lane change
+
+ fuelGauge @41 :Float32; # battery or fuel tank level from [0.0, 1.0]
+ charging @43 :Bool;
+ fuelTankLevelL @63 :Float32; # raw fuel tank level in liters (konn3kt: VW PQ Kombi_1.Tankinhalt)
+ batteryDetails @65 :BatteryDetails;
+
+ # carrotpilot HKG extension state
+ vCluRatio @68 :Float32;
+ logCarrot @69 :Text;
+ softHoldActive @70 :Int16;
+ activateCruise @71 :Int16;
+ latEnabled @72 :Bool;
+ pcmCruiseGap @73 :Int16;
+ speedLimit @74 :Float32;
+ speedLimitDistance @75 :Float32;
+ gearStep @76 :Int16;
+ tpms @77 :Tpms;
+ useLaneLineSpeed @78 :Float32;
+ leftLatDist @79 :Float32;
+ rightLatDist @80 :Float32;
+ leftLongDist @81 :Float32;
+ rightLongDist @82 :Float32;
+ carrotCruise @83 :Int16;
+ leftLaneLine @84 :Int16;
+ rightLaneLine @85 :Int16;
+ datetime @86 :UInt64;
+ leftRearLongDist @87 :Float32;
+ rightRearLongDist @88 :Float32;
+ leftRearLatDist @89 :Float32;
+ rightRearLatDist @90 :Float32;
+ trailerConnected @91 :Bool;
+ ureaGauge @92 :Float32;
+ evModeActive @93 :Bool;
+ evModeValid @94 :Bool;
+
+ struct Tpms {
+ fl @0 :Float32;
+ fr @1 :Float32;
+ rl @2 :Float32;
+ rr @3 :Float32;
+ }
+
+ struct BatteryDetails {
+ capacity @0 :Float32;
+ charge @1 :Float32;
+ soc @2 :Float32;
+ temperature @3 :Float32;
+ heaterActive @4 :Bool;
+ voltage @5 :Float32;
+ current @6 :Float32;
+ power @7 :Float32;
+ chargingMode @8 :UInt8;
+ }
+
+ struct WheelSpeeds {
+ # optional wheel speeds
+ fl @0 :Float32;
+ fr @1 :Float32;
+ rl @2 :Float32;
+ rr @3 :Float32;
+ }
+
+ struct CruiseState {
+ enabled @0 :Bool;
+ speed @1 :Float32;
+ speedCluster @6 :Float32; # Set speed as shown on instrument cluster
+ available @2 :Bool;
+ standstill @4 :Bool;
+ nonAdaptive @5 :Bool;
+ speedLimit @7 :Float32;
+ speedLimitPredicative @8 :Float32;
+
+ speedOffsetDEPRECATED @3 :Float32;
+ }
+
+ enum GearShifter {
+ unknown @0;
+ park @1;
+ drive @2;
+ neutral @3;
+ reverse @4;
+ sport @5;
+ low @6;
+ brake @7;
+ eco @8;
+ manumatic @9;
+ }
+
+ # send on change
+ struct ButtonEvent {
+ pressed @0 :Bool;
+ type @1 :Type;
+
+ enum Type {
+ unknown @0;
+ leftBlinker @1;
+ rightBlinker @2;
+ accelCruise @3;
+ decelCruise @4;
+ cancel @5;
+ lkas @6;
+ altButton2 @7;
+ mainCruise @8;
+ setCruise @9;
+ resumeCruise @10;
+ gapAdjustCruise @11;
+ lfaButton @12;
+ paddleLeft @13;
+ paddleRight @14;
+ }
+ }
+
+ # deprecated
+ errorsDEPRECATED @0 :List(OnroadEventDEPRECATED.EventName);
+ gas @3 :Float32; # this is user pedal only
+ brakeLights @19 :Bool;
+ steeringRateLimitedDEPRECATED @29 :Bool;
+ canMonoTimesDEPRECATED @12: List(UInt64);
+ canRcvTimeoutDEPRECATED @49 :Bool;
+ eventsDEPRECATED @13 :List(OnroadEventDEPRECATED);
+ clutchPressedDEPRECATED @28 :Bool;
+ engineRpmDEPRECATED @46 :Float32;
+}
+
+# ******* radar state @ 20hz *******
+
+struct RadarData @0x888ad6581cf0aacb {
+ errors @3 :Error;
+ points @1 :List(RadarPoint);
+
+ struct Error {
+ canError @0 :Bool;
+ radarFault @1 :Bool;
+ wrongConfig @2 :Bool;
+ radarUnavailableTemporary @3 :Bool; # radar data is temporarily unavailable due to conditions the car sets
+ }
+
+ # similar to LiveTracks
+ # is one timestamp valid for all? I think so
+ struct RadarPoint {
+ trackId @0 :UInt64; # no trackId reuse
+
+ # these 3 are the minimum required
+ dRel @1 :Float32; # m from the front bumper of the car
+ yRel @2 :Float32; # m
+ vRel @3 :Float32; # m/s
+
+ # these are optional and valid if they are not NaN
+ aRel @4 :Float32; # m/s^2
+ yvRel @5 :Float32; # m/s
+
+ # some radars flag measurements VS estimates
+ measured @6 :Bool;
+
+ vLead @7 :Float32; # m/s
+ aLead @8 :Float32; # m/s^2
+ jLead @9 :Float32; # m/s^3
+ radarSource @10 :RadarSource;
+
+ enum RadarSource {
+ frontRadar @0;
+ scc @1;
+ corner235 @2;
+ corner180 @3;
+ }
+ }
+
+ enum ErrorDEPRECATED {
+ canError @0;
+ fault @1;
+ wrongConfig @2;
+ }
+
+ # deprecated
+ canMonoTimesDEPRECATED @2 :List(UInt64);
+ errorsDEPRECATED @0 :List(ErrorDEPRECATED);
+}
+
+# ******* car controls @ 100hz *******
+
+struct CarControl {
+ # must be true for any actuator commands to work
+ enabled @0 :Bool;
+ latActive @11: Bool;
+ longActive @12: Bool;
+
+ # Final actuator commands
+ actuators @6 :Actuators;
+
+ # Blinker controls
+ leftBlinker @15: Bool;
+ rightBlinker @16: Bool;
+
+ orientationNED @13 :List(Float32);
+ angularVelocity @14 :List(Float32);
+ currentCurvature @17 :Float32; # From vehicle model
+ curvatureControllerActive @18: Bool;
+ rollCompensation @19 :Float32;
+ steerLimited @20: Bool;
+ forceRHDForBSM @21: Bool;
+ longComfortMode @22: Bool;
+
+ cruiseControl @4 :CruiseControl;
+ hudControl @5 :HUDControl;
+
+ struct Actuators {
+ # lateral commands, mutually exclusive
+ torque @2: Float32; # [0.0, 1.0]
+ steeringAngleDeg @3: Float32;
+ curvature @7: Float32;
+
+ # longitudinal commands
+ accel @4: Float32; # m/s^2
+ longControlState @5: LongControlState;
+
+ # 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
+ speed @6: Float32; # m/s
+ jerk @9: Float32; # m/s^3
+ aTarget @10: Float32; # m/s^2
+
+ enum LongControlState @0xe40f3a917d908282{
+ off @0;
+ pid @1;
+ stopping @2;
+ starting @3;
+ }
+ }
+
+ struct CruiseControl {
+ cancel @0: Bool;
+ resume @1: Bool;
+ override @4: Bool;
+ speedLimit @5: Bool;
+ speedLimitPredicative @6: Bool;
+ speedLimitPredReactToSL @7: Bool;
+ speedLimitPredReactToCurves @8: Bool;
+ speedOverrideDEPRECATED @2: Float32;
+ accelOverrideDEPRECATED @3: Float32;
+ }
+
+ struct HUDControl {
+ speedVisible @0: Bool;
+ setSpeed @1: Float32;
+ lanesVisible @2: Bool;
+ leadVisible @3: Bool;
+ visualAlert @4: VisualAlert;
+ rightLaneVisible @6: Bool;
+ leftLaneVisible @7: Bool;
+ rightLaneDepart @8: Bool;
+ leftLaneDepart @9: Bool;
+ leadDistanceBars @10: Int8; # 1-3: 1 is closest, 3 is farthest. some ports may utilize 2-4 bars instead
+ leadFollowTime @11: Float32;
+ leadDistance @12: Float32;
+ driverUnresponsive @13: Bool;
+ activeCarrot @14: Int16;
+ leadRelSpeed @15: Float32;
+ leadDPath @16: Float32;
+ leadRadar @17: Int16;
+ modelDesire @18: Int16;
+ atcDistance @19: Float32;
+
+ # not used with the dash, TODO: separate structs for dash UI and device UI
+ audibleAlert @5: AudibleAlert;
+
+ enum VisualAlert {
+ # these are the choices from the Honda
+ # map as good as you can for your car
+ none @0;
+ fcw @1;
+ steerRequired @2;
+ brakePressed @3;
+ wrongGear @4;
+ seatbeltUnbuckled @5;
+ speedTooHigh @6;
+ ldw @7;
+ }
+
+ enum AudibleAlert {
+ none @0;
+
+ engage @1;
+ disengage @2;
+ refuse @3;
+
+ warningSoft @4;
+ warningImmediate @5;
+
+ prompt @6;
+ promptRepeat @7;
+ promptDistracted @8;
+ preAlert @9;
+ }
+ }
+
+ gasDEPRECATED @1 :Float32;
+ brakeDEPRECATED @2 :Float32;
+ steeringTorqueDEPRECATED @3 :Float32;
+ activeDEPRECATED @7 :Bool;
+ rollDEPRECATED @8 :Float32;
+ pitchDEPRECATED @9 :Float32;
+ actuatorsOutputDEPRECATED @10 :Actuators;
+}
+
+struct CarOutput {
+ # Any car specific rate limits or quirks applied by
+ # the CarController are reflected in actuatorsOutput
+ # and matches what is sent to the car
+ actuatorsOutput @0 :CarControl.Actuators;
+}
+
+# ****** car param ******
+
+struct CarParams {
+ brand @0 :Text; # Designates which group a platform falls under. Each folder in iqdbc/car is assigned one brand string
+ carFingerprint @1 :Text;
+ fuzzyFingerprint @55 :Bool;
+
+ notCar @66 :Bool; # flag for non-car robotics platforms
+
+ pcmCruise @3 :Bool; # is openpilot's state tied to the PCM's cruise state?
+ enableBsm @56 :Bool; # blind spot monitoring
+ flags @64 :UInt32; # flags for car specific quirks
+ alphaLongitudinalAvailable @71 :Bool;
+ extFlags @79 :UInt32; # carrotpilot HKG extension flags
+
+ minEnableSpeed @7 :Float32;
+ minSteerSpeed @8 :Float32;
+ steerAtStandstill @77 :Bool; # is steering available at standstill? just check if it faults
+ safetyConfigs @62 :List(SafetyConfig);
+ alternativeExperience @65 :Int16; # panda flag for features like no disengage on gas
+
+ # Car docs fields, not used for control
+ maxLateralAccel @68 :Float32;
+ autoResumeSng @69 :Bool; # describes whether car can resume from a stop automatically
+
+ # things about the car in the manual
+ mass @17 :Float32; # [kg] curb weight: all fluids no cargo
+ wheelbase @18 :Float32; # [m] distance from rear axle to front axle
+ centerToFront @19 :Float32; # [m] distance from center of mass to front axle
+ steerRatio @20 :Float32; # [] ratio of steering wheel angle to front wheel angle
+ steerRatioRear @21 :Float32; # [] ratio of steering wheel angle to rear wheel angle (usually 0)
+
+ # things we can derive
+ rotationalInertia @22 :Float32; # [kg*m2] body rotational inertia
+ tireStiffnessFactor @72 :Float32; # scaling factor used in calculating tireStiffness[Front,Rear]
+ tireStiffnessFront @23 :Float32; # [N/rad] front tire coeff of stiff
+ tireStiffnessRear @24 :Float32; # [N/rad] rear tire coeff of stiff
+
+ longitudinalTuning @25 :LongitudinalPIDTuning;
+ lateralParams @48 :LateralParams;
+ lateralTuning :union {
+ pid @26 :LateralPIDTuning;
+ indiDEPRECATED @27 :LateralINDITuning;
+ lqrDEPRECATED @40 :LateralLQRTuning;
+ torque @67 :LateralTorqueTuning;
+ }
+
+ steerLimitAlert @28 :Bool;
+ steerLimitTimer @47 :Float32; # time before steerLimitAlert is issued
+
+ steerControlType @34 :SteerControlType;
+ radarUnavailable @35 :Bool; # True when radar objects aren't visible on CAN or aren't parsed out
+ stopAccel @60 :Float32; # Required acceleration to keep vehicle stationary
+
+ steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds
+ longitudinalActuatorDelay @58 :Float32; # Gas/Brake actuator delay in seconds
+ openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control?
+ carVin @38 :Text; # VIN number queried during fingerprinting
+ dashcamOnly @41: Bool;
+ dashcamOnlyReason @78 :DashcamOnlyReason;
+ passive @73: Bool; # is openpilot in control?
+ transmissionType @43 :TransmissionType;
+ carFw @44 :List(CarFw);
+
+ radarDelay @74 :Float32;
+ fingerprintSource @49: FingerprintSource;
+ networkLocation @50 :NetworkLocation; # Where Panda/C2 is integrated into the car's CAN network
+
+ wheelSpeedFactor @63 :Float32; # Multiplier on wheels speeds to computer actual speeds
+
+ secOcRequired @75 :Bool; # Car requires SecOC message authentication to operate
+ secOcKeyAvailable @76 :Bool; # Stored SecOC key loaded from params
+
+ struct SafetyConfig {
+ safetyModel @0 :SafetyModel;
+ safetyParam @3 :UInt16;
+ safetyParamDEPRECATED @1 :Int16;
+ safetyParam2DEPRECATED @2 :UInt32;
+ }
+
+ struct LateralParams {
+ torqueBP @0 :List(Int32);
+ torqueV @1 :List(Int32);
+ }
+
+ struct LateralPIDTuning {
+ kpBP @0 :List(Float32);
+ kpV @1 :List(Float32);
+ kiBP @2 :List(Float32);
+ kiV @3 :List(Float32);
+ kf @4 :Float32;
+ }
+
+ struct LateralTorqueTuning {
+ friction @3 :Float32;
+ steeringAngleDeadzoneDeg @5 :Float32;
+ latAccelFactor @6 :Float32;
+ latAccelOffset @7 :Float32;
+ useSteeringAngleDEPRECATED @0 :Bool;
+ kpDEPRECATED @1 :Float32;
+ kiDEPRECATED @2 :Float32;
+ kfDEPRECATED @4 :Float32;
+ kdDEPRECATED @8 : Float32;
+ }
+
+ struct LongitudinalPIDTuning {
+ kpBP @0 :List(Float32);
+ kpV @1 :List(Float32);
+ kiBP @2 :List(Float32);
+ kiV @3 :List(Float32);
+ kf @6 :Float32;
+ deadzoneBPDEPRECATED @4 :List(Float32);
+ deadzoneVDEPRECATED @5 :List(Float32);
+ }
+
+ struct LateralINDITuning {
+ outerLoopGainBP @4 :List(Float32);
+ outerLoopGainV @5 :List(Float32);
+ innerLoopGainBP @6 :List(Float32);
+ innerLoopGainV @7 :List(Float32);
+ timeConstantBP @8 :List(Float32);
+ timeConstantV @9 :List(Float32);
+ actuatorEffectivenessBP @10 :List(Float32);
+ actuatorEffectivenessV @11 :List(Float32);
+
+ outerLoopGainDEPRECATED @0 :Float32;
+ innerLoopGainDEPRECATED @1 :Float32;
+ timeConstantDEPRECATED @2 :Float32;
+ actuatorEffectivenessDEPRECATED @3 :Float32;
+ }
+
+ struct LateralLQRTuning {
+ scale @0 :Float32;
+ ki @1 :Float32;
+ dcGain @2 :Float32;
+
+ # State space system
+ a @3 :List(Float32);
+ b @4 :List(Float32);
+ c @5 :List(Float32);
+
+ k @6 :List(Float32); # LQR gain
+ l @7 :List(Float32); # Kalman gain
+ }
+
+ enum SafetyModel {
+ silent @0;
+ hondaNidec @1;
+ toyota @2;
+ elm327 @3;
+ gm @4;
+ hondaBoschGiraffe @5;
+ ford @6;
+ cadillac @7;
+ hyundai @8;
+ chrysler @9;
+ tesla @10;
+ subaru @11;
+ gmPassive @12;
+ mazda @13;
+ nissan @14;
+ volkswagen @15;
+ toyotaIpas @16;
+ allOutput @17;
+ gmAscm @18;
+ noOutput @19; # like silent but without silent CAN TXs
+ hondaBosch @20;
+ volkswagenPq @21;
+ subaruPreglobal @22; # pre-Global platform
+ hyundaiLegacy @23;
+ hyundaiCommunity @24;
+ volkswagenMlb @25;
+ hongqi @26;
+ body @27;
+ hyundaiCanfd @28;
+ volkswagenMqbEvo @29;
+ chryslerCusw @30;
+ psa @31;
+ fcaGiorgio @32;
+ rivian @33;
+ volkswagenMeb @34;
+ }
+
+ enum SteerControlType {
+ torque @0;
+ angle @1;
+
+ curvatureDEPRECATED @2;
+ }
+
+ enum TransmissionType {
+ unknown @0;
+ automatic @1; # Traditional auto, including DSG
+ manual @2; # True "stick shift" only
+ direct @3; # Electric vehicle or other direct drive
+ cvt @4;
+ }
+
+ enum DashcamOnlyReason {
+ unknown @0;
+ radarDisableEngineOn @1;
+ }
+
+ struct CarFw {
+ ecu @0 :Ecu;
+ fwVersion @1 :Data;
+ address @2 :UInt32;
+ subAddress @3 :UInt8;
+ responseAddress @4 :UInt32;
+ request @5 :List(Data);
+ brand @6 :Text;
+ bus @7 :UInt8;
+ logging @8 :Bool;
+ obdMultiplexing @9 :Bool;
+ }
+
+ enum Ecu {
+ eps @0;
+ abs @1;
+ fwdRadar @2;
+ fwdCamera @3;
+ engine @4;
+ unknown @5;
+ transmission @8; # Transmission Control Module
+ hybrid @18; # hybrid control unit, e.g. Chrysler's HCP, Honda's IMA Control Unit, Toyota's hybrid control computer
+ inverter @25; # inverter for electric engine
+ srs @9; # airbag
+ gateway @10; # can gateway
+ hud @11; # heads up display
+ combinationMeter @12; # instrument cluster
+ electricBrakeBooster @15;
+ shiftByWire @16;
+ adas @19;
+ cornerRadar @21;
+ hvac @20;
+ parkingAdas @7; # parking assist system ECU, e.g. Toyota's IPAS, Hyundai's RSPA, etc.
+ epb @22; # electronic parking brake
+ telematics @23;
+ body @24; # body control module
+
+ # Toyota only
+ dsu @6;
+
+ # Honda only
+ vsa @13; # Vehicle Stability Assist
+ programmedFuelInjection @14;
+
+ debug @17;
+ }
+
+ enum FingerprintSource {
+ can @0;
+ fw @1;
+ fixed @2;
+ }
+
+ enum NetworkLocation {
+ fwdCamera @0; # Standard/default integration at LKAS camera
+ gateway @1; # Integration at vehicle's CAN gateway
+ }
+
+ enableGasInterceptorDEPRECATED @2 :Bool;
+ enableCameraDEPRECATED @4 :Bool;
+ enableApgsDEPRECATED @6 :Bool;
+ steerRateCostDEPRECATED @33 :Float32;
+ isPandaBlackDEPRECATED @39 :Bool;
+ hasStockCameraDEPRECATED @57 :Bool;
+ safetyParamDEPRECATED @10 :Int16;
+ safetyModelDEPRECATED @9 :SafetyModel;
+ safetyModelPassiveDEPRECATED @42 :SafetyModel = silent;
+ minSpeedCanDEPRECATED @51 :Float32;
+ communityFeatureDEPRECATED @46: Bool;
+ startingAccelRateDEPRECATED @53 :Float32;
+ steerMaxBPDEPRECATED @11 :List(Float32);
+ steerMaxVDEPRECATED @12 :List(Float32);
+ gasMaxBPDEPRECATED @13 :List(Float32);
+ gasMaxVDEPRECATED @14 :List(Float32);
+ brakeMaxBPDEPRECATED @15 :List(Float32);
+ brakeMaxVDEPRECATED @16 :List(Float32);
+ directAccelControlDEPRECATED @30 :Bool;
+ maxSteeringAngleDegDEPRECATED @54 :Float32;
+ longitudinalActuatorDelayLowerBoundDEPRECATED @61 :Float32;
+ stoppingControlDEPRECATED @31 :Bool; # Does the car allow full control even at lows speeds when stopping
+ radarTimeStep @45: Float32 = 0.05; # time delta between radar updates, 20Hz is very standard
+ enableDsuDEPRECATED @5 :Bool; # driving support unit
+ vEgoStarting @59 :Float32;
+ startAccel @32 :Float32;
+ startingState @70 :Bool;
+ vEgoStoppingDEPRECATED @29 :Float32;
+ stoppingDecelRateDEPRECATED @52 :Float32;
+}
diff --git a/iqdbc_repo/iqdbc/car/car_helpers.py b/iqdbc_repo/iqdbc/car/car_helpers.py
new file mode 100644
index 000000000..e5d2084dd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/car_helpers.py
@@ -0,0 +1,181 @@
+import os
+import time
+
+from iqdbc.car import gen_empty_fingerprint
+from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable
+from iqdbc.car.carlog import carlog
+from iqdbc.car.structs import CarParams, CarParamsT
+from iqdbc.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars
+from iqdbc.car.fw_versions import ObdCallback, get_fw_versions_ordered, get_present_ecus, match_fw_to_car
+from iqdbc.car.mock.values import CAR as MOCK
+from iqdbc.car.values import BRANDS
+from iqdbc.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN
+
+from iqdbc.lvbs.car.interfaces import apply_iq_car_config as iqpilot_interfaces
+
+FRAME_FINGERPRINT = 100 # 1s
+
+
+def load_interfaces(brand_names):
+ ret = {}
+ for brand_name in brand_names:
+ path = f'iqdbc.car.{brand_name}'
+ CarInterface = __import__(path + '.interface', fromlist=['CarInterface']).CarInterface
+ for model_name in brand_names[brand_name]:
+ ret[model_name] = CarInterface
+ return ret
+
+
+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]
+
+ return brand_names
+
+
+# imports from directory iqdbc/car//
+interface_names = _get_interface_names()
+interfaces = load_interfaces(interface_names)
+
+
+def can_fingerprint(can_recv: CanRecvCallable) -> tuple[str | None, dict[int, dict]]:
+ finger = gen_empty_fingerprint()
+ candidate_cars = {i: all_legacy_fingerprint_cars() for i in [0, 1]} # attempt fingerprint on both bus 0 and 1
+ frame = 0
+ car_fingerprint = None
+ done = False
+
+ while not done:
+ # can_recv(wait_for_one=True) may return zero or multiple packets, so we increment frame for each one we receive
+ can_packets = can_recv(wait_for_one=True)
+ for can_packet in can_packets:
+ for can in can_packet:
+ # The fingerprint dict is generated for all buses, this way the car interface
+ # can use it to detect a (valid) multipanda setup and initialize accordingly
+ if can.src < 128:
+ if can.src not in finger:
+ finger[can.src] = {}
+ finger[can.src][can.address] = len(can.dat)
+
+ for b in candidate_cars:
+ # Ignore extended messages and VIN query response.
+ if can.src == b and can.address < 0x800 and can.address not in (0x7df, 0x7e0, 0x7e8):
+ candidate_cars[b] = eliminate_incompatible_cars(can, candidate_cars[b])
+
+ # if we only have one car choice and the time since we got our first
+ # message has elapsed, exit
+ for b in candidate_cars:
+ if len(candidate_cars[b]) == 1 and frame > FRAME_FINGERPRINT:
+ # fingerprint done
+ car_fingerprint = candidate_cars[b][0]
+
+ # bail if no cars left or we've been waiting for more than 2s
+ failed = (all(len(cc) == 0 for cc in candidate_cars.values()) and frame > FRAME_FINGERPRINT) or frame > 200
+ succeeded = car_fingerprint is not None
+ done = failed or succeeded
+
+ frame += 1
+
+ return car_fingerprint, finger
+
+
+# **** for use live only ****
+def fingerprint(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, num_pandas: int,
+ cached_params: CarParamsT | None,
+ fixed_fingerprint: str | None) -> tuple[str | None, dict, str, list[CarParams.CarFw], CarParams.FingerprintSource, bool]:
+ fixed_fingerprint = fixed_fingerprint or os.environ.get('FINGERPRINT', "")
+ skip_fw_query = os.environ.get('SKIP_FW_QUERY', False) or bool(fixed_fingerprint)
+ disable_fw_cache = os.environ.get('DISABLE_FW_CACHE', False)
+ ecu_rx_addrs = set()
+
+ start_time = time.monotonic()
+ if not skip_fw_query:
+ if cached_params is not None and cached_params.brand != "mock" and len(cached_params.carFw) > 0 and \
+ cached_params.carVin is not VIN_UNKNOWN and not disable_fw_cache:
+ carlog.warning("Using cached CarParams")
+ vin_rx_addr, vin_rx_bus, vin = -1, -1, cached_params.carVin
+ car_fw = list(cached_params.carFw)
+ cached = True
+ else:
+ carlog.warning("Getting VIN & FW versions")
+ # enable OBD multiplexing for VIN query
+ # NOTE: this takes ~0.1s and is relied on to allow sendcan subscriber to connect in time
+ set_obd_multiplexing(True)
+ # VIN query only reliably works through OBDII
+ vin_rx_addr, vin_rx_bus, vin = get_vin(can_recv, can_send, (0, 1))
+ ecu_rx_addrs = get_present_ecus(can_recv, can_send, set_obd_multiplexing, num_pandas=num_pandas)
+ car_fw = get_fw_versions_ordered(can_recv, can_send, set_obd_multiplexing, vin, ecu_rx_addrs, num_pandas=num_pandas)
+ cached = False
+
+ exact_fw_match, fw_candidates = match_fw_to_car(car_fw, vin)
+ else:
+ vin_rx_addr, vin_rx_bus, vin = -1, -1, VIN_UNKNOWN
+ exact_fw_match, fw_candidates, car_fw = True, set(), []
+ cached = False
+
+ if not is_valid_vin(vin):
+ carlog.error({"event": "Malformed VIN", "vin": vin})
+ vin = VIN_UNKNOWN
+ carlog.warning("VIN %s", vin)
+
+ # disable OBD multiplexing for CAN fingerprinting and potential ECU knockouts
+ set_obd_multiplexing(False)
+
+ fw_query_time = time.monotonic() - start_time
+
+ # CAN fingerprint
+ # drain CAN socket so we get the latest messages
+ can_recv()
+ car_fingerprint, finger = can_fingerprint(can_recv)
+
+ exact_match = True
+ source = CarParams.FingerprintSource.can
+
+ # If FW query returns exactly 1 candidate, use it
+ if len(fw_candidates) == 1:
+ car_fingerprint = list(fw_candidates)[0]
+ source = CarParams.FingerprintSource.fw
+ exact_match = exact_fw_match
+
+ if fixed_fingerprint:
+ car_fingerprint = fixed_fingerprint
+ source = CarParams.FingerprintSource.fixed
+
+ carlog.error({"event": "fingerprinted", "car_fingerprint": str(car_fingerprint), "source": source, "fuzzy": not exact_match,
+ "cached": cached, "fw_count": len(car_fw), "ecu_responses": list(ecu_rx_addrs), "vin_rx_addr": vin_rx_addr,
+ "vin_rx_bus": vin_rx_bus, "fingerprints": repr(finger), "fw_query_time": fw_query_time})
+
+ return car_fingerprint, finger, vin, car_fw, source, exact_match
+
+
+def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, alpha_long_allowed: bool,
+ is_release: bool, num_pandas: int = 1, cached_params: CarParamsT | None = None,
+ fixed_fingerprint: str | None = None, init_params_list_iq: list[dict[str, str]] | None = None, is_release_iq: bool = False):
+ candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(can_recv, can_send, set_obd_multiplexing, num_pandas, cached_params,
+ fixed_fingerprint)
+
+ if candidate is None:
+ carlog.error({"event": "car doesn't match any fingerprints", "fingerprints": repr(fingerprints)})
+ candidate = "MOCK"
+
+ CarInterface = interfaces[candidate]
+ CP: CarParams = CarInterface.get_params(candidate, fingerprints, car_fw, alpha_long_allowed, is_release, docs=False)
+ CP.carVin = vin
+ CP.carFw = car_fw
+ CP.fingerprintSource = source
+ CP.fuzzyFingerprint = not exact_match
+ CP_IQ = CarInterface.get_params_iq(CP, candidate, fingerprints, car_fw, alpha_long_allowed, is_release_iq, docs=False)
+
+ iqpilot_interfaces(CarInterface, CP, CP_IQ, init_params_list_iq, can_recv, can_send)
+
+ return interfaces[CP.carFingerprint](CP, CP_IQ)
+
+
+def get_demo_car_params():
+ platform = MOCK.MOCK
+ CarInterface = interfaces[platform]
+ CP = CarInterface.get_non_essential_params(platform)
+ return CP
diff --git a/iqdbc_repo/iqdbc/car/carlog.py b/iqdbc_repo/iqdbc/car/carlog.py
new file mode 100644
index 000000000..5683d2a39
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/carlog.py
@@ -0,0 +1,12 @@
+import os
+import logging
+
+# set up logging
+LOGPRINT = os.environ.get('LOGPRINT', 'INFO').upper()
+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/iqdbc_repo/iqdbc/car/ccp.py b/iqdbc_repo/iqdbc/car/ccp.py
new file mode 100644
index 000000000..577c47685
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ccp.py
@@ -0,0 +1,385 @@
+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
+
+ 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
+
+ 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
+
+ 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
+
+ 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/iqdbc_repo/iqdbc/car/chrysler/__init__.py b/iqdbc_repo/iqdbc/car/chrysler/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py b/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py
new file mode 100644
index 000000000..eda820122
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py
@@ -0,0 +1,96 @@
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, DT_CTRL
+from iqdbc.car.lateral import apply_meas_steer_torque_limits
+from iqdbc.car.chrysler import chryslercan
+from iqdbc.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags, RAM_DT
+from iqdbc.car.interfaces import CarControllerBase
+
+from iqdbc.lvbs.car.chrysler.iq_carcontroller import IQCarController
+from iqdbc.lvbs.car.chrysler.aol import AolCarController
+from iqdbc.lvbs.car.chrysler.iq_values import ChryslerFlagsIQ
+
+
+class CarController(CarControllerBase, AolCarController, IQCarController):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ AolCarController.__init__(self)
+ IQCarController.__init__(self, CP, CP_IQ)
+ self.apply_torque_last = 0
+
+ self.hud_count = 0
+ self.last_lkas_falling_edge = 0
+ self.lkas_control_bit_prev = False
+ self.last_button_frame = 0
+
+ self.packer = CANPacker(dbc_names[Bus.pt])
+ self.params = CarControllerParams(CP)
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ AolCarController.update(self, CC, CC_IQ, CS)
+ can_sends = []
+
+ lkas_active = CC.latActive and self.lkas_control_bit_prev
+
+ # cruise buttons
+ 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
+ if CC.cruiseControl.cancel:
+ self.last_button_frame = self.frame
+ can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, cancel=True))
+
+ # ACC resume from standstill
+ elif CC.cruiseControl.resume:
+ self.last_button_frame = self.frame
+ can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, resume=True))
+
+ # HUD alerts
+ if self.frame % 25 == 0:
+ if CS.lkas_car_model != -1:
+ can_sends.append(chryslercan.create_lkas_hud(self.packer, self.CP, lkas_active, CC.hudControl.visualAlert,
+ self.hud_count, CS.lkas_car_model, CS.auto_high_beam, self.aol))
+ self.hud_count += 1
+
+ # steering
+ if self.frame % self.params.STEER_STEP == 0:
+
+ # TODO: can we make this more sane? why is it different for all the cars?
+ lkas_control_bit = self.lkas_control_bit_prev
+ if self.CP_IQ.flags & ChryslerFlagsIQ.NO_MIN_STEERING_SPEED or self.CP.carFingerprint in RAM_DT:
+ lkas_control_bit = IQCarController.get_lkas_control_bit(self, CS, CC, lkas_control_bit)
+ elif CS.out.vEgo > self.CP.minSteerSpeed:
+ lkas_control_bit = True
+ elif self.CP.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED:
+ if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0):
+ lkas_control_bit = False
+ elif self.CP.carFingerprint in RAM_CARS:
+ if CS.out.vEgo < (self.CP.minSteerSpeed - 0.5):
+ lkas_control_bit = False
+
+ # EPS faults if LKAS re-enables too quickly
+ lkas_control_bit = lkas_control_bit and (self.frame - self.last_lkas_falling_edge > 200)
+
+ if not lkas_control_bit and self.lkas_control_bit_prev:
+ self.last_lkas_falling_edge = self.frame
+ 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)
+ if not lkas_active or not lkas_control_bit:
+ apply_torque = 0
+ self.apply_torque_last = apply_torque
+
+ can_sends.append(chryslercan.create_lkas_command(self.packer, self.CP, int(apply_torque), lkas_control_bit))
+
+ if self.frame % 10 == 0 and self.CP.carFingerprint not in RAM_CARS:
+ can_sends.append(AolCarController.create_lkas_heartbit(self.packer, CS.lkas_heartbit, self.aol))
+
+ 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
+
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/chrysler/carstate.py b/iqdbc_repo/iqdbc/car/chrysler/carstate.py
new file mode 100644
index 000000000..fc0cf4765
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/carstate.py
@@ -0,0 +1,123 @@
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarStateBase
+
+from iqdbc.lvbs.car.chrysler.aol import AolCarState
+from iqdbc.lvbs.car.chrysler.iq_carstate import IQCarState
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+
+class CarState(CarStateBase, AolCarState, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ AolCarState.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ self.CP = CP
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+
+ self.auto_high_beam = 0
+ self.button_counter = 0
+ self.lkas_car_model = -1
+
+ if CP.carFingerprint in RAM_CARS:
+ self.shifter_values = can_define.dv["Transmission_Status"]["Gear_State"]
+ else:
+ self.shifter_values = can_define.dv["GEAR"]["PRNDL"]
+
+ self.distance_button = 0
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ prev_distance_button = self.distance_button
+ self.distance_button = cp.vl["CRUISE_BUTTONS"]["ACC_Distance_Dec"]
+
+ # lock info
+ ret.doorOpen = any([cp.vl["BCM_1"]["DOOR_OPEN_FL"],
+ cp.vl["BCM_1"]["DOOR_OPEN_FR"],
+ cp.vl["BCM_1"]["DOOR_OPEN_RL"],
+ cp.vl["BCM_1"]["DOOR_OPEN_RR"]])
+ ret.seatbeltUnlatched = cp.vl["ORC_1"]["SEATBELT_DRIVER_UNLATCHED"] == 1
+
+ # brake pedal
+ ret.brake = 0
+ ret.brakePressed = cp.vl["ESP_1"]['Brake_Pedal_State'] == 1 # Physical brake pedal switch
+
+ # gas pedal
+ ret.gasPressed = cp.vl["ECM_5"]["Accelerator_Position"] > 1e-5
+
+ # car speed
+ if self.CP.carFingerprint in RAM_CARS:
+ ret.vEgoRaw = cp.vl["ESP_8"]["Vehicle_Speed"] * CV.KPH_TO_MS
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["Transmission_Status"]["Gear_State"], None))
+ else:
+ ret.vEgoRaw = (cp.vl["SPEED_1"]["SPEED_LEFT"] + cp.vl["SPEED_1"]["SPEED_RIGHT"]) / 2.
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["GEAR"]["PRNDL"], None))
+ ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
+ ret.standstill = not ret.vEgoRaw > 0.001
+
+ # button presses
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(200, cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 1,
+ cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 2)
+ ret.genericToggle = cp.vl["STEERING_LEVERS"]["HIGH_BEAM_PRESSED"] == 1
+
+ # steering wheel
+ ret.steeringAngleDeg = cp.vl["STEERING"]["STEERING_ANGLE"] + cp.vl["STEERING"]["STEERING_ANGLE_HP"]
+ ret.steeringRateDeg = cp.vl["STEERING"]["STEERING_RATE"]
+ ret.steeringTorque = cp.vl["EPS_2"]["COLUMN_TORQUE"]
+ ret.steeringTorqueEps = cp.vl["EPS_2"]["EPS_TORQUE_MOTOR"]
+ ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
+
+ # cruise state
+ cp_cruise = cp_cam if self.CP.carFingerprint in RAM_CARS else cp
+
+ ret.cruiseState.available = cp_cruise.vl["DAS_3"]["ACC_AVAILABLE"] == 1
+ ret.cruiseState.enabled = cp_cruise.vl["DAS_3"]["ACC_ACTIVE"] == 1
+ ret.cruiseState.speed = cp_cruise.vl["DAS_4"]["ACC_SET_SPEED_KPH"] * CV.KPH_TO_MS
+ ret.cruiseState.nonAdaptive = cp_cruise.vl["DAS_4"]["ACC_STATE"] in (1, 2) # 1 NormalCCOn and 2 NormalCCSet
+ ret.cruiseState.standstill = cp_cruise.vl["DAS_3"]["ACC_STANDSTILL"] == 1
+ ret.accFaulted = cp_cruise.vl["DAS_3"]["ACC_FAULTED"] != 0
+
+ if self.CP.carFingerprint in RAM_CARS:
+ # Auto High Beam isn't Located in this message on chrysler or jeep currently located in 729 message
+ self.auto_high_beam = cp_cam.vl["DAS_6"]['AUTO_HIGH_BEAM_ON']
+ ret.steerFaultTemporary = cp.vl["EPS_3"]["DASM_FAULT"] == 1
+ else:
+ ret.steerFaultTemporary = cp.vl["EPS_2"]["LKAS_TEMPORARY_FAULT"] == 1
+ ret.steerFaultPermanent = cp.vl["EPS_2"]["LKAS_STATE"] == 4
+
+ # blindspot sensors
+ if self.CP.enableBsm:
+ ret.leftBlindspot = cp.vl["BSM_1"]["LEFT_STATUS"] == 1
+ ret.rightBlindspot = cp.vl["BSM_1"]["RIGHT_STATUS"] == 1
+
+ self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"]
+ self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"]
+
+ AolCarState.update_aol(self, ret, can_parsers)
+ IQCarState.update(self, ret, ret_iq, can_parsers)
+
+ ret.buttonEvents = [
+ *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}),
+ *create_button_events(self.lkas_button, self.prev_lkas_button, {1: ButtonType.lkas}),
+ *self.button_events,
+ ]
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ pt_messages: list = []
+ cam_messages: list = []
+ AolCarState.get_parser(CP, pt_messages, cam_messages)
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, 2),
+ }
diff --git a/iqdbc_repo/iqdbc/car/chrysler/chryslercan.py b/iqdbc_repo/iqdbc/car/chrysler/chryslercan.py
new file mode 100644
index 000000000..c317c10ea
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/chryslercan.py
@@ -0,0 +1,118 @@
+from iqdbc.car import structs
+from iqdbc.car.crc import CRC8J1850
+from iqdbc.car.chrysler.values import RAM_CARS
+
+GearShifter = structs.CarState.GearShifter
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+
+
+def create_lkas_hud(packer, CP, lkas_active, hud_alert, hud_count, car_model, auto_high_beam, aol):
+ # LKAS_HUD - Controls what lane-keeping icon is displayed
+
+ # == Color ==
+ # 0 hidden?
+ # 1 white
+ # 2 green
+ # 3 ldw
+
+ # == Lines ==
+ # 03 white Lines
+ # 04 grey lines
+ # 09 left lane close
+ # 0A right lane close
+ # 0B left Lane very close
+ # 0C right Lane very close
+ # 0D left cross cross
+ # 0E right lane cross
+
+ # == Alerts ==
+ # 7 Normal
+ # 6 lane departure place hands on wheel
+
+ if aol.enable_aol:
+ color = 2 if lkas_active else 1 if aol.paused else 0
+ else:
+ color = 2 if lkas_active else 1
+ lines = 3 if lkas_active else 0
+ alerts = 7 if lkas_active else 0
+
+ if hud_count < (1 * 4): # first 3 seconds, 4Hz
+ alerts = 1
+
+ if hud_alert in (VisualAlert.ldw, VisualAlert.steerRequired):
+ color = 4
+ lines = 0
+ alerts = 6
+
+ values = {
+ "LKAS_ICON_COLOR": color,
+ "CAR_MODEL": car_model,
+ "LKAS_LANE_LINES": lines,
+ "LKAS_ALERTS": alerts,
+ }
+
+ if CP.carFingerprint in RAM_CARS:
+ values['AUTO_HIGH_BEAM_ON'] = auto_high_beam
+
+ return packer.make_can_msg("DAS_6", 0, values)
+
+
+def create_lkas_command(packer, CP, apply_torque, 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,
+ "LKAS_CONTROL_BIT": enabled_val if lkas_control_bit else 0,
+ }
+ return packer.make_can_msg("LKAS_COMMAND", 0, values)
+
+
+def create_cruise_buttons(packer, frame, bus, cancel=False, resume=False, accel=False, decel=False):
+ values = {
+ "ACC_Cancel": cancel,
+ "ACC_Resume": resume,
+ "ACC_Accel": accel,
+ "ACC_Decel": decel,
+ "COUNTER": frame % 0x10,
+ }
+ return packer.make_can_msg("CRUISE_BUTTONS", bus, values)
+
+
+def chrysler_checksum(address: int, sig, d: bytearray) -> int:
+ checksum = 0xFF
+ for j in range(len(d) - 1):
+ curr = d[j]
+ shift = 0x80
+ for _ in range(8):
+ bit_sum = curr & shift
+ temp_chk = checksum & 0x80
+ if bit_sum:
+ bit_sum = 0x1C
+ if temp_chk:
+ bit_sum = 1
+ checksum = (checksum << 1) & 0xFF
+ temp_chk = checksum | 1
+ bit_sum ^= temp_chk
+ else:
+ if temp_chk:
+ bit_sum = 0x1D
+ checksum = (checksum << 1) & 0xFF
+ bit_sum ^= checksum
+ checksum = bit_sum & 0xFF
+ shift >>= 1
+ return (~checksum) & 0xFF
+
+
+def fca_giorgio_checksum(address: int, sig, d: bytearray) -> int:
+ crc = 0
+ for i in range(len(d) - 1):
+ crc ^= d[i]
+ crc = CRC8J1850[crc]
+ if address == 0xDE:
+ return crc ^ 0x10
+ elif address == 0x106:
+ return crc ^ 0xF6
+ elif address == 0x122:
+ return crc ^ 0xF1
+ else:
+ return crc ^ 0x0A
diff --git a/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py b/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py
new file mode 100644
index 000000000..a9c4fa425
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py
@@ -0,0 +1,794 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.chrysler.values import CAR
+from iqdbc.lvbs.car.iq_fingerprints import extend_fw_versions
+from iqdbc.lvbs.car.chrysler.iq_fingerprints import FW_VERSIONS_EXT
+
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.CHRYSLER_PACIFICA_2018: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68227902AF',
+ b'68227902AG',
+ b'68227902AH',
+ b'68227905AG',
+ b'68360252AC',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68211617AF',
+ b'68211617AG',
+ b'68358974AC',
+ b'68405937AA',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68222747AG',
+ b'68330876AA',
+ b'68330876AB',
+ b'68352227AA',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672758AA',
+ b'04672758AB',
+ b'68226356AF',
+ b'68226356AH',
+ b'68226356AI',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68288891AE',
+ b'68378884AA',
+ b'68525338AA',
+ b'68525338AB',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'68267018AO ',
+ b'68267020AJ ',
+ b'68303534AG ',
+ b'68303534AJ ',
+ b'68340762AD ',
+ b'68340764AD ',
+ b'68352652AE ',
+ b'68352654AE ',
+ b'68366851AH ',
+ b'68366853AE ',
+ b'68366853AG ',
+ b'68372861AF ',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'68277370AJ',
+ b'68277370AM',
+ b'68277372AD',
+ b'68277372AE',
+ b'68277372AN',
+ b'68277374AA',
+ b'68277374AB',
+ b'68277374AD',
+ b'68277374AN',
+ b'68367471AC',
+ b'68367471AD',
+ b'68380571AB',
+ ],
+ },
+ CAR.CHRYSLER_PACIFICA_2020: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68405327AC',
+ b'68436233AB',
+ b'68436233AC',
+ b'68436234AB',
+ b'68436250AE',
+ b'68529067AA',
+ b'68594993AB',
+ b'68594994AB',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68405565AB',
+ b'68405565AC',
+ b'68444299AC',
+ b'68480707AC',
+ b'68480708AC',
+ b'68526663AB',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68397394AA',
+ b'68433480AB',
+ b'68453575AF',
+ b'68577676AA',
+ b'68593395AA',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672758AA',
+ b'04672758AB',
+ b'68417813AF',
+ b'68540436AA',
+ b'68540436AB',
+ b'68540436AC',
+ b'68540436AD',
+ b'68598670AB',
+ b'68598670AC',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68416742AA',
+ b'68460393AA',
+ b'68460393AB',
+ b'68494461AB',
+ b'68494461AC',
+ b'68524936AA',
+ b'68524936AB',
+ b'68525338AB',
+ b'68594337AB',
+ b'68594340AB',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'68413871AD ',
+ b'68413871AE ',
+ b'68413871AH ',
+ b'68413871AI ',
+ b'68413871AJ ',
+ b'68413873AH ',
+ b'68413873AI ',
+ b'68443120AE ',
+ b'68443123AC ',
+ b'68443125AC ',
+ b'68496647AI ',
+ b'68496647AJ ',
+ b'68496650AH ',
+ b'68496650AI ',
+ b'68496650AL ',
+ b'68496652AH ',
+ b'68526752AD ',
+ b'68526752AE ',
+ b'68526754AD ',
+ b'68526754AE ',
+ b'68536264AE ',
+ b'68700304AB ',
+ b'68700306AB ',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'68414271AC',
+ b'68414271AD',
+ b'68414275AC',
+ b'68414275AD',
+ b'68443154AB',
+ b'68443154AC',
+ b'68443155AC',
+ b'68443158AB',
+ b'68501050AD',
+ b'68501051AD',
+ b'68501055AD',
+ b'68527221AB',
+ b'68527223AB',
+ b'68586231AD',
+ b'68586233AD',
+ ],
+ },
+ CAR.CHRYSLER_PACIFICA_2018_HYBRID: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68239262AH',
+ b'68239262AI',
+ b'68239262AJ',
+ b'68239263AH',
+ b'68239263AJ',
+ b'68358439AE',
+ b'68358439AG',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68238840AH',
+ b'68358990AC',
+ b'68405939AA',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672758AA',
+ b'68226356AI',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68288309AC',
+ b'68288309AD',
+ b'68525339AA',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'68277480AV ',
+ b'68277480AX ',
+ b'68277480AZ ',
+ b'68366580AI ',
+ b'68366580AK ',
+ b'68366580AM ',
+ ],
+ (Ecu.hybrid, 0x7e2, None): [
+ b'05190175BF',
+ b'05190175BH',
+ b'05190226AI',
+ b'05190226AK',
+ b'05190226AM',
+ ],
+ },
+ CAR.CHRYSLER_PACIFICA_2019_HYBRID: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68405292AC',
+ b'68434956AC',
+ b'68434956AD',
+ b'68434960AE',
+ b'68434960AF',
+ b'68529064AB',
+ b'68594990AB',
+ b'68594990AD',
+ b'68594990AE',
+ b'68594991AB',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68405567AB',
+ b'68405567AC',
+ b'68453076AD',
+ b'68480710AC',
+ b'68526665AB',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672758AB',
+ b'68417813AF',
+ b'68540436AA',
+ b'68540436AB',
+ b'68540436AC',
+ b'68540436AD',
+ b'68598670AB',
+ b'68598670AC',
+ b'68645752AA',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68416741AA',
+ b'68460392AA',
+ b'68525339AA',
+ b'68525339AB',
+ b'68594341AB',
+ b'68594341AC',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'05190392AB ',
+ b'68416680AD ',
+ b'68416680AE ',
+ b'68416680AF ',
+ b'68416680AG ',
+ b'68444228AC ',
+ b'68444228AD ',
+ b'68444228AE ',
+ b'68444228AF ',
+ b'68499122AD ',
+ b'68499122AE ',
+ b'68499122AF ',
+ b'68526772AD ',
+ b'68526772AH ',
+ b'68599493AC ',
+ b'68657433AA ',
+ b'68700317AC ',
+ ],
+ (Ecu.hybrid, 0x7e2, None): [
+ b'05185116AF',
+ b'05185116AJ',
+ b'05185116AK',
+ b'05185116AL',
+ b'05190240AP',
+ b'05190240AQ',
+ b'05190240AR',
+ b'05190265AG',
+ b'05190265AH',
+ b'05190289AE',
+ b'68540977AH',
+ b'68540977AK',
+ b'68540977AL',
+ b'68597647AE',
+ b'68597647AF',
+ b'68632416AB',
+ b'68632416AC',
+ b'68676877AB',
+ ],
+ },
+ CAR.JEEP_GRAND_CHEROKEE: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68243549AG',
+ b'68302211AC',
+ b'68302212AD',
+ b'68302214AC',
+ b'68302223AC',
+ b'68302246AC',
+ b'68331511AC',
+ b'68331574AC',
+ b'68331687AC',
+ b'68331690AC',
+ b'68340272AD',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68309533AA',
+ b'68316742AB',
+ b'68355363AB',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68252642AG',
+ b'68306178AD',
+ b'68336275AB',
+ b'68336276AB',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672627AB',
+ b'68251506AF',
+ b'68332015AB',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68276201AG',
+ b'68321644AB',
+ b'68321644AC',
+ b'68321646AC',
+ b'68321648AC',
+ b'68321650AC',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'05035920AE ',
+ b'68252272AG ',
+ b'68284455AI ',
+ b'68284456AI ',
+ b'68284456AJ ',
+ b'68284477AF ',
+ b'68325564AH ',
+ b'68325564AI ',
+ b'68325565AH ',
+ b'68325565AI ',
+ b'68325565AJ ',
+ b'68325618AD ',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'05035517AH',
+ b'68253222AF',
+ b'68311218AC',
+ b'68311218AD',
+ b'68311223AF',
+ b'68311223AG',
+ b'68361911AE',
+ b'68361911AF',
+ b'68361911AH',
+ b'68361914AE',
+ b'68361916AD',
+ ],
+ },
+ CAR.JEEP_GRAND_CHEROKEE_2019: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68402703AB',
+ b'68402704AB',
+ b'68402707AB',
+ b'68402708AB',
+ b'68402714AB',
+ b'68402736AB',
+ b'68402971AD',
+ b'68454144AD',
+ b'68454145AB',
+ b'68454152AB',
+ b'68454156AB',
+ b'68516650AB',
+ b'68516651AB',
+ b'68516669AB',
+ b'68516671AB',
+ b'68516683AB',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68355363AB',
+ b'68355364AB',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68408639AC',
+ b'68408639AD',
+ b'68499978AB',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672788AA',
+ b'68456722AC',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68417279AA',
+ b'68417280AA',
+ b'68417281AA',
+ b'68417283AA',
+ b'68453431AA',
+ b'68453433AA',
+ b'68453435AA',
+ b'68499171AA',
+ b'68499171AB',
+ b'68501183AA',
+ b'68501186AA',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'05035674AB ',
+ b'68412635AE ',
+ b'68412635AG ',
+ b'68412635AH ',
+ b'68412660AD ',
+ b'68412660AF ',
+ b'68422860AB',
+ b'68449435AE ',
+ b'68496223AA ',
+ b'68504959AD ',
+ b'68504959AE ',
+ b'68504960AD ',
+ b'68504993AC ',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'05035707AA',
+ b'68419672AC',
+ b'68419675AC',
+ b'68419678AB',
+ b'68423905AB',
+ b'68449258AC',
+ b'68495807AA',
+ b'68495807AB',
+ b'68503641AC',
+ b'68503644AC',
+ b'68503664AC',
+ ],
+ },
+ CAR.RAM_1500_5TH_GEN: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68294051AG',
+ b'68294051AI',
+ b'68294052AG',
+ b'68294052AH',
+ b'68294059AI',
+ b'68294063AG',
+ b'68294063AH',
+ b'68294063AI',
+ b'68434846AC',
+ b'68434847AC',
+ b'68434849AC',
+ b'68434850AC',
+ b'68434855AC',
+ b'68434856AC',
+ b'68434858AC',
+ b'68434859AC',
+ b'68434860AC',
+ b'68453471AD',
+ b'68453483AC',
+ b'68453483AD',
+ b'68453487AD',
+ b'68453491AC',
+ b'68453491AD',
+ b'68453499AD',
+ b'68453502AC',
+ b'68453503AC',
+ b'68453503AD',
+ b'68453505AC',
+ b'68453505AD',
+ b'68453511AC',
+ b'68453513AC',
+ b'68453513AD',
+ b'68453514AD',
+ b'68505633AB',
+ b'68510277AG',
+ b'68510277AH',
+ b'68510280AG',
+ b'68510280AH',
+ b'68510282AG',
+ b'68510282AH',
+ b'68510283AG',
+ b'68527346AE',
+ b'68527361AD',
+ b'68527375AD',
+ b'68527381AD',
+ b'68527381AE',
+ b'68527382AE',
+ b'68527383AD',
+ b'68527383AE',
+ b'68527387AE',
+ b'68527397AD',
+ b'68527403AC',
+ b'68527403AD',
+ b'68527404AD',
+ b'68546047AF',
+ b'68631938AA',
+ b'68631939AA',
+ b'68631940AA',
+ b'68631940AB',
+ b'68631941AB',
+ b'68631942AA',
+ b'68631943AB',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68428609AB',
+ b'68441329AA',
+ b'68441329AB',
+ b'68473844AB',
+ b'68490898AA',
+ b'68500728AA',
+ b'68615033AA',
+ b'68615034AA',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68292406AG',
+ b'68292406AH',
+ b'68432418AB',
+ b'68432418AC',
+ b'68432418AD',
+ b'68436004AD',
+ b'68436004AE',
+ b'68438454AC',
+ b'68438454AD',
+ b'68438456AE',
+ b'68438456AF',
+ b'68535469AB',
+ b'68535470AC',
+ b'68548900AB',
+ b'68548900AC',
+ b'68586307AB',
+ b'68586307AC',
+ b'68728724AA',
+ b'68728727AA',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672892AB',
+ b'04672932AB',
+ b'04672932AC',
+ b'22DTRHD_AA',
+ b'68320950AH',
+ b'68320950AI',
+ b'68320950AJ',
+ b'68320950AL',
+ b'68320950AM',
+ b'68454268AB',
+ b'68454268AC',
+ b'68475160AE',
+ b'68475160AF',
+ b'68475160AG',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'21590101AA',
+ b'21590101AB',
+ b'22490101AB',
+ b'68273275AF',
+ b'68273275AG',
+ b'68273275AH',
+ b'68312176AE',
+ b'68312176AF',
+ b'68312176AG',
+ b'68440789AC',
+ b'68466110AA',
+ b'68466110AB',
+ b'68466113AA',
+ b'68466116AA',
+ b'68469901AA',
+ b'68469904AA',
+ b'68469907AA',
+ b'68522583AA',
+ b'68522583AB',
+ b'68522584AA',
+ b'68522585AB',
+ b'68552788AA',
+ b'68552789AA',
+ b'68552790AA',
+ b'68552791AB',
+ b'68552794AA',
+ b'68552794AD',
+ b'68585106AB',
+ b'68585107AB',
+ b'68585108AB',
+ b'68585109AB',
+ b'68585112AB',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'05035699AG ',
+ b'05035841AC ',
+ b'05035841AD ',
+ b'05036026AB ',
+ b'05036030AC ',
+ b'05036065AE ',
+ b'05036066AE ',
+ b'05036067AE ',
+ b'05036193AA ',
+ b'05149368AA ',
+ b'05149374AA ',
+ b'05149591AD ',
+ b'05149591AE ',
+ b'05149592AE ',
+ b'05149599AE ',
+ b'05149600AD ',
+ b'05149600AE ',
+ b'05149605AE ',
+ b'05149846AA ',
+ b'05149848AA ',
+ b'05149848AC ',
+ b'05190341AD',
+ b'05190346AD',
+ b'68378695AI ',
+ b'68378695AJ ',
+ b'68378695AK ',
+ b'68378696AJ ',
+ b'68378696AK ',
+ b'68378701AI ',
+ b'68378702AI ',
+ b'68378710AL ',
+ b'68378742AI ',
+ b'68378742AK ',
+ b'68378743AI ',
+ b'68378743AM ',
+ b'68378748AL ',
+ b'68378758AM ',
+ b'68378759AM ',
+ b'68448163AJ',
+ b'68448163AK',
+ b'68448163AL',
+ b'68448165AG',
+ b'68448165AK',
+ b'68455111AC ',
+ b'68455119AC ',
+ b'68455137AC ',
+ b'68455142AC ',
+ b'68455142AE ',
+ b'68455145AC ',
+ b'68455145AE ',
+ b'68455146AC ',
+ b'68460927AA ',
+ b'68467909AB ',
+ b'68467909AC ',
+ b'68467915AC ',
+ b'68467916AC ',
+ b'68467936AC ',
+ b'68500630AD',
+ b'68500630AE',
+ b'68500630AF',
+ b'68500631AE',
+ b'68502719AC ',
+ b'68502722AC ',
+ b'68502733AC ',
+ b'68502734AF ',
+ b'68502737AF ',
+ b'68502740AF ',
+ b'68502741AF ',
+ b'68502742AC ',
+ b'68502742AF ',
+ b'68539650AD',
+ b'68539650AF',
+ b'68539651AD',
+ b'68586101AA ',
+ b'68586102AA ',
+ b'68586105AB ',
+ b'68629917AC ',
+ b'68629919AC ',
+ b'68629919AD ',
+ b'68629922AC ',
+ b'68629925AC ',
+ b'68629926AC ',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'05035706AD',
+ b'05035842AB',
+ b'05036069AA',
+ b'05036181AA',
+ b'05149536AC',
+ b'05149537AC',
+ b'05149543AC',
+ b'68360078AL',
+ b'68360080AL',
+ b'68360080AM',
+ b'68360081AM',
+ b'68360081AN',
+ b'68360085AH',
+ b'68360085AJ',
+ b'68360085AK',
+ b'68360085AL',
+ b'68360085AO',
+ b'68360086AH',
+ b'68360086AK',
+ b'68360086AN',
+ b'68384328AD',
+ b'68384332AD',
+ b'68445531AC',
+ b'68445532AB',
+ b'68445533AB',
+ b'68445536AB',
+ b'68445537AB',
+ b'68466081AB',
+ b'68466086AB',
+ b'68466087AB',
+ b'68484466AC',
+ b'68484467AC',
+ b'68484471AC',
+ b'68502994AC',
+ b'68502994AD',
+ b'68502996AD',
+ b'68520867AE',
+ b'68520867AF',
+ b'68520870AC',
+ b'68520871AC',
+ b'68528325AE',
+ b'68540431AB',
+ b'68540433AB',
+ b'68551676AA',
+ b'68629935AB',
+ b'68629936AC',
+ ],
+ },
+ CAR.RAM_HD_5TH_GEN: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68361606AH',
+ b'68437735AC',
+ b'68492693AD',
+ b'68525485AB',
+ b'68525487AB',
+ b'68525498AB',
+ b'68528791AF',
+ b'68628474AB',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68399794AC',
+ b'68428503AA',
+ b'68428505AA',
+ b'68428507AA',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68334977AH',
+ b'68455481AC',
+ b'68504022AA',
+ b'68504022AB',
+ b'68504022AC',
+ b'68530686AB',
+ b'68530686AC',
+ b'68544596AC',
+ b'68641704AA',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'04672895AB',
+ b'04672934AB',
+ b'56029827AG',
+ b'56029827AH',
+ b'68462657AE',
+ b'68484694AD',
+ b'68484694AE',
+ b'68615489AB',
+ ],
+ (Ecu.eps, 0x761, None): [
+ b'68421036AC',
+ b'68507906AB',
+ b'68534023AC',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'52370131AF',
+ b'52370231AF',
+ b'52370231AG',
+ b'52370491AA',
+ b'52370931CT',
+ b'52401032AE',
+ b'52421132AF',
+ b'52421332AF',
+ b'68527616AD ',
+ b'M2370131MB',
+ b'M2421132MB',
+ ],
+ },
+ CAR.DODGE_DURANGO: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68454261AD',
+ b'68471535AE',
+ ],
+ (Ecu.srs, 0x744, None): [
+ b'68355362AB',
+ b'68492238AD',
+ ],
+ (Ecu.abs, 0x747, None): [
+ b'68408639AD',
+ b'68499978AB',
+ ],
+ (Ecu.fwdRadar, 0x753, None): [
+ b'68440581AE',
+ b'68456722AC',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68453435AA',
+ b'68498477AA',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'05035786AE ',
+ b'68449476AE ',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'05035826AC',
+ b'68449265AC',
+ ],
+ },
+}
+
+
+
+FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT)
diff --git a/iqdbc_repo/iqdbc/car/chrysler/interface.py b/iqdbc_repo/iqdbc/car/chrysler/interface.py
new file mode 100755
index 000000000..7b880baa6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/interface.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python3
+from iqdbc.car import get_safety_config, structs
+from iqdbc.car.chrysler.carcontroller import CarController
+from iqdbc.car.chrysler.carstate import CarState
+from iqdbc.car.chrysler.radar_interface import RadarInterface
+from iqdbc.car.chrysler.values import CAR, RAM_HD, RAM_DT, RAM_CARS, ChryslerFlags, ChryslerSafetyFlags
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.lvbs.car.chrysler.iq_values import ChryslerFlagsIQ
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.low,)
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "chrysler"
+ ret.dashcamOnly = candidate in RAM_HD
+
+ # radar parsing needs some work, see https://github.com/commaai/openpilot/issues/26842
+ ret.radarUnavailable = True # Bus.radar not in DBC[candidate][Bus.radar]
+ ret.steerActuatorDelay = 0.1
+ ret.steerLimitTimer = 0.4
+
+ # safety config
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.chrysler)]
+ if candidate in RAM_HD:
+ ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_HD.value
+ elif candidate in RAM_DT:
+ ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_DT.value
+
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+ if candidate not in RAM_CARS:
+ # Newer FW versions standard on the following platforms, or flashed by a dealer onto older platforms have a higher minimum steering speed.
+ new_eps_platform = candidate in (CAR.CHRYSLER_PACIFICA_2019_HYBRID, CAR.CHRYSLER_PACIFICA_2020, CAR.JEEP_GRAND_CHEROKEE_2019, CAR.DODGE_DURANGO)
+ new_eps_firmware = any(fw.ecu == 'eps' and fw.fwVersion[:4] >= b"6841" for fw in car_fw)
+ if new_eps_platform or new_eps_firmware:
+ ret.flags |= ChryslerFlags.HIGHER_MIN_STEERING_SPEED.value
+
+ # Chrysler
+ if candidate in (CAR.CHRYSLER_PACIFICA_2018, CAR.CHRYSLER_PACIFICA_2018_HYBRID, CAR.CHRYSLER_PACIFICA_2019_HYBRID,
+ CAR.CHRYSLER_PACIFICA_2020, CAR.DODGE_DURANGO):
+ ret.lateralTuning.init('pid')
+ ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kiBP = [[9., 20.], [9., 20.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15, 0.30], [0.03, 0.05]]
+ ret.lateralTuning.pid.kf = 0.00006
+
+ # Jeep
+ elif candidate in (CAR.JEEP_GRAND_CHEROKEE, CAR.JEEP_GRAND_CHEROKEE_2019):
+ ret.steerActuatorDelay = 0.2
+
+ ret.lateralTuning.init('pid')
+ ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kiBP = [[9., 20.], [9., 20.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15, 0.30], [0.03, 0.05]]
+ ret.lateralTuning.pid.kf = 0.00006
+
+ # Ram
+ elif candidate == CAR.RAM_1500_5TH_GEN:
+ ret.steerActuatorDelay = 0.2
+ ret.wheelbase = 3.88
+ # Older EPS FW allow steer to zero
+ if any(fw.ecu == 'eps' and b"68" < fw.fwVersion[:4] <= b"6831" for fw in car_fw):
+ ret.minSteerSpeed = 0.
+
+ elif candidate == CAR.RAM_HD_5TH_GEN:
+ ret.steerActuatorDelay = 0.2
+
+ else:
+ raise ValueError(f"Unsupported car: {candidate}")
+
+ if ret.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED:
+ # TODO: allow these cars to steer down to 13 m/s if already engaged.
+ # TODO: Durango 2020 may be able to steer to zero once above 38 kph
+ ret.minSteerSpeed = 17.5 # m/s 17 on the way up, 13 on the way down once engaged.
+
+ ret.centerToFront = ret.wheelbase * 0.44
+ ret.enableBsm = 720 in fingerprint[0]
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ if candidate == CAR.RAM_1500_5TH_GEN:
+ if stock_cp.minSteerSpeed != 0.:
+ stock_cp.minSteerSpeed = 0.5
+ stock_cp.minEnableSpeed = 14.5
+ if any(fw.ecu == 'eps' and fw.fwVersion in (b"68273275AF", b"68273275AG", b"68312176AE", b"68312176AG",) for fw in car_fw):
+ stock_cp.minEnableSpeed = 0.
+
+ if candidate == CAR.RAM_HD_5TH_GEN:
+ stock_cp.dashcamOnly = False
+ # https://github.com/commaai/openpilot/issues/25389
+ stock_cp.tireStiffnessFactor = 1.0
+ stock_cp.tireStiffnessFront = 65155.
+ stock_cp.tireStiffnessRear = 80926.
+ stock_cp.wheelbase = 3.79
+ stock_cp.steerRatio = 19.
+
+ # LKAS heartbeat on bus 0 (msg 0x4FF) means the camera is on the ADAS bus and
+ # IQ.Pilot can steer down to a standstill.
+ if 0x4FF in fingerprint[0]:
+ ret.flags |= ChryslerFlagsIQ.NO_MIN_STEERING_SPEED.value
+ stock_cp.minSteerSpeed = 0.
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/chrysler/radar_interface.py b/iqdbc_repo/iqdbc/car/chrysler/radar_interface.py
new file mode 100755
index 000000000..b509e8461
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/radar_interface.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import RadarInterfaceBase
+from iqdbc.car.chrysler.values import DBC
+
+RADAR_MSGS_C = list(range(0x2c2, 0x2d4+2, 2)) # c_ messages 706,...,724
+RADAR_MSGS_D = list(range(0x2a2, 0x2b4+2, 2)) # d_ messages
+LAST_MSG = max(RADAR_MSGS_C + RADAR_MSGS_D)
+NUMBER_MSGS = len(RADAR_MSGS_C) + len(RADAR_MSGS_D)
+
+
+def _create_radar_can_parser(car_fingerprint):
+ if Bus.radar not in DBC[car_fingerprint]:
+ return None
+
+ msg_n = len(RADAR_MSGS_C)
+ # list of [(signal name, message name or number), (...)]
+ # [('RADAR_STATE', 1024),
+ # ('LONG_DIST', 1072),
+ # ('LONG_DIST', 1073),
+ # ('LONG_DIST', 1074),
+ # ('LONG_DIST', 1075),
+
+ messages = list(zip(RADAR_MSGS_C +
+ RADAR_MSGS_D,
+ [20] * msg_n + # 20Hz (0.05s)
+ [20] * msg_n, strict=True)) # 20Hz (0.05s)
+
+ return CANParser(DBC[car_fingerprint][Bus.radar], messages, 1)
+
+
+def _address_to_track(address):
+ if address in RADAR_MSGS_C:
+ return (address - RADAR_MSGS_C[0]) // 2
+ if address in RADAR_MSGS_D:
+ return (address - RADAR_MSGS_D[0]) // 2
+ raise ValueError("radar received unexpected address %d" % address)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+ self.rcp = _create_radar_can_parser(CP.carFingerprint)
+ self.updated_messages = set()
+ self.trigger_msg = LAST_MSG
+
+ def update(self, can_strings):
+ if self.rcp is None or self.CP.radarUnavailable:
+ return super().update(None)
+
+ vls = self.rcp.update(can_strings)
+ self.updated_messages.update(vls)
+
+ if self.trigger_msg not in self.updated_messages:
+ return None
+
+ ret = structs.RadarData()
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+
+ for ii in self.updated_messages: # ii should be the message ID as a number
+ cpt = self.rcp.vl[ii]
+ trackId = _address_to_track(ii)
+
+ if trackId not in self.pts:
+ self.pts[trackId] = structs.RadarData.RadarPoint()
+ self.pts[trackId].trackId = trackId
+ self.pts[trackId].aRel = float('nan')
+ self.pts[trackId].yvRel = float('nan')
+ self.pts[trackId].measured = True
+
+ if 'LONG_DIST' in cpt: # c_* message
+ self.pts[trackId].dRel = cpt['LONG_DIST'] # from front of car
+ # our lat_dist is positive to the right in car's frame.
+ # LAT_DIST is right-positive, yRel is left-positive
+ self.pts[trackId].yRel = -cpt['LAT_DIST'] # in car frame's y axis, left is positive
+ else: # d_* message
+ self.pts[trackId].vRel = cpt['REL_SPEED']
+
+ # We want a list, not a dictionary. Filter out LONG_DIST==0 because that means it's not valid.
+ ret.points = [x for x in self.pts.values() if x.dRel != 0]
+
+ self.updated_messages.clear()
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/chrysler/values.py b/iqdbc_repo/iqdbc/car/chrysler/values.py
new file mode 100644
index 000000000..2c54310f6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/chrysler/values.py
@@ -0,0 +1,160 @@
+from enum import IntFlag
+from dataclasses import dataclass, field
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, p16
+
+Ecu = CarParams.Ecu
+
+
+class ChryslerSafetyFlags(IntFlag):
+ RAM_DT = 1
+ RAM_HD = 2
+
+
+class ChryslerFlags(IntFlag):
+ # Detected flags
+ HIGHER_MIN_STEERING_SPEED = 1
+
+
+@dataclass
+class ChryslerCarDocs(CarDocs):
+ package: str = "Adaptive Cruise Control (ACC)"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca]))
+
+
+@dataclass
+class ChryslerPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {
+ Bus.pt: 'chrysler_pacifica_2017_hybrid_generated',
+ Bus.radar: 'chrysler_pacifica_2017_hybrid_private_fusion',
+ })
+
+
+@dataclass(frozen=True)
+class ChryslerCarSpecs(CarSpecs):
+ minSteerSpeed: float = 3.8 # m/s
+
+
+class CAR(Platforms):
+ # Chrysler
+ CHRYSLER_PACIFICA_2018_HYBRID = ChryslerPlatformConfig(
+ [ChryslerCarDocs("Chrysler Pacifica Hybrid 2017-18")],
+ ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2),
+ )
+ CHRYSLER_PACIFICA_2019_HYBRID = ChryslerPlatformConfig(
+ [ChryslerCarDocs("Chrysler Pacifica Hybrid 2019-25")],
+ CHRYSLER_PACIFICA_2018_HYBRID.specs,
+ )
+ CHRYSLER_PACIFICA_2018 = ChryslerPlatformConfig(
+ [ChryslerCarDocs("Chrysler Pacifica 2017-18")],
+ CHRYSLER_PACIFICA_2018_HYBRID.specs,
+ )
+ CHRYSLER_PACIFICA_2020 = ChryslerPlatformConfig(
+ [
+ ChryslerCarDocs("Chrysler Pacifica 2019-20"),
+ ChryslerCarDocs("Chrysler Pacifica 2021-23", package="All"),
+ ],
+ CHRYSLER_PACIFICA_2018_HYBRID.specs,
+ )
+
+ # Dodge
+ DODGE_DURANGO = ChryslerPlatformConfig(
+ [ChryslerCarDocs("Dodge Durango 2020-21")],
+ CHRYSLER_PACIFICA_2018_HYBRID.specs,
+ )
+
+ # Jeep
+ JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk
+ [ChryslerCarDocs("Jeep Grand Cherokee 2016-18", video="https://www.youtube.com/watch?v=eLR9o2JkuRk")],
+ ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7),
+ )
+
+ JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk
+ [ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video="https://www.youtube.com/watch?v=jBe4lWnRSu4")],
+ JEEP_GRAND_CHEROKEE.specs,
+ )
+
+ # Ram
+ RAM_1500_5TH_GEN = ChryslerPlatformConfig(
+ [ChryslerCarDocs("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))],
+ ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5),
+ {Bus.pt: 'chrysler_ram_dt_generated'},
+ )
+ RAM_HD_5TH_GEN = ChryslerPlatformConfig(
+ [
+ ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])),
+ ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])),
+ ],
+ ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.),
+ {Bus.pt: 'chrysler_ram_hd_generated'},
+ )
+
+
+class CarControllerParams:
+ def __init__(self, CP):
+ self.STEER_STEP = 2 # 50 Hz
+ self.STEER_ERROR_MAX = 80
+ if CP.carFingerprint in RAM_HD:
+ self.STEER_DELTA_UP = 14
+ self.STEER_DELTA_DOWN = 14
+ self.STEER_MAX = 361 # higher than this faults the EPS
+ elif CP.carFingerprint in RAM_DT:
+ self.STEER_DELTA_UP = 6
+ self.STEER_DELTA_DOWN = 6
+ self.STEER_MAX = 350 # EPS allows more, up to 350?
+ else:
+ self.STEER_DELTA_UP = 3
+ self.STEER_DELTA_DOWN = 3
+ self.STEER_MAX = 261 # higher than this faults the EPS
+
+
+STEER_THRESHOLD = 120
+
+RAM_DT = {CAR.RAM_1500_5TH_GEN, }
+RAM_HD = {CAR.RAM_HD_5TH_GEN, }
+RAM_CARS = RAM_DT | RAM_HD
+
+
+CHRYSLER_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(0xf132)
+CHRYSLER_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(0xf132)
+
+CHRYSLER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_NUMBER)
+CHRYSLER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_NUMBER)
+
+CHRYSLER_RX_OFFSET = -0x280
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ Request(
+ [CHRYSLER_VERSION_REQUEST],
+ [CHRYSLER_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.srs, Ecu.fwdRadar, Ecu.combinationMeter],
+ rx_offset=CHRYSLER_RX_OFFSET,
+ bus=0,
+ ),
+ Request(
+ [CHRYSLER_VERSION_REQUEST],
+ [CHRYSLER_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.hybrid, Ecu.engine, Ecu.transmission],
+ bus=0,
+ ),
+ Request(
+ [CHRYSLER_SOFTWARE_VERSION_REQUEST],
+ [CHRYSLER_SOFTWARE_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.engine, Ecu.transmission],
+ bus=0,
+ ),
+ ],
+ extra_ecus=[
+ (Ecu.abs, 0x7e4, None), # alt address for abs on hybrids, NOTE: not on all hybrid platforms
+ ],
+)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/common/__init__.py b/iqdbc_repo/iqdbc/car/common/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/common/basedir.py b/iqdbc_repo/iqdbc/car/common/basedir.py
new file mode 100644
index 000000000..6b4811e53
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/common/basedir.py
@@ -0,0 +1,4 @@
+import os
+
+
+BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
diff --git a/iqdbc_repo/iqdbc/car/common/conversions.py b/iqdbc_repo/iqdbc/car/common/conversions.py
new file mode 100644
index 000000000..111c92884
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/common/conversions.py
@@ -0,0 +1,20 @@
+import numpy as np
+
+
+class Conversions:
+ # Speed
+ MPH_TO_KPH = 1.609344
+ KPH_TO_MPH = 1. / MPH_TO_KPH
+ MS_TO_KPH = 3.6
+ KPH_TO_MS = 1. / MS_TO_KPH
+ MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH
+ MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS
+ MS_TO_KNOTS = 1.9438
+ KNOTS_TO_MS = 1. / MS_TO_KNOTS
+
+ # Angle
+ DEG_TO_RAD = np.pi / 180.
+ RAD_TO_DEG = 1. / DEG_TO_RAD
+
+ # Mass
+ LB_TO_KG = 0.453592
diff --git a/iqdbc_repo/iqdbc/car/common/filter_simple.py b/iqdbc_repo/iqdbc/car/common/filter_simple.py
new file mode 100644
index 000000000..c08bde389
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/common/filter_simple.py
@@ -0,0 +1,44 @@
+class FirstOrderFilter:
+ # first order filter
+ def __init__(self, x0, rc, dt, initialized=True):
+ self.x = x0
+ self._dt = dt
+ self.update_alpha(rc)
+ self.initialized = initialized
+
+ def update_dt(self, dt):
+ self._dt = dt
+ self.update_alpha(self._rc)
+
+ def update_alpha(self, rc):
+ self._rc = rc
+ self._alpha = self._dt / (self._rc + self._dt)
+
+ def update(self, x):
+ if self.initialized:
+ self.x = (1. - self._alpha) * self.x + self._alpha * x
+ else:
+ self.initialized = True
+ self.x = x
+ return self.x
+
+
+class HighPassFilter:
+ # technically a band-pass filter
+ def __init__(self, x0, rc1, rc2, dt, initialized=True):
+ self.x = x0
+ self._f1 = FirstOrderFilter(x0, rc1, dt, initialized)
+ self._f2 = FirstOrderFilter(x0, rc2, dt, initialized)
+ assert rc2 > rc1, "rc2 must be greater than rc1"
+
+ def update_dt(self, dt):
+ self._f1.update_dt(dt)
+ self._f2.update_dt(dt)
+
+ def update_alpha(self, rc1, rc2):
+ self._f1.update_alpha(rc1)
+ self._f2.update_alpha(rc2)
+
+ def update(self, x):
+ self.x = self._f1.update(x) - self._f2.update(x)
+ return self.x
diff --git a/iqdbc_repo/iqdbc/car/common/numpy_fast.py b/iqdbc_repo/iqdbc/car/common/numpy_fast.py
new file mode 100644
index 000000000..e1e9f8ed7
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/common/numpy_fast.py
@@ -0,0 +1,20 @@
+def clip(x, lo, hi):
+ return max(lo, min(hi, x))
+
+def interp(x, xp, fp):
+ N = len(xp)
+
+ def get_interp(xv):
+ hi = 0
+ while hi < N and xv > xp[hi]:
+ hi += 1
+ low = hi - 1
+ return fp[-1] if hi == N and xv > xp[low] else (
+ fp[0] if hi == 0 else
+ (xv - xp[low]) * (fp[hi] - fp[low]) / (xp[hi] - xp[low]) + fp[low])
+
+ return [get_interp(v) for v in x] if hasattr(x, '__iter__') else get_interp(x)
+
+def mean(x):
+ return sum(x) / len(x)
+
diff --git a/iqdbc_repo/iqdbc/car/common/pid.py b/iqdbc_repo/iqdbc/car/common/pid.py
new file mode 100644
index 000000000..e9b5bb981
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/common/pid.py
@@ -0,0 +1,71 @@
+import numpy as np
+from numbers import Number
+
+
+class PIDController:
+ def __init__(self, k_p, k_i, k_f=0., k_d=0., pos_limit=1e308, neg_limit=-1e308, rate=100):
+ self._k_p = k_p
+ self._k_i = k_i
+ self._k_d = k_d
+ self.k_f = k_f # feedforward gain
+ if isinstance(self._k_p, Number):
+ self._k_p = [[0], [self._k_p]]
+ if isinstance(self._k_i, Number):
+ self._k_i = [[0], [self._k_i]]
+ if isinstance(self._k_d, Number):
+ self._k_d = [[0], [self._k_d]]
+
+ self.pos_limit = pos_limit
+ self.neg_limit = neg_limit
+
+ self.i_unwind_rate = 0.3 / rate
+ self.i_rate = 1.0 / rate
+ self.speed = 0.0
+
+ self.reset()
+
+ @property
+ def k_p(self):
+ return np.interp(self.speed, self._k_p[0], self._k_p[1])
+
+ @property
+ def k_i(self):
+ return np.interp(self.speed, self._k_i[0], self._k_i[1])
+
+ @property
+ def k_d(self):
+ return np.interp(self.speed, self._k_d[0], self._k_d[1])
+
+ @property
+ def error_integral(self):
+ return self.i/self.k_i
+
+ def reset(self):
+ self.p = 0.0
+ self.i = 0.0
+ self.d = 0.0
+ self.f = 0.0
+ self.control = 0
+
+ def update(self, error, error_rate=0.0, speed=0.0, override=False, feedforward=0., freeze_integrator=False):
+ self.speed = speed
+
+ self.p = float(error) * self.k_p
+ self.f = feedforward * self.k_f
+ self.d = error_rate * self.k_d
+
+ if override:
+ self.i -= self.i_unwind_rate * float(np.sign(self.i))
+ else:
+ if not freeze_integrator:
+ self.i = self.i + error * self.k_i * self.i_rate
+
+ # Clip i to prevent exceeding control limits
+ control_no_i = self.p + self.d + self.f
+ control_no_i = np.clip(control_no_i, self.neg_limit, self.pos_limit)
+ self.i = np.clip(self.i, self.neg_limit - control_no_i, self.pos_limit - control_no_i)
+
+ control = self.p + self.i + self.d + self.f
+
+ self.control = np.clip(control, self.neg_limit, self.pos_limit)
+ return self.control
diff --git a/iqdbc_repo/iqdbc/car/common/simple_kalman.py b/iqdbc_repo/iqdbc/car/common/simple_kalman.py
new file mode 100644
index 000000000..194b27204
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/common/simple_kalman.py
@@ -0,0 +1,54 @@
+import numpy as np
+
+
+def get_kalman_gain(dt, A, C, Q, R, iterations=100):
+ P = np.zeros_like(Q)
+ for _ in range(iterations):
+ P = A.dot(P).dot(A.T) + dt * Q
+ S = C.dot(P).dot(C.T) + R
+ K = P.dot(C.T).dot(np.linalg.inv(S))
+ P = (np.eye(len(P)) - K.dot(C)).dot(P)
+ return K
+
+
+class KF1D:
+ # this EKF assumes constant covariance matrix, so calculations are much simpler
+ # the Kalman gain also needs to be precomputed using the control module
+
+ def __init__(self, x0, A, C, K):
+ self.x0_0 = x0[0][0]
+ self.x1_0 = x0[1][0]
+ self.A0_0 = A[0][0]
+ self.A0_1 = A[0][1]
+ self.A1_0 = A[1][0]
+ self.A1_1 = A[1][1]
+ self.C0_0 = C[0]
+ self.C0_1 = C[1]
+ self.K0_0 = K[0][0]
+ self.K1_0 = K[1][0]
+
+ self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0
+ self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1
+ self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0
+ self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1
+
+ # K matrix needs to be pre-computed as follow:
+ # import control
+ # (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R)
+ # self.K = np.transpose(K)
+
+ def update(self, meas):
+ #self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas)
+ x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas
+ x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas
+ self.x0_0 = x0_0
+ self.x1_0 = x1_0
+ return [self.x0_0, self.x1_0]
+
+ @property
+ def x(self):
+ return [[self.x0_0], [self.x1_0]]
+
+ def set_x(self, x):
+ self.x0_0 = x[0][0]
+ self.x1_0 = x[1][0]
diff --git a/iqdbc_repo/iqdbc/car/crc.py b/iqdbc_repo/iqdbc/car/crc.py
new file mode 100644
index 000000000..4aa721aaf
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/crc.py
@@ -0,0 +1,31 @@
+
+def _gen_crc8_table(poly: int) -> list[int]:
+ table = []
+ for i in range(256):
+ crc = i
+ for _ in range(8):
+ if crc & 0x80:
+ crc = ((crc << 1) ^ poly) & 0xFF
+ else:
+ crc = (crc << 1) & 0xFF
+ table.append(crc)
+ return table
+
+
+def _gen_crc16_table(poly: int) -> list[int]:
+ table = []
+ for i in range(256):
+ crc = i << 8
+ for _ in range(8):
+ if crc & 0x8000:
+ crc = ((crc << 1) ^ poly) & 0xFFFF
+ else:
+ crc = (crc << 1) & 0xFFFF
+ table.append(crc)
+ return table
+
+
+CRC8H2F = _gen_crc8_table(0x2F)
+CRC8J1850 = _gen_crc8_table(0x1D)
+CRC8BODY = _gen_crc8_table(0xD5)
+CRC16_XMODEM = _gen_crc16_table(0x1021)
diff --git a/iqdbc_repo/iqdbc/car/debug/format_fingerprints.py b/iqdbc_repo/iqdbc/car/debug/format_fingerprints.py
new file mode 100755
index 000000000..5989f8151
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/debug/format_fingerprints.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+import jinja2
+import os
+
+from iqdbc.car.common.basedir import BASEDIR
+from iqdbc.car.interfaces import get_interface_attr
+from iqdbc.car.structs import CarParams
+
+Ecu = CarParams.Ecu
+
+CARS = get_interface_attr('CAR')
+FW_VERSIONS = get_interface_attr('FW_VERSIONS')
+FINGERPRINTS = get_interface_attr('FINGERPRINTS')
+ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()}
+
+FINGERPRINTS_PY_TEMPLATE = jinja2.Template("""
+{%- if FINGERPRINTS[brand] and brand != 'body' %}
+# ruff: noqa: E501
+{% endif %}
+\"\"\" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.\"\"\"
+{% if FW_VERSIONS[brand] %}
+from iqdbc.car.structs import CarParams
+{% endif %}
+from iqdbc.car.{{brand}}.values import CAR
+{% if FW_VERSIONS[brand] %}
+
+Ecu = CarParams.Ecu
+{% endif %}
+{% if comments +%}
+{{ comments | join() }}
+{% endif %}
+{% if FINGERPRINTS[brand] %}
+
+FINGERPRINTS = {
+{% for car, fingerprints in FINGERPRINTS[brand].items() %}
+ CAR.{{car.name}}: [{
+{% for fingerprint in fingerprints %}
+{% if not loop.first %}
+ {{ "{" }}
+{% endif %}
+ {% for key, value in fingerprint.items() %}{{key}}: {{value}}{% if not loop.last %}, {% endif %}{% endfor %}
+
+ }{% if loop.last %}]{% endif %},
+{% endfor %}
+{% endfor %}
+}
+{% endif %}
+
+FW_VERSIONS{% if not FW_VERSIONS[brand] %}: dict[str, dict[tuple, list[bytes]]]{% endif %} = {
+{% for car, _ in FW_VERSIONS[brand].items() %}
+ CAR.{{car.name}}: {
+{% for key, fw_versions in FW_VERSIONS[brand][car].items() %}
+ (Ecu.{{ECU_NAME[key[0]]}}, 0x{{"%0x" | format(key[1] | int)}}, \
+{% if key[2] %}0x{{"%0x" | format(key[2] | int)}}{% else %}{{key[2]}}{% endif %}): [
+ {% for fw_version in (fw_versions + extra_fw_versions.get(car, {}).get(key, [])) | unique | sort %}
+ {{fw_version}},
+ {% endfor %}
+ ],
+{% endfor %}
+ },
+{% endfor %}
+}
+
+""", trim_blocks=True)
+
+
+def format_brand_fw_versions(brand, extra_fw_versions: None | dict[str, dict[tuple, list[bytes]]] = None):
+ extra_fw_versions = extra_fw_versions or {}
+
+ fingerprints_file = os.path.join(BASEDIR, f"{brand}/fingerprints.py")
+ with open(fingerprints_file) as f:
+ comments = [line for line in f.readlines() if line.startswith("#") and "noqa" not in line]
+
+ with open(fingerprints_file, "w") as f:
+ f.write(FINGERPRINTS_PY_TEMPLATE.render(brand=brand, comments=comments, ECU_NAME=ECU_NAME,
+ FINGERPRINTS=FINGERPRINTS, FW_VERSIONS=FW_VERSIONS,
+ extra_fw_versions=extra_fw_versions))
+
+
+if __name__ == "__main__":
+ for brand in FW_VERSIONS.keys():
+ format_brand_fw_versions(brand)
diff --git a/iqdbc_repo/iqdbc/car/disable_ecu.py b/iqdbc_repo/iqdbc/car/disable_ecu.py
new file mode 100644
index 000000000..f5f325c7d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/disable_ecu.py
@@ -0,0 +1,37 @@
+from iqdbc.car.carlog import carlog
+from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery
+
+EXT_DIAG_REQUEST = b'\x10\x03'
+EXT_DIAG_RESPONSE = b'\x50\x03'
+
+COM_CONT_RESPONSE = b''
+
+
+def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_req=b'\x28\x83\x01',
+ timeout=0.1, retry=10, response_offset: int = 0x8):
+ """Silence an ECU by disabling sending and receiving messages using UDS 0x28.
+ The ECU will stay silent as long as openpilot keeps sending Tester Present.
+
+ This is used to disable the radar in some cars. Openpilot will emulate the radar.
+ WARNING: THIS DISABLES AEB!"""
+ carlog.warning(f"ecu disable {hex(addr), sub_addr} ...")
+
+ for i in range(retry):
+ try:
+ query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [EXT_DIAG_REQUEST], [EXT_DIAG_RESPONSE], response_offset)
+
+ for _, _ in query.get_data(timeout).items():
+ carlog.warning("communication control disable tx/rx ...")
+
+ query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [com_cont_req], [COM_CONT_RESPONSE], response_offset)
+ query.get_data(0)
+
+ carlog.warning("ecu disabled")
+ return True
+
+ except Exception:
+ carlog.exception("ecu disable exception")
+
+ carlog.error(f"ecu disable retry ({i + 1}) ...")
+ carlog.error("ecu disable failed")
+ return False
diff --git a/iqdbc_repo/iqdbc/car/docs.py b/iqdbc_repo/iqdbc/car/docs.py
new file mode 100755
index 000000000..43e85fbf1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/docs.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+import re
+import os
+import jinja2
+import argparse
+import unicodedata
+from typing import get_args
+
+from enum import Enum
+from collections import defaultdict
+
+from iqdbc.car.common.basedir import BASEDIR
+from iqdbc.car import gen_empty_fingerprint
+from iqdbc.car.structs import CarParams, IQCarParams
+from iqdbc.car.docs_definitions import BaseCarHarness, CarDocs, Device, ExtraCarDocs, Column, ExtraCarsColumn, CommonFootnote, PartType, SupportType
+from iqdbc.car.car_helpers import interfaces
+from iqdbc.car.interfaces import get_interface_attr
+from iqdbc.car.values import Platform
+from iqdbc.car.mock.values import CAR as MOCK
+from iqdbc.car.extra_cars import CAR as EXTRA
+
+
+EXTRA_CARS_MD_OUT = os.path.join(BASEDIR, "../", "../", "docs", "CARS.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) -> tuple[CarParams, IQCarParams]:
+ cp_platform = platform if platform in interfaces else MOCK.MOCK
+ CP: CarParams = interfaces[cp_platform].get_params(cp_platform, fingerprint=gen_empty_fingerprint(),
+ car_fw=[CarParams.CarFw(ecu=CarParams.Ecu.unknown)],
+ alpha_long=True, is_release=True, docs=True)
+
+ CP_IQ: IQCarParams = interfaces[cp_platform].get_params_iq(CP, cp_platform, fingerprint=gen_empty_fingerprint(),
+ car_fw=[CarParams.CarFw(ecu=CarParams.Ecu.unknown)],
+ alpha_long=True, is_release_iq=True, docs=True)
+ return CP, CP_IQ
+
+
+def get_all_footnotes() -> dict[Enum, int]:
+ all_footnotes = list(CommonFootnote)
+ for footnotes in get_interface_attr("Footnote", ignore_none=True).values():
+ all_footnotes.extend(footnotes)
+ return {fn: idx + 1 for idx, fn in enumerate(all_footnotes)}
+
+
+def _natural_sort_key(s):
+ # NFKD normalization ensures accented characters sort with their base letter (e.g., Š sorts with S)
+ normalized = unicodedata.normalize('NFKD', s)
+ return [int(t) if t.isdigit() else t.lower() for t in re.split(r'(\d+)', normalized) if t]
+
+
+def build_sorted_car_docs_list(platforms, footnotes=None):
+ collected_car_docs: list[CarDocs | ExtraCarDocs] = []
+ for platform in platforms.values():
+ car_docs = platform.config.car_docs
+ CP, CP_IQ = get_params_for_docs(platform)
+
+ if not len(car_docs):
+ continue
+
+ # A platform can include multiple car models
+ for _car_docs in car_docs:
+ if not hasattr(_car_docs, "row"):
+ _car_docs.init_make(CP)
+ _car_docs.init(CP, footnotes)
+ collected_car_docs.append(_car_docs)
+
+ # Sort cars by make and model + year
+ sorted_cars = sorted(collected_car_docs, key=lambda car: _natural_sort_key(car.name))
+ return sorted_cars
+
+
+# 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)
+ return sorted_list
+
+
+def group_by_make(all_car_docs: list[CarDocs]) -> dict[str, list[CarDocs]]:
+ sorted_car_docs = defaultdict(list)
+ for car_docs in all_car_docs:
+ sorted_car_docs[car_docs.make].append(car_docs)
+ return dict(sorted_car_docs)
+
+
+def generate_cars_md(all_car_docs: list[CarDocs], template_fn: str, **kwargs) -> str:
+ with open(template_fn) as f:
+ template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True)
+
+ 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,
+ **kwargs)
+ return cars_md
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Auto generates supportability info docs for all known cars",
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+
+ parser.add_argument("--out", default=EXTRA_CARS_MD_OUT, help="Override default generated filename")
+ args = parser.parse_args()
+
+ with open(args.out, 'w') as f:
+ f.write(generate_cars_md(get_all_car_docs(), args.template))
+ print(f"Generated and written to {args.out}")
diff --git a/iqdbc_repo/iqdbc/car/docs_definitions.py b/iqdbc_repo/iqdbc/car/docs_definitions.py
new file mode 100644
index 000000000..8d0a3adcb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/docs_definitions.py
@@ -0,0 +1,406 @@
+import re
+from collections import namedtuple
+import copy
+from dataclasses import dataclass, field
+from enum import Enum
+
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.structs import CarParams
+
+GOOD_TORQUE_THRESHOLD = 1.0 # m/s^2
+MODEL_YEARS_RE = r"(?<= )((\d{4}-\d{2})|(\d{4}))(,|$)"
+
+
+class Column(Enum):
+ MAKE = "Make"
+ MODEL = "Model"
+ PACKAGE = "Supported Package"
+ LONGITUDINAL = "ACC"
+ FSR_LONGITUDINAL = "No ACC accel below"
+ FSR_STEERING = "No ALC below"
+ STEERING_TORQUE = "Steering Torque"
+ AUTO_RESUME = "Resume from stop"
+ HARDWARE = "Hardware Needed"
+ VIDEO = "Video"
+ SETUP_VIDEO = "Setup Video"
+
+
+class ExtraCarsColumn(Enum):
+ MAKE = "Make"
+ MODEL = "Model"
+ PACKAGE = "Package"
+ SUPPORT = "Support Level"
+
+
+class SupportType(Enum):
+ UPSTREAM = "Upstream" # Actively maintained by comma, plug-and-play in release versions of openpilot
+ REVIEW = "Under review" # Dashcam, but planned for official support after safety validation
+ DASHCAM = "Dashcam mode" # Dashcam, but may be drivable in a community fork
+ COMMUNITY = "Community" # Not upstream, but available in a custom community fork, not validated by comma
+ CUSTOM = "Custom" # Upstream, but don't have a harness available or need an unusual custom install
+ INCOMPATIBLE = "Not compatible" # Known fundamental incompatibility such as Flexray or hydraulic power steering
+
+
+class Star(Enum):
+ FULL = "full"
+ HALF = "half"
+ EMPTY = "empty"
+
+
+# A part + its comprised parts
+@dataclass
+class BasePart:
+ name: str
+ parts: list[Enum] = field(default_factory=list)
+
+ def all_parts(self):
+ # Recursively get all parts
+ _parts = 'parts'
+ parts = []
+ parts.extend(getattr(self, _parts))
+ for part in getattr(self, _parts):
+ parts.extend(part.value.all_parts())
+
+ return parts
+
+
+class EnumBase(Enum):
+ @property
+ def part_type(self):
+ return PartType(self.__class__)
+
+
+class Mount(EnumBase):
+ mount = BasePart("mount")
+
+
+class Cable(EnumBase):
+ long_obdc_cable = BasePart("long OBD-C cable (9.5 ft)")
+ usb_a_2_a_cable = BasePart("USB A-A cable")
+ usbc_otg_cable = BasePart("USB C OTG cable")
+ obd_c_cable_2ft = BasePart("OBD-C cable (2 ft)")
+
+
+class Accessory(EnumBase):
+ harness_box = BasePart("harness box")
+ comma_power = BasePart("comma power v3")
+
+
+class Tool(EnumBase):
+ socket_8mm_deep = BasePart("Socket Wrench 8mm or 5/16\" (deep)")
+ pry_tool = BasePart("Pry Tool")
+
+
+@dataclass
+class BaseCarHarness(BasePart):
+ parts: list[Enum] = field(default_factory=lambda: [Accessory.harness_box, Accessory.comma_power])
+ has_connector: bool = True # without are hidden on the harness connector page
+
+
+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", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool])
+ subaru_b = BaseCarHarness("Subaru B connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool])
+ subaru_c = BaseCarHarness("Subaru C connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool])
+ subaru_d = BaseCarHarness("Subaru D connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool])
+ fca = BaseCarHarness("FCA connector")
+ ram = BaseCarHarness("Ram connector")
+ vw_a = BaseCarHarness("VW A connector")
+ vw_j533 = BaseCarHarness("VW J533 connector", parts=[Accessory.harness_box, Cable.long_obdc_cable])
+ hyundai_a = BaseCarHarness("Hyundai A connector")
+ hyundai_b = BaseCarHarness("Hyundai B connector")
+ hyundai_c = BaseCarHarness("Hyundai C connector")
+ hyundai_d = BaseCarHarness("Hyundai D connector")
+ hyundai_e = BaseCarHarness("Hyundai E connector")
+ hyundai_f = BaseCarHarness("Hyundai F connector")
+ hyundai_g = BaseCarHarness("Hyundai G connector")
+ hyundai_h = BaseCarHarness("Hyundai H connector")
+ hyundai_i = BaseCarHarness("Hyundai I connector")
+ hyundai_j = BaseCarHarness("Hyundai J connector")
+ hyundai_k = BaseCarHarness("Hyundai K connector")
+ hyundai_l = BaseCarHarness("Hyundai L connector")
+ hyundai_m = BaseCarHarness("Hyundai M connector")
+ hyundai_n = BaseCarHarness("Hyundai N connector")
+ hyundai_o = BaseCarHarness("Hyundai O connector")
+ hyundai_p = BaseCarHarness("Hyundai P connector")
+ hyundai_q = BaseCarHarness("Hyundai Q connector")
+ hyundai_r = BaseCarHarness("Hyundai R connector")
+ custom = BaseCarHarness("Developer connector")
+ obd_ii = BaseCarHarness("OBD-II connector", parts=[Cable.long_obdc_cable], has_connector=False)
+ gm = BaseCarHarness("GM connector", parts=[Accessory.harness_box])
+ gmsdgm = BaseCarHarness("GM SDGM connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable])
+ nissan_a = BaseCarHarness("Nissan A connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable])
+ nissan_b = BaseCarHarness("Nissan B connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable])
+ mazda = BaseCarHarness("Mazda connector")
+ ford_q3 = BaseCarHarness("Ford Q3 connector")
+ ford_q4 = BaseCarHarness("Ford Q4 connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable])
+ rivian = BaseCarHarness("Rivian A connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable])
+ tesla_a = BaseCarHarness("Tesla A connector", parts=[Accessory.harness_box, Cable.long_obdc_cable])
+ tesla_b = BaseCarHarness("Tesla B connector", parts=[Accessory.harness_box, Cable.long_obdc_cable])
+ psa_a = BaseCarHarness("PSA A connector", parts=[Accessory.harness_box, Cable.long_obdc_cable])
+
+ # custom harness
+ honda_clarity = BaseCarHarness("Honda Nidec connector + Honda Clarity Proxy Board")
+
+
+class Device(EnumBase):
+ four = BasePart("comma four", parts=[Mount.mount, Cable.obd_c_cable_2ft])
+
+
+class PartType(Enum):
+ accessory = Accessory
+ cable = Cable
+ connector = CarHarness
+ device = Device
+ mount = Mount
+ tool = Tool
+
+
+DEFAULT_CAR_PARTS: list[EnumBase] = [Device.four]
+
+
+@dataclass
+class CarParts:
+ parts: list[EnumBase] = field(default_factory=list)
+ custom_parts_url: str | None = None
+
+ def __call__(self):
+ return copy.deepcopy(self)
+
+ @classmethod
+ def common(cls, add: list[EnumBase] | None = None, remove: list[EnumBase] | None = None):
+ p = [part for part in (add or []) + DEFAULT_CAR_PARTS if part not in (remove or [])]
+ return cls(p)
+
+ def all_parts(self):
+ parts = []
+ for part in self.parts:
+ parts.extend(part.value.all_parts())
+ return self.parts + parts
+
+
+CarFootnote = namedtuple("CarFootnote", ["text", "column", "docs_only", "setup_note"], defaults=(False, False))
+
+
+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`.",
+ Column.LONGITUDINAL, docs_only=True)
+
+
+def get_footnotes(footnotes: list[Enum], column: Column) -> list[Enum]:
+ # Returns applicable footnotes given current column
+ return [fn for fn in footnotes if fn.value.column == column]
+
+
+# TODO: store years as a list
+def get_year_list(years):
+ years_list = []
+ if len(years) == 0:
+ return years_list
+
+ for year in years.split(','):
+ year = year.strip()
+ if len(year) == 4:
+ years_list.append(str(year))
+ elif "-" in year and len(year) == 7:
+ start, end = year.split("-")
+ years_list.extend(map(str, range(int(start), int(f"20{end}") + 1)))
+ else:
+ raise Exception(f"Malformed year string: {years}")
+ return years_list
+
+
+def split_name(name: str) -> tuple[str, str, str]:
+ make, model = name.split(" ", 1)
+ years = ""
+ match = re.search(MODEL_YEARS_RE, model)
+ if match is not None:
+ years = model[match.start():]
+ model = model[:match.start() - 1]
+ return make, model, years
+
+
+@dataclass
+class CarDocs:
+ # make + model + model years
+ name: str
+
+ # the simplest description of the requirements for the US market
+ package: str
+
+ video: str | None = None
+ setup_video: str | None = None
+ footnotes: list[Enum] = field(default_factory=list)
+ min_steer_speed: float | None = None
+ min_enable_speed: float | None = None
+ auto_resume: bool | None = None
+
+ # all the parts needed for the supported car
+ car_parts: CarParts = field(default_factory=CarParts)
+
+ merged: bool = True
+ support_type: SupportType = SupportType.UPSTREAM
+ support_link: str | None = "#upstream"
+
+ def __post_init__(self):
+ self.make, self.model, self.years = split_name(self.name)
+ self.year_list = get_year_list(self.years)
+
+ def init(self, CP: CarParams, all_footnotes=None):
+ self.brand = CP.brand
+ self.car_fingerprint = CP.carFingerprint
+ self.longitudinal_control = CP.openpilotLongitudinalControl and not CP.alphaLongitudinalAvailable
+
+ if self.merged and CP.dashcamOnly:
+ if self.support_type not in (SupportType.CUSTOM, SupportType.REVIEW):
+ self.support_type = SupportType.DASHCAM
+ self.support_link = "#dashcam"
+
+ # longitudinal column
+ op_long = "Stock"
+ if CP.alphaLongitudinalAvailable:
+ op_long = "openpilot available"
+ self.footnotes.append(CommonFootnote.EXP_LONG_AVAIL)
+ elif CP.openpilotLongitudinalControl:
+ op_long = "openpilot"
+
+ # min steer & enable speed columns
+ # TODO: set all the min steer speeds in carParams and remove this
+ if self.min_steer_speed is not None:
+ assert CP.minSteerSpeed < 0.5, f"{CP.carFingerprint}: Minimum steer speed set in both CarDocs and CarParams"
+ else:
+ self.min_steer_speed = CP.minSteerSpeed
+
+ # TODO: set all the min enable speeds in carParams correctly and remove this
+ if self.min_enable_speed is None:
+ self.min_enable_speed = CP.minEnableSpeed
+
+ if self.auto_resume is None:
+ self.auto_resume = CP.autoResumeSng and self.min_enable_speed <= 0
+
+ # hardware column
+ hardware_col = "None"
+ if self.car_parts.parts:
+ if self.car_parts.custom_parts_url is not None:
+ buy_link = f'Buy Here '
+ else:
+ buy_link = f'Buy Here '
+
+ tools_docs = [part for part in self.car_parts.all_parts() if isinstance(part, Tool)]
+ parts_docs = [part for part in self.car_parts.all_parts() if not isinstance(part, Tool)]
+
+ def display_func(parts):
+ return ' '.join([f"- {parts.count(part)} {part.value.name}" for part in sorted(set(parts), key=lambda part: str(part.value.name))])
+
+ hardware_col = f'Parts {display_func(parts_docs)} {buy_link} '
+ if len(tools_docs):
+ hardware_col += f'Tools {display_func(tools_docs)} '
+
+ self.row: dict[Enum, str | Star] = {
+ Column.MAKE: self.make,
+ Column.MODEL: self.model,
+ Column.PACKAGE: self.package,
+ Column.LONGITUDINAL: op_long,
+ Column.FSR_LONGITUDINAL: f"{max(self.min_enable_speed * CV.MS_TO_MPH, 0):.0f} mph",
+ Column.FSR_STEERING: f"{max(self.min_steer_speed * CV.MS_TO_MPH, 0):.0f} mph",
+ Column.STEERING_TORQUE: Star.EMPTY,
+ Column.AUTO_RESUME: Star.FULL if self.auto_resume else Star.EMPTY,
+ Column.HARDWARE: hardware_col,
+ Column.VIDEO: self.video or "", # replaced with an image and link from template in get_column
+ Column.SETUP_VIDEO: self.setup_video or "", # replaced with an image and link from template in get_column
+ }
+
+ if self.support_link is not None:
+ support_info = f"[{self.support_type.value}]({self.support_link})"
+ else:
+ support_info = self.support_type.value
+
+ self.extra_cars_row: dict[Enum, str] = {
+ ExtraCarsColumn.MAKE: self.make,
+ ExtraCarsColumn.MODEL: self.model,
+ ExtraCarsColumn.PACKAGE: self.package,
+ ExtraCarsColumn.SUPPORT: support_info,
+ }
+
+ # Set steering torque star from max lateral acceleration
+ assert CP.maxLateralAccel > 0.1
+ if CP.maxLateralAccel >= GOOD_TORQUE_THRESHOLD:
+ self.row[Column.STEERING_TORQUE] = Star.FULL
+
+ self.all_footnotes = all_footnotes
+ self.detail_sentence = self.get_detail_sentence(CP)
+
+ return self
+
+ def init_make(self, CP: CarParams):
+ """CarDocs subclasses can add make-specific logic for harness selection, footnotes, etc."""
+
+ def get_detail_sentence(self, CP):
+ if not CP.notCar:
+ sentence_builder = "openpilot upgrades your {car_model} with automated lane centering{alc} and adaptive cruise control{acc}."
+
+ if self.min_steer_speed > self.min_enable_speed:
+ alc = f" above {self.min_steer_speed * CV.MS_TO_MPH:.0f} mph ," if self.min_steer_speed > 0 else " at all speeds ,"
+ else:
+ alc = ""
+
+ # Exception for cars which do not auto-resume yet
+ acc = ""
+ if self.min_enable_speed > 0:
+ acc = f" while driving above {self.min_enable_speed * CV.MS_TO_MPH:.0f} mph "
+ elif self.auto_resume:
+ acc = " that automatically resumes from a stop "
+
+ if self.row[Column.STEERING_TORQUE] != Star.FULL:
+ sentence_builder += " This car may not be able to take tight turns on its own."
+
+ # experimental mode
+ exp_link = "Experimental mode "
+ if CP.openpilotLongitudinalControl and not CP.alphaLongitudinalAvailable:
+ sentence_builder += f" Traffic light and stop sign handling is also available in {exp_link}."
+
+ return sentence_builder.format(car_model=f"{self.make} {self.model}", alc=alc, acc=acc)
+
+ else:
+ if CP.carFingerprint == "COMMA_BODY":
+ 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}")
+
+ def get_column(self, column: Column, star_icon: str, video_icon: str, footnote_tag: str) -> str:
+ item: str | Star = self.row[column]
+ if isinstance(item, Star):
+ item = star_icon.format(item.value)
+ elif column == Column.MODEL and len(self.years):
+ item += f" {self.years}"
+ elif column in (Column.VIDEO, Column.SETUP_VIDEO) and len(item) > 0:
+ item = video_icon.format(item)
+
+ footnotes = get_footnotes(self.footnotes, column)
+ if len(footnotes):
+ sups = sorted([self.all_footnotes[fn] for fn in footnotes])
+ item += footnote_tag.format(f'{",".join(map(str, sups))}')
+
+ return item
+
+ def get_extra_cars_column(self, column: ExtraCarsColumn) -> str:
+ item: str = self.extra_cars_row[column]
+ if column == ExtraCarsColumn.MODEL and len(self.years):
+ item += f" {self.years}"
+
+ return item
+
+
+@dataclass
+class ExtraCarDocs(CarDocs):
+ package: str = "All"
+ merged: bool = False
+ support_type: SupportType = SupportType.INCOMPATIBLE
+ support_link: str | None = "#incompatible"
diff --git a/iqdbc_repo/iqdbc/car/ecu_addrs.py b/iqdbc_repo/iqdbc/car/ecu_addrs.py
new file mode 100644
index 000000000..bfc5b345c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ecu_addrs.py
@@ -0,0 +1,56 @@
+import time
+
+from iqdbc.car import make_tester_present_msg, uds
+from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable
+from iqdbc.car.carlog import carlog
+from iqdbc.car.fw_query_definitions import EcuAddrBusType
+
+
+def _is_tester_present_response(msg: CanData, subaddr: int | None = None) -> bool:
+ # ISO-TP messages may use CAN frame optimization (not always 8 bytes)
+ # tester present response is always a single frame
+ dat_offset = 1 if subaddr is not None else 0
+ min_length = 4 if subaddr is not None else 3 # bytes: frame len, (pos/neg) sid, (optional negative sid)/0x00 sub-function
+ if min_length <= len(msg.dat) <= 8 and 1 <= msg.dat[dat_offset] <= 7:
+ # success response
+ if msg.dat[dat_offset + 1] == (uds.SERVICE_TYPE.TESTER_PRESENT + 0x40):
+ return True
+ # error response
+ if msg.dat[dat_offset + 1] == 0x7F and msg.dat[dat_offset + 2] == uds.SERVICE_TYPE.TESTER_PRESENT:
+ return True
+ return False
+
+
+def get_all_ecu_addrs(can_recv: CanRecvCallable, can_send: CanSendCallable, bus: int, timeout: float = 1) -> set[EcuAddrBusType]:
+ addr_list = [0x700 + i for i in range(256)] + [0x18da00f1 + (i << 8) for i in range(256)]
+ queries: set[EcuAddrBusType] = {(addr, None, bus) for addr in addr_list}
+ responses = queries
+ return get_ecu_addrs(can_recv, can_send, queries, responses, timeout=timeout)
+
+
+def get_ecu_addrs(can_recv: CanRecvCallable, can_send: CanSendCallable, queries: set[EcuAddrBusType],
+ responses: set[EcuAddrBusType], timeout: float = 1) -> set[EcuAddrBusType]:
+ ecu_responses: set[EcuAddrBusType] = set() # set((addr, subaddr, bus),)
+ try:
+ msgs = [make_tester_present_msg(addr, bus, subaddr) for addr, subaddr, bus in queries]
+
+ can_recv()
+ can_send(msgs)
+ start_time = time.monotonic()
+ while time.monotonic() - start_time < timeout:
+ can_packets = can_recv(wait_for_one=True)
+ for packet in can_packets:
+ for msg in packet:
+ if not len(msg.dat):
+ carlog.warning("ECU addr scan: skipping empty remote frame")
+ continue
+
+ subaddr = None if (msg.address, None, msg.src) in responses else msg.dat[0]
+ if (msg.address, subaddr, msg.src) in responses and _is_tester_present_response(msg, subaddr):
+ carlog.debug(f"CAN-RX: {hex(msg.address)} - 0x{bytes.hex(msg.dat)}")
+ if (msg.address, subaddr, msg.src) in ecu_responses:
+ carlog.debug(f"Duplicate ECU address: {hex(msg.address)}")
+ ecu_responses.add((msg.address, subaddr, msg.src))
+ except Exception:
+ carlog.exception("ECU addr scan exception")
+ return ecu_responses
diff --git a/iqdbc_repo/iqdbc/car/extra_cars.py b/iqdbc_repo/iqdbc/car/extra_cars.py
new file mode 100644
index 000000000..1dff5f7fa
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/extra_cars.py
@@ -0,0 +1,88 @@
+from dataclasses import dataclass
+
+from iqdbc.car import structs, Platforms, ExtraPlatformConfig
+from iqdbc.car.docs_definitions import ExtraCarDocs, SupportType
+
+
+@dataclass
+class CommunityCarDocs(ExtraCarDocs):
+ def init_make(self, CP: structs.CarParams):
+ self.support_type = SupportType.COMMUNITY
+ self.support_link = "#community"
+
+
+@dataclass
+class ToyotaSecurityCarDocs(ExtraCarDocs):
+ def init_make(self, CP: structs.CarParams):
+ self.support_type = SupportType.INCOMPATIBLE
+ self.support_link = "#can-bus-security"
+
+
+@dataclass
+class GMSecurityCarDocs(ExtraCarDocs):
+ def init_make(self, CP: structs.CarParams):
+ self.support_type = SupportType.INCOMPATIBLE
+ self.support_link = "#can-bus-security"
+
+
+@dataclass
+class FlexRayCarDocs(ExtraCarDocs):
+ def init_make(self, CP: structs.CarParams):
+ self.support_type = SupportType.INCOMPATIBLE
+ self.support_link = "#flexray"
+
+
+class CAR(Platforms):
+ config: ExtraPlatformConfig
+
+ EXTRA_HONDA = ExtraPlatformConfig(
+ [
+ CommunityCarDocs("Acura ADX 2025-26"),
+ CommunityCarDocs("Acura Integra 2023-25"),
+ CommunityCarDocs("Acura MDX 2015-16", "Advance Package"),
+ CommunityCarDocs("Acura MDX 2017-20"),
+ CommunityCarDocs("Acura MDX Hybrid 2017-20"),
+ CommunityCarDocs("Acura MDX 2022-24"),
+ CommunityCarDocs("Acura RDX 2022-25"),
+ CommunityCarDocs("Acura RLX 2017", "Advance Package or Technology Package"),
+ CommunityCarDocs("Acura TLX 2015-17", "Advance Package"),
+ CommunityCarDocs("Acura TLX 2018-20"),
+ CommunityCarDocs("Acura TLX 2022-23"),
+ GMSecurityCarDocs("Acura ZDX 2024"),
+ CommunityCarDocs("Honda Accord 2016-17", "Honda Sensing"),
+ CommunityCarDocs("Honda Accord Hybrid 2017"),
+ CommunityCarDocs("Honda Clarity 2018-21"),
+ GMSecurityCarDocs("Honda Prologue 2024-25"),
+ ],
+ )
+
+ EXTRA_HYUNDAI = ExtraPlatformConfig(
+ [
+ CommunityCarDocs("Hyundai Palisade 2023-24", "Highway Driving Assist II"),
+ CommunityCarDocs("Kia Telluride 2023-24", "Highway Driving Assist II"),
+ ],
+ )
+
+ EXTRA_TOYOTA = ExtraPlatformConfig(
+ [
+ ToyotaSecurityCarDocs("Subaru Solterra 2023-25"),
+ ToyotaSecurityCarDocs("Lexus NS 2022-25"),
+ ToyotaSecurityCarDocs("Toyota bZ4x 2023-25"),
+ ToyotaSecurityCarDocs("Toyota Camry 2025"),
+ ToyotaSecurityCarDocs("Toyota Corolla Cross 2022-25"),
+ ToyotaSecurityCarDocs("Toyota Highlander 2025"),
+ ToyotaSecurityCarDocs("Toyota RAV4 Prime 2024-25"),
+ ToyotaSecurityCarDocs("Toyota Sequoia 2023-25"),
+ ToyotaSecurityCarDocs("Toyota Sienna 2024-25"),
+ ToyotaSecurityCarDocs("Toyota Tundra 2022-25"),
+ ToyotaSecurityCarDocs("Toyota Venza 2021-25"),
+ ],
+ )
+
+ EXTRA_VOLKSWAGEN = ExtraPlatformConfig(
+ [
+ FlexRayCarDocs("Audi A4 2016-24"),
+ FlexRayCarDocs("Audi A5 2016-24"),
+ FlexRayCarDocs("Audi Q5 2017-24"),
+ ],
+ )
diff --git a/iqdbc_repo/iqdbc/car/fingerprints.py b/iqdbc_repo/iqdbc/car/fingerprints.py
new file mode 100644
index 000000000..507a0451a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/fingerprints.py
@@ -0,0 +1,341 @@
+from iqdbc.car.interfaces import get_interface_attr
+from iqdbc.car.body.values import CAR as BODY
+from iqdbc.car.chrysler.values import CAR as CHRYSLER
+from iqdbc.car.ford.values import CAR as FORD
+from iqdbc.car.gm.values import CAR as GM
+from iqdbc.car.honda.values import CAR as HONDA
+from iqdbc.car.hyundai.values import CAR as HYUNDAI
+from iqdbc.car.mazda.values import CAR as MAZDA
+from iqdbc.car.mock.values import CAR as MOCK
+from iqdbc.car.nissan.values import CAR as NISSAN
+from iqdbc.car.subaru.values import CAR as SUBARU
+from iqdbc.car.toyota.values import CAR as TOYOTA
+from iqdbc.car.volkswagen.values import CAR as VW
+
+FW_VERSIONS = get_interface_attr('FW_VERSIONS', combine_brands=True, ignore_none=True)
+_FINGERPRINTS = get_interface_attr('FINGERPRINTS', combine_brands=True, ignore_none=True)
+
+_DEBUG_ADDRESS = {1880: 8} # reserved for debug purposes
+
+
+def is_valid_for_fingerprint(msg, car_fingerprint: dict[int, int]):
+ adr = msg.address
+ # ignore addresses that are more than 11 bits
+ return (adr in car_fingerprint and car_fingerprint[adr] == len(msg.dat)) or adr >= 0x800
+
+
+def eliminate_incompatible_cars(msg, candidate_cars):
+ """Removes cars that could not have sent msg.
+
+ Inputs:
+ msg: A cereal/log CanData message from the car.
+ candidate_cars: A list of cars to consider.
+
+ Returns:
+ A list containing the subset of candidate_cars that could have sent msg.
+ """
+ compatible_cars = []
+
+ for car_name in candidate_cars:
+ car_fingerprints = _FINGERPRINTS[car_name]
+
+ for fingerprint in car_fingerprints:
+ # add alien debug address
+ if is_valid_for_fingerprint(msg, fingerprint | _DEBUG_ADDRESS):
+ compatible_cars.append(car_name)
+ break
+
+ return compatible_cars
+
+
+def all_legacy_fingerprint_cars():
+ """Returns a list of all known car strings, FPv1 only."""
+ return list(_FINGERPRINTS.keys())
+
+
+# A dict that maps old platform strings to their latest representations
+MIGRATION = {
+ "ACURA ILX 2016 ACURAWATCH PLUS": HONDA.ACURA_ILX,
+ "ACURA RDX 2018 ACURAWATCH PLUS": HONDA.ACURA_RDX,
+ "ACURA RDX 2020 TECH": HONDA.ACURA_RDX_3G,
+ "AUDI A3": VW.AUDI_A3_MK3,
+ "HONDA ACCORD 2018 HYBRID TOURING": HONDA.HONDA_ACCORD,
+ "HONDA ACCORD 1.5T 2018": HONDA.HONDA_ACCORD,
+ "HONDA ACCORD 2018 LX 1.5T": HONDA.HONDA_ACCORD,
+ "HONDA ACCORD 2018 SPORT 2T": HONDA.HONDA_ACCORD,
+ "HONDA ACCORD 2T 2018": HONDA.HONDA_ACCORD,
+ "HONDA ACCORD HYBRID 2018": HONDA.HONDA_ACCORD,
+ "HONDA CIVIC 2016 TOURING": HONDA.HONDA_CIVIC,
+ "HONDA CIVIC HATCHBACK 2017 SEDAN/COUPE 2019": HONDA.HONDA_CIVIC_BOSCH,
+ "HONDA CIVIC SEDAN 1.6 DIESEL": HONDA.HONDA_CIVIC_BOSCH_DIESEL,
+ "HONDA CR-V 2016 EXECUTIVE": HONDA.HONDA_CRV_EU,
+ "HONDA CR-V 2016 TOURING": HONDA.HONDA_CRV,
+ "HONDA CR-V 2017 EX": HONDA.HONDA_CRV_5G,
+ "HONDA CR-V 2019 HYBRID": HONDA.HONDA_CRV_HYBRID,
+ "HONDA FIT 2018 EX": HONDA.HONDA_FIT,
+ "HONDA HRV 2019 TOURING": HONDA.HONDA_HRV,
+ "HONDA INSIGHT 2019 TOURING": HONDA.HONDA_INSIGHT,
+ "HONDA ODYSSEY 2018 EX-L": HONDA.HONDA_ODYSSEY,
+ "HONDA PILOT 2017 TOURING": HONDA.HONDA_PILOT,
+ "HONDA PILOT 2019 ELITE": HONDA.HONDA_PILOT,
+ "HONDA PILOT 2019": HONDA.HONDA_PILOT,
+ "HONDA PASSPORT 2021": HONDA.HONDA_PILOT,
+ "HONDA RIDGELINE 2017 BLACK EDITION": HONDA.HONDA_RIDGELINE,
+ "HYUNDAI ELANTRA LIMITED ULTIMATE 2017": HYUNDAI.HYUNDAI_ELANTRA,
+ "HYUNDAI SANTA FE LIMITED 2019": HYUNDAI.HYUNDAI_SANTA_FE,
+ "HYUNDAI TUCSON DIESEL 2019": HYUNDAI.HYUNDAI_TUCSON,
+ "KIA OPTIMA 2016": HYUNDAI.KIA_OPTIMA_G4,
+ "KIA OPTIMA 2019": HYUNDAI.KIA_OPTIMA_G4_FL,
+ "KIA OPTIMA SX 2019 & 2016": HYUNDAI.KIA_OPTIMA_G4_FL,
+ "LEXUS CT 200H 2018": TOYOTA.LEXUS_CTH,
+ "LEXUS ES 300H 2018": TOYOTA.LEXUS_ES,
+ "LEXUS ES 300H 2019": TOYOTA.LEXUS_ES_TSS2,
+ "LEXUS IS300 2018": TOYOTA.LEXUS_IS,
+ "LEXUS NX300 2018": TOYOTA.LEXUS_NX,
+ "LEXUS NX300H 2018": TOYOTA.LEXUS_NX,
+ "LEXUS RX 350 2016": TOYOTA.LEXUS_RX,
+ "LEXUS RX350 2020": TOYOTA.LEXUS_RX_TSS2,
+ "LEXUS RX450 HYBRID 2020": TOYOTA.LEXUS_RX_TSS2,
+ "TOYOTA SIENNA XLE 2018": TOYOTA.TOYOTA_SIENNA,
+ "TOYOTA C-HR HYBRID 2018": TOYOTA.TOYOTA_CHR,
+ "TOYOTA COROLLA HYBRID TSS2 2019": TOYOTA.TOYOTA_COROLLA_TSS2,
+ "TOYOTA RAV4 HYBRID 2019": TOYOTA.TOYOTA_RAV4_TSS2,
+ "LEXUS ES HYBRID 2019": TOYOTA.LEXUS_ES_TSS2,
+ "LEXUS NX HYBRID 2018": TOYOTA.LEXUS_NX,
+ "LEXUS NX HYBRID 2020": TOYOTA.LEXUS_NX_TSS2,
+ "LEXUS RX HYBRID 2020": TOYOTA.LEXUS_RX_TSS2,
+ "TOYOTA ALPHARD HYBRID 2021": TOYOTA.TOYOTA_ALPHARD_TSS2,
+ "TOYOTA AVALON HYBRID 2019": TOYOTA.TOYOTA_AVALON_2019,
+ "TOYOTA AVALON HYBRID 2022": TOYOTA.TOYOTA_AVALON_TSS2,
+ "TOYOTA CAMRY HYBRID 2018": TOYOTA.TOYOTA_CAMRY,
+ "TOYOTA CAMRY HYBRID 2021": TOYOTA.TOYOTA_CAMRY_TSS2,
+ "TOYOTA C-HR HYBRID 2022": TOYOTA.TOYOTA_CHR_TSS2,
+ "TOYOTA HIGHLANDER HYBRID 2020": TOYOTA.TOYOTA_HIGHLANDER_TSS2,
+ "TOYOTA RAV4 HYBRID 2022": TOYOTA.TOYOTA_RAV4_TSS2_2022,
+ "TOYOTA RAV4 HYBRID 2023": TOYOTA.TOYOTA_RAV4_TSS2_2023,
+ "TOYOTA HIGHLANDER HYBRID 2018": TOYOTA.TOYOTA_HIGHLANDER,
+ "LEXUS ES HYBRID 2018": TOYOTA.LEXUS_ES,
+ "LEXUS RX HYBRID 2017": TOYOTA.LEXUS_RX,
+ "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN,
+ "KIA SPORTAGE HYBRID 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN,
+ "KIA SORENTO PLUG-IN HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN,
+ "CADILLAC ESCALADE ESV PLATINUM 2019": GM.CADILLAC_ESCALADE_ESV_2019,
+
+ # Removal of platform_str, see https://github.com/commaai/openpilot/pull/31868/
+ "COMMA BODY": BODY.COMMA_BODY,
+ "CHRYSLER PACIFICA HYBRID 2017": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID,
+ "CHRYSLER_PACIFICA_2017_HYBRID": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID,
+ "CHRYSLER PACIFICA HYBRID 2018": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID,
+ "CHRYSLER PACIFICA HYBRID 2019": CHRYSLER.CHRYSLER_PACIFICA_2019_HYBRID,
+ "CHRYSLER PACIFICA 2018": CHRYSLER.CHRYSLER_PACIFICA_2018,
+ "CHRYSLER PACIFICA 2020": CHRYSLER.CHRYSLER_PACIFICA_2020,
+ "DODGE DURANGO 2021": CHRYSLER.DODGE_DURANGO,
+ "JEEP GRAND CHEROKEE V6 2018": CHRYSLER.JEEP_GRAND_CHEROKEE,
+ "JEEP GRAND CHEROKEE 2019": CHRYSLER.JEEP_GRAND_CHEROKEE_2019,
+ "RAM 1500 5TH GEN": CHRYSLER.RAM_1500_5TH_GEN,
+ "RAM HD 5TH GEN": CHRYSLER.RAM_HD_5TH_GEN,
+ "FORD BRONCO SPORT 1ST GEN": FORD.FORD_BRONCO_SPORT_MK1,
+ "FORD ESCAPE 4TH GEN": FORD.FORD_ESCAPE_MK4,
+ "FORD EXPLORER 6TH GEN": FORD.FORD_EXPLORER_MK6,
+ "FORD F-150 14TH GEN": FORD.FORD_F_150_MK14,
+ "FORD F-150 LIGHTNING 1ST GEN": FORD.FORD_F_150_LIGHTNING_MK1,
+ "FORD FOCUS 4TH GEN": FORD.FORD_FOCUS_MK4,
+ "FORD MAVERICK 1ST GEN": FORD.FORD_MAVERICK_MK1,
+ "FORD MUSTANG MACH-E 1ST GEN": FORD.FORD_MUSTANG_MACH_E_MK1,
+ "HOLDEN ASTRA RS-V BK 2017": GM.HOLDEN_ASTRA,
+ "CHEVROLET VOLT PREMIER 2017": GM.CHEVROLET_VOLT,
+ "CADILLAC ATS Premium Performance 2018": GM.CADILLAC_ATS,
+ "CHEVROLET MALIBU PREMIER 2017": GM.CHEVROLET_MALIBU,
+ "GMC ACADIA DENALI 2018": GM.GMC_ACADIA,
+ "BUICK LACROSSE 2017": GM.BUICK_LACROSSE,
+ "BUICK REGAL ESSENCE 2018": GM.BUICK_REGAL,
+ "CADILLAC ESCALADE 2017": GM.CADILLAC_ESCALADE,
+ "CADILLAC ESCALADE ESV 2016": GM.CADILLAC_ESCALADE_ESV,
+ "CADILLAC ESCALADE ESV 2019": GM.CADILLAC_ESCALADE_ESV_2019,
+ "CHEVROLET BOLT EUV 2022": GM.CHEVROLET_BOLT_EUV,
+ "CHEVROLET SILVERADO 1500 2020": GM.CHEVROLET_SILVERADO,
+ "CHEVROLET EQUINOX 2019": GM.CHEVROLET_EQUINOX,
+ "CHEVROLET TRAILBLAZER 2021": GM.CHEVROLET_TRAILBLAZER,
+ "HONDA ACCORD 2018": HONDA.HONDA_ACCORD,
+ "HONDA CIVIC (BOSCH) 2019": HONDA.HONDA_CIVIC_BOSCH,
+ "HONDA CIVIC SEDAN 1.6 DIESEL 2019": HONDA.HONDA_CIVIC_BOSCH_DIESEL,
+ "HONDA CIVIC 2022": HONDA.HONDA_CIVIC_2022,
+ "HONDA CR-V 2017": HONDA.HONDA_CRV_5G,
+ "HONDA CR-V HYBRID 2019": HONDA.HONDA_CRV_HYBRID,
+ "HONDA HR-V 2023": HONDA.HONDA_HRV_3G,
+ "ACURA RDX 2020": HONDA.ACURA_RDX_3G,
+ "HONDA INSIGHT 2019": HONDA.HONDA_INSIGHT,
+ "HONDA E 2020": HONDA.HONDA_E,
+ "ACURA ILX 2016": HONDA.ACURA_ILX,
+ "HONDA CR-V 2016": HONDA.HONDA_CRV,
+ "HONDA CR-V EU 2016": HONDA.HONDA_CRV_EU,
+ "HONDA FIT 2018": HONDA.HONDA_FIT,
+ "HONDA FREED 2020": HONDA.HONDA_FREED,
+ "HONDA HRV 2019": HONDA.HONDA_HRV,
+ "HONDA ODYSSEY 2018": HONDA.HONDA_ODYSSEY,
+ "ACURA RDX 2018": HONDA.ACURA_RDX,
+ "HONDA PILOT 2017": HONDA.HONDA_PILOT,
+ "HONDA RIDGELINE 2017": HONDA.HONDA_RIDGELINE,
+ "HONDA CIVIC 2016": HONDA.HONDA_CIVIC,
+ "HYUNDAI AZERA 6TH GEN": HYUNDAI.HYUNDAI_AZERA_6TH_GEN,
+ "HYUNDAI AZERA HYBRID 6TH GEN": HYUNDAI.HYUNDAI_AZERA_HEV_6TH_GEN,
+ "HYUNDAI ELANTRA 2017": HYUNDAI.HYUNDAI_ELANTRA,
+ "HYUNDAI I30 N LINE 2019 & GT 2018 DCT": HYUNDAI.HYUNDAI_ELANTRA_GT_I30,
+ "HYUNDAI ELANTRA 2021": HYUNDAI.HYUNDAI_ELANTRA_2021,
+ "HYUNDAI ELANTRA HYBRID 2021": HYUNDAI.HYUNDAI_ELANTRA_HEV_2021,
+ "HYUNDAI GENESIS 2015-2016": HYUNDAI.HYUNDAI_GENESIS,
+ "HYUNDAI IONIQ HYBRID 2017-2019": HYUNDAI.HYUNDAI_IONIQ,
+ "HYUNDAI IONIQ HYBRID 2020-2022": HYUNDAI.HYUNDAI_IONIQ_HEV_2022,
+ "HYUNDAI IONIQ ELECTRIC LIMITED 2019": HYUNDAI.HYUNDAI_IONIQ_EV_LTD,
+ "HYUNDAI IONIQ ELECTRIC 2020": HYUNDAI.HYUNDAI_IONIQ_EV_2020,
+ "HYUNDAI IONIQ PLUG-IN HYBRID 2019": HYUNDAI.HYUNDAI_IONIQ_PHEV_2019,
+ "HYUNDAI IONIQ PHEV 2020": HYUNDAI.HYUNDAI_IONIQ_PHEV,
+ "HYUNDAI KONA 2020": HYUNDAI.HYUNDAI_KONA,
+ "HYUNDAI KONA ELECTRIC 2019": HYUNDAI.HYUNDAI_KONA_EV,
+ "HYUNDAI KONA ELECTRIC 2022": HYUNDAI.HYUNDAI_KONA_EV_2022,
+ "HYUNDAI KONA ELECTRIC 2ND GEN": HYUNDAI.HYUNDAI_KONA_EV_2ND_GEN,
+ "HYUNDAI KONA HYBRID 2020": HYUNDAI.HYUNDAI_KONA_HEV,
+ "HYUNDAI SANTA FE 2019": HYUNDAI.HYUNDAI_SANTA_FE,
+ "HYUNDAI SANTA FE 2022": HYUNDAI.HYUNDAI_SANTA_FE_2022,
+ "HYUNDAI SANTA FE HYBRID 2022": HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022,
+ "HYUNDAI SANTA FE PlUG-IN HYBRID 2022": HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022,
+ "HYUNDAI SONATA 2020": HYUNDAI.HYUNDAI_SONATA,
+ "HYUNDAI SONATA 2019": HYUNDAI.HYUNDAI_SONATA_LF,
+ "HYUNDAI STARIA 4TH GEN": HYUNDAI.HYUNDAI_STARIA_4TH_GEN,
+ "HYUNDAI TUCSON 2019": HYUNDAI.HYUNDAI_TUCSON,
+ "HYUNDAI PALISADE 2020": HYUNDAI.HYUNDAI_PALISADE,
+ "HYUNDAI VELOSTER 2019": HYUNDAI.HYUNDAI_VELOSTER,
+ "HYUNDAI SONATA HYBRID 2021": HYUNDAI.HYUNDAI_SONATA_HYBRID,
+ "HYUNDAI IONIQ 5 2022": HYUNDAI.HYUNDAI_IONIQ_5,
+ "HYUNDAI IONIQ 6 2023": HYUNDAI.HYUNDAI_IONIQ_6,
+ "HYUNDAI TUCSON 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN,
+ "HYUNDAI SANTA CRUZ 1ST GEN": HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN,
+ "HYUNDAI CUSTIN 1ST GEN": HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN,
+ "KIA FORTE E 2018 & GT 2021": HYUNDAI.KIA_FORTE,
+ "KIA K5 2021": HYUNDAI.KIA_K5_2021,
+ "KIA K5 HYBRID 2020": HYUNDAI.KIA_K5_HEV_2020,
+ "KIA K8 HYBRID 1ST GEN": HYUNDAI.KIA_K8_HEV_1ST_GEN,
+ "KIA NIRO EV 2020": HYUNDAI.KIA_NIRO_EV,
+ "KIA NIRO EV 2ND GEN": HYUNDAI.KIA_NIRO_EV_2ND_GEN,
+ "KIA NIRO HYBRID 2019": HYUNDAI.KIA_NIRO_PHEV,
+ "KIA NIRO PLUG-IN HYBRID 2022": HYUNDAI.KIA_NIRO_PHEV_2022,
+ "KIA NIRO HYBRID 2021": HYUNDAI.KIA_NIRO_HEV_2021,
+ "KIA NIRO HYBRID 2ND GEN": HYUNDAI.KIA_NIRO_HEV_2ND_GEN,
+ "KIA OPTIMA 4TH GEN": HYUNDAI.KIA_OPTIMA_G4,
+ "KIA OPTIMA 4TH GEN FACELIFT": HYUNDAI.KIA_OPTIMA_G4_FL,
+ "KIA OPTIMA HYBRID 2017 & SPORTS 2019": HYUNDAI.KIA_OPTIMA_H,
+ "KIA OPTIMA HYBRID 4TH GEN FACELIFT": HYUNDAI.KIA_OPTIMA_H_G4_FL,
+ "KIA SELTOS 2021": HYUNDAI.KIA_SELTOS,
+ "KIA SPORTAGE 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN,
+ "KIA SORENTO GT LINE 2018": HYUNDAI.KIA_SORENTO,
+ "KIA SORENTO 4TH GEN": HYUNDAI.KIA_SORENTO_4TH_GEN,
+ "KIA SORENTO HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN,
+ "KIA STINGER GT2 2018": HYUNDAI.KIA_STINGER,
+ "KIA STINGER 2022": HYUNDAI.KIA_STINGER_2022,
+ "KIA CEED INTRO ED 2019": HYUNDAI.KIA_CEED,
+ "KIA EV6 2022": HYUNDAI.KIA_EV6,
+ "KIA CARNIVAL 4TH GEN": HYUNDAI.KIA_CARNIVAL_4TH_GEN,
+ "GENESIS GV60 ELECTRIC 1ST GEN": HYUNDAI.GENESIS_GV60_EV_1ST_GEN,
+ "GENESIS G70 2018": HYUNDAI.GENESIS_G70,
+ "GENESIS G70 2020": HYUNDAI.GENESIS_G70_2020,
+ "GENESIS GV70 1ST GEN": HYUNDAI.GENESIS_GV70_1ST_GEN,
+ "GENESIS G80 2017": HYUNDAI.GENESIS_G80,
+ "GENESIS G90 2017": HYUNDAI.GENESIS_G90,
+ "GENESIS GV80 2023": HYUNDAI.GENESIS_GV80,
+ "MAZDA CX-5": MAZDA.MAZDA_CX5,
+ "MAZDA CX-9": MAZDA.MAZDA_CX9,
+ "MAZDA 3": MAZDA.MAZDA_3,
+ "MAZDA 6": MAZDA.MAZDA_6,
+ "MAZDA CX-9 2021": MAZDA.MAZDA_CX9_2021,
+ "MAZDA CX-5 2022": MAZDA.MAZDA_CX5_2022,
+ "NISSAN X-TRAIL 2017": NISSAN.NISSAN_XTRAIL,
+ "NISSAN LEAF 2018": NISSAN.NISSAN_LEAF,
+ "NISSAN LEAF 2018 Instrument Cluster": NISSAN.NISSAN_LEAF_IC,
+ "NISSAN ROGUE 2019": NISSAN.NISSAN_ROGUE,
+ "NISSAN ALTIMA 2020": NISSAN.NISSAN_ALTIMA,
+ "SUBARU ASCENT LIMITED 2019": SUBARU.SUBARU_ASCENT,
+ "SUBARU OUTBACK 6TH GEN": SUBARU.SUBARU_OUTBACK,
+ "SUBARU LEGACY 7TH GEN": SUBARU.SUBARU_LEGACY,
+ "SUBARU IMPREZA LIMITED 2019": SUBARU.SUBARU_IMPREZA,
+ "SUBARU IMPREZA SPORT 2020": SUBARU.SUBARU_IMPREZA_2020,
+ "SUBARU CROSSTREK HYBRID 2020": SUBARU.SUBARU_CROSSTREK_HYBRID,
+ "SUBARU FORESTER 2019": SUBARU.SUBARU_FORESTER,
+ "SUBARU FORESTER HYBRID 2020": SUBARU.SUBARU_FORESTER_HYBRID,
+ "SUBARU FORESTER 2017 - 2018": SUBARU.SUBARU_FORESTER_PREGLOBAL,
+ "SUBARU LEGACY 2015 - 2018": SUBARU.SUBARU_LEGACY_PREGLOBAL,
+ "SUBARU OUTBACK 2015 - 2017": SUBARU.SUBARU_OUTBACK_PREGLOBAL,
+ "SUBARU OUTBACK 2018 - 2019": SUBARU.SUBARU_OUTBACK_PREGLOBAL_2018,
+ "SUBARU FORESTER 2022": SUBARU.SUBARU_FORESTER_2022,
+ "SUBARU OUTBACK 7TH GEN": SUBARU.SUBARU_OUTBACK_2023,
+ "SUBARU ASCENT 2023": SUBARU.SUBARU_ASCENT_2023,
+ "TOYOTA ALPHARD 2020": TOYOTA.TOYOTA_ALPHARD_TSS2,
+ "TOYOTA AVALON 2016": TOYOTA.TOYOTA_AVALON,
+ "TOYOTA AVALON 2019": TOYOTA.TOYOTA_AVALON_2019,
+ "TOYOTA AVALON 2022": TOYOTA.TOYOTA_AVALON_TSS2,
+ "TOYOTA CAMRY 2018": TOYOTA.TOYOTA_CAMRY,
+ "TOYOTA CAMRY 2021": TOYOTA.TOYOTA_CAMRY_TSS2,
+ "TOYOTA C-HR 2018": TOYOTA.TOYOTA_CHR,
+ "TOYOTA C-HR 2021": TOYOTA.TOYOTA_CHR_TSS2,
+ "TOYOTA COROLLA 2017": TOYOTA.TOYOTA_COROLLA,
+ "TOYOTA COROLLA TSS2 2019": TOYOTA.TOYOTA_COROLLA_TSS2,
+ "TOYOTA HIGHLANDER 2017": TOYOTA.TOYOTA_HIGHLANDER,
+ "TOYOTA HIGHLANDER 2020": TOYOTA.TOYOTA_HIGHLANDER_TSS2,
+ "TOYOTA PRIUS 2017": TOYOTA.TOYOTA_PRIUS,
+ "TOYOTA PRIUS v 2017": TOYOTA.TOYOTA_PRIUS_V,
+ "TOYOTA PRIUS TSS2 2021": TOYOTA.TOYOTA_PRIUS_TSS2,
+ "TOYOTA RAV4 2017": TOYOTA.TOYOTA_RAV4,
+ "TOYOTA RAV4 HYBRID 2017": TOYOTA.TOYOTA_RAV4H,
+ "TOYOTA RAV4 2019": TOYOTA.TOYOTA_RAV4_TSS2,
+ "TOYOTA RAV4 2022": TOYOTA.TOYOTA_RAV4_TSS2_2022,
+ "TOYOTA RAV4 2023": TOYOTA.TOYOTA_RAV4_TSS2_2023,
+ "TOYOTA MIRAI 2021": TOYOTA.TOYOTA_MIRAI,
+ "TOYOTA SIENNA 2018": TOYOTA.TOYOTA_SIENNA,
+ "LEXUS CT HYBRID 2018": TOYOTA.LEXUS_CTH,
+ "LEXUS ES 2018": TOYOTA.LEXUS_ES,
+ "LEXUS ES 2019": TOYOTA.LEXUS_ES_TSS2,
+ "LEXUS IS 2018": TOYOTA.LEXUS_IS,
+ "LEXUS IS 2023": TOYOTA.LEXUS_IS_TSS2,
+ "LEXUS NX 2018": TOYOTA.LEXUS_NX,
+ "LEXUS NX 2020": TOYOTA.LEXUS_NX_TSS2,
+ "LEXUS LC 2024": TOYOTA.LEXUS_LC_TSS2,
+ "LEXUS RC 2020": TOYOTA.LEXUS_RC,
+ "LEXUS RX 2016": TOYOTA.LEXUS_RX,
+ "LEXUS RX 2020": TOYOTA.LEXUS_RX_TSS2,
+ "LEXUS GS F 2016": TOYOTA.LEXUS_GS_F,
+ "VOLKSWAGEN ARTEON 1ST GEN": VW.VOLKSWAGEN_ARTEON_MK1,
+ "VOLKSWAGEN ATLAS 1ST GEN": VW.VOLKSWAGEN_ATLAS_MK1,
+ "VOLKSWAGEN CADDY 3RD GEN": VW.VOLKSWAGEN_CADDY_MK3,
+ "VOLKSWAGEN CRAFTER 2ND GEN": VW.VOLKSWAGEN_CRAFTER_MK2,
+ "VOLKSWAGEN GOLF 7TH GEN": VW.VOLKSWAGEN_GOLF_MK7,
+ "VOLKSWAGEN JETTA 6TH GEN": VW.VOLKSWAGEN_JETTA_MK6,
+ "VOLKSWAGEN JETTA 7TH GEN": VW.VOLKSWAGEN_JETTA_MK7,
+ "VOLKSWAGEN PASSAT 7TH GEN": VW.VOLKSWAGEN_PASSAT_MK7,
+ "VOLKSWAGEN PASSAT 8TH GEN": VW.VOLKSWAGEN_PASSAT_MK8,
+ "VOLKSWAGEN PASSAT NMS": VW.VOLKSWAGEN_PASSAT_NMS,
+ "VOLKSWAGEN POLO 6TH GEN": VW.VOLKSWAGEN_POLO_MK6,
+ "VOLKSWAGEN SHARAN 2ND GEN": VW.VOLKSWAGEN_SHARAN_MK2,
+ "VOLKSWAGEN TAOS 1ST GEN": VW.VOLKSWAGEN_TAOS_MK1,
+ "VOLKSWAGEN T-CROSS 1ST GEN": VW.VOLKSWAGEN_TCROSS_MK1,
+ "VOLKSWAGEN TIGUAN 2ND GEN": VW.VOLKSWAGEN_TIGUAN_MK2,
+ "VOLKSWAGEN TOURAN 2ND GEN": VW.VOLKSWAGEN_TOURAN_MK2,
+ "VOLKSWAGEN TRANSPORTER T6.1": VW.VOLKSWAGEN_TRANSPORTER_T61,
+ "VOLKSWAGEN T-ROC 1ST GEN": VW.VOLKSWAGEN_TROC_MK1,
+ "AUDI A3 3RD GEN": VW.AUDI_A3_MK3,
+ "AUDI Q2 1ST GEN": VW.AUDI_Q2_MK1,
+ "AUDI Q3 2ND GEN": VW.AUDI_Q3_MK2,
+ "AUDI Q5 1st GEN": VW.AUDI_Q5_MK1,
+ "Porsche Macan 1st GEN": VW.PORSCHE_MACAN_MK1,
+ "SEAT ATECA 1ST GEN": VW.SEAT_ATECA_MK1,
+ "SEAT LEON 3RD GEN": VW.SEAT_ATECA_MK1,
+ "SEAT_LEON_MK3": VW.SEAT_ATECA_MK1,
+ "SKODA FABIA 4TH GEN": VW.SKODA_FABIA_MK4,
+ "SKODA KAMIQ 1ST GEN": VW.SKODA_KAMIQ_MK1,
+ "SKODA KAROQ 1ST GEN": VW.SKODA_KAROQ_MK1,
+ "SKODA KODIAQ 1ST GEN": VW.SKODA_KODIAQ_MK1,
+ "SKODA OCTAVIA 3RD GEN": VW.SKODA_OCTAVIA_MK3,
+ "SKODA SCALA 1ST GEN": VW.SKODA_KAMIQ_MK1,
+ "SKODA_SCALA_MK1": VW.SKODA_KAMIQ_MK1,
+ "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3,
+
+ "mock": MOCK.MOCK,
+}
diff --git a/iqdbc_repo/iqdbc/car/ford/__init__.py b/iqdbc_repo/iqdbc/car/ford/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/ford/carcontroller.py b/iqdbc_repo/iqdbc/car/ford/carcontroller.py
new file mode 100644
index 000000000..6b6f58d5e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/carcontroller.py
@@ -0,0 +1,203 @@
+import math
+import numpy as np
+from iqdbc.can import CANPacker
+from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, DT_CTRL, apply_hysteresis, structs
+from iqdbc.car.lateral import ISO_LATERAL_ACCEL, apply_std_steer_angle_limits
+from iqdbc.car.ford import fordcan
+from iqdbc.car.ford.values import CarControllerParams, FordFlags, CAR
+from iqdbc.car.interfaces import CarControllerBase, V_CRUISE_MAX
+
+LongCtrlState = structs.CarControl.Actuators.LongControlState
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+
+# CAN FD limits:
+# Limit to average banked road since safety doesn't have the roll
+AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll raises lateral acceleration
+MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~2.4 m/s^2
+
+
+def anti_overshoot(apply_curvature, apply_curvature_last, v_ego):
+ diff = 0.1
+ tau = 5 # 5s smooths over the overshoot
+ dt = DT_CTRL * CarControllerParams.STEER_STEP
+ alpha = 1 - np.exp(-dt / tau)
+
+ lataccel = apply_curvature * (v_ego ** 2)
+ last_lataccel = apply_curvature_last * (v_ego ** 2)
+ last_lataccel = apply_hysteresis(lataccel, last_lataccel, diff)
+ last_lataccel = alpha * lataccel + (1 - alpha) * last_lataccel
+
+ output_curvature = last_lataccel / (max(v_ego, 1) ** 2)
+
+ return float(np.interp(v_ego, [5, 10], [apply_curvature, output_curvature]))
+
+
+def apply_ford_curvature_limits(apply_curvature, apply_curvature_last, current_curvature, v_ego_raw, steering_angle, lat_active, CP):
+ # 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)
+
+ # 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))
+
+ return apply_curvature
+
+
+def apply_creep_compensation(accel: float, v_ego: float) -> float:
+ creep_accel = np.interp(v_ego, [1., 3.], [0.6, 0.])
+ creep_accel = np.interp(accel, [0., 0.2], [creep_accel, 0.])
+ accel -= creep_accel
+ return float(accel)
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ super().__init__(dbc_names, CP, CP_IQ)
+ self.packer = CANPacker(dbc_names[Bus.pt])
+ self.CAN = fordcan.CanBus(CP)
+
+ self.apply_curvature_last = 0
+ self.anti_overshoot_curvature_last = 0
+ self.accel = 0.0
+ self.gas = 0.0
+ self.brake_request = False
+ self.main_on_last = False
+ self.lkas_enabled_last = False
+ self.steer_alert_last = False
+ self.lead_distance_bars_last = None
+ self.distance_bar_frame = 0
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ can_sends = []
+
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+
+ main_on = CS.out.cruiseState.available
+ steer_alert = hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw)
+ fcw_alert = hud_control.visualAlert == VisualAlert.fcw
+
+ ### acc buttons ###
+ if CC.cruiseControl.cancel:
+ can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.camera, CS.buttons_stock_values, cancel=True))
+ can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.main, CS.buttons_stock_values, cancel=True))
+ elif CC.cruiseControl.resume and (self.frame % CarControllerParams.BUTTONS_STEP) == 0:
+ can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.camera, CS.buttons_stock_values, resume=True))
+ can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.main, CS.buttons_stock_values, resume=True))
+ # if stock lane centering isn't off, send a button press to toggle it off
+ # the stock system checks for steering pressed, and eventually disengages cruise control
+ elif CS.acc_tja_status_stock_values["Tja_D_Stat"] != 0 and (self.frame % CarControllerParams.ACC_UI_STEP) == 0:
+ can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.camera, CS.buttons_stock_values, tja_toggle=True))
+
+ ### lateral control ###
+ # send steer msg at 20Hz
+ if (self.frame % CarControllerParams.STEER_STEP) == 0:
+ # Bronco and some other cars consistently overshoot curv requests
+ # Apply some deadzone + smoothing convergence to avoid oscillations
+ if self.CP.carFingerprint in (CAR.FORD_BRONCO_SPORT_MK1, CAR.FORD_F_150_MK14):
+ self.anti_overshoot_curvature_last = anti_overshoot(actuators.curvature, self.anti_overshoot_curvature_last, CS.out.vEgoRaw)
+ apply_curvature = self.anti_overshoot_curvature_last
+ else:
+ apply_curvature = actuators.curvature
+
+ # 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(apply_curvature, self.apply_curvature_last, current_curvature,
+ CS.out.vEgoRaw, 0., CC.latActive, self.CP)
+
+ if self.CP.flags & FordFlags.CANFD:
+ # TODO: extended mode
+ # Ford uses four individual signals to dictate how to drive to the car. Curvature alone (limited to 0.02m/s^2)
+ # can actuate the steering for a large portion of any lateral movements. However, in order to get further control on
+ # steer actuation, the other three signals are necessary. Ford controls vehicles differently than most other makes.
+ # A detailed explanation on ford control can be found here:
+ # 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))
+ else:
+ can_sends.append(fordcan.create_lat_ctl_msg(self.packer, self.CAN, CC.latActive, 0., 0., -self.apply_curvature_last, 0.))
+
+ # send lka msg at 33Hz
+ if (self.frame % CarControllerParams.LKA_STEP) == 0:
+ can_sends.append(fordcan.create_lka_msg(self.packer, self.CAN))
+
+ ### longitudinal control ###
+ # send acc msg at 50Hz
+ if self.CP.openpilotLongitudinalControl and (self.frame % CarControllerParams.ACC_CONTROL_STEP) == 0:
+ accel = actuators.accel
+ gas = accel
+
+ if CC.longActive:
+ # Compensate for engine creep at low speed.
+ # Either the ABS does not account for engine creep, or the correction is very slow
+ # TODO: verify this applies to EV/hybrid
+ accel = apply_creep_compensation(accel, CS.out.vEgo)
+
+ # The stock system has been seen rate limiting the brake accel to 5 m/s^3,
+ # however even 3.5 m/s^3 causes some overshoot with a step response.
+ accel = max(accel, self.accel - (3.5 * CarControllerParams.ACC_CONTROL_STEP * DT_CTRL))
+
+ accel = float(np.clip(accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX))
+ gas = float(np.clip(gas, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX))
+
+ # Both gas and accel are in m/s^2, accel is used solely for braking
+ if not CC.longActive or gas < CarControllerParams.MIN_GAS:
+ gas = CarControllerParams.INACTIVE_GAS
+
+ # PCM applies pitch compensation to gas/accel, but we need to compensate for the brake/pre-charge bits
+ accel_due_to_pitch = 0.0
+ if len(CC.orientationNED) == 3:
+ accel_due_to_pitch = math.sin(CC.orientationNED[1]) * ACCELERATION_DUE_TO_GRAVITY
+
+ accel_pitch_compensated = accel + accel_due_to_pitch
+ if accel_pitch_compensated > 0.3 or not CC.longActive:
+ self.brake_request = False
+ elif accel_pitch_compensated < 0.0:
+ self.brake_request = True
+
+ stopping = CC.actuators.longControlState == LongCtrlState.stopping
+ # TODO: look into using the actuators packet to send the desired speed
+ can_sends.append(fordcan.create_acc_msg(self.packer, self.CAN, CC.longActive, gas, accel, stopping, self.brake_request, v_ego_kph=V_CRUISE_MAX))
+
+ self.accel = accel
+ self.gas = gas
+
+ ### ui ###
+ send_ui = (self.main_on_last != main_on) or (self.lkas_enabled_last != CC.latActive) or (self.steer_alert_last != steer_alert)
+ # send lkas ui msg at 1Hz or if ui state changes
+ if (self.frame % CarControllerParams.LKAS_UI_STEP) == 0 or send_ui:
+ can_sends.append(fordcan.create_lkas_ui_msg(self.packer, self.CAN, main_on, CC.latActive, steer_alert, hud_control, CS.lkas_status_stock_values))
+
+ # send acc ui msg at 5Hz or if ui state changes
+ if hud_control.leadDistanceBars != self.lead_distance_bars_last:
+ send_ui = True
+ self.distance_bar_frame = self.frame
+
+ if (self.frame % CarControllerParams.ACC_UI_STEP) == 0 or send_ui:
+ show_distance_bars = self.frame - self.distance_bar_frame < 400
+ can_sends.append(fordcan.create_acc_ui_msg(self.packer, self.CAN, self.CP, main_on, CC.latActive,
+ fcw_alert, CS.out.cruiseState.standstill, show_distance_bars,
+ hud_control, CS.acc_tja_status_stock_values))
+
+ self.main_on_last = main_on
+ self.lkas_enabled_last = CC.latActive
+ self.steer_alert_last = steer_alert
+ self.lead_distance_bars_last = hud_control.leadDistanceBars
+
+ new_actuators = actuators.as_builder()
+ new_actuators.curvature = self.apply_curvature_last
+ new_actuators.accel = self.accel
+ new_actuators.gas = self.gas
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/ford/carstate.py b/iqdbc_repo/iqdbc/car/ford/carstate.py
new file mode 100644
index 000000000..7080d2e9e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/carstate.py
@@ -0,0 +1,123 @@
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.ford.fordcan import CanBus
+from iqdbc.car.ford.values import DBC, CarControllerParams, FordFlags
+from iqdbc.car.interfaces import CarStateBase
+
+ButtonType = structs.CarState.ButtonEvent.Type
+GearShifter = structs.CarState.GearShifter
+TransmissionType = structs.CarParams.TransmissionType
+
+
+class CarState(CarStateBase):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+ if CP.transmissionType == TransmissionType.automatic:
+ self.shifter_values = can_define.dv["PowertrainData_10"]["TrnRng_D_Rq"]
+
+ self.distance_button = 0
+ self.lc_button = 0
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ # Occasionally on startup, the ABS module recalibrates the steering pinion offset, so we need to block engagement
+ # The vehicle usually recovers out of this state within a minute of normal driving
+ ret.vehicleSensorsInvalid = cp.vl["SteeringPinion_Data"]["StePinCompAnEst_D_Qf"] != 3
+
+ # car speed
+ ret.vEgoRaw = cp.vl["BrakeSysFeatures"]["Veh_V_ActlBrk"] * CV.KPH_TO_MS
+ ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
+ ret.yawRate = cp.vl["Yaw_Data_FD1"]["VehYaw_W_Actl"]
+ ret.standstill = cp.vl["DesiredTorqBrk"]["VehStop_D_Stat"] == 1
+
+ # gas pedal
+ ret.gasPressed = cp.vl["EngVehicleSpThrottle"]["ApedPos_Pc_ActlArb"] / 100. > 1e-6
+
+ # brake pedal
+ ret.brake = cp.vl["BrakeSnData_4"]["BrkTot_Tq_Actl"] / 32756. # torque in Nm
+ ret.brakePressed = cp.vl["EngBrakeData"]["BpedDrvAppl_D_Actl"] == 2
+ ret.parkingBrake = cp.vl["DesiredTorqBrk"]["PrkBrkStatus"] in (1, 2)
+
+ # steering wheel
+ ret.steeringAngleDeg = cp.vl["SteeringPinion_Data"]["StePinComp_An_Est"]
+ ret.steeringTorque = cp.vl["EPAS_INFO"]["SteeringColumnTorque"]
+ ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE, 5)
+ ret.steerFaultTemporary = cp.vl["EPAS_INFO"]["EPAS_Failure"] == 1
+ ret.steerFaultPermanent = cp.vl["EPAS_INFO"]["EPAS_Failure"] in (2, 3)
+ ret.espDisabled = cp.vl["Cluster_Info1_FD1"]["DrvSlipCtlMde_D_Rq"] != 0 # 0 is default mode
+
+ if self.CP.flags & FordFlags.CANFD:
+ # this signal is always 0 on non-CAN FD cars
+ ret.steerFaultTemporary |= cp.vl["Lane_Assist_Data3_FD1"]["LatCtlSte_D_Stat"] not in (1, 2, 3)
+
+ # cruise state
+ is_metric = cp.vl["INSTRUMENT_PANEL"]["METRIC_UNITS"] == 1 if not self.CP.flags & FordFlags.CANFD else False
+ ret.cruiseState.speed = cp.vl["EngBrakeData"]["Veh_V_DsplyCcSet"] * (CV.KPH_TO_MS if is_metric else CV.MPH_TO_MS)
+ ret.cruiseState.enabled = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (4, 5)
+ ret.cruiseState.available = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (3, 4, 5)
+ ret.cruiseState.nonAdaptive = cp.vl["Cluster_Info1_FD1"]["AccEnbl_B_RqDrv"] == 0
+ ret.cruiseState.standstill = cp.vl["EngBrakeData"]["AccStopMde_D_Rq"] == 3
+ ret.accFaulted = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (1, 2)
+ if not self.CP.openpilotLongitudinalControl:
+ ret.accFaulted = ret.accFaulted or cp_cam.vl["ACCDATA"]["CmbbDeny_B_Actl"] == 1
+
+ # gear
+ if self.CP.transmissionType == TransmissionType.automatic:
+ gear = self.shifter_values.get(cp.vl["PowertrainData_10"]["TrnRng_D_Rq"])
+ ret.gearShifter = self.parse_gear_shifter(gear)
+ elif self.CP.transmissionType == TransmissionType.manual:
+ if bool(cp.vl["BCM_Lamp_Stat_FD1"]["RvrseLghtOn_B_Stat"]):
+ ret.gearShifter = GearShifter.reverse
+ else:
+ ret.gearShifter = GearShifter.drive
+
+ # safety
+ ret.stockFcw = bool(cp_cam.vl["ACCDATA_3"]["FcwVisblWarn_B_Rq"])
+ ret.stockAeb = bool(cp_cam.vl["ACCDATA_2"]["CmbbBrkDecel_B_Rq"])
+
+ # button presses
+ ret.leftBlinker = cp.vl["Steering_Data_FD1"]["TurnLghtSwtch_D_Stat"] == 1
+ ret.rightBlinker = cp.vl["Steering_Data_FD1"]["TurnLghtSwtch_D_Stat"] == 2
+ # 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"],
+ cp.vl["BodyInfo_3_FD1"]["DrStatRl_B_Actl"], cp.vl["BodyInfo_3_FD1"]["DrStatRr_B_Actl"]])
+ ret.seatbeltUnlatched = cp.vl["RCMStatusMessage2_FD1"]["FirstRowBuckleDriver"] == 2
+
+ # blindspot sensors
+ if self.CP.enableBsm:
+ cp_bsm = cp_cam if self.CP.flags & FordFlags.CANFD else cp
+ ret.leftBlindspot = cp_bsm.vl["Side_Detect_L_Stat"]["SodDetctLeft_D_Stat"] != 0
+ ret.rightBlindspot = cp_bsm.vl["Side_Detect_R_Stat"]["SodDetctRight_D_Stat"] != 0
+
+ # Stock steering buttons so that we can passthru blinkers etc.
+ self.buttons_stock_values = cp.vl["Steering_Data_FD1"]
+ # Stock values from IPMA so that we can retain some stock functionality
+ 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}),
+ ]
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).main),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).camera),
+ }
diff --git a/iqdbc_repo/iqdbc/car/ford/fingerprints.py b/iqdbc_repo/iqdbc/car/ford/fingerprints.py
new file mode 100644
index 000000000..422fe1217
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/fingerprints.py
@@ -0,0 +1,223 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.ford.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.FORD_BRONCO_SPORT_MK1: {
+ (Ecu.eps, 0x730, None): [
+ b'LX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'LX6C-2D053-RD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-2D053-RE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-2D053-RF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'M1PT-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'M1PT-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_ESCAPE_MK4: {
+ (Ecu.eps, 0x730, None): [
+ b'LX6C-14D003-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'LX6C-2D053-NS\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-2D053-NT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-2D053-NY\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-2D053-SA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LX6C-2D053-SD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'LJ6T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LJ6T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LV4T-14F397-GG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_ESCAPE_MK4_5: {
+ (Ecu.eps, 0x730, None): [
+ b'PZ11-14D003-EA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'PZ1C-2D053-EJ\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',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'PJ6T-14H102-ABL\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_EXPLORER_MK6: {
+ (Ecu.eps, 0x730, None): [
+ b'L1MC-14D003-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'M1MC-14D003-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'M1MC-14D003-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'P1MC-14D003-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'L1MC-2D053-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-2D053-BA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-2D053-BB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-2D053-BF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-2D053-BJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'L1MC-2D053-KB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LB5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LB5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LC5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LC5T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_EXPEDITION_MK4: {
+ (Ecu.eps, 0x730, None): [
+ b'NL14-14D003-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'RL14-2D053-AA\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',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_F_150_MK14: {
+ (Ecu.eps, 0x730, None): [
+ b'ML3V-14D003-BC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'ML3V-14D003-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'NL34-2D053-CA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ 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-BA\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-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'ML3T-14H102-ABR\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PJ6T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'RJ6T-14H102-ACJ\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'RJ6T-14H102-BBC\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_F_150_LIGHTNING_MK1: {
+ (Ecu.abs, 0x760, None): [
+ b'PL38-2D053-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'RL38-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'RJ6T-14H102-ACJ\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-FA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LJ9C-14D003-GA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'LJ9C-14D003-HA\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',
+ b'LK9C-2D053-CN\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',
+ ],
+ (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: {
+ (Ecu.eps, 0x730, None): [
+ b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'JX61-2D053-CJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'JX7T-14D049-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_MAVERICK_MK1: {
+ (Ecu.eps, 0x730, None): [
+ b'NZ6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'NZ6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'NZ6C-2D053-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'NZ6C-2D053-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'NZ6C-2D053-AG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PZ6C-2D053-ED\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PZ6C-2D053-EE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PZ6C-2D053-EF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'NZ6T-14D049-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.FORD_RANGER_MK2: {
+ (Ecu.eps, 0x730, None): [
+ b'NB3C-14D003-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'NL14-14D003-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'RB3C-14D003-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'PB3C-2D053-ZD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PB3C-2D053-ZG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PB3C-2D053-ZJ\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',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'RJ6T-14H102-BBB\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/ford/fordcan.py b/iqdbc_repo/iqdbc/car/ford/fordcan.py
new file mode 100644
index 000000000..c5ec73c0c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/fordcan.py
@@ -0,0 +1,342 @@
+from iqdbc.car import CanBusBase, structs
+
+HUDControl = structs.CarControl.HUDControl
+
+
+class CanBus(CanBusBase):
+ def __init__(self, CP=None, fingerprint=None) -> None:
+ super().__init__(CP, fingerprint)
+
+ @property
+ def main(self) -> int:
+ return self.offset
+
+ @property
+ def radar(self) -> int:
+ return self.offset + 1
+
+ @property
+ def camera(self) -> int:
+ return self.offset + 2
+
+
+def calculate_lat_ctl2_checksum(mode: int, counter: int, dat: bytearray) -> int:
+ curvature = (dat[2] << 3) | ((dat[3]) >> 5)
+ curvature_rate = (dat[6] << 3) | ((dat[7]) >> 5)
+ path_angle = ((dat[3] & 0x1F) << 6) | ((dat[4]) >> 2)
+ path_offset = ((dat[4] & 0x3) << 8) | dat[5]
+
+ checksum = mode + counter
+ for sig_val in (curvature, curvature_rate, path_angle, path_offset):
+ checksum += sig_val + (sig_val >> 8)
+
+ return 0xFF - (checksum & 0xFF)
+
+
+def create_lka_msg(packer, CAN: CanBus):
+ """
+ Creates an empty CAN message for the Ford LKA Command.
+
+ This command can apply "Lane Keeping Aid" maneuvers, which are subject to the PSCM lockout.
+
+ Frequency is 33Hz.
+ """
+
+ return packer.make_can_msg("Lane_Assist_Data1", CAN.main, {})
+
+
+def create_lat_ctl_msg(packer, CAN: CanBus, lat_active: bool, path_offset: float, path_angle: float, curvature: float,
+ curvature_rate: float):
+ """
+ Creates a CAN message for the Ford TJA/LCA Command.
+
+ This command can apply "Lane Centering" maneuvers: continuous lane centering for traffic jam assist and highway
+ driving. It is not subject to the PSCM lockout.
+
+ Ford lane centering command uses a third order polynomial to describe the road centerline. The polynomial is defined
+ by the following coefficients:
+ c0: lateral offset between the vehicle and the centerline (positive is right)
+ c1: heading angle between the vehicle and the centerline (positive is right)
+ c2: curvature of the centerline (positive is left)
+ c3: rate of change of curvature of the centerline
+ As the PSCM combines this information with other sensor data, such as the vehicle's yaw rate and speed, the steering
+ angle cannot be easily controlled.
+
+ The PSCM should be configured to accept TJA/LCA commands before these commands will be processed. This can be done
+ using tools such as Forscan.
+
+ Frequency is 20Hz.
+ """
+
+ values = {
+ "LatCtlRng_L_Max": 0, # Unknown [0|126] meter
+ "HandsOffCnfm_B_Rq": 0, # Unknown: 0=Inactive, 1=Active [0|1]
+ "LatCtl_D_Rq": 1 if lat_active else 0, # Mode: 0=None, 1=ContinuousPathFollowing, 2=InterventionLeft,
+ # 3=InterventionRight, 4-7=NotUsed [0|7]
+ "LatCtlRampType_D_Rq": 0, # Ramp speed: 0=Slow, 1=Medium, 2=Fast, 3=Immediate [0|3]
+ # Makes no difference with curvature control
+ "LatCtlPrecision_D_Rq": 1, # Precision: 0=Comfortable, 1=Precise, 2/3=NotUsed [0|3]
+ # The stock system always uses comfortable
+ "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 packer.make_can_msg("LateralMotionControl", CAN.main, values)
+
+
+def create_lat_ctl2_msg(packer, CAN: CanBus, mode: int, path_offset: float, path_angle: float, curvature: float,
+ curvature_rate: float, counter: int):
+ """
+ Create a CAN message for the new Ford Lane Centering command.
+
+ This message is used on the CAN FD platform and replaces the old LateralMotionControl message. It is similar but has
+ additional signals for a counter and checksum.
+
+ Frequency is 20Hz.
+ """
+
+ values = {
+ "LatCtl_D2_Rq": mode, # Mode: 0=None, 1=PathFollowingLimitedMode, 2=PathFollowingExtendedMode,
+ # 3=SafeRampOut, 4-7=NotUsed [0|7]
+ "LatCtlRampType_D_Rq": 0, # 0=Slow, 1=Medium, 2=Fast, 3=Immediate [0|3]
+ "LatCtlPrecision_D_Rq": 1, # 0=Comfortable, 1=Precise, 2/3=NotUsed [0|3]
+ "LatCtlPathOffst_L_Actl": path_offset, # [-5.12|5.11] meter
+ "LatCtlPath_An_Actl": path_angle, # [-0.5|0.5235] radians
+ "LatCtlCurv_No_Actl": curvature, # [-0.02|0.02094] 1/meter
+ "LatCtlCrv_NoRate2_Actl": curvature_rate, # [-0.001024|0.001023] 1/meter^2
+ "HandsOffCnfm_B_Rq": 0, # 0=Inactive, 1=Active [0|1]
+ "LatCtlPath_No_Cnt": counter, # [0|15]
+ "LatCtlPath_No_Cs": 0, # [0|255]
+ }
+
+ # calculate checksum
+ dat = packer.make_can_msg("LateralMotionControl2", 0, values)[1]
+ values["LatCtlPath_No_Cs"] = calculate_lat_ctl2_checksum(mode, counter, dat)
+
+ return packer.make_can_msg("LateralMotionControl2", CAN.main, values)
+
+
+def create_acc_msg(packer, CAN: CanBus, long_active: bool, gas: float, accel: float, stopping: bool, brake_request, v_ego_kph: float):
+ """
+ Creates a CAN message for the Ford ACC Command.
+
+ This command can be used to enable ACC, to set the ACC gas/brake/decel values
+ and to disable ACC.
+
+ Frequency is 50Hz.
+ """
+ values = {
+ "AccBrkTot_A_Rq": accel, # Brake total accel request: [-20|11.9449] m/s^2
+ "Cmbb_B_Enbl": 1 if long_active else 0, # Enabled: 0=No, 1=Yes
+ "AccPrpl_A_Rq": gas, # Acceleration request: [-5|5.23] m/s^2
+ # No observed acceleration seen from this signal alone. During stock system operation, it appears to
+ # be the raw acceleration request (AccPrpl_A_Rq when positive, AccBrkTot_A_Rq when negative)
+ "AccPrpl_A_Pred": -5.0, # Acceleration request: [-5|5.23] m/s^2
+ "AccResumEnbl_B_Rq": 1 if long_active else 0,
+ # No observed acceleration seen from this signal alone
+ "AccVeh_V_Trg": v_ego_kph, # Target speed: [0|255] km/h
+ # TODO: we may be able to improve braking response by utilizing pre-charging better
+ # When setting these two bits without AccBrkTot_A_Rq, an initial jerk is observed and car may be able to brake temporarily with AccPrpl_A_Rq
+ "AccBrkPrchg_B_Rq": 1 if brake_request else 0, # Pre-charge brake request: 0=No, 1=Yes
+ "AccBrkDecel_B_Rq": 1 if brake_request else 0, # Deceleration request: 0=Inactive, 1=Active
+ "AccStopStat_B_Rq": 1 if stopping else 0,
+ }
+ return packer.make_can_msg("ACCDATA", CAN.main, values)
+
+
+def create_acc_ui_msg(packer, CAN: CanBus, CP, main_on: bool, enabled: bool, fcw_alert: bool, standstill: bool,
+ show_distance_bars: bool, hud_control, stock_values: dict):
+ """
+ Creates a CAN message for the Ford IPC adaptive cruise, forward collision warning and traffic jam
+ assist status.
+
+ Stock functionality is maintained by passing through unmodified signals.
+
+ Frequency is 5Hz.
+ """
+
+ # Tja_D_Stat
+ if enabled:
+ if hud_control.leftLaneDepart:
+ status = 3 # ActiveInterventionLeft
+ elif hud_control.rightLaneDepart:
+ status = 4 # ActiveInterventionRight
+ else:
+ status = 2 # Active
+ elif main_on:
+ if hud_control.leftLaneDepart:
+ status = 5 # ActiveWarningLeft
+ elif hud_control.rightLaneDepart:
+ status = 6 # ActiveWarningRight
+ else:
+ status = 1 # Standby
+ else:
+ status = 0 # Off
+
+ values = {s: stock_values[s] for s in [
+ "HaDsply_No_Cs",
+ "HaDsply_No_Cnt",
+ "AccStopStat_D_Dsply", # ACC stopped status message
+ "AccTrgDist2_D_Dsply", # ACC target distance
+ "AccStopRes_B_Dsply",
+ "TjaWarn_D_Rq", # TJA warning
+ "TjaMsgTxt_D_Dsply", # TJA text
+ "IaccLamp_D_Rq", # iACC status icon
+ "AccMsgTxt_D2_Rq", # ACC text
+ "FcwDeny_B_Dsply", # FCW disabled
+ "FcwMemStat_B_Actl", # FCW enabled setting
+ "AccTGap_B_Dsply", # ACC time gap display setting
+ "CadsAlignIncplt_B_Actl",
+ "AccFllwMde_B_Dsply", # ACC follow mode display setting
+ "CadsRadrBlck_B_Actl",
+ "CmbbPostEvnt_B_Dsply", # AEB event status
+ "AccStopMde_B_Dsply", # ACC stop mode display setting
+ "FcwMemSens_D_Actl", # FCW sensitivity setting
+ "FcwMsgTxt_D_Rq", # FCW text
+ "AccWarn_D_Dsply", # ACC warning
+ "FcwVisblWarn_B_Rq", # FCW visible alert
+ "FcwAudioWarn_B_Rq", # FCW audio alert
+ "AccTGap_D_Dsply", # ACC time gap
+ "AccMemEnbl_B_RqDrv", # ACC adaptive/normal setting
+ "FdaMem_B_Stat", # FDA enabled setting
+ ]}
+
+ values.update({
+ "Tja_D_Stat": status, # TJA status
+ })
+
+ if CP.openpilotLongitudinalControl:
+ values.update({
+ "AccStopStat_D_Dsply": 2 if standstill else 0, # Stopping status text
+ "AccMsgTxt_D2_Rq": 0, # ACC text
+ "AccTGap_B_Dsply": 1 if show_distance_bars else 0, # Show time gap control UI
+ "AccFllwMde_B_Dsply": 1 if hud_control.leadVisible else 0, # Lead indicator
+ "AccStopMde_B_Dsply": 1 if standstill else 0,
+ "AccWarn_D_Dsply": 0, # ACC warning
+ "AccTGap_D_Dsply": hud_control.leadDistanceBars, # Time gap
+ })
+
+ # Forwards FCW alert from IPMA
+ if fcw_alert:
+ values["FcwVisblWarn_B_Rq"] = 1 # FCW visible alert
+
+ return packer.make_can_msg("ACCDATA_3", CAN.main, values)
+
+
+def create_lkas_ui_msg(packer, CAN: CanBus, main_on: bool, enabled: bool, steer_alert: bool, hud_control,
+ stock_values: dict):
+ """
+ Creates a CAN message for the Ford IPC IPMA/LKAS status.
+
+ Show the LKAS status with the "driver assist" lines in the IPC.
+
+ Stock functionality is maintained by passing through unmodified signals.
+
+ Frequency is 1Hz.
+ """
+
+ # LaActvStats_D_Dsply
+ # R Intvn Warn Supprs Avail No
+ # L
+ # Intvn 24 19 14 9 4
+ # Warn 23 18 13 8 3
+ # Supprs 22 17 12 7 2
+ # Avail 21 16 11 6 1
+ # No 20 15 10 5 0
+ #
+ # TODO: test suppress state
+ if enabled:
+ lines = 0 # NoLeft_NoRight
+ if hud_control.leftLaneDepart:
+ lines += 4
+ elif hud_control.leftLaneVisible:
+ lines += 1
+ if hud_control.rightLaneDepart:
+ lines += 20
+ elif hud_control.rightLaneVisible:
+ lines += 5
+ elif main_on:
+ lines = 0
+ else:
+ if hud_control.leftLaneDepart:
+ lines = 3 # WarnLeft_NoRight
+ elif hud_control.rightLaneDepart:
+ lines = 15 # NoLeft_WarnRight
+ else:
+ lines = 30 # LA_Off
+
+ hands_on_wheel_dsply = 1 if steer_alert else 0
+
+ values = {s: stock_values[s] for s in [
+ "FeatConfigIpmaActl",
+ "FeatNoIpmaActl",
+ "PersIndexIpma_D_Actl",
+ "AhbcRampingV_D_Rq", # AHB ramping
+ "LaDenyStats_B_Dsply", # LKAS error
+ "CamraDefog_B_Req", # Windshield heater?
+ "CamraStats_D_Dsply", # Camera status
+ "DasAlrtLvl_D_Dsply", # DAS alert level
+ "DasStats_D_Dsply", # DAS status
+ "DasWarn_D_Dsply", # DAS warning
+ "AhbHiBeam_D_Rq", # AHB status
+ "Passthru_63",
+ "Passthru_48",
+ ]}
+
+ values.update({
+ "LaActvStats_D_Dsply": lines, # LKAS status (lines) [0|31]
+ "LaHandsOff_D_Dsply": hands_on_wheel_dsply, # 0=HandsOn, 1=Level1 (w/o chime), 2=Level2 (w/ chime), 3=Suppressed
+ })
+ return packer.make_can_msg("IPMA_Data", CAN.main, values)
+
+
+def create_button_msg(packer, bus: int, stock_values: dict, cancel=False, resume=False, tja_toggle=False):
+ """
+ Creates a CAN message for the Ford SCCM buttons/switches.
+
+ Includes cruise control buttons, turn lights and more.
+
+ Frequency is 10Hz.
+ """
+
+ values = {s: stock_values[s] for s in [
+ "HeadLghtHiFlash_D_Stat", # SCCM Passthrough the remaining buttons
+ "TurnLghtSwtch_D_Stat", # SCCM Turn signal switch
+ "WiprFront_D_Stat",
+ "LghtAmb_D_Sns",
+ "AccButtnGapDecPress",
+ "AccButtnGapIncPress",
+ "AslButtnOnOffCnclPress",
+ "AslButtnOnOffPress",
+ "LaSwtchPos_D_Stat",
+ "CcAslButtnCnclResPress",
+ "CcAslButtnDeny_B_Actl",
+ "CcAslButtnIndxDecPress",
+ "CcAslButtnIndxIncPress",
+ "CcAslButtnOffCnclPress",
+ "CcAslButtnOnOffCncl",
+ "CcAslButtnOnPress",
+ "CcAslButtnResDecPress",
+ "CcAslButtnResIncPress",
+ "CcAslButtnSetDecPress",
+ "CcAslButtnSetIncPress",
+ "CcAslButtnSetPress",
+ "CcButtnOffPress",
+ "CcButtnOnOffCnclPress",
+ "CcButtnOnOffPress",
+ "CcButtnOnPress",
+ "HeadLghtHiFlash_D_Actl",
+ "HeadLghtHiOn_B_StatAhb",
+ "AhbStat_B_Dsply",
+ "AccButtnGapTogglePress",
+ "WiprFrontSwtch_D_Stat",
+ "HeadLghtHiCtrl_D_RqAhb",
+ ]}
+
+ values.update({
+ "CcAslButtnCnclPress": 1 if cancel else 0, # CC cancel button
+ "CcAsllButtnResPress": 1 if resume else 0, # CC resume button
+ "TjaButtnOnOffPress": 1 if tja_toggle else 0, # LCA/TJA toggle button
+ })
+ return packer.make_can_msg("Steering_Data_FD1", bus, values)
diff --git a/iqdbc_repo/iqdbc/car/ford/interface.py b/iqdbc_repo/iqdbc/car/ford/interface.py
new file mode 100644
index 000000000..468e7fa42
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/interface.py
@@ -0,0 +1,100 @@
+import numpy as np
+from iqdbc.car import Bus, get_safety_config, structs
+from iqdbc.car.carlog import carlog
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.ford.carcontroller import CarController
+from iqdbc.car.ford.carstate import CarState
+from iqdbc.car.ford.fordcan import CanBus
+from iqdbc.car.ford.radar_interface import RadarInterface
+from iqdbc.car.ford.values import CarControllerParams, DBC, Ecu, FordFlags, RADAR, FordSafetyFlags
+from iqdbc.car.interfaces import CarInterfaceBase
+
+TransmissionType = structs.CarParams.TransmissionType
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.low, structs.CarState.GearShifter.manumatic)
+
+ @staticmethod
+ def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed):
+ # PCM doesn't allow acceleration near cruise_speed,
+ # so limit limits of pid to prevent windup
+ ACCEL_MAX_VALS = [CarControllerParams.ACCEL_MAX, 0.2]
+ ACCEL_MAX_BP = [cruise_speed - 2., cruise_speed - .4]
+ return CarControllerParams.ACCEL_MIN, np.interp(current_speed, ACCEL_MAX_BP, ACCEL_MAX_VALS)
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "ford"
+
+ ret.radarUnavailable = Bus.radar not in DBC[candidate]
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+ ret.steerActuatorDelay = 0.2
+ ret.steerLimitTimer = 1.0
+ ret.steerAtStandstill = True
+
+ ret.longitudinalTuning.kiBP = [0.]
+ ret.longitudinalTuning.kiV = [0.5]
+
+ if not ret.radarUnavailable and DBC[candidate][Bus.radar] == RADAR.DELPHI_MRR:
+ # average of 33.3 Hz radar timestep / 4 scan modes = 60 ms
+ # MRR_Header_Timestamps->CAN_DET_TIME_SINCE_MEAS reports 61.3 ms
+ ret.radarDelay = 0.06
+
+ CAN = CanBus(fingerprint=fingerprint)
+ cfgs = [get_safety_config(structs.CarParams.SafetyModel.ford)]
+ if CAN.main >= 4:
+ cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput))
+ ret.safetyConfigs = cfgs
+
+ ret.alphaLongitudinalAvailable = ret.radarUnavailable
+ if alpha_long or not ret.radarUnavailable:
+ ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.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
+ 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
+ found_ecus = [fw.ecu for fw in car_fw]
+ if Ecu.shiftByWire in found_ecus or 0x5A in fingerprint[CAN.main] or docs:
+ ret.transmissionType = TransmissionType.automatic
+ else:
+ ret.transmissionType = TransmissionType.manual
+ ret.minEnableSpeed = 20.0 * CV.MPH_TO_MS
+
+ # BSM: Side_Detect_L_Stat, Side_Detect_R_Stat
+ # TODO: detect bsm in car_fw?
+ ret.enableBsm = 0x3A6 in fingerprint[CAN.main] and 0x3A7 in fingerprint[CAN.main]
+
+ # LCA can steer down to zero
+ ret.minSteerSpeed = 0.
+
+ ret.autoResumeSng = ret.minEnableSpeed == -1.
+ ret.centerToFront = ret.wheelbase * 0.44
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/ford/radar_interface.py b/iqdbc_repo/iqdbc/car/ford/radar_interface.py
new file mode 100644
index 000000000..ece346460
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/radar_interface.py
@@ -0,0 +1,272 @@
+import numpy as np
+from typing import cast
+from collections import defaultdict
+from math import cos, sin
+from dataclasses import dataclass
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.ford.fordcan import CanBus
+from iqdbc.car.ford.values import DBC, RADAR
+from iqdbc.car.interfaces import RadarInterfaceBase
+
+DELPHI_ESR_RADAR_MSGS = list(range(0x500, 0x540))
+
+DELPHI_MRR_RADAR_START_ADDR = 0x120
+DELPHI_MRR_RADAR_HEADER_ADDR = 0x174 # MRR_Header_SensorCoverage
+DELPHI_MRR_RADAR_MSG_COUNT = 64
+
+DELPHI_MRR_RADAR_RANGE_COVERAGE = {0: 42, 1: 164, 2: 45, 3: 175} # scan index to detection range (m)
+DELPHI_MRR_MIN_LONG_RANGE_DIST = 30 # meters
+DELPHI_MRR_CLUSTER_THRESHOLD = 5 # meters, lateral distance and relative velocity are weighted
+
+
+@dataclass
+class Cluster:
+ dRel: float = 0.0
+ yRel: float = 0.0
+ vRel: float = 0.0
+ trackId: int = 0
+
+
+def cluster_points(pts_l: list[list[float]], pts2_l: list[list[float]], max_dist: float) -> list[int]:
+ """
+ Clusters a collection of points based on another collection of points. This is useful for correlating clusters through time.
+ Points in pts2 not close enough to any point in pts are assigned -1.
+ Args:
+ pts_l: List of points to base the new clusters on
+ pts2_l: List of points to cluster using pts
+ max_dist: Max distance from cluster center to candidate point
+
+ Returns:
+ List of cluster indices for pts2 that correspond to pts
+ """
+
+ if not len(pts2_l):
+ return []
+
+ if not len(pts_l):
+ return [-1] * len(pts2_l)
+
+ max_dist_sq = max_dist ** 2
+ pts = np.array(pts_l)
+ pts2 = np.array(pts2_l)
+
+ # Compute squared norms
+ pts_norm_sq = np.sum(pts ** 2, axis=1)
+ pts2_norm_sq = np.sum(pts2 ** 2, axis=1)
+
+ # Compute squared Euclidean distances using the identity
+ # dist_sq[i, j] = ||pts2[i]||^2 + ||pts[j]||^2 - 2 * pts2[i] . pts[j]
+ dist_sq = pts2_norm_sq[:, np.newaxis] + pts_norm_sq[np.newaxis, :] - 2 * np.dot(pts2, pts.T)
+ dist_sq = np.maximum(dist_sq, 0.0)
+
+ # Find the closest cluster for each point and assign its index
+ closest_clusters = np.argmin(dist_sq, axis=1)
+ closest_dist_sq = dist_sq[np.arange(len(pts2)), closest_clusters]
+ cluster_idxs = np.where(closest_dist_sq < max_dist_sq, closest_clusters, -1)
+
+ return cast(list[int], cluster_idxs.tolist())
+
+
+def _create_delphi_esr_radar_can_parser(CP) -> CANParser:
+ msg_n = len(DELPHI_ESR_RADAR_MSGS)
+ messages = list(zip(DELPHI_ESR_RADAR_MSGS, [20] * msg_n, strict=True))
+
+ return CANParser(RADAR.DELPHI_ESR, messages, CanBus(CP).radar)
+
+
+def _create_delphi_mrr_radar_can_parser(CP) -> CANParser:
+ messages = [
+ ("MRR_Header_InformationDetections", 33),
+ ("MRR_Header_SensorCoverage", 33),
+ ]
+
+ for i in range(1, DELPHI_MRR_RADAR_MSG_COUNT + 1):
+ msg = f"MRR_Detection_{i:03d}"
+ messages += [(msg, 33)]
+
+ return CANParser(RADAR.DELPHI_MRR, messages, CanBus(CP).radar)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+
+ self.points: list[list[float]] = []
+ self.clusters: list[Cluster] = []
+
+ self.updated_messages = set()
+ self.track_id = 0
+ self.radar = DBC[CP.carFingerprint].get(Bus.radar)
+ self.scan_index_invalid_cnt = 0
+ self.radar_unavailable_cnt = 0
+ self.prev_headerScanIndex = 0
+ if CP.radarUnavailable:
+ self.rcp = None
+ elif self.radar == RADAR.DELPHI_ESR:
+ self.rcp = _create_delphi_esr_radar_can_parser(CP)
+ self.trigger_msg = DELPHI_ESR_RADAR_MSGS[-1]
+ self.valid_cnt = {key: 0 for key in DELPHI_ESR_RADAR_MSGS}
+ elif self.radar == RADAR.DELPHI_MRR:
+ self.rcp = _create_delphi_mrr_radar_can_parser(CP)
+ self.trigger_msg = DELPHI_MRR_RADAR_HEADER_ADDR
+ else:
+ raise ValueError(f"Unsupported radar: {self.radar}")
+
+ def update(self, can_strings):
+ if self.rcp is None:
+ return super().update(None)
+
+ vls = self.rcp.update(can_strings)
+ self.updated_messages.update(vls)
+
+ if self.trigger_msg not in self.updated_messages:
+ return None
+ self.updated_messages.clear()
+
+ ret = structs.RadarData()
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+
+ if self.radar == RADAR.DELPHI_ESR:
+ self._update_delphi_esr()
+ elif self.radar == RADAR.DELPHI_MRR:
+ _update = self._update_delphi_mrr(ret)
+ if not _update:
+ return None
+
+ ret.points = list(self.pts.values())
+ return ret
+
+ def _update_delphi_esr(self):
+ for ii in sorted(self.updated_messages):
+ cpt = self.rcp.vl[ii]
+
+ if cpt['X_Rel'] > 0.00001:
+ self.valid_cnt[ii] = 0 # reset counter
+
+ if cpt['X_Rel'] > 0.00001:
+ self.valid_cnt[ii] += 1
+ else:
+ self.valid_cnt[ii] = max(self.valid_cnt[ii] - 1, 0)
+ #print ii, self.valid_cnt[ii], cpt['VALID'], cpt['X_Rel'], cpt['Angle']
+
+ # radar point only valid if there have been enough valid measurements
+ if self.valid_cnt[ii] > 0:
+ if ii not in self.pts:
+ self.pts[ii] = structs.RadarData.RadarPoint()
+ self.pts[ii].trackId = self.track_id
+ self.track_id += 1
+ self.pts[ii].dRel = cpt['X_Rel'] # from front of car
+ self.pts[ii].yRel = cpt['X_Rel'] * cpt['Angle'] * CV.DEG_TO_RAD # in car frame's y axis, left is positive
+ self.pts[ii].vRel = cpt['V_Rel']
+ self.pts[ii].aRel = float('nan')
+ self.pts[ii].yvRel = float('nan')
+ self.pts[ii].measured = True
+ else:
+ if ii in self.pts:
+ del self.pts[ii]
+
+ def _update_delphi_mrr(self, ret: structs.RadarData):
+ headerScanIndex = int(self.rcp.vl["MRR_Header_InformationDetections"]['CAN_SCAN_INDEX']) & 0b11
+
+ # In reverse, the radar continually sends the last messages. Mark this as invalid
+ if (self.prev_headerScanIndex + 1) % 4 != headerScanIndex:
+ self.radar_unavailable_cnt += 1
+ else:
+ self.radar_unavailable_cnt = 0
+ self.prev_headerScanIndex = headerScanIndex
+
+ if self.radar_unavailable_cnt >= 5:
+ self.pts.clear()
+ self.points.clear()
+ self.clusters.clear()
+ ret.errors.radarUnavailableTemporary = True
+ return True
+
+ # Use points with Doppler coverage of +-60 m/s, reduces similar points
+ if headerScanIndex not in (2, 3):
+ return False
+
+ if DELPHI_MRR_RADAR_RANGE_COVERAGE[headerScanIndex] != int(self.rcp.vl["MRR_Header_SensorCoverage"]["CAN_RANGE_COVERAGE"]):
+ self.scan_index_invalid_cnt += 1
+ else:
+ self.scan_index_invalid_cnt = 0
+
+ # Rarely MRR_Header_InformationDetections can fail to send a message. The scan index is skipped in this case
+ if self.scan_index_invalid_cnt >= 5:
+ ret.errors.wrongConfig = True
+
+ for ii in range(1, DELPHI_MRR_RADAR_MSG_COUNT + 1):
+ msg = self.rcp.vl[f"MRR_Detection_{ii:03d}"]
+
+ # SCAN_INDEX rotates through 0..3 on each message for different measurement modes
+ # Indexes 0 and 2 have a max range of ~40m, 1 and 3 are ~170m (MRR_Header_SensorCoverage->CAN_RANGE_COVERAGE)
+ # Indexes 0 and 1 have a Doppler coverage of +-71 m/s, 2 and 3 have +-60 m/s
+ scanIndex = msg[f"CAN_SCAN_INDEX_2LSB_{ii:02d}"]
+
+ # Throw out old measurements. Very unlikely to happen, but is proper behavior
+ if scanIndex != headerScanIndex:
+ continue
+
+ valid = bool(msg[f"CAN_DET_VALID_LEVEL_{ii:02d}"])
+
+ # Long range measurement mode is more sensitive and can detect the road surface
+ dist = msg[f"CAN_DET_RANGE_{ii:02d}"] # m [0|255.984]
+ if scanIndex in (1, 3) and dist < DELPHI_MRR_MIN_LONG_RANGE_DIST:
+ valid = False
+
+ if valid:
+ azimuth = msg[f"CAN_DET_AZIMUTH_{ii:02d}"] # rad [-3.1416|3.13964]
+ distRate = msg[f"CAN_DET_RANGE_RATE_{ii:02d}"] # m/s [-128|127.984]
+ dRel = cos(azimuth) * dist # m from front of car
+ yRel = -sin(azimuth) * dist # in car frame's y axis, left is positive
+
+ self.points.append([dRel, yRel * 2, distRate * 2])
+
+ # Cluster and publish using stored points once we've cycled through all 4 scan modes
+ if headerScanIndex != 3:
+ return False
+
+ # Cluster points from this cycle against the centroids from the previous cycle
+ prev_keys = [[p.dRel, p.yRel * 2, p.vRel * 2] for p in self.clusters]
+ labels = cluster_points(prev_keys, self.points, DELPHI_MRR_CLUSTER_THRESHOLD)
+
+ points_by_track_id = defaultdict(list)
+ for idx, label in enumerate(labels):
+ if label != -1:
+ points_by_track_id[self.clusters[label].trackId].append(self.points[idx])
+ else:
+ points_by_track_id[self.track_id].append(self.points[idx])
+ self.track_id += 1
+
+ self.clusters = []
+ for idx, (track_id, pts) in enumerate(points_by_track_id.items()):
+ dRel = [p[0] for p in pts]
+ min_dRel = min(dRel)
+ dRel = sum(dRel) / len(dRel)
+
+ yRel = [p[1] for p in pts]
+ yRel = sum(yRel) / len(yRel) / 2
+
+ vRel = [p[2] for p in pts]
+ vRel = sum(vRel) / len(vRel) / 2
+
+ # FIXME: creating capnp RadarPoint and accessing attributes are both expensive, so we store a dataclass and reuse the RadarPoint
+ self.clusters.append(Cluster(dRel=dRel, yRel=yRel, vRel=vRel, trackId=track_id))
+
+ if idx not in self.pts:
+ self.pts[idx] = structs.RadarData.RadarPoint(measured=True, aRel=float('nan'), yvRel=float('nan'))
+
+ self.pts[idx].dRel = min_dRel
+ self.pts[idx].yRel = yRel
+ self.pts[idx].vRel = vRel
+ self.pts[idx].trackId = track_id
+
+ for idx in range(len(points_by_track_id), len(self.pts)):
+ del self.pts[idx]
+
+ self.points = []
+
+ return True
diff --git a/iqdbc_repo/iqdbc/car/ford/tests/__init__.py b/iqdbc_repo/iqdbc/car/ford/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/ford/tests/print_platform_codes.py b/iqdbc_repo/iqdbc/car/ford/tests/print_platform_codes.py
new file mode 100755
index 000000000..65595fe42
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/tests/print_platform_codes.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python3
+from collections import defaultdict
+
+from iqdbc.car.structs import CarParams
+from iqdbc.car.ford.values import get_platform_codes
+from iqdbc.car.ford.fingerprints import FW_VERSIONS
+
+Ecu = CarParams.Ecu
+
+if __name__ == "__main__":
+ cars_for_code: defaultdict = defaultdict(lambda: defaultdict(set))
+
+ for car_model, ecus in FW_VERSIONS.items():
+ print(car_model)
+ for ecu in sorted(ecus):
+ platform_codes = get_platform_codes(ecus[ecu])
+ for code in platform_codes:
+ cars_for_code[ecu][code].add(car_model)
+
+ print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):')
+ print(f' Codes: {sorted(platform_codes)}')
+ print()
+
+ print('\nCar models vs. platform codes:')
+ for ecu, codes in cars_for_code.items():
+ print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):')
+ for code, cars in codes.items():
+ print(f' {code!r}: {sorted(map(str, cars))}')
diff --git a/iqdbc_repo/iqdbc/car/ford/tests/test_ford.py b/iqdbc_repo/iqdbc/car/ford/tests/test_ford.py
new file mode 100644
index 000000000..0235c86c8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/tests/test_ford.py
@@ -0,0 +1,142 @@
+import random
+from collections.abc import Iterable
+
+from hypothesis import settings, given, strategies as st
+from parameterized import parameterized
+
+from iqdbc.car.structs import CarParams
+from iqdbc.car.fw_versions import build_fw_dict
+from iqdbc.car.ford.values import CAR, FW_QUERY_CONFIG, FW_PATTERN, get_platform_codes
+from iqdbc.car.ford.fingerprints import FW_VERSIONS
+
+Ecu = CarParams.Ecu
+
+
+ECU_ADDRESSES = {
+ Ecu.eps: 0x730, # Power Steering Control Module (PSCM)
+ Ecu.abs: 0x760, # Anti-Lock Brake System (ABS)
+ Ecu.fwdRadar: 0x764, # Cruise Control Module (CCM)
+ Ecu.fwdCamera: 0x706, # Image Processing Module A (IPMA)
+ Ecu.engine: 0x7E0, # Powertrain Control Module (PCM)
+ Ecu.shiftByWire: 0x732, # Gear Shift Module (GSM)
+ Ecu.debug: 0x7D0, # Accessory Protocol Interface Module (APIM)
+}
+
+
+ECU_PART_NUMBER = {
+ Ecu.eps: [
+ b"14D003",
+ ],
+ Ecu.abs: [
+ b"2D053",
+ ],
+ Ecu.fwdRadar: [
+ b"14D049",
+ ],
+ Ecu.fwdCamera: [
+ b"14F397", # Ford Q3
+ b"14H102", # Ford Q4
+ ],
+}
+
+
+class TestFordFW:
+ def test_fw_query_config(self):
+ for (ecu, addr, subaddr) in FW_QUERY_CONFIG.extra_ecus:
+ assert ecu in ECU_ADDRESSES, "Unknown ECU"
+ assert addr == ECU_ADDRESSES[ecu], "ECU address mismatch"
+ assert subaddr is None, "Unexpected ECU subaddress"
+
+ @parameterized.expand(FW_VERSIONS.items())
+ def test_fw_versions(self, car_model: str, fw_versions: dict[tuple[int, int, int | None], Iterable[bytes]]):
+ for (ecu, addr, subaddr), fws in fw_versions.items():
+ assert ecu in ECU_PART_NUMBER, "Unexpected ECU"
+ assert addr == ECU_ADDRESSES[ecu], "ECU address mismatch"
+ assert subaddr is None, "Unexpected ECU subaddress"
+
+ for fw in fws:
+ assert len(fw) == 24, "Expected ECU response to be 24 bytes"
+
+ match = FW_PATTERN.match(fw)
+ assert match is not None, f"Unable to parse FW: {fw!r}"
+ if match:
+ part_number = match.group("part_number")
+ assert part_number in ECU_PART_NUMBER[ecu], f"Unexpected part number for {fw!r}"
+
+ codes = get_platform_codes([fw])
+ assert 1 == len(codes), f"Unable to parse FW: {fw!r}"
+
+ @settings(max_examples=100)
+ @given(data=st.data())
+ def test_platform_codes_fuzzy_fw(self, data):
+ """Ensure function doesn't raise an exception"""
+ fw_strategy = st.lists(st.binary())
+ fws = data.draw(fw_strategy)
+ get_platform_codes(fws)
+
+ def test_platform_codes_spot_check(self):
+ # Asserts basic platform code parsing behavior for a few cases
+ results = get_platform_codes([
+ b"JX6A-14C204-BPL\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"LB5A-14C204-EAC\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ ])
+ assert results == {(b"X6A", b"J"), (b"Z6T", b"N"), (b"J6T", b"P"), (b"B5A", b"L")}
+
+ def test_fuzzy_match(self):
+ for platform, fw_by_addr in FW_VERSIONS.items():
+ # Ensure there's no overlaps in platform codes
+ for _ in range(20):
+ car_fw = []
+ for ecu, fw_versions in fw_by_addr.items():
+ ecu_name, addr, sub_addr = ecu
+ fw = random.choice(fw_versions)
+ car_fw.append(CarParams.CarFw(ecu=ecu_name, fwVersion=fw, address=addr,
+ subAddress=0 if sub_addr is None else sub_addr))
+
+ CP = CarParams(carFw=car_fw)
+ matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS)
+ assert matches == {platform}
+
+ def test_match_fw_fuzzy(self):
+ offline_fw = {
+ (Ecu.eps, 0x730, None): [
+ b"L1MC-14D003-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"L1MC-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ ],
+ (Ecu.abs, 0x760, None): [
+ b"L1MC-2D053-BA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"L1MC-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b"LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"LB5T-14D049-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ ],
+ # We consider all model year hints for ECU, even with different platform codes
+ (Ecu.fwdCamera, 0x706, None): [
+ b"LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"NC5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ ],
+ }
+ expected_fingerprint = CAR.FORD_EXPLORER_MK6
+
+ # ensure that we fuzzy match on all non-exact FW with changed revisions
+ live_fw = {
+ (0x730, None): {b"L1MC-14D003-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},
+ (0x760, None): {b"L1MC-2D053-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},
+ (0x764, None): {b"LB5T-14D049-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},
+ (0x706, None): {b"LB5T-14F397-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},
+ }
+ candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw})
+ assert candidates == {expected_fingerprint}
+
+ # model year hint in between the range should match
+ live_fw[(0x706, None)] = {b"MB5T-14F397-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}
+ candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw,})
+ assert candidates == {expected_fingerprint}
+
+ # unseen model year hint should not match
+ live_fw[(0x760, None)] = {b"M1MC-2D053-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}
+ candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw})
+ assert len(candidates) == 0, "Should not match new model year hint"
diff --git a/iqdbc_repo/iqdbc/car/ford/values.py b/iqdbc_repo/iqdbc/car/ford/values.py
new file mode 100644
index 000000000..7e608c5d3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/ford/values.py
@@ -0,0 +1,315 @@
+import copy
+import re
+from dataclasses import dataclass, field, replace
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds
+from iqdbc.car.lateral import AngleSteeringLimits
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
+from iqdbc.car.fw_query_definitions import FwQueryConfig, LiveFwVersions, OfflineFwVersions, Request, StdQueries, p16
+
+Ecu = CarParams.Ecu
+
+
+class CarControllerParams:
+ STEER_STEP = 5 # LateralMotionControl, 20Hz
+ LKA_STEP = 3 # Lane_Assist_Data1, 33Hz
+ ACC_CONTROL_STEP = 2 # ACCDATA, 50Hz
+ LKAS_UI_STEP = 100 # IPMA_Data, 1Hz
+ ACC_UI_STEP = 20 # ACCDATA_3, 5Hz
+ BUTTONS_STEP = 5 # Steering_Data_FD1, 10Hz, but send twice as fast
+
+ 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_ERROR = 0.002 # ~6 degrees at 10 m/s, ~10 degrees at 35 m/s
+
+ ACCEL_MAX = 2.0 # m/s^2 max acceleration
+ ACCEL_MIN = -3.5 # m/s^2 max deceleration
+ MIN_GAS = -0.5
+ INACTIVE_GAS = -5.0
+
+ def __init__(self, CP):
+ pass
+
+
+class FordSafetyFlags(IntFlag):
+ LONG_CONTROL = 1
+ CANFD = 2
+
+
+class FordFlags(IntFlag):
+ # Static flags
+ CANFD = 1
+
+
+class RADAR:
+ DELPHI_ESR = 'ford_fusion_2018_adas'
+ DELPHI_MRR = 'FORD_CADS'
+
+
+class Footnote(Enum):
+ FOCUS = CarFootnote(
+ "Refers only to the Focus Mk4 (C519) available in Europe/China/Taiwan/Australasia, not the Focus Mk3 (C346) in " +
+ "North and South America/Southeast Asia.",
+ Column.MODEL,
+ )
+
+
+@dataclass
+class FordCarDocs(CarDocs):
+ package: str = "Co-Pilot360 Assist+"
+ hybrid: bool = False
+ plug_in_hybrid: bool = False
+
+ def init_make(self, CP: CarParams):
+ harness = CarHarness.ford_q4 if CP.flags & FordFlags.CANFD else CarHarness.ford_q3
+ self.car_parts = CarParts.common([harness])
+
+ if harness == CarHarness.ford_q4:
+ self.setup_video = "https://www.youtube.com/watch?v=uUGkH6C_EQU"
+
+ if CP.carFingerprint in (CAR.FORD_F_150_MK14, CAR.FORD_F_150_LIGHTNING_MK1, CAR.FORD_EXPEDITION_MK4):
+ self.setup_video = "https://www.youtube.com/watch?v=MewJc9LYp9M"
+
+
+@dataclass
+class FordPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {
+ Bus.pt: 'ford_lincoln_base_pt',
+ Bus.radar: RADAR.DELPHI_MRR,
+ })
+
+ def init(self):
+ for car_docs in list(self.car_docs):
+ if car_docs.hybrid:
+ name = f"{car_docs.make} {car_docs.model} Hybrid {car_docs.years}"
+ self.car_docs.append(replace(copy.deepcopy(car_docs), name=name))
+ if car_docs.plug_in_hybrid:
+ name = f"{car_docs.make} {car_docs.model} Plug-in Hybrid {car_docs.years}"
+ self.car_docs.append(replace(copy.deepcopy(car_docs), name=name))
+
+
+@dataclass
+class FordCANFDPlatformConfig(FordPlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {
+ Bus.pt: 'ford_lincoln_base_pt',
+ })
+
+ 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(
+ [FordCarDocs("Ford Bronco Sport 2021-24")],
+ CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7),
+ )
+ FORD_ESCAPE_MK4 = FordPlatformConfig(
+ [
+ FordCarDocs("Ford Escape 2020-22", hybrid=True, plug_in_hybrid=True),
+ FordCarDocs("Ford Kuga 2020-23", "Adaptive Cruise Control with Lane Centering", hybrid=True, plug_in_hybrid=True),
+ ],
+ CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7),
+ )
+ FORD_ESCAPE_MK4_5 = FordCANFDPlatformConfig(
+ [
+ FordCarDocs("Ford Escape 2023-24", hybrid=True, plug_in_hybrid=True, setup_video="https://www.youtube.com/watch?v=M6uXf4b2SHM"),
+ FordCarDocs("Ford Kuga Hybrid 2024", "All"),
+ FordCarDocs("Ford Kuga Plug-in Hybrid 2024", "All"),
+ ],
+ CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7),
+ )
+ FORD_EXPLORER_MK6 = FordPlatformConfig(
+ [
+ FordCarDocs("Ford Explorer 2020-24", hybrid=True), # Hybrid: Limited and Platinum only
+ FordCarDocs("Lincoln Aviator 2020-24", "Co-Pilot360 Plus", plug_in_hybrid=True), # Hybrid: Grand Touring only
+ ],
+ CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8),
+ )
+ FORD_EXPEDITION_MK4 = FordCANFDPlatformConfig(
+ [FordCarDocs("Ford Expedition 2022-24", "Co-Pilot360 Assist 2.0", hybrid=False)],
+ CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0),
+ )
+ FORD_F_150_MK14 = FordCANFDPlatformConfig(
+ [FordCarDocs("Ford F-150 2021-23", "Co-Pilot360 Assist 2.0", hybrid=True)],
+ 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")],
+ CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9),
+ )
+ FORD_FOCUS_MK4 = FordPlatformConfig(
+ [FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only
+ CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0),
+ )
+ FORD_MAVERICK_MK1 = FordPlatformConfig(
+ [
+ FordCarDocs("Ford Maverick 2022", "LARIAT Luxury", hybrid=True),
+ FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist", hybrid=True),
+ ],
+ CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0),
+ )
+ FORD_MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig(
+ [FordCarDocs("Ford Mustang Mach-E 2021-24", "All", setup_video="https://www.youtube.com/watch?v=AR4_eTF3b_A")],
+ 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", setup_video="https://www.youtube.com/watch?v=2oJlXCKYOy0")],
+ CarSpecs(mass=2000, wheelbase=3.27, steerRatio=17.0),
+ )
+
+
+# FW response contains a combined software and part number
+# A-Z except no I, O or W
+# e.g. NZ6A-14C204-AAA
+# 1222-333333-444
+# 1 = Model year hint (approximates model year/generation)
+# 2 = Platform hint
+# 3 = Part number
+# 4 = Software version
+FW_ALPHABET = b'A-HJ-NP-VX-Z'
+FW_PATTERN = re.compile(b'^(?P[' + FW_ALPHABET + b'])' +
+ b'(?P[0-9' + FW_ALPHABET + b']{3})-' +
+ b'(?P[0-9' + FW_ALPHABET + b']{5,6})-' +
+ b'(?P[' + FW_ALPHABET + b']{2,})\x00*$')
+
+
+def get_platform_codes(fw_versions: list[bytes] | set[bytes]) -> set[tuple[bytes, bytes]]:
+ codes = set()
+ for fw in fw_versions:
+ match = FW_PATTERN.match(fw)
+ if match is not None:
+ codes.add((match.group('platform_hint'), match.group('model_year_hint')))
+
+ return codes
+
+
+def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, vin: str, offline_fw_versions: OfflineFwVersions) -> set[str]:
+ candidates: set[str] = set()
+
+ for candidate, fws in offline_fw_versions.items():
+ # Keep track of ECUs which pass all checks (platform hint, within model year hint range)
+ valid_found_ecus = set()
+ valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS}
+ for ecu, expected_versions in fws.items():
+ addr = ecu[1:]
+ # Only check ECUs expected to have platform codes
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ # Expected platform codes & model year hints
+ codes = get_platform_codes(expected_versions)
+ expected_platform_codes = {code for code, _ in codes}
+ expected_model_year_hints = {model_year_hint for _, model_year_hint in codes}
+
+ # Found platform codes & model year hints
+ codes = get_platform_codes(live_fw_versions.get(addr, set()))
+ found_platform_codes = {code for code, _ in codes}
+ found_model_year_hints = {model_year_hint for _, model_year_hint in codes}
+
+ # Check platform code matches for any found versions
+ if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes):
+ break
+
+ # Check any model year hint within range in the database. Note that some models have more than one
+ # platform code per ECU which we don't consider as separate ranges
+ if not any(min(expected_model_year_hints) <= found_model_year_hint <= max(expected_model_year_hints) for
+ found_model_year_hint in found_model_year_hints):
+ break
+
+ valid_found_ecus.add(addr)
+
+ # If all live ECUs pass all checks for candidate, add it as a match
+ if valid_expected_ecus.issubset(valid_found_ecus):
+ candidates.add(candidate)
+
+ return candidates
+
+
+# All of these ECUs must be present and are expected to have platform codes we can match
+PLATFORM_CODE_ECUS = (Ecu.abs, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps)
+
+DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00
+
+ASBUILT_BLOCKS: list[tuple[int, list]] = [
+ (1, [Ecu.debug, Ecu.fwdCamera, Ecu.eps]),
+ (2, [Ecu.abs, Ecu.debug, Ecu.eps]),
+ (3, [Ecu.abs, Ecu.debug, Ecu.eps]),
+ (4, [Ecu.debug, Ecu.fwdCamera]),
+ (5, [Ecu.debug]),
+ (6, [Ecu.debug]),
+ (7, [Ecu.debug]),
+ (8, [Ecu.debug]),
+ (9, [Ecu.debug]),
+ (16, [Ecu.debug, Ecu.fwdCamera]),
+ (18, [Ecu.fwdCamera]),
+ (20, [Ecu.fwdCamera]),
+ (21, [Ecu.fwdCamera]),
+]
+
+
+def ford_asbuilt_block_request(block_id: int):
+ return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1)
+
+
+def ford_asbuilt_block_response(block_id: int):
+ return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1)
+
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ # CAN and CAN FD queries are combined.
+ # FIXME: For CAN FD, ECUs respond with frames larger than 8 bytes on the powertrain bus
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.debug, Ecu.engine, Ecu.eps, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.shiftByWire],
+ logging=True,
+ ),
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.debug, Ecu.engine, Ecu.eps, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.shiftByWire],
+ bus=0,
+ auxiliary=True,
+ ),
+ *[Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(block_id)],
+ [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(block_id)],
+ whitelist_ecus=ecus,
+ bus=0,
+ logging=True,
+ ) for block_id, ecus in ASBUILT_BLOCKS],
+ ],
+ extra_ecus=[
+ (Ecu.engine, 0x7e0, None), # Powertrain Control Module
+ # Note: We are unlikely to get a response from behind the gateway
+ (Ecu.shiftByWire, 0x732, None), # Gear Shift Module
+ (Ecu.debug, 0x7d0, None), # Accessory Protocol Interface Module
+ ],
+ # Custom fuzzy fingerprinting function using platform and model year hints
+ match_fw_to_car_fuzzy=match_fw_to_car_fuzzy,
+)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/fw_query_definitions.py b/iqdbc_repo/iqdbc/car/fw_query_definitions.py
new file mode 100644
index 000000000..e983dec53
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/fw_query_definitions.py
@@ -0,0 +1,152 @@
+import copy
+from dataclasses import dataclass, field
+import struct
+from collections.abc import Callable
+
+from iqdbc.car import uds
+from iqdbc.car.structs import CarParams
+
+Ecu = CarParams.Ecu
+
+AddrType = tuple[int, int | None]
+EcuAddrBusType = tuple[int, int | None, int]
+EcuAddrSubAddr = tuple[Ecu, int, int | None]
+
+LiveFwVersions = dict[AddrType, set[bytes]]
+OfflineFwVersions = dict[str, dict[EcuAddrSubAddr, list[bytes]]]
+
+# A global list of addresses we will only ever consider for VIN responses
+# engine, hybrid controller, Ford abs, Hyundai CAN FD cluster, 29-bit engine, PGM-FI
+# TODO: move these to each brand's FW query config
+STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x7c6, 0x18da10f1, 0x18da0ef1]
+
+ESSENTIAL_ECUS = [Ecu.engine, Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.vsa]
+ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()}
+
+
+def p16(val):
+ return struct.pack("!H", val)
+
+
+class StdQueries:
+ # FW queries
+ TESTER_PRESENT_REQUEST = bytes([uds.SERVICE_TYPE.TESTER_PRESENT, 0x0])
+ TESTER_PRESENT_RESPONSE = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40, 0x0])
+
+ SHORT_TESTER_PRESENT_REQUEST = bytes([uds.SERVICE_TYPE.TESTER_PRESENT])
+ SHORT_TESTER_PRESENT_RESPONSE = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40])
+
+ DEFAULT_DIAGNOSTIC_REQUEST = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL,
+ uds.SESSION_TYPE.DEFAULT])
+ DEFAULT_DIAGNOSTIC_RESPONSE = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40,
+ uds.SESSION_TYPE.DEFAULT, 0x0, 0x32, 0x1, 0xf4])
+
+ EXTENDED_DIAGNOSTIC_REQUEST = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL,
+ uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC])
+ EXTENDED_DIAGNOSTIC_RESPONSE = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40,
+ uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC, 0x0, 0x32, 0x1, 0xf4])
+
+ MANUFACTURER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER)
+ MANUFACTURER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER)
+
+ SUPPLIER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER)
+ SUPPLIER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER)
+
+ MANUFACTURER_ECU_HARDWARE_NUMBER_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER)
+ MANUFACTURER_ECU_HARDWARE_NUMBER_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER)
+
+ UDS_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_SOFTWARE_IDENTIFICATION)
+ UDS_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_SOFTWARE_IDENTIFICATION)
+
+ OBD_VERSION_REQUEST = b'\x09\x04'
+ OBD_VERSION_RESPONSE = b'\x49\x04'
+
+ # VIN queries
+ OBD_VIN_REQUEST = b'\x09\x02'
+ OBD_VIN_RESPONSE = b'\x49\x02\x01'
+
+ UDS_VIN_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(uds.DATA_IDENTIFIER_TYPE.VIN)
+ UDS_VIN_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(uds.DATA_IDENTIFIER_TYPE.VIN)
+
+ GM_VIN_REQUEST = b'\x1a\x90'
+ GM_VIN_RESPONSE = b'\x5a\x90'
+
+ KWP_VIN_REQUEST = b'\x21\x81'
+ KWP_VIN_RESPONSE = b'\x61\x81'
+
+
+@dataclass
+class Request:
+ request: list[bytes]
+ response: list[bytes]
+ whitelist_ecus: list[Ecu] = field(default_factory=list)
+ rx_offset: int = 0x8
+ bus: int = 1
+ # Whether this query should be run on the first auxiliary panda (CAN FD cars for example)
+ auxiliary: bool = False
+ # FW responses from these queries will not be used for fingerprinting
+ logging: bool = False
+ # pandad toggles OBD multiplexing on/off as needed
+ obd_multiplexing: bool = True
+
+
+@dataclass
+class FwQueryConfig:
+ requests: list[Request]
+ # TODO: make this automatic and remove hardcoded lists, or do fingerprinting with ecus
+ # Overrides and removes from essential ecus for specific models and ecus (exact matching)
+ non_essential_ecus: dict[Ecu, list[str]] = field(default_factory=dict)
+ # Ecus added for data collection, not to be fingerprinted on
+ extra_ecus: list[tuple[Ecu, int, int | None]] = field(default_factory=list)
+ # Function a brand can implement to provide better fuzzy matching. Takes in FW versions and VIN,
+ # returns set of candidates. Only will match if one candidate is returned
+ match_fw_to_car_fuzzy: Callable[[LiveFwVersions, str, OfflineFwVersions], set[str]] | None = None
+
+ def __post_init__(self):
+ # Asserts that a request exists if extra ecus are used
+ if len(self.extra_ecus):
+ assert len(self.requests), "Must define a request with extra ecus"
+
+ # All extra ecus should be used in a request
+ for ecu, _, _ in self.extra_ecus:
+ assert (any(ecu in request.whitelist_ecus for request in self.requests) or
+ any(not request.whitelist_ecus for request in self.requests)), f"Ecu.{ECU_NAME[ecu]} not in any request"
+
+ # These ECUs are already not in ESSENTIAL_ECUS which the fingerprint functions give a pass if missing
+ unnecessary_non_essential_ecus = set(self.non_essential_ecus) - set(ESSENTIAL_ECUS)
+ assert unnecessary_non_essential_ecus == set(), ("Declaring non-essential ECUs non-essential is not required: " +
+ f"{', '.join([f'Ecu.{ECU_NAME[ecu]}' for ecu in unnecessary_non_essential_ecus])}")
+
+ # Asserts equal length request and response lists
+ for request_obj in self.requests:
+ assert len(request_obj.request) == len(request_obj.response), ("Request and response lengths do not match: " +
+ f"{request_obj.request} vs. {request_obj.response}")
+
+ # No request on the OBD port (bus 1, multiplexed) should be run on an aux panda
+ assert not (request_obj.auxiliary and request_obj.bus == 1 and request_obj.obd_multiplexing), ("OBD multiplexed request should not " +
+ f"be marked auxiliary: {request_obj}")
+
+ # Add aux requests (second panda) for all requests that are marked as auxiliary
+ for i in range(len(self.requests)):
+ if self.requests[i].auxiliary:
+ new_request = copy.deepcopy(self.requests[i])
+ new_request.bus += 4
+ self.requests.append(new_request)
+
+ def get_all_ecus(self, offline_fw_versions: OfflineFwVersions,
+ include_extra_ecus: bool = True) -> set[EcuAddrSubAddr]:
+ # Add ecus in database + extra ecus
+ brand_ecus = {ecu for ecus in offline_fw_versions.values() for ecu in ecus}
+
+ if include_extra_ecus:
+ brand_ecus |= set(self.extra_ecus)
+
+ return brand_ecus
diff --git a/iqdbc_repo/iqdbc/car/fw_versions.py b/iqdbc_repo/iqdbc/car/fw_versions.py
new file mode 100644
index 000000000..2065a2438
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/fw_versions.py
@@ -0,0 +1,328 @@
+from collections import defaultdict
+from collections.abc import Callable, Iterator
+from typing import Protocol, TypeVar
+
+from tqdm import tqdm
+
+from iqdbc.car import uds
+from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable
+from iqdbc.car.carlog import carlog
+from iqdbc.car.structs import CarParams
+from iqdbc.car.ecu_addrs import get_ecu_addrs
+from iqdbc.car.fingerprints import FW_VERSIONS
+from iqdbc.car.fw_query_definitions import ESSENTIAL_ECUS, AddrType, EcuAddrBusType, FwQueryConfig, LiveFwVersions, OfflineFwVersions
+from iqdbc.car.interfaces import get_interface_attr
+from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery
+
+Ecu = CarParams.Ecu
+FUZZY_EXCLUDE_ECUS = [Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps, Ecu.debug]
+
+FW_QUERY_CONFIGS: dict[str, FwQueryConfig] = get_interface_attr('FW_QUERY_CONFIG', ignore_none=True)
+VERSIONS = get_interface_attr('FW_VERSIONS', ignore_none=True)
+
+MODEL_TO_BRAND = {c: b for b, e in VERSIONS.items() for c in e}
+REQUESTS = [(brand, config, r) for brand, config in FW_QUERY_CONFIGS.items() for r in config.requests]
+
+T = TypeVar('T')
+ObdCallback = Callable[[bool], None]
+
+
+def chunks(l: list[T], n: int = 128) -> Iterator[list[T]]:
+ for i in range(0, len(l), n):
+ yield l[i:i + n]
+
+
+def is_brand(brand: str, filter_brand: str | None) -> bool:
+ """Returns if brand matches filter_brand or no brand filter is specified"""
+ return filter_brand is None or brand == filter_brand
+
+
+def build_fw_dict(fw_versions: list[CarParams.CarFw], filter_brand: str | None = None) -> dict[AddrType, set[bytes]]:
+ fw_versions_dict: defaultdict[AddrType, set[bytes]] = defaultdict(set)
+ for fw in fw_versions:
+ if is_brand(fw.brand, filter_brand) and not fw.logging:
+ sub_addr = fw.subAddress if fw.subAddress != 0 else None
+ fw_versions_dict[(fw.address, sub_addr)].add(fw.fwVersion)
+ return dict(fw_versions_dict)
+
+
+class MatchFwToCar(Protocol):
+ def __call__(self, live_fw_versions: LiveFwVersions, match_brand: str | None = None, log: bool = True) -> set[str]:
+ ...
+
+
+def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, match_brand: str | None = None, log: bool = True, exclude: str | None = None) -> set[str]:
+ """Do a fuzzy FW match. This function will return a match, and the number of firmware version
+ that were matched uniquely to that specific car. If multiple ECUs uniquely match to different cars
+ the match is rejected."""
+
+ # Build lookup table from (addr, sub_addr, fw) to list of candidate cars
+ all_fw_versions = defaultdict(list)
+ for candidate, fw_by_addr in FW_VERSIONS.items():
+ if not is_brand(MODEL_TO_BRAND[candidate], match_brand):
+ continue
+
+ if candidate == exclude:
+ continue
+
+ for addr, fws in fw_by_addr.items():
+ # These ECUs are known to be shared between models (EPS only between hybrid/ICE version)
+ # Getting this exactly right isn't crucial, but excluding camera and radar makes it almost
+ # impossible to get 3 matching versions, even if two models with shared parts are released at the same
+ # time and only one is in our database.
+ if addr[0] in FUZZY_EXCLUDE_ECUS:
+ continue
+ for f in fws:
+ all_fw_versions[(addr[1], addr[2], f)].append(candidate)
+
+ matched_ecus = set()
+ match: str | None = None
+ for addr, versions in live_fw_versions.items():
+ ecu_key = (addr[0], addr[1])
+ for version in versions:
+ # All cars that have this FW response on the specified address
+ candidates = all_fw_versions[(*ecu_key, version)]
+
+ if len(candidates) == 1:
+ matched_ecus.add(ecu_key)
+ if match is None:
+ match = candidates[0]
+ # We uniquely matched two different cars. No fuzzy match possible
+ elif match != candidates[0]:
+ return set()
+
+ # Note that it is possible to match to a candidate without all its ECUs being present
+ # if there are enough matches. FIXME: parameterize this or require all ECUs to exist like exact matching
+ if match and len(matched_ecus) >= 2:
+ if log:
+ carlog.error(f"Fingerprinted {match} using fuzzy match. {len(matched_ecus)} matching ECUs")
+ return {match}
+ else:
+ return set()
+
+
+def match_fw_to_car_exact(live_fw_versions: LiveFwVersions, match_brand: str | None = None,
+ log: bool = True, extra_fw_versions: dict | None = None) -> set[str]:
+ """Do an exact FW match. Returns all cars that match the given
+ FW versions for a list of "essential" ECUs. If an ECU is not considered
+ essential the FW version can be missing to get a fingerprint, but if it's present it
+ needs to match the database."""
+ if extra_fw_versions is None:
+ extra_fw_versions = {}
+
+ invalid = set()
+ candidates = {c: f for c, f in FW_VERSIONS.items() if
+ is_brand(MODEL_TO_BRAND[c], match_brand)}
+
+ for candidate, fws in candidates.items():
+ config = FW_QUERY_CONFIGS[MODEL_TO_BRAND[candidate]]
+ for ecu, expected_versions in fws.items():
+ expected_versions = expected_versions + extra_fw_versions.get(candidate, {}).get(ecu, [])
+ ecu_type = ecu[0]
+ addr = ecu[1:]
+
+ found_versions = live_fw_versions.get(addr, set())
+ if not len(found_versions):
+ # Some models can sometimes miss an ecu, or show on two different addresses
+ # FIXME: this logic can be improved to be more specific, should require one of the two addresses
+ if candidate in config.non_essential_ecus.get(ecu_type, []):
+ continue
+
+ # Ignore non essential ecus
+ if ecu_type not in ESSENTIAL_ECUS:
+ continue
+
+ # Virtual debug ecu doesn't need to match the database
+ if ecu_type == Ecu.debug:
+ continue
+
+ if not any(found_version in expected_versions for found_version in found_versions):
+ invalid.add(candidate)
+ break
+
+ return set(candidates.keys()) - invalid
+
+
+def match_fw_to_car(fw_versions: list[CarParams.CarFw], vin: str, allow_exact: bool = True,
+ allow_fuzzy: bool = True, log: bool = True) -> tuple[bool, set[str]]:
+ # Try exact matching first
+ exact_matches: list[tuple[bool, MatchFwToCar]] = []
+ if allow_exact:
+ exact_matches = [(True, match_fw_to_car_exact)]
+ if allow_fuzzy:
+ exact_matches.append((False, match_fw_to_car_fuzzy))
+
+ for exact_match, match_func in exact_matches:
+ # For each brand, attempt to fingerprint using all FW returned from its queries
+ matches: set[str] = set()
+ for brand in VERSIONS.keys():
+ fw_versions_dict = build_fw_dict(fw_versions, filter_brand=brand)
+ matches |= match_func(fw_versions_dict, match_brand=brand, log=log)
+
+ # If specified and no matches so far, fall back to brand's fuzzy fingerprinting function
+ config = FW_QUERY_CONFIGS[brand]
+ if not exact_match and not len(matches) and config.match_fw_to_car_fuzzy is not None:
+ matches |= config.match_fw_to_car_fuzzy(fw_versions_dict, vin, VERSIONS[brand])
+
+ if len(matches):
+ return exact_match, matches
+
+ return True, set()
+
+
+def get_present_ecus(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, num_pandas: int = 1) -> set[EcuAddrBusType]:
+ # queries are split by OBD multiplexing mode
+ queries: dict[bool, list[list[EcuAddrBusType]]] = {True: [], False: []}
+ parallel_queries: dict[bool, list[EcuAddrBusType]] = {True: [], False: []}
+ responses: set[EcuAddrBusType] = set()
+
+ for brand, config, r in REQUESTS:
+ # Skip query if no panda available
+ if r.bus > num_pandas * 4 - 1:
+ continue
+
+ for ecu_type, addr, sub_addr in config.get_all_ecus(VERSIONS[brand]):
+ # Only query ecus in whitelist if whitelist is not empty
+ if len(r.whitelist_ecus) == 0 or ecu_type in r.whitelist_ecus:
+ a = (addr, sub_addr, r.bus)
+ # Build set of queries
+ if sub_addr is None:
+ if a not in parallel_queries[r.obd_multiplexing]:
+ parallel_queries[r.obd_multiplexing].append(a)
+ else: # subaddresses must be queried one by one
+ if [a] not in queries[r.obd_multiplexing]:
+ queries[r.obd_multiplexing].append([a])
+
+ # Build set of expected responses to filter
+ response_addr = uds.get_rx_addr_for_tx_addr(addr, r.rx_offset)
+ responses.add((response_addr, sub_addr, r.bus))
+
+ for obd_multiplexing in queries:
+ queries[obd_multiplexing].insert(0, parallel_queries[obd_multiplexing])
+
+ ecu_responses = set()
+ for obd_multiplexing in queries:
+ set_obd_multiplexing(obd_multiplexing)
+ for query in queries[obd_multiplexing]:
+ ecu_responses.update(get_ecu_addrs(can_recv, can_send, set(query), responses, timeout=0.1))
+ return ecu_responses
+
+
+def get_brand_ecu_matches(ecu_rx_addrs: set[EcuAddrBusType]) -> dict[str, list[bool]]:
+ """Returns dictionary of brands and matches with ECUs in their FW versions"""
+
+ brand_rx_addrs = {brand: set() for brand in FW_QUERY_CONFIGS}
+ brand_matches = {brand: [] for brand, _, _ in REQUESTS}
+
+ # Since we can't know what request an ecu responded to, add matches for all possible rx offsets
+ for brand, config, r in REQUESTS:
+ for ecu in config.get_all_ecus(VERSIONS[brand]):
+ if len(r.whitelist_ecus) == 0 or ecu[0] in r.whitelist_ecus:
+ brand_rx_addrs[brand].add((uds.get_rx_addr_for_tx_addr(ecu[1], r.rx_offset), ecu[2]))
+
+ for brand, addrs in brand_rx_addrs.items():
+ for addr in addrs:
+ # TODO: check bus from request as well
+ brand_matches[brand].append(addr in [addr[:2] for addr in ecu_rx_addrs])
+
+ return brand_matches
+
+
+def get_fw_versions_ordered(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, vin: str,
+ ecu_rx_addrs: set[EcuAddrBusType], timeout: float = 0.1, num_pandas: int = 1, progress: bool = False) -> list[CarParams.CarFw]:
+ """Queries for FW versions ordering brands by likelihood, breaks when exact match is found"""
+
+ all_car_fw = []
+ brand_matches = get_brand_ecu_matches(ecu_rx_addrs)
+
+ # Sort brands by number of matching ECUs first, then percentage of matching ECUs in the database
+ # 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]:
+ continue
+
+ car_fw = get_fw_versions(can_recv, can_send, set_obd_multiplexing, query_brand=brand, timeout=timeout, num_pandas=num_pandas, progress=progress)
+ all_car_fw.extend(car_fw)
+
+ # If there is a match using this brand's FW alone, finish querying early
+ _, matches = match_fw_to_car(car_fw, vin, log=False)
+ if len(matches) == 1:
+ break
+
+ return all_car_fw
+
+
+def get_fw_versions(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, query_brand: str | None = None,
+ extra: OfflineFwVersions | None = None, timeout: float = 0.1, num_pandas: int = 1, progress: bool = False) -> list[CarParams.CarFw]:
+ versions = VERSIONS.copy()
+
+ if query_brand is not None:
+ versions = {query_brand: versions[query_brand]}
+
+ if extra is not None:
+ versions.update(extra)
+
+ # Extract ECU addresses to query from fingerprints
+ # ECUs using a subaddress need be queried one by one, the rest can be done in parallel
+ addrs = []
+ parallel_addrs = []
+ ecu_types = {}
+
+ for brand, brand_versions in versions.items():
+ config = FW_QUERY_CONFIGS[brand]
+ for ecu_type, addr, sub_addr in config.get_all_ecus(brand_versions):
+ a = (brand, addr, sub_addr)
+ if a not in ecu_types:
+ ecu_types[a] = ecu_type
+
+ if sub_addr is None:
+ if a not in parallel_addrs:
+ parallel_addrs.append(a)
+ else:
+ if [a] not in addrs:
+ addrs.append([a])
+
+ addrs.insert(0, parallel_addrs)
+
+ # Get versions and build capnp list to put into CarParams
+ car_fw = []
+ requests = [(brand, config, r) for brand, config, r in REQUESTS if is_brand(brand, query_brand)]
+ for addr_group in tqdm(addrs, disable=not progress): # split by subaddr, if any
+ for addr_chunk in chunks(addr_group):
+ for brand, config, r in requests:
+ # Skip query if no panda available
+ if r.bus > num_pandas * 4 - 1:
+ continue
+
+ # Toggle OBD multiplexing for each request
+ if r.bus % 4 == 1:
+ set_obd_multiplexing(r.obd_multiplexing)
+
+ try:
+ query_addrs = [(a, s) for (b, a, s) in addr_chunk if b in (brand, 'any') and
+ (len(r.whitelist_ecus) == 0 or ecu_types[(b, a, s)] in r.whitelist_ecus)]
+
+ if query_addrs:
+ query = IsoTpParallelQuery(can_send, can_recv, r.bus, query_addrs, r.request, r.response, r.rx_offset)
+ for (tx_addr, sub_addr), version in query.get_data(timeout).items():
+ f = CarParams.CarFw()
+
+ f.ecu = ecu_types.get((brand, tx_addr, sub_addr), Ecu.unknown)
+ f.fwVersion = version
+ f.address = tx_addr
+ f.responseAddress = uds.get_rx_addr_for_tx_addr(tx_addr, r.rx_offset)
+ f.request = r.request
+ f.brand = brand
+ f.bus = r.bus
+ f.logging = r.logging or (f.ecu, tx_addr, sub_addr) in config.extra_ecus
+ f.obdMultiplexing = r.obd_multiplexing
+
+ if sub_addr is not None:
+ f.subAddress = sub_addr
+
+ car_fw.append(f)
+ except Exception:
+ carlog.exception("FW query exception")
+
+ return car_fw
diff --git a/iqdbc_repo/iqdbc/car/gm/__init__.py b/iqdbc_repo/iqdbc/car/gm/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/gm/carcontroller.py b/iqdbc_repo/iqdbc/car/gm/carcontroller.py
new file mode 100644
index 000000000..c9431d9dc
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/carcontroller.py
@@ -0,0 +1,163 @@
+import numpy as np
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, DT_CTRL, structs
+from iqdbc.car.lateral import apply_driver_steer_torque_limits
+from iqdbc.car.gm import gmcan
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.gm.values import DBC, CanBus, CarControllerParams, CruiseButtons
+from iqdbc.car.interfaces import CarControllerBase
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+NetworkLocation = structs.CarParams.NetworkLocation
+LongCtrlState = structs.CarControl.Actuators.LongControlState
+
+# Camera cancels up to 0.1s after brake is pressed, ECM allows 0.5s
+CAMERA_CANCEL_DELAY_FRAMES = 10
+# Enforce a minimum interval between steering messages to avoid a fault
+MIN_STEER_MSG_INTERVAL_MS = 15
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ super().__init__(dbc_names, CP, CP_IQ)
+ self.start_time = 0.
+ self.apply_torque_last = 0
+ self.apply_gas = 0
+ self.apply_brake = 0
+ self.last_steer_frame = 0
+ self.last_button_frame = 0
+ self.cancel_counter = 0
+
+ self.lka_steering_cmd_counter = 0
+ self.lka_icon_status_last = (False, False)
+
+ self.params = CarControllerParams(self.CP)
+
+ self.packer_pt = CANPacker(DBC[self.CP.carFingerprint][Bus.pt])
+ self.packer_obj = CANPacker(DBC[self.CP.carFingerprint][Bus.radar])
+ self.packer_ch = CANPacker(DBC[self.CP.carFingerprint][Bus.chassis])
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+ hud_alert = hud_control.visualAlert
+ hud_v_cruise = hud_control.setSpeed
+ if hud_v_cruise > 70:
+ hud_v_cruise = 0
+
+ # Send CAN commands.
+ can_sends = []
+
+ # Steering (Active: 50Hz, inactive: 10Hz)
+ steer_step = self.params.STEER_STEP if CC.latActive else self.params.INACTIVE_STEER_STEP
+
+ if self.CP.networkLocation == NetworkLocation.fwdCamera:
+ # Also send at 50Hz:
+ # - on startup, first few msgs are blocked
+ # - until we're in sync with camera so counters align when relay closes, preventing a fault.
+ # openpilot can subtly drift, so this is activated throughout a drive to stay synced
+ out_of_sync = self.lka_steering_cmd_counter % 4 != (CS.cam_lka_steering_cmd_counter + 1) % 4
+ if CS.loopback_lka_steering_cmd_ts_nanos == 0 or out_of_sync:
+ steer_step = self.params.STEER_STEP
+
+ self.lka_steering_cmd_counter += 1 if CS.loopback_lka_steering_cmd_updated else 0
+
+ # Avoid GM EPS faults when transmitting messages too close together: skip this transmit if we
+ # received the ASCMLKASteeringCmd loopback confirmation too recently
+ last_lka_steer_msg_ms = (now_nanos - CS.loopback_lka_steering_cmd_ts_nanos) * 1e-6
+ if (self.frame - self.last_steer_frame) >= steer_step and last_lka_steer_msg_ms > MIN_STEER_MSG_INTERVAL_MS:
+ # Initialize ASCMLKASteeringCmd counter using the camera until we get a msg on the bus
+ if CS.loopback_lka_steering_cmd_ts_nanos == 0:
+ 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)
+ else:
+ apply_torque = 0
+
+ self.last_steer_frame = self.frame
+ self.apply_torque_last = apply_torque
+ idx = self.lka_steering_cmd_counter % 4
+ can_sends.append(gmcan.create_steering_control(self.packer_pt, CanBus.POWERTRAIN, apply_torque, idx, CC.latActive))
+
+ if self.CP.openpilotLongitudinalControl:
+ # Gas/regen, brakes, and UI commands - all at 25Hz
+ if self.frame % 4 == 0:
+ stopping = actuators.longControlState == LongCtrlState.stopping
+ if not CC.longActive:
+ # ASCM sends max regen when not enabled
+ self.apply_gas = self.params.INACTIVE_REGEN
+ self.apply_brake = 0
+ else:
+ self.apply_gas = float(np.interp(actuators.accel, self.params.GAS_LOOKUP_BP, self.params.GAS_LOOKUP_V))
+ self.apply_brake = int(round(np.interp(actuators.accel, self.params.BRAKE_LOOKUP_BP, self.params.BRAKE_LOOKUP_V)))
+ # Don't allow any gas above inactive regen while stopping
+ # FIXME: brakes aren't applied immediately when enabling at a stop
+ if stopping:
+ self.apply_gas = self.params.INACTIVE_REGEN
+
+ idx = (self.frame // 4) % 4
+
+ at_full_stop = CC.longActive and CS.out.standstill
+ near_stop = CC.longActive and (abs(CS.out.vEgo) < self.params.NEAR_STOP_BRAKE_PHASE)
+ friction_brake_bus = CanBus.CHASSIS
+ # GM Camera exceptions
+ # TODO: can we always check the longControlState?
+ if self.CP.networkLocation == NetworkLocation.fwdCamera:
+ at_full_stop = at_full_stop and stopping
+ friction_brake_bus = CanBus.POWERTRAIN
+
+ # GasRegenCmdActive needs to be 1 to avoid cruise faults. It describes the ACC state, not actuation
+ can_sends.append(gmcan.create_gas_regen_command(self.packer_pt, CanBus.POWERTRAIN, self.apply_gas, idx, CC.enabled, at_full_stop))
+ can_sends.append(gmcan.create_friction_brake_command(self.packer_ch, friction_brake_bus, self.apply_brake,
+ idx, CC.enabled, near_stop, at_full_stop, self.CP))
+
+ # Send dashboard UI commands (ACC status)
+ send_fcw = hud_alert == VisualAlert.fcw
+ can_sends.append(gmcan.create_acc_dashboard_command(self.packer_pt, CanBus.POWERTRAIN, CC.enabled,
+ hud_v_cruise * CV.MS_TO_KPH, hud_control, send_fcw))
+
+ # Radar needs to know current speed and yaw rate (50hz),
+ # and that ADAS is alive (10hz)
+ if not self.CP.radarUnavailable:
+ tt = self.frame * DT_CTRL
+ time_and_headlights_step = 10
+ if self.frame % time_and_headlights_step == 0:
+ idx = (self.frame // time_and_headlights_step) % 4
+ can_sends.append(gmcan.create_adas_time_status(CanBus.OBSTACLE, int((tt - self.start_time) * 60), idx))
+ can_sends.append(gmcan.create_adas_headlights_status(self.packer_obj, CanBus.OBSTACLE))
+
+ speed_and_accelerometer_step = 2
+ if self.frame % speed_and_accelerometer_step == 0:
+ idx = (self.frame // speed_and_accelerometer_step) % 4
+ can_sends.append(gmcan.create_adas_steering_status(CanBus.OBSTACLE, idx))
+ can_sends.append(gmcan.create_adas_accelerometer_speed_status(CanBus.OBSTACLE, abs(CS.out.vEgo), idx))
+
+ if self.CP.networkLocation == NetworkLocation.gateway and self.frame % self.params.ADAS_KEEPALIVE_STEP == 0:
+ can_sends += gmcan.create_adas_keepalive(CanBus.POWERTRAIN)
+
+ else:
+ # While car is braking, cancel button causes ECM to enter a soft disable state with a fault status.
+ # A delayed cancellation allows camera to cancel and avoids a fault when user depresses brake quickly
+ self.cancel_counter = self.cancel_counter + 1 if CC.cruiseControl.cancel else 0
+
+ # Stock longitudinal, integrated at camera
+ if (self.frame - self.last_button_frame) * DT_CTRL > 0.04:
+ if self.cancel_counter > CAMERA_CANCEL_DELAY_FRAMES:
+ self.last_button_frame = self.frame
+ can_sends.append(gmcan.create_buttons(self.packer_pt, CanBus.CAMERA, CS.buttons_counter, CruiseButtons.CANCEL))
+
+ if self.CP.networkLocation == NetworkLocation.fwdCamera:
+ # Silence "Take Steering" alert sent by camera, forward PSCMStatus with HandsOffSWlDetectionStatus=1
+ if self.frame % 10 == 0:
+ 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.gas = self.apply_gas
+ new_actuators.brake = self.apply_brake
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/gm/carstate.py b/iqdbc_repo/iqdbc/car/gm/carstate.py
new file mode 100644
index 000000000..b7c18c385
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/carstate.py
@@ -0,0 +1,186 @@
+import copy
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.gm.values import DBC, AccState, CruiseButtons, STEER_THRESHOLD, SDGM_CAR, ALT_ACCS
+
+from iqdbc.lvbs.car.gm.iq_carstate import IQCarState
+from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ
+
+ButtonType = structs.CarState.ButtonEvent.Type
+TransmissionType = structs.CarParams.TransmissionType
+NetworkLocation = structs.CarParams.NetworkLocation
+
+STANDSTILL_THRESHOLD = 10 * 0.0311
+
+BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.DECEL_SET: ButtonType.decelCruise,
+ CruiseButtons.MAIN: ButtonType.mainCruise, CruiseButtons.CANCEL: ButtonType.cancel}
+
+
+class CarState(CarStateBase, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+ self.shifter_values = can_define.dv["ECMPRDNL2"]["PRNDL2"]
+ self.cluster_speed_hyst_gap = CV.KPH_TO_MS / 2.
+ self.cluster_min_speed = CV.KPH_TO_MS / 2.
+
+ self.loopback_lka_steering_cmd_updated = False
+ self.loopback_lka_steering_cmd_ts_nanos = 0
+ self.pt_lka_steering_cmd_counter = 0
+ self.cam_lka_steering_cmd_counter = 0
+ self.buttons_counter = 0
+
+ self.distance_button = 0
+
+ def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]):
+ if not self.CP.pcmCruise:
+ for b in buttonEvents:
+ # The ECM allows enabling on falling edge of set, but only rising edge of resume
+ if (b.type == ButtonType.accelCruise and b.pressed) or \
+ (b.type == ButtonType.decelCruise and not b.pressed):
+ return True
+ return False
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ pt_cp = can_parsers[Bus.pt]
+ cam_cp = can_parsers[Bus.cam]
+ loopback_cp = can_parsers[Bus.loopback]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ prev_cruise_buttons = self.cruise_buttons
+ prev_distance_button = self.distance_button
+ self.cruise_buttons = pt_cp.vl["ASCMSteeringButton"]["ACCButtons"]
+ self.distance_button = pt_cp.vl["ASCMSteeringButton"]["DistanceButton"]
+ self.buttons_counter = pt_cp.vl["ASCMSteeringButton"]["RollingCounter"]
+ self.pscm_status = copy.copy(pt_cp.vl["PSCMStatus"])
+
+ # Variables used for avoiding LKAS faults
+ self.loopback_lka_steering_cmd_updated = len(loopback_cp.vl_all["ASCMLKASteeringCmd"]["RollingCounter"]) > 0
+ if self.loopback_lka_steering_cmd_updated:
+ self.loopback_lka_steering_cmd_ts_nanos = loopback_cp.ts_nanos["ASCMLKASteeringCmd"]["RollingCounter"]
+ if self.CP.networkLocation == NetworkLocation.fwdCamera:
+ self.pt_lka_steering_cmd_counter = pt_cp.vl["ASCMLKASteeringCmd"]["RollingCounter"]
+ self.cam_lka_steering_cmd_counter = cam_cp.vl["ASCMLKASteeringCmd"]["RollingCounter"]
+
+ # This is to avoid a fault where you engage while still moving backwards after shifting to D.
+ # An Equinox has been seen with an unsupported status (3), so only check if either wheel is in reverse (2)
+ left_whl_sign = -1 if pt_cp.vl["EBCMWheelSpdRear"]["RLWheelDir"] == 2 else 1
+ right_whl_sign = -1 if pt_cp.vl["EBCMWheelSpdRear"]["RRWheelDir"] == 2 else 1
+ self.parse_wheel_speeds(ret,
+ left_whl_sign * pt_cp.vl["EBCMWheelSpdFront"]["FLWheelSpd"],
+ right_whl_sign * pt_cp.vl["EBCMWheelSpdFront"]["FRWheelSpd"],
+ left_whl_sign * pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"],
+ right_whl_sign * pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"],
+ )
+ # sample rear wheel speeds to match the safety which only uses the rear CAN message
+ # standstill=True if ECM allows engagement with brake
+ ret.standstill = abs(pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"]) <= STANDSTILL_THRESHOLD and \
+ abs(pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"]) <= STANDSTILL_THRESHOLD
+
+ if pt_cp.vl["ECMPRDNL2"]["ManualMode"] == 1:
+ ret.gearShifter = self.parse_gear_shifter("T")
+ else:
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["ECMPRDNL2"]["PRNDL2"], None))
+
+ ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"]
+ if self.CP.networkLocation == NetworkLocation.fwdCamera:
+ ret.brakePressed = pt_cp.vl["ECMEngineStatus"]["BrakePressed"] != 0
+ else:
+ # Some Volt 2016-17 have loose brake pedal push rod retainers which causes the ECM to believe
+ # that the brake is being intermittently pressed without user interaction.
+ # To avoid a cruise fault we need to use a conservative brake position threshold
+ # https://static.nhtsa.gov/odi/tsbs/2017/MC-10137629-9999.pdf
+ ret.brakePressed = ret.brake >= 8
+
+ # Regen braking is braking
+ if self.CP.transmissionType == TransmissionType.direct:
+ ret.regenBraking = pt_cp.vl["EBCMRegenPaddle"]["RegenPaddle"] != 0
+
+ ret.gasPressed = pt_cp.vl["AcceleratorPedal2"]["AcceleratorPedal2"] / 254. > 1e-5
+
+ ret.steeringAngleDeg = pt_cp.vl["PSCMSteeringAngle"]["SteeringWheelAngle"]
+ ret.steeringRateDeg = pt_cp.vl["PSCMSteeringAngle"]["SteeringWheelRate"]
+ ret.steeringTorque = pt_cp.vl["PSCMStatus"]["LKADriverAppldTrq"]
+ ret.steeringTorqueEps = pt_cp.vl["PSCMStatus"]["LKATorqueDelivered"]
+ ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
+
+ # 0 inactive, 1 active, 2 temporarily limited, 3 failed
+ self.lkas_status = pt_cp.vl["PSCMStatus"]["LKATorqueDeliveredStatus"]
+ ret.steerFaultTemporary = self.lkas_status == 2
+ ret.steerFaultPermanent = self.lkas_status == 3
+
+ # 1 - open, 0 - closed
+ ret.doorOpen = (pt_cp.vl["BCMDoorBeltStatus"]["FrontLeftDoor"] == 1 or
+ pt_cp.vl["BCMDoorBeltStatus"]["FrontRightDoor"] == 1 or
+ pt_cp.vl["BCMDoorBeltStatus"]["RearLeftDoor"] == 1 or
+ pt_cp.vl["BCMDoorBeltStatus"]["RearRightDoor"] == 1)
+
+ # 1 - latched
+ ret.seatbeltUnlatched = pt_cp.vl["BCMDoorBeltStatus"]["LeftSeatBelt"] == 0
+ ret.leftBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 1
+ ret.rightBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 2
+
+ ret.parkingBrake = pt_cp.vl["BCMGeneralPlatformStatus"]["ParkBrakeSwActive"] == 1
+ ret.cruiseState.available = pt_cp.vl["ECMEngineStatus"]["CruiseMainOn"] != 0
+ ret.espDisabled = pt_cp.vl["ESPStatus"]["TractionControlOn"] != 1
+ ret.accFaulted = (pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.FAULTED or
+ pt_cp.vl["EBCMFrictionBrakeStatus"]["FrictionBrakeUnavailable"] == 1)
+
+ ret.cruiseState.enabled = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] != AccState.OFF
+ ret.cruiseState.standstill = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.STANDSTILL
+ if self.CP.networkLocation == NetworkLocation.fwdCamera:
+ if self.CP.carFingerprint not in ALT_ACCS and not self.CP_IQ.flags & GMFlagsIQ.NON_ACC:
+ ret.cruiseState.speed = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCSpeedSetpoint"] * CV.KPH_TO_MS
+ # This FCW signal only works for SDGM cars. CAM cars send FCW on GMLAN but this bit is always 0 for them
+ ret.stockFcw = cam_cp.vl["ASCMActiveCruiseControlStatus"]["FCWAlert"] != 0
+ if self.CP.pcmCruise:
+ # openpilot controls nonAdaptive when not pcmCruise
+ ret.cruiseState.nonAdaptive = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCCruiseState"] not in (2, 3)
+ else:
+ ret.cruiseState.speed = pt_cp.vl["ECMCruiseControl"]["CruiseSetSpeed"] * CV.KPH_TO_MS
+
+ if self.CP.carFingerprint not in SDGM_CAR:
+ ret.stockAeb = cam_cp.vl["AEBCmd"]["AEBCmdActive"] != 0
+
+ if self.CP.enableBsm:
+ ret.leftBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["LeftBSM"] == 1
+ ret.rightBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["RightBSM"] == 1
+
+ # Don't add event if transitioning from INIT, unless it's to an actual button
+ if self.cruise_buttons != CruiseButtons.UNPRESS or prev_cruise_buttons != CruiseButtons.INIT:
+ ret.buttonEvents = [
+ *create_button_events(self.cruise_buttons, prev_cruise_buttons, BUTTONS_DICT,
+ unpressed_btn=CruiseButtons.UNPRESS),
+ *create_button_events(self.distance_button, prev_distance_button,
+ {1: ButtonType.gapAdjustCruise})
+ ]
+
+ if ret.vEgo < self.CP.minSteerSpeed:
+ ret.lowSpeedAlert = True
+
+ IQCarState.update(self, ret, can_parsers)
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ pt_messages = []
+ if CP.networkLocation == NetworkLocation.fwdCamera:
+ pt_messages += [
+ ("ASCMLKASteeringCmd", float('nan')),
+ ]
+
+ loopback_messages = [
+ ("ASCMLKASteeringCmd", float('nan')),
+ ]
+
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
+ Bus.loopback: CANParser(DBC[CP.carFingerprint][Bus.pt], loopback_messages, 128),
+ }
diff --git a/iqdbc_repo/iqdbc/car/gm/fingerprints.py b/iqdbc_repo/iqdbc/car/gm/fingerprints.py
new file mode 100644
index 000000000..25063d77c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/fingerprints.py
@@ -0,0 +1,84 @@
+# ruff: noqa: E501
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.gm.values import CAR
+from iqdbc.lvbs.car.iq_fingerprints import extend_fingerprints
+from iqdbc.lvbs.car.gm.iq_fingerprints import FINGERPRINTS_EXT
+
+# Trailblazer also matches as a SILVERADO, TODO: split with fw versions
+# FIXME: There are Equinox users with different message lengths, specifically 304 and 320
+
+
+FINGERPRINTS = {
+ CAR.HOLDEN_ASTRA: [{
+ 190: 8, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 8, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 401: 8, 413: 8, 417: 8, 419: 8, 422: 1, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 8, 455: 7, 456: 8, 458: 5, 479: 8, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 8, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 647: 5, 707: 8, 715: 8, 723: 8, 753: 5, 761: 7, 806: 1, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1009: 8, 1011: 6, 1017: 8, 1019: 3, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 8, 1280: 4, 1300: 8, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1908: 7, 1912: 7, 1919: 7
+ }],
+ CAR.CHEVROLET_VOLT: [{
+ 170: 8, 171: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 289: 8, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 577: 8, 647: 3, 707: 8, 711: 6, 715: 8, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 961: 8, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1928: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8
+ },
+ {
+ 170: 8, 171: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 577: 8, 578: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 715: 8, 717: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1516: 8, 1601: 8, 1618: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1930: 7, 2016: 8, 2018: 8, 2020: 8, 2024: 8, 2028: 8
+ },
+ {
+ 170: 8, 171: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 209: 7, 211: 2, 241: 6, 288: 5, 289: 1, 290: 1, 298: 2, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 368: 8, 381: 2, 384: 8, 386: 5, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 3, 508: 8, 512: 3, 528: 4, 530: 8, 532: 6, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 761: 7, 810: 8, 821: 4, 823: 7, 832: 8, 840: 5, 842: 5, 844: 8, 853: 8, 866: 4, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7
+ }],
+ CAR.BUICK_LACROSSE: [{
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 528: 5, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 5, 707: 8, 753: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 872: 1, 882: 8, 890: 1, 892: 2, 893: 1, 894: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1916: 7, 1918: 7, 1919: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8
+ }],
+ CAR.BUICK_REGAL: [{
+ 190: 8, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 8, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 8, 419: 8, 422: 4, 426: 8, 431: 8, 442: 8, 451: 8, 452: 8, 453: 8, 455: 7, 456: 8, 463: 3, 479: 8, 481: 7, 485: 8, 487: 8, 489: 8, 495: 8, 497: 8, 499: 3, 500: 8, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 569: 3, 573: 1, 577: 8, 578: 8, 579: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 882: 8, 884: 8, 890: 1, 892: 2, 893: 2, 894: 1, 961: 8, 967: 8, 969: 8, 977: 8, 979: 8, 985: 8, 1001: 8, 1005: 6, 1009: 8, 1011: 8, 1013: 3, 1017: 8, 1020: 8, 1024: 8, 1025: 8, 1026: 8, 1027: 8, 1028: 8, 1029: 8, 1030: 8, 1031: 8, 1032: 2, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 8, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 8, 1263: 8, 1265: 8, 1267: 8, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1602: 8, 1603: 7, 1611: 8, 1618: 8, 1906: 8, 1907: 7, 1912: 7, 1914: 7, 1916: 7, 1919: 7, 1930: 7, 2016: 8, 2018: 8, 2019: 8, 2024: 8, 2026: 8
+ }],
+ CAR.CADILLAC_ATS: [{
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 368: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 462: 4, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 491: 2, 493: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 723: 2, 753: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 882: 8, 890: 1, 892: 2, 893: 2, 894: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1241: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1916: 7, 1917: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7, 2016: 8, 2024: 8
+ }],
+ CAR.CHEVROLET_MALIBU: [{
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1930: 7, 2016: 8, 2024: 8
+ }],
+ CAR.GMC_ACADIA: [{
+ 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 7, 368: 8, 381: 8, 384: 8, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 458: 8, 460: 4, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 512: 3, 530: 8, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 568: 2, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 801: 8, 803: 8, 804: 3, 805: 8, 832: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7
+ },
+ {
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 338: 6, 340: 6, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1919: 7, 1920: 7, 1930: 7, 2016: 8, 2024: 8
+ }],
+ CAR.CADILLAC_ESCALADE: [{
+ 170: 8, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 4, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 460: 5, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1917: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8
+ }],
+ CAR.CADILLAC_ESCALADE_ESV: [{
+ 309: 1, 848: 8, 849: 8, 850: 8, 851: 8, 852: 8, 853: 8, 854: 3, 1056: 6, 1057: 8, 1058: 8, 1059: 8, 1060: 8, 1061: 8, 1062: 8, 1063: 8, 1064: 8, 1065: 8, 1066: 8, 1067: 8, 1068: 8, 1120: 8, 1121: 8, 1122: 8, 1123: 8, 1124: 8, 1125: 8, 1126: 8, 1127: 8, 1128: 8, 1129: 8, 1130: 8, 1131: 8, 1132: 8, 1133: 8, 1134: 8, 1135: 8, 1136: 8, 1137: 8, 1138: 8, 1139: 8, 1140: 8, 1141: 8, 1142: 8, 1143: 8, 1146: 8, 1147: 8, 1148: 8, 1149: 8, 1150: 8, 1151: 8, 1216: 8, 1217: 8, 1218: 8, 1219: 8, 1220: 8, 1221: 8, 1222: 8, 1223: 8, 1224: 8, 1225: 8, 1226: 8, 1232: 8, 1233: 8, 1234: 8, 1235: 8, 1236: 8, 1237: 8, 1238: 8, 1239: 8, 1240: 8, 1241: 8, 1242: 8, 1787: 8, 1788: 8
+ }],
+ CAR.CADILLAC_ESCALADE_ESV_2019: [{
+ 715: 8, 840: 5, 717: 5, 869: 4, 880: 6, 289: 8, 454: 8, 842: 5, 460: 5, 463: 3, 801: 8, 170: 8, 190: 6, 241: 6, 201: 8, 417: 7, 211: 2, 419: 1, 398: 8, 426: 7, 487: 8, 442: 8, 451: 8, 452: 8, 453: 6, 479: 3, 311: 8, 500: 6, 647: 6, 193: 8, 707: 8, 197: 8, 209: 7, 199: 4, 455: 7, 313: 8, 481: 7, 485: 8, 489: 8, 249: 8, 393: 7, 407: 7, 413: 8, 422: 4, 431: 8, 501: 8, 499: 3, 810: 8, 508: 8, 381: 8, 462: 4, 532: 6, 562: 8, 386: 8, 761: 7, 573: 1, 554: 3, 719: 5, 560: 8, 1279: 4, 388: 8, 288: 5, 1005: 6, 497: 8, 844: 8, 961: 8, 967: 4, 977: 8, 979: 8, 985: 5, 1001: 8, 1017: 8, 1019: 2, 1020: 8, 1217: 8, 510: 8, 866: 4, 304: 1, 969: 8, 384: 4, 1033: 7, 1009: 8, 1034: 7, 1296: 4, 1930: 7, 1105: 5, 1013: 5, 1225: 7, 1919: 7, 320: 3, 534: 2, 352: 5, 298: 8, 1223: 2, 1233: 8, 608: 8, 1265: 8, 609: 6, 1267: 1, 1417: 8, 610: 6, 1906: 7, 611: 6, 612: 8, 613: 8, 208: 8, 564: 5, 309: 8, 1221: 5, 1280: 4, 1249: 8, 1907: 7, 1257: 6, 1300: 8, 1920: 7, 563: 5, 1322: 6, 1323: 4, 1328: 4, 1917: 7, 328: 1, 1912: 7, 1914: 7, 804: 3, 1918: 7
+ }],
+ CAR.CHEVROLET_BOLT_EUV: [{
+ 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7
+ }],
+ CAR.CHEVROLET_SILVERADO: [{
+ 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 534: 2, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7
+ },
+ {
+ 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 3, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 534: 2, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7
+ }],
+ CAR.CHEVROLET_EQUINOX: [{
+ 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7
+ },
+ {
+ 190: 6, 201: 8, 211: 2, 717: 5, 241: 6, 451: 8, 298: 8, 452: 8, 453: 6, 479: 3, 485: 8, 249: 8, 500: 6, 587: 8, 1611: 8, 289: 8, 481: 7, 193: 8, 197: 8, 209: 7, 455: 7, 489: 8, 309: 8, 413: 8, 501: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 311: 8, 510: 8, 528: 5, 532: 6, 715: 8, 560: 8, 562: 8, 707: 8, 789: 5, 869: 4, 880: 6, 761: 7, 840: 5, 842: 5, 844: 8, 313: 8, 381: 8, 386: 8, 810: 8, 322: 7, 384: 4, 800: 6, 1033: 7, 1034: 7, 1296: 4, 753: 5, 388: 8, 288: 5, 497: 8, 463: 3, 304: 3, 977: 8, 1001: 8, 1280: 4, 320: 4, 352: 5, 563: 5, 565: 5, 1221: 5, 1011: 6, 1017: 8, 1020: 8, 1249: 8, 1300: 8, 328: 1, 1217: 8, 1233: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1930: 7, 1271: 8
+ }],
+ CAR.CADILLAC_XT4: [{
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 761: 7, 806: 1, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 5, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1037: 5, 1105: 5, 1187: 5, 1195: 3, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1273: 3, 1276: 2, 1277: 7, 1278: 4, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1417: 8, 1512: 8, 1517: 8, 1601: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 8, 1924: 8, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 2000: 8, 2001: 8, 2002: 8, 2016: 8, 2017: 8, 2018: 8, 2020: 8, 2021: 8, 2024: 8, 2026: 8
+ }],
+ CAR.CHEVROLET_VOLT_2019: [{
+ 170: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 331: 3, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 573: 1, 577: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 715: 8, 717: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1268: 2, 1273: 3, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1345: 8, 1417: 8, 1512: 8, 1513: 8, 1516: 8, 1517: 8, 1601: 8, 1609: 8, 1611: 8, 1618: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1871: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1920: 8, 1922: 7, 1927: 7, 1930: 7, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1988: 8, 1990: 8, 2000: 8, 2001: 8, 2004: 8, 2017: 8, 2018: 8, 2020: 8, 2021: 8, 2023: 8, 2025: 8, 2028: 8, 2031: 8
+ }],
+ CAR.CHEVROLET_TRAVERSE: [{
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 573: 1, 577: 8, 578: 8, 579: 8, 587: 8, 603: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 723: 4, 730: 4, 753: 5, 761: 7, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 5, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1346: 8, 1347: 8, 1355: 8, 1362: 8, 1417: 8, 1512: 8, 1514: 8, 1601: 8, 1602: 8, 1603: 7, 1609: 8, 1611: 8, 1613: 8, 1618: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1871: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 7, 1927: 8, 1930: 7, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1988: 8, 1990: 8, 2000: 8, 2001: 8, 2004: 8, 2016: 8, 2017: 8, 2018: 8, 2019: 8, 2020: 8, 2024: 8, 2026: 8
+ }],
+ CAR.GMC_YUKON: [{
+ 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 534: 2, 562: 8, 563: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 761: 7, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1355: 8, 1611: 8
+ }],
+}
+
+FW_VERSIONS: dict[str, dict[tuple, list[bytes]]] = {
+}
+
+
+FINGERPRINTS = extend_fingerprints(FINGERPRINTS, FINGERPRINTS_EXT)
diff --git a/iqdbc_repo/iqdbc/car/gm/gmcan.py b/iqdbc_repo/iqdbc/car/gm/gmcan.py
new file mode 100644
index 000000000..0ed1c6688
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/gmcan.py
@@ -0,0 +1,171 @@
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.gm.values import CAR
+
+
+def create_buttons(packer, bus, idx, button):
+ values = {
+ "ACCButtons": button,
+ "RollingCounter": idx,
+ "ACCAlwaysOne": 1,
+ "DistanceButton": 0,
+ }
+
+ checksum = 240 + int(values["ACCAlwaysOne"] * 0xf)
+ checksum += values["RollingCounter"] * (0x4ef if values["ACCAlwaysOne"] != 0 else 0x3f0)
+ checksum -= int(values["ACCButtons"] - 1) << 4 # not correct if value is 0
+ checksum -= 2 * values["DistanceButton"]
+
+ values["SteeringButtonChecksum"] = checksum
+ return packer.make_can_msg("ASCMSteeringButton", bus, values)
+
+
+def create_pscm_status(packer, bus, pscm_status):
+ values = {s: pscm_status[s] for s in [
+ "HandsOffSWDetectionMode",
+ "HandsOffSWlDetectionStatus",
+ "LKATorqueDeliveredStatus",
+ "LKADriverAppldTrq",
+ "LKATorqueDelivered",
+ "LKATotalTorqueDelivered",
+ "RollingCounter",
+ "PSCMStatusChecksum",
+ ]}
+ checksum_mod = int(1 - values["HandsOffSWlDetectionStatus"]) << 5
+ values["HandsOffSWlDetectionStatus"] = 1
+ values["PSCMStatusChecksum"] += checksum_mod
+ return packer.make_can_msg("PSCMStatus", bus, values)
+
+
+def create_steering_control(packer, bus, apply_torque, idx, lkas_active):
+ values = {
+ "LKASteeringCmdActive": lkas_active,
+ "LKASteeringCmd": apply_torque,
+ "RollingCounter": idx,
+ "LKASteeringCmdChecksum": 0x1000 - (lkas_active << 11) - (apply_torque & 0x7ff) - idx
+ }
+
+ return packer.make_can_msg("ASCMLKASteeringCmd", bus, values)
+
+
+def create_adas_keepalive(bus):
+ dat = b"\x00\x00\x00\x00\x00\x00\x00"
+ return [CanData(0x409, dat, bus), CanData(0x40a, dat, bus)]
+
+
+def create_gas_regen_command(packer, bus, throttle, idx, enabled, at_full_stop):
+ values = {
+ "GasRegenCmdActive": enabled,
+ "RollingCounter": idx,
+ "GasRegenCmd": throttle,
+ "GasRegenFullStopActive": at_full_stop,
+ "GasRegenAccType": 1,
+ }
+
+ dat = packer.make_can_msg("ASCMGasRegenCmd", bus, values)[1]
+ values["GasRegenChecksum"] = ((1 - enabled) << 24) | \
+ (((0xff - dat[1]) & 0xff) << 16) | \
+ (((0xff - dat[2]) & 0xff) << 8) | \
+ ((0x100 - dat[3] - idx) & 0xff)
+
+ return packer.make_can_msg("ASCMGasRegenCmd", bus, values)
+
+
+def create_friction_brake_command(packer, bus, apply_brake, idx, enabled, near_stop, at_full_stop, CP):
+ mode = 0x1
+
+ # TODO: Understand this better. Volts and ICE Camera ACC cars are 0x1 when enabled with no brake
+ if enabled and CP.carFingerprint in (CAR.CHEVROLET_BOLT_EUV,):
+ mode = 0x9
+
+ if apply_brake > 0:
+ mode = 0xa
+ if at_full_stop:
+ mode = 0xd
+
+ # TODO: this is to have GM bringing the car to complete stop,
+ # but currently it conflicts with OP controls, so turned off. Not set by all cars
+ #elif near_stop:
+ # mode = 0xb
+
+ brake = (0x1000 - apply_brake) & 0xfff
+ checksum = (0x10000 - (mode << 12) - brake - idx) & 0xffff
+
+ values = {
+ "RollingCounter": idx,
+ "FrictionBrakeMode": mode,
+ "FrictionBrakeChecksum": checksum,
+ "FrictionBrakeCmd": -apply_brake
+ }
+
+ return packer.make_can_msg("EBCMFrictionBrakeCmd", bus, values)
+
+
+def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, hud_control, fcw):
+ target_speed = min(target_speed_kph, 255)
+
+ values = {
+ "ACCAlwaysOne": 1,
+ "ACCResumeButton": 0,
+ "ACCSpeedSetpoint": target_speed,
+ "ACCGapLevel": hud_control.leadDistanceBars * enabled, # 3 "far", 0 "inactive"
+ "ACCCmdActive": enabled,
+ "ACCAlwaysOne2": 1,
+ "ACCLeadCar": hud_control.leadVisible,
+ "FCWAlert": 0x3 if fcw else 0
+ }
+
+ return packer.make_can_msg("ASCMActiveCruiseControlStatus", bus, values)
+
+
+def create_adas_time_status(bus, tt, idx):
+ dat = [(tt >> 20) & 0xff, (tt >> 12) & 0xff, (tt >> 4) & 0xff,
+ ((tt & 0xf) << 4) + (idx << 2)]
+ chksum = 0x1000 - dat[0] - dat[1] - dat[2] - dat[3]
+ chksum = chksum & 0xfff
+ dat += [0x40 + (chksum >> 8), chksum & 0xff, 0x12]
+ return CanData(0xa1, bytes(dat), bus)
+
+
+def create_adas_steering_status(bus, idx):
+ dat = [idx << 6, 0xf0, 0x20, 0, 0, 0]
+ chksum = 0x60 + sum(dat)
+ dat += [chksum >> 8, chksum & 0xff]
+ return CanData(0x306, bytes(dat), bus)
+
+
+def create_adas_accelerometer_speed_status(bus, speed_ms, idx):
+ spd = int(speed_ms * 16) & 0xfff
+ accel = 0 & 0xfff
+ # 0 if in park/neutral, 0x10 if in reverse, 0x08 for D/L
+ #stick = 0x08
+ near_range_cutoff = 0x27
+ near_range_mode = 1 if spd <= near_range_cutoff else 0
+ far_range_mode = 1 - near_range_mode
+ dat = [0x08, spd >> 4, ((spd & 0xf) << 4) | (accel >> 8), accel & 0xff, 0]
+ chksum = 0x62 + far_range_mode + (idx << 2) + dat[0] + dat[1] + dat[2] + dat[3] + dat[4]
+ dat += [(idx << 5) + (far_range_mode << 4) + (near_range_mode << 3) + (chksum >> 8), chksum & 0xff]
+ return CanData(0x308, bytes(dat), bus)
+
+
+def create_adas_headlights_status(packer, bus):
+ values = {
+ "Always42": 0x42,
+ "Always4": 0x4,
+ }
+ return packer.make_can_msg("ASCMHeadlight", bus, values)
+
+
+def create_lka_icon_command(bus, active, critical, steer):
+ if active and steer == 1:
+ if critical:
+ dat = b"\x50\xc0\x14"
+ else:
+ dat = b"\x50\x40\x18"
+ elif active:
+ if critical:
+ dat = b"\x40\xc0\x14"
+ else:
+ dat = b"\x40\x40\x18"
+ else:
+ dat = b"\x00\x00\x00"
+ return CanData(0x104c006c, dat, bus)
diff --git a/iqdbc_repo/iqdbc/car/gm/interface.py b/iqdbc_repo/iqdbc/car/gm/interface.py
new file mode 100755
index 000000000..238a9923a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/interface.py
@@ -0,0 +1,265 @@
+#!/usr/bin/env python3
+from math import fabs, exp
+import numpy as np
+
+from iqdbc.car import get_safety_config, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.gm.carcontroller import CarController
+from iqdbc.car.gm.carstate import CarState
+from iqdbc.car.gm.radar_interface import RadarInterface, RADAR_HEADER_MSG, CAMERA_DATA_HEADER_MSG
+from iqdbc.car.gm.values import CAR, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, SDGM_CAR, ALT_ACCS, CanBus, GMSafetyFlags
+from iqdbc.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, LateralAccelFromTorqueCallbackType
+
+from iqdbc.lvbs.car.gm.iq_interface import IQCarInterface
+from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ, GMSafetyFlagsIQ
+
+TransmissionType = structs.CarParams.TransmissionType
+NetworkLocation = structs.CarParams.NetworkLocation
+
+# Bolt Non-ACC uses the 4th (d) tune parameter; stock tunes zero it out.
+NON_LINEAR_TORQUE_PARAMS_IQ = {
+ CAR.CHEVROLET_BOLT_NON_ACC: [2.24, 1.1, 0.28, -0.07],
+ CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN: [1.8, 1.1, 0.3, -0.045],
+}
+
+NON_LINEAR_TORQUE_PARAMS = {
+ CAR.CHEVROLET_BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178],
+ CAR.GMC_ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772],
+ CAR.CHEVROLET_SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122],
+ **NON_LINEAR_TORQUE_PARAMS_IQ,
+}
+
+
+class CarInterface(CarInterfaceBase, IQCarInterface):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.sport, structs.CarState.GearShifter.low,
+ structs.CarState.GearShifter.eco, structs.CarState.GearShifter.manumatic)
+
+ def __init__(self, CP, CP_IQ):
+ CarInterfaceBase.__init__(self, CP, CP_IQ)
+ IQCarInterface.__init__(self, CP, CarInterfaceBase)
+
+ @staticmethod
+ def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed):
+ return CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX
+
+ # Determined by iteratively plotting and minimizing error for f(angle, speed) = steer.
+ @staticmethod
+ def get_steer_feedforward_volt(desired_angle, v_ego):
+ desired_angle *= 0.02904609
+ sigmoid = desired_angle / (1 + fabs(desired_angle))
+ return 0.10006696 * sigmoid * (v_ego + 3.12485927)
+
+ def get_steer_feedforward_function(self):
+ if self.CP.carFingerprint == CAR.CHEVROLET_VOLT:
+ return self.get_steer_feedforward_volt
+ else:
+ return CarInterfaceBase.get_steer_feedforward_default
+
+ def get_lataccel_torque_siglin(self) -> tuple[list[float], np.ndarray]:
+
+ def torque_from_lateral_accel_siglin_func(lateral_acceleration: float) -> float:
+ # The "lat_accel vs torque" relationship is assumed to be the sum of "sigmoid + linear" curves
+ # An important thing to consider is that the slope at 0 should be > 0 (ideally >1)
+ # This has big effect on the stability about 0 (noise when going straight)
+ non_linear_torque_params = NON_LINEAR_TORQUE_PARAMS.get(self.CP.carFingerprint)
+ assert non_linear_torque_params, "The params are not defined"
+ a, b, c, d = non_linear_torque_params
+ d = d if NON_LINEAR_TORQUE_PARAMS_IQ.get(self.CP.carFingerprint) else 0.0
+ sig_input = a * lateral_acceleration
+ sig = np.sign(sig_input) * (1 / (1 + exp(-fabs(sig_input))) - 0.5)
+ steer_torque = (sig * b) + (lateral_acceleration * c) + d
+ return float(steer_torque)
+
+ lataccel_values = np.arange(-5.0, 5.0, 0.01)
+ torque_values = [torque_from_lateral_accel_siglin_func(x) for x in lataccel_values]
+ assert min(torque_values) < -1 and max(torque_values) > 1, "The torque values should cover the range [-1, 1]"
+ return torque_values, lataccel_values
+
+ def torque_from_lateral_accel(self) -> TorqueFromLateralAccelCallbackType:
+ if self.CP.carFingerprint in NON_LINEAR_TORQUE_PARAMS:
+ torque_values, lataccel_values = self.get_lataccel_torque_siglin()
+
+ def torque_from_lateral_accel_siglin(lateral_acceleration: float, torque_params: structs.CarParams.LateralTorqueTuning):
+ return np.interp(lateral_acceleration, lataccel_values, torque_values)
+ return torque_from_lateral_accel_siglin
+ else:
+ return self.torque_from_lateral_accel_linear
+
+ def lateral_accel_from_torque(self) -> LateralAccelFromTorqueCallbackType:
+ if self.CP.carFingerprint in NON_LINEAR_TORQUE_PARAMS:
+ torque_values, lataccel_values = self.get_lataccel_torque_siglin()
+
+ def lateral_accel_from_torque_siglin(torque: float, torque_params: structs.CarParams.LateralTorqueTuning):
+ return np.interp(torque, torque_values, lataccel_values)
+ return lateral_accel_from_torque_siglin
+ else:
+ return self.lateral_accel_from_torque_linear
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "gm"
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.gm)]
+ ret.autoResumeSng = False
+ ret.enableBsm = 0x142 in fingerprint[CanBus.POWERTRAIN]
+
+ if candidate in EV_CAR:
+ ret.transmissionType = TransmissionType.direct
+ ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.EV.value
+ else:
+ ret.transmissionType = TransmissionType.automatic
+
+ ret.longitudinalTuning.kiBP = [5., 35.]
+
+ if candidate in (CAMERA_ACC_CAR | SDGM_CAR):
+ ret.alphaLongitudinalAvailable = candidate not in SDGM_CAR
+ ret.networkLocation = NetworkLocation.fwdCamera
+ ret.radarUnavailable = True # no radar
+ ret.pcmCruise = True
+ ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM.value
+ ret.minEnableSpeed = -1 if candidate in SDGM_CAR else 5 * CV.KPH_TO_MS
+ ret.minSteerSpeed = 10 * CV.KPH_TO_MS
+
+ # Tuning for experimental long
+ ret.longitudinalTuning.kiV = [2.0, 1.5]
+
+ if alpha_long:
+ ret.pcmCruise = False
+ ret.openpilotLongitudinalControl = True
+ ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM_LONG.value
+
+ if candidate in ALT_ACCS:
+ ret.alphaLongitudinalAvailable = False
+ ret.openpilotLongitudinalControl = False
+ ret.minEnableSpeed = -1. # engage speed is decided by PCM
+
+ else: # ASCM, OBD-II harness
+ ret.openpilotLongitudinalControl = True
+ ret.networkLocation = NetworkLocation.gateway
+ # LRR messages can take up to a few seconds to start sending after ignition, check camera data as well which starts earlier
+ ret.radarUnavailable = RADAR_HEADER_MSG not in fingerprint[CanBus.OBSTACLE] and CAMERA_DATA_HEADER_MSG not in fingerprint[CanBus.OBSTACLE] and not docs
+ ret.pcmCruise = False # stock non-adaptive cruise control is kept off
+ # supports stop and go, but initial engage must (conservatively) be above 18mph
+ ret.minEnableSpeed = 18 * CV.MPH_TO_MS
+ ret.minSteerSpeed = 7 * CV.MPH_TO_MS
+
+ # Tuning
+ ret.longitudinalTuning.kiV = [2.4, 1.5]
+
+ # These cars have been put into dashcam only due to both a lack of users and test coverage.
+ # These cars likely still work fine. Once a user confirms each car works and a test route is
+ # added to iqdbc/car/tests/routes.py, we can remove it from this list.
+ ret.dashcamOnly = candidate in {CAR.CADILLAC_ATS, CAR.HOLDEN_ASTRA, CAR.CHEVROLET_MALIBU, CAR.BUICK_REGAL} or \
+ (ret.networkLocation == NetworkLocation.gateway and ret.radarUnavailable)
+
+ # Start with a baseline tuning for all GM vehicles. Override tuning as needed in each model section below.
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.00]]
+ ret.lateralTuning.pid.kf = 0.00004 # full torque for 20 deg at 80mph means 0.00007818594
+ ret.steerActuatorDelay = 0.1 # Default delay, not measured yet
+
+ ret.steerLimitTimer = 0.4
+ ret.longitudinalActuatorDelay = 0.5 # large delay to initially start braking
+
+ if candidate == CAR.CHEVROLET_VOLT:
+ ret.lateralTuning.pid.kpBP = [0., 40.]
+ ret.lateralTuning.pid.kpV = [0., 0.17]
+ ret.lateralTuning.pid.kiBP = [0.]
+ ret.lateralTuning.pid.kiV = [0.]
+ ret.lateralTuning.pid.kf = 1. # get_steer_feedforward_volt()
+ ret.steerActuatorDelay = 0.2
+
+ elif candidate == CAR.GMC_ACADIA:
+ ret.minEnableSpeed = -1. # engage speed is decided by pcm
+ ret.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.BUICK_LACROSSE:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CADILLAC_ESCALADE:
+ ret.minEnableSpeed = -1. # engage speed is decided by pcm
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate in (CAR.CADILLAC_ESCALADE_ESV, CAR.CADILLAC_ESCALADE_ESV_2019):
+ ret.minEnableSpeed = -1. # engage speed is decided by pcm
+
+ if candidate == CAR.CADILLAC_ESCALADE_ESV:
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[10., 41.0], [10., 41.0]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.13, 0.24], [0.01, 0.02]]
+ ret.lateralTuning.pid.kf = 0.000045
+ else:
+ ret.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CHEVROLET_BOLT_EUV:
+ ret.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CHEVROLET_SILVERADO:
+ # On the Bolt, the ECM and camera independently check that you are either above 5 kph or at a stop
+ # with foot on brake to allow engagement, but this platform only has that check in the camera.
+ # TODO: check if this is split by EV/ICE with more platforms in the future
+ if ret.openpilotLongitudinalControl:
+ ret.minEnableSpeed = -1.
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CHEVROLET_EQUINOX:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CHEVROLET_TRAILBLAZER:
+ ret.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CADILLAC_XT4:
+ ret.steerActuatorDelay = 0.2
+ ret.minSteerSpeed = 30 * CV.MPH_TO_MS
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CHEVROLET_VOLT_2019:
+ ret.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.CHEVROLET_TRAVERSE:
+ ret.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.GMC_YUKON:
+ ret.steerActuatorDelay = 0.5
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+ ret.dashcamOnly = True # Needs steerRatio, tireStiffness, and lat accel factor tuning
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ if candidate in (CAR.CHEVROLET_MALIBU_NON_ACC_9TH_GEN, CAR.CHEVROLET_BOLT_NON_ACC, CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN,
+ CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN, CAR.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN):
+ stock_cp.steerActuatorDelay = 0.2
+ CarInterfaceBase.configure_torque_tune(candidate, stock_cp.lateralTuning)
+ elif candidate in (CAR.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN, ):
+ CarInterfaceBase.configure_torque_tune(candidate, stock_cp.lateralTuning)
+
+ # Non-ACC cars steer/long via the forward camera and pcmCruise, not the ASCM.
+ if ret.flags & GMFlagsIQ.NON_ACC:
+ stock_cp.dashcamOnly = False
+ stock_cp.alphaLongitudinalAvailable = False
+ stock_cp.networkLocation = NetworkLocation.fwdCamera
+ stock_cp.openpilotLongitudinalControl = False
+ stock_cp.pcmCruise = True
+ stock_cp.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM.value
+ ret.iqSafetyFlags |= GMSafetyFlagsIQ.NON_ACC
+ stock_cp.minEnableSpeed = 24 * CV.MPH_TO_MS
+ stock_cp.minSteerSpeed = 3.0
+
+ # Untested Non-ACC platforms ship dashcam-only pending user validation.
+ if candidate in (CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN, CAR.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN,
+ CAR.CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN, CAR.CADILLAC_CT6_NON_ACC_1ST_GEN,
+ CAR.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN, CAR.CADILLAC_XT5_NON_ACC_1ST_GEN):
+ stock_cp.dashcamOnly = True
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/gm/radar_interface.py b/iqdbc_repo/iqdbc/car/gm/radar_interface.py
new file mode 100755
index 000000000..b030dbe44
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/radar_interface.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+import math
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.gm.values import DBC, CanBus
+from iqdbc.car.interfaces import RadarInterfaceBase
+
+RADAR_HEADER_MSG = 1120 # F_LRR_Obj_Header
+CAMERA_DATA_HEADER_MSG = 1056 # F_Vision_Obj_Header
+SLOT_1_MSG = RADAR_HEADER_MSG + 1
+NUM_SLOTS = 20
+
+# Actually it's 0x47f, but can parser only reports
+# messages that are present in DBC
+LAST_RADAR_MSG = RADAR_HEADER_MSG + NUM_SLOTS
+
+
+def create_radar_can_parser(car_fingerprint):
+ # C1A-ARS3-A by Continental
+ radar_targets = list(range(SLOT_1_MSG, SLOT_1_MSG + NUM_SLOTS))
+ signals = list(zip(['FLRRNumValidTargets',
+ 'FLRRSnsrBlckd', 'FLRRYawRtPlsblityFlt',
+ 'FLRRHWFltPrsntInt', 'FLRRAntTngFltPrsnt',
+ 'FLRRAlgnFltPrsnt', 'FLRRSnstvFltPrsntInt'] +
+ ['TrkRange'] * NUM_SLOTS + ['TrkRangeRate'] * NUM_SLOTS +
+ ['TrkRangeAccel'] * NUM_SLOTS + ['TrkAzimuth'] * NUM_SLOTS +
+ ['TrkWidth'] * NUM_SLOTS + ['TrkObjectID'] * NUM_SLOTS,
+ [RADAR_HEADER_MSG] * 7 + radar_targets * 6, strict=True))
+
+ messages = list({(s[1], 14) for s in signals})
+
+ return CANParser(DBC[car_fingerprint][Bus.radar], messages, CanBus.OBSTACLE)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+
+ self.rcp = None if CP.radarUnavailable else create_radar_can_parser(CP.carFingerprint)
+
+ self.trigger_msg = LAST_RADAR_MSG
+ self.updated_messages = set()
+
+ def update(self, can_strings):
+ if self.rcp is None:
+ return super().update(None)
+
+ vls = self.rcp.update(can_strings)
+ self.updated_messages.update(vls)
+
+ if self.trigger_msg not in self.updated_messages:
+ return None
+
+ ret = structs.RadarData()
+ header = self.rcp.vl[RADAR_HEADER_MSG]
+ fault = header['FLRRSnsrBlckd'] or header['FLRRSnstvFltPrsntInt'] or \
+ header['FLRRYawRtPlsblityFlt'] or header['FLRRHWFltPrsntInt'] or \
+ header['FLRRAntTngFltPrsnt'] or header['FLRRAlgnFltPrsnt']
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+ if fault:
+ ret.errors.radarFault = True
+
+ currentTargets = set()
+ num_targets = header['FLRRNumValidTargets']
+
+ # Not all radar messages describe targets,
+ # no need to monitor all of the self.rcp.msgs_upd
+ for ii in self.updated_messages:
+ if ii == RADAR_HEADER_MSG:
+ continue
+
+ if num_targets == 0:
+ break
+
+ cpt = self.rcp.vl[ii]
+ # Zero distance means it's an empty target slot
+ if cpt['TrkRange'] > 0.0:
+ targetId = cpt['TrkObjectID']
+ currentTargets.add(targetId)
+ if targetId not in self.pts:
+ self.pts[targetId] = structs.RadarData.RadarPoint()
+ self.pts[targetId].trackId = targetId
+ distance = cpt['TrkRange']
+ self.pts[targetId].dRel = distance # from front of car
+ # From driver's pov, left is positive
+ self.pts[targetId].yRel = math.sin(cpt['TrkAzimuth'] * CV.DEG_TO_RAD) * distance
+ self.pts[targetId].vRel = cpt['TrkRangeRate']
+ self.pts[targetId].aRel = float('nan')
+ self.pts[targetId].yvRel = float('nan')
+
+ for oldTarget in list(self.pts.keys()):
+ if oldTarget not in currentTargets:
+ del self.pts[oldTarget]
+
+ ret.points = list(self.pts.values())
+ self.updated_messages.clear()
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/gm/tests/__init__.py b/iqdbc_repo/iqdbc/car/gm/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/gm/tests/test_gm.py b/iqdbc_repo/iqdbc/car/gm/tests/test_gm.py
new file mode 100644
index 000000000..41510ff35
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/tests/test_gm.py
@@ -0,0 +1,20 @@
+from parameterized import parameterized
+
+from iqdbc.car.gm.fingerprints import FINGERPRINTS
+from iqdbc.car.gm.values import CAMERA_ACC_CAR, GM_RX_OFFSET
+
+CAMERA_DIAGNOSTIC_ADDRESS = 0x24b
+
+
+class TestGMFingerprint:
+ @parameterized.expand(FINGERPRINTS.items())
+ def test_can_fingerprints(self, car_model, fingerprints):
+ assert len(fingerprints) > 0
+
+ assert all(len(finger) for finger in fingerprints)
+
+ # The camera can sometimes be communicating on startup
+ if car_model in CAMERA_ACC_CAR:
+ for finger in fingerprints:
+ for required_addr in (CAMERA_DIAGNOSTIC_ADDRESS, CAMERA_DIAGNOSTIC_ADDRESS + GM_RX_OFFSET):
+ assert finger.get(required_addr) == 8, required_addr
diff --git a/iqdbc_repo/iqdbc/car/gm/values.py b/iqdbc_repo/iqdbc/car/gm/values.py
new file mode 100644
index 000000000..62c06118f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/gm/values.py
@@ -0,0 +1,343 @@
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, PlatformConfig, DbcDict, Platforms, CarSpecs
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType
+from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
+
+Ecu = CarParams.Ecu
+
+
+class CarControllerParams:
+ STEER_MAX = 300 # GM limit is 3Nm. Used by carcontroller to generate LKA output
+ STEER_STEP = 3 # Active control frames per command (~33hz)
+ INACTIVE_STEER_STEP = 10 # Inactive control frames per command (10hz)
+ STEER_DELTA_UP = 10 # Delta rates require review due to observed EPS weakness
+ STEER_DELTA_DOWN = 15
+ STEER_DRIVER_ALLOWANCE = 65
+ STEER_DRIVER_MULTIPLIER = 4
+ STEER_DRIVER_FACTOR = 100
+ NEAR_STOP_BRAKE_PHASE = 0.5 # m/s
+
+ # Heartbeat for dash "Service Adaptive Cruise" and "Service Front Camera"
+ ADAS_KEEPALIVE_STEP = 100
+ CAMERA_KEEPALIVE_STEP = 100
+
+ # Allow small margin below -3.5 m/s^2 from ISO 15622:2018 since we
+ # perform the closed loop control, and might need some
+ # to apply some more braking if we're on a downhill slope.
+ # Our controller should still keep the 2 second average above
+ # -3.5 m/s^2 as per planner limits
+ ACCEL_MAX = 2. # m/s^2
+ ACCEL_MIN = -4. # m/s^2
+
+ def __init__(self, CP):
+ # Gas/brake lookups
+ self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen
+
+ if CP.carFingerprint in (CAMERA_ACC_CAR | SDGM_CAR):
+ self.MAX_GAS = 1346.0
+ self.MAX_ACC_REGEN = -540.0
+ self.INACTIVE_REGEN = -500.0
+ # Camera ACC vehicles have no regen while enabled.
+ # Camera transitions to MAX_ACC_REGEN from zero gas and uses friction brakes instantly
+ max_regen_acceleration = 0.
+
+ else:
+ self.MAX_GAS = 1018.0 # Safety limit, not ACC max. Stock ACC >2042 from standstill.
+ self.MAX_ACC_REGEN = -650.0 # Max ACC regen is slightly less than max paddle regen
+ self.INACTIVE_REGEN = -650.0
+ # ICE has much less engine braking force compared to regen in EVs,
+ # lower threshold removes some braking deadzone
+ max_regen_acceleration = -1. if CP.carFingerprint in EV_CAR else -0.1
+
+ self.GAS_LOOKUP_BP = [max_regen_acceleration, 0., self.ACCEL_MAX]
+ self.GAS_LOOKUP_V = [self.MAX_ACC_REGEN, 0., self.MAX_GAS]
+
+ self.BRAKE_LOOKUP_BP = [self.ACCEL_MIN, max_regen_acceleration]
+ self.BRAKE_LOOKUP_V = [self.MAX_BRAKE, 0.]
+
+
+class GMSafetyFlags(IntFlag):
+ HW_CAM = 1
+ HW_CAM_LONG = 2
+ EV = 4
+
+
+class Footnote(Enum):
+ SETUP = CarFootnote(
+ "See more setup details for GM .",
+ Column.MAKE, setup_note=True)
+
+
+@dataclass
+class GMCarDocs(CarDocs):
+ package: str = "Adaptive Cruise Control (ACC)"
+
+ def init_make(self, CP: CarParams):
+ if CP.networkLocation == CarParams.NetworkLocation.fwdCamera:
+ if CP.carFingerprint in SDGM_CAR:
+ self.car_parts = CarParts.common([CarHarness.gmsdgm])
+ else:
+ self.car_parts = CarParts.common([CarHarness.gm])
+ else:
+ self.footnotes.insert(0, Footnote.SETUP)
+ self.car_parts = CarParts.common([CarHarness.obd_ii])
+
+
+@dataclass(frozen=True, kw_only=True)
+class GMCarSpecs(CarSpecs):
+ tireStiffnessFactor: float = 0.444 # not optimized yet
+
+
+@dataclass
+class GMPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {
+ Bus.pt: 'gm_global_a_powertrain_generated',
+ Bus.radar: 'gm_global_a_object',
+ Bus.chassis: 'gm_global_a_chassis',
+ })
+
+
+@dataclass
+class GMASCMPlatformConfig(GMPlatformConfig):
+ def init(self):
+ # ASCM is supported, but due to a janky install and hardware configuration, we are not showing in the car docs
+ self.car_docs = []
+
+
+@dataclass
+class GMSDGMPlatformConfig(GMPlatformConfig):
+ def init(self):
+ # Don't show in docs until the harness is sold. See https://github.com/commaai/openpilot/issues/32471
+ self.car_docs = []
+
+
+@dataclass
+class GMNonAccCarDocs(GMCarDocs):
+ package: str = "No Adaptive Cruise Control (Non-ACC)"
+ support_type: SupportType = SupportType.COMMUNITY
+ support_link: str = "community"
+
+
+@dataclass
+class GMNonSccPlatformConfig(GMPlatformConfig):
+ def init(self):
+ self.iq_flags |= GMFlagsIQ.NON_ACC
+
+
+class CAR(Platforms):
+ HOLDEN_ASTRA = GMASCMPlatformConfig(
+ [GMCarDocs("Holden Astra 2017")],
+ GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4),
+ )
+ CHEVROLET_VOLT = GMASCMPlatformConfig(
+ [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video="https://youtu.be/QeMCN_4TFfQ")],
+ GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469),
+ )
+ CADILLAC_ATS = GMASCMPlatformConfig(
+ [GMCarDocs("Cadillac ATS Premium Performance 2018")],
+ GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3),
+ )
+ CHEVROLET_MALIBU = GMASCMPlatformConfig(
+ [GMCarDocs("Chevrolet Malibu Premier 2017")],
+ GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4),
+ )
+ GMC_ACADIA = GMASCMPlatformConfig(
+ [GMCarDocs("GMC Acadia 2018", video="https://www.youtube.com/watch?v=0ZN6DdsBUZo")],
+ GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4),
+ )
+ BUICK_LACROSSE = GMASCMPlatformConfig(
+ [GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")],
+ GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4),
+ )
+ BUICK_REGAL = GMASCMPlatformConfig(
+ [GMCarDocs("Buick Regal Essence 2018")],
+ GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4),
+ )
+ CADILLAC_ESCALADE = GMASCMPlatformConfig(
+ [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")],
+ GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3),
+ )
+ CADILLAC_ESCALADE_ESV = GMASCMPlatformConfig(
+ [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")],
+ GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0),
+ )
+ CADILLAC_ESCALADE_ESV_2019 = GMASCMPlatformConfig(
+ [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")],
+ CADILLAC_ESCALADE_ESV.specs,
+ )
+ CHEVROLET_BOLT_EUV = GMPlatformConfig(
+ [
+ GMCarDocs("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim, without Super Cruise Package", video="https://youtu.be/xvwzGMUA210"),
+ GMCarDocs("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"),
+ ],
+ GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0),
+ )
+ CHEVROLET_SILVERADO = GMPlatformConfig(
+ [
+ GMCarDocs("Chevrolet Silverado 1500 2020-21", "Safety Package II"),
+ GMCarDocs("GMC Sierra 1500 2020-21", "Driver Alert Package II", video="https://youtu.be/5HbNoBLzRwE"),
+ ],
+ GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0),
+ )
+ CHEVROLET_EQUINOX = GMPlatformConfig(
+ [GMCarDocs("Chevrolet Equinox 2019-22")],
+ GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4),
+ )
+ CHEVROLET_TRAILBLAZER = GMPlatformConfig(
+ [GMCarDocs("Chevrolet Trailblazer 2021-22")],
+ GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0),
+ )
+ CADILLAC_XT4 = GMSDGMPlatformConfig(
+ [GMCarDocs("Cadillac XT4 2023", "Driver Assist Package")],
+ GMCarSpecs(mass=1660, wheelbase=2.78, steerRatio=14.4, centerToFrontRatio=0.4),
+ )
+ CHEVROLET_VOLT_2019 = GMSDGMPlatformConfig(
+ [GMCarDocs("Chevrolet Volt 2019", "Adaptive Cruise Control (ACC) & LKAS")],
+ GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=15.7, centerToFrontRatio=0.45),
+ )
+ CHEVROLET_TRAVERSE = GMSDGMPlatformConfig(
+ [GMCarDocs("Chevrolet Traverse 2022-23", "RS, Premier, or High Country Trim")],
+ GMCarSpecs(mass=1955, wheelbase=3.07, steerRatio=17.9, centerToFrontRatio=0.4),
+ )
+ GMC_YUKON = GMPlatformConfig(
+ [GMCarDocs("GMC Yukon 2019-20", "Adaptive Cruise Control (ACC) & LKAS")],
+ GMCarSpecs(mass=2490, wheelbase=2.94, steerRatio=17.3, centerToFrontRatio=0.5, tireStiffnessFactor=1.0),
+ )
+
+ # IQ.Pilot Non-ACC camera-harness ports (no factory adaptive cruise).
+ CHEVROLET_BOLT_NON_ACC = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Chevrolet Bolt EV Non-ACC 2017")],
+ CHEVROLET_BOLT_EUV.specs,
+ )
+ CHEVROLET_BOLT_NON_ACC_1ST_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Chevrolet Bolt EV Non-ACC 2018-21")],
+ CHEVROLET_BOLT_EUV.specs,
+ )
+ CHEVROLET_BOLT_NON_ACC_2ND_GEN = GMNonSccPlatformConfig(
+ [
+ GMNonAccCarDocs("Chevrolet Bolt EUV LT Non-ACC 2022-23"),
+ GMNonAccCarDocs("Chevrolet Bolt EV LT Non-ACC 2022-23"),
+ ],
+ CHEVROLET_BOLT_EUV.specs,
+ )
+ CHEVROLET_EQUINOX_NON_ACC_3RD_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Chevrolet Equinox Non-ACC 2019-22")],
+ CHEVROLET_EQUINOX.specs,
+ )
+ CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Chevrolet Suburban Non-ACC 2016-20")],
+ CarSpecs(mass=2731, wheelbase=3.302, steerRatio=17.3, centerToFrontRatio=0.49),
+ )
+ CADILLAC_CT6_NON_ACC_1ST_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Cadillac CT6 Non-ACC 2017-18")],
+ CarSpecs(mass=2358, wheelbase=3.11, steerRatio=17.7, centerToFrontRatio=0.4),
+ )
+ CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Chevrolet Trailblazer Non-ACC 2021-22")],
+ CHEVROLET_TRAILBLAZER.specs,
+ )
+ CHEVROLET_MALIBU_NON_ACC_9TH_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Chevrolet Malibu Non-ACC 2016-23")],
+ CarSpecs(mass=1450, wheelbase=2.8, steerRatio=15.8, centerToFrontRatio=0.4),
+ )
+ CADILLAC_XT5_NON_ACC_1ST_GEN = GMNonSccPlatformConfig(
+ [GMNonAccCarDocs("Cadillac XT5 Non-ACC 2018")],
+ CarSpecs(mass=1810, wheelbase=2.86, steerRatio=16.34, centerToFrontRatio=0.5),
+ )
+
+
+class CruiseButtons:
+ INIT = 0
+ UNPRESS = 1
+ RES_ACCEL = 2
+ DECEL_SET = 3
+ MAIN = 5
+ CANCEL = 6
+
+
+class AccState:
+ OFF = 0
+ ACTIVE = 1
+ FAULTED = 3
+ STANDSTILL = 4
+
+
+class CanBus:
+ POWERTRAIN = 0
+ OBSTACLE = 1
+ CAMERA = 2
+ CHASSIS = 2
+ LOOPBACK = 128
+ DROPPED = 192
+
+
+# In a Data Module, an identifier is a string used to recognize an object,
+# either by itself or together with the identifiers of parent objects.
+# Each returns a 4 byte hex representation of the decimal part number. `b"\x02\x8c\xf0'"` -> 42790951
+GM_BOOT_SOFTWARE_PART_NUMER_REQUEST = b'\x1a\xc0' # likely does not contain anything useful
+GM_SOFTWARE_MODULE_1_REQUEST = b'\x1a\xc1'
+GM_SOFTWARE_MODULE_2_REQUEST = b'\x1a\xc2'
+GM_SOFTWARE_MODULE_3_REQUEST = b'\x1a\xc3'
+
+# Part number of XML data file that is used to configure ECU
+GM_XML_DATA_FILE_PART_NUMBER = b'\x1a\x9c'
+GM_XML_CONFIG_COMPAT_ID = b'\x1a\x9b' # used to know if XML file is compatible with the ECU software/hardware
+
+# This DID is for identifying the part number that reflects the mix of hardware,
+# software, and calibrations in the ECU when it first arrives at the vehicle assembly plant.
+# If there's an Alpha Code, it's associated with this part number and stored in the DID $DB.
+GM_END_MODEL_PART_NUMBER_REQUEST = b'\x1a\xcb'
+GM_END_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST = b'\x1a\xdb'
+GM_BASE_MODEL_PART_NUMBER_REQUEST = b'\x1a\xcc'
+GM_BASE_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST = b'\x1a\xdc'
+GM_FW_RESPONSE = b'\x5a'
+
+GM_FW_REQUESTS = [
+ GM_BOOT_SOFTWARE_PART_NUMER_REQUEST,
+ GM_SOFTWARE_MODULE_1_REQUEST,
+ GM_SOFTWARE_MODULE_2_REQUEST,
+ GM_SOFTWARE_MODULE_3_REQUEST,
+ GM_XML_DATA_FILE_PART_NUMBER,
+ GM_XML_CONFIG_COMPAT_ID,
+ GM_END_MODEL_PART_NUMBER_REQUEST,
+ GM_END_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST,
+ GM_BASE_MODEL_PART_NUMBER_REQUEST,
+ GM_BASE_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST,
+]
+
+GM_RX_OFFSET = 0x400
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[request for req in GM_FW_REQUESTS for request in [
+ Request(
+ [StdQueries.SHORT_TESTER_PRESENT_REQUEST, req],
+ [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, GM_FW_RESPONSE + bytes([req[-1]])],
+ rx_offset=GM_RX_OFFSET,
+ bus=0,
+ logging=True,
+ ),
+ ]],
+ extra_ecus=[(Ecu.fwdCamera, 0x24b, None)],
+)
+
+# TODO: detect most of these sets live
+EV_CAR = {CAR.CHEVROLET_VOLT, CAR.CHEVROLET_VOLT_2019, CAR.CHEVROLET_BOLT_EUV,
+ # Non-ACC EV ports
+ CAR.CHEVROLET_BOLT_NON_ACC, CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN, CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN}
+
+# We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness)
+CAMERA_ACC_CAR = {CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_SILVERADO, CAR.CHEVROLET_EQUINOX, CAR.CHEVROLET_TRAILBLAZER, CAR.GMC_YUKON}
+
+# Alt ASCMActiveCruiseControlStatus
+ALT_ACCS = {CAR.GMC_YUKON}
+
+# We're integrated at the Safety Data Gateway Module on these cars
+SDGM_CAR = {CAR.CADILLAC_XT4, CAR.CHEVROLET_VOLT_2019, CAR.CHEVROLET_TRAVERSE}
+
+STEER_THRESHOLD = 1.0
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/honda/__init__.py b/iqdbc_repo/iqdbc/car/honda/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/honda/carcontroller.py b/iqdbc_repo/iqdbc/car/honda/carcontroller.py
new file mode 100644
index 000000000..3b6ce3739
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/carcontroller.py
@@ -0,0 +1,308 @@
+import numpy as np
+import math
+
+from iqdbc.can import CANPacker
+from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, DT_CTRL, rate_limit, make_tester_present_msg, structs
+from iqdbc.car.honda import hondacan
+from iqdbc.car.honda.values import CAR, CruiseButtons, HONDA_BOSCH, HONDA_BOSCH_CANFD, HONDA_BOSCH_RADARLESS, \
+ HONDA_BOSCH_TJA_CONTROL, HONDA_NIDEC_ALT_PCM_ACCEL, CarControllerParams
+from iqdbc.car.interfaces import CarControllerBase
+
+from iqdbc.lvbs.car.honda.aol import AolCarController
+from iqdbc.lvbs.car.honda.gas_interceptor import GasInterceptorCarController
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+LongCtrlState = structs.CarControl.Actuators.LongControlState
+
+
+def compute_gb_honda_bosch(accel, speed):
+ # TODO returns 0s, is unused
+ return 0.0, 0.0
+
+
+def compute_gb_honda_nidec(accel, speed):
+ creep_brake = 0.0
+ creep_speed = 2.3
+ creep_brake_value = 0.15
+ if speed < creep_speed:
+ creep_brake = (creep_speed - speed) / creep_speed * creep_brake_value
+ gb = float(accel) / 4.8 - creep_brake
+ return np.clip(gb, 0.0, 1.0), np.clip(-gb, 0.0, 1.0)
+
+
+def compute_gas_brake(accel, speed, fingerprint):
+ if fingerprint in HONDA_BOSCH:
+ return compute_gb_honda_bosch(accel, speed)
+ else:
+ return compute_gb_honda_nidec(accel, speed)
+
+
+# TODO not clear this does anything useful
+def actuator_hysteresis(brake, braking, brake_steady, v_ego, car_fingerprint):
+ # hyst params
+ brake_hyst_on = 0.02 # to activate brakes exceed this value
+ brake_hyst_off = 0.005 # to deactivate brakes below this value
+ brake_hyst_gap = 0.01 # don't change brake command for small oscillations within this value
+
+ # *** hysteresis logic to avoid brake blinking. go above 0.1 to trigger
+ if (brake < brake_hyst_on and not braking) or brake < brake_hyst_off:
+ brake = 0.
+ braking = brake > 0.
+
+ # for small brake oscillations within brake_hyst_gap, don't change the brake command
+ if brake == 0.:
+ brake_steady = 0.
+ elif brake > brake_steady + brake_hyst_gap:
+ brake_steady = brake - brake_hyst_gap
+ elif brake < brake_steady - brake_hyst_gap:
+ brake_steady = brake + brake_hyst_gap
+ brake = brake_steady
+
+ return brake, braking, brake_steady
+
+
+def brake_pump_hysteresis(apply_brake, apply_brake_last, last_pump_ts, ts):
+ pump_on = False
+
+ # reset pump timer if:
+ # - there is an increment in brake request
+ # - we are applying steady state brakes and we haven't been running the pump
+ # for more than 20s (to prevent pressure bleeding)
+ if apply_brake > apply_brake_last or (ts - last_pump_ts > 20. and apply_brake > 0):
+ last_pump_ts = ts
+
+ # once the pump is on, run it for at least 0.2s
+ if ts - last_pump_ts < 0.2 and apply_brake > 0:
+ pump_on = True
+
+ return pump_on, last_pump_ts
+
+
+def process_hud_alert(hud_alert):
+ alert_fcw = False
+ alert_steer_required = False
+
+ # Make sure FCW is prioritized over steering required
+ # TODO: implement separate available LDW alert
+ if hud_alert == VisualAlert.fcw:
+ alert_fcw = True
+ elif hud_alert in (VisualAlert.steerRequired, VisualAlert.ldw):
+ alert_steer_required = True
+
+ return alert_fcw, alert_steer_required
+
+
+class CarController(CarControllerBase, AolCarController, GasInterceptorCarController):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ AolCarController.__init__(self)
+ GasInterceptorCarController.__init__(self, CP, CP_IQ)
+ self.packer = CANPacker(dbc_names[Bus.pt])
+ self.params = CarControllerParams(CP)
+ self.CAN = hondacan.CanBus(CP)
+ self.tja_control = CP.carFingerprint in HONDA_BOSCH_TJA_CONTROL
+
+ self.braking = False
+ self.brake_steady = 0.
+ self.brake_last = 0.
+ self.apply_brake_last = 0
+ self.last_pump_ts = 0.
+ self.stopping_counter = 0
+
+ self.accel = 0.0
+ self.speed = 0.0
+ self.gas = 0.0
+ self.brake = 0.0
+ self.last_torque = 0.0
+
+ self.gasfactor = 1.0
+ self.gasfactor_before_maxgas = 1.0
+ self.windfactor = 1.0
+ self.windfactor_before_maxgas = 1.0
+ self.windfactor_before_brake = 0.0
+ self.pitch = 0.0
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ AolCarController.update(self, self.CP, CC, CC_IQ)
+ gas_pedal_force = 0.0
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+ hud_v_cruise = hud_control.setSpeed / CS.v_cruise_factor if hud_control.speedVisible else 255
+ pcm_cancel_cmd = CC.cruiseControl.cancel
+
+ if len(CC.orientationNED) == 3:
+ self.pitch = CC.orientationNED[1]
+ hill_brake = math.sin(self.pitch) * ACCELERATION_DUE_TO_GRAVITY
+
+ if CC.longActive:
+ accel = actuators.accel
+ gas, brake = compute_gas_brake(actuators.accel + hill_brake, CS.out.vEgo, self.CP.carFingerprint)
+ else:
+ accel = 0.0
+ 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
+
+ # *** apply brake hysteresis ***
+ pre_limit_brake, self.braking, self.brake_steady = actuator_hysteresis(brake, self.braking, self.brake_steady,
+ CS.out.vEgo, self.CP.carFingerprint)
+
+ # *** rate limit after the enable check ***
+ self.brake_last = rate_limit(pre_limit_brake, self.brake_last, -2., 3 * DT_CTRL)
+
+ # vehicle hud display, wait for one update from 10Hz 0x304 msg
+ alert_fcw, alert_steer_required = process_hud_alert(hud_control.visualAlert)
+
+ # **** 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))
+
+ # Send CAN commands
+ can_sends = []
+
+ # tester present - w/ no response (keeps radar disabled)
+ if self.CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and self.CP.openpilotLongitudinalControl:
+ if self.frame % 10 == 0:
+ can_sends.append(make_tester_present_msg(0x18DAB0F1, self.CAN.pt, suppress_response=True))
+
+ # Send steering command.
+ can_sends.append(hondacan.create_steering_control(self.packer, self.CAN, apply_torque, CC.latActive, self.tja_control))
+
+ # 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]) * self.windfactor # not in m/s2 units
+ wind_brake_ms2 = np.interp(CS.out.vEgo, [0.0, 13.4, 22.4, 31.3, 40.2], [0.000, 0.049, 0.136, 0.267, 0.441]) # in m/s2 units
+ # all of this is only relevant for HONDA NIDEC
+ max_accel = np.interp(CS.out.vEgo, self.params.NIDEC_MAX_ACCEL_BP, self.params.NIDEC_MAX_ACCEL_V)
+ # TODO this 1.44 is just to maintain previous behavior
+ pcm_speed_BP = [-wind_brake,
+ -wind_brake * (3 / 4),
+ 0.0,
+ 0.5]
+ # The Honda ODYSSEY seems to have different PCM_ACCEL
+ # msgs, is it other cars too?
+ if self.CP_IQ.enableGasInterceptor or not CC.longActive:
+ pcm_speed = 0.0
+ pcm_accel = int(0.0)
+ elif self.CP.carFingerprint in HONDA_NIDEC_ALT_PCM_ACCEL:
+ pcm_speed_V = [0.0,
+ np.clip(CS.out.vEgo - 3.0, 0.0, 100.0),
+ np.clip(CS.out.vEgo + 0.0, 0.0, 100.0),
+ np.clip(CS.out.vEgo + 5.0, 0.0, 100.0)]
+ pcm_speed = float(np.interp(gas - brake, pcm_speed_BP, pcm_speed_V))
+ pcm_accel = int(1.0 * self.params.NIDEC_GAS_MAX)
+ else:
+ pcm_speed_V = [0.0,
+ np.clip(CS.out.vEgo - 2.0, 0.0, 100.0),
+ np.clip(CS.out.vEgo + 2.0, 0.0, 100.0),
+ np.clip(CS.out.vEgo + 5.0, 0.0, 100.0)]
+ pcm_speed = float(np.interp(gas - brake, pcm_speed_BP, pcm_speed_V))
+ pcm_accel = int(np.clip((accel / 1.44) / max_accel, 0.0, 1.0) * self.params.NIDEC_GAS_MAX)
+
+ if not self.CP.openpilotLongitudinalControl:
+ if self.frame % 2 == 0 and self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD:
+ can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, self.CAN))
+ # If using stock ACC, spam cancel command to kill gas when OP disengages.
+ if pcm_cancel_cmd:
+ can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CruiseButtons.CANCEL, self.CP.carFingerprint))
+ elif CC.cruiseControl.resume:
+ can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CruiseButtons.RES_ACCEL, self.CP.carFingerprint))
+
+ else:
+ # Send gas and brake commands.
+ if self.frame % 2 == 0:
+ ts = self.frame * DT_CTRL
+
+ if self.CP.carFingerprint in HONDA_BOSCH:
+ self.accel = float(np.clip(accel, self.params.BOSCH_ACCEL_MIN, self.params.BOSCH_ACCEL_MAX))
+ gas_pedal_force = self.accel + wind_brake_ms2 * self.windfactor + hill_brake
+
+ # Live-learn gas pedal adjustments when openpilot is controlling gas.
+ if (actuators.longControlState == LongCtrlState.pid) and (not CS.out.gasPressed):
+ gas_error = self.accel - CS.out.aEgo
+ if gas_error != 0.0 and gas_pedal_force > 0.0:
+ learn_speed = 150 if (self.CP.carFingerprint == CAR.HONDA_INSIGHT) else 50
+ self.gasfactor = np.clip(self.gasfactor + gas_error / learn_speed * gas_pedal_force, 0.1, 3.0)
+ if gas_error != 0.0 and (not CS.out.brakePressed) and (CS.out.vEgo > 0.0):
+ wind_adjust = 1 + wind_brake_ms2 / 1000
+ self.windfactor = np.clip(self.windfactor * (wind_adjust if (gas_error > 0) else 1.0 / wind_adjust), 0.1, 3.0)
+ if gas_pedal_force <= 0.0:
+ self.windfactor = max(self.windfactor, self.windfactor_before_brake)
+ else:
+ self.windfactor_before_brake = self.windfactor
+ if gas_pedal_force >= self.params.BOSCH_ACCEL_MAX:
+ self.gasfactor = min(self.gasfactor, self.gasfactor_before_maxgas)
+ self.windfactor = min(self.windfactor, self.windfactor_before_maxgas)
+ else:
+ self.gasfactor_before_maxgas = self.gasfactor
+ self.windfactor_before_maxgas = self.windfactor
+ self.gas = float(np.interp(gas_pedal_force * self.gasfactor, 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
+ can_sends.extend(hondacan.create_acc_commands(self.packer, self.CAN, CC.enabled, CC.longActive, self.accel, self.gas,
+ self.stopping_counter, self.CP.carFingerprint, gas_pedal_force))
+ else:
+ apply_brake = np.clip(self.brake_last - wind_brake, 0.0, 1.0)
+ apply_brake = int(np.clip(apply_brake * self.params.NIDEC_BRAKE_MAX, 0, self.params.NIDEC_BRAKE_MAX - 1))
+ pump_on, self.last_pump_ts = brake_pump_hysteresis(apply_brake, self.apply_brake_last, self.last_pump_ts, ts)
+
+ pcm_override = True
+ can_sends.append(hondacan.create_brake_command(self.packer, self.CAN, apply_brake, pump_on,
+ pcm_override, pcm_cancel_cmd, alert_fcw,
+ self.CP.carFingerprint, CS.stock_brake, self.CP_IQ))
+ self.apply_brake_last = apply_brake
+ self.brake = apply_brake / self.params.NIDEC_BRAKE_MAX
+
+ gas_error = actuators.accel - CS.out.aEgo
+ if (not CS.out.gasPressed) and (actuators.longControlState == LongCtrlState.pid) and self.CP_IQ.enableGasInterceptor:
+ if gas_error != 0.0 and gas > 0.0:
+ self.gasfactor = np.clip(self.gasfactor + gas_error / 50 * (gas * 4.8), 0.1, 3.0)
+ if gas_error != 0.0 and (not CS.out.brakePressed) and (CS.out.vEgo > 0.0):
+ wind_adjust = 1 + (wind_brake * 4.8) / 1000
+ self.windfactor = np.clip(self.windfactor * (wind_adjust if (gas_error > 0) else 1.0 / wind_adjust), 0.1, 5.0)
+ if gas <= 0.0:
+ self.windfactor = max(self.windfactor, self.windfactor_before_brake)
+ else:
+ self.windfactor_before_brake = self.windfactor
+
+ can_sends.extend(GasInterceptorCarController.update(self, CC, CS, gas * self.gasfactor, brake, wind_brake, self.packer, self.frame))
+
+ # Send dashboard UI commands.
+ if self.frame % 10 == 0:
+ if self.CP.openpilotLongitudinalControl:
+ # On Nidec, this also controls longitudinal positive acceleration
+ can_sends.append(hondacan.create_acc_hud(self.packer, self.CAN.pt, self.CP, CC.enabled, pcm_speed, pcm_accel,
+ hud_control, hud_v_cruise, CS.is_metric, CS.acc_hud))
+
+ steering_available = CS.out.cruiseState.available and CS.out.vEgo > self.CP.minSteerSpeed
+ reduced_steering = CS.out.steeringPressed
+ can_sends.extend(hondacan.create_lkas_hud(self.packer, self.CAN.lkas, self.CP, hud_control, CC.latActive,
+ steering_available, reduced_steering, alert_steer_required, CS.lkas_hud, self.dashed_lanes))
+
+ if self.CP.openpilotLongitudinalControl:
+ # TODO: combining with create_acc_hud block above will change message order and will need replay logs regenerated
+ if self.CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS):
+ can_sends.append(hondacan.create_radar_hud(self.packer, self.CAN.pt))
+ if self.CP.carFingerprint == CAR.HONDA_CIVIC_BOSCH:
+ can_sends.append(hondacan.create_legacy_brake_command(self.packer, self.CAN.pt))
+ if self.CP.carFingerprint not in HONDA_BOSCH:
+ self.speed = pcm_speed
+ if not self.CP_IQ.enableGasInterceptor:
+ self.gas = pcm_accel / self.params.NIDEC_GAS_MAX
+
+ # Finalize actuator state for downstream consumers
+ new_actuators = actuators.as_builder()
+ new_actuators.speed = self.speed
+ 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
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/honda/carstate.py b/iqdbc_repo/iqdbc/car/honda/carstate.py
new file mode 100644
index 000000000..f8277716c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/carstate.py
@@ -0,0 +1,261 @@
+import numpy as np
+from collections import defaultdict
+
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs, DT_CTRL
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.honda.hondacan import CanBus
+from iqdbc.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, HONDA_BOSCH_ALT_RADAR, HONDA_BOSCH_CANFD, \
+ HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, HONDA_BOSCH_TJA_CONTROL, \
+ HondaFlags, CruiseButtons, CruiseSettings, GearShifter, CarControllerParams
+from iqdbc.car.interfaces import CarStateBase
+
+from iqdbc.lvbs.car.honda.iq_carstate import IQCarState
+
+TransmissionType = structs.CarParams.TransmissionType
+ButtonType = structs.CarState.ButtonEvent.Type
+
+BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.DECEL_SET: ButtonType.decelCruise,
+ CruiseButtons.MAIN: ButtonType.mainCruise, CruiseButtons.CANCEL: ButtonType.cancel}
+SETTINGS_BUTTONS_DICT = {CruiseSettings.DISTANCE: ButtonType.gapAdjustCruise, CruiseSettings.LKAS: ButtonType.lkas}
+
+
+class CarState(CarStateBase, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+
+ if CP.transmissionType != TransmissionType.manual:
+ self.gearbox_msg = "GEARBOX_AUTO"
+ if CP.transmissionType == TransmissionType.cvt:
+ self.gearbox_msg = "GEARBOX_CVT"
+ self.shifter_values = can_define.dv[self.gearbox_msg]["GEAR_SHIFTER"]
+
+ self.car_state_scm_msg = "SCM_FEEDBACK"
+ if CP.carFingerprint in HONDA_NIDEC_ALT_SCM_MESSAGES:
+ self.car_state_scm_msg = "SCM_BUTTONS"
+
+ self.brake_error_msg = "HYBRID_BRAKE_ERROR" if CP.flags & HondaFlags.HYBRID else "STANDSTILL"
+
+ self.steer_status_values = defaultdict(lambda: "UNKNOWN", can_define.dv["STEER_STATUS"]["STEER_STATUS"])
+
+ self.brake_switch_prev = False
+ self.brake_switch_active = False
+ self.low_speed_alert = False
+
+ self.dynamic_v_cruise_units = self.CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_ALT_RADAR |
+ HONDA_BOSCH_TJA_CONTROL | HONDA_BOSCH_CANFD)
+ self.cruise_setting = 0
+ self.v_cruise_pcm_prev = 0
+
+ # When available we use cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] to populate vEgoCluster
+ # However, on cars without a digital speedometer this is not always present (HRV, FIT, CRV 2016, ILX and RDX)
+ self.dash_speed_seen = False
+ self.is_metric = False
+ self.v_cruise_factor = 1.
+
+ self.initial_accFault_cleared = False
+ self.initial_accFault_cleared_timer = int(10 / DT_CTRL) # 10 seconds after startup for initial faults to clear
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+ if self.CP.enableBsm:
+ cp_body = can_parsers[Bus.body]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ # car params
+ v_weight_v = [0., 1.] # don't trust smooth speed at low values to avoid premature zero snapping
+ v_weight_bp = [1., 6.] # smooth blending, below ~0.6m/s the smooth speed snaps to zero
+
+ # update prevs, update must run once per loop
+ prev_cruise_buttons = self.cruise_buttons
+ prev_cruise_setting = self.cruise_setting
+ self.cruise_setting = cp.vl["SCM_BUTTONS"]["CRUISE_SETTING"]
+ self.cruise_buttons = cp.vl["SCM_BUTTONS"]["CRUISE_BUTTONS"]
+
+ # used for car hud message
+ # TODO: find CAR_SPEED for HONDA_ODYSSEY_TWN or use ACC_HUD w/ detection
+ self.is_metric = self.CP.carFingerprint in (CAR.HONDA_ODYSSEY_TWN,) or not cp.vl["CAR_SPEED"]["IMPERIAL_UNIT"]
+ self.v_cruise_factor = CV.MPH_TO_MS if self.dynamic_v_cruise_units and not self.is_metric else CV.KPH_TO_MS
+
+ # ******************* parse out can *******************
+
+ # blend in transmission speed at low speed, since it has more low speed accuracy
+ # STANDSTILL->WHEELS_MOVING bit can be noisy around zero, so use XMISSION_SPEED
+ v_wheel = sum([cp.vl["WHEEL_SPEEDS"][f"WHEEL_SPEED_{s}"] for s in ("FL", "FR", "RL", "RR")]) / 4.0 * CV.KPH_TO_MS
+ v_weight = float(np.interp(v_wheel, v_weight_bp, v_weight_v))
+ ret.vEgoRaw = (1. - v_weight) * cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] * CV.KPH_TO_MS * self.CP.wheelSpeedFactor + v_weight * v_wheel
+ ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
+ ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 1e-5
+
+ # doorOpen is true if we can find any door open, but signal locations vary, and we may only see the driver's door
+ # TODO: Test the eight Nidec cars without SCM signals for driver's door state, may be able to consolidate further
+ if self.CP.flags & HondaFlags.HAS_ALL_DOOR_STATES:
+ ret.doorOpen = any([cp.vl["DOORS_STATUS"]["DOOR_OPEN_FL"], cp.vl["DOORS_STATUS"]["DOOR_OPEN_FR"],
+ cp.vl["DOORS_STATUS"]["DOOR_OPEN_RL"], cp.vl["DOORS_STATUS"]["DOOR_OPEN_RR"]])
+ elif "DRIVERS_DOOR_OPEN" in cp.vl["SCM_BUTTONS"]:
+ ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"])
+ else:
+ ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"])
+
+ ret.seatbeltUnlatched = bool(cp.vl["SEATBELT_STATUS"]["SEATBELT_DRIVER_LAMP"] or not cp.vl["SEATBELT_STATUS"]["SEATBELT_DRIVER_LATCHED"])
+
+ steer_status = self.steer_status_values[cp.vl["STEER_STATUS"]["STEER_STATUS"]]
+ ret.steerFaultPermanent = steer_status not in ("NORMAL", "NO_TORQUE_ALERT_1", "NO_TORQUE_ALERT_2", "LOW_SPEED_LOCKOUT", "TMP_FAULT")
+ if self.CP.carFingerprint in HONDA_BOSCH_ALT_RADAR:
+ # TODO: See if this logic works for all other Honda
+ min_steer_speed = max(CarControllerParams.STEER_GLOBAL_MIN_SPEED, self.CP.minSteerSpeed)
+ expected_low_speed_lockout = steer_status == "LOW_SPEED_LOCKOUT" and ret.vEgo < min_steer_speed
+ ret.steerFaultTemporary = steer_status != "NORMAL" and not expected_low_speed_lockout
+ else:
+ # LOW_SPEED_LOCKOUT is not worth a warning
+ # NO_TORQUE_ALERT_2 can be caused by bump or steering nudge from driver
+ # FIXME: the stock camera stops steering on NO_TORQUE_ALERT_1
+ ret.steerFaultTemporary = steer_status not in ("NORMAL", "LOW_SPEED_LOCKOUT", "NO_TORQUE_ALERT_2")
+
+ # All Honda EPS cut off slightly above standstill, some much higher
+ # Don't alert in the near-standstill range, but alert for per-vehicle configured minimums above that
+ if CarControllerParams.STEER_GLOBAL_MIN_SPEED < ret.vEgo < (self.CP.minSteerSpeed + 0.5):
+ self.low_speed_alert = True
+ elif ret.vEgo > (self.CP.minSteerSpeed + 1.):
+ # TODO: better handle delayed steering enablement on ALT_RADAR cars
+ self.low_speed_alert = False
+ ret.lowSpeedAlert = self.low_speed_alert
+
+ if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS:
+ ret.accFaulted = bool(cp.vl["CRUISE_FAULT_STATUS"]["CRUISE_FAULT"])
+ else:
+ if self.CP.openpilotLongitudinalControl:
+ if self.CP.carFingerprint in (HONDA_BOSCH_CANFD | HONDA_BOSCH_TJA_CONTROL) and (self.CP.flags & HondaFlags.BOSCH_ALT_BRAKE):
+ ret.accFaulted = bool(cp.vl["BRAKE_MODULE"]["CRUISE_FAULT"])
+ else:
+ ret.accFaulted = bool(cp.vl[self.brake_error_msg]["BRAKE_ERROR_1"] or cp.vl[self.brake_error_msg]["BRAKE_ERROR_2"])
+
+ # Log non-critical stock ACC/LKAS faults if Nidec (camera)
+ if self.CP.carFingerprint not in HONDA_BOSCH:
+ ret.carFaultedNonCritical = bool(cp_cam.vl["ACC_HUD"]["ACC_PROBLEM"] or cp_cam.vl["LKAS_HUD"]["LKAS_PROBLEM"])
+
+ ret.espDisabled = cp.vl["VSA_STATUS"]["ESP_DISABLED"] != 0
+
+ if self.CP.carFingerprint not in (CAR.HONDA_ODYSSEY_TWN,):
+ self.dash_speed_seen = self.dash_speed_seen or cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] > 1e-3
+ if self.dash_speed_seen:
+ conversion = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS
+ ret.vEgoCluster = cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] * conversion
+
+ ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE"]
+ ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE_RATE"]
+
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(
+ 250, cp.vl["SCM_FEEDBACK"]["LEFT_BLINKER"], cp.vl["SCM_FEEDBACK"]["RIGHT_BLINKER"])
+ ret.brakeHoldActive = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"] == 1
+ ret.parkingBrake = bool(cp.vl[self.car_state_scm_msg]["PARKING_BRAKE_ON"])
+
+ if self.CP.transmissionType == TransmissionType.manual:
+ ret.gearShifter = GearShifter.reverse if bool(cp.vl["SCM_FEEDBACK"]["REVERSE_LIGHT"]) else GearShifter.drive
+ else:
+ gear_position = self.shifter_values.get(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"], None)
+ ret.gearShifter = self.parse_gear_shifter(gear_position)
+
+ ret.gasPressed = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"] > 1e-5
+
+ ret.steeringTorque = cp.vl["STEER_STATUS"]["STEER_TORQUE_SENSOR"]
+ ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD.get(self.CP.carFingerprint, 1200)
+
+ if self.CP.carFingerprint in HONDA_BOSCH:
+ # The PCM always manages its own cruise control state, but doesn't publish it
+ if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS:
+ ret.cruiseState.nonAdaptive = cp_cam.vl["ACC_HUD"]["CRUISE_CONTROL_LABEL"] != 0
+
+ if not self.CP.openpilotLongitudinalControl:
+ # ACC_HUD is on camera bus on radarless cars
+ acc_hud = cp_cam.vl["ACC_HUD"] if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS else cp.vl["ACC_HUD"]
+ ret.cruiseState.nonAdaptive = acc_hud["CRUISE_CONTROL_LABEL"] != 0
+ ret.cruiseState.standstill = acc_hud["CRUISE_SPEED"] == 252.
+
+ # On set, cruise set speed pulses between 254~255 and the set speed prev is set to avoid this.
+ ret.cruiseState.speed = self.v_cruise_pcm_prev if acc_hud["CRUISE_SPEED"] > 160.0 else acc_hud["CRUISE_SPEED"] * self.v_cruise_factor
+ self.v_cruise_pcm_prev = ret.cruiseState.speed
+ else:
+ ret.cruiseState.speed = cp.vl["CRUISE"]["CRUISE_SPEED_PCM"] * CV.KPH_TO_MS
+
+ if self.CP.flags & HondaFlags.BOSCH_ALT_BRAKE:
+ ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0
+ else:
+ # brake switch has shown some single time step noise, so only considered when
+ # switch is on for at least 2 consecutive CAN samples
+ # brake switch rises earlier than brake pressed but is never 1 when in park
+ brake_switch_vals = cp.vl_all["POWERTRAIN_DATA"]["BRAKE_SWITCH"]
+ if len(brake_switch_vals):
+ brake_switch = cp.vl["POWERTRAIN_DATA"]["BRAKE_SWITCH"] != 0
+ if len(brake_switch_vals) > 1:
+ self.brake_switch_prev = brake_switch_vals[-2] != 0
+ self.brake_switch_active = brake_switch and self.brake_switch_prev
+ self.brake_switch_prev = brake_switch
+ ret.brakePressed = (cp.vl["POWERTRAIN_DATA"]["BRAKE_PRESSED"] != 0) or self.brake_switch_active
+
+ ret.brake = cp.vl["VSA_STATUS"]["USER_BRAKE"]
+ ret.cruiseState.enabled = cp.vl["POWERTRAIN_DATA"]["ACC_STATUS"] != 0
+ ret.cruiseState.available = bool(cp.vl[self.car_state_scm_msg]["MAIN_ON"])
+
+ # Bosch cars can report stale ACC faults during early startup.
+ if ret.accFaulted:
+ if (self.CP.carFingerprint in HONDA_BOSCH) and not self.initial_accFault_cleared:
+ # Gate initial stale faults via availability (accFaulted is sticky until offroad).
+ ret.accFaulted = False
+ ret.cruiseState.available = False
+ elif self.initial_accFault_cleared_timer == 0:
+ self.initial_accFault_cleared = True
+
+ if self.initial_accFault_cleared_timer > 0:
+ self.initial_accFault_cleared_timer -= 1
+
+ # Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models
+ if self.CP.carFingerprint in (CAR.HONDA_PILOT, CAR.HONDA_RIDGELINE):
+ if ret.brake > 0.1:
+ ret.brakePressed = True
+
+ if self.CP.carFingerprint in HONDA_BOSCH:
+ # TODO: find the radarless AEB_STATUS bit and make sure ACCEL_COMMAND is correct to enable AEB alerts
+ if self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS:
+ ret.stockAeb = (not self.CP.openpilotLongitudinalControl) and bool(cp.vl["ACC_CONTROL"]["AEB_STATUS"] and cp.vl["ACC_CONTROL"]["ACCEL_COMMAND"] < -1e-5)
+ else:
+ ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE"] > 1e-5)
+
+ self.acc_hud = False
+ self.lkas_hud = False
+ if self.CP.carFingerprint not in HONDA_BOSCH:
+ ret.stockFcw = cp_cam.vl["BRAKE_COMMAND"]["FCW"] != 0
+ self.acc_hud = cp_cam.vl["ACC_HUD"]
+ self.stock_brake = cp_cam.vl["BRAKE_COMMAND"]
+ if self.CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD):
+ self.lkas_hud = cp_cam.vl["LKAS_HUD"]
+
+ if self.CP.enableBsm:
+ # BSM messages are on B-CAN, requires a panda forwarding B-CAN messages to CAN 0
+ # more info here: https://github.com/commaai/openpilot/pull/1867
+ ret.leftBlindspot = cp_body.vl["BSM_STATUS_LEFT"]["BSM_ALERT"] == 1
+ ret.rightBlindspot = cp_body.vl["BSM_STATUS_RIGHT"]["BSM_ALERT"] == 1
+
+ ret.buttonEvents = [
+ *create_button_events(self.cruise_buttons, prev_cruise_buttons, BUTTONS_DICT),
+ *create_button_events(self.cruise_setting, prev_cruise_setting, SETTINGS_BUTTONS_DICT),
+ ]
+
+ IQCarState.update(self, ret, can_parsers)
+
+ return ret, ret_iq
+
+ def get_can_parsers(self, CP, CP_IQ):
+ parsers = {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).pt),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).camera),
+ }
+ if CP.enableBsm:
+ parsers[Bus.body] = CANParser(DBC[CP.carFingerprint][Bus.body], [], CanBus(CP).radar)
+
+ return parsers
diff --git a/iqdbc_repo/iqdbc/car/honda/fingerprints.py b/iqdbc_repo/iqdbc/car/honda/fingerprints.py
new file mode 100644
index 000000000..89b1da068
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/fingerprints.py
@@ -0,0 +1,1102 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.honda.values import CAR
+
+from iqdbc.lvbs.car.iq_fingerprints import extend_fw_versions
+from iqdbc.lvbs.car.honda.iq_fingerprints import FW_VERSIONS_EXT
+
+Ecu = CarParams.Ecu
+
+# Modified FW can be identified by the second dash being replaced by a comma
+# For example: `b'39990-TVA,A150\x00\x00'`
+#
+# TODO: vsa is "essential" for fpv2 but doesn't appear on some CAR.FREED models
+
+
+FW_VERSIONS = {
+ CAR.HONDA_NBOX_2G: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TTA-J030\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TTA-J040\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TTA-N930\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TTA-J070\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'38897-TTA-J010\x00\x00',
+ ],
+ },
+ CAR.HONDA_ACCORD: {
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TVC-A910\x00\x00',
+ b'54008-TWA-A910\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-6A7-A220\x00\x00',
+ b'28101-6A7-A230\x00\x00',
+ b'28101-6A7-A320\x00\x00',
+ b'28101-6A7-A330\x00\x00',
+ b'28101-6A7-A410\x00\x00',
+ b'28101-6A7-A510\x00\x00',
+ b'28101-6A7-A610\x00\x00',
+ b'28101-6A7-A710\x00\x00',
+ b'28101-6A9-H140\x00\x00',
+ b'28101-6A9-H420\x00\x00',
+ b'28102-6B8-A560\x00\x00',
+ b'28102-6B8-A570\x00\x00',
+ b'28102-6B8-A700\x00\x00',
+ b'28102-6B8-A800\x00\x00',
+ b'28102-6B8-C560\x00\x00',
+ b'28102-6B8-C570\x00\x00',
+ b'28102-6B8-M520\x00\x00',
+ b'28102-6B8-R700\x00\x00',
+ ],
+ (Ecu.electricBrakeBooster, 0x18da2bf1, None): [
+ b'46114-TVA-A050\x00\x00',
+ b'46114-TVA-A060\x00\x00',
+ b'46114-TVA-A080\x00\x00',
+ b'46114-TVA-A120\x00\x00',
+ b'46114-TVA-A320\x00\x00',
+ b'46114-TVA-A410\x00\x00',
+ b'46114-TVE-H550\x00\x00',
+ b'46114-TVE-H560\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TVA-B040\x00\x00',
+ b'57114-TVA-B050\x00\x00',
+ b'57114-TVA-B060\x00\x00',
+ b'57114-TVA-B530\x00\x00',
+ b'57114-TVA-C040\x00\x00',
+ b'57114-TVA-C050\x00\x00',
+ b'57114-TVA-C060\x00\x00',
+ b'57114-TVA-C530\x00\x00',
+ b'57114-TVA-D520\x00\x00',
+ b'57114-TVA-E520\x00\x00',
+ b'57114-TVE-H250\x00\x00',
+ b'57114-TWA-A040\x00\x00',
+ b'57114-TWA-A050\x00\x00',
+ b'57114-TWA-A530\x00\x00',
+ b'57114-TWA-B520\x00\x00',
+ b'57114-TWA-C510\x00\x00',
+ b'57114-TWB-H030\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TBX-H120\x00\x00',
+ b'39990-TVA-A140\x00\x00',
+ b'39990-TVA-A150\x00\x00',
+ b'39990-TVA-A160\x00\x00',
+ b'39990-TVA-A340\x00\x00',
+ b'39990-TVA-X030\x00\x00',
+ b'39990-TVA-X040\x00\x00',
+ b'39990-TVE-H130\x00\x00',
+ b'39990-TWB-H120\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TBX-H230\x00\x00',
+ b'77959-TVA-A460\x00\x00',
+ b'77959-TVA-F330\x00\x00',
+ b'77959-TVA-H230\x00\x00',
+ b'77959-TVA-L420\x00\x00',
+ b'77959-TVA-X330\x00\x00',
+ b'77959-TWA-A440\x00\x00',
+ b'77959-TWA-L420\x00\x00',
+ b'77959-TWB-H220\x00\x00',
+ ],
+ (Ecu.hud, 0x18da61f1, None): [
+ b'78209-TVA-A010\x00\x00',
+ b'78209-TVA-A110\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TBX-H140\x00\x00',
+ b'36802-TVA-A150\x00\x00',
+ b'36802-TVA-A160\x00\x00',
+ b'36802-TVA-A170\x00\x00',
+ b'36802-TVA-A180\x00\x00',
+ b'36802-TVA-A330\x00\x00',
+ b'36802-TVC-A330\x00\x00',
+ b'36802-TVE-H070\x00\x00',
+ b'36802-TWA-A070\x00\x00',
+ b'36802-TWA-A080\x00\x00',
+ b'36802-TWA-A210\x00\x00',
+ b'36802-TWA-A330\x00\x00',
+ b'36802-TWB-H060\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TBX-H130\x00\x00',
+ b'36161-TVA-A060\x00\x00',
+ b'36161-TVA-A330\x00\x00',
+ b'36161-TVC-A330\x00\x00',
+ b'36161-TVE-H050\x00\x00',
+ b'36161-TWA-A070\x00\x00',
+ b'36161-TWA-A330\x00\x00',
+ b'36161-TWB-H040\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TVA-A010\x00\x00',
+ b'38897-TVA-A020\x00\x00',
+ b'38897-TVA-A230\x00\x00',
+ b'38897-TVA-A240\x00\x00',
+ b'38897-TWA-A120\x00\x00',
+ b'38897-TWD-J020\x00\x00',
+ ],
+ },
+ CAR.HONDA_CIVIC: {
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-5CG-A040\x00\x00',
+ b'28101-5CG-A050\x00\x00',
+ b'28101-5CG-A070\x00\x00',
+ b'28101-5CG-A080\x00\x00',
+ b'28101-5CG-A320\x00\x00',
+ b'28101-5CG-A810\x00\x00',
+ b'28101-5CG-A820\x00\x00',
+ b'28101-5DJ-A040\x00\x00',
+ b'28101-5DJ-A060\x00\x00',
+ b'28101-5DJ-A510\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TBA-A540\x00\x00',
+ b'57114-TBA-A550\x00\x00',
+ b'57114-TBA-A560\x00\x00',
+ b'57114-TBA-A570\x00\x00',
+ b'57114-TEA-Q220\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TBA-A030\x00\x00',
+ b'39990-TBG-A030\x00\x00',
+ b'39990-TEA-T020\x00\x00',
+ b'39990-TEG-A010\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TBA-A030\x00\x00',
+ b'77959-TBA-A040\x00\x00',
+ b'77959-TBG-A020\x00\x00',
+ b'77959-TBG-A030\x00\x00',
+ b'77959-TEA-Q820\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-TBA-A020\x00\x00',
+ b'36161-TBA-A030\x00\x00',
+ b'36161-TBA-A040\x00\x00',
+ b'36161-TBC-A020\x00\x00',
+ b'36161-TBC-A030\x00\x00',
+ b'36161-TED-Q320\x00\x00',
+ b'36161-TEG-A010\x00\x00',
+ b'36161-TEG-A020\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TBA-A010\x00\x00',
+ b'38897-TBA-A020\x00\x00',
+ ],
+ },
+ CAR.HONDA_CIVIC_BOSCH: {
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-5CG-A920\x00\x00',
+ b'28101-5CG-AB10\x00\x00',
+ b'28101-5CG-C110\x00\x00',
+ b'28101-5CG-C220\x00\x00',
+ b'28101-5CG-C320\x00\x00',
+ b'28101-5CG-G020\x00\x00',
+ b'28101-5CG-L020\x00\x00',
+ b'28101-5CK-A130\x00\x00',
+ b'28101-5CK-A140\x00\x00',
+ b'28101-5CK-A150\x00\x00',
+ b'28101-5CK-C130\x00\x00',
+ b'28101-5CK-C140\x00\x00',
+ b'28101-5CK-C150\x00\x00',
+ b'28101-5CK-G210\x00\x00',
+ b'28101-5CK-J710\x00\x00',
+ b'28101-5CK-Q110\x00\x00',
+ b'28101-5CK-Q610\x00\x00',
+ b'28101-5DJ-A610\x00\x00',
+ b'28101-5DJ-A710\x00\x00',
+ b'28101-5DV-E330\x00\x00',
+ b'28101-5DV-E610\x00\x00',
+ b'28101-5DV-E820\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TBG-A330\x00\x00',
+ b'57114-TBG-A340\x00\x00',
+ b'57114-TBG-A350\x00\x00',
+ b'57114-TGG-A340\x00\x00',
+ b'57114-TGG-C120\x00\x00',
+ b'57114-TGG-C320\x00\x00',
+ b'57114-TGG-G320\x00\x00',
+ b'57114-TGG-L320\x00\x00',
+ b'57114-TGG-L330\x00\x00',
+ b'57114-TGH-A130\x00\x00',
+ b'57114-TGH-L130\x00\x00',
+ b'57114-TGJ-Q330\x00\x00',
+ b'57114-TGK-T320\x00\x00',
+ b'57114-TGL-G330\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TBA-C020\x00\x00',
+ b'39990-TBA-C120\x00\x00',
+ b'39990-TEA-T330\x00\x00',
+ b'39990-TEA-T820\x00\x00',
+ b'39990-TEZ-T020\x00\x00',
+ b'39990-TGG-A020\x00\x00',
+ b'39990-TGG-A120\x00\x00',
+ b'39990-TGG-J510\x00\x00',
+ b'39990-TGH-J020\x00\x00',
+ b'39990-TGH-J530\x00\x00',
+ b'39990-TGL-E130\x00\x00',
+ b'39990-TGN-E120\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TBA-A060\x00\x00',
+ b'77959-TBG-A050\x00\x00',
+ b'77959-TEA-G020\x00\x00',
+ b'77959-TGG-A020\x00\x00',
+ b'77959-TGG-A030\x00\x00',
+ b'77959-TGG-E010\x00\x00',
+ b'77959-TGG-G010\x00\x00',
+ b'77959-TGG-G110\x00\x00',
+ b'77959-TGG-J320\x00\x00',
+ b'77959-TGG-Q810\x00\x00',
+ b'77959-TGG-Z820\x00\x00',
+ b'77959-TGH-E220\x00\x00',
+ b'77959-TGH-J110\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TBA-A150\x00\x00',
+ b'36802-TBA-A160\x00\x00',
+ b'36802-TFJ-G060\x00\x00',
+ b'36802-TGG-A050\x00\x00',
+ b'36802-TGG-A060\x00\x00',
+ b'36802-TGG-A070\x00\x00',
+ b'36802-TGG-A130\x00\x00',
+ b'36802-TGG-G040\x00\x00',
+ b'36802-TGG-G130\x00\x00',
+ b'36802-TGH-A030\x00\x00',
+ b'36802-TGH-A140\x00\x00',
+ b'36802-TGK-Q030\x00\x00',
+ b'36802-TGK-Q120\x00\x00',
+ b'36802-TGL-G040\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TBA-A130\x00\x00',
+ b'36161-TBA-A140\x00\x00',
+ b'36161-TFJ-G070\x00\x00',
+ b'36161-TGG-A060\x00\x00',
+ b'36161-TGG-A080\x00\x00',
+ b'36161-TGG-A120\x00\x00',
+ b'36161-TGG-G050\x00\x00',
+ b'36161-TGG-G070\x00\x00',
+ b'36161-TGG-G130\x00\x00',
+ b'36161-TGG-G140\x00\x00',
+ b'36161-TGH-A020\x00\x00',
+ b'36161-TGH-A140\x00\x00',
+ b'36161-TGK-Q040\x00\x00',
+ b'36161-TGK-Q120\x00\x00',
+ b'36161-TGL-G050\x00\x00',
+ b'36161-TGL-G070\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TBA-A020\x00\x00',
+ b'38897-TBA-A110\x00\x00',
+ b'38897-TGH-A010\x00\x00',
+ ],
+ (Ecu.electricBrakeBooster, 0x18da2bf1, None): [
+ b'39494-TGL-G030\x00\x00',
+ ],
+ },
+ CAR.HONDA_CIVIC_BOSCH_DIESEL: {
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-59Y-G220\x00\x00',
+ b'28101-59Y-G620\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TGN-E320\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TFK-G020\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TFK-G210\x00\x00',
+ b'77959-TGN-G220\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TFK-G130\x00\x00',
+ b'36802-TGN-G130\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TGN-E010\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TFK-G130\x00\x00',
+ b'36161-TGN-G130\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TBA-A020\x00\x00',
+ ],
+ },
+ CAR.HONDA_CRV: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-T1W-A230\x00\x00',
+ b'57114-T1W-A240\x00\x00',
+ b'57114-TFF-A930\x00\x00',
+ b'57114-TFF-A940\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T0A-A230\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T1W-A830\x00\x00',
+ b'36161-T1W-C830\x00\x00',
+ b'36161-T1X-A830\x00\x00',
+ ],
+ },
+ CAR.HONDA_CRV_5G: {
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-5RG-A020\x00\x00',
+ b'28101-5RG-A030\x00\x00',
+ b'28101-5RG-A040\x00\x00',
+ b'28101-5RG-A120\x00\x00',
+ b'28101-5RG-A220\x00\x00',
+ b'28101-5RH-A020\x00\x00',
+ b'28101-5RH-A030\x00\x00',
+ b'28101-5RH-A040\x00\x00',
+ b'28101-5RH-A120\x00\x00',
+ b'28101-5RH-A220\x00\x00',
+ b'28101-5RL-Q010\x00\x00',
+ b'28101-5RM-F010\x00\x00',
+ b'28101-5RM-K010\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TLA-A040\x00\x00',
+ b'57114-TLA-A050\x00\x00',
+ b'57114-TLA-A060\x00\x00',
+ b'57114-TLB-A830\x00\x00',
+ b'57114-TMC-Z040\x00\x00',
+ b'57114-TMC-Z050\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TLA-A040\x00\x00',
+ b'39990-TLA-A110\x00\x00',
+ b'39990-TLA-A220\x00\x00',
+ b'39990-TME-T030\x00\x00',
+ b'39990-TME-T120\x00\x00',
+ b'39990-TMT-T010\x00\x00',
+ ],
+ (Ecu.electricBrakeBooster, 0x18da2bf1, None): [
+ b'46114-TLA-A040\x00\x00',
+ b'46114-TLA-A050\x00\x00',
+ b'46114-TLA-A930\x00\x00',
+ b'46114-TMC-U020\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TLA-A010\x00\x00',
+ b'38897-TLA-A110\x00\x00',
+ b'38897-TNY-G010\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TLA-A040\x00\x00',
+ b'36802-TLA-A050\x00\x00',
+ b'36802-TLA-A060\x00\x00',
+ b'36802-TLA-A070\x00\x00',
+ b'36802-TMC-Q040\x00\x00',
+ b'36802-TMC-Q070\x00\x00',
+ b'36802-TNY-A030\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TLA-A060\x00\x00',
+ b'36161-TLA-A070\x00\x00',
+ b'36161-TLA-A080\x00\x00',
+ b'36161-TMC-Q020\x00\x00',
+ b'36161-TMC-Q030\x00\x00',
+ b'36161-TMC-Q040\x00\x00',
+ b'36161-TNY-A020\x00\x00',
+ b'36161-TNY-A030\x00\x00',
+ b'36161-TNY-A040\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TLA-A240\x00\x00',
+ b'77959-TLA-A250\x00\x00',
+ b'77959-TLA-A320\x00\x00',
+ b'77959-TLA-A410\x00\x00',
+ b'77959-TLA-A420\x00\x00',
+ b'77959-TLA-Q040\x00\x00',
+ b'77959-TLA-Z040\x00\x00',
+ b'77959-TMM-F040\x00\x00',
+ ],
+ },
+ CAR.HONDA_CRV_EU: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-T1V-G920\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T1V-G520\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-T1V-G010\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-5LH-E120\x00\x00',
+ b'28103-5LH-E100\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T1G-G940\x00\x00',
+ ],
+ },
+ CAR.HONDA_CRV_HYBRID: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TMB-H030\x00\x00',
+ b'57114-TPA-G020\x00\x00',
+ b'57114-TPG-A020\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TMA-H020\x00\x00',
+ b'39990-TPA-G030\x00\x00',
+ b'39990-TPG-A020\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TMA-H110\x00\x00',
+ b'38897-TPG-A110\x00\x00',
+ b'38897-TPG-A210\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TMB-H510\x00\x00',
+ b'54008-TMB-H610\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TMB-H040\x00\x00',
+ b'36161-TPA-E050\x00\x00',
+ b'36161-TPA-E070\x00\x00',
+ b'36161-TPG-A030\x00\x00',
+ b'36161-TPG-A040\x00\x00',
+ b'36161-TPG-A050\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TMB-H040\x00\x00',
+ b'36802-TPA-E040\x00\x00',
+ b'36802-TPG-A020\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TLA-C320\x00\x00',
+ b'77959-TLA-C410\x00\x00',
+ b'77959-TLA-C420\x00\x00',
+ b'77959-TLA-G220\x00\x00',
+ b'77959-TLA-H240\x00\x00',
+ ],
+ },
+ CAR.HONDA_FIT: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-T5R-L020\x00\x00',
+ b'57114-T5R-L220\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-T5R-C020\x00\x00',
+ b'39990-T5R-C030\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-T5A-J010\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T5R-A040\x00\x00',
+ b'36161-T5R-A240\x00\x00',
+ b'36161-T5R-A520\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T5R-A230\x00\x00',
+ ],
+ },
+ CAR.HONDA_FREED: {
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TDK-J010\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TDK-J050\x00\x00',
+ b'39990-TDK-N020\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TDK-J120\x00\x00',
+ b'57114-TDK-J330\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-TDK-J070\x00\x00',
+ b'36161-TDK-J080\x00\x00',
+ b'36161-TDK-J530\x00\x00',
+ ],
+ },
+ CAR.ACURA_MDX_4G_MMR: {
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'8S102-TYA-A020\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S302-TYA-A020\x00\x00',
+ ],
+ },
+ CAR.HONDA_ODYSSEY: {
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-THR-A010\x00\x00',
+ b'38897-THR-A020\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-THR-A020\x00\x00',
+ b'39990-THR-A030\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-THR-A010\x00\x00',
+ b'77959-THR-A110\x00\x00',
+ b'77959-THR-X010\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-THR-A020\x00\x00',
+ b'36161-THR-A030\x00\x00',
+ b'36161-THR-A110\x00\x00',
+ b'36161-THR-A720\x00\x00',
+ b'36161-THR-A730\x00\x00',
+ b'36161-THR-A810\x00\x00',
+ b'36161-THR-A910\x00\x00',
+ b'36161-THR-C010\x00\x00',
+ b'36161-THR-D110\x00\x00',
+ b'36161-THR-K020\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-5NZ-A110\x00\x00',
+ b'28101-5NZ-A310\x00\x00',
+ b'28101-5NZ-C310\x00\x00',
+ b'28102-5MX-A001\x00\x00',
+ b'28102-5MX-A600\x00\x00',
+ b'28102-5MX-A610\x00\x00',
+ b'28102-5MX-A700\x00\x00',
+ b'28102-5MX-A710\x00\x00',
+ b'28102-5MX-A900\x00\x00',
+ b'28102-5MX-A910\x00\x00',
+ b'28102-5MX-C001\x00\x00',
+ b'28102-5MX-C610\x00\x00',
+ b'28102-5MX-C910\x00\x00',
+ b'28102-5MX-D001\x00\x00',
+ b'28102-5MX-D710\x00\x00',
+ b'28102-5MX-K610\x00\x00',
+ b'28103-5NZ-A100\x00\x00',
+ b'28103-5NZ-A300\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-THR-A040\x00\x00',
+ b'57114-THR-A110\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-THR-A020\x00\x00',
+ ],
+ },
+ CAR.HONDA_ODYSSEY_TWN: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-T6A-J210\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T6A-P110\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T6A-P040\x00\x00',
+ ],
+ },
+ CAR.HONDA_ODYSSEY_5G_MMR: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-THR-A240\x00\x00',
+ b'57114-THR-A520\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-THR-A220\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-THR-A220\x00\x00',
+ b'36161-THR-A230\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-THR-A310\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28102-5MX-A100\x00\x00',
+ b'28102-5MX-A200\x00\x00',
+ b'28102-5MX-A410\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-THR-A220\x00\x00',
+ b'77959-THR-A230\x00\x00',
+ b'77959-THR-A320\x00\x00',
+ ],
+ (Ecu.electricBrakeBooster, 0x18da2bf1, None): [
+ b'46114-THR-A530\x00\x00',
+ b'46114-THR-A540\x00\x00',
+ b'46114-THR-A720\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-THR-A130\x00\x00',
+ b'38897-THR-A320\x00\x00',
+ b'38897-THR-A410\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-THR-A050\x00\x00',
+ b'39990-THR-A110\x00\x00',
+ ],
+ },
+ CAR.HONDA_PILOT: {
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TG7-A520\x00\x00',
+ b'54008-TG7-A530\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-5EY-A040\x00\x00',
+ b'28101-5EY-A050\x00\x00',
+ b'28101-5EY-A100\x00\x00',
+ b'28101-5EY-A330\x00\x00',
+ b'28101-5EY-A430\x00\x00',
+ b'28101-5EY-A500\x00\x00',
+ b'28101-5EZ-A050\x00\x00',
+ b'28101-5EZ-A060\x00\x00',
+ b'28101-5EZ-A100\x00\x00',
+ b'28101-5EZ-A210\x00\x00',
+ b'28101-5EZ-A330\x00\x00',
+ b'28101-5EZ-A430\x00\x00',
+ b'28101-5EZ-A500\x00\x00',
+ b'28101-5EZ-A600\x00\x00',
+ b'28101-5EZ-A700\x00\x00',
+ b'28103-5EY-A110\x00\x00',
+ b'28103-5EZ-A010\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TG7-A030\x00\x00',
+ b'38897-TG7-A040\x00\x00',
+ b'38897-TG7-A110\x00\x00',
+ b'38897-TG7-A210\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TG7-A030\x00\x00',
+ b'39990-TG7-A040\x00\x00',
+ b'39990-TG7-A060\x00\x00',
+ b'39990-TG7-A070\x00\x00',
+ b'39990-TGS-A230\x00\x00',
+ b'39990-TGS-A320\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-TG7-A310\x00\x00',
+ b'36161-TG7-A520\x00\x00',
+ b'36161-TG7-A630\x00\x00',
+ b'36161-TG7-A720\x00\x00',
+ b'36161-TG7-A820\x00\x00',
+ b'36161-TG7-A930\x00\x00',
+ b'36161-TG7-C520\x00\x00',
+ b'36161-TG7-D520\x00\x00',
+ b'36161-TG7-D630\x00\x00',
+ b'36161-TG7-Y630\x00\x00',
+ b'36161-TG8-A410\x00\x00',
+ b'36161-TG8-A520\x00\x00',
+ b'36161-TG8-A630\x00\x00',
+ b'36161-TG8-A720\x00\x00',
+ b'36161-TG8-A830\x00\x00',
+ b'36161-TGS-A030\x00\x00',
+ b'36161-TGS-A130\x00\x00',
+ b'36161-TGS-A220\x00\x00',
+ b'36161-TGS-A320\x00\x00',
+ b'36161-TGT-A030\x00\x00',
+ b'36161-TGT-A130\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TG7-A020\x00\x00',
+ b'77959-TG7-A110\x00\x00',
+ b'77959-TG7-A210\x00\x00',
+ b'77959-TG7-Y210\x00\x00',
+ b'77959-TGS-A010\x00\x00',
+ b'77959-TGS-A110\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TG7-A130\x00\x00',
+ b'57114-TG7-A140\x00\x00',
+ b'57114-TG7-A230\x00\x00',
+ b'57114-TG7-A240\x00\x00',
+ b'57114-TG7-A630\x00\x00',
+ b'57114-TG7-A730\x00\x00',
+ b'57114-TG8-A140\x00\x00',
+ b'57114-TG8-A230\x00\x00',
+ b'57114-TG8-A240\x00\x00',
+ b'57114-TG8-A630\x00\x00',
+ b'57114-TG8-A730\x00\x00',
+ b'57114-TGS-A530\x00\x00',
+ b'57114-TGT-A530\x00\x00',
+ ],
+ },
+ CAR.ACURA_RDX: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TX4-A220\x00\x00',
+ b'57114-TX5-A220\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-TX4-A030\x00\x00',
+ b'36161-TX5-A030\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TX4-B010\x00\x00',
+ b'77959-TX4-C010\x00\x00',
+ b'77959-TX4-C020\x00\x00',
+ ],
+ },
+ CAR.ACURA_RDX_3G: {
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TJB-A030\x00\x00',
+ b'57114-TJB-A040\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TJB-A040\x00\x00',
+ b'36802-TJB-A050\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TJB-A040\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TJB-A520\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28102-5YK-A610\x00\x00',
+ b'28102-5YK-A620\x00\x00',
+ b'28102-5YK-A630\x00\x00',
+ b'28102-5YK-A700\x00\x00',
+ b'28102-5YK-A711\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-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',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TJB-A040\x00\x00',
+ b'38897-TJB-A110\x00\x00',
+ b'38897-TJB-A120\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TJB-A030\x00\x00',
+ b'39990-TJB-A040\x00\x00',
+ b'39990-TJB-A130\x00\x00',
+ ],
+ },
+ CAR.HONDA_RIDGELINE: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-T6Z-A020\x00\x00',
+ b'39990-T6Z-A030\x00\x00',
+ b'39990-T6Z-A050\x00\x00',
+ b'39990-T6Z-A110\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T6Z-A020\x00\x00',
+ b'36161-T6Z-A310\x00\x00',
+ b'36161-T6Z-A420\x00\x00',
+ b'36161-T6Z-A520\x00\x00',
+ b'36161-T6Z-A620\x00\x00',
+ b'36161-T6Z-A720\x00\x00',
+ b'36161-TJZ-A120\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-T6Z-A010\x00\x00',
+ b'38897-T6Z-A110\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T6Z-A020\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-T6Z-A120\x00\x00',
+ b'57114-T6Z-A130\x00\x00',
+ b'57114-T6Z-A520\x00\x00',
+ b'57114-T6Z-A610\x00\x00',
+ b'57114-TJZ-A520\x00\x00',
+ ],
+ },
+ CAR.HONDA_INSIGHT: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TXM-A040\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TXM-A070\x00\x00',
+ b'36802-TXM-A080\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TXM-A050\x00\x00',
+ b'36161-TXM-A060\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TXM-A230\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TXM-A030\x00\x00',
+ b'57114-TXM-A040\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TWA-A910\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TXM-A020\x00\x00',
+ ],
+ },
+ CAR.HONDA_HRV: {
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-T7A-A010\x00\x00',
+ b'38897-T7A-A110\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-THX-A020\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T7A-A040\x00\x00',
+ b'36161-T7A-A140\x00\x00',
+ b'36161-T7A-A240\x00\x00',
+ b'36161-T7A-C440\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T7A-A230\x00\x00',
+ ],
+ },
+ CAR.HONDA_HRV_3G: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-3M0-G110\x00\x00',
+ b'39990-3M0-J030\x00\x00',
+ b'39990-3W0-A030\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-3M0-M110\x00\x00',
+ b'38897-3M0-Z010\x00\x00',
+ b'38897-3W1-A010\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-3M0-K840\x00\x00',
+ b'77959-3N1-Z840\x00\x00',
+ b'77959-3V0-A820\x00\x00',
+ b'77959-3V0-A910\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S102-3M1-T050\x00\x00',
+ b'8S102-3M3-T050\x00\x00',
+ b'8S102-3M6-P030\x00\x00',
+ b'8S102-3M6-PA20\x00\x00',
+ b'8S102-3W0-A060\x00\x00',
+ b'8S102-3W0-AB10\x00\x00',
+ b'8S102-3W0-AB20\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-3M6-M010\x00\x00',
+ b'57114-3N1-T020\x00\x00',
+ b'57114-3W0-A040\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-6EH-A010\x00\x00',
+ b'28101-6EH-A110\x00\x00',
+ b'28101-6JC-M310\x00\x00',
+ ],
+ (Ecu.electricBrakeBooster, 0x18da2bf1, None): [
+ b'46114-3W0-A020\x00\x00',
+ b'46114-3W0-A050\x00\x00',
+ ],
+ },
+ CAR.ACURA_ILX: {
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TX6-A010\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-TV9-A040\x00\x00',
+ b'36161-TV9-A140\x00\x00',
+ b'36161-TV9-C140\x00\x00',
+ b'36161-TX6-A030\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TX6-A210\x00\x00',
+ b'77959-TX6-A230\x00\x00',
+ b'77959-TX6-C210\x00\x00',
+ ],
+ },
+ CAR.HONDA_E: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TYF-N030\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TYF-E140\x00\x00',
+ ],
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TYF-E010\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TYF-G430\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TYF-E030\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TYF-E020\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TYF-E030\x00\x00',
+ ],
+ },
+ CAR.HONDA_CIVIC_2022: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-T24-T120\x00\x00',
+ b'39990-T38-A040\x00\x00',
+ b'39990-T39-A130\x00\x00',
+ b'39990-T43-J020\x00\x00',
+ b'39990-T43-J030\x00\x00',
+ b'39990-T50-J030\x00\x00',
+ b'39990-T50-J110\x00\x00',
+ b'39990-T56-A040\x00\x00',
+ b'39990-T60-J030\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-T20-A020\x00\x00',
+ b'38897-T20-A210\x00\x00',
+ b'38897-T20-A310\x00\x00',
+ b'38897-T20-A510\x00\x00',
+ b'38897-T21-A010\x00\x00',
+ b'38897-T22-A110\x00\x00',
+ b'38897-T24-Z120\x00\x00',
+ b'38897-T47-AA20\x00\x00',
+ b'38897-T50-E310\x00\x00',
+ b'38897-T50-EA10\x00\x00',
+ b'38897-T60-A110\x00\x00',
+ b'38897-T61-A320\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T20-A970\x00\x00',
+ b'77959-T20-A980\x00\x00',
+ b'77959-T20-M820\x00\x00',
+ b'77959-T39-A910\x00\x00',
+ b'77959-T47-A940\x00\x00',
+ b'77959-T47-A950\x00\x00',
+ b'77959-T50-G010\x00\x00',
+ b'77959-T50-G930\x00\x00',
+ b'77959-T60-A920\x00\x00',
+ b'77959-T61-A920\x00\x00',
+ b'77959-T65-A920\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T20-A060\x00\x00',
+ b'36161-T20-A070\x00\x00',
+ b'36161-T20-A080\x00\x00',
+ b'36161-T24-T070\x00\x00',
+ b'36161-T38-A060\x00\x00',
+ b'36161-T47-A050\x00\x00',
+ b'36161-T47-A060\x00\x00',
+ b'36161-T47-A070\x00\x00',
+ b'8S102-T20-AA10\x00\x00',
+ b'8S102-T43-J540\x00\x00',
+ b'8S102-T47-AA10\x00\x00',
+ b'8S102-T47-AA20\x00\x00',
+ b'8S102-T50-EA10\x00\x00',
+ b'8S102-T56-A060\x00\x00',
+ b'8S102-T56-A070\x00\x00',
+ b'8S102-T60-AA10\x00\x00',
+ b'8S102-T64-A040\x00\x00',
+ b'8S102-T64-A050\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-T20-AB40\x00\x00',
+ b'57114-T24-TB30\x00\x00',
+ b'57114-T38-AA20\x00\x00',
+ b'57114-T43-JA30\x00\x00',
+ b'57114-T43-JB30\x00\x00',
+ b'57114-T50-JC20\x00\x00',
+ b'57114-T60-AA20\x00\x00',
+ b'57114-T61-AJ30\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-65D-A020\x00\x00',
+ b'28101-65D-A120\x00\x00',
+ b'28101-65H-A020\x00\x00',
+ b'28101-65H-A120\x00\x00',
+ b'28101-65J-N010\x00\x00',
+ ],
+ },
+ CAR.HONDA_PILOT_4G: {
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'8S102-T90-A050\x00\x00',
+ b'8S102-T90-A060\x00\x00',
+ b'8S102-T90-A070\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S302-T90-A040\x00\x00',
+ ],
+ },
+ CAR.HONDA_ACCORD_11G: {
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S302-30A-A040\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'8S102-30A-A050\x00\x00',
+ b'8S102-30A-A060\x00\x00',
+ b'8S102-30A-A070\x00\x00',
+ ],
+ },
+ CAR.HONDA_CRV_6G: {
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S302-3A0-A060\x00\x00',
+ b'8S302-3A0-A220\x00\x00',
+ b'8S302-3C0-Q050\x00\x00',
+ b'8S302-3D4-A050\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'8S102-3A0-A070\x00\x00',
+ b'8S102-3A0-A090\x00\x00',
+ b'8S102-3A0-A110\x00\x00',
+ b'8S102-3A0-A230\x00\x00',
+ b'8S102-3C0-Q060\x00\x00',
+ b'8S102-3D4-A060\x00\x00',
+ b'8S102-3D4-A070\x00\x00',
+ b'8S102-3D4-A080\x00\x00',
+ b'8S102-3D4-A090\x00\x00',
+ ],
+ },
+ CAR.HONDA_CITY_7G: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-T14-B030\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-T14-M110\x00\x00',
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-T00-B830\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-T14-P050\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-T14-B030\x00\x00',
+ ],
+ (Ecu.transmission, 0x18da1ef1, None): [
+ b'28101-63B-M420\x00\x00',
+ ],
+ },
+ CAR.HONDA_PASSPORT_4G: {
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S302-3BM-A020\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'8S102-3BM-A020\x00\x00',
+ ],
+ },
+ CAR.ACURA_TLX_2G: {
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36802-TGV-A060\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'36161-TGV-A030\x00\x00',
+ ],
+ },
+ CAR.ACURA_TLX_2G_MMR: {
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'8S302-TGV-A030\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x18dab5f1, None): [
+ b'8S102-TGV-A030\x00\x00',
+ ],
+ },
+}
+
+FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT)
diff --git a/iqdbc_repo/iqdbc/car/honda/hondacan.py b/iqdbc_repo/iqdbc/car/honda/hondacan.py
new file mode 100644
index 000000000..818c86ec5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/hondacan.py
@@ -0,0 +1,253 @@
+from iqdbc.car import CanBusBase
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.honda.values import (HondaFlags, HONDA_BOSCH, HONDA_BOSCH_ALT_RADAR, HONDA_BOSCH_RADARLESS,
+ HONDA_BOSCH_CANFD, CarControllerParams)
+from iqdbc.lvbs.car.honda.iq_values import HondaFlagsIQ
+
+# CAN bus layout with relay
+# 0 = ACC-CAN - radar side
+# 1 = F-CAN B - powertrain
+# 2 = ACC-CAN - camera side
+# 3 = F-CAN A - OBDII port
+
+
+class CanBus(CanBusBase):
+ def __init__(self, CP=None, fingerprint=None) -> None:
+ # use fingerprint if specified
+ super().__init__(CP if fingerprint is None else None, fingerprint)
+
+ # powertrain bus is split instead of radar on radarless and CAN FD Bosch
+ if CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS - HONDA_BOSCH_CANFD):
+ self._pt, self._radar = self.offset + 1, self.offset
+ # normally steering commands are sent to radar, which forwards them to powertrain bus
+ # when radar is disabled, steering commands are sent directly to powertrain bus
+ self._lkas = self._pt if CP.openpilotLongitudinalControl else self._radar
+ else:
+ self._pt, self._radar, self._lkas = self.offset, self.offset + 1, self.offset
+
+ @property
+ def pt(self) -> int:
+ return self._pt
+
+ @property
+ def radar(self) -> int:
+ return self._radar
+
+ @property
+ def camera(self) -> int:
+ return self.offset + 2
+
+ @property
+ def lkas(self) -> int:
+ return self._lkas
+
+ # B-CAN is forwarded to ACC-CAN radar side (CAN 0 on fake ethernet port)
+ @property
+ def body(self) -> int:
+ return self.offset
+
+
+def create_brake_command(packer, CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake, CP_IQ):
+ # TODO: do we loose pressure if we keep pump off for long?
+ brakelights = apply_brake > 0
+ brake_rq = apply_brake > 0
+ pcm_fault_cmd = False
+
+ values = {
+ "CRUISE_OVERRIDE": pcm_override,
+ "CRUISE_FAULT_CMD": pcm_fault_cmd,
+ "CRUISE_CANCEL_CMD": pcm_cancel_cmd,
+ "COMPUTER_BRAKE_REQUEST": brake_rq,
+ "SET_ME_1": 1,
+ "BRAKE_LIGHTS": brakelights,
+ "CHIME": stock_brake["CHIME"] if fcw else 0, # send the chime for stock fcw
+ "FCW": fcw << 1, # TODO: Why are there two bits for fcw?
+ "AEB_REQ_1": 0,
+ "AEB_REQ_2": 0,
+ "AEB_STATUS": 0,
+ }
+
+ if CP_IQ.flags & HondaFlagsIQ.NIDEC_HYBRID:
+ values["COMPUTER_BRAKE_HYBRID"] = apply_brake
+ values["BRAKE_PUMP_REQUEST_HYBRID"] = apply_brake > 0
+ else:
+ values["COMPUTER_BRAKE"] = apply_brake
+ values["BRAKE_PUMP_REQUEST"] = pump_on
+
+ return packer.make_can_msg("BRAKE_COMMAND", CAN.pt, values)
+
+
+def create_acc_commands(packer, CAN, enabled, active, accel, gas, stopping_counter, car_fingerprint, gas_force):
+ commands = []
+ min_gas_accel = CarControllerParams.BOSCH_GAS_LOOKUP_BP[0]
+
+ control_on = 5 if enabled else 0
+ gas_command = gas if active and gas_force > min_gas_accel else -30000
+ accel_command = accel if active else 0
+ braking = 1 if active and gas_force < min_gas_accel else 0
+ standstill = 1 if active and stopping_counter > 0 else 0
+ standstill_release = 1 if active and stopping_counter == 0 else 0
+
+ # common ACC_CONTROL values
+ acc_control_values = {
+ 'ACCEL_COMMAND': accel_command,
+ 'STANDSTILL': standstill,
+ 'BRAKE_REQUEST': braking,
+ }
+
+ if car_fingerprint in HONDA_BOSCH_RADARLESS:
+ acc_control_values.update({
+ "CONTROL_ON": enabled,
+ })
+ else:
+ acc_control_values.update({
+ # setting CONTROL_ON causes car to set POWERTRAIN_DATA->ACC_STATUS = 1
+ "CONTROL_ON": control_on,
+ "GAS_COMMAND": gas_command, # used for gas
+ "BRAKE_LIGHTS": braking,
+ "STANDSTILL_RELEASE": standstill_release,
+ })
+ acc_control_on_values = {
+ "SET_TO_3": 0x03,
+ "CONTROL_ON": enabled,
+ "SET_TO_FF": 0xff,
+ "SET_TO_75": 0x75,
+ "SET_TO_30": 0x30,
+ }
+ commands.append(packer.make_can_msg("ACC_CONTROL_ON", CAN.pt, acc_control_on_values))
+
+ commands.append(packer.make_can_msg("ACC_CONTROL", CAN.pt, acc_control_values))
+ return commands
+
+
+def create_steering_control(packer, CAN, apply_torque, lkas_active, tja_control):
+ values = {
+ "STEER_TORQUE": apply_torque if lkas_active else 0,
+ "STEER_TORQUE_REQUEST": lkas_active,
+ }
+
+ if tja_control:
+ values["STEER_DOWN_TO_ZERO"] = lkas_active
+
+ return packer.make_can_msg("STEERING_CONTROL", CAN.lkas, values)
+
+
+def create_bosch_supplemental_1(packer, CAN):
+ # non-active params
+ values = {
+ "SET_ME_X04": 0x04,
+ "SET_ME_X80": 0x80,
+ "SET_ME_X10": 0x10,
+ }
+ return packer.make_can_msg("BOSCH_SUPPLEMENTAL_1", CAN.lkas, values)
+
+
+def create_acc_hud(packer, bus, CP, enabled, pcm_speed, pcm_accel, hud_control, hud_v_cruise, is_metric, acc_hud):
+ acc_hud_values = {
+ 'CRUISE_SPEED': hud_v_cruise,
+ 'ENABLE_MINI_CAR': 1 if enabled else 0,
+ # only moves the lead car without ACC_ON
+ 'HUD_DISTANCE': hud_control.leadDistanceBars, # wraps to 0 at 4 bars
+ 'IMPERIAL_UNIT': int(not is_metric),
+ 'HUD_LEAD': 2 if enabled and hud_control.leadVisible else 1 if enabled else 0,
+ 'SET_ME_X01_2': 1,
+ }
+
+ if CP.carFingerprint in HONDA_BOSCH:
+ acc_hud_values['ACC_ON'] = int(enabled)
+ acc_hud_values['FCM_OFF'] = 1
+ acc_hud_values['FCM_OFF_2'] = 1
+ else:
+ # Shows the distance bars, TODO: stock camera shows updates temporarily while disabled
+ acc_hud_values['ACC_ON'] = int(enabled)
+ acc_hud_values['PCM_SPEED'] = pcm_speed * CV.MS_TO_KPH
+ acc_hud_values['PCM_GAS'] = pcm_accel
+ acc_hud_values['SET_ME_X01'] = 1
+ acc_hud_values['FCM_OFF'] = acc_hud['FCM_OFF']
+ acc_hud_values['FCM_OFF_2'] = acc_hud['FCM_OFF_2']
+ acc_hud_values['FCM_PROBLEM'] = acc_hud['FCM_PROBLEM']
+ acc_hud_values['ICONS'] = acc_hud['ICONS']
+
+ return packer.make_can_msg("ACC_HUD", bus, acc_hud_values)
+
+
+def create_lkas_hud(packer, bus, CP, hud_control, lat_active, steering_available, reduced_steering, alert_steer_required, lkas_hud, dashed_lanes):
+ commands = []
+
+ lkas_hud_values = {
+ 'LKAS_READY': 1,
+ 'LKAS_STATE_CHANGE': 1,
+ 'STEERING_REQUIRED': alert_steer_required,
+ 'SOLID_LANES': lat_active,
+ 'DASHED_LANES': dashed_lanes,
+ 'BEEP': 0,
+ }
+
+ if CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD):
+ lkas_hud_values['LANE_LINES'] = 3
+ lkas_hud_values['DASHED_LANES'] = lat_active
+
+ # car likely needs to see LKAS_PROBLEM fall within a specific time frame, so forward from camera
+ # TODO: needed for Bosch CAN FD?
+ if CP.carFingerprint in HONDA_BOSCH_RADARLESS:
+ lkas_hud_values['LKAS_PROBLEM'] = lkas_hud['LKAS_PROBLEM']
+
+ if not (CP.flags & HondaFlags.BOSCH_EXT_HUD):
+ lkas_hud_values['RDM_OFF'] = 1
+ lkas_hud_values['LANE_ASSIST_BEEP_OFF'] = 1
+
+ # New HUD concept for selected Bosch cars, overwrites some of the above
+ # TODO: make global across all Honda if feedback is favorable
+ if CP.carFingerprint in HONDA_BOSCH_ALT_RADAR:
+ lkas_hud_values['DASHED_LANES'] = steering_available and lat_active
+ lkas_hud_values['SOLID_LANES'] = lat_active
+ lkas_hud_values['LKAS_PROBLEM'] = lat_active and reduced_steering
+
+ if CP.flags & HondaFlags.BOSCH_EXT_HUD and not CP.openpilotLongitudinalControl:
+ commands.append(packer.make_can_msg('LKAS_HUD_A', bus, lkas_hud_values))
+ commands.append(packer.make_can_msg('LKAS_HUD_B', bus, lkas_hud_values))
+ else:
+ commands.append(packer.make_can_msg('LKAS_HUD', bus, lkas_hud_values))
+
+ return commands
+
+
+def create_radar_hud(packer, bus):
+ radar_hud_values = {
+ 'CMBS_OFF': 0x01,
+ 'SET_TO_1': 0x01,
+ }
+
+ return packer.make_can_msg('RADAR_HUD', bus, radar_hud_values)
+
+
+def create_legacy_brake_command(packer, bus):
+ return packer.make_can_msg("LEGACY_BRAKE_COMMAND", bus, {})
+
+
+def spam_buttons_command(packer, CAN, button_val, car_fingerprint):
+ values = {
+ 'CRUISE_BUTTONS': button_val,
+ 'CRUISE_SETTING': 0,
+ }
+ # send buttons to camera on radarless (camera does ACC) cars
+ bus = CAN.camera if car_fingerprint in HONDA_BOSCH_RADARLESS else CAN.pt
+ return packer.make_can_msg("SCM_BUTTONS", bus, values)
+
+
+def honda_checksum(address: int, sig, d: bytearray) -> int:
+ s = 0
+ extended = address > 0x7FF
+ addr = address
+ while addr:
+ s += addr & 0xF
+ addr >>= 4
+ for i in range(len(d)):
+ x = d[i]
+ if i == len(d) - 1:
+ x >>= 4
+ s += (x & 0xF) + (x >> 4)
+ s = 8 - s
+ if extended:
+ s += 3
+ return s & 0xF
diff --git a/iqdbc_repo/iqdbc/car/honda/interface.py b/iqdbc_repo/iqdbc/car/honda/interface.py
new file mode 100755
index 000000000..cf24f090e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/interface.py
@@ -0,0 +1,362 @@
+#!/usr/bin/env python3
+import numpy as np
+from iqdbc.car import get_safety_config, structs, uds
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.disable_ecu import disable_ecu
+from iqdbc.car.honda.hondacan import CanBus
+from iqdbc.car.honda.values import CarControllerParams, HondaFlags, CAR, HONDA_BOSCH, HONDA_BOSCH_CANFD, \
+ HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, HondaSafetyFlags
+from iqdbc.car.honda.carcontroller import CarController
+from iqdbc.car.honda.carstate import CarState
+from iqdbc.car.honda.radar_interface import RadarInterface
+from iqdbc.car.interfaces import CarInterfaceBase
+
+from iqdbc.lvbs.car.honda.iq_values import HondaFlagsIQ, HondaSafetyFlagsIQ
+
+TransmissionType = structs.CarParams.TransmissionType
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.sport,)
+
+ @staticmethod
+ def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed):
+ if CP.carFingerprint in HONDA_BOSCH:
+ return CarControllerParams.BOSCH_ACCEL_MIN, CarControllerParams.BOSCH_ACCEL_MAX
+ elif CP_IQ.enableGasInterceptor:
+ return CarControllerParams.NIDEC_ACCEL_MIN, CarControllerParams.NIDEC_ACCEL_MAX
+ else:
+ # NIDECs don't allow acceleration near cruise_speed,
+ # so limit limits of pid to prevent windup
+ ACCEL_MAX_VALS = [CarControllerParams.NIDEC_ACCEL_MAX, 0.2]
+ ACCEL_MAX_BP = [cruise_speed - 2., cruise_speed - .2]
+ return CarControllerParams.NIDEC_ACCEL_MIN, np.interp(current_speed, ACCEL_MAX_BP, ACCEL_MAX_VALS)
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "honda"
+
+ CAN = CanBus(ret, fingerprint)
+
+ if candidate in HONDA_BOSCH:
+ cfgs = [get_safety_config(structs.CarParams.SafetyModel.hondaBosch)]
+ if candidate in HONDA_BOSCH_CANFD and CAN.pt >= 4:
+ cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput))
+ ret.safetyConfigs = cfgs
+
+ ret.radarUnavailable = True
+ # Disable the radar and let openpilot control longitudinal
+ # WARNING: THIS DISABLES AEB!
+ # If Bosch radarless, this blocks ACC messages from the camera
+ # TODO: get radar disable working on Bosch CANFD
+ ret.alphaLongitudinalAvailable = candidate not in HONDA_BOSCH_CANFD
+ ret.openpilotLongitudinalControl = alpha_long and (candidate not in HONDA_BOSCH_CANFD)
+ ret.pcmCruise = not ret.openpilotLongitudinalControl
+ else:
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hondaNidec)]
+ ret.openpilotLongitudinalControl = True
+
+ ret.pcmCruise = True
+
+ if candidate == CAR.HONDA_CRV_5G:
+ ret.enableBsm = 0x12f8bfa7 in fingerprint[CAN.radar]
+
+ # Detect Bosch cars with new HUD msgs
+ if any(0x33DA in f for f in fingerprint.values()):
+ ret.flags |= HondaFlags.BOSCH_EXT_HUD.value
+
+ if 0x184 in fingerprint[CAN.pt]:
+ ret.flags |= HondaFlags.HYBRID.value
+
+ if ret.flags & HondaFlags.ALLOW_MANUAL_TRANS and all(msg not in fingerprint[CAN.pt] for msg in (0x191, 0x1A3)):
+ # Manual transmission support for allowlisted cars only, to prevent silent fall-through on auto-detection failures
+ ret.transmissionType = TransmissionType.manual
+ elif 0x191 in fingerprint[CAN.pt] and candidate != CAR.ACURA_RDX:
+ # Traditional CVTs, gearshift position in GEARBOX_CVT
+ ret.transmissionType = TransmissionType.cvt
+ else:
+ # Traditional autos, direct-drive EVs and eCVTs, gearshift position in GEARBOX_AUTO
+ ret.transmissionType = TransmissionType.automatic
+
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0], [0]]
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
+ ret.lateralTuning.pid.kf = 0.00006 # conservative feed-forward
+ ret.steerActuatorDelay = 0.1
+
+ if candidate in HONDA_BOSCH:
+ if candidate in HONDA_BOSCH_RADARLESS:
+ ret.stopAccel = CarControllerParams.BOSCH_ACCEL_MIN # stock uses -4.0 m/s^2 once stopped but limited by safety model
+ ret.longitudinalActuatorDelay = 0.25 # s
+ else:
+ ret.longitudinalActuatorDelay = 0.5 # s
+ else:
+ # default longitudinal tuning for all hondas
+ ret.longitudinalTuning.kiBP = [0., 5., 35.]
+ ret.longitudinalTuning.kiV = [1.2, 0.8, 0.5]
+
+ # Disable control if EPS mod detected
+ for fw in car_fw:
+ if fw.ecu == "eps" and b"," in fw.fwVersion:
+ ret.dashcamOnly = True
+
+ if candidate == CAR.HONDA_CIVIC:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[1.1], [0.33]]
+
+ elif candidate in (CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL):
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]]
+ if candidate == CAR.HONDA_CIVIC_BOSCH:
+ CarControllerParams.BOSCH_GAS_LOOKUP_V = [0, 750]
+
+ elif candidate == CAR.HONDA_CIVIC_2022:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 5120], [0, 5120]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kpV = [[0, 10], [0.05, 0.5]]
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kiV = [[0, 10], [0.0125, 0.125]]
+
+ elif candidate == CAR.HONDA_ACCORD:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]]
+ if ret.transmissionType == TransmissionType.manual:
+ CarControllerParams.BOSCH_GAS_LOOKUP_BP = [-0.2, 2.0]
+
+ elif candidate == CAR.HONDA_ACCORD_11G:
+ ret.steerActuatorDelay = 0.22
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 12747], [0, 12747]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.18]]
+
+ elif candidate == CAR.ACURA_ILX:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]]
+
+ elif candidate in (CAR.HONDA_CRV, CAR.HONDA_CRV_EU):
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 1000], [0, 1000]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]]
+ ret.wheelSpeedFactor = 1.025
+
+ elif candidate == CAR.HONDA_CRV_5G:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.64], [0.192]]
+ ret.wheelSpeedFactor = 1.025
+
+ elif candidate == CAR.HONDA_CRV_HYBRID:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]]
+ ret.wheelSpeedFactor = 1.025
+
+ elif candidate == CAR.HONDA_CRV_6G:
+ ret.steerActuatorDelay = 0.15
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 5100], [0, 5100]]
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ elif candidate == CAR.HONDA_FIT:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]]
+
+ elif candidate == CAR.HONDA_FREED:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]]
+
+ elif candidate in (CAR.HONDA_HRV, CAR.HONDA_HRV_3G):
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]]
+ if candidate == CAR.HONDA_HRV:
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.025]]
+ ret.wheelSpeedFactor = 1.025
+ else:
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] # TODO: can probably use some tuning
+
+ elif candidate == CAR.ACURA_RDX:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 1000], [0, 1000]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]]
+
+ elif candidate == CAR.ACURA_RDX_3G:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4095], [0, 4095]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]]
+
+ elif candidate == CAR.HONDA_ODYSSEY:
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]]
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+
+ elif candidate == CAR.HONDA_ODYSSEY_TWN:
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]]
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 32767], [0, 32767]] # TODO: determine if there is a dead zone at the top end
+
+ elif candidate in (CAR.HONDA_PILOT, CAR.HONDA_PILOT_4G, CAR.HONDA_PASSPORT_4G, CAR.ACURA_MDX_4G_MMR):
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kpV = [[0, 10], [0.05, 0.5]]
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kiV = [[0, 10], [0.0125, 0.125]]
+
+ elif candidate == CAR.HONDA_RIDGELINE:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]]
+
+ elif candidate in (CAR.HONDA_INSIGHT, CAR.HONDA_NBOX_2G):
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]]
+
+ elif candidate == CAR.HONDA_E:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] # TODO: can probably use some tuning
+
+ elif candidate == CAR.HONDA_ODYSSEY_5G_MMR:
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3810], [0, 3810]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]]
+ ret.steerActuatorDelay = 0.15
+ CarControllerParams.BOSCH_GAS_LOOKUP_V = [0, 2000]
+ if not ret.openpilotLongitudinalControl:
+ # When using stock ACC, the radar intercepts and filters steering commands the EPS would otherwise accept
+ ret.minSteerSpeed = 70. * CV.KPH_TO_MS
+
+ elif candidate == CAR.ACURA_TLX_2G_MMR:
+ ret.steerActuatorDelay = 0.15
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]]
+ ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kpV = [[0, 10], [0.05, 0.5]]
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kiV = [[0, 10], [0.0125, 0.125]]
+
+ # TODO-IQ: remove when https://github.com/commaai/iqdbc/pull/2687 is merged
+ elif candidate == CAR.HONDA_CLARITY:
+ pass
+
+ else:
+ ret.steerActuatorDelay = 0.15
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]]
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ if candidate == CAR.HONDA_PILOT_4G:
+ CarControllerParams.BOSCH_GAS_LOOKUP_V = [0, 2200]
+
+ # These cars use alternate user brake msg (0x1BE)
+ if 0x1BE in fingerprint[CAN.pt] and candidate in (CAR.HONDA_ACCORD, CAR.HONDA_HRV_3G, CAR.ACURA_RDX_3G, *HONDA_BOSCH_CANFD):
+ ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value
+
+ if ret.flags & HondaFlags.BOSCH_ALT_BRAKE:
+ ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.ALT_BRAKE.value
+ if candidate in HONDA_NIDEC_ALT_SCM_MESSAGES:
+ ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.NIDEC_ALT.value
+ if ret.openpilotLongitudinalControl and candidate in HONDA_BOSCH:
+ ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.BOSCH_LONG.value
+ if candidate in HONDA_BOSCH_RADARLESS:
+ ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.RADARLESS.value
+ if candidate in HONDA_BOSCH_CANFD:
+ ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.BOSCH_CANFD.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
+ # conflict with PCM acc
+ ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.HONDA_CIVIC})
+ if ret.autoResumeSng:
+ ret.minEnableSpeed = -1.
+ elif candidate == CAR.HONDA_ODYSSEY_TWN:
+ ret.minEnableSpeed = 19. * CV.MPH_TO_MS
+ else:
+ ret.minEnableSpeed = 25.51 * CV.MPH_TO_MS
+
+ ret.steerLimitTimer = 0.8
+ ret.radarDelay = 0.1
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ CAN = CanBus(stock_cp, fingerprint)
+
+ for fw in car_fw:
+ if fw.ecu == "eps" and b"," in fw.fwVersion:
+ ret.flags |= HondaFlagsIQ.EPS_MODIFIED.value
+ stock_cp.dashcamOnly = False
+
+ if bool(stock_cp.flags & HondaFlags.NIDEC) and bool(stock_cp.flags & HondaFlags.HYBRID):
+ ret.flags |= HondaFlagsIQ.NIDEC_HYBRID.value
+ ret.iqSafetyFlags |= HondaSafetyFlagsIQ.NIDEC_HYBRID
+ # some hybrids use a different brake hold
+ if 0x223 in fingerprint[CAN.pt]:
+ ret.flags |= HondaFlagsIQ.HYBRID_ALT_BRAKEHOLD.value
+
+ if candidate == CAR.HONDA_CIVIC:
+ if ret.flags & HondaFlagsIQ.EPS_MODIFIED:
+ # stock request input values: 0x0000, 0x00DE, 0x014D, 0x01EF, 0x0290, 0x0377, 0x0454, 0x0610, 0x06EE
+ # stock request output values: 0x0000, 0x0917, 0x0DC5, 0x1017, 0x119F, 0x140B, 0x1680, 0x1680, 0x1680
+ # modified request output values: 0x0000, 0x0917, 0x0DC5, 0x1017, 0x119F, 0x140B, 0x1680, 0x2880, 0x3180
+ # stock filter output values: 0x009F, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108
+ # modified filter output values: 0x009F, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0400, 0x0480
+ # note: max request allowed is 4096, but request is capped at 3840 in firmware, so modifications result in 2x max
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2560, 8000], [0, 2560, 3840]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.1]]
+
+ elif candidate in (CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL):
+ if ret.flags & HondaFlagsIQ.EPS_MODIFIED:
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2564, 8000], [0, 2564, 3840]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.09]] # 2.5x Modded EPS
+
+ elif candidate == CAR.HONDA_CIVIC_2022:
+ if ret.flags & HondaFlagsIQ.EPS_MODIFIED:
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2564, 8000], [0, 2564, 3840]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.09]] # 2.5x Modded EPS
+
+ elif candidate == CAR.HONDA_ACCORD:
+ if ret.flags & HondaFlagsIQ.EPS_MODIFIED:
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.09]]
+
+ elif candidate == CAR.HONDA_CRV_5G:
+ if ret.flags & HondaFlagsIQ.EPS_MODIFIED:
+ # stock request input values: 0x0000, 0x00DB, 0x01BB, 0x0296, 0x0377, 0x0454, 0x0532, 0x0610, 0x067F
+ # stock request output values: 0x0000, 0x0500, 0x0A15, 0x0E6D, 0x1100, 0x1200, 0x129A, 0x134D, 0x1400
+ # modified request output values: 0x0000, 0x0500, 0x0A15, 0x0E6D, 0x1100, 0x1200, 0x1ACD, 0x239A, 0x2800
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2560, 10000], [0, 2560, 3840]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.21], [0.07]]
+
+ elif candidate == CAR.HONDA_CLARITY:
+ stock_cp.autoResumeSng = True
+ stock_cp.minEnableSpeed = -1
+ if ret.flags & HondaFlagsIQ.EPS_MODIFIED:
+ for fw in car_fw:
+ if fw.ecu == "eps" and b"-" not in fw.fwVersion and b"," in fw.fwVersion:
+ stock_cp.lateralTuning.pid.kf = 0.00004
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 5760, 15360], [0, 2560, 3840]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.1575], [0.05175]]
+ elif fw.ecu == "eps" and b"-" in fw.fwVersion and b"," in fw.fwVersion:
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 5760, 10240], [0, 2560, 3840]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.1]]
+ else:
+ stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2560], [0, 2560]]
+ stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.8], [0.24]]
+
+ if candidate in HONDA_BOSCH:
+ pass
+ else:
+ ret.enableGasInterceptor = 0x201 in fingerprint[CAN.pt]
+ stock_cp.pcmCruise = not ret.enableGasInterceptor
+
+ if ret.enableGasInterceptor and candidate not in HONDA_BOSCH:
+ ret.iqSafetyFlags |= HondaSafetyFlagsIQ.GAS_INTERCEPTOR
+
+ stock_cp.autoResumeSng = stock_cp.autoResumeSng or ret.enableGasInterceptor
+
+ if candidate == CAR.HONDA_CITY_7G:
+ ret.longitudinalStoppingSpeedOverride = 2.0
+ ret.stoppingDecelRateOverride = 0.3
+ else:
+ ret.longitudinalStoppingSpeedOverride = 0.5
+ ret.stoppingDecelRateOverride = 0.1
+
+ return ret
+
+ @staticmethod
+ def init(CP, CP_IQ, can_recv, can_send, communication_control=None):
+ if CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and CP.openpilotLongitudinalControl:
+ # 0x80 silences response
+ if communication_control is None:
+ communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, 0x80 | uds.CONTROL_TYPE.DISABLE_RX_DISABLE_TX,
+ uds.MESSAGE_TYPE.NORMAL_AND_NETWORK_MANAGEMENT])
+ disable_ecu(can_recv, can_send, bus=CanBus(CP).pt, addr=0x18DAB0F1, com_cont_req=communication_control)
+
+ @staticmethod
+ def deinit(CP, can_recv, can_send):
+ communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, 0x80 | uds.CONTROL_TYPE.ENABLE_RX_ENABLE_TX,
+ uds.MESSAGE_TYPE.NORMAL_AND_NETWORK_MANAGEMENT])
+ CarInterface.init(CP, can_recv, can_send, communication_control)
diff --git a/iqdbc_repo/iqdbc/car/honda/radar_interface.py b/iqdbc_repo/iqdbc/car/honda/radar_interface.py
new file mode 100755
index 000000000..6eb47073a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/radar_interface.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import RadarInterfaceBase
+from iqdbc.car.honda.values import DBC
+
+
+def _create_nidec_can_parser(car_fingerprint):
+ radar_messages = [0x400] + list(range(0x430, 0x43A)) + list(range(0x440, 0x446))
+ messages = [(m, 20) for m in radar_messages]
+ return CANParser(DBC[car_fingerprint][Bus.radar], messages, 1)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+ self.track_id = 0
+ self.radar_fault = False
+ self.radar_wrong_config = False
+ self.radar_off_can = CP.radarUnavailable
+
+ # Nidec
+ if self.radar_off_can:
+ self.rcp = None
+ else:
+ self.rcp = _create_nidec_can_parser(CP.carFingerprint)
+ self.trigger_msg = 0x445
+ self.updated_messages = set()
+
+ def update(self, can_strings):
+ # in Bosch radar and we are only steering for now, so sleep 0.05s to keep
+ # radard at 20Hz and return no points
+ if self.radar_off_can:
+ return super().update(None)
+
+ vls = self.rcp.update(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()
+
+ for ii in sorted(updated_messages):
+ cpt = self.rcp.vl[ii]
+ if ii == 0x400:
+ # check for radar faults
+ self.radar_fault = cpt['RADAR_STATE'] != 0x79
+ self.radar_wrong_config = cpt['RADAR_STATE'] == 0x69
+ elif cpt['LONG_DIST'] < 255:
+ if ii not in self.pts or cpt['NEW_TRACK']:
+ self.pts[ii] = structs.RadarData.RadarPoint()
+ self.pts[ii].trackId = self.track_id
+ self.track_id += 1
+ self.pts[ii].dRel = cpt['LONG_DIST'] # from front of car
+ self.pts[ii].yRel = -cpt['LAT_DIST'] # in car frame's y axis, left is positive
+ self.pts[ii].vRel = cpt['REL_SPEED']
+ self.pts[ii].aRel = float('nan')
+ self.pts[ii].yvRel = float('nan')
+ self.pts[ii].measured = True
+ else:
+ if ii in self.pts:
+ del self.pts[ii]
+
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+ if self.radar_fault:
+ ret.errors.radarFault = True
+ if self.radar_wrong_config:
+ ret.errors.wrongConfig = True
+
+ ret.points = list(self.pts.values())
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/honda/tests/__init__.py b/iqdbc_repo/iqdbc/car/honda/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/honda/tests/test_honda.py b/iqdbc_repo/iqdbc/car/honda/tests/test_honda.py
new file mode 100644
index 000000000..15b627ab6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/tests/test_honda.py
@@ -0,0 +1,18 @@
+import re
+
+from iqdbc.car.honda.fingerprints import FW_VERSIONS
+from iqdbc.car.honda.values import HONDA_BOSCH, HONDA_BOSCH_TJA_CONTROL
+
+HONDA_FW_VERSION_RE = br"[A-Z0-9]{5}(-|,)[A-Z0-9]{3}(-|,)[A-Z0-9]{4}(\x00){2}$"
+
+
+class TestHondaFingerprint:
+ def test_fw_version_format(self):
+ # Asserts all FW versions follow an expected format
+ for fw_by_ecu in FW_VERSIONS.values():
+ for fws in fw_by_ecu.values():
+ for fw in fws:
+ assert re.match(HONDA_FW_VERSION_RE, fw) is not None, fw
+
+ def test_tja_bosch_only(self):
+ assert set(HONDA_BOSCH_TJA_CONTROL).issubset(set(HONDA_BOSCH)), "Nidec car found in TJA control list"
diff --git a/iqdbc_repo/iqdbc/car/honda/values.py b/iqdbc_repo/iqdbc/car/honda/values.py
new file mode 100644
index 000000000..28f2d7e36
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/honda/values.py
@@ -0,0 +1,462 @@
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, structs, uds
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, SupportType
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
+
+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
+ # perform the closed loop control, and might need some
+ # to apply some more braking if we're on a downhill slope.
+ # Our controller should still keep the 2 second average above
+ # -3.5 m/s^2 as per planner limits
+ NIDEC_ACCEL_MIN = -4.0 # m/s^2
+ NIDEC_ACCEL_MAX = 1.6 # m/s^2, lower than 2.0 m/s^2 for tuning reasons
+
+ NIDEC_ACCEL_LOOKUP_BP = [-1., 0., .6]
+ NIDEC_ACCEL_LOOKUP_V = [-4.8, 0., 2.0]
+
+ NIDEC_MAX_ACCEL_V = [0.5, 2.4, 1.4, 0.6]
+ NIDEC_MAX_ACCEL_BP = [0.0, 4.0, 10., 20.]
+
+ NIDEC_GAS_MAX = 198 # 0xc6
+ NIDEC_BRAKE_MAX = 1024 // 4
+
+ BOSCH_ACCEL_MIN = -3.5 # m/s^2
+ BOSCH_ACCEL_MAX = 2.0 # m/s^2
+
+ BOSCH_GAS_LOOKUP_BP = [-0.2, 2.0] # 2m/s^2
+ BOSCH_GAS_LOOKUP_V = [0, 1600]
+
+ STEER_STEP = 1 # 100 Hz
+ STEER_DELTA_UP = 3 # min/max in 0.33s for all Honda
+ STEER_DELTA_DOWN = 3
+ STEER_GLOBAL_MIN_SPEED = 3 * CV.MPH_TO_MS
+
+ def __init__(self, CP):
+ self.STEER_MAX = CP.lateralParams.torqueBP[-1]
+ # mirror of list (assuming first item is zero) for interp of signed request
+ # values and verify that both arrays begin at zero
+ assert CP.lateralParams.torqueBP[0] == 0
+ assert CP.lateralParams.torqueV[0] == 0
+ self.STEER_LOOKUP_BP = [v * -1 for v in CP.lateralParams.torqueBP][1:][::-1] + list(CP.lateralParams.torqueBP)
+ self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV)
+
+
+class HondaSafetyFlags(IntFlag):
+ ALT_BRAKE = 1
+ BOSCH_LONG = 2
+ NIDEC_ALT = 4
+ RADARLESS = 8
+ BOSCH_CANFD = 16
+
+
+class HondaFlags(IntFlag):
+ # Detected flags
+ # Bosch models with alternate set of LKAS_HUD messages
+ BOSCH_EXT_HUD = 1
+ BOSCH_ALT_BRAKE = 2
+
+ # Static flags
+ BOSCH = 4
+ BOSCH_RADARLESS = 8
+
+ NIDEC = 16
+ NIDEC_ALT_PCM_ACCEL = 32
+ NIDEC_ALT_SCM_MESSAGES = 64
+
+ BOSCH_CANFD = 128
+
+ HAS_ALL_DOOR_STATES = 256 # Some Hondas have all door states, others only driver door
+ BOSCH_ALT_RADAR = 512
+ ALLOW_MANUAL_TRANS = 1024
+ HYBRID = 2048
+ BOSCH_TJA_CONTROL = 4096
+
+
+# Car button codes
+class CruiseButtons:
+ RES_ACCEL = 4
+ DECEL_SET = 3
+ CANCEL = 2
+ MAIN = 1
+
+
+class CruiseSettings:
+ DISTANCE = 3
+ LKAS = 1
+
+
+@dataclass
+class HondaCarDocs(CarDocs):
+ package: str = "Honda Sensing"
+
+ def init_make(self, CP: structs.CarParams):
+ if CP.flags & HondaFlags.BOSCH:
+ if CP.flags & HondaFlags.BOSCH_CANFD:
+ harness = CarHarness.bosch_c
+ elif CP.flags & HondaFlags.BOSCH_RADARLESS:
+ harness = CarHarness.bosch_b
+ else:
+ harness = CarHarness.bosch_a
+ else:
+ harness = CarHarness.nidec
+
+ self.car_parts = CarParts.common([harness])
+
+ if CP.carFingerprint in (CAR.HONDA_CLARITY,):
+ self.car_parts = CarParts.common([CarHarness.honda_clarity])
+ self.car_parts.custom_parts_url = "https://shop.retropilot.org/product/honda-clarity-proxy-board-kit"
+ self.support_type: SupportType = SupportType.COMMUNITY
+ self.support_link: str = "community"
+
+
+class Footnote(Enum):
+ CIVIC_DIESEL = CarFootnote(
+ "2019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.",
+ Column.FSR_STEERING)
+
+
+@dataclass
+class HondaBoschPlatformConfig(PlatformConfig):
+ def init(self):
+ self.flags |= HondaFlags.BOSCH
+
+
+@dataclass
+class HondaBoschCANFDPlatformConfig(HondaBoschPlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'honda_common_canfd_generated'})
+
+ def init(self):
+ super().init()
+ self.flags |= HondaFlags.BOSCH_CANFD
+
+
+@dataclass
+class HondaNidecPlatformConfig(PlatformConfig):
+ def init(self):
+ self.flags |= HondaFlags.NIDEC
+
+
+def radar_dbc_dict(pt_dict):
+ return {Bus.pt: pt_dict, Bus.radar: 'acura_ilx_2016_nidec'}
+
+
+# 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.
+# Tire stiffness factor fictitiously lower if it includes the steering column torsion effect.
+# For modeling details, see p.198-200 in "The Science of Vehicle Dynamics (2014), M. Guiggiani"
+
+
+class CAR(Platforms):
+ # Bosch Cars
+ HONDA_NBOX_2G = HondaBoschPlatformConfig(
+ [
+ HondaCarDocs("Honda N-Box 2018", "All", min_steer_speed=5.),
+ ],
+ CarSpecs(mass=890., wheelbase=2.520, steerRatio=18.64),
+ {Bus.pt: 'acura_rdx_2020_can_generated'},
+ )
+ HONDA_ACCORD = HondaBoschPlatformConfig(
+ [
+ HondaCarDocs("Honda Accord 2018-22", "All", video="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS),
+ HondaCarDocs("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS),
+ HondaCarDocs("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS),
+ ],
+ # steerRatio: 11.82 is spec end-to-end
+ CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39, tireStiffnessFactor=0.8467),
+ {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated'},
+ flags=HondaFlags.ALLOW_MANUAL_TRANS,
+ )
+ HONDA_ACCORD_11G = HondaBoschCANFDPlatformConfig(
+ [
+ HondaCarDocs("Honda Accord 2023-25", "All"),
+ HondaCarDocs("Honda Accord Hybrid 2023-25", "All"),
+ ],
+ CarSpecs(mass=3477 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.0, centerToFrontRatio=0.39),
+ )
+ HONDA_CIVIC_BOSCH = HondaBoschPlatformConfig(
+ [
+ HondaCarDocs("Honda Civic 2019-21", "All", video="https://www.youtube.com/watch?v=4Iz1Mz5LGF8",
+ footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS),
+ HondaCarDocs("Honda Civic Hatchback 2017-18", min_steer_speed=12. * CV.MPH_TO_MS),
+ HondaCarDocs("Honda Civic Hatchback 2019-21", "All", min_steer_speed=12. * CV.MPH_TO_MS),
+ ],
+ CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec
+ {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated'},
+ flags=HondaFlags.ALLOW_MANUAL_TRANS,
+ )
+ HONDA_CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig(
+ [], # don't show in docs
+ HONDA_CIVIC_BOSCH.specs,
+ {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated'},
+ )
+ HONDA_CIVIC_2022 = HondaBoschPlatformConfig(
+ [
+ HondaCarDocs("Honda Civic 2022-24", "All", video="https://youtu.be/ytiOT5lcp6Q"),
+ HondaCarDocs("Honda Civic Hybrid 2025-26", "All"),
+ HondaCarDocs("Honda Civic Hatchback 2022-24", "All", video="https://youtu.be/ytiOT5lcp6Q"),
+ HondaCarDocs("Honda Civic Hatchback Hybrid (Europe only) 2023", "All"),
+ # TODO: Confirm 2024
+ HondaCarDocs("Honda Civic Hatchback Hybrid 2025-26", "All"),
+ ],
+ HONDA_CIVIC_BOSCH.specs,
+ {Bus.pt: 'honda_bosch_radarless_generated'},
+ flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.ALLOW_MANUAL_TRANS
+ )
+ HONDA_CRV_5G = HondaBoschPlatformConfig(
+ [HondaCarDocs("Honda CR-V 2017-22", min_steer_speed=15. * CV.MPH_TO_MS)],
+ # steerRatio: 12.3 is spec end-to-end
+ CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677),
+ {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated', Bus.body: 'honda_crv_ex_2017_body_generated'},
+ flags=HondaFlags.BOSCH_ALT_BRAKE,
+ )
+ HONDA_CRV_6G = HondaBoschCANFDPlatformConfig(
+ [
+ HondaCarDocs("Honda CR-V 2023-26", "All"),
+ HondaCarDocs("Honda CR-V Hybrid 2023-26", "All"),
+ ],
+ CarSpecs(mass=1703, wheelbase=2.7, steerRatio=16.2, centerToFrontRatio=0.42),
+ )
+ HONDA_CRV_HYBRID = HondaBoschPlatformConfig(
+ [HondaCarDocs("Honda CR-V Hybrid 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)],
+ # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end
+ CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677),
+ {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated'},
+ )
+ HONDA_HRV_3G = HondaBoschPlatformConfig(
+ [HondaCarDocs("Honda HR-V 2023-25", "All")],
+ CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5),
+ {Bus.pt: 'honda_bosch_radarless_generated'},
+ flags=HondaFlags.BOSCH_RADARLESS,
+ )
+ HONDA_CITY_7G = HondaBoschPlatformConfig(
+ [HondaCarDocs("Honda City (Brazil only) 2023", "All")],
+ CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.6, steerRatio=19.0, centerToFrontRatio=0.41, minSteerSpeed=23. * CV.KPH_TO_MS),
+ {Bus.pt: 'honda_bosch_radarless_generated'},
+ flags=HondaFlags.BOSCH_RADARLESS,
+ )
+ ACURA_RDX_3G = HondaBoschPlatformConfig(
+ [HondaCarDocs("Acura RDX 2019-21", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
+ CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, 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
+ {Bus.pt: 'honda_insight_ex_2019_can_generated'},
+ )
+ HONDA_E = HondaBoschPlatformConfig(
+ [HondaCarDocs("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
+ CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82),
+ {Bus.pt: 'acura_rdx_2020_can_generated'},
+ )
+ HONDA_PILOT_4G = HondaBoschCANFDPlatformConfig(
+ [HondaCarDocs("Honda Pilot 2023-25", "All")],
+ CarSpecs(mass=4660 * CV.LB_TO_KG, wheelbase=2.89, centerToFrontRatio=0.442, steerRatio=17.5),
+ )
+ HONDA_PASSPORT_4G = HondaBoschCANFDPlatformConfig(
+ [HondaCarDocs("Honda Passport 2026", "All")],
+ CarSpecs(mass=4620 * CV.LB_TO_KG, wheelbase=2.89, centerToFrontRatio=0.442, steerRatio=18.5),
+ )
+ # mid-model refresh
+ ACURA_MDX_4G_MMR = HondaBoschCANFDPlatformConfig(
+ [HondaCarDocs("Acura MDX 2025-26", "All except Type S")],
+ CarSpecs(mass=4544 * CV.LB_TO_KG, wheelbase=2.89, centerToFrontRatio=0.428, steerRatio=16.2),
+ )
+ HONDA_ODYSSEY_5G_MMR = HondaBoschPlatformConfig(
+ [HondaCarDocs("Honda Odyssey 2021-26", "All", min_steer_speed=70. * CV.KPH_TO_MS)],
+ CarSpecs(mass=4590 * CV.LB_TO_KG, wheelbase=3.00, steerRatio=19.4, centerToFrontRatio=0.41),
+ {Bus.pt: 'acura_rdx_2020_can_generated'},
+ flags=HondaFlags.BOSCH_ALT_BRAKE | HondaFlags.BOSCH_ALT_RADAR,
+ )
+ ACURA_TLX_2G = HondaBoschPlatformConfig(
+ [HondaCarDocs("Acura TLX 2021", "All")],
+ CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.87, steerRatio=14.0, centerToFrontRatio=0.43),
+ {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated'},
+ flags=HondaFlags.BOSCH_ALT_RADAR,
+ )
+ # mid-model refresh
+ ACURA_TLX_2G_MMR = HondaBoschCANFDPlatformConfig(
+ [HondaCarDocs("Acura TLX 2025", "All")],
+ CarSpecs(mass=3990 * CV.LB_TO_KG, wheelbase=2.87, centerToFrontRatio=0.43, steerRatio=13.7),
+ )
+
+ # Nidec Cars
+ ACURA_ILX = HondaNidecPlatformConfig(
+ [
+ HondaCarDocs("Acura ILX 2016-18", "Technology Plus Package or AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS),
+ HondaCarDocs("Acura ILX 2019", "All", min_steer_speed=25. * CV.MPH_TO_MS),
+ ],
+ CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end
+ radar_dbc_dict('acura_ilx_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_CRV = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)],
+ CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec
+ radar_dbc_dict('honda_crv_touring_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_CRV_EU = HondaNidecPlatformConfig(
+ [], # Euro version of CRV Touring, don't show in docs
+ HONDA_CRV.specs,
+ radar_dbc_dict('honda_crv_touring_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_FIT = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)],
+ CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75),
+ radar_dbc_dict('acura_ilx_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
+ )
+ HONDA_FREED = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)],
+ CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT
+ radar_dbc_dict('acura_ilx_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
+ )
+ HONDA_HRV = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)],
+ HONDA_HRV_3G.specs,
+ radar_dbc_dict('acura_ilx_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
+ )
+ HONDA_ODYSSEY = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Odyssey 2018-20")],
+ CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82),
+ radar_dbc_dict('honda_odyssey_exl_2018_generated'),
+ flags=HondaFlags.NIDEC_ALT_PCM_ACCEL | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_ODYSSEY_TWN = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Odyssey (Taiwan) 2018-19")],
+ CarSpecs(mass=1865, wheelbase=2.9, steerRatio=14.35, centerToFrontRatio=0.44, tireStiffnessFactor=0.82),
+ radar_dbc_dict('honda_odyssey_twn_2018_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
+ )
+ ACURA_RDX = HondaNidecPlatformConfig(
+ [HondaCarDocs("Acura RDX 2016-18", "AcuraWatch Plus or Advance Package", min_steer_speed=12. * CV.MPH_TO_MS)],
+ CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec
+ radar_dbc_dict('acura_rdx_2018_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_PILOT = HondaNidecPlatformConfig(
+ [
+ HondaCarDocs("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS),
+ HondaCarDocs("Honda Passport 2019-25", "All", min_steer_speed=12. * CV.MPH_TO_MS),
+ ],
+ HONDA_PILOT_4G.specs,
+ radar_dbc_dict('acura_ilx_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_RIDGELINE = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Ridgeline 2017-25", min_steer_speed=12. * CV.MPH_TO_MS)],
+ CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec
+ radar_dbc_dict('acura_ilx_2016_can_generated'),
+ flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+ HONDA_CIVIC = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video="https://youtu.be/-IkImTe1NYE")],
+ CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec
+ radar_dbc_dict('honda_civic_touring_2016_can_generated'),
+ flags=HondaFlags.HAS_ALL_DOOR_STATES
+ )
+
+ # port extensions
+ HONDA_CLARITY = HondaNidecPlatformConfig(
+ [HondaCarDocs("Honda Clarity 2018-21", min_steer_speed=12. * CV.MPH_TO_MS)],
+ CarSpecs(mass=1834, wheelbase=2.75, centerToFrontRatio=0.4, steerRatio=16.5),
+ radar_dbc_dict('honda_clarity_hybrid_2018_can_generated'),
+ flags=HondaFlags.HAS_ALL_DOOR_STATES,
+ )
+
+
+HONDA_NIDEC_ALT_PCM_ACCEL = CAR.with_flags(HondaFlags.NIDEC_ALT_PCM_ACCEL)
+HONDA_NIDEC_ALT_SCM_MESSAGES = CAR.with_flags(HondaFlags.NIDEC_ALT_SCM_MESSAGES)
+HONDA_BOSCH = CAR.with_flags(HondaFlags.BOSCH)
+HONDA_BOSCH_RADARLESS = CAR.with_flags(HondaFlags.BOSCH_RADARLESS)
+HONDA_BOSCH_CANFD = CAR.with_flags(HondaFlags.BOSCH_CANFD)
+HONDA_BOSCH_ALT_RADAR = CAR.with_flags(HondaFlags.BOSCH_ALT_RADAR)
+HONDA_BOSCH_TJA_CONTROL = CAR.with_flags(HondaFlags.BOSCH_TJA_CONTROL)
+
+
+DBC = CAR.create_dbc_map()
+
+
+STEER_THRESHOLD = {
+ # default is 1200, overrides go here
+ CAR.ACURA_RDX: 400,
+ CAR.HONDA_CRV_EU: 400,
+ CAR.HONDA_ACCORD_11G: 600,
+ CAR.HONDA_PILOT_4G: 600,
+ CAR.HONDA_PASSPORT_4G: 600,
+ CAR.ACURA_MDX_4G_MMR: 600,
+ CAR.HONDA_CRV_6G: 600,
+ CAR.HONDA_CITY_7G: 600,
+ CAR.HONDA_NBOX_2G: 600,
+}
+
+
+HONDA_ALT_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(0xF112)
+HONDA_ALT_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(0xF112)
+
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ # Currently used to fingerprint
+ Request(
+ [StdQueries.UDS_VERSION_REQUEST],
+ [StdQueries.UDS_VERSION_RESPONSE],
+ bus=1,
+ ),
+
+ # Data collection requests:
+ # Log manufacturer-specific identifier for current ECUs
+ Request(
+ [HONDA_ALT_VERSION_REQUEST],
+ [HONDA_ALT_VERSION_RESPONSE],
+ bus=1,
+ logging=True,
+ ),
+ # Nidec PT bus
+ Request(
+ [StdQueries.UDS_VERSION_REQUEST],
+ [StdQueries.UDS_VERSION_RESPONSE],
+ bus=0,
+ ),
+ # Bosch PT bus
+ Request(
+ [StdQueries.UDS_VERSION_REQUEST],
+ [StdQueries.UDS_VERSION_RESPONSE],
+ bus=1,
+ obd_multiplexing=False,
+ ),
+ ],
+ # We lose these ECUs without the comma power on these cars.
+ # 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_E, *HONDA_BOSCH_ALT_RADAR, *HONDA_BOSCH_RADARLESS, *HONDA_BOSCH_CANFD],
+ Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID,
+ CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_NBOX_2G, *HONDA_BOSCH_ALT_RADAR, *HONDA_BOSCH_RADARLESS, *HONDA_BOSCH_CANFD],
+ },
+ extra_ecus=[
+ (Ecu.combinationMeter, 0x18da60f1, None),
+ (Ecu.programmedFuelInjection, 0x18da10f1, None),
+ # The only other ECU on PT bus accessible by camera on radarless Civic
+ # This is likely a manufacturer-specific sub-address implementation: the camera responds to this and 0x18dab0f1
+ # Unclear what the part number refers to: 8S103 is 'Camera Set Mono', while 36160 is 'Camera Monocular - Honda'
+ # TODO: add query back, camera does not support querying both in parallel and 0x18dab0f1 often fails to respond
+ # (Ecu.unknown, 0x18DAB3F1, None),
+ ],
+)
diff --git a/iqdbc_repo/iqdbc/car/hyundai/__init__.py b/iqdbc_repo/iqdbc/car/hyundai/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py b/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py
new file mode 100644
index 000000000..4368cbf1b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py
@@ -0,0 +1,788 @@
+import numpy as np
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, DT_CTRL, make_tester_present_msg, structs
+from iqdbc.car.lateral import apply_driver_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.hyundai import hyundaicanfd, hyundaican
+from iqdbc.car.hyundai.carstate import CarState
+from iqdbc.car.hyundai.hyundaicanfd import CanBus
+from iqdbc.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CAR, CAN_GEARS, HyundaiExtFlags
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.vehicle_model import VehicleModel
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+LongCtrlState = structs.CarControl.Actuators.LongControlState
+
+
+from openpilot.common.params import Params
+
+# EPS faults if you apply torque while the steering angle is above 90 degrees for more than 1 second
+# All slightly below EPS thresholds to avoid fault
+MAX_ANGLE = 85
+MAX_ANGLE_FRAMES = 89
+MAX_ANGLE_CONSECUTIVE_FRAMES = 2
+DRIVER_TORQUE_FILTER_TAU = 0.12
+PRE_OVERRIDE_PREDICTION_TIME = 0.15
+PRE_OVERRIDE_START_RATIO = 0.90
+PRE_OVERRIDE_FULL_RATIO = 1.05
+PRE_OVERRIDE_RAW_MIN_RATIO = 0.70
+PRE_OVERRIDE_FILTERED_MIN_RATIO = 0.65
+PRE_OVERRIDE_MIN_RATE_RATIO = 0.50
+PRE_OVERRIDE_CONFIRM_FRAMES = 2
+PRE_OVERRIDE_MAX_TORQUE_DELTA = -10.0
+LOW_SPEED_ANGLE_RATE_RAMP_SPEED = 15.0 * CV.KPH_TO_MS
+MID_SPEED_ANGLE_RATE_LIMIT_SPEED = 40.0 * CV.KPH_TO_MS
+
+vibrate_intervals = [
+ (0.0, 0.5),
+ (1.0, 1.5),
+ #(2.5, 3.0),
+ #(3.5, 4.0),
+ (5.0, 5.5),
+ (6.0, 6.5),
+ (7.5, 8.0),
+]
+
+def process_hud_alert(enabled, fingerprint, hud_control):
+ sys_warning = (hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw))
+
+ # initialize to no line visible
+ # TODO: this is not accurate for all cars
+ sys_state = 1
+ if hud_control.leftLaneVisible and hud_control.rightLaneVisible or sys_warning: # HUD alert only display when LKAS status is active
+ sys_state = 3 if enabled or sys_warning else 4
+ elif hud_control.leftLaneVisible:
+ sys_state = 5
+ elif hud_control.rightLaneVisible:
+ sys_state = 6
+
+ # initialize to no warnings
+ left_lane_warning = 0
+ right_lane_warning = 0
+ if hud_control.leftLaneDepart:
+ left_lane_warning = 1 if fingerprint in (CAR.GENESIS_G90, CAR.GENESIS_G80) else 2
+ if hud_control.rightLaneDepart:
+ right_lane_warning = 1 if fingerprint in (CAR.GENESIS_G90, CAR.GENESIS_G80) else 2
+
+ return sys_warning, sys_state, left_lane_warning, right_lane_warning
+
+def rate_limit(x, x_last, lo, hi):
+ return float(np.clip(x, x_last + lo, x_last + hi))
+
+def apply_steer_angle_limits_physics(desired_sw_deg: float,
+ last_sw_deg: float,
+ v_ego: float,
+ steering_sw_deg: float,
+ lat_active: bool,
+ wheelbase_m: float,
+ steer_ratio: float,
+ steer_sw_max_deg: float,
+ model_v2=None) -> float:
+ max_lat_accel = 8.5 # m/s^2
+ max_lat_jerk = 4.0 # m/s^3
+ y_std_1s = 0.1
+ if model_v2 is not None and len(model_v2.position.yStd) > 10:
+ model_y_std_1s = float(model_v2.position.yStd[10])
+ if np.isfinite(model_y_std_1s) and model_y_std_1s >= 0.0:
+ y_std_1s = model_y_std_1s
+ max_sw_rate_deg_per_tick = float(np.interp(y_std_1s, [0.1, 0.2, 0.4], [2.0, 1.5, 0.8]))
+ v = max(float(v_ego), 1.0)
+
+ target_sw = float(np.clip(desired_sw_deg, -steer_sw_max_deg, steer_sw_max_deg))
+ if v_ego < MID_SPEED_ANGLE_RATE_LIMIT_SPEED:
+ # Keep low/mid-speed angle commands quieter without reducing LKAS_ANGLE_MAX_TORQUE.
+ # Allow the angle, but slow the arrival: 0~15 kph ramps 0.8->1.1 deg/tick,
+ # then 15~40 kph tapers 1.1->0.8 deg/tick. Above 40 kph, physics limits take over.
+ low_mid_speed_cap = float(np.interp(v_ego,
+ [0.0, LOW_SPEED_ANGLE_RATE_RAMP_SPEED, MID_SPEED_ANGLE_RATE_LIMIT_SPEED],
+ [0.8, 1.1, 0.8]))
+ max_sw_rate_deg_per_tick = min(max_sw_rate_deg_per_tick, low_mid_speed_cap)
+
+ target_rw = target_sw / steer_ratio
+ last_rw = float(last_sw_deg) / steer_ratio
+
+ # --- accel limit ---
+ rw_max_rad = np.arctan((max_lat_accel * wheelbase_m) / (v * v))
+ rw_max = float(np.degrees(rw_max_rad))
+
+ # --- jerk -> rate limit ---
+ sec2 = 1.2
+ max_drw_dt = (max_lat_jerk * wheelbase_m) / (v * v * sec2) # rad/s
+ max_drw_per_tick = max_drw_dt * DT_CTRL # rad/tick
+ max_drw_per_tick_deg = float(np.degrees(max_drw_per_tick))
+
+ err = abs(target_sw - last_sw_deg)
+ if err > 20.0:
+ max_sw_rate_deg_per_tick = min(max_sw_rate_deg_per_tick, 1.0)
+
+ max_drw_per_tick_deg = min(
+ max_drw_per_tick_deg,
+ max_sw_rate_deg_per_tick / steer_ratio
+ )
+
+ # --- rate limit ---
+ cmd_rw = rate_limit(target_rw, last_rw, -max_drw_per_tick_deg, max_drw_per_tick_deg)
+
+ # --- accel clip ---
+ cmd_rw = float(np.clip(cmd_rw, -rw_max, rw_max))
+
+ if not lat_active:
+ cmd_rw = float(steering_sw_deg) / steer_ratio
+
+ cmd_sw = cmd_rw * steer_ratio
+ return float(np.clip(cmd_sw, -steer_sw_max_deg, steer_sw_max_deg))
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ=None):
+ super().__init__(dbc_names, CP, CP_IQ or structs.IQCarParams())
+ self.CAN = CanBus(CP)
+ self.params = CarControllerParams(CP)
+ self.packer = CANPacker(dbc_names[Bus.pt])
+ self.angle_limit_counter = 0
+
+ self.accel_last = 0
+ self.apply_torque_last = 0
+ self.car_fingerprint = CP.carFingerprint
+ self.last_button_frame = 0
+
+ self.hyundai_jerk = HyundaiJerk()
+ self.speedCameraHapticEndFrame = 0
+ self.hapticFeedbackWhenSpeedCamera = 0
+ self.max_angle_frames = MAX_ANGLE_FRAMES
+ self.blinking_signal = False # 1Hz
+ self.blinking_frame = int(1.0 / DT_CTRL)
+ self.soft_hold_mode = 2
+
+ self.activateCruise = 0
+ self.button_wait = 12
+ self.cruise_buttons_msg_values = None
+ self.cruise_buttons_msg_cnt = 0
+ self.button_spamming_count = 0
+ self.prev_clu_speed = 0
+ self.button_spam1 = 8
+ self.button_spam2 = 30
+ self.button_spam3 = 1
+
+ self.apply_angle_last = 0
+ self.lkas_max_torque = 0
+ self.angle_max_torque = 250
+ self.steering_pressed_prev = False
+ self.recovering_from_override = False
+ self.full_recovery_frames = 0
+ self.repeated_override_count = 0
+ self.override_latched = False
+ self.override_release_frames = 0
+ self.driver_torque_filtered = 0.0
+ self.driver_torque_filtered_prev = 0.0
+ self.pre_override_frames = 0
+
+ self.lkas11_active = False
+
+ self.canfd_debug = 0
+ self.MainMode_ACC_trigger = 0
+ self.LFA_trigger = 0
+
+ self.activeCarrot = 0
+ self.camera_scc_params = Params().get_int("HyundaiCameraSCC")
+ self.is_ldws_car = Params().get_bool("IsLdwsCar")
+ self.enable_corner_radar = 0
+
+ self.steerDeltaUpOrg = self.steerDeltaUp = self.steerDeltaUpLC = self.params.STEER_DELTA_UP
+ self.steerDeltaDownOrg = self.steerDeltaDown = self.steerDeltaDownLC = self.params.STEER_DELTA_DOWN
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+
+ if self.frame % 50 == 0:
+ params = Params()
+ self.max_angle_frames = params.get_int("MaxAngleFrames")
+ steerMax = params.get_int("CustomSteerMax")
+ steerDeltaUp = params.get_int("CustomSteerDeltaUp")
+ steerDeltaDown = params.get_int("CustomSteerDeltaDown")
+ steerDeltaUpLC = params.get_int("CustomSteerDeltaUpLC")
+ steerDeltaDownLC = params.get_int("CustomSteerDeltaDownLC")
+ if steerMax > 0:
+ self.params.STEER_MAX = steerMax
+ if steerDeltaUp > 0:
+ self.steerDeltaUp = steerDeltaUp
+ #self.params.ANGLE_TORQUE_UP_RATE = steerDeltaUp
+ else:
+ self.steerDeltaUp = self.steerDeltaUpOrg
+ if steerDeltaDown > 0:
+ self.steerDeltaDown = steerDeltaDown
+ #self.params.ANGLE_TORQUE_DOWN_RATE = steerDeltaDown
+ else:
+ self.steerDeltaDown = self.steerDeltaDownOrg
+
+ if steerDeltaUpLC > 0:
+ self.steerDeltaUpLC = steerDeltaUpLC
+ else:
+ self.steerDeltaUpLC = self.steerDeltaUp
+ if steerDeltaDownLC > 0:
+ self.steerDeltaDownLC = steerDeltaDownLC
+ else:
+ self.steerDeltaDownLC = self.steerDeltaDown
+
+ self.soft_hold_mode = 1 if params.get_int("AutoCruiseControl") > 1 else 2
+ self.hapticFeedbackWhenSpeedCamera = int(params.get_int("HapticFeedbackWhenSpeedCamera"))
+
+ self.button_spam1 = params.get_int("CruiseButtonTest1")
+ self.button_spam2 = params.get_int("CruiseButtonTest2")
+ self.button_spam3 = params.get_int("CruiseButtonTest3")
+ self.speed_from_pcm = params.get_int("SpeedFromPCM")
+
+ self.canfd_debug = params.get_int("CanfdDebug")
+ self.camera_scc_params = params.get_int("HyundaiCameraSCC")
+ self.enable_corner_radar = params.get_int("EnableCornerRadar")
+
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+
+ if hud_control.modelDesire in [3,4]:
+ self.params.STEER_DELTA_UP = self.steerDeltaUpLC
+ self.params.STEER_DELTA_DOWN = self.steerDeltaDownLC
+ else:
+ self.params.STEER_DELTA_UP = self.steerDeltaUp
+ self.params.STEER_DELTA_DOWN = self.steerDeltaDown
+
+ angle_control = self.CP.flags & HyundaiFlags.ANGLE_CONTROL
+
+ # 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)
+
+ # >90 degree steering fault prevention
+ self.angle_limit_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringAngleDeg) >= MAX_ANGLE, CC.latActive,
+ self.angle_limit_counter, self.max_angle_frames,
+ MAX_ANGLE_CONSECUTIVE_FRAMES)
+
+ #apply_angle = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw,
+ # CS.out.steeringAngleDeg, CC.latActive, self.params.ANGLE_LIMITS)
+
+ apply_angle = apply_steer_angle_limits_physics(
+ actuators.steeringAngleDeg,
+ self.apply_angle_last,
+ CS.out.vEgoRaw,
+ CS.out.steeringAngleDeg,
+ CC.latActive,
+ self.CP.wheelbase,
+ self.CP.steerRatio,
+ self.params.ANGLE_LIMITS.STEER_ANGLE_MAX,
+ CS.modelV2,
+ )
+
+
+ if angle_control:
+ apply_steer_req = CC.latActive
+
+ angle_torque_cap = self.angle_max_torque
+
+ steering_pressed_rising = CS.out.steeringPressed and not self.steering_pressed_prev
+ if steering_pressed_rising:
+ if 0 < self.full_recovery_frames < int(5.0 / DT_CTRL):
+ self.repeated_override_count = min(self.repeated_override_count + 1, 3)
+ self.full_recovery_frames = 0
+ self.recovering_from_override = True
+
+ torque_threshold = max(self.params.STEER_THRESHOLD, 1.0)
+ # Filter signed torque so alternating sensor noise cancels out before its
+ # magnitude is used for pre-override prediction.
+ driver_torque = float(CS.out.steeringTorque)
+ driver_torque_abs = abs(driver_torque)
+ if not CC.latActive:
+ self.driver_torque_filtered = driver_torque
+ self.driver_torque_filtered_prev = driver_torque
+ self.pre_override_frames = 0
+ else:
+ torque_filter_alpha = DT_CTRL / (DRIVER_TORQUE_FILTER_TAU + DT_CTRL)
+ self.driver_torque_filtered_prev = self.driver_torque_filtered
+ self.driver_torque_filtered += torque_filter_alpha * (driver_torque - self.driver_torque_filtered)
+
+ driver_torque_filtered_abs = abs(self.driver_torque_filtered)
+ driver_torque_filtered_prev_abs = abs(self.driver_torque_filtered_prev)
+ driver_torque_rate = max(0.0, (driver_torque_filtered_abs - driver_torque_filtered_prev_abs) / DT_CTRL)
+ torque_ratio = driver_torque_filtered_abs / torque_threshold
+ raw_torque_ratio = driver_torque_abs / torque_threshold
+ predicted_torque_ratio = (
+ driver_torque_filtered_abs + driver_torque_rate * PRE_OVERRIDE_PREDICTION_TIME
+ ) / torque_threshold
+ pre_override_candidate = (
+ CC.latActive and
+ not CS.out.steeringPressed and
+ raw_torque_ratio > PRE_OVERRIDE_RAW_MIN_RATIO and
+ torque_ratio > PRE_OVERRIDE_FILTERED_MIN_RATIO and
+ predicted_torque_ratio > PRE_OVERRIDE_START_RATIO and
+ driver_torque_rate > torque_threshold * PRE_OVERRIDE_MIN_RATE_RATIO
+ )
+ self.pre_override_frames = self.pre_override_frames + 1 if pre_override_candidate else 0
+ pre_override_yield = 0.0
+ if self.pre_override_frames >= PRE_OVERRIDE_CONFIRM_FRAMES:
+ pre_override_yield = float(np.interp(
+ predicted_torque_ratio,
+ [PRE_OVERRIDE_START_RATIO, PRE_OVERRIDE_FULL_RATIO],
+ [0.0, 1.0],
+ ))
+ recovery_allowed = False
+
+ if CS.out.steeringPressed:
+ # Start yielding immediately when driver override is confirmed.
+ self.override_latched = True
+ self.override_release_frames = 0
+ torque_delta = -20.0
+ elif pre_override_yield > 0.0:
+ # Start handing off gently before steeringPressed flips to avoid a sharp torque drop.
+ torque_delta = PRE_OVERRIDE_MAX_TORQUE_DELTA * pre_override_yield
+ elif self.lkas_max_torque >= self.angle_max_torque:
+ # Once fully recovered, hold full authority until the next driver override.
+ torque_delta = 0.0
+ elif self.override_latched:
+ # Hold reduced authority until driver torque stays below 60% for 0.2 seconds.
+ self.override_release_frames = self.override_release_frames + 1 if torque_ratio < 0.6 else 0
+ if self.override_release_frames >= int(0.2 / DT_CTRL):
+ self.override_latched = False
+ self.override_release_frames = 0
+ recovery_allowed = True
+ else:
+ torque_delta = 0.0
+ else:
+ recovery_allowed = True
+
+ if recovery_allowed:
+ # Use one-second model uncertainty to set the base torque recovery time.
+ # Missing or invalid model data falls back to a moderate 1.5-second recovery.
+ y_std_1s = 0.2
+ if CS.modelV2 is not None and len(CS.modelV2.position.yStd) > 10:
+ model_y_std_1s = float(CS.modelV2.position.yStd[10])
+ if np.isfinite(model_y_std_1s) and model_y_std_1s >= 0.0:
+ y_std_1s = model_y_std_1s
+
+ recovery_time = float(np.interp(y_std_1s, [0.1, 0.2, 0.3, 0.4], [0.5, 0.8, 1.5, 3.0]))
+ recovery_time = max(recovery_time, float(np.interp(
+ self.repeated_override_count,
+ [0, 1, 2, 3],
+ [0.1, 1.0, 2.0, 3.0],
+ )))
+ base_rate_up = (self.angle_max_torque - self.params.ANGLE_MIN_TORQUE) * DT_CTRL / recovery_time
+
+ # During recovery, taper the rate to zero. Only steeringPressed can reduce authority.
+ torque_delta = base_rate_up * float(np.interp(torque_ratio, [0.6, 0.8], [1.0, 0.0]))
+ self.lkas_max_torque = float(np.clip(self.lkas_max_torque + torque_delta,
+ self.params.ANGLE_MIN_TORQUE, angle_torque_cap))
+
+ if not CS.out.steeringPressed and self.recovering_from_override and self.lkas_max_torque >= self.angle_max_torque:
+ self.recovering_from_override = False
+ self.full_recovery_frames = 1
+ elif not CS.out.steeringPressed and self.full_recovery_frames > 0:
+ self.full_recovery_frames += 1
+ if self.full_recovery_frames >= int(5.0 / DT_CTRL):
+ self.full_recovery_frames = 0
+ self.repeated_override_count = 0
+
+ if not CC.latActive:
+ apply_torque = 0
+ self.lkas_max_torque = 0
+ self.recovering_from_override = False
+ self.full_recovery_frames = 0
+ self.repeated_override_count = 0
+ self.override_latched = False
+ self.override_release_frames = 0
+ self.driver_torque_filtered = 0.0
+ self.driver_torque_filtered_prev = 0.0
+ self.pre_override_frames = 0
+
+ self.steering_pressed_prev = CS.out.steeringPressed if CC.latActive else False
+
+ self.apply_angle_last = apply_angle
+
+ # 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
+
+ # accel + longitudinal
+ accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX))
+ stopping = actuators.longControlState == LongCtrlState.stopping
+ set_speed_in_units = hud_control.setSpeed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH)
+
+ # HUD messages
+ sys_warning, sys_state, left_lane_warning, right_lane_warning = process_hud_alert(CC.enabled, self.car_fingerprint,
+ hud_control)
+
+ active_speed_decel = hud_control.activeCarrot == 3 and self.activeCarrot != 3 # 3: Speed Decel
+ self.activeCarrot = hud_control.activeCarrot
+ if active_speed_decel and self.speedCameraHapticEndFrame < 0: # 과속카메라 감속시작
+ self.speedCameraHapticEndFrame = self.frame + (8.0 / DT_CTRL) #8초간 켜줌.
+ elif not active_speed_decel:
+ self.speedCameraHapticEndFrame = -1
+
+ if 0 <= self.speedCameraHapticEndFrame - self.frame < int(8.0 / DT_CTRL) and self.hapticFeedbackWhenSpeedCamera > 0:
+ t = (self.frame - (self.speedCameraHapticEndFrame - int(8.0 / DT_CTRL))) * DT_CTRL
+
+ for start, end in vibrate_intervals:
+ if start <= t < end:
+ left_lane_warning = right_lane_warning = self.hapticFeedbackWhenSpeedCamera
+ break
+
+ if self.frame >= self.speedCameraHapticEndFrame:
+ self.speedCameraHapticEndFrame = -1
+
+ if self.frame % self.blinking_frame == 0:
+ self.blinking_signal = True
+ elif self.frame % self.blinking_frame == self.blinking_frame / 2:
+ self.blinking_signal = False
+
+
+
+ can_sends = []
+
+ # *** common hyundai stuff ***
+
+ # 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_HDA2.value:
+ addr, bus = 0x730, self.CAN.ECAN
+ can_sends.append(make_tester_present_msg(addr, bus, suppress_response=True))
+
+ # for blinkers
+ if self.CP.flags & HyundaiFlags.ENABLE_BLINKERS:
+ can_sends.append(make_tester_present_msg(0x7b1, self.CAN.ECAN, suppress_response=True))
+
+ camera_scc = self.CP.flags & HyundaiFlags.CAMERA_SCC
+ # CAN-FD platforms
+ if self.CP.flags & HyundaiFlags.CANFD:
+ hda2 = self.CP.flags & HyundaiFlags.CANFD_HDA2
+ hda2_long = hda2 and self.CP.openpilotLongitudinalControl
+ # steering control
+ if camera_scc:
+ can_sends.extend(hyundaicanfd.create_steering_messages_camera_scc(self.frame, self.packer, self.CP, self.CAN, CC, apply_steer_req, apply_torque, CS, apply_angle, self.lkas_max_torque, angle_control))
+ else:
+ can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_torque, apply_angle, self.lkas_max_torque, angle_control))
+
+ # prevent LFA from activating on HDA2 by sending "no lane lines detected" to ADAS ECU
+ if self.frame % 5 == 0 and hda2 and not camera_scc:
+ can_sends.extend(hyundaicanfd.create_suppress_lfa(self.packer, self.CAN, CS))
+
+ # LFA and HDA icons
+ if self.frame % 5 == 0 and (not hda2 or hda2_long or camera_scc):
+ can_sends.extend(hyundaicanfd.create_lfahda_cluster(self.packer, CS, self.CAN, CC.longActive, CC.latActive))
+ if not camera_scc:
+ can_sends.extend(hyundaicanfd.create_lfa_icon_non_camera_scc(self.packer, CS, self.CAN, CC))
+
+ # 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.camera_scc_params in [2, 3]:
+ self.canfd_toggle_adas(CC, CS)
+ if self.CP.openpilotLongitudinalControl:
+ self.hyundai_jerk.make_jerk(self.CP, CS, accel, actuators, hud_control)
+ self.hyundai_jerk.check_carrot_cruise(CC, CS, hud_control, stopping, accel, actuators.aTarget)
+
+ if True: #not camera_scc:
+ can_sends.extend(hyundaicanfd.create_ccnc_messages(self.CP, self.packer, self.CAN, self.frame, CC, CS, hud_control, apply_angle, left_lane_warning, right_lane_warning, self.enable_corner_radar, stopping, self.canfd_debug))
+ if hda2:
+ can_sends.extend(hyundaicanfd.create_adrv_messages(self.CP, self.packer, self.CAN, self.frame))
+ else:
+ can_sends.extend(hyundaicanfd.create_fca_warning_light(self.CP, self.packer, self.CAN, self.frame))
+ if self.frame % 2 == 0:
+ if self.CP.flags & HyundaiFlags.CAMERA_SCC.value:
+ msg = hyundaicanfd.create_acc_control_scc2(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override,
+ set_speed_in_units, hud_control, self.hyundai_jerk, CS)
+ if msg is not None:
+ can_sends.append(msg)
+ can_sends.extend(hyundaicanfd.create_tcs_messages(self.packer, self.CAN, CS)) # for sorento SCC radar...
+ else:
+ can_sends.append(hyundaicanfd.create_acc_control(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override,
+ set_speed_in_units, hud_control, self.hyundai_jerk.jerk_u, self.hyundai_jerk.jerk_l, CS))
+ self.accel_last = accel
+ else:
+ # button presses
+ if self.camera_scc_params == 3: # camera scc but stock long
+ send_button = self.make_spam_button(CC, CS)
+ can_sends.extend(hyundaicanfd.forward_button_message(self.packer, self.CAN, self.frame, CS, send_button, self.MainMode_ACC_trigger, self.LFA_trigger))
+ else:
+ can_sends.extend(self.create_button_messages(CC, CS, use_clu11=False))
+ else:
+ if CS.lkas11 is not None:
+ if self.lkas11_active:
+ can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_torque, 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, self.is_ldws_car))
+ self.lkas11_active = True
+
+ if not self.CP.openpilotLongitudinalControl:
+ can_sends.extend(self.create_button_messages(CC, CS, use_clu11=True))
+ if self.CP.carFingerprint in CAN_GEARS["send_mdps12"] and CS.mdps12 is not None: # send mdps12 to LKAS to prevent LKAS error
+ can_sends.append(hyundaican.create_mdps12(self.packer, self.frame, CS.mdps12))
+
+ casper_ev = self.CP.carFingerprint == CAR.HYUNDAI_CASPER_EV
+ if self.frame % 2 == 0 and self.CP.openpilotLongitudinalControl:
+ self.hyundai_jerk.make_jerk(self.CP, CS, accel, actuators, hud_control)
+ self.hyundai_jerk.check_carrot_cruise(CC, CS, hud_control, stopping, accel, actuators.aTarget)
+ #jerk = 3.0 if actuators.longControlState == LongCtrlState.pid else 1.0
+ use_fca = self.CP.flags & HyundaiFlags.USE_FCA.value
+ if camera_scc:
+
+ can_sends.extend(hyundaican.create_acc_commands_scc(self.packer, CC.enabled, accel, self.hyundai_jerk, int(self.frame / 2),
+ hud_control, set_speed_in_units, stopping,
+ CC.cruiseControl.override, casper_ev, CS, self.soft_hold_mode))
+ else:
+ can_sends.extend(hyundaican.create_acc_commands(self.packer, CC.enabled, accel, self.hyundai_jerk, int(self.frame / 2),
+ hud_control, set_speed_in_units, stopping,
+ CC.cruiseControl.override, use_fca, self.CP, CS, self.soft_hold_mode))
+
+
+ # 20 Hz LFA MFA message
+ if self.frame % 5 == 0 and self.CP.flags & HyundaiFlags.SEND_LFA.value:
+ can_sends.append(hyundaican.create_lfahda_mfc(self.packer, CC, self.blinking_signal))
+
+ # 5 Hz ACC options
+ if self.frame % 20 == 0 and self.CP.openpilotLongitudinalControl:
+ if camera_scc:
+ if CS.scc13 is not None:
+ if casper_ev:
+ #can_sends.append(hyundaican.create_acc_opt_copy(CS, self.packer))
+ pass
+ pass
+ else:
+ can_sends.extend(hyundaican.create_acc_opt(self.packer, self.CP))
+
+ # 2 Hz front radar options
+ if self.frame % 50 == 0 and self.CP.openpilotLongitudinalControl and not camera_scc:
+ can_sends.append(hyundaican.create_frt_radar_opt(self.packer))
+
+ new_actuators = actuators.as_builder()
+ new_actuators.torque = apply_torque / self.params.STEER_MAX
+ # torqueOutputCan reflects the steering authority value actually sent over CAN.
+ # Torque-control platforms send the signed torque command, while angle-control
+ # platforms send LKAS_ANGLE_MAX_TORQUE alongside the requested angle.
+ new_actuators.torqueOutputCan = self.lkas_max_torque if angle_control else apply_torque
+ new_actuators.steeringAngleDeg = float(apply_angle)
+ new_actuators.accel = accel
+
+ self.frame += 1
+ return new_actuators, can_sends
+
+
+ def create_button_messages(self, CC: structs.CarControl, CS: CarState, use_clu11: bool):
+ can_sends = []
+ if CS.out.brakePressed or CS.out.brakeHoldActive:
+ return can_sends
+ if use_clu11:
+ if CS.clu11 is None:
+ return can_sends
+
+ if CC.cruiseControl.cancel:
+ can_sends.append(hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.CANCEL, self.CP))
+ elif False: #CC.cruiseControl.resume:
+ # send resume at a max freq of 10Hz
+ if (self.frame - self.last_button_frame) * DT_CTRL > 0.1:
+ # send 25 messages at a time to increases the likelihood of resume being accepted
+ can_sends.extend([hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.RES_ACCEL, self.CP)] * 25)
+ if (self.frame - self.last_button_frame) * DT_CTRL >= 0.15:
+ self.last_button_frame = self.frame
+
+ if self.last_button_frame != self.frame:
+ send_button = self.make_spam_button(CC, CS)
+ if send_button > 0:
+ can_sends.append(hyundaican.create_clu11_button(self.packer, self.frame, CS.clu11, send_button, self.CP))
+
+ else:
+
+ # carrot.. 왜 alt_cruise_button는 값이 리스트일까?, 그리고 왜? 빈데이터가 들어오는것일까?
+ if CS.cruise_buttons_msg is not None and self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS:
+ try:
+ cruise_buttons_msg_values = {key: value[0] for key, value in CS.cruise_buttons_msg.items()}
+ except: # IndexError:
+ #print("IndexError....")
+ cruise_buttons_msg_values = None
+ self.cruise_buttons_msg_cnt += 1
+ if cruise_buttons_msg_values is not None:
+ self.cruise_buttons_msg_values = cruise_buttons_msg_values
+ self.cruise_buttons_msg_cnt = 0
+
+ if (self.frame - self.last_button_frame) * DT_CTRL > 0.25:
+ # cruise cancel
+ if CC.cruiseControl.cancel:
+ if (self.frame - self.last_button_frame) * DT_CTRL > 0.1:
+ print("cruiseControl.cancel222222")
+ if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS:
+ #can_sends.append(hyundaicanfd.create_acc_cancel(self.packer, self.CP, self.CAN, CS.scc_control))
+ if self.cruise_buttons_msg_values is not None:
+ can_sends.append(hyundaicanfd.alt_cruise_buttons(self.packer, self.CP, self.CAN, Buttons.CANCEL, self.cruise_buttons_msg_values, self.cruise_buttons_msg_cnt))
+
+ else:
+ for _ in range(20):
+ 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
+ elif False: #CC.cruiseControl.resume:
+ if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS:
+ # TODO: resume for alt button cars
+ 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))
+ self.last_button_frame = self.frame
+
+ ## button 스패밍을 안했을때...
+ if self.last_button_frame != self.frame:
+ dat = self.canfd_speed_control_pcm(CC, CS, self.cruise_buttons_msg_values)
+ if dat is not None:
+ for _ in range(self.button_spam3):
+ can_sends.append(dat)
+ self.cruise_buttons_msg_cnt += 1
+
+ return can_sends
+
+ def canfd_toggle_adas(self, CC, CS):
+ trigger_min = -200
+ trigger_start = 6
+ self.MainMode_ACC_trigger = max(trigger_min, self.MainMode_ACC_trigger - 1)
+ self.LFA_trigger = max(trigger_min, self.LFA_trigger - 1)
+ if self.MainMode_ACC_trigger == trigger_min and self.LFA_trigger == trigger_min:
+ if CC.enabled and not CS.MainMode_ACC and CS.out.vEgo > 3.:
+ self.MainMode_ACC_trigger = trigger_start
+ elif CC.latActive and CS.LFA_ICON == 0:
+ self.LFA_trigger = trigger_start
+
+ def canfd_speed_control_pcm(self, CC, CS, cruise_buttons_msg_values):
+
+ alt_buttons = True if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS else False
+
+ if alt_buttons and cruise_buttons_msg_values is None:
+ return None
+
+ send_button = self.make_spam_button(CC, CS)
+ if send_button > 0:
+ if alt_buttons:
+ return hyundaicanfd.alt_cruise_buttons(self.packer, self.CP, self.CAN, send_button, cruise_buttons_msg_values, self.cruise_buttons_msg_cnt)
+ else:
+ return hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, send_button)
+
+ return None
+
+
+ def make_spam_button(self, CC, CS):
+ hud_control = CC.hudControl
+ set_speed_in_units = hud_control.setSpeed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH)
+ target = int(set_speed_in_units+0.5)
+ current = int(CS.out.cruiseState.speed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH) + 0.5)
+ v_ego_kph = CS.out.vEgo * CV.MS_TO_KPH
+
+ send_button = 0
+ activate_cruise = False
+
+ if CC.enabled:
+ if not CS.out.cruiseState.enabled:
+ if (hud_control.leadVisible or v_ego_kph > 10.0) and self.activateCruise == 0:
+ send_button = Buttons.RES_ACCEL
+ self.activateCruise = 1
+ activate_cruise = True
+ elif CC.cruiseControl.resume:
+ send_button = Buttons.RES_ACCEL
+ elif target < current and current>= 31 and self.speed_from_pcm != 1:
+ send_button = Buttons.SET_DECEL
+ elif target > current and current < 160 and self.speed_from_pcm != 1:
+ send_button = Buttons.RES_ACCEL
+ elif CS.out.activateCruise: #CC.cruiseControl.activate:
+ if (hud_control.leadVisible or v_ego_kph > 10.0) and self.activateCruise == 0:
+ self.activateCruise = 1
+ send_button = Buttons.RES_ACCEL
+ activate_cruise = True
+
+ if CS.out.brakePressed or CS.out.gasPressed:
+ self.activateCruise = 0
+
+ if send_button == 0:
+ self.button_spamming_count = 0
+ self.prev_clu_speed = current
+ return 0
+
+ speed_diff = self.prev_clu_speed - current
+ spamming_max = self.button_spam1
+ if CS.cruise_buttons[-1] != Buttons.NONE:
+ self.last_button_frame = self.frame
+ self.button_wait = self.button_spam2
+ self.button_spamming_count = 0
+ elif abs(self.button_spamming_count) >= spamming_max or abs(speed_diff) > 0:
+ self.last_button_frame = self.frame
+ self.button_wait = self.button_spam2 if abs(self.button_spamming_count) >= spamming_max else 7
+ self.button_spamming_count = 0
+
+ self.prev_clu_speed = current
+ send_button_allowed = (self.frame - self.last_button_frame) > self.button_wait
+ #CC.debugTextCC = "{} speed_diff={:.1f},{:.0f}/{:.0f}, button={}, button_wait={}, count={}".format(
+ # send_button_allowed, speed_diff, target, current, send_button, self.button_wait, self.button_spamming_count)
+
+ if send_button_allowed or activate_cruise or (CC.cruiseControl.resume and self.frame % 2 == 0):
+ self.button_spamming_count = self.button_spamming_count + 1 if send_button == Buttons.RES_ACCEL else self.button_spamming_count - 1
+ return send_button
+ else:
+ self.button_spamming_count = 0
+ return 0
+
+from openpilot.common.filter_simple import MyMovingAverage
+class HyundaiJerk:
+ def __init__(self):
+ self.params = Params()
+ self.jerk = 0.0
+ self.jerk_u = self.jerk_l = 0.0
+ self.cb_upper = self.cb_lower = 0.0
+ self.jerk_u_min = 0.5
+ self.carrot_cruise = 1
+ self.carrot_cruise_accel = 0.0
+
+ def check_carrot_cruise(self, CC, CS, hud_control, stopping, accel, a_target):
+ carrot_cruise_decel = self.params.get_float("CarrotCruiseDecel")
+ carrot_cruise_atc_decel = self.params.get_float("CarrotCruiseAtcDecel")
+ if carrot_cruise_atc_decel >= 0 and 0 < hud_control.atcDistance < 500:
+ carrot_cruise_decel = max(carrot_cruise_decel, carrot_cruise_atc_decel)
+ self.carrot_cruise = 0
+ if CS.out.carrotCruise > 0 and not CC.cruiseControl.override:
+ if CS.softHoldActive == 0 and not stopping:
+ if CS.out.vEgo > 10/3.6:
+ if carrot_cruise_decel < 0:
+ if (a_target > -0.1 or accel > -0.1):
+ self.carrot_cruise = 1
+ self.carrot_cruise_accel = 0.0
+ else:
+ self.carrot_cruise = 2
+ carrot_cruise = min(accel, -carrot_cruise_decel * 0.01)
+ self.carrot_cruise_accel = max(carrot_cruise, self.carrot_cruise_accel - 1.0 * DT_CTRL) # 점진적으로 줄임.
+ if self.carrot_cruise == 0:
+ self.carrot_cruise_accel = CS.out.aEgo
+
+ def make_jerk(self, CP, CS, accel, actuators, hud_control):
+ if actuators.longControlState == LongCtrlState.stopping:
+ self.jerk = self.jerk_u_min / 2 - CS.out.aEgo
+ else:
+ jerk = actuators.jerk if actuators.longControlState == LongCtrlState.pid else 0.0
+ #a_error = actuators.aTarget - CS.out.aEgo
+ self.jerk = jerk# + a_error
+
+ jerk_max_l = 5.0
+ jerk_max_u = jerk_max_l
+ if actuators.longControlState == LongCtrlState.off:
+ self.jerk_u = jerk_max_u
+ self.jerk_l = jerk_max_l
+ self.cb_upper = self.cb_lower = 0.0
+ else:
+ if CP.flags & HyundaiFlags.CANFD:
+ # Keep deceleration authority after the MPC jerk settles to zero. Stock SCC raises the
+ # lower jerk limit with the raw acceleration request instead of relying on jerk alone.
+ jerk_l_base = 1.2
+ jerk_l_raw = np.clip(jerk_l_base + 2.0 * max(0.0, -accel - 2.8), jerk_l_base, jerk_max_l)
+ jerk_l_mpc = np.clip(-self.jerk * 4.0, jerk_l_base, jerk_max_l)
+
+ self.jerk_u = min(max(self.jerk_u_min, self.jerk * 2.0), jerk_max_u)
+ self.jerk_l = max(jerk_l_raw, jerk_l_mpc)
+ self.cb_upper = self.cb_lower = 0.0
+ else:
+ self.jerk_u = min(max(self.jerk_u_min, self.jerk * 2.0), jerk_max_u)
+ self.jerk_l = min(max(1.0, -self.jerk * 4.0), jerk_max_l)
+ self.cb_upper = np.clip(0.9 + accel * 0.2, 0, 1.2)
+ self.cb_lower = np.clip(0.8 + accel * 0.2, 0, 1.2)
diff --git a/iqdbc_repo/iqdbc/car/hyundai/carstate.py b/iqdbc_repo/iqdbc/car/hyundai/carstate.py
new file mode 100644
index 000000000..48eb597ec
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/carstate.py
@@ -0,0 +1,838 @@
+from collections import deque
+import copy
+import math
+import numpy as np
+import ast
+
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs, DT_CTRL
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.hyundai.hyundaicanfd import CanBus
+from iqdbc.car.hyundai.values import HyundaiFlags, CAR, DBC, Buttons, CarControllerParams, CAMERA_SCC_CAR, HyundaiExtFlags, \
+ EV_MODE_ACTIVE_VALUES, EV_MODE_STATUS_ADDR, EV_MODE_STATUS_DLC, EV_MODE_STATUS_MSG, \
+ EV_MODE_STATUS_SIGNAL
+from iqdbc.car.interfaces import CarStateBase
+
+from openpilot.common.params import Params
+
+from datetime import datetime
+from zoneinfo import ZoneInfo
+
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+PREV_BUTTON_SAMPLES = 8
+CLUSTER_SAMPLE_RATE = 20 # frames
+STANDSTILL_THRESHOLD = 12 * 0.03125 * CV.KPH_TO_MS
+
+BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: ButtonType.decelCruise,
+ Buttons.GAP_DIST: ButtonType.gapAdjustCruise, Buttons.CANCEL: ButtonType.cancel, Buttons.LFA_BUTTON: ButtonType.lfaButton}
+
+GearShifter = structs.CarState.GearShifter
+
+READY_COUNT_OK = 200
+TRAILER_DISCONNECT_GRACE_FRAMES = int(5.0 / DT_CTRL)
+EV_MODE_STATUS_TIMEOUT_NS = 500_000_000
+
+
+def _get_ev_mode_state(cp: CANParser) -> tuple[bool, bool]:
+ timestamps = cp.ts_nanos.get(EV_MODE_STATUS_MSG)
+ if timestamps is None:
+ return False, False
+
+ timestamp = timestamps.get(EV_MODE_STATUS_SIGNAL, 0)
+ dat = cp.dat.get(EV_MODE_STATUS_ADDR, b"")
+ # The update timestamp advances even when the whole ECAN bus is silent.
+ # last_nonempty_nanos would leave the final decoded state valid forever.
+ age = cp._last_update_nanos - timestamp
+ valid = timestamp > 0 and len(dat) == EV_MODE_STATUS_DLC and not cp.bus_timeout and 0 <= age <= EV_MODE_STATUS_TIMEOUT_NS
+ active = valid and int(cp.vl[EV_MODE_STATUS_MSG][EV_MODE_STATUS_SIGNAL]) in EV_MODE_ACTIVE_VALUES
+ return active, valid
+
+
+NUMERIC_TO_TZ = {
+ 840: "America/New_York", # 미국 (US) → 동부 시간대
+ 124: "America/Toronto", # 캐나다 (CA) → 동부 시간대
+ 250: "Europe/Paris", # 프랑스 (FR)
+ 276: "Europe/Berlin", # 독일 (DE)
+ 826: "Europe/London", # 영국 (GB)
+ 392: "Asia/Tokyo", # 일본 (JP)
+ 156: "Asia/Shanghai", # 중국 (CN)
+ 410: "Asia/Seoul", # 한국 (KR)
+ 36: "Australia/Sydney", # 호주 (AU)
+ 356: "Asia/Kolkata", # 인도 (IN)
+}
+
+class CarState(CarStateBase):
+ def __init__(self, CP, CP_IQ=None):
+ super().__init__(CP, CP_IQ or structs.IQCarParams())
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+
+ 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.gear_msg_canfd = "GEAR" if CP.extFlags & HyundaiExtFlags.CANFD_GEARS_69 else \
+ "ACCELERATOR" if CP.flags & HyundaiFlags.EV else \
+ "GEAR_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_GEARS else \
+ "GEAR_ALT_2" if CP.flags & HyundaiFlags.CANFD_ALT_GEARS_2 else \
+ "GEAR_SHIFTER"
+
+ self.use_accelerator = self.gear_msg_canfd == "ACCELERATOR"
+ if CP.flags & HyundaiFlags.CANFD:
+ self.shifter_values = can_define.dv[self.gear_msg_canfd]["GEAR"]
+ elif CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV):
+ self.shifter_values = can_define.dv["ELECT_GEAR"]["Elect_Gear_Shifter"]
+ elif self.CP.flags & HyundaiFlags.CLUSTER_GEARS:
+ 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"]
+
+ self.accelerator_msg_canfd = "ACCELERATOR" if CP.flags & HyundaiFlags.EV else \
+ "ACCELERATOR_ALT" if CP.flags & HyundaiFlags.HYBRID else \
+ "ACCELERATOR_BRAKE_ALT"
+ self.cruise_btns_msg_canfd = "CRUISE_BUTTONS_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS else \
+ "CRUISE_BUTTONS"
+ self.is_metric = False
+ self.buttons_counter = 0
+
+ # for generic CAN parsing
+ self.fca11 = None
+ self.scc11 = None
+ self.scc12 = None
+ self.scc13 = None
+ self.scc14 = None
+ self.lkas11 = None
+ self.clu11 = None
+
+ # for CANFD parsing
+ self.scc_control = None
+ self.lfa = None
+ self.lfa_alt = None
+ self.lfahda_cluster = None
+ self.adrv_0x161 = None
+ self.adrv_0x200 = None
+ self.adrv_0x1ea = None
+ self.adrv_0x160 = None
+ self.ccnc_0x162 = None
+ self.hda_info_4a3 = None
+ self.tcs = None
+ self.mdps = None
+ self.steer_touch_2af = None
+ self.cruise_buttons_msg = None
+ self.cam_0x362 = None
+ self.cam_0x2a4 = None
+ self.manual_speed_limit_assist = None
+ self.accelerator = None
+ self.blinkers = None
+ self.blinkers_alt = None
+ self.doors_seatbelts = None
+ self.cruise_buttons_alt2 = None
+
+ # On some cars, CLU15->CF_Clu_VehicleSpeed can oscillate faster than the dash updates. Sample at 5 Hz
+ self.cluster_speed = 0
+ self.cluster_speed_counter = CLUSTER_SAMPLE_RATE
+
+ self.params = CarControllerParams(CP)
+ self.op_params = Params()
+
+ self.main_enabled = True if self.op_params.get_int("AutoEngage") == 2 else False
+ self.gear_shifter = GearShifter.drive # Gear_init for Nexo ?? unknown 21.02.23.LSW
+
+ self.totalDistance = 0.0
+ self.speedLimitDistance = 0
+ self.pcmCruiseGap = 0
+
+ self.cruise_buttons_alt = True if self.CP.carFingerprint in (CAR.HYUNDAI_CASPER, CAR.HYUNDAI_CASPER_EV) else False
+ self.MainMode_ACC = False
+ self.ACCMode = 0
+ self.LFA_ICON = 0
+ self.paddle_button_prev = 0
+
+ self.lf_distance = 0
+ self.rf_distance = 0
+ self.lr_distance = 0
+ self.rr_distance = 0
+ #self.lf_lateral = 0
+ #self.rf_lateral = 0
+
+ fingerprints_str = Params().get("FingerPrints")
+ try:
+ fingerprints = ast.literal_eval(fingerprints_str) if fingerprints_str else {i: {} for i in range(8)}
+ except (SyntaxError, ValueError):
+ fingerprints = {i: {} for i in range(8)}
+ #print("fingerprints =", fingerprints)
+ ecu_disabled = False
+ if self.CP.openpilotLongitudinalControl and not (self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC):
+ ecu_disabled = True
+
+
+ self.HAS_LFA_BUTTON = True if 913 in fingerprints[0] else False
+ self.CRUISE_BUTTON_ALT = True if 1007 in fingerprints[0] else False
+
+ cam_bus = CanBus(CP).CAM
+ pt_bus = CanBus(CP).ECAN
+ alt_bus = CanBus(CP).ACAN
+ self.GEAR = True if 69 in fingerprints[pt_bus] else False
+ self.GEAR_ALT = True if 64 in fingerprints[pt_bus] else False
+ self.TPMS = True if 0x3a0 in fingerprints[pt_bus] else False
+ self.LOCAL_TIME = True if 1264 in fingerprints[pt_bus] else False
+
+ self.cp_bsm = None
+ self.time_zone = "UTC"
+
+ self.cp = None
+ self.cp_cam = None
+ self.cp_alt = None
+ self.controls_ready_count = 0
+
+ # trailer detection
+ self.trailer_connected = False
+ self.trailer_timeout_cnt = 0
+ self.trailer_connected_prev = False
+ self.trailer_status = None
+
+ def monitor_fingerprint(self, can_parsers, canfd):
+ if self.controls_ready_count <= READY_COUNT_OK:
+ if Params().get_bool("ControlsReady"):
+ self.controls_ready_count += 1
+
+ self.cp = can_parsers[Bus.pt]
+ self.cp_cam = can_parsers[Bus.cam]
+ self.cp_alt = can_parsers[Bus.alt] if Bus.alt in can_parsers else None
+
+ def add_if_seen(parser, name, ignore_counter = False):
+ msg = parser.dbc.name_to_msg.get(name)
+ if not msg:
+ print(f"{name} not in DBC")
+ return
+ if msg.address not in parser.seen_addresses:
+ return
+ if msg.address in parser.addresses:
+ return
+ parser._add_message(name, ignore_counter = ignore_counter) # ← 이름으로 등록
+
+ def add_and_cache(parser, name: str, attr: str, ignore_counter: bool = False):
+ add_if_seen(parser, name, ignore_counter)
+ if name in parser.vl: # 등록 성공했을 때만
+ setattr(self, attr, parser.vl[name])
+ return True
+ return False
+
+ if self.controls_ready_count == 50:
+ self.cp.controls_ready = self.cp_cam.controls_ready = True
+ if self.cp_alt is not None:
+ self.cp_alt.controls_ready = True
+ elif self.controls_ready_count == 100:
+ self.cp.enable_capture = self.cp_cam.enable_capture = False
+ if self.cp_alt is not None:
+ self.cp_alt.enable_capture = False
+ elif self.controls_ready_count == 101:
+ print("cp_cam.seen_addresses =", self.cp_cam.seen_addresses)
+ elif self.controls_ready_count == 102:
+ print("cp.seen_addresses =", self.cp.seen_addresses)
+ elif self.controls_ready_count == 103:
+ if self.cp_alt is not None:
+ print("cp_alt.seen_addresses =", self.cp_alt.seen_addresses)
+ else:
+ print("cp_alt.seen_addresses = None")
+ if not canfd:
+ if self.controls_ready_count == 104:
+ if not add_and_cache(self.cp_cam, "FCA11", "fca11"):
+ add_and_cache(self.cp, "FCA11", "fca11")
+ add_and_cache(self.cp_cam, "LKAS11", "lkas11")
+ add_and_cache(self.cp, "CLU11", "clu11")
+ elif self.controls_ready_count == 105:
+ cp_cruise = self.cp_cam if self.CP.flags & HyundaiFlags.CAMERA_SCC else self.cp
+ scc_messages_expected = not self.CP.openpilotLongitudinalControl or self.CP.flags & HyundaiFlags.CAMERA_SCC
+ if scc_messages_expected:
+ add_and_cache(cp_cruise, "SCC11", "scc11")
+ add_and_cache(cp_cruise, "SCC12", "scc12")
+ add_and_cache(cp_cruise, "SCC13", "scc13")
+ add_and_cache(cp_cruise, "SCC14", "scc14")
+ else: # canfd
+ if self.controls_ready_count == 120:
+ cp_cruise = self.cp_cam if self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC else self.cp
+ add_and_cache(cp_cruise, "SCC_CONTROL", "scc_control")
+ elif self.controls_ready_count == 121:
+ add_and_cache(self.cp, "TCS", "tcs")
+ add_and_cache(self.cp, "MDPS", "mdps")
+ add_and_cache(self.cp_cam, "LFA", "lfa")
+ add_and_cache(self.cp_cam, "LFA_ALT", "lfa_alt")
+ add_and_cache(self.cp_cam, "LFAHDA_CLUSTER", "lfahda_cluster")
+ elif self.controls_ready_count == 122:
+ add_and_cache(self.cp_cam, "ADRV_0x161", "adrv_0x161")
+ add_and_cache(self.cp_cam, "ADRV_0x200", "adrv_0x200")
+ add_and_cache(self.cp_cam, "ADRV_0x1ea", "adrv_0x1ea")
+ add_and_cache(self.cp_cam, "ADRV_0x160", "adrv_0x160")
+ add_and_cache(self.cp_cam, "CCNC_0x162", "ccnc_0x162")
+ elif self.controls_ready_count == 123:
+ add_and_cache(self.cp, "HDA_INFO_4A3", "hda_info_4a3")
+ add_and_cache(self.cp, "STEER_TOUCH_2AF", "steer_touch_2af")
+ elif self.controls_ready_count == 124:
+ add_and_cache(self.cp, self.cruise_btns_msg_canfd, "cruise_buttons_msg")
+ if not add_and_cache(self.cp_cam, "CAM_0x362", "cam_0x362") and self.cp_alt is not None:
+ add_and_cache(self.cp_alt, "CAM_0x362", "cam_0x362")
+ if not add_and_cache(self.cp_alt, "CAM_0x2a4", "cam_0x2a4") and self.cp_cam is not None:
+ add_and_cache(self.cp_cam, "CAM_0x2a4", "cam_0x2a4")
+ elif self.controls_ready_count == 125:
+ add_and_cache(self.cp, "MANUAL_SPEED_LIMIT_ASSIST", "manual_speed_limit_assist", ignore_counter = True)
+ if self.gear_msg_canfd == "ACCELERATOR":
+ add_and_cache(self.cp, "ACCELERATOR", "accelerator", ignore_counter = True)
+ add_and_cache(self.cp, "BLINKERS", "blinkers")
+ add_and_cache(self.cp, "BLINKERS_ALT", "blinkers_alt")
+ add_and_cache(self.cp, "DOORS_SEATBELTS", "doors_seatbelts")
+ elif self.controls_ready_count == 126:
+ add_and_cache(self.cp, "CRUISE_BUTTONS_ALT2", "cruise_buttons_alt2", ignore_counter = True)
+ add_and_cache(self.cp, "TRAILER_STATUS", "trailer_status", ignore_counter = True)
+
+
+
+
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ self.monitor_fingerprint(can_parsers, self.CP.flags & HyundaiFlags.CANFD)
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+ cp_alt = can_parsers[Bus.alt] if Bus.alt in can_parsers else None
+
+ if self.CP.flags & HyundaiFlags.CANFD:
+ return self.update_canfd(can_parsers), self.out_iq
+
+ ret = structs.CarState()
+ cp_cruise = cp_cam if self.CP.flags & HyundaiFlags.CAMERA_SCC else cp
+ self.is_metric = cp.vl["CLU11"]["CF_Clu_SPEED_UNIT"] == 0
+ speed_conv = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS
+
+ ret.doorOpen = any([cp.vl["CGW1"]["CF_Gway_DrvDrSw"], cp.vl["CGW1"]["CF_Gway_AstDrSw"],
+ cp.vl["CGW2"]["CF_Gway_RLDrSw"], cp.vl["CGW2"]["CF_Gway_RRDrSw"]])
+
+ ret.seatbeltUnlatched = cp.vl["CGW1"]["CF_Gway_DrvSeatBeltSw"] == 0
+
+ if cp.ts_nanos["EMS21"]["SCR_UREA_LEVEL"] > 0:
+ ret.ureaGauge = float(np.clip(cp.vl["EMS21"]["SCR_UREA_LEVEL"] / 100.0, 0.0, 1.0))
+
+ ret.wheelSpeeds = self.get_wheel_speeds(
+ cp.vl["WHL_SPD11"]["WHL_SPD_FL"],
+ cp.vl["WHL_SPD11"]["WHL_SPD_FR"],
+ cp.vl["WHL_SPD11"]["WHL_SPD_RL"],
+ cp.vl["WHL_SPD11"]["WHL_SPD_RR"],
+ )
+ 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.rr <= STANDSTILL_THRESHOLD
+
+ self.cluster_speed_counter += 1
+ if self.cluster_speed_counter > CLUSTER_SAMPLE_RATE:
+ self.cluster_speed = cp.vl["CLU15"]["CF_Clu_VehicleSpeed"]
+ self.cluster_speed_counter = 0
+
+ # Mimic how dash converts to imperial.
+ # Sorento is the only platform where CF_Clu_VehicleSpeed is already imperial when not is_metric
+ # TODO: CGW_USM1->CF_Gway_DrLockSoundRValue may describe this
+ if not self.is_metric and self.CP.carFingerprint not in (CAR.KIA_SORENTO,):
+ self.cluster_speed = math.floor(self.cluster_speed * CV.KPH_TO_MPH + CV.KPH_TO_MPH)
+
+ #ret.vEgoCluster = self.cluster_speed * speed_conv
+
+ ret.steeringAngleDeg = cp.vl["SAS11"]["SAS_Angle"]
+ ret.steeringRateDeg = cp.vl["SAS11"]["SAS_Speed"]
+ ret.yawRate = cp.vl["ESP12"]["YAW_RATE"]
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(
+ 50, cp.vl["CGW1"]["CF_Gway_TurnSigLh"], cp.vl["CGW1"]["CF_Gway_TurnSigRh"])
+ ret.steeringTorque = cp.vl["MDPS12"]["CR_Mdps_StrColTq"]
+ ret.steeringTorqueEps = cp.vl["MDPS12"]["CR_Mdps_OutTq"]
+ ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5)
+ ret.steerFaultTemporary = cp.vl["MDPS12"]["CF_Mdps_ToiUnavail"] != 0 or cp.vl["MDPS12"]["CF_Mdps_ToiFlt"] != 0
+
+ # cruise state
+ if self.CP.openpilotLongitudinalControl:
+ # These are not used for engage/disengage since openpilot keeps track of state using the buttons
+ ret.cruiseState.available = self.main_enabled and self.controls_ready_count >= READY_COUNT_OK #cp.vl["TCS13"]["ACCEnable"] == 0
+ ret.cruiseState.enabled = cp.vl["TCS13"]["ACC_REQ"] == 1
+ ret.cruiseState.standstill = False
+ ret.cruiseState.nonAdaptive = False
+ elif not self.CP.flags & HyundaiFlags.CC_ONLY_CAR:
+ self.main_enabled = ret.cruiseState.available = cp_cruise.vl["SCC11"]["MainMode_ACC"] == 1
+ ret.cruiseState.enabled = cp_cruise.vl["SCC12"]["ACCMode"] != 0
+ ret.cruiseState.standstill = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 4.
+ ret.cruiseState.nonAdaptive = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 2. # Shows 'Cruise Control' on dash
+ ret.cruiseState.speed = cp_cruise.vl["SCC11"]["VSetDis"] * speed_conv
+
+ ret.pcmCruiseGap = cp_cruise.vl["SCC11"]["TauGapSet"]
+
+ # TODO: Find brake pressure
+ ret.brake = 0
+ if not self.CP.flags & HyundaiFlags.CC_ONLY_CAR:
+ ret.brakePressed = cp.vl["TCS13"]["DriverOverride"] == 2 # 2 includes regen braking by user on HEV/EV
+ ret.brakeHoldActive = cp.vl["TCS15"]["AVH_LAMP"] == 2 # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY
+ ret.parkingBrake = cp.vl["TCS13"]["PBRAKE_ACT"] == 1
+ ret.espDisabled = cp.vl["TCS11"]["TCS_PAS"] == 1
+ ret.espActive = cp.vl["TCS11"]["ABS_ACT"] == 1
+ ret.accFaulted = cp.vl["TCS13"]["ACCEnable"] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED
+ ret.brakeLights = bool(cp.vl["TCS13"]["BrakeLight"] or ret.brakePressed)
+
+ 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:
+ ret.gas = cp.vl["E_EMS11"]["CR_Vcu_AccPedDep_Pos"] / 254.
+ else:
+ ret.gas = cp.vl["E_EMS11"]["Accel_Pedal_Pos"] / 254.
+ ret.gasPressed = ret.gas > 0
+ else:
+ ret.gas = cp.vl["EMS12"]["PV_AV_CAN"] / 100.
+ ret.gasPressed = bool(cp.vl["EMS16"]["CF_Ems_AclAct"])
+
+ # Gear Selection via Cluster - For those Kia/Hyundai which are not fully discovered, we can use the Cluster Indicator for Gear Selection,
+ # 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"]
+ ret.gearStep = cp.vl["ELECT_GEAR"]["Elect_Gear_Step"]
+ if self.CP.carFingerprint == CAR.HYUNDAI_CASPER_EV:
+ ret.gearStep = 0
+ 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"]
+ if self.CP.carFingerprint == CAR.KIA_K7:
+ ret.gearStep = cp.vl["LVR11"]["CF_Lvr_GearInf"]
+ elif self.CP.flags & HyundaiFlags.TCU_GEARS:
+ gear = cp.vl["TCU12"]["CUR_GR"]
+ else:
+ gear = cp.vl["LVR12"]["CF_Lvr_Gear"]
+ ret.gearStep = cp.vl["LVR11"]["CF_Lvr_GearInf"]
+
+ if not self.CP.carFingerprint in (CAR.HYUNDAI_NEXO):
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear))
+ else:
+ gear = cp.vl["ELECT_GEAR"]["Elect_Gear_Shifter"]
+ gear_disp = cp.vl["ELECT_GEAR"]
+
+ gear_shifter = GearShifter.unknown
+
+ if gear == 1546: # Thank you for Neokii # fix PolorBear 22.06.05
+ gear_shifter = GearShifter.drive
+ elif gear == 2314:
+ gear_shifter = GearShifter.neutral
+ elif gear == 2569:
+ gear_shifter = GearShifter.park
+ elif gear == 2566:
+ gear_shifter = GearShifter.reverse
+
+ if gear_shifter != GearShifter.unknown and self.gear_shifter != gear_shifter:
+ self.gear_shifter = gear_shifter
+
+ ret.gearShifter = self.gear_shifter
+
+ if not self.CP.flags & HyundaiFlags.CC_ONLY_CAR and (not self.CP.openpilotLongitudinalControl or self.CP.flags & HyundaiFlags.CAMERA_SCC):
+ aeb_src = "FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "SCC12"
+ aeb_sig = "FCA_CmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "AEB_CmdAct"
+ aeb_warning = cp_cruise.vl[aeb_src]["CF_VSM_Warn"] != 0
+ scc_warning = cp_cruise.vl["SCC12"]["TakeOverReq"] == 1 # sometimes only SCC system shows an FCW
+ aeb_braking = cp_cruise.vl[aeb_src]["CF_VSM_DecCmdAct"] != 0 or cp_cruise.vl[aeb_src][aeb_sig] != 0
+ if self.CP.carFingerprint == CAR.HYUNDAI_CASPER_EV and aeb_src == "FCA11":
+ fca_fault = cp_cruise.vl["FCA11"]["FCA_Failinfo"] != 0 or cp_cruise.vl["FCA11"]["FCA_Status"] == 3
+ if fca_fault:
+ aeb_warning = False
+ aeb_braking = False
+ ret.stockFcw = (aeb_warning or scc_warning) and not aeb_braking
+ ret.stockAeb = aeb_warning and aeb_braking
+
+ if self.CP.enableBsm:
+ ret.leftBlindspot = cp.vl["LCA11"]["CF_Lca_IndLeft"] != 0
+ ret.rightBlindspot = cp.vl["LCA11"]["CF_Lca_IndRight"] != 0
+
+ self.steer_state = cp.vl["MDPS12"]["CF_Mdps_ToiActive"] # 0 NOT ACTIVE, 1 ACTIVE
+ prev_cruise_buttons = self.cruise_buttons[-1]
+ #self.cruise_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"])
+ #carrot {{
+ #if self.CRUISE_BUTTON_ALT and cp.vl["CRUISE_BUTTON_ALT"]["SET_ME_1"] == 1:
+ # self.cruise_buttons_alt = True
+
+ cruise_button = [Buttons.NONE]
+ if self.cruise_buttons_alt:
+ lfa_button = cp.vl["CRUISE_BUTTON_LFA"]["CruiseSwLfa"]
+ cruise_button = [Buttons.LFA_BUTTON] if lfa_button > 0 else [cp.vl["CRUISE_BUTTON_ALT"]["CruiseSwState"]]
+ elif self.HAS_LFA_BUTTON and cp.vl["BCM_PO_11"]["LFA_Pressed"] == 1: # for K5
+ cruise_button = [Buttons.LFA_BUTTON]
+ else:
+ cruise_button = cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"]
+ self.cruise_buttons.extend(cruise_button)
+ # }} carrot
+ prev_main_buttons = self.main_buttons[-1]
+ #self.cruise_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"])
+ if self.cruise_buttons_alt:
+ self.main_buttons.extend(cp.vl_all["CRUISE_BUTTON_ALT"]["CruiseSwMain"])
+ else:
+ self.main_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwMain"])
+ self.mdps12 = copy.copy(cp.vl["MDPS12"])
+
+ 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})]
+
+
+ if not self.CP.flags & HyundaiFlags.CC_ONLY_CAR:
+ tpms_unit = cp.vl["TPMS11"]["UNIT"] * 0.725 if int(cp.vl["TPMS11"]["UNIT"]) > 0 else 1.
+ ret.tpms.fl = tpms_unit * cp.vl["TPMS11"]["PRESSURE_FL"]
+ ret.tpms.fr = tpms_unit * cp.vl["TPMS11"]["PRESSURE_FR"]
+ ret.tpms.rl = tpms_unit * cp.vl["TPMS11"]["PRESSURE_RL"]
+ ret.tpms.rr = tpms_unit * cp.vl["TPMS11"]["PRESSURE_RR"]
+
+ cluSpeed = cp.vl["CLU11"]["CF_Clu_Vanz"]
+ decimal = cp.vl["CLU11"]["CF_Clu_VanzDecimal"]
+ if 0. < decimal < 0.5:
+ cluSpeed += decimal
+
+ ret.vEgoCluster = cluSpeed * speed_conv
+ vEgoClu, aEgoClu = self.update_clu_speed_kf(ret.vEgoCluster)
+ ret.vCluRatio = (ret.vEgo / vEgoClu) if (vEgoClu > 3. and ret.vEgo > 3.) else 1.0
+
+ if self.CP.extFlags & HyundaiExtFlags.NAVI_CLUSTER.value:
+ speedLimit = cp.vl["Navi_HU"]["SpeedLim_Nav_Clu"]
+ speedLimitCam = cp.vl["Navi_HU"]["SpeedLim_Nav_Cam"]
+ ret.speedLimit = speedLimit if speedLimit < 255 and speedLimitCam == 1 else 0
+ speed_limit_cam = speedLimitCam == 1
+ else:
+ ret.speedLimit = 0
+ ret.speedLimitDistance = 0
+ speed_limit_cam = False
+
+ self.update_speed_limit(ret, speed_limit_cam)
+
+ if prev_main_buttons == 0 and self.main_buttons[-1] != 0:
+ self.main_enabled = not self.main_enabled
+
+ return ret, self.out_iq
+
+ def update_speed_limit(self, ret, speed_limit_cam):
+ self.totalDistance += ret.vEgo * DT_CTRL
+ if ret.speedLimit > 0 and not ret.gasPressed and speed_limit_cam:
+ if self.speedLimitDistance <= self.totalDistance:
+ self.speedLimitDistance = self.totalDistance + ret.speedLimit * 6
+ self.speedLimitDistance = max(self.totalDistance + 1, self.speedLimitDistance)
+ else:
+ self.speedLimitDistance = self.totalDistance
+ ret.speedLimitDistance = self.speedLimitDistance - self.totalDistance
+
+ def update_canfd(self, can_parsers) -> structs.CarState:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+ cp_alt = can_parsers[Bus.alt] if Bus.alt in can_parsers else None
+
+ ret = structs.CarState()
+
+ if self.CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230:
+ ret.evModeActive, ret.evModeValid = _get_ev_mode_state(cp)
+
+ self.is_metric = cp.vl["CRUISE_BUTTONS_ALT"]["DISTANCE_UNIT"] != 1
+ speed_factor = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS
+
+ if self.CP.flags & (HyundaiFlags.EV | HyundaiFlags.HYBRID):
+ offset = 255. if self.CP.flags & HyundaiFlags.EV else 1023.
+ ret.gas = cp.vl[self.accelerator_msg_canfd]["ACCELERATOR_PEDAL"] / offset if not self.use_accelerator else 0 if self.accelerator is None else self.accelerator["ACCELERATOR_PEDAL"] / offset
+ ret.gasPressed = ret.gas > 1e-5
+ else:
+ ret.gasPressed = bool(cp.vl[self.accelerator_msg_canfd]["ACCELERATOR_PEDAL_PRESSED"]) if not self.use_accelerator else False if self.accelerator is None else bool(self.accelerator["ACCELERATOR_PEDAL_PRESSED"])
+
+ ret.brakePressed = cp.vl["TCS"]["DriverBraking"] == 1
+ #print(cp.vl["TCS"], cp.vl_all["TCS"]["DriverBraking"][-10:])
+
+ if self.doors_seatbelts is not None:
+ ret.doorOpen = self.doors_seatbelts["DRIVER_DOOR"] == 1
+ ret.seatbeltUnlatched = self.doors_seatbelts["DRIVER_SEATBELT"] == 0
+
+ gear = cp.vl[self.gear_msg_canfd]["GEAR"] if not self.use_accelerator else 0 if self.accelerator is None else self.accelerator["GEAR"]
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear))
+
+ if self.TPMS:
+ tpms_unit = cp.vl["TPMS"]["UNIT"] * 0.725 if int(cp.vl["TPMS"]["UNIT"]) > 0 else 1.
+ ret.tpms.fl = tpms_unit * cp.vl["TPMS"]["PRESSURE_FL"]
+ ret.tpms.fr = tpms_unit * cp.vl["TPMS"]["PRESSURE_FR"]
+ ret.tpms.rl = tpms_unit * cp.vl["TPMS"]["PRESSURE_RL"]
+ ret.tpms.rr = tpms_unit * cp.vl["TPMS"]["PRESSURE_RR"]
+
+ # TODO: figure out positions
+ ret.wheelSpeeds = self.get_wheel_speeds(
+ 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.rr <= STANDSTILL_THRESHOLD
+
+ ret.brakeLights = ret.brakePressed or cp.vl["TCS"]["BrakeLight"] == 1 or ret.aEgo < -0.5
+
+ ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEERING_RATE"]
+
+ # steering angle deg값이 이상함. mdps값이 더 신뢰가 가는듯.. torque steering 차량도 확인해야함.
+ #ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"] * -1
+ #ret.steeringAngleDeg = cp.vl["MDPS"]["STEERING_ANGLE"] * -1
+ if self.CP.flags & HyundaiFlags.ANGLE_CONTROL:
+ ret.steeringAngleDeg = cp.vl["MDPS"]["STEERING_ANGLE_2"] * -1
+ else:
+ ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"] * -1
+
+ trailer_signal = self.trailer_status is not None and self.trailer_status["TRAILER_CONNECTED"] != 0
+ if trailer_signal:
+ # Rising edge is immediate so trailer-specific behavior is preserved.
+ self.trailer_timeout_cnt = 0
+ self.trailer_connected = True
+ elif self.trailer_connected:
+ # During ignition-off, the trailer bit can clear before the cluster shuts down.
+ # Keep suppression active through that transient, while still detecting a real
+ # disconnect after 5 seconds at the 100 Hz CarState update rate.
+ self.trailer_timeout_cnt += 1
+ if self.trailer_timeout_cnt > TRAILER_DISCONNECT_GRACE_FRAMES:
+ self.trailer_connected = False
+ else:
+ self.trailer_timeout_cnt = 0
+
+ ret.trailerConnected = self.trailer_connected
+
+ if self.trailer_connected != self.trailer_connected_prev:
+ print(f"[TRAILER_DEBUG] connected={self.trailer_connected} timeout={self.trailer_timeout_cnt}")
+ self.trailer_connected_prev = self.trailer_connected
+
+ 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)
+ ret.steerFaultTemporary = cp.vl["MDPS"]["LKA_FAULT"] != 0 or cp.vl["MDPS"]["LFA2_FAULT"] != 0
+ #ret.steerFaultTemporary = False
+
+ blinkers_info = self.blinkers if self.blinkers is not None else self.blinkers_alt if self.blinkers_alt is not None else None
+ if blinkers_info is not None:
+ left_blinker_lamp = blinkers_info["LEFT_LAMP"] or blinkers_info["LEFT_LAMP_ALT"]
+ right_blinker_lamp = blinkers_info["RIGHT_LAMP"] or blinkers_info["RIGHT_LAMP_ALT"]
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, left_blinker_lamp, right_blinker_lamp)
+
+ if self.CP.enableBsm:
+ if self.cp_bsm is None:
+ if 442 in cp.seen_addresses:
+ self.cp_bsm = cp
+ print("######## BSM in ECAN")
+ elif 442 in cp_cam.seen_addresses:
+ self.cp_bsm = cp_cam
+ print("######## BSM in CAM")
+ else:
+ bsm_info = self.cp_bsm.vl["BLINDSPOTS_REAR_CORNERS"]
+ ret.leftBlindspot = (bsm_info["FL_INDICATOR"] + bsm_info["INDICATOR_LEFT_TWO"] + bsm_info["INDICATOR_LEFT_FOUR"]) > 0
+ ret.rightBlindspot = (bsm_info["FR_INDICATOR"] + bsm_info["INDICATOR_RIGHT_TWO"] + bsm_info["INDICATOR_RIGHT_FOUR"]) > 0
+
+ # cruise state
+ if self.cruise_buttons_alt2 is not None:
+ cruise_button = self.cruise_buttons_alt2["CRUISE_BUTTONS"]
+ else:
+ cruise_button = cp.vl[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]
+ if cruise_button in [Buttons.RES_ACCEL, Buttons.SET_DECEL] and self.CP.openpilotLongitudinalControl:
+ self.main_enabled = True
+ # CAN FD cars enable on main button press, set available if no TCS faults preventing engagement
+ ret.cruiseState.available = self.main_enabled and self.controls_ready_count >= READY_COUNT_OK #cp.vl["TCS"]["ACCEnable"] == 0
+ if self.CP.flags & HyundaiFlags.CAMERA_SCC.value:
+ self.MainMode_ACC = cp_cam.vl["SCC_CONTROL"]["MainMode_ACC"] == 1
+ self.ACCMode = cp_cam.vl["SCC_CONTROL"]["ACCMode"]
+ self.LFA_ICON = cp_cam.vl["LFAHDA_CLUSTER"]["HDA_LFA_SymSta"]
+
+ if self.CP.openpilotLongitudinalControl:
+ # These are not used for engage/disengage since openpilot keeps track of state using the buttons
+ ret.cruiseState.enabled = cp.vl["TCS"]["ACC_REQ"] == 1
+ ret.cruiseState.standstill = False
+ if self.MainMode_ACC or self.main_enabled:
+ self.main_enabled = True
+ else:
+ cp_cruise_info = cp_cam if self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC else cp
+ ret.cruiseState.enabled = cp_cruise_info.vl["SCC_CONTROL"]["ACCMode"] in (1, 2)
+ if cp_cruise_info.vl["SCC_CONTROL"]["MainMode_ACC"] == 1: # carrot
+ ret.cruiseState.available = self.main_enabled = True
+ ret.pcmCruiseGap = int(np.clip(cp_cruise_info.vl["SCC_CONTROL"]["DISTANCE_SETTING"], 1, 4))
+ ret.cruiseState.standstill = cp_cruise_info.vl["SCC_CONTROL"]["InfoDisplay"] >= 4
+ ret.cruiseState.speed = cp_cruise_info.vl["SCC_CONTROL"]["VSetDis"] * speed_factor
+ ret.brakeHoldActive = cp.vl["ESP_STATUS"]["AUTO_HOLD"] == 1 and cp_cruise_info.vl["SCC_CONTROL"]["ACCMode"] not in (1, 2)
+
+ speed_limit_cam = False
+ corner = False
+ corner_infos = [info for info in (self.adrv_0x1ea, self.ccnc_0x162) if info is not None]
+ if corner_infos:
+ def corner_max(signal):
+ return max(info[signal] for info in corner_infos)
+
+ ret.leftLongDist = self.lf_distance = corner_max("LF_DETECT_DISTANCE")
+ ret.rightLongDist = self.rf_distance = corner_max("RF_DETECT_DISTANCE")
+ self.lr_distance = corner_max("LR_DETECT_DISTANCE")
+ self.rr_distance = corner_max("RR_DETECT_DISTANCE")
+ ret.leftLatDist = corner_max("LF_DETECT_LATERAL")
+ ret.rightLatDist = corner_max("RF_DETECT_LATERAL")
+ ret.leftRearLongDist = self.lr_distance
+ ret.rightRearLongDist = self.rr_distance
+ ret.leftRearLatDist = corner_max("LR_DETECT_LATERAL")
+ ret.rightRearLatDist = corner_max("RR_DETECT_LATERAL")
+ corner = True
+ if corner:
+ raw_corner_radar_enabled = (
+ self.op_params.get_int("EnableCornerRadar") > 0 and
+ bool(self.CP.extFlags & (HyundaiExtFlags.CORNER_RADAR_OBJECTS_235.value |
+ HyundaiExtFlags.CORNER_RADAR_OBJECTS_180.value))
+ )
+ left_front_block = (not raw_corner_radar_enabled) and 0 < ret.leftLongDist < 7.0
+ right_front_block = (not raw_corner_radar_enabled) and 0 < ret.rightLongDist < 7.0
+ rear_block_dist = 5.0 if raw_corner_radar_enabled else 7.0
+ left_rear_block = 0 < self.lr_distance < rear_block_dist
+ right_rear_block = 0 < self.rr_distance < rear_block_dist
+ left_block = left_front_block or left_rear_block
+ right_block = right_front_block or right_rear_block
+ if left_block:
+ ret.leftBlindspot = True
+ if right_block:
+ ret.rightBlindspot = True
+
+ if self.hda_info_4a3 is not None:
+ speedLimit = self.hda_info_4a3["SPEED_LIMIT"]
+ if not self.is_metric:
+ speedLimit *= CV.MPH_TO_KPH
+ ret.speedLimit = speedLimit if speedLimit < 255 else 0
+ if int(self.hda_info_4a3["MapSource"]) == 2:
+ speed_limit_cam = True
+
+ if self.time_zone == "UTC":
+ country_code = int(self.hda_info_4a3["CountryCode"])
+ self.time_zone = ZoneInfo(NUMERIC_TO_TZ.get(country_code, "UTC"))
+
+ ret.gearStep = cp.vl["GEAR"]["GEAR_STEP"] if self.GEAR else 0
+ if 1 <= ret.gearStep <= 8 and ret.gearShifter == GearShifter.unknown:
+ ret.gearShifter = GearShifter.drive
+ ret.gearStep = cp.vl["GEAR_ALT"]["GEAR_STEP"] if self.GEAR_ALT else ret.gearStep
+
+ lane_info = self.cam_0x2a4 if self.cam_0x2a4 is not None else self.cam_0x362
+
+ if lane_info is not None:
+ left_lane_prob = lane_info["LEFT_LANE_PROB"]
+ right_lane_prob = lane_info["RIGHT_LANE_PROB"]
+ left_lane_type = lane_info["LEFT_LANE_TYPE"] # 0: dashed, 1: solid, 2: undecided, 3: road edge, 4: DLM Inner Solid, 5: DLM InnerDashed, 6:DLM Inner Undecided, 7: Botts Dots, 8: Barrier
+ right_lane_type = lane_info["RIGHT_LANE_TYPE"]
+ left_lane_color = lane_info["LEFT_LANE_COLOR"] # 0: none, 1: white, 2: yellow, 3: blue
+ right_lane_color = lane_info["RIGHT_LANE_COLOR"]
+ left_lane_info = left_lane_color * 10 + left_lane_type
+ right_lane_info = right_lane_color * 10 + right_lane_type
+ ret.leftLaneLine = left_lane_info
+ ret.rightLaneLine = right_lane_info
+
+ # Manual Speed Limit Assist is a feature that replaces non-adaptive cruise control on EV CAN FD platforms.
+ # It limits the vehicle speed, overridable by pressing the accelerator past a certain point.
+ # The car will brake, but does not respect positive acceleration commands in this mode
+ # TODO: find this message on ICE & HYBRID cars + cruise control signals (if exists)
+ if self.CP.flags & HyundaiFlags.EV:
+ if self.manual_speed_limit_assist is not None:
+ #ret.cruiseState.nonAdaptive = cp.vl["MANUAL_SPEED_LIMIT_ASSIST"]["MSLA_ENABLED"] == 1
+ ret.cruiseState.nonAdaptive = self.manual_speed_limit_assist["MSLA_ENABLED"] == 1
+
+ if self.LOCAL_TIME and self.time_zone != "UTC":
+ lt = cp.vl["LOCAL_TIME"]
+ y, m, d, H, M, S = int(lt["YEAR"]) + 2000, int(lt["MONTH"]), int(lt["DATE"]), int(lt["HOURS"]), int(lt["MINUTES"]), int(lt["SECONDS"])
+ try:
+ dt_local = datetime(y, m, d, H, M, S, tzinfo=self.time_zone)
+ ret.datetime = int(dt_local.timestamp() * 1000)
+ except:
+ #print(f"Error parsing local time: {y}-{m}-{d} {H}:{M}:{S} in {self.time_zone}")
+ pass
+
+ prev_cruise_buttons = self.cruise_buttons[-1]
+ #self.cruise_buttons.extend(cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"])
+ #carrot {{
+
+ if self.cruise_buttons_alt2 is not None:
+ if int(self.cruise_buttons_alt2.get("LFA_BTN", 0)) == 1:
+ cruise_button = [Buttons.LFA_BUTTON]
+ else:
+ v = int(self.cruise_buttons_alt2.get("CRUISE_BUTTONS", 0))
+ cruise_button = [v if v < 5 else Buttons.NONE]
+ elif cp.vl[self.cruise_btns_msg_canfd]["LFA_BTN"]:
+ cruise_button = [Buttons.LFA_BUTTON]
+ else:
+ cruise_button = cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]
+
+ self.cruise_buttons.extend(cruise_button)
+ # }} carrot
+
+
+ #if self.cruise_btns_msg_canfd in cp.vl:
+ # self.cruise_buttons_msg = copy.copy(cp.vl[self.cruise_btns_msg_canfd])
+ """
+ if self.cruise_btns_msg_canfd in cp.vl: #carrot
+ if not cp.vl[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]:
+ pass
+ #print("empty cruise btns...")
+ else:
+ self.cruise_buttons_msg = copy.copy(cp.vl[self.cruise_btns_msg_canfd])
+ """
+ prev_main_buttons = self.main_buttons[-1]
+ #self.cruise_buttons.extend(cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"])
+ if self.cruise_buttons_alt2 is not None:
+ self.main_buttons.extend([1 if int(self.cruise_buttons_alt2.get("CRUISE_BUTTONS", 0)) == 8 else 0])
+ else:
+ adaptive_main = cp.vl_all[self.cruise_btns_msg_canfd]["ADAPTIVE_CRUISE_MAIN_BTN"]
+ normal_main = cp.vl_all[self.cruise_btns_msg_canfd]["NORMAL_CRUISE_MAIN_BTN"]
+ self.main_buttons.extend(int(adaptive or normal) for adaptive, normal in zip(adaptive_main, normal_main, strict=True))
+ if self.main_buttons[-1] != prev_main_buttons and not self.main_buttons[-1]: # and self.CP.openpilotLongitudinalControl: #carrot
+ self.main_enabled = not self.main_enabled
+ print("main_enabled = {}".format(self.main_enabled))
+ 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
+
+ speed_conv = CV.KPH_TO_MS # if self.is_metric else CV.MPH_TO_MS
+ cluSpeed = cp.vl["CRUISE_BUTTONS_ALT"]["CLU_SPEED"]
+ ret.vEgoCluster = cluSpeed * speed_conv # MPH단위에서도 KPH로 나오는듯..
+ vEgoClu, aEgoClu = self.update_clu_speed_kf(ret.vEgoCluster)
+ ret.vCluRatio = (ret.vEgo / vEgoClu) if (vEgoClu > 3. and ret.vEgo > 3.) else 1.0
+
+ self.update_speed_limit(ret, speed_limit_cam)
+
+ paddle_button = self.paddle_button_prev
+ if self.cruise_btns_msg_canfd == "CRUISE_BUTTONS":
+ paddle_button = 1 if cp.vl["CRUISE_BUTTONS"]["LEFT_PADDLE"] == 1 else 2 if cp.vl["CRUISE_BUTTONS"]["RIGHT_PADDLE"] == 1 else 0
+ elif self.gear_msg_canfd == "GEAR":
+ paddle_button = 1 if cp.vl["GEAR"]["LEFT_PADDLE"] == 1 else 2 if cp.vl["GEAR"]["RIGHT_PADDLE"] == 1 else 0
+
+ ret.buttonEvents = [*create_button_events(self.cruise_buttons[-1], prev_cruise_buttons, BUTTONS_DICT),
+ *create_button_events(paddle_button, self.paddle_button_prev, {1: ButtonType.paddleLeft, 2: ButtonType.paddleRight}),
+ *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise})]
+
+ self.paddle_button_prev = paddle_button
+
+ return ret
+
+ def get_can_parsers_canfd(self, CP, CP_IQ=None):
+ msgs = []
+ if not (CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS):
+ # TODO: this can be removed once we add dynamic support to vl_all
+ msgs += [
+ ("CRUISE_BUTTONS", 50)
+ ]
+
+ CAN = CanBus(CP)
+ pt_parser = CANParser(DBC[CP.carFingerprint][Bus.pt], msgs, CAN.ECAN)
+ if CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230:
+ # Display-only while the signal is fleet-validated: checksum and freshness
+ # gate the value without making a counter/alive fault disable controls.
+ pt_parser._add_message(EV_MODE_STATUS_MSG, math.nan, ignore_counter=True)
+
+ return {
+ Bus.pt: pt_parser,
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CAN.CAM),
+ Bus.alt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CAN.ACAN),
+ }
+
+ def get_can_parsers(self, CP, CP_IQ=None):
+ if CP.flags & HyundaiFlags.CANFD:
+ return self.get_can_parsers_canfd(CP)
+
+ return {
+ # EMS21 carries SCR_UREA_LEVEL on diesel platforms. NaN frequency makes
+ # it optional, so gasoline/EV platforms do not fail CAN validity.
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [("EMS21", math.nan)], 0),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
+ }
diff --git a/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py b/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py
new file mode 100644
index 000000000..602400202
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py
@@ -0,0 +1,1302 @@
+from iqdbc.car.structs import CarParams
+from iqdbc.car.hyundai.values import CAR
+
+Ecu = CarParams.Ecu
+
+# The existence of SCC or RDR in the fwdRadar FW usually determines the radar's function,
+# i.e. if it sends the SCC messages or if another ECU like the camera or ADAS Driving ECU does
+
+
+FW_VERSIONS = {
+ CAR.HYUNDAI_AZERA_7TH_GEN: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00GN7_ RDR ----- 1.00 1.03 99110-N1000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00GN7 MFC AT KOR LHD 1.00 1.03 99211-N1000 230322',
+ ],
+ },
+ CAR.HYUNDAI_AZERA_6TH_GEN: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00IG__ SCC F-CU- 1.00 1.00 99110-G8100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00IG MDPS C 1.00 1.02 56310G8510\x00 4IGSC103',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00IG MFC AT MES LHD 1.00 1.04 99211-G8100 200511',
+ ],
+ },
+ CAR.HYUNDAI_AZERA_HEV_6TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.00 99211-G8000 180903',
+ b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.01 99211-G8000 181109',
+ b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.02 99211-G8100 191029',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00IG MDPS C 1.00 1.00 56310M9600\x00 4IHSC100',
+ b'\xf1\x00IG MDPS C 1.00 1.01 56310M9350\x00 4IH8C101',
+ b'\xf1\x00IG MDPS C 1.00 1.02 56310M9350\x00 4IH8C102',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00IGhe SCC FHCUP 1.00 1.00 99110-M9100 ',
+ b'\xf1\x00IGhe SCC FHCUP 1.00 1.01 99110-M9000 ',
+ b'\xf1\x00IGhe SCC FHCUP 1.00 1.02 99110-M9000 ',
+ ],
+ },
+ CAR.HYUNDAI_GENESIS: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DH LKAS 1.1 -150210',
+ b'\xf1\x00DH LKAS 1.4 -140110',
+ b'\xf1\x00DH LKAS 1.5 -140425',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ',
+ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00AE MDPS C 1.00 1.03 56310/G2300 4AEHC103',
+ b'\xf1\x00AE MDPS C 1.00 1.05 56310/G2501 4AEHC105',
+ b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2301 4AEHC107',
+ b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00AEH MFC AT EUR LHD 1.00 1.00 95740-G2400 180222',
+ b'\xf1\x00AEH MFC AT EUR LHD 1.00 1.00 95740-G7200 160418',
+ b'\xf1\x00AEH MFC AT USA LHD 1.00 1.00 95740-G2400 180222',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_PHEV_2019: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ',
+ b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107',
+ b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2551 4AEHC107',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00AEP MFC AT AUS RHD 1.00 1.00 95740-G2400 180222',
+ b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2400 180222',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_PHEV: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2200 ',
+ b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2600 ',
+ b'\xf1\x00AEhe SCC F-CUP 1.00 1.02 99110-G2100 ',
+ 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/G2210 4APHC101',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2310 4APHC101',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2510 4APHC101',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2560 4APHC101',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310G2510\x00 4APHC101',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00AEP MFC AT EUR LHD 1.00 1.01 95740-G2600 190819',
+ b'\xf1\x00AEP MFC AT EUR RHD 1.00 1.01 95740-G2600 190819',
+ b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2700 201027',
+ b'\xf1\x00AEP MFC AT USA LHD 1.00 1.01 95740-G2600 190819',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_EV_2020: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00AEev SCC F-CUP 1.00 1.00 99110-G7200 ',
+ b'\xf1\x00AEev SCC F-CUP 1.00 1.00 99110-G7500 ',
+ b'\xf1\x00AEev SCC F-CUP 1.00 1.01 99110-G7000 ',
+ b'\xf1\x00AEev SCC F-CUP 1.00 1.01 99110-G7100 ',
+ b'\xf1\x00AEev SCC FHCUP 1.00 1.01 99110-G7100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G7310 4APEC101',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G7510 4APEC101',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G7560 4APEC101',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2600 190730',
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2700 201027',
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.01 95740-G2600 190819',
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.03 95740-G2500 190516',
+ b'\xf1\x00AEE MFC AT EUR RHD 1.00 1.01 95740-G2600 190819',
+ b'\xf1\x00AEE MFC AT USA LHD 1.00 1.01 95740-G2600 190819',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_EV_LTD: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00AEev SCC F-CUP 1.00 1.00 96400-G7000 ',
+ b'\xf1\x00AEev SCC F-CUP 1.00 1.00 96400-G7100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00AE MDPS C 1.00 1.02 56310G7300\x00 4AEEC102',
+ b'\xf1\x00AE MDPS C 1.00 1.03 56310/G7300 4AEEC103',
+ b'\xf1\x00AE MDPS C 1.00 1.03 56310G7300\x00 4AEEC103',
+ b'\xf1\x00AE MDPS C 1.00 1.04 56310/G7301 4AEEC104',
+ b'\xf1\x00AE MDPS C 1.00 1.04 56310/G7501 4AEEC104',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2300 170703',
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2400 180222',
+ b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G7200 160418',
+ b'\xf1\x00AEE MFC AT USA LHD 1.00 1.00 95740-G2400 180222',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_HEV_2022: {
+ (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',
+ b'\xf1\x00AE MDPS C 1.00 1.01 56310G2510\x00 4APHC101',
+ ],
+ (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: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DN8_ SCC F-CU- 1.00 1.00 99110-L0000 ',
+ b'\xf1\x00DN8_ SCC F-CUP 1.00 1.00 99110-L0000 ',
+ b'\xf1\x00DN8_ SCC F-CUP 1.00 1.02 99110-L1000 ',
+ b'\xf1\x00DN8_ SCC FHCUP 1.00 1.00 99110-L0000 ',
+ b'\xf1\x00DN8_ SCC FHCUP 1.00 1.01 99110-L1000 ',
+ b'\xf1\x00DN8_ SCC FHCUP 1.00 1.02 99110-L1000 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00DN ESC \x01 102\x19\x04\x13 58910-L1300',
+ b'\xf1\x00DN ESC \x03 100 \x08\x01 58910-L0300',
+ b'\xf1\x00DN ESC \x06 104\x19\x08\x01 58910-L0100',
+ b'\xf1\x00DN ESC \x06 106 \x07\x01 58910-L0100',
+ b'\xf1\x00DN ESC \x06 107 \x07\x03 58910-L1300',
+ b'\xf1\x00DN ESC \x06 107"\x08\x07 58910-L0100',
+ b'\xf1\x00DN ESC \x07 104\x19\x08\x01 58910-L0100',
+ b'\xf1\x00DN ESC \x07 106 \x07\x01 58910-L0100',
+ b'\xf1\x00DN ESC \x07 107"\x08\x07 58910-L0100',
+ b'\xf1\x00DN ESC \x08 103\x19\x06\x01 58910-L1300',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DN8 MDPS C 1,00 1,01 56310L0010\x00 4DNAC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0200 4DNAC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0200 4DNAC102',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0010\x00 4DNAC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0200\x00 4DNAC102',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC102',
+ b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1010 4DNDC103',
+ b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1030 4DNDC103',
+ b'\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100',
+ b'\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP101',
+ b'\xf1\x00DN8 MDPS R 1.00 1.02 57700-L1000 4DNDP105',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.02 99211-L1000 190422',
+ b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.04 99211-L1000 191016',
+ b'\xf1\x00DN8 MFC AT RUS LHD 1.00 1.03 99211-L1000 190705',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.00 99211-L0000 190716',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.01 99211-L0000 191016',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.03 99211-L0000 210603',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.05 99211-L1000 201109',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.06 99211-L1000 210325',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.07 99211-L1000 211223',
+ ],
+ },
+ CAR.HYUNDAI_SONATA_LF: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00LF__ SCC F-CUP 1.00 1.00 96401-C2200 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00LF ESC \t 11 \x17\x01\x13 58920-C2610',
+ b'\xf1\x00LF ESC \x0c 11 \x17\x01\x13 58920-C2610',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00LFF LKAS AT USA LHD 1.00 1.01 95740-C1000 E51',
+ b'\xf1\x00LFF LKAS AT USA LHD 1.01 1.02 95740-C1000 E52',
+ ],
+ },
+ CAR.HYUNDAI_SONATA_2024: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DN8_ RDR ----- 1.00 1.00 99110-L1800 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.01 99211-L1800 230512',
+ b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.01 99211-L1800 230512',
+ ],
+ },
+ CAR.HYUNDAI_TUCSON: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00TL__ FCA F-CUP 1.00 1.01 99110-D3500 ',
+ b'\xf1\x00TL__ FCA F-CUP 1.00 1.02 99110-D3510 ',
+ b'\xf1\x00TL__ FCA FHCUP 1.00 1.02 99110-D3500 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00TL MFC AT KOR LHD 1.00 1.02 95895-D3800 180719',
+ b'\xf1\x00TL MFC AT KOR LHD 1.00 1.06 95895-D3800 190107',
+ b'\xf1\x00TL MFC AT USA LHD 1.00 1.06 95895-D3800 190107',
+ ],
+ },
+ CAR.HYUNDAI_SANTA_FE: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1210 ',
+ b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S2000 ',
+ b'\xf1\x00TM__ SCC F-CUP 1.00 1.02 99110-S2000 ',
+ b'\xf1\x00TM__ SCC F-CUP 1.00 1.03 99110-S2000 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00TM ESC \x02 100\x18\x030 58910-S2600',
+ b'\xf1\x00TM ESC \x02 102\x18\x07\x01 58910-S2600',
+ b'\xf1\x00TM ESC \x02 103\x18\x11\x05 58910-S2500',
+ b'\xf1\x00TM ESC \x02 103\x18\x11\x07 58910-S2600',
+ b'\xf1\x00TM ESC \x02 104\x19\x07\x07 58910-S2600',
+ b'\xf1\x00TM ESC \x03 103\x18\x11\x07 58910-S2600',
+ b'\xf1\x00TM ESC \x0c 103\x18\x11\x08 58910-S2650',
+ b'\xf1\x00TM ESC \r 100\x18\x031 58910-S2650',
+ b'\xf1\x00TM ESC \r 103\x18\x11\x08 58910-S2650',
+ b'\xf1\x00TM ESC \r 104\x19\x07\x08 58910-S2650',
+ b'\xf1\x00TM ESC \r 105\x19\x05# 58910-S1500',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00TM MDPS C 1.00 1.00 56340-S2000 8409',
+ b'\xf1\x00TM MDPS C 1.00 1.00 56340-S2000 8A12',
+ b'\xf1\x00TM MDPS C 1.00 1.01 56340-S2000 9129',
+ b'\xf1\x00TM MDPS R 1.00 1.02 57700-S1100 4TMDP102',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00TM MFC AT EUR LHD 1.00 1.01 99211-S1010 181207',
+ b'\xf1\x00TM MFC AT USA LHD 1.00 1.00 99211-S2000 180409',
+ ],
+ },
+ CAR.HYUNDAI_SANTA_FE_2022: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1500 ',
+ b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S1500 ',
+ b'\xf1\x00TM__ SCC FHCUP 1.00 1.00 99110-S1500 ',
+ b'\xf1\x00TM__ SCC FHCUP 1.00 1.01 99110-S1500 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00TM ESC \x01 102!\x04\x03 58910-S2DA0',
+ b'\xf1\x00TM ESC \x01 104"\x10\x07 58910-S2DA0',
+ b'\xf1\x00TM ESC \x02 101 \x08\x04 58910-S2GA0',
+ b'\xf1\x00TM ESC \x02 103"\x07\x08 58910-S2GA0',
+ b'\xf1\x00TM ESC \x03 101 \x08\x02 58910-S2DA0',
+ b'\xf1\x00TM ESC \x03 102!\x04\x03 58910-S2DA0',
+ b'\xf1\x00TM ESC \x03 103"\x07\x06 58910-S2DA0',
+ b'\xf1\x00TM ESC \x04 101 \x08\x04 58910-S2GA0',
+ b'\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0',
+ b'\xf1\x00TM ESC \x04 103"\x07\x08 58910-S2GA0',
+ b'\xf1\x00TM ESC \x1e 102 \x08\x08 58910-S1DA0',
+ b'\xf1\x00TM ESC 103!\x030 58910-S1MA0',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1AB0 4TSDC101',
+ b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1EB0 4TSDC101',
+ b'\xf1\x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00TM MFC AT EUR LHD 1.00 1.03 99211-S1500 210224',
+ b'\xf1\x00TM MFC AT MES LHD 1.00 1.05 99211-S1500 220126',
+ b'\xf1\x00TMA MFC AT MEX LHD 1.00 1.01 99211-S2500 210205',
+ b'\xf1\x00TMA MFC AT USA LHD 1.00 1.00 99211-S2500 200720',
+ b'\xf1\x00TMA MFC AT USA LHD 1.00 1.01 99211-S2500 210205',
+ b'\xf1\x00TMA MFC AT USA LHD 1.00 1.03 99211-S2500 220414',
+ ],
+ },
+ CAR.HYUNDAI_SANTA_FE_HEV_2022: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ',
+ b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102',
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102',
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100',
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310GA000\x00 4TSHA100',
+ b'\xf1\x00TM MDPS R 1.00 1.05 57700-CL000 4TSHP105',
+ b'\xf1\x00TM MDPS R 1.00 1.06 57700-CL000 4TSHP106',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00TMA MFC AT USA LHD 1.00 1.03 99211-S2500 220414',
+ b'\xf1\x00TMH MFC AT EUR LHD 1.00 1.06 99211-S1500 220727',
+ b'\xf1\x00TMH MFC AT KOR LHD 1.00 1.06 99211-S1500 220727',
+ b'\xf1\x00TMH MFC AT USA LHD 1.00 1.03 99211-S1500 210224',
+ b'\xf1\x00TMH MFC AT USA LHD 1.00 1.05 99211-S1500 220126',
+ b'\xf1\x00TMH MFC AT USA LHD 1.00 1.06 99211-S1500 220727',
+ ],
+ },
+ CAR.HYUNDAI_SANTA_FE_PHEV_2022: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00TMhe SCC F-CUP 1.00 1.00 99110-CL500 ',
+ b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ',
+ b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102',
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102',
+ b'\xf1\x00TM MDPS C 1.00 1.02 56310CLEC0\x00 4TSHC102',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00TMP MFC AT USA LHD 1.00 1.03 99211-S1500 210224',
+ b'\xf1\x00TMP MFC AT USA LHD 1.00 1.05 99211-S1500 220126',
+ b'\xf1\x00TMP MFC AT USA LHD 1.00 1.06 99211-S1500 220727',
+ ],
+ },
+ CAR.HYUNDAI_CUSTIN_1ST_GEN: {
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00KU ESC \x01 101!\x02\x03 58910-O3200',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00KU__ SCC F-CUP 1.00 1.01 99110-O3000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00KU MDPS C 1.00 1.01 56310/O3100 4KUCC101',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00KU2 MFC AT CHN LHD 1.00 1.02 99211-O3000 220923',
+ ],
+ },
+ CAR.KIA_STINGER: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CK__ SCC F_CUP 1.00 1.01 96400-J5000 ',
+ b'\xf1\x00CK__ SCC F_CUP 1.00 1.01 96400-J5100 ',
+ b'\xf1\x00CK__ SCC F_CUP 1.00 1.02 96400-J5100 ',
+ b'\xf1\x00CK__ SCC F_CUP 1.00 1.03 96400-J5100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5200 4C2CL104',
+ b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5220 4C2VL104',
+ b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104',
+ b'\xf1\x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106',
+ b'\xf1\x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106',
+ b'\xf1\x00CK MDPS R 1.00 1.07 57700-J5220 4C2VL107',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CK MFC AT EUR LHD 1.00 1.03 95740-J5000 170822',
+ b'\xf1\x00CK MFC AT USA LHD 1.00 1.03 95740-J5000 170822',
+ b'\xf1\x00CK MFC AT USA LHD 1.00 1.04 95740-J5000 180504',
+ ],
+ },
+ CAR.KIA_STINGER_2022: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CK__ SCC F-CUP 1.00 1.00 99110-J5500 ',
+ b'\xf1\x00CK__ SCC FHCUP 1.00 1.00 99110-J5500 ',
+ b'\xf1\x00CK__ SCC FHCUP 1.00 1.00 99110-J5600 ',
+ b'\xf1\x00CK__ SCC FHCUP 1.00 1.01 99110-J5100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503',
+ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5320 4C2VL503',
+ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503',
+ b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5520 4C4VL503',
+ b'\xf1\x00CK MDPS R 1.00 5.04 57700-J5520 4C4VL504',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CK MFC AT AUS RHD 1.00 1.00 99211-J5500 210622',
+ b'\xf1\x00CK MFC AT KOR LHD 1.00 1.00 99211-J5500 210622',
+ b'\xf1\x00CK MFC AT USA LHD 1.00 1.00 99211-J5500 210622',
+ b'\xf1\x00CK MFC AT USA LHD 1.00 1.03 99211-J5000 201209',
+ ],
+ },
+ CAR.HYUNDAI_PALISADE: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00LX2 SCC FHCUP 1.00 1.04 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC F-CU- 1.00 1.05 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC F-CUP 1.00 1.00 99110-S8110 ',
+ b'\xf1\x00LX2_ SCC F-CUP 1.00 1.04 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC F-CUP 1.00 1.05 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC FHCU- 1.00 1.05 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC FHCUP 1.00 1.00 99110-S8110 ',
+ b'\xf1\x00LX2_ SCC FHCUP 1.00 1.03 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC FHCUP 1.00 1.04 99110-S8100 ',
+ b'\xf1\x00LX2_ SCC FHCUP 1.00 1.05 99110-S8100 ',
+ b'\xf1\x00ON__ FCA FHCU- 1.00 1.00 99110-S9110 ',
+ b'\xf1\x00ON__ FCA FHCUP 1.00 1.00 99110-S9110 ',
+ b'\xf1\x00ON__ FCA FHCUP 1.00 1.01 99110-S9110 ',
+ b'\xf1\x00ON__ FCA FHCUP 1.00 1.02 99110-S9100 ',
+ b'\xf1\x00ON__ FCA FHCUP 1.00 1.03 99110-S9100 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00LX ESC \x01 103\x19\t\x10 58910-S8360',
+ b'\xf1\x00LX ESC \x01 1031\t\x10 58910-S8360',
+ b'\xf1\x00LX ESC \x01 104 \x10\x15 58910-S8350',
+ b'\xf1\x00LX ESC \x01 104 \x10\x16 58910-S8360',
+ b'\xf1\x00LX ESC \x0b 101\x19\x03\x17 58910-S8330',
+ b'\xf1\x00LX ESC \x0b 101\x19\x03 58910-S8360',
+ b'\xf1\x00LX ESC \x0b 102\x19\x05\x07 58910-S8330',
+ b'\xf1\x00LX ESC \x0b 103\x19\t\x07 58910-S8330',
+ b'\xf1\x00LX ESC \x0b 103\x19\t\t 58910-S8350',
+ b'\xf1\x00LX ESC \x0b 103\x19\t\x10 58910-S8360',
+ b'\xf1\x00LX ESC \x0b 104 \x10\x13 58910-S8330',
+ b'\xf1\x00LX ESC \x0b 104 \x10\x16 58910-S8360',
+ b'\xf1\x00ON ESC \x01 101\x19\t\x08 58910-S9360',
+ b'\xf1\x00ON ESC \x0b 100\x18\x12\x18 58910-S9360',
+ b'\xf1\x00ON ESC \x0b 101\x19\t\x05 58910-S9320',
+ b'\xf1\x00ON ESC \x0b 101\x19\t\x08 58910-S9360',
+ b'\xf1\x00ON ESC \x0b 103$\x04\x08 58910-S9360',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00LX2 MDPS C 1,00 1,03 56310-S8020 4LXDC103',
+ b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8000 4LXDC103',
+ b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103',
+ b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-XX000 4LXDC103',
+ b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8000 4LXDC104',
+ b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104',
+ b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104',
+ b'\xf1\x00LX2 MDPS R 1.00 1.02 56370-S8300 9318',
+ b'\xf1\x00ON MDPS C 1.00 1.00 56340-S9000 8B13',
+ b'\xf1\x00ON MDPS C 1.00 1.01 56340-S9000 9201',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00LX2 MFC AT KOR LHD 1.00 1.08 99211-S8100 200903',
+ b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.00 99211-S8110 210226',
+ b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.03 99211-S8100 190125',
+ b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.05 99211-S8100 190909',
+ b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.07 99211-S8100 200422',
+ b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.08 99211-S8100 200903',
+ b'\xf1\x00ON MFC AT USA LHD 1.00 1.01 99211-S9100 181105',
+ b'\xf1\x00ON MFC AT USA LHD 1.00 1.03 99211-S9100 200720',
+ b'\xf1\x00ON MFC AT USA LHD 1.00 1.04 99211-S9100 211227',
+ ],
+ },
+ CAR.HYUNDAI_VELOSTER: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JS__ SCC H-CUP 1.00 1.02 95650-J3200 ',
+ b'\xf1\x00JS__ SCC HNCUP 1.00 1.02 95650-J3100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00JSL MDPS C 1.00 1.03 56340-J3000 8308',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JS LKAS AT KOR LHD 1.00 1.03 95740-J3000 K33',
+ b'\xf1\x00JS LKAS AT USA LHD 1.00 1.02 95740-J3000 K32',
+ ],
+ },
+ CAR.GENESIS_G70: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00IK__ SCC F-CUP 1.00 1.01 96400-G9100 ',
+ b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920',
+ ],
+ },
+ CAR.GENESIS_G70_2020: {
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00IK MDPS R 1.00 1.06 57700-G9220 4I2VL106',
+ b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9220 4I2VL107',
+ b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9420 4I4VL107',
+ b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9200 4I2CL108',
+ b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9420 4I4VL108',
+ b'\xf1\x00IK MDPS R 1.00 5.09 57700-G9520 4I4VL509',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00IK__ SCC F-CUP 1.00 1.01 96400-G9100 ',
+ b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ',
+ b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 \xf1\xa01.02',
+ b'\xf1\x00IK__ SCC FHCUP 1.00 1.00 99110-G9300 ',
+ b'\xf1\x00IK__ SCC FHCUP 1.00 1.02 96400-G9000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00IK MFC AT KOR LHD 1.00 1.01 95740-G9000 170920',
+ b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920',
+ b'\xf1\x00IK MFC AT USA LHD 1.00 1.04 99211-G9000 220401',
+ ],
+ },
+ CAR.GENESIS_G80: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DH__ SCC F-CU- 1.00 1.01 96400-B1110 ',
+ b'\xf1\x00DH__ SCC F-CUP 1.00 1.01 96400-B1120 ',
+ b'\xf1\x00DH__ SCC F-CUP 1.00 1.02 96400-B1120 ',
+ b'\xf1\x00DH__ SCC FHCUP 1.00 1.01 96400-B1110 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DH LKAS AT EUR LHD 1.01 1.01 95895-B1500 161014',
+ b'\xf1\x00DH LKAS AT KOR LHD 1.01 1.01 95895-B1500 161014',
+ b'\xf1\x00DH LKAS AT KOR LHD 1.01 1.02 95895-B1500 170810',
+ b'\xf1\x00DH LKAS AT USA LHD 1.01 1.01 95895-B1500 161014',
+ b'\xf1\x00DH LKAS AT USA LHD 1.01 1.02 95895-B1500 170810',
+ b'\xf1\x00DH LKAS AT USA LHD 1.01 1.03 95895-B1500 180713',
+ b'\xf1\x00DH LKAS AT USA LHD 1.01 1.04 95895-B1500 181213',
+ ],
+ },
+ CAR.GENESIS_G80_2ND_GEN_FL: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00RG3_ SCC ----- 1.00 1.02 99110-T1120 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00RG3 MFC AT USA LHD 1.00 1.01 99211-T1200 230607',
+ ],
+ },
+ CAR.GENESIS_G90: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00HI__ SCC F-CUP 1.00 1.01 96400-D2100 ',
+ b'\xf1\x00HI__ SCC FHCUP 1.00 1.02 99110-D2100 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2020 160302',
+ b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2030 170208',
+ b'\xf1\x00HI LKAS AT USA LHD 1.00 1.01 95895-D2030 170811',
+ b'\xf1\x00HI MFC AT USA LHD 1.00 1.03 99211-D2000 190831',
+ ],
+ },
+ CAR.HYUNDAI_KONA: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00OS__ SCC F-CUP 1.00 1.00 95655-J9200 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00OS MDPS C 1.00 1.05 56310J9030\x00 4OSDC105',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00OS9 LKAS AT USA LHD 1.00 1.00 95740-J9300 g21',
+ ],
+ },
+ CAR.KIA_CEED: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CD__ SCC F-CUP 1.00 1.00 99110-J7500 ',
+ b'\xf1\x00CD__ SCC F-CUP 1.00 1.02 99110-J7000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00CD MDPS C 1.00 1.06 56310-XX000 4CDEC106',
+ b'\xf1\x00CDT MDPS C 1.00 1.00 56310-XX000 4CDTC100',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CD LKAS AT EUR LHD 1.00 1.01 99211-J7000 B40',
+ b'\xf1\x00CDT LKAS AT EUR LHD 1.00 1.01 99211-J7210 521',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00CD ESC \x03 102\x18\x08\x05 58920-J7350',
+ b'\xf1\x00CD ESC \x0b 101 \x10\x03 58910-J7AC0',
+ ],
+ },
+ CAR.KIA_FORTE: {
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00BD MDPS C 1.00 1.02 56310-XX000 4BD2C102',
+ b'\xf1\x00BD MDPS C 1.00 1.08 56310/M6300 4BDDC108',
+ b'\xf1\x00BD MDPS C 1.00 1.08 56310M6300\x00 4BDDC108',
+ b'\xf1\x00BDm MDPS C A.01 1.01 56310M7800\x00 4BPMC101',
+ b'\xf1\x00BDm MDPS C A.01 1.03 56310M7800\x00 4BPMC103',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00BD LKAS AT USA LHD 1.00 1.04 95740-M6000 J33',
+ b'\xf1\x00BDP LKAS AT USA LHD 1.00 1.05 99211-M6500 744',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00BDPE_SCC FHCUPC 1.00 1.04 99110-M6500\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\xf1\x00BD__ SCC H-CUP 1.00 1.02 99110-M6000 ',
+ ],
+ },
+ CAR.KIA_K5_2021: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DL3_ SCC F-CUP 1.00 1.03 99110-L2100 ',
+ b'\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2000 ',
+ b'\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2100 ',
+ b'\xf1\x00DL3_ SCC FHCUP 1.00 1.04 99110-L2100 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3110 4DLAC101',
+ b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101',
+ b'\xf1\x00DL3 MDPS C 1.00 1.01 56310L3220\x00 4DLAC101',
+ b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L2220 4DLDC102',
+ b'\xf1\x00DL3 MDPS C 1.00 1.02 56310L3220\x00 4DLAC102',
+ b'\xf1\x00DL3 MDPS R 1.00 1.02 57700-L3000 4DLAP102',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DL3 MFC AT KOR LHD 1.00 1.04 99210-L2000 210527',
+ b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.03 99210-L3000 200915',
+ b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.04 99210-L3000 210208',
+ b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.05 99210-L3000 211222',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00DL ESC \x01 104 \x07\x12 58910-L2200',
+ b'\xf1\x00DL ESC \x03 100 \x08\x02 58910-L3600',
+ b'\xf1\x00DL ESC \x06 101 \x04\x02 58910-L3200',
+ b'\xf1\x00DL ESC \x06 102 \x07\x02 58910-L3200',
+ b'\xf1\x00DL ESC \x06 103"\x08\x06 58910-L3200',
+ b'\xf1\x00DL ESC \t 100 \x06\x02 58910-L3800',
+ b'\xf1\x00DL ESC \t 101 \x07\x02 58910-L3800',
+ b'\xf1\x00DL ESC \t 102"\x08\x10 58910-L3800',
+ ],
+ },
+ CAR.KIA_K5_HEV_2020: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DLhe SCC FHCUP 1.00 1.02 99110-L7000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L7000 4DLHC102',
+ b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L7220 4DLHC102',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.01 99210-L2000 191022',
+ b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.02 99210-L2000 200309',
+ b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.04 99210-L2000 210527',
+ ],
+ },
+ CAR.KIA_K5_DL3_24_HEV: { # (DL3)
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.02 99210-L2500 230911'
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DL3_ RDR ----- 1.00 1.01 99110-L2500 ',
+ ],
+ },
+ CAR.HYUNDAI_KONA_EV: {
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00OS IEB \x01 212 \x11\x13 58520-K4000',
+ b'\xf1\x00OS IEB \x02 210 \x02\x14 58520-K4000',
+ b'\xf1\x00OS IEB \x02 212 \x11\x13 58520-K4000',
+ b'\xf1\x00OS IEB \x03 210 \x02\x14 58520-K4000',
+ b'\xf1\x00OS IEB \x03 211 \x04\x02 58520-K4000',
+ b'\xf1\x00OS IEB \x03 212 \x11\x13 58520-K4000',
+ b'\xf1\x00OS IEB \x04 212 \x11\x13 58520-K4000',
+ b'\xf1\x00OS IEB \r 105\x18\t\x18 58520-K4000',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00OE2 LKAS AT EUR LHD 1.00 1.00 95740-K4200 200',
+ b'\xf1\x00OSE LKAS AT AUS RHD 1.00 1.00 95740-K4300 W50',
+ b'\xf1\x00OSE LKAS AT EUR LHD 1.00 1.00 95740-K4100 W40',
+ b'\xf1\x00OSE LKAS AT EUR RHD 1.00 1.00 95740-K4100 W40',
+ b'\xf1\x00OSE LKAS AT KOR LHD 1.00 1.00 95740-K4100 W40',
+ b'\xf1\x00OSE LKAS AT KOR LHD 1.00 1.00 95740-K4300 W50',
+ b'\xf1\x00OSE LKAS AT USA LHD 1.00 1.00 95740-K4100 W40',
+ b'\xf1\x00OSE LKAS AT USA LHD 1.00 1.00 95740-K4300 W50',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00OS MDPS C 1.00 1.03 56310/K4550 4OEDC103',
+ b'\xf1\x00OS MDPS C 1.00 1.04 56310-XX000 4OEDC104',
+ b'\xf1\x00OS MDPS C 1.00 1.04 56310/K4550 4OEDC104',
+ b'\xf1\x00OS MDPS C 1.00 1.04 56310K4000\x00 4OEDC104',
+ b'\xf1\x00OS MDPS C 1.00 1.04 56310K4050\x00 4OEDC104',
+ b'\xf1\x00OS MDPS C 1.00 1.05 56310K4000\x00 4OEDC105',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00OSev SCC F-CUP 1.00 1.00 99110-K4000 ',
+ b'\xf1\x00OSev SCC F-CUP 1.00 1.00 99110-K4100 ',
+ b'\xf1\x00OSev SCC F-CUP 1.00 1.01 99110-K4000 ',
+ b'\xf1\x00OSev SCC FNCUP 1.00 1.01 99110-K4000 ',
+ ],
+ },
+ CAR.HYUNDAI_KONA_EV_2022: {
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00OS IEB \x02 102"\x05\x16 58520-K4010',
+ b'\xf1\x00OS IEB \x03 101 \x11\x13 58520-K4010',
+ b'\xf1\x00OS IEB \x03 102"\x05\x16 58520-K4010',
+ b'\xf1\x00OS IEB \r 102"\x05\x16 58520-K4010',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00OSP LKA AT AUS RHD 1.00 1.04 99211-J9200 904',
+ b'\xf1\x00OSP LKA AT CND LHD 1.00 1.02 99211-J9110 802',
+ b'\xf1\x00OSP LKA AT EUR LHD 1.00 1.04 99211-J9200 904',
+ b'\xf1\x00OSP LKA AT EUR RHD 1.00 1.02 99211-J9110 802',
+ b'\xf1\x00OSP LKA AT EUR RHD 1.00 1.04 99211-J9200 904',
+ 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.02 56310-K4271 4OEPC102',
+ b'\xf1\x00OSP MDPS C 1.00 1.02 56310/K4271 4OEPC102',
+ b'\xf1\x00OSP MDPS C 1.00 1.02 56310/K4970 4OEPC102',
+ b'\xf1\x00OSP MDPS C 1.00 1.02 56310K4260\x00 4OEPC102',
+ b'\xf1\x00OSP MDPS C 1.00 1.02 56310K4261\x00 4OEPC102',
+ b'\xf1\x00OSP MDPS C 1.00 1.02 56310K4971\x00 4OEPC102',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00YB__ FCA ----- 1.00 1.01 99110-K4500 \x00\x00\x00',
+ ],
+ },
+ CAR.HYUNDAI_KONA_EV_2ND_GEN: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00SXev RDR ----- 1.00 1.00 99110-BF000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00SX2EMFC AT KOR LHD 1.00 1.00 99211-BF000 230410',
+ ],
+ },
+ CAR.HYUNDAI_KONA_HEV_2ND_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00SX2HMFC AT EUR RHD 1.00 1.04 99211-BE000 231010',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00SX2_ RDR ----- 1.00 1.02 99110-BE500 ',
+ ],
+ },
+ CAR.KIA_NIRO_EV: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4000 ',
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4100 ',
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4500 ',
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4600 ',
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.02 96400-Q4000 ',
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.02 96400-Q4100 ',
+ b'\xf1\x00DEev SCC F-CUP 1.00 1.03 96400-Q4100 ',
+ b'\xf1\x00DEev SCC FHCUP 1.00 1.00 99110-Q4600 ',
+ b'\xf1\x00DEev SCC FHCUP 1.00 1.03 96400-Q4000 ',
+ b'\xf1\x00DEev SCC FNCUP 1.00 1.00 99110-Q4600 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DE MDPS C 1.00 1.04 56310Q4100\x00 4DEEC104',
+ b'\xf1\x00DE MDPS C 1.00 1.05 56310Q4000\x00 4DEEC105',
+ b'\xf1\x00DE MDPS C 1.00 1.05 56310Q4100\x00 4DEEC105',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DEE MFC AT EUR LHD 1.00 1.00 99211-Q4000 191211',
+ b'\xf1\x00DEE MFC AT EUR LHD 1.00 1.00 99211-Q4100 200706',
+ b'\xf1\x00DEE MFC AT EUR LHD 1.00 1.03 95740-Q4000 180821',
+ b'\xf1\x00DEE MFC AT KOR LHD 1.00 1.02 95740-Q4000 180705',
+ b'\xf1\x00DEE MFC AT KOR LHD 1.00 1.03 95740-Q4000 180821',
+ b'\xf1\x00DEE MFC AT USA LHD 1.00 1.00 99211-Q4000 191211',
+ b'\xf1\x00DEE MFC AT USA LHD 1.00 1.01 99211-Q4500 210428',
+ b'\xf1\x00DEE MFC AT USA LHD 1.00 1.02 99211-Q4100 201218',
+ b'\xf1\x00DEE MFC AT USA LHD 1.00 1.03 95740-Q4000 180821',
+ ],
+ },
+ CAR.KIA_NIRO_EV_2ND_GEN: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00SG2_ RDR ----- 1.00 1.01 99110-AT000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00SG2EMFC AT EUR LHD 1.01 1.09 99211-AT000 220801',
+ b'\xf1\x00SG2EMFC AT USA LHD 1.01 1.09 99211-AT000 220801',
+ ],
+ },
+ CAR.KIA_NIRO_PHEV: {
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101',
+ b'\xf1\x00DE MDPS C 1.00 1.09 56310G5301\x00 4DEHC109',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 95740-G5010 170117',
+ b'\xf1\x00DEP MFC AT USA LHD 1.00 1.00 95740-G5010 170117',
+ b'\xf1\x00DEP MFC AT USA LHD 1.00 1.01 95740-G5010 170424',
+ b'\xf1\x00DEP MFC AT USA LHD 1.00 1.05 99211-G5000 190826',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DEhe SCC F-CUP 1.00 1.02 99110-G5100 ',
+ b'\xf1\x00DEhe SCC FHCUP 1.00 1.02 99110-G5100 ',
+ b'\xf1\x00DEhe SCC H-CUP 1.01 1.02 96400-G5100 ',
+ ],
+ },
+ CAR.KIA_NIRO_PHEV_2022: {
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DEP MFC AT USA LHD 1.00 1.00 99211-G5500 210428',
+ b'\xf1\x00DEP MFC AT USA LHD 1.00 1.06 99211-G5000 201028',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DEhe SCC F-CUP 1.00 1.00 99110-G5600 ',
+ b'\xf1\x00DEhe SCC FHCUP 1.00 1.00 99110-G5600 ',
+ ],
+ },
+ CAR.KIA_NIRO_HEV_2021: {
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DEH MFC AT KOR LHD 1.00 1.04 99211-G5000 190516',
+ b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 99211-G5500 210428',
+ b'\xf1\x00DEH MFC AT USA LHD 1.00 1.06 99211-G5000 201028',
+ b'\xf1\x00DEH MFC AT USA LHD 1.00 1.07 99211-G5000 201221',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DEhe SCC FHCUP 1.00 1.00 99110-G5600 ',
+ b'\xf1\x00DEhe SCC FHCUP 1.00 1.01 99110-G5000 ',
+ ],
+ },
+ CAR.KIA_SELTOS: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00SP2_ SCC FHCUP 1.01 1.05 99110-Q5100 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00SP ESC \x07 101\x19\t\x05 58910-Q5450',
+ b'\xf1\x00SP ESC \t 101\x19\t\x05 58910-Q5450',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00SP2 MDPS C 1.00 1.04 56300Q5200 ',
+ b'\xf1\x00SP2 MDPS C 1.01 1.05 56300Q5200 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00SP2 MFC AT USA LHD 1.00 1.04 99210-Q5000 191114',
+ b'\xf1\x00SP2 MFC AT USA LHD 1.00 1.05 99210-Q5000 201012',
+ ],
+ },
+ CAR.KIA_OPTIMA_G4: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JF__ SCC F-CUP 1.00 1.00 96400-D4100 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00JF ESC \t 17 \x16\x06# 58920-D4180',
+ b'\xf1\x00JF ESC \x0f 16 \x16\x06\x17 58920-D5080',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JFWGN LDWS AT USA LHD 1.00 1.02 95895-D4100 G21',
+ b'\xf1\x00JFWGN LKAS AT EUR LHD 1.00 1.01 95895-D4100 G20',
+ ],
+ },
+ CAR.KIA_OPTIMA_G4_FL: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JF__ SCC F-CUP 1.00 1.00 96400-D4110 ',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b"\xf1\x00JF ESC \t 11 \x18\x03' 58920-D5260",
+ b'\xf1\x00JF ESC \x0b 11 \x18\x030 58920-D5180',
+ b'\xf1\x00JF ESC \x0c 11 \x18\x030 58920-D5180',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JFA LKAS AT USA LHD 1.00 1.00 95895-D5001 h32',
+ b'\xf1\x00JFA LKAS AT USA LHD 1.00 1.00 95895-D5100 h32',
+ ],
+ },
+ CAR.KIA_OPTIMA_H: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JFhe SCC FNCUP 1.00 1.00 96400-A8000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JFP LKAS AT EUR LHD 1.00 1.03 95895-A8100 160711',
+ ],
+ },
+ CAR.KIA_OPTIMA_H_G4_FL: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JFhe SCC FHCUP 1.00 1.01 99110-A8500 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JFH MFC AT KOR LHD 1.00 1.01 95895-A8200 180323',
+ ],
+ },
+ CAR.HYUNDAI_ELANTRA: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00AD LKAS AT USA LHD 1.01 1.01 95895-F2000 251',
+ b'\xf1\x00ADP LKAS AT USA LHD 1.00 1.03 99211-F2000 X31',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00AD ESC \x11 11 \x18\x05\x06 58910-F2840',
+ b'\xf1\x00AD ESC \x11 12 \x15\t\t 58920-F2810',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00AD__ SCC H-CUP 1.00 1.00 99110-F2100 ',
+ b'\xf1\x00AD__ SCC H-CUP 1.00 1.01 96400-F2100 ',
+ ],
+ },
+ CAR.HYUNDAI_ELANTRA_GT_I30: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00PD LKAS AT KOR LHD 1.00 1.02 95740-G3000 A51',
+ b'\xf1\x00PD LKAS AT USA LHD 1.00 1.02 95740-G3000 A51',
+ b'\xf1\x00PD LKAS AT USA LHD 1.01 1.01 95740-G3100 A54',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00PD MDPS C 1.00 1.00 56310G3300\x00 4PDDC100',
+ b'\xf1\x00PD MDPS C 1.00 1.03 56310/G3300 4PDDC103',
+ b'\xf1\x00PD MDPS C 1.00 1.04 56310/G3300 4PDDC104',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00PD ESC \t 104\x18\t\x03 58920-G3350',
+ b'\xf1\x00PD ESC \x0b 103\x17\x110 58920-G3350',
+ b'\xf1\x00PD ESC \x0b 104\x18\t\x03 58920-G3350',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00PD__ SCC F-CUP 1.00 1.00 96400-G3300 ',
+ b'\xf1\x00PD__ SCC F-CUP 1.01 1.00 96400-G3100 ',
+ b'\xf1\x00PD__ SCC FNCUP 1.01 1.00 96400-G3000 ',
+ ],
+ },
+ CAR.HYUNDAI_ELANTRA_2021: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CN7_ SCC F-CUP 1.00 1.01 99110-AA000 ',
+ b'\xf1\x00CN7_ SCC FHCUP 1.00 1.01 99110-AA000 ',
+ b'\xf1\x00CN7_ SCC FNCUP 1.00 1.01 99110-AA000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00CN7 MDPS C 1.00 1.06 56310/AA050 4CNDC106',
+ b'\xf1\x00CN7 MDPS C 1.00 1.06 56310/AA070 4CNDC106',
+ b'\xf1\x00CN7 MDPS C 1.00 1.06 56310AA050\x00 4CNDC106',
+ b'\xf1\x00CN7 MDPS C 1.00 1.07 56310AA050\x00 4CNDC107',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.00 99210-AB000 200819',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.01 99210-AB000 210205',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.02 99210-AB000 220111',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AA000 200819',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AB000 220426',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.06 99210-AA000 220111',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.07 99210-AA000 220426',
+ b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.08 99210-AA000 220728',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00CN ESC \t 101 \x10\x03 58910-AB800',
+ b'\xf1\x00CN ESC \t 104 \x08\x03 58910-AA800',
+ b'\xf1\x00CN ESC \t 105 \x10\x03 58910-AA800',
+ ],
+ },
+ CAR.HYUNDAI_ELANTRA_HEV_2021: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.03 99210-AA000 200819',
+ b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.05 99210-AA000 210930',
+ b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.07 99210-AA000 220426',
+ b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.08 99210-AA000 220728',
+ b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.09 99210-AA000 221108',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CNhe SCC FHCUP 1.00 1.01 99110-BY000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00CN7 MDPS C 1.00 1.02 56310/BY050 4CNHC102',
+ b'\xf1\x00CN7 MDPS C 1.00 1.03 56310/BY050 4CNHC103',
+ b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY050\x00 4CNHC103',
+ b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY0500 4CNHC103',
+ b'\xf1\x00CN7 MDPS C 1.00 1.04 56310BY050\x00 4CNHC104',
+ ],
+ },
+ CAR.HYUNDAI_KONA_HEV: {
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00OS IEB \x01 104 \x11 58520-CM000',
+ b'\xf1\x00OS IEB \x03 104 \x11 58520-CM000',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00OShe SCC F-CUP 1.00 1.01 99110-CM000 ',
+ b'\xf1\x00OShe SCC FNCUP 1.00 1.01 99110-CM000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00OS MDPS C 1.00 1.00 56310CM020\x00 4OHDC100',
+ b'\xf1\x00OS MDPS C 1.00 1.00 56310CM030\x00 4OHDC100',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00OSH LKAS AT EUR LHD 1.00 1.01 95740-CM000 l31',
+ b'\xf1\x00OSH LKAS AT KOR LHD 1.00 1.01 95740-CM000 l31',
+ ],
+ },
+ CAR.HYUNDAI_SONATA_HYBRID: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00DNhe SCC F-CUP 1.00 1.02 99110-L5000 ',
+ b'\xf1\x00DNhe SCC FHCUP 1.00 1.00 99110-L5000 ',
+ b'\xf1\x00DNhe SCC FHCUP 1.00 1.02 99110-L5000 ',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L5000 4DNHC101',
+ b'\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102',
+ b'\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102',
+ b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103',
+ b'\xf1\x00DN8 MDPS C 1.00 1.03 56310L5450\x00 4DNHC104',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00DN8HMFC AT KOR LHD 1.00 1.03 99211-L1000 190705',
+ b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.04 99211-L1000 191016',
+ b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.05 99211-L1000 201109',
+ b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.06 99211-L1000 210325',
+ b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.07 99211-L1000 211223',
+ ],
+ },
+ CAR.KIA_SORENTO: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00UMP LKAS AT KOR LHD 1.00 1.00 95740-C5550 S30',
+ b'\xf1\x00UMP LKAS AT USA LHD 1.00 1.00 95740-C6550 d00',
+ b'\xf1\x00UMP LKAS AT USA LHD 1.01 1.01 95740-C6550 d01',
+ ],
+ (Ecu.abs, 0x7d1, None): [
+ b'\xf1\x00UM ESC \x02 12 \x18\x05\x05 58910-C6300',
+ b'\xf1\x00UM ESC \x0c 12 \x18\x05\x06 58910-C6330',
+ b'\xf1\x00UM ESC \x13 12 \x17\x07\x05 58910-C5320',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C5500 ',
+ b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C6500 ',
+ ],
+ },
+ CAR.KIA_EV6: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CV1_ RDR ----- 1.00 1.01 99110-CV000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CV1 MFC AT EUR LHD 1.00 1.05 99210-CV000 211027',
+ b'\xf1\x00CV1 MFC AT EUR LHD 1.00 1.06 99210-CV000 220328',
+ b'\xf1\x00CV1 MFC AT EUR RHD 1.00 1.00 99210-CV100 220630',
+ b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.00 99210-CV100 220630',
+ b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.00 99210-CV200 230510',
+ b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.04 99210-CV000 210823',
+ b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.05 99210-CV000 211027',
+ b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.06 99210-CV000 220328',
+ b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.00 99210-CV100 220630',
+ b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.00 99210-CV200 230510',
+ b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.05 99210-CV000 211027',
+ b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.06 99210-CV000 220328',
+ ],
+ },
+ CAR.KIA_EV6_PE: { # (CV1)
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CV__ RDR ----- 1.00 1.01 99110-CV500 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CV MFC AT KOR LHD 1.00 1.01 99210-CV500 240405',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_5: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00NE1_ RDR ----- 1.00 1.00 99110-GI000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00NE1 MFC AT CAN LHD 1.00 1.01 99211-GI010 211007',
+ b'\xf1\x00NE1 MFC AT CAN LHD 1.00 1.05 99211-GI010 220614',
+ b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.00 99211-GI100 230915',
+ b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.01 99211-GI010 211007',
+ b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.01 99211-GI100 240110',
+ b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.03 99211-GI010 220401',
+ 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',
+ b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.01 99211-GI010 211007',
+ b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.05 99211-GI010 220614',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.00 99211-GI020 230719',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.00 99211-GI100 230915',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.01 99211-GI010 211007',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.02 99211-GI010 211206',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.03 99211-GI010 220401',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.05 99211-GI010 220614',
+ b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_5_PE: { # (NE1)
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00NE__ RDR ----- 1.00 1.00 99110-GI500 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00NE MFC AT KOR LHD 1.00 1.02 99211-GI500 240221',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_5_N: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00NE1N RDR ----- 1.00 1.00 99110-NI000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00NE1NMFC AT KOR LHD 1.00 1.04 99211-NI000 231219',
+ b'\xf1\x00NE1NMFC AT USA LHD 1.00 1.04 99211-NI000 231219',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_6: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00CE__ RDR ----- 1.00 1.01 99110-KL000 ',
+ b'\xf1\x00CE__ RDR ----- 1.00 1.02 99110-KL000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00CE MFC AT CAN LHD 1.00 1.04 99211-KL000 221213',
+ b'\xf1\x00CE MFC AT EUR LHD 1.00 1.03 99211-KL000 221011',
+ b'\xf1\x00CE MFC AT EUR LHD 1.00 1.04 99211-KL000 221213',
+ b'\xf1\x00CE MFC AT USA LHD 1.00 1.04 99211-KL000 221213',
+ b'\xf1\x00CE MFC AT USA LHD 1.00 1.06 99211-KL000 230915',
+ ],
+ },
+ CAR.HYUNDAI_IONIQ_9: {
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00MEev RDR ----- 1.00 1.00 99110-GO000 ',
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00ME MFC AT KOR LHD 1.00 1.00 99211-GO000 241007',
+ ],
+ },
+ CAR.HYUNDAI_TUCSON_4TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.00 99211-N9260 14Y',
+ b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.01 99211-N9100 14A',
+ b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N9220 14K',
+ b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 2.02 99211-N9000 14E',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9210 14G',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9220 14K',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9240 14Q',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9250 14W',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9260 14Y',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.01 99211-N9100 14A',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.01 99211-N9240 14T',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00NX4__ 1.00 1.00 99110-N9100 ',
+ b'\xf1\x00NX4__ 1.00 1.01 99110-N9000 ',
+ b'\xf1\x00NX4__ 1.00 1.02 99110-N9000 ',
+ b'\xf1\x00NX4__ 1.01 1.00 99110-N9100 ',
+ ],
+ },
+ CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW000 14M',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW010 14X',
+ b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW020 14Z',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00NX4__ 1.00 1.00 99110-K5000 ',
+ b'\xf1\x00NX4__ 1.01 1.00 99110-K5000 ',
+ ],
+ },
+ CAR.KIA_SPORTAGE_5TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00NQ5 FR_CMR AT AUS RHD 1.00 1.00 99211-P1040 663',
+ b'\xf1\x00NQ5 FR_CMR AT EUR LHD 1.00 1.00 99211-P1040 663',
+ b'\xf1\x00NQ5 FR_CMR AT GEN LHD 1.00 1.00 99211-P1060 665',
+ b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1030 662',
+ b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1040 663',
+ b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1060 665',
+ b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1070 690',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00NQ5__ 1.00 1.02 99110-P1000 ',
+ b'\xf1\x00NQ5__ 1.00 1.03 99110-CH000 ',
+ b'\xf1\x00NQ5__ 1.00 1.03 99110-P1000 ',
+ b'\xf1\x00NQ5__ 1.01 1.03 99110-CH000 ',
+ b'\xf1\x00NQ5__ 1.01 1.03 99110-P1000 ',
+ ],
+ },
+ 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',
+ ],
+ (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 ',
+ ],
+ },
+ CAR.GENESIS_GV70_ELECTRIFIED_1ST_GEN: {
+ (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 ',
+ ],
+ },
+
+ 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',
+ b'\xf1\x00FE MFC AT KOR LHD 1.00 1.02 99211-M5100 220405',
+ ],
+ (Ecu.eps, 0x7d4, None): [
+ b'\xf1\x00FE MDPS C 1.00 1.05 56340-M5000 9903',
+ b'\xf1\x00FE MDPS C 1.00 1.06 56340-M5000 1625',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00FE__ SCC FHCUP 1.00 1.05 99110-M5000 ',
+ ],
+ },
+
+ CAR.GENESIS_GV60_EV_1ST_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JW1 MFC AT AUS RHD 1.00 1.03 99211-CU100 221118',
+ b'\xf1\x00JW1 MFC AT USA LHD 1.00 1.02 99211-CU000 211215',
+ b'\xf1\x00JW1 MFC AT USA LHD 1.00 1.02 99211-CU100 211215',
+ b'\xf1\x00JW1 MFC AT USA LHD 1.00 1.03 99211-CU000 221118',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JW1_ RDR ----- 1.00 1.00 99110-CU000 ',
+ ],
+ },
+ CAR.KIA_SORENTO_4TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.00 99210-R5100 221019',
+ b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.03 99210-R5000 200903',
+ b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.05 99210-R5000 210623',
+ b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.06 99210-R5000 211216',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00MQ4_ SCC F-CUP 1.00 1.06 99110-P2000 ',
+ b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.00 99110-R5000 ',
+ b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.06 99110-P2000 ',
+ b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.08 99110-P2000 ',
+ ],
+ },
+ CAR.KIA_SORENTO_HEV_4TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00MQ4HMFC AT KOR LHD 1.00 1.04 99210-P2000 200330',
+ b'\xf1\x00MQ4HMFC AT KOR LHD 1.00 1.12 99210-P2000 230331',
+ b'\xf1\x00MQ4HMFC AT USA LHD 1.00 1.10 99210-P2000 210406',
+ b'\xf1\x00MQ4HMFC AT USA LHD 1.00 1.11 99210-P2000 211217',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00MQhe SCC FHCUP 1.00 1.04 99110-P4000 ',
+ b'\xf1\x00MQhe SCC FHCUP 1.00 1.06 99110-P4000 ',
+ b'\xf1\x00MQhe SCC FHCUP 1.00 1.07 99110-P4000 ',
+ ],
+ },
+ CAR.KIA_NIRO_HEV_2ND_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00SG2HMFC AT USA LHD 1.01 1.08 99211-AT000 220531',
+ b'\xf1\x00SG2HMFC AT USA LHD 1.01 1.09 99211-AT000 220801',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00SG2_ RDR ----- 1.00 1.01 99110-AT000 ',
+ ],
+ },
+ CAR.GENESIS_GV80: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00JX1 MFC AT USA LHD 1.00 1.02 99211-T6110 220513',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00JX1_ SCC FHCUP 1.00 1.01 99110-T6100 ',
+ ],
+ },
+ CAR.KIA_CARNIVAL_4TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00KA4 MFC AT EUR LHD 1.00 1.06 99210-R0000 220221',
+ b'\xf1\x00KA4 MFC AT KOR LHD 1.00 1.05 99210-R0000 201221',
+ b'\xf1\x00KA4 MFC AT KOR LHD 1.00 1.06 99210-R0000 220221',
+ b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.00 99210-R0100 230105',
+ b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.01 99210-R0100 230710',
+ b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.05 99210-R0000 201221',
+ b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.06 99210-R0000 220221',
+ b'\xf1\x00KA4CMFC AT CHN LHD 1.00 1.01 99211-I4000 210525',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00KA4_ SCC F-CUP 1.00 1.03 99110-R0000 ',
+ b'\xf1\x00KA4_ SCC FHCUP 1.00 1.00 99110-R0100 ',
+ b'\xf1\x00KA4_ SCC FHCUP 1.00 1.02 99110-R0000 ',
+ b'\xf1\x00KA4_ SCC FHCUP 1.00 1.03 99110-R0000 ',
+ b'\xf1\x00KA4c SCC FHCUP 1.00 1.01 99110-I4000 ',
+ ],
+ },
+ CAR.KIA_K8_HEV_1ST_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00GL3HMFC AT KOR LHD 1.00 1.03 99211-L8000 210907',
+ b'\xf1\x00GL3HMFC AT KOR LHD 1.00 1.04 99211-L8000 230207',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00GL3_ RDR ----- 1.00 1.02 99110-L8000 ',
+ ],
+ },
+ CAR.HYUNDAI_STARIA_4TH_GEN: {
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00US4 MFC AT KOR LHD 1.00 1.06 99211-CG000 230524',
+ ],
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00US4_ RDR ----- 1.00 1.00 99110-CG000 ',
+ ],
+ },
+ CAR.KIA_EV9: { # (MV)
+ (Ecu.fwdRadar, 0x7d0, None): [
+ b'\xf1\x00MV__ RDR ----- 1.00 1.02 99110-DO700 ',
+ b'\xf1\x00MV__ RDR ----- 1.00 1.02 99110-DO000 '
+ ],
+ (Ecu.fwdCamera, 0x7c4, None): [
+ b'\xf1\x00MV MFC AT KOR LHD 1.00 1.01 99211-DO000 230419',
+ b'\xf1\x00MV MFC AT USA LHD 1.00 1.02 99211-DO000 230616',
+ b'\xf1\x00MV MFC AT EUR LHD 1.00 1.02 99211-DO000 230616',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py b/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py
new file mode 100644
index 000000000..f021118c5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py
@@ -0,0 +1,403 @@
+import copy
+import crcmod
+from iqdbc.car.hyundai.values import CAR, HyundaiFlags
+
+hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf)
+
+def suppress_casper_ev_fca11_fault(values):
+ # CASPER EV can report transient FCA faults during camera-SCC handoff.
+ # Keep the copied FCA11 frame non-faulting without changing other cars.
+ fca_fault = values["FCA_Failinfo"] != 0 or values["FCA_Status"] == 3
+ values["FCA_Failinfo"] = 0
+
+ if fca_fault:
+ values["FCA_Status"] = 2
+ values["CF_VSM_Prefill"] = 0
+ values["CF_VSM_HBACmd"] = 0
+ values["CF_VSM_Warn"] = 0
+ values["CF_VSM_BeltCmd"] = 0
+ values["CR_VSM_DecCmd"] = 0
+ values["FCA_CmdAct"] = 0
+ values["FCA_StopReq"] = 0
+ values["CF_VSM_DecCmdAct"] = 0
+
+ return values
+
+def create_lkas11(packer, frame, CP, apply_torque, steer_req,
+ torque_fault, lkas11, sys_warning, sys_state, enabled,
+ left_lane, right_lane,
+ left_lane_depart, right_lane_depart, is_ldws_car):
+
+ values = {s: lkas11[s] for s in [
+ "CF_Lkas_LdwsActivemode",
+ "CF_Lkas_LdwsSysState",
+ "CF_Lkas_SysWarning",
+ "CF_Lkas_LdwsLHWarning",
+ "CF_Lkas_LdwsRHWarning",
+ "CF_Lkas_HbaLamp",
+ "CF_Lkas_FcwBasReq",
+ "CF_Lkas_HbaSysState",
+ "CF_Lkas_FcwOpt",
+ "CF_Lkas_HbaOpt",
+ "CF_Lkas_FcwSysState",
+ "CF_Lkas_FcwCollisionWarning",
+ "CF_Lkas_FusionState",
+ "CF_Lkas_FcwOpt_USM",
+ "CF_Lkas_LdwsOpt_USM",
+ ]}
+ values["CF_Lkas_LdwsSysState"] = sys_state
+ values["CF_Lkas_SysWarning"] = 0 # 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["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
+
+
+ if CP.flags & HyundaiFlags.SEND_LFA.value or CP.carFingerprint in (CAR.HYUNDAI_SANTA_FE):
+ values["CF_Lkas_LdwsActivemode"] = int(left_lane) + (int(right_lane) << 1)
+ values["CF_Lkas_LdwsOpt_USM"] = 0 if CP.carFingerprint in (CAR.KIA_RAY_EV) else 2
+
+ # FcwOpt_USM 5 = Orange blinking car + lanes
+ # FcwOpt_USM 4 = Orange car + lanes
+ # FcwOpt_USM 3 = Green blinking car + lanes
+ # FcwOpt_USM 2 = Green car + lanes
+ # FcwOpt_USM 1 = White car + lanes
+ # FcwOpt_USM 0 = No car + lanes
+ values["CF_Lkas_FcwOpt_USM"] = 2 if enabled else 1
+
+ # SysWarning 4 = keep hands on wheel
+ # SysWarning 5 = keep hands on wheel (red)
+ # SysWarning 6 = keep hands on wheel (red) + beep
+ # Note: the warning is hidden while the blinkers are on
+ values["CF_Lkas_SysWarning"] = 0 #4 if sys_warning else 0
+
+ # Likely cars lacking the ability to show individual lane lines in the dash
+ elif CP.carFingerprint in (CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL):
+ # SysWarning 4 = keep hands on wheel + beep
+ values["CF_Lkas_SysWarning"] = 4 if sys_warning else 0
+
+ # SysState 0 = no icons
+ # SysState 1-2 = white car + lanes
+ # SysState 3 = green car + lanes, green steering wheel
+ # SysState 4 = green car + lanes
+ values["CF_Lkas_LdwsSysState"] = 3 if enabled else 1
+ values["CF_Lkas_LdwsOpt_USM"] = 2 # non-2 changes above SysState definition
+
+ # these have no effect
+ values["CF_Lkas_LdwsActivemode"] = 0
+ values["CF_Lkas_FcwOpt_USM"] = 0
+
+ elif CP.carFingerprint == CAR.HYUNDAI_GENESIS:
+ # This field is actually LdwsActivemode
+ # Genesis and Optima fault when forwarding while engaged
+ values["CF_Lkas_LdwsActivemode"] = 2
+
+ if is_ldws_car:
+ values["CF_Lkas_LdwsOpt_USM"] = 3
+
+ values["CF_Lkas_Chksum"] = 0
+
+ dat = packer.make_can_msg("LKAS11", 0, values)[1]
+
+ if CP.flags & HyundaiFlags.CHECKSUM_CRC8:
+ # CRC Checksum as seen on 2019 Hyundai Santa Fe
+ dat = dat[:6] + dat[7:8]
+ checksum = hyundai_checksum(dat)
+ elif CP.flags & HyundaiFlags.CHECKSUM_6B:
+ # Checksum of first 6 Bytes, as seen on 2018 Kia Sorento
+ checksum = sum(dat[:6]) % 256
+ else:
+ # Checksum of first 6 Bytes and last Byte as seen on 2018 Kia Stinger
+ checksum = (sum(dat[:6]) + dat[7]) % 256
+
+ values["CF_Lkas_Chksum"] = checksum
+
+ return packer.make_can_msg("LKAS11", 0, values)
+
+
+def create_clu11(packer, frame, clu11, button, CP):
+ values = {s: clu11[s] for s in [
+ "CF_Clu_CruiseSwState",
+ "CF_Clu_CruiseSwMain",
+ "CF_Clu_SldMainSW",
+ "CF_Clu_ParityBit1",
+ "CF_Clu_VanzDecimal",
+ "CF_Clu_Vanz",
+ "CF_Clu_SPEED_UNIT",
+ "CF_Clu_DetentOut",
+ "CF_Clu_RheostatLevel",
+ "CF_Clu_CluInfo",
+ "CF_Clu_AmpInfo",
+ "CF_Clu_AliveCnt1",
+ ]}
+ values["CF_Clu_CruiseSwState"] = button
+ values["CF_Clu_AliveCnt1"] = frame % 0x10
+ # send buttons to camera on camera-scc based cars
+ bus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC else 0
+ return packer.make_can_msg("CLU11", bus, values)
+
+
+def create_lfahda_mfc(packer, CC, blinking_signal):
+ activeCarrot = CC.hudControl.activeCarrot
+ values = {
+ "LFA_Icon_State": 2 if CC.latActive else 1 if CC.enabled else 0,
+ #"HDA_Active": 1 if activeCarrot >= 2 else 0,
+ #"HDA_Icon_State": 2 if activeCarrot == 3 and blinking_signal else 2 if activeCarrot >= 2 else 0,
+ "HDA_Icon_State": 0 if activeCarrot == 3 and blinking_signal else 2 if activeCarrot >= 1 else 0,
+ "HDA_VSetReq": 0, #set_speed_in_units if activeCarrot >= 2 else 0,
+ "HDA_USM" : 2,
+ "HDA_Icon_Wheel" : 1 if CC.latActive else 0,
+ #"HDA_Chime" : 1 if CC.latActive else 0, # comment for K9 chime,
+ }
+ return packer.make_can_msg("LFAHDA_MFC", 0, values)
+
+def create_acc_commands_scc(packer, enabled, accel, jerk, idx, hud_control, set_speed, stopping, long_override, suppress_casper_ev_fca, CS, soft_hold_mode):
+ from iqdbc.car.hyundai.carcontroller import HyundaiJerk
+ cruise_available = CS.out.cruiseState.available
+ if CS.paddle_button_prev > 0:
+ cruise_available = False
+ soft_hold_active = CS.softHoldActive
+ soft_hold_info = soft_hold_active > 1 and enabled
+ #soft_hold_mode = 2 ## some cars can't enable while braking
+ long_enabled = enabled or (soft_hold_active > 0 and soft_hold_mode == 2)
+ stop_req = 1 if stopping or (soft_hold_active > 0 and soft_hold_mode == 2) else 0
+ d = hud_control.leadDistance
+ objGap = 0 if d == 0 else 2 if d < 25 else 3 if d < 40 else 4 if d < 70 else 5
+ objGap2 = 0 if objGap == 0 else 2 if hud_control.leadRelSpeed < -0.2 else 1
+
+ if long_enabled:
+ if jerk.carrot_cruise == 1:
+ long_enabled = False
+ accel = -0.5
+ elif jerk.carrot_cruise == 2:
+ accel = jerk.carrot_cruise_accel
+
+ if long_enabled:
+ scc12_acc_mode = 2 if long_override else 1
+ scc14_acc_mode = 2 if long_override else 1
+ if CS.out.brakeHoldActive:
+ scc12_acc_mode = 0
+ scc14_acc_mode = 4
+ elif CS.out.brakePressed:
+ scc12_acc_mode = 1
+ scc14_acc_mode = 1
+ else:
+ scc12_acc_mode = 0
+ scc14_acc_mode = 4
+
+ warning_front = False
+
+ commands = []
+ if CS.scc11 is not None:
+ values = copy.copy(CS.scc11)
+ values["MainMode_ACC"] = 1 if cruise_available else 0
+ values["TauGapSet"] = hud_control.leadDistanceBars
+ values["VSetDis"] = set_speed if enabled else 0
+ values["AliveCounterACC"] = idx % 0x10
+ values["SCCInfoDisplay"] = 3 if warning_front else 4 if soft_hold_info else 0 if enabled else 0 #2: 크루즈 선택, 3: 전방상황주의, 4: 출발준비
+ values["ObjValid"] = 1 if hud_control.leadVisible else 0
+ values["ACC_ObjStatus"] = 1 if hud_control.leadVisible else 0
+ values["ACC_ObjLatPos"] = 0
+ values["ACC_ObjRelSpd"] = hud_control.leadRelSpeed
+ values["ACC_ObjDist"] = int(hud_control.leadDistance)
+ values["DriverAlertDisplay"] = 0
+ commands.append(packer.make_can_msg("SCC11", 0, values))
+
+ if CS.scc12 is not None:
+ values = copy.copy(CS.scc12)
+ values["ACCMode"] = scc12_acc_mode #2 if enabled and long_override else 1 if long_enabled else 0
+ values["StopReq"] = stop_req
+ values["aReqRaw"] = accel
+ values["aReqValue"] = accel
+ values["ACCFailInfo"] = 0
+
+ #values["DESIRED_DIST"] = CS.out.vEgo * 1.0 + 4.0 # TF: 1.0 + STOPDISTANCE 4.0 m로 가정함.
+
+ values["CR_VSM_ChkSum"] = 0
+ values["CR_VSM_Alive"] = idx % 0xF
+ scc12_dat = packer.make_can_msg("SCC12", 0, values)[1]
+ values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10
+
+ commands.append(packer.make_can_msg("SCC12", 0, values))
+
+ if CS.scc14 is not None:
+ values = copy.copy(CS.scc14)
+ values["ComfortBandUpper"] = jerk.cb_upper
+ values["ComfortBandLower"] = jerk.cb_lower
+ values["JerkUpperLimit"] = jerk.jerk_u
+ values["JerkLowerLimit"] = jerk.jerk_l if long_enabled else 0 # for KONA test
+ values["ACCMode"] = scc14_acc_mode #2 if enabled and long_override else 1 if long_enabled else 4 # stock will always be 4 instead of 0 after first disengage
+ values["ObjGap"] = objGap #2 if hud_control.leadVisible else 0 # 5: >30, m, 4: 25-30 m, 3: 20-25 m, 2: < 20 m, 0: no lead
+ values["ObjDistStat"] = objGap2
+ commands.append(packer.make_can_msg("SCC14", 0, values))
+
+ if CS.fca11 is not None and suppress_casper_ev_fca: # CASPER_EV의 경우 FCA11에서 fail이 간헐적 발생함.. 그냥막자.. 원인불명..
+ values = suppress_casper_ev_fca11_fault(copy.copy(CS.fca11))
+ fca11_dat = packer.make_can_msg("FCA11", 0, values)[1]
+ values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7])
+ commands.append(packer.make_can_msg("FCA11", 0, values))
+ # Only send FCA11 on cars where it exists on the bus
+ if False: #use_fca:
+ # note that some vehicles most likely have an alternate checksum/counter definition
+ # https://github.com/commaai/iqdbc/commit/9ddcdb22c4929baf310295e832668e6e7fcfa602
+ fca11_values = {
+ "CR_FCA_Alive": idx % 0xF,
+ "PAINT1_Status": 1,
+ "FCA_DrvSetStatus": 1,
+ "FCA_Status": 1, # AEB disabled
+ }
+ fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[1]
+ fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7])
+ commands.append(packer.make_can_msg("FCA11", 0, fca11_values))
+
+ return commands
+
+def create_acc_opt_copy(CS, packer):
+ values = copy.copy(CS.scc13)
+ if values["NEW_SIGNAL_1"] == 255:
+ values["NEW_SIGNAL_1"] = 218
+ values["NEW_SIGNAL_2"] = 0
+ return packer.make_can_msg("SCC13", 0, CS.scc13)
+
+def create_acc_commands(packer, enabled, accel, jerk, idx, hud_control, set_speed, stopping, long_override, use_fca, CP, CS, soft_hold_mode):
+ from iqdbc.car.hyundai.carcontroller import HyundaiJerk
+ cruise_available = CS.out.cruiseState.available
+ soft_hold_active = CS.softHoldActive
+ soft_hold_info = soft_hold_active > 1 and enabled
+ #soft_hold_mode = 2 ## some cars can't enable while braking
+ long_enabled = enabled or (soft_hold_active > 0 and soft_hold_mode == 2)
+ stop_req = 1 if stopping or (soft_hold_active > 0 and soft_hold_mode == 2) else 0
+ d = hud_control.leadDistance
+ objGap = 0 if d == 0 else 2 if d < 25 else 3 if d < 40 else 4 if d < 70 else 5
+ objGap2 = 0 if objGap == 0 else 2 if hud_control.leadRelSpeed < -0.2 else 1
+
+ if long_enabled:
+ scc12_acc_mode = 2 if long_override else 1
+ scc14_acc_mode = 2 if long_override else 1
+ if CS.out.brakeHoldActive:
+ scc12_acc_mode = 0
+ scc14_acc_mode = 4
+ elif CS.out.brakePressed:
+ scc12_acc_mode = 1
+ scc14_acc_mode = 1
+ else:
+ scc12_acc_mode = 0
+ scc14_acc_mode = 4
+
+ warning_front = False
+
+ commands = []
+
+ scc11_values = {
+ "MainMode_ACC": 1 if cruise_available else 0,
+ "TauGapSet": hud_control.leadDistanceBars,
+ "VSetDis": set_speed if enabled else 0,
+ "AliveCounterACC": idx % 0x10,
+ "SCCInfoDisplay": 3 if warning_front else 4 if soft_hold_info else 0 if enabled else 0,
+ "ObjValid": 1 if hud_control.leadVisible else 0, # close lead makes controls tighter
+ "ACC_ObjStatus": 1 if hud_control.leadVisible else 0, # close lead makes controls tighter
+ "ACC_ObjLatPos": 0,
+ "ACC_ObjRelSpd": hud_control.leadRelSpeed,
+ "ACC_ObjDist": int(hud_control.leadDistance), # close lead makes controls tighter
+ "DriverAlertDisplay": 0,
+ }
+ commands.append(packer.make_can_msg("SCC11", 0, scc11_values))
+
+ scc12_values = {
+ "ACCMode": scc12_acc_mode,
+ "StopReq": stop_req,
+ "aReqRaw": 0 if stop_req > 0 else accel,
+ "aReqValue": accel, # stock ramps up and down respecting jerk limit until it reaches aReqRaw
+ #"DESIRED_DIST": CS.out.vEgo * 1.0 + 4.0,
+ "CR_VSM_Alive": idx % 0xF,
+ }
+
+ # show AEB disabled indicator on dash with SCC12 if not sending FCA messages.
+ # these signals also prevent a TCS fault on non-FCA cars with alpha longitudinal
+ if not use_fca:
+ scc12_values["CF_VSM_ConfMode"] = 1
+ scc12_values["AEB_Status"] = 1 # AEB disabled
+
+ scc12_dat = packer.make_can_msg("SCC12", 0, scc12_values)[1]
+ scc12_values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10
+
+ commands.append(packer.make_can_msg("SCC12", 0, scc12_values))
+
+ scc14_values = {
+ "ComfortBandUpper": jerk.cb_upper, # stock usually is 0 but sometimes uses higher values
+ "ComfortBandLower": jerk.cb_lower, # stock usually is 0 but sometimes uses higher values
+ "JerkUpperLimit": jerk.jerk_u, # stock usually is 1.0 but sometimes uses higher values
+ "JerkLowerLimit": jerk.jerk_l, # stock usually is 0.5 but sometimes uses higher values
+ "ACCMode": scc14_acc_mode, # if enabled and long_override else 1 if enabled else 4, # stock will always be 4 instead of 0 after first disengage
+ "ObjGap": objGap, #2 if hud_control.leadVisible else 0, # 5: >30, m, 4: 25-30 m, 3: 20-25 m, 2: < 20 m, 0: no lead
+ "ObjDistStat": objGap2,
+ }
+ commands.append(packer.make_can_msg("SCC14", 0, scc14_values))
+
+ # Only send FCA11 on cars where it exists on the bus
+ # On Camera SCC cars, FCA11 is not disabled, so we forward stock FCA11 back to the car forward hooks
+ if use_fca and not (CP.flags & HyundaiFlags.CAMERA_SCC):
+ # note that some vehicles most likely have an alternate checksum/counter definition
+ # https://github.com/commaai/iqdbc/commit/9ddcdb22c4929baf310295e832668e6e7fcfa602
+ fca11_values = {
+ "CR_FCA_Alive": idx % 0xF,
+ "PAINT1_Status": 1,
+ "FCA_DrvSetStatus": 1,
+ "FCA_Status": 1, # AEB disabled
+ }
+ fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[1]
+ fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7])
+ commands.append(packer.make_can_msg("FCA11", 0, fca11_values))
+
+ return commands
+
+def create_acc_opt(packer, CP):
+ commands = []
+
+ scc13_values = {
+ "SCCDrvModeRValue": 2,
+ "SCC_Equip": 1,
+ "Lead_Veh_Dep_Alert_USM": 2,
+ }
+ commands.append(packer.make_can_msg("SCC13", 0, scc13_values))
+
+ # TODO: this needs to be detected and conditionally sent on unsupported long cars
+ # On Camera SCC cars, FCA12 is not disabled, so we forward stock FCA12 back to the car forward hooks
+ if not (CP.flags & HyundaiFlags.CAMERA_SCC):
+ fca12_values = {
+ "FCA_DrvSetState": 2,
+ "FCA_USM": 1, # AEB disabled
+ }
+ commands.append(packer.make_can_msg("FCA12", 0, fca12_values))
+
+ return commands
+
+def create_frt_radar_opt(packer):
+ frt_radar11_values = {
+ "CF_FCA_Equip_Front_Radar": 1,
+ }
+ return packer.make_can_msg("FRT_RADAR11", 0, frt_radar11_values)
+
+def create_clu11_button(packer, frame, clu11, button, CP):
+ values = clu11.copy()
+ values["CF_Clu_CruiseSwState"] = button
+ #values["CF_Clu_AliveCnt1"] = frame % 0x10
+ values["CF_Clu_AliveCnt1"] = (values["CF_Clu_AliveCnt1"] + 1) % 0x10
+ # send buttons to camera on camera-scc based cars
+ bus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC else 0
+ return packer.make_can_msg("CLU11", bus, values)
+
+def create_mdps12(packer, frame, mdps12):
+ values = mdps12
+ values["CF_Mdps_ToiActive"] = 0
+ values["CF_Mdps_ToiUnavail"] = 1
+ values["CF_Mdps_MsgCount2"] = frame % 0x100
+ values["CF_Mdps_Chksum2"] = 0
+
+ dat = packer.make_can_msg("MDPS12", 2, values)[1]
+ checksum = sum(dat) % 256
+ values["CF_Mdps_Chksum2"] = checksum
+
+ return packer.make_can_msg("MDPS12", 2, values)
diff --git a/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py b/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py
new file mode 100644
index 000000000..3d210f0cd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py
@@ -0,0 +1,933 @@
+import copy
+import numpy as np
+from iqdbc.car import CanBusBase
+from iqdbc.car.crc import CRC16_XMODEM
+from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiExtFlags
+from openpilot.common.params import Params
+from iqdbc.car.common.conversions import Conversions as CV
+from cereal import log
+
+LaneChangeState = log.LaneChangeState
+LaneChangeDirection = log.LaneChangeDirection
+TurnDirection = log.Desire
+
+
+def hyundai_crc8(data: bytes) -> int:
+ poly = 0x2F
+ crc = 0xFF
+
+ for byte in data:
+ crc ^= byte
+ for _ in range(8):
+ if crc & 0x80:
+ crc = ((crc << 1) ^ poly) & 0xFF
+ else:
+ crc = (crc << 1) & 0xFF
+
+ return crc ^ 0xFF
+
+class CanBus(CanBusBase):
+ def __init__(self, CP, fingerprint=None, lka_steering=None) -> None:
+ super().__init__(CP, fingerprint)
+
+ if lka_steering is None:
+ lka_steering = 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
+ # a different bus, since the steering is done by different ECUs.
+ self._a, self._e = 1, 0
+ if lka_steering and Params().get_int("HyundaiCameraSCC") == 0: #배선개조는 무조건 Bus0가 ECAN임.
+ self._a, self._e = 0, 1
+
+ self._a += self.offset
+ self._e += self.offset
+ self._cam = 2 + self.offset
+
+ @property
+ def ECAN(self):
+ return self._e
+
+ @property
+ def ACAN(self):
+ return self._a
+
+ @property
+ def CAM(self):
+ return self._cam
+
+# CAN LIST (CAM) - 롱컨개조시... ADAS + CAM
+# 160: ADRV_0x160
+# 1da: ADRV_0x1da
+# 1ea: ADRV_0x1ea
+# 200: ADRV_0x200
+# 345: ADRV_0x345
+# 1fa: CLUSTER_SPEED_LIMIT
+# 12a: LFA
+# 1e0: LFAHDA_CLUSTER
+# 11a:
+# 1b5:
+# 1a0: SCC_CONTROL
+
+# CAN LIST (ACAN)
+# 160: ADRV_0x160
+# 51: ADRV_0x51
+# 180: CAM_0x180
+# ...
+# 185: CAM_0x185
+# 1b6: CAM_0x1b6
+# ...
+# 1b9: CAM_0x1b9
+# 1fb: CAM_0x1fb
+# 2a2 - 2a4
+# 2bb - 2be
+# LKAS
+# 201 - 2a0
+
+
+
+def create_steering_messages_camera_scc(frame, packer, CP, CAN, CC, lat_active, apply_steer, CS, apply_angle, max_torque, angle_control):
+
+ emergency_steering = False
+ if CS.adrv_0x161 is not None:
+ values = CS.adrv_0x161
+ emergency_steering = values["ALERTS_1"] in [11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26]
+
+
+ ret = []
+ if CS.mdps is not None:
+ values = copy.copy(CS.mdps)
+ #rx_counter = values.pop("COUNTER", None)
+ if angle_control:
+ if CS.lfa_alt is not None:
+ values["LFA2_ACTIVE"] = CS.lfa_alt["LKAS_ANGLE_ACTIVE"]
+ else:
+ if CS.lfa is not None:
+ values["LKA_ACTIVE"] = 1 if CS.lfa["STEER_REQ"] == 1 else 0
+
+ if frame % 1000 < 40:
+ values["STEERING_COL_TORQUE"] += 220
+ #ret.append(packer.make_can_msg("MDPS", CAN.CAM, values, rx_counter = rx_counter))
+ ret.append(packer.make_can_msg("MDPS", CAN.CAM, values))
+
+ if frame % 10 == 0:
+ if CS.steer_touch_2af is not None:
+ values = copy.copy(CS.steer_touch_2af)
+ if frame % 1000 < 40:
+ values["TOUCH_DETECT"] = 3
+ values["TOUCH1"] = 50
+ values["TOUCH2"] = 50
+ values["CHECKSUM_"] = 0
+ dat = packer.make_can_msg("STEER_TOUCH_2AF", 0, values)[1]
+ values["CHECKSUM_"] = hyundai_crc8(dat[1:8])
+
+ ret.append(packer.make_can_msg("STEER_TOUCH_2AF", CAN.CAM, values))
+
+ if angle_control:
+ if CS.lfa_alt is not None:
+ values = copy.copy(CS.lfa_alt)
+ rx_counter = values.pop("COUNTER", None)
+ if emergency_steering:
+ pass
+ else:
+ #values = {} #CS.lfa_alt
+ values["LKAS_ANGLE_ACTIVE"] = 2 if CC.latActive else 1
+ values["LKAS_ANGLE_CMD"] = -apply_angle
+ values["LKAS_ANGLE_MAX_TORQUE"] = max_torque if CC.latActive else 0
+ ret.append(packer.make_can_msg("LFA_ALT", CAN.ECAN, values, rx_counter = rx_counter))
+
+ if CS.lfa is not None:
+ values = copy.copy(CS.lfa)
+ rx_counter = values.pop("COUNTER", None)
+ if not emergency_steering:
+ values["LKA_MODE"] = 0
+ values["LKA_ICON"] = 2 if CC.latActive else 1
+ values["TORQUE_REQUEST"] = -1024 # apply_steer,
+ values["VALUE63"] = 0 # LKA_ASSIST
+ values["STEER_REQ"] = 0 # 1 if lat_active else 0,
+ values["HAS_LANE_SAFETY"] = 0 # hide LKAS settings
+ values["LKA_ACTIVE"] = 3 if CC.latActive else 0 # this changes sometimes, 3 seems to indicate engaged
+ values["VALUE64"] = 0 #STEER_MODE, NEW_SIGNAL_2
+ values["LKAS_ANGLE_CMD"] = -25.6 #-apply_angle,
+ values["LKAS_ANGLE_ACTIVE"] = 0 #2 if lat_active else 1,
+ values["LKAS_ANGLE_MAX_TORQUE"] = 0 #max_torque if lat_active else 0,
+ values["NEW_SIGNAL_1"] = 10
+ ret.append(packer.make_can_msg("LFA", CAN.ECAN, values, rx_counter = rx_counter))
+
+ elif CS.lfa is not None:
+ values = {}
+ values["LKA_MODE"] = 2
+ values["LKA_ICON"] = 2 if lat_active else 1
+ values["TORQUE_REQUEST"] = apply_steer
+ values["STEER_REQ"] = 1 if lat_active else 0
+ values["VALUE64"] = 0 # STEER_MODE, NEW_SIGNAL_2
+ values["HAS_LANE_SAFETY"] = 0
+ values["LKA_ACTIVE"] = 0 # NEW_SIGNAL_1
+
+ values["DampingGain"] = 0 if lat_active else 100
+ #values["VALUE63"] = 0
+
+ #values["VALUE82_SET256"] = 0
+
+ ret.append(packer.make_can_msg("LFA", CAN.ECAN, values))
+
+ return ret
+
+def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_steer, apply_angle, max_torque, angle_control):
+
+ ret = []
+ if angle_control:
+ values = {
+ "LKA_MODE": 0,
+ "LKA_ICON": 2 if enabled else 1,
+ "TORQUE_REQUEST": 0, # apply_steer,
+ "VALUE63": 0, # LKA_ASSIST
+ "STEER_REQ": 0, # 1 if lat_active else 0,
+ "HAS_LANE_SAFETY": 0, # hide LKAS settings
+ "LKA_ACTIVE": 3 if lat_active else 0, # this changes sometimes, 3 seems to indicate engaged
+ "VALUE64": 0, #STEER_MODE, NEW_SIGNAL_2
+ "LKAS_ANGLE_CMD": -apply_angle,
+ "LKAS_ANGLE_ACTIVE": 2 if lat_active else 1,
+ "LKAS_ANGLE_MAX_TORQUE": max_torque if lat_active else 0,
+
+ # test for EV6PE
+ "NEW_SIGNAL_1": 10, #2,
+ "DampingGain": 9,
+ "VALUE231": 146,
+ "VALUE239": 1,
+ "VALUE247": 255,
+ "VALUE255": 255,
+ }
+ else:
+ values = {
+ "LKA_MODE": 2,
+ "LKA_ICON": 2 if enabled else 1,
+ "TORQUE_REQUEST": apply_steer,
+ "DampingGain": 100, #3 if enabled else 100,
+ "STEER_REQ": 1 if lat_active else 0,
+ #"STEER_MODE": 0,
+ "HAS_LANE_SAFETY": 0, # hide LKAS settings
+ "VALUE63": 0,
+ "VALUE64": 100,
+ }
+
+ if CP.flags & HyundaiFlags.CANFD_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, values))
+ if not (CP.flags & HyundaiFlags.CAMERA_SCC.value):
+ ret.append(packer.make_can_msg(lkas_msg, CAN.ACAN, values))
+ else:
+ ret.append(packer.make_can_msg("LFA", CAN.ECAN, values))
+
+ return ret
+
+def create_suppress_lfa(packer, CAN, CS):
+ if CS.cam_0x362 is not None:
+ suppress_msg = "CAM_0x362"
+ lfa_block_msg = CS.cam_0x362
+ elif CS.cam_0x2a4 is not None:
+ suppress_msg = "CAM_0x2a4"
+ lfa_block_msg = CS.cam_0x2a4
+ else:
+ return []
+
+ #values = {f"BYTE{i}": lfa_block_msg[f"BYTE{i}"] for i in range(3, msg_bytes) if i != 7}
+ values = copy.copy(lfa_block_msg)
+ values["COUNTER"] = lfa_block_msg["COUNTER"]
+ values["SET_ME_0"] = 0
+ values["SET_ME_0_2"] = 0
+ values["LEFT_LANE_LINE"] = 0
+ values["RIGHT_LANE_LINE"] = 0
+ return [packer.make_can_msg(suppress_msg, CAN.ACAN, values)]
+
+def create_buttons(packer, CP, CAN, cnt, btn):
+ values = {
+ "COUNTER": cnt,
+ "SET_ME_1": 1,
+ "CRUISE_BUTTONS": btn,
+ }
+
+ #bus = CAN.ECAN if CP.flags & HyundaiFlags.CANFD_HDA2 else CAN.CAM
+ bus = CAN.ECAN
+ return packer.make_can_msg("CRUISE_BUTTONS", bus, values)
+
+def create_acc_cancel(packer, CP, CAN, cruise_info_copy):
+ # TODO: why do we copy different values here?
+ if CP.flags & HyundaiFlags.CANFD_CAMERA_SCC.value:
+ values = {s: cruise_info_copy[s] for s in [
+ "COUNTER",
+ "CHECKSUM",
+ "NEW_SIGNAL_1",
+ "MainMode_ACC",
+ "ACCMode",
+ "ZEROS_9",
+ "CRUISE_STANDSTILL",
+ "ZEROS_5",
+ "DISTANCE_SETTING",
+ "VSetDis",
+ ]}
+ else:
+ values = {s: cruise_info_copy[s] for s in [
+ "COUNTER",
+ "CHECKSUM",
+ "ACCMode",
+ "VSetDis",
+ "CRUISE_STANDSTILL",
+ ]}
+ values.update({
+ "ACCMode": 4,
+ "aReqRaw": 0.0,
+ "aReqValue": 0.0,
+ })
+ return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values)
+
+def create_lfahda_cluster(packer, CS, CAN, long_active, lat_active):
+
+
+ if CS.lfahda_cluster is not None:
+ values = copy.copy(CS.lfahda_cluster)
+ rx_counter = values.pop("COUNTER", None)
+ else:
+ return []
+ values = {}
+ rx_counter = None
+ values["LFA_OptUsmSta"] = 2
+ values["HDA_OptUsmSta"] = 2
+ values["HDA_CntrlModSta"] = 2 if long_active else 0
+ values["HDA_LFA_SymSta"] = 2 if lat_active else 0
+ return [packer.make_can_msg("LFAHDA_CLUSTER", CAN.ECAN, values, rx_counter=rx_counter)]
+
+def create_lfa_icon_non_camera_scc(packer, CS, CAN, CC):
+ ret = []
+ if CS.adrv_0x161 is not None:
+ values = copy.copy(CS.adrv_0x161)
+ rx_counter = values.pop("COUNTER", None)
+
+ lat_active = CC.latActive
+ lat_enabled = CS.out.latEnabled
+
+ values["LFA_ICON"] = 2 if lat_active else 1 if lat_enabled else 0
+ values["LKA_ICON"] = 4 if lat_active else 3 if lat_enabled else 0
+
+ if values["ALERTS_2"] in [1, 2, 5, 6, 10, 21, 22]:
+ values["ALERTS_2"] = 0
+ values["DAW_ICON"] = 0
+
+ if values["ALERTS_1"] == 0:
+ values["SOUNDS_1"] = 0
+ values["SOUNDS_2"] = 0
+ values["SOUNDS_4"] = 0
+
+ if values["ALERTS_3"] in [3, 4, 11, 12, 13, 14, 17, 19, 26, 7, 8, 9, 10]:
+ values["ALERTS_3"] = 0
+ values["SOUNDS_3"] = 0
+
+ if values["ALERTS_5"] in [1, 2, 3, 4, 5]:
+ values["ALERTS_5"] = 0
+
+ ret.append(packer.make_can_msg("ADRV_0x161", CAN.ECAN, values, rx_counter=rx_counter))
+ return ret
+
+def create_acc_control_scc2(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control, hyundai_jerk, CS):
+
+ if CS.scc_control is None:
+ return None
+ enabled = (enabled or CS.softHoldActive > 0) and CS.paddle_button_prev == 0
+
+ acc_mode = 0 if not enabled else (2 if gas_override else 1)
+
+ if hyundai_jerk.carrot_cruise == 1:
+ acc_mode = 4 if enabled else 0
+ enabled = False
+ accel = accel_last = 0.5
+
+ elif hyundai_jerk.carrot_cruise == 2:
+ accel = accel_last = hyundai_jerk.carrot_cruise_accel
+
+ jerk_u = hyundai_jerk.jerk_u
+ jerk_l = hyundai_jerk.jerk_l
+ jerk = 5
+ jn = jerk / 50
+ if not enabled or gas_override:
+ a_val, a_raw = 0, 0
+ else:
+ a_raw = accel
+ a_val = accel #np.clip(accel, accel_last - jn, accel_last + jn)
+
+ values = copy.copy(CS.scc_control)
+ rx_counter = values.pop("COUNTER", None)
+ values["ACCMode"] = acc_mode
+ values["MainMode_ACC"] = 1
+ values["StopReq"] = 1 if stopping or CS.softHoldActive > 0 else 0 # 1: Stop control is required, 2: Not used, 3: Error Indicator
+ values["aReqValue"] = a_val
+ values["aReqRaw"] = a_raw
+ values["VSetDis"] = set_speed
+ #values["JerkLowerLimit"] = jerk if enabled else 1
+ #values["JerkUpperLimit"] = 3.0
+ values["JerkLowerLimit"] = jerk_l if enabled else 1
+ values["JerkUpperLimit"] = 2.0 if stopping or CS.softHoldActive else jerk_u
+ values["DISTANCE_SETTING"] = hud_control.leadDistanceBars # + 5
+ #values["DISTANCE_SETTING"] = hud_control.leadDistanceBars + 5
+
+ #values["ACC_ObjDist"] = 1
+ #values["ObjValid"] = 0
+ #values["OBJ_STATUS"] = 2
+ #values["NSCCOper"] = 1 if enabled else 0 # 0: off, 1: Ready, 2: Act, 3: Error Indicator
+ #values["NSCCOnOff"] = 2 # 0: Default, 1: Off, 2: On, 3: Invalid
+ #values["SET_ME_3"] = 0x3 # objRelsped와 충돌
+ #values["ACC_ObjLatPos"] = - hud_control.leadDPath
+ values["DriveMode"] = 0 # 0: Default, 1: Comfort Mode, 2:Normal mode, 3:Dynamic mode, reserved
+
+ hud_lead_info = 0
+ if hud_control.leadVisible:
+ hud_lead_info = 1 if values["ACC_ObjRelSpd"] > 0 else 2
+ values["HUD_LEAD_INFO"] = hud_lead_info #1: in-path object detected(uncontrollable), 2: controllable long, 3: controllable long & lat, ... reserved
+
+ values["DriverAlert"] = 0 # 1: SCC Disengaged, 2: No SCC Engage condition, 3: SCC Disenganed when the vehicle stops
+
+ values["TARGET_DISTANCE"] = CS.out.vEgo * 1.0 + 4.0
+
+ soft_hold_info = 1 if CS.softHoldActive > 1 and enabled else 0
+
+ # 이거안하면 정지중 뒤로 밀리는 현상 발생하는듯.. (신호정지중에 뒤로 밀리는 경험함.. 시험해봐야)
+ if values["InfoDisplay"] != 5: #5: Front Car Departure Notice
+ values["InfoDisplay"] = 4 if stopping and CS.out.aEgo > -0.3 else 0 # 1: SCC Mode, 2: Convention Cruise Mode, 3: Object disappered at low speed, 4: Available to resume acceleration control, 5: Front vehicle departure notice, 6: Reserved, 7: Invalid
+
+ values["TakeOverReq"] = 0 # 1: Takeover request, 2: Not used, 3: Error indicator , 이것이 켜지면 가속을 안하는듯함.
+ #values["NEW_SIGNAL_4"] = 9 if hud_control.leadVisible else 0
+ # AccelLimitBandUpper, Lower
+ values["SysFailState"] = 0 # 1: Performance degredation, 2: system temporairy unavailble, 3: SCC Service required , 눈이 묻어 레이더오류시... 2가 됨. 이때 가속을 안함...
+
+ values["AccelLimitBandUpper"] = 0.0 # 이값이 1.26일때 가속을 안하는 증상이 보임..
+ values["AccelLimitBandLower"] = 0.0
+
+ values["ZEROS_7"] = 1
+
+ return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values)
+
+def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control, jerk_u, jerk_l, CS):
+
+ enabled = enabled or CS.softHoldActive > 0
+ jerk = 5
+ jn = jerk / 50
+ if not enabled or gas_override:
+ a_val, a_raw = 0, 0
+ else:
+ a_raw = accel
+ a_val = np.clip(accel, accel_last - jn, accel_last + jn)
+
+ values = {
+ "ACCMode": 0 if not enabled else (2 if gas_override else 1),
+ "MainMode_ACC": 1,
+ "StopReq": 1 if stopping or CS.softHoldActive > 0 else 0,
+ "aReqValue": a_val,
+ "aReqRaw": a_raw,
+ "VSetDis": set_speed,
+ #"JerkLowerLimit": jerk if enabled else 1,
+ #"JerkUpperLimit": 3.0,
+ "JerkLowerLimit": jerk_l if enabled else 1,
+ "JerkUpperLimit": jerk_u,
+
+ "ACC_ObjDist": 1,
+ #"ObjValid": 0,
+ #"OBJ_STATUS": 2,
+ "NSCCOper": 0,
+ "NSCCOnOff": 2,
+ "DriveMode": 0,
+ #"SET_ME_3": 0x3,
+ "ACC_ObjLatPos": 0x64,
+ "DISTANCE_SETTING": hud_control.leadDistanceBars, # + 5,
+ "InfoDisplay": 4 if stopping and CS.out.cruiseState.standstill else 0,
+ }
+
+ return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values)
+
+
+def create_spas_messages(packer, CAN, frame, left_blink, right_blink):
+ ret = []
+
+ values = {
+ }
+ ret.append(packer.make_can_msg("SPAS1", CAN.ECAN, values))
+
+ blink = 0
+ if left_blink:
+ blink = 3
+ elif right_blink:
+ blink = 4
+ values = {
+ "BLINKER_CONTROL": blink,
+ }
+ ret.append(packer.make_can_msg("SPAS2", CAN.ECAN, values))
+
+ return ret
+
+
+def create_fca_warning_light(CP, packer, CAN, frame):
+ ret = []
+ if CP.flags & HyundaiFlags.CAMERA_SCC.value:
+ return ret
+
+ if frame % 2 == 0:
+ values = {
+ 'AEB_SETTING': 0x1, # show AEB disabled icon
+ 'SET_ME_2': 0x2,
+ 'SET_ME_FF': 0xff,
+ 'SET_ME_FC': 0xfc,
+ 'SET_ME_9': 0x9,
+ #'DATA102': 1,
+ }
+ ret.append(packer.make_can_msg("ADRV_0x160", CAN.ECAN, values))
+ return ret
+
+def create_tcs_messages(packer, CAN, CS):
+ ret = []
+ if CS.tcs is not None:
+ values = copy.copy(CS.tcs)
+ #rx_counter = values.pop("COUNTER", None)
+ values["DriverBraking"] = 0
+ values["NEW_SIGNAL_20"] = 0
+ values["NEW_SIGNAL_11"] = 0
+ values["DriverBrakingLowSens"] = 0
+ #values["NEW_SIGNAL_1"] = 0 # accel과 관련.. 옆두부 꺼지는것과 관련? 확인필요
+ #values["ACC_REQ"] = 1 # 옆두부 꺼지는것과 관련? 확인필요.. 항상 켜지게함..
+ values["NEW_SIGNAL_1"] = 0 if values["ACC_REQ"] == 1 else 1 # 옆두부..
+ #ret.append(packer.make_can_msg("TCS", CAN.CAM, values, rx_counter = rx_counter))
+ ret.append(packer.make_can_msg("TCS", CAN.CAM, values))
+ return ret
+
+def forward_button_message(packer, CAN, frame, CS, cruise_button, MainMode_ACC_trigger, LFA_trigger):
+ ret = []
+ if frame % 2 == 0:
+ if CS.cruise_buttons_msg is not None:
+ values = copy.copy(CS.cruise_buttons_msg)
+ # A held MAIN is reported on this bit and switches some clusters to LIMIT mode.
+ values["NORMAL_CRUISE_MAIN_BTN"] = 0
+ #rx_counter = values.pop("COUNTER", None)
+ cruise_button_driver = values["CRUISE_BUTTONS"]
+ if cruise_button_driver == 0:
+ values["CRUISE_BUTTONS"] = cruise_button
+ if MainMode_ACC_trigger > 0:
+ #values["ADAPTIVE_CRUISE_MAIN_BTN"] = 1
+ pass
+ elif LFA_trigger > 0:
+ values["LFA_BTN"] = 1
+
+ #ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values, rx_counter = rx_counter))
+ ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values))
+ return ret
+
+def create_adrv_messages(CP, packer, CAN, frame):
+ # messages needed to car happy after disabling
+ # the ADAS Driving ECU to do longitudinal control
+
+ ret = []
+
+ if not CP.flags & HyundaiFlags.CAMERA_SCC.value:
+ values = {}
+
+ ret.extend(create_fca_warning_light(CP, packer, CAN, frame))
+ if frame % 5 == 0:
+ values = {
+ #'HDA_MODE1': 0x8,
+ 'HDA_MODE2': 0x1,
+ #'SET_ME_1C': 0x1c,
+ 'SET_ME_FF': 0xff,
+ #'SET_ME_TMP_F': 0xf,
+ #'SET_ME_TMP_F_2': 0xf,
+ #'DATA26': 1, #1
+ #'DATA32': 5, #5
+ }
+ ret.append(packer.make_can_msg("ADRV_0x1ea", CAN.ECAN, values))
+
+ values = {
+ 'SET_ME_E1': 0xe1,
+ #'SET_ME_3A': 0x3a,
+ 'TauGapSet' : 1,
+ 'NEW_SIGNAL_2': 3,
+ }
+ ret.append(packer.make_can_msg("ADRV_0x200", CAN.ECAN, values))
+
+ if frame % 20 == 0:
+ values = {
+ 'SET_ME_15': 0x15,
+ }
+ ret.append(packer.make_can_msg("ADRV_0x345", CAN.ECAN, values))
+
+ if frame % 100 == 0:
+ values = {
+ 'SET_ME_22': 0x22,
+ 'SET_ME_41': 0x41,
+ }
+ ret.append(packer.make_can_msg("ADRV_0x1da", CAN.ECAN, values))
+
+ return ret
+
+## carrot
+def alt_cruise_buttons(packer, CP, CAN, buttons, cruise_btns_msg, cnt):
+ cruise_btns_msg["CRUISE_BUTTONS"] = buttons
+ cruise_btns_msg["COUNTER"] = (cruise_btns_msg["COUNTER"] + 1 + cnt) % 256
+ bus = CAN.ECAN if CP.flags & HyundaiFlags.CANFD_HDA2 else CAN.CAM
+ return packer.make_can_msg("CRUISE_BUTTONS_ALT", bus, cruise_btns_msg)
+
+def hkg_can_fd_checksum(address: int, sig, d: bytearray) -> int:
+ crc = 0
+ for i in range(2, len(d)):
+ crc = ((crc << 8) ^ CRC16_XMODEM[(crc >> 8) ^ d[i]]) & 0xFFFF
+ crc = ((crc << 8) ^ CRC16_XMODEM[(crc >> 8) ^ ((address >> 0) & 0xFF)]) & 0xFFFF
+ crc = ((crc << 8) ^ CRC16_XMODEM[(crc >> 8) ^ ((address >> 8) & 0xFF)]) & 0xFFFF
+ if len(d) == 8:
+ crc ^= 0x5F29
+ elif len(d) == 16:
+ crc ^= 0x041D
+ elif len(d) == 24:
+ crc ^= 0x819D
+ elif len(d) == 32:
+ crc ^= 0x9F5B
+ return crc
+
+
+
+
+def _clip_int(x, lo, hi):
+ return lo if x < lo else hi if x > hi else int(x)
+
+def _get_desire_and_lane_changing(md):
+ desire = 0
+ lane_changing = 0
+ if md is not None:
+ desire = md.meta.desire.raw
+ ds = md.meta.desireState
+ if len(ds) > 4:
+ if ds[1] > 0.9: lane_changing = 1
+ if ds[2] > 0.9: lane_changing = 2
+ if ds[3] > 0.9: lane_changing = 3
+ if ds[4] > 0.9: lane_changing = 4
+ return desire, lane_changing
+
+def _apply_lane_desire(values, desire):
+ #values['LANE_CHANGING'] = 0
+
+ if desire == 1: # 좌회전
+ values['LANE_CHANGING'] = 1
+ values["LANELINE_CURVATURE"] = 15
+ values["LANELINE_CURVATURE_DIRECTION"] = 0
+
+ elif desire == 2: # 우회전
+ values['LANE_CHANGING'] = 2
+ values["LANELINE_CURVATURE"] = 15
+ values["LANELINE_CURVATURE_DIRECTION"] = 1
+
+ elif desire == 3: # 좌차선변경
+ values['LANE_CHANGING'] = 3
+
+ elif desire == 4: # 우차선변경
+ values['LANE_CHANGING'] = 4
+
+def _apply_radar_blink(values, radar_pairs, frame, *,
+ disp_dist=30.0, min_dist=14.0,
+ max_interval=100, t=1.0):
+ """
+ 거리 > min_dist 일 때만 깜빡임.
+ 거리 멀수록 interval 커짐(느리게).
+ """
+ for det_key, dist_key in radar_pairs:
+ dist = values[dist_key]
+ if dist <= min_dist:
+ continue
+
+ d = min(dist, disp_dist)
+ interval = int((1 + (max_interval - 1) * (d / disp_dist)) * t)
+ interval = _clip_int(interval, 1, max_interval)
+
+ blink = (frame // interval) & 1
+ values[det_key] = 2 - blink
+ values[dist_key] = min_dist
+
+def _suppress_trailer_mode_warning(values, CS):
+ # Logs from IONIQ 9 show ALERTS_5=6 is the periodic
+ # "driver assistance limited in trailer mode" popup.
+ if CS.trailer_connected and values.get("ALERTS_5") == 6:
+ values["ALERTS_5"] = 0
+
+def _make_ccnc_values(values, CS, lat_active, frame, hud_control,
+ lane_line=True, corner_radar=True,
+ desire=0,
+ blink_pairs=None,
+ blink_t=1.0):
+ if lane_line:
+ curvature = round(CS.out.steeringAngleDeg / 3)
+ mag = min(abs(curvature), 15)
+ curv = mag + (-1 if curvature < 0 else 0)
+ direction = 1 if curvature < 0 else 0
+ values["LANELINE_CURVATURE"] = curv if lat_active else 0
+ values["LANELINE_CURVATURE_DIRECTION"] = direction if lat_active else 0
+ if desire:
+ _apply_lane_desire(values, desire)
+
+ if corner_radar:
+ radar_all = [
+ ('LF_DETECT', 'LF_DETECT_DISTANCE'),
+ ('RF_DETECT', 'RF_DETECT_DISTANCE'),
+ ('LR_DETECT', 'LR_DETECT_DISTANCE'),
+ ('RR_DETECT', 'RR_DETECT_DISTANCE'),
+ ]
+ for det_key, dist_key in radar_all:
+ if values[det_key] >= 4 and values[dist_key] != 0:
+ values[det_key] = 1
+
+ if blink_pairs:
+ _apply_radar_blink(values, blink_pairs, frame, t=blink_t)
+
+def create_ccnc_messages(CP, packer, CAN, frame, CC, CS, hud_control,
+ disp_angle, left_lane_warning, right_lane_warning,
+ enable_corner_radar, stopping, canfd_debug):
+ ret = []
+
+ md = CS.modelV2
+ if not hasattr(create_ccnc_messages, '_lane_line_check') or frame % 100 == 0:
+ create_ccnc_messages._lane_line_check = Params().get_int("LaneLineCheck")
+ lane_line_check = create_ccnc_messages._lane_line_check
+ desire, lane_changing = _get_desire_and_lane_changing(md)
+
+ if CP.flags & HyundaiFlags.CAMERA_SCC.value:
+ HDA_CntrlModSta = 0
+ HDA_LFA_SymSta = 0
+ if CS.lfahda_cluster is not None:
+ HDA_CntrlModSta = CS.lfahda_cluster["HDA_CntrlModSta"]
+ HDA_LFA_SymSta = CS.lfahda_cluster["HDA_LFA_SymSta"]
+
+ if frame % 2 == 0:
+ #if CS.adrv_0x160 is not None:
+ # values = copy.copy(CS.adrv_0x160)
+ # ret.append(packer.make_can_msg("ADRV_0x160", CAN.ECAN, values))
+
+ if CS.cruise_buttons_msg is not None:
+ values = copy.copy(CS.cruise_buttons_msg)
+ # Keep the physical long press on ECAN for CarState, but don't forward it to CAM.
+ values["NORMAL_CRUISE_MAIN_BTN"] = 0
+
+ if HDA_LFA_SymSta == 0 and 0 < frame % 200 < 12:
+ values["LFA_BTN"] = 1
+
+ if CC.enabled:
+ if not CS.MainMode_ACC:
+ if 10 < frame % 200 <= 16 and CS.out.vEgo > 3.:
+ values["ADAPTIVE_CRUISE_MAIN_BTN"] = 1
+ elif CS.ACCMode in [0, 4]:
+ if 10 < frame % 200 <= 16 and CS.out.vEgo > 3.:
+ values["CRUISE_BUTTONS"] = 2
+ elif CS.scc_control is not None and CS.scc_control["InfoDisplay"] == 4:
+ if 10 < frame % 30 <= 16 and not stopping:
+ values["CRUISE_BUTTONS"] = 2
+ else:
+ if CS.adrv_0x1ea is not None and CS.adrv_0x1ea["HDA_MODE2"] == 0: # if corner radar is disabled, send main btn
+ if 10 < frame % 1000 <= 16 and CS.out.vEgo > 3:
+ values["ADAPTIVE_CRUISE_MAIN_BTN"] = 1
+
+ ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values))
+
+ # --- 0x161/0x200/0x1ea/0x162 (frame%5) ---
+ if frame % 5 == 0:
+ lat_active = CC.latActive
+
+ if CS.adrv_0x161 is not None:
+ main_enabled = CS.out.cruiseState.available
+ cruise_enabled = CC.enabled
+ lat_enabled = CS.out.latEnabled
+ nav_active = hud_control.activeCarrot > 1
+
+ # hdpuse carrot
+ hdp_use = int(Params().get("HDPuse"))
+ hdp_active = False
+ if hdp_use == 1:
+ hdp_active = cruise_enabled and nav_active
+ elif hdp_use == 2:
+ hdp_active = cruise_enabled
+ # hdpuse carrot
+
+ values = copy.copy(CS.adrv_0x161)
+ rx_counter = values.pop("COUNTER", None)
+ values["SETSPEED"] = (6 if hdp_active else 3 if cruise_enabled else 1) if main_enabled else 0
+ values["SETSPEED_HUD"] = (5 if hdp_active else 3 if cruise_enabled else 1) if main_enabled else 0
+
+ set_speed_in_units = hud_control.setSpeed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH)
+ values["vSetDis"] = int(set_speed_in_units + 0.5)
+
+ values["DISTANCE"] = 4 if hdp_active else hud_control.leadDistanceBars
+ values["DISTANCE_LEAD"] = 2 if cruise_enabled and hud_control.leadVisible else 1 if main_enabled and hud_control.leadVisible else 0
+ values["DISTANCE_CAR"] = 3 if hdp_active else 2 if cruise_enabled else 1 if main_enabled else 0
+ values["DISTANCE_SPACING"] = 5 if hdp_active else 1 if cruise_enabled else 0
+
+ values["TARGET"] = 1 if hud_control.leadVisible and cruise_enabled else 0
+ values["TARGET_DISTANCE"] = int(hud_control.leadDistance)
+
+ values["BACKGROUND"] = 6 if CS.paddle_button_prev > 0 else 1 if cruise_enabled else 3 if lat_active else 7
+ values["CENTERLINE"] = 1 if HDA_CntrlModSta > 0 else 0
+ values["CAR_CIRCLE"] = 2 if hdp_active else 1 if cruise_enabled else 0
+
+ values["NAV_ICON"] = 2 if nav_active and cruise_enabled else 1 if main_enabled and nav_active else 0
+ values["HDA_ICON"] = 5 if hdp_active else 2 if cruise_enabled else 1 if main_enabled else 0
+ values["LFA_ICON"] = 5 if hdp_active else 2 if lat_active else 1 if lat_enabled else 0
+ values["LKA_ICON"] = 4 if lat_active else 3 if lat_enabled else 0
+ values["FCA_ALT_ICON"] = 0
+
+ if values["ALERTS_2"] in [1, 2, 5, 6, 10, 21, 22]:
+ values["ALERTS_2"] = 0
+ values["DAW_ICON"] = 0
+
+ if values["ALERTS_1"] == 0: # alerts가 있으면 사운드도 같이 나옴
+ values["SOUNDS_1"] = 0
+ values["SOUNDS_2"] = 0
+ values["SOUNDS_4"] = 0
+
+ if values["ALERTS_3"] in [3, 4, 11, 12, 13, 14, 17, 19, 20, 26, 27, 28, 7, 8, 9, 10]: # hide gap distance msg.(11,12,13,14), lanechange(19,20,27, 28)
+ values["ALERTS_3"] = 0
+ values["SOUNDS_3"] = 0
+
+ if values["ALERTS_5"] in [1, 2, 3, 4, 5]:
+ values["ALERTS_5"] = 0
+
+ if values["ALERTS_5"] in [11] and CS.softHoldActive == 0:
+ values["ALERTS_5"] = 0
+
+ # curvature 표시(0x161쪽 기존 로직 유지)
+ _suppress_trailer_mode_warning(values, CS)
+
+ curvature = round(CS.out.steeringAngleDeg / 3)
+ values["LANELINE_CURVATURE"] = (min(abs(curvature), 15) + (-1 if curvature < 0 else 0)) if lat_active else 0
+ values["LANELINE_CURVATURE_DIRECTION"] = 1 if curvature < 0 and lat_active else 0
+
+ trailer_lane_change_blocked = CS.trailer_connected
+ if trailer_lane_change_blocked:
+ values["LANELINE_LEFT"] = 2 if hud_control.leftLaneVisible else 0
+ values["LANELINE_RIGHT"] = 2 if hud_control.rightLaneVisible else 0
+ else:
+ lane_color = 6 if md is not None and md.meta.laneChangeAvailableLeft else 2
+ if lane_line_check >= 1:
+ lane_line_warn_left = CS.out.leftLaneLine % 10 not in (0, 5)
+ else:
+ lane_line_warn_left = CS.out.leftLaneLine // 10 == 2
+ lane_color = 4 if lane_line_warn_left or CS.out.leftBlindspot else lane_color
+ if hud_control.leftLaneDepart:
+ values["LANELINE_LEFT"] = 4 if (frame // 50) % 2 == 0 else 1
+ else:
+ values["LANELINE_LEFT"] = lane_color if hud_control.leftLaneVisible else 0
+
+ lane_color = 6 if md is not None and md.meta.laneChangeAvailableRight else 2
+ if lane_line_check >= 1:
+ lane_line_warn_right = CS.out.rightLaneLine % 10 not in (0, 5)
+ else:
+ lane_line_warn_right = CS.out.rightLaneLine // 10 == 2
+ lane_color = 4 if lane_line_warn_right or CS.out.rightBlindspot else lane_color
+ if hud_control.rightLaneDepart:
+ values["LANELINE_RIGHT"] = 4 if (frame // 50) % 2 == 0 else 1
+ else:
+ values["LANELINE_RIGHT"] = lane_color if hud_control.rightLaneVisible else 0
+
+ values["LCA_LEFT_ARROW"] = 2 if CS.out.leftBlinker else 0
+ values["LCA_RIGHT_ARROW"] = 2 if CS.out.rightBlinker else 0
+
+ if trailer_lane_change_blocked:
+ values["LCA_LEFT_ICON"] = 1 if lat_active else 0
+ values["LCA_RIGHT_ICON"] = 1 if lat_active else 0
+ else:
+ values["LCA_LEFT_ICON"] = (1 if CS.out.leftBlindspot else 2) if lat_active else 0
+ values["LCA_RIGHT_ICON"] = (1 if CS.out.rightBlindspot else 2) if lat_active else 0
+
+ values["LANE_LEFT"] = 0 if trailer_lane_change_blocked else 1 if desire in (1, 3) else 0
+ values["LANE_RIGHT"] = 0 if trailer_lane_change_blocked else 1 if desire in (2, 4) else 0
+
+ ret.append(packer.make_can_msg("ADRV_0x161", CAN.ECAN, values, rx_counter = rx_counter))
+
+ if CS.adrv_0x200 is not None:
+ values = copy.copy(CS.adrv_0x200)
+ rx_counter = values.pop("COUNTER", None)
+ values["TauGapSet"] = hud_control.leadDistanceBars
+ ret.append(packer.make_can_msg("ADRV_0x200", CAN.ECAN, values, rx_counter = rx_counter))
+
+ if CS.adrv_0x1ea is not None:
+ values = copy.copy(CS.adrv_0x1ea)
+ rx_counter = values.pop("COUNTER", None)
+ # blinker hold
+ values['LEFT_BLINK_HOLD'] = 1 if lane_changing == 3 else 0
+ values['RIGHT_BLINK_HOLD'] = 1 if lane_changing == 4 else 0
+
+ _make_ccnc_values(
+ values, CS, lat_active, frame, hud_control,
+ lane_line=True,
+ corner_radar=True,
+ desire=desire,
+ # 기존대로 LR/RR만 깜빡임
+ blink_pairs=[('LR_DETECT', 'LR_DETECT_DISTANCE'),
+ ('RR_DETECT', 'RR_DETECT_DISTANCE')],
+ blink_t=1.0
+ )
+
+ ret.append(packer.make_can_msg("ADRV_0x1ea", CAN.ECAN, values, rx_counter = rx_counter))
+
+ if CS.ccnc_0x162 is not None:
+ values = copy.copy(CS.ccnc_0x162)
+
+ if hud_control.leadDistance > 0:
+ values["FF_DISTANCE"] = hud_control.leadDistance
+ ff_type = 3 if hud_control.leadRadar == 1 else 13
+ values["FF_DETECT"] = ff_type if hud_control.leadRelSpeed > -0.1 else ff_type + 1
+
+ _make_ccnc_values(
+ values, CS, lat_active, frame, hud_control,
+ lane_line=False,
+ corner_radar=True,
+ desire=0,
+ # 필요하면 162도 깜빡임 적용(원래 코드처럼 LR/RR만)
+ blink_pairs=[('LR_DETECT', 'LR_DETECT_DISTANCE'),
+ ('RR_DETECT', 'RR_DETECT_DISTANCE')],
+ blink_t=1.0
+ )
+
+ if (left_lane_warning and not CS.out.leftBlinker) or (right_lane_warning and not CS.out.rightBlinker):
+ values["VIBRATE"] = 1
+
+ if canfd_debug > 0:
+ values["FAULT_LSS"] = 0
+ values["FAULT_DAS"] = 0
+
+ ret.append(packer.make_can_msg("CCNC_0x162", CAN.ECAN, values))
+
+ # --- NEW_MSG_4B9 (corner radar keep-alive?) ---
+ if enable_corner_radar > 0:
+ if HDA_CntrlModSta == 0:
+ if frame % 500 in [10, 20, 30]:
+ values = {
+ 'BYTE_1': 0,
+ 'BYTE_2': 0,
+ 'BYTE_3': 0x80,
+ 'BYTE_4': 0x8A,
+ 'BYTE_5': 0x32,
+ 'BYTE_6': 0x30,
+ 'BYTE_7': 0x01,
+ 'BYTE_8': 0x00,
+ }
+ ret.append(packer.make_can_msg("NEW_MSG_4B9", CAN.CAM, values))
+ elif frame % 500 in [40, 50, 60]:
+ values = {
+ 'BYTE_1': 0xff,
+ 'BYTE_2': 0xff,
+ 'BYTE_3': 0xff,
+ 'BYTE_4': 0xff,
+ 'BYTE_5': 0xff,
+ 'BYTE_6': 0xff,
+ 'BYTE_7': 0xff,
+ 'BYTE_8': 0xff,
+ }
+ ret.append(packer.make_can_msg("NEW_MSG_4B9", CAN.CAM, values))
+
+ if False: # canfd_debug > 1 and frame % 20 == 0:
+ if CS.hda_info_4a3 is not None:
+ values = copy.copy(CS.hda_info_4a3)
+ values["LinkClass"] = 1
+ values["SPEED_LIMIT"] = 100
+ ret.append(packer.make_can_msg("HDA_INFO_4A3", CAN.CAM, values))
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/hyundai/interface.py b/iqdbc_repo/iqdbc/car/hyundai/interface.py
new file mode 100644
index 000000000..8dc5b9ab4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/interface.py
@@ -0,0 +1,313 @@
+from iqdbc.car import Bus, get_safety_config, structs
+from iqdbc.car.hyundai.hyundaicanfd import CanBus
+from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ, CAR, DBC, CANFD_RADAR_SCC_CAR, \
+ CANFD_UNSUPPORTED_LONGITUDINAL_CAR, \
+ UNSUPPORTED_LONGITUDINAL_CAR, HyundaiSafetyFlags, HyundaiSafetyFlagsIQ, HyundaiExtFlags, \
+ CANFD_HYBRID_STATUS_ADDR, CANFD_HYBRID_STATUS_DLC, \
+ EV_MODE_STATUS_ADDR, EV_MODE_STATUS_DLC
+from iqdbc.car.hyundai.radar_interface import RADAR_START_ADDR
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.disable_ecu import disable_ecu
+from iqdbc.car.hyundai.carcontroller import CarController
+from iqdbc.car.hyundai.carstate import CarState
+from iqdbc.car.hyundai.radar_interface import RadarInterface
+
+from openpilot.common.params import Params
+
+ButtonType = structs.CarState.ButtonEvent.Type
+Ecu = structs.CarParams.Ecu
+
+# Cancel button can sometimes be ACC pause/resume button, main button can also enable on some cars
+ENABLE_BUTTONS = (ButtonType.accelCruise, ButtonType.decelCruise, ButtonType.cancel, ButtonType.mainCruise)
+
+SteerControlType = structs.CarParams.SteerControlType
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+
+ params = Params()
+ camera_scc = params.get_int("HyundaiCameraSCC")
+ if camera_scc > 0:
+ ret.flags |= HyundaiFlags.CAMERA_SCC.value
+ print("$$$CAMERA_SCC toggled...")
+
+ ret.brand = "hyundai"
+
+ if candidate == CAR.KIA_SORENTO:
+ ret.extFlags |= HyundaiExtFlags.RADAR_GROUP4.value
+
+ cam_can = CanBus(None, fingerprint).CAM if camera_scc == 0 else 1
+ hda2 = False #0x50 in fingerprint[cam_can] or 0x110 in fingerprint[cam_can]
+ hda2 = hda2 or params.get_int("CanfdHDA2") > 0
+ CAN = CanBus(None, fingerprint, hda2)
+
+ if ret.flags & HyundaiFlags.CANFD:
+ # Shared configuration for CAN-FD cars
+ ret.alphaLongitudinalAvailable = True #candidate not in (CANFD_UNSUPPORTED_LONGITUDINAL_CAR | CANFD_RADAR_SCC_CAR)
+ #ret.enableBsm = 0x1e5 in fingerprint[CAN.ECAN]
+ ret.enableBsm = 0x1ba in fingerprint[CAN.ECAN] # BLINDSPOTS_REAR_CORNERS 0x1ba(442)
+
+ if 0x105 in fingerprint[CAN.ECAN]:
+ ret.flags |= HyundaiFlags.HYBRID.value
+
+ # Keep drivetrain/safety classification unchanged: this capability is display-only and requires both exact ECAN frames.
+ has_ev_mode_status = fingerprint[CAN.ECAN].get(CANFD_HYBRID_STATUS_ADDR) == CANFD_HYBRID_STATUS_DLC and \
+ fingerprint[CAN.ECAN].get(EV_MODE_STATUS_ADDR) == EV_MODE_STATUS_DLC
+ if has_ev_mode_status:
+ ret.extFlags |= HyundaiExtFlags.EV_MODE_STATUS_230.value
+
+ if 203 in fingerprint[CAN.CAM]: # LFA_ALT
+ print("##### Anglecontrol detected (LFA_ALT)")
+ ret.flags |= HyundaiFlags.ANGLE_CONTROL.value
+
+ print("ACAN=", fingerprint[CAN.ACAN])
+
+ if 0x210 in fingerprint[CAN.ACAN]:
+ print("##### Radar Group 1 detected (0x210)")
+ ret.extFlags |= HyundaiExtFlags.RADAR_GROUP1.value
+ elif 0x400 in fingerprint[CAN.ACAN] and 0x41D in fingerprint[CAN.ACAN]:
+ print("##### Radar Group 3 detected (0x400-0x41D)")
+ ret.extFlags |= HyundaiExtFlags.RADAR_GROUP3.value
+ if all(fingerprint[CAN.ACAN].get(addr) == 32 for addr in range(0x235, 0x249)):
+ ret.extFlags |= HyundaiExtFlags.CORNER_RADAR_OBJECTS_235.value
+ print("##### Corner radar objects 0x235 group detected")
+ if all(fingerprint[CAN.ACAN].get(addr) == 32 for addr in range(0x180, 0x185)):
+ ret.extFlags |= HyundaiExtFlags.CORNER_RADAR_OBJECTS_180.value
+ print("##### Corner radar objects 0x180 group detected")
+ if all(fingerprint[CAN.ACAN].get(addr) == 32 for addr in tuple(range(0x430, 0x438)) + tuple(range(0x440, 0x448))):
+ ret.extFlags |= HyundaiExtFlags.CORNER_RADAR_OBJECTS_430.value
+ print("##### Corner radar objects 0x430/0x440 group detected")
+
+ # detect HDA2 with ADAS Driving ECU
+ if hda2:
+ print("$$$CANFD HDA2")
+ ret.flags |= HyundaiFlags.CANFD_HDA2.value
+ if camera_scc > 0:
+ if 0x110 in fingerprint[CAN.ACAN]:
+ ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value
+ print("$$$CANFD ALT_STEERING1")
+ else:
+ if 0x110 in fingerprint[CAN.CAM]: # 0x110(272): LKAS_ALT
+ ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value
+ print("$$$CANFD ALT_STEERING1")
+ ## carrot_todo: sorento:
+ if 0x2a4 not in fingerprint[CAN.CAM]: # 0x2a4(676): CAM_0x2a4
+ ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value
+ print("$$$CANFD ALT_STEERING2")
+
+ ## carrot: canival 4th, no 0x1cf
+ if 0x1cf not in fingerprint[CAN.ECAN]: # 0x1cf(463): CRUISE_BUTTONS
+ ret.flags |= HyundaiFlags.CANFD_ALT_BUTTONS.value
+ print("$$$CANFD ALT_BUTTONS")
+ else:
+ # non-HDA2
+ print("$$$CANFD non HDA2")
+ if 0x1cf not in fingerprint[CAN.ECAN]:
+ ret.flags |= HyundaiFlags.CANFD_ALT_BUTTONS.value
+ print("$$$CANFD ALT_BUTTONS")
+ #if not ret.flags & HyundaiFlags.RADAR_SCC:
+ # ret.flags |= HyundaiFlags.CANFD_CAMERA_SCC.value
+ # print("$$$CANFD CAMERA_SCC")
+ # Some HDA2 cars have alternative messages for gear checks
+ # ICE cars do not have 0x130; GEARS message on 0x40 or 0x70 instead
+ if 0x40 in fingerprint[CAN.ECAN]: # 0x40(64): GEAR_ALT
+ ret.flags |= HyundaiFlags.CANFD_ALT_GEARS.value
+ print("$$$CANFD ALT_GEARS")
+ elif 69 in fingerprint[CAN.ECAN]: # Special case
+ ret.extFlags |= HyundaiExtFlags.CANFD_GEARS_69.value
+ print("$$$CANFD GEARS_69")
+ elif 112 in fingerprint[CAN.ECAN]: # carrot: eGV70
+ ret.flags |= HyundaiFlags.CANFD_ALT_GEARS_2.value
+ print("$$$CANFD ALT_GEARS_2")
+ elif 0x130 in fingerprint[CAN.ECAN]: # 0x130(304): GEAR_SHIFTER
+ print("$$$CANFD GEAR_SHIFTER present")
+ else:
+ ret.extFlags |= HyundaiExtFlags.CANFD_GEARS_NONE.value
+ print("$$$CANFD GEARS_NONE")
+
+ cfgs = [get_safety_config(structs.CarParams.SafetyModel.hyundaiCanfd), ]
+ if CAN.ECAN >= 4:
+ cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput))
+ ret.safetyConfigs = cfgs
+
+ if ret.flags & HyundaiFlags.CANFD_HDA2:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_LKA_STEERING.value
+ if ret.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT.value
+ if ret.flags & HyundaiFlags.CANFD_ALT_BUTTONS:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_ALT_BUTTONS.value
+ if ret.flags & HyundaiFlags.CANFD_CAMERA_SCC:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value
+
+ else:
+ # Shared configuration for non CAN-FD cars
+ ret.alphaLongitudinalAvailable = True #candidate not in (UNSUPPORTED_LONGITUDINAL_CAR | CAMERA_SCC_CAR)
+ ret.enableBsm = 0x58b in fingerprint[0]
+ print(f"$$$ enableBsm = {ret.enableBsm}")
+
+ # Send LFA message on cars with HDA
+ if 0x485 in fingerprint[2]:
+ ret.flags |= HyundaiFlags.SEND_LFA.value
+ print("$$$SEND_LFA")
+
+ # These cars use the FCA11 message for the AEB and FCW signals, all others use SCC12
+ if 0x38d in fingerprint[0] or 0x38d in fingerprint[2]:
+ ret.flags |= HyundaiFlags.USE_FCA.value
+ print("$$$USE_FCA")
+
+ if ret.flags & HyundaiFlags.LEGACY:
+ # these cars require a special panda safety mode due to missing counters and checksums in the messages
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hyundaiLegacy)]
+ print("$$$Legacy Safety Model")
+ else:
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hyundai, 0)]
+
+ if ret.flags & HyundaiFlags.CAMERA_SCC:
+ ret.safetyConfigs[0].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value
+ print("$$$CAMERA_SCC")
+
+ # Common lateral control setup
+
+ ret.centerToFront = ret.wheelbase * 0.4
+ ret.steerActuatorDelay = 0.1
+ ret.steerLimitTimer = 0.4
+ if ret.flags & HyundaiFlags.ANGLE_CONTROL:
+ ret.steerControlType = SteerControlType.angle
+ else:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ if ret.flags & HyundaiFlags.ALT_LIMITS:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.ALT_LIMITS.value
+
+ # Common longitudinal control setup
+
+ ret.radarUnavailable = RADAR_START_ADDR not in fingerprint[1] or Bus.radar not in DBC[ret.carFingerprint]
+ ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable
+
+ # carrot, if camera_scc enabled, enable openpilotLongitudinalControl
+ enable_radar_tracks = params.get_int("EnableRadarTracks")
+ if ret.flags & HyundaiFlags.CAMERA_SCC.value or enable_radar_tracks > 0 or enable_radar_tracks == -2:
+ ret.radarUnavailable = False
+ ret.openpilotLongitudinalControl = True if camera_scc < 3 else False
+ print(f"$$$OenpilotLongitudinalControl = True, CAMERA_SCC({ret.flags & HyundaiFlags.CAMERA_SCC.value}) or RadarTracks{enable_radar_tracks}")
+ else:
+ print(f"$$$OenpilotLongitudinalControl = {alpha_long}")
+
+ #ret.radarUnavailable = False # TODO: canfd... carrot, hyundai cars have radar
+
+ ret.radarTimeStep = 0.05 #if params.get_int("EnableRadarTracks") > 0 else 0.02
+
+ ret.pcmCruise = not ret.openpilotLongitudinalControl
+ ret.startingState = False # True # carrot
+ ret.vEgoStarting = 0.1
+ ret.startAccel = 1.0
+ ret.longitudinalActuatorDelay = 0.5
+
+ ret.longitudinalTuning.kpBP = [0.]
+ ret.longitudinalTuning.kpV = [1.]
+ ret.longitudinalTuning.kf = 1.0
+
+ # *** feature detection ***
+ if ret.flags & HyundaiFlags.CANFD:
+ print(f"$$$$$ CanFD ECAN = {CAN.ECAN}")
+ if 0x1fa in fingerprint[CAN.ECAN]:
+ ret.extFlags |= HyundaiExtFlags.NAVI_CLUSTER.value
+ print("$$$$ NaviCluster = True")
+ else:
+ print("$$$$ NaviCluster = False")
+
+ else:
+ if 1348 in fingerprint[0]:
+ ret.extFlags |= HyundaiExtFlags.NAVI_CLUSTER.value
+ print("$$$$ NaviCluster = True")
+ if 1157 in fingerprint[0] or 1157 in fingerprint[2]:
+ ret.extFlags |= HyundaiExtFlags.HAS_LFAHDA.value
+ print("$$$$ HasLFAHDA")
+ if 1007 in fingerprint[0]:
+ print("#### cruiseButtonAlt")
+
+ print(f"$$$$ enableBsm = {ret.enableBsm}")
+
+ if ret.openpilotLongitudinalControl:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.LONG.value
+ if ret.flags & HyundaiFlags.HYBRID:
+ ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.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
+
+ # Car specific configuration overrides
+
+ if candidate == CAR.KIA_OPTIMA_G4_FL:
+ ret.steerActuatorDelay = 0.2
+
+ # Dashcam cars are missing a test route, or otherwise need validation
+ # TODO: Optima Hybrid 2017 uses a different SCC12 checksum
+ #ret.dashcamOnly = candidate in {CAR.KIA_OPTIMA_H, }
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp, ret, candidate, fingerprint, car_fw, alpha_long, is_release_iq, docs):
+ del candidate, car_fw, alpha_long, is_release_iq, docs
+ if not stock_cp.flags & HyundaiFlags.CANFD and 0x391 in fingerprint[0]:
+ ret.flags |= HyundaiFlagsIQ.HAS_LFA_BUTTON
+ ret.iqSafetyFlags |= HyundaiSafetyFlagsIQ.HAS_LDA_BUTTON
+ return ret
+
+ @staticmethod
+ def init(CP, can_recv, can_send):
+
+ Params().put_int('LongitudinalPersonalityMax', 4)
+
+ if CP.openpilotLongitudinalControl and not (CP.flags & HyundaiFlags.CANFD_CAMERA_SCC):
+ 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')
+
+ params = Params()
+ if params.get_int("EnableRadarTracks") > 0 and not CP.flags & HyundaiFlags.CANFD:
+ result = enable_radar_tracks(CP, can_recv, can_send)
+ params.put_bool("EnableRadarTracksResult", result)
+
+ # for blinkers
+ if CP.flags & HyundaiFlags.ENABLE_BLINKERS:
+ disable_ecu(can_recv, can_send, bus=CanBus(CP).ECAN, addr=0x7B1, com_cont_req=b'\x28\x83\x01')
+
+def enable_radar_tracks(CP, logcan, sendcan):
+ from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery
+ print("################ Try To Enable Radar Tracks ####################")
+
+ ret = False
+ sccBus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC.value else 0
+ rdr_fw = None
+ rdr_fw_address = 0x7d0 #
+ try:
+ try:
+ query = IsoTpParallelQuery(sendcan, logcan, sccBus, [rdr_fw_address], [b'\x10\x07'], [b'\x50\x07'])
+ for addr, dat in query.get_data(0.1).items(): # pylint: disable=unused-variable
+ print("ecu write data by id ...")
+ new_config = b"\x00\x00\x00\x01\x00\x01"
+ #new_config = b"\x00\x00\x00\x00\x00\x01"
+ dataId = b'\x01\x42'
+ WRITE_DAT_REQUEST = b'\x2e'
+ WRITE_DAT_RESPONSE = b'\x68'
+ query = IsoTpParallelQuery(sendcan, logcan, sccBus, [rdr_fw_address], [WRITE_DAT_REQUEST+dataId+new_config], [WRITE_DAT_RESPONSE])
+ result = query.get_data(0)
+ print("result=", result)
+ ret = True
+ break
+ except Exception as e:
+ print(f"Failed : {e}")
+ except Exception as e:
+ print("############## Failed to enable tracks" + str(e))
+ print("################ END Try to enable radar tracks")
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py b/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py
new file mode 100644
index 000000000..7aab9175a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py
@@ -0,0 +1,885 @@
+import math
+import os
+from collections import deque
+
+from iqdbc import DBC_PATH
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import RadarInterfaceBase
+from iqdbc.car.hyundai.values import DBC, HyundaiFlags, HyundaiExtFlags
+from openpilot.common.params import Params
+from iqdbc.car.hyundai.hyundaicanfd import CanBus
+from openpilot.common.filter_simple import MyMovingAverage
+
+SCC_TID = 0
+RADAR_START_ADDR = 0x500
+RADAR_MSG_COUNT = 32
+RADAR_MSG_COUNT4 = 8
+RADAR_GROUP4_MAX_LONG_DIST = 325.0
+RADAR_GROUP4_MAX_YREL = 6.0
+RADAR_START_ADDR_CANFD1 = 0x210
+RADAR_MSG_COUNT1 = 16
+RADAR_START_ADDR_CANFD2 = 0x3A5 # Group 2, Group 1: 0x210 2개씩?어???단 보류.
+RADAR_MSG_COUNT2 = 32
+RADAR_START_ADDR_CANFD3 = 0x400
+RADAR_MSG_COUNT3 = 30
+CORNER_OBJECT_235_START_ADDR = 0x235
+CORNER_OBJECT_235_MSG_COUNT = 20
+CORNER_OBJECT_235_TRACK_ID_OFFSET = 200
+CORNER_OBJECT_235_DBC = 'hyundai_canfd_corner_radar_235_generated'
+CORNER_OBJECT_180_START_ADDR = 0x180
+CORNER_OBJECT_180_MSG_COUNT = 5
+CORNER_OBJECT_180_SLOTS_PER_MSG = 2
+CORNER_OBJECT_180_TRACK_ID_OFFSET = 240
+CORNER_OBJECT_180_DBC = 'hyundai_canfd_corner_radar_180_generated'
+CORNER_OBJECT_430_LEFT_START_ADDR = 0x430
+CORNER_OBJECT_430_RIGHT_START_ADDR = 0x440
+CORNER_OBJECT_430_MSG_COUNT_PER_SIDE = 8
+CORNER_OBJECT_430_SLOTS_PER_MSG = 7
+CORNER_OBJECT_430_TRACK_ID_OFFSET = 300
+CORNER_OBJECT_430_DBC = 'hyundai_canfd_corner_radar_430_generated'
+CORNER_OBJECT_430_EMPTY_RAW_VALUES = (0x010d1f40, 0x00010d1f)
+CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MIN = 2520 # 126.0 m
+CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MAX = 2600 # 130.0 m
+CORNER_OBJECT_430_MAX_DREL = 120.0
+CORNER_OBJECT_430_MAX_TRACKS_PER_SIDE = 4
+CORNER_OBJECT_430_DT = 0.05
+CORNER_OBJECT_430_MAX_DREL_DELTA = 1.5
+CORNER_OBJECT_430_CANDIDATE_META_BYTE_3 = (2,)
+CORNER_OBJECT_430_CANDIDATE_EXCLUDED_SLOTS = (1,)
+CORNER_OBJECT_430_CANDIDATE_RAW_DELTA = 200
+CORNER_OBJECT_430_STRONG_META_BYTE_2 = (10,)
+CORNER_OBJECT_430_WEAK_META_BYTE_2 = (5, 6, 7, 8, 9)
+CORNER_OBJECT_430_STRONG_MIN_SUPPORT = 2
+CORNER_OBJECT_430_WEAK_MIN_SUPPORT = 3
+CORNER_OBJECT_430_CLUSTER_RAW_GAP = 200
+CORNER_OBJECT_430_TRACK_MATCH_MAX_DREL_DELTA = 3.0
+CORNER_OBJECT_430_MAX_ABS_VREL = 20.0
+CORNER_OBJECT_430_MAX_ABS_YVREL = 3.0
+CORNER_OBJECT_430_VREL_ALPHA = 0.35
+CORNER_OBJECT_430_YVREL_ALPHA = 0.35
+CORNER_OBJECT_430_LATERAL_CELL_MSG_WEIGHT = 0.35
+CORNER_OBJECT_430_LATERAL_CELL_SLOT_WEIGHT = 0.65
+CORNER_OBJECT_430_YREL_OFFSET = 5.8
+CORNER_OBJECT_430_YREL_SCALE = 1.1
+CORNER_OBJECT_430_RIGHT_CELL_MIRROR = 7.0
+CORNER_OBJECT_430_MIN_ABS_YREL = 0.8
+CORNER_OBJECT_430_MAX_ABS_YREL = 4.2
+CORNER_OBJECT_430_HISTORY_SIZE = 8
+CORNER_OBJECT_430_MIN_HISTORY = 5
+CORNER_OBJECT_430_MIN_INWARD_YREL_DELTA = 0.35
+CORNER_OBJECT_430_MIN_RECENT_INWARD_YREL_DELTA = 0.05
+CORNER_OBJECT_430_MIN_INWARD_RATIO = 0.65
+CORNER_OBJECT_430_INWARD_CENTER_ABS_YREL = 1.55
+CORNER_OBJECT_430_INWARD_KEEP_YVREL_ABS_YREL = 2.2
+CORNER_OBJECT_430_EARLY_INWARD_NONCENTER_FRAMES = 2
+CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL = 2.0
+CORNER_OBJECT_STABLE_TRACK_ID_START = 1000
+CORNER_SIDE_OBJECT_MAX_DREL = 0.2
+CORNER_SIDE_OBJECT_MIN_ABS_YREL = 1.4
+CORNER_SIDE_OBJECT_MAX_ABS_YREL = 4.5
+
+# POC for parsing corner radars: https://github.com/commaai/openpilot/pull/24221/
+
+
+class CornerObjectTrackIdManager:
+ def __init__(self):
+ self.next_track_id = CORNER_OBJECT_STABLE_TRACK_ID_START
+ self.objects: dict[tuple[str, int], tuple[int, int]] = {}
+
+ def get_track_id(self, source: str, object_id: int, age: int) -> int:
+ key = (source, object_id)
+ previous = self.objects.get(key)
+ if previous is None or age < previous[1]:
+ track_id = self.next_track_id
+ self.next_track_id += 1
+ else:
+ track_id = previous[0]
+ self.objects[key] = (track_id, age)
+ return track_id
+
+ def clear_source(self, source: str):
+ self.objects = {key: value for key, value in self.objects.items() if key[0] != source}
+
+
+def corner_object_position_valid(d_rel: float, y_rel: float) -> bool:
+ normal_object = 0.2 < d_rel < 180.0
+ clipped_side_object = (
+ 0.0 <= d_rel <= CORNER_SIDE_OBJECT_MAX_DREL and
+ CORNER_SIDE_OBJECT_MIN_ABS_YREL <= abs(y_rel) <= CORNER_SIDE_OBJECT_MAX_ABS_YREL
+ )
+ return (normal_object or clipped_side_object) and abs(y_rel) < 40.0
+
+
+def get_radar_can_parser(CP, radar_tracks, msg_start_addr, msg_count, radar_group4=False):
+ if not radar_tracks:
+ return None
+ #if Bus.radar not in DBC[CP.carFingerprint]:
+ # return None
+ print("RadarInterface: RadarTracks...")
+
+ if CP.flags & HyundaiFlags.CANFD:
+ CAN = CanBus(CP)
+ messages = [(f"RADAR_TRACK_{addr:x}", 20) for addr in range(msg_start_addr, msg_start_addr + msg_count)]
+ return CANParser('hyundai_canfd_radar_generated', messages, CAN.ACAN)
+ else:
+ messages = [(f"RADAR_TRACK_{addr:x}", 20) for addr in range(msg_start_addr, msg_start_addr + msg_count)]
+ #return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 1)
+ dbc_name = 'hyundai_kia_denso_front_radar_generated' if radar_group4 else 'hyundai_kia_mando_front_radar_generated'
+ return CANParser(dbc_name, messages, 1)
+
+def get_corner_object_can_parser(CP, enabled):
+ if not enabled or not (CP.flags & HyundaiFlags.CANFD):
+ return None
+
+ dbc_path = os.path.join(DBC_PATH, f"{CORNER_OBJECT_235_DBC}.dbc")
+ if not os.path.exists(dbc_path):
+ print(f"RadarInterface: missing {CORNER_OBJECT_235_DBC}.dbc, 0x235 corner radar disabled")
+ return None
+
+ CAN = CanBus(CP)
+ messages = [(f"CORNER_RADAR_235_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_235_START_ADDR, CORNER_OBJECT_235_START_ADDR + CORNER_OBJECT_235_MSG_COUNT)]
+ return CANParser(CORNER_OBJECT_235_DBC, messages, CAN.ACAN)
+
+def get_corner_object_180_can_parser(CP, enabled):
+ if not enabled or not (CP.flags & HyundaiFlags.CANFD):
+ return None
+
+ dbc_path = os.path.join(DBC_PATH, f"{CORNER_OBJECT_180_DBC}.dbc")
+ if not os.path.exists(dbc_path):
+ print(f"RadarInterface: missing {CORNER_OBJECT_180_DBC}.dbc, 0x180 corner radar disabled")
+ return None
+
+ CAN = CanBus(CP)
+ messages = [(f"CORNER_RADAR_180_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_180_START_ADDR, CORNER_OBJECT_180_START_ADDR + CORNER_OBJECT_180_MSG_COUNT)]
+ return CANParser(CORNER_OBJECT_180_DBC, messages, CAN.ACAN)
+
+def get_corner_object_430_can_parser(CP, enabled):
+ if not enabled or not (CP.flags & HyundaiFlags.CANFD):
+ return None
+
+ dbc_path = os.path.join(DBC_PATH, f"{CORNER_OBJECT_430_DBC}.dbc")
+ if not os.path.exists(dbc_path):
+ print(f"RadarInterface: missing {CORNER_OBJECT_430_DBC}.dbc, 0x430/0x440 corner radar disabled")
+ return None
+
+ CAN = CanBus(CP)
+ messages = [(f"CORNER_RADAR_430_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_430_LEFT_START_ADDR, CORNER_OBJECT_430_LEFT_START_ADDR + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE)]
+ messages += [(f"CORNER_RADAR_430_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_430_RIGHT_START_ADDR, CORNER_OBJECT_430_RIGHT_START_ADDR + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE)]
+ return CANParser(CORNER_OBJECT_430_DBC, messages, CAN.ACAN)
+
+def get_radar_can_parser_scc(CP):
+ CAN = CanBus(CP)
+ if CP.flags & HyundaiFlags.CANFD:
+ messages = [("SCC_CONTROL", 50)]
+ bus = CAN.ECAN
+ else:
+ messages = [("SCC11", 50)]
+ bus = CAN.ECAN
+
+ print("$$$$$$$$ ECAN = ", CAN.ECAN)
+ bus = CAN.CAM if CP.flags & HyundaiFlags.CAMERA_SCC else bus
+ return CANParser(DBC[CP.carFingerprint][Bus.pt], messages, bus)
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ=None):
+ super().__init__(CP, CP_IQ or structs.IQCarParams())
+ self.v_ego = 0.0
+
+ self.canfd = True if CP.flags & HyundaiFlags.CANFD else False
+ self.radar_group1 = False
+ self.radar_group3 = False
+ self.radar_group4 = not self.canfd and bool(CP.extFlags & HyundaiExtFlags.RADAR_GROUP4.value)
+ if self.canfd:
+ if CP.extFlags & HyundaiExtFlags.RADAR_GROUP1.value:
+ self.radar_start_addr = RADAR_START_ADDR_CANFD1
+ self.radar_msg_count = RADAR_MSG_COUNT1
+ self.radar_group1 = True
+ elif CP.extFlags & HyundaiExtFlags.RADAR_GROUP3.value:
+ self.radar_start_addr = RADAR_START_ADDR_CANFD3
+ self.radar_msg_count = RADAR_MSG_COUNT3
+ self.radar_group3 = True
+ else:
+ self.radar_start_addr = RADAR_START_ADDR_CANFD2
+ self.radar_msg_count = RADAR_MSG_COUNT2
+ else:
+ self.radar_start_addr = RADAR_START_ADDR
+ self.radar_msg_count = RADAR_MSG_COUNT4 if self.radar_group4 else RADAR_MSG_COUNT
+
+ self.params = Params()
+ self.radar_tracks = self.params.get_int("EnableRadarTracks") >= 1
+ self.corner_object_tracks = bool(CP.extFlags & HyundaiExtFlags.CORNER_RADAR_OBJECTS_235.value) and self.params.get_int("EnableCornerRadar") > 0
+ self.corner_object_180_tracks = bool(CP.extFlags & HyundaiExtFlags.CORNER_RADAR_OBJECTS_180.value) and self.params.get_int("EnableCornerRadar") > 0
+ self.corner_object_430_tracks = bool(CP.extFlags & HyundaiExtFlags.CORNER_RADAR_OBJECTS_430.value) and self.params.get_int("EnableCornerRadar") > 0
+ self.updated_tracks = set()
+ self.updated_scc = set()
+ self.updated_corner_objects = set()
+ self.updated_corner_objects_180 = set()
+ self.updated_corner_objects_430 = set()
+ self.corner_object_missed_updates = 0
+ self.corner_object_180_missed_updates = 0
+ self.corner_object_430_missed_updates = 0
+ self.corner_object_track_ids = CornerObjectTrackIdManager()
+ self.rcp_tracks = get_radar_can_parser(CP, self.radar_tracks, self.radar_start_addr, self.radar_msg_count, self.radar_group4)
+ self.rcp_corner_objects = get_corner_object_can_parser(CP, self.corner_object_tracks)
+ self.rcp_corner_objects_180 = get_corner_object_180_can_parser(CP, self.corner_object_180_tracks)
+ self.rcp_corner_objects_430 = get_corner_object_430_can_parser(CP, self.corner_object_430_tracks)
+ # Enabling raw radar tracks on legacy CAN disables the stock SCC11 stream on
+ # some Hyundai/Kia platforms. Camera-SCC cars may still use SCC11.
+ use_scc_parser = not (self.radar_tracks and not self.canfd and not (CP.flags & HyundaiFlags.CAMERA_SCC))
+ self.rcp_scc = get_radar_can_parser_scc(CP) if use_scc_parser else None
+ self.trigger_msg_scc = 416 if self.canfd else 0x420
+
+ self.trigger_msg_tracks = self.radar_start_addr + self.radar_msg_count - 1
+ self.trigger_msg_corner_objects = CORNER_OBJECT_235_START_ADDR + CORNER_OBJECT_235_MSG_COUNT - 1
+ self.trigger_msg_corner_objects_180 = CORNER_OBJECT_180_START_ADDR + CORNER_OBJECT_180_MSG_COUNT - 1
+ self.trigger_msg_corner_objects_430 = CORNER_OBJECT_430_RIGHT_START_ADDR + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE - 1
+ self.track_id = 0
+
+ self.corner_objects_available = self.rcp_corner_objects is not None or self.rcp_corner_objects_180 is not None or self.rcp_corner_objects_430 is not None
+ self.radar_off_can = CP.radarUnavailable and not self.corner_objects_available
+ print(
+ "RadarInterface: "
+ f"radarUnavailable={CP.radarUnavailable} radarTracks={self.radar_tracks} "
+ f"group4={self.radar_group4} "
+ f"corner235={self.rcp_corner_objects is not None} corner180={self.rcp_corner_objects_180 is not None} "
+ f"corner430={self.rcp_corner_objects_430 is not None} "
+ f"radarOffCan={self.radar_off_can}"
+ )
+
+ self.vRel_last = 0
+ self.dRel_last = 0
+ self.corner_object_430_prev_d_rel = {}
+ self.corner_object_430_prev_v_rel = {}
+ self.corner_object_430_prev_y_rel = {}
+ self.corner_object_430_prev_yv_rel = {}
+ self.corner_object_430_prev_code = {}
+ self.corner_object_430_history = {}
+ self.corner_object_430_noncenter_inward_frames = {}
+
+ # Initialize pts
+ if self.rcp_tracks is not None:
+ total_tracks = self.radar_msg_count * (2 if self.radar_group1 else 1)
+ for track_id in range(total_tracks):
+ t_id = track_id + 32
+ self.pts[t_id] = structs.RadarData.RadarPoint()
+ self.pts[t_id].measured = False
+ self.pts[t_id].trackId = t_id
+
+ if self.rcp_scc is not None:
+ self.pts[SCC_TID] = structs.RadarData.RadarPoint()
+ self.pts[SCC_TID].trackId = SCC_TID
+ self.pts[SCC_TID].radarSource = "scc"
+ if self.rcp_corner_objects is not None:
+ for slot in range(CORNER_OBJECT_235_MSG_COUNT):
+ t_id = CORNER_OBJECT_235_TRACK_ID_OFFSET + slot
+ self.pts[t_id] = structs.RadarData.RadarPoint()
+ self.pts[t_id].measured = False
+ self.pts[t_id].trackId = t_id
+ self.pts[t_id].radarSource = "corner235"
+ if self.rcp_corner_objects_180 is not None:
+ for slot in range(CORNER_OBJECT_180_MSG_COUNT * CORNER_OBJECT_180_SLOTS_PER_MSG):
+ t_id = CORNER_OBJECT_180_TRACK_ID_OFFSET + slot
+ self.pts[t_id] = structs.RadarData.RadarPoint()
+ self.pts[t_id].measured = False
+ self.pts[t_id].trackId = t_id
+ self.pts[t_id].radarSource = "corner180"
+ if self.rcp_corner_objects_430 is not None:
+ for slot in range(CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * 2 * CORNER_OBJECT_430_SLOTS_PER_MSG):
+ t_id = CORNER_OBJECT_430_TRACK_ID_OFFSET + slot
+ self.pts[t_id] = structs.RadarData.RadarPoint()
+ self.pts[t_id].measured = False
+ self.pts[t_id].trackId = t_id
+
+ self.frame = 0
+
+
+ def update(self, can_strings):
+ self.frame += 1
+ if self.radar_off_can or (self.rcp_tracks is None and self.rcp_scc is None and self.rcp_corner_objects is None and self.rcp_corner_objects_180 is None and self.rcp_corner_objects_430 is None):
+ return super().update(None)
+
+ if self.rcp_scc is not None:
+ vls_s = self.rcp_scc.update(can_strings)
+ self.updated_scc.update(vls_s)
+
+ track_ready = False
+ if self.radar_tracks and self.rcp_tracks is not None:
+ vls_t = self.rcp_tracks.update(can_strings)
+ self.updated_tracks.update(vls_t)
+ track_ready = self.trigger_msg_tracks in self.updated_tracks
+
+ corner_ready = False
+ if self.rcp_corner_objects is not None:
+ vls_c = self.rcp_corner_objects.update(can_strings)
+ self.updated_corner_objects.update(vls_c)
+ corner_ready = self.trigger_msg_corner_objects in self.updated_corner_objects
+
+ corner_180_ready = False
+ if self.rcp_corner_objects_180 is not None:
+ vls_180 = self.rcp_corner_objects_180.update(can_strings)
+ self.updated_corner_objects_180.update(vls_180)
+ corner_180_ready = self.trigger_msg_corner_objects_180 in self.updated_corner_objects_180
+
+ corner_430_ready = False
+ if self.rcp_corner_objects_430 is not None:
+ vls_430 = self.rcp_corner_objects_430.update(can_strings)
+ self.updated_corner_objects_430.update(vls_430)
+ corner_430_ready = self.trigger_msg_corner_objects_430 in self.updated_corner_objects_430
+
+ scc_ready = not self.radar_tracks and self.frame % 5 == 0 and self.rcp_scc is not None
+
+ if track_ready:
+ self._update(self.updated_tracks)
+ self.updated_tracks.clear()
+
+ if corner_ready:
+ self._update_corner_objects(self.updated_corner_objects)
+ self.corner_object_missed_updates = 0
+ self.updated_corner_objects.clear()
+
+ if corner_180_ready:
+ self._update_corner_objects_180(self.updated_corner_objects_180)
+ self.corner_object_180_missed_updates = 0
+ self.updated_corner_objects_180.clear()
+
+ if corner_430_ready:
+ self._update_corner_objects_430(self.updated_corner_objects_430)
+ self.corner_object_430_missed_updates = 0
+ self.updated_corner_objects_430.clear()
+
+ # Corner radar runs at its own cadence. Do not let corner-only frames publish
+ # RadarData, since liveTracks uses a fixed radarTimeStep for aLead/jLead.
+ publish_ready = track_ready or scc_ready
+ if not publish_ready:
+ return None
+
+ if self.rcp_scc is not None:
+ self._update_scc(self.updated_scc)
+ if self.rcp_corner_objects is not None:
+ if self.updated_corner_objects:
+ self._update_corner_objects(self.updated_corner_objects)
+ self.corner_object_missed_updates = 0
+ else:
+ self.corner_object_missed_updates += 1
+ if self.corner_object_missed_updates > 10:
+ self._clear_corner_objects()
+ if self.rcp_corner_objects_180 is not None:
+ if self.updated_corner_objects_180:
+ self._update_corner_objects_180(self.updated_corner_objects_180)
+ self.corner_object_180_missed_updates = 0
+ else:
+ self.corner_object_180_missed_updates += 1
+ if self.corner_object_180_missed_updates > 10:
+ self._clear_corner_objects_180()
+ if self.rcp_corner_objects_430 is not None:
+ if self.updated_corner_objects_430:
+ self._update_corner_objects_430(self.updated_corner_objects_430)
+ self.corner_object_430_missed_updates = 0
+ else:
+ self.corner_object_430_missed_updates += 1
+ if self.corner_object_430_missed_updates > 10:
+ self._clear_corner_objects_430()
+ self.updated_scc.clear()
+ self.updated_corner_objects.clear()
+ self.updated_corner_objects_180.clear()
+ self.updated_corner_objects_430.clear()
+
+ ret = structs.RadarData()
+ if ((self.rcp_tracks is not None and self.radar_tracks and not self.rcp_tracks.can_valid) or
+ (self.rcp_scc is not None and not self.corner_objects_available and not self.rcp_scc.can_valid) or
+ (self.rcp_corner_objects is not None and not self.rcp_corner_objects.can_valid) or
+ (self.rcp_corner_objects_180 is not None and not self.rcp_corner_objects_180.can_valid) or
+ (self.rcp_corner_objects_430 is not None and not self.rcp_corner_objects_430.can_valid)):
+ ret.errors.canError = True
+ ret.points = [point for point in self.pts.values() if point.measured]
+ return ret
+
+ def _update(self, updated_messages):
+
+ t_id = 32
+ for addr in range(self.radar_start_addr, self.radar_start_addr + self.radar_msg_count):
+
+ msg = self.rcp_tracks.vl[f"RADAR_TRACK_{addr:x}"]
+
+ if self.radar_group1:
+ valid = msg['VALID_CNT1'] > 10
+ elif self.radar_group3:
+ # Group 3 marks an empty object slot with LONG_DIST raw 0x7ff (204.7 m).
+ valid = msg['LONG_DIST'] < 204.7
+ elif self.canfd:
+ valid = msg['VALID_CNT'] > 10
+ elif self.radar_group4:
+ # EN: DNMWR006 exposes eight stable tracked-object slots at 0x500-0x507.
+ # Messages from 0x508 onward are distance-sorted raw detections without
+ # stable IDs, so they are excluded. OBJECT_STATE 3 is a confirmed track;
+ # empty slots use LONG_DIST raw 0xfff8 (409.55 m). Driving logs reached
+ # 317.80 m, so 325 m preserves every observed confirmed track while
+ # retaining margin from the empty-slot sentinel. Keep the +/-6 m
+ # ego/adjacent-lane envelope to suppress farther roadside reflections.
+ # KO: DNMWR006의 안정적인 추적 객체 슬롯은 0x500~0x507의 8개임.
+ # 0x508 이후 메시지는 고정 ID가 없는 거리순 raw detection이므로 제외함.
+ # OBJECT_STATE 3은 확정 추적 객체이며, 빈 슬롯은 LONG_DIST raw
+ # 0xfff8(409.55m)을 사용함. 주행 로그의 최대값은 317.80m였으므로
+ # 325m 상한으로 관측된 확정 트랙을 모두 보존하면서 빈 슬롯 값과 충분한
+ # 여유를 확보함. 원거리 도로변 반사를 줄이기 위해 좌우 6m 범위를 유지함.
+ valid = (msg['OBJECT_STATE'] == 3 and 0.2 < msg['LONG_DIST'] < RADAR_GROUP4_MAX_LONG_DIST and
+ abs(msg['LAT_DIST']) <= RADAR_GROUP4_MAX_YREL)
+ else:
+ valid = msg['STATE'] in (3, 4)
+
+ self.pts[t_id].measured = bool(valid)
+ if not valid:
+ self.pts[t_id].dRel = 0
+ self.pts[t_id].yRel = 0
+ self.pts[t_id].vRel = 0
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0
+ elif self.radar_group1:
+ self.pts[t_id].dRel = msg['LONG_DIST1']
+ self.pts[t_id].yRel = msg['LAT_DIST1']
+ self.pts[t_id].vRel = msg['REL_SPEED1']
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = msg['REL_ACCEL1']
+ self.pts[t_id].yvRel = msg['LAT_SPEED1']
+ elif self.canfd:
+ if self.radar_group3:
+ # Group 3 reports the object's center. Convert it to the rear surface to match SCC/vision dRel.
+ self.pts[t_id].dRel = max(0.0, msg['LONG_DIST'] - msg['OBJECT_LENGTH'] * 0.5 - 0.1)
+ else:
+ self.pts[t_id].dRel = msg['LONG_DIST']
+ self.pts[t_id].yRel = msg['LAT_DIST']
+ self.pts[t_id].vRel = msg['REL_SPEED']
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = float('nan') if self.radar_group3 else msg['REL_ACCEL']
+ self.pts[t_id].yvRel = 0.0 if self.radar_group3 else msg['LAT_SPEED']
+ elif self.radar_group4:
+ self.pts[t_id].dRel = msg['LONG_DIST']
+ self.pts[t_id].yRel = -msg['LAT_DIST']
+ self.pts[t_id].vRel = msg['REL_SPEED']
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0.0
+ else:
+ azimuth = math.radians(msg['AZIMUTH'])
+ self.pts[t_id].dRel = math.cos(azimuth) * msg['LONG_DIST']
+ self.pts[t_id].yRel = 0.5 * -math.sin(azimuth) * msg['LONG_DIST']
+ self.pts[t_id].vRel = msg['REL_SPEED']
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = msg['REL_ACCEL']
+ self.pts[t_id].yvRel = 0.0
+
+ t_id += 1
+ # radar group1? ?나??msg??2개의 ?이?? ?어?음.
+ if self.radar_group1:
+ for addr in range(self.radar_start_addr, self.radar_start_addr + self.radar_msg_count):
+ msg = self.rcp_tracks.vl[f"RADAR_TRACK_{addr:x}"]
+
+ valid = msg['VALID_CNT2'] > 10
+ self.pts[t_id].measured = bool(valid)
+ if not valid:
+ self.pts[t_id].dRel = 0
+ self.pts[t_id].yRel = 0
+ self.pts[t_id].vRel = 0
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0
+ else:
+ self.pts[t_id].dRel = msg['LONG_DIST2']
+ self.pts[t_id].yRel = msg['LAT_DIST2']
+ self.pts[t_id].vRel = msg['REL_SPEED2']
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = msg['REL_ACCEL2']
+ self.pts[t_id].yvRel = msg['LAT_SPEED2']
+
+ t_id += 1
+
+ def _update_corner_objects(self, updated_messages):
+ if self.rcp_corner_objects is None:
+ return
+
+ if not updated_messages:
+ self._clear_corner_objects()
+ return
+
+ candidates = []
+ for slot, addr in enumerate(range(CORNER_OBJECT_235_START_ADDR, CORNER_OBJECT_235_START_ADDR + CORNER_OBJECT_235_MSG_COUNT)):
+ t_id = CORNER_OBJECT_235_TRACK_ID_OFFSET + slot
+ msg = self.rcp_corner_objects.vl[f"CORNER_RADAR_235_OBJECTS_{addr:x}"]
+
+ d_rel = msg["OBJ_REL_POS_X"]
+ y_rel = msg["OBJ_REL_POS_Y"]
+ v_rel = msg["OBJ_REL_VEL_X"]
+ yv_rel = msg["OBJ_REL_VEL_Y"]
+ a_rel = msg["OBJ_REL_ACCEL_X"]
+ # Side objects are clipped to x=0 by the corner radar. Quality, identity,
+ # and lateral motion still describe a real object, so keep them for
+ # corner-confirmed front-radar association in radard.
+ valid = msg["OBJ_QUAL_LEVEL"] > 0 and corner_object_position_valid(d_rel, y_rel) and v_rel > -99.0
+
+ if not valid:
+ continue
+ candidates.append((t_id, int(msg["OBJ_OBJECT_ID"]), int(msg["OBJ_AGE"]), int(msg["OBJ_QUAL_LEVEL"]),
+ d_rel, y_rel, v_rel, yv_rel, a_rel))
+
+ self._apply_corner_objects("corner235", candidates,
+ range(CORNER_OBJECT_235_TRACK_ID_OFFSET,
+ CORNER_OBJECT_235_TRACK_ID_OFFSET + CORNER_OBJECT_235_MSG_COUNT))
+
+ def _update_corner_objects_180(self, updated_messages):
+ if self.rcp_corner_objects_180 is None:
+ return
+
+ if not updated_messages:
+ self._clear_corner_objects_180()
+ return
+
+ candidates = []
+ for msg_index, addr in enumerate(range(CORNER_OBJECT_180_START_ADDR, CORNER_OBJECT_180_START_ADDR + CORNER_OBJECT_180_MSG_COUNT)):
+ msg = self.rcp_corner_objects_180.vl[f"CORNER_RADAR_180_OBJECTS_{addr:x}"]
+ for slot_index in range(CORNER_OBJECT_180_SLOTS_PER_MSG):
+ t_id = CORNER_OBJECT_180_TRACK_ID_OFFSET + msg_index * CORNER_OBJECT_180_SLOTS_PER_MSG + slot_index
+ prefix = f"SLOT{slot_index + 1}_"
+ d_rel = msg[f"{prefix}REL_POS_X"]
+ y_rel = msg[f"{prefix}REL_POS_Y"]
+ v_rel = msg[f"{prefix}REL_VEL_X"]
+ yv_rel = msg[f"{prefix}REL_VEL_Y"]
+ a_rel = msg[f"{prefix}REL_ACCEL_X"]
+ valid = msg[f"{prefix}QUAL_LEVEL"] > 0 and corner_object_position_valid(d_rel, y_rel) and v_rel > -99.0
+
+ if not valid:
+ continue
+ candidates.append((t_id, int(msg[f"{prefix}OBJECT_ID"]), int(msg[f"{prefix}AGE"]), int(msg[f"{prefix}QUAL_LEVEL"]),
+ d_rel, y_rel, v_rel, yv_rel, a_rel))
+
+ self._apply_corner_objects("corner180", candidates,
+ range(CORNER_OBJECT_180_TRACK_ID_OFFSET,
+ CORNER_OBJECT_180_TRACK_ID_OFFSET + CORNER_OBJECT_180_MSG_COUNT * CORNER_OBJECT_180_SLOTS_PER_MSG))
+
+ def _apply_corner_objects(self, source, candidates, slot_ids):
+ for t_id in slot_ids:
+ self._clear_point(t_id)
+
+ # The same object can occupy two CAN slots for one cycle during a slot handoff.
+ # Publish only the newest/highest-quality copy so trackId stays unique.
+ objects = {}
+ for candidate in candidates:
+ object_id = candidate[1]
+ previous = objects.get(object_id)
+ if previous is None or (candidate[2], candidate[3]) > (previous[2], previous[3]):
+ objects[object_id] = candidate
+
+ for t_id, object_id, age, _, d_rel, y_rel, v_rel, yv_rel, a_rel in objects.values():
+ point = self.pts[t_id]
+ point.measured = True
+ point.trackId = self.corner_object_track_ids.get_track_id(source, object_id, age)
+ point.radarSource = source
+ point.dRel = d_rel
+ point.yRel = y_rel
+ point.vRel = v_rel
+ point.vLead = v_rel + self.v_ego
+ point.aRel = a_rel
+ point.yvRel = yv_rel
+
+
+ def _update_corner_objects_430(self, updated_messages):
+ if self.rcp_corner_objects_430 is None:
+ return
+
+ if not updated_messages:
+ self._clear_corner_objects_430()
+ return
+
+ bank_defs = (
+ (CORNER_OBJECT_430_LEFT_START_ADDR, 1.0, 0),
+ (CORNER_OBJECT_430_RIGHT_START_ADDR, -1.0, CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * CORNER_OBJECT_430_SLOTS_PER_MSG),
+ )
+ for start_addr, side_sign, track_base in bank_defs:
+ bins = []
+ for msg_index, addr in enumerate(range(start_addr, start_addr + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE)):
+ msg = self.rcp_corner_objects_430.vl[f"CORNER_RADAR_430_OBJECTS_{addr:x}"]
+ for slot_index in range(CORNER_OBJECT_430_SLOTS_PER_MSG):
+ prefix = f"SLOT{slot_index + 1}_"
+ distance_raw = int(msg[f"{prefix}DISTANCE_RAW"])
+ raw = (
+ distance_raw |
+ (int(msg[f"{prefix}META_13_15"]) << 13) |
+ (int(msg[f"{prefix}META_BYTE_2"]) << 16) |
+ (int(msg[f"{prefix}META_BYTE_3"]) << 24)
+ )
+ code = (
+ int(msg[f"{prefix}META_13_15"]),
+ int(msg[f"{prefix}META_BYTE_2"]),
+ int(msg[f"{prefix}META_BYTE_3"]),
+ )
+ d_rel = distance_raw * 0.05
+ default_distance = CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MIN <= distance_raw <= CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MAX
+ base_valid = (
+ raw not in CORNER_OBJECT_430_EMPTY_RAW_VALUES and
+ distance_raw not in (0, 8000, 8191) and
+ not default_distance and
+ 0.2 < d_rel < CORNER_OBJECT_430_MAX_DREL
+ )
+ candidate_valid = (
+ base_valid and
+ slot_index + 1 not in CORNER_OBJECT_430_CANDIDATE_EXCLUDED_SLOTS and
+ code[2] in CORNER_OBJECT_430_CANDIDATE_META_BYTE_3 and
+ code[1] in CORNER_OBJECT_430_STRONG_META_BYTE_2 + CORNER_OBJECT_430_WEAK_META_BYTE_2
+ )
+ bins.append({
+ "msg_index": msg_index,
+ "slot_index": slot_index,
+ "distance_raw": distance_raw,
+ "d_rel": d_rel,
+ "code": code,
+ "candidate_valid": candidate_valid,
+ })
+
+ supported_bins = []
+ candidates = [b for b in bins if b["candidate_valid"]]
+ for b in candidates:
+ support = 1
+ for other in candidates:
+ if other is b:
+ continue
+ if abs(other["msg_index"] - b["msg_index"]) > 1:
+ continue
+ if abs(other["slot_index"] - b["slot_index"]) > 2:
+ continue
+ if abs(other["distance_raw"] - b["distance_raw"]) > CORNER_OBJECT_430_CANDIDATE_RAW_DELTA:
+ continue
+ support += 1
+ min_support = (CORNER_OBJECT_430_STRONG_MIN_SUPPORT if b["code"][1] in CORNER_OBJECT_430_STRONG_META_BYTE_2
+ else CORNER_OBJECT_430_WEAK_MIN_SUPPORT)
+ if support >= min_support:
+ supported_bins.append({**b, "support": support})
+
+ clusters = []
+ for b in sorted(supported_bins, key=lambda item: item["distance_raw"]):
+ if not clusters or b["distance_raw"] - clusters[-1][-1]["distance_raw"] > CORNER_OBJECT_430_CLUSTER_RAW_GAP:
+ clusters.append([b])
+ else:
+ clusters[-1].append(b)
+ clusters = sorted(clusters, key=lambda cluster: sum(b["distance_raw"] for b in cluster) / len(cluster))[:CORNER_OBJECT_430_MAX_TRACKS_PER_SIDE]
+
+ cluster_objects = []
+ for cluster in clusters:
+ msg_index = sum(b["msg_index"] for b in cluster) / len(cluster)
+ slot = sum(b["slot_index"] + 1 for b in cluster) / len(cluster)
+ lateral_cell = (CORNER_OBJECT_430_LATERAL_CELL_MSG_WEIGHT * msg_index +
+ CORNER_OBJECT_430_LATERAL_CELL_SLOT_WEIGHT * slot)
+ mapped_cell = lateral_cell if side_sign > 0.0 else CORNER_OBJECT_430_RIGHT_CELL_MIRROR - lateral_cell
+ y_abs = max(CORNER_OBJECT_430_MIN_ABS_YREL,
+ min(CORNER_OBJECT_430_MAX_ABS_YREL,
+ CORNER_OBJECT_430_YREL_OFFSET - CORNER_OBJECT_430_YREL_SCALE * mapped_cell))
+ cluster_objects.append({
+ "d_rel": sum(b["d_rel"] for b in cluster) / len(cluster),
+ "y_rel": side_sign * y_abs,
+ "code": max((b["code"] for b in cluster), key=lambda code: sum(1 for item in cluster if item["code"] == code)),
+ })
+
+ active_t_ids = set()
+ side_track_ids = [
+ CORNER_OBJECT_430_TRACK_ID_OFFSET + track_base + slot
+ for slot in range(CORNER_OBJECT_430_MAX_TRACKS_PER_SIDE)
+ ]
+ unmatched_track_ids = {t_id for t_id in side_track_ids if t_id in self.corner_object_430_prev_d_rel}
+ unused_track_ids = [t_id for t_id in side_track_ids if t_id not in unmatched_track_ids]
+
+ for cluster in cluster_objects:
+ d_rel = cluster["d_rel"]
+ code = cluster["code"]
+ matched_t_id = None
+ if unmatched_track_ids:
+ nearest_t_id = min(unmatched_track_ids, key=lambda t_id: abs(d_rel - self.corner_object_430_prev_d_rel[t_id]))
+ if abs(d_rel - self.corner_object_430_prev_d_rel[nearest_t_id]) <= CORNER_OBJECT_430_TRACK_MATCH_MAX_DREL_DELTA:
+ matched_t_id = nearest_t_id
+ unmatched_track_ids.remove(matched_t_id)
+ if matched_t_id is None and unused_track_ids:
+ matched_t_id = unused_track_ids.pop(0)
+ if matched_t_id is None:
+ continue
+
+ t_id = matched_t_id
+ active_t_ids.add(t_id)
+ prev_d_rel = self.corner_object_430_prev_d_rel.get(t_id)
+ prev_code = self.corner_object_430_prev_code.get(t_id)
+ self.corner_object_430_prev_d_rel[t_id] = d_rel
+ self.corner_object_430_prev_y_rel[t_id] = cluster["y_rel"]
+ self.corner_object_430_prev_code[t_id] = code
+ reset_track = prev_d_rel is None or code != prev_code or abs(d_rel - prev_d_rel) > CORNER_OBJECT_430_MAX_DREL_DELTA
+ if reset_track:
+ self.corner_object_430_prev_v_rel.pop(t_id, None)
+ self.corner_object_430_prev_yv_rel.pop(t_id, None)
+ self.corner_object_430_history.pop(t_id, None)
+ self.corner_object_430_noncenter_inward_frames.pop(t_id, None)
+
+ history = self.corner_object_430_history.setdefault(t_id, deque(maxlen=CORNER_OBJECT_430_HISTORY_SIZE))
+ history.append((d_rel, cluster["y_rel"]))
+ if len(history) < CORNER_OBJECT_430_MIN_HISTORY:
+ self._clear_point(t_id)
+ continue
+
+ window_dt = CORNER_OBJECT_430_DT * (len(history) - 1)
+ first_d_rel, first_y_rel = history[0]
+ hist_v_rel = (d_rel - first_d_rel) / window_dt
+ if abs(hist_v_rel) > CORNER_OBJECT_430_MAX_ABS_VREL:
+ self.corner_object_430_prev_v_rel.pop(t_id, None)
+ self.corner_object_430_prev_yv_rel.pop(t_id, None)
+ self.corner_object_430_history.pop(t_id, None)
+ self.corner_object_430_noncenter_inward_frames.pop(t_id, None)
+ self._clear_point(t_id)
+ continue
+ prev_v_rel = self.corner_object_430_prev_v_rel.get(t_id, hist_v_rel)
+ v_rel = (1.0 - CORNER_OBJECT_430_VREL_ALPHA) * prev_v_rel + CORNER_OBJECT_430_VREL_ALPHA * hist_v_rel
+ self.corner_object_430_prev_v_rel[t_id] = v_rel
+
+ inward_steps = 0
+ usable_steps = 0
+ prev_abs_y = abs(history[0][1])
+ for _, y_rel in list(history)[1:]:
+ abs_y = abs(y_rel)
+ delta = prev_abs_y - abs_y
+ if abs(delta) > 1e-3:
+ usable_steps += 1
+ if delta > 0.0:
+ inward_steps += 1
+ prev_abs_y = abs_y
+ net_inward_y = abs(first_y_rel) - abs(cluster["y_rel"])
+ inward_ratio = inward_steps / usable_steps if usable_steps > 0 else 0.0
+ hist_yv_rel = (cluster["y_rel"] - first_y_rel) / window_dt
+ recent_inward_y = abs(history[-3][1]) - abs(cluster["y_rel"]) if len(history) >= 3 else net_inward_y
+ if (net_inward_y < CORNER_OBJECT_430_MIN_INWARD_YREL_DELTA or
+ recent_inward_y < CORNER_OBJECT_430_MIN_RECENT_INWARD_YREL_DELTA or
+ inward_ratio < CORNER_OBJECT_430_MIN_INWARD_RATIO or
+ abs(hist_yv_rel) > CORNER_OBJECT_430_MAX_ABS_YVREL):
+ hist_yv_rel = 0.0
+ inward_motion_candidate = hist_yv_rel != 0.0 and abs(cluster["y_rel"]) <= CORNER_OBJECT_430_INWARD_KEEP_YVREL_ABS_YREL
+ inward_center_candidate = inward_motion_candidate and abs(cluster["y_rel"]) <= CORNER_OBJECT_430_INWARD_CENTER_ABS_YREL
+ y_rel = cluster["y_rel"]
+ if inward_motion_candidate:
+ if inward_center_candidate:
+ self.corner_object_430_noncenter_inward_frames[t_id] = 0
+ prev_yv_rel = self.corner_object_430_prev_yv_rel.get(t_id, hist_yv_rel)
+ yv_rel = (1.0 - CORNER_OBJECT_430_YVREL_ALPHA) * prev_yv_rel + CORNER_OBJECT_430_YVREL_ALPHA * hist_yv_rel
+ else:
+ noncenter_frames = self.corner_object_430_noncenter_inward_frames.get(t_id, 0) + 1
+ self.corner_object_430_noncenter_inward_frames[t_id] = noncenter_frames
+ if noncenter_frames <= CORNER_OBJECT_430_EARLY_INWARD_NONCENTER_FRAMES:
+ prev_yv_rel = self.corner_object_430_prev_yv_rel.get(t_id, hist_yv_rel)
+ yv_rel = (1.0 - CORNER_OBJECT_430_YVREL_ALPHA) * prev_yv_rel + CORNER_OBJECT_430_YVREL_ALPHA * hist_yv_rel
+ else:
+ yv_rel = 0.0
+ if not inward_center_candidate and abs(y_rel) < CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL:
+ y_rel = math.copysign(CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL, y_rel)
+ else:
+ hist_yv_rel = 0.0
+ yv_rel = 0.0
+ self.corner_object_430_noncenter_inward_frames[t_id] = 0
+ if abs(y_rel) < CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL:
+ y_rel = math.copysign(CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL, y_rel)
+ self.corner_object_430_prev_yv_rel[t_id] = yv_rel
+
+ self.pts[t_id].measured = True
+ self.pts[t_id].trackId = t_id
+ self.pts[t_id].dRel = d_rel
+ self.pts[t_id].yRel = y_rel
+ self.pts[t_id].vRel = v_rel
+ self.pts[t_id].vLead = v_rel + self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = yv_rel
+
+ side_track_count = CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * CORNER_OBJECT_430_SLOTS_PER_MSG
+ for slot in range(side_track_count):
+ t_id = CORNER_OBJECT_430_TRACK_ID_OFFSET + track_base + slot
+ if t_id in active_t_ids:
+ continue
+ self.corner_object_430_prev_d_rel.pop(t_id, None)
+ self.corner_object_430_prev_v_rel.pop(t_id, None)
+ self.corner_object_430_prev_y_rel.pop(t_id, None)
+ self.corner_object_430_prev_yv_rel.pop(t_id, None)
+ self.corner_object_430_prev_code.pop(t_id, None)
+ self.corner_object_430_history.pop(t_id, None)
+ self.corner_object_430_noncenter_inward_frames.pop(t_id, None)
+ self._clear_point(t_id)
+
+
+ def _clear_point(self, t_id):
+ self.pts[t_id].measured = False
+ self.pts[t_id].dRel = 0
+ self.pts[t_id].yRel = 0
+ self.pts[t_id].vRel = 0
+ self.pts[t_id].vLead = self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0
+
+ def _clear_corner_objects(self):
+ for slot in range(CORNER_OBJECT_235_MSG_COUNT):
+ self._clear_point(CORNER_OBJECT_235_TRACK_ID_OFFSET + slot)
+ self.corner_object_track_ids.clear_source("corner235")
+
+ def _clear_corner_objects_180(self):
+ for slot in range(CORNER_OBJECT_180_MSG_COUNT * CORNER_OBJECT_180_SLOTS_PER_MSG):
+ self._clear_point(CORNER_OBJECT_180_TRACK_ID_OFFSET + slot)
+ self.corner_object_track_ids.clear_source("corner180")
+
+ def _clear_corner_objects_430(self):
+ self.corner_object_430_prev_d_rel.clear()
+ self.corner_object_430_prev_v_rel.clear()
+ self.corner_object_430_prev_y_rel.clear()
+ self.corner_object_430_prev_yv_rel.clear()
+ self.corner_object_430_prev_code.clear()
+ self.corner_object_430_history.clear()
+ self.corner_object_430_noncenter_inward_frames.clear()
+ for slot in range(CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * 2 * CORNER_OBJECT_430_SLOTS_PER_MSG):
+ self._clear_point(CORNER_OBJECT_430_TRACK_ID_OFFSET + slot)
+
+ def _update_scc(self, updated_messages):
+ cpt = self.rcp_scc.vl
+ t_id = SCC_TID
+ if self.canfd:
+ dRel = cpt["SCC_CONTROL"]['ACC_ObjDist']
+ vRel = cpt["SCC_CONTROL"]['ACC_ObjRelSpd']
+ new_pts = abs(dRel - self.dRel_last) > 3 or abs(vRel - self.vRel_last) > 1
+ vLead = vRel + self.v_ego
+ valid = 0 < dRel < 150 and not new_pts #cpt["SCC_CONTROL"]['OBJ_STATUS'] and dRel < 150
+ self.pts[t_id].measured = bool(valid)
+ if not valid:
+ self.pts[t_id].dRel = 0
+ self.pts[t_id].yRel = 0
+ self.pts[t_id].vRel = 0
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0
+ else:
+ self.pts[t_id].dRel = dRel
+ self.pts[t_id].yRel = 0
+ self.pts[t_id].vRel = vRel
+ self.pts[t_id].vLead = vLead
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0 #float('nan')
+ else:
+ dRel = cpt["SCC11"]['ACC_ObjDist']
+ vRel = cpt["SCC11"]['ACC_ObjRelSpd']
+ new_pts = abs(dRel - self.dRel_last) > 3 or abs(vRel - self.vRel_last) > 1
+ vLead = vRel + self.v_ego
+ valid = cpt["SCC11"]['ACC_ObjStatus'] and dRel < 150 and not new_pts
+ self.pts[t_id].measured = bool(valid)
+ if not valid:
+ self.pts[t_id].dRel = 0
+ self.pts[t_id].yRel = 0
+ self.pts[t_id].vRel = 0
+ self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0
+ else:
+ self.pts[t_id].dRel = dRel
+ self.pts[t_id].yRel = -cpt["SCC11"]['ACC_ObjLatPos'] # in car frame's y axis, left is negative
+ self.pts[t_id].vRel = vRel
+ self.pts[t_id].vLead = vLead
+ self.pts[t_id].aRel = float('nan')
+ self.pts[t_id].yvRel = 0 #float('nan')
+
+ self.dRel_last = dRel
+ self.vRel_last = vRel
diff --git a/iqdbc_repo/iqdbc/car/hyundai/tests/__init__.py b/iqdbc_repo/iqdbc/car/hyundai/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/hyundai/tests/print_platform_codes.py b/iqdbc_repo/iqdbc/car/hyundai/tests/print_platform_codes.py
new file mode 100644
index 000000000..c96e131e4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/tests/print_platform_codes.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+from iqdbc.car.structs import CarParams
+from iqdbc.car.hyundai.values import PLATFORM_CODE_ECUS, get_platform_codes
+from iqdbc.car.hyundai.fingerprints import FW_VERSIONS
+
+Ecu = CarParams.Ecu
+
+if __name__ == "__main__":
+ for car_model, ecus in FW_VERSIONS.items():
+ print()
+ print(car_model)
+ for ecu in sorted(ecus):
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ platform_codes = get_platform_codes(ecus[ecu])
+ codes = {code for code, _ in platform_codes}
+ dates = {date for _, date in platform_codes if date is not None}
+ print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):')
+ print(f' Codes: {codes}')
+ print(f' Dates: {dates}')
diff --git a/iqdbc_repo/iqdbc/car/hyundai/tests/test_ev_mode.py b/iqdbc_repo/iqdbc/car/hyundai/tests/test_ev_mode.py
new file mode 100644
index 000000000..7338d7e6e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/tests/test_ev_mode.py
@@ -0,0 +1,194 @@
+import math
+
+import pytest
+
+from iqdbc.can import CANPacker, CANParser
+from iqdbc.car import Bus, gen_empty_fingerprint, structs
+from iqdbc.car.hyundai.carstate import CarState, EV_MODE_STATUS_TIMEOUT_NS, _get_ev_mode_state
+from iqdbc.car.hyundai.interface import CarInterface
+from iqdbc.car.hyundai.values import CANFD_HYBRID_STATUS_ADDR, CANFD_HYBRID_STATUS_DLC, CAR, DBC, EV_MODE_ACTIVE_VALUES, \
+ EV_MODE_STATUS_ADDR, EV_MODE_STATUS_DLC, EV_MODE_STATUS_MSG, EV_MODE_STATUS_SIGNAL, \
+ HyundaiExtFlags, HyundaiFlags
+from openpilot.common.params import Params
+
+
+def get_params(candidate, *, hybrid=True, hybrid_bus=0, hybrid_status=None, hybrid_status_bus=0,
+ hybrid_status_dlc=CANFD_HYBRID_STATUS_DLC, status_bus=0, status_dlc=EV_MODE_STATUS_DLC):
+ Params().put_int("HyundaiCameraSCC", 1)
+ Params().put_int("CanfdHDA2", 1)
+
+ fingerprint = gen_empty_fingerprint()
+ if hybrid:
+ fingerprint[hybrid_bus][0x105] = 32
+ if hybrid_status is None:
+ hybrid_status = hybrid
+ if hybrid_status:
+ fingerprint[hybrid_status_bus][CANFD_HYBRID_STATUS_ADDR] = hybrid_status_dlc
+ if status_bus is not None:
+ fingerprint[status_bus][EV_MODE_STATUS_ADDR] = status_dlc
+ return CarInterface.get_params(candidate, fingerprint, [], False, False, False)
+
+
+@pytest.mark.parametrize(("candidate", "hybrid", "status_bus", "status_dlc", "expected"), (
+ (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, 0, 32, True),
+ (CAR.HYUNDAI_SANTAFE_MX5_HEV, False, 0, 32, False),
+ (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, None, 32, False),
+ (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, 1, 32, False),
+ (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, 0, 16, False),
+ (CAR.KIA_SORENTO_4TH_GEN, False, None, 32, False),
+ # Shared ICE/HEV/PHEV candidates rely on the observed ECAN capability frames, not their model name.
+ (CAR.HYUNDAI_TUCSON_4TH_GEN, True, 0, 32, True),
+ (CAR.HYUNDAI_TUCSON_4TH_GEN, False, 0, 32, False),
+ (CAR.KIA_SORENTO_HEV_4TH_GEN, True, 0, 32, True),
+ (CAR.HYUNDAI_KONA_HEV_2ND_GEN, True, 0, 32, True),
+ (CAR.HYUNDAI_KONA_HEV_2ND_GEN, False, 0, 32, False),
+ (CAR.HYUNDAI_ELANTRA_HEV_2021, True, 0, 32, False),
+))
+def test_ev_mode_capability(candidate, hybrid, status_bus, status_dlc, expected):
+ CP = get_params(candidate, hybrid=hybrid, status_bus=status_bus, status_dlc=status_dlc)
+ assert bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) == expected
+
+
+@pytest.mark.parametrize(("hybrid_status_bus", "hybrid_status_dlc"), (
+ (1, CANFD_HYBRID_STATUS_DLC),
+ (0, 16),
+))
+def test_ev_mode_capability_requires_ecan_hybrid_status_dlc32(hybrid_status_bus, hybrid_status_dlc):
+ CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV, hybrid_status_bus=hybrid_status_bus,
+ hybrid_status_dlc=hybrid_status_dlc)
+
+ assert not bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230)
+
+
+def test_0x105_and_ev_status_without_0xfa_do_not_enable_ev_mode():
+ CP = get_params(CAR.HYUNDAI_TUCSON_4TH_GEN, hybrid=True, hybrid_status=False)
+
+ assert bool(CP.flags & HyundaiFlags.HYBRID)
+ assert not bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230)
+
+
+def test_ev_mode_display_capability_does_not_change_hybrid_safety_classification():
+ CP = get_params(CAR.HYUNDAI_TUCSON_4TH_GEN, hybrid=False, hybrid_status=True)
+
+ assert not bool(CP.flags & HyundaiFlags.HYBRID)
+ assert bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230)
+
+
+def test_ev_mode_capability_uses_the_detected_ecan_offset():
+ CP = get_params(CAR.KIA_SORENTO_HEV_4TH_GEN, hybrid_bus=4, hybrid_status_bus=4, status_bus=4)
+
+ assert bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230)
+
+
+def test_ev_mode_parser_registration_is_capability_gated():
+ supported = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV)
+ unsupported = get_params(CAR.KIA_SORENTO_4TH_GEN, hybrid=False, status_bus=1, status_dlc=16)
+
+ supported_parser = CarState.get_can_parsers_canfd(None, supported)[Bus.pt]
+ unsupported_parser = CarState.get_can_parsers_canfd(None, unsupported)[Bus.pt]
+
+ assert EV_MODE_STATUS_ADDR in supported_parser.addresses
+ assert supported_parser.message_states[EV_MODE_STATUS_ADDR].ignore_alive
+ assert supported_parser.message_states[EV_MODE_STATUS_ADDR].ignore_counter
+ assert EV_MODE_STATUS_ADDR not in unsupported_parser.addresses
+
+
+def test_sorento_ice_corner_radar_status_does_not_enable_ev_mode():
+ Params().put_int("HyundaiCameraSCC", 1)
+ Params().put_int("CanfdHDA2", 1)
+
+ fingerprint = gen_empty_fingerprint()
+ fingerprint[1][0x230] = 16 # Actual Sorento ICE ACAN corner-radar status frame.
+ CP = CarInterface.get_params(CAR.KIA_SORENTO_4TH_GEN, fingerprint, [], False, False, False)
+ parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt]
+
+ assert not bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230)
+ assert EV_MODE_STATUS_ADDR not in parser.addresses
+
+
+def test_ev_mode_state_requires_a_fresh_dlc32_frame():
+ CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV)
+ parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt]
+ packer = CANPacker(DBC[CP.carFingerprint][Bus.pt])
+
+ assert _get_ev_mode_state(parser) == (False, False)
+
+ timestamp = 1_000_000_000
+ wrong_bus_short_status = (EV_MODE_STATUS_ADDR, b"\x00" * 16, 1)
+ parser.update([timestamp, [wrong_bus_short_status]])
+ assert _get_ev_mode_state(parser) == (False, False)
+
+ ev_active = packer.make_can_msg(EV_MODE_STATUS_MSG, parser.bus, {"COUNTER": 1, EV_MODE_STATUS_SIGNAL: 6})
+ parser.update([timestamp + 100_000_000, [ev_active]])
+ assert _get_ev_mode_state(parser) == (True, True)
+
+ ev_inactive = packer.make_can_msg(EV_MODE_STATUS_MSG, parser.bus, {"COUNTER": 2, EV_MODE_STATUS_SIGNAL: 3})
+ parser.update([timestamp + 200_000_000, [ev_inactive]])
+ assert _get_ev_mode_state(parser) == (False, True)
+
+ parser.dat[EV_MODE_STATUS_ADDR] = b"\x00" * 16
+ assert _get_ev_mode_state(parser) == (False, False)
+
+ parser.dat[EV_MODE_STATUS_ADDR] = ev_inactive[1]
+ parser.update([timestamp + 200_000_000 + EV_MODE_STATUS_TIMEOUT_NS + 1, []])
+ assert not parser.bus_timeout
+ assert _get_ev_mode_state(parser) == (False, False)
+
+
+@pytest.mark.parametrize("mode", range(16))
+def test_ev_mode_enum_mapping(mode):
+ CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV)
+ parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt]
+ packer = CANPacker(DBC[CP.carFingerprint][Bus.pt])
+ msg = packer.make_can_msg(EV_MODE_STATUS_MSG, parser.bus, {"COUNTER": mode, EV_MODE_STATUS_SIGNAL: mode})
+
+ parser.update([1_000_000_000, [msg]])
+
+ assert int(parser.vl[EV_MODE_STATUS_MSG][EV_MODE_STATUS_SIGNAL]) == mode
+ assert _get_ev_mode_state(parser) == (mode in EV_MODE_ACTIVE_VALUES, True)
+
+
+@pytest.mark.parametrize(("payload", "expected_mode", "expected_active"), (
+ ("758139048402000000000000000000000000d3009805001c24000000c05dc80f", 1, True),
+ ("4d466f048402000000000000000000000000bf007408001c24000000c05dc80f", 2, True),
+ ("32206e048402000000000000000000000000c9007418001c24000000c05dc80f", 6, True),
+ # Route 455 mode 3 was a false positive with the old single-bit 0x230 interpretation.
+ ("4f935e0484020000000000000000000000004400640d001c10000000c05dc40f", 3, False),
+ ("066558048402000000000000000000000000c4003020001c24000000c05dc80f", 8, False),
+ ("059683048402000000000000000000000000a1008425001c24000000c05dc80f", 9, False),
+ ("011305048402000000000000000000000000d600a829001c24000000c05dc80f", 10, False),
+))
+def test_ev_mode_dbc_decodes_real_mx5_frames(payload, expected_mode, expected_active):
+ parser = CANParser("hyundai_canfd_generated", [(EV_MODE_STATUS_MSG, math.nan)], 0)
+ updated = parser.update([1_000_000_000, [(EV_MODE_STATUS_ADDR, bytes.fromhex(payload), 0)]])
+
+ assert updated == {EV_MODE_STATUS_ADDR}
+ assert int(parser.vl[EV_MODE_STATUS_MSG][EV_MODE_STATUS_SIGNAL]) == expected_mode
+ assert _get_ev_mode_state(parser) == (expected_active, True)
+
+
+def test_ev_mode_rejects_checksum_corruption():
+ CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV)
+ parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt]
+ payload = bytearray.fromhex("32206e048402000000000000000000000000c9007418001c24000000c05dc80f")
+ payload[-1] ^= 1
+
+ parser.update([1_000_000_000, [(EV_MODE_STATUS_ADDR, bytes(payload), parser.bus)]])
+
+ assert EV_MODE_STATUS_ADDR not in parser.dat
+ assert _get_ev_mode_state(parser) == (False, False)
+
+
+def test_ev_mode_fields_default_invalid():
+ state = structs.CarState()
+ assert not state.evModeActive
+ assert not state.evModeValid
+
+
+def test_ev_mode_parser_is_optional_for_can_validity():
+ CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV)
+ parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt]
+ state = parser.message_states[EV_MODE_STATUS_ADDR]
+
+ assert state.ignore_alive
+ assert state.ignore_counter
diff --git a/iqdbc_repo/iqdbc/car/hyundai/tests/test_hyundai.py b/iqdbc_repo/iqdbc/car/hyundai/tests/test_hyundai.py
new file mode 100644
index 000000000..edf1f7365
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/tests/test_hyundai.py
@@ -0,0 +1,232 @@
+from hypothesis import settings, given, strategies as st
+
+import pytest
+
+from iqdbc.car import gen_empty_fingerprint
+from iqdbc.car.structs import CarParams
+from iqdbc.car.fw_versions import build_fw_dict
+from iqdbc.car.hyundai.interface import CarInterface
+from iqdbc.car.hyundai.radar_interface import RADAR_START_ADDR
+from iqdbc.car.hyundai.values import CANFD_CAR, CAN_GEARS, CAR, CHECKSUM, DATE_FW_ECUS, \
+ HYBRID_CAR, EV_CAR, FW_QUERY_CONFIG, LEGACY_SAFETY_MODE_CAR, \
+ PLATFORM_CODE_ECUS, HYUNDAI_VERSION_REQUEST_LONG, \
+ HyundaiFlags, get_platform_codes, HyundaiSafetyFlags
+from iqdbc.car.hyundai.fingerprints import FW_VERSIONS
+
+Ecu = CarParams.Ecu
+
+# Some platforms have date codes in a different format we don't yet parse (or are missing).
+# For now, assert list of expected missing date cars
+NO_DATES_PLATFORMS = {
+ # CAN FD
+ CAR.KIA_SPORTAGE_5TH_GEN,
+ CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN,
+ CAR.HYUNDAI_TUCSON_4TH_GEN,
+ # CAN
+ CAR.HYUNDAI_ELANTRA,
+ CAR.HYUNDAI_ELANTRA_GT_I30,
+ CAR.KIA_CEED,
+ CAR.KIA_FORTE,
+ CAR.KIA_OPTIMA_G4,
+ CAR.KIA_OPTIMA_G4_FL,
+ CAR.KIA_SORENTO,
+ CAR.HYUNDAI_KONA,
+ CAR.HYUNDAI_KONA_EV,
+ CAR.HYUNDAI_KONA_EV_2022,
+ CAR.HYUNDAI_KONA_HEV,
+ CAR.HYUNDAI_SONATA_LF,
+ CAR.HYUNDAI_VELOSTER,
+ CAR.HYUNDAI_KONA_2022,
+}
+
+CANFD_EXPECTED_ECUS = {Ecu.fwdCamera, Ecu.fwdRadar}
+
+
+class TestHyundaiFingerprint:
+ def test_feature_detection(self, monkeypatch, tmp_path):
+ monkeypatch.setenv("PARAMS_ROOT", str(tmp_path))
+ # radar available
+ for radar in (True, False):
+ fingerprint = gen_empty_fingerprint()
+ if radar:
+ fingerprint[1][RADAR_START_ADDR] = 8
+ CP = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False)
+ assert CP.radarUnavailable != radar
+
+ def test_alternate_limits(self):
+ # Alternate lateral control limits, for high torque cars, verify Panda safety mode flag is set
+ fingerprint = gen_empty_fingerprint()
+ for car_model in CAR:
+ CP = CarInterface.get_params(car_model, fingerprint, [], False, False, False)
+ assert bool(CP.flags & HyundaiFlags.ALT_LIMITS) == bool(CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.ALT_LIMITS)
+
+ def test_can_features(self):
+ # Test no EV/HEV in any gear lists (should all use ELECT_GEAR)
+ assert set.union(*CAN_GEARS.values()) & (HYBRID_CAR | EV_CAR) == set()
+
+ # Test CAN FD cars are not classified with classic-CAN-only parsing or safety modes.
+ can_specific_feature_list = set.union(*CAN_GEARS.values(), *CHECKSUM.values(), LEGACY_SAFETY_MODE_CAR)
+ for car_model in CANFD_CAR:
+ assert car_model not in can_specific_feature_list, "CAN FD car unexpectedly found in a CAN feature list"
+
+ def test_hybrid_ev_sets(self):
+ assert HYBRID_CAR & EV_CAR == set(), "Shared cars between hybrid and EV"
+ assert HYBRID_CAR <= set(CAR)
+ assert EV_CAR <= set(CAR)
+
+ def test_canfd_ecu_whitelist(self):
+ # Asserts only expected Ecus can exist in database for CAN-FD cars
+ for car_model in CANFD_CAR:
+ ecus = {fw[0] for fw in FW_VERSIONS.get(car_model, {}).keys()}
+ ecus_not_in_whitelist = ecus - CANFD_EXPECTED_ECUS
+ ecu_strings = ", ".join([f"Ecu.{ecu}" for ecu in ecus_not_in_whitelist])
+ assert len(ecus_not_in_whitelist) == 0, \
+ f"{car_model}: Car model has unexpected ECUs: {ecu_strings}"
+
+ def test_blacklisted_parts(self, subtests):
+ # Asserts no ECUs known to be shared across platforms exist in the database.
+ # Tucson having Santa Cruz camera and EPS for example
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ if car_model == CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN:
+ pytest.skip("Skip checking Santa Cruz for its parts")
+
+ for code, _ in get_platform_codes(ecus[(Ecu.fwdCamera, 0x7c4, None)]):
+ if b"-" not in code:
+ continue
+ part = code.split(b"-")[1]
+ assert not part.startswith(b'CW'), "Car has bad part number"
+
+ def test_correct_ecu_response_database(self, subtests):
+ """
+ Assert standard responses for certain ECUs, since they can
+ respond to multiple queries with different data
+ """
+ expected_fw_prefix = HYUNDAI_VERSION_REQUEST_LONG[1:]
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for ecu, fws in ecus.items():
+ assert all(fw.startswith(expected_fw_prefix) for fw in fws), \
+ f"FW from unexpected request in database: {(ecu, fws)}"
+
+ @settings(max_examples=100)
+ @given(data=st.data())
+ def test_platform_codes_fuzzy_fw(self, data):
+ """Ensure function doesn't raise an exception"""
+ fw_strategy = st.lists(st.binary())
+ fws = data.draw(fw_strategy)
+ get_platform_codes(fws)
+
+ def test_expected_platform_codes(self, subtests):
+ # Ensures we don't accidentally add multiple platform codes for a car unless it is intentional
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for ecu, fws in ecus.items():
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ # Third and fourth character are usually EV/hybrid identifiers
+ codes = {code.split(b"-")[0][:2] for code, _ in get_platform_codes(fws)}
+ if car_model == CAR.HYUNDAI_PALISADE:
+ assert codes == {b"LX", b"ON"}, f"Car has unexpected platform codes: {car_model} {codes}"
+ elif car_model == CAR.HYUNDAI_KONA_EV and ecu[0] == Ecu.fwdCamera:
+ assert codes == {b"OE", b"OS"}, f"Car has unexpected platform codes: {car_model} {codes}"
+ else:
+ assert len(codes) == 1, f"Car has multiple platform codes: {car_model} {codes}"
+
+ # Tests for platform codes, part numbers, and FW dates which Hyundai will use to fuzzy
+ # fingerprint in the absence of full FW matches:
+ def test_platform_code_ecus_available(self, subtests):
+ # TODO: add queries for these non-CAN FD cars to get EPS
+ no_eps_platforms = CANFD_CAR | {CAR.KIA_SORENTO, CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL, CAR.KIA_OPTIMA_H,
+ CAR.KIA_OPTIMA_H_G4_FL, CAR.HYUNDAI_SONATA_LF, CAR.HYUNDAI_TUCSON, CAR.GENESIS_G90, CAR.GENESIS_G80, CAR.HYUNDAI_ELANTRA}
+
+ # Asserts ECU keys essential for fuzzy fingerprinting are available on all platforms
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for platform_code_ecu in PLATFORM_CODE_ECUS:
+ if platform_code_ecu in (Ecu.fwdRadar, Ecu.eps) and car_model == CAR.HYUNDAI_GENESIS:
+ continue
+ if platform_code_ecu == Ecu.eps and car_model in no_eps_platforms:
+ continue
+ assert platform_code_ecu in [e[0] for e in ecus]
+
+ def test_fw_format(self, subtests):
+ # Asserts:
+ # - every supported ECU FW version returns one platform code
+ # - every supported ECU FW version has a part number
+ # - expected parsing of ECU FW dates
+
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for ecu, fws in ecus.items():
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ codes = set()
+ for fw in fws:
+ result = get_platform_codes([fw])
+ assert 1 == len(result), f"Unable to parse FW: {fw}"
+ codes |= result
+
+ if ecu[0] not in DATE_FW_ECUS or car_model in NO_DATES_PLATFORMS:
+ assert all(date is None for _, date in codes)
+ else:
+ assert all(date is not None for _, date in codes)
+
+ if car_model == CAR.HYUNDAI_GENESIS:
+ pytest.skip("No part numbers for car model")
+
+ # Hyundai places the ECU part number in their FW versions, assert all parsable
+ # Some examples of valid formats: b"56310-L0010", b"56310L0010", b"56310/M6300"
+ assert all(b"-" in code for code, _ in codes), \
+ f"FW does not have part number: {fw}"
+
+ def test_platform_codes_spot_check(self):
+ # Asserts basic platform code parsing behavior for a few cases
+ results = get_platform_codes([b"\xf1\x00DH LKAS 1.1 -150210"])
+ assert results == {(b"DH", b"150210")}
+
+ # Some cameras and all radars do not have dates
+ results = get_platform_codes([b"\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 "])
+ assert results == {(b"AEhe-G2000", None)}
+
+ results = get_platform_codes([b"\xf1\x00CV1_ RDR ----- 1.00 1.01 99110-CV000 "])
+ assert results == {(b"CV1-CV000", None)}
+
+ results = get_platform_codes([
+ b"\xf1\x00DH LKAS 1.1 -150210",
+ b"\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ",
+ b"\xf1\x00CV1_ RDR ----- 1.00 1.01 99110-CV000 ",
+ ])
+ assert results == {(b"DH", b"150210"), (b"AEhe-G2000", None), (b"CV1-CV000", None)}
+
+ results = get_platform_codes([
+ b"\xf1\x00LX2 MFC AT USA LHD 1.00 1.07 99211-S8100 220222",
+ b"\xf1\x00LX2 MFC AT USA LHD 1.00 1.08 99211-S8100 211103",
+ b"\xf1\x00ON MFC AT USA LHD 1.00 1.01 99211-S9100 190405",
+ b"\xf1\x00ON MFC AT USA LHD 1.00 1.03 99211-S9100 190720",
+ ])
+ assert results == {(b"LX2-S8100", b"220222"), (b"LX2-S8100", b"211103"),
+ (b"ON-S9100", b"190405"), (b"ON-S9100", b"190720")}
+
+ def test_fuzzy_excluded_platforms(self):
+ platforms_with_shared_codes = set()
+ for platform, fw_by_addr in FW_VERSIONS.items():
+ car_fw = []
+ for ecu, fw_versions in fw_by_addr.items():
+ ecu_name, addr, sub_addr = ecu
+ for fw in fw_versions:
+ car_fw.append(CarParams.CarFw(ecu=ecu_name, fwVersion=fw, address=addr,
+ subAddress=0 if sub_addr is None else sub_addr))
+
+ CP = CarParams(carFw=car_fw)
+ matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS)
+ if len(matches) == 1:
+ assert list(matches)[0] == platform
+ else:
+ platforms_with_shared_codes.add(platform)
+
+ # A unique fuzzy match must always resolve back to the platform that supplied the firmware.
+ # Ambiguity is expected for shared platform codes and for platforms without parseable dates.
+ assert {CAR.GENESIS_G70, CAR.GENESIS_G70_2020} <= platforms_with_shared_codes
diff --git a/iqdbc_repo/iqdbc/car/hyundai/tests/test_integration.py b/iqdbc_repo/iqdbc/car/hyundai/tests/test_integration.py
new file mode 100644
index 000000000..5dfb818a6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/tests/test_integration.py
@@ -0,0 +1,53 @@
+import pytest
+
+from iqdbc.car import gen_empty_fingerprint, structs
+from iqdbc.car.hyundai.interface import CarInterface
+from iqdbc.car.hyundai.values import CAR, HyundaiFlagsIQ, HyundaiSafetyFlagsIQ
+
+
+@pytest.mark.parametrize("candidate", list(CAR), ids=lambda candidate: candidate.value)
+@pytest.mark.parametrize("alpha_long", (False, True), ids=("stock_long", "openpilot_long"))
+def test_all_platform_state_controller_and_radar(candidate, alpha_long, monkeypatch, tmp_path):
+ """Every declared HKG platform must initialize and execute one complete interface cycle."""
+ monkeypatch.setenv("PARAMS_ROOT", str(tmp_path / candidate.value))
+ fingerprint = gen_empty_fingerprint()
+
+ cp = CarInterface.get_params(candidate, fingerprint, [], alpha_long, False, False)
+ cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], alpha_long, False, False)
+ interface = CarInterface(cp, cp_iq)
+
+ state, state_iq = interface.update([])
+ actuators, can_sends = interface.apply(structs.CarControl().as_reader(), structs.IQCarControl())
+ radar = interface.RadarInterface(cp, cp_iq)
+ radar_result = radar.update([])
+
+ assert state.vEgo == 0.0
+ assert state_iq is not None
+ assert actuators is not None
+ assert isinstance(can_sends, list)
+ assert radar_result is None
+
+
+def test_parameter_defaults_do_not_require_persisted_fingerprint(monkeypatch, tmp_path):
+ """A clean installation must not crash when carrotpilot-specific Params have not been written yet."""
+ monkeypatch.setenv("PARAMS_ROOT", str(tmp_path))
+ fingerprint = gen_empty_fingerprint()
+
+ cp = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False)
+ cp_iq = CarInterface.get_params_iq(cp, CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False)
+ interface = CarInterface(cp, cp_iq)
+
+ state, _ = interface.update([])
+ assert state.vEgo == 0.0
+
+
+def test_classic_lfa_button_capability_survives_iq_module_removal(monkeypatch, tmp_path):
+ monkeypatch.setenv("PARAMS_ROOT", str(tmp_path))
+ fingerprint = gen_empty_fingerprint()
+ fingerprint[0][0x391] = 8
+
+ cp = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False)
+ cp_iq = CarInterface.get_params_iq(cp, CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False)
+
+ assert cp_iq.flags & HyundaiFlagsIQ.HAS_LFA_BUTTON
+ assert cp_iq.iqSafetyFlags & HyundaiSafetyFlagsIQ.HAS_LDA_BUTTON
diff --git a/iqdbc_repo/iqdbc/car/hyundai/tests/test_radar.py b/iqdbc_repo/iqdbc/car/hyundai/tests/test_radar.py
new file mode 100644
index 000000000..ceace1ff9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/tests/test_radar.py
@@ -0,0 +1,326 @@
+import math
+
+import pytest
+
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+import iqdbc.car.hyundai.hyundaicanfd as hyundaicanfd
+import iqdbc.car.hyundai.radar_interface as radar_interface_module
+from iqdbc.car.hyundai.radar_interface import (
+ CORNER_OBJECT_STABLE_TRACK_ID_START,
+ RADAR_MSG_COUNT3,
+ RADAR_MSG_COUNT4,
+ RADAR_START_ADDR_CANFD3,
+ CornerObjectTrackIdManager,
+ RadarInterface,
+ corner_object_position_valid,
+)
+from iqdbc.car.hyundai.values import CAR, HyundaiExtFlags, HyundaiFlags
+
+
+class TestDensoRadar:
+ @staticmethod
+ def parse(addr, dat):
+ name = f"RADAR_TRACK_{addr:x}"
+ parser = CANParser("hyundai_kia_denso_front_radar_generated", [(name, 20)], 1)
+ parser.update([0, [(addr, bytes.fromhex(dat), 1)]])
+ return parser.vl[name]
+
+ def test_active_track_signals(self):
+ # Person walking toward the parked car, left of the camera center.
+ track = self.parse(0x503, "bc047efcc1fe8b00")
+
+ assert track["LONG_DIST"] == pytest.approx(7.1875)
+ assert track["LAT_DIST"] == pytest.approx(-1.625)
+ assert track["REL_SPEED"] == pytest.approx(-0.734375)
+ assert track["OBJECT_STATE"] == 3
+
+ def test_empty_track(self):
+ track = self.parse(0x507, "53fff80000000081")
+
+ assert track["LONG_DIST"] == pytest.approx(409.55)
+ assert track["LAT_DIST"] == 0
+ assert track["REL_SPEED"] == 0
+ assert track["OBJECT_STATE"] == 0
+
+ def test_long_range_lateral_distance(self):
+ # Real driving sample: treating the signed field as -12 degrees would put
+ # this target about 34 m sideways at 161 m. It is instead -3.0 m lateral.
+ track = self.parse(0x506, "b664eafa00cd230b")
+
+ assert track["LONG_DIST"] == pytest.approx(161.4625)
+ assert track["LAT_DIST"] == pytest.approx(-3.0)
+ assert track["OBJECT_STATE"] == 3
+
+ def test_parser_selection_and_point_conversion(self, monkeypatch):
+ class FakeParams:
+ def get_int(self, key):
+ return 1 if key == "EnableRadarTracks" else 0
+
+ monkeypatch.setattr(radar_interface_module, "Params", FakeParams)
+ cp = structs.CarParams()
+ cp.carFingerprint = CAR.KIA_SORENTO
+ cp.flags = 0
+ cp.extFlags = HyundaiExtFlags.RADAR_GROUP4.value
+ cp.radarUnavailable = False
+ cp.safetyConfigs = [structs.CarParams.SafetyConfig()]
+
+ radar_interface = RadarInterface(cp)
+
+ assert radar_interface.radar_group4
+ assert RADAR_MSG_COUNT4 == 8
+ assert radar_interface.radar_msg_count == RADAR_MSG_COUNT4
+ assert radar_interface.trigger_msg_tracks == 0x507
+
+ active_dat = bytes.fromhex("bc047efcc1fe8b00")
+ empty_dat = bytes.fromhex("bcfff80000000081")
+ packets = [(addr, active_dat if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ point = next(point for point in radar_data.points if point.trackId == 35)
+
+ assert point.measured
+ assert point.dRel == pytest.approx(7.1875)
+ assert point.yRel == pytest.approx(1.625)
+ assert point.vRel == pytest.approx(-0.734375)
+ assert math.isnan(point.aRel)
+
+ # EN: Confirm that the long-range sample survives the filter and converts
+ # radar-left-negative to openpilot-left-positive coordinates.
+ # KO: 장거리 샘플의 필터 통과와 레이더 좌측 음수 좌표가 openpilot 좌측
+ # 양수 좌표로 변환되는지 확인함.
+ long_range_dat = bytes.fromhex("b664eafa00cd230b")
+ packets = [(addr, long_range_dat if addr == 0x506 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ point = next(point for point in radar_data.points if point.trackId == 38)
+
+ assert point.dRel == pytest.approx(161.4625)
+ assert point.yRel == pytest.approx(3.0)
+
+ # EN: A state-0 raw detection must not enter a stable tracked-object slot.
+ # KO: 상태 0인 raw detection이 안정적인 추적 객체 슬롯에 들어오지 않음을 확인함.
+ raw_detection = bytes.fromhex("d702f4fc200000e4")
+ packets = [(addr, raw_detection if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ assert not radar_data.points
+
+ # EN: A real confirmed track beyond the former 205 m limit remains valid.
+ # KO: 기존 205m 상한을 넘는 실제 확정 트랙도 유효하게 유지됨.
+ confirmed_213m_track = bytes.fromhex("35854c0780f163e0")
+ packets = [(addr, confirmed_213m_track if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ point = next(point for point in radar_data.points if point.trackId == 35)
+ assert point.dRel == pytest.approx(213.275)
+ assert point.yRel == pytest.approx(-3.75)
+
+ # EN: The 325 m boundary is rejected, leaving ample separation from the
+ # 409.55 m empty-slot sentinel.
+ # KO: 325m 경계값을 제외해 409.55m 빈 슬롯 값과 충분한 간격을 확보함.
+ boundary_track = bytes.fromhex("bccb200000000300")
+ packets = [(addr, boundary_track if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ assert not radar_data.points
+
+ # EN: The wider profile keeps a real stable track at 4.875 m, covering more
+ # of the outer adjacent lane than the conservative 4.5 m profile.
+ # KO: 넓어진 필터에서 4.875m의 실제 안정 트랙을 유지해 보수적인 4.5m
+ # 설정보다 바깥쪽 인접 차선을 더 넓게 포함함.
+ outer_lane_track = bytes.fromhex("d80b66f640000300")
+ packets = [(addr, outer_lane_track if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ point = next(point for point in radar_data.points if point.trackId == 35)
+ assert point.yRel == pytest.approx(4.875)
+
+ # EN: Tracks beyond the widened envelope are rejected as roadside clutter;
+ # this payload differs only in lateral distance (-7.0 m).
+ # KO: 넓어진 범위를 벗어난 트랙은 도로변 잡음으로 제외함. 이 payload는
+ # 횡방향 거리(-7.0m)만 다름.
+ far_side_reflection = bytes.fromhex("d80b66f200000300")
+ packets = [(addr, far_side_reflection if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)]
+ radar_data = radar_interface.update([0, packets])
+ assert not radar_data.points
+
+
+class TestRadarGroup3:
+ @staticmethod
+ def parse(addr, dat):
+ name = f"RADAR_TRACK_{addr:x}"
+ parser = CANParser("hyundai_canfd_radar_generated", [(name, 20)], 1)
+ parser.update([0, [(addr, bytes.fromhex(dat), 1)]])
+ return parser.vl[name]
+
+ def test_group3_active_track(self):
+ track = self.parse(0x406, "e1043b0f02590e692a227e16f80fe00f28fcc753a20a0000")
+
+ assert track["OBJECT_LENGTH"] == pytest.approx(4.4)
+ assert track["LONG_DIST"] == pytest.approx(55.4)
+ assert track["LAT_DIST"] == pytest.approx(-3.0)
+ assert track["REL_SPEED"] == pytest.approx(4.4)
+
+ def test_group3_empty_track(self):
+ track = self.parse(0x407, "c03d3b0000000000ff0700000000000000d0020000000000")
+
+ assert track["OBJECT_LENGTH"] == 0
+ assert track["LONG_DIST"] == pytest.approx(204.7)
+ assert track["LAT_DIST"] == 0
+ assert track["REL_SPEED"] == 0
+
+ def test_group3_parser_selection(self, monkeypatch):
+ class FakeParams:
+ def get_int(self, key):
+ return 1 if key == "EnableRadarTracks" else 0
+
+ monkeypatch.setattr(radar_interface_module, "Params", FakeParams)
+ monkeypatch.setattr(hyundaicanfd, "Params", FakeParams)
+ cp = structs.CarParams()
+ cp.carFingerprint = next(car for car, dbc in radar_interface_module.DBC.items() if "hyundai_canfd" in dbc[Bus.pt])
+ cp.flags = HyundaiFlags.CANFD.value
+ cp.extFlags = HyundaiExtFlags.RADAR_GROUP3.value
+ cp.radarUnavailable = False
+ cp.safetyConfigs = [structs.CarParams.SafetyConfig()]
+
+ radar_interface = RadarInterface(cp)
+
+ assert radar_interface.radar_group3
+ assert radar_interface.radar_start_addr == RADAR_START_ADDR_CANFD3
+ assert radar_interface.radar_msg_count == RADAR_MSG_COUNT3
+ assert radar_interface.trigger_msg_tracks == 0x41D
+
+ active_dat = bytes.fromhex("e1043b0f02590e692a227e16f80fe00f28fcc753a20a0000")
+ empty_dat = bytes.fromhex("c03d3b0000000000ff0700000000000000d0020000000000")
+ packets = [(addr, active_dat if addr == 0x406 else empty_dat, 1) for addr in range(0x400, 0x41E)]
+ radar_data = radar_interface.update([0, packets])
+ point = next(point for point in radar_data.points if point.trackId == 38)
+
+ assert point.measured
+ assert point.dRel == pytest.approx(53.1)
+ assert point.yRel == pytest.approx(-3.0)
+ assert point.vRel == pytest.approx(4.4)
+
+
+class TestCornerRadarObjectIdentity:
+ @staticmethod
+ def set_bits(data, start, size, value):
+ for offset in range(size):
+ bit = start + offset
+ data[bit // 8] |= ((value >> offset) & 1) << (bit % 8)
+
+ @pytest.mark.parametrize(
+ "dbc,msg_name,addr,age_signal,id_signal,age_start,id_start",
+ (
+ ("hyundai_canfd_corner_radar_180_generated", "CORNER_RADAR_180_OBJECTS_180", 0x180,
+ "SLOT1_AGE", "SLOT1_OBJECT_ID", 32, 44),
+ ("hyundai_canfd_corner_radar_235_generated", "CORNER_RADAR_235_OBJECTS_235", 0x235,
+ "OBJ_AGE", "OBJ_OBJECT_ID", 32, 44),
+ ),
+ )
+ def test_object_identity_signals(self, dbc, msg_name, addr, age_signal, id_signal, age_start, id_start):
+ data = bytearray(32)
+ self.set_bits(data, age_start, 8, 23)
+ self.set_bits(data, id_start, 7, 46)
+ parser = CANParser(dbc, [(msg_name, 33)], 1)
+ parser.update([0, [(addr, bytes(data), 1)]])
+
+ assert parser.vl[msg_name][age_signal] == 23
+ assert parser.vl[msg_name][id_signal] == 46
+
+ def test_track_id_survives_slot_move_and_resets_with_age(self):
+ manager = CornerObjectTrackIdManager()
+ first_id = manager.get_track_id("corner180", object_id=108, age=240)
+
+ assert first_id == CORNER_OBJECT_STABLE_TRACK_ID_START
+ assert manager.get_track_id("corner180", object_id=108, age=241) == first_id
+ assert manager.get_track_id("corner235", object_id=108, age=241) != first_id
+ assert manager.get_track_id("corner180", object_id=108, age=2) != first_id
+
+ def test_clipped_side_object_position_is_valid(self):
+ assert corner_object_position_valid(0.0, 2.8)
+ assert corner_object_position_valid(25.0, 0.2)
+ assert not corner_object_position_valid(0.0, 0.0)
+ assert not corner_object_position_valid(0.0, 5.0)
+
+
+class TestCornerRadar430CandidateFilter:
+ @staticmethod
+ def slot_word(distance_raw, meta13=0, b2=10, b3=2):
+ return distance_raw | (meta13 << 13) | (b2 << 16) | (b3 << 24)
+
+ @classmethod
+ def message(cls, slots):
+ words = [0x010d1f40] * 7
+ for slot, word in slots.items():
+ words[slot - 1] = word
+
+ dat = bytearray(32)
+ for idx, word in enumerate(words):
+ dat[4 + idx * 4:8 + idx * 4] = int(word).to_bytes(4, "little")
+ return bytes(dat)
+
+ @staticmethod
+ def build_interface(monkeypatch):
+ class FakeParams:
+ def get_int(self, key):
+ return 1 if key == "EnableCornerRadar" else 0
+
+ monkeypatch.setattr(radar_interface_module, "Params", FakeParams)
+ monkeypatch.setattr(hyundaicanfd, "Params", FakeParams)
+ cp = structs.CarParams()
+ cp.carFingerprint = next(car for car, dbc in radar_interface_module.DBC.items() if "hyundai_canfd" in dbc[Bus.pt])
+ cp.flags = HyundaiFlags.CANFD.value
+ cp.extFlags = HyundaiExtFlags.CORNER_RADAR_OBJECTS_430.value
+ cp.radarUnavailable = True
+ cp.safetyConfigs = [structs.CarParams.SafetyConfig()]
+ return RadarInterface(cp)
+
+ @staticmethod
+ def update_frames(radar_interface, packets, frames=5):
+ radar_data = None
+ for _ in range(frames):
+ radar_data = radar_interface.update([0, packets])
+ return radar_data
+
+ def test_430_promotes_supported_neighbor_bins(self, monkeypatch):
+ radar_interface = self.build_interface(monkeypatch)
+ empty = self.message({})
+ supported_bins = self.message({
+ 6: self.slot_word(1000),
+ 7: self.slot_word(1004),
+ })
+ packets = [(addr, supported_bins if addr == 0x436 else empty, 1) for addr in range(0x430, 0x438)]
+ packets += [(addr, empty, 1) for addr in range(0x440, 0x448)]
+
+ radar_data = self.update_frames(radar_interface, packets)
+ points = {point.trackId: point for point in radar_data.points}
+
+ assert points[300].measured
+ assert points[300].dRel == pytest.approx(50.1)
+ assert points[300].yRel == pytest.approx(2.0)
+ assert points[300].yvRel == 0.0
+
+ def test_430_expires_noncenter_inward_yvrel(self, monkeypatch):
+ radar_interface = self.build_interface(monkeypatch)
+ empty = self.message({})
+ frame_defs = (
+ (0x431, 4, 5),
+ (0x433, 3, 4),
+ (0x435, 2, 3),
+ (0x430, 5, 6),
+ (0x432, 4, 5),
+ (0x434, 3, 4),
+ (0x436, 2, 3),
+ )
+
+ radar_data = None
+ for addr, first_slot, second_slot in frame_defs:
+ msg = self.message({
+ first_slot: self.slot_word(1000),
+ second_slot: self.slot_word(1004),
+ })
+ packets = [(a, msg if a == addr else empty, 1) for a in range(0x430, 0x438)]
+ packets += [(a, empty, 1) for a in range(0x440, 0x448)]
+ radar_data = radar_interface.update([0, packets])
+ radar_data = self.update_frames(radar_interface, packets, frames=3)
+ points = {point.trackId: point for point in radar_data.points}
+
+ assert points[300].measured
+ assert points[300].yRel == pytest.approx(2.0)
+ assert points[300].yvRel == 0.0
diff --git a/iqdbc_repo/iqdbc/car/hyundai/values.py b/iqdbc_repo/iqdbc/car/hyundai/values.py
new file mode 100644
index 000000000..3fd7310fe
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/hyundai/values.py
@@ -0,0 +1,1070 @@
+import re
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds
+from iqdbc.car.lateral import AngleSteeringLimits
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, p16
+
+Ecu = CarParams.Ecu
+
+
+class CarControllerParams:
+ ACCEL_MIN = -4.0 # m/s
+ ACCEL_MAX = 2.5 # m/s
+ ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits(
+ # LKAS angle command is unlimited, but LFA is limited to 176.7 deg (but does not fault if requesting above)
+ 175, # deg
+ # stock comma's
+ #([0, 9, 16, 25], [1.4, 0.6, 0.4, 0.1]),
+ #([0, 9, 16, 25], [1.4, 0.7, 0.5, 0.1]),
+ ([0, 9, 16, 25], [1.8, 1.6, 1.3, 0.8]),
+ ([0, 9, 16, 25], [2.4, 2.0, 1.6, 1.0]),
+ #([0, 9, 16, 25], [1.6, 1.0, 0.6, 0.15]),
+ #([0, 9, 16, 25], [2.0, 1.2, 0.8, 0.28]),
+ )
+ # Stock LFA system is seen sending 250 max, but for LKAS events it's 175 max.
+ # 250 can at least achieve 4 m/s^2, 80 corresponds to ~2.5 m/s^2
+ ANGLE_MAX_TORQUE = 200 # The maximum amount of torque that will be allowed
+ ANGLE_MIN_TORQUE = 25 # equivalent to ~0.8 m/s^2 of torque (based on ANGLE_MAX_TORQUE) when overriding
+ ANGLE_TORQUE_UP_RATE = 8 #2 # Indicates how fast the torque ramps up after user intervention.
+ ANGLE_TORQUE_DOWN_RATE = 12 #4 Indicates how fast the torque ramps down during user intervention (handing off).
+
+ def __init__(self, CP):
+ self.STEER_DELTA_UP = 3
+ self.STEER_DELTA_DOWN = 7
+ self.STEER_DRIVER_ALLOWANCE = 50
+ self.STEER_DRIVER_MULTIPLIER = 2
+ self.STEER_DRIVER_FACTOR = 1
+ self.STEER_THRESHOLD = 150
+ self.STEER_STEP = 1 # 100 Hz
+
+ if CP.flags & HyundaiFlags.CANFD:
+ self.STEER_MAX = 270
+ self.STEER_DRIVER_ALLOWANCE = 250
+ self.STEER_DRIVER_MULTIPLIER = 2
+ self.STEER_THRESHOLD = 250
+ self.STEER_DELTA_UP = 2
+ self.STEER_DELTA_DOWN = 3
+
+ # To determine the limit for your car, find the maximum value that the stock LKAS will request.
+ # If the max stock LKAS request is <384, add your car to this list.
+ elif CP.carFingerprint in (CAR.GENESIS_G80, CAR.HYUNDAI_ELANTRA, CAR.HYUNDAI_ELANTRA_GT_I30, CAR.HYUNDAI_IONIQ,
+ CAR.HYUNDAI_IONIQ_EV_LTD, CAR.HYUNDAI_SANTA_FE_PHEV_2022, CAR.HYUNDAI_SONATA_LF, CAR.KIA_FORTE, CAR.KIA_NIRO_PHEV,
+ CAR.KIA_OPTIMA_H, CAR.KIA_OPTIMA_H_G4_FL, CAR.KIA_SORENTO):
+ self.STEER_MAX = 255
+
+ elif CP.carFingerprint in (CAR.HYUNDAI_SANTA_FE_PHEV_2022):
+ self.STEER_MAX = 409
+ # these cars have significantly more torque than most HKG; limit to 70% of max
+ elif CP.flags & HyundaiFlags.ALT_LIMITS:
+ self.STEER_MAX = 384
+ self.STEER_DELTA_UP = 2
+ self.STEER_DELTA_DOWN = 3
+
+ # Default for most HKG
+ else:
+ self.STEER_MAX = 409
+
+
+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
+
+
+class HyundaiSafetyFlagsIQ:
+ DEFAULT = 0
+ ESCC = 16
+ MAIN_BTN_LONG_TOGGLE = 32
+ HAS_LDA_BUTTON = 64
+ NON_SCC = 128
+
+
+class HyundaiFlagsIQ(IntFlag):
+ ENHANCED_SCC = 1
+ HAS_LFA_BUTTON = 2
+ MAIN_BTN_LONG_TOGGLE = 2 ** 2
+ ENABLE_RADAR_TRACKS_DEPRECATED = 2 ** 3
+ LONG_TUNING_DYNAMIC = 2 ** 4
+ LONG_TUNING_PREDICTIVE = 2 ** 5
+ NON_SCC = 2 ** 6
+ NON_SCC_RADAR_FCA = 2 ** 7
+ NON_SCC_NO_FCA = 2 ** 8
+ SPEED_LIMIT_AVAILABLE = 2 ** 9
+ HAS_LKAS12 = 2 ** 10
+
+
+class HyundaiFlags(IntFlag):
+ # Dynamic Flags
+ CANFD_HDA2 = 1
+ CANFD_ALT_BUTTONS = 2
+ CANFD_ALT_GEARS = 2 ** 2
+ CANFD_CAMERA_SCC = 2 ** 3
+
+ ALT_LIMITS = 2 ** 4
+ ENABLE_BLINKERS = 2 ** 5
+ CANFD_ALT_GEARS_2 = 2 ** 6
+ SEND_LFA = 2 ** 7
+ USE_FCA = 2 ** 8
+ CANFD_HDA2_ALT_STEERING = 2 ** 9
+
+ # these cars use a different gas signal
+ HYBRID = 2 ** 10
+ EV = 2 ** 11
+
+ # Static flags
+
+ # If 0x500 is present on bus 1 it probably has a Mando radar outputting radar points.
+ # If no points are outputted by default it might be possible to turn it on using selfdrive/debug/hyundai_enable_radar_points.py
+ MANDO_RADAR = 2 ** 12
+ CANFD = 2 ** 13
+
+ # The radar does SCC on these cars when HDA I, rather than the camera
+ RADAR_SCC = 2 ** 14
+ # The camera does SCC on these cars, rather than the radar
+ CAMERA_SCC = CANFD_CAMERA_SCC #2 ** 15
+ CHECKSUM_CRC8 = 2 ** 16
+ CHECKSUM_6B = 2 ** 17
+
+ # these cars require a special panda safety mode due to missing counters and checksums in the messages
+ LEGACY = 2 ** 18
+
+ # these cars have not been verified to work with longitudinal yet - radar disable, sending correct messages, etc.
+ UNSUPPORTED_LONGITUDINAL = 2 ** 19
+
+ # These CAN FD cars do not accept communication control to disable the ADAS ECU,
+ # responds with 0x7F2822 - 'conditions not correct'
+ CANFD_NO_RADAR_DISABLE = 2 ** 20
+
+ CLUSTER_GEARS = 2 ** 21
+ TCU_GEARS = 2 ** 22
+
+ MIN_STEER_32_MPH = 2 ** 23
+
+ ANGLE_CONTROL = 2 ** 24
+
+ FCEV = 2 ** 25
+
+ ALT_LIMITS_2 = 2 ** 26
+
+ CC_ONLY_CAR = 2 ** 31
+
+class HyundaiExtFlags(IntFlag):
+ NAVI_CLUSTER = 2 ** 2
+ HAS_LFAHDA = 2 ** 4
+ CANFD_GEARS_NONE = 2 ** 6
+ RADAR_GROUP1 = 2 ** 7 # 0x210 radar group 1, 0x3A5 radar group 2
+ CANFD_GEARS_69 = 2 ** 10
+ RADAR_GROUP3 = 2 ** 11 # 0x400-0x41D radar object group
+ CORNER_RADAR_OBJECTS_235 = 2 ** 12 # 0x230 status + 0x235-0x248 raw corner radar objects
+ CORNER_RADAR_OBJECTS_180 = 2 ** 13 # 0x180-0x184 bus 1 two-slot raw corner/front radar objects
+ CORNER_RADAR_OBJECTS_430 = 2 ** 14 # 0x430-0x437 left + 0x440-0x447 right IONIQ 9 corner radar bins
+ RADAR_GROUP4 = 2 ** 15 # 0x500-0x507 Denso DNMWR006 stable radar tracks
+ EV_MODE_STATUS_230 = 2 ** 16 # ECAN 0x230/DLC32 exposes the hybrid power-flow mode used for the EV indicator
+
+class Footnote(Enum):
+ CANFD = CarFootnote(
+ "Requires a CAN FD panda kit if not using " +
+ "comma 3X for this CAN FD car .",
+ Column.MODEL)
+
+
+@dataclass
+class HyundaiCarDocs(CarDocs):
+ package: str = "Smart Cruise Control (SCC)"
+
+ def init_make(self, CP: CarParams):
+ if CP.flags & HyundaiFlags.CANFD:
+ self.footnotes.insert(0, Footnote.CANFD)
+
+
+@dataclass
+class HyundaiPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"})
+
+ def init(self):
+ if self.flags & HyundaiFlags.MANDO_RADAR:
+ self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: 'hyundai_kia_mando_front_radar_generated'}
+
+ if self.flags & HyundaiFlags.MIN_STEER_32_MPH:
+ self.specs = self.specs.override(minSteerSpeed=32 * CV.MPH_TO_MS)
+
+
+@dataclass
+class HyundaiCanFDPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_canfd_generated", Bus.radar: 'hyundai_canfd_radar_generated'})
+
+ def init(self):
+ self.flags |= HyundaiFlags.CANFD
+
+
+class CAR(Platforms):
+ # Hyundai
+ HYUNDAI_AZERA_7TH_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Azera 2023-2024", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ CarSpecs(mass=1700, wheelbase=2.895, steerRatio=16.5),
+ )
+ HYUNDAI_AZERA_6TH_GEN = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5),
+ )
+ HYUNDAI_AZERA_HEV_6TH_GEN = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])),
+ HyundaiCarDocs("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5),
+ flags=HyundaiFlags.HYBRID,
+ )
+ HYUNDAI_ELANTRA = HyundaiPlatformConfig(
+ [
+ # TODO: 2017-18 could be Hyundai G
+ HyundaiCarDocs("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])),
+ HyundaiCarDocs("Hyundai Elantra 2019", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])),
+ ],
+ # steerRatio: 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535, stiffnessFactor settled on 1.0081302973865127
+ CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH,
+ )
+ HYUNDAI_ELANTRA_GT_I30 = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Elantra GT 2017-20", car_parts=CarParts.common([CarHarness.hyundai_e])),
+ HyundaiCarDocs("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])),
+ ],
+ HYUNDAI_ELANTRA.specs,
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH,
+ )
+ HYUNDAI_ELANTRA_2021 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Elantra 2021-23", video="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.CHECKSUM_CRC8,
+ )
+ HYUNDAI_ELANTRA_HEV_2021 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Elantra Hybrid 2021-23", video="https://youtu.be/_EdYQtV52-c",
+ car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
+ )
+ HYUNDAI_GENESIS = HyundaiPlatformConfig(
+ [
+ # TODO: check 2015 packages
+ HyundaiCarDocs("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])),
+ HyundaiCarDocs("Genesis G80 2017", "All", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])),
+ ],
+ CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS),
+ flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY,
+ )
+ HYUNDAI_IONIQ = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
+ 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]))],
+ CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
+ )
+ HYUNDAI_IONIQ_EV_LTD = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH,
+ )
+ HYUNDAI_IONIQ_EV_2020 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.EV,
+ )
+ HYUNDAI_IONIQ_PHEV_2019 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH,
+ )
+ HYUNDAI_IONIQ_PHEV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.HYBRID,
+ )
+ HYUNDAI_KONA = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Kona 2020", min_enable_speed=6 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b]))],
+ 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),
+ flags=HyundaiFlags.EV | HyundaiFlags.ALT_LIMITS,
+ )
+ HYUNDAI_KONA_EV_2022 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))],
+ CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV | HyundaiFlags.ALT_LIMITS,
+ )
+ HYUNDAI_KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video="https://www.youtube.com/watch?v=U2fOCmcQ8hw",
+ car_parts=CarParts.common([CarHarness.hyundai_r]))],
+ CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
+ )
+ HYUNDAI_KONA_HEV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages,
+ CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.ALT_LIMITS,
+ )
+ HYUNDAI_KONA_HEV_2ND_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Kona Hybrid 2024", car_parts=CarParts.common([CarHarness.hyundai_l]))],
+ CarSpecs(mass=1590, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.HYBRID,
+ )
+ 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="https://youtu.be/bjDR0YjM__s",
+ car_parts=CarParts.common([CarHarness.hyundai_d]))],
+ CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82),
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
+ )
+ HYUNDAI_SANTA_FE_2022 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video="https://youtu.be/VnHzSTygTS4",
+ car_parts=CarParts.common([CarHarness.hyundai_l]))],
+ HYUNDAI_SANTA_FE.specs,
+ flags=HyundaiFlags.CHECKSUM_CRC8,
+ )
+ HYUNDAI_SANTA_FE_HEV_2022 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))],
+ HYUNDAI_SANTA_FE.specs,
+ flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
+ )
+ HYUNDAI_SANTA_FE_PHEV_2022 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))],
+ HYUNDAI_SANTA_FE.specs,
+ flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
+ )
+ HYUNDAI_SONATA = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video="https://www.youtube.com/watch?v=ix63r9kE3Fw",
+ car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
+ )
+ HYUNDAI_SONATA_LF = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))],
+ CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable
+
+ flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS,
+ )
+ HYUNDAI_SONATA_2024 = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Sonata 2024-25", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ CarSpecs(mass=1556, wheelbase=2.84, steerRatio=12.81),
+ flags=HyundaiFlags.CAMERA_SCC,
+ )
+ HYUNDAI_STARIA_4TH_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf
+ )
+ HYUNDAI_TUCSON = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])),
+ HyundaiCarDocs("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])),
+ ],
+ CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.TCU_GEARS,
+ )
+ HYUNDAI_PALISADE = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Palisade 2020-22", "All", video="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])),
+ HyundaiCarDocs("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])),
+ ],
+ CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63),
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
+ )
+ HYUNDAI_VELOSTER = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))],
+ CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5),
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS,
+ )
+ HYUNDAI_SONATA_HYBRID = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ HYUNDAI_SONATA.specs,
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
+ )
+ HYUNDAI_IONIQ_5 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia and Europe only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_q])),
+ HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])),
+ ],
+ CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.EV,
+ )
+ HYUNDAI_IONIQ_5_PE = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai IONIQ 5 PE (NE1)", car_parts=CarParts.common([CarHarness.hyundai_q])),
+ HyundaiCarDocs("Hyundai Ioniq 5 PE (with HDA II) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])),
+ ],
+ #CarSpecs(mass=2012, wheelbase=3.0, steerRatio=14.26, tireStiffnessFactor=0.65),
+ CarSpecs(mass=2012, wheelbase=3.0, steerRatio=14.26, tireStiffnessFactor=1.0),
+ flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL,
+ )
+ HYUNDAI_IONIQ_5_N = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq 5 N (with HDA II) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_m]))],
+ CarSpecs(mass=2200, wheelbase=3.00, steerRatio=12.54),
+ flags=HyundaiFlags.EV,
+ )
+ HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))],
+ HYUNDAI_IONIQ_5.specs,
+ flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
+ )
+ HYUNDAI_IONIQ_9 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Ioniq 9", "All", car_parts=CarParts.common([CarHarness.hyundai_m])),
+ ],
+ CarSpecs(mass=2505, wheelbase=3.13, steerRatio=16.02),
+ flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL,
+ )
+ HYUNDAI_TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ HyundaiCarDocs("Hyundai Tucson 2023-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ HyundaiCarDocs("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ HyundaiCarDocs("Hyundai Tucson Plug-in Hybrid 2024", "All", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ ],
+ CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385),
+ )
+ HYUNDAI_SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))],
+ # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf
+ CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2),
+ )
+ HYUNDAI_CUSTIN_1ST_GEN = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner
+ flags=HyundaiFlags.CHECKSUM_CRC8,
+ )
+ HYUNDAI_CASPER = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Casper 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=1060, wheelbase=2.4, steerRatio=14.3), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner
+ flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.CHECKSUM_CRC8,
+ )
+
+ HYUNDAI_CASPER_EV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Casper EV 2024", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=1355, wheelbase=2.58, steerRatio=14.3), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner
+ flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.EV
+ )
+ HYUNDAI_PORTER_II_EV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Porter II EV 2024", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=1970, wheelbase=2.64, steerRatio=14.5),
+ flags=HyundaiFlags.EV | HyundaiFlags.CC_ONLY_CAR,
+ )
+ HYUNDAI_SANTAFE_MX5 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai SANTAFE (MX5)", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ CarSpecs(mass=1910, wheelbase=2.76, steerRatio=15.8, tireStiffnessFactor=0.82),
+ flags=HyundaiFlags.ANGLE_CONTROL,
+ )
+ HYUNDAI_SANTAFE_MX5_HEV = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Hyundai SANTAFE HYBRID (MX5)", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ HYUNDAI_SANTAFE_MX5.specs,
+ flags=HyundaiFlags.ANGLE_CONTROL,
+ )
+
+ # Kia
+ KIA_FORTE = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Forte 2019-21", min_enable_speed=6 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])),
+ HyundaiCarDocs("Kia Forte 2022-23", car_parts=CarParts.common([CarHarness.hyundai_e])),
+ ],
+ CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5)
+ )
+ KIA_K5_2021 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims)
+ flags=HyundaiFlags.CHECKSUM_CRC8,
+ )
+ KIA_K5_HEV_2020 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ KIA_K5_2021.specs,
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
+ )
+ KIA_K5_DL3_24 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia K5 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ CarSpecs(mass=1553, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5),
+ )
+ KIA_K5_DL3_24_HEV = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia K5 Hybrid 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ CarSpecs(mass=1553, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5),
+ )
+ KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))],
+ # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform
+ CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27)
+ )
+ KIA_NIRO_EV = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Niro EV 2019", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])),
+ HyundaiCarDocs("Kia Niro EV 2020", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])),
+ HyundaiCarDocs("Kia Niro EV 2021", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_c])),
+ HyundaiCarDocs("Kia Niro EV 2022", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])),
+ ],
+ CarSpecs(mass=3543 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=13.6, tireStiffnessFactor=0.385), # average of all the cars
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV,
+ )
+ KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ KIA_NIRO_EV.specs,
+ flags=HyundaiFlags.EV,
+ )
+ KIA_NIRO_PHEV = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])),
+ HyundaiCarDocs("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])),
+ HyundaiCarDocs("Kia Niro Plug-in Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_d])),
+ ],
+ KIA_NIRO_EV.specs,
+ flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH,
+ )
+ KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])),
+ HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])),
+ ],
+ KIA_NIRO_EV.specs,
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR,
+ )
+ KIA_NIRO_HEV_2021 = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])),
+ HyundaiCarDocs("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])),
+ ],
+ KIA_NIRO_EV.specs,
+ flags=HyundaiFlags.HYBRID,
+ )
+ KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ KIA_NIRO_EV.specs,
+ )
+ KIA_OPTIMA_G4 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Optima 2017", "Advanced Smart Cruise Control",
+ car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018
+ CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH,
+ )
+ KIA_OPTIMA_G4_FL = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))],
+ CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
+ flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS,
+ )
+ # TODO: may support adjacent years. may have a non-zero minimum steering speed
+ KIA_OPTIMA_H = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=3758 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
+ )
+ KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL,
+ )
+ KIA_SELTOS = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56),
+ flags=HyundaiFlags.CHECKSUM_CRC8,
+ )
+ KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Sportage 2023-24", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ HyundaiCarDocs("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ ],
+ # weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications
+ CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6),
+ )
+ KIA_SORENTO = HyundaiPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video="https://www.youtube.com/watch?v=Fkh3s6WHJz8",
+ car_parts=CarParts.common([CarHarness.hyundai_e])),
+ HyundaiCarDocs("Kia Sorento 2019", video="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])),
+ ],
+ CarSpecs(mass=1985, wheelbase=2.78, steerRatio=14.4 * 1.1), # 10% higher at the center seems reasonable
+ dbc_dict={Bus.pt: "hyundai_kia_generic", Bus.radar: "hyundai_kia_denso_front_radar_generated"},
+ flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.UNSUPPORTED_LONGITUDINAL,
+ )
+ KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms
+ flags=HyundaiFlags.RADAR_SCC,
+ )
+ KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
+ HyundaiCarDocs("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
+ ],
+ CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms
+ flags=HyundaiFlags.RADAR_SCC,
+ )
+ KIA_STINGER = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Stinger 2018-20", video="https://www.youtube.com/watch?v=MJ94qoofYw0",
+ car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable
+ )
+ KIA_STINGER_2022 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ KIA_STINGER.specs,
+ )
+ KIA_CEED = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Ceed 2019-21", car_parts=CarParts.common([CarHarness.hyundai_e]))],
+ CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5),
+ flags=HyundaiFlags.LEGACY,
+ )
+ KIA_EV4 = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Kia EV4 2025", "All", car_parts=CarParts.common([CarHarness.hyundai_q]))],
+ CarSpecs(mass=1710, wheelbase=2.83, steerRatio=14.5, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.EV,
+ )
+ KIA_EV6 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia EV6 (Southeast Asia only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_p])),
+ HyundaiCarDocs("Kia EV6 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])),
+ HyundaiCarDocs("Kia EV6 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))
+ ],
+ CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.EV,
+ )
+ KIA_EV6_PE = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia EV6 PE (CV1)", car_parts=CarParts.common([CarHarness.hyundai_p])),
+ HyundaiCarDocs("Kia EV6 PE (with HDA II) 2025", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))
+ ],
+ CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL,
+ )
+ KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])),
+ HyundaiCarDocs("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k]))
+ ],
+ CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23),
+ flags=HyundaiFlags.RADAR_SCC,
+ )
+
+ # Genesis
+ GENESIS_GV60_EV_1ST_GEN = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
+ HyundaiCarDocs("Genesis GV60 (Performance Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ CarSpecs(mass=2205, wheelbase=2.9, steerRatio=17.6),
+ flags=HyundaiFlags.EV,
+ )
+ GENESIS_G70 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Genesis G70 2018", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))],
+ CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56),
+ flags=HyundaiFlags.LEGACY,
+ )
+ GENESIS_G70_2020 = HyundaiPlatformConfig(
+ [
+ # TODO: 2021 MY harness is unknown
+ HyundaiCarDocs("Genesis G70 2019-21", "All", car_parts=CarParts.common([CarHarness.hyundai_f])),
+ # TODO: From 3.3T Sport Advanced 2022 & Prestige 2023 Trim, 2.0T is unknown
+ HyundaiCarDocs("Genesis G70 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])),
+ ],
+ GENESIS_G70.specs,
+ flags=HyundaiFlags.MANDO_RADAR,
+ )
+ 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 (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),
+ flags=HyundaiFlags.RADAR_SCC,
+ )
+ 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])),
+ ],
+ CarSpecs(mass=2260, wheelbase=2.87, steerRatio=17.1),
+ flags=HyundaiFlags.EV,
+ )
+ GENESIS_G80 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5),
+ flags=HyundaiFlags.LEGACY,
+ )
+ GENESIS_G80_2ND_GEN_FL = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Genesis G80 (2.5T Advanced Trim, with HDA II) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))],
+ CarSpecs(mass=2060, wheelbase=3.00, steerRatio=14.0),
+ )
+ GENESIS_G90 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Genesis G90 2017-20", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069),
+ )
+ GENESIS_GV80 = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))],
+ CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14),
+ flags=HyundaiFlags.RADAR_SCC,
+ )
+ GENESIS_GV70_EV_1ST_GEN = HyundaiCanFDPlatformConfig(
+ [HyundaiCarDocs("Genesis GV70 EV 2020-2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))],
+ CarSpecs(mass=2230, wheelbase=2.87, steerRatio=14.6),
+ flags=HyundaiFlags.EV | HyundaiFlags.RADAR_SCC,
+ )
+ HYUNDAI_GRANDEUR_IG = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Grandeur 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1570, wheelbase=2.845, steerRatio=16., tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS,
+ )
+ HYUNDAI_GRANDEUR_IG_HEV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Grandeur HEV 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1570, wheelbase=2.845, steerRatio=16., tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
+ )
+ GENESIS_EQ900 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Genesis EQ900 2017", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=2200, wheelbase=3.15, steerRatio=16., tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY,
+ )
+ GENESIS_EQ900_L = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Genesis EQ900 LIMOUSINE", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=2290, wheelbase=3.45, steerRatio=16., tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY,
+ )
+ GENESIS_G90_2019 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Genesis G90 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=2150, wheelbase=3.16, steerRatio=16., tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY,
+ )
+ HYUNDAI_NEXO = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Hyundai Nexo", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
+ CarSpecs(mass=1885, wheelbase=2.79, steerRatio=15.3, tireStiffnessFactor=0.385),
+ flags=HyundaiFlags.EV,
+ )
+ KIA_MOHAVE = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Mohave 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
+ CarSpecs(mass=2285, wheelbase=2.895, steerRatio=16., tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY,
+ )
+ KIA_K5 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K5 2019 & 2016", "All", car_parts=CarParts.common([CarHarness.hyundai_b]))],
+ CarSpecs(mass=1515, wheelbase=2.80, steerRatio=15.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS,
+ )
+ KIA_K5_HEV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K5 Hybrid 2017", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1705, wheelbase=2.80, steerRatio=15.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
+ )
+ KIA_K5_HEV_2022 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K5 Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1515, wheelbase=2.85, steerRatio=15.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
+ )
+ KIA_K7 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K7 2016-2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1850, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS,
+ )
+ KIA_K7_HEV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K7 Hybrid 2016-2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1515, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
+ )
+ KIA_K7_PE = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K7 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1850, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7),
+ )
+ KIA_K7_HEV_PE = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K7 Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1515, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.HYBRID,
+ )
+ KIA_K9 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia K9 2016-2019", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=2075, wheelbase=3.15, steerRatio=14.5, tireStiffnessFactor=0.7),
+ flags=HyundaiFlags.LEGACY,
+ )
+ KIA_EV_SK3 = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Soul EV 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))],
+ CarSpecs(mass=1695, wheelbase=2.6, steerRatio=13.75),
+ flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.EV,
+ )
+ KIA_EV9 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia EV9 (MV)", car_parts=CarParts.common([CarHarness.hyundai_k])),
+ ],
+ CarSpecs(mass=2625, wheelbase=3.1, steerRatio=16.02),
+ flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL,
+ )
+ KIA_EV3 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia EV3 (SV1)", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ ],
+ CarSpecs(mass=2055, wheelbase=2.90, steerRatio=16.0, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.EV,
+ )
+ KIA_PV5 = HyundaiCanFDPlatformConfig(
+ [
+ HyundaiCarDocs("Kia PV5 (SW1)", car_parts=CarParts.common([CarHarness.hyundai_n])),
+ ],
+ CarSpecs(mass=2600, wheelbase=2.995, steerRatio=16.0, tireStiffnessFactor=0.65),
+ flags=HyundaiFlags.EV,
+ )
+ KIA_RAY_EV = HyundaiPlatformConfig(
+ [HyundaiCarDocs("Kia Ray EV", car_parts=CarParts.common([CarHarness.hyundai_h]))],
+ CarSpecs(mass=1295, wheelbase=2.520, steerRatio=14.5),
+ flags=HyundaiFlags.EV | HyundaiFlags.CC_ONLY_CAR | HyundaiFlags.CHECKSUM_CRC8,
+ )
+
+class Buttons:
+ NONE = 0
+ RES_ACCEL = 1
+ SET_DECEL = 2
+ GAP_DIST = 3
+ CANCEL = 4 # on newer models, this is a pause/resume button
+ LFA_BUTTON = 5
+
+
+def get_platform_codes(fw_versions: list[bytes]) -> set[tuple[bytes, bytes | None]]:
+ # Returns unique, platform-specific identification codes for a set of versions
+ codes = set() # (code-Optional[part], date)
+ for fw in fw_versions:
+ code_match = PLATFORM_CODE_FW_PATTERN.search(fw)
+ part_match = PART_NUMBER_FW_PATTERN.search(fw)
+ date_match = DATE_FW_PATTERN.search(fw)
+ if code_match is not None:
+ code: bytes = code_match.group()
+ part = part_match.group() if part_match else None
+ date = date_match.group() if date_match else None
+ if part is not None:
+ # part number starts with generic ECU part type, add what is specific to platform
+ code += b"-" + part[-5:]
+
+ codes.add((code, date))
+ return codes
+
+
+def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]:
+ # Non-electric CAN FD platforms often do not have platform code specifiers needed
+ # to distinguish between hybrid and ICE. All EVs so far are either exclusively
+ # electric or specify electric in the platform code.
+ fuzzy_platform_blacklist = {str(c) for c in (CANFD_CAR - EV_CAR - CANFD_FUZZY_WHITELIST)}
+ candidates: set[str] = set()
+
+ for candidate, fws in offline_fw_versions.items():
+ # Keep track of ECUs which pass all checks (platform codes, within date range)
+ valid_found_ecus = set()
+ valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS}
+ for ecu, expected_versions in fws.items():
+ addr = ecu[1:]
+ # Only check ECUs expected to have platform codes
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ # Expected platform codes & dates
+ codes = get_platform_codes(expected_versions)
+ expected_platform_codes = {code for code, _ in codes}
+ expected_dates = {date for _, date in codes if date is not None}
+
+ # Found platform codes & dates
+ codes = get_platform_codes(live_fw_versions.get(addr, set()))
+ found_platform_codes = {code for code, _ in codes}
+ found_dates = {date for _, date in codes if date is not None}
+
+ # Check platform code + part number matches for any found versions
+ if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes):
+ break
+
+ if ecu[0] in DATE_FW_ECUS:
+ # If ECU can have a FW date, require it to exist
+ # (this excludes candidates in the database without dates)
+ if not len(expected_dates) or not len(found_dates):
+ break
+
+ # Check any date within range in the database, format is %y%m%d
+ if not any(min(expected_dates) <= found_date <= max(expected_dates) for found_date in found_dates):
+ break
+
+ valid_found_ecus.add(addr)
+
+ # If all live ECUs pass all checks for candidate, add it as a match
+ if valid_expected_ecus.issubset(valid_found_ecus):
+ candidates.add(candidate)
+
+ return candidates - fuzzy_platform_blacklist
+
+
+HYUNDAI_VERSION_REQUEST_LONG = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(0xf100) # Long description
+
+HYUNDAI_VERSION_REQUEST_ALT = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(0xf110) # Alt long description
+
+HYUNDAI_ECU_MANUFACTURING_DATE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.ECU_MANUFACTURING_DATE)
+
+HYUNDAI_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40])
+
+# Regex patterns for parsing platform code, FW date, and part number from FW versions
+PLATFORM_CODE_FW_PATTERN = re.compile(b'((?<=' + HYUNDAI_VERSION_REQUEST_LONG[1:] +
+ b')[A-Z]{2}[A-Za-z0-9]{0,2})')
+DATE_FW_PATTERN = re.compile(b'(?<=[ -])([0-9]{6}$)')
+PART_NUMBER_FW_PATTERN = re.compile(b'(?<=[0-9][.,][0-9]{2} )([0-9]{5}[-/]?[A-Z][A-Z0-9]{3}[0-9])')
+
+# We've seen both ICE and hybrid for these platforms, and they have hybrid descriptors (e.g. MQ4 vs MQ4H)
+CANFD_FUZZY_WHITELIST = {CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN, CAR.KIA_K8_HEV_1ST_GEN,
+ # TODO: the hybrid variant is not out yet
+ CAR.KIA_CARNIVAL_4TH_GEN}
+
+# List of ECUs expected to have platform codes, camera and radar should exist on all cars
+# TODO: use abs, it has the platform code and part number on many platforms
+PLATFORM_CODE_ECUS = [Ecu.fwdRadar, Ecu.fwdCamera, Ecu.eps]
+# So far we've only seen dates in fwdCamera
+# TODO: there are date codes in the ABS firmware versions in hex
+DATE_FW_ECUS = [Ecu.fwdCamera]
+
+# Note: an ECU on CAN FD cars may sometimes send 0x30080aaaaaaaaaaa (flow control continue) while we
+# are attempting to query ECUs. This currently does not seem to affect fingerprinting from the camera
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ # TODO: add back whitelists
+ # CAN queries (OBD-II port)
+ Request(
+ [HYUNDAI_VERSION_REQUEST_LONG],
+ [HYUNDAI_VERSION_RESPONSE],
+ ),
+
+ # CAN & CAN-FD queries (from camera)
+ Request(
+ [HYUNDAI_VERSION_REQUEST_LONG],
+ [HYUNDAI_VERSION_RESPONSE],
+ bus=0,
+ auxiliary=True,
+ ),
+ Request(
+ [HYUNDAI_VERSION_REQUEST_LONG],
+ [HYUNDAI_VERSION_RESPONSE],
+ bus=1,
+ auxiliary=True,
+ obd_multiplexing=False,
+ ),
+
+ # CAN & CAN FD query to understand the three digit date code
+ # LKA steering cars usually use 6 digit date codes, so skip bus 1
+ Request(
+ [HYUNDAI_ECU_MANUFACTURING_DATE],
+ [HYUNDAI_VERSION_RESPONSE],
+ bus=0,
+ auxiliary=True,
+ logging=True,
+ ),
+
+ # CAN-FD alt request logging queries for hvac and parkingAdas
+ Request(
+ [HYUNDAI_VERSION_REQUEST_ALT],
+ [HYUNDAI_VERSION_RESPONSE],
+ bus=0,
+ auxiliary=True,
+ logging=True,
+ ),
+ Request(
+ [HYUNDAI_VERSION_REQUEST_ALT],
+ [HYUNDAI_VERSION_RESPONSE],
+ bus=1,
+ auxiliary=True,
+ logging=True,
+ obd_multiplexing=False,
+ ),
+ ],
+ # We lose these ECUs without the comma power on these cars.
+ # Note that we still attempt to match with them when they are present
+ non_essential_ecus={
+ Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021,
+ CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_CUSTIN_1ST_GEN, CAR.KIA_SORENTO,
+ CAR.KIA_CEED, CAR.KIA_SELTOS],
+ },
+ extra_ecus=[
+ (Ecu.adas, 0x730, None), # ADAS Driving ECU on platforms with LKA steering
+ (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms)
+ (Ecu.hvac, 0x7b3, None), # HVAC Control Assembly
+ (Ecu.cornerRadar, 0x7b7, None),
+ (Ecu.combinationMeter, 0x7c6, None), # CAN FD Instrument cluster
+ ],
+ # Custom fuzzy fingerprinting function using platform codes, part numbers + FW dates:
+ match_fw_to_car_fuzzy=match_fw_to_car_fuzzy,
+)
+
+CHECKSUM = {
+ "crc8": CAR.with_flags(HyundaiFlags.CHECKSUM_CRC8),
+ "6B": CAR.with_flags(HyundaiFlags.CHECKSUM_6B),
+}
+
+CAN_GEARS = {
+ # which message has the gear. hybrid and EV use ELECT_GEAR
+ "use_cluster_gears": CAR.with_flags(HyundaiFlags.CLUSTER_GEARS),
+ "use_tcu_gears": CAR.with_flags(HyundaiFlags.TCU_GEARS),
+ "send_mdps12": {CAR.GENESIS_G90, CAR.GENESIS_G90_2019, CAR.KIA_K9, CAR.KIA_K7},
+}
+
+CANFD_CAR = CAR.with_flags(HyundaiFlags.CANFD)
+CANFD_RADAR_SCC_CAR = CAR.with_flags(HyundaiFlags.RADAR_SCC) # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR
+
+CANFD_HYBRID_STATUS_ADDR = 0xFA
+CANFD_HYBRID_STATUS_DLC = 32
+
+EV_MODE_STATUS_ADDR = 0x230
+EV_MODE_STATUS_DLC = 32
+EV_MODE_STATUS_MSG = "HCU_STATUS_230"
+EV_MODE_STATUS_SIGNAL = "HYBRID_POWER_FLOW_MODE"
+EV_MODE_ACTIVE_VALUES = frozenset((1, 2, 6))
+
+CANFD_UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.CANFD_NO_RADAR_DISABLE) # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR
+
+CAMERA_SCC_CAR = CAR.with_flags(HyundaiFlags.CAMERA_SCC)
+
+HYBRID_CAR = CAR.with_flags(HyundaiFlags.HYBRID)
+
+EV_CAR = CAR.with_flags(HyundaiFlags.EV)
+
+LEGACY_SAFETY_MODE_CAR = CAR.with_flags(HyundaiFlags.LEGACY)
+
+# TODO: another PR with (HyundaiFlags.LEGACY | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.CAMERA_SCC |
+# HyundaiFlags.CANFD_RADAR_SCC | HyundaiFlags.CANFD_NO_RADAR_DISABLE | )
+UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.LEGACY) | CAR.with_flags(HyundaiFlags.UNSUPPORTED_LONGITUDINAL)
+
+DBC = CAR.create_dbc_map()
+
+if __name__ == "__main__":
+ cars = []
+ for platform in CAR:
+ for doc in platform.config.car_docs:
+ cars.append(doc.name)
+ cars.sort()
+ for c in cars:
+ print(c)
diff --git a/iqdbc_repo/iqdbc/car/include/c++.capnp b/iqdbc_repo/iqdbc/car/include/c++.capnp
new file mode 100644
index 000000000..2bda54717
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/include/c++.capnp
@@ -0,0 +1,26 @@
+# Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
+# Licensed under the MIT License:
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+@0xbdf87d7bb8304e81;
+$namespace("capnp::annotations");
+
+annotation namespace(file): Text;
+annotation name(field, enumerant, struct, enum, interface, method, param, group, union): Text;
diff --git a/iqdbc_repo/iqdbc/car/interfaces.py b/iqdbc_repo/iqdbc/car/interfaces.py
new file mode 100644
index 000000000..7f68e4079
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/interfaces.py
@@ -0,0 +1,472 @@
+import os
+import numpy as np
+import time
+import tomllib
+from abc import abstractmethod, ABC
+from enum import StrEnum
+from typing import Any
+from collections.abc import Callable
+from functools import cache
+
+from iqdbc.car import DT_CTRL, apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG
+from iqdbc.car import structs
+from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable
+from iqdbc.car.common.basedir import BASEDIR
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.common.simple_kalman import KF1D, get_kalman_gain
+from iqdbc.car.values import PLATFORMS
+from iqdbc.can import CANParser
+from iqdbc.car.carlog import carlog
+
+from iqdbc.lvbs.car.interfaces import CarInterfaceBaseIQ
+
+GearShifter = structs.CarState.GearShifter
+ButtonType = structs.CarState.ButtonEvent.Type
+
+V_CRUISE_MAX = 196
+MAX_CTRL_SPEED = (V_CRUISE_MAX + 4) * CV.KPH_TO_MS
+ACCEL_MAX = 2.0
+ACCEL_MIN = -3.5
+
+TORQUE_PARAMS_PATH = os.path.join(BASEDIR, 'torque_data/params.toml')
+TORQUE_OVERRIDE_PATH = os.path.join(BASEDIR, 'torque_data/override.toml')
+TORQUE_SUBSTITUTE_PATH = os.path.join(BASEDIR, 'torque_data/substitute.toml')
+
+GEAR_SHIFTER_MAP: dict[str, structs.CarState.GearShifter] = {
+ 'P': GearShifter.park, 'PARK': GearShifter.park,
+ 'R': GearShifter.reverse, 'REVERSE': GearShifter.reverse,
+ 'N': GearShifter.neutral, 'NEUTRAL': GearShifter.neutral,
+ 'E': GearShifter.eco, 'ECO': GearShifter.eco,
+ 'T': GearShifter.manumatic, 'MANUAL': GearShifter.manumatic,
+ 'D': GearShifter.drive, 'DRIVE': GearShifter.drive,
+ 'S': GearShifter.sport, 'SPORT': GearShifter.sport,
+ 'L': GearShifter.low, 'LOW': GearShifter.low,
+ 'B': GearShifter.brake, 'BRAKE': GearShifter.brake,
+}
+
+TorqueFromLateralAccelCallbackType = Callable[[float, structs.CarParams.LateralTorqueTuning, bool], float]
+LateralAccelFromTorqueCallbackType = Callable[[float, structs.CarParams.LateralTorqueTuning, bool], float]
+
+
+@cache
+def get_torque_params():
+ with open(TORQUE_SUBSTITUTE_PATH, 'rb') as f:
+ sub = tomllib.load(f)
+ with open(TORQUE_PARAMS_PATH, 'rb') as f:
+ params = tomllib.load(f)
+ with open(TORQUE_OVERRIDE_PATH, 'rb') as f:
+ override = tomllib.load(f)
+
+ torque_params = {}
+ for candidate in (sub.keys() | params.keys() | override.keys()) - {'legend'}:
+ if sum([candidate in x for x in [sub, params, override]]) > 1:
+ raise RuntimeError(f'{candidate} is defined twice in torque config')
+
+ sub_candidate = sub.get(candidate, candidate)
+
+ if sub_candidate in override:
+ out = override[sub_candidate]
+ elif sub_candidate in params:
+ out = params[sub_candidate]
+ else:
+ raise NotImplementedError(f"Did not find torque params for {sub_candidate}")
+
+ torque_params[sub_candidate] = {key: out[i] for i, key in enumerate(params['legend'])}
+ if candidate in sub:
+ torque_params[candidate] = torque_params[sub_candidate]
+
+ return torque_params
+
+# generic car and radar interfaces
+
+
+class RadarInterfaceBase(ABC):
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.rcp = None
+ self.pts: dict[int, structs.RadarData.RadarPoint] = {}
+ self.frame = 0
+
+ def update(self, can_packets: list[tuple[int, list[CanData]]]) -> structs.RadarDataT | None:
+ self.frame += 1
+ if (self.frame % 5) == 0: # 20 Hz is very standard
+ return structs.RadarData()
+ return None
+
+
+class CarInterfaceBase(ABC, CarInterfaceBaseIQ):
+ CarState: type['CarStateBase']
+ CarController: type['CarControllerBase']
+ RadarInterface: type['RadarInterfaceBase'] = RadarInterfaceBase
+
+ DRIVABLE_GEARS: tuple[structs.CarState.GearShifter, ...] = ()
+
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.frame = 0
+ self.v_ego_cluster_seen = False
+
+ self.CS: CarStateBase = self.CarState(CP, CP_IQ)
+ self.can_parsers: dict[StrEnum, CANParser] = self.CS.get_can_parsers(CP, CP_IQ)
+
+ dbc_names = {bus: cp.dbc_name for bus, cp in self.can_parsers.items()}
+ self.CC: CarControllerBase = self.CarController(dbc_names, CP, CP_IQ)
+
+ def apply(self, c: structs.CarControl, c_iq: structs.IQCarControl, now_nanos: int | None = None) -> tuple[structs.CarControl.Actuators, list[CanData]]:
+ if now_nanos is None:
+ now_nanos = int(time.monotonic() * 1e9)
+ return self.CC.update(c, c_iq, self.CS, now_nanos)
+
+ @staticmethod
+ def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed):
+ return ACCEL_MIN, ACCEL_MAX
+
+ @classmethod
+ def get_non_essential_params(cls, candidate: str) -> structs.CarParams:
+ """
+ Parameters essential to controlling the car may be incomplete or wrong without FW versions or fingerprints.
+ """
+ return cls.get_params(candidate, gen_empty_fingerprint(), list(), False, False, False)
+
+ @classmethod
+ def get_non_essential_params_iq(cls, car_params, candidate: str) -> structs.IQCarParams:
+ return cls.get_params_iq(car_params, candidate, gen_empty_fingerprint(), list(), False, False, False)
+
+ @classmethod
+ def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw],
+ alpha_long: bool, is_release: bool, docs: bool) -> structs.CarParams:
+ ret = CarInterfaceBase.get_std_params(candidate)
+
+ platform = PLATFORMS[candidate]
+ ret.mass = platform.config.specs.mass
+ ret.wheelbase = platform.config.specs.wheelbase
+ ret.steerRatio = platform.config.specs.steerRatio
+ ret.centerToFront = ret.wheelbase * platform.config.specs.centerToFrontRatio
+ ret.minEnableSpeed = platform.config.specs.minEnableSpeed
+ ret.minSteerSpeed = platform.config.specs.minSteerSpeed
+ ret.tireStiffnessFactor = platform.config.specs.tireStiffnessFactor
+ ret.flags |= int(platform.config.flags)
+
+ ret = cls._get_params(ret, candidate, fingerprint, car_fw, alpha_long, is_release, docs)
+
+ # Vehicle mass is published curb weight plus assumed payload such as a human driver; notCars have no assumed payload
+ if not ret.notCar:
+ ret.mass = ret.mass + STD_CARGO_KG
+
+ # Set params dependent on values set by the car interface
+ ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
+ ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront, ret.tireStiffnessFactor)
+
+ return ret
+
+ @classmethod
+ def get_params_iq(cls, car_params, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], alpha_long: bool,
+ is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ car_params_iq = structs.IQCarParams()
+
+ platform = PLATFORMS[candidate]
+ car_params_iq.flags |= int(platform.config.iq_flags)
+ car_params_iq.pcmCruiseSpeed = True
+
+ return cls._get_params_iq(car_params, car_params_iq, candidate, fingerprint, car_fw, alpha_long, is_release_iq, docs)
+
+ @staticmethod
+ @abstractmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release: bool, docs: bool) -> structs.CarParams:
+ raise NotImplementedError
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ carlog.debug(f"Car {candidate} does not have a _get_params_iq method, using defaults")
+ return ret
+
+ @classmethod
+ def get_longitudinal_tuning_iq(cls, stock_cp: structs.CarParams, ret: structs.IQCarParams) -> structs.IQCarParams:
+ return cls._get_longitudinal_tuning_iq(stock_cp, ret)
+
+ @staticmethod
+ def _get_longitudinal_tuning_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams) -> structs.IQCarParams:
+ """Apply longitudinal tuning specific to the car's brand. """
+ carlog.debug(f"Car {stock_cp.carFingerprint} does not have a _get_longitudinal_tuning_iq method, using defaults")
+ return ret
+
+ @staticmethod
+ def pre_init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv: CanRecvCallable, can_send: CanSendCallable):
+ """Used to check conditions to disable longitudinal ECUs as needed and set/change car params"""
+
+ @staticmethod
+ def init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv: CanRecvCallable, can_send: CanSendCallable):
+ """Used to disable longitudinal ECUs as needed"""
+
+ @staticmethod
+ def pre_init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv: CanRecvCallable, can_send: CanSendCallable):
+ """Optional early setup hook used before interface initialization."""
+
+ @staticmethod
+ def deinit(CP: structs.CarParams, can_recv: CanRecvCallable, can_send: CanSendCallable):
+ """Used to re-enable longitudinal ECUs as needed"""
+
+ @staticmethod
+ def get_steer_feedforward_default(desired_angle, v_ego):
+ # Proportional to realigning tire momentum: lateral acceleration.
+ return desired_angle * (v_ego**2)
+
+ def get_steer_feedforward_function(self):
+ return self.get_steer_feedforward_default
+
+ def torque_from_lateral_accel_linear(self, lateral_acceleration: float, torque_params: structs.CarParams.LateralTorqueTuning) -> float:
+ # The default is a linear relationship between torque and lateral acceleration (accounting for road roll and steering friction)
+ return lateral_acceleration / float(torque_params.latAccelFactor)
+
+ def torque_from_lateral_accel(self) -> TorqueFromLateralAccelCallbackType:
+ return self.torque_from_lateral_accel_linear
+
+ def lateral_accel_from_torque_linear(self, torque: float, torque_params: structs.CarParams.LateralTorqueTuning) -> float:
+ return torque * float(torque_params.latAccelFactor)
+
+ def lateral_accel_from_torque(self) -> LateralAccelFromTorqueCallbackType:
+ return self.lateral_accel_from_torque_linear
+
+ # returns a set of default params to avoid repetition in car specific params
+ @staticmethod
+ def get_std_params(candidate: str) -> structs.CarParams:
+ ret = structs.CarParams()
+ ret.carFingerprint = candidate
+
+ # Car docs fields
+ ret.maxLateralAccel = get_torque_params()[candidate]['MAX_LAT_ACCEL_MEASURED']
+ ret.autoResumeSng = True # describes whether car can resume from a stop automatically
+
+ # standard ALC params
+ ret.tireStiffnessFactor = 1.0
+ ret.steerControlType = structs.CarParams.SteerControlType.torque
+ ret.minSteerSpeed = 0.
+ ret.wheelSpeedFactor = 1.0
+
+ ret.pcmCruise = True # openpilot's state is tied to the PCM's cruise state on most cars
+ ret.minEnableSpeed = -1. # enable is done by stock ACC, so ignore this
+ ret.steerRatioRear = 0. # no rear steering, at least on the listed cars aboveA
+ ret.openpilotLongitudinalControl = False
+ ret.stopAccel = -2.0
+ ret.longitudinalTuning.kpBP = [0.]
+ ret.longitudinalTuning.kpV = [0.]
+ ret.longitudinalTuning.kiBP = [0.]
+ ret.longitudinalTuning.kiV = [0.]
+ # TODO estimate car specific lag, use .15s for now
+ ret.longitudinalActuatorDelay = 0.15
+ ret.steerLimitTimer = 1.0
+ return ret
+
+ @staticmethod
+ def configure_torque_tune(candidate: str, tune: structs.CarParams.LateralTuning, steering_angle_deadzone_deg: float = 0.0):
+ params = get_torque_params()[candidate]
+
+ tune.init('torque')
+ tune.torque.friction = params['FRICTION']
+ tune.torque.latAccelFactor = params['LAT_ACCEL_FACTOR']
+ tune.torque.latAccelOffset = 0.0
+ tune.torque.steeringAngleDeadzoneDeg = steering_angle_deadzone_deg
+
+ def update(self, can_packets: list[tuple[int, list[CanData]]]) -> tuple[structs.CarState, structs.IQCarState]:
+ # parse can
+ for cp in self.can_parsers.values():
+ if cp is not None:
+ cp.update(can_packets)
+
+ # get CarState
+ ret, ret_iq = self.CS.update(self.can_parsers)
+
+ ret.canValid = all(cp.can_valid for cp in self.can_parsers.values())
+ ret.canTimeout = any(cp.bus_timeout for cp in self.can_parsers.values())
+
+ if ret.vEgoCluster == 0.0 and not self.v_ego_cluster_seen:
+ ret.vEgoCluster = ret.vEgo
+ else:
+ self.v_ego_cluster_seen = True
+
+ # Many cars apply hysteresis to the ego dash speed
+ ret.vEgoCluster = apply_hysteresis(ret.vEgoCluster, self.CS.out.vEgoCluster, self.CS.cluster_speed_hyst_gap)
+ if abs(ret.vEgo) < self.CS.cluster_min_speed:
+ ret.vEgoCluster = 0.0
+
+ if ret.cruiseState.speedCluster == 0:
+ ret.cruiseState.speedCluster = ret.cruiseState.speed
+
+ ret.buttonEnable = self.CS.update_button_enable(ret.buttonEvents)
+
+ # save for next iteration
+ self.CS.out = ret
+ self.CS.out_iq = ret_iq
+
+ return ret, ret_iq
+
+
+class CarStateBase(ABC):
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.car_fingerprint = CP.carFingerprint
+ self.out = structs.CarState()
+ self.out_iq = structs.IQCarState()
+
+ self.cruise_buttons = 0
+ self.left_blinker_cnt = 0
+ self.right_blinker_cnt = 0
+ self.steering_pressed_cnt = 0
+ self.left_blinker_prev = False
+ self.right_blinker_prev = False
+ self.low_speed_alert = False
+ self.cluster_speed_hyst_gap = 0.0
+ self.cluster_min_speed = 0.0 # min speed before dropping to 0
+ self.secoc_key: bytes = b"00" * 16
+
+ Q = [[0.0, 0.0], [0.0, 100.0]]
+ R = 0.3
+ A = [[1.0, DT_CTRL], [0.0, 1.0]]
+ C = [[1.0, 0.0]]
+ x0=[[0.0], [0.0]]
+ K = get_kalman_gain(DT_CTRL, np.array(A), np.array(C), np.array(Q), R)
+ self.v_ego_kf = KF1D(x0=x0, A=A, C=C[0], K=K)
+ self.v_ego_clu_kf = KF1D(x0=x0, A=A, C=C[0], K=K)
+
+ self.softHoldActive = 0
+ self.is_metric = True
+ self.lkas_enabled = False
+ self.modelV2 = None
+
+ @abstractmethod
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ pass
+
+ def parse_wheel_speeds(self, cs, fl, fr, rl, rr, unit=CV.KPH_TO_MS):
+ cs.vEgoRaw = sum((fl, fr, rl, rr)) / 4 * unit * self.CP.wheelSpeedFactor
+ cs.vEgo, cs.aEgo = self.update_speed_kf(cs.vEgoRaw)
+
+ def update_speed_kf(self, v_ego_raw):
+ if abs(v_ego_raw - self.v_ego_kf.x[0][0]) > 2.0: # Prevent large accelerations when car starts at non zero speed
+ self.v_ego_kf.set_x([[v_ego_raw], [0.0]])
+
+ v_ego_x = self.v_ego_kf.update(v_ego_raw)
+ return float(v_ego_x[0]), float(v_ego_x[1])
+
+ def update_clu_speed_kf(self, v_ego_raw):
+ if abs(v_ego_raw - self.v_ego_clu_kf.x[0][0]) > 2.0:
+ self.v_ego_clu_kf.set_x([[v_ego_raw], [0.0]])
+
+ v_ego_x = self.v_ego_clu_kf.update(v_ego_raw)
+ return float(v_ego_x[0]), float(v_ego_x[1])
+
+ def get_wheel_speeds(self, fl, fr, rl, rr, unit=CV.KPH_TO_MS):
+ factor = unit * self.CP.wheelSpeedFactor
+ wheel_speeds = structs.CarState.WheelSpeeds()
+ wheel_speeds.fl = fl * factor
+ wheel_speeds.fr = fr * factor
+ wheel_speeds.rl = rl * factor
+ wheel_speeds.rr = rr * factor
+ return wheel_speeds
+
+ def update_blinker_from_lamp(self, blinker_time: int, left_blinker_lamp: bool, right_blinker_lamp: bool):
+ """Update blinkers from lights. Enable output when light was seen within the last `blinker_time`
+ iterations"""
+ # TODO: Handle case when switching direction. Now both blinkers can be on at the same time
+ self.left_blinker_cnt = blinker_time if left_blinker_lamp else max(self.left_blinker_cnt - 1, 0)
+ self.right_blinker_cnt = blinker_time if right_blinker_lamp else max(self.right_blinker_cnt - 1, 0)
+ return self.left_blinker_cnt > 0, self.right_blinker_cnt > 0
+
+ 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 += 1 if steering_pressed else -1
+ self.steering_pressed_cnt = int(np.clip(self.steering_pressed_cnt, 0, steering_pressed_min_count * 2 + 1))
+ 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):
+ """Update blinkers from stalk position. When stalk is seen the blinker will be on for at least blinker_time,
+ or until the stalk is turned off, whichever is longer. If the opposite stalk direction is seen the blinker
+ is forced to the other side. On a rising edge of the stalk the timeout is reset."""
+
+ if left_blinker_stalk:
+ self.right_blinker_cnt = 0
+ if not self.left_blinker_prev:
+ self.left_blinker_cnt = blinker_time
+
+ if right_blinker_stalk:
+ self.left_blinker_cnt = 0
+ if not self.right_blinker_prev:
+ self.right_blinker_cnt = blinker_time
+
+ self.left_blinker_cnt = max(self.left_blinker_cnt - 1, 0)
+ self.right_blinker_cnt = max(self.right_blinker_cnt - 1, 0)
+
+ self.left_blinker_prev = left_blinker_stalk
+ self.right_blinker_prev = right_blinker_stalk
+
+ return bool(left_blinker_stalk or self.left_blinker_cnt > 0), bool(right_blinker_stalk or self.right_blinker_cnt > 0)
+
+ def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]):
+ if not self.CP.pcmCruise:
+ for b in buttonEvents:
+ # Enable OP long on falling edge of enable buttons
+ if b.type in (ButtonType.accelCruise, ButtonType.decelCruise) and not b.pressed:
+ return True
+ return False
+
+ @staticmethod
+ def parse_gear_shifter(gear: str | None) -> structs.CarState.GearShifter:
+ if gear is None:
+ return GearShifter.unknown
+ return GEAR_SHIFTER_MAP.get(gear.upper(), GearShifter.unknown)
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ) -> dict[StrEnum, CANParser]:
+ return {}
+
+
+class CarControllerBase(ABC):
+ def __init__(self, dbc_names: dict[StrEnum, str], CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.frame = 0
+ self.secoc_key: bytes = b"00" * 16
+
+ @abstractmethod
+ def update(self, CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS: CarStateBase, now_nanos: int) -> tuple[structs.CarControl.Actuators, list[CanData]]:
+ pass
+
+
+INTERFACE_ATTR_FILE = {
+ "FINGERPRINTS": "fingerprints",
+ "FW_VERSIONS": "fingerprints",
+}
+
+# interface-specific helpers
+
+
+def get_interface_attr(attr: str, combine_brands: bool = False, ignore_none: bool = False) -> dict[str | StrEnum, Any]:
+ # read all the folders in iqdbc/car and return a dict where:
+ # - keys are all the car models or brand names
+ # - values are attr values from all car folders
+ result = {}
+ for car_folder in sorted([x[0] for x in os.walk(BASEDIR)]):
+ try:
+ brand_name = car_folder.split('/')[-1]
+ brand_values = __import__(f'iqdbc.car.{brand_name}.{INTERFACE_ATTR_FILE.get(attr, "values")}', fromlist=[attr])
+ if hasattr(brand_values, attr) or not ignore_none:
+ attr_data = getattr(brand_values, attr, None)
+ else:
+ continue
+
+ if combine_brands:
+ if isinstance(attr_data, dict):
+ for f, v in attr_data.items():
+ result[f] = v
+ else:
+ result[brand_name] = attr_data
+ except (ImportError, OSError):
+ pass
+
+ return result
diff --git a/iqdbc_repo/iqdbc/car/isotp.py b/iqdbc_repo/iqdbc/car/isotp.py
new file mode 100644
index 000000000..8ead67e6f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/isotp.py
@@ -0,0 +1,147 @@
+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/iqdbc_repo/iqdbc/car/isotp_parallel_query.py b/iqdbc_repo/iqdbc/car/isotp_parallel_query.py
new file mode 100644
index 000000000..0519a2489
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/isotp_parallel_query.py
@@ -0,0 +1,170 @@
+import time
+from collections import defaultdict
+from functools import partial
+
+from iqdbc.car import uds
+from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable
+from iqdbc.car.carlog import carlog
+from iqdbc.car.fw_query_definitions import AddrType
+
+
+class IsoTpParallelQuery:
+ def __init__(self, can_send: CanSendCallable, can_recv: CanRecvCallable, bus: int, addrs: list[int] | list[AddrType],
+ request: list[bytes], response: list[bytes], response_offset: int = 0x8,
+ functional_addrs: list[int] | None = None, response_pending_timeout: float = 10) -> None:
+ self.can_send = can_send
+ self.can_recv = can_recv
+ self.bus = bus
+ self.request = request
+ self.response = response
+ self.functional_addrs = functional_addrs or []
+ self.response_pending_timeout = response_pending_timeout
+
+ real_addrs = [a if isinstance(a, tuple) else (a, None) for a in addrs]
+ for tx_addr, _ in real_addrs:
+ assert tx_addr not in uds.FUNCTIONAL_ADDRS, f"Functional address should be defined in functional_addrs: {hex(tx_addr)}"
+
+ self.msg_addrs = {tx_addr: uds.get_rx_addr_for_tx_addr(tx_addr[0], rx_offset=response_offset) for tx_addr in real_addrs}
+ self.msg_buffer: dict[int, list[CanData]] = defaultdict(list)
+
+ def rx(self) -> None:
+ """Drain can socket and sort messages into buffers based on address"""
+ can_packets = self.can_recv(wait_for_one=True)
+
+ for packet in can_packets:
+ for msg in packet:
+ if msg.src == self.bus and msg.address in self.msg_addrs.values():
+ self.msg_buffer[msg.address].append(CanData(msg.address, msg.dat, msg.src))
+
+ def _can_tx(self, tx_addr: int, dat: bytes, bus: int):
+ """Helper function to send single message"""
+ msg = CanData(tx_addr, dat, bus)
+ self.can_send([msg])
+
+ def _can_rx(self, addr, sub_addr=None):
+ """Helper function to retrieve message with specified address and subaddress from buffer"""
+ keep_msgs = []
+
+ if sub_addr is None:
+ msgs = self.msg_buffer[addr]
+ else:
+ # Filter based on subaddress
+ msgs = []
+ for m in self.msg_buffer[addr]:
+ first_byte = m[1][0]
+ if first_byte == sub_addr:
+ msgs.append(m)
+ else:
+ keep_msgs.append(m)
+
+ self.msg_buffer[addr] = keep_msgs
+ return msgs
+
+ def _drain_rx(self) -> None:
+ self.can_recv()
+ self.msg_buffer = defaultdict(list)
+
+ def _create_isotp_msg(self, tx_addr: int, sub_addr: int | None, rx_addr: int):
+ can_client = uds.CanClient(self._can_tx, partial(self._can_rx, rx_addr, sub_addr=sub_addr), tx_addr, rx_addr,
+ self.bus, sub_addr=sub_addr)
+
+ # uses iso-tp frame separation time of 10 ms
+ # TODO: use single_frame_mode so ECUs can send as fast as they want,
+ # as well as reduces chances we process messages from previous queries
+ return uds.IsoTpMessage(can_client, timeout=0, separation_time=0.01)
+
+ def get_data(self, timeout: float, total_timeout: float = 60.) -> dict[AddrType, bytes]:
+ self._drain_rx()
+
+ # Create message objects
+ msgs = {}
+ request_counter = {}
+ request_done = {}
+ for tx_addr, rx_addr in self.msg_addrs.items():
+ msgs[tx_addr] = self._create_isotp_msg(*tx_addr, rx_addr)
+ request_counter[tx_addr] = 0
+ request_done[tx_addr] = False
+
+ # Send first request to functional addrs, subsequent responses are handled on physical addrs
+ if len(self.functional_addrs):
+ for addr in self.functional_addrs:
+ self._create_isotp_msg(addr, None, -1).send(self.request[0])
+
+ # Send first frame (single or first) to all addresses and receive asynchronously in the loop below.
+ # If querying functional addrs, only set up physical IsoTpMessages to send consecutive frames
+ for msg in msgs.values():
+ msg.send(self.request[0], setup_only=len(self.functional_addrs) > 0)
+
+ results = {}
+ start_time = time.monotonic()
+ addrs_responded = set() # track addresses that have ever sent a valid iso-tp frame for timeout logging
+ response_timeouts = {tx_addr: start_time + timeout for tx_addr in self.msg_addrs}
+ while True:
+ self.rx()
+
+ for tx_addr, msg in msgs.items():
+ try:
+ dat, rx_in_progress = msg.recv()
+ except Exception:
+ carlog.exception(f"Error processing UDS response: {tx_addr}")
+ request_done[tx_addr] = True
+ continue
+
+ # Extend timeout for each consecutive ISO-TP frame to avoid timing out on long responses
+ if rx_in_progress:
+ addrs_responded.add(tx_addr)
+ response_timeouts[tx_addr] = time.monotonic() + timeout
+
+ if dat is None:
+ continue
+
+ # Log unexpected empty responses
+ if len(dat) == 0:
+ carlog.error(f"iso-tp query empty response: {tx_addr}")
+ request_done[tx_addr] = True
+ continue
+
+ counter = request_counter[tx_addr]
+ expected_response = self.response[counter]
+ response_valid = dat.startswith(expected_response)
+
+ if response_valid:
+ if counter + 1 < len(self.request):
+ response_timeouts[tx_addr] = time.monotonic() + timeout
+ msg.send(self.request[counter + 1])
+ request_counter[tx_addr] += 1
+ else:
+ results[tx_addr] = dat[len(expected_response):]
+ request_done[tx_addr] = True
+ else:
+ error_code = dat[2] if len(dat) > 2 else -1
+ if error_code == 0x78:
+ response_timeouts[tx_addr] = time.monotonic() + self.response_pending_timeout
+ carlog.error(f"iso-tp query response pending: {tx_addr}")
+ else:
+ request_done[tx_addr] = True
+ carlog.error(f"iso-tp query bad response: {tx_addr} - 0x{dat.hex()}")
+
+ # Mark request done if address timed out
+ cur_time = time.monotonic()
+ for tx_addr in response_timeouts:
+ if cur_time - response_timeouts[tx_addr] > 0:
+ if not request_done[tx_addr]:
+ if request_counter[tx_addr] > 0:
+ carlog.error(f"iso-tp query timeout after receiving partial response: {tx_addr}")
+ elif tx_addr in addrs_responded:
+ carlog.error(f"iso-tp query timeout while receiving response: {tx_addr}")
+ # TODO: handle functional addresses
+ # else:
+ # carlog.error(f"iso-tp query timeout with no response: {tx_addr}")
+ request_done[tx_addr] = True
+
+ # Break if all requests are done (finished or timed out)
+ if all(request_done.values()):
+ break
+
+ if cur_time - start_time > total_timeout:
+ carlog.error("iso-tp query timeout while receiving data")
+ break
+
+ return results
diff --git a/iqdbc_repo/iqdbc/car/lateral.py b/iqdbc_repo/iqdbc/car/lateral.py
new file mode 100644
index 000000000..d757adb58
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/lateral.py
@@ -0,0 +1,221 @@
+import math
+import numpy as np
+from dataclasses import dataclass
+from iqdbc.car import structs, rate_limit, DT_CTRL, ACCELERATION_DUE_TO_GRAVITY
+from iqdbc.car.vehicle_model import VehicleModel
+
+FRICTION_THRESHOLD = 0.2
+
+ISO_LATERAL_ACCEL = 5.0 # m/s^2
+ISO_LATERAL_JERK = 5.0 # m/s^3
+AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees
+MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~3.6 m/s^2
+
+@dataclass
+class AngleSteeringLimits:
+ # v1 limits (using apply_std_steer_angle_limits)
+ STEER_ANGLE_MAX: float
+ ANGLE_RATE_LIMIT_UP: tuple[list[float], list[float]]
+ ANGLE_RATE_LIMIT_DOWN: tuple[list[float], list[float]]
+
+ # v2 vehicle model limits (using apply_steer_angle_limits_vm)
+ MAX_LATERAL_ACCEL: float = 0
+ MAX_LATERAL_JERK: float = 0
+ MAX_ANGLE_RATE: float = math.inf
+
+
+@dataclass
+class CurvatureSteeringLimits:
+ CURVATURE_MAX: float
+
+
+def apply_driver_steer_torque_limits(apply_torque: int, apply_torque_last: int, driver_torque: float, LIMITS, steer_max: int | None = None):
+ # some safety modes utilize a dynamic max steer
+ if steer_max is None:
+ steer_max = LIMITS.STEER_MAX
+
+ # limits due to driver torque
+ driver_max_torque = steer_max + (LIMITS.STEER_DRIVER_ALLOWANCE + driver_torque * LIMITS.STEER_DRIVER_FACTOR) * LIMITS.STEER_DRIVER_MULTIPLIER
+ driver_min_torque = -steer_max + (-LIMITS.STEER_DRIVER_ALLOWANCE + driver_torque * LIMITS.STEER_DRIVER_FACTOR) * LIMITS.STEER_DRIVER_MULTIPLIER
+ max_steer_allowed = max(min(steer_max, driver_max_torque), 0)
+ min_steer_allowed = min(max(-steer_max, driver_min_torque), 0)
+ apply_torque = np.clip(apply_torque, min_steer_allowed, max_steer_allowed)
+
+ # slow rate if steer torque increases in magnitude
+ if apply_torque_last > 0:
+ apply_torque = np.clip(apply_torque, max(apply_torque_last - LIMITS.STEER_DELTA_DOWN, -LIMITS.STEER_DELTA_UP),
+ apply_torque_last + LIMITS.STEER_DELTA_UP)
+ else:
+ apply_torque = np.clip(apply_torque, apply_torque_last - LIMITS.STEER_DELTA_UP,
+ min(apply_torque_last + LIMITS.STEER_DELTA_DOWN, LIMITS.STEER_DELTA_UP))
+
+ return int(round(float(apply_torque)))
+
+
+def apply_dist_to_meas_limits(val, val_last, val_meas,
+ STEER_DELTA_UP, STEER_DELTA_DOWN,
+ STEER_ERROR_MAX, STEER_MAX):
+ # limits due to comparison of commanded val VS measured val (torque/angle/curvature)
+ max_lim = min(max(val_meas + STEER_ERROR_MAX, STEER_ERROR_MAX), STEER_MAX)
+ min_lim = max(min(val_meas - STEER_ERROR_MAX, -STEER_ERROR_MAX), -STEER_MAX)
+
+ val = np.clip(val, min_lim, max_lim)
+
+ # slow rate if val increases in magnitude
+ if val_last > 0:
+ val = np.clip(val,
+ max(val_last - STEER_DELTA_DOWN, -STEER_DELTA_UP),
+ val_last + STEER_DELTA_UP)
+ else:
+ val = np.clip(val,
+ val_last - STEER_DELTA_UP,
+ min(val_last + STEER_DELTA_DOWN, STEER_DELTA_UP))
+
+ return float(val)
+
+
+def apply_meas_steer_torque_limits(apply_torque, apply_torque_last, motor_torque, LIMITS):
+ return int(round(apply_dist_to_meas_limits(apply_torque, apply_torque_last, motor_torque,
+ LIMITS.STEER_DELTA_UP, LIMITS.STEER_DELTA_DOWN,
+ 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:
+ # 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
+
+ return float(np.clip(new_apply_angle, -limits.STEER_ANGLE_MAX, limits.STEER_ANGLE_MAX))
+
+
+def _get_max_curvature_jerk(v_ego: float, steer_step: int) -> float:
+ ts_elapsed = steer_step * DT_CTRL
+ curvature_rate_limit = ISO_LATERAL_JERK / (max(v_ego, 1.0) ** 2)
+ return curvature_rate_limit * ts_elapsed
+
+
+def _get_max_curvature(v_ego: float) -> tuple[float, float]:
+ max_curvature = MAX_LATERAL_ACCEL / (max(v_ego, 1.0) ** 2)
+ return -max_curvature, max_curvature
+
+
+def apply_std_curvature_limits(apply_curvature: float, apply_curvature_last: float, v_ego: float, curvature: float, override: bool,
+ steer_step: int, lat_active: bool, limits: CurvatureSteeringLimits) -> float:
+ max_jerk = _get_max_curvature_jerk(v_ego, steer_step)
+ new_apply_curvature = float(np.clip(apply_curvature, apply_curvature_last - max_jerk, apply_curvature_last + max_jerk))
+
+ min_curvature, max_curvature = _get_max_curvature(v_ego)
+ new_apply_curvature = float(np.clip(new_apply_curvature, min_curvature, max_curvature))
+
+ if not lat_active:
+ new_apply_curvature = curvature
+
+ return float(np.clip(new_apply_curvature, -limits.CURVATURE_MAX, limits.CURVATURE_MAX))
+
+
+def get_max_angle_delta_vm(v_ego_raw: float, VM: VehicleModel, limits):
+ """Calculate the maximum steering angle rate based on lateral jerk limits."""
+ max_curvature_rate_sec = limits.ANGLE_LIMITS.MAX_LATERAL_JERK / (v_ego_raw ** 2) # (1/m)/s
+ max_angle_rate_sec = math.degrees(VM.get_steer_from_curvature(max_curvature_rate_sec, v_ego_raw, 0)) # deg/s
+ return max_angle_rate_sec * (DT_CTRL * limits.STEER_STEP)
+
+
+def get_max_angle_vm(v_ego_raw: float, VM: VehicleModel, limits):
+ """Calculate the maximum steering angle based on lateral acceleration limits."""
+ max_curvature = limits.ANGLE_LIMITS.MAX_LATERAL_ACCEL / (v_ego_raw ** 2) # 1/m
+ return math.degrees(VM.get_steer_from_curvature(max_curvature, v_ego_raw, 0)) # deg
+
+
+def apply_steer_angle_limits_vm(apply_angle: float, apply_angle_last: float, v_ego_raw: float, steering_angle: float,
+ lat_active: bool, limits, VM: VehicleModel) -> float:
+ """Apply jerk, accel, and safety limit constraints to steering angle."""
+ v_ego_raw = max(v_ego_raw, 1)
+
+ # *** max lateral jerk limit ***
+ max_angle_delta = get_max_angle_delta_vm(v_ego_raw, VM, limits)
+
+ # prevent fault/low speed comfort
+ max_angle_delta = min(max_angle_delta, limits.ANGLE_LIMITS.MAX_ANGLE_RATE)
+ new_apply_angle = rate_limit(apply_angle, apply_angle_last, -max_angle_delta, max_angle_delta)
+
+ # *** max lateral accel limit ***
+ max_angle = get_max_angle_vm(v_ego_raw, VM, limits)
+ new_apply_angle = np.clip(new_apply_angle, -max_angle, max_angle)
+
+ # angle is current angle when inactive
+ if not lat_active:
+ new_apply_angle = steering_angle
+
+ # prevent fault
+ return float(np.clip(new_apply_angle, -limits.ANGLE_LIMITS.STEER_ANGLE_MAX, limits.ANGLE_LIMITS.STEER_ANGLE_MAX))
+
+
+def apply_steer_angle_limits_simple(apply_angle: float, apply_angle_last: float, v_ego_raw: float, steering_angle: float,
+ lat_active: bool, limits, VM: VehicleModel, prog_map_x: list[float], prog_map_y: list[float]) -> float:
+ if not lat_active:
+ return steering_angle
+
+ v_ego_raw = max(v_ego_raw, 1)
+
+ apply_angle = np.clip(apply_angle, -limits.ANGLE_LIMITS.STEER_ANGLE_MAX, limits.ANGLE_LIMITS.STEER_ANGLE_MAX)
+ new_angle_abs = np.interp(abs(apply_angle), prog_map_x, prog_map_y)
+ corrected_angle = -new_angle_abs if apply_angle < 0 else new_angle_abs
+
+ desired_curvature = VM.calc_curvature(math.radians(corrected_angle), v_ego_raw, 0)
+ desired_lat_accel = abs(desired_curvature * v_ego_raw ** 2)
+
+ if desired_lat_accel > limits.ANGLE_LIMITS.MAX_LATERAL_ACCEL:
+ scale_factor = limits.ANGLE_LIMITS.MAX_LATERAL_ACCEL / desired_lat_accel
+ corrected_angle *= scale_factor
+
+ final_angle = np.clip(corrected_angle, -limits.ANGLE_LIMITS.STEER_ANGLE_MAX, limits.ANGLE_LIMITS.STEER_ANGLE_MAX)
+
+ return float(final_angle)
+
+def common_fault_avoidance(fault_condition: bool, request: bool, above_limit_frames: int,
+ max_above_limit_frames: int, max_mismatching_frames: int = 1):
+ """
+ Several cars have the ability to work around their EPS limits by cutting the
+ request bit of their LKAS message after a certain number of frames above the limit.
+ """
+
+ # Count up to max_above_limit_frames, at which point we need to cut the request for above_limit_frames to avoid a fault
+ if request and fault_condition:
+ above_limit_frames += 1
+ else:
+ above_limit_frames = 0
+
+ # Once we cut the request bit, count additionally to max_mismatching_frames before setting the request bit high again.
+ # Some brands do not respect our workaround without multiple messages on the bus, for example
+ if above_limit_frames > max_above_limit_frames:
+ request = False
+
+ if above_limit_frames >= max_above_limit_frames + max_mismatching_frames:
+ above_limit_frames = 0
+
+ return above_limit_frames, request
+
+
+def apply_center_deadzone(error, deadzone):
+ if (error > - deadzone) and (error < deadzone):
+ error = 0.
+ return error
+
+
+def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, friction_threshold: float,
+ torque_params: structs.CarParams.LateralTorqueTuning) -> float:
+ # TODO torque params' friction should be in lataxel space, not torque space
+ friction_interp = np.interp(
+ apply_center_deadzone(lateral_accel_error, lateral_accel_deadzone),
+ [-friction_threshold, friction_threshold],
+ [-torque_params.friction * torque_params.latAccelFactor, torque_params.friction * torque_params.latAccelFactor]
+ )
+ return float(friction_interp)
diff --git a/iqdbc_repo/iqdbc/car/logreader.py b/iqdbc_repo/iqdbc/car/logreader.py
new file mode 100644
index 000000000..92a5f6e33
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/logreader.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+import os
+import capnp
+import urllib.parse
+import warnings
+from urllib.request import urlopen, Request
+import zstandard as zstd
+
+from iqdbc.car.common.basedir import BASEDIR
+
+capnp_log = capnp.load(os.path.join(BASEDIR, "rlog.capnp"))
+
+
+def decompress_stream(data: bytes):
+ dctx = zstd.ZstdDecompressor()
+ decompressed_data = b""
+
+ with dctx.stream_reader(data) as reader:
+ decompressed_data = reader.read()
+
+ return decompressed_data
+
+
+class LogReader:
+ def __init__(self, fn, only_union_types=False, sort_by_time=False):
+ self._only_union_types = only_union_types
+ _, ext = os.path.splitext(urllib.parse.urlparse(fn).path)
+
+ if fn.startswith("http"):
+ with urlopen(Request(fn, headers={"User-Agent": "iqdbc"})) as f:
+ dat = f.read()
+ else:
+ with open(fn, "rb") as f:
+ dat = f.read()
+
+ if ext == ".zst" or dat.startswith(b'\x28\xB5\x2F\xFD'):
+ # https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#zstandard-frames
+ dat = decompress_stream(dat)
+
+ ents = capnp_log.Event.read_multiple_bytes(dat)
+
+ self._ents = []
+ try:
+ for e in ents:
+ self._ents.append(e)
+ except capnp.KjException:
+ warnings.warn("Corrupted events detected", RuntimeWarning, stacklevel=1)
+
+ if sort_by_time:
+ self._ents.sort(key=lambda x: x.logMonoTime)
+
+ def __iter__(self):
+ for ent in self._ents:
+ if self._only_union_types:
+ try:
+ ent.which()
+ yield ent
+ except capnp.lib.capnp.KjException:
+ pass
+ else:
+ yield ent
+
+ def filter(self, msg_type: str):
+ return (getattr(m, m.which()) for m in filter(lambda m: m.which() == msg_type, self))
+
+ def first(self, msg_type: str):
+ return next(self.filter(msg_type), None)
diff --git a/iqdbc_repo/iqdbc/car/mazda/__init__.py b/iqdbc_repo/iqdbc/car/mazda/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/mazda/carcontroller.py b/iqdbc_repo/iqdbc/car/mazda/carcontroller.py
new file mode 100644
index 000000000..f0ad356f0
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mazda/carcontroller.py
@@ -0,0 +1,66 @@
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, structs
+from iqdbc.car.lateral import apply_driver_steer_torque_limits
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.mazda import mazdacan
+from iqdbc.car.mazda.values import CarControllerParams, Buttons
+
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ self.apply_torque_last = 0
+ self.packer = CANPacker(dbc_names[Bus.pt])
+ self.brake_counter = 0
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ can_sends = []
+
+ apply_torque = 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)
+
+ if CC.cruiseControl.cancel:
+ # If brake is pressed, let us wait >70ms before trying to disable crz to avoid
+ # a race condition with the stock system, where the second cancel from openpilot
+ # will disable the crz 'main on'. crz ctrl msg runs at 50hz. 70ms allows us to
+ # read 3 messages and most likely sync state before we attempt cancel.
+ self.brake_counter = self.brake_counter + 1
+ if self.frame % 10 == 0 and not (CS.out.brakePressed and self.brake_counter < 7):
+ # Cancel Stock ACC if it's enabled while OP is disengaged
+ # Send at a rate of 10hz until we sync with stock ACC state
+ can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP, CS.crz_btns_counter, Buttons.CANCEL))
+ else:
+ self.brake_counter = 0
+ if CC.cruiseControl.resume and self.frame % 5 == 0:
+ # Mazda Stop and Go requires a RES button (or gas) press if the car stops more than 3 seconds
+ # 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
+
+ # send HUD alerts
+ if self.frame % 50 == 0:
+ ldw = CC.hudControl.visualAlert == VisualAlert.ldw
+ steer_required = CC.hudControl.visualAlert == VisualAlert.steerRequired
+ # TODO: find a way to silence audible warnings so we can add more hud alerts
+ steer_required = steer_required and CS.lkas_allowed_speed
+ can_sends.append(mazdacan.create_alert_command(self.packer, CS.cam_laneinfo, ldw, steer_required))
+
+ # send steering command
+ can_sends.append(mazdacan.create_steering_control(self.packer, self.CP,
+ self.frame, apply_torque, CS.cam_lkas))
+
+ new_actuators = CC.actuators.as_builder()
+ new_actuators.torque = apply_torque / CarControllerParams.STEER_MAX
+ new_actuators.torqueOutputCan = apply_torque
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/mazda/carstate.py b/iqdbc_repo/iqdbc/car/mazda/carstate.py
new file mode 100644
index 000000000..e29bc5986
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mazda/carstate.py
@@ -0,0 +1,136 @@
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.mazda.values import DBC, LKAS_LIMITS
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+
+class CarState(CarStateBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+ self.shifter_values = can_define.dv["GEAR"]["GEAR"]
+
+ self.crz_btns_counter = 0
+ self.acc_active_last = False
+ self.lkas_allowed_speed = False
+
+ self.distance_button = 0
+ self.accel_button = 0
+ self.decel_button = 0
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ self.parse_wheel_speeds(ret,
+ cp.vl["WHEEL_SPEEDS"]["FL"],
+ cp.vl["WHEEL_SPEEDS"]["FR"],
+ cp.vl["WHEEL_SPEEDS"]["RL"],
+ cp.vl["WHEEL_SPEEDS"]["RR"],
+ )
+
+ # Match panda speed reading
+ speed_kph = cp.vl["ENGINE_DATA"]["SPEED"]
+ ret.standstill = speed_kph <= .1
+
+ can_gear = int(cp.vl["GEAR"]["GEAR"])
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
+
+ ret.genericToggle = bool(cp.vl["BLINK_INFO"]["HIGH_BEAMS"])
+ ret.leftBlindspot = cp.vl["BSM"]["LEFT_BS_STATUS"] != 0
+ ret.rightBlindspot = cp.vl["BSM"]["RIGHT_BS_STATUS"] != 0
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(40, cp.vl["BLINK_INFO"]["LEFT_BLINK"] == 1,
+ cp.vl["BLINK_INFO"]["RIGHT_BLINK"] == 1)
+
+ ret.steeringAngleDeg = cp.vl["STEER"]["STEER_ANGLE"]
+ ret.steeringTorque = cp.vl["STEER_TORQUE"]["STEER_TORQUE_SENSOR"]
+ ret.steeringPressed = abs(ret.steeringTorque) > LKAS_LIMITS.STEER_THRESHOLD
+
+ ret.steeringTorqueEps = cp.vl["STEER_TORQUE"]["STEER_TORQUE_MOTOR"]
+ ret.steeringRateDeg = cp.vl["STEER_RATE"]["STEER_ANGLE_RATE"]
+
+ # TODO: this should be from 0 - 1.
+ ret.brakePressed = cp.vl["PEDALS"]["BRAKE_ON"] == 1
+ ret.brake = cp.vl["BRAKE"]["BRAKE_PRESSURE"]
+
+ ret.seatbeltUnlatched = cp.vl["SEATBELT"]["DRIVER_SEATBELT"] == 0
+ ret.doorOpen = any([cp.vl["DOORS"]["FL"], cp.vl["DOORS"]["FR"],
+ cp.vl["DOORS"]["BL"], cp.vl["DOORS"]["BR"]])
+
+ # TODO: this should be from 0 - 1.
+ ret.gasPressed = cp.vl["ENGINE_DATA"]["PEDAL_GAS"] > 0
+
+ # Either due to low speed or hands off
+ lkas_blocked = cp.vl["STEER_RATE"]["LKAS_BLOCK"] == 1
+
+ if self.CP.minSteerSpeed > 0:
+ # LKAS is enabled at 52kph going up and disabled at 45kph going down
+ # wait for LKAS_BLOCK signal to clear when going up since it lags behind the speed sometimes
+ if speed_kph > LKAS_LIMITS.ENABLE_SPEED and not lkas_blocked:
+ self.lkas_allowed_speed = True
+ elif speed_kph < LKAS_LIMITS.DISABLE_SPEED:
+ self.lkas_allowed_speed = False
+ else:
+ self.lkas_allowed_speed = True
+
+ # TODO: the signal used for available seems to be the adaptive cruise signal, instead of the main on
+ # it should be used for carState.cruiseState.nonAdaptive instead
+ ret.cruiseState.available = cp.vl["CRZ_CTRL"]["CRZ_AVAILABLE"] == 1
+ ret.cruiseState.enabled = cp.vl["CRZ_CTRL"]["CRZ_ACTIVE"] == 1
+ ret.cruiseState.standstill = cp.vl["PEDALS"]["STANDSTILL"] == 1
+ ret.cruiseState.speed = cp.vl["CRZ_EVENTS"]["CRZ_SPEED"] * CV.KPH_TO_MS
+
+ # stock lkas should be on
+ # TODO: is this needed?
+ ret.invalidLkasSetting = cp_cam.vl["CAM_LANEINFO"]["LANE_LINES"] == 0
+
+ if ret.cruiseState.enabled:
+ if not self.lkas_allowed_speed and self.acc_active_last:
+ self.low_speed_alert = True
+ else:
+ self.low_speed_alert = False
+ ret.lowSpeedAlert = self.low_speed_alert
+
+ # Check if LKAS is disabled due to lack of driver torque when all other states indicate
+ # it should be enabled (steer lockout). Don't warn until we actually get lkas active
+ # and lose it again, i.e, after initial lkas activation
+ ret.steerFaultTemporary = self.lkas_allowed_speed and lkas_blocked
+
+ self.acc_active_last = ret.cruiseState.enabled
+
+ self.crz_btns_counter = cp.vl["CRZ_BTNS"]["CTR"]
+
+ # camera signals
+ self.cam_lkas = cp_cam.vl["CAM_LKAS"]
+ self.cam_laneinfo = cp_cam.vl["CAM_LANEINFO"]
+ ret.steerFaultPermanent = cp_cam.vl["CAM_LKAS"]["ERR_BIT_1"] == 1
+
+ # cruise control button events: distance, inc, and dec
+ prev_distance_button = self.distance_button
+ prev_accel_button = self.accel_button
+ prev_decel_button = self.decel_button
+ self.distance_button = cp.vl["CRZ_BTNS"]["DISTANCE_LESS"]
+ self.accel_button = cp.vl["CRZ_BTNS"]["RES"]
+ self.decel_button = cp.vl["CRZ_BTNS"]["SET_M"]
+
+ ret.buttonEvents = [
+ *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}),
+ *create_button_events(self.accel_button, prev_accel_button, {1: ButtonType.accelCruise}),
+ *create_button_events(self.decel_button, prev_decel_button, {1: ButtonType.decelCruise}),
+ ]
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
+ }
diff --git a/iqdbc_repo/iqdbc/car/mazda/fingerprints.py b/iqdbc_repo/iqdbc/car/mazda/fingerprints.py
new file mode 100644
index 000000000..5ec935299
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mazda/fingerprints.py
@@ -0,0 +1,283 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.mazda.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.MAZDA_CX5_2022: {
+ (Ecu.eps, 0x730, None): [
+ b'KBST-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KSD5-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PGK4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PW67-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PW8F-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PW8G-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2C-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2D-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2D-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2H-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX85-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXFG-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXFG-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXGC-188K2-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PY40-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'SH54-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'K131-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'KBSV-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KGWD-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KSD5-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'GSH7-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-U\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'PG69-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PG69-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PW66-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PW66-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXDL-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXFG-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXFG-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXGG-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYA4-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYJ3-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYJ3-21PS1-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'SH51-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.MAZDA_CX5: {
+ (Ecu.eps, 0x730, None): [
+ b'K319-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KCB8-3210X-B-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KJ01-3210X-G-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KJ01-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KJ01-3210X-M-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'PA53-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PAR4-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2E-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2F-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2G-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2H-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2H-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2H-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2K-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX38-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX42-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX68-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFA-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFC-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFD-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYNF-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'SHKT-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'K123-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'K123-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KBJ5-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KL2K-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KN0W-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'B61L-67XK2-R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'PA66-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PA66-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX39-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX39-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX68-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB1-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB1-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB1-21PS1-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYB2-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYNC-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'SH9T-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.MAZDA_CX9: {
+ (Ecu.eps, 0x730, None): [
+ b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KJ01-3210X-G-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KJ01-3210X-L-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'PX23-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX24-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM4-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXN8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXN8-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD7-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFM-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFM-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'K123-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TK80-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TK80-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TK79-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TK79-437K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TM53-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TN40-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'B61L-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-K\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TK80-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'PXM4-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM7-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD5-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD5-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD6-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFM-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFM-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.MAZDA_3: {
+ (Ecu.eps, 0x730, None): [
+ b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KR11-3210X-K-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'P5JD-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PY2P-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYJW-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYKC-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYKE-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'B63C-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GHP9-67Y10---41\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'B45A-437AS-0-08\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'B61L-67XK2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'P52G-21PS1-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PY2S-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYKA-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYKE-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYKE-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.MAZDA_6: {
+ (Ecu.eps, 0x730, None): [
+ b'GBEF-3210X-B-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GBEF-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GFBC-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'PA34-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX4F-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYH7-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYH7-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'K131-67XK2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'GBVH-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GBVH-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GDDM-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'B61L-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'PA28-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYH3-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+ CAR.MAZDA_CX9_2021: {
+ (Ecu.eps, 0x730, None): [
+ b'TC3M-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'PXGW-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXGW-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM4-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM6-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM7-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x764, None): [
+ b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'K131-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x760, None): [
+ b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x706, None): [
+ b'GSH7-67XK2-M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'GSH7-67XK2-U\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'PXM4-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM7-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/mazda/interface.py b/iqdbc_repo/iqdbc/car/mazda/interface.py
new file mode 100755
index 000000000..d833c3f4b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mazda/interface.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+from iqdbc.car import get_safety_config, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.mazda.carcontroller import CarController
+from iqdbc.car.mazda.carstate import CarState
+from iqdbc.car.mazda.values import CAR, LKAS_LIMITS
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "mazda"
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.mazda)]
+ ret.radarUnavailable = True
+
+ ret.dashcamOnly = candidate not in (CAR.MAZDA_CX5_2022, CAR.MAZDA_CX9_2021)
+
+ ret.steerActuatorDelay = 0.1
+ ret.steerLimitTimer = 0.8
+
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ if candidate not in (CAR.MAZDA_CX5_2022,):
+ ret.minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED * CV.KPH_TO_MS
+
+ ret.centerToFront = ret.wheelbase * 0.41
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/mazda/mazdacan.py b/iqdbc_repo/iqdbc/car/mazda/mazdacan.py
new file mode 100644
index 000000000..78e2c6e38
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mazda/mazdacan.py
@@ -0,0 +1,130 @@
+from iqdbc.car.mazda.values import Buttons, MazdaFlags
+
+
+def create_steering_control(packer, CP, frame, apply_torque, lkas):
+
+ tmp = apply_torque + 2048
+
+ lo = tmp & 0xFF
+ hi = tmp >> 8
+
+ # copy values from camera
+ b1 = int(lkas["BIT_1"])
+ er1 = int(lkas["ERR_BIT_1"])
+ lnv = 0
+ ldw = 0
+ er2 = int(lkas["ERR_BIT_2"])
+
+ # Some older models do have these, newer models don't.
+ # Either way, they all work just fine if set to zero.
+ steering_angle = 0
+ b2 = 0
+
+ tmp = steering_angle + 2048
+ ahi = tmp >> 10
+ amd = (tmp & 0x3FF) >> 2
+ amd = (amd >> 4) | ((amd & 0xF) << 4)
+ alo = (tmp & 0x3) << 2
+
+ ctr = frame % 16
+ # bytes: [ 1 ] [ 2 ] [ 3 ] [ 4 ]
+ csum = 249 - ctr - hi - lo - (lnv << 3) - er1 - (ldw << 7) - (er2 << 4) - (b1 << 5)
+
+ # bytes [ 5 ] [ 6 ] [ 7 ]
+ csum = csum - ahi - amd - alo - b2
+
+ if ahi == 1:
+ csum = csum + 15
+
+ if csum < 0:
+ if csum < -256:
+ csum = csum + 512
+ else:
+ csum = csum + 256
+
+ csum = csum % 256
+
+ values = {}
+ if CP.flags & MazdaFlags.GEN1:
+ values = {
+ "LKAS_REQUEST": apply_torque,
+ "CTR": ctr,
+ "ERR_BIT_1": er1,
+ "LINE_NOT_VISIBLE": lnv,
+ "LDW": ldw,
+ "BIT_1": b1,
+ "ERR_BIT_2": er2,
+ "STEERING_ANGLE": steering_angle,
+ "ANGLE_ENABLED": b2,
+ "CHKSUM": csum
+ }
+
+ return packer.make_can_msg("CAM_LKAS", 0, values)
+
+
+def create_alert_command(packer, cam_msg: dict, ldw: bool, steer_required: bool):
+ values = {s: cam_msg[s] for s in [
+ "LINE_VISIBLE",
+ "LINE_NOT_VISIBLE",
+ "LANE_LINES",
+ "BIT1",
+ "BIT2",
+ "BIT3",
+ "NO_ERR_BIT",
+ "S1",
+ "S1_HBEAM",
+ ]}
+ values.update({
+ # TODO: what's the difference between all these? do we need to send all?
+ "HANDS_WARN_3_BITS": 0b111 if steer_required else 0,
+ "HANDS_ON_STEER_WARN": steer_required,
+ "HANDS_ON_STEER_WARN_2": steer_required,
+
+ # TODO: right lane works, left doesn't
+ # TODO: need to do something about L/R
+ "LDW_WARN_LL": 0,
+ "LDW_WARN_RL": 0,
+ })
+ return packer.make_can_msg("CAM_LANEINFO", 0, values)
+
+
+def create_button_cmd(packer, CP, counter, button):
+
+ can = int(button == Buttons.CANCEL)
+ res = int(button == Buttons.RESUME)
+ inc = int(button == Buttons.SET_PLUS)
+ dec = int(button == Buttons.SET_MINUS)
+
+ if CP.flags & MazdaFlags.GEN1:
+ values = {
+ "CAN_OFF": can,
+ "CAN_OFF_INV": (can + 1) % 2,
+
+ "SET_P": inc,
+ "SET_P_INV": (inc + 1) % 2,
+
+ "RES": res,
+ "RES_INV": (res + 1) % 2,
+
+ "SET_M": dec,
+ "SET_M_INV": (dec + 1) % 2,
+
+ "DISTANCE_LESS": 0,
+ "DISTANCE_LESS_INV": 1,
+
+ "DISTANCE_MORE": 0,
+ "DISTANCE_MORE_INV": 1,
+
+ "MODE_X": 0,
+ "MODE_X_INV": 1,
+
+ "MODE_Y": 0,
+ "MODE_Y_INV": 1,
+
+ "BIT1": 1,
+ "BIT2": 1,
+ "BIT3": 1,
+ "CTR": (counter + 1) % 16,
+ }
+
+ return packer.make_can_msg("CRZ_BTNS", 0, values)
diff --git a/iqdbc_repo/iqdbc/car/mazda/values.py b/iqdbc_repo/iqdbc/car/mazda/values.py
new file mode 100644
index 000000000..edbe67948
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mazda/values.py
@@ -0,0 +1,103 @@
+from dataclasses import dataclass, field
+from enum import IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
+
+Ecu = CarParams.Ecu
+
+
+# Steer torque limits
+
+class CarControllerParams:
+ STEER_MAX = 800 # theoretical max_steer 2047
+ STEER_DELTA_UP = 10 # torque increase per refresh
+ STEER_DELTA_DOWN = 25 # 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 # from dbc
+ STEER_STEP = 1 # 100 Hz
+
+ def __init__(self, CP):
+ pass
+
+
+@dataclass
+class MazdaCarDocs(CarDocs):
+ package: str = "All"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda]))
+
+
+@dataclass(frozen=True, kw_only=True)
+class MazdaCarSpecs(CarSpecs):
+ tireStiffnessFactor: float = 0.7 # not optimized yet
+
+
+class MazdaFlags(IntFlag):
+ # Static flags
+ # Gen 1 hardware: same CAN messages and same camera
+ GEN1 = 1
+
+
+@dataclass
+class MazdaPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'mazda_2017'})
+ flags: int = MazdaFlags.GEN1
+
+
+class CAR(Platforms):
+ MAZDA_CX5 = MazdaPlatformConfig(
+ [MazdaCarDocs("Mazda CX-5 2017-21")],
+ MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5)
+ )
+ MAZDA_CX9 = MazdaPlatformConfig(
+ [MazdaCarDocs("Mazda CX-9 2016-20")],
+ MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6)
+ )
+ MAZDA_3 = MazdaPlatformConfig(
+ [MazdaCarDocs("Mazda 3 2017-18")],
+ MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0)
+ )
+ MAZDA_6 = MazdaPlatformConfig(
+ [MazdaCarDocs("Mazda 6 2017-20")],
+ MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5)
+ )
+ MAZDA_CX9_2021 = MazdaPlatformConfig(
+ [MazdaCarDocs("Mazda CX-9 2021-23", video="https://youtu.be/dA3duO4a0O4")],
+ MAZDA_CX9.specs
+ )
+ MAZDA_CX5_2022 = MazdaPlatformConfig(
+ [MazdaCarDocs("Mazda CX-5 2022-25")],
+ MAZDA_CX5.specs,
+ )
+
+
+class LKAS_LIMITS:
+ STEER_THRESHOLD = 15
+ DISABLE_SPEED = 45 # kph
+ ENABLE_SPEED = 52 # kph
+
+
+class Buttons:
+ NONE = 0
+ SET_PLUS = 1
+ SET_MINUS = 2
+ RESUME = 3
+ CANCEL = 4
+
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ # TODO: check data to ensure ABS does not skip ISO-TP frames on bus 0
+ Request(
+ [StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
+ [StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
+ bus=0,
+ ),
+ ],
+)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/mock/__init__.py b/iqdbc_repo/iqdbc/car/mock/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/mock/carcontroller.py b/iqdbc_repo/iqdbc/car/mock/carcontroller.py
new file mode 100644
index 000000000..68407b2fa
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mock/carcontroller.py
@@ -0,0 +1,6 @@
+from iqdbc.car.interfaces import CarControllerBase
+
+
+class CarController(CarControllerBase):
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ return CC.actuators.as_builder(), []
diff --git a/iqdbc_repo/iqdbc/car/mock/carstate.py b/iqdbc_repo/iqdbc/car/mock/carstate.py
new file mode 100644
index 000000000..9a8a6f441
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mock/carstate.py
@@ -0,0 +1,7 @@
+from iqdbc.car import structs
+from iqdbc.car.interfaces import CarStateBase
+
+
+class CarState(CarStateBase):
+ def update(self, *_) -> tuple[structs.CarState, structs.IQCarState]:
+ return structs.CarState(), structs.IQCarState()
diff --git a/iqdbc_repo/iqdbc/car/mock/interface.py b/iqdbc_repo/iqdbc/car/mock/interface.py
new file mode 100755
index 000000000..981323a69
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mock/interface.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+from iqdbc.car import structs
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.mock.carcontroller import CarController
+from iqdbc.car.mock.carstate import CarState
+
+
+# mocked car interface for dashcam mode
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "mock"
+ ret.mass = 1700.
+ ret.wheelbase = 2.70
+ ret.centerToFront = ret.wheelbase * 0.5
+ ret.steerRatio = 13.
+ ret.dashcamOnly = True
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/mock/values.py b/iqdbc_repo/iqdbc/car/mock/values.py
new file mode 100644
index 000000000..473c9d03b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/mock/values.py
@@ -0,0 +1,9 @@
+from iqdbc.car import CarSpecs, PlatformConfig, Platforms
+
+
+class CAR(Platforms):
+ MOCK = PlatformConfig(
+ [],
+ CarSpecs(mass=1700, wheelbase=2.7, steerRatio=13),
+ {}
+ )
diff --git a/iqdbc_repo/iqdbc/car/nissan/__init__.py b/iqdbc_repo/iqdbc/car/nissan/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/nissan/carcontroller.py b/iqdbc_repo/iqdbc/car/nissan/carcontroller.py
new file mode 100644
index 000000000..804e1c3da
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/nissan/carcontroller.py
@@ -0,0 +1,76 @@
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, structs
+from iqdbc.car.lateral import apply_std_steer_angle_limits
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.nissan import nissancan
+from iqdbc.car.nissan.values import CAR, CarControllerParams
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ super().__init__(dbc_names, CP, CP_IQ)
+ self.car_fingerprint = CP.carFingerprint
+
+ self.apply_angle_last = 0
+
+ self.packer = CANPacker(dbc_names[Bus.pt])
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+ pcm_cancel_cmd = CC.cruiseControl.cancel
+
+ can_sends = []
+
+ ### 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:
+ # 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
+ else:
+ # Scale max torque based on how much torque the driver is applying to the wheel
+ 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)
+ )
+
+ 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))
+
+ # TODO: Find better way to cancel!
+ # For some reason spamming the cancel button is unreliable on the Leaf
+ # We now cancel by making propilot think the seatbelt is unlatched,
+ # this generates a beep and a warning message every time you disengage
+ if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC) and self.frame % 2 == 0:
+ 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))
+
+ # Below are the HUD messages. We copy the stock message and modify
+ if self.CP.carFingerprint != CAR.NISSAN_ALTIMA:
+ if self.frame % 2 == 0:
+ can_sends.append(nissancan.create_lkas_hud_msg(self.packer, CS.lkas_hud_msg, CC_IQ.aol.enabled, hud_control.leftLaneVisible,
+ hud_control.rightLaneVisible, hud_control.leftLaneDepart, hud_control.rightLaneDepart))
+
+ if self.frame % 50 == 0:
+ can_sends.append(nissancan.create_lkas_hud_info_msg(
+ self.packer, CS.lkas_hud_info_msg, steer_hud_alert
+ ))
+
+ new_actuators = actuators.as_builder()
+ new_actuators.steeringAngleDeg = self.apply_angle_last
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/nissan/carstate.py b/iqdbc_repo/iqdbc/car/nissan/carstate.py
new file mode 100644
index 000000000..d5394b8d7
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/nissan/carstate.py
@@ -0,0 +1,148 @@
+import copy
+from collections import deque
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.nissan.values import CAR, DBC, CarControllerParams
+
+from iqdbc.lvbs.car.nissan.iq_carstate import IQCarState
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+TORQUE_SAMPLES = 12
+
+
+class CarState(CarStateBase, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+
+ self.lkas_hud_msg = {}
+ self.lkas_hud_info_msg = {}
+
+ self.steeringTorqueSamples = deque(TORQUE_SAMPLES*[0], TORQUE_SAMPLES)
+ self.shifter_values = can_define.dv["GEARBOX"]["GEAR_SHIFTER"]
+
+ self.distance_button = 0
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+ cp_adas = can_parsers[Bus.adas]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ prev_distance_button = self.distance_button
+ self.distance_button = cp.vl["CRUISE_THROTTLE"]["FOLLOW_DISTANCE_BUTTON"]
+
+ if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA):
+ ret.gasPressed = bool(cp.vl["GAS_PEDAL"]["GAS_PEDAL"] > 3)
+ elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC):
+ ret.gasPressed = bool(cp.vl["CRUISE_THROTTLE"]["GAS_PEDAL"] > 3)
+
+ if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA):
+ ret.brakePressed = bool(cp.vl["DOORS_LIGHTS"]["USER_BRAKE_PRESSED"])
+ elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC):
+ ret.brakePressed = bool(cp.vl["CRUISE_THROTTLE"]["USER_BRAKE_PRESSED"])
+
+ fl = cp.vl["WHEEL_SPEEDS_FRONT"]["WHEEL_SPEED_FL"] * CV.KPH_TO_MS
+ fr = cp.vl["WHEEL_SPEEDS_FRONT"]["WHEEL_SPEED_FR"] * CV.KPH_TO_MS
+ rl = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RL"] * CV.KPH_TO_MS
+ rr = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RR"] * CV.KPH_TO_MS
+ # safety uses the rear wheel speeds for the speed measurement and angle limiting
+ ret.vEgoRaw = (rl + rr) / 2.0
+
+ v_ego_raw_full = (fl + fr + rl + rr) / 4.0
+ ret.vEgo, ret.aEgo = self.update_speed_kf(v_ego_raw_full)
+ 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:
+ ret.cruiseState.enabled = bool(cp.vl["CRUISE_STATE"]["CRUISE_ENABLED"])
+ else:
+ ret.cruiseState.enabled = bool(cp_adas.vl["CRUISE_STATE"]["CRUISE_ENABLED"])
+
+ if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL):
+ ret.seatbeltUnlatched = cp.vl["HUD"]["SEATBELT_DRIVER_LATCHED"] == 0
+ ret.cruiseState.available = bool(cp_cam.vl["PRO_PILOT"]["CRUISE_ON"])
+ elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC):
+ if self.CP.carFingerprint == CAR.NISSAN_LEAF:
+ ret.seatbeltUnlatched = cp.vl["SEATBELT"]["SEATBELT_DRIVER_LATCHED"] == 0
+ elif self.CP.carFingerprint == CAR.NISSAN_LEAF_IC:
+ ret.seatbeltUnlatched = cp.vl["CANCEL_MSG"]["CANCEL_SEATBELT"] == 1
+ ret.cruiseState.available = bool(cp.vl["CRUISE_THROTTLE"]["CRUISE_AVAILABLE"])
+ elif self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
+ ret.seatbeltUnlatched = cp.vl["HUD"]["SEATBELT_DRIVER_LATCHED"] == 0
+ ret.cruiseState.available = bool(cp_adas.vl["PRO_PILOT"]["CRUISE_ON"])
+
+ if self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
+ speed = cp.vl["PROPILOT_HUD"]["SET_SPEED"]
+ else:
+ speed = cp_adas.vl["PROPILOT_HUD"]["SET_SPEED"]
+
+ if speed != 255:
+ if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC):
+ conversion = CV.MPH_TO_MS if cp.vl["HUD_SETTINGS"]["SPEED_MPH"] else CV.KPH_TO_MS
+ else:
+ conversion = CV.MPH_TO_MS if cp.vl["HUD"]["SPEED_MPH"] else CV.KPH_TO_MS
+ ret.cruiseState.speed = speed * conversion
+ ret.cruiseState.speedCluster = (speed - 1) * conversion # Speed on HUD is always 1 lower than actually sent on can bus
+
+ if self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
+ ret.steeringTorque = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
+ else:
+ ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
+
+ self.steeringTorqueSamples.append(ret.steeringTorque)
+ # Filtering driver torque to prevent steeringPressed false positives
+ ret.steeringPressed = bool(abs(sum(self.steeringTorqueSamples) / TORQUE_SAMPLES) > CarControllerParams.STEER_THRESHOLD)
+
+ ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"]
+
+ ret.leftBlinker = bool(cp.vl["LIGHTS"]["LEFT_BLINKER"])
+ ret.rightBlinker = bool(cp.vl["LIGHTS"]["RIGHT_BLINKER"])
+
+ ret.doorOpen = any([cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_RR"],
+ cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_RL"],
+ cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_FR"],
+ cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_FL"]])
+
+ ret.espDisabled = bool(cp.vl["ESP"]["ESP_DISABLED"])
+
+ can_gear = int(cp.vl["GEARBOX"]["GEAR_SHIFTER"])
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
+
+ # stock lkas should be off
+ # TODO: is this needed?
+ if self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
+ ret.invalidLkasSetting = bool(cp.vl["LKAS_SETTINGS"]["LKAS_ENABLED"])
+ else:
+ ret.invalidLkasSetting = bool(cp_adas.vl["LKAS_SETTINGS"]["LKAS_ENABLED"])
+
+ self.cruise_throttle_msg = copy.copy(cp.vl["CRUISE_THROTTLE"])
+
+ if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC):
+ self.cancel_msg = copy.copy(cp.vl["CANCEL_MSG"])
+
+ if self.CP.carFingerprint != CAR.NISSAN_ALTIMA:
+ self.lkas_hud_msg = copy.copy(cp_adas.vl["PROPILOT_HUD"])
+ self.lkas_hud_info_msg = copy.copy(cp_adas.vl["PROPILOT_HUD_INFO_MSG"])
+
+ IQCarState.update(self, ret, ret_iq, can_parsers)
+
+ ret.buttonEvents = [
+ *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}),
+ *self.button_events,
+ ]
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1 if CP.carFingerprint == CAR.NISSAN_ALTIMA else 0),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0 if CP.carFingerprint == CAR.NISSAN_ALTIMA else 1),
+ Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
+ }
diff --git a/iqdbc_repo/iqdbc/car/nissan/fingerprints.py b/iqdbc_repo/iqdbc/car/nissan/fingerprints.py
new file mode 100644
index 000000000..3c639b37d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/nissan/fingerprints.py
@@ -0,0 +1,108 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.nissan.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.NISSAN_ALTIMA: {
+ (Ecu.fwdCamera, 0x707, None): [
+ b'284N86CA1D',
+ ],
+ (Ecu.eps, 0x742, None): [
+ b'6CA2B\xa9A\x02\x02G8A89P90D6A\x00\x00\x01\x80',
+ b'6CA2C\xa9A\x02\x02G8A89P90D6A\x00\x00\x01\x80',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'237106GU3B',
+ b'237109HE2B',
+ ],
+ (Ecu.gateway, 0x18dad0f1, None): [
+ b'284U29HE0A',
+ b'284U29HF0A',
+ ],
+ },
+ CAR.NISSAN_LEAF: {
+ (Ecu.abs, 0x740, None): [
+ b'476605SA1C',
+ b'476605SA7D',
+ b'476605SC2D',
+ b'476606WK7B',
+ b'476606WK9B',
+ ],
+ (Ecu.eps, 0x742, None): [
+ b'5SA2A\x99A\x05\x02N123F\x15b\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'5SA2A\xb7A\x05\x02N123F\x15\xa2\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'5SN2A\xb7A\x05\x02N123F\x15\xa2\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'5SN2A\xb7A\x05\x02N126F\x15\xb2\x00\x00\x00\x00\x00\x00\x00\x80',
+ ],
+ (Ecu.fwdCamera, 0x707, None): [
+ b'5SA0ADB\x04\x18\x00\x00\x00\x00\x00_*6\x04\x94a\x00\x00\x00\x80',
+ b'5SA2ADB\x04\x18\x00\x00\x00\x00\x00_*6\x04\x94a\x00\x00\x00\x80',
+ b'6WK2ADB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80',
+ b'6WK2BDB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80',
+ b'6WK2CDB\x04\x18\x00\x00\x00\x00\x00R=1\x18\x99\x10\x00\x00\x00\x80',
+ ],
+ (Ecu.gateway, 0x18dad0f1, None): [
+ b'284U25SA3C',
+ b'284U25SP0C',
+ b'284U25SP1C',
+ b'284U26WK0A',
+ b'284U26WK0C',
+ ],
+ },
+ 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'476605SD2D',
+ b'476605SD2E',
+ b'476605SH1D',
+ b'476605SH7D',
+ b'476605SH7E',
+ 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'5SH3A\x99A\x05\x02N123F\x15\x81\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'5SH3C\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',
+ ],
+ (Ecu.gateway, 0x18dad0f1, None): [
+ b'284U25SF0C',
+ b'284U25SH3A',
+ b'284U25SH3B',
+ b'284U25SK2D',
+ b'284U25SR0B',
+ b'284U25SR0C',
+ ],
+ },
+ CAR.NISSAN_XTRAIL: {
+ (Ecu.fwdCamera, 0x707, None): [
+ b'284N86FR2A',
+ ],
+ (Ecu.abs, 0x740, None): [
+ b'6FU0AD\x11\x02\x00\x02e\x95e\x80iQ#\x01\x00\x00\x00\x00\x00\x80',
+ b'6FU1BD\x11\x02\x00\x02e\x95e\x80iX#\x01\x00\x00\x00\x00\x00\x80',
+ ],
+ (Ecu.eps, 0x742, None): [
+ b'6FP2A\x99A\x05\x02N123F\x18\x02\x00\x00\x00\x00\x00\x00\x00\x80',
+ ],
+ (Ecu.combinationMeter, 0x743, None): [
+ b'6FR2A\x18B\x05\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'6FR9A\xa0A\x06\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'6FU9B\xa0A\x06\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80',
+ ],
+ (Ecu.gateway, 0x18dad0f1, None): [
+ b'284U26FR0E',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/nissan/interface.py b/iqdbc_repo/iqdbc/car/nissan/interface.py
new file mode 100644
index 000000000..a7b680a02
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/nissan/interface.py
@@ -0,0 +1,40 @@
+from iqdbc.car import get_safety_config, structs
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.nissan.carcontroller import CarController
+from iqdbc.car.nissan.carstate import CarState
+from iqdbc.car.nissan.values import CAR, NissanSafetyFlags
+from iqdbc.lvbs.car.nissan.values import NissanSafetyFlagsIQ
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.brake,)
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "nissan"
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.nissan)]
+ ret.autoResumeSng = False
+ ret.steerAtStandstill = True
+
+ ret.steerLimitTimer = 1.0
+
+ ret.steerActuatorDelay = 0.1
+
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+ ret.radarUnavailable = True
+
+ 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
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ if candidate in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC):
+ ret.iqSafetyFlags |= NissanSafetyFlagsIQ.LEAF
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/nissan/nissancan.py b/iqdbc_repo/iqdbc/car/nissan/nissancan.py
new file mode 100644
index 000000000..e5e312eca
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/nissan/nissancan.py
@@ -0,0 +1,154 @@
+import crcmod
+from iqdbc.car.nissan.values import CAR
+
+# TODO: add this checksum to the CANPacker
+nissan_checksum = crcmod.mkCrcFun(0x11d, initCrc=0x00, rev=False, xorOut=0xff)
+
+
+def create_steering_control(packer, apply_torque, frame, steer_on, lkas_max_torque):
+ values = {
+ "COUNTER": frame % 0x10,
+ "DESIRED_ANGLE": apply_torque,
+ "SET_0x80_2": 0x80,
+ "SET_0x80": 0x80,
+ "MAX_TORQUE": lkas_max_torque if steer_on else 0,
+ "LKA_ACTIVE": steer_on,
+ }
+
+ dat = packer.make_can_msg("LKAS", 0, values)[1]
+
+ values["CHECKSUM"] = nissan_checksum(dat[:7])
+ return packer.make_can_msg("LKAS", 0, values)
+
+
+def create_acc_cancel_cmd(packer, car_fingerprint, cruise_throttle_msg):
+ values = {s: cruise_throttle_msg[s] for s in [
+ "COUNTER",
+ "PROPILOT_BUTTON",
+ "CANCEL_BUTTON",
+ "GAS_PEDAL_INVERTED",
+ "SET_BUTTON",
+ "RES_BUTTON",
+ "FOLLOW_DISTANCE_BUTTON",
+ "NO_BUTTON_PRESSED",
+ "GAS_PEDAL",
+ "USER_BRAKE_PRESSED",
+ "NEW_SIGNAL_2",
+ "GAS_PRESSED_INVERTED",
+ "unsure1",
+ "unsure2",
+ "unsure3",
+ ]}
+ can_bus = 1 if car_fingerprint == CAR.NISSAN_ALTIMA else 2
+
+ values["CANCEL_BUTTON"] = 1
+ values["NO_BUTTON_PRESSED"] = 0
+ values["PROPILOT_BUTTON"] = 0
+ values["SET_BUTTON"] = 0
+ values["RES_BUTTON"] = 0
+ values["FOLLOW_DISTANCE_BUTTON"] = 0
+
+ return packer.make_can_msg("CRUISE_THROTTLE", can_bus, values)
+
+
+def create_cancel_msg(packer, cancel_msg, cruise_cancel):
+ values = {s: cancel_msg[s] for s in [
+ "CANCEL_SEATBELT",
+ "NEW_SIGNAL_1",
+ "NEW_SIGNAL_2",
+ "NEW_SIGNAL_3",
+ ]}
+
+ if cruise_cancel:
+ values["CANCEL_SEATBELT"] = 1
+
+ return packer.make_can_msg("CANCEL_MSG", 2, values)
+
+
+def create_lkas_hud_msg(packer, lkas_hud_msg, enabled, left_line, right_line, left_lane_depart, right_lane_depart):
+ values = {s: lkas_hud_msg[s] for s in [
+ "LARGE_WARNING_FLASHING",
+ "SIDE_RADAR_ERROR_FLASHING1",
+ "SIDE_RADAR_ERROR_FLASHING2",
+ "LEAD_CAR",
+ "LEAD_CAR_ERROR",
+ "FRONT_RADAR_ERROR",
+ "FRONT_RADAR_ERROR_FLASHING",
+ "SIDE_RADAR_ERROR_FLASHING3",
+ "LKAS_ERROR_FLASHING",
+ "SAFETY_SHIELD_ACTIVE",
+ "RIGHT_LANE_GREEN_FLASH",
+ "LEFT_LANE_GREEN_FLASH",
+ "FOLLOW_DISTANCE",
+ "AUDIBLE_TONE",
+ "SPEED_SET_ICON",
+ "SMALL_STEERING_WHEEL_ICON",
+ "unknown59",
+ "unknown55",
+ "unknown26",
+ "unknown28",
+ "unknown31",
+ "SET_SPEED",
+ "unknown43",
+ "unknown08",
+ "unknown05",
+ "unknown02",
+ ]}
+
+ values["RIGHT_LANE_YELLOW_FLASH"] = 1 if right_lane_depart else 0
+ values["LEFT_LANE_YELLOW_FLASH"] = 1 if left_lane_depart else 0
+
+ values["LARGE_STEERING_WHEEL_ICON"] = 2 if enabled else 0
+ values["RIGHT_LANE_GREEN"] = 1 if right_line and enabled else 0
+ values["LEFT_LANE_GREEN"] = 1 if left_line and enabled else 0
+
+ return packer.make_can_msg("PROPILOT_HUD", 0, values)
+
+
+def create_lkas_hud_info_msg(packer, lkas_hud_info_msg, steer_hud_alert):
+ values = {s: lkas_hud_info_msg[s] for s in [
+ "NA_HIGH_ACCEL_TEMP",
+ "SIDE_RADAR_NA_HIGH_CABIN_TEMP",
+ "SIDE_RADAR_MALFUNCTION",
+ "LKAS_MALFUNCTION",
+ "FRONT_RADAR_MALFUNCTION",
+ "SIDE_RADAR_NA_CLEAN_REAR_CAMERA",
+ "NA_POOR_ROAD_CONDITIONS",
+ "CURRENTLY_UNAVAILABLE",
+ "SAFETY_SHIELD_OFF",
+ "FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION",
+ "PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED",
+ "SIDE_IMPACT_NA_RADAR_OBSTRUCTION",
+ "WARNING_DO_NOT_ENTER",
+ "SIDE_IMPACT_SYSTEM_OFF",
+ "SIDE_IMPACT_MALFUNCTION",
+ "FRONT_COLLISION_MALFUNCTION",
+ "SIDE_RADAR_MALFUNCTION2",
+ "LKAS_MALFUNCTION2",
+ "FRONT_RADAR_MALFUNCTION2",
+ "PROPILOT_NA_MSGS",
+ "BOTTOM_MSG",
+ "HANDS_ON_WHEEL_WARNING",
+ "WARNING_STEP_ON_BRAKE_NOW",
+ "PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED",
+ "PROPILOT_NA_HIGH_CABIN_TEMP",
+ "WARNING_PROPILOT_MALFUNCTION",
+ "ACC_UNAVAILABLE_HIGH_CABIN_TEMP",
+ "ACC_NA_FRONT_CAMERA_IMPARED",
+ "unknown07",
+ "unknown10",
+ "unknown15",
+ "unknown23",
+ "unknown19",
+ "unknown31",
+ "unknown32",
+ "unknown46",
+ "unknown61",
+ "unknown55",
+ "unknown50",
+ ]}
+
+ if steer_hud_alert:
+ values["HANDS_ON_WHEEL_WARNING"] = 1
+
+ return packer.make_can_msg("PROPILOT_HUD_INFO_MSG", 0, values)
diff --git a/iqdbc_repo/iqdbc/car/nissan/values.py b/iqdbc_repo/iqdbc/car/nissan/values.py
new file mode 100644
index 000000000..aad48e25b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/nissan/values.py
@@ -0,0 +1,125 @@
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds
+from iqdbc.car.lateral import AngleSteeringLimits
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
+
+Ecu = CarParams.Ecu
+
+
+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]),
+ )
+
+ LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower
+ STEER_THRESHOLD = 1.0
+
+ def __init__(self, CP):
+ pass
+
+
+class NissanSafetyFlags(IntFlag):
+ ALT_EPS_BUS = 1
+
+
+class Footnote(Enum):
+ SETUP = CarFootnote(
+ "See more setup details for Nissan .",
+ Column.MAKE, setup_note=True)
+
+
+@dataclass
+class NissanCarDocs(CarDocs):
+ package: str = "ProPILOT Assist"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a]))
+ footnotes: list[Enum] = field(default_factory=lambda: [Footnote.SETUP])
+
+
+@dataclass(frozen=True)
+class NissanCarSpecs(CarSpecs):
+ centerToFrontRatio: float = 0.44
+ steerRatio: float = 17.
+
+
+@dataclass
+class NissanPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'nissan_x_trail_2017_generated'})
+
+
+class CAR(Platforms):
+ NISSAN_XTRAIL = NissanPlatformConfig(
+ [NissanCarDocs("Nissan X-Trail 2017")],
+ NissanCarSpecs(mass=1610, wheelbase=2.705)
+ )
+ NISSAN_LEAF = NissanPlatformConfig(
+ [NissanCarDocs("Nissan Leaf 2018-23", video="https://youtu.be/vaMbtAh_0cY")],
+ NissanCarSpecs(mass=1610, wheelbase=2.705),
+ {Bus.pt: 'nissan_leaf_2018_generated'},
+ )
+ # Leaf with ADAS ECU found behind instrument cluster instead of glovebox
+ # Currently the only known difference between them is the inverted seatbelt signal.
+ NISSAN_LEAF_IC = NISSAN_LEAF.override(car_docs=[])
+ NISSAN_ROGUE = NissanPlatformConfig(
+ [NissanCarDocs("Nissan Rogue 2018-20")],
+ NissanCarSpecs(mass=1610, wheelbase=2.705)
+ )
+ NISSAN_ALTIMA = NissanPlatformConfig(
+ [NissanCarDocs("Nissan Altima 2019-20, 2024", car_parts=CarParts.common([CarHarness.nissan_b]))],
+ NissanCarSpecs(mass=1492, wheelbase=2.824)
+ )
+
+
+DBC = CAR.create_dbc_map()
+
+# Default diagnostic session
+NISSAN_DIAGNOSTIC_REQUEST_KWP = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, 0x81])
+NISSAN_DIAGNOSTIC_RESPONSE_KWP = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, 0x81])
+
+# Manufacturer specific
+NISSAN_DIAGNOSTIC_REQUEST_KWP_2 = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, 0xda])
+NISSAN_DIAGNOSTIC_RESPONSE_KWP_2 = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, 0xda])
+
+NISSAN_VERSION_REQUEST_KWP = b'\x21\x83'
+NISSAN_VERSION_RESPONSE_KWP = b'\x61\x83'
+
+NISSAN_RX_OFFSET = 0x20
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[request for bus, logging in ((0, False), (1, True)) for request in [
+ Request(
+ [NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP],
+ [NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP],
+ bus=bus,
+ logging=logging,
+ ),
+ Request(
+ [NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP],
+ [NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP],
+ rx_offset=NISSAN_RX_OFFSET,
+ bus=bus,
+ logging=logging,
+ ),
+ # Rogue's engine solely responds to this
+ Request(
+ [NISSAN_DIAGNOSTIC_REQUEST_KWP_2, NISSAN_VERSION_REQUEST_KWP],
+ [NISSAN_DIAGNOSTIC_RESPONSE_KWP_2, NISSAN_VERSION_RESPONSE_KWP],
+ bus=bus,
+ logging=logging,
+ ),
+ Request(
+ [StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
+ [StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
+ rx_offset=NISSAN_RX_OFFSET,
+ bus=bus,
+ logging=logging,
+ ),
+ ]],
+)
diff --git a/iqdbc_repo/iqdbc/car/panda_runner.py b/iqdbc_repo/iqdbc/car/panda_runner.py
new file mode 100644
index 000000000..83b75ae28
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/panda_runner.py
@@ -0,0 +1,59 @@
+import time
+from contextlib import AbstractContextManager
+
+from panda import Panda
+from iqdbc.car.car_helpers import get_car
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.structs import CarParams, CarControl
+
+
+class PandaRunner(AbstractContextManager):
+ def __enter__(self):
+ self.p = Panda()
+ self.p.reset()
+
+ # setup + fingerprinting
+ self.p.set_safety_mode(CarParams.SafetyModel.elm327, 1)
+ self.CI = get_car(self._can_recv, self.p.can_send_many, self.p.set_obd, True, False)
+ 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)
+ 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.reset() # avoid siren
+ return super().__exit__(exc_type, exc_value, traceback)
+
+ @property
+ def panda(self) -> Panda:
+ return self.p
+
+ def _can_recv(self, wait_for_one: bool = False) -> list[list[CanData]]:
+ recv = self.p.can_recv()
+ while len(recv) == 0 and wait_for_one:
+ recv = self.p.can_recv()
+ return [[CanData(addr, dat, bus) for addr, dat, bus in recv], ]
+
+ def read(self, strict: bool = True):
+ cs = self.CI.update([int(time.monotonic()*1e9), self._can_recv()[0]])
+ if strict:
+ assert cs.canValid, "CAN went invalid, check connections"
+ return cs
+
+ def write(self, cc: CarControl) -> None:
+ if cc.enabled and not self.p.health()['controls_allowed']:
+ # prevent the car from faulting. print a warning?
+ cc = CarControl(enabled=False)
+ _, can_sends = self.CI.apply(cc)
+ self.p.can_send_many(can_sends, timeout=25)
+ self.p.send_heartbeat()
+
+
+if __name__ == "__main__":
+ with PandaRunner() as p:
+ print(p.read())
diff --git a/iqdbc_repo/iqdbc/car/psa/__init__.py b/iqdbc_repo/iqdbc/car/psa/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/psa/carcontroller.py b/iqdbc_repo/iqdbc/car/psa/carcontroller.py
new file mode 100644
index 000000000..4a3e2d50f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/psa/carcontroller.py
@@ -0,0 +1,41 @@
+from iqdbc.can.packer import CANPacker
+from iqdbc.car import Bus
+from iqdbc.car.lateral import apply_std_steer_angle_limits
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.psa.psacan import create_lka_steering
+from iqdbc.car.psa.values import CarControllerParams
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ super().__init__(dbc_names, CP, CP_IQ)
+ self.packer = CANPacker(dbc_names[Bus.main])
+ self.apply_angle_last = 0
+ self.status = 2
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ can_sends = []
+ actuators = CC.actuators
+
+ # lateral control
+ if self.frame % 5 == 0:
+ apply_angle = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw,
+ CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS)
+
+ # EPS disengages on steering override, activation sequence 2->3->4 to re-engage
+ # STATUS - 0: UNAVAILABLE, 1: UNSELECTED, 2: READY, 3: AUTHORIZED, 4: ACTIVE
+ if not CC.latActive:
+ self.status = 2
+ elif not CS.eps_active and not CS.out.steeringPressed:
+ self.status = 2 if self.status == 4 else self.status + 1
+ else:
+ self.status = 4
+
+ can_sends.append(create_lka_steering(self.packer, CC.latActive, apply_angle, self.status))
+
+ self.apply_angle_last = apply_angle
+
+ new_actuators = actuators.as_builder()
+ new_actuators.steeringAngleDeg = self.apply_angle_last
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/psa/carstate.py b/iqdbc_repo/iqdbc/car/psa/carstate.py
new file mode 100644
index 000000000..aab441074
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/psa/carstate.py
@@ -0,0 +1,74 @@
+from iqdbc.car import structs, Bus
+from iqdbc.can.parser import CANParser
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.psa.values import DBC, CarControllerParams
+from iqdbc.car.interfaces import CarStateBase
+
+GearShifter = structs.CarState.GearShifter
+TransmissionType = structs.CarParams.TransmissionType
+
+
+class CarState(CarStateBase):
+ def update(self, can_parsers) -> structs.CarState:
+ cp = can_parsers[Bus.main]
+ cp_adas = can_parsers[Bus.adas]
+ cp_cam = can_parsers[Bus.cam]
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ # car speed
+ self.parse_wheel_speeds(ret,
+ cp.vl['Dyn4_FRE']['P263_VehV_VPsvValWhlFrtL'],
+ cp.vl['Dyn4_FRE']['P264_VehV_VPsvValWhlFrtR'],
+ cp.vl['Dyn4_FRE']['P265_VehV_VPsvValWhlBckL'],
+ cp.vl['Dyn4_FRE']['P266_VehV_VPsvValWhlBckR'],
+ )
+ ret.yawRate = cp_adas.vl['HS2_DYN_UCF_MDD_32D']['VITESSE_LACET_BRUTE'] * CV.DEG_TO_RAD
+ ret.standstill = bool(cp_adas.vl['HS2_DYN_UCF_MDD_32D']['VEHICLE_STANDSTILL'])
+
+ # gas
+ ret.gasPressed = cp.vl['Dyn_CMM']['P002_Com_rAPP'] > 0
+
+ # brake
+ ret.brakePressed = bool(cp_cam.vl['Dat_BSI']['P013_MainBrake'])
+ ret.parkingBrake = cp.vl['Dyn_EasyMove']['P337_Com_stPrkBrk'] == 1 # 0: disengaged, 1: engaged, 3: brake actuator moving
+
+ # steering wheel
+ ret.steeringAngleDeg = cp.vl['STEERING_ALT']['ANGLE'] # EPS
+ ret.steeringRateDeg = cp.vl['STEERING_ALT']['RATE'] * (2 * cp.vl['STEERING_ALT']['RATE_SIGN'] - 1) # convert [0,1] to [-1,1] EPS: rot. speed * rot. sign
+ ret.steeringTorque = cp.vl['STEERING']['DRIVER_TORQUE']
+ ret.steeringTorqueEps = cp.vl['IS_DAT_DIRA']['EPS_TORQUE']
+ ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE, 5)
+ self.eps_active = cp.vl['IS_DAT_DIRA']['EPS_STATE_LKA'] == 3 # 0: Unauthorized, 1: Authorized, 2: Available, 3: Active, 4: Defect
+
+ # cruise
+ ret.cruiseState.speed = cp_adas.vl['HS2_DAT_MDD_CMD_452']['SPEED_SETPOINT'] * CV.KPH_TO_MS # set to 255 when ACC is off, -2 kph offset from dash speed
+ ret.cruiseState.enabled = cp_adas.vl['HS2_DAT_MDD_CMD_452']['RVV_ACC_ACTIVATION_REQ'] == 1
+ ret.cruiseState.available = cp_adas.vl['HS2_DYN1_MDD_ETAT_2B6']['ACC_STATUS'] > 2
+ ret.cruiseState.nonAdaptive = cp_adas.vl['HS2_DAT_MDD_CMD_452']['LONGITUDINAL_REGULATION_TYPE'] != 3 # 0: None, 1: CC, 2: Limiter, 3: ACC
+ ret.cruiseState.standstill = bool(cp_adas.vl['HS2_DYN_UCF_MDD_32D']['VEHICLE_STANDSTILL'])
+ ret.accFaulted = cp_adas.vl['HS2_DYN_UCF_MDD_32D']['ACC_ETAT_DECEL_OR_ESP_STATUS'] == 3 # 0: Inhibited, 1: Waiting, 2: Active, 3: Fault
+
+ # gear
+ if bool(cp_cam.vl['Dat_BSI']['P103_Com_bRevGear']):
+ ret.gearShifter = GearShifter.reverse
+ else:
+ ret.gearShifter = GearShifter.drive
+
+ # blinkers
+ blinker = cp_cam.vl['HS2_DAT7_BSI_612']['CDE_CLG_ET_HDC']
+ ret.leftBlinker = blinker == 1
+ ret.rightBlinker = blinker == 2
+
+ # lock info
+ ret.doorOpen = any((cp_cam.vl['Dat_BSI']['DRIVER_DOOR'], cp_cam.vl['Dat_BSI']['PASSENGER_DOOR']))
+ ret.seatbeltUnlatched = cp_cam.vl['RESTRAINTS']['DRIVER_SEATBELT'] != 2
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {
+ Bus.main: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0),
+ Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
+ }
diff --git a/iqdbc_repo/iqdbc/car/psa/fingerprints.py b/iqdbc_repo/iqdbc/car/psa/fingerprints.py
new file mode 100644
index 000000000..444a5c7c6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/psa/fingerprints.py
@@ -0,0 +1,13 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.psa.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.PSA_PEUGEOT_208: {
+ (Ecu.fwdRadar, 0x6b6, None): [
+ b'212053276',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/psa/interface.py b/iqdbc_repo/iqdbc/car/psa/interface.py
new file mode 100644
index 000000000..d6fbc883c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/psa/interface.py
@@ -0,0 +1,30 @@
+from iqdbc.car import structs, get_safety_config
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.psa.carcontroller import CarController
+from iqdbc.car.psa.carstate import CarState
+
+TransmissionType = structs.CarParams.TransmissionType
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = 'psa'
+
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.psa)]
+
+ ret.dashcamOnly = True
+
+ ret.steerActuatorDelay = 0.3
+ ret.steerLimitTimer = 0.1
+ ret.steerAtStandstill = True
+
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+ ret.radarUnavailable = True
+
+ ret.alphaLongitudinalAvailable = False
+
+ return ret
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/car/psa/psacan.py b/iqdbc_repo/iqdbc/car/psa/psacan.py
new file mode 100644
index 000000000..a039e752a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/psa/psacan.py
@@ -0,0 +1,18 @@
+def psa_checksum(address: int, sig, d: bytearray) -> int:
+ chk_ini = {0x452: 0x4, 0x38D: 0x7, 0x42D: 0xC}.get(address, 0xB)
+ byte = sig.start_bit // 8
+ d[byte] &= 0x0F if sig.start_bit % 8 >= 4 else 0xF0
+ checksum = sum((b >> 4) + (b & 0xF) for b in d)
+ return (chk_ini - checksum) & 0xF
+
+
+def create_lka_steering(packer, lat_active: bool, apply_angle: float, status: int):
+ values = {
+ 'DRIVE': 1,
+ 'STATUS': status,
+ 'LXA_ACTIVATION': 1,
+ 'TORQUE_FACTOR': lat_active * 100,
+ 'SET_ANGLE': apply_angle,
+ }
+
+ return packer.make_can_msg('LANE_KEEP_ASSIST', 0, values)
diff --git a/iqdbc_repo/iqdbc/car/psa/values.py b/iqdbc_repo/iqdbc/car/psa/values.py
new file mode 100644
index 000000000..ffadfd0f6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/psa/values.py
@@ -0,0 +1,54 @@
+from dataclasses import dataclass, field
+
+from iqdbc.car.structs import CarParams
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms
+from iqdbc.car.lateral import AngleSteeringLimits
+from iqdbc.car.docs_definitions import CarDocs, CarHarness, CarParts
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
+
+Ecu = CarParams.Ecu
+
+
+class CarControllerParams:
+ STEER_STEP = 1
+
+ ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits(
+ 390, # deg
+ ([0., 5., 25.], [2.5, 1.5, .2]),
+ ([0., 5., 25.], [5., 2., .3]),
+ )
+ STEER_DRIVER_ALLOWANCE = 5 # Driver intervention threshold, 0.5 Nm
+
+
+@dataclass
+class PSACarDocs(CarDocs):
+ package: str = "Adaptive Cruise Control (ACC) & Lane Assist"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.psa_a]))
+
+
+@dataclass
+class PSAPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {
+ Bus.pt: 'psa_aee2010_r3',
+ })
+
+
+class CAR(Platforms):
+ PSA_PEUGEOT_208 = PSAPlatformConfig(
+ [PSACarDocs("Peugeot 208 2019-25")],
+ CarSpecs(mass=1530, wheelbase=2.54, steerRatio=17.6),
+ )
+
+
+# Placeholder, FW Query will be added in separate PR
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE],
+ bus=0,
+ ),
+ ],
+)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/rivian/__init__.py b/iqdbc_repo/iqdbc/car/rivian/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/rivian/carcontroller.py b/iqdbc_repo/iqdbc/car/rivian/carcontroller.py
new file mode 100644
index 000000000..5b9638b9c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/carcontroller.py
@@ -0,0 +1,62 @@
+import numpy as np
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus
+from iqdbc.car.lateral import apply_driver_steer_torque_limits
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, create_adas_status
+from iqdbc.car.rivian.values import CarControllerParams
+
+from iqdbc.lvbs.car.rivian.aol import AolCarController
+
+
+class CarController(CarControllerBase, AolCarController):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ AolCarController.__init__(self)
+ self.apply_torque_last = 0
+ self.packer = CANPacker(dbc_names[Bus.pt])
+
+ self.cancel_frames = 0
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ AolCarController.update(self, CC, CC_IQ, CS)
+ actuators = CC.actuators
+ can_sends = []
+
+ apply_torque = 0
+ steer_max = round(float(np.interp(CS.out.vEgoRaw, CarControllerParams.STEER_MAX_LOOKUP[0],
+ CarControllerParams.STEER_MAX_LOOKUP[1])))
+ if self.aol.lat_active:
+ new_torque = int(round(CC.actuators.torque * steer_max))
+ apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last,
+ CS.out.steeringTorque, CarControllerParams, steer_max)
+
+ # send steering command
+ self.apply_torque_last = apply_torque
+ can_sends.append(create_lka_steering(self.packer, self.frame, CS.acm_lka_hba_cmd, apply_torque, CC.enabled, CC.latActive, self.aol))
+
+ if self.frame % 5 == 0:
+ can_sends.append(create_wheel_touch(self.packer, CS.sccm_wheel_touch, CC.enabled))
+
+ # Longitudinal control
+ if self.CP.openpilotLongitudinalControl:
+ accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX))
+ can_sends.append(create_longitudinal(self.packer, self.frame, 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))
+
+ new_actuators = actuators.as_builder()
+ new_actuators.torque = apply_torque / steer_max
+ new_actuators.torqueOutputCan = apply_torque
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/rivian/carstate.py b/iqdbc_repo/iqdbc/car/rivian/carstate.py
new file mode 100644
index 000000000..1901913df
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/carstate.py
@@ -0,0 +1,109 @@
+import copy
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.rivian.values import DBC, GEAR_MAP
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.lvbs.car.rivian.iq_carstate import IQCarState
+
+GearShifter = structs.CarState.GearShifter
+
+
+class CarState(CarStateBase, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ 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) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+ cp_adas = can_parsers[Bus.adas]
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ # Vehicle speed
+ ret.vEgoRaw = cp.vl["ESP_Status"]["ESP_Vehicle_Speed"] * CV.KPH_TO_MS
+ ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
+ ret.standstill = abs(ret.vEgoRaw) < 0.01
+ conversion = CV.KPH_TO_MS if cp_adas.vl["Cluster"]["Cluster_Unit"] == 0 else CV.MPH_TO_MS
+ ret.vEgoCluster = cp_adas.vl["Cluster"]["Cluster_VehicleSpeed"] * conversion
+
+ # Gas pedal
+ ret.gasPressed = cp.vl["VDM_PropStatus"]["VDM_AcceleratorPedalPosition"] > 0
+
+ # Brake pedal
+ ret.brake = cp.vl["ESPiB3"]["ESPiB3_pMC1"] / 250.0 # pressure in Bar
+ ret.brakePressed = cp.vl["iBESP2"]["iBESP2_BrakePedalApplied"] == 1
+
+ # Steering wheel
+ 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.steerFaultTemporary = cp.vl["EPAS_AdasStatus"]["EPAS_EacErrorCode"] != 0
+
+ # Cruise state
+ 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_AdasVehicleHoldStatus"] == 1
+
+ # ACM_Status->ACM_FaultSupervisorState normally 1, appears to go to 3 when either:
+ # 1. car in park/not in drive (normal)
+ # 2. something (message from another ECU) ACM relies on is faulty
+ # * ACM_FaultStatus will stay 0 since ACM itself isn't faulted
+ # TODO: ACM_FaultStatus hasn't been seen high yet, but log anyway
+ ret.accFaulted = (cp_cam.vl["ACM_Status"]["ACM_FaultStatus"] == 1 or
+ # VDM_AdasFaultStatus=Brk_Intv is the default for some reason
+ # VDM_AdasFaultStatus=Cntr_Fault isn't fully understood, but we've seen it in the wild
+ # VDM_AdasFaultStatus=Imps_Cmd was seen when sending it rapidly changing ACC enable commands, or when ACC command drops out
+ cp.vl["VDM_AdasSts"]["VDM_AdasFaultStatus"] in (2, 3)) # 2=Cntr_Fault, 3=Imps_Cmd
+
+ # Gear
+ ret.gearShifter = GEAR_MAP.get(int(cp.vl["VDM_PropStatus"]["VDM_Prndl_Status"]), GearShifter.unknown)
+
+ # Doors
+ ret.doorOpen = any(cp_adas.vl["IndicatorLights"][door] != 2 for door in ("RearDriverDoor", "FrontPassengerDoor", "DriverDoor", "RearPassengerDoor"))
+
+ # Blinkers
+ ret.leftBlinker = cp_adas.vl["IndicatorLights"]["TurnLightLeft"] in (1, 2)
+ ret.rightBlinker = cp_adas.vl["IndicatorLights"]["TurnLightRight"] in (1, 2)
+
+ # Seatbelt
+ ret.seatbeltUnlatched = cp.vl["RCM_Status"]["RCM_Status_IND_WARN_BELT_DRIVER"] != 0
+
+ # Blindspot
+ # ret.leftBlindspot = False
+ # ret.rightBlindspot = False
+
+ # AEB
+ ret.stockAeb = cp_cam.vl["ACM_AebRequest"]["ACM_EnableRequest"] != 0
+
+ # 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"])
+
+ IQCarState.update(self, ret, can_parsers)
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0),
+ Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
+ **IQCarState.get_parser(CP, CP_IQ),
+ }
diff --git a/iqdbc_repo/iqdbc/car/rivian/fingerprints.py b/iqdbc_repo/iqdbc/car/rivian/fingerprints.py
new file mode 100644
index 000000000..46ebc0232
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/fingerprints.py
@@ -0,0 +1,14 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.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',
+ b'R1TS_v4.4.1(63),4.4.1\x00',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/rivian/interface.py b/iqdbc_repo/iqdbc/car/rivian/interface.py
new file mode 100644
index 000000000..a211a98f4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/interface.py
@@ -0,0 +1,54 @@
+from iqdbc.car import get_safety_config, structs
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.rivian.carcontroller import CarController
+from iqdbc.car.rivian.carstate import CarState
+from iqdbc.car.rivian.radar_interface import RadarInterface
+from iqdbc.car.rivian.values import RivianSafetyFlags
+from iqdbc.lvbs.car.rivian.values import RivianFlagsIQ
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "rivian"
+
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.rivian)]
+
+ ret.steerActuatorDelay = 0.15
+ ret.steerLimitTimer = 0.4
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ ret.steerControlType = structs.CarParams.SteerControlType.torque
+ ret.radarUnavailable = True
+
+ # TODO: pending finding/handling missing set speed
+ ret.alphaLongitudinalAvailable = False
+ if alpha_long:
+ ret.openpilotLongitudinalControl = True
+ ret.safetyConfigs[0].safetyParam |= RivianSafetyFlags.LONG_CONTROL.value
+
+ ret.longitudinalActuatorDelay = 0.35
+ ret.stopAccel = 0
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ # Longitudinal harness upgrade advertises msg 0x31a on bus 5; when present it
+ # unlocks radar, blind-spot and openpilot longitudinal on Rivian.
+ if 0x31a in fingerprint[5]:
+ ret.flags |= RivianFlagsIQ.LONGITUDINAL_HARNESS_UPGRADE.value
+ stock_cp.radarUnavailable = False
+ stock_cp.enableBsm = True
+ stock_cp.alphaLongitudinalAvailable = True
+
+ if alpha_long and stock_cp.alphaLongitudinalAvailable:
+ stock_cp.openpilotLongitudinalControl = True
+ stock_cp.safetyConfigs[0].safetyParam |= RivianSafetyFlags.LONG_CONTROL.value
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/rivian/radar_interface.py b/iqdbc_repo/iqdbc/car/rivian/radar_interface.py
new file mode 100644
index 000000000..f6016af81
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/radar_interface.py
@@ -0,0 +1,77 @@
+import math
+
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import RadarInterfaceBase
+from iqdbc.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, CP_IQ):
+ super().__init__(CP, CP_IQ)
+ 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(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
+
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+
+ for addr in range(RADAR_START_ADDR, RADAR_START_ADDR + RADAR_MSG_COUNT):
+ msg = self.rcp.vl[f"RADAR_TRACK_{addr:x}"]
+
+ # STATE: 1=New, 2=New_updated, 3=Updated, 4=Coasting, 7=New_coasting
+ valid = msg['STATE'] in (1, 2, 3, 4, 7)
+
+ # Rivian's Short Range Radar (SSR) detects close stationary objects like guardrails, which cause phantom braking.
+ # MODE: 1=SRR, 2=LRR, 3=SRR_and_LRR
+ valid = valid and msg['MODE'] in (2, 3)
+
+ if valid:
+ if addr not in self.pts or msg['STATE'] in (1, 2, 7):
+ self.pts[addr] = structs.RadarData.RadarPoint()
+ self.pts[addr].trackId = self.track_id
+ self.track_id += 1
+
+ self.pts[addr].measured = msg['STATE'] in (2, 3)
+ azimuth = math.radians(msg['AZIMUTH'])
+ 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')
+ elif addr in self.pts:
+ del self.pts[addr]
+
+ ret.points = list(self.pts.values())
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/rivian/riviancan.py b/iqdbc_repo/iqdbc/car/rivian/riviancan.py
new file mode 100644
index 000000000..c818c6d24
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/riviancan.py
@@ -0,0 +1,99 @@
+def checksum(data, poly, xor_output):
+ crc = 0
+ for byte in data:
+ crc ^= byte
+ for _ in range(8):
+ if crc & 0x80:
+ crc = (crc << 1) ^ poly
+ else:
+ crc <<= 1
+ crc &= 0xFF
+ return crc ^ xor_output
+
+
+def create_lka_steering(packer, frame, acm_lka_hba_cmd, apply_torque, enabled, active, aol):
+ # forward auto high beam and speed limit status and nothing else
+ values = {s: acm_lka_hba_cmd[s] for s in (
+ "ACM_hbaSysState",
+ "ACM_hbaLamp",
+ "ACM_hbaOnOffState",
+ "ACM_slifOnOffState",
+ )}
+
+ values |= {
+ "ACM_lkaHbaCmd_Counter": frame % 15,
+ "ACM_lkaStrToqReq": apply_torque,
+ "ACM_lkaActToi": aol.lat_active,
+
+ "ACM_lkaLaneRecogState": 3 if aol.lka_icon_states else 0,
+ "ACM_lkaSymbolState": 3 if aol.lka_icon_states else 0,
+
+ # static values
+ "ACM_lkaElkRequest": 0,
+ "ACM_ldwlkaOnOffState": 2, # 2=LKAS+LDW on
+ "ACM_elkOnOffState": 1, # 1=LKAS on
+ # TODO: what are these used for?
+ "ACM_ldwWarnTypeState": 2, # always 2
+ "ACM_ldwWarnTimingState": 1, # always 1
+ #"ACM_lkaHandsoffDisplayWarning": 1, # TODO: we can send this when openpilot wants you to pay attention
+ }
+
+ data = packer.make_can_msg("ACM_lkaHbaCmd", 0, values)[1]
+ values["ACM_lkaHbaCmd_Checksum"] = checksum(data[1:], 0x1D, 0x63)
+ 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):
+ values = {
+ "ACM_longitudinalRequest_Counter": frame % 15,
+ "ACM_AccelerationRequest": accel,
+ "ACM_PrndRequest": 0,
+ "ACM_longInterfaceEnable": 1 if enabled else 0,
+ "ACM_VehicleHoldRequest": 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_AdasUnkown1",
+ "VDM_AdasInterfaceStatus",
+ "VDM_AdasVehicleHoldStatus",
+ "VDM_UserAdasRequest",
+ )}
+
+ 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/iqdbc_repo/iqdbc/car/rivian/tests/__init__.py b/iqdbc_repo/iqdbc/car/rivian/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/rivian/tests/test_rivian.py b/iqdbc_repo/iqdbc/car/rivian/tests/test_rivian.py
new file mode 100644
index 000000000..ec795e9a1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/tests/test_rivian.py
@@ -0,0 +1,23 @@
+from iqdbc.car.rivian.fingerprints import FW_VERSIONS
+from iqdbc.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/iqdbc_repo/iqdbc/car/rivian/values.py b/iqdbc_repo/iqdbc/car/rivian/values.py
new file mode 100644
index 000000000..d21eae318
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rivian/values.py
@@ -0,0 +1,139 @@
+from dataclasses import dataclass, field
+from enum import StrEnum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, structs, uds
+from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
+from iqdbc.car.vin import Vin
+
+
+class WMI(StrEnum):
+ RIVIAN_TRUCK = "7FC"
+ 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.common([CarHarness.rivian]))
+ setup_video: str = "https://youtu.be/uaISd1j7Z4U"
+
+
+@dataclass
+class RivianPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'rivian_primary_actuator', Bus.radar: 'rivian_mando_front_radar_generated',
+ Bus.alt: 'rivian_park_assist_can'})
+ wmis: set[WMI] = field(default_factory=set)
+ lines: set[ModelLine] = field(default_factory=set)
+ years: set[ModelYear] = field(default_factory=set)
+
+
+class CAR(Platforms):
+ RIVIAN_R1_GEN1 = RivianPlatformConfig(
+ # 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},
+ )
+
+
+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}
+
+
+RIVIAN_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(0xf1a0)
+RIVIAN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40])
+
+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,
+ ),
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_ECU_HARDWARE_NUMBER_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_ECU_HARDWARE_NUMBER_RESPONSE],
+ rx_offset=0x40,
+ bus=0,
+ logging=True,
+ ),
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, RIVIAN_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, RIVIAN_VERSION_RESPONSE],
+ rx_offset=0x40,
+ bus=0,
+ logging=True,
+ ),
+ ],
+ 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,
+}
+
+
+class CarControllerParams:
+ # The R1T 2023 and R1S 2023 we tested on achieves slightly more lateral acceleration going left vs. right
+ # and lateral acceleration falls linearly as speed decreases from 38 mph to 20 mph. These values are set
+ # conservatively to reach a maximum of 3.0 m/s^2 turning left at 80 mph
+
+ # These refer to turning left:
+ # 250 is ~2.8 m/s^2 above 17 m/s, then linearly ramps to ~1.6 m/s^2 from 17 m/s to 9 m/s
+ # TODO: it is theorized older models have different steering racks and achieve down to half the
+ # lateral acceleration referenced here at all speeds. detect this and ship a torque increase for those models
+ STEER_MAX = 250 # 350 is intended to maintain lateral accel, not increase it
+ STEER_MAX_LOOKUP = [9, 17], [350, 250]
+ 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
+ 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/iqdbc_repo/iqdbc/car/rlog.capnp b/iqdbc_repo/iqdbc/car/rlog.capnp
new file mode 100644
index 000000000..50cdd68b5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/rlog.capnp
@@ -0,0 +1,23 @@
+@0xce500edaaae36b0e;
+
+# Minimal schema for parsing rlog CAN messages
+# Subset of cereal/log.capnp
+
+struct CanData {
+ address @0 :UInt32;
+ busTimeDEPRECATED @1 :UInt16;
+ dat @2 :Data;
+ src @3 :UInt8;
+}
+
+struct Event {
+ logMonoTime @0 :UInt64;
+
+ union {
+ initData @1 :Void;
+ frame @2 :Void;
+ gpsNMEA @3 :Void;
+ sensorEventDEPRECATED @4 :Void;
+ can @5 :List(CanData);
+ }
+}
diff --git a/iqdbc_repo/iqdbc/car/secoc.py b/iqdbc_repo/iqdbc/car/secoc.py
new file mode 100644
index 000000000..c61f4ca14
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/secoc.py
@@ -0,0 +1,49 @@
+import struct
+
+from Crypto.Hash import CMAC
+from Crypto.Cipher import AES
+
+
+def add_mac(key, trip_cnt, reset_cnt, msg_cnt, msg):
+ # TODO: clean up conversion to and from hex
+
+ addr, payload, bus = msg
+ reset_flag = reset_cnt & 0b11
+ msg_cnt_flag = msg_cnt & 0b11
+ payload = payload[:4]
+
+ # Step 1: Build Freshness Value (48 bits)
+ # [Trip Counter (16 bit)][[Reset Counter (20 bit)][Message Counter (8 bit)][Reset Flag (2 bit)][Padding (2 bit)]
+ freshness_value = struct.pack('>HI', trip_cnt, (reset_cnt << 12) | ((msg_cnt & 0xff) << 4) | (reset_flag << 2))
+
+ # Step 2: Build data to authenticate (96 bits)
+ # [Message ID (16 bits)][Payload (32 bits)][Freshness Value (48 bits)]
+ to_auth = struct.pack('>H', addr) + payload + freshness_value
+
+ # Step 3: Calculate CMAC (28 bit)
+ cmac = CMAC.new(key, ciphermod=AES)
+ cmac.update(to_auth)
+ mac = cmac.digest().hex()[:7] # truncated MAC
+
+ # Step 4: Build message
+ # [Payload (32 bit)][Message Counter Flag (2 bit)][Reset Flag (2 bit)][Authenticator (28 bit)]
+ msg_cnt_rst_flag = struct.pack('>B', (msg_cnt_flag << 2) | reset_flag).hex()[1]
+ msg = payload.hex() + msg_cnt_rst_flag + mac
+ payload = bytes.fromhex(msg)
+
+ return (addr, payload, bus)
+
+
+def build_sync_mac(key, trip_cnt, reset_cnt, id_=0xf):
+ id_ = struct.pack('>H', id_) # 16
+ trip_cnt = struct.pack('>H', trip_cnt) # 16
+ reset_cnt = struct.pack('>I', reset_cnt << 12)[:-1] # 20 + 4 padding
+
+ to_auth = id_ + trip_cnt + reset_cnt # SecOC 11.4.1.1 page 138
+
+ cmac = CMAC.new(key, ciphermod=AES)
+ cmac.update(to_auth)
+
+ msg = "0" + cmac.digest().hex()[:7]
+ msg = bytes.fromhex(msg)
+ return struct.unpack('>I', msg)[0]
diff --git a/iqdbc_repo/iqdbc/car/structs.py b/iqdbc_repo/iqdbc/car/structs.py
new file mode 100644
index 000000000..b40c293c2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/structs.py
@@ -0,0 +1,145 @@
+from dataclasses import dataclass as _dataclass, field, is_dataclass
+from enum import Enum, StrEnum as _StrEnum, auto
+from typing import dataclass_transform, get_origin
+import os
+import capnp
+from iqdbc.car.common.basedir import BASEDIR
+try:
+ from cereal import car
+except ImportError:
+ capnp.remove_import_hook()
+ car = capnp.load(os.path.join(BASEDIR, "car.capnp"))
+
+CarState = car.CarState
+RadarData = car.RadarData
+CarControl = car.CarControl
+CarParams = car.CarParams
+
+CarStateT = capnp.lib.capnp._StructModule
+RadarDataT = capnp.lib.capnp._StructModule
+CarControlT = capnp.lib.capnp._StructModule
+CarParamsT = capnp.lib.capnp._StructModule
+
+AUTO_OBJ = object()
+def auto_field():
+ return AUTO_OBJ
+@dataclass_transform()
+def auto_dataclass(cls=None, /, **kwargs):
+ cls_annotations = cls.__dict__.get('__annotations__', {})
+ for name, typ in cls_annotations.items():
+ current_value = getattr(cls, name)
+ if current_value is AUTO_OBJ:
+ origin_typ = get_origin(typ) or typ
+ if isinstance(origin_typ, str):
+ raise TypeError(f"Forward references are not supported for auto_field: '{origin_typ}'. Use a default_factory with lambda instead.")
+ elif origin_typ in (int, float, str, bytes, list, tuple, bool) or is_dataclass(origin_typ):
+ setattr(cls, name, field(default_factory=origin_typ))
+ elif issubclass(origin_typ, Enum): # first enum is the default
+ setattr(cls, name, field(default=next(iter(origin_typ))))
+ else:
+ raise TypeError(f"Unsupported type for auto_field: {origin_typ}")
+ return _dataclass(cls, **kwargs)
+
+class StrEnum(_StrEnum):
+ @staticmethod
+ def _generate_next_value_(name, *args):
+ return name
+
+@auto_dataclass
+class IQCarParams:
+ flags: int = auto_field()
+ iqSafetyFlags: int = auto_field()
+ pcmCruiseSpeed: bool = auto_field()
+ enableGasInterceptor: bool = auto_field()
+ longitudinalStoppingSpeedOverride: float = auto_field()
+ stoppingDecelRateOverride: float = auto_field()
+ longActiveWithGasOverride: bool = auto_field()
+
+ iqLateralNet: 'IQCarParams.LateralNet' = field(default_factory=lambda: IQCarParams.LateralNet())
+
+ @auto_dataclass
+ class LateralNet:
+ model: 'IQCarParams.LateralNet.Model' = field(default_factory=lambda: IQCarParams.LateralNet.Model())
+ fuzzyFingerprint: bool = auto_field()
+
+ @auto_dataclass
+ class Model:
+ path: str = auto_field()
+ name: str = auto_field()
+
+
+@auto_dataclass
+class AlwaysOnLateral:
+ state: 'AlwaysOnLateral.AlwaysOnLateralState' = field(
+ default_factory=lambda: AlwaysOnLateral.AlwaysOnLateralState.disabled
+ )
+ enabled: bool = auto_field()
+ active: bool = auto_field()
+ available: bool = auto_field()
+
+ class AlwaysOnLateralState(StrEnum):
+ disabled = auto()
+ paused = auto()
+ enabled = auto()
+ softDisabling = auto()
+ overriding = auto()
+
+
+@auto_dataclass
+class LeadData:
+ dRel: float = auto_field()
+ yRel: float = auto_field()
+ vRel: float = auto_field()
+ aRel: float = auto_field()
+ vLead: float = auto_field()
+ dPath: float = auto_field()
+ vLat: float = auto_field()
+ vLeadK: float = auto_field()
+ aLeadK: float = auto_field()
+ fcw: bool = auto_field()
+ status: bool = auto_field()
+ aLeadTau: float = auto_field()
+ modelProb: float = auto_field()
+ radar: bool = auto_field()
+ radarTrackId: int = auto_field()
+
+ aLeadDEPRECATED: float = auto_field()
+
+
+@auto_dataclass
+class IQCarControl:
+ aol: 'AlwaysOnLateral' = field(default_factory=lambda: AlwaysOnLateral())
+ params: list['IQCarControl.Param'] = auto_field()
+ leadOne: 'LeadData' = field(default_factory=lambda: LeadData())
+ leadTwo: 'LeadData' = field(default_factory=lambda: LeadData())
+ angleOffsetDeg: float = auto_field()
+ # VW PQ "Blend IQ.Pilot + Stock ACC Radar" intent (radar_manager -> RadarHandler)
+ radarBlendActive: bool = auto_field()
+ radarEngageReq: bool = auto_field()
+ radarCancelReq: bool = auto_field()
+ useRadarAccel: bool = auto_field()
+ radarSetSpeedKph: float = auto_field()
+ radarGapBars: int = auto_field()
+
+ @auto_dataclass
+ class Param:
+ key: str = auto_field()
+ value: bytes = auto_field()
+ type: 'IQCarControl.ParamType' = field(
+ default_factory=lambda: IQCarControl.ParamType.string
+ )
+
+ class ParamType(StrEnum):
+ string = auto()
+ bool = auto()
+ int = auto()
+ float = auto()
+ time = auto()
+ json = auto()
+ bytes = auto()
+
+
+@auto_dataclass
+class IQCarState:
+ speedLimit: float = auto_field()
+ alcOverrideAlert: bool = auto_field()
diff --git a/iqdbc_repo/iqdbc/car/subaru/__init__.py b/iqdbc_repo/iqdbc/car/subaru/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/subaru/carcontroller.py b/iqdbc_repo/iqdbc/car/subaru/carcontroller.py
new file mode 100644
index 000000000..3a1cab647
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/carcontroller.py
@@ -0,0 +1,149 @@
+import numpy as np
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, make_tester_present_msg
+from iqdbc.car.lateral import apply_driver_steer_torque_limits, common_fault_avoidance
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.subaru import subarucan
+from iqdbc.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarControllerParams, SubaruFlags
+
+from iqdbc.lvbs.car.subaru.creep_assist import IQStopAndGoController
+
+# FIXME: These limits aren't exact. The real limit is more than likely over a larger time period and
+# involves the total steering angle change rather than rate, but these limits work well for now
+MAX_STEER_RATE = 25 # deg/s
+MAX_STEER_RATE_FRAMES = 7 # tx control frames needed before torque can be cut
+
+
+class CarController(CarControllerBase, IQStopAndGoController):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ IQStopAndGoController.__init__(self, CP, CP_IQ)
+ self.apply_torque_last = 0
+
+ self.cruise_button_prev = 0
+ self.steer_rate_counter = 0
+
+ self.p = CarControllerParams(CP)
+ self.packer = CANPacker(DBC[CP.carFingerprint][Bus.pt])
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+ pcm_cancel_cmd = CC.cruiseControl.cancel
+
+ can_sends = []
+
+ # *** steering ***
+ if (self.frame % self.p.STEER_STEP) == 0:
+ apply_torque = int(round(actuators.torque * 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)
+
+ if not CC.latActive:
+ apply_torque = 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))
+ else:
+ apply_steer_req = CC.latActive
+
+ if self.CP.flags & SubaruFlags.STEER_RATE_LIMITED:
+ # 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)
+
+ can_sends.append(subarucan.create_steering_control(self.packer, apply_torque, apply_steer_req))
+
+ self.apply_torque_last = apply_torque
+
+ # *** longitudinal ***
+
+ if CC.longActive:
+ apply_throttle = int(round(np.interp(actuators.accel, CarControllerParams.THROTTLE_LOOKUP_BP, CarControllerParams.THROTTLE_LOOKUP_V)))
+ apply_rpm = int(round(np.interp(actuators.accel, CarControllerParams.RPM_LOOKUP_BP, CarControllerParams.RPM_LOOKUP_V)))
+ apply_brake = int(round(np.interp(actuators.accel, CarControllerParams.BRAKE_LOOKUP_BP, CarControllerParams.BRAKE_LOOKUP_V)))
+
+ # limit min and max values
+ cruise_throttle = np.clip(apply_throttle, CarControllerParams.THROTTLE_MIN, CarControllerParams.THROTTLE_MAX)
+ cruise_rpm = np.clip(apply_rpm, CarControllerParams.RPM_MIN, CarControllerParams.RPM_MAX)
+ cruise_brake = np.clip(apply_brake, CarControllerParams.BRAKE_MIN, CarControllerParams.BRAKE_MAX)
+ else:
+ cruise_throttle = CarControllerParams.THROTTLE_INACTIVE
+ cruise_rpm = CarControllerParams.RPM_MIN
+ cruise_brake = CarControllerParams.BRAKE_MIN
+
+ # *** alerts and pcm cancel ***
+ if self.CP.flags & SubaruFlags.PREGLOBAL:
+ if self.frame % 5 == 0:
+ # 1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 = resume deep
+ # disengage ACC when OP is disengaged
+ if pcm_cancel_cmd:
+ cruise_button = 1
+ # turn main on if off and past start-up state
+ elif not CS.out.cruiseState.available and CS.ready:
+ cruise_button = 1
+ else:
+ cruise_button = CS.cruise_button
+
+ # unstick previous mocked button press
+ if cruise_button == 1 and self.cruise_button_prev == 1:
+ cruise_button = 0
+ self.cruise_button_prev = cruise_button
+
+ can_sends.append(subarucan.create_preglobal_es_distance(self.packer, cruise_button, CS.es_distance_msg))
+
+ else:
+ if self.frame % 10 == 0:
+ can_sends.append(subarucan.create_es_dashstatus(self.packer, self.frame // 10, CS.es_dashstatus_msg, CC.enabled,
+ self.CP.openpilotLongitudinalControl, CC.longActive, hud_control.leadVisible))
+
+ can_sends.append(subarucan.create_es_lkas_state(self.packer, self.frame // 10, CS.es_lkas_state_msg, CC.enabled, hud_control.visualAlert,
+ hud_control.leftLaneVisible, hud_control.rightLaneVisible,
+ hud_control.leftLaneDepart, hud_control.rightLaneDepart))
+
+ if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT:
+ can_sends.append(subarucan.create_es_infotainment(self.packer, self.frame // 10, CS.es_infotainment_msg, hud_control.visualAlert))
+
+ if self.CP.openpilotLongitudinalControl:
+ if self.frame % 5 == 0:
+ can_sends.append(subarucan.create_es_status(self.packer, self.frame // 5, CS.es_status_msg,
+ self.CP.openpilotLongitudinalControl, CC.longActive, cruise_rpm))
+
+ can_sends.append(subarucan.create_es_brake(self.packer, self.frame // 5, CS.es_brake_msg,
+ self.CP.openpilotLongitudinalControl, CC.longActive, cruise_brake))
+
+ can_sends.append(subarucan.create_es_distance(self.packer, self.frame // 5, CS.es_distance_msg, 0, pcm_cancel_cmd,
+ self.CP.openpilotLongitudinalControl, cruise_brake > 0, cruise_throttle))
+ else:
+ if pcm_cancel_cmd:
+ if not (self.CP.flags & SubaruFlags.HYBRID):
+ bus = CanBus.alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else CanBus.main
+ can_sends.append(subarucan.create_es_distance(self.packer, CS.es_distance_msg["COUNTER"] + 1, CS.es_distance_msg, bus, pcm_cancel_cmd))
+
+ if self.CP.flags & SubaruFlags.DISABLE_EYESIGHT:
+ # Tester present (keeps eyesight disabled)
+ if self.frame % 100 == 0:
+ can_sends.append(make_tester_present_msg(GLOBAL_ES_ADDR, CanBus.camera, suppress_response=True))
+
+ # Create all of the other eyesight messages to keep the rest of the car happy when eyesight is disabled
+ if self.frame % 5 == 0:
+ can_sends.append(subarucan.create_es_highbeamassist(self.packer))
+
+ if self.frame % 10 == 0:
+ can_sends.append(subarucan.create_es_static_1(self.packer))
+
+ if self.frame % 2 == 0:
+ can_sends.append(subarucan.create_es_static_2(self.packer))
+
+ can_sends.extend(IQStopAndGoController.create_creep_assist(self, self.packer, CC, CS, self.frame))
+
+ new_actuators = actuators.as_builder()
+ new_actuators.torque = self.apply_torque_last / self.p.STEER_MAX
+ new_actuators.torqueOutputCan = self.apply_torque_last
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/subaru/carstate.py b/iqdbc_repo/iqdbc/car/subaru/carstate.py
new file mode 100644
index 000000000..5276c4d60
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/carstate.py
@@ -0,0 +1,157 @@
+import copy
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.subaru.values import DBC, CanBus, SubaruFlags
+from iqdbc.car import CanSignalRateCalculator
+
+from iqdbc.lvbs.car.subaru.aol import AolCarState
+from iqdbc.lvbs.car.subaru.creep_assist import IQStopAndGoState
+
+
+class CarState(CarStateBase, AolCarState, IQStopAndGoState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ AolCarState.__init__(self, CP, CP_IQ)
+ IQStopAndGoState.__init__(self, CP, CP_IQ)
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+ self.shifter_values = can_define.dv["Transmission"]["Gear"]
+
+ self.angle_rate_calulator = CanSignalRateCalculator(50)
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+ cp_alt = can_parsers[Bus.alt]
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ throttle_msg = cp.vl["Throttle"] if not (self.CP.flags & SubaruFlags.HYBRID) else cp_alt.vl["Throttle_Hybrid"]
+ ret.gasPressed = throttle_msg["Throttle_Pedal"] > 1e-5
+ if self.CP.flags & SubaruFlags.PREGLOBAL:
+ ret.brakePressed = cp.vl["Brake_Pedal"]["Brake_Pedal"] > 0
+ else:
+ cp_brakes = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp
+ ret.brakePressed = cp_brakes.vl["Brake_Status"]["Brake"] == 1
+
+ cp_es_distance = cp_alt if self.CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID) else cp_cam
+ if not (self.CP.flags & SubaruFlags.HYBRID):
+ eyesight_fault = bool(cp_es_distance.vl["ES_Distance"]["Cruise_Fault"])
+
+ # if openpilot is controlling long, an eyesight fault is a non-critical fault. otherwise it's an ACC fault
+ if self.CP.openpilotLongitudinalControl:
+ ret.carFaultedNonCritical = eyesight_fault
+ else:
+ ret.accFaulted = eyesight_fault
+
+ cp_wheels = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp
+ self.parse_wheel_speeds(ret,
+ cp_wheels.vl["Wheel_Speeds"]["FL"],
+ cp_wheels.vl["Wheel_Speeds"]["FR"],
+ cp_wheels.vl["Wheel_Speeds"]["RL"],
+ cp_wheels.vl["Wheel_Speeds"]["RR"],
+ )
+ ret.standstill = ret.vEgoRaw == 0
+
+ # continuous blinker signals for assisted lane change
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["Dashlights"]["LEFT_BLINKER"],
+ cp.vl["Dashlights"]["RIGHT_BLINKER"])
+
+ if self.CP.enableBsm:
+ ret.leftBlindspot = (cp.vl["BSD_RCTA"]["L_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["L_APPROACHING"] == 1)
+ ret.rightBlindspot = (cp.vl["BSD_RCTA"]["R_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["R_APPROACHING"] == 1)
+
+ cp_transmission = cp_alt if self.CP.flags & SubaruFlags.HYBRID else cp
+ can_gear = int(cp_transmission.vl["Transmission"]["Gear"])
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
+
+ if not (self.CP.flags & SubaruFlags.LKAS_ANGLE):
+ ret.steeringAngleDeg = cp.vl["Steering_Torque"]["Steering_Angle"]
+ steering_updated = len(cp.vl_all["Steering_Torque"]["Steering_Angle"]) > 0
+ else:
+ # Steering_Torque->Steering_Angle exists on SUBARU_FORESTER_2022, SUBARU_OUTBACK_2023, SUBARU_ASCENT_2023 where
+ # it is identical to Steering_2's signal. However, it is always zero on newer LKAS_ANGLE cars
+ # such as 2024+ Crosstrek, 2023+ Ascent, etc. Use a universal signal for LKAS_ANGLE cars.
+ ret.steeringAngleDeg = cp.vl["Steering_2"]["Steering_Angle"]
+ steering_updated = len(cp.vl_all["Steering_2"]["Steering_Angle"]) > 0
+
+ if not (self.CP.flags & SubaruFlags.PREGLOBAL):
+ # ideally we get this from the car, but unclear if it exists. diagnostic software doesn't even have it
+ ret.steeringRateDeg = self.angle_rate_calulator.update(ret.steeringAngleDeg, steering_updated)
+
+ ret.steeringTorque = cp.vl["Steering_Torque"]["Steer_Torque_Sensor"]
+ ret.steeringTorqueEps = cp.vl["Steering_Torque"]["Steer_Torque_Output"]
+
+ steer_threshold = 75 if self.CP.flags & SubaruFlags.PREGLOBAL else 80
+ ret.steeringPressed = abs(ret.steeringTorque) > steer_threshold
+
+ cp_cruise = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp
+ cp_es_brake = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp_cam
+
+ if self.CP.flags & (SubaruFlags.HYBRID | SubaruFlags.LKAS_ANGLE):
+ # ES_DashStatus->Cruise_Activated_Dash is likely intended for the dash display only, as it falls
+ # during user gas override and at standstill. ES_Status is missing on hybrid, so we use ES_Brake instead
+
+ # TODO: ES_Brake->Cruise_Activated has been seen staying high when Crosstrek 2025 angle LKAS user pressed
+ # brake while engaged at a stop. ES_Status and ES_DashStatus->Signal7 correctly fell, but is either missing or
+ # always zero on hybrids. Probably need to split angle & hybrid. 0x27 and 0x225 on hybrids may work for them.
+ ret.cruiseState.enabled = cp_es_brake.vl["ES_Brake"]['Cruise_Activated'] != 0
+ ret.cruiseState.available = cp_cam.vl["ES_DashStatus"]['Cruise_On'] != 0
+ else:
+ ret.cruiseState.enabled = cp_cruise.vl["CruiseControl"]["Cruise_Activated"] != 0
+ ret.cruiseState.available = cp_cruise.vl["CruiseControl"]["Cruise_On"] != 0
+ ret.cruiseState.speed = cp_cam.vl["ES_DashStatus"]["Cruise_Set_Speed"] * CV.KPH_TO_MS
+
+ if (self.CP.flags & SubaruFlags.PREGLOBAL and cp.vl["Dash_State2"]["UNITS"] == 1) or \
+ (not (self.CP.flags & SubaruFlags.PREGLOBAL) and cp.vl["Dashlights"]["UNITS"] == 1):
+ ret.cruiseState.speed *= CV.MPH_TO_KPH
+
+ ret.seatbeltUnlatched = cp.vl["Dashlights"]["SEATBELT_FL"] == 1
+ ret.doorOpen = any([cp.vl["BodyInfo"]["DOOR_OPEN_RR"],
+ cp.vl["BodyInfo"]["DOOR_OPEN_RL"],
+ cp.vl["BodyInfo"]["DOOR_OPEN_FR"],
+ cp.vl["BodyInfo"]["DOOR_OPEN_FL"]])
+ ret.steerFaultPermanent = cp.vl["Steering_Torque"]["Steer_Error_1"] == 1
+
+ if self.CP.flags & SubaruFlags.PREGLOBAL:
+ self.cruise_button = cp_cam.vl["ES_Distance"]["Cruise_Button"]
+ self.ready = not cp_cam.vl["ES_DashStatus"]["Not_Ready_Startup"]
+ else:
+ ret.steerFaultTemporary = cp.vl["Steering_Torque"]["Steer_Warning"] == 1
+ ret.cruiseState.nonAdaptive = cp_cam.vl["ES_DashStatus"]["Conventional_Cruise"] == 1
+ ret.cruiseState.standstill = cp_cam.vl["ES_DashStatus"]["Cruise_State"] == 3
+ ret.stockFcw = (cp_cam.vl["ES_LKAS_State"]["LKAS_Alert"] == 1) or \
+ (cp_cam.vl["ES_LKAS_State"]["LKAS_Alert"] == 2)
+
+ self.es_lkas_state_msg = copy.copy(cp_cam.vl["ES_LKAS_State"])
+ self.es_brake_msg = copy.copy(cp_es_brake.vl["ES_Brake"])
+
+ # TODO: Hybrid cars don't have ES_Distance, need a replacement
+ if not (self.CP.flags & SubaruFlags.HYBRID):
+ # 8 is known AEB, there are a few other values related to AEB we ignore
+ ret.stockAeb = (cp_es_distance.vl["ES_Brake"]["AEB_Status"] == 8) and \
+ (cp_es_distance.vl["ES_Brake"]["Brake_Pressure"] != 0)
+
+ self.es_status_msg = copy.copy(cp_es_brake.vl["ES_Status"])
+ self.cruise_control_msg = copy.copy(cp_cruise.vl["CruiseControl"])
+
+ if not (self.CP.flags & SubaruFlags.HYBRID):
+ self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"])
+
+ self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"])
+ if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT:
+ self.es_infotainment_msg = copy.copy(cp_cam.vl["ES_Infotainment"])
+
+ AolCarState.update_aol(self, ret, can_parsers)
+ IQStopAndGoState.update(self, ret, can_parsers)
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus.main),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus.camera),
+ Bus.alt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus.alt)
+ }
diff --git a/iqdbc_repo/iqdbc/car/subaru/fingerprints.py b/iqdbc_repo/iqdbc/car/subaru/fingerprints.py
new file mode 100644
index 000000000..8cc65a171
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/fingerprints.py
@@ -0,0 +1,586 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.subaru.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.SUBARU_ASCENT: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa5 \x19\x02\x00',
+ b'\xa5 !\x02\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\x05\xc0\xd0\x00',
+ b'\x85\xc0\xd0\x00',
+ b'\x95\xc0\xd0\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00d\xb9\x00\x00\x00\x00',
+ b'\x00\x00d\xb9\x1f@ \x10',
+ b'\x00\x00e@\x00\x00\x00\x00',
+ b'\x00\x00e@\x1f@ $',
+ b"\x00\x00e~\x1f@ '",
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xbb,\xa0t\x07',
+ b'\xd1,\xa0q\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\x00>\xf0\x00\x00',
+ b'\x00\xfe\xf7\x00\x00',
+ b'\x01\xfe\xf7\x00\x00',
+ b'\x01\xfe\xf9\x00\x00',
+ b'\x01\xfe\xfa\x00\x00',
+ ],
+ },
+ CAR.SUBARU_ASCENT_2023: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa5 #\x03\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'%\xc0\xd0\x11',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x05!\x08\x1dK\x05!\x08\x01/',
+ ],
+ (Ecu.engine, 0x7a2, None): [
+ b'\xe5,\xa0P\x07',
+ ],
+ (Ecu.transmission, 0x7a3, None): [
+ b'\x04\xfe\xf3\x00\x00',
+ ],
+ },
+ CAR.SUBARU_LEGACY: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa1 \x02\x01',
+ b'\xa1 \x02\x02',
+ b'\xa1 \x03\x02',
+ b'\xa1 \x03\x03',
+ b'\xa1 \x04\x01',
+ b'\xa1 \x04\x02',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\x9b\xc0\x11\x00',
+ b'\x9b\xc0\x11\x02',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00e\x80\x00\x1f@ \x19\x00',
+ b'\x00\x00e\x9a\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xde"a0\x07',
+ b'\xde,\xa0@\x07',
+ b'\xe2"a0\x07',
+ b'\xe2"ap\x07',
+ b'\xe2"aq\x07',
+ b'\xe2,\xa0@\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xa5\xf6\x05@\x00',
+ b'\xa5\xfe\xc7@\x00',
+ b'\xa7\xf6\x04@\x00',
+ b'\xa7\xfe\xc4@\x00',
+ ],
+ },
+ CAR.SUBARU_IMPREZA: {
+ (Ecu.abs, 0x7b0, None): [
+ b'z\x84\x19\x90\x00',
+ b'z\x94\x08\x90\x00',
+ b'z\x94\x08\x90\x01',
+ b'z\x94\x0c\x90\x00',
+ b'z\x94\x0c\x90\x01',
+ b'z\x94.\x90\x00',
+ b'z\x94?\x90\x00',
+ b'z\x9c\x19\x80\x01',
+ b'\xa2 \x185\x00',
+ b'\xa2 \x193\x00',
+ b'\xa2 \x194\x00',
+ b'\xa2 \x19`\x00',
+ b'\xa2 5\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'z\xc0\x00\x00',
+ b'z\xc0\x04\x00',
+ b'z\xc0\x08\x00',
+ b'z\xc0\n\x00',
+ b'z\xc0\x0c\x00',
+ b'\x8a\xc0\x00\x00',
+ b'\x8a\xc0\x10\x00',
+ b'\x9a\xc0\x08\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00c\xf4\x00\x00\x00\x00',
+ b'\x00\x00c\xf4\x1f@ \x07',
+ b'\x00\x00d)\x00\x00\x00\x00',
+ b'\x00\x00d)\x1f@ \x07',
+ b'\x00\x00dd\x00\x00\x00\x00',
+ b'\x00\x00dd\x1f@ \x0e',
+ b'\x00\x00d\xb5\x1f@ \x0e',
+ b'\x00\x00d\xdc\x00\x00\x00\x00',
+ b'\x00\x00d\xdc\x1f@ \x0e',
+ b'\x00\x00e\x02\x1f@ \x14',
+ b'\x00\x00e\x1c\x00\x00\x00\x00',
+ b'\x00\x00e\x1c\x1f@ \x14',
+ b'\x00\x00e+\x00\x00\x00\x00',
+ b'\x00\x00e+\x1f@ \x14',
+ b'\x00\x00eq\x1f@ "',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xaa\x00Bu\x07',
+ b'\xaa\x01bt\x07',
+ b'\xaa\x01fr\x07',
+ b'\xaa!`u\x07',
+ b'\xaa!au\x07',
+ b'\xaa!av\x07',
+ b'\xaa!aw\x07',
+ b'\xaa!dq\x07',
+ b'\xaa!ds\x07',
+ b'\xaa!dt\x07',
+ b'\xaaafs\x07',
+ b'\xbe!as\x07',
+ b'\xbe!at\x07',
+ b'\xbeacr\x07',
+ b'\xc5!`r\x07',
+ b'\xc5!`s\x07',
+ b'\xc5!ap\x07',
+ b'\xc5!ar\x07',
+ b'\xc5!as\x07',
+ b'\xc5!au\x07',
+ b'\xc5!dr\x07',
+ b'\xc5!ds\x07',
+ b'\xca\x01b0\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xe3\xd0\x081\x00',
+ b'\xe3\xd5\x161\x00',
+ b'\xe3\xd5F1\x00',
+ b'\xe3\xe5F1\x00',
+ b'\xe3\xf5\x06\x00\x00',
+ b'\xe3\xf5\x07\x00\x00',
+ b'\xe3\xf5C\x00\x00',
+ b'\xe3\xf5F\x00\x00',
+ b'\xe3\xf5G\x00\x00',
+ b'\xe4\xe5\x021\x00',
+ b'\xe4\xe5\x061\x00',
+ b'\xe4\xf5\x02\x00\x00',
+ b'\xe4\xf5\x07\x00\x00',
+ b'\xe5\xf5\x04\x00\x00',
+ b'\xe5\xf5$\x00\x00',
+ b'\xe5\xf5B\x00\x00',
+ b'\xe6\xd5\x041\x00',
+ ],
+ },
+ CAR.SUBARU_IMPREZA_2020: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa2 \x193\x00',
+ b'\xa2 \x194\x00',
+ b'\xa2 `\x00',
+ b'\xa2 !3\x00',
+ b'\xa2 !6\x00',
+ b'\xa2 !`\x00',
+ b'\xa2 !i\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\n\xc0\x04\x00',
+ b'\n\xc0\x04\x01',
+ b'\x9a\xc0\x00\x00',
+ b'\x9a\xc0\x04\x00',
+ b'\x9a\xc0\n\x01',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00eb\x1f@ "',
+ b'\x00\x00eq\x00\x00\x00\x00',
+ b'\x00\x00eq\x1f@ "',
+ b'\x00\x00e\x8f\x00\x00\x00\x00',
+ b'\x00\x00e\x8f\x1f@ )',
+ b'\x00\x00e\x92\x00\x00\x00\x00',
+ b'\x00\x00e\xa4\x00\x00\x00\x00',
+ b'\x00\x00e\xa4\x1f@ (',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xca!`0\x07',
+ b'\xca!`p\x07',
+ b'\xca!`t\x07',
+ b'\xca!a0\x07',
+ b'\xca!ap\x07',
+ b'\xca!f@\x07',
+ b'\xca!fp\x07',
+ b'\xcaacp\x07',
+ b'\xcc!`p\x07',
+ b'\xcc!fp\x07',
+ b'\xcc"f0\x07',
+ b'\xe6!`@\x07',
+ b'\xe6!fp\x07',
+ b'\xe6"f0\x07',
+ b'\xe6"fp\x07',
+ b'\xf3"f@\x07',
+ b'\xf3"fp\x07',
+ b'\xf3"fr\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xe6\x15\x042\x00',
+ b'\xe6\xf5\x04\x00\x00',
+ b'\xe6\xf5$\x00\x00',
+ b'\xe6\xf5D0\x00',
+ b'\xe7\xf5\x04\x00\x00',
+ b'\xe7\xf5D0\x00',
+ b'\xe7\xf6B0\x00',
+ b'\xe9\xf5"\x00\x00',
+ b'\xe9\xf5B0\x00',
+ b'\xe9\xf6B0\x00',
+ b'\xe9\xf6F0\x00',
+ ],
+ },
+ CAR.SUBARU_CROSSTREK_HYBRID: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa2 \x19e\x01',
+ b'\xa2 !e\x01',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\n\xc2\x01\x00',
+ b'\x9a\xc2\x01\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00el\x1f@ #',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xd7!`@\x07',
+ b'\xd7!`p\x07',
+ b'\xf4!`0\x07',
+ ],
+ },
+ CAR.SUBARU_FORESTER: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa3 \x18\x14\x00',
+ b'\xa3 \x18&\x00',
+ b'\xa3 \x19\x14\x00',
+ b'\xa3 \x19&\x00',
+ b'\xa3 \x19h\x00',
+ b'\xa3 \x14\x00',
+ b'\xa3 \x14\x01',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\x8d\xc0\x00\x00',
+ b'\x8d\xc0\x04\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00e!\x00\x00\x00\x00',
+ b'\x00\x00e!\x1f@ \x11',
+ b'\x00\x00e^\x00\x00\x00\x00',
+ b'\x00\x00e^\x1f@ !',
+ b'\x00\x00e`\x00\x00\x00\x00',
+ b'\x00\x00e`\x1f@ ',
+ b'\x00\x00e\x97\x00\x00\x00\x00',
+ b'\x00\x00e\x97\x1f@ 0',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xb6"`A\x07',
+ b'\xb6\xa2`A\x07',
+ b'\xcb"`@\x07',
+ b'\xcb"`p\x07',
+ b'\xcf"`0\x07',
+ b'\xcf"`p\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\x1a\xe6B1\x00',
+ b'\x1a\xe6F1\x00',
+ b'\x1a\xf6B0\x00',
+ b'\x1a\xf6B`\x00',
+ b'\x1a\xf6F`\x00',
+ b'\x1a\xf6b0\x00',
+ b'\x1a\xf6b`\x00',
+ b'\x1a\xf6f`\x00',
+ ],
+ },
+ CAR.SUBARU_FORESTER_HYBRID: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa3 \x19T\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\x8d\xc2\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00eY\x1f@ !',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xd2\xa1`r\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\x1b\xa7@a\x00',
+ ],
+ },
+ CAR.SUBARU_FORESTER_PREGLOBAL: {
+ (Ecu.abs, 0x7b0, None): [
+ b'm\x97\x14@',
+ b'}\x97\x14@',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'm\xc0\x10\x00',
+ b'}\xc0\x10\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00c\xe9\x00\x00\x00\x00',
+ b'\x00\x00c\xe9\x1f@ \x03',
+ b'\x00\x00d5\x1f@ \t',
+ b'\x00\x00d\xd3\x1f@ \t',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xa7"@0\x07',
+ b'\xa7"@p\x07',
+ b'\xa7)\xa0q\x07',
+ b'\xba"@@\x07',
+ b'\xba"@p\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\x1a\xf6F`\x00',
+ b'\xda\xf2`p\x00',
+ b'\xda\xf2`\x80\x00',
+ b'\xda\xfd\xe0\x80\x00',
+ b'\xdc\xf2@`\x00',
+ b'\xdc\xf2``\x00',
+ b'\xdc\xf2`\x80\x00',
+ b'\xdc\xf2`\x81\x00',
+ ],
+ },
+ CAR.SUBARU_LEGACY_PREGLOBAL: {
+ (Ecu.abs, 0x7b0, None): [
+ b'[\x97D\x00',
+ b'[\xba\xc4\x03',
+ b'k\x97D\x00',
+ b'k\x9aD\x00',
+ b'{\x97D\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'K\xb0\x00\x01',
+ b'[\xb0\x00\x01',
+ b'k\xb0\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00c\x94\x1f@\x10\x08',
+ b'\x00\x00c\xb7\x1f@\x10\x16',
+ b'\x00\x00c\xec\x1f@ \x04',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xa0"@q\x07',
+ b'\xa0+@p\x07',
+ b'\xab*@r\x07',
+ b'\xab+@p\x07',
+ b'\xb4"@0\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xbd\xf2\x00`\x00',
+ b'\xbe\xf2\x00p\x00',
+ b'\xbe\xfb\xc0p\x00',
+ b'\xbf\xf2\x00\x80\x00',
+ b'\xbf\xfb\xc0\x80\x00',
+ ],
+ },
+ CAR.SUBARU_OUTBACK_PREGLOBAL: {
+ (Ecu.abs, 0x7b0, None): [
+ b'[\xba\xac\x03',
+ b'[\xf7\xac\x00',
+ b'[\xf7\xac\x03',
+ b'[\xf7\xbc\x03',
+ b'k\x97\xac\x00',
+ b'k\x9a\xac\x00',
+ b'{\x97\xac\x00',
+ b'{\x9a\xac\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'K\xb0\x00\x00',
+ b'K\xb0\x00\x02',
+ b'[\xb0\x00\x00',
+ b'k\xb0\x00\x00',
+ b'{\xb0\x00\x01',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00c\x90\x1f@\x10\x0e',
+ b'\x00\x00c\x94\x00\x00\x00\x00',
+ b'\x00\x00c\x94\x1f@\x10\x08',
+ b'\x00\x00c\xb7\x1f@\x10\x16',
+ b'\x00\x00c\xd1\x1f@\x10\x17',
+ b'\x00\x00c\xec\x1f@ \x04',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xa0"@\x80\x07',
+ b'\xa0*@q\x07',
+ b'\xa0*@u\x07',
+ b'\xa0+@@\x07',
+ b'\xa0bAq\x07',
+ b'\xab"@@\x07',
+ b'\xab"@s\x07',
+ b'\xab*@@\x07',
+ b'\xab+@@\x07',
+ b'\xb4"@0\x07',
+ b'\xb4"@p\x07',
+ b'\xb4"@r\x07',
+ b'\xb4+@p\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xbd\xf2@`\x00',
+ b'\xbd\xf2@\x81\x00',
+ b'\xbd\xfb\xe0\x80\x00',
+ b'\xbe\xf2@p\x00',
+ b'\xbe\xf2@\x80\x00',
+ b'\xbe\xfb\xe0p\x00',
+ b'\xbf\xe2@\x80\x00',
+ b'\xbf\xf2@\x80\x00',
+ b'\xbf\xfb\xe0b\x00',
+ ],
+ },
+ CAR.SUBARU_OUTBACK_PREGLOBAL_2018: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\x8b\x97\xac\x00',
+ b'\x8b\x97\xbc\x00',
+ b'\x8b\x99\xac\x00',
+ b'\x8b\x9a\xac\x00',
+ b'\x9b\x97\xac\x00',
+ b'\x9b\x97\xbe\x10',
+ b'\x9b\x9a\xac\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'{\xb0\x00\x00',
+ b'{\xb0\x00\x01',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00df\x1f@ \n',
+ b'\x00\x00d\x95\x00\x00\x00\x00',
+ b'\x00\x00d\x95\x1f@ \x0f',
+ b'\x00\x00d\xfe\x00\x00\x00\x00',
+ b'\x00\x00d\xfe\x1f@ \x15',
+ b'\x00\x00e\x19\x1f@ \x15',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xb5"@P\x07',
+ b'\xb5"@p\x07',
+ b'\xb5+@@\x07',
+ b'\xb5b@1\x07',
+ b'\xb5q\xe0@\x07',
+ b'\xc4"@0\x07',
+ b'\xc4+@0\x07',
+ b'\xc4b@p\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xbb\xf2@`\x00',
+ b'\xbb\xfb\xe0`\x00',
+ b'\xbc\xaf\xe0`\x00',
+ b'\xbc\xe2@\x80\x00',
+ b'\xbc\xf2@\x80\x00',
+ b'\xbc\xf2@\x81\x00',
+ b'\xbc\xfb\xe0`\x00',
+ b'\xbc\xfb\xe0\x80\x00',
+ ],
+ },
+ CAR.SUBARU_OUTBACK: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa1 \x06\x00',
+ b'\xa1 \x06\x01',
+ b'\xa1 \x06\x02',
+ b'\xa1 \x06\x03',
+ b'\xa1 \x07\x00',
+ b'\xa1 \x07\x01',
+ b'\xa1 \x07\x02',
+ b'\xa1 \x07\x03',
+ b'\xa1 \x08\x00',
+ b'\xa1 \x08\x01',
+ b'\xa1 \x08\x02',
+ b'\xa1 "\t\x00',
+ b'\xa1 "\t\x01',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'\x1b\xc0\x10\x00',
+ b'\x9b\xc0\x10\x00',
+ b'\x9b\xc0\x10\x02',
+ b'\x9b\xc0 \x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\x00\x00eJ\x00\x00\x00\x00\x00\x00',
+ b'\x00\x00eJ\x00\x1f@ \x19\x00',
+ b'\x00\x00e\x80\x00\x1f@ \x19\x00',
+ b'\x00\x00e\x9a\x00\x00\x00\x00\x00\x00',
+ b'\x00\x00e\x9a\x00\x1f@ 1\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\xbc"`@\x07',
+ b'\xbc"`q\x07',
+ b'\xbc,\xa0q\x07',
+ b'\xbc,\xa0u\x07',
+ b'\xde"`0\x07',
+ b'\xde,\xa0@\x07',
+ b'\xe2"`0\x07',
+ b'\xe2"`p\x07',
+ b'\xe2"`q\x07',
+ b'\xe2"`t\x07',
+ b'\xe2,\xa0p\x07',
+ b'\xe3,\xa0@\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xa5\xf6D@\x00',
+ b'\xa5\xfe\xf6@\x00',
+ b'\xa5\xfe\xf7@\x00',
+ b'\xa5\xfe\xf8@\x00',
+ b'\xa7\x8e\xf40\x00',
+ b'\xa7\xf6D@\x00',
+ b'\xa7\xfe\xf4@\x00',
+ b'\xa7\xfe\xf6@\x00',
+ ],
+ },
+ CAR.SUBARU_FORESTER_2022: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa3 !v\x00',
+ b'\xa3 !x\x00',
+ b'\xa3 "v\x00',
+ b'\xa3 "x\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'-\xc0\x040',
+ b'-\xc0%0',
+ b'=\xc0%\x02',
+ b'=\xc04\x02',
+ ],
+ (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): [
+ b'\xd5"`0\x07',
+ b'\xd5"a0\x07',
+ b'\xf1"`q\x07',
+ b'\xf1"aq\x07',
+ b'\xfa"`p\x07',
+ b'\xfa"ap\x07',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\x1d\x86B0\x00',
+ b'\x1d\xf6B0\x00',
+ b'\x1e\x86B0\x00',
+ b'\x1e\x86F0\x00',
+ b'\x1e\xf6D0\x00',
+ b'\x1f\xf6B1\x00',
+ ],
+ },
+ CAR.SUBARU_OUTBACK_2023: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\xa1 #\x14\x00',
+ b'\xa1 #\x17\x00',
+ ],
+ (Ecu.eps, 0x746, None): [
+ b'+\xc0\x10\x11\x00',
+ b'+\xc0\x12\x11\x00',
+ ],
+ (Ecu.fwdCamera, 0x787, None): [
+ b'\t!\x08\x046\x05!\x08\x01/',
+ ],
+ (Ecu.engine, 0x7a2, None): [
+ b'\xed,\xa0q\x07',
+ b'\xed,\xa2q\x07',
+ ],
+ (Ecu.transmission, 0x7a3, None): [
+ b'\xa8\x8e\xf41\x00',
+ b'\xa8\xfe\xf41\x00',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/subaru/interface.py b/iqdbc_repo/iqdbc/car/subaru/interface.py
new file mode 100644
index 000000000..9cf2f83d4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/interface.py
@@ -0,0 +1,122 @@
+from iqdbc.car import get_safety_config, structs, uds
+from iqdbc.car.disable_ecu import disable_ecu
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.subaru.carcontroller import CarController
+from iqdbc.car.subaru.carstate import CarState
+from iqdbc.car.subaru.values import CAR, GLOBAL_ES_ADDR, SubaruFlags, SubaruSafetyFlags
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "subaru"
+ ret.radarUnavailable = True
+ # for HYBRID CARS to be upstreamed, we need:
+ # - replacement for ES_Distance so we can cancel the cruise control
+ # - to find the Cruise_Activated bit from the car
+ # - proper panda safety setup (use the correct cruise_activated bit, throttle from Throttle_Hybrid, etc)
+ ret.dashcamOnly = bool(ret.flags & (SubaruFlags.PREGLOBAL | SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID))
+ ret.autoResumeSng = False
+
+ # Detect infotainment message sent from the camera
+ if not (ret.flags & SubaruFlags.PREGLOBAL) and 0x323 in fingerprint[2]:
+ ret.flags |= SubaruFlags.SEND_INFOTAINMENT.value
+
+ if ret.flags & SubaruFlags.PREGLOBAL:
+ ret.enableBsm = 0x25c in fingerprint[0]
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.subaruPreglobal)]
+ else:
+ 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.steerLimitTimer = 0.4
+ ret.steerActuatorDelay = 0.1
+
+ if not (ret.flags & SubaruFlags.LKAS_ANGLE):
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ if ret.flags & SubaruFlags.LKAS_ANGLE:
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+
+ elif candidate == CAR.SUBARU_ASCENT:
+ ret.steerActuatorDelay = 0.3 # end-to-end angle controller
+ ret.lateralTuning.init('pid')
+ ret.lateralTuning.pid.kf = 0.00003
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 20.], [0., 20.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.0025, 0.1], [0.00025, 0.01]]
+
+ elif candidate == CAR.SUBARU_IMPREZA:
+ ret.steerActuatorDelay = 0.4 # end-to-end angle controller
+ ret.lateralTuning.init('pid')
+ ret.lateralTuning.pid.kf = 0.00005
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 20.], [0., 20.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2, 0.3], [0.02, 0.03]]
+
+ elif candidate == CAR.SUBARU_IMPREZA_2020:
+ ret.lateralTuning.init('pid')
+ ret.lateralTuning.pid.kf = 0.00005
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.045, 0.042, 0.20], [0.04, 0.035, 0.045]]
+
+ elif candidate == CAR.SUBARU_CROSSTREK_HYBRID:
+ ret.steerActuatorDelay = 0.1
+
+ elif candidate in (CAR.SUBARU_FORESTER, CAR.SUBARU_FORESTER_HYBRID):
+ ret.lateralTuning.init('pid')
+ ret.lateralTuning.pid.kf = 0.000038
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.01, 0.065, 0.2], [0.001, 0.015, 0.025]]
+
+ elif candidate in (CAR.SUBARU_OUTBACK, CAR.SUBARU_LEGACY):
+ ret.steerActuatorDelay = 0.1
+
+ 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
+
+ elif candidate == CAR.SUBARU_LEGACY_PREGLOBAL:
+ ret.steerActuatorDelay = 0.15
+
+ elif candidate == CAR.SUBARU_OUTBACK_PREGLOBAL:
+ pass
+ else:
+ raise ValueError(f"unknown car: {candidate}")
+
+ ret.alphaLongitudinalAvailable = not (ret.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL |
+ SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID))
+ ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable
+
+ if ret.flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl:
+ ret.flags |= SubaruFlags.DISABLE_EYESIGHT.value
+
+ if ret.openpilotLongitudinalControl:
+ ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.LONG.value
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ stock_cp.dashcamOnly = bool(stock_cp.flags & (SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID))
+
+ if not stock_cp.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID):
+ stock_cp.autoResumeSng = True
+
+ return ret
+
+ @staticmethod
+ def init(CP, CP_IQ, can_recv, can_send, communication_control=None):
+ if CP.flags & SubaruFlags.DISABLE_EYESIGHT:
+ if communication_control is None:
+ communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.DISABLE_RX_DISABLE_TX, uds.MESSAGE_TYPE.NORMAL])
+ disable_ecu(can_recv, can_send, bus=2, addr=GLOBAL_ES_ADDR, com_cont_req=communication_control)
+
+ @staticmethod
+ def deinit(CP, can_recv, can_send):
+ communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_ENABLE_TX, uds.MESSAGE_TYPE.NORMAL])
+ CarInterface.init(CP, can_recv, can_send, communication_control)
diff --git a/iqdbc_repo/iqdbc/car/subaru/subarucan.py b/iqdbc_repo/iqdbc/car/subaru/subarucan.py
new file mode 100644
index 000000000..932dff0a0
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/subarucan.py
@@ -0,0 +1,337 @@
+from iqdbc.car import structs
+from iqdbc.car.subaru.values import CanBus
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+
+
+def create_steering_control(packer, apply_torque, steer_req):
+ values = {
+ "LKAS_Output": apply_torque,
+ "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):
+ values = {
+ "LKAS_Output": apply_torque,
+ "LKAS_Request": steer_req,
+ "SET_3": 3
+ }
+ return packer.make_can_msg("ES_LKAS_ANGLE", 0, values)
+
+
+def create_steering_status(packer):
+ return packer.make_can_msg("ES_LKAS_State", 0, {})
+
+
+def create_es_distance(packer, frame, es_distance_msg, bus, pcm_cancel_cmd, long_enabled = False, brake_cmd = False, cruise_throttle = 0):
+ values = {s: es_distance_msg[s] for s in [
+ "CHECKSUM",
+ "Signal1",
+ "Cruise_Fault",
+ "Cruise_Throttle",
+ "Signal2",
+ "Car_Follow",
+ "Low_Speed_Follow",
+ "Cruise_Soft_Disable",
+ "Signal7",
+ "Cruise_Brake_Active",
+ "Distance_Swap",
+ "Cruise_EPB",
+ "Signal4",
+ "Close_Distance",
+ "Signal5",
+ "Cruise_Cancel",
+ "Cruise_Set",
+ "Cruise_Resume",
+ "Signal6",
+ ]}
+
+ values["COUNTER"] = frame % 0x10
+
+ if long_enabled:
+ values["Cruise_Throttle"] = cruise_throttle
+
+ # Do not disable openpilot on Eyesight Soft Disable, if openpilot is controlling long
+ values["Cruise_Soft_Disable"] = 0
+ values["Cruise_Fault"] = 0
+
+ values["Cruise_Brake_Active"] = brake_cmd
+
+ if pcm_cancel_cmd:
+ values["Cruise_Cancel"] = 1
+ values["Cruise_Throttle"] = 1818 # inactive throttle
+
+ return packer.make_can_msg("ES_Distance", bus, values)
+
+
+def create_es_lkas_state(packer, frame, es_lkas_state_msg, enabled, visual_alert, left_line, right_line, left_lane_depart, right_lane_depart):
+ values = {s: es_lkas_state_msg[s] for s in [
+ "CHECKSUM",
+ "LKAS_Alert_Msg",
+ "Signal1",
+ "LKAS_ACTIVE",
+ "LKAS_Dash_State",
+ "Signal2",
+ "Backward_Speed_Limit_Menu",
+ "LKAS_Left_Line_Enable",
+ "LKAS_Left_Line_Light_Blink",
+ "LKAS_Right_Line_Enable",
+ "LKAS_Right_Line_Light_Blink",
+ "LKAS_Left_Line_Visible",
+ "LKAS_Right_Line_Visible",
+ "LKAS_Alert",
+ "Signal3",
+ ]}
+
+ values["COUNTER"] = frame % 0x10
+
+ # Filter the stock LKAS "Keep hands on wheel" alert
+ if values["LKAS_Alert_Msg"] == 1:
+ values["LKAS_Alert_Msg"] = 0
+
+ # Filter the stock LKAS sending an audible alert when it turns off LKAS
+ if values["LKAS_Alert"] == 27:
+ values["LKAS_Alert"] = 0
+
+ # Filter the stock LKAS sending an audible alert when "Keep hands on wheel" alert is active (2020+ models)
+ if values["LKAS_Alert"] == 28 and values["LKAS_Alert_Msg"] == 7:
+ values["LKAS_Alert"] = 0
+
+ # Filter the stock LKAS sending an audible alert when "Keep hands on wheel OFF" alert is active (2020+ models)
+ if values["LKAS_Alert"] == 30:
+ values["LKAS_Alert"] = 0
+
+ # Filter the stock LKAS sending "Keep hands on wheel OFF" alert (2020+ models)
+ if values["LKAS_Alert_Msg"] == 7:
+ values["LKAS_Alert_Msg"] = 0
+
+ # Show Keep hands on wheel alert for openpilot steerRequired alert
+ if visual_alert == VisualAlert.steerRequired:
+ values["LKAS_Alert_Msg"] = 1
+
+ # Ensure we don't overwrite potentially more important alerts from stock (e.g. FCW)
+ if visual_alert == VisualAlert.ldw and values["LKAS_Alert"] == 0:
+ if left_lane_depart:
+ values["LKAS_Alert"] = 12 # Left lane departure dash alert
+ elif right_lane_depart:
+ values["LKAS_Alert"] = 11 # Right lane departure dash alert
+
+ if enabled:
+ values["LKAS_ACTIVE"] = 1 # Show LKAS lane lines
+ values["LKAS_Dash_State"] = 2 # Green enabled indicator
+ else:
+ values["LKAS_Dash_State"] = 0 # LKAS Not enabled
+
+ values["LKAS_Left_Line_Visible"] = int(left_line)
+ values["LKAS_Right_Line_Visible"] = int(right_line)
+
+ return packer.make_can_msg("ES_LKAS_State", CanBus.main, values)
+
+
+def create_es_dashstatus(packer, frame, dashstatus_msg, enabled, long_enabled, long_active, lead_visible):
+ values = {s: dashstatus_msg[s] for s in [
+ "CHECKSUM",
+ "PCB_Off",
+ "LDW_Off",
+ "Signal1",
+ "Cruise_State_Msg",
+ "LKAS_State_Msg",
+ "Signal2",
+ "Cruise_Soft_Disable",
+ "Cruise_Status_Msg",
+ "Signal3",
+ "Cruise_Distance",
+ "Signal4",
+ "Conventional_Cruise",
+ "Signal5",
+ "Cruise_Disengaged_Dash",
+ "Cruise_Activated_Dash",
+ "Signal6",
+ "Cruise_Set_Speed",
+ "Cruise_Fault",
+ "Cruise_On",
+ "Display_Own_Car",
+ "Brake_Lights",
+ "Car_Follow",
+ "Signal7",
+ "Far_Distance",
+ "Cruise_State",
+ ]}
+
+ values["COUNTER"] = frame % 0x10
+
+ if long_enabled:
+ values["Cruise_State"] = 0
+ # TODO: Cruise_Activated_dash should respect gas pressed and standstill stock behavior
+ values["Cruise_Activated_Dash"] = enabled
+ values["Cruise_Disengaged_Dash"] = 0
+ values["Car_Follow"] = int(lead_visible)
+
+ values["PCB_Off"] = 1 # AEB is not presevered, so show the PCB_Off on dash
+ values["LDW_Off"] = 0
+ values["Cruise_Fault"] = 0
+
+ # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts
+ if values["LKAS_State_Msg"] in (2, 3):
+ values["LKAS_State_Msg"] = 0
+
+ return packer.make_can_msg("ES_DashStatus", CanBus.main, values)
+
+
+def create_es_brake(packer, frame, es_brake_msg, long_enabled, long_active, brake_value):
+ values = {s: es_brake_msg[s] for s in [
+ "CHECKSUM",
+ "Signal1",
+ "Brake_Pressure",
+ "AEB_Status",
+ "Cruise_Brake_Lights",
+ "Cruise_Brake_Fault",
+ "Cruise_Brake_Active",
+ "Cruise_Activated",
+ "Signal3",
+ ]}
+
+ values["COUNTER"] = frame % 0x10
+
+ if long_enabled:
+ values["Cruise_Brake_Fault"] = 0
+ values["Cruise_Activated"] = long_active
+
+ values["Brake_Pressure"] = brake_value
+
+ values["Cruise_Brake_Active"] = brake_value > 0
+ values["Cruise_Brake_Lights"] = brake_value >= 70
+
+ return packer.make_can_msg("ES_Brake", CanBus.main, values)
+
+
+def create_es_status(packer, frame, es_status_msg, long_enabled, long_active, cruise_rpm):
+ values = {s: es_status_msg[s] for s in [
+ "CHECKSUM",
+ "Signal1",
+ "Cruise_Fault",
+ "Cruise_RPM",
+ "Cruise_Activated",
+ "Brake_Lights",
+ "Cruise_Hold",
+ "Signal3",
+ ]}
+
+ values["COUNTER"] = frame % 0x10
+
+ if long_enabled:
+ values["Cruise_RPM"] = cruise_rpm
+ values["Cruise_Fault"] = 0
+
+ values["Cruise_Activated"] = long_active
+
+ return packer.make_can_msg("ES_Status", CanBus.main, values)
+
+
+def create_es_infotainment(packer, frame, es_infotainment_msg, visual_alert):
+ # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts
+ values = {s: es_infotainment_msg[s] for s in [
+ "CHECKSUM",
+ "LKAS_State_Infotainment",
+ "LKAS_Blue_Lines",
+ "Signal1",
+ "Signal2",
+ ]}
+
+ values["COUNTER"] = frame % 0x10
+
+ if values["LKAS_State_Infotainment"] in (3, 4):
+ values["LKAS_State_Infotainment"] = 0
+
+ # Show Keep hands on wheel alert for openpilot steerRequired alert
+ if visual_alert == VisualAlert.steerRequired:
+ values["LKAS_State_Infotainment"] = 3
+
+ # Show Obstacle Detected for fcw
+ if visual_alert == VisualAlert.fcw:
+ values["LKAS_State_Infotainment"] = 2
+
+ return packer.make_can_msg("ES_Infotainment", CanBus.main, values)
+
+
+def create_es_highbeamassist(packer):
+ values = {
+ "HBA_Available": False,
+ }
+
+ return packer.make_can_msg("ES_HighBeamAssist", CanBus.main, values)
+
+
+def create_es_static_1(packer):
+ values = {
+ "SET_3": 3,
+ }
+
+ return packer.make_can_msg("ES_STATIC_1", CanBus.main, values)
+
+
+def create_es_static_2(packer):
+ values = {
+ "SET_3": 3,
+ }
+
+ return packer.make_can_msg("ES_STATIC_2", CanBus.main, values)
+
+
+# *** Subaru Pre-global ***
+
+def subaru_preglobal_checksum(packer, values, addr, checksum_byte=7):
+ dat = packer.make_can_msg(addr, 0, values)[1]
+ return (sum(dat[:checksum_byte]) + sum(dat[checksum_byte+1:])) % 256
+
+
+def create_preglobal_steering_control(packer, frame, apply_torque, steer_req):
+ values = {
+ "COUNTER": frame % 0x08,
+ "LKAS_Command": apply_torque,
+ "LKAS_Active": steer_req,
+ }
+ values["Checksum"] = subaru_preglobal_checksum(packer, values, "ES_LKAS")
+
+ return packer.make_can_msg("ES_LKAS", CanBus.main, values)
+
+
+def create_preglobal_es_distance(packer, cruise_button, es_distance_msg):
+ values = {s: es_distance_msg[s] for s in [
+ "Cruise_Throttle",
+ "Signal1",
+ "Car_Follow",
+ "Signal2",
+ "Cruise_Brake_Active",
+ "Distance_Swap",
+ "Standstill",
+ "Signal3",
+ "Close_Distance",
+ "Signal4",
+ "Standstill_2",
+ "Cruise_Fault",
+ "Signal5",
+ "COUNTER",
+ "Signal6",
+ "Cruise_Button",
+ "Signal7",
+ ]}
+
+ values["Cruise_Button"] = cruise_button
+ values["Checksum"] = subaru_preglobal_checksum(packer, values, "ES_Distance")
+
+ return packer.make_can_msg("ES_Distance", CanBus.main, values)
+
+
+def subaru_checksum(address: int, sig, d: bytearray) -> int:
+ s = 0
+ addr = address
+ while addr:
+ s += addr & 0xFF
+ addr >>= 8
+ for i in range(1, len(d)):
+ s += d[i]
+ return s & 0xFF
diff --git a/iqdbc_repo/iqdbc/car/subaru/tests/__init__.py b/iqdbc_repo/iqdbc/car/subaru/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/subaru/tests/test_subaru.py b/iqdbc_repo/iqdbc/car/subaru/tests/test_subaru.py
new file mode 100644
index 000000000..142705b39
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/tests/test_subaru.py
@@ -0,0 +1,10 @@
+from iqdbc.car.subaru.fingerprints import FW_VERSIONS
+
+
+class TestSubaruFingerprint:
+ def test_fw_version_format(self):
+ for platform, fws_per_ecu in FW_VERSIONS.items():
+ for (ecu, _, _), fws in fws_per_ecu.items():
+ fw_size = len(fws[0])
+ for fw in fws:
+ assert len(fw) == fw_size, f"{platform} {ecu}: {len(fw)} {fw_size}"
diff --git a/iqdbc_repo/iqdbc/car/subaru/values.py b/iqdbc_repo/iqdbc/car/subaru/values.py
new file mode 100644
index 000000000..88ef05660
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/subaru/values.py
@@ -0,0 +1,279 @@
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
+
+Ecu = CarParams.Ecu
+
+
+class CarControllerParams:
+ def __init__(self, CP):
+ self.STEER_STEP = 2 # how often we update the steer cmd
+ self.STEER_DELTA_UP = 50 # torque increase per refresh, 0.8s to max
+ self.STEER_DELTA_DOWN = 70 # torque decrease per refresh
+ self.STEER_DRIVER_ALLOWANCE = 60 # allowed driver torque before start limiting
+ self.STEER_DRIVER_MULTIPLIER = 50 # weight driver torque heavily
+ self.STEER_DRIVER_FACTOR = 1 # from dbc
+
+ if CP.flags & SubaruFlags.GLOBAL_GEN2:
+ self.STEER_MAX = 1500
+ self.STEER_DELTA_UP = 35
+ self.STEER_DELTA_DOWN = 50
+ elif CP.carFingerprint == CAR.SUBARU_IMPREZA_2020:
+ self.STEER_DELTA_UP = 35
+ self.STEER_MAX = 1439
+ else:
+ self.STEER_MAX = 2047
+
+ THROTTLE_MIN = 808
+ THROTTLE_MAX = 3400
+
+ THROTTLE_INACTIVE = 1818 # corresponds to zero acceleration
+ THROTTLE_ENGINE_BRAKE = 808 # while braking, eyesight sets throttle to this, probably for engine braking
+
+ BRAKE_MIN = 0
+ BRAKE_MAX = 600 # about -3.5m/s2 from testing
+
+ RPM_MIN = 0
+ RPM_MAX = 3600
+
+ RPM_INACTIVE = 600 # a good base rpm for zero acceleration
+
+ THROTTLE_LOOKUP_BP = [0, 2]
+ THROTTLE_LOOKUP_V = [THROTTLE_INACTIVE, THROTTLE_MAX]
+
+ RPM_LOOKUP_BP = [0, 2]
+ RPM_LOOKUP_V = [RPM_INACTIVE, RPM_MAX]
+
+ BRAKE_LOOKUP_BP = [-3.5, 0]
+ BRAKE_LOOKUP_V = [BRAKE_MAX, BRAKE_MIN]
+
+
+class SubaruSafetyFlags(IntFlag):
+ GEN2 = 1
+ LONG = 2
+ PREGLOBAL_REVERSED_DRIVER_TORQUE = 4
+
+
+class SubaruFlags(IntFlag):
+ # Detected flags
+ SEND_INFOTAINMENT = 1
+ DISABLE_EYESIGHT = 2
+
+ # Static flags
+ GLOBAL_GEN2 = 4
+
+ # Cars that temporarily fault when steering angle rate is greater than some threshold.
+ # Appears to be all torque-based cars produced around 2019 - present
+ STEER_RATE_LIMITED = 8
+ PREGLOBAL = 16
+ HYBRID = 32
+ LKAS_ANGLE = 64
+
+
+GLOBAL_ES_ADDR = 0x787
+GEN2_ES_BUTTONS_DID = b'\x11\x30'
+
+
+class CanBus:
+ main = 0
+ alt = 1
+ camera = 2
+
+
+class Footnote(Enum):
+ GLOBAL = CarFootnote(
+ "In the non-US market, openpilot requires the car to come equipped with EyeSight with Lane Keep Assistance.",
+ Column.PACKAGE)
+ EXP_LONG = CarFootnote(
+ "Enabling longitudinal control (alpha) will disable all EyeSight functionality, including AEB, LDW, and RAB.",
+ Column.LONGITUDINAL)
+
+
+@dataclass
+class SubaruCarDocs(CarDocs):
+ package: str = "EyeSight Driver Assistance"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.subaru_a]))
+ footnotes: list[Enum] = field(default_factory=lambda: [Footnote.GLOBAL])
+
+ def init_make(self, CP: CarParams):
+ if CP.alphaLongitudinalAvailable:
+ self.footnotes.append(Footnote.EXP_LONG)
+
+
+@dataclass
+class SubaruPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'subaru_global_2017_generated'})
+
+ def init(self):
+ if self.flags & SubaruFlags.HYBRID:
+ self.dbc_dict = {Bus.pt: 'subaru_global_2020_hybrid_generated'}
+
+
+@dataclass
+class SubaruGen2PlatformConfig(SubaruPlatformConfig):
+ def init(self):
+ super().init()
+ self.flags |= SubaruFlags.GLOBAL_GEN2
+ if not (self.flags & SubaruFlags.LKAS_ANGLE):
+ self.flags |= SubaruFlags.STEER_RATE_LIMITED
+
+
+class CAR(Platforms):
+ # Global platform
+ SUBARU_ASCENT = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Ascent 2019-21", "All")],
+ CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5),
+ )
+ SUBARU_OUTBACK = SubaruGen2PlatformConfig(
+ [SubaruCarDocs("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))],
+ CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17),
+ )
+ SUBARU_LEGACY = SubaruGen2PlatformConfig(
+ [SubaruCarDocs("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))],
+ SUBARU_OUTBACK.specs,
+ )
+ SUBARU_IMPREZA = SubaruPlatformConfig(
+ [
+ SubaruCarDocs("Subaru Impreza 2017-19"),
+ SubaruCarDocs("Subaru Crosstrek 2018-19", video="https://youtu.be/Agww7oE1k-s?t=26"),
+ SubaruCarDocs("Subaru XV 2018-19", video="https://youtu.be/Agww7oE1k-s?t=26"),
+ ],
+ CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15),
+ )
+ SUBARU_IMPREZA_2020 = SubaruPlatformConfig(
+ [
+ SubaruCarDocs("Subaru Impreza 2020-22"),
+ SubaruCarDocs("Subaru Crosstrek 2020-23"),
+ SubaruCarDocs("Subaru XV 2020-21"),
+ ],
+ CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17),
+ flags=SubaruFlags.STEER_RATE_LIMITED,
+ )
+ # TODO: is there an XV and Impreza too?
+ SUBARU_CROSSTREK_HYBRID = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))],
+ CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17),
+ flags=SubaruFlags.HYBRID,
+ )
+ SUBARU_FORESTER = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Forester 2019-21", "All")],
+ CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17),
+ flags=SubaruFlags.STEER_RATE_LIMITED,
+ )
+ SUBARU_FORESTER_HYBRID = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Forester Hybrid 2020")],
+ SUBARU_FORESTER.specs,
+ flags=SubaruFlags.HYBRID,
+ )
+ # Pre-global
+ SUBARU_FORESTER_PREGLOBAL = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Forester 2017-18")],
+ CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20),
+ {Bus.pt: 'subaru_forester_2017_generated'},
+ flags=SubaruFlags.PREGLOBAL,
+ )
+ SUBARU_LEGACY_PREGLOBAL = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Legacy 2015-18")],
+ CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5),
+ {Bus.pt: 'subaru_outback_2015_generated'},
+ flags=SubaruFlags.PREGLOBAL,
+ )
+ SUBARU_OUTBACK_PREGLOBAL = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Outback 2015-17")],
+ SUBARU_FORESTER_PREGLOBAL.specs,
+ {Bus.pt: 'subaru_outback_2015_generated'},
+ flags=SubaruFlags.PREGLOBAL,
+ )
+ SUBARU_OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Outback 2018-19")],
+ SUBARU_FORESTER_PREGLOBAL.specs,
+ {Bus.pt: 'subaru_outback_2019_generated'},
+ flags=SubaruFlags.PREGLOBAL,
+ )
+ # Angle LKAS
+ SUBARU_FORESTER_2022 = SubaruPlatformConfig(
+ [SubaruCarDocs("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))],
+ SUBARU_FORESTER.specs,
+ flags=SubaruFlags.LKAS_ANGLE,
+ )
+ SUBARU_OUTBACK_2023 = SubaruGen2PlatformConfig(
+ [SubaruCarDocs("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))],
+ SUBARU_OUTBACK.specs,
+ flags=SubaruFlags.LKAS_ANGLE,
+ )
+ SUBARU_ASCENT_2023 = SubaruGen2PlatformConfig(
+ [SubaruCarDocs("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))],
+ SUBARU_ASCENT.specs,
+ flags=SubaruFlags.LKAS_ANGLE,
+ )
+
+
+SUBARU_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION)
+SUBARU_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION)
+
+# The EyeSight ECU takes 10s to respond to SUBARU_VERSION_REQUEST properly,
+# log this alternate manufacturer-specific query
+SUBARU_ALT_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(0xf100)
+SUBARU_ALT_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
+ p16(0xf100)
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission],
+ logging=True,
+ ),
+ # Non-OBD requests
+ # Some Eyesight modules fail on TESTER_PRESENT_REQUEST
+ # TODO: check if this resolves the fingerprinting issue for the 2023 Ascent and other new Subaru cars
+ Request(
+ [SUBARU_VERSION_REQUEST],
+ [SUBARU_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.fwdCamera],
+ bus=0,
+ ),
+ Request(
+ [SUBARU_ALT_VERSION_REQUEST],
+ [SUBARU_ALT_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.fwdCamera],
+ bus=0,
+ logging=True,
+ ),
+ Request(
+ [StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST],
+ [StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.fwdCamera],
+ bus=0,
+ logging=True,
+ ),
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission],
+ bus=0,
+ ),
+ # GEN2 powertrain bus query
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission],
+ bus=1,
+ obd_multiplexing=False,
+ ),
+ ],
+ # We don't get the EPS from non-OBD queries on GEN2 cars. Note that we still attempt to match when it exists
+ non_essential_ecus={
+ Ecu.eps: list(CAR.with_flags(SubaruFlags.GLOBAL_GEN2)),
+ }
+)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/tesla/__init__.py b/iqdbc_repo/iqdbc/car/tesla/__init__.py
new file mode 100644
index 000000000..8c310536f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/__init__.py
@@ -0,0 +1,2 @@
+# FIXME: gate by FingerPrint
+TESLA_BLINKERS = False
diff --git a/iqdbc_repo/iqdbc/car/tesla/carcontroller.py b/iqdbc_repo/iqdbc/car/tesla/carcontroller.py
new file mode 100644
index 000000000..59ca117b4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/carcontroller.py
@@ -0,0 +1,107 @@
+import numpy as np
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus
+from iqdbc.car.lateral import apply_steer_angle_limits_vm
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.tesla import TESLA_BLINKERS
+from iqdbc.car.tesla.teslacan import TeslaCAN
+from iqdbc.car.tesla.values import CarControllerParams
+from iqdbc.car.vehicle_model import VehicleModel
+from openpilot.iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import get_set_speed_kph_from_params
+from iqdbc.lvbs.car.tesla.torque_blend import TorqueBlendController
+from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ
+
+
+def get_safety_CP():
+ # We use the TESLA_MODEL_Y platform for lateral limiting to match safety
+ # A Model 3 at 40 m/s using the Model Y limits sees a <0.3% difference in max angle (from curvature factor)
+ from iqdbc.car.tesla.interface import CarInterface
+ return CarInterface.get_non_essential_params("TESLA_MODEL_Y")
+
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ self.coop_steer = TorqueBlendController()
+ self.apply_angle_last = 0
+ self.packer = CANPacker(dbc_names[Bus.party])
+ self.tesla_can = TeslaCAN(CP, self.packer)
+
+ # Vehicle model used for lateral limiting
+ self.VM = VehicleModel(get_safety_CP())
+
+ self.has_vehicle_bus = bool(CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS)
+ self.body_controls_counter_last = -1
+ self.blinker_request_prev = False
+ self.blinker_cancel_frame = 0
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ actuators = CC.actuators
+ can_sends = []
+
+ # Tesla EPS enforces disabling steering on heavy lateral override force.
+ # When enabling in a tight curve, we wait until user reduces steering force to start steering.
+ # Canceling is done on rising edge and is handled generically with CC.cruiseControl.cancel
+ lat_active = CC.latActive and CS.hands_on_level < 3
+
+ if self.frame % CarControllerParams.STEER_STEP == 0:
+ # Angular rate limit based on speed
+ self.apply_angle_last = apply_steer_angle_limits_vm(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, CS.out.steeringAngleDeg,
+ lat_active, CarControllerParams, self.VM)
+
+ can_sends.append(self.tesla_can.create_steering_control(*self.coop_steer.update(self.apply_angle_last, lat_active, self.CP_IQ, CS, self.VM)))
+
+ if self.frame % 10 == 0:
+ can_sends.append(self.tesla_can.create_steering_allowed())
+
+ # Longitudinal control
+ if self.CP.openpilotLongitudinalControl:
+ if self.frame % 4 == 0:
+ state = 13 if CC.cruiseControl.cancel or CS.das_accCancel else 4 # 4=ACC_ON, 13=ACC_CANCEL_GENERIC_SILENT
+ accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX))
+ if not CC.longActive:
+ accel = 0.
+ cntr = (self.frame // 4) % 8
+ set_speed_kph = get_set_speed_kph_from_params(CC_IQ.params)
+ can_sends.append(self.tesla_can.create_longitudinal_command(state, accel, cntr, CS.out.vEgo, CC.longActive,
+ CS.cruise_override, set_speed_kph=set_speed_kph))
+
+ else:
+ # Increment counter so cancel is prioritized even without openpilot longitudinal
+ if CC.cruiseControl.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, True))
+
+ # Nav blinker control via DAS_bodyControls on the vehicle bus, phase-locked to the car's
+ # counter. Cancel on the trailing edge since the body controller latches the signal.
+ stock_dat = getattr(CS, 'das_body_controls_dat', b"")
+ # FIXME: gate by FingerPrint
+ if TESLA_BLINKERS and self.has_vehicle_bus and len(stock_dat) >= 8:
+ left_blinker = CC.leftBlinker
+ right_blinker = CC.rightBlinker
+
+ driver_opposes = (left_blinker and CS.out.rightBlinker) or (right_blinker and CS.out.leftBlinker)
+ if driver_opposes:
+ left_blinker = right_blinker = False
+
+ nav_requesting = left_blinker or right_blinker
+
+ if self.blinker_request_prev and not nav_requesting and not driver_opposes:
+ self.blinker_cancel_frame = self.frame + 150 # ~1.5 s
+ self.blinker_request_prev = nav_requesting
+ cancel = not nav_requesting and not driver_opposes and self.frame < self.blinker_cancel_frame
+
+ body_counter = stock_dat[6] >> 4
+ if body_counter != self.body_controls_counter_last:
+ can_sends.append(self.tesla_can.create_body_controls(stock_dat, left_blinker, right_blinker, cancel))
+ self.body_controls_counter_last = body_counter
+
+ # TODO: HUD control
+ new_actuators = actuators.as_builder()
+ new_actuators.steeringAngleDeg = self.apply_angle_last
+ new_actuators.accel = self.coop_steer.blend_apply_angle_last_sat # debug
+ new_actuators.curvature = float(self.coop_steer.debug_angle_desired_limited) # debug
+ new_actuators.torque = float(self.coop_steer.override_angle_accu) # debug
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/tesla/carstate.py b/iqdbc_repo/iqdbc/car/tesla/carstate.py
new file mode 100644
index 000000000..9e9f25159
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/carstate.py
@@ -0,0 +1,189 @@
+import copy
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.tesla import TESLA_BLINKERS
+from iqdbc.car.tesla.values import DBC, CANBUS, GEAR_MAP, STEER_THRESHOLD, TeslaFlags
+
+from iqdbc.lvbs.car.tesla.iq_carstate import IQCarState
+from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ
+from openpilot.common.params import Params
+from openpilot.system.proprietary_runtime._verified_import import import_verified_module
+
+vehicle_state = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.vehicle_state")
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+
+class CarState(CarStateBase, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ self.can_define = CANDefine(DBC[CP.carFingerprint][Bus.party])
+ self.shifter_values = self.can_define.dv["DI_systemStatus"]["DI_gear"]
+
+ self.summon = False
+ self.summon_prev = False
+ self.cruise_enabled_prev = False
+
+ self.hands_on_level = 0
+ self.acc_state_last = 0
+ self.das_accCancel = False
+ self.das_cancel_last = True
+ self.das_control = None
+ self.das_body_controls_dat = b""
+ self._odometer_store = vehicle_state.VehicleOdometerStore(CP, Params())
+ self.cruise_override = False
+
+ def update_summon_state(self, summon_state: str, cruise_enabled: bool):
+ summon_now = summon_state in ("ACTIVE", "COMPLETE", "SELFPARK_STARTED")
+ if summon_now and not self.summon_prev and not self.cruise_enabled_prev:
+ self.summon = True
+ if not summon_now:
+ self.summon = False
+ self.summon_prev = summon_now
+ self.cruise_enabled_prev = cruise_enabled
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp_party = can_parsers[Bus.party]
+ cp_ap_party = can_parsers[Bus.ap_party]
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+ scale_speed = 1.01
+ length = 0.11
+
+ # Vehicle speed
+ ret.vEgoRaw = cp_party.vl["DI_speed"]["DI_vehicleSpeed"] * CV.KPH_TO_MS
+ ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
+
+ # Displayed speed
+ ui_speed_units = self.can_define.dv["DI_speed"]["DI_uiSpeedUnits"].get(int(cp_party.vl["DI_speed"]["DI_uiSpeedUnits"]), None)
+ if ui_speed_units == "DI_SPEED_KPH":
+ ret.vEgoCluster = cp_party.vl["DI_speed"]["DI_uiSpeed"] * CV.KPH_TO_MS
+ elif ui_speed_units == "DI_SPEED_MPH":
+ ret.vEgoCluster = cp_party.vl["DI_speed"]["DI_uiSpeed"] * CV.MPH_TO_MS
+
+ # Gas pedal
+ ret.gasPressed = cp_party.vl["DI_systemStatus"]["DI_accelPedalPos"] > 0
+
+ # Brake pedal
+ ret.brake = 0
+ ret.brakePressed = cp_party.vl["ESP_status"]["ESP_driverBrakeApply"] == 2
+
+ # Steering wheel
+ epas_status = cp_party.vl["EPAS3S_sysStatus"]
+ self.hands_on_level = epas_status["EPAS3S_handsOnLevel"]
+ ret.steeringAngleDeg = -epas_status["EPAS3S_internalSAS"]
+ ret.steeringRateDeg = -cp_ap_party.vl["SCCM_steeringAngleSensor"]["SCCM_steeringAngleSpeed"]
+ ret.steeringTorque = -epas_status["EPAS3S_torsionBarTorque"]
+ ret.steeringTorqueEps = -epas_status["EPAS3S_steeringRackForce"] * length / self.CP.steerRatio
+
+ # stock handsOnLevel uses >0.5 for 0.25s, but is too slow
+ ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > STEER_THRESHOLD, 5)
+
+ eac_status = self.can_define.dv["EPAS3S_sysStatus"]["EPAS3S_eacStatus"].get(int(epas_status["EPAS3S_eacStatus"]), None)
+ ret.steerFaultPermanent = eac_status == "EAC_FAULT"
+ ret.steerFaultTemporary = eac_status == "EAC_INHIBITED"
+
+ # FSD disengages using union of handsOnLevel (slow overrides) and high angle rate faults (fast overrides, high speed)
+ eac_error_code = self.can_define.dv["EPAS3S_sysStatus"]["EPAS3S_eacErrorCode"].get(int(epas_status["EPAS3S_eacErrorCode"]), None)
+ ret.steeringDisengage = self.hands_on_level >= 3 or (eac_status == "EAC_INHIBITED" and
+ eac_error_code == "EAC_ERROR_HIGH_ANGLE_RATE_SAFETY")
+
+ # Cruise state
+ cruise_state = self.can_define.dv["DI_state"]["DI_cruiseState"].get(int(cp_party.vl["DI_state"]["DI_cruiseState"]), None)
+ speed_units = self.can_define.dv["DI_state"]["DI_speedUnits"].get(int(cp_party.vl["DI_state"]["DI_speedUnits"]), None)
+ acc_state = cp_ap_party.vl["DAS_control"]["DAS_accState"]
+
+ summon_state = self.can_define.dv["DI_state"]["DI_autoparkState"].get(int(cp_party.vl["DI_state"]["DI_autoparkState"]), None)
+ cruise_enabled = cruise_state in ("ENABLED", "STANDSTILL", "OVERRIDE", "PRE_FAULT", "PRE_CANCEL")
+ self.cruise_override = cruise_state in ("OVERRIDE")
+ self.update_summon_state(summon_state, cruise_enabled)
+
+ # Respect all stock DAS cancel states, not just ACC_CANCEL_GENERIC_SILENT(13).
+ # ELDA/ELK triggers ACC_CANCEL_GENERIC(0) which must also be forwarded.
+ # The stock AP is isolated from the party bus while the relay is closed, so its accState
+ # free-runs between ACC_ON and ACC_CANCEL_GENERIC. Only a rising edge while ACC is engaged
+ # is a real cancel; level-forwarding it pins DI_cruiseState to UNAVAILABLE and blocks engaging.
+ das_cancel = acc_state in (0, 1, 2, 12, 13, 14, 15)
+ if not cruise_enabled:
+ self.das_accCancel = False
+ elif das_cancel and not self.das_cancel_last:
+ self.das_accCancel = True
+ self.das_cancel_last = das_cancel
+
+ # Match panda safety cruise engaged logic
+ ret.cruiseState.enabled = cruise_enabled and not self.summon
+ if speed_units == "KPH":
+ ret.cruiseState.speedCluster = cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.KPH_TO_MS
+ elif speed_units == "MPH":
+ ret.cruiseState.speedCluster = cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.MPH_TO_MS
+ ret.cruiseState.speed = max(ret.cruiseState.speedCluster / scale_speed, 1e-3)
+ 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 = cp_party.vl["ESP_B"]["ESP_vehicleStandstillSts"] == 1
+ ret.accFaulted = cruise_state == "FAULT"
+
+ ret.buttonEvents = [*create_button_events(acc_state, self.acc_state_last, {0: ButtonType.cancel, 13: ButtonType.cancel})]
+ self.acc_state_last = acc_state
+
+
+ # Gear
+ ret.gearShifter = GEAR_MAP[self.can_define.dv["DI_systemStatus"]["DI_gear"].get(int(cp_party.vl["DI_systemStatus"]["DI_gear"]), "DI_GEAR_INVALID")]
+
+ # Doors
+ ret.doorOpen = cp_party.vl["UI_warning"]["anyDoorOpen"] == 1
+
+ # Blinkers
+ ret.leftBlinker = cp_party.vl["UI_warning"]["leftBlinkerBlinking"] in (1, 2)
+ ret.rightBlinker = cp_party.vl["UI_warning"]["rightBlinkerBlinking"] in (1, 2)
+
+ # Seatbelt
+ ret.seatbeltUnlatched = cp_party.vl["UI_warning"]["buckleStatus"] != 1
+
+ # Blindspot
+ ret.leftBlindspot = cp_ap_party.vl["DAS_status"]["DAS_blindSpotRearLeft"] != 0
+ ret.rightBlindspot = cp_ap_party.vl["DAS_status"]["DAS_blindSpotRearRight"] != 0
+
+ # AEB
+ ret.stockAeb = cp_ap_party.vl["DAS_control"]["DAS_aebEvent"] == 1
+
+ # LKAS
+ steer_control_type = int(cp_ap_party.vl["DAS_steeringControl"]["DAS_steeringControlType"])
+ if self.CP.flags & TeslaFlags.LEGACY_DAS_STEERING:
+ steer_control_type >>= 1 # legacy firmware uses a 2-bit field, one bit up from the 3-bit signal
+ ret.stockLkas = steer_control_type == 2 # LANE_KEEP_ASSIST
+
+ # Stock Autosteer should be disengaged (includes FSD)
+ # TODO: find for TESLA_MODEL_X and HW2.5 vehicles
+ if not (self.CP.flags & TeslaFlags.MISSING_DAS_SETTINGS):
+ ret.invalidLkasSetting = cp_ap_party.vl["DAS_status"]["DAS_autopilotState"] not in (0, 1, 2) # DISABLED, UNAVAILABLE, AVAILABLE
+
+ # Buttons # ToDo: add Gap adjust button
+
+ # Messages needed by carcontroller
+ self.das_control = copy.copy(cp_ap_party.vl["DAS_control"])
+
+ # Raw stock DAS_bodyControls bytes (bus 2), used to ride the blinker on the vehicle bus.
+ # FIXME: gate by FingerPrint
+ if TESLA_BLINKERS and Bus.cam in can_parsers:
+ self.das_body_controls_dat = bytes(can_parsers[Bus.cam].dat.get(0x3E9, b""))
+
+ IQCarState.update(self, ret, ret_iq, can_parsers)
+ if ret.odometer > 0.0:
+ ret.odometer = self._odometer_store.record(ret.odometer) or 0.0
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ parsers = {
+ Bus.party: CANParser(DBC[CP.carFingerprint][Bus.party], [], CANBUS.party),
+ Bus.ap_party: CANParser(DBC[CP.carFingerprint][Bus.party], [], CANBUS.autopilot_party),
+ **IQCarState.get_parser(CP, CP_IQ),
+ }
+ # Stock DAS_bodyControls from the AP bus (bus 2) for the nav blinker.
+ if TESLA_BLINKERS and CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS and Bus.adas in DBC[CP.carFingerprint]:
+ parsers[Bus.cam] = CANParser(DBC[CP.carFingerprint][Bus.adas], [("DAS_bodyControls", 2)], CANBUS.autopilot_party)
+ return parsers
diff --git a/iqdbc_repo/iqdbc/car/tesla/fingerprints.py b/iqdbc_repo/iqdbc/car/tesla/fingerprints.py
new file mode 100644
index 000000000..1a8ea7e69
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/fingerprints.py
@@ -0,0 +1,56 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.tesla.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.TESLA_MODEL_3: {
+ (Ecu.eps, 0x730, None): [
+ b'TeM3_E014p10_0.0.0 (16),E014.17.00',
+ b'TeM3_E014p10_0.0.0 (16),EL014.17.00',
+ b'TeM3_ES014p11_0.0.0 (25),ES014.19.0',
+ b'TeMYG4_DCS_Update_0.0.0 (13),E4014.28.1',
+ b'TeMYG4_DCS_Update_0.0.0 (9),E4014.26.0',
+ b'TeMYG4_Legacy3Y_0.0.0 (2),E4015.02.0',
+ b'TeMYG4_Legacy3Y_0.0.0 (5),E4015.03.2',
+ b'TeMYG4_Legacy3Y_0.0.0 (5),E4L015.03.2',
+ b'TeMYG4_Main_0.0.0 (59),E4H014.29.0',
+ b'TeMYG4_Main_0.0.0 (65),E4H015.01.0',
+ b'TeMYG4_Main_0.0.0 (67),E4H015.02.1',
+ b'TeMYG4_Main_0.0.0 (77),E4H015.04.5',
+ b'TeMYG4_Main_0.0.0 (77),E4HP015.04.5',
+ b'TeMYG4_Main_0.0.0 (78),E4H015.05.0',
+ b'TeMYG4_Main_0.0.0 (78),E4HP015.05.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_E014p10_0.0.0 (24),Y002.21.2',
+ 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_Legacy3Y_0.0.0 (5),Y4003.03.2',
+ b'TeMYG4_Legacy3Y_0.0.0 (5),Y4P003.03.2',
+ b'TeMYG4_SingleECU_0.0.0 (28),Y4S002.23.0',
+ b'TeMYG4_SingleECU_0.0.0 (33),Y4S002.26',
+ b'TeMYG4_Legacy3Y_0.0.0 (6),Y4003.04.0',
+ b'TeMYG4_Main_0.0.0 (77),Y4003.05.4',
+ b'TeMYG4_Main_0.0.0 (78),Y4003.06.0',
+ b'TeMYG4_Main_0.0.0 (87),Y4003.09.3',
+ ],
+ },
+ CAR.TESLA_MODEL_X: {
+ (Ecu.eps, 0x730, None): [
+ b'TeM3_SP_XP002p2_0.0.0 (23),XPR003.6.0',
+ b'TeM3_SP_XP002p2_0.0.0 (36),XPR003.10.0',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/tesla/interface.py b/iqdbc_repo/iqdbc/car/tesla/interface.py
new file mode 100644
index 000000000..3cab3fd83
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/interface.py
@@ -0,0 +1,69 @@
+from iqdbc.car import Bus, get_safety_config, structs
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.tesla.carcontroller import CarController
+from iqdbc.car.tesla.carstate import CarState
+from iqdbc.car.tesla.values import TeslaSafetyFlags, TeslaFlags, CANBUS, CAR, DBC, Ecu, is_legacy_das_steering
+from iqdbc.car.tesla.radar_interface import RadarInterface, RADAR_START_ADDR
+
+from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "tesla"
+
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.tesla)]
+
+ ret.steerLimitTimer = 0.4
+ ret.steerActuatorDelay = 0.1
+ ret.steerAtStandstill = True
+
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+
+ # Model X and HW 2.5 vehicles are missing DAS_settings
+ if 0x293 not in fingerprint[CANBUS.autopilot_party]:
+ ret.flags |= TeslaFlags.MISSING_DAS_SETTINGS.value
+
+ # Radar support is intended to work for:
+ # - Tesla Model 3 vehicles built approximately mid-2017 through early-2021
+ # - Tesla Model Y vehicles built approximately mid-2020 through early-2021
+ # - Vehicles equipped with the Continental ARS4-B radar (used on HW2 / HW2.5 / early HW3)
+ # - Radar CAN lines must be tapped and connected to CAN bus 1 (normally not used for tesla vehicles)
+ ret.radarUnavailable = RADAR_START_ADDR not in fingerprint[1] or Bus.radar not in DBC[candidate]
+
+ ret.alphaLongitudinalAvailable = True
+ if alpha_long:
+ ret.openpilotLongitudinalControl = True
+ ret.safetyConfigs[0].safetyParam |= TeslaSafetyFlags.LONG_CONTROL.value
+
+ legacy_das = any(fw.ecu == Ecu.eps and is_legacy_das_steering(candidate, fw.fwVersion) for fw in car_fw)
+ if legacy_das:
+ ret.flags |= TeslaFlags.LEGACY_DAS_STEERING.value
+ ret.safetyConfigs[0].safetyParam |= TeslaSafetyFlags.LEGACY_DAS_STEERING.value
+
+ ret.dashcamOnly = candidate in (CAR.TESLA_MODEL_X,) # dashcam only, pending find invalidLkasSetting signal
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+
+ stock_cp.enableBsm = True
+
+ if candidate == CAR.TESLA_MODEL_X:
+ stock_cp.dashcamOnly = False
+
+ # Vehicle-bus messages can be slow enough to miss the initial capture window.
+ # Accept either the established 0x3DF marker or the absolute odometer frame.
+ vehicle_bus_seen = any(0x3DF in bus or 0x3B6 in bus for bus in fingerprint.values())
+ if vehicle_bus_seen:
+ ret.flags |= TeslaFlagsIQ.HAS_VEHICLE_BUS.value
+ ret.iqSafetyFlags |= TeslaSafetyFlagsIQ.HAS_VEHICLE_BUS
+
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/tesla/radar_interface.py b/iqdbc_repo/iqdbc/car/tesla/radar_interface.py
new file mode 100644
index 000000000..d21d02288
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/radar_interface.py
@@ -0,0 +1,89 @@
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import RadarInterfaceBase
+from iqdbc.car.tesla.values import DBC
+
+RADAR_START_ADDR = 0x410
+RADAR_MSG_COUNT = 80 # 40 points * 2 messages each
+
+
+def get_radar_can_parser(CP):
+ if Bus.radar not in DBC[CP.carFingerprint]:
+ return None
+
+ messages = [('RadarStatus', 16)]
+ for i in range(RADAR_MSG_COUNT // 2):
+ messages.extend([
+ (f'RadarPoint{i}_A', 16),
+ (f'RadarPoint{i}_B', 16),
+ ])
+
+ return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 1)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+ 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(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
+
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+
+ radar_status = self.rcp.vl['RadarStatus']
+ if radar_status['shortTermUnavailable']:
+ ret.errors.radarUnavailableTemporary = True
+ if radar_status['sensorBlocked'] or radar_status['vehDynamicsError']:
+ ret.errors.radarFault = True
+
+ for i in range(RADAR_MSG_COUNT // 2):
+ msg_a = self.rcp.vl[f'RadarPoint{i}_A']
+ msg_b = self.rcp.vl[f'RadarPoint{i}_B']
+
+ # Make sure msg A and B are together
+ if msg_a['Index'] != msg_b['Index2']:
+ continue
+
+ if not msg_a['Tracked']:
+ if i in self.pts:
+ del self.pts[i]
+ continue
+
+ if i not in self.pts:
+ self.pts[i] = structs.RadarData.RadarPoint()
+ self.pts[i].trackId = self.track_id
+ self.track_id += 1
+
+ self.pts[i].dRel = msg_a['LongDist']
+ self.pts[i].yRel = msg_a['LatDist']
+ self.pts[i].vRel = msg_a['LongSpeed']
+ self.pts[i].aRel = msg_a['LongAccel']
+ self.pts[i].yvRel = msg_b['LatSpeed']
+ self.pts[i].measured = bool(msg_a['Meas'])
+
+ ret.points = list(self.pts.values())
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/tesla/teslacan.py b/iqdbc_repo/iqdbc/car/tesla/teslacan.py
new file mode 100644
index 000000000..35e5f66f4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/teslacan.py
@@ -0,0 +1,89 @@
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.tesla.values import CANBUS, CarControllerParams, TeslaFlags
+from iqdbc.car import DT_CTRL
+
+
+class TeslaCAN:
+ def __init__(self, CP, packer):
+ self.CP = CP
+ self.packer = packer
+ self.l_jerk = 0.0
+
+ def create_steering_control(self, angle, enabled, control_type):
+ # control_type comes from torque_blend: ANGLE_CONTROL (1) normally, LANE_KEEP_ASSIST (2) when cooperative steering is enabled
+ control_type = control_type if enabled else 0
+ if self.CP.flags & TeslaFlags.LEGACY_DAS_STEERING:
+ control_type <<= 1 # legacy firmware uses a 2-bit field, one bit up from the 3-bit signal
+
+ values = {
+ "DAS_steeringAngleRequest": -angle,
+ "DAS_steeringHapticRequest": 0,
+ "DAS_steeringControlType": control_type,
+ }
+
+ return self.packer.make_can_msg("DAS_steeringControl", CANBUS.party, values)
+
+ def create_longitudinal_command(self, acc_state, accel, counter, v_ego, active, cruise_override, set_speed_kph=None):
+ from iqdbc.car.interfaces import V_CRUISE_MAX
+
+ set_speed = max(v_ego * CV.MS_TO_KPH, 0)
+ self.l_jerk = 0.0
+ if active:
+ self.l_jerk = 0 if cruise_override else (self.l_jerk + CarControllerParams.JERK_UP * DT_CTRL * 4)
+ set_speed = 0 if accel < 0 else V_CRUISE_MAX
+ if set_speed_kph is not None and accel >= 0:
+ set_speed = max(0.0, min(V_CRUISE_MAX, float(set_speed_kph)))
+
+ values = {
+ "DAS_setSpeed": set_speed,
+ "DAS_accState": acc_state,
+ "DAS_aebEvent": 0,
+ "DAS_jerkMin": CarControllerParams.JERK_LIMIT_MIN,
+ "DAS_jerkMax": min(self.l_jerk, CarControllerParams.JERK_LIMIT_MAX),
+ "DAS_accelMin": accel,
+ "DAS_accelMax": max(accel, 0),
+ "DAS_controlCounter": counter,
+ }
+ return self.packer.make_can_msg("DAS_control", CANBUS.party, values)
+
+ def create_steering_allowed(self):
+ values = {
+ "APS_eacAllow": 1,
+ }
+
+ return self.packer.make_can_msg("APS_eacMonitor", CANBUS.party, values)
+
+ def create_body_controls(self, stock_dat, left_blinker, right_blinker, cancel=False):
+ # Ride alongside the car's native DAS_bodyControls: copy the raw frame, override only the
+ # turn-indicator bits, and stamp counter + 1 so our frame supersedes the stock one.
+ dat = bytearray(stock_dat)
+ if len(dat) < 8:
+ dat.extend(b"\x00" * (8 - len(dat)))
+
+ if left_blinker or right_blinker:
+ turn_req = 1 if left_blinker else 2 # DAS_TURN_INDICATOR_LEFT / _RIGHT
+ dat[1] = (dat[1] & ~0x07) | (turn_req & 0x07)
+ dat[2] = (dat[2] & ~0x3C) | (1 << 2) # DAS_ACTIVE_NAV_LANE_CHANGE
+ elif cancel:
+ dat[1] = (dat[1] & ~0x07) | 0x03 # DAS_TURN_INDICATOR_CANCEL
+ dat[2] = (dat[2] & ~0x3C) | (4 << 2) # DAS_CANCEL_LANE_CHANGE
+
+ counter = (((dat[6] >> 4) + 1) & 0x0F)
+ dat[6] = (dat[6] & ~0xF0) | (counter << 4)
+
+ addr = 0x3E9
+ checksum = (addr & 0xFF) + ((addr >> 8) & 0xFF)
+ for i in range(7):
+ checksum += dat[i]
+ dat[7] = checksum & 0xFF
+
+ return addr, bytes(dat), CANBUS.vehicle
+
+
+def tesla_checksum(address: int, sig, d: bytearray) -> int:
+ checksum = (address & 0xFF) + ((address >> 8) & 0xFF)
+ checksum_byte = sig.start_bit // 8
+ for i in range(len(d)):
+ if i != checksum_byte:
+ checksum += d[i]
+ return checksum & 0xFF
diff --git a/iqdbc_repo/iqdbc/car/tesla/tests/__init__.py b/iqdbc_repo/iqdbc/car/tesla/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py b/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py
new file mode 100644
index 000000000..695c8c503
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py
@@ -0,0 +1,226 @@
+from collections import defaultdict
+
+import pytest
+
+from iqdbc.car import gen_empty_fingerprint, structs
+from iqdbc.car.structs import CarParams
+from iqdbc.car.fw_versions import match_fw_to_car
+from iqdbc.car.tesla.fingerprints import FW_VERSIONS
+from iqdbc.car.tesla.interface import CarInterface
+from iqdbc.car.tesla.teslacan import TeslaCAN
+from iqdbc.car.tesla.radar_interface import RADAR_START_ADDR
+from iqdbc.car.tesla.carcontroller import CarController
+from iqdbc.car.tesla.values import (CAR, FW_PATTERN, LEGACY_DAS_STEERING_FW, TeslaFlags, TeslaSafetyFlags,
+ get_platform_codes, is_legacy_das_steering)
+from iqdbc.can import CANPacker, CANParser
+
+Ecu = CarParams.Ecu
+EPS_ADDR = 0x730
+
+
+def fw_match(fw: bytes):
+ car_fw = [CarParams.CarFw(ecu=Ecu.eps, fwVersion=fw, address=EPS_ADDR, subAddress=0, brand='tesla')]
+ exact, matches = match_fw_to_car(car_fw, '0' * 17, log=False)
+ return exact, matches
+
+
+class TestTeslaFwPattern:
+ def test_all_known_fw_parses(self):
+ for car, ecus in FW_VERSIONS.items():
+ for fws in ecus.values():
+ for fw in fws:
+ assert FW_PATTERN.match(fw) is not None, f'{car}: unparsed FW version: {fw}'
+
+ def test_model_code_identifies_one_platform(self):
+ # a new platform reusing an existing model code would silently misfingerprint
+ platforms = defaultdict(set)
+ for car, ecus in FW_VERSIONS.items():
+ for fws in ecus.values():
+ for model, _, _ in get_platform_codes(fws):
+ platforms[model].add(car)
+
+ for model, cars in platforms.items():
+ assert len(cars) == 1, f'model code {model} maps to multiple platforms: {cars}'
+
+ def test_exact_match_still_wins(self):
+ for car, ecus in FW_VERSIONS.items():
+ for fws in ecus.values():
+ for fw in fws:
+ exact, matches = fw_match(fw)
+ assert exact, f'{fw} fell back to fuzzy matching'
+ assert matches == {car}, f'{fw} matched {matches}, expected {car}'
+
+ @pytest.mark.parametrize("fw, expected", [
+ # a firmware bump within a known series, the case that used to fingerprint as MOCK
+ (b'TeMYG4_Main_0.0.0 (99),Y4003.14.0', CAR.TESLA_MODEL_Y),
+ (b'TeMYG4_Main_0.0.0 (99),E4H015.09.0', CAR.TESLA_MODEL_3),
+ (b'TeM3_SP_XP002p2_0.0.0 (40),XPR003.12.0', CAR.TESLA_MODEL_X),
+ # Tesla bumps the series within a platform (E4014 -> E4015, Y4002 -> Y4003)
+ (b'TeMYG4_Main_0.0.0 (12),Y4004.01.0', CAR.TESLA_MODEL_Y),
+ # an unknown model code is a car we don't support
+ (b'TeCT_Main_0.0.0 (1),CT001.01.0', None),
+ (b'garbage', None),
+ ])
+ def test_unknown_fw_fuzzy_match(self, fw, expected):
+ exact, matches = fw_match(fw)
+ if expected is None:
+ assert matches == set(), f'{fw} unexpectedly matched {matches}'
+ else:
+ assert not exact
+ assert matches == {expected}
+
+
+class TestTeslaLegacyDasSteering:
+ def test_reproduces_known_table(self):
+ for car, ecus in FW_VERSIONS.items():
+ for fws in ecus.values():
+ for fw in fws:
+ expected = fw in LEGACY_DAS_STEERING_FW.get(car, [])
+ assert is_legacy_das_steering(car, fw) == expected, f'{car}: wrong legacy DAS verdict for {fw}'
+
+ @pytest.mark.parametrize("car, fw, expected", [
+ # below a family's known modern cutoff (Y4/003 splits at 003.04.0)
+ (CAR.TESLA_MODEL_Y, b'TeMYG4_Legacy3Y_0.0.0 (5),Y4003.03.9', True),
+ (CAR.TESLA_MODEL_Y, b'TeMYG4_Main_0.0.0 (99),Y4003.14.0', False),
+ # E4/015 splits at 015.04.5
+ (CAR.TESLA_MODEL_3, b'TeMYG4_Main_0.0.0 (68),E4H015.03.9', True),
+ (CAR.TESLA_MODEL_3, b'TeMYG4_Main_0.0.0 (99),E4H015.09.0', False),
+ # families with no known modern FW: interpolate legacy, extrapolate modern
+ (CAR.TESLA_MODEL_3, b'TeM3_E014p10_0.0.0 (16),E014.18.00', True),
+ (CAR.TESLA_MODEL_3, b'TeM3_E014p10_0.0.0 (30),E014.22.0', False),
+ # numeric, not lexical, version compare (XPR003.10.0 > XPR003.6.0)
+ (CAR.TESLA_MODEL_X, b'TeM3_SP_XP002p2_0.0.0 (30),XPR003.9.0', True),
+ # an unknown series has no history to compare against
+ (CAR.TESLA_MODEL_Y, b'TeMYG4_Main_0.0.0 (12),Y4004.01.0', False),
+ (CAR.TESLA_MODEL_Y, b'garbage', False),
+ ])
+ def test_unknown_fw(self, car, fw, expected):
+ assert is_legacy_das_steering(car, fw) == expected
+
+ def test_flag_set_from_fuzzy_match(self):
+ for fw, legacy in ((b'TeMYG4_Legacy3Y_0.0.0 (5),Y4003.03.9', True),
+ (b'TeMYG4_Main_0.0.0 (99),Y4003.14.0', False)):
+ car_fw = [CarParams.CarFw(ecu=Ecu.eps, fwVersion=fw, address=EPS_ADDR, subAddress=0, brand='tesla')]
+ CP = CarInterface.get_params(CAR.TESLA_MODEL_Y, gen_empty_fingerprint(), car_fw, False, False, False)
+ assert bool(CP.flags & TeslaFlags.LEGACY_DAS_STEERING) == legacy
+ assert bool(CP.safetyConfigs[0].safetyParam & TeslaSafetyFlags.LEGACY_DAS_STEERING) == legacy
+
+
+class TestTeslaFingerprint:
+ def test_radar_detection(self):
+ # Test radar availability detection for cars with radar DBC defined
+ for radar in (True, False):
+ fingerprint = gen_empty_fingerprint()
+ if radar:
+ fingerprint[1][RADAR_START_ADDR] = 8
+ CP = CarInterface.get_params(CAR.TESLA_MODEL_3, fingerprint, [], False, False, False)
+ assert CP.radarUnavailable != radar
+
+ def test_no_radar_car(self):
+ # Model X doesn't have radar DBC defined, should always be unavailable
+ for radar in (True, False):
+ fingerprint = gen_empty_fingerprint()
+ if radar:
+ fingerprint[1][RADAR_START_ADDR] = 8
+ CP = CarInterface.get_params(CAR.TESLA_MODEL_X, fingerprint, [], False, False, False)
+ assert CP.radarUnavailable # Always unavailable since no radar DBC
+
+
+class TestTeslaCan:
+ class DummyPacker:
+ def make_can_msg(self, name, bus, values):
+ return name, bus, values
+
+ def test_vehicle_bus_odometer_decodes_kilometers(self):
+ packer = CANPacker("tesla_model3_vehicle")
+ parser = CANParser("tesla_model3_vehicle", [("ID3B6UI_odometer", 1)], 1)
+
+ message = packer.make_can_msg("ID3B6UI_odometer", 1, {
+ "UI_odometer": 29150.377,
+ "UI_odometerCounter": 1,
+ "UI_odometerChecksum": 0,
+ })
+ parser.update([1_000_000_000, [message]])
+
+ assert parser.vl["ID3B6UI_odometer"]["UI_odometer"] == 29150.377
+
+ def test_longitudinal_command_does_not_reference_missing_jerk_attr(self):
+ CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3)
+ tesla_can = TeslaCAN(CP, self.DummyPacker())
+
+ name, bus, values = tesla_can.create_longitudinal_command(4, 1.0, 0, 20.0, True, False)
+
+ assert name == "DAS_control"
+ assert bus == 0
+ assert values["DAS_jerkMax"] <= 4.9
+ assert values["DAS_jerkMax"] >= 0.0
+
+ def test_longitudinal_command_uses_explicit_set_speed(self):
+ CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3)
+ tesla_can = TeslaCAN(CP, self.DummyPacker())
+
+ name, bus, values = tesla_can.create_longitudinal_command(4, 1.0, 0, 20.0, True, False, set_speed_kph=64.0)
+
+ assert name == "DAS_control"
+ assert bus == 0
+ assert values["DAS_setSpeed"] == 64.0
+
+ def test_longitudinal_command_preserves_decel_when_explicit_set_speed_present(self):
+ CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3)
+ tesla_can = TeslaCAN(CP, self.DummyPacker())
+
+ name, bus, values = tesla_can.create_longitudinal_command(4, -0.5, 0, 20.0, True, False, set_speed_kph=64.0)
+
+ assert name == "DAS_control"
+ assert bus == 0
+ assert values["DAS_setSpeed"] == 0
+ assert values["DAS_accelMin"] < 0
+
+
+class TestTeslaCarControllerIQParams:
+ def test_iq_params_override_set_speed(self):
+ CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3)
+ CP.openpilotLongitudinalControl = True
+ controller = CarController(CAR.TESLA_MODEL_3.config.dbc_dict, CP, structs.IQCarParams())
+
+ class DummyCruise:
+ cancel = False
+
+ class DummyActuators:
+ steeringAngleDeg = 0.0
+ accel = 1.0
+
+ def as_builder(self):
+ return self
+
+ class DummyCarControl:
+ actuators = DummyActuators()
+ latActive = False
+ longActive = True
+ cruiseControl = DummyCruise()
+
+ class DummyCarState:
+ hands_on_level = 0
+ out = type("Out", (), {"vEgoRaw": 20.0, "steeringAngleDeg": 0.0, "steeringRateDeg": 0.0, "steeringTorque": 0.0, "vEgo": 20.0})()
+ das_accCancel = False
+ cruise_override = False
+ das_control = {"DAS_controlCounter": 0}
+
+ cc_iq = structs.IQCarControl(params=[
+ structs.IQCarControl.Param(
+ key="enhancedStockLongitudinalControl.setSpeedKph",
+ type="float",
+ value=b"64.0",
+ )
+ ])
+
+ captured = {}
+
+ def fake_longitudinal_command(state, accel, cntr, v_ego, active, cruise_override, set_speed_kph=None):
+ captured["set_speed_kph"] = set_speed_kph
+ return ("DAS_control", 0, {"DAS_setSpeed": set_speed_kph})
+
+ controller.tesla_can.create_longitudinal_command = fake_longitudinal_command
+
+ controller.update(DummyCarControl(), cc_iq, DummyCarState(), 0)
+ assert captured["set_speed_kph"] == 64.0
diff --git a/iqdbc_repo/iqdbc/car/tesla/values.py b/iqdbc_repo/iqdbc/car/tesla/values.py
new file mode 100644
index 000000000..80e6209eb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tesla/values.py
@@ -0,0 +1,264 @@
+import re
+from collections import defaultdict
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+from functools import cache
+from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms
+from iqdbc.car.lateral import AngleSteeringLimits, ISO_LATERAL_ACCEL
+from iqdbc.car.structs import CarParams, CarState
+from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType
+from iqdbc.car.fw_query_definitions import FwQueryConfig, LiveFwVersions, OfflineFwVersions, 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)
+
+ SETUP = CarFootnote(
+ "See more setup details for Tesla .",
+ Column.MAKE, setup_note=True)
+
+
+@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, Footnote.SETUP])
+
+
+@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, Footnote.SETUP])
+
+@dataclass
+class TeslaCarHW4ModelSXDocs(TeslaCarDocsHW4):
+ support_type: SupportType = SupportType.COMMUNITY
+ support_link: str = "community"
+
+
+@dataclass
+class TeslaPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.party: 'tesla_model3_party', Bus.adas: 'tesla_model3_vehicle'})
+
+
+class CAR(Platforms):
+ TESLA_MODEL_3 = TeslaPlatformConfig(
+ [
+ # TODO: do we support 2017? It's HW3
+ TeslaCarDocsHW3("Tesla Model 3 (with HW3) 2019-23"),
+ TeslaCarDocsHW4("Tesla Model 3 (with HW4) 2024-25"),
+ ],
+ CarSpecs(mass=1899., wheelbase=2.875, steerRatio=12.0),
+ {Bus.party: 'tesla_model3_party', Bus.radar: 'tesla_radar_continental_generated', Bus.adas: 'tesla_model3_vehicle'},
+ )
+ TESLA_MODEL_Y = TeslaPlatformConfig(
+ [
+ TeslaCarDocsHW3("Tesla Model Y (with HW3) 2020-23"),
+ TeslaCarDocsHW4("Tesla Model Y (with HW4) 2024-25"),
+ ],
+ CarSpecs(mass=2072., wheelbase=2.890, steerRatio=12.0),
+ {Bus.party: 'tesla_model3_party', Bus.radar: 'tesla_radar_continental_generated', Bus.adas: 'tesla_model3_vehicle'},
+ )
+ TESLA_MODEL_X = TeslaPlatformConfig(
+ [TeslaCarHW4ModelSXDocs("Tesla Model X (with HW4) 2024")],
+ CarSpecs(mass=2495., wheelbase=2.960, steerRatio=12.0),
+ )
+
+
+# Cars with this EPS FW have a 2-bit DAS_steeringControlType and use TeslaFlags.LEGACY_DAS_STEERING
+LEGACY_DAS_STEERING_FW = {
+ CAR.TESLA_MODEL_3: [
+ b'TeM3_E014p10_0.0.0 (16),E014.17.00',
+ b'TeM3_E014p10_0.0.0 (16),EL014.17.00',
+ b'TeM3_ES014p11_0.0.0 (25),ES014.19.0',
+ b'TeMYG4_DCS_Update_0.0.0 (13),E4014.28.1',
+ b'TeMYG4_DCS_Update_0.0.0 (9),E4014.26.0',
+ b'TeMYG4_Legacy3Y_0.0.0 (2),E4015.02.0',
+ b'TeMYG4_Legacy3Y_0.0.0 (5),E4015.03.2',
+ b'TeMYG4_Legacy3Y_0.0.0 (5),E4L015.03.2',
+ b'TeMYG4_Main_0.0.0 (59),E4H014.29.0',
+ b'TeMYG4_Main_0.0.0 (65),E4H015.01.0',
+ b'TeMYG4_Main_0.0.0 (67),E4H015.02.1',
+ b'TeMYG4_SingleECU_0.0.0 (33),E4S014.27',
+ ],
+ CAR.TESLA_MODEL_Y: [
+ 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_Legacy3Y_0.0.0 (5),Y4003.03.2',
+ b'TeMYG4_Legacy3Y_0.0.0 (5),Y4P003.03.2',
+ b'TeMYG4_SingleECU_0.0.0 (28),Y4S002.23.0',
+ b'TeMYG4_SingleECU_0.0.0 (33),Y4S002.26',
+ ],
+ CAR.TESLA_MODEL_X: [
+ b'TeM3_SP_XP002p2_0.0.0 (23),XPR003.6.0',
+ b'TeM3_SP_XP002p2_0.0.0 (36),XPR003.10.0',
+ ],
+}
+
+# e.g. TeMYG4_Main_0.0.0 (87),Y4003.09.3
+# 11111_22222_______33____45__666666
+# 1 = EPS firmware program, 2 = build lineage, 3 = build number, 4 = model code,
+# 5 = trim/hardware variant, 6 = series and software version
+#
+# Only the model code identifies the vehicle: 1 and 2 are shared across models (Model 3 and
+# Model Y both ship TeM3_ and TeMYG4_ firmware) and 3 is only monotone within one lineage.
+FW_PATTERN = re.compile(rb'^Te[A-Z0-9]+_[A-Za-z0-9_]+_0\.0\.0 \(\d+\),' +
+ rb'(?PE4|E|Y4|Y|XP)[A-Z]{0,2}(?P\d{3})\.(?P\d+(?:\.\d+)*)$')
+
+
+def get_platform_codes(fw_versions: list[bytes] | set[bytes]) -> set[tuple[bytes, bytes, tuple[int, ...]]]:
+ codes = set()
+ for fw in fw_versions:
+ match = FW_PATTERN.match(fw)
+ if match is not None:
+ codes.add((match.group('model'), match.group('series'),
+ tuple(int(v) for v in match.group('version').split(b'.'))))
+
+ return codes
+
+
+@cache
+def _das_steering_cutoffs() -> dict[tuple[str, bytes, bytes], tuple[tuple[int, ...] | None, tuple[int, ...] | None]]:
+ """Per (platform, model code, series) family, the oldest known modern version and the newest
+ known legacy version. Tesla only ever moves a family forward, so these bound the split."""
+ # imported here because fingerprints.py imports this module
+ from iqdbc.car.tesla.fingerprints import FW_VERSIONS
+
+ legacy: defaultdict[tuple, set] = defaultdict(set)
+ modern: defaultdict[tuple, set] = defaultdict(set)
+ for platform, ecus in FW_VERSIONS.items():
+ known_legacy = LEGACY_DAS_STEERING_FW.get(platform, [])
+ for fws in ecus.values():
+ for fw in fws:
+ for model, series, version in get_platform_codes([fw]):
+ (legacy if fw in known_legacy else modern)[(platform, model, series)].add(version)
+
+ return {k: (min(modern[k]) if k in modern else None, max(legacy[k]) if k in legacy else None)
+ for k in set(legacy) | set(modern)}
+
+
+def is_legacy_das_steering(candidate: str, fw: bytes) -> bool:
+ """Whether an EPS FW uses the 2-bit DAS_steeringControlType. Unknown firmware newer than
+ anything in a family is treated as modern: cars only move forward, and someone left behind
+ on legacy software can force the platform with CarPlatformBundle."""
+ if fw in LEGACY_DAS_STEERING_FW.get(candidate, []):
+ return True
+
+ codes = get_platform_codes([fw])
+ if not len(codes):
+ return False
+
+ model, series, version = next(iter(codes))
+ first_modern, last_legacy = _das_steering_cutoffs().get((candidate, model, series), (None, None))
+ if first_modern is not None:
+ return version < first_modern
+
+ return last_legacy is not None and version <= last_legacy
+
+
+def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, vin: str, offline_fw_versions: OfflineFwVersions) -> set[str]:
+ # Tesla fingerprints on the EPS alone and Ecu.eps is in FUZZY_EXCLUDE_ECUS, so the generic fuzzy
+ # matcher can never match a Tesla. Match on the model code, which survives the EPS version bumps
+ # that ship with Tesla software updates. The series is deliberately not required to be known:
+ # Tesla bumps it within a platform (E4014 -> E4015, Y4002 -> Y4003).
+ offline_codes: defaultdict[bytes, set[str]] = defaultdict(set)
+ for candidate, ecus in offline_fw_versions.items():
+ for fws in ecus.values():
+ for model, _, _ in get_platform_codes(fws):
+ offline_codes[model].add(candidate)
+
+ candidates: set[str] = set()
+ for ecu, addr, sub_addr in {e for ecus in offline_fw_versions.values() for e in ecus}:
+ if ecu != Ecu.eps:
+ continue
+ for model, _, _ in get_platform_codes(live_fw_versions.get((addr, sub_addr), set())):
+ candidates |= offline_codes[model]
+
+ return candidates if len(candidates) == 1 else set()
+
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.SUPPLIER_SOFTWARE_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.SUPPLIER_SOFTWARE_VERSION_RESPONSE],
+ bus=0,
+ )
+ ],
+ match_fw_to_car_fuzzy=match_fw_to_car_fuzzy,
+)
+
+
+class CANBUS:
+ party = 0
+ vehicle = 1
+ autopilot_party = 2
+
+
+GEAR_MAP = {
+ "DI_GEAR_INVALID": CarState.GearShifter.unknown,
+ "DI_GEAR_P": CarState.GearShifter.park,
+ "DI_GEAR_R": CarState.GearShifter.reverse,
+ "DI_GEAR_N": CarState.GearShifter.neutral,
+ "DI_GEAR_D": CarState.GearShifter.drive,
+ "DI_GEAR_SNA": CarState.GearShifter.unknown,
+}
+
+
+# Add extra tolerance for average banked road since safety doesn't have the roll
+AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll lowers lateral acceleration
+
+
+class CarControllerParams:
+ ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits(
+ # EPAS faults above this angle
+ 360, # deg
+ # Tesla uses a vehicle model instead, check carcontroller.py for details
+ ([], []),
+ ([], []),
+
+ # Vehicle model angle limits
+ # Add extra tolerance for average banked road since safety doesn't have the roll
+ MAX_LATERAL_ACCEL=ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^2
+ MAX_LATERAL_JERK=3.0 + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^3
+
+ # limit angle rate to both prevent a fault and for low speed comfort (~12 mph rate down to 0 mph)
+ MAX_ANGLE_RATE=5, # deg/20ms frame, EPS faults at 12 at a standstill
+ )
+
+ STEER_STEP = 2 # Angle command is sent at 50 Hz
+ 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
+ JERK_LIMIT_MIN = -4.9 # m/s^3, ACC faults at 5.0
+ JERK_UP = 1.0 # m/s^3
+
+
+class TeslaSafetyFlags(IntFlag):
+ LONG_CONTROL = 1
+ LEGACY_DAS_STEERING = 2
+
+
+class TeslaFlags(IntFlag):
+ LONG_CONTROL = 1
+ LEGACY_DAS_STEERING = 2
+ MISSING_DAS_SETTINGS = 4
+
+
+DBC = CAR.create_dbc_map()
+
+STEER_THRESHOLD = 1
diff --git a/iqdbc_repo/iqdbc/car/tests/__init__.py b/iqdbc_repo/iqdbc/car/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/tests/car_diff.py b/iqdbc_repo/iqdbc/car/tests/car_diff.py
new file mode 100755
index 000000000..dd16eba0a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/car_diff.py
@@ -0,0 +1,323 @@
+#!/usr/bin/env python3
+import argparse
+import os
+import pickle
+import re
+import subprocess
+import sys
+import tempfile
+import traceback
+import zstandard as zstd
+from tqdm import tqdm
+from tqdm.contrib.concurrent import process_map
+from urllib.request import urlopen
+from collections import defaultdict
+from pathlib import Path
+from typing import Any
+
+
+from iqdbc.car import structs
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.car_helpers import can_fingerprint, interfaces
+from iqdbc.car.logreader import LogReader, decompress_stream
+
+
+TOLERANCE = 1e-4
+DIFF_BUCKET = "car_diff"
+IGNORE_FIELDS = ["cumLagMs", "canErrorCounter"]
+PADDING = 5
+
+Diff = tuple[str, int, tuple[Any, Any], int]
+Ref = tuple[int, structs.CarState]
+Result = tuple[str, str, list[Diff], list[Ref] | None, list[structs.CarState] | None, str | None]
+
+
+def dict_diff(d1: dict[str, Any], d2: dict[str, Any], path: str = "", ignore: list[str] | None = None, tolerance: float = 0) -> list[tuple]:
+ ignore = ignore or []
+ diffs = []
+ for key in d1.keys() | d2.keys():
+ if key in ignore:
+ continue
+ full_path = f"{path}.{key}" if path else key
+ v1, v2 = d1.get(key), d2.get(key)
+ if isinstance(v1, dict) and isinstance(v2, dict):
+ diffs.extend(dict_diff(v1, v2, full_path, ignore, tolerance))
+ elif isinstance(v1, (int, float)) and isinstance(v2, (int, float)):
+ if abs(v1 - v2) > tolerance:
+ diffs.append(("change", full_path, (v1, v2)))
+ elif v1 != v2:
+ diffs.append(("change", full_path, (v1, v2)))
+ return diffs
+
+
+def load_can_messages(seg: str) -> list[Any]:
+ from comma_car_segments import get_url
+ parts = seg.split("/")
+ url = get_url(f"{parts[0]}/{parts[1]}", parts[2])
+ msgs = LogReader(url, only_union_types=True, sort_by_time=True)
+ return [m for m in msgs if m.which() == 'can']
+
+
+def replay_segment(platform: str, can_msgs: list[Any]) -> tuple[structs.CarParams, list[structs.CarState], list[int]]:
+ _can_msgs = ([CanData(can.address, can.dat, can.src) for can in m.can] for m in can_msgs)
+
+ def can_recv(wait_for_one: bool = False) -> list[list[CanData]]:
+ return [next(_can_msgs, [])]
+
+ _, fingerprint = can_fingerprint(can_recv)
+
+ CarInterface = interfaces[platform]
+ CP = CarInterface.get_params(platform, fingerprint, [], False, False, False)
+ CP_IQ = CarInterface.get_params_iq(CP, platform, fingerprint, [], False, False, False)
+ CI = CarInterface(CP, CP_IQ)
+ CC = structs.CarControl().as_reader()
+
+ states, timestamps = [], []
+ for msg in can_msgs:
+ frames = [CanData(c.address, c.dat, c.src) for c in msg.can]
+ states.append(CI.update([(msg.logMonoTime, frames)]))
+ CI.apply(CC, msg.logMonoTime)
+ timestamps.append(msg.logMonoTime)
+ return CP, states, timestamps
+
+
+def process_segment(args: tuple) -> Result:
+ platform, seg, ref_path, update = args
+ try:
+ can_msgs = load_can_messages(seg)
+ CP, states, timestamps = replay_segment(platform, can_msgs)
+ ref_file = Path(ref_path) / f"{platform}_{seg.replace('/', '_')}.zst"
+
+ if update:
+ data = {"cp": CP.to_dict(), "frames": list(zip(timestamps, states, strict=True))}
+ ref_file.write_bytes(zstd.compress(pickle.dumps(data), 10))
+ return (platform, seg, [], None, None, None)
+
+ if not ref_file.exists():
+ return (platform, seg, [], None, None, "no ref")
+
+ ref_data = pickle.loads(decompress_stream(ref_file.read_bytes()))
+ cp: dict[str, Any] = ref_data["cp"]
+ ref: list[Ref] = ref_data["frames"]
+ diffs = []
+ for diff in dict_diff(cp, CP.to_dict(), path="carParams", ignore=IGNORE_FIELDS, tolerance=TOLERANCE):
+ diffs.append((diff[1], -1, diff[2], 0))
+ for i, ((ts, ref_state), state) in enumerate(zip(ref, states, strict=True)):
+ for diff in dict_diff(ref_state.to_dict(), state.to_dict(), ignore=IGNORE_FIELDS, tolerance=TOLERANCE):
+ diffs.append((diff[1], i, diff[2], ts))
+ return (platform, seg, diffs, ref, states, None)
+ except Exception:
+ return (platform, seg, [], None, None, traceback.format_exc())
+
+
+def get_changed_platforms(cwd: Path, database: dict[str, Any], interfaces: dict[str, Any]) -> list[str]:
+ git_ref = os.environ.get("GIT_REF", "origin/master")
+ changed = subprocess.check_output(["git", "diff", "--name-only", f"{git_ref}...HEAD"], cwd=cwd, encoding='utf8').strip()
+ brands = set()
+ patterns = [r"iqdbc/car/(\w+)/", r"iqdbc/dbc/(\w+?)_", r"iqdbc/dbc/generator/(\w+)", r"iqdbc/safety/modes/(\w+?)[_.]"]
+ for line in changed.splitlines():
+ for pattern in patterns:
+ m = re.search(pattern, line)
+ if m:
+ brands.add(m.group(1).lower())
+ return [p for p in interfaces if any(b in p.lower() for b in brands) and p in database]
+
+
+def download_refs(ref_path: Path, platforms: list[str], segments: dict[str, list[str]]) -> None:
+ base_url = f"https://raw.githubusercontent.com/commaai/ci-artifacts/refs/heads/{DIFF_BUCKET}"
+ for platform in tqdm(platforms):
+ for seg in segments.get(platform, []):
+ filename = f"{platform}_{seg.replace('/', '_')}.zst"
+ with urlopen(f"{base_url}/{filename}") as resp:
+ (Path(ref_path) / filename).write_bytes(resp.read())
+
+
+def run_replay(platforms: list[str], segments: dict[str, list[str]], ref_path: Path, update: bool, workers: int = 4) -> list[Result]:
+ work = [(platform, seg, ref_path, update)
+ for platform in platforms for seg in segments.get(platform, [])]
+ return process_map(process_segment, work, max_workers=workers)
+
+
+# ASCII waveforms helpers
+def find_edges(vals: list[bool]) -> tuple[list[int], list[int]]:
+ rises = []
+ falls = []
+ prev = vals[0]
+ for i, val in enumerate(vals):
+ if val and not prev:
+ rises.append(i)
+ if not val and prev:
+ falls.append(i)
+ prev = val
+ return rises, falls
+
+
+def render_waveform(label: str, vals: list[bool]) -> str:
+ wave = {(False, False): "_", (True, True): "‾", (False, True): "/", (True, False): "\\"}
+ line = f" {label}:".ljust(12)
+ prev = vals[0]
+ for val in vals:
+ line += wave[(prev, val)]
+ prev = val
+ if len(line) > 80:
+ line = line[:80] + "..."
+ return line
+
+
+def format_timing(edge_type: str, master_edges: list[int], pr_edges: list[int], ms_per_frame: float) -> str | None:
+ if not master_edges or not pr_edges:
+ return None
+ delta = pr_edges[0] - master_edges[0]
+ if delta == 0:
+ return None
+ direction = "lags" if delta > 0 else "leads"
+ ms = int(abs(delta) * ms_per_frame)
+ return " " * 12 + f"{edge_type}: PR {direction} by {abs(delta)} frames ({ms}ms)"
+
+
+def group_frames(diffs: list[Diff], max_gap: int = 15) -> list[list[Diff]]:
+ groups = []
+ current = [diffs[0]]
+ for diff in diffs[1:]:
+ _, frame, _, _ = diff
+ _, prev_frame, _, _ = current[-1]
+ if frame <= prev_frame + max_gap:
+ current.append(diff)
+ else:
+ groups.append(current)
+ current = [diff]
+ groups.append(current)
+ return groups
+
+
+def build_signals(group: list[Diff], ref: list[Ref], states: list[structs.CarState], field: str) -> tuple[list[Any], list[Any], int, int]:
+ _, first_frame, _, _ = group[0]
+ _, last_frame, _, _ = group[-1]
+ start = max(0, first_frame - PADDING)
+ end = min(last_frame + PADDING + 1, len(ref))
+ master_vals = []
+ pr_vals = []
+ for frame in range(start, end):
+ mval = ref[frame][1].to_dict()
+ pval = states[frame].to_dict()
+ for k in field.split("."):
+ mval = mval.get(k) if isinstance(mval, dict) else None
+ pval = pval.get(k) if isinstance(pval, dict) else None
+ master_vals.append(mval)
+ pr_vals.append(pval)
+ return master_vals, pr_vals, start, end
+
+
+def format_numeric_diffs(diffs: list[Diff]) -> list[str]:
+ lines = []
+ for _, frame, (old_val, new_val), _ in diffs[:10]:
+ lines.append(f" frame {frame}: {old_val} -> {new_val}")
+ if len(diffs) > 10:
+ lines.append(f" (... {len(diffs) - 10} more)")
+ return lines
+
+
+def format_boolean_diffs(diffs: list[Diff], ref: list[Ref], states: list[structs.CarState], field: str) -> list[str]:
+ _, first_frame, _, first_ts = diffs[0]
+ _, last_frame, _, last_ts = diffs[-1]
+ frame_time = last_frame - first_frame
+ time_ms = (last_ts - first_ts) / 1e6
+ ms = time_ms / frame_time if frame_time else 10.0
+ lines = []
+ for group in group_frames(diffs):
+ master_vals, pr_vals, start, end = build_signals(group, ref, states, field)
+ master_rises, master_falls = find_edges(master_vals)
+ pr_rises, pr_falls = find_edges(pr_vals)
+ lines.append(f"\n frames {start}-{end - 1}")
+ lines.append(render_waveform("master", master_vals))
+ lines.append(render_waveform("PR", pr_vals))
+ for edge_type, master_edges, pr_edges in [("rise", master_rises, pr_rises), ("fall", master_falls, pr_falls)]:
+ msg = format_timing(edge_type, master_edges, pr_edges, ms)
+ if msg:
+ lines.append(msg)
+ return lines
+
+
+def format_diff(diffs: list[Diff], ref: list[Ref], states: list[structs.CarState], field: str) -> list[str]:
+ if not diffs:
+ return []
+ _, _, (old, new), _ = diffs[0]
+ is_bool = isinstance(old, bool) and isinstance(new, bool)
+ if is_bool:
+ return format_boolean_diffs(diffs, ref, states, field)
+ return format_numeric_diffs(diffs)
+
+
+def main(platform: str | None = None, segments_per_platform: int = 10, update_refs: bool = False, all_platforms: bool = False) -> int:
+ from comma_car_segments import get_comma_car_segments_database
+ cwd = Path(__file__).resolve().parents[3]
+ ref_path = cwd / DIFF_BUCKET
+ if not update_refs:
+ ref_path = Path(tempfile.mkdtemp())
+ ref_path.mkdir(exist_ok=True)
+ database = get_comma_car_segments_database()
+
+ if all_platforms:
+ print("Running all platforms...")
+ platforms = [p for p in interfaces if p in database]
+ elif platform and platform in interfaces:
+ platforms = [platform]
+ else:
+ platforms = get_changed_platforms(cwd, database, interfaces)
+
+ print("## Car behavior report")
+ print("Replays driving segments through this PR and compares the behavior to master.")
+ print("Please review any changes carefully to ensure they are expected.\n")
+
+ if not platforms:
+ print("✅ No changes detected")
+ return 0
+
+ segments = {p: database.get(p, [])[:segments_per_platform] for p in platforms}
+ n_segments = sum(len(s) for s in segments.values())
+ print(f"{'Generating' if update_refs else 'Testing'} {n_segments} segments for: {', '.join(platforms)}")
+
+ if update_refs:
+ results = run_replay(platforms, segments, ref_path, update=True)
+ errors = [e for _, _, _, _, _, e in results if e]
+ assert len(errors) == 0, f"Segment failures: {errors}"
+ print(f"Generated {n_segments} refs to {ref_path}")
+ return 0
+
+ download_refs(ref_path, platforms, segments)
+ results = run_replay(platforms, segments, ref_path, update=False)
+ with_diffs = [(platform, seg, diffs, ref, states)
+ for platform, seg, diffs, ref, states, err in results if diffs]
+ errors = [(platform, seg, err) for platform, seg, diffs, ref, states, err in results if err]
+ n_passed = len(results) - len(with_diffs) - len(errors)
+
+ icon = "⚠️" if with_diffs else "✅"
+ print(f"\n{icon} {len(with_diffs)} changed, {n_passed} passed, {len(errors)} errors")
+
+ for plat, seg, err in errors:
+ print(f"\nERROR {plat} - {seg}: {err}")
+
+ if with_diffs:
+ print("Show changes \n\n```")
+ for plat, seg, diffs, ref, states in with_diffs:
+ print(f"\n{plat} - {seg}")
+ by_field = defaultdict(list)
+ for d in diffs:
+ by_field[d[0]].append(d)
+ for field, fd in sorted(by_field.items()):
+ print(f"\n {field} ({len(fd)} diffs)")
+ for line in format_diff(fd, ref, states, field):
+ print(line)
+ print("```\n ")
+
+ return 1 if errors else 0
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--platform", help="diff single platform")
+ parser.add_argument("--segments-per-platform", type=int, default=10, help="number of segments to diff per platform")
+ parser.add_argument("--update-refs", action="store_true", help="update refs based on current commit")
+ parser.add_argument("--all", action="store_true", help="run diff on all platforms")
+ args = parser.parse_args()
+ sys.exit(main(args.platform, args.segments_per_platform, args.update_refs, args.all))
diff --git a/iqdbc_repo/iqdbc/car/tests/routes.py b/iqdbc_repo/iqdbc/car/tests/routes.py
new file mode 100644
index 000000000..4a826da41
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/routes.py
@@ -0,0 +1,370 @@
+from typing import NamedTuple
+
+from iqdbc.car.chrysler.values import CAR as CHRYSLER
+from iqdbc.car.gm.values import CAR as GM
+from iqdbc.car.ford.values import CAR as FORD
+from iqdbc.car.honda.values import CAR as HONDA
+from iqdbc.car.hyundai.values import CAR as HYUNDAI
+from iqdbc.car.nissan.values import CAR as NISSAN
+from iqdbc.car.mazda.values import CAR as MAZDA
+from iqdbc.car.mock.values import CAR as MOCK
+from iqdbc.car.rivian.values import CAR as RIVIAN
+from iqdbc.car.subaru.values import CAR as SUBARU
+from iqdbc.car.tesla.values import CAR as TESLA
+from iqdbc.car.toyota.values import CAR as TOYOTA
+from iqdbc.car.values import Platform
+from iqdbc.car.volkswagen.values import CAR as VOLKSWAGEN
+from iqdbc.car.body.values import CAR as COMMA
+from iqdbc.car.psa.values import CAR as PSA
+
+# FIXME: add routes for these cars
+non_tested_cars = [
+ MOCK.MOCK,
+ GM.CADILLAC_ATS,
+ GM.HOLDEN_ASTRA,
+ GM.CHEVROLET_MALIBU,
+ HYUNDAI.GENESIS_G90,
+ VOLKSWAGEN.VOLKSWAGEN_CRAFTER_MK2, # need a route from an ACC-equipped Crafter
+ SUBARU.SUBARU_FORESTER_HYBRID,
+ VOLKSWAGEN.PORSCHE_MACAN_MK1,
+ # Honda/Acura test routes below expired, replace when CI bucket sync is fixed
+ HONDA.ACURA_TLX_2G,
+ HONDA.HONDA_NBOX_2G,
+ HONDA.ACURA_MDX_4G_MMR,
+ HONDA.HONDA_CITY_7G,
+
+ # These had their DSUs unplugged, need new routes
+ # TOYOTA.LEXUS_ES # hybrid
+ TOYOTA.TOYOTA_COROLLA,
+ TOYOTA.TOYOTA_RAV4H,
+
+ # port extensions
+ HYUNDAI.KIA_CEED_PHEV_2022_NON_SCC,
+ HYUNDAI.HYUNDAI_KONA_EV_NON_SCC,
+ HYUNDAI.HYUNDAI_BAYON_1ST_GEN_NON_SCC,
+ HYUNDAI.HYUNDAI_ELANTRA_2022_NON_SCC,
+ HYUNDAI.HYUNDAI_KONA_NON_SCC,
+ HYUNDAI.KIA_FORTE_2019_NON_SCC,
+ HYUNDAI.KIA_FORTE_2021_NON_SCC,
+ HYUNDAI.KIA_SELTOS_2023_NON_SCC,
+ HYUNDAI.GENESIS_G70_2021_NON_SCC,
+ HONDA.HONDA_CLARITY,
+ GM.CHEVROLET_BOLT_NON_ACC,
+ GM.CHEVROLET_BOLT_NON_ACC_1ST_GEN,
+ GM.CHEVROLET_BOLT_NON_ACC_2ND_GEN,
+ GM.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN,
+ GM.CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN,
+ GM.CADILLAC_CT6_NON_ACC_1ST_GEN,
+ GM.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN,
+ GM.CHEVROLET_MALIBU_NON_ACC_9TH_GEN,
+ GM.CADILLAC_XT5_NON_ACC_1ST_GEN,
+]
+
+
+class CarTestRoute(NamedTuple):
+ route: str
+ car_model: Platform | None
+ segment: int | None = None
+
+
+routes = [
+ CarTestRoute("efdf9af95e71cd84/2022-05-13--19-03-31", COMMA.COMMA_BODY),
+
+ CarTestRoute("0c94aa1e1296d7c6/2021-05-05--19-48-37", CHRYSLER.JEEP_GRAND_CHEROKEE),
+ CarTestRoute("91dfedae61d7bd75/2021-05-22--20-07-52", CHRYSLER.JEEP_GRAND_CHEROKEE_2019),
+ CarTestRoute("420a8e183f1aed48/2020-03-05--07-15-29", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID), # 2017
+ CarTestRoute("43a685a66291579b/2021-05-27--19-47-29", CHRYSLER.CHRYSLER_PACIFICA_2018),
+ CarTestRoute("378472f830ee7395/2021-05-28--07-38-43", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID),
+ CarTestRoute("8190c7275a24557b/2020-01-29--08-33-58", CHRYSLER.CHRYSLER_PACIFICA_2019_HYBRID),
+ CarTestRoute("3d84727705fecd04/2021-05-25--08-38-56", CHRYSLER.CHRYSLER_PACIFICA_2020),
+ CarTestRoute("221c253375af4ee9/2022-06-15--18-38-24", CHRYSLER.RAM_1500_5TH_GEN),
+ CarTestRoute("8fb5eabf914632ae/2022-08-04--17-28-53", CHRYSLER.RAM_HD_5TH_GEN, segment=6),
+ CarTestRoute("3379c85aeedc8285/2023-12-07--17-49-39", CHRYSLER.DODGE_DURANGO),
+
+ CarTestRoute("54827bf84c38b14f/2023-01-25--14-14-11", FORD.FORD_BRONCO_SPORT_MK1),
+ CarTestRoute("f8eaaccd2a90aef8/2023-05-04--15-10-09", FORD.FORD_ESCAPE_MK4),
+ CarTestRoute("56574443e0c3783c/00000002--c00bd0fe69", FORD.FORD_ESCAPE_MK4_5),
+ CarTestRoute("62241b0c7fea4589/2022-09-01--15-32-49", FORD.FORD_EXPLORER_MK6),
+ 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),
+ CarTestRoute("61a1b9e7a4eae0f6/00000000--79d85d1315", FORD.FORD_EXPEDITION_MK4),
+ #TestRoute("f1b4c567731f4a1b/2018-04-30--10-15-35", FORD.FUSION),
+
+ CarTestRoute("7cc2a8365b4dd8a9/2018-12-02--12-10-44", GM.GMC_ACADIA),
+ CarTestRoute("aa20e335f61ba898/2019-02-05--16-59-04", GM.BUICK_REGAL),
+ CarTestRoute("75a6bcb9b8b40373/2023-03-11--22-47-33", GM.BUICK_LACROSSE),
+ CarTestRoute("e746f59bc96fd789/2024-01-31--22-25-58", GM.CHEVROLET_EQUINOX),
+ CarTestRoute("ef8f2185104d862e/2023-02-09--18-37-13", GM.CADILLAC_ESCALADE),
+ CarTestRoute("46460f0da08e621e/2021-10-26--07-21-46", GM.CADILLAC_ESCALADE_ESV),
+ CarTestRoute("168f8b3be57f66ae/2023-09-12--21-44-42", GM.CADILLAC_ESCALADE_ESV_2019),
+ CarTestRoute("c950e28c26b5b168/2018-05-30--22-03-41", GM.CHEVROLET_VOLT),
+ CarTestRoute("f08912a233c1584f/2022-08-11--18-02-41", GM.CHEVROLET_BOLT_EUV, segment=1),
+ CarTestRoute("555d4087cf86aa91/2022-12-02--12-15-07", GM.CHEVROLET_BOLT_EUV, segment=14), # Bolt EV
+ CarTestRoute("38aa7da107d5d252/2022-08-15--16-01-12", GM.CHEVROLET_SILVERADO),
+ CarTestRoute("5085c761395d1fe6/2023-04-07--18-20-06", GM.CHEVROLET_TRAILBLAZER),
+ CarTestRoute("162796f1469f2f1b/00000005--6f334eda14", GM.CADILLAC_XT4),
+ CarTestRoute("477dd485611d1e6e/00000009--85fc06e10a", GM.CHEVROLET_VOLT_2019),
+ CarTestRoute("a40976dc9f28ba62/0000001f--160e210119", GM.CHEVROLET_TRAVERSE),
+ CarTestRoute("36c62b5da6f08154/00000052--983c17c5b2", GM.GMC_YUKON),
+
+ CarTestRoute("0e7a2ba168465df5/2020-10-18--14-14-22", HONDA.ACURA_RDX_3G),
+ CarTestRoute("a74b011b32b51b56/2020-07-26--17-09-36", HONDA.HONDA_CIVIC),
+ CarTestRoute("a859a044a447c2b0/2020-03-03--18-42-45", HONDA.HONDA_CRV_EU),
+ CarTestRoute("68aac44ad69f838e/2021-05-18--20-40-52", HONDA.HONDA_CRV),
+ CarTestRoute("14fed2e5fa0aa1a5/2021-05-25--14-59-42", HONDA.HONDA_CRV_HYBRID),
+ CarTestRoute("52f3e9ae60c0d886/2021-05-23--15-59-43", HONDA.HONDA_FIT),
+ CarTestRoute("2c4292a5cd10536c/2021-08-19--21-32-15", HONDA.HONDA_FREED),
+ CarTestRoute("03be5f2fd5c508d1/2020-04-19--18-44-15", HONDA.HONDA_HRV),
+ CarTestRoute("320098ff6c5e4730/2023-04-13--17-47-46", HONDA.HONDA_HRV_3G),
+ CarTestRoute("147613502316e718/00000001--dd141a3140", HONDA.HONDA_HRV_3G), # Brazilian model
+ CarTestRoute("1e4baee1aa2687a0/00000001--74c4cc0b23", HONDA.HONDA_HRV_3G), # Thailand model use ALT_GEAR
+ CarTestRoute("917b074700869333/2021-05-24--20-40-20", HONDA.ACURA_ILX),
+ CarTestRoute("08a3deb07573f157/2020-03-06--16-11-19", HONDA.HONDA_ACCORD), # 1.5T
+ CarTestRoute("1da5847ac2488106/2021-05-24--19-31-50", HONDA.HONDA_ACCORD), # 2.0T
+ CarTestRoute("085ac1d942c35910/2021-03-25--20-11-15", HONDA.HONDA_ACCORD), # 2021 with new style HUD msgs
+ CarTestRoute("07585b0da3c88459/2021-05-26--18-52-04", HONDA.HONDA_ACCORD), # hybrid
+ CarTestRoute("f29e2b57a55e7ad5/2021-03-24--20-52-38", HONDA.HONDA_ACCORD), # hybrid, 2021 with new style HUD msgs
+ CarTestRoute("1ad763dd22ef1a0e/2020-02-29--18-37-03", HONDA.HONDA_CRV_5G),
+ CarTestRoute("0a96f86fcfe35964/2020-02-05--07-25-51", HONDA.HONDA_ODYSSEY),
+ CarTestRoute("7817fe954aff07b8/00000001--fdaaf36c4f", HONDA.HONDA_ODYSSEY_TWN),
+ CarTestRoute("d7233a428eb7d0b5/00000001--9b99b04d43", HONDA.HONDA_ODYSSEY_5G_MMR),
+ CarTestRoute("d83f36766f8012a5/2020-02-05--18-42-21", HONDA.HONDA_CIVIC_BOSCH_DIESEL),
+ CarTestRoute("f0890d16a07a236b/2021-05-25--17-27-22", HONDA.HONDA_INSIGHT),
+ CarTestRoute("07d37d27996096b6/2020-03-04--21-57-27", HONDA.HONDA_PILOT),
+ CarTestRoute("684e8f96bd491a0e/2021-11-03--11-08-42", HONDA.HONDA_PILOT), # Passport
+ CarTestRoute("0a78dfbacc8504ef/2020-03-04--13-29-55", HONDA.HONDA_CIVIC_BOSCH),
+ CarTestRoute("f34a60d68d83b1e5/2020-10-06--14-35-55", HONDA.ACURA_RDX),
+ 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("b1c832ad56b6bc9d/00000010--debfcf5867", HONDA.HONDA_CIVIC_2022), # 2025 Civic Hatch Hybrid with new eCVT transmission
+ CarTestRoute("f9c43864cf057d05/2024-01-15--23-01-20", HONDA.HONDA_PILOT_4G), # TODO: Replace with a newer route
+ CarTestRoute("f39cf149898833ff/0000002b--54f3fae045", HONDA.HONDA_ACCORD_11G),
+ # CarTestRoute("56b2cf1dacdcd033/00000017--d24ffdb376", HONDA.HONDA_CITY_7G), # Brazilian model
+ CarTestRoute("2dc4489d7e1410ca/00000001--bbec3f5117", HONDA.HONDA_CRV_6G),
+ CarTestRoute("a703d058f4e05aeb/00000008--f169423024", HONDA.HONDA_PASSPORT_4G),
+ CarTestRoute("ad9840558640c31d/000001f2--026c4f6275", HONDA.ACURA_TLX_2G_MMR),
+
+ 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),
+ CarTestRoute("6fe86b4e410e4c37/2020-07-22--16-27-13", HYUNDAI.HYUNDAI_GENESIS),
+ CarTestRoute("b5d6dc830ad63071/2022-12-12--21-28-25", HYUNDAI.GENESIS_GV60_EV_1ST_GEN, segment=12),
+ CarTestRoute("70c5bec28ec8e345/2020-08-08--12-22-23", HYUNDAI.GENESIS_G70),
+ CarTestRoute("ca4de5b12321bd98/2022-10-18--21-15-59", HYUNDAI.GENESIS_GV70_1ST_GEN),
+ CarTestRoute("afe09b9f5d3f3548/00000011--15fefe1c50", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN),
+ CarTestRoute("afe09b9f5d3f3548/0000001b--a1129a4a15", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN), # openpilot longitudinal enabled
+ CarTestRoute("6b301bf83f10aa90/2020-11-22--16-45-07", HYUNDAI.GENESIS_G80),
+ CarTestRoute("66eaa6c3b6b2afc6/00000009--3a5199aabe", HYUNDAI.GENESIS_G80_2ND_GEN_FL), # LKA steering
+ CarTestRoute("0bbe367c98fa1538/2023-09-16--00-16-49", HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN),
+ 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),
+ CarTestRoute("bf43d9df2b660eb0/2021-09-23--14-16-37", HYUNDAI.HYUNDAI_SANTA_FE_2022),
+ CarTestRoute("37398f32561a23ad/2021-11-18--00-11-35", HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022),
+ CarTestRoute("656ac0d830792fcc/2021-12-28--14-45-56", HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022, segment=1),
+ CarTestRoute("de59124955b921d8/2023-06-24--00-12-50", HYUNDAI.KIA_CARNIVAL_4TH_GEN),
+ CarTestRoute("409c9409979a8abc/2023-07-11--09-06-44", HYUNDAI.KIA_CARNIVAL_4TH_GEN), # Chinese model
+ CarTestRoute("e0e98335f3ebc58f/2021-03-07--16-38-29", HYUNDAI.KIA_CEED),
+ CarTestRoute("7653b2bce7bcfdaa/2020-03-04--15-34-32", HYUNDAI.KIA_OPTIMA_G4),
+ CarTestRoute("018654717bc93d7d/2022-09-19--23-11-10", HYUNDAI.KIA_OPTIMA_G4_FL, segment=0),
+ CarTestRoute("f9716670b2481438/2023-08-23--14-49-50", HYUNDAI.KIA_OPTIMA_H),
+ CarTestRoute("6a42c1197b2a8179/2023-09-21--10-23-44", HYUNDAI.KIA_OPTIMA_H_G4_FL),
+ CarTestRoute("c75a59efa0ecd502/2021-03-11--20-52-55", HYUNDAI.KIA_SELTOS),
+ CarTestRoute("5b7c365c50084530/2020-04-15--16-13-24", HYUNDAI.HYUNDAI_SONATA),
+ CarTestRoute("b2a38c712dcf90bd/2020-05-18--18-12-48", HYUNDAI.HYUNDAI_SONATA_LF),
+ CarTestRoute("c344fd2492c7a9d2/2023-12-11--09-03-23", HYUNDAI.HYUNDAI_STARIA_4TH_GEN),
+ CarTestRoute("fb3fd42f0baaa2f8/2022-03-30--15-25-05", HYUNDAI.HYUNDAI_TUCSON),
+ CarTestRoute("db68bbe12250812c/2022-12-05--00-54-12", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # 2023
+ CarTestRoute("36e10531feea61a4/2022-07-25--13-37-42", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # hybrid
+ CarTestRoute("5875672fc1d4bf57/2020-07-23--21-33-28", HYUNDAI.KIA_SORENTO),
+ CarTestRoute("1d0d000db3370fd0/2023-01-04--22-28-42", HYUNDAI.KIA_SORENTO_4TH_GEN, segment=5),
+ CarTestRoute("fc19648042eb6896/2023-08-16--11-43-27", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, segment=14),
+ 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("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
+ CarTestRoute("2c5cf2dd6102e5da/2020-12-17--16-06-44", HYUNDAI.HYUNDAI_IONIQ_EV_2020),
+ CarTestRoute("610ebb9faaad6b43/2020-06-13--15-28-36", HYUNDAI.HYUNDAI_IONIQ_EV_LTD),
+ CarTestRoute("2c5cf2dd6102e5da/2020-06-26--16-00-08", HYUNDAI.HYUNDAI_IONIQ),
+ 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("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),
+ CarTestRoute("78ad5150de133637/2023-09-13--16-15-57", HYUNDAI.KIA_K8_HEV_1ST_GEN),
+ CarTestRoute("50c6c9b85fd1ff03/2020-10-26--17-56-06", HYUNDAI.KIA_NIRO_EV),
+ CarTestRoute("b153671049a867b3/2023-04-05--10-00-30", HYUNDAI.KIA_NIRO_EV_2ND_GEN),
+ CarTestRoute("173219cf50acdd7b/2021-07-05--10-27-41", HYUNDAI.KIA_NIRO_PHEV),
+ CarTestRoute("23349923ba5c4e3b/2023-12-02--08-51-54", HYUNDAI.KIA_NIRO_PHEV_2022),
+ CarTestRoute("34a875f29f69841a/2021-07-29--13-02-09", HYUNDAI.KIA_NIRO_HEV_2021),
+ CarTestRoute("db04d2c63990e3ba/2023-02-08--16-52-39", HYUNDAI.KIA_NIRO_HEV_2ND_GEN),
+ CarTestRoute("50a2212c41f65c7b/2021-05-24--16-22-06", HYUNDAI.KIA_FORTE),
+ CarTestRoute("192283cdbb7a58c2/2022-10-15--01-43-18", HYUNDAI.KIA_SPORTAGE_5TH_GEN),
+ CarTestRoute("09559f1fcaed4704/2023-11-16--02-24-57", HYUNDAI.KIA_SPORTAGE_5TH_GEN, segment=0), # openpilot longitudinal
+ CarTestRoute("b3537035ffe6a7d6/2022-10-17--15-23-49", HYUNDAI.KIA_SPORTAGE_5TH_GEN), # hybrid
+ CarTestRoute("c5ac319aa9583f83/2021-06-01--18-18-31", HYUNDAI.HYUNDAI_ELANTRA),
+ CarTestRoute("734ef96182ddf940/2022-10-02--16-41-44", HYUNDAI.HYUNDAI_ELANTRA_GT_I30),
+ CarTestRoute("82e9cdd3f43bf83e/2021-05-15--02-42-51", HYUNDAI.HYUNDAI_ELANTRA_2021),
+ CarTestRoute("715ac05b594e9c59/2021-06-20--16-21-07", HYUNDAI.HYUNDAI_ELANTRA_HEV_2021),
+ CarTestRoute("7120aa90bbc3add7/2021-08-02--07-12-31", HYUNDAI.HYUNDAI_SONATA_HYBRID),
+ CarTestRoute("715ac05b594e9c59/2021-10-27--23-24-56", HYUNDAI.GENESIS_G70_2020),
+ CarTestRoute("6b0d44d22df18134/2023-05-06--10-36-55", HYUNDAI.GENESIS_GV80),
+
+ CarTestRoute("00c829b1b7613dea/2021-06-24--09-10-10", TOYOTA.TOYOTA_ALPHARD_TSS2),
+ CarTestRoute("912119ebd02c7a42/2022-03-19--07-24-50", TOYOTA.TOYOTA_ALPHARD_TSS2), # hybrid
+ CarTestRoute("000cf3730200c71c/2021-05-24--10-42-05", TOYOTA.TOYOTA_AVALON),
+ CarTestRoute("0bb588106852abb7/2021-05-26--12-22-01", TOYOTA.TOYOTA_AVALON_2019),
+ CarTestRoute("87bef2930af86592/2021-05-30--09-40-54", TOYOTA.TOYOTA_AVALON_2019), # hybrid
+ CarTestRoute("e9966711cfb04ce3/2022-01-11--07-59-43", TOYOTA.TOYOTA_AVALON_TSS2),
+ CarTestRoute("eca1080a91720a54/2022-03-17--13-32-29", TOYOTA.TOYOTA_AVALON_TSS2), # hybrid
+ CarTestRoute("6cdecc4728d4af37/2020-02-23--15-44-18", TOYOTA.TOYOTA_CAMRY),
+ CarTestRoute("2f37c007683e85ba/2023-09-02--14-39-44", TOYOTA.TOYOTA_CAMRY), # openpilot longitudinal, with radar CAN filter
+ CarTestRoute("54034823d30962f5/2021-05-24--06-37-34", TOYOTA.TOYOTA_CAMRY), # hybrid
+ CarTestRoute("3456ad0cd7281b24/2020-12-13--17-45-56", TOYOTA.TOYOTA_CAMRY_TSS2),
+ CarTestRoute("ffccc77938ddbc44/2021-01-04--16-55-41", TOYOTA.TOYOTA_CAMRY_TSS2), # hybrid
+ # CarTestRoute("4e45c89c38e8ec4d/2021-05-02--02-49-28", TOYOTA.TOYOTA_COROLLA),
+ CarTestRoute("5f5afb36036506e4/2019-05-14--02-09-54", TOYOTA.TOYOTA_COROLLA_TSS2),
+ CarTestRoute("5ceff72287a5c86c/2019-10-19--10-59-02", TOYOTA.TOYOTA_COROLLA_TSS2), # hybrid
+ CarTestRoute("d2525c22173da58b/2021-04-25--16-47-04", TOYOTA.TOYOTA_PRIUS),
+ CarTestRoute("b14c5b4742e6fc85/2020-07-28--19-50-11", TOYOTA.TOYOTA_RAV4),
+ # CarTestRoute("32a7df20486b0f70/2020-02-06--16-06-50", TOYOTA.TOYOTA_RAV4H),
+ CarTestRoute("cdf2f7de565d40ae/2019-04-25--03-53-41", TOYOTA.TOYOTA_RAV4_TSS2),
+ CarTestRoute("a5c341bb250ca2f0/2022-05-18--16-05-17", TOYOTA.TOYOTA_RAV4_TSS2_2022),
+ CarTestRoute("ad5a3fa719bc2f83/2023-10-17--19-48-42", TOYOTA.TOYOTA_RAV4_TSS2_2023),
+ CarTestRoute("7e34a988419b5307/2019-12-18--19-13-30", TOYOTA.TOYOTA_RAV4_TSS2), # hybrid
+ CarTestRoute("2475fb3eb2ffcc2e/2022-04-29--12-46-23", TOYOTA.TOYOTA_RAV4_TSS2_2022), # hybrid
+ CarTestRoute("20ba9ade056a8c7b/2021-02-08--21-57-35", TOYOTA.TOYOTA_RAV4_PRIME), # SecOC
+ CarTestRoute("41ba5b181f29435d/00000001--e3ae76382f", TOYOTA.TOYOTA_RAV4_PRIME), # SecOC longitudinal
+ CarTestRoute("8bfb000e03b2a257/00000004--f9eee5f52e", TOYOTA.TOYOTA_SIENNA_4TH_GEN), # SecOC
+ CarTestRoute("0b54d0594d924cd9/00000057--b6206a3205", TOYOTA.TOYOTA_YARIS), # SecOC
+ CarTestRoute("7a31f030957b9c85/2023-04-01--14-12-51", TOYOTA.LEXUS_ES),
+ # CarTestRoute("37041c500fd30100/2020-12-30--12-17-24", TOYOTA.LEXUS_ES), # hybrid
+ CarTestRoute("e6a24be49a6cd46e/2019-10-29--10-52-42", TOYOTA.LEXUS_ES_TSS2),
+ CarTestRoute("f49e8041283f2939/2019-05-30--11-51-51", TOYOTA.LEXUS_ES_TSS2), # hybrid
+ CarTestRoute("da23c367491f53e2/2021-05-21--09-09-11", TOYOTA.LEXUS_CTH, segment=3),
+ CarTestRoute("32696cea52831b02/2021-11-19--18-13-30", TOYOTA.LEXUS_RC),
+ CarTestRoute("7f8f479cfa6f392a/00000001--9a84b69c9d", TOYOTA.LEXUS_RC_TSS2),
+ CarTestRoute("ab9b64a5e5960cba/2023-10-24--17-32-08", TOYOTA.LEXUS_GS_F),
+ CarTestRoute("886fcd8408d570e9/2020-01-29--02-18-55", TOYOTA.LEXUS_RX),
+ CarTestRoute("d27ad752e9b08d4f/2021-05-26--19-39-51", TOYOTA.LEXUS_RX), # hybrid
+ CarTestRoute("01b22eb2ed121565/2020-02-02--11-25-51", TOYOTA.LEXUS_RX_TSS2),
+ CarTestRoute("b74758c690a49668/2020-05-20--15-58-57", TOYOTA.LEXUS_RX_TSS2), # hybrid
+ CarTestRoute("964c09eb11ca8089/2020-11-03--22-04-00", TOYOTA.LEXUS_NX),
+ CarTestRoute("ec429c0f37564e3c/2020-02-01--17-28-12", TOYOTA.LEXUS_NX), # hybrid
+ CarTestRoute("3fd5305f8b6ca765/2021-04-28--19-26-49", TOYOTA.LEXUS_NX_TSS2),
+ CarTestRoute("09ae96064ed85a14/2022-06-09--12-22-31", TOYOTA.LEXUS_NX_TSS2), # hybrid
+ CarTestRoute("4765fbbf59e3cd88/2024-02-06--17-45-32", TOYOTA.LEXUS_LC_TSS2),
+ CarTestRoute("5afee5161ea1dcde/00000003--b8ae16aae0", TOYOTA.LEXUS_LS),
+ CarTestRoute("0a302ffddbb3e3d3/2020-02-08--16-19-08", TOYOTA.TOYOTA_HIGHLANDER_TSS2),
+ CarTestRoute("437e4d2402abf524/2021-05-25--07-58-50", TOYOTA.TOYOTA_HIGHLANDER_TSS2), # hybrid
+ CarTestRoute("3183cd9b021e89ce/2021-05-25--10-34-44", TOYOTA.TOYOTA_HIGHLANDER),
+ CarTestRoute("80d16a262e33d57f/2021-05-23--20-01-43", TOYOTA.TOYOTA_HIGHLANDER), # hybrid
+ CarTestRoute("eb6acd681135480d/2019-06-20--20-00-00", TOYOTA.TOYOTA_SIENNA),
+ CarTestRoute("2e07163a1ba9a780/2019-08-25--13-15-13", TOYOTA.LEXUS_IS),
+ CarTestRoute("649bf2997ada6e3a/2023-08-08--18-04-22", TOYOTA.LEXUS_IS_TSS2),
+ CarTestRoute("0a0de17a1e6a2d15/2020-09-21--21-24-41", TOYOTA.TOYOTA_PRIUS_TSS2),
+ CarTestRoute("9b36accae406390e/2021-03-30--10-41-38", TOYOTA.TOYOTA_MIRAI),
+ CarTestRoute("cd9cff4b0b26c435/2021-05-13--15-12-39", TOYOTA.TOYOTA_CHR),
+ CarTestRoute("57858ede0369a261/2021-05-18--20-34-20", TOYOTA.TOYOTA_CHR), # hybrid
+ CarTestRoute("ea8fbe72b96a185c/2023-02-08--15-11-46", TOYOTA.TOYOTA_CHR_TSS2),
+ CarTestRoute("ea8fbe72b96a185c|2023-02-22--09-20-34", TOYOTA.TOYOTA_CHR_TSS2), # openpilot longitudinal, with smartDSU
+ CarTestRoute("6719965b0e1d1737/2023-02-09--22-44-05", TOYOTA.TOYOTA_CHR_TSS2), # hybrid
+ CarTestRoute("6719965b0e1d1737/2023-08-29--06-40-05", TOYOTA.TOYOTA_CHR_TSS2), # hybrid, openpilot longitudinal, radar disabled
+ CarTestRoute("14623aae37e549f3/2021-10-24--01-20-49", TOYOTA.TOYOTA_PRIUS_V),
+
+ CarTestRoute("202c40641158a6e5/2021-09-21--09-43-24", VOLKSWAGEN.VOLKSWAGEN_ARTEON_MK1),
+ CarTestRoute("2c68dda277d887ac/2021-05-11--15-22-20", VOLKSWAGEN.VOLKSWAGEN_ATLAS_MK1),
+ CarTestRoute("ffcd23abbbd02219/2024-02-28--14-59-38", VOLKSWAGEN.VOLKSWAGEN_CADDY_MK3),
+ CarTestRoute("cae14e88932eb364/2021-03-26--14-43-28", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK7), # Stock ACC
+ CarTestRoute("3cfdec54aa035f3f/2022-10-13--14-58-58", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK7), # openpilot longitudinal
+ CarTestRoute("578742b26807f756|00000010--41ee3e5bec", VOLKSWAGEN.VOLKSWAGEN_JETTA_MK6),
+ CarTestRoute("58a7d3b707987d65/2021-03-25--17-26-37", VOLKSWAGEN.VOLKSWAGEN_JETTA_MK7),
+ CarTestRoute("4d134e099430fba2/2021-03-26--00-26-06", VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8),
+ CarTestRoute("b29ee8c5a0a735d1|000000dc--a384e9083e", VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS, segment=0),
+ CarTestRoute("0f53129ed44f6920|00000287--3efbddeb96", VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS, segment=0),
+ CarTestRoute("0cd0b7f7e31a3853/2021-11-03--19-30-22", VOLKSWAGEN.VOLKSWAGEN_POLO_MK6),
+ CarTestRoute("064d1816e448f8eb/2022-09-29--15-32-34", VOLKSWAGEN.VOLKSWAGEN_SHARAN_MK2),
+ CarTestRoute("7d82b2f3a9115f1f/2021-10-21--15-39-42", VOLKSWAGEN.VOLKSWAGEN_TAOS_MK1),
+ CarTestRoute("2744c89a8dda9a51/2021-07-24--21-28-06", VOLKSWAGEN.VOLKSWAGEN_TCROSS_MK1),
+ CarTestRoute("2cef8a0b898f331a/2021-03-25--20-13-57", VOLKSWAGEN.VOLKSWAGEN_TIGUAN_MK2),
+ CarTestRoute("a589dcc642fdb10a/2021-06-14--20-54-26", VOLKSWAGEN.VOLKSWAGEN_TOURAN_MK2),
+ CarTestRoute("a459f4556782eba1/2021-09-19--09-48-00", VOLKSWAGEN.VOLKSWAGEN_TRANSPORTER_T61),
+ CarTestRoute("0cd0b7f7e31a3853/2021-11-18--00-38-32", VOLKSWAGEN.VOLKSWAGEN_TROC_MK1),
+ CarTestRoute("07667b885add75fd/2021-01-23--19-48-42", VOLKSWAGEN.AUDI_A3_MK3),
+ CarTestRoute("6c6b466346192818/2021-06-06--14-17-47", VOLKSWAGEN.AUDI_Q2_MK1),
+ CarTestRoute("0cd0b7f7e31a3853/2021-12-03--03-12-05", VOLKSWAGEN.AUDI_Q3_MK2),
+ CarTestRoute("8f205bdd11bcbb65/2021-03-26--01-00-17", VOLKSWAGEN.SEAT_ATECA_MK1),
+ CarTestRoute("fc6b6c9a3471c846/2021-05-27--13-39-56", VOLKSWAGEN.SEAT_ATECA_MK1), # Leon
+ CarTestRoute("0bbe367c98fa1538/2023-03-04--17-46-11", VOLKSWAGEN.SKODA_FABIA_MK4),
+ CarTestRoute("12d6ae3057c04b0d/2021-09-15--00-04-07", VOLKSWAGEN.SKODA_KAMIQ_MK1),
+ CarTestRoute("12d6ae3057c04b0d/2021-09-04--21-21-21", VOLKSWAGEN.SKODA_KAROQ_MK1),
+ CarTestRoute("90434ff5d7c8d603/2021-03-15--12-07-31", VOLKSWAGEN.SKODA_KODIAQ_MK1),
+ CarTestRoute("66e5edc3a16459c5/2021-05-25--19-00-29", VOLKSWAGEN.SKODA_OCTAVIA_MK3),
+ CarTestRoute("026b6d18fba6417f/2021-03-26--09-17-04", VOLKSWAGEN.SKODA_KAMIQ_MK1), # Scala
+ CarTestRoute("b2e9858e29db492b/2021-03-26--16-58-42", VOLKSWAGEN.SKODA_SUPERB_MK3),
+
+ CarTestRoute("3c8f0c502e119c1c/2020-06-30--12-58-02", SUBARU.SUBARU_ASCENT),
+ CarTestRoute("c321c6b697c5a5ff/2020-06-23--11-04-33", SUBARU.SUBARU_FORESTER),
+ CarTestRoute("791340bc01ed993d/2019-03-10--16-28-08", SUBARU.SUBARU_IMPREZA),
+ CarTestRoute("8bf7e79a3ce64055/2021-05-24--09-36-27", SUBARU.SUBARU_IMPREZA_2020),
+ CarTestRoute("8de015561e1ea4a0/2023-08-29--17-08-31", SUBARU.SUBARU_IMPREZA), # openpilot longitudinal
+ # CarTestRoute("c3d1ccb52f5f9d65/2023-07-22--01-23-20", SUBARU.OUTBACK, segment=9), # gen2 longitudinal, eyesight disabled
+ CarTestRoute("1bbe6bf2d62f58a8/2022-07-14--17-11-43", SUBARU.SUBARU_OUTBACK, segment=10),
+ CarTestRoute("c56e69bbc74b8fad/2022-08-18--09-43-51", SUBARU.SUBARU_LEGACY, segment=3),
+ CarTestRoute("f4e3a0c511a076f4/2022-08-04--16-16-48", SUBARU.SUBARU_CROSSTREK_HYBRID, segment=2),
+ CarTestRoute("7fd1e4f3a33c1673/2022-12-04--15-09-53", SUBARU.SUBARU_FORESTER_2022, segment=4),
+ CarTestRoute("f3b34c0d2632aa83/2023-07-23--20-43-25", SUBARU.SUBARU_OUTBACK_2023, segment=7),
+ CarTestRoute("99437cef6d5ff2ee/2023-03-13--21-21-38", SUBARU.SUBARU_ASCENT_2023, segment=7),
+ # Pre-global, dashcam
+ CarTestRoute("95441c38ae8c130e/2020-06-08--12-10-17", SUBARU.SUBARU_FORESTER_PREGLOBAL),
+ CarTestRoute("df5ca7660000fba8/2020-06-16--17-37-19", SUBARU.SUBARU_LEGACY_PREGLOBAL),
+ CarTestRoute("5ab784f361e19b78/2020-06-08--16-30-41", SUBARU.SUBARU_OUTBACK_PREGLOBAL),
+ CarTestRoute("e19eb5d5353b1ac1/2020-08-09--14-37-56", SUBARU.SUBARU_OUTBACK_PREGLOBAL_2018),
+
+ CarTestRoute("fbbfa6af821552b9/2020-03-03--08-09-43", NISSAN.NISSAN_XTRAIL),
+ CarTestRoute("5b7c365c50084530/2020-03-25--22-10-13", NISSAN.NISSAN_LEAF),
+ CarTestRoute("22c3dcce2dd627eb/2020-12-30--16-38-48", NISSAN.NISSAN_LEAF_IC),
+ CarTestRoute("059ab9162e23198e/2020-05-30--09-41-01", NISSAN.NISSAN_ROGUE),
+ CarTestRoute("b72d3ec617c0a90f/2020-12-11--15-38-17", NISSAN.NISSAN_ALTIMA),
+
+ CarTestRoute("32a319f057902bb3/2020-04-27--15-18-58", MAZDA.MAZDA_CX5),
+ CarTestRoute("10b5a4b380434151/2020-08-26--17-11-45", MAZDA.MAZDA_CX9),
+ CarTestRoute("74f1038827005090/2020-08-26--20-05-50", MAZDA.MAZDA_3),
+ CarTestRoute("fb53c640f499b73d/2021-06-01--04-17-56", MAZDA.MAZDA_6),
+ 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("6a7075a4fdd765ee/0000004e--1f612006dd", PSA.PSA_PEUGEOT_208),
+
+ CarTestRoute("bc095dc92e101734/000000db--ee9fe46e57", RIVIAN.RIVIAN_R1_GEN1),
+
+ CarTestRoute("7dc058789994da80/00000112--adb970f6a8", TESLA.TESLA_MODEL_3),
+ CarTestRoute("c8a98e58647765ad/00000002--84e4746136", TESLA.TESLA_MODEL_Y),
+ CarTestRoute("2c912ca5de3b1ee9/0000025d--6eb6bcbca4", TESLA.TESLA_MODEL_Y, segment=4),
+ CarTestRoute("bdda168c0c35fad7/00000001--5c5a36ec06", TESLA.TESLA_MODEL_X), # openpilot longitudinal
+
+ # Segments that test specific issues
+ # Controls mismatch due to standstill threshold
+ CarTestRoute("bec2dcfde6a64235/2022-04-08--14-21-32", HONDA.HONDA_CRV_HYBRID, segment=22),
+]
diff --git a/iqdbc_repo/iqdbc/car/tests/test_can_fingerprint.py b/iqdbc_repo/iqdbc/car/tests/test_can_fingerprint.py
new file mode 100644
index 000000000..77ffcdfa3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_can_fingerprint.py
@@ -0,0 +1,55 @@
+import pytest
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.car_helpers import FRAME_FINGERPRINT, can_fingerprint
+from iqdbc.car.fingerprints import _FINGERPRINTS as FINGERPRINTS
+
+
+class TestCanFingerprint:
+ @pytest.mark.parametrize("car_model, fingerprints", FINGERPRINTS.items())
+ def test_can_fingerprint(self, car_model, fingerprints):
+ """Tests online fingerprinting function on offline fingerprints"""
+
+ for fingerprint in fingerprints: # can have multiple fingerprints for each platform
+ can = [CanData(address=address, dat=b'\x00' * length, src=src)
+ for address, length in fingerprint.items() for src in (0, 1)]
+
+ fingerprint_iter = iter([can])
+ car_fingerprint, finger = can_fingerprint(lambda **kwargs: [next(fingerprint_iter, [])]) # noqa: B023
+
+ assert car_fingerprint == car_model
+ assert finger[0] == fingerprint
+ assert finger[1] == fingerprint
+ assert finger[2] == {}
+
+ def test_timing(self, subtests):
+ # just pick any CAN fingerprinting car
+ car_model = "CHEVROLET_BOLT_EUV"
+ fingerprint = FINGERPRINTS[car_model][0]
+
+ cases = []
+
+ # case 1 - one match, make sure we keep going for 100 frames
+ can = [CanData(address=address, dat=b'\x00' * length, src=src)
+ for address, length in fingerprint.items() for src in (0, 1)]
+ cases.append((FRAME_FINGERPRINT, car_model, can))
+
+ # case 2 - no matches, make sure we keep going for 100 frames
+ can = [CanData(address=1, dat=b'\x00' * 1, src=src) for src in (0, 1)] # uncommon address
+ cases.append((FRAME_FINGERPRINT, None, can))
+
+ # case 3 - multiple matches, make sure we keep going for 200 frames to try to eliminate some
+ can = [CanData(address=2016, dat=b'\x00' * 8, src=src) for src in (0, 1)] # common address
+ cases.append((FRAME_FINGERPRINT * 2, None, can))
+
+ for expected_frames, car_model, can in cases:
+ with subtests.test(expected_frames=expected_frames, car_model=car_model):
+ frames = 0
+
+ def can_recv(**kwargs):
+ nonlocal frames
+ frames += 1
+ return [can] # noqa: B023
+
+ car_fingerprint, _ = can_fingerprint(can_recv)
+ assert car_fingerprint == car_model
+ assert frames == expected_frames + 2 # TODO: fix extra frames
diff --git a/iqdbc_repo/iqdbc/car/tests/test_car_interfaces.py b/iqdbc_repo/iqdbc/car/tests/test_car_interfaces.py
new file mode 100644
index 000000000..7825cc266
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_car_interfaces.py
@@ -0,0 +1,164 @@
+import os
+import math
+import hypothesis.strategies as st
+import pytest
+from functools import cache
+from hypothesis import Phase, given, settings
+from collections.abc import Callable
+from typing import Any
+
+from iqdbc.car import DT_CTRL, CanData, structs
+from iqdbc.car.car_helpers import interfaces
+from iqdbc.car.fingerprints import FW_VERSIONS
+from iqdbc.car.fw_versions import FW_QUERY_CONFIGS
+from iqdbc.car.interfaces import CarInterfaceBase, get_interface_attr
+from iqdbc.car.mock.values import CAR as MOCK
+from iqdbc.car.values import PLATFORMS
+
+DrawType = Callable[[st.SearchStrategy], Any]
+
+ALL_ECUS = {ecu for ecus in FW_VERSIONS.values() for ecu in ecus.keys()}
+ALL_ECUS |= {ecu for config in FW_QUERY_CONFIGS.values() for ecu in config.extra_ecus}
+
+ALL_REQUESTS = {tuple(r.request) for config in FW_QUERY_CONFIGS.values() for r in config.requests}
+
+# From panda/python/__init__.py
+DLC_TO_LEN = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64]
+
+MAX_EXAMPLES = int(os.environ.get('MAX_EXAMPLES', '15'))
+
+
+@cache
+def get_fuzzy_strategy():
+ # Fuzzy CAN fingerprints and FW versions to test more states of the CarInterface
+ fingerprint_strategy = st.fixed_dictionaries({0: st.dictionaries(st.integers(min_value=0, max_value=0x800),
+ st.sampled_from(DLC_TO_LEN))})
+
+ # only pick from possible ecus to reduce search space
+ car_fw_strategy = st.lists(st.builds(
+ lambda fw, req: structs.CarParams.CarFw(ecu=fw[0], address=fw[1], subAddress=fw[2] or 0, request=req),
+ st.sampled_from(sorted(ALL_ECUS)),
+ st.sampled_from(sorted(ALL_REQUESTS)),
+ ))
+
+ params_strategy = st.fixed_dictionaries({
+ 'fingerprints': fingerprint_strategy,
+ 'car_fw': car_fw_strategy,
+ 'alpha_long': st.booleans(),
+ })
+ return params_strategy
+
+
+def get_fuzzy_car_interface(car_name: str, draw: DrawType) -> CarInterfaceBase:
+ params: dict = draw(get_fuzzy_strategy())
+ # reduce search space by duplicating CAN fingerprints across all buses
+ params['fingerprints'] |= {key + 1: params['fingerprints'][0] for key in range(6)}
+
+ # initialize car interface
+ CarInterface = interfaces[car_name]
+ car_params = CarInterface.get_params(car_name, params['fingerprints'], params['car_fw'],
+ alpha_long=params['alpha_long'], is_release=False, docs=False)
+ car_params_iq = CarInterface.get_params_iq(car_params, car_name, params['fingerprints'], params['car_fw'],
+ alpha_long=params['alpha_long'], is_release_iq=False, docs=False)
+ return CarInterface(car_params, car_params_iq)
+
+
+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))
+ @settings(max_examples=MAX_EXAMPLES, deadline=None,
+ phases=(Phase.reuse, Phase.generate, Phase.shrink))
+ @given(data=st.data())
+ def test_car_interfaces(self, car_name, data):
+ car_interface = get_fuzzy_car_interface(car_name, data.draw)
+ car_params = car_interface.CP.as_reader()
+ car_params_iq = car_interface.CP_IQ
+
+ assert car_params.mass > 1
+ assert car_params.wheelbase > 0
+ # centerToFront is center of gravity to front wheels, assert a reasonable range
+ assert car_params.wheelbase * 0.3 < car_params.centerToFront < car_params.wheelbase * 0.7
+ assert car_params.maxLateralAccel > 0
+
+ # Longitudinal sanity checks
+ assert len(car_params.longitudinalTuning.kpV) == len(car_params.longitudinalTuning.kpBP)
+ assert len(car_params.longitudinalTuning.kiV) == len(car_params.longitudinalTuning.kiBP)
+
+ # If we're using the interceptor for gasPressed, we should be commanding gas with it
+ if car_params_iq.enableGasInterceptor:
+ assert car_params.openpilotLongitudinalControl
+
+ # Lateral sanity checks
+ if car_params.steerControlType != structs.CarParams.SteerControlType.angle:
+ tune = car_params.lateralTuning
+ if tune.which() == 'pid':
+ if car_name != MOCK.MOCK:
+ assert not math.isnan(tune.pid.kf) and tune.pid.kf > 0
+ assert len(tune.pid.kpV) > 0 and len(tune.pid.kpV) == len(tune.pid.kpBP)
+ assert len(tune.pid.kiV) > 0 and len(tune.pid.kiV) == len(tune.pid.kiBP)
+
+ elif tune.which() == 'torque':
+ assert not math.isnan(tune.torque.latAccelFactor) and tune.torque.latAccelFactor > 0
+ assert not math.isnan(tune.torque.friction) and tune.torque.friction > 0
+
+ # Run car interface
+ # TODO: use hypothesis to generate random messages
+ now_nanos = 0
+ CC = structs.CarControl().as_reader()
+ CC_IQ = structs.IQCarControl()
+ for _ in range(10):
+ car_interface.update([])
+ car_interface.apply(CC, CC_IQ, now_nanos)
+ now_nanos += DT_CTRL * 1e9 # 10 ms
+
+ CC = structs.CarControl()
+ CC.enabled = True
+ CC.latActive = True
+ CC.longActive = True
+ CC = CC.as_reader()
+ for _ in range(10):
+ car_interface.update([])
+ car_interface.apply(CC, CC_IQ, now_nanos)
+ now_nanos += DT_CTRL * 1e9 # 10ms
+
+ # Test radar interface
+ radar_interface = car_interface.RadarInterface(car_params, car_params_iq)
+ assert radar_interface
+
+ # Run radar interface once
+ radar_interface.update([])
+ if not car_params.radarUnavailable and radar_interface.rcp is not None and \
+ hasattr(radar_interface, '_update') and hasattr(radar_interface, 'trigger_msg'):
+ radar_interface._update([radar_interface.trigger_msg])
+
+ # Test radar fault
+ if not car_params.radarUnavailable and radar_interface.rcp is not None:
+ cans = [(0, [CanData(0, b'', 0) for _ in range(5)])]
+ rr = radar_interface.update(cans)
+ assert rr is None or len(rr.errors) > 0
+
+ def test_interface_attrs(self):
+ """Asserts basic behavior of interface attribute getter"""
+ num_brands = len(get_interface_attr('CAR'))
+ assert num_brands >= 12
+
+ # Should return value for all brands when not combining, even if attribute doesn't exist
+ ret = get_interface_attr('FAKE_ATTR')
+ assert len(ret) == num_brands
+
+ # Make sure we can combine dicts
+ ret = get_interface_attr('DBC', combine_brands=True)
+ assert len(ret) >= 160
+
+ # We don't support combining non-dicts
+ ret = get_interface_attr('CAR', combine_brands=True)
+ assert len(ret) == 0
+
+ # If brand has None value, it shouldn't return when ignore_none=True is specified
+ none_brands = {b for b, v in get_interface_attr('FINGERPRINTS').items() if v is None}
+ assert len(none_brands) >= 1
+
+ ret = get_interface_attr('FINGERPRINTS', ignore_none=True)
+ none_brands_in_ret = none_brands.intersection(ret)
+ assert len(none_brands_in_ret) == 0, f'Brands with None values in ignore_none=True result: {none_brands_in_ret}'
diff --git a/iqdbc_repo/iqdbc/car/tests/test_docs.py b/iqdbc_repo/iqdbc/car/tests/test_docs.py
new file mode 100644
index 000000000..f4f91d22f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_docs.py
@@ -0,0 +1,79 @@
+from collections import defaultdict
+import pytest
+
+from iqdbc.car.car_helpers import interfaces
+from iqdbc.car.docs import get_all_car_docs
+from iqdbc.car.docs_definitions import Cable, Column, PartType, Star, SupportType
+from iqdbc.car.honda.values import CAR as HONDA
+from iqdbc.car.values import PLATFORMS
+
+
+class TestCarDocs:
+ @classmethod
+ def setup_class(cls):
+ cls.all_cars = get_all_car_docs()
+
+ 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"
+ make_model_years[make_model].append(year)
+
+ def test_missing_car_docs(self, subtests):
+ all_car_docs_platforms = [name for name, config in PLATFORMS.items()]
+ for platform in sorted(interfaces.keys()):
+ with subtests.test(platform=platform):
+ assert platform in all_car_docs_platforms, f"Platform: {platform} doesn't have a CarDocs entry"
+
+ def test_naming_conventions(self, subtests):
+ # Asserts market-standard car naming conventions by brand
+ for car in self.all_cars:
+ with subtests.test(car=car.name):
+ tokens = car.model.lower().split(" ")
+ if car.brand == "hyundai":
+ assert "phev" not in tokens, "Use `Plug-in Hybrid`"
+ assert "hev" not in tokens, "Use `Hybrid`"
+ if "plug-in hybrid" in car.model.lower():
+ assert "Plug-in Hybrid" in car.model, "Use correct capitalization"
+ if car.make != "Kia":
+ assert "ev" not in tokens, "Use `Electric`"
+ elif car.brand == "toyota":
+ if "rav4" in tokens:
+ assert "RAV4" in car.model, "Use correct capitalization"
+
+ def test_torque_star(self, subtests):
+ # Asserts brand-specific assumptions around steering torque star
+ for car in self.all_cars:
+ with subtests.test(car=car.name):
+ # honda sanity check, it's the definition of a no torque star
+ if car.car_fingerprint in (HONDA.HONDA_ACCORD, HONDA.HONDA_CIVIC, HONDA.HONDA_CRV, HONDA.HONDA_ODYSSEY, HONDA.HONDA_ODYSSEY_TWN, HONDA.HONDA_PILOT):
+ assert car.row[Column.STEERING_TORQUE] == Star.EMPTY, f"{car.name} has full torque star"
+ elif car.brand in ("toyota", "hyundai"):
+ assert car.row[Column.STEERING_TORQUE] != Star.EMPTY, f"{car.name} has no torque star"
+
+ def test_year_format(self, subtests):
+ for car in self.all_cars:
+ with subtests.test(car=car.name):
+ if car.name == "comma body":
+ pytest.skip()
+
+ assert car.years and car.year_list, f"Format years correctly: {car.name}"
+
+ 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:
+ pytest.skip()
+
+ car_part_type = [p.part_type for p in car.car_parts.all_parts()]
+ car_parts = list(car.car_parts.all_parts())
+ assert len(car_parts) > 0, f"Need to specify car parts: {car.name}"
+ assert car_part_type.count(PartType.connector) == 1, f"Need to specify one harness connector: {car.name}"
+ assert car_part_type.count(PartType.mount) == 1, f"Need to specify one mount: {car.name}"
+ assert Cable.obd_c_cable_2ft in car_parts, f"Need to specify an OBD-C cable (2ft): {car.name}"
diff --git a/iqdbc_repo/iqdbc/car/tests/test_fw_fingerprint.py b/iqdbc_repo/iqdbc/car/tests/test_fw_fingerprint.py
new file mode 100644
index 000000000..cd84fae4b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_fw_fingerprint.py
@@ -0,0 +1,328 @@
+import pytest
+import random
+import time
+from collections import defaultdict
+
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.car_helpers import interfaces
+from iqdbc.car.structs import CarParams
+from iqdbc.car.fingerprints import FW_VERSIONS
+from iqdbc.car.fw_versions import FW_QUERY_CONFIGS, FUZZY_EXCLUDE_ECUS, VERSIONS, build_fw_dict, \
+ match_fw_to_car, get_brand_ecu_matches, get_fw_versions, get_present_ecus
+from iqdbc.car.vin import get_vin
+
+CarFw = CarParams.CarFw
+Ecu = CarParams.Ecu
+
+ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()}
+
+
+class TestFwFingerprint:
+ def assertFingerprints(self, candidates, expected):
+ candidates = list(candidates)
+ 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)])
+ def test_exact_match(self, brand, car_model, ecus, test_non_essential):
+ config = FW_QUERY_CONFIGS[brand]
+ CP = CarParams()
+ for _ in range(20):
+ fw = []
+ for ecu, fw_versions in ecus.items():
+ # Assume non-essential ECUs apply to all cars, so we catch cases where Car A with
+ # missing ECUs won't match to Car B where only Car B has labeled non-essential ECUs
+ if ecu[0] in config.non_essential_ecus and test_non_essential:
+ continue
+
+ ecu_name, addr, sub_addr = ecu
+ fw.append(CarFw(ecu=ecu_name, fwVersion=random.choice(fw_versions), brand=brand,
+ address=addr, subAddress=0 if sub_addr is None else sub_addr))
+ CP.carFw = fw
+ _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_fuzzy=False)
+ if not test_non_essential:
+ self.assertFingerprints(matches, car_model)
+ else:
+ # if we're removing ECUs we expect some match loss, but it shouldn't mismatch
+ 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])
+ 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]
+ if config.match_fw_to_car_fuzzy is None:
+ pytest.skip("Brand does not implement custom fuzzy fingerprinting function")
+
+ CP = CarParams()
+ for _ in range(5):
+ fw = []
+ for ecu, fw_versions in ecus.items():
+ ecu_name, addr, sub_addr = ecu
+ fw.append(CarFw(ecu=ecu_name, fwVersion=random.choice(fw_versions), brand=brand,
+ address=addr, subAddress=0 if sub_addr is None else sub_addr))
+ CP.carFw = fw
+ _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_exact=False, log=False)
+ brand_matches = config.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, VERSIONS[brand])
+
+ # If both have matches, they must agree
+ 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])
+ 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]
+ if not len(valid_ecus):
+ pytest.skip("Car model has no compatible ECUs for fuzzy matching")
+
+ fw = []
+ for ecu in valid_ecus:
+ ecu_name, addr, sub_addr = ecu
+ for _ in range(5):
+ # Add multiple FW versions to simulate ECU returning to multiple queries in a brand
+ fw.append(CarFw(ecu=ecu_name, fwVersion=random.choice(ecus[ecu]), brand=brand,
+ address=addr, subAddress=0 if sub_addr is None else sub_addr))
+ CP = CarParams(carFw=fw)
+ _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_exact=False, log=False)
+
+ # Assert no match if there are not enough unique ECUs
+ unique_ecus = {(f.address, f.subAddress) for f in fw}
+ if len(unique_ecus) < 2:
+ assert len(matches) == 0, car_model
+ # There won't always be a match due to shared FW, but if there is it should be correct
+ elif len(matches):
+ self.assertFingerprints(matches, car_model)
+
+ def test_fw_version_lists(self, subtests):
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for ecu, ecu_fw in ecus.items():
+ with subtests.test(ecu):
+ duplicates = {fw for fw in ecu_fw if ecu_fw.count(fw) > 1}
+ assert not len(duplicates), f'{car_model}: Duplicate FW versions: Ecu.{ecu[0]}, {duplicates}'
+ assert len(ecu_fw) > 0, f'{car_model}: No FW versions: Ecu.{ecu[0]}'
+
+ def test_all_addrs_map_to_one_ecu(self):
+ for brand, cars in VERSIONS.items():
+ addr_to_ecu = defaultdict(set)
+ for ecus in cars.values():
+ for ecu_type, addr, sub_addr in ecus.keys():
+ addr_to_ecu[(addr, sub_addr)].add(ecu_type)
+ ecus_for_addr = addr_to_ecu[(addr, sub_addr)]
+ ecu_strings = ", ".join([f'Ecu.{ecu}' for ecu in ecus_for_addr])
+ assert len(ecus_for_addr) <= 1, f"{brand} has multiple ECUs that map to one address: {ecu_strings} -> ({hex(addr)}, {sub_addr})"
+
+ def test_data_collection_ecus(self, subtests):
+ # Asserts no extra ECUs are in the fingerprinting database
+ for brand, config in FW_QUERY_CONFIGS.items():
+ for car_model, ecus in VERSIONS[brand].items():
+ bad_ecus = set(ecus).intersection(config.extra_ecus)
+ with subtests.test(car_model=car_model.value):
+ assert not len(bad_ecus), f'{car_model}: Fingerprints contain ECUs added for data collection: {bad_ecus}'
+
+ def test_blacklisted_ecus(self, subtests):
+ blacklisted_addrs = (0x7c4, 0x7d0) # includes A/C ecu and an unknown ecu
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ CP = interfaces[car_model].get_non_essential_params(car_model)
+ if CP.brand == 'subaru':
+ for ecu in ecus.keys():
+ assert ecu[1] not in blacklisted_addrs, f'{car_model}: Blacklisted ecu: (Ecu.{ecu[0]}, {hex(ecu[1])})'
+
+ elif CP.brand == "chrysler":
+ # Some HD trucks have a combined TCM and ECM
+ if CP.carFingerprint.startswith("RAM_HD"):
+ for ecu in ecus.keys():
+ assert ecu[0] != Ecu.transmission, f"{car_model}: Blacklisted ecu: (Ecu.{ecu[0]}, {hex(ecu[1])})"
+
+ def test_missing_versions_and_configs(self, subtests):
+ brand_versions = set(VERSIONS.keys())
+ brand_configs = set(FW_QUERY_CONFIGS.keys())
+ if len(brand_configs - brand_versions):
+ with subtests.test():
+ pytest.fail(f"Brands do not implement FW_VERSIONS: {brand_configs - brand_versions}")
+
+ if len(brand_versions - brand_configs):
+ with subtests.test():
+ pytest.fail(f"Brands do not implement FW_QUERY_CONFIG: {brand_versions - brand_configs}")
+
+ # Ensure each brand has at least 1 ECU to query, and extra ECU retrieval
+ for brand, config in FW_QUERY_CONFIGS.items():
+ assert len(config.get_all_ecus({}, include_extra_ecus=False)) == 0
+ assert config.get_all_ecus({}) == set(config.extra_ecus)
+ if len(VERSIONS[brand]) > 0:
+ assert len(config.get_all_ecus(VERSIONS[brand])) > 0
+
+ def test_fw_request_ecu_whitelist(self, subtests):
+ for brand, config in FW_QUERY_CONFIGS.items():
+ with subtests.test(brand=brand):
+ whitelisted_ecus = {ecu for r in config.requests for ecu in r.whitelist_ecus}
+ brand_ecus = {fw[0] for car_fw in VERSIONS[brand].values() for fw in car_fw}
+ brand_ecus |= {ecu[0] for ecu in config.extra_ecus}
+
+ # each ecu in brand's fw versions + extra ecus needs to be whitelisted at least once
+ ecus_not_whitelisted = brand_ecus - whitelisted_ecus
+
+ ecu_strings = ", ".join([f'Ecu.{ecu}' for ecu in ecus_not_whitelisted])
+ assert not (len(whitelisted_ecus) and len(ecus_not_whitelisted)), \
+ f'{brand.title()}: ECUs not in any FW query whitelists: {ecu_strings}'
+
+ def test_request_ecus_in_versions(self):
+ # All ECUs in requests should be in the brand's FW versions
+ for brand, config in FW_QUERY_CONFIGS.items():
+ request_ecus = {ecu for r in config.requests for ecu in r.whitelist_ecus} - {ecu[0] for ecu in config.extra_ecus}
+ print(brand, request_ecus)
+ version_ecus = config.get_all_ecus(VERSIONS[brand], include_extra_ecus=False)
+ for request_ecu in request_ecus:
+ assert request_ecu in {e for e, _, _ in version_ecus}, f"Ecu.{ECU_NAME[request_ecu]} not in {brand} FW versions"
+
+ def test_brand_ecu_matches(self):
+ brand_matches = get_brand_ecu_matches(set())
+ assert len(brand_matches) > 0
+ assert all(len(e) and not any(e) for e in brand_matches.values())
+
+ # we ignore bus
+ brand_matches = get_brand_ecu_matches({(0x758, 0xf, 99)})
+ assert True in brand_matches['toyota']
+ assert not any(any(e) for b, e in brand_matches.items() if b != 'toyota')
+
+
+class TestFwFingerprintTiming:
+ N: int = 5
+ TOL: float = 0.05
+
+ # for patched functions
+ current_obd_multiplexing: bool
+ total_time: float
+
+ @staticmethod
+ def fake_can_send(msgs):
+ pass
+
+ @staticmethod
+ def fake_can_recv(wait_for_one: bool = False) -> list[list[CanData]]:
+ return ([[CanData(random.randint(0x600, 0x800), b'\x00' * 8, 0)]]
+ if random.uniform(0, 1) > 0.5 else [])
+
+ def fake_set_obd_multiplexing(self, obd_multiplexing):
+ """The 10Hz blocking params loop adds on average 50ms to the query time for each OBD multiplexing change"""
+ if obd_multiplexing != self.current_obd_multiplexing:
+ self.current_obd_multiplexing = obd_multiplexing
+ self.total_time += 0.1 / 2
+
+ def fake_get_data(self, timeout):
+ self.total_time += timeout
+ return {}
+
+ def _benchmark_brand(self, brand, num_pandas, mocker):
+ self.total_time = 0
+ mocker.patch("iqdbc.car.isotp_parallel_query.IsoTpParallelQuery.get_data", self.fake_get_data)
+ for _ in range(self.N):
+ # Treat each brand as the most likely (aka, the first) brand with OBD multiplexing initially on
+ self.current_obd_multiplexing = True
+
+ t = time.perf_counter()
+ get_fw_versions(self.fake_can_recv, self.fake_can_send, self.fake_set_obd_multiplexing, brand, num_pandas=num_pandas)
+ self.total_time += time.perf_counter() - t
+
+ return self.total_time / self.N
+
+ def _assert_timing(self, avg_time, ref_time):
+ assert avg_time < ref_time + self.TOL
+ assert avg_time > ref_time - self.TOL, "Performance seems to have improved, update test refs."
+
+ def test_startup_timing(self, subtests, mocker):
+ # Tests worse-case VIN query time and typical present ECU query time
+ vin_ref_times = {'worst': 1.6, 'best': 0.8} # best assumes we go through all queries to get a match
+ present_ecu_ref_time = 0.45
+
+ def fake_get_ecu_addrs(*_, timeout):
+ self.total_time += timeout
+ return set()
+
+ self.total_time = 0.0
+ mocker.patch("iqdbc.car.fw_versions.get_ecu_addrs", fake_get_ecu_addrs)
+ for _ in range(self.N):
+ self.current_obd_multiplexing = True
+ get_present_ecus(self.fake_can_recv, self.fake_can_send, self.fake_set_obd_multiplexing, num_pandas=2)
+ self._assert_timing(self.total_time / self.N, present_ecu_ref_time)
+ print(f'get_present_ecus, query time={self.total_time / self.N} seconds')
+
+ for name, args in (('worst', {}), ('best', {'retry': 1})):
+ with subtests.test(name=name):
+ self.total_time = 0.0
+ mocker.patch("iqdbc.car.isotp_parallel_query.IsoTpParallelQuery.get_data", self.fake_get_data)
+ for _ in range(self.N):
+ get_vin(self.fake_can_recv, self.fake_can_send, (0, 1), **args)
+ self._assert_timing(self.total_time / self.N, vin_ref_times[name])
+ 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.4, 2: 8.0}
+ brand_ref_times = {
+ 1: {
+ 'gm': 1.0,
+ 'body': 0.1,
+ 'chrysler': 0.3,
+ 'ford': 1.5,
+ 'honda': 0.45,
+ 'hyundai': 0.65,
+ 'mazda': 0.1,
+ 'nissan': 0.8,
+ 'subaru': 0.65,
+ 'tesla': 0.1,
+ 'toyota': 0.7,
+ 'volkswagen': 0.65,
+ 'rivian': 0.3,
+ 'psa': 0.1,
+ },
+ 2: {
+ 'ford': 1.6,
+ 'hyundai': 1.15,
+ }
+ }
+
+ total_times = {1: 0.0, 2: 0.0}
+ for num_pandas in (1, 2):
+ for brand, config in FW_QUERY_CONFIGS.items():
+ with subtests.test(brand=brand, num_pandas=num_pandas):
+ avg_time = self._benchmark_brand(brand, num_pandas, mocker)
+ total_times[num_pandas] += avg_time
+ avg_time = round(avg_time, 2)
+
+ ref_time = brand_ref_times[num_pandas].get(brand)
+ if ref_time is None:
+ # ref time should be same as 1 panda if no aux queries
+ ref_time = brand_ref_times[num_pandas - 1][brand]
+
+ self._assert_timing(avg_time, ref_time)
+ print(f'{brand=}, {num_pandas=}, {len(config.requests)=}, avg FW query time={avg_time} seconds')
+
+ for num_pandas in (1, 2):
+ with subtests.test(brand='all_brands', num_pandas=num_pandas):
+ total_time = round(total_times[num_pandas], 2)
+ self._assert_timing(total_time, total_ref_time[num_pandas])
+ print(f'all brands, total FW query time={total_time} seconds')
+
+ def test_get_fw_versions(self, subtests, mocker):
+ # some coverage on IsoTpParallelQuery and panda UDS library
+ # TODO: replace this with full fingerprint simulation testing
+ # https://github.com/commaai/panda/pull/1329
+
+ def fake_carlog_exception(*args, **kwargs):
+ raise
+
+ t = 0
+
+ def fake_monotonic():
+ nonlocal t
+ t += 0.0001
+ return t
+
+ mocker.patch("iqdbc.car.carlog.carlog.exception", fake_carlog_exception)
+ mocker.patch("time.monotonic", fake_monotonic)
+ for brand in FW_QUERY_CONFIGS.keys():
+ with subtests.test(brand=brand):
+ get_fw_versions(self.fake_can_recv, self.fake_can_send, lambda obd: None, brand)
diff --git a/iqdbc_repo/iqdbc/car/tests/test_lateral_limits.py b/iqdbc_repo/iqdbc/car/tests/test_lateral_limits.py
new file mode 100755
index 000000000..36a5d11fe
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_lateral_limits.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+from collections import defaultdict
+import importlib
+from parameterized import parameterized_class
+import pytest
+import sys
+
+from iqdbc.car import DT_CTRL
+from iqdbc.car.car_helpers import interfaces
+from iqdbc.car.interfaces import get_torque_params
+from iqdbc.car.lateral import ISO_LATERAL_ACCEL
+from iqdbc.car.values import PLATFORMS
+
+# ISO 11270 - allowed up jerk is strictly lower than recommended limits
+MAX_LAT_JERK_UP = 2.5 # m/s^3
+MAX_LAT_JERK_DOWN = 5.0 # m/s^3
+MAX_LAT_JERK_UP_TOLERANCE = 0.5 # m/s^3
+
+# jerk is measured over half a second
+JERK_MEAS_T = 0.5
+
+
+@parameterized_class('car_model', [(c,) for c in sorted(PLATFORMS)])
+class TestLateralLimits:
+ car_model: str
+
+ @classmethod
+ def setup_class(cls):
+ CarInterface = interfaces[cls.car_model]
+ CP = CarInterface.get_non_essential_params(cls.car_model)
+ _ = CarInterface.get_non_essential_params_iq(CP, cls.car_model)
+
+ if cls.car_model == 'MOCK':
+ pytest.skip('Mock car')
+
+ # TODO: test all platforms
+ if CP.steerControlType != 'torque':
+ pytest.skip()
+
+ if CP.notCar:
+ pytest.skip()
+
+ CarControllerParams = importlib.import_module(f'iqdbc.car.{CP.brand}.values').CarControllerParams
+ cls.control_params = CarControllerParams(CP)
+ cls.torque_params = get_torque_params()[cls.car_model]
+
+ @staticmethod
+ def calculate_0_5s_jerk(control_params, torque_params):
+ steer_step = control_params.STEER_STEP
+ max_lat_accel = torque_params['MAX_LAT_ACCEL_MEASURED']
+
+ # Steer up/down delta per 10ms frame, in percentage of max torque
+ steer_up_per_frame = control_params.STEER_DELTA_UP / control_params.STEER_MAX / steer_step
+ steer_down_per_frame = control_params.STEER_DELTA_DOWN / control_params.STEER_MAX / steer_step
+
+ # Lateral acceleration reached in 0.5 seconds, clipping to max torque
+ accel_up_0_5_sec = min(steer_up_per_frame * JERK_MEAS_T / DT_CTRL, 1.0) * max_lat_accel
+ accel_down_0_5_sec = min(steer_down_per_frame * JERK_MEAS_T / DT_CTRL, 1.0) * max_lat_accel
+
+ # Convert to m/s^3
+ return accel_up_0_5_sec / JERK_MEAS_T, accel_down_0_5_sec / JERK_MEAS_T
+
+ def test_jerk_limits(self):
+ up_jerk, down_jerk = self.calculate_0_5s_jerk(self.control_params, self.torque_params)
+ assert up_jerk <= MAX_LAT_JERK_UP + MAX_LAT_JERK_UP_TOLERANCE
+ assert down_jerk <= MAX_LAT_JERK_DOWN
+
+ def test_max_lateral_accel(self):
+ assert self.torque_params["MAX_LAT_ACCEL_MEASURED"] <= ISO_LATERAL_ACCEL
+
+
+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")
+
+ 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):
+ violation = _jerks["up_jerk"] > MAX_LAT_JERK_UP + MAX_LAT_JERK_UP_TOLERANCE or \
+ _jerks["down_jerk"] > MAX_LAT_JERK_DOWN
+ violation_str = " - VIOLATION" if violation else ""
+
+ print(f"{car_model:{max_car_model_len}} - up jerk: {round(_jerks['up_jerk'], 2):5} " +
+ f"m/s^3, down jerk: {round(_jerks['down_jerk'], 2):5} m/s^3{violation_str}")
+
+ @pytest.fixture(scope="class", autouse=True)
+ def class_setup(self, request):
+ yield
+ cls = request.cls
+ if hasattr(cls, "control_params"):
+ up_jerk, down_jerk = TestLateralLimits.calculate_0_5s_jerk(cls.control_params, cls.torque_params)
+ self.car_model_jerks[cls.car_model] = {"up_jerk": up_jerk, "down_jerk": down_jerk}
+
+
+if __name__ == '__main__':
+ sys.exit(pytest.main([__file__, '-n0', '--no-summary'], plugins=[LatAccelReport()])) # noqa: TID251
diff --git a/iqdbc_repo/iqdbc/car/tests/test_platform_configs.py b/iqdbc_repo/iqdbc/car/tests/test_platform_configs.py
new file mode 100644
index 000000000..7c3fc7fcd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_platform_configs.py
@@ -0,0 +1,17 @@
+from iqdbc.car.values import PLATFORMS
+
+
+class TestPlatformConfigs:
+ def test_configs(self, subtests):
+
+ for name, platform in PLATFORMS.items():
+ with subtests.test(platform=str(platform)):
+ assert platform.config._frozen
+
+ if platform != "MOCK":
+ assert len(platform.config.dbc_dict) > 0
+ assert len(platform.config.platform_str) > 0
+
+ assert name == platform.config.platform_str
+
+ assert platform.config.specs is not None
diff --git a/iqdbc_repo/iqdbc/car/tests/test_routes.py b/iqdbc_repo/iqdbc/car/tests/test_routes.py
new file mode 100644
index 000000000..e3619d5db
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_routes.py
@@ -0,0 +1,11 @@
+import pytest
+
+from iqdbc.car.values import PLATFORMS
+from iqdbc.car.tests.routes import non_tested_cars, routes
+
+
+@pytest.mark.parametrize("platform", 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), \
+ f"Missing test route for {platform}. Add a route to iqdbc/car/tests/routes.py"
diff --git a/iqdbc_repo/iqdbc/car/tests/test_vehicle_model.py b/iqdbc_repo/iqdbc/car/tests/test_vehicle_model.py
new file mode 100644
index 000000000..a35463a1e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_vehicle_model.py
@@ -0,0 +1,67 @@
+import pytest
+import math
+
+import numpy as np
+
+from iqdbc.car.honda.interface import CarInterface
+from iqdbc.car.honda.values import CAR
+from iqdbc.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/iqdbc_repo/iqdbc/car/tests/test_vw_real_can.py b/iqdbc_repo/iqdbc/car/tests/test_vw_real_can.py
new file mode 100644
index 000000000..8f3787bd3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/tests/test_vw_real_can.py
@@ -0,0 +1,133 @@
+#!/usr/bin/env python3
+"""Real-CAN replay invariant tests for VW torque platforms (PQ / MQB / MLB).
+
+Replays real konn3kt routes through the car interface with openpilot lateral
+INACTIVE (latActive=False) and asserts openpilot never transmits an active-steering
+HCA command (active status or non-zero torque). Re-transmitting the stock camera's
+active HCA while not in control (stock-LKAS forwarding) leaves the EPS faulted for
+the whole drive (LH2_Sta_HCA=FAULT) - the regression that bricked steering on a PQ
+Passat NMS with a factory LKAS camera. Panda accepts these frames, so only a replay
+invariant like this catches it.
+
+Self-contained within iqdbc: routes are resolved through konn3kt's public
+/v1/route//files endpoint (URLs are signed server-side, no auth/token needed).
+"""
+import json
+import os
+import urllib.parse
+import urllib.request
+from collections import Counter
+
+import pytest
+
+from iqdbc.can.parser import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.car_helpers import can_fingerprint, interfaces
+from iqdbc.car.logreader import LogReader
+from iqdbc.car.volkswagen.values import CAR, DBC, VolkswagenFlags
+
+API_HOST = os.environ.get("API_HOST", "https://api-iqlabs.konn3kt.com")
+
+# konn3kt-hosted VW routes. (route_id, segment, platform, label)
+# Add MQB routes here as konn3kt-hosted MQB logs become available.
+VW_ROUTES = [
+ ("b29ee8c5a0a735d1|000000dc--a384e9083e", 0, CAR.VOLKSWAGEN_PASSAT_NMS, "PQ with stock LKAS camera"),
+ ("0f53129ed44f6920|00000287--3efbddeb96", 0, CAR.VOLKSWAGEN_PASSAT_NMS, "PQ without stock LKAS camera"),
+]
+
+# Per-platform HCA message: (address, msg, status signal, torque signal, active-status values)
+HCA_INFO = {
+ "pq": (0xD2, "HCA_1", "HCA_Status", "LM_Offset", (5, 7)),
+ "mqb": (0x126, "HCA_01", "HCA_01_Status_HCA", "HCA_01_LM_Offset", (5, 6, 7)),
+}
+
+
+def _request_headers() -> dict[str, str]:
+ # konn3kt's edge rejects the default urllib User-Agent with 403. The routes are public
+ # (access returns early for public routes), but IQ.Pilot/Cabana tooling conventionally
+ # sends a Konn3kt user JWT, so include one when available (env or ~/.comma/auth.json).
+ headers = {"User-Agent": "iqdbc"}
+ token = os.environ.get("KONN3KT_ACCESS_TOKEN")
+ if not token:
+ try:
+ with open(os.path.expanduser("~/.comma/auth.json")) as f:
+ token = json.load(f).get("access_token")
+ except (OSError, ValueError):
+ token = None
+ if token:
+ headers["Authorization"] = f"JWT {token}"
+ return headers
+
+
+def _rlog_url(route_id: str, segment: int) -> str:
+ req = urllib.request.Request(f"{API_HOST}/v1/route/{urllib.parse.quote(route_id, safe='|')}/files",
+ headers=_request_headers())
+ with urllib.request.urlopen(req, timeout=30) as f:
+ files = json.load(f)
+ for url in files.get("logs", []):
+ # path looks like /connectdata////rlog.zst
+ parts = urllib.parse.urlparse(url).path.rstrip("/").split("/")
+ if len(parts) >= 2 and parts[-2] == str(segment):
+ return url
+ raise RuntimeError(f"no rlog for {route_id} segment {segment} (uploaded & public?)")
+
+
+def _load_can(route_id: str, segment: int):
+ lr = LogReader(_rlog_url(route_id, segment), only_union_types=True, sort_by_time=True)
+ return [(m.logMonoTime, [CanData(c.address, c.dat, c.src) for c in m.can]) for m in lr if m.which() == "can"]
+
+
+@pytest.mark.parametrize("route_id,segment,platform,label", VW_ROUTES)
+def test_vw_inactive_steering_invariant(route_id, segment, platform, label):
+ can_msgs = _load_can(route_id, segment)
+ assert len(can_msgs) > 1000, f"insufficient CAN data for {label}: {len(can_msgs)} frames"
+
+ # fingerprint from a fresh iterator over the (unmutated) frame list
+ frame_iter = (frames for _, frames in can_msgs)
+ def can_recv(wait_for_one: bool = False):
+ return [next(frame_iter, [])]
+ _, fingerprint = can_fingerprint(can_recv)
+
+ CarInterface = interfaces[platform]
+ CP = CarInterface.get_params(platform, fingerprint, [], False, False, False)
+ CP_IQ = CarInterface.get_params_iq(CP, platform, fingerprint, [], False, False, False)
+
+ if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ pytest.skip("invariant covers torque-based VW platforms (PQ/MQB/MLB)")
+
+ key = "pq" if CP.flags & VolkswagenFlags.PQ else "mqb"
+ hca_addr, hca_msg, status_sig, torque_sig, active_status = HCA_INFO[key]
+ cp = CANParser(DBC[platform][Bus.pt], [(hca_msg, 0)], 0)
+
+ CI = CarInterface(CP, CP_IQ)
+ CC = structs.CarControl().as_reader() # latActive defaults to False
+ CC_IQ = structs.IQCarControl()
+
+ hca_seen = 0
+ violations = Counter()
+ for i, (mono, frames) in enumerate(can_msgs):
+ CI.update([(mono, frames)])
+ _, sendcan = CI.apply(CC, CC_IQ, mono)
+
+ if i < 300: # CarController / CANParser warmup
+ continue
+
+ for addr, dat, bus in sendcan:
+ if addr != hca_addr or bus != 0:
+ continue
+ hca_seen += 1
+ cp.update([(mono, [(addr, bytes(dat), 0)])])
+ if int(cp.vl[hca_msg][status_sig]) in active_status:
+ violations["active_status"] += 1
+ if abs(cp.vl[hca_msg][torque_sig]) > 0:
+ violations["nonzero_torque"] += 1
+
+ assert hca_seen > 50, f"{label}: no HCA steering messages transmitted to inspect"
+ assert not len(violations), \
+ f"{label}: openpilot TX'd active HCA while latActive=False: {dict(violations)}"
+
+
+if __name__ == "__main__":
+ import sys
+ sys.exit(pytest.main([__file__, "-v"]))
diff --git a/iqdbc_repo/iqdbc/car/torque_data/override.toml b/iqdbc_repo/iqdbc/car/torque_data/override.toml
new file mode 100644
index 000000000..e7b2cfeac
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/torque_data/override.toml
@@ -0,0 +1,138 @@
+legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
+### angle control
+# Nissan appears to have torque
+"NISSAN_XTRAIL" = [nan, 1.5, nan]
+"NISSAN_ALTIMA" = [nan, 1.5, nan]
+"NISSAN_LEAF_IC" = [nan, 1.5, nan]
+"NISSAN_LEAF" = [nan, 1.5, nan]
+"NISSAN_ROGUE" = [nan, 1.5, nan]
+
+# New subarus angle based controllers
+"SUBARU_FORESTER_2022" = [nan, 3.0, nan]
+"SUBARU_OUTBACK_2023" = [nan, 3.0, nan]
+"SUBARU_ASCENT_2023" = [nan, 3.0, nan]
+
+# Toyota LTA also has torque
+"TOYOTA_RAV4_TSS2_2023" = [nan, 3.0, nan]
+
+# Tesla angle based controllers
+"TESLA_MODEL_3" = [nan, 2.5, nan]
+"TESLA_MODEL_Y" = [nan, 2.5, nan]
+
+# Guess
+"FORD_BRONCO_SPORT_MK1" = [nan, 1.5, nan]
+"FORD_ESCAPE_MK4" = [nan, 1.5, nan]
+"FORD_EXPLORER_MK6" = [nan, 1.5, nan]
+"FORD_F_150_MK14" = [nan, 1.5, nan]
+"FORD_FOCUS_MK4" = [nan, 1.5, nan]
+"FORD_MAVERICK_MK1" = [nan, 1.5, nan]
+"FORD_F_150_LIGHTNING_MK1" = [nan, 1.5, nan]
+"FORD_MUSTANG_MACH_E_MK1" = [nan, 1.5, nan]
+"FORD_RANGER_MK2" = [nan, 1.5, nan]
+###
+
+# No steering wheel
+"COMMA_BODY" = [nan, 1000, nan]
+
+# Totally new cars
+"RAM_1500_5TH_GEN" = [2.0, 2.0, 0.05]
+"RAM_HD_5TH_GEN" = [1.4, 1.4, 0.05]
+"SUBARU_OUTBACK" = [2.0, 1.5, 0.2]
+"BUICK_BABYENCLAVE" = [1.45, 1.6, 0.2]
+"CADILLAC_ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694]
+"CADILLAC_ESCALADE_ESV_2019" = [1.15, 1.3, 0.2]
+"CADILLAC_XT4" = [1.45, 1.6, 0.2]
+"CHEVROLET_BOLT_EUV" = [2.0, 2.0, 0.05]
+"CHEVROLET_MALIBU_CC" = [1.85, 1.85, 0.075]
+"CHEVROLET_SILVERADO" = [1.9, 1.9, 0.112]
+"CHEVROLET_TRAILBLAZER" = [1.33, 1.9, 0.16]
+"CHEVROLET_TRAVERSE" = [1.33, 1.33, 0.18]
+"CHEVROLET_EQUINOX" = [2.5, 2.5, 0.05]
+"CHEVROLET_VOLT_2019" = [1.4, 1.4, 0.16]
+"CHEVROLET_TRAX" = [1.33, 1.9, 0.16]
+"VOLKSWAGEN_ID4_MK1" = [2.0, 2.0, 0.1]
+"VOLKSWAGEN_ID4_MK2" = [2.0, 2.0, 0.1]
+"VOLKSWAGEN_CADDY_MK3" = [1.2, 1.2, 0.1]
+"VOLKSWAGEN_PASSAT_NMS" = [2.5, 2.5, 0.1]
+"VOLKSWAGEN_SHARAN_MK2" = [2.5, 2.5, 0.1]
+"HYUNDAI_SANTA_CRUZ_1ST_GEN" = [2.7, 2.7, 0.1]
+"KIA_SPORTAGE_5TH_GEN" = [2.6, 2.6, 0.1]
+"GENESIS_GV70_1ST_GEN" = [2.42, 2.42, 0.1]
+"GENESIS_GV60_EV_1ST_GEN" = [2.5, 2.5, 0.1]
+"GMC_YUKON" = [1.2, 2.5, 0.26]
+"KIA_SORENTO_4TH_GEN" = [2.5, 2.5, 0.1]
+"KIA_SORENTO_HEV_4TH_GEN" = [2.5, 2.5, 0.1]
+"KIA_NIRO_HEV_2ND_GEN" = [2.42, 2.5, 0.12]
+"KIA_NIRO_EV_2ND_GEN" = [2.05, 2.5, 0.14]
+"GENESIS_GV80" = [2.5, 2.5, 0.1]
+"KIA_CARNIVAL_4TH_GEN" = [1.75, 1.75, 0.15]
+"GMC_ACADIA" = [1.6, 1.6, 0.2]
+"LEXUS_IS_TSS2" = [2.0, 2.0, 0.1]
+"HYUNDAI_KONA_EV_2ND_GEN" = [2.5, 2.5, 0.1]
+"HYUNDAI_KONA_HEV_2ND_GEN" = [2.5, 2.5, 0.1]
+"HYUNDAI_IONIQ_6" = [2.5, 2.5, 0.005]
+"HYUNDAI_IONIQ_9" = [1.75, 1.75, 0.15]
+"HYUNDAI_AZERA_7TH_GEN" = [1.8, 1.8, 0.1]
+"HYUNDAI_AZERA_6TH_GEN" = [1.8, 1.8, 0.1]
+"HYUNDAI_AZERA_HEV_6TH_GEN" = [1.8, 1.8, 0.1]
+"KIA_K8_HEV_1ST_GEN" = [2.5, 2.5, 0.1]
+"HYUNDAI_CUSTIN_1ST_GEN" = [2.5, 2.5, 0.1]
+"LEXUS_GS_F" = [2.5, 2.5, 0.08]
+"HYUNDAI_STARIA_4TH_GEN" = [1.8, 2.0, 0.15]
+"HYUNDAI_PORTER_II_EV" = [1.8, 2.0, 0.15]
+"KIA_RAY_EV" = [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]
+
+# Dashcam or fallback configured as ideal car
+"MOCK" = [10.0, 10, 0.0]
+
+# Manually checked
+"HONDA_CIVIC_2022" = [2.5, 1.2, 0.15]
+"HONDA_HRV_3G" = [2.5, 1.2, 0.2]
+
+# Community
+"HYUNDAI_GRANDEUR_IG" = [2.3, 2.3, 0.1]
+"HYUNDAI_GRANDEUR_IG_HEV" = [2.3, 2.3, 0.1]
+"GENESIS_EQ900" = [2.3, 2.3, 0.1]
+"GENESIS_EQ900_L" = [2.3, 2.3, 0.1]
+"GENESIS_G90_2019" = [2.3, 2.3, 0.1]
+"KIA_MOHAVE" = [2.3, 2.3, 0.1]
+"KIA_K5" = [2.3, 2.3, 0.1]
+"KIA_K5_HEV" = [2.3, 2.3, 0.1]
+"KIA_K5_HEV_2022" = [2.3, 2.3, 0.1]
+"KIA_K7" = [2.3, 2.3, 0.1]
+"KIA_K7_HEV" = [2.3, 2.3, 0.1]
+"KIA_K7_PE" = [2.3, 2.3, 0.1]
+"KIA_K7_HEV_PE" = [2.3, 2.3, 0.1]
+"KIA_K9" = [2.3, 2.3, 0.1]
+"GENESIS_GV70_EV_1ST_GEN" = [2.42, 2.42, 0.1]
+"HYUNDAI_NEXO" = [2.7, 2.7, 0.1]
+"KIA_EV_SK3" = [2.5, 2.5, 0.1]
+"HYUNDAI_CASPER"= [2.5, 2.5, 0.1]
+"HYUNDAI_CASPER_EV"= [2.5, 2.5, 0.1]
+"HYUNDAI_IONIQ_5_N" = [3.17, 2.71, 0.097]
+"HYUNDAI_IONIQ_5_PE" = [1.75, 1.75, 0.15]
+
+# Synced verbatim from comma opendbc torque_data/override.toml — these platforms
+# exist upstream and were simply never carried over when iqdbc forked.
+ACURA_MDX_4G_MMR = [1.25, 1.25, 0.15]
+ACURA_TLX_2G = [1.2, 1.2, 0.15]
+ACURA_TLX_2G_MMR = [1.7, 1.7, 0.16]
+AUDI_Q5_MK1 = [1.8, 1.8, 0.18]
+CUPRA_BORN_MK1 = [nan, 2.5, nan]
+FORD_ESCAPE_MK4_5 = [nan, 1.5, nan]
+FORD_EXPEDITION_MK4 = [nan, 1.5, nan]
+HONDA_ACCORD_11G = [1.35, 1.35, 0.17]
+HONDA_CITY_7G = [1.2, 1.2, 0.23]
+HONDA_CRV_6G = [1.3, 1.3, 0.2]
+HONDA_NBOX_2G = [1.2, 1.2, 0.2]
+HONDA_ODYSSEY_5G_MMR = [0.9, 0.9, 0.2]
+HONDA_PASSPORT_4G = [1.2, 1.2, 0.16]
+HONDA_PILOT_4G = [1.25, 1.25, 0.21]
+LEXUS_LS = [1.35, 1.7, 0.17]
+PORSCHE_MACAN_MK1 = [2.0, 2.0, 0.2]
+PSA_PEUGEOT_208 = [nan, 2.0, nan]
+TESLA_MODEL_X = [nan, 2.5, nan]
diff --git a/iqdbc_repo/iqdbc/car/torque_data/params.toml b/iqdbc_repo/iqdbc/car/torque_data/params.toml
new file mode 100644
index 000000000..1f563755b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/torque_data/params.toml
@@ -0,0 +1,90 @@
+legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
+"ACURA_ILX" = [1.524988973896102, 0.519011053086259, 0.34236219253028]
+"ACURA_RDX" = [0.9987728568686902, 0.5323765166196301, 0.303218805715844]
+"ACURA_RDX_3G" = [1.4314459806646749, 0.33874701282109954, 0.18048847083897598]
+"AUDI_A3_MK3" = [1.5122414863077502, 1.7443517531719404, 0.15194151892450905]
+"AUDI_Q3_MK2" = [1.4439223359448605, 1.2254955789112076, 0.1413798895978097]
+"CHEVROLET_VOLT" = [1.5961527626411784, 1.8422651988094612, 0.1572393918005158]
+"CHRYSLER_PACIFICA_2018" = [2.07140, 1.3366521181047952, 0.13776367250652022]
+"CHRYSLER_PACIFICA_2020" = [1.86206, 1.509076559398423, 0.14328246159386085]
+"CHRYSLER_PACIFICA_2018_HYBRID" = [2.08887, 1.2943025830995154, 0.114818]
+"CHRYSLER_PACIFICA_2019_HYBRID" = [1.90120, 1.1958788168371808, 0.131520]
+"GENESIS_G70" = [3.8520195946707947, 2.354697063349854, 0.06830285485626221]
+"HONDA_ACCORD" = [1.6893333799149202, 0.3246749081720698, 0.2120497022936265]
+"HONDA_CIVIC_BOSCH" = [1.691708637466905, 0.40132900729454185, 0.25460295304024094]
+"HONDA_CIVIC" = [1.6528895627785531, 0.4018518740819229, 0.25458812851328544]
+"HONDA_CRV" = [0.7667141440182675, 0.5927571534745969, 0.40909087636157127]
+"HONDA_CRV_5G" = [2.01323205142022, 0.2700612209345081, 0.2238412881331528]
+"HONDA_CRV_HYBRID" = [2.072034634644233, 0.7152085160516978, 0.20237105008376083]
+"HONDA_FIT" = [1.5719981427109775, 0.5712761407108976, 0.110773383324281]
+"HONDA_HRV" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094]
+"HONDA_INSIGHT" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876]
+"HONDA_ODYSSEY" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822]
+"HONDA_PILOT" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763]
+"HONDA_RIDGELINE" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328]
+"HYUNDAI_ELANTRA_2021" = [3.169, 2.1259108157250735, 0.0819]
+"HYUNDAI_GENESIS" = [2.7807965280270794, 2.325, 0.0984484465421171]
+"HYUNDAI_IONIQ_5" = [3.172929, 2.713050, 0.096019]
+"HYUNDAI_IONIQ_EV_LTD" = [1.7662975472852054, 1.613755614526594, 0.17087579756306276]
+"HYUNDAI_IONIQ_PHEV" = [3.2928700076638537, 2.1193482926455656, 0.12463700961468778]
+"HYUNDAI_IONIQ_PHEV_2019" = [2.970807902012267, 1.6312321830002083, 0.1088964990357482]
+"HYUNDAI_KONA_EV" = [3.078814714619148, 2.307336938253934, 0.12359762054065548]
+"HYUNDAI_PALISADE" = [2.544642494803999, 1.8721703683337008, 0.1301424599248651]
+"HYUNDAI_SANTA_FE" = [3.0787027729757632, 2.6173437483495565, 0.1207019341823945]
+"HYUNDAI_SANTA_FE_HEV_2022" = [3.501877602644835, 2.729064118456137, 0.10384068104538963]
+"HYUNDAI_SANTA_FE_PHEV_2022" = [1.6953050513611045, 1.5837614296206861, 0.12672855941458458]
+"HYUNDAI_SONATA_LF" = [2.2200457811703953, 1.2967330275895228, 0.14039920986586393]
+"HYUNDAI_SONATA" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593]
+"HYUNDAI_SONATA_HYBRID" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382]
+"HYUNDAI_TUCSON_4TH_GEN" = [2.960174, 2.860284, 0.108745]
+"HYUNDAI_SANTAFE_MX5" = [3.2, 3.0, 0.05]
+"HYUNDAI_SANTAFE_MX5_HEV" = [3.2, 3.0, 0.05]
+"JEEP_GRAND_CHEROKEE_2019" = [2.30972, 1.289689569171081, 0.117048]
+"JEEP_GRAND_CHEROKEE" = [2.27116, 1.4057367824262523, 0.11725947414922003]
+"KIA_EV6" = [3.2, 2.093457, 0.005]
+"KIA_EV6_PE" = [3.2, 2.093457, 0.005]
+"KIA_K5_2021" = [2.405339728085138, 1.460032270828705, 0.11650989850813716]
+"KIA_K5_DL3_24" = [2.5, 2.5, 0.1]
+"KIA_K5_DL3_24_HEV" = [2.5, 2.5, 0.1]
+"KIA_NIRO_EV" = [2.9215954981365337, 2.1500583840260044, 0.09236802474810267]
+"KIA_SORENTO" = [2.464854685101844, 1.5335274218367956, 0.12056170567599558]
+"KIA_STINGER" = [2.7499043387418967, 1.849652021986449, 0.12048334239559202]
+"KIA_EV9" = [1.75, 1.75, 0.15]
+"KIA_EV3" = [3.2, 2.093457, 0.005]
+"KIA_PV5" = [3.2, 2.093457, 0.005]
+"LEXUS_ES_TSS2" = [2.0357564999999997, 1.999082295195227, 0.101533]
+"LEXUS_NX" = [2.3525924753753613, 1.9731412277641067, 0.15168101064205927]
+"LEXUS_NX_TSS2" = [2.4331999786982936, 2.1045680431705414, 0.14099899317761067]
+"LEXUS_RX" = [1.6430539050086406, 1.181960058934143, 0.19768806040843034]
+"LEXUS_RX_TSS2" = [1.5375561442049257, 1.343166476215164, 0.1931062001527557]
+"MAZDA_CX9_2021" = [1.7601682915983443, 1.0889677335154337, 0.17713792194297195]
+"SKODA_SUPERB_MK3" = [1.166437404652981, 1.1686163012668165, 0.12194533036948708]
+"SUBARU_FORESTER" = [3.6617001649776793, 2.342197172531713, 0.11075960785398745]
+"SUBARU_IMPREZA" = [1.0670704910352047, 0.8234374840709592, 0.20986563268614938]
+"SUBARU_IMPREZA_2020" = [2.6068223389108303, 2.134872342760203, 0.15261513193561627]
+"TOYOTA_AVALON" = [2.5185770183845646, 1.7153346784214922, 0.10603968787111022]
+"TOYOTA_AVALON_2019" = [1.7036141952825095, 1.239619084240008, 0.08459830394899492]
+"TOYOTA_AVALON_TSS2" = [2.3154403649717357, 2.7777922854327124, 0.11453999639164605]
+"TOYOTA_CHR" = [1.5591084333664578, 1.271271459066948, 0.20259087058453193]
+"TOYOTA_CHR_TSS2" = [1.7678810166088303, 1.3742176337919942, 0.2319674583741509]
+"TOYOTA_CAMRY" = [2.0568162685952505, 1.7576185169559122, 0.108878753]
+"TOYOTA_CAMRY_TSS2" = [2.3548324999999997, 2.368900128946771, 0.118436]
+"TOYOTA_COROLLA" = [3.117154369115421, 1.8438132575043773, 0.12289685869250652]
+"TOYOTA_COROLLA_TSS2" = [1.991132339206426, 1.868866242720403, 0.19570063298031432]
+"TOYOTA_HIGHLANDER" = [1.8108348718624456, 1.6348421600679828, 0.15972686105120398]
+"TOYOTA_HIGHLANDER_TSS2" = [1.9617570834136164, 1.8611643317268927, 0.14519673256119725]
+"TOYOTA_MIRAI" = [2.506899832157829, 1.7417213930750164, 0.20182618449440565]
+"TOYOTA_PRIUS" = [1.60, 1.5023147650693636, 0.151515]
+"TOYOTA_PRIUS_TSS2" = [1.972600, 1.9104337425537743, 0.170968]
+"TOYOTA_RAV4" = [2.085695074355425, 2.2142832316984733, 0.13339165270103975]
+"TOYOTA_RAV4_TSS2" = [2.279239424615458, 2.087101966779332, 0.13682208413446817]
+"TOYOTA_RAV4H" = [1.9796257271652042, 1.7503987331707576, 0.14628860048885406]
+"TOYOTA_RAV4_TSS2_2022" = [2.241883248393209, 1.9304407208090029, 0.112174]
+"TOYOTA_SIENNA" = [1.689726, 1.3208264576110418, 0.140456]
+"TOYOTA_YARIS" = [2.22984, 1.86145, 0.168189]
+"VOLKSWAGEN_ARTEON_MK1" = [1.45136518053819, 1.3639364049316804, 0.23806361745695032]
+"VOLKSWAGEN_ATLAS_MK1" = [1.4677006726964945, 1.6733266634075656, 0.12959584092073367]
+"VOLKSWAGEN_GOLF_MK7" = [1.3750394140491293, 1.5814743077200641, 0.2018321939386586]
+"VOLKSWAGEN_JETTA_MK7" = [1.2271623034089392, 1.216955117387, 0.19437384688370712]
+"VOLKSWAGEN_PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647]
+"VOLKSWAGEN_TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916]
diff --git a/iqdbc_repo/iqdbc/car/torque_data/substitute.toml b/iqdbc_repo/iqdbc/car/torque_data/substitute.toml
new file mode 100644
index 000000000..a5f5c301f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/torque_data/substitute.toml
@@ -0,0 +1,133 @@
+legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
+"MAZDA_3" = "MAZDA_CX9_2021"
+"MAZDA_6" = "MAZDA_CX9_2021"
+"MAZDA_CX5" = "MAZDA_CX9_2021"
+"MAZDA_CX5_2022" = "MAZDA_CX9_2021"
+"MAZDA_CX9" = "MAZDA_CX9_2021"
+
+"DODGE_DURANGO" = "CHRYSLER_PACIFICA_2020"
+
+"TOYOTA_ALPHARD_TSS2" = "TOYOTA_SIENNA"
+"TOYOTA_PRIUS_V" = "TOYOTA_PRIUS"
+"TOYOTA_RAV4_PRIME" = "TOYOTA_RAV4_TSS2"
+"TOYOTA_SIENNA_4TH_GEN" = "TOYOTA_RAV4_TSS2"
+"LEXUS_IS" = "LEXUS_NX"
+"LEXUS_CTH" = "LEXUS_NX"
+"LEXUS_ES" = "TOYOTA_CAMRY"
+"LEXUS_RC" = "LEXUS_NX_TSS2"
+"LEXUS_LC_TSS2" = "LEXUS_NX_TSS2"
+
+"KIA_OPTIMA_G4" = "HYUNDAI_SONATA"
+"KIA_OPTIMA_G4_FL" = "HYUNDAI_SONATA"
+"KIA_OPTIMA_H" = "HYUNDAI_SONATA"
+"KIA_OPTIMA_H_G4_FL" = "HYUNDAI_SONATA"
+"KIA_FORTE" = "HYUNDAI_SONATA"
+"KIA_CEED" = "HYUNDAI_SONATA"
+"KIA_SELTOS" = "HYUNDAI_SONATA"
+"KIA_NIRO_PHEV" = "KIA_NIRO_EV"
+"KIA_EV4" = "KIA_EV6"
+"KIA_NIRO_PHEV_2022" = "KIA_NIRO_EV"
+"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"
+"HYUNDAI_IONIQ_HEV_2022" = "HYUNDAI_IONIQ_PHEV_2019"
+"HYUNDAI_IONIQ_EV_2020" = "HYUNDAI_IONIQ_PHEV_2019"
+"HYUNDAI_ELANTRA" = "HYUNDAI_SONATA_LF"
+"HYUNDAI_ELANTRA_GT_I30" = "HYUNDAI_SONATA_LF"
+"HYUNDAI_ELANTRA_HEV_2021" = "HYUNDAI_SONATA"
+"HYUNDAI_TUCSON" = "HYUNDAI_SANTA_FE"
+"HYUNDAI_SANTA_FE_2022" = "HYUNDAI_SANTA_FE_HEV_2022"
+"KIA_K5_HEV_2020" = "KIA_K5_2021"
+"KIA_STINGER_2022" = "KIA_STINGER"
+"GENESIS_G90" = "GENESIS_G70"
+"GENESIS_G80" = "GENESIS_G70"
+"GENESIS_G70_2020" = "HYUNDAI_SONATA"
+"HYUNDAI_SONATA_2024" = "HYUNDAI_SONATA"
+
+"HONDA_FREED" = "HONDA_ODYSSEY"
+"HONDA_CRV_EU" = "HONDA_CRV"
+"HONDA_CIVIC_BOSCH_DIESEL" = "HONDA_CIVIC_BOSCH"
+"HONDA_E" = "HONDA_CIVIC_BOSCH"
+"HONDA_ODYSSEY_CHN" = "HONDA_ODYSSEY"
+
+"BUICK_LACROSSE" = "CHEVROLET_VOLT"
+"BUICK_REGAL" = "CHEVROLET_VOLT"
+"CADILLAC_ESCALADE_ESV" = "CHEVROLET_VOLT"
+"CADILLAC_ATS" = "CHEVROLET_VOLT"
+"CHEVROLET_MALIBU" = "CHEVROLET_VOLT"
+"HOLDEN_ASTRA" = "CHEVROLET_VOLT"
+"CHEVROLET_VOLT_CC" = "CHEVROLET_VOLT"
+"CHEVROLET_BOLT_CC" = "CHEVROLET_BOLT_EUV"
+"CHEVROLET_BOLT_2017" = "CHEVROLET_BOLT_EUV"
+"CHEVROLET_BOLT_2018" = "CHEVROLET_BOLT_EUV"
+"CHEVROLET_EQUINOX_CC" = "CHEVROLET_EQUINOX"
+"CHEVROLET_SUBURBAN" = "CHEVROLET_SILVERADO"
+"CHEVROLET_SUBURBAN_CC" = "CHEVROLET_SILVERADO"
+"CHEVROLET_TRAX_2024" = "CHEVROLET_VOLT"
+"CADILLAC_CT6_CC" = "CHEVROLET_VOLT"
+"CADILLAC_CT6_ACC" = "CHEVROLET_VOLT"
+"CHEVROLET_TRAILBLAZER_CC" = "CHEVROLET_TRAILBLAZER"
+"CADILLAC_XT5_CC" = "GMC_ACADIA"
+
+"SKODA_FABIA_MK4" = "VOLKSWAGEN_GOLF_MK7"
+"SKODA_OCTAVIA_MK3" = "SKODA_SUPERB_MK3"
+"SKODA_KODIAQ_MK1" = "SKODA_SUPERB_MK3"
+"SKODA_KAROQ_MK1" = "SKODA_SUPERB_MK3"
+"SKODA_KAMIQ_MK1" = "SKODA_SUPERB_MK3"
+"VOLKSWAGEN_CRAFTER_MK2" = "VOLKSWAGEN_TIGUAN_MK2"
+"VOLKSWAGEN_TROC_MK1" = "VOLKSWAGEN_TIGUAN_MK2"
+"VOLKSWAGEN_TCROSS_MK1" = "VOLKSWAGEN_TIGUAN_MK2"
+"VOLKSWAGEN_TOURAN_MK2" = "VOLKSWAGEN_TIGUAN_MK2"
+"VOLKSWAGEN_TRANSPORTER_T61" = "VOLKSWAGEN_TIGUAN_MK2"
+"AUDI_Q2_MK1" = "VOLKSWAGEN_TIGUAN_MK2"
+"VOLKSWAGEN_TAOS_MK1" = "VOLKSWAGEN_TIGUAN_MK2"
+"VOLKSWAGEN_POLO_MK6" = "VOLKSWAGEN_GOLF_MK7"
+"SEAT_ATECA_MK1" = "VOLKSWAGEN_GOLF_MK7"
+"VOLKSWAGEN_JETTA_MK6" = "VOLKSWAGEN_PASSAT_NMS"
+
+"SUBARU_CROSSTREK_HYBRID" = "SUBARU_IMPREZA_2020"
+"SUBARU_FORESTER_HYBRID" = "SUBARU_IMPREZA_2020"
+"SUBARU_LEGACY" = "SUBARU_OUTBACK"
+
+# Old subarus don't have much data guessing it's like low torque impreza"
+"SUBARU_OUTBACK_PREGLOBAL_2018" = "SUBARU_IMPREZA"
+"SUBARU_OUTBACK_PREGLOBAL" = "SUBARU_IMPREZA"
+"SUBARU_FORESTER_PREGLOBAL" = "SUBARU_IMPREZA"
+"SUBARU_LEGACY_PREGLOBAL" = "SUBARU_IMPREZA"
+"SUBARU_ASCENT" = "SUBARU_FORESTER"
+
+# IQ.Pilot GM Non-ACC ports borrow their base platform's lateral tune
+"CHEVROLET_BOLT_NON_ACC" = "CHEVROLET_BOLT_EUV"
+"CHEVROLET_BOLT_NON_ACC_1ST_GEN" = "CHEVROLET_BOLT_EUV"
+"CHEVROLET_BOLT_NON_ACC_2ND_GEN" = "CHEVROLET_BOLT_EUV"
+"CHEVROLET_EQUINOX_NON_ACC_3RD_GEN" = "CHEVROLET_EQUINOX"
+"CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN" = "CHEVROLET_SILVERADO"
+"CADILLAC_CT6_NON_ACC_1ST_GEN" = "CHEVROLET_VOLT"
+"CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN" = "CHEVROLET_TRAILBLAZER"
+"CHEVROLET_MALIBU_NON_ACC_9TH_GEN" = "CHEVROLET_VOLT"
+"CADILLAC_XT5_NON_ACC_1ST_GEN" = "CADILLAC_XT4"
+
+# Synced verbatim from comma opendbc torque_data/substitute.toml
+"HONDA_ODYSSEY_TWN" = "HONDA_ODYSSEY"
+"LEXUS_RC_TSS2" = "LEXUS_NX_TSS2"
+
+# Platform-sibling substitutes: comma has never shipped torque data for these,
+# so rather than invent lateral-accel figures they borrow the tune of the closest
+# platform twin. REVIEW: replace with measured values when available.
+"SEAT_ALHAMBRA_MK1" = "VOLKSWAGEN_SHARAN_MK2"
+"VOLKSWAGEN_PASSAT_NMS_PLUS" = "VOLKSWAGEN_PASSAT_NMS"
+"VOLKSWAGEN_ID3_MK1" = "VOLKSWAGEN_ID4_MK1"
+"VOLKSWAGEN_ID3_MK2" = "VOLKSWAGEN_ID4_MK2"
+"SKODA_ENYAQ_MK1" = "VOLKSWAGEN_ID4_MK1"
+"SKODA_ENYAQ_MK2" = "VOLKSWAGEN_ID4_MK2"
+"AUDI_Q4_MK1" = "VOLKSWAGEN_ID4_MK1"
+"AUDI_Q4_MK2" = "VOLKSWAGEN_ID4_MK2"
+"VOLKSWAGEN_GOLF_MK8" = "VOLKSWAGEN_GOLF_MK7"
+"SEAT_LEON_MK4" = "VOLKSWAGEN_GOLF_MK7"
+"VOLKSWAGEN_PASSAT_MK7" = "VOLKSWAGEN_PASSAT_NMS"
+"VOLKSWAGEN_PASSAT_B7" = "VOLKSWAGEN_PASSAT_NMS"
+"HONDA_CLARITY" = "HONDA_ACCORD"
diff --git a/iqdbc_repo/iqdbc/car/toyota/__init__.py b/iqdbc_repo/iqdbc/car/toyota/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/toyota/carcontroller.py b/iqdbc_repo/iqdbc/car/toyota/carcontroller.py
new file mode 100644
index 000000000..04fb4dbcc
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/carcontroller.py
@@ -0,0 +1,337 @@
+import math
+import numpy as np
+from iqdbc.car import Bus, make_tester_present_msg, rate_limit, structs, ACCELERATION_DUE_TO_GRAVITY, DT_CTRL
+from iqdbc.car.lateral import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance
+from iqdbc.car.carlog import carlog
+from iqdbc.car.common.filter_simple import FirstOrderFilter, HighPassFilter
+from iqdbc.car.common.pid import PIDController
+from iqdbc.car.secoc import add_mac, build_sync_mac
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.toyota import toyotacan
+from iqdbc.car.toyota.values import CAR, NO_STOP_TIMER_CAR, TSS2_CAR, \
+ CarControllerParams, ToyotaFlags, \
+ UNSUPPORTED_DSU_CAR
+from iqdbc.can import CANPacker
+
+from iqdbc.lvbs.car.toyota.gas_interceptor import GasInterceptorCarController
+from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ
+
+Ecu = structs.CarParams.Ecu
+LongCtrlState = structs.CarControl.Actuators.LongControlState
+SteerControlType = structs.CarParams.SteerControlType
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+
+# The up limit allows the brakes/gas to unwind quickly leaving a stop,
+# the down limit roughly matches the rate of ACCEL_NET, reducing PCM compensation windup
+ACCEL_WINDUP_LIMIT = 4.0 * DT_CTRL * 3 # m/s^2 / frame
+ACCEL_WINDDOWN_LIMIT = -4.0 * DT_CTRL * 3 # m/s^2 / frame
+ACCEL_PID_UNWIND = 0.03 * DT_CTRL * 3 # m/s^2 / frame
+
+MAX_PITCH_COMPENSATION = 1.5 # m/s^2
+
+# LKA limits
+# EPS faults if you apply torque while the steering rate is above 100 deg/s for too long
+MAX_STEER_RATE = 100 # deg/s
+MAX_STEER_RATE_FRAMES = 17 # tx control frames needed before torque can be cut
+
+# EPS allows user torque above threshold for 50 frames before permanently faulting
+MAX_USER_TORQUE = 500
+
+
+def get_long_tune(CP, params):
+ if CP.carFingerprint in TSS2_CAR:
+ kiBP = [2., 5.]
+ kiV = [0.5, 0.25]
+ else:
+ kiBP = [0., 5., 35.]
+ kiV = [3.6, 2.4, 1.5]
+
+ return PIDController(0.0, (kiBP, kiV), k_f=1.0,
+ pos_limit=params.ACCEL_MAX, neg_limit=params.ACCEL_MIN,
+ rate=1 / (DT_CTRL * 3))
+
+
+class CarController(CarControllerBase, GasInterceptorCarController):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ CarControllerBase.__init__(self, dbc_names, CP, CP_IQ)
+ GasInterceptorCarController.__init__(self, CP, CP_IQ)
+ self.params = CarControllerParams(self.CP)
+ self.last_torque = 0
+ self.last_angle = 0
+ self.alert_active = False
+ self.last_standstill = False
+ self.standstill_req = False
+ self.permit_braking = True
+ self.steer_rate_counter = 0
+ self.distance_button = 0
+
+ # *** start long control state ***
+ self.long_pid = get_long_tune(self.CP, self.params)
+ self.aego = FirstOrderFilter(0.0, 0.25, DT_CTRL * 3)
+ self.pitch = FirstOrderFilter(0, 0.5, DT_CTRL)
+ self.pitch_hp = HighPassFilter(0.0, 0.25, 1.5, DT_CTRL)
+
+ self.accel = 0
+ self.prev_accel = 0
+ # *** end long control state ***
+
+ self.packer = CANPacker(dbc_names[Bus.pt])
+
+ self.secoc_lka_message_counter = 0
+ self.secoc_lta_message_counter = 0
+ self.secoc_acc_message_counter = 0
+ self.secoc_prev_reset_counter = 0
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ actuators = CC.actuators
+ stopping = actuators.longControlState == LongCtrlState.stopping
+ hud_control = CC.hudControl
+ pcm_cancel_cmd = CC.cruiseControl.cancel
+ lat_active = CC.latActive and abs(CS.out.steeringTorque) < MAX_USER_TORQUE
+
+ if len(CC.orientationNED) == 3:
+ self.pitch.update(CC.orientationNED[1])
+ self.pitch_hp.update(CC.orientationNED[1])
+
+ # *** control msgs ***
+ can_sends = []
+
+ # *** handle secoc reset counter increase ***
+ if self.CP.flags & ToyotaFlags.SECOC.value:
+ if CS.secoc_synchronization['RESET_CNT'] != self.secoc_prev_reset_counter:
+ self.secoc_lka_message_counter = 0
+ self.secoc_lta_message_counter = 0
+ self.secoc_acc_message_counter = 0
+ self.secoc_prev_reset_counter = CS.secoc_synchronization['RESET_CNT']
+
+ expected_mac = build_sync_mac(self.secoc_key, int(CS.secoc_synchronization['TRIP_CNT']), int(CS.secoc_synchronization['RESET_CNT']))
+ if int(CS.secoc_synchronization['AUTHENTICATOR']) != expected_mac:
+ 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)
+
+ # >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
+
+ # *** steer angle ***
+ if self.CP.steerControlType == SteerControlType.angle:
+ # If using LTA control, disable LKA and set steering angle command
+ apply_torque = 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)
+
+ self.last_torque = apply_torque
+
+ # 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)
+ 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,
+ int(CS.secoc_synchronization['TRIP_CNT']),
+ int(CS.secoc_synchronization['RESET_CNT']),
+ self.secoc_lka_message_counter,
+ steer_command)
+ self.secoc_lka_message_counter += 1
+ can_sends.append(steer_command)
+
+ # STEERING_LTA does not seem to allow more rate by sending faster, and may wind up easier
+ if self.frame % 2 == 0 and self.CP.carFingerprint in TSS2_CAR:
+ lta_active = lat_active and self.CP.steerControlType == SteerControlType.angle
+ # 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)
+
+ # 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
+ can_sends.append(toyotacan.create_lta_steer_command(self.packer, self.CP.steerControlType, self.last_angle,
+ lta_active, self.frame // 2, torque_wind_down))
+
+ if self.CP.flags & ToyotaFlags.SECOC.value:
+ lta_steer_2 = toyotacan.create_lta_steer_command_2(self.packer, self.frame // 2)
+ lta_steer_2 = add_mac(self.secoc_key,
+ int(CS.secoc_synchronization['TRIP_CNT']),
+ int(CS.secoc_synchronization['RESET_CNT']),
+ self.secoc_lta_message_counter,
+ lta_steer_2)
+ self.secoc_lta_message_counter += 1
+ can_sends.append(lta_steer_2)
+
+ # *** gas and brake ***
+
+ # on entering standstill, send standstill request for older TSS-P cars that aren't designed to stay engaged at a stop
+ # SNG hack: skip setting standstill_req so RELEASE_STANDSTILL stays True and openpilot controls through the stop
+ if self.CP.carFingerprint not in NO_STOP_TIMER_CAR or self.CP_IQ.enableGasInterceptor:
+ if CS.out.standstill and not self.last_standstill and \
+ (self.CP_IQ.enableGasInterceptor or not (self.CP_IQ.flags & ToyotaFlagsIQ.STOP_AND_GO_HACK)):
+ self.standstill_req = True
+ if CS.pcm_acc_status != 8:
+ # pcm entered standstill or it's disabled
+ self.standstill_req = False
+
+ else:
+ # NO_STOP_TIMER cars: actively manage standstill hold/release based on planner intent.
+ # if user engages at a stop with foot on brake, PCM starts in a special cruise standstill mode. on resume press,
+ # brakes can take a while to ramp up causing a lurch forward. prevent resume press until planner wants to move.
+ # don't use CC.cruiseControl.resume since it is gated on CS.cruiseState.standstill which goes false for 3s after resume press
+ # whitelist hybrids as they do not have this issue and can stay stopped after resume press
+ if not self.CP.flags & ToyotaFlags.HYBRID.value:
+ should_resume = actuators.accel > 0
+ if should_resume:
+ self.standstill_req = False
+
+ if not should_resume and CS.out.cruiseState.standstill:
+ self.standstill_req = True
+
+ self.last_standstill = CS.out.standstill
+
+ # handle UI messages
+ fcw_alert = hud_control.visualAlert == VisualAlert.fcw
+ steer_alert = hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw)
+ lead = hud_control.leadVisible or CS.out.vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged
+
+ if self.CP.openpilotLongitudinalControl:
+ if self.frame % 3 == 0:
+ # Press distance button until we are at the correct bar length. Only change while enabled to avoid skipping startup popup
+ if self.frame % 6 == 0 and self.CP.openpilotLongitudinalControl:
+ desired_distance = 4 - hud_control.leadDistanceBars
+ if CS.out.cruiseState.enabled and CS.pcm_follow_distance != desired_distance:
+ self.distance_button = not self.distance_button
+ else:
+ self.distance_button = 0
+
+ # internal PCM gas command can get stuck unwinding from negative accel so we apply a generous rate limit
+ pcm_accel_cmd = actuators.accel
+ if CC.longActive:
+ pcm_accel_cmd = rate_limit(pcm_accel_cmd, self.prev_accel, ACCEL_WINDDOWN_LIMIT, ACCEL_WINDUP_LIMIT)
+ self.prev_accel = pcm_accel_cmd
+
+ # calculate amount of acceleration PCM should apply to reach target, given pitch.
+ # clipped to only include downhill angles, avoids erroneously unsetting PERMIT_BRAKING when stopping on uphills
+ accel_due_to_pitch = math.sin(min(self.pitch.x, 0.0)) * ACCELERATION_DUE_TO_GRAVITY
+ # TODO: on uphills this sometimes sets PERMIT_BRAKING low not considering the creep force
+ net_acceleration_request = pcm_accel_cmd + accel_due_to_pitch
+
+ # GVC does not overshoot ego acceleration when starting from stop, but still has a similar delay
+ if not self.CP.flags & ToyotaFlags.SECOC.value:
+ a_ego_blended = float(np.interp(CS.out.vEgo, [1.0, 2.0], [CS.gvc, CS.out.aEgo]))
+ else:
+ a_ego_blended = CS.out.aEgo
+
+ # wind down integral when approaching target for step changes and smooth ramps to reduce overshoot
+ prev_aego = self.aego.x
+ self.aego.update(a_ego_blended)
+ j_ego = (self.aego.x - prev_aego) / (DT_CTRL * 3)
+
+ future_t = float(np.interp(CS.out.vEgo, [2., 5.], [0.25, 0.5]))
+ a_ego_future = a_ego_blended + j_ego * future_t
+
+ if CC.longActive:
+ # constantly slowly unwind integral to recover from large temporary errors
+ self.long_pid.i -= ACCEL_PID_UNWIND * float(np.sign(self.long_pid.i))
+
+ error_future = pcm_accel_cmd - a_ego_future
+
+ if not stopping:
+ # Toyota's PCM slowly responds to changes in pitch. On change, we amplify our
+ # acceleration request to compensate for the undershoot and following overshoot
+ pitch_compensation = float(np.clip(math.sin(self.pitch_hp.x) * ACCELERATION_DUE_TO_GRAVITY,
+ -MAX_PITCH_COMPENSATION, MAX_PITCH_COMPENSATION))
+ pcm_accel_cmd += pitch_compensation
+
+ pcm_accel_cmd = self.long_pid.update(error_future,
+ speed=CS.out.vEgo,
+ feedforward=pcm_accel_cmd,
+ freeze_integrator=actuators.longControlState != LongCtrlState.pid)
+ else:
+ self.long_pid.reset()
+ pcm_accel_cmd = 0.
+
+ # Along with rate limiting positive jerk above, this greatly improves gas response time
+ # Consider the net acceleration request that the PCM should be applying (pitch included)
+ net_acceleration_request_min = min(actuators.accel + accel_due_to_pitch, net_acceleration_request)
+ if net_acceleration_request_min < 0.2 or stopping or not CC.longActive:
+ self.permit_braking = True
+ elif net_acceleration_request_min > 0.3:
+ self.permit_braking = False
+
+ sdsu_tssp_long_active = bool(self.CP_IQ.flags & ToyotaFlagsIQ.SMART_DSU) and \
+ (self.CP.carFingerprint not in TSS2_CAR) and CC.longActive
+ pcm_accel_cmd = actuators.accel if sdsu_tssp_long_active else pcm_accel_cmd
+ pcm_accel_cmd = float(np.clip(pcm_accel_cmd, self.params.ACCEL_MIN, self.params.ACCEL_MAX))
+
+ main_accel_cmd = 0. if self.CP.flags & ToyotaFlags.SECOC.value else pcm_accel_cmd
+ can_sends.append(toyotacan.create_accel_command(self.packer, main_accel_cmd, pcm_cancel_cmd, self.permit_braking, self.standstill_req, lead,
+ CS.acc_type, fcw_alert, self.distance_button))
+ if self.CP.flags & ToyotaFlags.SECOC.value:
+ acc_cmd_2 = toyotacan.create_accel_command_2(self.packer, pcm_accel_cmd)
+ acc_cmd_2 = add_mac(self.secoc_key,
+ int(CS.secoc_synchronization['TRIP_CNT']),
+ int(CS.secoc_synchronization['RESET_CNT']),
+ self.secoc_acc_message_counter,
+ acc_cmd_2)
+ self.secoc_acc_message_counter += 1
+ can_sends.append(acc_cmd_2)
+
+ self.accel = pcm_accel_cmd
+
+ else:
+ # we can spam can to cancel the system even if we are using lat only control
+ if pcm_cancel_cmd:
+ if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
+ can_sends.append(toyotacan.create_acc_cancel_command(self.packer))
+ else:
+ can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, True, False, lead, CS.acc_type, False, self.distance_button))
+
+ can_sends.extend(GasInterceptorCarController.create_gas_command(self, CC, CS, actuators, self.packer, self.frame))
+
+ # *** hud ui ***
+ if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V:
+ # ui mesg is at 1Hz but we send asap if:
+ # - there is something to display
+ # - there is something to stop displaying
+ send_ui = False
+ if ((fcw_alert or steer_alert) and not self.alert_active) or \
+ (not (fcw_alert or steer_alert) and self.alert_active):
+ send_ui = True
+ self.alert_active = not self.alert_active
+ elif pcm_cancel_cmd:
+ # forcing the pcm to disengage causes a bad fault sound so play a good sound instead
+ send_ui = True
+
+ if self.frame % 20 == 0 or send_ui:
+ can_sends.append(toyotacan.create_ui_command(self.packer, steer_alert, pcm_cancel_cmd, hud_control.leftLaneVisible,
+ hud_control.rightLaneVisible, hud_control.leftLaneDepart,
+ hud_control.rightLaneDepart, CC.latActive, CS.lkas_hud))
+
+ if (self.frame % 100 == 0 or send_ui) and self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
+ can_sends.append(toyotacan.create_fcw_command(self.packer, fcw_alert))
+
+ # keep radar disabled
+ if self.frame % 20 == 0 and self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
+ 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.steeringAngleDeg = self.last_angle
+ new_actuators.accel = self.accel
+ new_actuators.gas = self.gas
+
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/toyota/carstate.py b/iqdbc_repo/iqdbc/car/toyota/carstate.py
new file mode 100644
index 000000000..8300e29ba
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/carstate.py
@@ -0,0 +1,231 @@
+import copy
+
+from iqdbc.can import CANDefine, CANParser
+from iqdbc.car import Bus, DT_CTRL, create_button_events, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.common.filter_simple import FirstOrderFilter
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.toyota.values import ToyotaFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \
+ TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR, \
+ SECOC_CAR
+from iqdbc.lvbs.car.toyota.iq_carstate import IQCarState
+from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ
+
+ButtonType = structs.CarState.ButtonEvent.Type
+SteerControlType = structs.CarParams.SteerControlType
+
+# These steering fault definitions seem to be common across LKA (torque) and LTA (angle):
+# - high steer rate fault: goes to 21 or 25 for 1 frame, then 9 for 2 seconds
+# - lka/lta msg drop out: goes to 9 then 11 for a combined total of 2 seconds, then 3.
+# if using the other control command, goes directly to 3 after 1.5 seconds
+# - initializing: LTA can report 0 as long as STEER_TORQUE_SENSOR->STEER_ANGLE_INITIALIZING is 1,
+# and is a catch-all for LKA
+TEMP_STEER_FAULTS = (0, 9, 11, 21, 25)
+# - lka/lta msg drop out: 3 (recoverable)
+# - prolonged high driver torque: 17 (permanent)
+PERM_STEER_FAULTS = (3, 17)
+
+
+class CarState(CarStateBase, IQCarState):
+ def __init__(self, CP, CP_IQ):
+ CarStateBase.__init__(self, CP, CP_IQ)
+ IQCarState.__init__(self, CP, CP_IQ)
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+ self.eps_torque_scale = EPS_SCALE[CP.carFingerprint] / 100.
+ self.cluster_speed_hyst_gap = CV.KPH_TO_MS / 2.
+ self.cluster_min_speed = CV.KPH_TO_MS / 2.
+
+ if CP.flags & ToyotaFlags.SECOC.value:
+ self.shifter_values = can_define.dv["GEAR_PACKET_HYBRID"]["GEAR"]
+ else:
+ self.shifter_values = can_define.dv["GEAR_PACKET"]["GEAR"]
+
+ # On cars with cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
+ # the signal is zeroed to where the steering angle is at start.
+ # Need to apply an offset as soon as the steering angle measurements are both received
+ self.accurate_steer_angle_seen = False
+ self.angle_offset = FirstOrderFilter(None, 60.0, DT_CTRL, initialized=False)
+
+ self.lkas_button = 0
+ self.distance_button = 0
+
+ self.pcm_follow_distance = 0
+
+ self.acc_type = 1
+ self.lkas_hud = {}
+ self.gvc = 0.0
+ self.secoc_synchronization = None
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+ cp_acc = cp_cam if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) else cp
+
+ if not self.CP.flags & ToyotaFlags.SECOC.value:
+ self.gvc = cp.vl["VSC1S07"]["GVC"]
+
+ ret.doorOpen = any([cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FR"],
+ cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RR"]])
+ ret.seatbeltUnlatched = cp.vl["BODY_CONTROL_STATE"]["SEATBELT_DRIVER_UNLATCHED"] != 0
+ ret.parkingBrake = cp.vl["BODY_CONTROL_STATE"]["PARKING_BRAKE"] == 1
+
+ ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0
+ ret.brakeHoldActive = cp.vl["ESP_CONTROL"]["BRAKE_HOLD_ACTIVE"] == 1
+
+ if self.CP.flags & ToyotaFlags.SECOC.value:
+ self.secoc_synchronization = copy.copy(cp.vl["SECOC_SYNCHRONIZATION"])
+ ret.gasPressed = cp.vl["GAS_PEDAL"]["GAS_PEDAL_USER"] > 0
+ can_gear = int(cp.vl["GEAR_PACKET_HYBRID"]["GEAR"])
+ else:
+ ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0 # TODO: these also have GAS_PEDAL, come back and unify
+ can_gear = int(cp.vl["GEAR_PACKET"]["GEAR"])
+ if not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
+ ret.stockAeb = bool(cp_acc.vl["PRE_COLLISION"]["PRECOLLISION_ACTIVE"] and cp_acc.vl["PRE_COLLISION"]["FORCE"] < -1e-5)
+
+ self.parse_wheel_speeds(ret,
+ cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FL"],
+ cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FR"],
+ cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RL"],
+ cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RR"],
+ )
+ ret.vEgoCluster = ret.vEgo * 1.015 # minimum of all the cars
+
+ ret.standstill = abs(ret.vEgoRaw) < 1e-3
+
+ ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
+ ret.steeringRateDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_RATE"]
+ torque_sensor_angle_deg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
+
+ # On some cars, the angle measurement is non-zero while initializing
+ if abs(torque_sensor_angle_deg) > 1e-3 and not bool(cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE_INITIALIZING"]):
+ self.accurate_steer_angle_seen = True
+
+ if self.accurate_steer_angle_seen:
+ # Offset seems to be invalid for large steering angles and high angle rates
+ if abs(ret.steeringAngleDeg) < 90 and abs(ret.steeringRateDeg) < 100 and cp.can_valid:
+ self.angle_offset.update(torque_sensor_angle_deg - ret.steeringAngleDeg)
+
+ if self.angle_offset.initialized:
+ ret.steeringAngleOffsetDeg = self.angle_offset.x
+ ret.steeringAngleDeg = torque_sensor_angle_deg - self.angle_offset.x
+
+ ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
+ ret.leftBlinker = cp.vl["BLINKERS_STATE"]["TURN_SIGNALS"] == 1
+ ret.rightBlinker = cp.vl["BLINKERS_STATE"]["TURN_SIGNALS"] == 2
+
+ ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
+ ret.steeringTorqueEps = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_EPS"] * self.eps_torque_scale
+ # we could use the override bit from dbc, but it's triggered at too high torque values
+ ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
+
+ # Check EPS LKA/LTA fault status
+ ret.steerFaultTemporary = cp.vl["EPS_STATUS"]["LKA_STATE"] in TEMP_STEER_FAULTS
+ ret.steerFaultPermanent = cp.vl["EPS_STATUS"]["LKA_STATE"] in PERM_STEER_FAULTS
+
+ if self.CP.steerControlType == SteerControlType.angle:
+ ret.steerFaultTemporary = ret.steerFaultTemporary or cp.vl["EPS_STATUS"]["LTA_STATE"] in TEMP_STEER_FAULTS
+ ret.steerFaultPermanent = ret.steerFaultPermanent or cp.vl["EPS_STATUS"]["LTA_STATE"] in PERM_STEER_FAULTS
+
+ # Lane Tracing Assist control is unavailable (EPS_STATUS->LTA_STATE=0) until
+ # the more accurate angle sensor signal is initialized
+ ret.vehicleSensorsInvalid = not self.accurate_steer_angle_seen
+
+ if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
+ # TODO: find the bit likely in DSU_CRUISE that describes an ACC fault. one may also exist in CLUTCH
+ ret.cruiseState.available = cp.vl["DSU_CRUISE"]["MAIN_ON"] != 0
+ ret.cruiseState.speed = cp.vl["DSU_CRUISE"]["SET_SPEED"] * CV.KPH_TO_MS
+ cluster_set_speed = cp.vl["PCM_CRUISE_ALT"]["UI_SET_SPEED"]
+ else:
+ ret.accFaulted = cp.vl["PCM_CRUISE_2"]["ACC_FAULTED"] != 0
+ ret.carFaultedNonCritical = cp.vl["PCM_CRUISE_SM"]["TEMP_ACC_FAULTED"] != 0
+ ret.cruiseState.available = cp.vl["PCM_CRUISE_2"]["MAIN_ON"] != 0
+ ret.cruiseState.speed = cp.vl["PCM_CRUISE_2"]["SET_SPEED"] * CV.KPH_TO_MS
+ cluster_set_speed = cp.vl["PCM_CRUISE_SM"]["UI_SET_SPEED"]
+
+ ret.lateralAvailable = ret.cruiseState.available
+
+ # UI_SET_SPEED is always non-zero when main is on, hide until first enable
+ is_metric = cp.vl["BODY_CONTROL_STATE_2"]["UNITS"] in (1, 2)
+ if ret.cruiseState.speed != 0:
+ conversion_factor = CV.KPH_TO_MS if is_metric else CV.MPH_TO_MS
+ ret.cruiseState.speedCluster = cluster_set_speed * conversion_factor
+
+ if self.CP.carFingerprint in TSS2_CAR and not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
+ self.acc_type = cp_acc.vl["ACC_CONTROL"]["ACC_TYPE"]
+ ret.stockFcw = bool(cp_acc.vl["PCS_HUD"]["FCW"])
+
+ # some TSS2 cars have low speed lockout permanently set, so ignore on those cars
+ # these cars are identified by an ACC_TYPE value of 2.
+ # TODO: it is possible to avoid the lockout and gain stop and go if you
+ # 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
+
+ self.pcm_acc_status = cp.vl["PCM_CRUISE"]["CRUISE_STATE"]
+ if self.CP.carFingerprint not in (NO_STOP_TIMER_CAR - TSS2_CAR):
+ # ignore standstill state in certain vehicles, since pcm allows to restart with just an acceleration request
+ ret.cruiseState.standstill = self.pcm_acc_status == 7
+ ret.cruiseState.enabled = bool(cp.vl["PCM_CRUISE"]["CRUISE_ACTIVE"])
+ ret.cruiseState.nonAdaptive = self.pcm_acc_status in (1, 2, 3, 4, 5, 6)
+
+ ret.genericToggle = bool(cp.vl["LIGHT_STALK"]["AUTO_HIGH_BEAM"])
+ ret.espDisabled = cp.vl["ESP_CONTROL"]["TC_DISABLED"] != 0
+
+ if self.CP.enableBsm:
+ ret.leftBlindspot = (cp.vl["BSM"]["L_ADJACENT"] == 1) or (cp.vl["BSM"]["L_APPROACHING"] == 1)
+ ret.rightBlindspot = (cp.vl["BSM"]["R_ADJACENT"] == 1) or (cp.vl["BSM"]["R_APPROACHING"] == 1)
+
+ if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V:
+ self.lkas_hud = copy.copy(cp_cam.vl["LKAS_HUD"])
+
+ if self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR:
+ self.pcm_follow_distance = cp.vl["PCM_CRUISE_2"]["PCM_FOLLOW_DISTANCE"]
+
+ buttonEvents = []
+ prev_distance_button = self.distance_button
+ if self.CP.carFingerprint in TSS2_CAR:
+ # lkas button is wired to the camera
+ prev_lkas_button = self.lkas_button
+ self.lkas_button = cp_cam.vl["LKAS_HUD"]["LDA_ON_MESSAGE"]
+
+ # Cycles between 1 and 2 when pressing the button, then rests back at 0 after ~3s
+ if self.lkas_button != 0 and self.lkas_button != prev_lkas_button:
+ buttonEvents.extend(create_button_events(1, 0, {1: ButtonType.lkas}) +
+ create_button_events(0, 1, {1: ButtonType.lkas}))
+
+ if self.CP.carFingerprint not in (RADAR_ACC_CAR | SECOC_CAR):
+ # distance button is wired to the ACC module (camera or radar)
+ self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"]
+
+ buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
+ elif self.CP_IQ.flags & ToyotaFlagsIQ.SMART_DSU and not self.CP_IQ.flags & ToyotaFlagsIQ.RADAR_CAN_FILTER:
+ self.distance_button = cp.vl["SDSU"]["FD_BUTTON"]
+
+ buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
+
+ ret.buttonEvents = buttonEvents
+
+ IQCarState.update(self, ret, ret_iq, can_parsers)
+
+ return ret, ret_iq
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ pt_messages = [
+ ("BLINKERS_STATE", float('nan')),
+ ]
+
+ cam_messages = [
+ ("RSA1", 0),
+ ("RSA2", 0),
+ ]
+
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [] + cam_messages, 2),
+ }
diff --git a/iqdbc_repo/iqdbc/car/toyota/fingerprints.py b/iqdbc_repo/iqdbc/car/toyota/fingerprints.py
new file mode 100644
index 000000000..582f31427
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/fingerprints.py
@@ -0,0 +1,1892 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.toyota.values import CAR
+
+from iqdbc.lvbs.car.iq_fingerprints import extend_fw_versions
+from iqdbc.lvbs.car.toyota.iq_fingerprints import FW_VERSIONS_EXT
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS = {
+ CAR.TOYOTA_AVALON: {
+ (Ecu.abs, 0x7b0, None): [
+ b'F152607060\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881510701300\x00\x00\x00\x00',
+ b'881510705100\x00\x00\x00\x00',
+ b'881510705200\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B41051\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0230721100\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230721200\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702000\x00\x00\x00\x00',
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F0701100\x00\x00\x00\x00',
+ b'8646F0703000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_AVALON_2019: {
+ (Ecu.abs, 0x7b0, None): [
+ b'F152607110\x00\x00\x00\x00\x00\x00',
+ b'F152607140\x00\x00\x00\x00\x00\x00',
+ b'F152607171\x00\x00\x00\x00\x00\x00',
+ b'F152607180\x00\x00\x00\x00\x00\x00',
+ b'F152641040\x00\x00\x00\x00\x00\x00',
+ b'F152641050\x00\x00\x00\x00\x00\x00',
+ b'F152641060\x00\x00\x00\x00\x00\x00',
+ b'F152641061\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881510703200\x00\x00\x00\x00',
+ b'881510704200\x00\x00\x00\x00',
+ b'881514107100\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B07010\x00\x00\x00\x00\x00\x00',
+ b'8965B41070\x00\x00\x00\x00\x00\x00',
+ b'8965B41080\x00\x00\x00\x00\x00\x00',
+ b'8965B41090\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630725100\x00\x00\x00\x00',
+ b'\x01896630725200\x00\x00\x00\x00',
+ b'\x01896630725300\x00\x00\x00\x00',
+ b'\x01896630725400\x00\x00\x00\x00',
+ b'\x01896630735100\x00\x00\x00\x00',
+ b'\x01896630738000\x00\x00\x00\x00',
+ b'\x02896630724000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x02896630728000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x02896630734000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x02896630737000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F0702100\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_AVALON_TSS2: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F152607240\x00\x00\x00\x00\x00\x00',
+ b'\x01F152607250\x00\x00\x00\x00\x00\x00',
+ b'\x01F152607280\x00\x00\x00\x00\x00\x00',
+ b'F152641080\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B41110\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x018966306Q6000\x00\x00\x00\x00',
+ b'\x01896630742000\x00\x00\x00\x00',
+ b'\x01896630743000\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F6201200\x00\x00\x00\x00',
+ b'\x018821F6201300\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F4104100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_CAMRY: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966306L3100\x00\x00\x00\x00',
+ b'\x018966306L4200\x00\x00\x00\x00',
+ b'\x018966306L5200\x00\x00\x00\x00',
+ b'\x018966306L9000\x00\x00\x00\x00',
+ b'\x018966306P8000\x00\x00\x00\x00',
+ b'\x018966306Q3100\x00\x00\x00\x00',
+ b'\x018966306Q4000\x00\x00\x00\x00',
+ b'\x018966306Q4100\x00\x00\x00\x00',
+ b'\x018966306Q4200\x00\x00\x00\x00',
+ b'\x018966306Q6000\x00\x00\x00\x00',
+ b'\x018966333N1100\x00\x00\x00\x00',
+ b'\x018966333N4300\x00\x00\x00\x00',
+ b'\x018966333P3000\x00\x00\x00\x00',
+ b'\x018966333P3100\x00\x00\x00\x00',
+ b'\x018966333P3200\x00\x00\x00\x00',
+ b'\x018966333P4200\x00\x00\x00\x00',
+ b'\x018966333P4300\x00\x00\x00\x00',
+ b'\x018966333P4400\x00\x00\x00\x00',
+ b'\x018966333P4500\x00\x00\x00\x00',
+ b'\x018966333P4700\x00\x00\x00\x00',
+ b'\x018966333P4900\x00\x00\x00\x00',
+ b'\x018966333Q6000\x00\x00\x00\x00',
+ b'\x018966333Q6200\x00\x00\x00\x00',
+ b'\x018966333Q6300\x00\x00\x00\x00',
+ b'\x018966333Q6500\x00\x00\x00\x00',
+ b'\x018966333Q9200\x00\x00\x00\x00',
+ b'\x018966333W6000\x00\x00\x00\x00',
+ b'\x018966333X0000\x00\x00\x00\x00',
+ b'\x018966333X4000\x00\x00\x00\x00',
+ b'\x01896633T16000\x00\x00\x00\x00',
+ b'\x01896633TA2000\x00\x00\x00\x00',
+ b'\x028966306B2100\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306B2300\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306B2500\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306N8100\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306N8200\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306N8300\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306N8400\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306R5000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306R5000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966306R6000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966306R6000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966306S0000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966306S0100\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966306S1100\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02333P1100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'8821F0601200 ',
+ b'8821F0601300 ',
+ b'8821F0601400 ',
+ b'8821F0601500 ',
+ b'8821F0601600 ',
+ b'8821F0602000 ',
+ b'8821F0603300 ',
+ b'8821F0603400 ',
+ b'8821F0604000 ',
+ b'8821F0604100 ',
+ b'8821F0604200 ',
+ b'8821F0605200 ',
+ b'8821F0606200 ',
+ b'8821F0607200 ',
+ b'8821F0607300 ',
+ b'8821F0608000 ',
+ b'8821F0608200 ',
+ b'8821F0608300 ',
+ b'8821F0609000 ',
+ b'8821F0609100 ',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152606210\x00\x00\x00\x00\x00\x00',
+ b'F152606230\x00\x00\x00\x00\x00\x00',
+ b'F152606260\x00\x00\x00\x00\x00\x00',
+ b'F152606270\x00\x00\x00\x00\x00\x00',
+ b'F152606290\x00\x00\x00\x00\x00\x00',
+ b'F152606410\x00\x00\x00\x00\x00\x00',
+ b'F152633214\x00\x00\x00\x00\x00\x00',
+ b'F152633540\x00\x00\x00\x00\x00\x00',
+ b'F152633660\x00\x00\x00\x00\x00\x00',
+ b'F152633712\x00\x00\x00\x00\x00\x00',
+ b'F152633713\x00\x00\x00\x00\x00\x00',
+ b'F152633A10\x00\x00\x00\x00\x00\x00',
+ b'F152633A20\x00\x00\x00\x00\x00\x00',
+ b'F152633B51\x00\x00\x00\x00\x00\x00',
+ b'F152633B60\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B33540\x00\x00\x00\x00\x00\x00',
+ b'8965B33542\x00\x00\x00\x00\x00\x00',
+ b'8965B33550\x00\x00\x00\x00\x00\x00',
+ b'8965B33551\x00\x00\x00\x00\x00\x00',
+ b'8965B33580\x00\x00\x00\x00\x00\x00',
+ b'8965B33581\x00\x00\x00\x00\x00\x00',
+ b'8965B33611\x00\x00\x00\x00\x00\x00',
+ b'8965B33621\x00\x00\x00\x00\x00\x00',
+ b'8965B33630\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F0601200 ',
+ b'8821F0601300 ',
+ b'8821F0601400 ',
+ b'8821F0601500 ',
+ b'8821F0601600 ',
+ b'8821F0602000 ',
+ b'8821F0603300 ',
+ b'8821F0603400 ',
+ b'8821F0604000 ',
+ b'8821F0604100 ',
+ b'8821F0604200 ',
+ b'8821F0605200 ',
+ b'8821F0606200 ',
+ b'8821F0607200 ',
+ b'8821F0607300 ',
+ b'8821F0608000 ',
+ b'8821F0608200 ',
+ b'8821F0608300 ',
+ b'8821F0609000 ',
+ b'8821F0609100 ',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F0601200 ',
+ b'8646F0601300 ',
+ b'8646F0601400 ',
+ b'8646F0603400 ',
+ b'8646F0603500 ',
+ b'8646F0604000 ',
+ b'8646F0604100 ',
+ b'8646F0605000 ',
+ b'8646F0606000 ',
+ b'8646F0606100 ',
+ b'8646F0607000 ',
+ b'8646F0607100 ',
+ ],
+ },
+ CAR.TOYOTA_CAMRY_TSS2: {
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B33630\x00\x00\x00\x00\x00\x00',
+ b'8965B33640\x00\x00\x00\x00\x00\x00',
+ b'8965B33650\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F152606370\x00\x00\x00\x00\x00\x00',
+ b'\x01F152606390\x00\x00\x00\x00\x00\x00',
+ b'\x01F152606400\x00\x00\x00\x00\x00\x00',
+ b'\x01F152606431\x00\x00\x00\x00\x00\x00',
+ b'\x01F152633E11\x00\x00\x00\x00\x00\x00',
+ b'F152633310\x00\x00\x00\x00\x00\x00',
+ b'F152633D00\x00\x00\x00\x00\x00\x00',
+ b'F152633D60\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x018966306Q5000\x00\x00\x00\x00',
+ b'\x018966306Q6000\x00\x00\x00\x00',
+ b'\x018966306Q7000\x00\x00\x00\x00',
+ b'\x018966306Q9000\x00\x00\x00\x00',
+ b'\x018966306R3000\x00\x00\x00\x00',
+ b'\x018966306R8000\x00\x00\x00\x00',
+ b'\x018966306T0000\x00\x00\x00\x00',
+ b'\x018966306T3100\x00\x00\x00\x00',
+ b'\x018966306T3200\x00\x00\x00\x00',
+ b'\x018966306T4000\x00\x00\x00\x00',
+ b'\x018966306T4100\x00\x00\x00\x00',
+ b'\x018966306V1000\x00\x00\x00\x00',
+ b'\x018966333Z1000\x00\x00\x00\x00',
+ b'\x018966333Z9000\x00\x00\x00\x00',
+ b'\x01896633T20000\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F6201200\x00\x00\x00\x00',
+ b'\x018821F6201300\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0602100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F0602200\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F0602300\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F3305200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F3305200\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F3305300\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F3305300\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F3305400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F3305500\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_CHR: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896631017100\x00\x00\x00\x00',
+ b'\x01896631017200\x00\x00\x00\x00',
+ b'\x01896631021100\x00\x00\x00\x00',
+ b'\x0189663F413100\x00\x00\x00\x00',
+ b'\x0189663F414100\x00\x00\x00\x00',
+ b'\x0189663F438000\x00\x00\x00\x00',
+ b'\x02896631013200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x0289663F405000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x0289663F405100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x0289663F418000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x0289663F423000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x0289663F431000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'8821F0W01000 ',
+ b'8821F0W01100 ',
+ b'8821FF401600 ',
+ b'8821FF401800 ',
+ b'8821FF402300 ',
+ b'8821FF402400 ',
+ b'8821FF404000 ',
+ b'8821FF404100 ',
+ b'8821FF405000 ',
+ b'8821FF405100 ',
+ b'8821FF406000 ',
+ b'8821FF407100 ',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152610012\x00\x00\x00\x00\x00\x00',
+ b'F152610013\x00\x00\x00\x00\x00\x00',
+ b'F152610014\x00\x00\x00\x00\x00\x00',
+ b'F152610020\x00\x00\x00\x00\x00\x00',
+ b'F152610040\x00\x00\x00\x00\x00\x00',
+ b'F152610153\x00\x00\x00\x00\x00\x00',
+ b'F152610190\x00\x00\x00\x00\x00\x00',
+ b'F152610200\x00\x00\x00\x00\x00\x00',
+ b'F152610210\x00\x00\x00\x00\x00\x00',
+ b'F152610220\x00\x00\x00\x00\x00\x00',
+ b'F152610230\x00\x00\x00\x00\x00\x00',
+ b'F1526F4034\x00\x00\x00\x00\x00\x00',
+ b'F1526F4044\x00\x00\x00\x00\x00\x00',
+ b'F1526F4073\x00\x00\x00\x00\x00\x00',
+ b'F1526F4121\x00\x00\x00\x00\x00\x00',
+ b'F1526F4122\x00\x00\x00\x00\x00\x00',
+ b'F1526F4190\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B10011\x00\x00\x00\x00\x00\x00',
+ b'8965B10020\x00\x00\x00\x00\x00\x00',
+ b'8965B10040\x00\x00\x00\x00\x00\x00',
+ b'8965B10050\x00\x00\x00\x00\x00\x00',
+ b'8965B10070\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0331024000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00',
+ b'\x0331024000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ b'\x0331036000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ b'\x033F401100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203102\x00\x00\x00\x00',
+ b'\x033F401200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00',
+ b'\x033F424000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00',
+ b'\x033F424000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ b'\x033F435000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F0W01000 ',
+ b'8821F0W01100 ',
+ b'8821FF401600 ',
+ b'8821FF401800 ',
+ b'8821FF402300 ',
+ b'8821FF402400 ',
+ b'8821FF404000 ',
+ b'8821FF404100 ',
+ b'8821FF405000 ',
+ b'8821FF405100 ',
+ b'8821FF406000 ',
+ b'8821FF407100 ',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646FF401700 ',
+ b'8646FF401800 ',
+ b'8646FF402100 ',
+ b'8646FF404000 ',
+ b'8646FF406000 ',
+ b'8646FF407000 ',
+ b'8646FF407100 ',
+ ],
+ },
+ CAR.TOYOTA_CHR_TSS2: {
+ (Ecu.abs, 0x7b0, None): [
+ b'F152610041\x00\x00\x00\x00\x00\x00',
+ b'F152610260\x00\x00\x00\x00\x00\x00',
+ b'F1526F4270\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B10091\x00\x00\x00\x00\x00\x00',
+ b'8965B10092\x00\x00\x00\x00\x00\x00',
+ b'8965B10110\x00\x00\x00\x00\x00\x00',
+ b'8965B10111\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x0189663F438000\x00\x00\x00\x00',
+ b'\x0189663F459000\x00\x00\x00\x00',
+ b'\x02896631025000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x0289663F453000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0331014000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821FF410200\x00\x00\x00\x00',
+ b'\x018821FF410300\x00\x00\x00\x00',
+ b'\x018821FF410400\x00\x00\x00\x00',
+ b'\x018821FF410500\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646FF410200\x00\x00\x00\x008646GF408200\x00\x00\x00\x00',
+ b'\x028646FF411100\x00\x00\x00\x008646GF409000\x00\x00\x00\x00',
+ b'\x028646FF413000\x00\x00\x00\x008646GF411000\x00\x00\x00\x00',
+ b'\x028646FF413100\x00\x00\x00\x008646GF411100\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_COROLLA: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0230ZC2000\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC2100\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC2200\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC2300\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC3000\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC3100\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC3200\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZC3300\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0330ZC1200\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881510201100\x00\x00\x00\x00',
+ b'881510201200\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152602190\x00\x00\x00\x00\x00\x00',
+ b'F152602191\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B02181\x00\x00\x00\x00\x00\x00',
+ b'8965B02191\x00\x00\x00\x00\x00\x00',
+ b'8965B48150\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F0201101\x00\x00\x00\x00',
+ b'8646F0201200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_COROLLA_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630A22000\x00\x00\x00\x00',
+ b'\x01896630A42000\x00\x00\x00\x00',
+ b'\x01896630ZG2000\x00\x00\x00\x00',
+ b'\x01896630ZG5000\x00\x00\x00\x00',
+ b'\x01896630ZG5100\x00\x00\x00\x00',
+ b'\x01896630ZG5200\x00\x00\x00\x00',
+ b'\x01896630ZG5300\x00\x00\x00\x00',
+ b'\x01896630ZJ1000\x00\x00\x00\x00',
+ b'\x01896630ZP1000\x00\x00\x00\x00',
+ b'\x01896630ZP2000\x00\x00\x00\x00',
+ b'\x01896630ZQ5000\x00\x00\x00\x00',
+ b'\x01896630ZU8000\x00\x00\x00\x00',
+ b'\x01896630ZU9000\x00\x00\x00\x00',
+ b'\x01896630ZX4000\x00\x00\x00\x00',
+ b'\x01896630ZX7100\x00\x00\x00\x00',
+ b'\x018966312L8000\x00\x00\x00\x00',
+ b'\x018966312M0000\x00\x00\x00\x00',
+ b'\x018966312M9000\x00\x00\x00\x00',
+ b'\x018966312P9000\x00\x00\x00\x00',
+ b'\x018966312P9100\x00\x00\x00\x00',
+ b'\x018966312P9200\x00\x00\x00\x00',
+ b'\x018966312P9300\x00\x00\x00\x00',
+ b'\x018966312Q2300\x00\x00\x00\x00',
+ b'\x018966312Q8000\x00\x00\x00\x00',
+ b'\x018966312R0000\x00\x00\x00\x00',
+ b'\x018966312R0100\x00\x00\x00\x00',
+ b'\x018966312R0200\x00\x00\x00\x00',
+ b'\x018966312R1000\x00\x00\x00\x00',
+ b'\x018966312R1100\x00\x00\x00\x00',
+ b'\x018966312R3100\x00\x00\x00\x00',
+ b'\x018966312S5000\x00\x00\x00\x00',
+ b'\x018966312S7000\x00\x00\x00\x00',
+ b'\x018966312W3000\x00\x00\x00\x00',
+ b'\x018966312W9000\x00\x00\x00\x00',
+ b'\x01896637621000\x00\x00\x00\x00',
+ b'\x01896637623000\x00\x00\x00\x00',
+ b'\x01896637624000\x00\x00\x00\x00',
+ b'\x01896637625000\x00\x00\x00\x00',
+ b'\x01896637626000\x00\x00\x00\x00',
+ b'\x01896637639000\x00\x00\x00\x00',
+ b'\x01896637643000\x00\x00\x00\x00',
+ b'\x01896637644000\x00\x00\x00\x00',
+ b'\x01896637648000\x00\x00\x00\x00',
+ b'\x01896637649000\x00\x00\x00\x00',
+ b'\x02896630A07000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630A21000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZJ5000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZK8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZN8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZQ3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZR2000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZT8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZT9000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896630ZZ0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966312K6000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966312L0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966312L0100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966312Q3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966312Q3100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966312Q4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x038966312L7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00',
+ b'\x038966312N1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x038966312T3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0230A10000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230A11000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZN4000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230ZN5000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02312K4000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02312U5000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x03312K7000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00',
+ b'\x03312M3000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00',
+ b'\x03312N6000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00',
+ b'\x03312N6000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ b'\x03312N6000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00',
+ b'\x03312N6100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ b'\x03312N6100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00',
+ b'\x03312N6200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00',
+ b'\x03312N6200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00',
+ b'\x03312N6200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x018965B12350\x00\x00\x00\x00\x00\x00',
+ b'\x018965B12470\x00\x00\x00\x00\x00\x00',
+ b'\x018965B12490\x00\x00\x00\x00\x00\x00',
+ b'\x018965B12500\x00\x00\x00\x00\x00\x00',
+ b'\x018965B12510\x00\x00\x00\x00\x00\x00',
+ b'\x018965B12520\x00\x00\x00\x00\x00\x00',
+ b'\x018965B12530\x00\x00\x00\x00\x00\x00',
+ b'\x018965B1254000\x00\x00\x00\x00',
+ b'\x018965B1255000\x00\x00\x00\x00',
+ b'\x018965B1256000\x00\x00\x00\x00',
+ b'\x018965B1270000\x00\x00\x00\x00',
+ b'8965B12361\x00\x00\x00\x00\x00\x00',
+ b'8965B12451\x00\x00\x00\x00\x00\x00',
+ b'8965B16011\x00\x00\x00\x00\x00\x00',
+ b'8965B16101\x00\x00\x00\x00\x00\x00',
+ b'8965B16170\x00\x00\x00\x00\x00\x00',
+ b'8965B16260\x00\x00\x00\x00\x00\x00',
+ b'8965B76012\x00\x00\x00\x00\x00\x00',
+ b'8965B76050\x00\x00\x00\x00\x00\x00',
+ b'8965B76091\x00\x00\x00\x00\x00\x00',
+ b'8965B76101\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F152602280\x00\x00\x00\x00\x00\x00',
+ b'\x01F152602281\x00\x00\x00\x00\x00\x00',
+ b'\x01F152602470\x00\x00\x00\x00\x00\x00',
+ b'\x01F152602560\x00\x00\x00\x00\x00\x00',
+ b'\x01F152602590\x00\x00\x00\x00\x00\x00',
+ b'\x01F152602650\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260A010\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260A050\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260A070\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260A33000\x00\x00\x00\x00',
+ b'\x01F152612641\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612651\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612862\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B10\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B51\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B60\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B61\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B62\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B70\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B71\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B81\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B90\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612B91\x00\x00\x00\x00\x00\x00',
+ b'\x01F152612C00\x00\x00\x00\x00\x00\x00',
+ b'\x01F152676250\x00\x00\x00\x00\x00\x00',
+ b'\x01F152676350\x00\x00\x00\x00\x00\x00',
+ b'F152612590\x00\x00\x00\x00\x00\x00',
+ b'F152612691\x00\x00\x00\x00\x00\x00',
+ b'F152612692\x00\x00\x00\x00\x00\x00',
+ b'F152612700\x00\x00\x00\x00\x00\x00',
+ b'F152612710\x00\x00\x00\x00\x00\x00',
+ b'F152612790\x00\x00\x00\x00\x00\x00',
+ b'F152612800\x00\x00\x00\x00\x00\x00',
+ b'F152612820\x00\x00\x00\x00\x00\x00',
+ b'F152612840\x00\x00\x00\x00\x00\x00',
+ b'F152612842\x00\x00\x00\x00\x00\x00',
+ b'F152612890\x00\x00\x00\x00\x00\x00',
+ b'F152612A00\x00\x00\x00\x00\x00\x00',
+ b'F152612A10\x00\x00\x00\x00\x00\x00',
+ b'F152612D00\x00\x00\x00\x00\x00\x00',
+ b'F152616011\x00\x00\x00\x00\x00\x00',
+ b'F152616030\x00\x00\x00\x00\x00\x00',
+ b'F152616060\x00\x00\x00\x00\x00\x00',
+ b'F152642540\x00\x00\x00\x00\x00\x00',
+ b'F152676293\x00\x00\x00\x00\x00\x00',
+ b'F152676303\x00\x00\x00\x00\x00\x00',
+ b'F152676304\x00\x00\x00\x00\x00\x00',
+ b'F152676311\x00\x00\x00\x00\x00\x00',
+ b'F152676371\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301100\x00\x00\x00\x00',
+ b'\x018821F3301200\x00\x00\x00\x00',
+ b'\x018821F3301300\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F12010C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F12010D0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F1201100\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F1201200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F1201300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F1201400\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ b'\x028646F1202000\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F1202100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F1202200\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ b'\x028646F1206000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ b'\x028646F1601100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F1601200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F1601300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F1601500\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F4203400\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F76020C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F7603100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F7603200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F7603300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F7605100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_HIGHLANDER: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630E09000\x00\x00\x00\x00',
+ b'\x01896630E43000\x00\x00\x00\x00',
+ b'\x01896630E43100\x00\x00\x00\x00',
+ b'\x01896630E43200\x00\x00\x00\x00',
+ b'\x01896630E43500\x00\x00\x00\x00',
+ b'\x01896630E44200\x00\x00\x00\x00',
+ b'\x01896630E44400\x00\x00\x00\x00',
+ b'\x01896630E45000\x00\x00\x00\x00',
+ b'\x01896630E45100\x00\x00\x00\x00',
+ b'\x01896630E45200\x00\x00\x00\x00',
+ b'\x01896630E46000\x00\x00\x00\x00',
+ b'\x01896630E46200\x00\x00\x00\x00',
+ b'\x01896630E48200\x00\x00\x00\x00',
+ b'\x01896630E74000\x00\x00\x00\x00',
+ b'\x01896630E75000\x00\x00\x00\x00',
+ b'\x01896630E76000\x00\x00\x00\x00',
+ b'\x01896630E77000\x00\x00\x00\x00',
+ b'\x01896630E83000\x00\x00\x00\x00',
+ b'\x01896630E84000\x00\x00\x00\x00',
+ b'\x01896630E85000\x00\x00\x00\x00',
+ b'\x01896630E86000\x00\x00\x00\x00',
+ b'\x01896630E88000\x00\x00\x00\x00',
+ b'\x01896630EA0000\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0230E40000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230E40100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230E51000\x00\x00\x00\x00\x00\x00\x00\x0050E17000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230E82000\x00\x00\x00\x00\x00\x00\x00\x0050E17000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230EA2000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0230EA2100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B48140\x00\x00\x00\x00\x00\x00',
+ b'8965B48150\x00\x00\x00\x00\x00\x00',
+ b'8965B48160\x00\x00\x00\x00\x00\x00',
+ b'8965B48210\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F15260E011\x00\x00\x00\x00\x00\x00',
+ b'F152648541\x00\x00\x00\x00\x00\x00',
+ b'F152648542\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881510E01100\x00\x00\x00\x00',
+ b'881510E01200\x00\x00\x00\x00',
+ b'881510E02100\x00\x00\x00\x00',
+ b'881510E02200\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F0E01200\x00\x00\x00\x00',
+ b'8646F0E01300\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_HIGHLANDER_TSS2: {
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B48241\x00\x00\x00\x00\x00\x00',
+ b'8965B48310\x00\x00\x00\x00\x00\x00',
+ b'8965B48320\x00\x00\x00\x00\x00\x00',
+ b'8965B48400\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15260E051\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260E05300\x00\x00\x00\x00',
+ b'\x01F15260E061\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260E110\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260E170\x00\x00\x00\x00\x00\x00',
+ b'\x01F15264872300\x00\x00\x00\x00',
+ b'\x01F15264872400\x00\x00\x00\x00',
+ b'\x01F15264872500\x00\x00\x00\x00',
+ b'\x01F15264872600\x00\x00\x00\x00',
+ b'\x01F15264872700\x00\x00\x00\x00',
+ b'\x01F15264873500\x00\x00\x00\x00',
+ b'\x01F152648C6300\x00\x00\x00\x00',
+ b'\x01F152648J4000\x00\x00\x00\x00',
+ b'\x01F152648J5000\x00\x00\x00\x00',
+ b'\x01F152648J6000\x00\x00\x00\x00',
+ b'\x01F152648J7000\x00\x00\x00\x00',
+ b'\x01F152648L5000\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630E62100\x00\x00\x00\x00',
+ b'\x01896630E62200\x00\x00\x00\x00',
+ b'\x01896630E64100\x00\x00\x00\x00',
+ b'\x01896630E64200\x00\x00\x00\x00',
+ b'\x01896630E64400\x00\x00\x00\x00',
+ b'\x01896630E67000\x00\x00\x00\x00',
+ b'\x01896630EA1000\x00\x00\x00\x00',
+ b'\x01896630EB1000\x00\x00\x00\x00',
+ b'\x01896630EB1100\x00\x00\x00\x00',
+ b'\x01896630EB1200\x00\x00\x00\x00',
+ b'\x01896630EB1300\x00\x00\x00\x00',
+ b'\x01896630EB2000\x00\x00\x00\x00',
+ b'\x01896630EB2100\x00\x00\x00\x00',
+ b'\x01896630EB2200\x00\x00\x00\x00',
+ b'\x01896630EC4000\x00\x00\x00\x00',
+ b'\x01896630ED9000\x00\x00\x00\x00',
+ b'\x01896630ED9100\x00\x00\x00\x00',
+ b'\x01896630EE1000\x00\x00\x00\x00',
+ b'\x01896630EE1100\x00\x00\x00\x00',
+ b'\x01896630EE4000\x00\x00\x00\x00',
+ b'\x01896630EE4100\x00\x00\x00\x00',
+ b'\x01896630EE5000\x00\x00\x00\x00',
+ b'\x01896630EE6000\x00\x00\x00\x00',
+ b'\x01896630EE7000\x00\x00\x00\x00',
+ b'\x01896630EF8000\x00\x00\x00\x00',
+ b'\x01896630EG3000\x00\x00\x00\x00',
+ b'\x01896630EG3100\x00\x00\x00\x00',
+ b'\x01896630EG5000\x00\x00\x00\x00',
+ b'\x01896630EG5100\x00\x00\x00\x00',
+ b'\x02896630E66000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896630E66100\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896630EB3000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896630EB3100\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896630EB3200\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301400\x00\x00\x00\x00',
+ b'\x018821F6201200\x00\x00\x00\x00',
+ b'\x018821F6201300\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0E02100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F4803000\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F4803000\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F4803200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_IS: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966353M7000\x00\x00\x00\x00',
+ b'\x018966353M7100\x00\x00\x00\x00',
+ b'\x018966353Q2000\x00\x00\x00\x00',
+ b'\x018966353Q2100\x00\x00\x00\x00',
+ b'\x018966353Q2300\x00\x00\x00\x00',
+ b'\x018966353Q4000\x00\x00\x00\x00',
+ b'\x018966353R1100\x00\x00\x00\x00',
+ b'\x018966353R5000\x00\x00\x00\x00',
+ b'\x018966353R7000\x00\x00\x00\x00',
+ b'\x018966353R7100\x00\x00\x00\x00',
+ b'\x018966353R8000\x00\x00\x00\x00',
+ b'\x018966353R8100\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0232480000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02353N5100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02353P7000\x00\x00\x00\x00\x00\x00\x00\x00530J5000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02353P9000\x00\x00\x00\x00\x00\x00\x00\x00553C1000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152653300\x00\x00\x00\x00\x00\x00',
+ b'F152653301\x00\x00\x00\x00\x00\x00',
+ b'F152653310\x00\x00\x00\x00\x00\x00',
+ b'F152653330\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881515306200\x00\x00\x00\x00',
+ b'881515306400\x00\x00\x00\x00',
+ b'881515306500\x00\x00\x00\x00',
+ b'881515307400\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B53270\x00\x00\x00\x00\x00\x00',
+ b'8965B53271\x00\x00\x00\x00\x00\x00',
+ b'8965B53280\x00\x00\x00\x00\x00\x00',
+ b'8965B53281\x00\x00\x00\x00\x00\x00',
+ b'8965B53310\x00\x00\x00\x00\x00\x00',
+ b'8965B53311\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F5301101\x00\x00\x00\x00',
+ b'8646F5301200\x00\x00\x00\x00',
+ b'8646F5301300\x00\x00\x00\x00',
+ b'8646F5301400\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_IS_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966353S1000\x00\x00\x00\x00',
+ b'\x018966353S2000\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02353U0000\x00\x00\x00\x00\x00\x00\x00\x0052422000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15265337200\x00\x00\x00\x00',
+ b'\x01F15265342000\x00\x00\x00\x00',
+ b'\x01F15265343000\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B53450\x00\x00\x00\x00\x00\x00',
+ b'8965B53800\x00\x00\x00\x00\x00\x00',
+ b'8965B53801\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F6201200\x00\x00\x00\x00',
+ b'\x018821F6201300\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F5303300\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F5303300\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F5303400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_PRIUS: {
+ (Ecu.engine, 0x700, None): [
+ b'\x02896634761000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634761100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634761200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634762000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634762100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634763000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634763100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634765000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634765100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634769000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634769100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634769200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634770000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634770100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634774000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634774100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634774200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634782000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x02896634784000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347A0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347A1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347A5000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347A8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347B0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x03896634759100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x03896634759200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x03896634759200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00',
+ b'\x03896634759300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x03896634759300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00',
+ b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701002\x00\x00\x00\x00',
+ b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00',
+ b'\x03896634760100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x03896634760200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x03896634760200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00',
+ b'\x03896634760300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00',
+ b'\x03896634768000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703001\x00\x00\x00\x00',
+ b'\x03896634768000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703002\x00\x00\x00\x00',
+ b'\x03896634768100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703002\x00\x00\x00\x00',
+ b'\x03896634785000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4705001\x00\x00\x00\x00',
+ b'\x03896634785000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00',
+ b'\x03896634786000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4705001\x00\x00\x00\x00',
+ b'\x03896634786000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00',
+ b'\x03896634789000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703002\x00\x00\x00\x00',
+ b'\x038966347A3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00',
+ b'\x038966347A3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4707001\x00\x00\x00\x00',
+ b'\x038966347B6000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00',
+ b'\x038966347B7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x038966347B7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B47021\x00\x00\x00\x00\x00\x00',
+ b'8965B47022\x00\x00\x00\x00\x00\x00',
+ b'8965B47023\x00\x00\x00\x00\x00\x00',
+ b'8965B47050\x00\x00\x00\x00\x00\x00',
+ b'8965B47060\x00\x00\x00\x00\x00\x00',
+ b'8965B47070\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152647290\x00\x00\x00\x00\x00\x00',
+ b'F152647300\x00\x00\x00\x00\x00\x00',
+ b'F152647310\x00\x00\x00\x00\x00\x00',
+ b'F152647414\x00\x00\x00\x00\x00\x00',
+ b'F152647415\x00\x00\x00\x00\x00\x00',
+ b'F152647416\x00\x00\x00\x00\x00\x00',
+ b'F152647417\x00\x00\x00\x00\x00\x00',
+ b'F152647470\x00\x00\x00\x00\x00\x00',
+ b'F152647490\x00\x00\x00\x00\x00\x00',
+ b'F152647682\x00\x00\x00\x00\x00\x00',
+ b'F152647683\x00\x00\x00\x00\x00\x00',
+ b'F152647684\x00\x00\x00\x00\x00\x00',
+ b'F152647862\x00\x00\x00\x00\x00\x00',
+ b'F152647863\x00\x00\x00\x00\x00\x00',
+ b'F152647864\x00\x00\x00\x00\x00\x00',
+ b'F152647865\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881514702300\x00\x00\x00\x00',
+ b'881514702400\x00\x00\x00\x00',
+ b'881514703100\x00\x00\x00\x00',
+ b'881514704100\x00\x00\x00\x00',
+ b'881514706000\x00\x00\x00\x00',
+ b'881514706100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702000\x00\x00\x00\x00',
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F4701300\x00\x00\x00\x00',
+ b'8646F4702001\x00\x00\x00\x00',
+ b'8646F4702100\x00\x00\x00\x00',
+ b'8646F4702200\x00\x00\x00\x00',
+ b'8646F4705000\x00\x00\x00\x00',
+ b'8646F4705200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_PRIUS_V: {
+ (Ecu.abs, 0x7b0, None): [
+ b'F152647280\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0234781000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881514705100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F4703300\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_RAV4: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02342Q1000\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q1100\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q1200\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q1300\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q2000\x00\x00\x00\x00\x00\x00\x00\x0054213000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q2100\x00\x00\x00\x00\x00\x00\x00\x0054213000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q2200\x00\x00\x00\x00\x00\x00\x00\x0054213000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q3000\x00\x00\x00\x00\x00\x00\x00\x0054214000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342Q4000\x00\x00\x00\x00\x00\x00\x00\x0054215000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B42063\x00\x00\x00\x00\x00\x00',
+ b'8965B42073\x00\x00\x00\x00\x00\x00',
+ b'8965B42082\x00\x00\x00\x00\x00\x00',
+ b'8965B42083\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F15260R102\x00\x00\x00\x00\x00\x00',
+ b'F15260R103\x00\x00\x00\x00\x00\x00',
+ b'F152642492\x00\x00\x00\x00\x00\x00',
+ b'F152642493\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881514201200\x00\x00\x00\x00',
+ b'881514201300\x00\x00\x00\x00',
+ b'881514201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702000\x00\x00\x00\x00',
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F4201100\x00\x00\x00\x00',
+ b'8646F4201200\x00\x00\x00\x00',
+ b'8646F4202001\x00\x00\x00\x00',
+ b'8646F4202100\x00\x00\x00\x00',
+ b'8646F4204000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_RAV4H: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02342N9000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342N9100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02342P0000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B42102\x00\x00\x00\x00\x00\x00',
+ b'8965B42103\x00\x00\x00\x00\x00\x00',
+ b'8965B42112\x00\x00\x00\x00\x00\x00',
+ b'8965B42162\x00\x00\x00\x00\x00\x00',
+ b'8965B42163\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152642090\x00\x00\x00\x00\x00\x00',
+ b'F152642110\x00\x00\x00\x00\x00\x00',
+ b'F152642120\x00\x00\x00\x00\x00\x00',
+ b'F152642400\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881514202200\x00\x00\x00\x00',
+ b'881514202300\x00\x00\x00\x00',
+ b'881514202400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702000\x00\x00\x00\x00',
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F4201100\x00\x00\x00\x00',
+ b'8646F4201200\x00\x00\x00\x00',
+ b'8646F4202001\x00\x00\x00\x00',
+ b'8646F4202100\x00\x00\x00\x00',
+ b'8646F4204000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_RAV4_PRIME: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966342S7000\x00\x00\x00\x00',
+ b'\x018966342Z1000\x00\x00\x00\x00',
+ b'\x018966342Z1100\x00\x00\x00\x00',
+ b'\x01896634AJ7000\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15264228300\x00\x00\x00\x00',
+ b'\x01F15264228500\x00\x00\x00\x00',
+ b'\x01F15264284100\x00\x00\x00\x00',
+ b'\x01F152642F3000\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x018965B4209000\x00\x00\x00\x00',
+ b'\x018965B4233100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301400\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F4205200\x00\x00\x00\x008646G4202000\x00\x00\x00\x00',
+ b'\x028646F4205300\x00\x00\x00\x008646G4202100\x00\x00\x00\x00',
+ b'\x028646F4210100\x00\x00\x00\x008646G3305000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_RAV4_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630R58000\x00\x00\x00\x00',
+ b'\x01896630R58100\x00\x00\x00\x00',
+ b'\x018966342E2000\x00\x00\x00\x00',
+ b'\x018966342M5000\x00\x00\x00\x00',
+ b'\x018966342M8000\x00\x00\x00\x00',
+ b'\x018966342S9000\x00\x00\x00\x00',
+ b'\x018966342T1000\x00\x00\x00\x00',
+ b'\x018966342T6000\x00\x00\x00\x00',
+ b'\x018966342T9000\x00\x00\x00\x00',
+ b'\x018966342U4000\x00\x00\x00\x00',
+ b'\x018966342U4100\x00\x00\x00\x00',
+ b'\x018966342U5100\x00\x00\x00\x00',
+ b'\x018966342V0000\x00\x00\x00\x00',
+ b'\x018966342V3000\x00\x00\x00\x00',
+ b'\x018966342V3100\x00\x00\x00\x00',
+ b'\x018966342V3200\x00\x00\x00\x00',
+ b'\x018966342W5000\x00\x00\x00\x00',
+ b'\x018966342W7000\x00\x00\x00\x00',
+ b'\x018966342W8000\x00\x00\x00\x00',
+ b'\x018966342W9000\x00\x00\x00\x00',
+ b'\x018966342X5000\x00\x00\x00\x00',
+ b'\x018966342X6000\x00\x00\x00\x00',
+ b'\x01896634A05000\x00\x00\x00\x00',
+ b'\x01896634A15000\x00\x00\x00\x00',
+ b'\x01896634A19000\x00\x00\x00\x00',
+ b'\x01896634A19100\x00\x00\x00\x00',
+ b'\x01896634A20000\x00\x00\x00\x00',
+ b'\x01896634A20100\x00\x00\x00\x00',
+ b'\x01896634A22000\x00\x00\x00\x00',
+ b'\x01896634A22100\x00\x00\x00\x00',
+ b'\x01896634A25000\x00\x00\x00\x00',
+ b'\x01896634A30000\x00\x00\x00\x00',
+ b'\x01896634A44000\x00\x00\x00\x00',
+ b'\x01896634A45000\x00\x00\x00\x00',
+ b'\x01896634A46000\x00\x00\x00\x00',
+ b'\x028966342M7000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00',
+ b'\x028966342T0000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00',
+ b'\x028966342V1000\x00\x00\x00\x00897CF1202001\x00\x00\x00\x00',
+ b'\x028966342W4001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x028966342Y8000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00',
+ b'\x028966342Z8000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00',
+ b'\x02896634A13000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02896634A13001\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896634A13101\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896634A13201\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896634A14001\x00\x00\x00\x00897CF0R01000\x00\x00\x00\x00',
+ b'\x02896634A14001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x02896634A14001\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896634A14101\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
+ b'\x02896634A18000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00',
+ b'\x02896634A18100\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00',
+ b'\x02896634A23000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02896634A23001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x02896634A23101\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x02896634A43000\x00\x00\x00\x00897CF4201001\x00\x00\x00\x00',
+ b'\x02896634A47000\x00\x00\x00\x00897CF4201001\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15260R210\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R220\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R290\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R292\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R300\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R302\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642551\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642561\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642601\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642700\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642701\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642710\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642711\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642750\x00\x00\x00\x00\x00\x00',
+ b'\x01F152642751\x00\x00\x00\x00\x00\x00',
+ b'F152642290\x00\x00\x00\x00\x00\x00',
+ b'F152642291\x00\x00\x00\x00\x00\x00',
+ b'F152642322\x00\x00\x00\x00\x00\x00',
+ b'F152642330\x00\x00\x00\x00\x00\x00',
+ b'F152642331\x00\x00\x00\x00\x00\x00',
+ b'F152642520\x00\x00\x00\x00\x00\x00',
+ b'F152642521\x00\x00\x00\x00\x00\x00',
+ b'F152642531\x00\x00\x00\x00\x00\x00',
+ b'F152642532\x00\x00\x00\x00\x00\x00',
+ b'F152642540\x00\x00\x00\x00\x00\x00',
+ b'F152642541\x00\x00\x00\x00\x00\x00',
+ b'F152642542\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x028965B0R01200\x00\x00\x00\x008965B0R02200\x00\x00\x00\x00',
+ b'\x028965B0R01300\x00\x00\x00\x008965B0R02300\x00\x00\x00\x00',
+ b'\x028965B0R01400\x00\x00\x00\x008965B0R02400\x00\x00\x00\x00',
+ b'8965B42170\x00\x00\x00\x00\x00\x00',
+ b'8965B42171\x00\x00\x00\x00\x00\x00',
+ b'8965B42180\x00\x00\x00\x00\x00\x00',
+ b'8965B42181\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301100\x00\x00\x00\x00',
+ b'\x018821F3301200\x00\x00\x00\x00',
+ b'\x018821F3301300\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F4203200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F4203300\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F4203400\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F4203500\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F4203700\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F4203800\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_RAV4_TSS2_2022: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15260R350\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R361\x00\x00\x00\x00\x00\x00',
+ b'\x01F15264283100\x00\x00\x00\x00',
+ b'\x01F15264283200\x00\x00\x00\x00',
+ b'\x01F15264286100\x00\x00\x00\x00',
+ b'\x01F15264286200\x00\x00\x00\x00',
+ b'\x01F152642870\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x028965B0R01500\x00\x00\x00\x008965B0R02500\x00\x00\x00\x00',
+ b'8965B42172\x00\x00\x00\x00\x00\x00',
+ b'8965B42182\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x01896634A02001\x00\x00\x00\x00',
+ b'\x01896634A02101\x00\x00\x00\x00',
+ b'\x01896634A03000\x00\x00\x00\x00',
+ b'\x01896634A08000\x00\x00\x00\x00',
+ b'\x01896634A59000\x00\x00\x00\x00',
+ b'\x01896634A61000\x00\x00\x00\x00',
+ b'\x01896634A62000\x00\x00\x00\x00',
+ b'\x01896634A62100\x00\x00\x00\x00',
+ b'\x01896634A63000\x00\x00\x00\x00',
+ b'\x01896634A88000\x00\x00\x00\x00',
+ b'\x01896634A89000\x00\x00\x00\x00',
+ b'\x01896634A89100\x00\x00\x00\x00',
+ b'\x01896634AA0000\x00\x00\x00\x00',
+ b'\x01896634AA0100\x00\x00\x00\x00',
+ b'\x01896634AA1000\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F0R01100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0R02100\x00\x00\x00\x008646G0R01100\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_RAV4_TSS2_2023: {
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15260R440\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R450\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260R50000\x00\x00\x00\x00',
+ b'\x01F15260R51000\x00\x00\x00\x00',
+ b'\x01F15264283200\x00\x00\x00\x00',
+ b'\x01F15264283300\x00\x00\x00\x00',
+ b'\x01F152642F1000\x00\x00\x00\x00',
+ b'\x01F152642F8000\x00\x00\x00\x00',
+ b'\x01F152642F8100\x00\x00\x00\x00',
+ b'\x01F152642F9000\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x028965B0R11000\x00\x00\x00\x008965B0R12000\x00\x00\x00\x00',
+ b'8965B42371\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x01896634A61000\x00\x00\x00\x00',
+ b'\x01896634A88100\x00\x00\x00\x00',
+ b'\x01896634A89100\x00\x00\x00\x00',
+ b'\x01896634AD7000\x00\x00\x00\x00',
+ b'\x01896634AE1001\x00\x00\x00\x00',
+ b'\x01896634AF0000\x00\x00\x00\x00',
+ b'\x01896634AJ2000\x00\x00\x00\x00',
+ b'\x01896634AJ3000\x00\x00\x00\x00',
+ b'\x01896634AL5000\x00\x00\x00\x00',
+ b'\x01896634AL6000\x00\x00\x00\x00',
+ b'\x01896634AL8000\x00\x00\x00\x00',
+ b'\x01896634AS8001\x00\x00\x00\x00',
+ b'\x01896634AS9000\x00\x00\x00\x00',
+ b'\x01896634AT7000\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F0R03100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0R05100\x00\x00\x00\x008646G0R02100\x00\x00\x00\x00',
+ b'\x028646F0R05200\x00\x00\x00\x008646G0R02200\x00\x00\x00\x00',
+ b'\x028646F0R05300\x00\x00\x00\x008646G0R02300\x00\x00\x00\x00',
+ b'\x028646F0R11000\x00\x00\x00\x008646G0R04000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_SIENNA: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630832100\x00\x00\x00\x00',
+ b'\x01896630832200\x00\x00\x00\x00',
+ b'\x01896630838000\x00\x00\x00\x00',
+ b'\x01896630838100\x00\x00\x00\x00',
+ b'\x01896630842000\x00\x00\x00\x00',
+ b'\x01896630843000\x00\x00\x00\x00',
+ b'\x01896630851000\x00\x00\x00\x00',
+ b'\x01896630851100\x00\x00\x00\x00',
+ b'\x01896630851200\x00\x00\x00\x00',
+ b'\x01896630852000\x00\x00\x00\x00',
+ b'\x01896630852100\x00\x00\x00\x00',
+ b'\x01896630852200\x00\x00\x00\x00',
+ b'\x01896630859000\x00\x00\x00\x00',
+ b'\x01896630860000\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B45070\x00\x00\x00\x00\x00\x00',
+ b'8965B45080\x00\x00\x00\x00\x00\x00',
+ b'8965B45082\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152608130\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881510801100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702200\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F0801100\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_SIENNA_4TH_GEN: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630841000\x00\x00\x00\x00',
+ b'\x01896630857101\x00\x00\x00\x00',
+ b'\x01896630864000\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15260815100\x00\x00\x00\x00',
+ b'\x01F15260815300\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x018965B4509100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301500\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0802200\x00\x00\x00\x008646G4202100\x00\x00\x00\x00',
+ b'\x028646F0802300\x00\x00\x00\x008646G4202100\x00\x00\x00\x00',
+ b'\x028646F0802400\x00\x00\x00\x008646G4202100\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_CTH: {
+ (Ecu.dsu, 0x791, None): [
+ b'881517601100\x00\x00\x00\x00',
+ b'881517602000\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152676144\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0237635000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0237641000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F7601100\x00\x00\x00\x00',
+ b'8646F7601200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_ES_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966306U6000\x00\x00\x00\x00',
+ b'\x018966306V5000\x00\x00\x00\x00',
+ b'\x018966306W6000\x00\x00\x00\x00',
+ b'\x018966333T5000\x00\x00\x00\x00',
+ b'\x018966333T5100\x00\x00\x00\x00',
+ b'\x018966333X6000\x00\x00\x00\x00',
+ b'\x01896633T07000\x00\x00\x00\x00',
+ b'\x01896633T38000\x00\x00\x00\x00',
+ b'\x01896633T58000\x00\x00\x00\x00',
+ b'\x01896633T63000\x00\x00\x00\x00',
+ b'\x028966333S8000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
+ b'\x028966333S8000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966333T0100\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966333V4000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x028966333W1000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00',
+ b'\x02896633T09000\x00\x00\x00\x00897CF3307001\x00\x00\x00\x00',
+ b'\x02896633T10000\x00\x00\x00\x00897CF3307001\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F152606281\x00\x00\x00\x00\x00\x00',
+ b'\x01F152606340\x00\x00\x00\x00\x00\x00',
+ b'\x01F152606461\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260646200\x00\x00\x00\x00',
+ b'\x01F152633A71\x00\x00\x00\x00\x00\x00',
+ b'F152633423\x00\x00\x00\x00\x00\x00',
+ b'F152633680\x00\x00\x00\x00\x00\x00',
+ b'F152633681\x00\x00\x00\x00\x00\x00',
+ b'F152633F50\x00\x00\x00\x00\x00\x00',
+ b'F152633F51\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B33252\x00\x00\x00\x00\x00\x00',
+ b'8965B33590\x00\x00\x00\x00\x00\x00',
+ b'8965B33690\x00\x00\x00\x00\x00\x00',
+ b'8965B33702\x00\x00\x00\x00\x00\x00',
+ b'8965B33721\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301100\x00\x00\x00\x00',
+ b'\x018821F3301200\x00\x00\x00\x00',
+ b'\x018821F3301300\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ b'\x018821F6201200\x00\x00\x00\x00',
+ b'\x018821F6201300\x00\x00\x00\x00',
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0610000\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F0610100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F33030D0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F3303100\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F3303200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F3304100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F3304200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F3304300\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ b'\x028646F3309100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F3309100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ b'\x028646F3309400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_ES: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02333M4100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02333M4200\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02333R0000\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152606201\x00\x00\x00\x00\x00\x00',
+ b'F152606202\x00\x00\x00\x00\x00\x00',
+ b'F152633171\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881513309400\x00\x00\x00\x00',
+ b'881513309500\x00\x00\x00\x00',
+ b'881513310400\x00\x00\x00\x00',
+ b'881513310500\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B33502\x00\x00\x00\x00\x00\x00',
+ b'8965B33512\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4701100\x00\x00\x00\x00',
+ b'8821F4701200\x00\x00\x00\x00',
+ b'8821F4701300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F3302001\x00\x00\x00\x00',
+ b'8646F3302100\x00\x00\x00\x00',
+ b'8646F3302200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_GS_F: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0233075200\x00\x00\x00\x00\x00\x00\x00\x00530B9000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02330Y8000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152630700\x00\x00\x00\x00\x00\x00',
+ b'F152630400\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881513016200\x00\x00\x00\x00',
+ b'881513011300\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B30551\x00\x00\x00\x00\x00\x00',
+ b'8965B30431\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702000\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F3002100\x00\x00\x00\x00',
+ b'8646F3001200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_NX: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896637850000\x00\x00\x00\x00',
+ b'\x01896637851000\x00\x00\x00\x00',
+ b'\x01896637852000\x00\x00\x00\x00',
+ b'\x01896637854000\x00\x00\x00\x00',
+ b'\x01896637873000\x00\x00\x00\x00',
+ b'\x01896637878000\x00\x00\x00\x00',
+ b'\x01896637878100\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0237841000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0237842000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0237880000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0237882000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0237886000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152678130\x00\x00\x00\x00\x00\x00',
+ b'F152678140\x00\x00\x00\x00\x00\x00',
+ b'F152678160\x00\x00\x00\x00\x00\x00',
+ b'F152678170\x00\x00\x00\x00\x00\x00',
+ b'F152678171\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881517803100\x00\x00\x00\x00',
+ b'881517803300\x00\x00\x00\x00',
+ b'881517804100\x00\x00\x00\x00',
+ b'881517804300\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B78060\x00\x00\x00\x00\x00\x00',
+ b'8965B78080\x00\x00\x00\x00\x00\x00',
+ b'8965B78100\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702100\x00\x00\x00\x00',
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F7801100\x00\x00\x00\x00',
+ b'8646F7801300\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_NX_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966378B2000\x00\x00\x00\x00',
+ b'\x018966378B2100\x00\x00\x00\x00',
+ b'\x018966378B3000\x00\x00\x00\x00',
+ b'\x018966378B3100\x00\x00\x00\x00',
+ b'\x018966378B4100\x00\x00\x00\x00',
+ b'\x018966378G2000\x00\x00\x00\x00',
+ b'\x018966378G3000\x00\x00\x00\x00',
+ b'\x018966378G4000\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0237881000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0237887000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02378A0000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02378F4000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F152678221\x00\x00\x00\x00\x00\x00',
+ b'F152678200\x00\x00\x00\x00\x00\x00',
+ b'F152678210\x00\x00\x00\x00\x00\x00',
+ b'F152678211\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B78110\x00\x00\x00\x00\x00\x00',
+ b'8965B78120\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301200\x00\x00\x00\x00',
+ b'\x018821F3301300\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F78030A0\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F7803100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_LC_TSS2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0131126000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0131130000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152611390\x00\x00\x00\x00\x00\x00',
+ b'F152611430\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B11091\x00\x00\x00\x00\x00\x00',
+ b'8965B11120\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F1104200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F1105200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_RC: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896632461100\x00\x00\x00\x00',
+ b'\x01896632478100\x00\x00\x00\x00',
+ b'\x01896632478200\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0232480000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0232484000\x00\x00\x00\x00\x00\x00\x00\x0052422000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152624150\x00\x00\x00\x00\x00\x00',
+ b'F152624171\x00\x00\x00\x00\x00\x00',
+ b'F152624221\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881512404100\x00\x00\x00\x00',
+ b'881512405100\x00\x00\x00\x00',
+ b'881512407000\x00\x00\x00\x00',
+ b'881512409100\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B24081\x00\x00\x00\x00\x00\x00',
+ b'8965B24240\x00\x00\x00\x00\x00\x00',
+ b'8965B24260\x00\x00\x00\x00\x00\x00',
+ b'8965B24320\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F2401100\x00\x00\x00\x00',
+ b'8646F2401200\x00\x00\x00\x00',
+ b'8646F2402200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_RC_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x018966324C8000\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15262426000\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B24481\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F6201400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F2403100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_RX: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630E36100\x00\x00\x00\x00',
+ b'\x01896630E36200\x00\x00\x00\x00',
+ b'\x01896630E36300\x00\x00\x00\x00',
+ b'\x01896630E36600\x00\x00\x00\x00',
+ b'\x01896630E37100\x00\x00\x00\x00',
+ b'\x01896630E37200\x00\x00\x00\x00',
+ b'\x01896630E37300\x00\x00\x00\x00',
+ b'\x01896630E41000\x00\x00\x00\x00',
+ b'\x01896630E41100\x00\x00\x00\x00',
+ b'\x01896630E41200\x00\x00\x00\x00',
+ b'\x01896630E41500\x00\x00\x00\x00',
+ b'\x01896630EA3100\x00\x00\x00\x00',
+ b'\x01896630EA3300\x00\x00\x00\x00',
+ b'\x01896630EA3400\x00\x00\x00\x00',
+ b'\x01896630EA4100\x00\x00\x00\x00',
+ b'\x01896630EA4200\x00\x00\x00\x00',
+ b'\x01896630EA4300\x00\x00\x00\x00',
+ b'\x01896630EA4400\x00\x00\x00\x00',
+ b'\x01896630EA6300\x00\x00\x00\x00',
+ b'\x018966348R1300\x00\x00\x00\x00',
+ b'\x018966348R8500\x00\x00\x00\x00',
+ b'\x018966348R9300\x00\x00\x00\x00',
+ b'\x018966348W1300\x00\x00\x00\x00',
+ b'\x018966348W2300\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02348J7000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348N0000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348Q4000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348Q4100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348T1000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348T1100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348T1200\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348T3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348V6000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348Z3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152648361\x00\x00\x00\x00\x00\x00',
+ b'F152648472\x00\x00\x00\x00\x00\x00',
+ b'F152648473\x00\x00\x00\x00\x00\x00',
+ b'F152648474\x00\x00\x00\x00\x00\x00',
+ b'F152648492\x00\x00\x00\x00\x00\x00',
+ b'F152648493\x00\x00\x00\x00\x00\x00',
+ b'F152648494\x00\x00\x00\x00\x00\x00',
+ b'F152648501\x00\x00\x00\x00\x00\x00',
+ b'F152648502\x00\x00\x00\x00\x00\x00',
+ b'F152648504\x00\x00\x00\x00\x00\x00',
+ b'F152648630\x00\x00\x00\x00\x00\x00',
+ b'F152648740\x00\x00\x00\x00\x00\x00',
+ b'F152648A30\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881514810300\x00\x00\x00\x00',
+ b'881514810500\x00\x00\x00\x00',
+ b'881514810700\x00\x00\x00\x00',
+ b'881514811300\x00\x00\x00\x00',
+ b'881514811500\x00\x00\x00\x00',
+ b'881514811700\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B0E011\x00\x00\x00\x00\x00\x00',
+ b'8965B0E012\x00\x00\x00\x00\x00\x00',
+ b'8965B48102\x00\x00\x00\x00\x00\x00',
+ b'8965B48111\x00\x00\x00\x00\x00\x00',
+ b'8965B48112\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4701000\x00\x00\x00\x00',
+ b'8821F4701100\x00\x00\x00\x00',
+ b'8821F4701200\x00\x00\x00\x00',
+ b'8821F4701300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F4801100\x00\x00\x00\x00',
+ b'8646F4801200\x00\x00\x00\x00',
+ b'8646F4802001\x00\x00\x00\x00',
+ b'8646F4802100\x00\x00\x00\x00',
+ b'8646F4802200\x00\x00\x00\x00',
+ b'8646F4809000\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_RX_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x01896630EA9000\x00\x00\x00\x00',
+ b'\x01896630EB0000\x00\x00\x00\x00',
+ b'\x01896630EC9000\x00\x00\x00\x00',
+ b'\x01896630EC9100\x00\x00\x00\x00',
+ b'\x01896630ED0000\x00\x00\x00\x00',
+ b'\x01896630ED0100\x00\x00\x00\x00',
+ b'\x01896630ED5000\x00\x00\x00\x00',
+ b'\x01896630ED6000\x00\x00\x00\x00',
+ b'\x018966348R9200\x00\x00\x00\x00',
+ b'\x018966348T8000\x00\x00\x00\x00',
+ b'\x018966348W5100\x00\x00\x00\x00',
+ b'\x018966348W9000\x00\x00\x00\x00',
+ b'\x018966348X0000\x00\x00\x00\x00',
+ b'\x01896634D11000\x00\x00\x00\x00',
+ b'\x01896634D12000\x00\x00\x00\x00',
+ b'\x01896634D12100\x00\x00\x00\x00',
+ b'\x01896634D43000\x00\x00\x00\x00',
+ b'\x01896634D44000\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'\x02348U2000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348X4000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348X5000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348X6000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348X8000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x02348Y3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0234D14000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0234D15000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0234D16000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15260E031\x00\x00\x00\x00\x00\x00',
+ b'\x01F15260E041\x00\x00\x00\x00\x00\x00',
+ b'\x01F152648781\x00\x00\x00\x00\x00\x00',
+ b'\x01F152648801\x00\x00\x00\x00\x00\x00',
+ b'F152648493\x00\x00\x00\x00\x00\x00',
+ b'F152648811\x00\x00\x00\x00\x00\x00',
+ b'F152648831\x00\x00\x00\x00\x00\x00',
+ b'F152648891\x00\x00\x00\x00\x00\x00',
+ b'F152648C80\x00\x00\x00\x00\x00\x00',
+ b'F152648D00\x00\x00\x00\x00\x00\x00',
+ b'F152648D60\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B48261\x00\x00\x00\x00\x00\x00',
+ b'8965B48271\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301100\x00\x00\x00\x00',
+ b'\x018821F3301300\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F4810100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00',
+ b'\x028646F4810200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F4810300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F4810400\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_PRIUS_TSS2: {
+ (Ecu.engine, 0x700, None): [
+ b'\x028966347B1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347C4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347C6000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347C7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x028966347C8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
+ b'\x038966347C0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710101\x00\x00\x00\x00',
+ b'\x038966347C0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710102\x00\x00\x00\x00',
+ b'\x038966347C1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710101\x00\x00\x00\x00',
+ b'\x038966347C5000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4707101\x00\x00\x00\x00',
+ b'\x038966347C5100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4707101\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152647500\x00\x00\x00\x00\x00\x00',
+ b'F152647510\x00\x00\x00\x00\x00\x00',
+ b'F152647520\x00\x00\x00\x00\x00\x00',
+ b'F152647521\x00\x00\x00\x00\x00\x00',
+ b'F152647531\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B47070\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301300\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F4707000\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646F4710000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ b'\x028646F4712000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_MIRAI: {
+ (Ecu.abs, 0x7d1, None): [
+ b'\x01898A36203000\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F15266203200\x00\x00\x00\x00',
+ b'\x01F15266203500\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x028965B6204100\x00\x00\x00\x008965B6203100\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F6201200\x00\x00\x00\x00',
+ b'\x018821F6201300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F6201400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00',
+ b'\x028646F6201400\x00\x00\x00\x008646G5301200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_ALPHARD_TSS2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\x0235852100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0235870000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0235879000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'\x0235883000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B58040\x00\x00\x00\x00\x00\x00',
+ b'8965B58052\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'F152658160\x00\x00\x00\x00\x00\x00',
+ b'F152658320\x00\x00\x00\x00\x00\x00',
+ b'F152658341\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F3301000\x00\x00\x00\x00',
+ b'\x018821F3301200\x00\x00\x00\x00',
+ b'\x018821F3301400\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F58010B0\x00\x00\x00\x008646G2601003\x00\x00\x00\x00',
+ b'\x028646F58010C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00',
+ b'\x028646F5803200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ b'\x028646FV201000\x00\x00\x00\x008646G2601400\x00\x00\x00\x00',
+ ],
+ },
+ CAR.TOYOTA_YARIS: {
+ (Ecu.engine, 0x700, None): [
+ b'\x0189663K015300\x00\x00\x00\x00',
+ b'\x0189663K023000\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'\x018965BK002100\x00\x00\x00\x00',
+ b'\x018965BK003200\x00\x00\x00\x00',
+ ],
+ (Ecu.abs, 0x7b0, None): [
+ b'\x01F1526K005600\x00\x00\x00\x00',
+ b'\x01F1526K007500\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'\x018821F0D04100\x00\x00\x00\x00',
+ b'\x018821F0D05300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'\x028646F0W04100\x00\x00\x00\x008646G0W04100\x00\x00\x00\x00',
+ b'\x028646F5205200\x00\x00\x00\x008646G5202200\x00\x00\x00\x00',
+ ],
+ },
+ CAR.LEXUS_LS: {
+ (Ecu.abs, 0x7b0, None): [
+ b'F152650290\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.dsu, 0x791, None): [
+ b'881515003400\x00\x00\x00\x00',
+ ],
+ (Ecu.eps, 0x7a1, None): [
+ b'8965B50022\x00\x00\x00\x00\x00\x00',
+ ],
+ (Ecu.engine, 0x700, None): [
+ b'\x028966350K7200\x00\x00\x00\x00896655066200\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x750, 0xf): [
+ b'8821F4702300\x00\x00\x00\x00',
+ ],
+ (Ecu.fwdCamera, 0x750, 0x6d): [
+ b'8646F5001200\x00\x00\x00\x00',
+ ],
+ },
+}
+
+FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT)
diff --git a/iqdbc_repo/iqdbc/car/toyota/interface.py b/iqdbc_repo/iqdbc/car/toyota/interface.py
new file mode 100644
index 000000000..865de2f70
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/interface.py
@@ -0,0 +1,210 @@
+from iqdbc.car import Bus, structs, get_safety_config, uds
+from iqdbc.car.toyota.carstate import CarState
+from iqdbc.car.toyota.carcontroller import CarController
+from iqdbc.car.toyota.radar_interface import RadarInterface
+from iqdbc.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControllerParams, TSS2_CAR, RADAR_ACC_CAR, NO_DSU_CAR, \
+ MIN_ACC_SPEED, EPS_SCALE, NO_STOP_TIMER_CAR, ANGLE_CONTROL_CAR, \
+ ToyotaSafetyFlags, UNSUPPORTED_DSU_CAR
+from iqdbc.car.disable_ecu import disable_ecu
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ, ToyotaSafetyFlagsIQ
+
+SteerControlType = structs.CarParams.SteerControlType
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.sport,)
+
+ @staticmethod
+ def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed):
+ return CarControllerParams(CP).ACCEL_MIN, CarControllerParams(CP).ACCEL_MAX
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "toyota"
+ ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.toyota)]
+ ret.safetyConfigs[0].safetyParam = EPS_SCALE[candidate]
+
+ # 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
+
+ if ret.flags & ToyotaFlags.SECOC.value:
+ ret.secOcRequired = True
+ ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.SECOC.value
+
+ if candidate in ANGLE_CONTROL_CAR:
+ ret.steerControlType = SteerControlType.angle
+ ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.LTA.value
+
+ # LTA control can be more delayed and winds up more often
+ ret.steerActuatorDelay = 0.18
+ ret.steerLimitTimer = 0.8
+ else:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ ret.steerActuatorDelay = 0.12 # Default delay, Prius has larger delay
+ ret.steerLimitTimer = 0.4
+
+ stop_and_go = candidate in TSS2_CAR
+
+ # In TSS2 cars, the camera does long control
+ found_ecus = [fw.ecu for fw in car_fw]
+
+ if Ecu.hybrid in found_ecus:
+ ret.flags |= ToyotaFlags.HYBRID.value
+
+ if candidate == CAR.TOYOTA_PRIUS:
+ stop_and_go = True
+ # Only give steer angle deadzone to for bad angle sensor prius
+ for fw in car_fw:
+ if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00':
+ ret.steerActuatorDelay = 0.25
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, steering_angle_deadzone_deg=0.2)
+
+ elif candidate in (CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2):
+ stop_and_go = True
+ ret.wheelSpeedFactor = 1.035
+
+ elif candidate in (CAR.TOYOTA_AVALON, CAR.TOYOTA_AVALON_2019, CAR.TOYOTA_AVALON_TSS2):
+ # starting from 2019, all Avalon variants have stop and go
+ # https://engage.toyota.com/static/images/toyota_safety_sense/TSS_Applicability_Chart.pdf
+ stop_and_go = candidate != CAR.TOYOTA_AVALON
+
+ elif candidate in (CAR.TOYOTA_CHR, CAR.TOYOTA_CAMRY, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_LS, CAR.LEXUS_NX):
+ # TODO: Some of these platforms are not advertised to have full range ACC, do they really all have sng?
+ stop_and_go = True
+
+ ret.centerToFront = ret.wheelbase * 0.44
+
+ # TODO: Some TSS-P platforms have BSM, but are flipped based on region or driving direction.
+ # Detect flipped signals and enable for C-HR and others
+ ret.enableBsm = 0x3F6 in fingerprint[0] and candidate in TSS2_CAR
+
+ # No radar dbc for cars without DSU which are not TSS 2.0
+ # TODO: make an adas dbc file for dsu-less models
+ ret.radarUnavailable = Bus.radar not in DBC[candidate] or candidate in (NO_DSU_CAR - TSS2_CAR)
+
+ # since we don't yet parse radar on TSS2/TSS-P radar-based ACC cars, gate longitudinal behind experimental toggle
+ if candidate in (RADAR_ACC_CAR | NO_DSU_CAR):
+ ret.alphaLongitudinalAvailable = candidate in RADAR_ACC_CAR
+
+ # Disabling radar is only supported on TSS2 radar-ACC cars
+ if alpha_long and candidate in RADAR_ACC_CAR:
+ ret.flags |= ToyotaFlags.DISABLE_RADAR.value
+
+ # openpilot longitudinal enabled by default:
+ # - cars w/ DSU disconnected
+ # - TSS2 cars with camera sending ACC_CONTROL where we can block it
+ # openpilot longitudinal behind experimental long toggle:
+ # - TSS2 radar ACC cars (disables radar)
+
+ ret.openpilotLongitudinalControl = (candidate in (TSS2_CAR - RADAR_ACC_CAR) or
+ bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value))
+
+ ret.autoResumeSng = ret.openpilotLongitudinalControl and candidate in NO_STOP_TIMER_CAR
+
+ if not ret.openpilotLongitudinalControl:
+ ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.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.
+ ret.minEnableSpeed = -1. if stop_and_go else MIN_ACC_SPEED
+
+ if candidate in TSS2_CAR:
+ ret.flags |= ToyotaFlags.RAISED_ACCEL_LIMIT.value
+
+ # Hybrids have much quicker longitudinal actuator response
+ if ret.flags & ToyotaFlags.HYBRID.value:
+ ret.longitudinalActuatorDelay = 0.05
+
+ return ret
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]],
+ car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ if candidate in UNSUPPORTED_DSU_CAR:
+ ret.iqSafetyFlags |= ToyotaSafetyFlagsIQ.UNSUPPORTED_DSU
+
+ # Detect smartDSU, which intercepts ACC_CMD from the DSU (or radar) allowing openpilot to send it
+ # 0x2AA is sent by a similar device which intercepts the radar instead of DSU on NO_DSU_CARs
+ if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR):
+ ret.flags |= ToyotaFlagsIQ.SMART_DSU.value
+
+ if 0x2AA in fingerprint[0] and candidate in NO_DSU_CAR:
+ ret.flags |= ToyotaFlagsIQ.RADAR_CAN_FILTER.value
+
+ # Detect ZSS, which allows iqpilot to utilize an improved angle sensor for some Toyota vehicles
+ # https://github.com/zorrobyte/betterToyotaAngleSensorForOP
+ if 0x23 in fingerprint[0] and not stock_cp.flags & ToyotaFlags.SECOC:
+ ret.flags |= ToyotaFlagsIQ.ZSS.value
+
+ if candidate == CAR.TOYOTA_PRIUS:
+ if ret.flags & ToyotaFlagsIQ.ZSS:
+ stock_cp.steerRatio = 15.0
+ stock_cp.mass = 3370.
+
+ # reuse logic from _get_params
+ # Only give steer angle deadzone to for bad angle sensor prius
+ for fw in car_fw:
+ if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00':
+ stock_cp.steerActuatorDelay = 0.25
+ CarInterfaceBase.configure_torque_tune(candidate, stock_cp.lateralTuning, steering_angle_deadzone_deg=0.0)
+
+ use_sdsu = bool(ret.flags & ToyotaFlagsIQ.SMART_DSU)
+
+ stock_cp.minEnableSpeed = -1. if use_sdsu else stock_cp.minEnableSpeed
+
+ stock_cp.alphaLongitudinalAvailable = use_sdsu or candidate in RADAR_ACC_CAR
+
+ if use_sdsu:
+ use_sdsu = use_sdsu and alpha_long
+ stock_cp.flags &= ~ToyotaFlags.DISABLE_RADAR.value
+ elif candidate in (RADAR_ACC_CAR | NO_DSU_CAR):
+ if alpha_long and candidate in RADAR_ACC_CAR:
+ stock_cp.flags |= ToyotaFlags.DISABLE_RADAR.value
+
+ # openpilot longitudinal enabled by default:
+ # - TSS2 cars with camera sending ACC_CONTROL where we can block it
+ # openpilot longitudinal behind experimental long toggle:
+ # - cars w/ smartDSU or CAN filter installed
+ # - TSS2 radar ACC cars w/o smartDSU installed (disables radar)
+ stock_cp.openpilotLongitudinalControl = use_sdsu or \
+ candidate in (TSS2_CAR - RADAR_ACC_CAR) or \
+ bool(stock_cp.flags & ToyotaFlags.DISABLE_RADAR)
+
+ ret.enableGasInterceptor = 0x201 in fingerprint[0] and stock_cp.openpilotLongitudinalControl and \
+ not stock_cp.flags & ToyotaFlags.SECOC
+
+ if ret.enableGasInterceptor:
+ ret.iqSafetyFlags |= ToyotaSafetyFlagsIQ.GAS_INTERCEPTOR
+ stock_cp.minEnableSpeed = -1.
+
+ if ret.flags & ToyotaFlagsIQ.STOCK_LONGITUDINAL:
+ stock_cp.alphaLongitudinalAvailable = False
+ stock_cp.openpilotLongitudinalControl = False
+
+ if not stock_cp.openpilotLongitudinalControl:
+ stock_cp.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.STOCK_LONGITUDINAL.value
+ else:
+ stock_cp.safetyConfigs[0].safetyParam &= ~ToyotaSafetyFlags.STOCK_LONGITUDINAL.value
+
+ return ret
+
+ @staticmethod
+ def init(CP, CP_IQ, can_recv, can_send, communication_control=None):
+ # disable radar if alpha longitudinal toggled on radar-ACC car without CAN filter/smartDSU
+ if CP.flags & ToyotaFlags.DISABLE_RADAR.value:
+ if communication_control is None:
+ communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_DISABLE_TX, uds.MESSAGE_TYPE.NORMAL])
+ disable_ecu(can_recv, can_send, bus=0, addr=0x750, sub_addr=0xf, com_cont_req=communication_control)
+
+ @staticmethod
+ def deinit(CP, can_recv, can_send):
+ # re-enable radar if alpha longitudinal toggled on radar-ACC car
+ communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_ENABLE_TX, uds.MESSAGE_TYPE.NORMAL])
+ CarInterface.init(CP, can_recv, can_send, communication_control)
diff --git a/iqdbc_repo/iqdbc/car/toyota/radar_interface.py b/iqdbc_repo/iqdbc/car/toyota/radar_interface.py
new file mode 100755
index 000000000..1b63c40e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/radar_interface.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+from iqdbc.can import CANParser
+from iqdbc.car import Bus
+from iqdbc.car.structs import RadarData
+from iqdbc.car.toyota.values import DBC, TSS2_CAR
+from iqdbc.car.interfaces import RadarInterfaceBase
+
+
+def _create_radar_can_parser(car_fingerprint):
+ if car_fingerprint in TSS2_CAR:
+ RADAR_A_MSGS = list(range(0x180, 0x190))
+ RADAR_B_MSGS = list(range(0x190, 0x1a0))
+ else:
+ RADAR_A_MSGS = list(range(0x210, 0x220))
+ RADAR_B_MSGS = list(range(0x220, 0x230))
+
+ msg_a_n = len(RADAR_A_MSGS)
+ msg_b_n = len(RADAR_B_MSGS)
+ messages = list(zip(RADAR_A_MSGS + RADAR_B_MSGS, [20] * (msg_a_n + msg_b_n), strict=True))
+
+ return CANParser(DBC[car_fingerprint][Bus.radar], messages, 1)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+ self.track_id = 0
+
+ if CP.carFingerprint in TSS2_CAR:
+ self.RADAR_A_MSGS = list(range(0x180, 0x190))
+ self.RADAR_B_MSGS = list(range(0x190, 0x1a0))
+ else:
+ self.RADAR_A_MSGS = list(range(0x210, 0x220))
+ self.RADAR_B_MSGS = list(range(0x220, 0x230))
+
+ self.valid_cnt = {key: 0 for key in self.RADAR_A_MSGS}
+
+ self.rcp = None if CP.radarUnavailable else _create_radar_can_parser(CP.carFingerprint)
+ self.trigger_msg = self.RADAR_B_MSGS[-1]
+ self.updated_messages = set()
+
+ def update(self, can_strings):
+ if self.rcp is None:
+ return super().update(None)
+
+ vls = self.rcp.update(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 = RadarData()
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+
+ for ii in sorted(updated_messages):
+ if ii in self.RADAR_A_MSGS:
+ cpt = self.rcp.vl[ii]
+
+ if cpt['LONG_DIST'] >= 255 or cpt['NEW_TRACK']:
+ self.valid_cnt[ii] = 0 # reset counter
+ if cpt['VALID'] and cpt['LONG_DIST'] < 255:
+ self.valid_cnt[ii] += 1
+ else:
+ self.valid_cnt[ii] = max(self.valid_cnt[ii] - 1, 0)
+
+ score = self.rcp.vl[ii+16]['SCORE']
+ # print ii, self.valid_cnt[ii], score, cpt['VALID'], cpt['LONG_DIST'], cpt['LAT_DIST']
+
+ # radar point only valid if it's a valid measurement and score is above 50
+ if cpt['VALID'] or (score > 50 and cpt['LONG_DIST'] < 255 and self.valid_cnt[ii] > 0):
+ if ii not in self.pts or cpt['NEW_TRACK']:
+ self.pts[ii] = RadarData.RadarPoint()
+ self.pts[ii].trackId = self.track_id
+ self.track_id += 1
+ self.pts[ii].dRel = cpt['LONG_DIST'] # from front of car
+ self.pts[ii].yRel = -cpt['LAT_DIST'] # in car frame's y axis, left is positive
+ self.pts[ii].vRel = cpt['REL_SPEED']
+ self.pts[ii].aRel = float('nan')
+ self.pts[ii].yvRel = float('nan')
+ self.pts[ii].measured = bool(cpt['VALID'])
+ else:
+ if ii in self.pts:
+ del self.pts[ii]
+
+ ret.points = list(self.pts.values())
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/toyota/tests/__init__.py b/iqdbc_repo/iqdbc/car/toyota/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/toyota/tests/print_platform_codes.py b/iqdbc_repo/iqdbc/car/toyota/tests/print_platform_codes.py
new file mode 100755
index 000000000..3e86ca026
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/tests/print_platform_codes.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+from collections import defaultdict
+from iqdbc.car.toyota.values import PLATFORM_CODE_ECUS, get_platform_codes
+from iqdbc.car.toyota.fingerprints import FW_VERSIONS
+
+if __name__ == "__main__":
+ parts_for_ecu: dict = defaultdict(set)
+ cars_for_code: dict = defaultdict(lambda: defaultdict(set))
+ for car_model, ecus in FW_VERSIONS.items():
+ print()
+ print(car_model)
+ for ecu in sorted(ecus):
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ platform_codes = get_platform_codes(ecus[ecu])
+ parts_for_ecu[ecu] |= {code.split(b'-')[0] for code in platform_codes if code.count(b'-') > 1}
+ for code in platform_codes:
+ cars_for_code[ecu][b'-'.join(code.split(b'-')[:2])] |= {car_model}
+ print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):')
+ print(f' Codes: {platform_codes}')
+
+ print('\nECU parts:')
+ for ecu, parts in parts_for_ecu.items():
+ print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}): {parts}')
+
+ print('\nCar models vs. platform codes (no major versions):')
+ for ecu, codes in cars_for_code.items():
+ print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):')
+ for code, cars in codes.items():
+ print(f' {code!r}: {sorted(cars)}')
diff --git a/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota.py b/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota.py
new file mode 100644
index 000000000..571ed7897
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota.py
@@ -0,0 +1,167 @@
+from hypothesis import given, settings, strategies as st
+
+from iqdbc.car import Bus
+from iqdbc.car.structs import CarParams
+from iqdbc.car.fw_versions import build_fw_dict
+from iqdbc.car.toyota.fingerprints import FW_VERSIONS
+from iqdbc.car.toyota.values import CAR, DBC, TSS2_CAR, ANGLE_CONTROL_CAR, RADAR_ACC_CAR, SECOC_CAR, \
+ FW_QUERY_CONFIG, PLATFORM_CODE_ECUS, FUZZY_EXCLUDED_PLATFORMS, \
+ get_platform_codes
+
+Ecu = CarParams.Ecu
+
+
+def check_fw_version(fw_version: bytes) -> bool:
+ # TODO: just use the FW patterns, need to support all chunks
+ return b'?' not in fw_version and b'!' not in fw_version
+
+
+class TestToyotaInterfaces:
+ def test_car_sets(self):
+ assert len(ANGLE_CONTROL_CAR - TSS2_CAR) == 0
+ assert len(RADAR_ACC_CAR - TSS2_CAR) == 0
+
+ def test_lta_platforms(self):
+ # At this time, only RAV4 2023 is expected to use LTA/angle control
+ assert ANGLE_CONTROL_CAR == {CAR.TOYOTA_RAV4_TSS2_2023}
+
+ def test_tss2_dbc(self):
+ # We make some assumptions about TSS2 platforms,
+ # like looking up certain signals only in this DBC
+ for car_model, dbc in DBC.items():
+ if car_model in TSS2_CAR and car_model not in SECOC_CAR:
+ assert dbc[Bus.pt] == "toyota_nodsu_pt_generated"
+
+ def test_essential_ecus(self, subtests):
+ # Asserts standard ECUs exist for each platform
+ common_ecus = {Ecu.fwdRadar, Ecu.fwdCamera}
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ present_ecus = {ecu[0] for ecu in ecus}
+ missing_ecus = common_ecus - present_ecus
+ assert len(missing_ecus) == 0
+
+ # Some exceptions for other common ECUs
+ if car_model not in (CAR.TOYOTA_ALPHARD_TSS2,):
+ assert Ecu.abs in present_ecus
+
+ if car_model not in (CAR.TOYOTA_MIRAI,):
+ assert Ecu.engine in present_ecus
+
+ if car_model not in (CAR.TOYOTA_PRIUS_V, CAR.LEXUS_CTH):
+ assert Ecu.eps in present_ecus
+
+
+class TestToyotaFingerprint:
+ def test_non_essential_ecus(self, subtests):
+ # Ensures only the cars that have multiple engine ECUs are in the engine non-essential ECU list
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ engine_ecus = {ecu for ecu in ecus if ecu[0] == Ecu.engine}
+ assert (len(engine_ecus) > 1) == (car_model in FW_QUERY_CONFIG.non_essential_ecus[Ecu.engine]), \
+ f"Car model unexpectedly {'not ' if len(engine_ecus) > 1 else ''}in non-essential list"
+
+ def test_valid_fw_versions(self, subtests):
+ # Asserts all FW versions are valid
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for fws in ecus.values():
+ for fw in fws:
+ assert check_fw_version(fw), fw
+
+ # Tests for part numbers, platform codes, and sub-versions which Toyota will use to fuzzy
+ # fingerprint in the absence of full FW matches:
+ @settings(max_examples=100)
+ @given(data=st.data())
+ def test_platform_codes_fuzzy_fw(self, data):
+ fw_strategy = st.lists(st.binary())
+ fws = data.draw(fw_strategy)
+ get_platform_codes(fws)
+
+ def test_platform_code_ecus_available(self, subtests):
+ # Asserts ECU keys essential for fuzzy fingerprinting are available on all platforms
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for platform_code_ecu in PLATFORM_CODE_ECUS:
+ if platform_code_ecu == Ecu.eps and car_model in (CAR.TOYOTA_PRIUS_V, CAR.LEXUS_CTH,):
+ continue
+ if platform_code_ecu == Ecu.abs and car_model in (CAR.TOYOTA_ALPHARD_TSS2,):
+ continue
+ assert platform_code_ecu in [e[0] for e in ecus]
+
+ def test_fw_format(self, subtests):
+ # Asserts:
+ # - every supported ECU FW version returns one platform code
+ # - every supported ECU FW version has a part number
+ # - expected parsing of ECU sub-versions
+
+ for car_model, ecus in FW_VERSIONS.items():
+ with subtests.test(car_model=car_model.value):
+ for ecu, fws in ecus.items():
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ codes = dict()
+ for fw in fws:
+ result = get_platform_codes([fw])
+ # Check only one platform code and sub-version
+ assert 1 == len(result), f"Unable to parse FW: {fw}"
+ assert 1 == len(list(result.values())[0]), f"Unable to parse FW: {fw}"
+ codes |= result
+
+ # Toyota places the ECU part number in their FW versions, assert all parsable
+ # Note that there is only one unique part number per ECU across the fleet, so this
+ # is not important for identification, just a sanity check.
+ assert all(code.count(b"-") > 1 for code in codes), f"FW does not have part number: {fw} {codes}"
+
+ def test_platform_codes_spot_check(self):
+ # Asserts basic platform code parsing behavior for a few cases
+ results = get_platform_codes([
+ b"F152607140\x00\x00\x00\x00\x00\x00",
+ b"F152607171\x00\x00\x00\x00\x00\x00",
+ b"F152607110\x00\x00\x00\x00\x00\x00",
+ b"F152607180\x00\x00\x00\x00\x00\x00",
+ ])
+ assert results == {b"F1526-07-1": {b"10", b"40", b"71", b"80"}}
+
+ results = get_platform_codes([
+ b"\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00",
+ b"\x028646F4104100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00",
+ ])
+ assert results == {b"8646F-41-04": {b"100"}}
+
+ # Short version has no part number
+ results = get_platform_codes([
+ b"\x0235870000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00",
+ b"\x0235883000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00",
+ ])
+ assert results == {b"58-70": {b"000"}, b"58-83": {b"000"}}
+
+ results = get_platform_codes([
+ b"F152607110\x00\x00\x00\x00\x00\x00",
+ b"F152607140\x00\x00\x00\x00\x00\x00",
+ b"\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00",
+ b"\x0235879000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00",
+ ])
+ assert results == {b"F1526-07-1": {b"10", b"40"}, b"8646F-41-04": {b"100"}, b"58-79": {b"000"}}
+
+ def test_fuzzy_excluded_platforms(self):
+ # Asserts a list of platforms that will not fuzzy fingerprint with platform codes due to them being shared.
+ platforms_with_shared_codes = set()
+ for platform, fw_by_addr in FW_VERSIONS.items():
+ car_fw = []
+ for ecu, fw_versions in fw_by_addr.items():
+ ecu_name, addr, sub_addr = ecu
+ for fw in fw_versions:
+ car_fw.append(CarParams.CarFw(ecu=ecu_name, fwVersion=fw, address=addr,
+ subAddress=0 if sub_addr is None else sub_addr))
+
+ CP = CarParams(carFw=car_fw)
+ matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS)
+ if len(matches) == 1:
+ assert list(matches)[0] == platform
+ else:
+ # If a platform has multiple matches, add it and its matches
+ platforms_with_shared_codes |= {str(platform), *matches}
+
+ assert platforms_with_shared_codes == FUZZY_EXCLUDED_PLATFORMS, (len(platforms_with_shared_codes), len(FW_VERSIONS))
diff --git a/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py b/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py
new file mode 100644
index 000000000..1004a9d70
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py
@@ -0,0 +1,36 @@
+from iqdbc.car import gen_empty_fingerprint, structs
+from iqdbc.car.toyota.interface import CarInterface
+from iqdbc.car.toyota.values import CAR, ToyotaFlags
+from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ
+
+
+def test_secoc_toyota_not_dashcam_on_release():
+ # SecOC Toyotas are controllable regardless of branch or fingerprint source.
+ candidate = CAR.TOYOTA_SIENNA_4TH_GEN
+
+ # is_release=True (release branch) must not force dashcam mode
+ cp = CarInterface.get_params(candidate, gen_empty_fingerprint(), [], False, True, False)
+ assert cp.flags & ToyotaFlags.SECOC.value
+ assert cp.secOcRequired
+ assert not cp.dashcamOnly
+
+ # fw/can-sourced fingerprint (not forced) must also stay controllable
+ cp.fingerprintSource = structs.CarParams.FingerprintSource.can
+ CarInterface.get_params_iq(cp, candidate, gen_empty_fingerprint(), [], False, True, False)
+ assert not cp.dashcamOnly
+
+
+def test_smart_dsu_clears_disable_radar_on_radar_acc_toyota():
+ candidate = CAR.TOYOTA_CHR_TSS2
+ fingerprint = gen_empty_fingerprint()
+ fingerprint[0][0x2FF] = 8
+
+ cp = CarInterface.get_params(candidate, fingerprint, [], True, False, False)
+ assert cp.flags & ToyotaFlags.DISABLE_RADAR.value
+
+ cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], True, False, False)
+
+ assert cp_iq.flags & ToyotaFlagsIQ.SMART_DSU.value
+ assert not (cp.flags & ToyotaFlags.DISABLE_RADAR.value)
+ assert cp.alphaLongitudinalAvailable
+ assert cp.openpilotLongitudinalControl
diff --git a/iqdbc_repo/iqdbc/car/toyota/toyotacan.py b/iqdbc_repo/iqdbc/car/toyota/toyotacan.py
new file mode 100644
index 000000000..e55af5cbf
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/toyotacan.py
@@ -0,0 +1,166 @@
+from iqdbc.car.structs import CarParams
+
+SteerControlType = CarParams.SteerControlType
+
+
+def create_steer_command(packer, steer, steer_req):
+ """Creates a CAN message for the Toyota Steer Command."""
+
+ values = {
+ "STEER_REQUEST": steer_req,
+ "STEER_TORQUE_CMD": steer,
+ "SET_ME_1": 1,
+ }
+ return packer.make_can_msg("STEERING_LKA", 0, values)
+
+
+def create_lta_steer_command(packer, steer_control_type, steer_angle, steer_req, frame, torque_wind_down):
+ """Creates a CAN message for the Toyota LTA Steer Command."""
+
+ values = {
+ "COUNTER": frame + 128,
+ "SETME_X1": 1, # suspected LTA feature availability
+ # 1 for TSS 2.5 cars, 3 for TSS 2.0. Send based on whether we're using LTA for lateral control
+ "SETME_X3": 1 if steer_control_type == SteerControlType.angle else 3,
+ "PERCENTAGE": 100,
+ "TORQUE_WIND_DOWN": torque_wind_down,
+ "ANGLE": 0,
+ "STEER_ANGLE_CMD": steer_angle,
+ "STEER_REQUEST": steer_req,
+ "STEER_REQUEST_2": steer_req,
+ "CLEAR_HOLD_STEERING_ALERT": 0,
+ }
+ return packer.make_can_msg("STEERING_LTA", 0, values)
+
+
+def create_lta_steer_command_2(packer, frame):
+ values = {
+ "COUNTER": frame + 128,
+ }
+ return packer.make_can_msg("STEERING_LTA_2", 0, values)
+
+
+def create_accel_command(packer, accel, pcm_cancel, permit_braking, standstill_req, lead, acc_type, fcw_alert, distance):
+ # TODO: find the exact canceling bit that does not create a chime
+ values = {
+ "ACCEL_CMD": accel,
+ "ACC_TYPE": acc_type,
+ "DISTANCE": distance,
+ "MINI_CAR": lead,
+ "PERMIT_BRAKING": permit_braking,
+ "RELEASE_STANDSTILL": not standstill_req,
+ "CANCEL_REQ": pcm_cancel,
+ "ALLOW_LONG_PRESS": 1,
+ "ACC_CUT_IN": fcw_alert, # only shown when ACC enabled
+ }
+ return packer.make_can_msg("ACC_CONTROL", 0, values)
+
+
+def create_accel_command_2(packer, accel):
+ values = {
+ "ACCEL_CMD": accel,
+ }
+ return packer.make_can_msg("ACC_CONTROL_2", 0, values)
+
+
+def create_pcs_commands(packer, accel, active, mass):
+ values1 = {
+ "COUNTER": 0,
+ "FORCE": round(min(accel, 0) * mass * 2),
+ "STATE": 3 if active else 0,
+ "BRAKE_STATUS": 0,
+ "PRECOLLISION_ACTIVE": 1 if active else 0,
+ }
+ msg1 = packer.make_can_msg("PRE_COLLISION", 0, values1)
+
+ values2 = {
+ "DSS1GDRV": min(accel, 0), # accel
+ "PCSALM": 1 if active else 0, # goes high same time as PRECOLLISION_ACTIVE
+ "IBTRGR": 1 if active else 0, # unknown
+ "PBATRGR": 1 if active else 0, # noisy actuation bit?
+ "PREFILL": 1 if active else 0, # goes on and off before DSS1GDRV
+ "AVSTRGR": 1 if active else 0,
+ }
+ msg2 = packer.make_can_msg("PRE_COLLISION_2", 0, values2)
+
+ return [msg1, msg2]
+
+
+def create_acc_cancel_command(packer):
+ values = {
+ "GAS_RELEASED": 0,
+ "CRUISE_ACTIVE": 0,
+ "ACC_BRAKING": 0,
+ "ACCEL_NET": 0,
+ "CRUISE_STATE": 0,
+ "CANCEL_REQ": 1,
+ }
+ return packer.make_can_msg("PCM_CRUISE", 0, values)
+
+
+def create_fcw_command(packer, fcw):
+ values = {
+ "PCS_INDICATOR": 1, # PCS turned off
+ "FCW": fcw,
+ "SET_ME_X20": 0x20,
+ "SET_ME_X10": 0x10,
+ "PCS_OFF": 1,
+ "PCS_SENSITIVITY": 0,
+ }
+ return packer.make_can_msg("PCS_HUD", 0, values)
+
+
+def create_ui_command(packer, steer, chime, left_line, right_line, left_lane_depart, right_lane_depart, enabled, stock_lkas_hud):
+ values = {
+ "TWO_BEEPS": chime,
+ "LDA_ALERT": steer,
+ "RIGHT_LINE": 3 if right_lane_depart else 1 if right_line else 2,
+ "LEFT_LINE": 3 if left_lane_depart else 1 if left_line else 2,
+ "BARRIERS": 1 if enabled else 0,
+
+ # static signals
+ "SET_ME_X02": 2,
+ "SET_ME_X01": 1,
+ "LKAS_STATUS": 1,
+ "REPEATED_BEEPS": 0,
+ "LANE_SWAY_FLD": 7,
+ "LANE_SWAY_BUZZER": 0,
+ "LANE_SWAY_WARNING": 0,
+ "LDA_FRONT_CAMERA_BLOCKED": 0,
+ "TAKE_CONTROL": 0,
+ "LANE_SWAY_SENSITIVITY": 2,
+ "LANE_SWAY_TOGGLE": 1,
+ "LDA_ON_MESSAGE": 0,
+ "LDA_MESSAGES": 0,
+ "LDA_SA_TOGGLE": 1,
+ "LDA_SENSITIVITY": 2,
+ "LDA_UNAVAILABLE": 0,
+ "LDA_MALFUNCTION": 0,
+ "LDA_UNAVAILABLE_QUIET": 0,
+ "ADJUSTING_CAMERA": 0,
+ "LDW_EXIST": 1,
+ }
+
+ # lane sway functionality
+ # not all cars have LKAS_HUD — update with camera values if available
+ if len(stock_lkas_hud):
+ values.update({s: stock_lkas_hud[s] for s in [
+ "LANE_SWAY_FLD",
+ "LANE_SWAY_BUZZER",
+ "LANE_SWAY_WARNING",
+ "LANE_SWAY_SENSITIVITY",
+ "LANE_SWAY_TOGGLE",
+ ]})
+
+ return packer.make_can_msg("LKAS_HUD", 0, values)
+
+
+def toyota_checksum(address: int, sig, d: bytearray) -> int:
+ s = len(d)
+ addr = address
+ while addr:
+ s += addr & 0xFF
+ addr >>= 8
+ for i in range(len(d) - 1):
+ s += d[i]
+ return s & 0xFF
diff --git a/iqdbc_repo/iqdbc/car/toyota/values.py b/iqdbc_repo/iqdbc/car/toyota/values.py
new file mode 100644
index 000000000..5662fcc74
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/toyota/values.py
@@ -0,0 +1,610 @@
+import re
+from collections import defaultdict
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag
+
+from iqdbc.car import Bus, CarSpecs, PlatformConfig, Platforms
+from iqdbc.car.lateral import AngleSteeringLimits
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.structs import CarParams
+from iqdbc.car.docs_definitions import CarFootnote, CarDocs, Column, CarParts, CarHarness, SupportType
+from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
+
+Ecu = CarParams.Ecu
+MIN_ACC_SPEED = 19. * CV.MPH_TO_MS
+PEDAL_TRANSITION = 10. * CV.MPH_TO_MS
+
+
+class CarControllerParams:
+ STEER_STEP = 1
+ STEER_MAX = 1500
+ 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
+
+ def __init__(self, CP):
+ if CP.flags & ToyotaFlags.RAISED_ACCEL_LIMIT:
+ self.ACCEL_MAX = 2.0
+ else:
+ self.ACCEL_MAX = 1.5 # m/s2, lower than allowed 2.0 m/s^2 for tuning reasons
+ self.ACCEL_MIN = -3.5 # m/s2
+
+ if CP.lateralTuning.which() == 'torque':
+ self.STEER_DELTA_UP = 15 # 1.0s time to peak torque
+ self.STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50)
+ else:
+ self.STEER_DELTA_UP = 10 # 1.5s time to peak torque
+ self.STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50)
+
+
+class ToyotaSafetyFlags(IntFlag):
+ # first byte is for EPS scaling factor
+ ALT_BRAKE = (1 << 8)
+ STOCK_LONGITUDINAL = (2 << 8)
+ LTA = (4 << 8)
+ SECOC = (8 << 8)
+
+
+class ToyotaFlags(IntFlag):
+ # Detected flags
+ HYBRID = 1
+ DISABLE_RADAR = 4
+
+ # Static flags
+ TSS2 = 8
+ NO_DSU = 16
+ UNSUPPORTED_DSU = 32
+ RADAR_ACC = 64
+ # these cars use the Lane Tracing Assist (LTA) message for lateral control
+ ANGLE_CONTROL = 128
+ NO_STOP_TIMER = 256
+ # these cars can utilize 2.0 m/s^2
+ RAISED_ACCEL_LIMIT = 1024
+ SECOC = 2048
+
+ # deprecated flags
+ # these cars are speculated to allow stop and go when the DSU is unplugged or disabled with sDSU
+ SNG_WITHOUT_DSU_DEPRECATED = 512
+
+
+def dbc_dict(pt, radar):
+ return {Bus.pt: pt, Bus.radar: radar}
+
+
+class Footnote(Enum):
+ CAMRY = CarFootnote(
+ "openpilot operates above 28mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control.",
+ Column.FSR_LONGITUDINAL)
+
+
+@dataclass
+class ToyotaCarDocs(CarDocs):
+ package: str = "All"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a]))
+
+
+@dataclass
+class ToyotaSecOcCarDocs(ToyotaCarDocs):
+ support_type: SupportType = SupportType.CUSTOM
+ support_link: str = "#secoc-cars-with-recoverable-keys"
+
+
+@dataclass
+class ToyotaTSS2PlatformConfig(PlatformConfig):
+ dbc_dict: dict = field(default_factory=lambda: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'))
+
+ def init(self):
+ self.flags |= ToyotaFlags.TSS2 | ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.NO_DSU
+
+ if self.flags & ToyotaFlags.RADAR_ACC:
+ self.dbc_dict = {Bus.pt: 'toyota_nodsu_pt_generated'}
+
+
+@dataclass
+class ToyotaSecOCPlatformConfig(PlatformConfig):
+ dbc_dict: dict = field(default_factory=lambda: dbc_dict('toyota_secoc_pt_generated', 'toyota_tss2_adas'))
+
+ def init(self):
+ self.flags |= ToyotaFlags.TSS2 | ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.NO_DSU | ToyotaFlags.SECOC
+
+ if self.flags & ToyotaFlags.RADAR_ACC:
+ self.dbc_dict = {Bus.pt: 'toyota_secoc_pt_generated'}
+
+
+class CAR(Platforms):
+ # Toyota
+ TOYOTA_ALPHARD_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Alphard 2019-20"),
+ ToyotaCarDocs("Toyota Alphard Hybrid 2021"),
+ ],
+ CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444),
+ )
+ TOYOTA_AVALON = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Avalon 2016", "Toyota Safety Sense P"),
+ ToyotaCarDocs("Toyota Avalon 2017-18"),
+ ],
+ CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983),
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ )
+ TOYOTA_AVALON_2019 = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Avalon 2019-21"),
+ ToyotaCarDocs("Toyota Avalon Hybrid 2019-21"),
+ ],
+ TOYOTA_AVALON.specs,
+ dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
+ )
+ TOYOTA_AVALON_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5
+ [
+ ToyotaCarDocs("Toyota Avalon 2022"),
+ ToyotaCarDocs("Toyota Avalon Hybrid 2022"),
+ ],
+ TOYOTA_AVALON.specs,
+ )
+ TOYOTA_CAMRY = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Camry 2018-20", video="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]),
+ ToyotaCarDocs("Toyota Camry Hybrid 2018-20", video="https://www.youtube.com/watch?v=Q2DYY0AWKgk"),
+ ],
+ CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933),
+ dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.NO_DSU,
+ )
+ TOYOTA_CAMRY_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5
+ [
+ ToyotaCarDocs("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]),
+ ToyotaCarDocs("Toyota Camry Hybrid 2021-24"),
+ ],
+ TOYOTA_CAMRY.specs,
+ )
+ TOYOTA_CHR = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota C-HR 2017-20"),
+ ToyotaCarDocs("Toyota C-HR Hybrid 2017-20"),
+ ],
+ CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933),
+ dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.NO_DSU,
+ )
+ TOYOTA_CHR_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota C-HR 2021"),
+ ToyotaCarDocs("Toyota C-HR Hybrid 2021-22"),
+ ],
+ TOYOTA_CHR.specs,
+ flags=ToyotaFlags.RADAR_ACC,
+ )
+ TOYOTA_COROLLA = PlatformConfig(
+ [ToyotaCarDocs("Toyota Corolla 2017-19")],
+ CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
+ )
+ # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid
+ TOYOTA_COROLLA_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Corolla 2020-22", video="https://www.youtube.com/watch?v=_66pXk0CBYA"),
+ ToyotaCarDocs("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5),
+ ToyotaCarDocs("Toyota Corolla Hatchback 2019-22", video="https://www.youtube.com/watch?v=_66pXk0CBYA"),
+ # Hybrid platforms
+ ToyotaCarDocs("Toyota Corolla Hybrid 2020-22"),
+ ToyotaCarDocs("Toyota Corolla Hybrid (South America only) 2020-23", min_enable_speed=7.5),
+ ToyotaCarDocs("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5),
+ ToyotaCarDocs("Lexus UX Hybrid 2019-24"),
+ ],
+ CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444),
+ )
+ TOYOTA_HIGHLANDER = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Highlander 2017-19", video="https://www.youtube.com/watch?v=0wS0wXSLzoo"),
+ ToyotaCarDocs("Toyota Highlander Hybrid 2017-19"),
+ ],
+ CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8),
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.NO_STOP_TIMER,
+ )
+ TOYOTA_HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Highlander 2020-23"),
+ ToyotaCarDocs("Toyota Highlander Hybrid 2020-23"),
+ ],
+ TOYOTA_HIGHLANDER.specs,
+ )
+ TOYOTA_PRIUS = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Prius 2016", "Toyota Safety Sense P", video="https://www.youtube.com/watch?v=8zopPJI8XQ0"),
+ ToyotaCarDocs("Toyota Prius 2017-20", video="https://www.youtube.com/watch?v=8zopPJI8XQ0"),
+ ToyotaCarDocs("Toyota Prius Prime 2017-20", video="https://www.youtube.com/watch?v=8zopPJI8XQ0"),
+ ],
+ CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371),
+ dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
+ )
+ TOYOTA_PRIUS_V = PlatformConfig(
+ [ToyotaCarDocs("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)],
+ CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533),
+ dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.NO_STOP_TIMER,
+ )
+ TOYOTA_PRIUS_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota Prius 2021-22", video="https://www.youtube.com/watch?v=J58TvCpUd4U"),
+ ToyotaCarDocs("Toyota Prius Prime 2021-22", video="https://www.youtube.com/watch?v=J58TvCpUd4U"),
+ ],
+ CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371),
+ )
+ TOYOTA_RAV4 = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota RAV4 2016", "Toyota Safety Sense P"),
+ ToyotaCarDocs("Toyota RAV4 2017-18")
+ ],
+ CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533),
+ dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
+ )
+ TOYOTA_RAV4H = PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video="https://youtu.be/LhT5VzJVfNI?t=26"),
+ ToyotaCarDocs("Toyota RAV4 Hybrid 2017-18", video="https://youtu.be/LhT5VzJVfNI?t=26")
+ ],
+ TOYOTA_RAV4.specs,
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ # Note that the ICE RAV4 does not respect positive acceleration commands under 19 mph
+ flags=ToyotaFlags.NO_STOP_TIMER,
+ )
+ TOYOTA_RAV4_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota RAV4 2019-21", video="https://www.youtube.com/watch?v=wJxjDd42gGA"),
+ ToyotaCarDocs("Toyota RAV4 Hybrid 2019-21"),
+ ],
+ CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933),
+ )
+ TOYOTA_RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota RAV4 2022"),
+ ToyotaCarDocs("Toyota RAV4 Hybrid 2022", video="https://youtu.be/U0nH9cnrFB0"),
+ ],
+ TOYOTA_RAV4_TSS2.specs,
+ flags=ToyotaFlags.RADAR_ACC,
+ )
+ TOYOTA_RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Toyota RAV4 2023-25"),
+ ToyotaCarDocs("Toyota RAV4 Hybrid 2023-25", video="https://youtu.be/4eIsEq4L4Ng"),
+ ],
+ TOYOTA_RAV4_TSS2.specs,
+ flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL,
+ )
+ TOYOTA_RAV4_PRIME = ToyotaSecOCPlatformConfig(
+ [ToyotaSecOcCarDocs("Toyota RAV4 Prime 2021-23", min_enable_speed=MIN_ACC_SPEED)],
+ CarSpecs(mass=4372. * CV.LB_TO_KG, wheelbase=2.68, steerRatio=16.88, tireStiffnessFactor=0.5533),
+ )
+ TOYOTA_YARIS = ToyotaSecOCPlatformConfig(
+ [ToyotaSecOcCarDocs("Toyota Yaris (Non-US only) 2020, 2023", min_enable_speed=MIN_ACC_SPEED)],
+ CarSpecs(mass=1170, wheelbase=2.55, steerRatio=14.80, tireStiffnessFactor=0.5533),
+ flags=ToyotaFlags.RADAR_ACC,
+ )
+ TOYOTA_MIRAI = ToyotaTSS2PlatformConfig( # TSS 2.5
+ [ToyotaCarDocs("Toyota Mirai 2021")],
+ CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8),
+ )
+ TOYOTA_SIENNA = PlatformConfig(
+ [ToyotaCarDocs("Toyota Sienna 2018-20", video="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)],
+ CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.NO_STOP_TIMER,
+ )
+ TOYOTA_SIENNA_4TH_GEN = ToyotaSecOCPlatformConfig(
+ [ToyotaSecOcCarDocs("Toyota Sienna 2021-23", min_enable_speed=MIN_ACC_SPEED)],
+ CarSpecs(mass=4625. * CV.LB_TO_KG, wheelbase=3.06, steerRatio=17.8, tireStiffnessFactor=0.444),
+ )
+
+ # Lexus
+ LEXUS_CTH = PlatformConfig(
+ [ToyotaCarDocs("Lexus CT Hybrid 2017-18", "Lexus Safety System+")],
+ CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517),
+ dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
+ )
+ LEXUS_ES = PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus ES 2017-18"),
+ ToyotaCarDocs("Lexus ES Hybrid 2017-18"),
+ ],
+ CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
+ )
+ LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus ES 2019-25"),
+ ToyotaCarDocs("Lexus ES Hybrid 2019-25", video="https://youtu.be/BZ29osRVJeg?t=12"),
+ ],
+ LEXUS_ES.specs,
+ )
+ LEXUS_IS = PlatformConfig(
+ [ToyotaCarDocs("Lexus IS 2017-19")],
+ CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.UNSUPPORTED_DSU,
+ )
+ LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig(
+ [ToyotaCarDocs("Lexus IS 2022-24")],
+ LEXUS_IS.specs,
+ )
+ LEXUS_NX = PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus NX 2018-19"),
+ ToyotaCarDocs("Lexus NX Hybrid 2018-19"),
+ ],
+ CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ )
+ LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus NX 2020-21"),
+ ToyotaCarDocs("Lexus NX Hybrid 2020-21"),
+ ],
+ LEXUS_NX.specs,
+ )
+ LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig(
+ [ToyotaCarDocs("Lexus LC 2024-25")],
+ CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444),
+ )
+ LEXUS_RC = PlatformConfig(
+ [ToyotaCarDocs("Lexus RC 2018-20")],
+ LEXUS_IS.specs,
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.UNSUPPORTED_DSU,
+ )
+ LEXUS_RC_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus RC 2023"),
+ ],
+ CarSpecs(mass=3986. * CV.LB_TO_KG, wheelbase=2.73, steerRatio=13.9, tireStiffnessFactor=0.444),
+ )
+ LEXUS_RX = PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus RX 2016", "Lexus Safety System+"),
+ ToyotaCarDocs("Lexus RX 2017-19"),
+ # Hybrid platforms
+ ToyotaCarDocs("Lexus RX Hybrid 2016", "Lexus Safety System+"),
+ ToyotaCarDocs("Lexus RX Hybrid 2017-19"),
+ ],
+ CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533),
+ dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
+ )
+ LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig(
+ [
+ ToyotaCarDocs("Lexus RX 2020-22"),
+ ToyotaCarDocs("Lexus RX Hybrid 2020-22"),
+ ],
+ LEXUS_RX.specs,
+ )
+ LEXUS_GS_F = PlatformConfig(
+ [ToyotaCarDocs("Lexus GS F 2016")],
+ CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
+ flags=ToyotaFlags.UNSUPPORTED_DSU,
+ )
+ LEXUS_LS = PlatformConfig(
+ [ToyotaCarDocs("Lexus LS 2018", "All except Lexus Safety System+ A")],
+ CarSpecs(mass=4905. * CV.LB_TO_KG, wheelbase=3.125, steerRatio=15.0, tireStiffnessFactor=0.444),
+ dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
+ )
+
+
+def get_platform_codes(fw_versions: list[bytes]) -> dict[bytes, set[bytes]]:
+ # Returns sub versions in a dict so comparisons can be made within part-platform-major_version combos
+ codes = defaultdict(set) # Optional[part]-platform-major_version: set of sub_version
+ for fw in fw_versions:
+ # FW versions returned from UDS queries can return multiple fields/chunks of data (different ECU calibrations, different data?)
+ # and are prefixed with a byte that describes how many chunks of data there are.
+ # But FW returned from KWP requires querying of each sub-data id and does not have a length prefix.
+
+ length_code = 1
+ length_code_match = FW_LEN_CODE.search(fw)
+ if length_code_match is not None:
+ length_code = length_code_match.group()[0]
+ fw = fw[1:]
+
+ # fw length should be multiple of 16 bytes (per chunk, even if no length code), skip parsing if unexpected length
+ if length_code * FW_CHUNK_LEN != len(fw):
+ continue
+
+ chunks = [fw[FW_CHUNK_LEN * i:FW_CHUNK_LEN * i + FW_CHUNK_LEN].strip(b'\x00 ') for i in range(length_code)]
+
+ # only first is considered for now since second is commonly shared (TODO: understand that)
+ first_chunk = chunks[0]
+ if len(first_chunk) == 8:
+ # TODO: no part number, but some short chunks have it in subsequent chunks
+ fw_match = SHORT_FW_PATTERN.search(first_chunk)
+ if fw_match is not None:
+ platform, major_version, sub_version = fw_match.groups()
+ codes[b'-'.join((platform, major_version))].add(sub_version)
+
+ elif len(first_chunk) == 10:
+ fw_match = MEDIUM_FW_PATTERN.search(first_chunk)
+ if fw_match is not None:
+ part, platform, major_version, sub_version = fw_match.groups()
+ codes[b'-'.join((part, platform, major_version))].add(sub_version)
+
+ elif len(first_chunk) == 12:
+ fw_match = LONG_FW_PATTERN.search(first_chunk)
+ if fw_match is not None:
+ part, platform, major_version, sub_version = fw_match.groups()
+ codes[b'-'.join((part, platform, major_version))].add(sub_version)
+
+ return dict(codes)
+
+
+def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]:
+ candidates = set()
+
+ for candidate, fws in offline_fw_versions.items():
+ # Keep track of ECUs which pass all checks (platform codes, within sub-version range)
+ valid_found_ecus = set()
+ valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS}
+ for ecu, expected_versions in fws.items():
+ addr = ecu[1:]
+ # Only check ECUs expected to have platform codes
+ if ecu[0] not in PLATFORM_CODE_ECUS:
+ continue
+
+ # Expected platform codes & versions
+ expected_platform_codes = get_platform_codes(expected_versions)
+
+ # Found platform codes & versions
+ found_platform_codes = get_platform_codes(live_fw_versions.get(addr, set()))
+
+ # Check part number + platform code + major version matches for any found versions
+ # Platform codes and major versions change for different physical parts, generation, API, etc.
+ # Sub-versions are incremented for minor recalls, do not need to be checked.
+ if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes):
+ break
+
+ valid_found_ecus.add(addr)
+
+ # If all live ECUs pass all checks for candidate, add it as a match
+ if valid_expected_ecus.issubset(valid_found_ecus):
+ candidates.add(candidate)
+
+ return {str(c) for c in (candidates - FUZZY_EXCLUDED_PLATFORMS)}
+
+
+# Regex patterns for parsing more general platform-specific identifiers from FW versions.
+# - Part number: Toyota part number (usually last character needs to be ignored to find a match).
+# Each ECU address has just one part number.
+# - Platform: usually multiple codes per an openpilot platform, however this is the least variable and
+# is usually shared across ECUs and model years signifying this describes something about the specific platform.
+# This describes more generational changes (TSS-P vs TSS2), or manufacture region.
+# - Major version: second least variable part of the FW version. Seen splitting cars by model year/API such as
+# RAV4 2022/2023 and Avalon. Used to differentiate cars where API has changed slightly, but is not a generational change.
+# It is important to note that these aren't always consecutive, for example:
+# Avalon 2016-18's fwdCamera has these major versions: 01, 03 while 2019 has: 02
+# - Sub version: exclusive to major version, but shared with other cars. Should only be used for further filtering.
+# Seen bumped in TSB FW updates, and describes other minor differences.
+SHORT_FW_PATTERN = re.compile(b'[A-Z0-9](?P[A-Z0-9]{2})(?P[A-Z0-9]{2})(?P[A-Z0-9]{3})')
+MEDIUM_FW_PATTERN = re.compile(b'(?P[A-Z0-9]{5})(?P[A-Z0-9]{2})(?P[A-Z0-9]{1})(?P[A-Z0-9]{2})')
+LONG_FW_PATTERN = re.compile(b'(?P[A-Z0-9]{5})(?P[A-Z0-9]{2})(?P[A-Z0-9]{2})(?P[A-Z0-9]{3})')
+FW_LEN_CODE = re.compile(b'^[\x01-\x03]') # highest seen is 3 chunks, 16 bytes each
+FW_CHUNK_LEN = 16
+
+# List of ECUs that are most unique across openpilot platforms
+# - fwdCamera: describes actual features related to ADAS. For example, on the Avalon it describes
+# when TSS-P became standard, whether the car supports stop and go, and whether it's TSS2.
+# On the RAV4, it describes the move to the radar doing ACC, and the use of LTA for lane keeping.
+# Note that the platform codes & major versions do not describe features in plain text, only with
+# matching against other seen FW versions in the database they can describe features.
+# - fwdRadar: sanity check against fwdCamera, commonly shares a platform code.
+# For example the RAV4 2022's new radar architecture is shown for both with platform code.
+# - abs: differentiates hybrid/ICE on most cars (Corolla TSS2 is an exception, not used due to hybrid platform combination)
+# - eps: describes lateral API changes for the EPS, such as using LTA for lane keeping and rejecting LKA messages
+PLATFORM_CODE_ECUS = (Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps)
+
+# These platforms have at least one platform code for all ECUs shared with another platform.
+FUZZY_EXCLUDED_PLATFORMS: set[CAR] = set()
+
+# Some ECUs that use KWP2000 have their FW versions on non-standard data identifiers.
+# Toyota diagnostic software first gets the supported data ids, then queries them one by one.
+# For example, sends: 0x1a8800, receives: 0x1a8800010203, queries: 0x1a8801, 0x1a8802, 0x1a8803
+TOYOTA_VERSION_REQUEST_KWP = b'\x1a\x88\x01'
+TOYOTA_VERSION_RESPONSE_KWP = b'\x5a\x88\x01'
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ # TODO: look at data to whitelist new ECUs effectively
+ requests=[
+ Request(
+ [StdQueries.SHORT_TESTER_PRESENT_REQUEST, TOYOTA_VERSION_REQUEST_KWP],
+ [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, TOYOTA_VERSION_RESPONSE_KWP],
+ whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.dsu, Ecu.abs, Ecu.eps, Ecu.srs, Ecu.transmission, Ecu.hvac],
+ bus=0,
+ ),
+ Request(
+ [StdQueries.SHORT_TESTER_PRESENT_REQUEST, StdQueries.OBD_VERSION_REQUEST],
+ [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, StdQueries.OBD_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.engine, Ecu.hybrid, Ecu.srs, Ecu.transmission, Ecu.hvac],
+ bus=0,
+ ),
+ Request(
+ [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.EXTENDED_DIAGNOSTIC_REQUEST, StdQueries.UDS_VERSION_REQUEST],
+ [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.EXTENDED_DIAGNOSTIC_RESPONSE, StdQueries.UDS_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.engine, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.abs, Ecu.eps,
+ Ecu.hybrid, Ecu.srs, Ecu.transmission, Ecu.hvac],
+ bus=0,
+ ),
+ ],
+ non_essential_ecus={
+ # FIXME: On some models, abs can sometimes be missing
+ Ecu.abs: [CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_SIENNA, CAR.LEXUS_IS, CAR.TOYOTA_ALPHARD_TSS2],
+ # On some models, the engine can show on two different addresses
+ Ecu.engine: [CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_CAMRY, CAR.TOYOTA_COROLLA_TSS2, CAR.TOYOTA_CHR, CAR.TOYOTA_CHR_TSS2, CAR.LEXUS_IS,
+ CAR.LEXUS_IS_TSS2, CAR.LEXUS_RC, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2, CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2],
+ },
+ extra_ecus=[
+ # All known ECUs on a late-model Toyota vehicle not queried here:
+ # Responds to UDS:
+ # - Combination Meter (0x7c0)
+ # - HV Battery (0x713, 0x747)
+ # - Motor Generator (0x716, 0x724)
+ # - 2nd ABS "Brake/EPB" (0x730)
+ # - Electronic Parking Brake ((0x750, 0x2c))
+ # - Telematics ((0x750, 0xc7))
+ # Responds to KWP (0x1a8801):
+ # - Steering Angle Sensor (0x7b3)
+ # - EPS/EMPS (0x7a0, 0x7a1)
+ # - 2nd SRS Airbag (0x784)
+ # - Central Gateway ((0x750, 0x5f))
+ # - Telematics ((0x750, 0xc7))
+ # Responds to KWP (0x1a8881):
+ # - Body Control Module ((0x750, 0x40))
+ # - Telematics ((0x750, 0xc7))
+
+ # Hybrid control computer can be on 0x7e2 (KWP) or 0x7d2 (UDS) depending on platform
+ (Ecu.hybrid, 0x7e2, None), # Hybrid Control Assembly & Computer
+ (Ecu.hybrid, 0x7d2, None), # Hybrid Control Assembly & Computer
+ (Ecu.srs, 0x780, None), # SRS Airbag
+ # Transmission is combined with engine on some platforms, such as TSS-P RAV4
+ (Ecu.transmission, 0x701, None),
+ # A few platforms have a tester present response on this address, add to log
+ (Ecu.transmission, 0x7e1, None),
+ (Ecu.hvac, 0x7c4, None),
+ ],
+ match_fw_to_car_fuzzy=match_fw_to_car_fuzzy,
+)
+
+STEER_THRESHOLD = 100
+
+# These cars have non-standard EPS torque scale factors. All others are 73
+EPS_SCALE = defaultdict(lambda: 73,
+ {CAR.TOYOTA_PRIUS: 66, CAR.TOYOTA_COROLLA: 88, CAR.LEXUS_IS: 77, CAR.LEXUS_RC: 77, CAR.LEXUS_CTH: 100, CAR.TOYOTA_PRIUS_V: 100})
+
+# Toyota/Lexus Safety Sense 2.0 and 2.5
+TSS2_CAR = CAR.with_flags(ToyotaFlags.TSS2)
+
+NO_DSU_CAR = CAR.with_flags(ToyotaFlags.NO_DSU)
+
+# the DSU uses the AEB message for longitudinal on these cars
+UNSUPPORTED_DSU_CAR = CAR.with_flags(ToyotaFlags.UNSUPPORTED_DSU)
+
+# these cars have a radar which sends ACC messages instead of the camera
+RADAR_ACC_CAR = CAR.with_flags(ToyotaFlags.RADAR_ACC)
+
+ANGLE_CONTROL_CAR = CAR.with_flags(ToyotaFlags.ANGLE_CONTROL)
+
+SECOC_CAR = CAR.with_flags(ToyotaFlags.SECOC)
+
+# no resume button press required
+NO_STOP_TIMER_CAR = CAR.with_flags(ToyotaFlags.NO_STOP_TIMER)
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/uds.py b/iqdbc_repo/iqdbc/car/uds.py
new file mode 100644
index 000000000..8f5220366
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/uds.py
@@ -0,0 +1,973 @@
+import time
+import struct
+from collections import deque
+from typing import NamedTuple, cast
+from collections.abc import Callable, Generator
+from enum import IntEnum
+from functools import partial
+
+from iqdbc.car.carlog import carlog
+
+
+class SERVICE_TYPE(IntEnum):
+ DIAGNOSTIC_SESSION_CONTROL = 0x10
+ ECU_RESET = 0x11
+ SECURITY_ACCESS = 0x27
+ COMMUNICATION_CONTROL = 0x28
+ TESTER_PRESENT = 0x3E
+ ACCESS_TIMING_PARAMETER = 0x83
+ SECURED_DATA_TRANSMISSION = 0x84
+ CONTROL_DTC_SETTING = 0x85
+ RESPONSE_ON_EVENT = 0x86
+ LINK_CONTROL = 0x87
+ READ_DATA_BY_IDENTIFIER = 0x22
+ READ_MEMORY_BY_ADDRESS = 0x23
+ READ_SCALING_DATA_BY_IDENTIFIER = 0x24
+ READ_DATA_BY_PERIODIC_IDENTIFIER = 0x2A
+ DYNAMICALLY_DEFINE_DATA_IDENTIFIER = 0x2C
+ WRITE_DATA_BY_IDENTIFIER = 0x2E
+ WRITE_MEMORY_BY_ADDRESS = 0x3D
+ CLEAR_DIAGNOSTIC_INFORMATION = 0x14
+ READ_DTC_INFORMATION = 0x19
+ INPUT_OUTPUT_CONTROL_BY_IDENTIFIER = 0x2F
+ ROUTINE_CONTROL = 0x31
+ REQUEST_DOWNLOAD = 0x34
+ REQUEST_UPLOAD = 0x35
+ TRANSFER_DATA = 0x36
+ REQUEST_TRANSFER_EXIT = 0x37
+
+
+class SESSION_TYPE(IntEnum):
+ DEFAULT = 1
+ PROGRAMMING = 2
+ EXTENDED_DIAGNOSTIC = 3
+ SAFETY_SYSTEM_DIAGNOSTIC = 4
+
+
+class RESET_TYPE(IntEnum):
+ HARD = 1
+ KEY_OFF_ON = 2
+ SOFT = 3
+ ENABLE_RAPID_POWER_SHUTDOWN = 4
+ DISABLE_RAPID_POWER_SHUTDOWN = 5
+
+
+class ACCESS_TYPE(IntEnum):
+ REQUEST_SEED = 1
+ SEND_KEY = 2
+
+
+class CONTROL_TYPE(IntEnum):
+ ENABLE_RX_ENABLE_TX = 0
+ ENABLE_RX_DISABLE_TX = 1
+ DISABLE_RX_ENABLE_TX = 2
+ DISABLE_RX_DISABLE_TX = 3
+
+
+class MESSAGE_TYPE(IntEnum):
+ NORMAL = 1
+ NETWORK_MANAGEMENT = 2
+ NORMAL_AND_NETWORK_MANAGEMENT = 3
+
+
+class TIMING_PARAMETER_TYPE(IntEnum):
+ READ_EXTENDED_SET = 1
+ SET_TO_DEFAULT_VALUES = 2
+ READ_CURRENTLY_ACTIVE = 3
+ SET_TO_GIVEN_VALUES = 4
+
+
+class DTC_SETTING_TYPE(IntEnum):
+ ON = 1
+ OFF = 2
+
+
+class RESPONSE_EVENT_TYPE(IntEnum):
+ STOP_RESPONSE_ON_EVENT = 0
+ ON_DTC_STATUS_CHANGE = 1
+ ON_TIMER_INTERRUPT = 2
+ ON_CHANGE_OF_DATA_IDENTIFIER = 3
+ REPORT_ACTIVATED_EVENTS = 4
+ START_RESPONSE_ON_EVENT = 5
+ CLEAR_RESPONSE_ON_EVENT = 6
+ ON_COMPARISON_OF_VALUES = 7
+
+
+class LINK_CONTROL_TYPE(IntEnum):
+ VERIFY_BAUDRATE_TRANSITION_WITH_FIXED_BAUDRATE = 1
+ VERIFY_BAUDRATE_TRANSITION_WITH_SPECIFIC_BAUDRATE = 2
+ TRANSITION_BAUDRATE = 3
+
+
+class BAUD_RATE_TYPE(IntEnum):
+ PC9600 = 1
+ PC19200 = 2
+ PC38400 = 3
+ PC57600 = 4
+ PC115200 = 5
+ CAN125000 = 16
+ CAN250000 = 17
+ CAN500000 = 18
+ CAN1000000 = 19
+
+
+class DATA_IDENTIFIER_TYPE(IntEnum):
+ BOOT_SOFTWARE_IDENTIFICATION = 0xF180
+ APPLICATION_SOFTWARE_IDENTIFICATION = 0xF181
+ APPLICATION_DATA_IDENTIFICATION = 0xF182
+ BOOT_SOFTWARE_FINGERPRINT = 0xF183
+ APPLICATION_SOFTWARE_FINGERPRINT = 0xF184
+ APPLICATION_DATA_FINGERPRINT = 0xF185
+ ACTIVE_DIAGNOSTIC_SESSION = 0xF186
+ VEHICLE_MANUFACTURER_SPARE_PART_NUMBER = 0xF187
+ VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER = 0xF188
+ VEHICLE_MANUFACTURER_ECU_SOFTWARE_VERSION_NUMBER = 0xF189
+ SYSTEM_SUPPLIER_IDENTIFIER = 0xF18A
+ ECU_MANUFACTURING_DATE = 0xF18B
+ ECU_SERIAL_NUMBER = 0xF18C
+ SUPPORTED_FUNCTIONAL_UNITS = 0xF18D
+ VEHICLE_MANUFACTURER_KIT_ASSEMBLY_PART_NUMBER = 0xF18E
+ VIN = 0xF190
+ VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER = 0xF191
+ SYSTEM_SUPPLIER_ECU_HARDWARE_NUMBER = 0xF192
+ SYSTEM_SUPPLIER_ECU_HARDWARE_VERSION_NUMBER = 0xF193
+ SYSTEM_SUPPLIER_ECU_SOFTWARE_NUMBER = 0xF194
+ SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER = 0xF195
+ EXHAUST_REGULATION_OR_TYPE_APPROVAL_NUMBER = 0xF196
+ SYSTEM_NAME_OR_ENGINE_TYPE = 0xF197
+ REPAIR_SHOP_CODE_OR_TESTER_SERIAL_NUMBER = 0xF198
+ PROGRAMMING_DATE = 0xF199
+ CALIBRATION_REPAIR_SHOP_CODE_OR_CALIBRATION_EQUIPMENT_SERIAL_NUMBER = 0xF19A
+ CALIBRATION_DATE = 0xF19B
+ CALIBRATION_EQUIPMENT_SOFTWARE_NUMBER = 0xF19C
+ ECU_INSTALLATION_DATE = 0xF19D
+ ODX_FILE = 0xF19E
+ ENTITY = 0xF19F
+
+
+class TRANSMISSION_MODE_TYPE(IntEnum):
+ SEND_AT_SLOW_RATE = 1
+ SEND_AT_MEDIUM_RATE = 2
+ SEND_AT_FAST_RATE = 3
+ STOP_SENDING = 4
+
+
+class DYNAMIC_DEFINITION_TYPE(IntEnum):
+ DEFINE_BY_IDENTIFIER = 1
+ DEFINE_BY_MEMORY_ADDRESS = 2
+ CLEAR_DYNAMICALLY_DEFINED_DATA_IDENTIFIER = 3
+
+
+class ISOTP_FRAME_TYPE(IntEnum):
+ SINGLE = 0
+ FIRST = 1
+ CONSECUTIVE = 2
+ FLOW = 3
+
+
+class DynamicSourceDefinition(NamedTuple):
+ data_identifier: int
+ position: int
+ memory_size: int
+ memory_address: int
+
+
+class DTC_GROUP_TYPE(IntEnum):
+ EMISSIONS = 0x000000
+ ALL = 0xFFFFFF
+
+
+class DTC_REPORT_TYPE(IntEnum):
+ NUMBER_OF_DTC_BY_STATUS_MASK = 0x01
+ DTC_BY_STATUS_MASK = 0x02
+ DTC_SNAPSHOT_IDENTIFICATION = 0x03
+ DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER = 0x04
+ DTC_SNAPSHOT_RECORD_BY_RECORD_NUMBER = 0x05
+ DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER = 0x06
+ NUMBER_OF_DTC_BY_SEVERITY_MASK_RECORD = 0x07
+ DTC_BY_SEVERITY_MASK_RECORD = 0x08
+ SEVERITY_INFORMATION_OF_DTC = 0x09
+ SUPPORTED_DTC = 0x0A
+ FIRST_TEST_FAILED_DTC = 0x0B
+ FIRST_CONFIRMED_DTC = 0x0C
+ MOST_RECENT_TEST_FAILED_DTC = 0x0D
+ MOST_RECENT_CONFIRMED_DTC = 0x0E
+ MIRROR_MEMORY_DTC_BY_STATUS_MASK = 0x0F
+ MIRROR_MEMORY_DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER = 0x10
+ NUMBER_OF_MIRROR_MEMORY_DTC_BY_STATUS_MASK = 0x11
+ NUMBER_OF_EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK = 0x12
+ EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK = 0x13
+ DTC_FAULT_DETECTION_COUNTER = 0x14
+ DTC_WITH_PERMANENT_STATUS = 0x15
+
+
+class DTC_STATUS_MASK_TYPE(IntEnum):
+ TEST_FAILED = 0x01
+ TEST_FAILED_THIS_OPERATION_CYCLE = 0x02
+ PENDING_DTC = 0x04
+ CONFIRMED_DTC = 0x08
+ TEST_NOT_COMPLETED_SINCE_LAST_CLEAR = 0x10
+ TEST_FAILED_SINCE_LAST_CLEAR = 0x20
+ TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE = 0x40
+ WARNING_INDICATOR_REQUESTED = 0x80
+ ALL = 0xFF
+
+
+class DTC_SEVERITY_MASK_TYPE(IntEnum):
+ MAINTENANCE_ONLY = 0x20
+ CHECK_AT_NEXT_HALT = 0x40
+ CHECK_IMMEDIATELY = 0x80
+ ALL = 0xE0
+
+
+class CONTROL_PARAMETER_TYPE(IntEnum):
+ RETURN_CONTROL_TO_ECU = 0
+ RESET_TO_DEFAULT = 1
+ FREEZE_CURRENT_STATE = 2
+ SHORT_TERM_ADJUSTMENT = 3
+
+
+class ROUTINE_CONTROL_TYPE(IntEnum):
+ START = 1
+ STOP = 2
+ REQUEST_RESULTS = 3
+
+
+class ROUTINE_IDENTIFIER_TYPE(IntEnum):
+ ERASE_MEMORY = 0xFF00
+ CHECK_PROGRAMMING_DEPENDENCIES = 0xFF01
+ ERASE_MIRROR_MEMORY_DTCS = 0xFF02
+
+
+class MessageTimeoutError(Exception):
+ pass
+
+
+class NegativeResponseError(Exception):
+ def __init__(self, message, service_id, error_code):
+ super().__init__()
+ self.message = message
+ self.service_id = service_id
+ self.error_code = error_code
+
+ def __str__(self):
+ return self.message
+
+
+class InvalidServiceIdError(Exception):
+ pass
+
+
+class InvalidSubFunctionError(Exception):
+ pass
+
+
+class InvalidSubAddressError(Exception):
+ pass
+
+
+_negative_response_codes = {
+ 0x00: 'positive response',
+ 0x10: 'general reject',
+ 0x11: 'service not supported',
+ 0x12: 'sub-function not supported',
+ 0x13: 'incorrect message length or invalid format',
+ 0x14: 'response too long',
+ 0x21: 'busy repeat request',
+ 0x22: 'conditions not correct',
+ 0x24: 'request sequence error',
+ 0x25: 'no response from subnet component',
+ 0x26: 'failure prevents execution of requested action',
+ 0x31: 'request out of range',
+ 0x33: 'security access denied',
+ 0x35: 'invalid key',
+ 0x36: 'exceed number of attempts',
+ 0x37: 'required time delay not expired',
+ 0x70: 'upload download not accepted',
+ 0x71: 'transfer data suspended',
+ 0x72: 'general programming failure',
+ 0x73: 'wrong block sequence counter',
+ 0x78: 'request correctly received - response pending',
+ 0x7e: 'sub-function not supported in active session',
+ 0x7f: 'service not supported in active session',
+ 0x81: 'rpm too high',
+ 0x82: 'rpm too low',
+ 0x83: 'engine is running',
+ 0x84: 'engine is not running',
+ 0x85: 'engine run time too low',
+ 0x86: 'temperature too high',
+ 0x87: 'temperature too low',
+ 0x88: 'vehicle speed too high',
+ 0x89: 'vehicle speed too low',
+ 0x8a: 'throttle/pedal too high',
+ 0x8b: 'throttle/pedal too low',
+ 0x8c: 'transmission not in neutral',
+ 0x8d: 'transmission not in gear',
+ 0x8f: 'brake switch(es) not closed',
+ 0x90: 'shifter lever not in park',
+ 0x91: 'torque converter clutch locked',
+ 0x92: 'voltage too high',
+ 0x93: 'voltage too low',
+}
+
+
+def get_dtc_num_as_str(dtc_num_bytes):
+ # ISO 15031-6
+ designator = {
+ 0b00: "P",
+ 0b01: "C",
+ 0b10: "B",
+ 0b11: "U",
+ }
+ d = designator[dtc_num_bytes[0] >> 6]
+ n = bytes([dtc_num_bytes[0] & 0x3F]) + dtc_num_bytes[1:]
+ return d + n.hex()
+
+
+def get_dtc_status_names(status):
+ result = list()
+ for m in DTC_STATUS_MASK_TYPE:
+ if m == DTC_STATUS_MASK_TYPE.ALL:
+ continue
+ if status & m.value:
+ result.append(m.name)
+ return result
+
+
+class CanClient:
+ def __init__(self, can_send: Callable[[int, bytes, int], None], can_recv: Callable[[], list[tuple[int, bytes, int]]],
+ tx_addr: int, rx_addr: int, bus: int, sub_addr: int | None = None, rx_sub_addr: int | None = None):
+ self.tx = can_send
+ self.rx = can_recv
+ self.tx_addr = tx_addr
+ self.rx_addr = rx_addr
+ self.rx_buff: deque[bytes] = deque()
+ self.sub_addr = sub_addr
+ self.rx_sub_addr = rx_sub_addr if rx_sub_addr is not None else sub_addr
+ self.bus = bus
+
+ def _recv_filter(self, bus: int, addr: int) -> bool:
+ # handle functional addresses (switch to first addr to respond)
+ if self.tx_addr == 0x7DF:
+ is_response = addr >= 0x7E8 and addr <= 0x7EF
+ if is_response:
+ carlog.debug(f"switch to physical addr {hex(addr)}")
+ self.tx_addr = addr - 8
+ self.rx_addr = addr
+ return is_response
+ if self.tx_addr == 0x18DB33F1:
+ is_response = addr >= 0x18DAF100 and addr <= 0x18DAF1FF
+ if is_response:
+ carlog.debug(f"switch to physical addr {hex(addr)}")
+ self.tx_addr = 0x18DA00F1 + (addr << 8 & 0xFF00)
+ self.rx_addr = addr
+ return bus == self.bus and addr == self.rx_addr
+
+ def _recv_buffer(self, drain: bool = False) -> None:
+ while True:
+ msgs = self.rx()
+ if drain:
+ carlog.debug(f"CAN-RX: drain - {len(msgs)}")
+ self.rx_buff.clear()
+ else:
+ for rx_addr, rx_data, rx_bus in msgs or []:
+ if self._recv_filter(rx_bus, rx_addr) and len(rx_data) > 0:
+ rx_data = bytes(rx_data) # convert bytearray to bytes
+
+ carlog.debug(f"CAN-RX: {hex(rx_addr)} - 0x{bytes.hex(rx_data)}")
+
+ # Cut off sub addr in first byte
+ if self.rx_sub_addr is not None:
+ if rx_data[0] != self.rx_sub_addr:
+ raise InvalidSubAddressError(f"isotp - rx: invalid sub-address: {rx_data[0]}, expected: {self.rx_sub_addr}")
+ rx_data = rx_data[1:]
+
+ self.rx_buff.append(rx_data)
+ # break when non-full buffer is processed
+ if len(msgs) < 254:
+ return
+
+ def recv(self, drain: bool = False) -> Generator[bytes, None, None]:
+ # buffer rx messages in case two response messages are received at once
+ # (e.g. response pending and success/failure response)
+ self._recv_buffer(drain)
+ try:
+ while True:
+ yield self.rx_buff.popleft()
+ except IndexError:
+ pass # empty
+
+ def send(self, msgs: list[bytes], delay: float = 0) -> None:
+ for i, msg in enumerate(msgs):
+ if delay and i != 0:
+ carlog.debug(f"CAN-TX: delay - {delay}")
+ time.sleep(delay)
+
+ if self.sub_addr is not None:
+ msg = bytes([self.sub_addr]) + msg
+
+ carlog.debug(f"CAN-TX: {hex(self.tx_addr)} - 0x{bytes.hex(msg)}")
+ assert len(msg) <= 8
+
+ self.tx(self.tx_addr, msg, self.bus)
+ # prevent rx buffer from overflowing on large tx
+ if i % 10 == 9:
+ self._recv_buffer()
+
+
+class IsoTpMessage:
+ def __init__(self, can_client: CanClient, timeout: float = 1, single_frame_mode: bool = False, separation_time: float = 0):
+ self._can_client = can_client
+ self.timeout = timeout
+ self.single_frame_mode = single_frame_mode
+ self.max_len = 8 if self._can_client.sub_addr is None else 7
+
+ # <= 127, separation time in milliseconds
+ # 0xF1 to 0xF9 UF, 100 to 900 microseconds
+ if 1e-4 <= separation_time <= 9e-4:
+ offset = int(round(separation_time, 4) * 1e4) - 1
+ separation_time = 0xF1 + offset
+ elif 0 <= separation_time <= 0.127:
+ separation_time = round(separation_time * 1000)
+ else:
+ raise Exception("Separation time not in range")
+
+ self.flow_control_msg = bytes([
+ 0x30, # flow control
+ 0x01 if self.single_frame_mode else 0x00, # block size
+ separation_time,
+ ]).ljust(self.max_len, b"\x00")
+
+ def send(self, dat: bytes, setup_only: bool = False) -> None:
+ # throw away any stale data
+ self._can_client.recv(drain=True)
+
+ self.tx_dat = dat
+ self.tx_len = len(dat)
+ self.tx_idx = 0
+ self.tx_done = False
+
+ self.rx_dat = b""
+ self.rx_len = 0
+ self.rx_idx = 0
+ self.rx_done = False
+
+ if not setup_only:
+ carlog.debug(f"ISO-TP: REQUEST - {hex(self._can_client.tx_addr)} 0x{bytes.hex(self.tx_dat)}")
+ self._tx_first_frame(setup_only=setup_only)
+
+ def _tx_first_frame(self, setup_only: bool = False) -> None:
+ if self.tx_len < self.max_len:
+ # single frame (send all bytes)
+ if not setup_only:
+ carlog.debug(f"ISO-TP: TX - single frame - {hex(self._can_client.tx_addr)}")
+ msg = (bytes([self.tx_len]) + self.tx_dat).ljust(self.max_len, b"\x00")
+ self.tx_done = True
+ else:
+ # first frame (send first 6 bytes)
+ if not setup_only:
+ carlog.debug(f"ISO-TP: TX - first frame - {hex(self._can_client.tx_addr)}")
+ msg = (struct.pack("!H", 0x1000 | self.tx_len) + self.tx_dat[:self.max_len - 2]).ljust(self.max_len - 2, b"\x00")
+ if not setup_only:
+ self._can_client.send([msg])
+
+ def recv(self, timeout=None) -> tuple[bytes | None, bool]:
+ if timeout is None:
+ timeout = self.timeout
+
+ start_time = time.monotonic()
+ rx_in_progress = False
+ try:
+ while True:
+ for msg in self._can_client.recv():
+ frame_type = self._isotp_rx_next(msg)
+ start_time = time.monotonic()
+ # Anything that signifies we're building a response
+ rx_in_progress = frame_type in (ISOTP_FRAME_TYPE.FIRST, ISOTP_FRAME_TYPE.CONSECUTIVE)
+ if self.tx_done and self.rx_done:
+ return self.rx_dat, False
+ # no timeout indicates non-blocking
+ if timeout == 0:
+ return None, rx_in_progress
+ if time.monotonic() - start_time > timeout:
+ raise MessageTimeoutError("timeout waiting for response")
+ finally:
+ if self.rx_dat:
+ carlog.debug(f"ISO-TP: RESPONSE - {hex(self._can_client.rx_addr)} 0x{bytes.hex(self.rx_dat)}")
+
+ def _isotp_rx_next(self, rx_data: bytes) -> ISOTP_FRAME_TYPE:
+ # TODO: Handle CAN frame data optimization, which is allowed with some frame types
+ # # ISO 15765-2 specifies an eight byte CAN frame for ISO-TP communication
+ # assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}"
+
+ if rx_data[0] >> 4 == ISOTP_FRAME_TYPE.SINGLE:
+ assert self.rx_dat == b"" or self.rx_done, "isotp - rx: single frame with active frame"
+
+ # "if the first byte is 0x00, then it's a CAN-FD SF, and the second byte specifies the size of the data."
+ # - https://en.wikipedia.org/wiki/CAN_FD
+ if rx_data[0] & 0x0F == 0 and len(rx_data) > 8:
+ self.rx_len = rx_data[1]
+ offset = 2
+ # TODO: update self.max_len for CAN FD
+ max_len = 62 if self._can_client.sub_addr is None else 61
+ assert self.rx_len <= max_len, f"isotp - rx: invalid single frame length: {self.rx_len}"
+ else:
+ self.rx_len = rx_data[0] & 0x0F
+ offset = 1
+ assert self.rx_len < self.max_len, f"isotp - rx: invalid single frame length: {self.rx_len}"
+
+ self.rx_dat = rx_data[offset:offset + self.rx_len]
+ self.rx_idx = 0
+ self.rx_done = True
+ carlog.debug(f"ISO-TP: RX - single frame - {hex(self._can_client.rx_addr)} idx={self.rx_idx} done={self.rx_done}")
+ return ISOTP_FRAME_TYPE.SINGLE
+
+ elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.FIRST:
+ # TODO: support CAN FD first frames
+ # Once a first frame is received, further frames must be consecutive
+ assert self.rx_dat == b"" or self.rx_done, "isotp - rx: first frame with active frame"
+ self.rx_len = ((rx_data[0] & 0x0F) << 8) + rx_data[1]
+ assert self.rx_len >= self.max_len, f"isotp - rx: invalid first frame length: {self.rx_len}"
+ assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}"
+ self.rx_dat = rx_data[2:]
+ self.rx_idx = 0
+ self.rx_done = False
+ carlog.debug(f"ISO-TP: RX - first frame - {hex(self._can_client.rx_addr)} idx={self.rx_idx} done={self.rx_done}")
+ carlog.debug(f"ISO-TP: TX - flow control continue - {hex(self._can_client.tx_addr)}")
+ # send flow control message
+ self._can_client.send([self.flow_control_msg])
+ return ISOTP_FRAME_TYPE.FIRST
+
+ elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.CONSECUTIVE:
+ assert not self.rx_done, "isotp - rx: consecutive frame with no active frame"
+ self.rx_idx += 1
+ assert self.rx_idx & 0xF == rx_data[0] & 0xF, "isotp - rx: invalid consecutive frame index"
+ rx_size = self.rx_len - len(self.rx_dat)
+ self.rx_dat += rx_data[1:1 + rx_size]
+ if self.rx_len == len(self.rx_dat):
+ self.rx_done = True
+ elif self.single_frame_mode:
+ # notify ECU to send next frame
+ self._can_client.send([self.flow_control_msg])
+ carlog.debug(f"ISO-TP: RX - consecutive frame - {hex(self._can_client.rx_addr)} idx={self.rx_idx} done={self.rx_done}")
+ return ISOTP_FRAME_TYPE.CONSECUTIVE
+
+ elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.FLOW:
+ assert not self.tx_done, "isotp - rx: flow control with no active frame"
+ assert rx_data[0] != 0x32, "isotp - rx: flow-control overflow/abort"
+ assert rx_data[0] == 0x30 or rx_data[0] == 0x31, "isotp - rx: flow-control transfer state indicator invalid"
+ if rx_data[0] == 0x30:
+ carlog.debug(f"ISO-TP: RX - flow control continue - {hex(self._can_client.tx_addr)}")
+ delay_ts = rx_data[2] & 0x7F
+ # scale is 1 milliseconds if first bit == 0, 100 micro seconds if first bit == 1
+ delay_div = 1000. if rx_data[2] & 0x80 == 0 else 10000.
+ delay_sec = delay_ts / delay_div
+
+ # first frame = 6 bytes, each consecutive frame = 7 bytes
+ num_bytes = self.max_len - 1
+ start = self.max_len - 2 + self.tx_idx * num_bytes
+ count = rx_data[1]
+ end = start + count * num_bytes if count > 0 else self.tx_len
+ tx_msgs = []
+ for i in range(start, end, num_bytes):
+ self.tx_idx += 1
+ # consecutive tx messages
+ msg = (bytes([0x20 | (self.tx_idx & 0xF)]) + self.tx_dat[i:i + num_bytes]).ljust(self.max_len, b"\x00")
+ tx_msgs.append(msg)
+ # send consecutive tx messages
+ self._can_client.send(tx_msgs, delay=delay_sec)
+ if end >= self.tx_len:
+ self.tx_done = True
+ carlog.debug(f"ISO-TP: TX - consecutive frame - {hex(self._can_client.tx_addr)} idx={self.tx_idx} done={self.tx_done}")
+ elif rx_data[0] == 0x31:
+ # wait (do nothing until next flow control message)
+ carlog.debug(f"ISO-TP: TX - flow control wait - {hex(self._can_client.tx_addr)}")
+ return ISOTP_FRAME_TYPE.FLOW
+
+ # 4-15 - reserved
+ else:
+ raise Exception(f"isotp - rx: invalid frame type: {rx_data[0] >> 4}")
+
+
+FUNCTIONAL_ADDRS = [0x7DF, 0x18DB33F1]
+
+
+def get_rx_addr_for_tx_addr(tx_addr, rx_offset=0x8):
+ if tx_addr in FUNCTIONAL_ADDRS:
+ return None
+
+ if tx_addr < 0xFFF8:
+ # pseudo-standard 11 bit response addr (add 8) works for most manufacturers
+ # allow override; some manufacturers use other offsets for non-OBD2 access
+ return tx_addr + rx_offset
+
+ if tx_addr > 0x10000000 and tx_addr < 0xFFFFFFFF:
+ # standard 29 bit response addr (flip last two bytes)
+ return (tx_addr & 0xFFFF0000) + (tx_addr << 8 & 0xFF00) + (tx_addr >> 8 & 0xFF)
+
+ raise ValueError(f"invalid tx_addr: {tx_addr}")
+
+
+class UdsClient:
+ def __init__(self, panda, tx_addr: int, rx_addr: int | None = None, bus: int = 0, sub_addr: int | None = None, rx_sub_addr: int | None = None,
+ timeout: float = 1, tx_timeout: float = 1, response_pending_timeout: float = 10):
+ self.bus = bus
+ self.tx_addr = tx_addr
+ self.rx_addr = rx_addr if rx_addr is not None else get_rx_addr_for_tx_addr(tx_addr)
+ self.sub_addr = sub_addr
+ self.timeout = timeout
+ can_send_with_timeout = partial(panda.can_send, timeout=int(tx_timeout*1000))
+ self._can_client = CanClient(can_send_with_timeout, panda.can_recv, self.tx_addr, self.rx_addr, self.bus, self.sub_addr, rx_sub_addr)
+ self.response_pending_timeout = response_pending_timeout
+
+ # generic uds request
+ def _uds_request(self, service_type: SERVICE_TYPE, subfunction: int | None = None, data: bytes | None = None) -> bytes:
+ req = bytes([service_type])
+ if subfunction is not None:
+ req += bytes([subfunction])
+ if data is not None:
+ req += data
+
+ # send request, wait for response
+ isotp_msg = IsoTpMessage(self._can_client, timeout=self.timeout)
+ isotp_msg.send(req)
+ response_pending = False
+ while True:
+ timeout = self.response_pending_timeout if response_pending else self.timeout
+ resp, _ = isotp_msg.recv(timeout)
+
+ if resp is None:
+ continue
+
+ response_pending = False
+ resp_sid = resp[0] if len(resp) > 0 else None
+
+ # negative response
+ if resp_sid == 0x7F:
+ service_id = resp[1] if len(resp) > 1 else -1
+ try:
+ service_desc = SERVICE_TYPE(service_id).name
+ except BaseException:
+ service_desc = 'NON_STANDARD_SERVICE'
+ error_code = resp[2] if len(resp) > 2 else -1
+ try:
+ error_desc = _negative_response_codes[error_code]
+ except BaseException:
+ error_desc = resp[3:].hex()
+ # wait for another message if response pending
+ if error_code == 0x78:
+ response_pending = True
+ carlog.debug("UDS-RX: response pending")
+ continue
+ raise NegativeResponseError(f'{service_desc} - {error_desc}', service_id, error_code)
+
+ # positive response
+ if service_type + 0x40 != resp_sid:
+ resp_sid_hex = hex(resp_sid) if resp_sid is not None else None
+ raise InvalidServiceIdError(f'invalid response service id: {resp_sid_hex}')
+
+ if subfunction is not None:
+ resp_sfn = resp[1] if len(resp) > 1 else None
+ if subfunction != resp_sfn:
+ resp_sfn_hex = hex(resp_sfn) if resp_sfn is not None else None
+ raise InvalidSubFunctionError(f'invalid response subfunction: {resp_sfn_hex}')
+
+ # return data (exclude service id and sub-function id)
+ return resp[(1 if subfunction is None else 2):]
+
+ # services
+ def diagnostic_session_control(self, session_type: SESSION_TYPE):
+ self._uds_request(SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, subfunction=session_type)
+
+ def ecu_reset(self, reset_type: RESET_TYPE):
+ resp = self._uds_request(SERVICE_TYPE.ECU_RESET, subfunction=reset_type)
+ power_down_time = None
+ if reset_type == RESET_TYPE.ENABLE_RAPID_POWER_SHUTDOWN:
+ power_down_time = resp[0]
+ return power_down_time
+
+ def security_access(self, access_type: ACCESS_TYPE, security_key: bytes = b'', data_record: bytes = b''):
+ request_seed = access_type % 2 != 0
+ if request_seed and len(security_key) != 0:
+ raise ValueError('security_key not allowed')
+ if not request_seed and len(security_key) == 0:
+ raise ValueError('security_key is missing')
+ if not request_seed and len(data_record) != 0:
+ raise ValueError('data_record not allowed')
+ data = security_key + data_record
+ resp = self._uds_request(SERVICE_TYPE.SECURITY_ACCESS, subfunction=access_type, data=data)
+ if request_seed:
+ security_seed = resp
+ return security_seed
+
+ def communication_control(self, control_type: CONTROL_TYPE, message_type: MESSAGE_TYPE):
+ data = bytes([message_type])
+ self._uds_request(SERVICE_TYPE.COMMUNICATION_CONTROL, subfunction=control_type, data=data)
+
+ def tester_present(self, ):
+ self._uds_request(SERVICE_TYPE.TESTER_PRESENT, subfunction=0x00)
+
+ def access_timing_parameter(self, timing_parameter_type: TIMING_PARAMETER_TYPE, parameter_values: bytes | None = None):
+ write_custom_values = timing_parameter_type == TIMING_PARAMETER_TYPE.SET_TO_GIVEN_VALUES
+ read_values = (timing_parameter_type == TIMING_PARAMETER_TYPE.READ_CURRENTLY_ACTIVE or
+ timing_parameter_type == TIMING_PARAMETER_TYPE.READ_EXTENDED_SET)
+ if not write_custom_values and parameter_values is not None:
+ raise ValueError('parameter_values not allowed')
+ if write_custom_values and parameter_values is None:
+ raise ValueError('parameter_values is missing')
+ resp = self._uds_request(SERVICE_TYPE.ACCESS_TIMING_PARAMETER, subfunction=timing_parameter_type, data=parameter_values)
+ if read_values:
+ # TODO: parse response into values?
+ parameter_values = resp
+ return parameter_values
+
+ def secured_data_transmission(self, data: bytes):
+ # TODO: split data into multiple input parameters?
+ resp = self._uds_request(SERVICE_TYPE.SECURED_DATA_TRANSMISSION, subfunction=None, data=data)
+ # TODO: parse response into multiple output values?
+ return resp
+
+ def control_dtc_setting(self, dtc_setting_type: DTC_SETTING_TYPE):
+ self._uds_request(SERVICE_TYPE.CONTROL_DTC_SETTING, subfunction=dtc_setting_type)
+
+ def response_on_event(self, response_event_type: RESPONSE_EVENT_TYPE, store_event: bool, window_time: int,
+ event_type_record: int, service_response_record: int):
+ if store_event:
+ response_event_type |= 0x20 # type: ignore
+ # TODO: split record parameters into arrays
+ data = bytes([window_time, event_type_record, service_response_record])
+ resp = self._uds_request(SERVICE_TYPE.RESPONSE_ON_EVENT, subfunction=response_event_type, data=data)
+
+ if response_event_type == RESPONSE_EVENT_TYPE.REPORT_ACTIVATED_EVENTS:
+ return {
+ "num_of_activated_events": resp[0],
+ "data": resp[1:], # TODO: parse the reset of response
+ }
+
+ return {
+ "num_of_identified_events": resp[0],
+ "event_window_time": resp[1],
+ "data": resp[2:], # TODO: parse the reset of response
+ }
+
+ def link_control(self, link_control_type: LINK_CONTROL_TYPE, baud_rate_type: BAUD_RATE_TYPE | None = None):
+ data: bytes | None
+
+ if link_control_type == LINK_CONTROL_TYPE.VERIFY_BAUDRATE_TRANSITION_WITH_FIXED_BAUDRATE:
+ # baud_rate_type = BAUD_RATE_TYPE
+ data = bytes([cast(int, baud_rate_type)])
+ elif link_control_type == LINK_CONTROL_TYPE.VERIFY_BAUDRATE_TRANSITION_WITH_SPECIFIC_BAUDRATE:
+ # baud_rate_type = custom value (3 bytes big-endian)
+ data = struct.pack('!I', baud_rate_type)[1:]
+ else:
+ data = None
+ self._uds_request(SERVICE_TYPE.LINK_CONTROL, subfunction=link_control_type, data=data)
+
+ def read_data_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE):
+ # TODO: support list of identifiers
+ data = struct.pack('!H', data_identifier_type)
+ resp = self._uds_request(SERVICE_TYPE.READ_DATA_BY_IDENTIFIER, subfunction=None, data=data)
+ resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None
+ if resp_id != data_identifier_type:
+ raise ValueError(f'invalid response data identifier: {hex(resp_id)} expected: {hex(data_identifier_type)}')
+ return resp[2:]
+
+ def read_memory_by_address(self, memory_address: int, memory_size: int, memory_address_bytes: int = 4, memory_size_bytes: int = 1):
+ if memory_address_bytes < 1 or memory_address_bytes > 4:
+ raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}')
+ if memory_size_bytes < 1 or memory_size_bytes > 4:
+ raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}')
+ data = bytes([memory_size_bytes << 4 | memory_address_bytes])
+
+ if memory_address >= 1 << (memory_address_bytes * 8):
+ raise ValueError(f'invalid memory_address: {memory_address}')
+ data += struct.pack('!I', memory_address)[4 - memory_address_bytes:]
+ if memory_size >= 1 << (memory_size_bytes * 8):
+ raise ValueError(f'invalid memory_size: {memory_size}')
+ data += struct.pack('!I', memory_size)[4 - memory_size_bytes:]
+
+ resp = self._uds_request(SERVICE_TYPE.READ_MEMORY_BY_ADDRESS, subfunction=None, data=data)
+ return resp
+
+ def read_scaling_data_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE):
+ data = struct.pack('!H', data_identifier_type)
+ resp = self._uds_request(SERVICE_TYPE.READ_SCALING_DATA_BY_IDENTIFIER, subfunction=None, data=data)
+ resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None
+ if resp_id != data_identifier_type:
+ raise ValueError(f'invalid response data identifier: {hex(resp_id)}')
+ return resp[2:] # TODO: parse the response
+
+ def read_data_by_periodic_identifier(self, transmission_mode_type: TRANSMISSION_MODE_TYPE, periodic_data_identifier: int):
+ # TODO: support list of identifiers
+ data = bytes([transmission_mode_type, periodic_data_identifier])
+ self._uds_request(SERVICE_TYPE.READ_DATA_BY_PERIODIC_IDENTIFIER, subfunction=None, data=data)
+
+ def dynamically_define_data_identifier(self, dynamic_definition_type: DYNAMIC_DEFINITION_TYPE, dynamic_data_identifier: int,
+ source_definitions: list[DynamicSourceDefinition], memory_address_bytes: int = 4, memory_size_bytes: int = 1):
+ if memory_address_bytes < 1 or memory_address_bytes > 4:
+ raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}')
+ if memory_size_bytes < 1 or memory_size_bytes > 4:
+ raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}')
+
+ data = struct.pack('!H', dynamic_data_identifier)
+ if dynamic_definition_type == DYNAMIC_DEFINITION_TYPE.DEFINE_BY_IDENTIFIER:
+ for s in source_definitions:
+ data += struct.pack('!H', s.data_identifier) + bytes([s.position, s.memory_size])
+ elif dynamic_definition_type == DYNAMIC_DEFINITION_TYPE.DEFINE_BY_MEMORY_ADDRESS:
+ data += bytes([memory_size_bytes << 4 | memory_address_bytes])
+ for s in source_definitions:
+ if s.memory_address >= 1 << (memory_address_bytes * 8):
+ raise ValueError(f'invalid memory_address: {s.memory_address}')
+ data += struct.pack('!I', s.memory_address)[4 - memory_address_bytes:]
+ if s.memory_size >= 1 << (memory_size_bytes * 8):
+ raise ValueError(f'invalid memory_size: {s.memory_size}')
+ data += struct.pack('!I', s.memory_size)[4 - memory_size_bytes:]
+ elif dynamic_definition_type == DYNAMIC_DEFINITION_TYPE.CLEAR_DYNAMICALLY_DEFINED_DATA_IDENTIFIER:
+ pass
+ else:
+ raise ValueError(f'invalid dynamic identifier type: {hex(dynamic_definition_type)}')
+ self._uds_request(SERVICE_TYPE.DYNAMICALLY_DEFINE_DATA_IDENTIFIER, subfunction=dynamic_definition_type, data=data)
+
+ def write_data_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE, data_record: bytes):
+ data = struct.pack('!H', data_identifier_type) + data_record
+ resp = self._uds_request(SERVICE_TYPE.WRITE_DATA_BY_IDENTIFIER, subfunction=None, data=data)
+ resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None
+ if resp_id != data_identifier_type:
+ raise ValueError(f'invalid response data identifier: {hex(resp_id)}')
+
+ def write_memory_by_address(self, memory_address: int, memory_size: int, data_record: bytes, memory_address_bytes: int = 4, memory_size_bytes: int = 1):
+ if memory_address_bytes < 1 or memory_address_bytes > 4:
+ raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}')
+ if memory_size_bytes < 1 or memory_size_bytes > 4:
+ raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}')
+ data = bytes([memory_size_bytes << 4 | memory_address_bytes])
+
+ if memory_address >= 1 << (memory_address_bytes * 8):
+ raise ValueError(f'invalid memory_address: {memory_address}')
+ data += struct.pack('!I', memory_address)[4 - memory_address_bytes:]
+ if memory_size >= 1 << (memory_size_bytes * 8):
+ raise ValueError(f'invalid memory_size: {memory_size}')
+ data += struct.pack('!I', memory_size)[4 - memory_size_bytes:]
+
+ data += data_record
+ self._uds_request(SERVICE_TYPE.WRITE_MEMORY_BY_ADDRESS, subfunction=None, data=data)
+
+ def clear_diagnostic_information(self, dtc_group_type: DTC_GROUP_TYPE):
+ data = struct.pack('!I', dtc_group_type)[1:] # 3 bytes
+ self._uds_request(SERVICE_TYPE.CLEAR_DIAGNOSTIC_INFORMATION, subfunction=None, data=data)
+
+ def read_dtc_information(self, dtc_report_type: DTC_REPORT_TYPE, dtc_status_mask_type: DTC_STATUS_MASK_TYPE = DTC_STATUS_MASK_TYPE.ALL,
+ dtc_severity_mask_type: DTC_SEVERITY_MASK_TYPE = DTC_SEVERITY_MASK_TYPE.ALL, dtc_mask_record: int = 0xFFFFFF,
+ dtc_snapshot_record_num: int = 0xFF, dtc_extended_record_num: int = 0xFF):
+ data = b''
+ # dtc_status_mask_type
+ if dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_DTC_BY_STATUS_MASK or \
+ dtc_report_type == DTC_REPORT_TYPE.DTC_BY_STATUS_MASK or \
+ dtc_report_type == DTC_REPORT_TYPE.MIRROR_MEMORY_DTC_BY_STATUS_MASK or \
+ dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_MIRROR_MEMORY_DTC_BY_STATUS_MASK or \
+ dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK or \
+ dtc_report_type == DTC_REPORT_TYPE.EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK:
+ data += bytes([dtc_status_mask_type])
+ # dtc_mask_record
+ if dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_IDENTIFICATION or \
+ dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER or \
+ dtc_report_type == DTC_REPORT_TYPE.DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER or \
+ dtc_report_type == DTC_REPORT_TYPE.MIRROR_MEMORY_DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER or \
+ dtc_report_type == DTC_REPORT_TYPE.SEVERITY_INFORMATION_OF_DTC:
+ data += struct.pack('!I', dtc_mask_record)[1:] # 3 bytes
+ # dtc_snapshot_record_num
+ if dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_IDENTIFICATION or \
+ dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER or \
+ dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_RECORD_BY_RECORD_NUMBER:
+ data += bytes([dtc_snapshot_record_num])
+ # dtc_extended_record_num
+ if dtc_report_type == DTC_REPORT_TYPE.DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER or \
+ dtc_report_type == DTC_REPORT_TYPE.MIRROR_MEMORY_DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER:
+ data += bytes([dtc_extended_record_num])
+ # dtc_severity_mask_type
+ if dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_DTC_BY_SEVERITY_MASK_RECORD or \
+ dtc_report_type == DTC_REPORT_TYPE.DTC_BY_SEVERITY_MASK_RECORD:
+ data += bytes([dtc_severity_mask_type, dtc_status_mask_type])
+
+ resp = self._uds_request(SERVICE_TYPE.READ_DTC_INFORMATION, subfunction=dtc_report_type, data=data)
+
+ # TODO: parse response
+ return resp
+
+ def input_output_control_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE, control_parameter_type: CONTROL_PARAMETER_TYPE,
+ control_option_record: bytes = b'', control_enable_mask_record: bytes = b''):
+ data = struct.pack('!H', data_identifier_type) + bytes([control_parameter_type]) + control_option_record + control_enable_mask_record
+ resp = self._uds_request(SERVICE_TYPE.INPUT_OUTPUT_CONTROL_BY_IDENTIFIER, subfunction=None, data=data)
+ resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None
+ if resp_id != data_identifier_type:
+ raise ValueError(f'invalid response data identifier: {hex(resp_id)}')
+ return resp[2:]
+
+ def routine_control(self, routine_control_type: ROUTINE_CONTROL_TYPE, routine_identifier_type: ROUTINE_IDENTIFIER_TYPE, routine_option_record: bytes = b''):
+ data = struct.pack('!H', routine_identifier_type) + routine_option_record
+ resp = self._uds_request(SERVICE_TYPE.ROUTINE_CONTROL, subfunction=routine_control_type, data=data)
+ resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None
+ if resp_id != routine_identifier_type:
+ raise ValueError(f'invalid response routine identifier: {hex(resp_id)}')
+ return resp[2:]
+
+ def request_download(self, memory_address: int, memory_size: int, memory_address_bytes: int = 4, memory_size_bytes: int = 4, data_format: int = 0x00):
+ data = bytes([data_format])
+
+ if memory_address_bytes < 1 or memory_address_bytes > 4:
+ raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}')
+ if memory_size_bytes < 1 or memory_size_bytes > 4:
+ raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}')
+ data += bytes([memory_size_bytes << 4 | memory_address_bytes])
+
+ if memory_address >= 1 << (memory_address_bytes * 8):
+ raise ValueError(f'invalid memory_address: {memory_address}')
+ data += struct.pack('!I', memory_address)[4 - memory_address_bytes:]
+ if memory_size >= 1 << (memory_size_bytes * 8):
+ raise ValueError(f'invalid memory_size: {memory_size}')
+ data += struct.pack('!I', memory_size)[4 - memory_size_bytes:]
+
+ resp = self._uds_request(SERVICE_TYPE.REQUEST_DOWNLOAD, subfunction=None, data=data)
+ max_num_bytes_len = resp[0] >> 4 if len(resp) > 0 else 0
+ if max_num_bytes_len >= 1 and max_num_bytes_len <= 4:
+ max_num_bytes = struct.unpack('!I', (b"\x00" * (4 - max_num_bytes_len)) + resp[1:max_num_bytes_len + 1])[0]
+ else:
+ raise ValueError(f'invalid max_num_bytes_len: {max_num_bytes_len}')
+
+ return max_num_bytes # max number of bytes per transfer data request
+
+ def request_upload(self, memory_address: int, memory_size: int, memory_address_bytes: int = 4, memory_size_bytes: int = 4, data_format: int = 0x00):
+ data = bytes([data_format])
+
+ if memory_address_bytes < 1 or memory_address_bytes > 4:
+ raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}')
+ if memory_size_bytes < 1 or memory_size_bytes > 4:
+ raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}')
+ data += bytes([memory_size_bytes << 4 | memory_address_bytes])
+
+ if memory_address >= 1 << (memory_address_bytes * 8):
+ raise ValueError(f'invalid memory_address: {memory_address}')
+ data += struct.pack('!I', memory_address)[4 - memory_address_bytes:]
+ if memory_size >= 1 << (memory_size_bytes * 8):
+ raise ValueError(f'invalid memory_size: {memory_size}')
+ data += struct.pack('!I', memory_size)[4 - memory_size_bytes:]
+
+ resp = self._uds_request(SERVICE_TYPE.REQUEST_UPLOAD, subfunction=None, data=data)
+ max_num_bytes_len = resp[0] >> 4 if len(resp) > 0 else 0
+ if max_num_bytes_len >= 1 and max_num_bytes_len <= 4:
+ max_num_bytes = struct.unpack('!I', (b"\x00" * (4 - max_num_bytes_len)) + resp[1:max_num_bytes_len + 1])[0]
+ else:
+ raise ValueError(f'invalid max_num_bytes_len: {max_num_bytes_len}')
+
+ return max_num_bytes # max number of bytes per transfer data request
+
+ def transfer_data(self, block_sequence_count: int, data: bytes = b''):
+ data = bytes([block_sequence_count]) + data
+ resp = self._uds_request(SERVICE_TYPE.TRANSFER_DATA, subfunction=None, data=data)
+ resp_id = resp[0] if len(resp) > 0 else None
+ if resp_id != block_sequence_count:
+ raise ValueError(f'invalid block_sequence_count: {resp_id}')
+ return resp[1:]
+
+ def request_transfer_exit(self):
+ self._uds_request(SERVICE_TYPE.REQUEST_TRANSFER_EXIT, subfunction=None)
diff --git a/iqdbc_repo/iqdbc/car/values.py b/iqdbc_repo/iqdbc/car/values.py
new file mode 100644
index 000000000..82c88359d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/values.py
@@ -0,0 +1,21 @@
+from typing import get_args
+from iqdbc.car.body.values import CAR as BODY
+from iqdbc.car.chrysler.values import CAR as CHRYSLER
+from iqdbc.car.ford.values import CAR as FORD
+from iqdbc.car.gm.values import CAR as GM
+from iqdbc.car.honda.values import CAR as HONDA
+from iqdbc.car.hyundai.values import CAR as HYUNDAI
+from iqdbc.car.mazda.values import CAR as MAZDA
+from iqdbc.car.mock.values import CAR as MOCK
+from iqdbc.car.nissan.values import CAR as NISSAN
+from iqdbc.car.psa.values import CAR as PSA
+from iqdbc.car.rivian.values import CAR as RIVIAN
+from iqdbc.car.subaru.values import CAR as SUBARU
+from iqdbc.car.tesla.values import CAR as TESLA
+from iqdbc.car.toyota.values import CAR as TOYOTA
+from iqdbc.car.volkswagen.values import CAR as VOLKSWAGEN
+
+Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | NISSAN | PSA | RIVIAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN
+BRANDS = get_args(Platform)
+
+PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in brand}
diff --git a/iqdbc_repo/iqdbc/car/vehicle_model.py b/iqdbc_repo/iqdbc/car/vehicle_model.py
new file mode 100755
index 000000000..57ff7ad83
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/vehicle_model.py
@@ -0,0 +1,229 @@
+#!/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 iqdbc.car.structs import CarParams
+from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY
+
+
+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 Rear [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
+
+
+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/iqdbc_repo/iqdbc/car/vin.py b/iqdbc_repo/iqdbc/car/vin.py
new file mode 100644
index 000000000..bb63147e8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/vin.py
@@ -0,0 +1,75 @@
+import re
+from dataclasses import dataclass, field
+
+from iqdbc.car import uds
+from iqdbc.car.carlog import carlog
+from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery
+from iqdbc.car.fw_query_definitions import STANDARD_VIN_ADDRS, StdQueries
+
+VIN_UNKNOWN = "0" * 17
+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
+
+
+def get_vin(can_recv, can_send, buses, timeout=0.1, retry=2):
+ for i in range(retry):
+ for bus in buses:
+ for request, response, valid_buses, vin_addrs, functional_addrs, rx_offset in (
+ (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, uds.FUNCTIONAL_ADDRS, 0x8),
+ (StdQueries.OBD_VIN_REQUEST, StdQueries.OBD_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, uds.FUNCTIONAL_ADDRS, 0x8),
+ (StdQueries.GM_VIN_REQUEST, StdQueries.GM_VIN_RESPONSE, (0,), [0x24b], None, 0x400), # Bolt fwdCamera
+ (StdQueries.KWP_VIN_REQUEST, StdQueries.KWP_VIN_RESPONSE, (0,), [0x797], None, 0x3), # Nissan Leaf VCM
+ (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0,), [0x74f], None, 0x6a), # Volkswagen fwdCamera
+ (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0,), [0x733], None, 0x40), # Rivian EPAS
+ ):
+ if bus not in valid_buses:
+ continue
+
+ # When querying functional addresses, ideally we respond to everything that sends a first frame to avoid leaving the
+ # ECU in a temporary bad state. Note that we may not cover all ECUs and response offsets. TODO: query physical addrs
+ tx_addrs = vin_addrs
+ if functional_addrs is not None:
+ tx_addrs = [a for a in range(0x700, 0x800) if a != 0x7DF] + list(range(0x18DA00F1, 0x18DB00F1, 0x100))
+
+ try:
+ query = IsoTpParallelQuery(can_send, can_recv, bus, tx_addrs, [request, ], [response, ], response_offset=rx_offset,
+ functional_addrs=functional_addrs)
+ results = query.get_data(timeout)
+
+ for addr in vin_addrs:
+ vin = results.get((addr, None))
+ if vin is not None:
+ # Ford and Nissan pads with null bytes
+ if len(vin) in (19, 24):
+ vin = re.sub(b'\x00*$', b'', vin)
+
+ # Honda Bosch response starts with a length, trim to correct length
+ if vin.startswith(b'\x11'):
+ vin = vin[1:18]
+
+ carlog.error(f"got vin with {request=}")
+ return uds.get_rx_addr_for_tx_addr(addr, rx_offset=rx_offset), bus, vin.decode()
+ except Exception:
+ carlog.exception("VIN query exception")
+
+ carlog.error(f"vin query retry ({i+1}) ...")
+
+ return -1, -1, VIN_UNKNOWN
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/__init__.py b/iqdbc_repo/iqdbc/car/volkswagen/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/carcontroller.py b/iqdbc_repo/iqdbc/car/volkswagen/carcontroller.py
new file mode 100644
index 000000000..8aec2a573
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/carcontroller.py
@@ -0,0 +1,665 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+import sys
+import os
+import math
+import numpy as np
+import random
+from iqdbc.can import CANPacker
+from iqdbc.car import Bus, DT_CTRL, make_tester_present_msg, structs
+from iqdbc.car.lateral import apply_driver_steer_torque_limits, apply_steer_angle_limits_simple
+from iqdbc.car.lateral import apply_std_curvature_limits
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.common.numpy_fast import clip, interp
+from iqdbc.car.interfaces import CarControllerBase
+from iqdbc.car.volkswagen import mlbcan, mqbcan, pqcan, mebcan
+from iqdbc.car.volkswagen.pq_radar_handler import PQRadarHandler
+from iqdbc.car.volkswagen.values import (
+ CanBus, CarControllerParams, MQB_A0_CARS, VolkswagenFlags, VolkswagenFlagsIQ, apply_pq_stopping_accel,
+)
+from iqdbc.car.volkswagen.mebutils import LongControlJerk, LongControlLimit, LatControlCurvature
+from iqdbc.car.vehicle_model import VehicleModel
+from openpilot.system.proprietary_runtime._verified_import import import_verified_module
+
+iq_lvbs_alc = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.alc")
+iq_lvbs_commander = import_verified_module("iqpilot_commander_private", "iqpilot_private.konn3kt.iqlvbs.iqlvbs_commander")
+
+iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..')
+sys.path.insert(0, iqpilot_path)
+try:
+ from openpilot.common.params import Params
+except ImportError:
+ pass
+
+VisualAlert = structs.CarControl.HUDControl.VisualAlert
+AudibleAlert = structs.CarControl.HUDControl.AudibleAlert
+LongCtrlState = structs.CarControl.Actuators.LongControlState
+
+
+def dVisual(CCS, CS):
+ if CCS == mqbcan:
+ decelV = CS.tsk_verzoeg_anf
+ elif CCS == pqcan:
+ decelV = CS.br8_acc_anf
+ else:
+ decelV = False
+ return decelV
+
+class MQBStandstillManager:
+ BRAKE_TORQUE_RAMP_RATE = 2000.0 # Nm/s
+ ASSUMED_WHEEL_RADIUS = 0.328 # m, typical tire rolling radius
+ GRAVITY = 9.81 # m/s^2
+ WEGIMPULSE_STILLNESS_FRAMES = 5 # frames of no wheel tick change before assuming standstill
+ ESP_OVERRIDE_SPEED = 9.5 * CV.KPH_TO_MS
+ MAX_SAFE_STOPPING_SPEED = 10.0 * CV.KPH_TO_MS
+
+ def __init__(self, vehicle_mass: float = 1540.0, accel_min: float = -3.5):
+ self.vehicle_mass = vehicle_mass
+ self.accel_min = accel_min
+ self.can_stop_forever = False
+ self.rollback_detected = False
+ self.start_commit_active = False
+ self.frames_since_last_wheel_pulse = 0
+ self.prev_sum_wegimpulse: int | None = None
+ self.prev_accel = 0
+ self.hold_recovery_active = False
+
+ def get_hill_hold_decel_deficit(self, pitch: float, brake_torque: float) -> float:
+ if self.vehicle_mass <= 0:
+ return 0.0
+ uphill_pitch = max(pitch, 0.0)
+ hill_hold_decel = self.GRAVITY * math.sin(uphill_pitch)
+ brake_decel = max(brake_torque, 0.0) / (self.vehicle_mass * self.ASSUMED_WHEEL_RADIUS)
+ return max(hill_hold_decel - brake_decel, 0.0)
+
+ def get_safe_speed_for_brake_torque(self, pitch: float, brake_torque: float) -> float:
+ missing_brake_decel = self.get_hill_hold_decel_deficit(pitch, brake_torque)
+ if missing_brake_decel <= 0 or self.vehicle_mass <= 0:
+ return 0.0
+ brake_decel_build_rate = self.BRAKE_TORQUE_RAMP_RATE / (self.vehicle_mass * self.ASSUMED_WHEEL_RADIUS)
+ forward_speed_needed_while_brake_builds = 1.5 * missing_brake_decel ** 2 / brake_decel_build_rate
+ return min(forward_speed_needed_while_brake_builds, self.MAX_SAFE_STOPPING_SPEED)
+
+ def get_blended_brake_accel(self, raw_accel: float, v_ego: float, pitch: float, brake_torque: float) -> float:
+ zero_brake_decel_deficit = self.get_hill_hold_decel_deficit(pitch, 0.0)
+ current_brake_decel_deficit = self.get_hill_hold_decel_deficit(pitch, brake_torque)
+ zero_brake_safe_speed = self.get_safe_speed_for_brake_torque(pitch, 0.0)
+ if zero_brake_decel_deficit <= 0 or zero_brake_safe_speed <= 0:
+ return raw_accel
+ brake_deficit_risk = current_brake_decel_deficit / zero_brake_decel_deficit
+ speed_risk = max(zero_brake_safe_speed - v_ego, 0.0) / zero_brake_safe_speed
+ rollback_risk = float(np.clip(speed_risk * brake_deficit_risk, 0.0, 1.0))
+ blended_accel = raw_accel + rollback_risk * (self.accel_min - raw_accel)
+ return min(raw_accel, blended_accel)
+
+ def update(self, CS, long_active: bool, accel: float, stopping: bool, starting: bool,
+ max_planned_speed: float, pitch: float = 0.0,
+ tsk_brake_torque: float = 0.0) -> tuple[bool, float, bool, bool, bool | None, bool | None]:
+
+ safe_stopping_speed = self.get_safe_speed_for_brake_torque(pitch, 0.0)
+ below_safe_stop_speed = CS.out.vEgo < safe_stopping_speed
+ can_accelerate = max_planned_speed > safe_stopping_speed
+ uphill_grade_pct = max(math.tan(pitch) * 100.0, 0.0)
+ takeoff_acceleration = max(0.2, 0.1 * uphill_grade_pct)
+
+ if CS.out.vEgo < self.ESP_OVERRIDE_SPEED:
+ esp_starting_override: bool | None = True
+ esp_stopping_override: bool | None = False
+ else:
+ esp_starting_override = None
+ esp_stopping_override = None
+
+ if CS.rolling_backward:
+ self.rollback_detected = True
+ elif CS.rolling_forward:
+ self.rollback_detected = False
+
+ wheel_did_pulse = CS.sum_wegimpulse != self.prev_sum_wegimpulse
+ self.prev_sum_wegimpulse = CS.sum_wegimpulse
+ if wheel_did_pulse:
+ self.frames_since_last_wheel_pulse = 0
+ else:
+ self.frames_since_last_wheel_pulse += 1
+ near_standstill = self.frames_since_last_wheel_pulse >= self.WEGIMPULSE_STILLNESS_FRAMES
+
+ # acc type 1 is sensitive to control signals when brake is pressed (when preEnabled)
+ if CS.out.brakePressed:
+ long_active = False
+
+ if long_active and not CS.out.gasPressed:
+ if CS.esp_hold_confirmation:
+ self.start_commit_active = True
+ if can_accelerate and below_safe_stop_speed and accel > 0:
+ self.start_commit_active = True
+ elif self.start_commit_active:
+ if CS.out.vEgo > safe_stopping_speed:
+ self.start_commit_active = False
+ else:
+ self.start_commit_active = False
+
+ if long_active:
+ raw_accel = accel
+ if self.start_commit_active:
+ accel = max(accel, takeoff_acceleration)
+ stopping = False
+ starting = True
+ elif self.rollback_detected:
+ accel = self.accel_min
+ stopping = True
+ starting = False
+ elif below_safe_stop_speed:
+ accel = self.get_blended_brake_accel(accel, CS.out.vEgo, pitch, tsk_brake_torque)
+ if accel < raw_accel:
+ stopping = True
+ starting = False
+ if near_standstill and accel < 0 and tsk_brake_torque == 0:
+ accel = self.accel_min
+ stopping = True
+ starting = False
+ if CS.out.standstill and accel < 0:
+ accel = min(accel, self.prev_accel)
+
+ if long_active:
+ if CS.out.vEgo > self.ESP_OVERRIDE_SPEED:
+ self.can_stop_forever = False
+ if CS.esp_hold_confirmation:
+ self.can_stop_forever = False
+ self.hold_recovery_active = True
+
+ if self.start_commit_active:
+ esp_starting_override = True
+ esp_stopping_override = False
+ elif CS.esp_stopping:
+ self.can_stop_forever = True
+ self.hold_recovery_active = False
+ esp_starting_override = True
+ esp_stopping_override = False
+ elif self.can_stop_forever:
+ esp_starting_override = True
+ esp_stopping_override = False
+ elif near_standstill:
+ esp_starting_override = False
+ esp_stopping_override = True
+ # recover from hold confirmations while moving to prevent reconfirming them
+ elif self.hold_recovery_active and not CS.out.standstill:
+ esp_starting_override = False
+ esp_stopping_override = True
+ else:
+ self.can_stop_forever = False
+ self.hold_recovery_active = False
+
+ self.prev_accel = accel
+ return long_active, accel, stopping, starting, esp_starting_override, esp_stopping_override
+
+class CarController(CarControllerBase):
+ def __init__(self, dbc_names, CP, CP_IQ):
+ super().__init__(dbc_names, CP, CP_IQ)
+ self._params = Params()
+ self.CCP = CarControllerParams(CP)
+ self.CAN = CanBus(CP)
+ self.packer_pt = CANPacker(dbc_names[Bus.pt])
+
+ self._pt_tx_bus = self.CAN.pt
+ if CP.flags & VolkswagenFlags.PQ:
+ self.CCS = pqcan
+ if CP.flags & VolkswagenFlagsIQ.IQ_PQ_LOWLINE:
+ self._pt_tx_bus = self.CAN.aux
+ elif CP.flags & VolkswagenFlags.MLB:
+ self.CCS = mlbcan
+ elif CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ self.CCS = mebcan
+ else:
+ self.CCS = mqbcan
+
+ self.accel = 0
+ self.apply_torque_last = 0
+ self.apply_curvature_last = 0.
+ self.apply_angle_last = 0
+ self.ALC_entryCounter = 0
+ self.ALC_driverExit = False
+ self.ALC_reentry_blocked = False
+ self.ALC_override_last = False
+ self.ALC_override_counter = 0
+ self.entering = False
+ self.active = False
+ self.CSLH3_SignLast = 0
+ self.CSsteeringAngleDegLast = 0
+ self.steering_power_last = 0
+ self.long_jerk_control = LongControlJerk(dt=(DT_CTRL * self.CCP.ACC_CONTROL_STEP)) if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) else None
+ self.long_limit_control = LongControlLimit(dt=(DT_CTRL * self.CCP.ACC_CONTROL_STEP)) if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) else None
+ self.gra_acc_counter_last = None
+ self.motor3_frame_last = None
+ self.motor3_was_stopping = False
+ self.motor3_resuming = False
+ self.sng_handoff_active = False
+ self.acc_counter_seeded = False
+ self.klr_counter_last = None
+ self.eps_timer_soft_disable_alert = False
+ self.hca_frame_timer_running = 0
+ self.hca_frame_same_torque = 0
+ self.accel_last = 0
+ self.long_deviation = 0
+ self.long_jerklimit = 0
+ self.HCA_Status = 3
+ self.leadDistanceBars = 0
+ self.lead_distance_bars_last = None
+ self.distance_bar_frame = 0
+ self.mlb_hud_text = 0
+ self.mlb_hud_text_frame = 0
+ self.mlb_set_speed_last = 0
+ self.speed_limit_last = 0
+ self.speed_limit_changed_timer = 0
+ self.blinkerActive = None
+ self.hide_ea_error = False
+ self.radar_disabled_warning_timer = 0
+ # Check once at init whether the DBC includes MEB_AWV_01 (AEB HUD for radar-disabled camera harness cars)
+ self._has_aeb_hud_msg = "MEB_AWV_01" in self.packer_pt.dbc.name_to_msg
+ self.eps_timer_workaround = bool(CP.flags & (VolkswagenFlags.MLB | VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB))
+ self._pq_patch_checked = not bool(CP.flags & VolkswagenFlags.PQ) or self.eps_timer_workaround
+ self.hca_frame_timer_resetting = 0
+ self.hca_frame_low_torque = 0
+ self.long_override_counter = 0
+ self.long_disabled_counter = 0
+ self.standstill_manager = MQBStandstillManager(CP.mass, self.CCP.ACCEL_MIN) if self.CCS == mqbcan else None
+ self.radar_handler = PQRadarHandler(self.CAN) if self.CCS is pqcan else None
+ self.blend_stock_radar = False
+ self.unavailable = False
+ self.unavailable_hold = 0
+ self.VM = VehicleModel(CP)
+ self.is_mqb_a0 = self._is_mqb_a0_car(CP.carFingerprint)
+ self.LateralController = (
+ LatControlCurvature(self.CCP.CURVATURE_PID, self.CCP.CURVATURE_LIMITS.CURVATURE_MAX, 1 / (DT_CTRL * self.CCP.STEER_STEP))
+ if (CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO))
+ else None
+ )
+
+ @staticmethod
+ def _is_mqb_a0_car(candidate) -> bool:
+ return candidate in MQB_A0_CARS
+
+ def _get_mqb_steering_torque_scale(self, v_ego: float, enabled: bool) -> float:
+ if enabled and self.CCS == mqbcan:
+ return float(np.interp(v_ego, [0.4, 3.5, 4.0], [0.8, 0.95, 1.0]))
+ return 1.0
+
+ def _mlb_acc_hud_text(self, hud_control, set_speed: float) -> int:
+ # ACC_02 primary display text, briefly surfaced on a follow distance or set speed change
+ if hud_control.leadDistanceBars != self.lead_distance_bars_last:
+ self.mlb_hud_text_frame = self.frame
+ self.mlb_hud_text = self.CCP.ACC_HUD_TEXT_DISTANCE.get(hud_control.leadDistanceBars, self.CCP.ACC_HUD_TEXTS["none"])
+ elif set_speed != self.mlb_set_speed_last and hud_control.speedVisible:
+ self.mlb_hud_text_frame = self.frame
+ self.mlb_hud_text = self.CCP.ACC_HUD_TEXTS["setSpeed"]
+ elif self.frame - self.mlb_hud_text_frame >= self.CCP.ACC_HUD_TEXT_STEP:
+ self.mlb_hud_text = self.CCP.ACC_HUD_TEXTS["none"]
+ self.mlb_set_speed_last = set_speed
+ return self.mlb_hud_text
+
+ def _should_spam_mqb_a0_resume(self, CS, enabled: bool) -> bool:
+ return bool(
+ enabled and
+ self.is_mqb_a0 and
+ self.CCS == mqbcan and
+ CS.out.standstill and
+ self.frame % 50 < 15
+ )
+
+ def update(self, CC, CC_IQ, CS, now_nanos):
+ actuators = CC.actuators
+ hud_control = CC.hudControl
+ can_sends = []
+ output_torque = 0
+ apply_torque = 0
+ pqhca5or7Toggle = self._params.get_bool("pqhca5or7Toggle")
+ eBrakeActive = self._params.get_bool("eBrakeActive")
+ iq_mqb_steering_lockout = self._params.get_bool("iqMqbSteeringLockout")
+ iq_mqb_acc_resume = self._params.get_bool("iqMqbAccResume")
+ self.blend_stock_radar = self._params.get_bool("IQDynamicBlendStockRadar")
+ if not self._pq_patch_checked:
+ self._pq_patch_checked = True
+ self.eps_timer_workaround = not self._params.get_bool("VwPqEpsPatched")
+ blend_active = bool(self.blend_stock_radar and self.radar_handler is not None and self.CP.openpilotLongitudinalControl)
+ AngleLateralControl = iq_lvbs_alc.angle_lateral_control_enabled(self, CS)
+ self.entering = CS.vw_iq_lvbs_alc_entering
+ self.active = CS.vw_iq_lvbs_alc_active
+
+ if hud_control.audibleAlert == AudibleAlert.refuse:
+ self.unavailable_hold = self.CCP.IQ_PQ_UNAVAILABLE_HUD_FRAMES
+ else:
+ self.unavailable_hold = max(0, self.unavailable_hold - 1)
+ self.unavailable = self.unavailable_hold > 0
+
+ CS.force_rhd_for_bsm = getattr(CC, "forceRHDForBSM", False)
+ CS.enable_predicative_speed_limit = getattr(CC.cruiseControl, "speedLimitPredicative", False)
+ CS.enable_pred_react_to_speed_limits = getattr(CC.cruiseControl, "speedLimitPredReactToSL", False)
+ CS.enable_pred_react_to_curves = getattr(CC.cruiseControl, "speedLimitPredReactToCurves", False)
+
+ if self.frame % self.CCP.STEER_STEP == 0:
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ if CC.latActive:
+ hca_enabled = True
+ if CC.curvatureControllerActive:
+ apply_curvature = self.LateralController.update(CS.out, CC, actuators.curvature)
+ apply_curvature = apply_curvature + (CS.out.steeringCurvature - (CC.currentCurvature - CC.rollCompensation))
+ else:
+ apply_curvature = actuators.curvature + (CS.out.steeringCurvature - CC.currentCurvature)
+ apply_curvature = apply_std_curvature_limits(apply_curvature, self.apply_curvature_last, CS.out.vEgoRaw, CS.out.steeringCurvature,
+ CS.out.steeringPressed, self.CCP.STEER_STEP, CC.latActive, self.CCP.CURVATURE_LIMITS)
+
+ min_power = max(self.steering_power_last - self.CCP.STEERING_POWER_STEP, self.CCP.STEERING_POWER_MIN)
+ max_power = min(self.steering_power_last + self.CCP.STEERING_POWER_STEP, self.CCP.STEERING_POWER_MAX)
+ target_power_driver = int(np.interp(CS.out.steeringTorque, [self.CCP.STEER_DRIVER_ALLOWANCE, self.CCP.STEER_DRIVER_MAX],
+ [self.CCP.STEERING_POWER_MAX, self.CCP.STEERING_POWER_MIN]))
+ target_power = int(np.interp(CS.out.vEgo, [0., 0.5], [self.CCP.STEERING_POWER_MIN, target_power_driver]))
+ steering_power = min(max(target_power, min_power), max_power)
+ else:
+ if self.LateralController is not None:
+ self.LateralController.reset()
+ if self.steering_power_last > 0:
+ hca_enabled = True
+ apply_curvature = np.clip(CS.out.steeringCurvature, -self.CCP.CURVATURE_LIMITS.CURVATURE_MAX, self.CCP.CURVATURE_LIMITS.CURVATURE_MAX)
+ steering_power = max(self.steering_power_last - self.CCP.STEERING_POWER_STEP, 0)
+ else:
+ hca_enabled = False
+ apply_curvature = 0.
+ steering_power = 0
+
+ can_sends.append(self.CCS.create_steering_control(self.packer_pt, self.CAN.pt, apply_curvature, hca_enabled, steering_power))
+ self.apply_curvature_last = apply_curvature
+ self.steering_power_last = steering_power
+ else:
+ if CC.latActive and not AngleLateralControl:
+ torque_scale = self._get_mqb_steering_torque_scale(CS.out.vEgo, iq_mqb_steering_lockout)
+ new_torque = int(round(actuators.torque * self.CCP.STEER_MAX * torque_scale))
+ apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.CCP)
+ self.hca_frame_timer_running += self.CCP.STEER_STEP
+ if self.apply_torque_last == apply_torque:
+ 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]
+ self.hca_frame_same_torque = 0
+ else:
+ self.hca_frame_same_torque = 0
+ hca_enabled = abs(apply_torque) > 0
+ if self.eps_timer_workaround and self.hca_frame_timer_running >= self.CCP.STEER_TIME_BM / DT_CTRL:
+ if abs(apply_torque) <= self.CCP.STEER_LOW_TORQUE:
+ self.hca_frame_low_torque += self.CCP.STEER_STEP
+ if self.hca_frame_low_torque >= self.CCP.STEER_TIME_LOW_TORQUE / DT_CTRL:
+ hca_enabled = False
+ else:
+ self.hca_frame_low_torque = 0
+ if self.hca_frame_timer_resetting > 0:
+ apply_torque = 0
+ else:
+ self.hca_frame_low_torque = 0
+ hca_enabled = False
+ apply_torque = 0
+
+ if hca_enabled:
+ output_torque = apply_torque
+ self.hca_frame_timer_resetting = 0
+ else:
+ output_torque = 0
+ self.hca_frame_timer_resetting += self.CCP.STEER_STEP
+ if self.hca_frame_timer_resetting >= self.CCP.STEER_TIME_RESET / DT_CTRL or not self.eps_timer_workaround:
+ self.hca_frame_timer_running = 0
+ apply_torque = 0
+
+ if hca_enabled and abs(apply_torque) > 0:
+ if pqhca5or7Toggle and (self.CP.flags & (VolkswagenFlags.PQ | VolkswagenFlags.MLB)):
+ self.HCA_Status = 7
+ else:
+ self.HCA_Status = 5
+ else:
+ self.HCA_Status = 3
+
+ self.eps_timer_soft_disable_alert = self.hca_frame_timer_running > self.CCP.STEER_TIME_ALERT / DT_CTRL
+ self.apply_torque_last = apply_torque
+ if not (AngleLateralControl and self.CCS in (mqbcan, pqcan, mlbcan)):
+ can_sends.append(self.CCS.create_hca_steering_control(self.packer_pt, self._pt_tx_bus, output_torque, self.HCA_Status))
+
+ if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT and self.CCS == mqbcan:
+ ea_simulated_torque = float(np.clip(apply_torque * 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, self.CAN.cam, CS.eps_stock_values, ea_simulated_torque))
+
+ iq_lvbs_alc.update_vw_alc(self, CC, CS, actuators, can_sends, apply_torque)
+ if self.frame % self.CCP.STEER_STEP == 0:
+ iq_lvbs_alc.append_private_apd(self, CC_IQ, can_sends)
+
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) and self.CP.flags & VolkswagenFlags.STOCK_KLR_PRESENT:
+ if CS.klr_stock_values:
+ klr_send_ready = CS.klr_stock_values["COUNTER"] != self.klr_counter_last
+ if klr_send_ready:
+ can_sends.append(mebcan.create_capacitive_wheel_touch(self.packer_pt, self.CAN.cam, CC.latActive, CS.klr_stock_values))
+ can_sends.append(mebcan.create_capacitive_wheel_touch(self.packer_pt, self.CAN.pt, CC.latActive, CS.klr_stock_values))
+ self.klr_counter_last = CS.klr_stock_values["COUNTER"]
+
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ if self.frame % 2 == 0:
+ blinker_active = CS.left_blinker_active or CS.right_blinker_active
+ left_blinker = CC.leftBlinker if not blinker_active else False
+ right_blinker = CC.rightBlinker if not blinker_active else False
+ can_sends.append(self.CCS.create_blinker_control(self.packer_pt, self.CAN.pt, CS.ea_hud_stock_values, CS.ea_control_stock_values,
+ left_blinker, right_blinker, self.hide_ea_error))
+
+ if self.CP.openpilotLongitudinalControl and self.CCS in (mqbcan, mlbcan) and not self.acc_counter_seeded and CS.acc_stock_counters:
+ seed_msgs = ("ACC_01", "ACC_02") if self.CCS is mlbcan else ("ACC_02", "ACC_06", "ACC_07", "ACC_10")
+ for name in seed_msgs:
+ addr = self.packer_pt.dbc.name_to_msg[name].address
+ self.packer_pt.counters[addr] = (CS.acc_stock_counters[name] + 1) % 16
+ self.acc_counter_seeded = True
+
+ if self.frame % self.CCP.ACC_CONTROL_STEP == 0 and self.CP.openpilotLongitudinalControl and not CS.out.radarDisableFailed:
+ stopping = actuators.longControlState == LongCtrlState.stopping
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < 0.25)
+ accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if CC.enabled else 0)
+
+ long_override = CC.cruiseControl.override or CS.out.gasPressed
+ self.long_override_counter = min(self.long_override_counter + 1, 5) if long_override else 0
+ long_override_begin = long_override and self.long_override_counter < 5
+
+ self.long_disabled_counter = min(self.long_disabled_counter + 1, 5) if not CC.enabled else 0
+ long_disabling = not CC.enabled and self.long_disabled_counter < 5
+
+ critical_state = hud_control.visualAlert == VisualAlert.fcw
+ if CC.longComfortMode and self.long_jerk_control is not None and self.long_limit_control is not None:
+ self.long_jerk_control.update(CC.enabled, long_override, hud_control.leadDistance, hud_control.leadVisible, accel, critical_state)
+ self.long_limit_control.update(CC.enabled, CS.out.vEgoRaw, hud_control.setSpeed, hud_control.leadDistance, hud_control.leadVisible, critical_state)
+
+ acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.enabled, long_override)
+ acc_hold_type = self.CCS.acc_hold_type(CS.out.cruiseState.available, CS.out.accFaulted, CC.enabled, starting, stopping,
+ CS.esp_hold_confirmation, long_override, long_override_begin, long_disabling)
+ can_sends.extend(self.CCS.create_acc_accel_control(
+ self.packer_pt, self.CAN.pt, self.CP, CS.acc_type, CC.enabled,
+ self.long_jerk_control.get_jerk_up() if CC.longComfortMode and self.long_jerk_control is not None else 4.0,
+ self.long_jerk_control.get_jerk_down() if CC.longComfortMode and self.long_jerk_control is not None else 4.0,
+ self.long_limit_control.get_upper_limit() if CC.longComfortMode and self.long_limit_control is not None else 0.,
+ self.long_limit_control.get_lower_limit() if CC.longComfortMode and self.long_limit_control is not None else 0.,
+ accel, acc_control, acc_hold_type, stopping, starting, CS.esp_hold_confirmation,
+ CS.out.vEgoRaw * CV.MS_TO_KPH, long_override, CS.travel_assist_available,
+ ))
+ self.accel_last = accel
+ else:
+ stopping = actuators.longControlState == LongCtrlState.stopping
+ starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < 0.25)
+ long_active = CC.longActive
+ accel = actuators.accel
+ esp_starting_override = None
+ esp_stopping_override = None
+
+ if self.CCS == mqbcan and CS.acc_type == 1 and self.standstill_manager is not None:
+ pitch = CC.orientationNED[1] if len(CC.orientationNED) == 3 else 0.0
+ long_active, accel, stopping, starting, esp_starting_override, esp_stopping_override = self.standstill_manager.update(
+ CS, long_active, accel, stopping, starting, float(getattr(actuators, "speed", 0.0)),
+ pitch, CS.tsk_brake_torque,
+ )
+
+ acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, long_active, CC.cruiseControl.override, CS.out.accFaulted)
+ accel = float(np.clip(accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if (long_active or CC.cruiseControl.override) else 0)
+ self.long_jerklimit = float(interp(accel, [-1.5, -0.3, 0.05], [2.0, 0.52, 0.30]))
+ self.long_deviation = float(interp(accel, [-0.3, 0.1], [0.0, 0.20]))
+ self.accel_last = accel
+
+ if blend_active and getattr(CC_IQ, "useRadarAccel", False) and CS.acc_radar_sta_adr == 1 and not self.radar_handler.failed:
+ accel = float(np.clip(CS.acc_radar_sollbeschl, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX))
+ self.long_jerklimit = CS.acc_radar_aendgrad
+ self.long_deviation = CS.acc_radar_regelabw
+ self.accel_last = accel
+
+ if self.CCS == mqbcan:
+ can_sends.extend(self.CCS.create_acc_accel_control(
+ self.packer_pt, self.CAN.pt, CS.acc_type, accel, acc_control, stopping, starting, CS.esp_hold_confirmation,
+ self.long_deviation, self.long_jerklimit, eBrakeActive,
+ esp_starting_override=esp_starting_override, esp_stopping_override=esp_stopping_override,
+ ))
+ elif self.CCS == mlbcan:
+ can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, self.CAN.pt, accel, acc_control, stopping))
+ else:
+ accel = apply_pq_stopping_accel(self.CP.carFingerprint, accel, stopping)
+
+ sng_ecd_enabled = bool(self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_SNG_ECD)
+ low_speed = CS.out.vEgo <= self.CCP.SNG_HANDOFF_SPEED
+ if sng_ecd_enabled and long_active and low_speed and accel <= 0.05 and not starting:
+ self.sng_handoff_active = True
+ else:
+ self.sng_handoff_active = False
+ sng_decel_req = float(np.clip(accel, self.CCP.ACCEL_MIN, self.CCP.SNG_HOLD_DECEL_MAX)) if self.sng_handoff_active else 0.0
+
+ can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, self.CAN.pt, CS.acc_type, accel, acc_control, stopping and not self.motor3_resuming, starting, CS.esp_hold_confirmation, self.long_deviation, self.long_jerklimit, eBrakeActive, sng_active=self.sng_handoff_active))
+ if sng_ecd_enabled:
+ can_sends.append(self.CCS.create_sng_handoff_control(self.packer_pt, self.CAN.aux, self.sng_handoff_active, sng_decel_req))
+
+ if (self.CP.flags & VolkswagenFlags.DISABLE_RADAR) and self.CP.openpilotLongitudinalControl and not CS.out.radarDisableFailed:
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ if self.radar_disabled_warning_timer < 600:
+ self.radar_disabled_warning_timer += 1
+ else:
+ self.hide_ea_error = True
+
+ if self.frame % self.CCP.AEB_CONTROL_STEP == 0:
+ can_sends.append(make_tester_present_msg(0x700, self.CAN.pt, suppress_response=True))
+ can_sends.append(self.CCS.create_aeb_control(self.packer_pt, self.CAN.pt, self.CP))
+
+ if self.frame % self.CCP.AEB_HUD_STEP == 0 and self._has_aeb_hud_msg:
+ can_sends.append(self.CCS.create_aeb_hud(self.packer_pt, self.CAN.pt, self.radar_disabled_warning_timer < 600))
+
+ if self.frame % 4 == 0:
+ can_sends.append(self.CCS.create_radar_objects(self.packer_pt, self.CAN.pt))
+
+ if self.frame % self.CCP.LDW_STEP == 0:
+ hud_alert = 0
+ if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) or CS.out.steerFaultTemporary:
+ hud_alert = self.CCP.LDW_MESSAGES["laneAssistTakeOver"]
+ steering_pressed_hud = (self.frame // 2) % 2 == 0 if self.entering else CS.out.steeringPressed
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ disable_alerts = getattr(CC, "disableCarSteerAlerts", False)
+ sound_alert = self.CCP.LDW_SOUNDS["Chime"] if hud_alert != 0 and not disable_alerts else self.CCP.LDW_SOUNDS["None"]
+ can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, self.CAN.pt, CS.ldw_stock_values, CC.latActive, CS.out.steeringPressed,
+ hud_alert, hud_control, sound_alert))
+ else:
+ can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, self._pt_tx_bus, CS.ldw_stock_values, CC.latActive, steering_pressed_hud,
+ hud_alert, hud_control, self.entering, self.CCS is pqcan and AngleLateralControl, self.active))
+
+ if hud_control.leadDistanceBars != self.lead_distance_bars_last:
+ self.distance_bar_frame = self.frame
+
+ if self.frame % self.CCP.ACC_HUD_STEP == 0 and self.CP.openpilotLongitudinalControl:
+ fcw_alert = hud_control.visualAlert == VisualAlert.fcw
+ d_unresponsive = hud_control.driverUnresponsive
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ show_distance_bars = self.frame - self.distance_bar_frame < 400
+ gap = max(8, CS.out.vEgo * hud_control.leadFollowTime)
+ distance = max(8, hud_control.leadDistance) if hud_control.leadDistance != 0 else 0
+ acc_hud_status = self.CCS.acc_hud_status_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.enabled,
+ CC.cruiseControl.override or CS.out.gasPressed)
+
+ sl_predicative_active = CC.cruiseControl.speedLimitPredicative and CS.out.cruiseState.speedLimitPredicative != 0
+ if CC.cruiseControl.speedLimit and CS.out.cruiseState.speedLimit != 0 and self.speed_limit_last != CS.out.cruiseState.speedLimit:
+ self.speed_limit_changed_timer = self.frame
+ self.speed_limit_last = CS.out.cruiseState.speedLimit
+ sl_active = self.frame - self.speed_limit_changed_timer < 400
+ speed_limit = CS.out.cruiseState.speedLimitPredicative if sl_predicative_active else (CS.out.cruiseState.speedLimit if sl_active else 0)
+
+ acc_hud_event = self.CCS.acc_hud_event(acc_hud_status, CS.esp_hold_confirmation, sl_predicative_active,
+ CS.speed_limit_predicative_type, sl_active)
+
+ can_sends.append(self.CCS.create_acc_hud_control(self.packer_pt, self.CAN.pt, acc_hud_status, hud_control.setSpeed * CV.MS_TO_KPH,
+ hud_control.leadVisible, hud_control.leadDistanceBars + 1, show_distance_bars,
+ CS.esp_hold_confirmation, distance, gap, fcw_alert, acc_hud_event, speed_limit))
+ else:
+ leadDistance = min(8, hud_control.leadDistance) if hud_control.leadDistance != 0 else 0
+ self.leadDistanceBars = min(3, hud_control.leadDistanceBars)
+ acc_hud_status = self.CCS.acc_hud_status_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.longActive, CC.cruiseControl.override)
+ set_speed = hud_control.setSpeed * CV.MS_TO_KPH
+ decel = dVisual(self.CCS, CS)
+ hud_kwargs = {"hud_text": self._mlb_acc_hud_text(hud_control, set_speed)} if self.CCS is mlbcan else {}
+ can_sends.append(self.CCS.create_acc_hud_control(self.packer_pt, self.CAN.pt, acc_hud_status, set_speed, leadDistance,
+ self.leadDistanceBars, fcw_alert, hud_control.leadVisible, self.unavailable,
+ decel, d_unresponsive, **hud_kwargs))
+
+ if self.CP.flags & VolkswagenFlags.PQ:
+ iq_lvbs_commander.update_turn_signals(self, CC, CS, can_sends)
+
+ if self.CP.openpilotLongitudinalControl and (self.CP.flags & VolkswagenFlags.PQ):
+ if blend_active:
+ can_sends.extend(self.radar_handler.update(
+ self.packer_pt, self.frame, CS,
+ blend_active=True,
+ engage_req=getattr(CC_IQ, "radarEngageReq", False),
+ cancel_req=getattr(CC_IQ, "radarCancelReq", False),
+ set_speed_kph=getattr(CC_IQ, "radarSetSpeedKph", 0.0),
+ gap_bars=getattr(CC_IQ, "radarGapBars", 0),
+ v_ego=CS.out.vEgo,
+ ))
+ elif self.frame % 2 == 0:
+ can_sends.append(self.CCS.filter_motor2(self.packer_pt, self.CAN.ext, CS.motor2_stock))
+ can_sends.append(self.CCS.filter_motor5(self.packer_pt, self.CAN.ext, CS.motor5_stock))
+
+ gra_send_ready = self.CP.pcmCruise and CS.gra_stock_values["COUNTER"] != self.gra_acc_counter_last
+ if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ main_cruise_latching = not bool(CS.gra_stock_values["GRA_Typ_Hauptschalter"])
+ stock_cancel_pressed = bool(CS.gra_stock_values["GRA_Abbrechen"] if main_cruise_latching else CS.gra_stock_values["GRA_Hauptschalter"])
+ elif self.CP.flags & VolkswagenFlags.MLB:
+ stock_cancel_pressed = bool(CS.gra_stock_values["LS_Abbrechen"])
+ else:
+ stock_cancel_pressed = bool(CS.gra_stock_values["GRA_Abbrechen"])
+
+ cancel_cmd = stock_cancel_pressed or CC.cruiseControl.cancel
+ resume_cmd = CC.cruiseControl.resume or self._should_spam_mqb_a0_resume(CS, iq_mqb_acc_resume)
+ if gra_send_ready and (cancel_cmd or resume_cmd):
+ bus_send = self.CAN.aux if self.CP.flags & VolkswagenFlags.PQ else self.CAN.ext
+ can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, bus_send, CS.gra_stock_values,
+ cancel=cancel_cmd, resume=resume_cmd))
+
+ if self.CP.openpilotLongitudinalControl and self.CCS == pqcan and not blend_active:
+ if self.frame % 3:
+ can_sends.append(self.CCS.create_gra_neu(self.packer_pt, self.CAN.ext, CS.gra_stock_values, CC.longActive))
+
+ if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB:
+ is_stopping = actuators.longControlState == LongCtrlState.stopping
+ if CS.out.vEgo > 0.5 or not CC.longActive:
+ self.motor3_resuming = False
+ elif (self.motor3_was_stopping and not is_stopping and self.CP.openpilotLongitudinalControl and CC.longActive):
+ self.motor3_resuming = True
+ if self.motor3_resuming and CS.motor3_stock:
+ can_sends.append(self.CCS.create_motor3_resume(self.packer_pt, self.CAN.aux, CS.motor1_stock, CS.motor3_stock, resume=True))
+ self.motor3_was_stopping = is_stopping
+
+ new_actuators = actuators.as_builder()
+ new_actuators.torque = self.apply_torque_last / self.CCP.STEER_MAX
+ new_actuators.torqueOutputCan = self.apply_torque_last
+ if self.CP.steerControlType == structs.CarParams.SteerControlType.angle:
+ new_actuators.steeringAngleDeg = float(self.apply_angle_last)
+ new_actuators.curvature = float(self.apply_curvature_last)
+ new_actuators.accel = self.accel_last
+ new_actuators.speed = float(getattr(actuators, "speed", 0.0))
+
+ self.lead_distance_bars_last = hud_control.leadDistanceBars
+ self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"]
+ self.motor3_frame_last = CS.motor3_frame
+ self.frame += 1
+ return new_actuators, can_sends
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/carstate.py b/iqdbc_repo/iqdbc/car/volkswagen/carstate.py
new file mode 100644
index 000000000..d4a44e985
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/carstate.py
@@ -0,0 +1,872 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import sys
+import os
+import math
+import time
+from iqdbc.can import CANParser
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.volkswagen.values import CAR, DBC, CanBus, NetworkLocation, RADAR_DISABLE_STATE, TransmissionType, GearShifter, \
+ CarControllerParams, VolkswagenFlags, VolkswagenFlagsIQ
+from iqdbc.car.volkswagen.speed_limit_manager import SpeedLimitManager
+from openpilot.system.proprietary_runtime._verified_import import import_verified_module
+
+iq_lvbs_alc = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.alc")
+vehicle_state = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.vehicle_state")
+
+iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..')
+sys.path.insert(0, iqpilot_path)
+try:
+ from openpilot.common.params import Params
+except ImportError:
+ pass
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+
+class CarState(CarStateBase):
+ CRUISE_FAULT_LATERAL_ENABLE_FRAMES = 5
+ CRUISE_FAULT_LATERAL_DISABLE_FRAMES = 20
+ MEB_TEMP_CRUISE_FAULT = 6
+ MEB_TOLERANCE_MAX = 100
+
+ def __init__(self, CP, CP_IQ):
+ super().__init__(CP, CP_IQ)
+ self._params = Params()
+ self.frame = 0
+ self.eps_init_complete = False
+ self.CCP = CarControllerParams(CP)
+ self.button_states = {button.event_type: False for button in self.CCP.BUTTONS}
+ self.esp_hold_confirmation = False
+ self.upscale_lead_car_signal = False
+ self.eps_stock_values = False
+ self.curvature = 0.
+ self.klr_stock_values = {}
+ self.ea_hud_stock_values = {}
+ self.ea_control_stock_values = {}
+ self.acc_type = 0
+ self.acc_radar_sollbeschl = 0.0
+ self.acc_radar_regelabw = 0.0
+ self.acc_radar_aendgrad = 0.0
+ self.acc_radar_sta_adr = 0
+ self.acc_radar_fehler = False
+ self.acc_radar_v_wunsch = 0.0
+ self.acc_radar_sta_acc = 0
+ self.epb_freigabe_ver = False
+ self.acc_stock_counters: dict[str, int] = {}
+ self.esp_stopping = False
+ self.tsk_brake_torque = 0.0
+ self.last_cruiseActive = False
+ self.cruise_faulted_frames = 0
+ self.cruise_fault_clear_frames = 0
+ self.cruise_fault_lateral_active = False
+ self.cruise_faulted = False
+ self.grade = 0.0
+ self.rolling_backward = False
+ self.rolling_forward = False
+ self.sum_wegimpulse = 0
+ self.speed_limit_mgr = SpeedLimitManager(CP)
+ self.enable_predicative_speed_limit = False
+ self.enable_speed_limit_predicative = False
+ self.enable_pred_react_to_speed_limits = False
+ self.enable_pred_react_to_curves = False
+ self.speed_limit_predicative_type = 0
+ self.force_rhd_for_bsm = False
+ self.grade = 0.0
+ self.rolling_backward = False
+ self.rolling_forward = False
+ self.sum_wegimpulse = 0
+ self.travel_assist_available = False
+ self.left_blinker_active = False
+ self.right_blinker_active = False
+ self._param_update_time = 0.0
+ self.cruise_recovery_timer = 0
+ self.tolerance_counter = self.MEB_TOLERANCE_MAX
+ self.lkas_button = 0
+ self.prev_lkas_button = 0
+ self.vw_iq_lvbs_alc_available = False
+ self.vw_iq_lvbs_alc_entering = False
+ self.vw_iq_lvbs_alc_active = False
+ self.vw_iq_lvbs_alc_key_slot = 0
+ self.EPS_ALC_Status = 0
+ self.EPS_ALC_Abbruch = 0
+ self.PQ_ALC_Status_raw = 0
+ self.alcOverrideAlert = False
+ self.bremse8_stock = None
+ self.br8_acc_anf = False
+ self.tsk_verzoeg_anf = False
+ self.cruise_main_switch = False
+ self.motor3_stock = {}
+ self.motor1_stock = {}
+ self.motor3_frame = 0
+ self.motor1_frame = 0
+ self._odometer_store = vehicle_state.VehicleOdometerStore(CP, self._params)
+
+ def _update_odometer(self, ret: structs.CarState, raw_km: float) -> None:
+ """Publish the cluster value while proprietary Konn3kt code owns persistence."""
+ odometer_km = self._odometer_store.record(raw_km)
+ if odometer_km is not None:
+ ret.odometer = odometer_km
+
+ def _apply_iq_private_flags(self, ret_iq: structs.IQCarState) -> None:
+ ret_iq.alcOverrideAlert = bool(self.alcOverrideAlert)
+
+ def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]):
+ if not self.CP.pcmCruise:
+ if self.cruise_fault_lateral_active and self.cruise_faulted:
+ return False
+ for b in buttonEvents:
+ # Enable OP long on falling edge of enable buttons
+ if b.type in (ButtonType.setCruise, ButtonType.resumeCruise) and not b.pressed:
+ return True
+ return False
+
+ def create_button_events(self, pt_cp, buttons):
+ button_events = []
+
+ for button in buttons:
+ state = pt_cp.vl[button.can_addr][button.can_msg] in button.values
+ if self.button_states[button.event_type] != state:
+ event = structs.CarState.ButtonEvent()
+ event.type = button.event_type
+ event.pressed = state
+ button_events.append(event)
+ self.button_states[button.event_type] = state
+
+ return button_events
+
+ def _update_mqb_iq_alc_state(self, pt_cp):
+ iq_lvbs_alc.update_mqb_carstate_alc_state(self, pt_cp)
+
+ def _update_mlb_iq_alc_state(self, pt_cp):
+ iq_lvbs_alc.update_mlb_carstate_alc_state(self, pt_cp)
+
+ def _update_pq_iq_alc_state(self, pt_cp):
+ iq_lvbs_alc.update_pq_carstate_alc_state(self, pt_cp)
+
+ def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]:
+ pt_cp = can_parsers[Bus.pt]
+ cam_cp = can_parsers[Bus.cam]
+ ext_cp = pt_cp if self.CP.networkLocation == NetworkLocation.fwdCamera else cam_cp
+
+ if self.CP.flags & VolkswagenFlags.PQ:
+ aux_cp = can_parsers.get(Bus.aux)
+ return self.update_pq(pt_cp, cam_cp, ext_cp, aux_cp)
+ elif self.CP.flags & VolkswagenFlags.MLB:
+ br_cp = can_parsers[Bus.aux]
+ return self.update_mlb(pt_cp, br_cp, cam_cp, ext_cp)
+ elif self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ main_cp = can_parsers[Bus.main]
+ return self.update_meb(pt_cp, main_cp, cam_cp, ext_cp)
+
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ 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:
+ 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
+ if self.CP.flags & VolkswagenFlags.KOMBI_PRESENT:
+ self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) # Analog v digital instrument cluster
+
+ self.parse_wheel_speeds(ret,
+ 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"],
+ )
+
+ self.rolling_backward = (
+ pt_cp.vl["ESP_10"]["ESP_HR_Fahrtrichtung"] == 1 or
+ pt_cp.vl["ESP_10"]["ESP_HL_Fahrtrichtung"] == 1 or
+ pt_cp.vl["ESP_10"]["ESP_VR_Fahrtrichtung"] == 1 or
+ pt_cp.vl["ESP_10"]["ESP_VL_Fahrtrichtung"] == 1
+ )
+ self.rolling_forward = (
+ pt_cp.vl["ESP_10"]["ESP_HR_Fahrtrichtung"] == 0 or
+ pt_cp.vl["ESP_10"]["ESP_HL_Fahrtrichtung"] == 0 or
+ pt_cp.vl["ESP_10"]["ESP_VR_Fahrtrichtung"] == 0 or
+ pt_cp.vl["ESP_10"]["ESP_VL_Fahrtrichtung"] == 0
+ )
+ self.sum_wegimpulse = int(
+ pt_cp.vl["ESP_10"]["ESP_Wegimpuls_VL"] +
+ pt_cp.vl["ESP_10"]["ESP_Wegimpuls_VR"] +
+ pt_cp.vl["ESP_10"]["ESP_Wegimpuls_HL"] +
+ pt_cp.vl["ESP_10"]["ESP_Wegimpuls_HR"]
+ )
+
+ 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
+
+ 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"])
+
+ if not (self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR):
+ 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"])
+ else:
+ ret.stockFcw = False
+ ret.stockAeb = False
+
+ cc_only = self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY or self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR
+ self.acc_type = 0 if cc_only else ext_cp.vl["ACC_06"]["ACC_Typ"]
+ if not cc_only:
+ self.acc_stock_counters["ACC_02"] = int(ext_cp.vl["ACC_02"]["COUNTER"])
+ self.acc_stock_counters["ACC_06"] = int(ext_cp.vl["ACC_06"]["COUNTER"])
+ self.acc_stock_counters["ACC_07"] = int(ext_cp.vl["ACC_07"]["COUNTER"])
+ self.acc_stock_counters["ACC_10"] = int(ext_cp.vl["ACC_10"]["COUNTER"])
+ self.esp_stopping = bool(pt_cp.vl["ESP_21"]["ESP_Anhaltevorgang_ACC_aktiv"])
+ self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"])
+ self.tsk_brake_torque = pt_cp.vl["TSK_06"]["TSK_Radbremsmom"] if pt_cp.vl["TSK_06"]["TSK_Freig_Verzoeg_Anf"] else 0.0
+ self.grade = pt_cp.vl["Motor_16"]["TSK_Steigung"]
+ acc_limiter_mode = False if cc_only else ext_cp.vl["ACC_02"]["ACC_Gesetzte_Zeitluecke"] == 0
+ speed_limiter_mode = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"])
+ self.tsk_verzoeg_anf = bool(pt_cp.vl["TSK_06"]["TSK_Freig_Verzoeg_Anf"])
+
+ self._update_mqb_iq_alc_state(pt_cp)
+
+ 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 = 0 if cc_only else 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
+ ret.vEgoCluster = pt_cp.vl["Kombi_01"]["KBI_angez_Geschw"] * CV.KPH_TO_MS
+
+ if ret.cruiseState.speed > 0 and ret.vEgo > 1.0:
+ cluster_ratio = ret.vEgoCluster / ret.vEgo
+ ret.cruiseState.speedCluster = ret.cruiseState.speed * cluster_ratio
+
+ self.parse_mlb_mqb_steering_state(ret, pt_cp)
+
+ ret.gasPressed = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] > 0
+ ret.espActive = bool(pt_cp.vl["ESP_21"]["ESP_Eingriff"])
+ ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0
+ 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
+
+ self.eps_stock_values = pt_cp.vl["LH_EPS_03"]
+ 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"]
+
+ ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS)
+
+ ret.lowSpeedAlert = self.update_low_speed_alert(ret.vEgo)
+ allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled")
+ cruise_main_switch = bool(self.gra_stock_values["GRA_Hauptschalter"])
+ ret.cruiseFaultLateralMode = allow_lat_only and ret.accFaulted and cruise_main_switch
+ ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode
+ ret.blockPcmEnable = ret.cruiseFaultLateralMode
+
+ ret.fuelGauge = pt_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] / 55.0
+ ret.fuelTankLevelL = pt_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] # raw liters for konn3kt
+ self._update_odometer(ret, pt_cp.vl["Kombi_02"]["KBI_Kilometerstand"])
+
+ self.cruise_faulted = ret.accFaulted
+ self._apply_iq_private_flags(ret_iq)
+ self.frame += 1
+ return ret, ret_iq
+
+ def update_meb(self, pt_cp, main_cp, cam_cp, ext_cp) -> tuple[structs.CarState, structs.IQCarState]:
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ if time.monotonic() - self._param_update_time > 2.0:
+ self.enable_speed_limit_predicative = self._params.get_bool("EnableSpeedLimitPredicative")
+ self.enable_pred_react_to_speed_limits = self._params.get_bool("EnableSLPredReactToSL")
+ self.enable_pred_react_to_curves = self._params.get_bool("EnableSLPredReactToCurves")
+ self._param_update_time = time.monotonic()
+
+ self.parse_wheel_speeds(ret,
+ pt_cp.vl["ESC_51"]["VL_Radgeschw"],
+ pt_cp.vl["ESC_51"]["VR_Radgeschw"],
+ pt_cp.vl["ESC_51"]["HL_Radgeschw"],
+ pt_cp.vl["ESC_51"]["HR_Radgeschw"],
+ )
+
+ if self.CP.flags & VolkswagenFlags.KOMBI_PRESENT:
+ ret.vEgoCluster = pt_cp.vl["Kombi_01"]["KBI_angez_Geschw"] * CV.KPH_TO_MS
+ ret.standstill = ret.vEgoRaw == 0
+
+ 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
+
+ self.curvature = -pt_cp.vl["QFK_01"]["Curvature"] * (1, -1)[int(pt_cp.vl["QFK_01"]["Curvature_VZ"])]
+ ret.steeringCurvature = self.curvature
+ ret.yawRate = -pt_cp.vl["ESC_50"]["Yaw_Rate"] * (1, -1)[int(pt_cp.vl["ESC_50"]["Yaw_Rate_Sign"])] * CV.DEG_TO_RAD
+
+ if self.CP.flags & VolkswagenFlags.ALT_GEAR:
+ gear_raw = pt_cp.vl["Gateway_73"]["GE_Fahrstufe"]
+ else:
+ gear_raw = pt_cp.vl["Getriebe_11"]["GE_Fahrstufe"]
+ ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(gear_raw, None))
+ drive_mode = ret.gearShifter == GearShifter.drive
+
+ hca_status = self.CCP.hca_status_values.get(pt_cp.vl["QFK_01"]["LatCon_HCA_Status"])
+ ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status, drive_mode=drive_mode)
+
+ self.eps_stock_values = pt_cp.vl["LH_EPS_03"]
+ self.klr_stock_values = pt_cp.vl["KLR_01"] if self.CP.flags & VolkswagenFlags.STOCK_KLR_PRESENT else {}
+ self.ea_hud_stock_values = cam_cp.vl["EA_02"]
+ self.ea_control_stock_values = cam_cp.vl["EA_01"]
+ ret.carFaultedNonCritical = cam_cp.vl["EA_01"]["EA_Funktionsstatus"] in (3, 4, 5, 6)
+
+ ret.gasPressed = pt_cp.vl["Motor_51"]["Accel_Pedal_Pressure"] > 0 # Motor_54 has unreliable offset on MQBevo
+ ret.brakePressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"])
+ ret.brake = pt_cp.vl["ESC_51"]["Brake_Pressure"]
+
+ ret.parkingBrake = pt_cp.vl["ESC_50"]["EPB_Status"] in (1, 4)
+
+ doors = pt_cp.vl["ZV_02"] if bool(pt_cp.vl["Gateway_72"]["ZV_02_alt"]) else pt_cp.vl["Gateway_72"]
+ ret.doorOpen = any([doors["ZV_FT_offen"],
+ doors["ZV_BT_offen"],
+ doors["ZV_HFS_offen"],
+ doors["ZV_HBFS_offen"],
+ doors["ZV_HD_offen"]])
+
+ ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3
+
+ if self.CP.enableBsm:
+ bsm_bus = pt_cp if self.CP.flags & (VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO) else ext_cp
+ blindspot_driver = bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Info_Driver"]) or bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Warn_Driver"])
+ blindspot_passenger = bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Info_Passenger"]) or bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Warn_Passenger"])
+ force_rhd = self.force_rhd_for_bsm or self._params.get_bool("ForceRHDForBSM")
+ car_is_lhd = not force_rhd
+ ret.leftBlindspot = blindspot_driver if car_is_lhd else blindspot_passenger
+ ret.rightBlindspot = blindspot_passenger if car_is_lhd else blindspot_driver
+
+ self.ldw_stock_values = cam_cp.vl["LDW_02"]
+
+ awv_values = ext_cp.vl.get("AWV_03", ext_cp.vl.get("ACC_10", {}))
+ ret.stockFcw = bool(awv_values.get("FCW_Active", 0)) or bool(awv_values.get("AWV2_Freigabe", 0))
+ ret.stockAeb = False
+
+ self.acc_type = ext_cp.vl["ACC_18"]["ACC_Typ"]
+ self.travel_assist_available = bool(pt_cp.vl.get("TA_01", {}).get("Travel_Assist_Available", 0))
+
+ ret.cruiseState.available = pt_cp.vl["Motor_51"]["TSK_Status"] in (2, 3, 4, 5)
+ ret.cruiseState.enabled = pt_cp.vl["Motor_51"]["TSK_Status"] in (3, 4, 5)
+ # TSK winds its braking down through brake_only after a driver brake. Requesting drive-off in this
+ # state can fault TSK, and stock refuses to engage here as well, so block entry until it clears.
+ ret.carNotReady = pt_cp.vl["Motor_51"]["TSK_Status"] == 5 # brake_only
+ acc_values = ext_cp.vl.get("MEB_ACC_01", ext_cp.vl.get("ACC_19", {}))
+ ret.cruiseState.nonAdaptive = bool(acc_values.get("ACC_Limiter_Mode", 0)) if self.CP.pcmCruise else bool(pt_cp.vl["Motor_51"]["TSK_Limiter_ausgewaehlt"])
+
+ acc_faulted = pt_cp.vl["Motor_51"]["TSK_Status"] in (6, 7)
+ ret.accFaulted = self.update_acc_fault(acc_faulted, parking_brake=ret.parkingBrake, drive_mode=drive_mode)
+
+ if self.CP.flags & VolkswagenFlags.MQB_EVO:
+ self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"])
+ else:
+ self.esp_hold_confirmation = pt_cp.vl["ESC_50"]["Motion_State"] == 3
+ ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation
+
+ if self.CP.pcmCruise:
+ ret.cruiseState.speed = float(int(round(acc_values.get("ACC_Wunschgeschw_02", 0)))) * CV.KPH_TO_MS
+ if ret.cruiseState.speed > 90:
+ ret.cruiseState.speed = 0
+
+ if ret.cruiseState.speed > 0 and ret.vEgo > 1.0 and ret.vEgoCluster > 0:
+ cluster_ratio = ret.vEgoCluster / ret.vEgo
+ ret.cruiseState.speedCluster = ret.cruiseState.speed * cluster_ratio
+
+ raining = pt_cp.vl["RLS_01"]["RS_Regenmenge"] > 0
+ vze_01_values = cam_cp.vl.get("MEB_VZE_01", cam_cp.vl.get("VZE_04", {}))
+ psd_04_values = main_cp.vl["PSD_04"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {}
+ psd_05_values = main_cp.vl["PSD_05"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {}
+ psd_06_values = main_cp.vl["PSD_06"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {}
+ psd_06_values = pt_cp.vl["PSD_06"] if not psd_06_values and self.CP.flags & VolkswagenFlags.STOCK_PSD_06_PRESENT else psd_06_values
+ diagnose_01_values = pt_cp.vl["Diagnose_01"] if self.CP.flags & VolkswagenFlags.STOCK_DIAGNOSE_01_PRESENT else {}
+ self._update_odometer(ret, pt_cp.vl["Diagnose_01"]["KBI_Kilometerstand"])
+
+ if self.enable_speed_limit_predicative and not self.enable_predicative_speed_limit:
+ self.enable_predicative_speed_limit = True
+ self.speed_limit_mgr.enable_predicative_speed_limit(self.enable_predicative_speed_limit, self.enable_pred_react_to_speed_limits, self.enable_pred_react_to_curves)
+ self.speed_limit_mgr.update(ret.vEgo, psd_04_values, psd_05_values, psd_06_values, vze_01_values, raining, diagnose_01_values)
+ ret.cruiseState.speedLimit = self.speed_limit_mgr.get_speed_limit()
+ ret.cruiseState.speedLimitPredicative = self.speed_limit_mgr.get_speed_limit_predicative()
+ self.speed_limit_predicative_type = self.speed_limit_mgr.get_speed_limit_predicative_type()
+ ret_iq.speedLimit = ret.cruiseState.speedLimit
+
+ self.left_blinker_active = bool(pt_cp.vl["Blinkmodi_02"]["BM_links"])
+ self.right_blinker_active = bool(pt_cp.vl["Blinkmodi_02"]["BM_rechts"])
+ stalk_values = pt_cp.vl.get("SMLS_01", {})
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(240, stalk_values.get("BH_Blinker_li", 0), stalk_values.get("BH_Blinker_re", 0))
+
+ main_cruise_latching = not bool(pt_cp.vl["GRA_ACC_01"]["GRA_Typ_Hauptschalter"])
+ buttons = getattr(self.CCP, "BUTTONS_ALT", self.CCP.BUTTONS) if main_cruise_latching else self.CCP.BUTTONS
+ ret.buttonEvents = self.create_button_events(pt_cp, buttons)
+
+ self.gra_stock_values = pt_cp.vl["GRA_ACC_01"]
+
+ ret.espDisabled = bool(pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"])
+ ret.espActive = bool(pt_cp.vl["ESP_21"]["ESP_Eingriff"])
+
+ allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled")
+ cruise_fault_candidate = allow_lat_only and ret.accFaulted and bool(pt_cp.vl["GRA_ACC_01"]["GRA_Hauptschalter"])
+ if cruise_fault_candidate:
+ self.cruise_faulted_frames += 1
+ self.cruise_fault_clear_frames = 0
+ if self.cruise_faulted_frames >= self.CRUISE_FAULT_LATERAL_ENABLE_FRAMES:
+ self.cruise_fault_lateral_active = True
+ else:
+ self.cruise_faulted_frames = 0
+ if self.cruise_fault_lateral_active:
+ self.cruise_fault_clear_frames += 1
+ if self.cruise_fault_clear_frames >= self.CRUISE_FAULT_LATERAL_DISABLE_FRAMES:
+ self.cruise_fault_lateral_active = False
+ else:
+ self.cruise_fault_clear_frames = 0
+ if not allow_lat_only:
+ self.cruise_fault_lateral_active = False
+ self.cruise_faulted_frames = 0
+ self.cruise_fault_clear_frames = 0
+ ret.cruiseFaultLateralMode = self.cruise_fault_lateral_active
+ ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode
+ ret.blockPcmEnable = ret.cruiseFaultLateralMode
+
+ if self.CP.flags & VolkswagenFlags.MEB:
+ ret.batteryDetails.charge = pt_cp.vl["Motor_16"]["MO_Energieinhalt_BMS"]
+ if self.CP.networkLocation == NetworkLocation.gateway:
+ ret.batteryDetails.heaterActive = bool(main_cp.vl["MEB_HVEM_03"]["PTC_ON"])
+ ret.batteryDetails.voltage = main_cp.vl["MEB_HVEM_01"]["Battery_Voltage"]
+ ret.batteryDetails.capacity = main_cp.vl["BMS_04"]["BMS_Kapazitaet_02"] * ret.batteryDetails.voltage
+ ret.batteryDetails.soc = ret.batteryDetails.charge / ret.batteryDetails.capacity * 100.0 if ret.batteryDetails.capacity > 0 else 0.0
+ ret.batteryDetails.power = main_cp.vl["MEB_HVEM_01"]["Engine_Power"]
+ ret.batteryDetails.temperature = main_cp.vl["DCDC_03"]["DC_Temperatur"]
+ ret.batteryDetails.chargingMode = int(main_cp.vl["BMS_04"]["BMS_IstModus"])
+ ret.fuelGauge = ret.batteryDetails.soc / 100.0
+
+ self.update_meb_virtual_lkas(ret, pt_cp, hca_status)
+
+ ret.lowSpeedAlert = self.update_low_speed_alert(ret.vEgo)
+
+ # Propagate radar disable failure state so carcontroller can skip ACC sends
+ if self.CP.flags & VolkswagenFlags.DISABLE_RADAR:
+ ret.radarDisableFailed = RADAR_DISABLE_STATE["error"]
+
+ self.cruise_faulted = ret.accFaulted
+ self.frame += 1
+ self._apply_iq_private_flags(ret_iq)
+ return ret, ret_iq
+
+ def update_pq(self, pt_cp, cam_cp, ext_cp, aux_cp=None) -> tuple[structs.CarState, structs.IQCarState]:
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+ sng_ecd_enabled = bool(self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_SNG_ECD)
+
+ # vEgo obtained from Bremse_1 vehicle speed rather than Bremse_3 wheel speeds because Bremse_3 isn't present on NSF
+ ret.vEgoRaw = pt_cp.vl["Bremse_1"]["BR1_Rad_kmh"] * CV.KPH_TO_MS
+ 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["Lenkhilfe_3"]["LH3_BLW"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"])]
+ ret.steeringRateDeg = pt_cp.vl["Lenkwinkel_1"]["LW1_Lenk_Gesch"] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]["LW1_Gesch_Sign"])]
+ ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]["LH3_LM"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_LMSign"])]
+ ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE
+ hca_status = self.CCP.hca_status_values.get(pt_cp.vl["Lenkhilfe_2"]["LH2_Sta_HCA"])
+ ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status, ready_confirms_init=False)
+
+ # Update gas, brakes, and gearshift.
+ ret.gasPressed = pt_cp.vl["Motor_3"]["MO3_Pedalwert"] > 0
+ ret.brake = pt_cp.vl["Bremse_5"]["BR5_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects
+ ret.brakePressed = bool(pt_cp.vl["Motor_2"]["MO2_BLS"])
+ ret.parkingBrake = bool(pt_cp.vl["Kombi_1"]["Bremsinfo"])
+
+ # 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_1"]["GE1_Wahl_Pos"], None))
+ elif self.CP.transmissionType == TransmissionType.manual:
+ reverse_light = bool(pt_cp.vl["Gate_Komf_1"]["GK1_Rueckfahr"])
+ if reverse_light:
+ ret.gearShifter = GearShifter.reverse
+ else:
+ ret.gearShifter = GearShifter.drive
+
+ # Update door and trunk/hatch lid open status.
+ ret.doorOpen = any([pt_cp.vl["Gate_Komf_1"]["GK1_Fa_Tuerkont"],
+ pt_cp.vl["Gate_Komf_1"]["BSK_BT_geoeffnet"],
+ pt_cp.vl["Gate_Komf_1"]["BSK_HL_geoeffnet"],
+ pt_cp.vl["Gate_Komf_1"]["BSK_HR_geoeffnet"],
+ pt_cp.vl["Gate_Komf_1"]["BSK_HD_Hauptraste"]])
+
+ # Update seatbelt fastened status.
+ ret.seatbeltUnlatched = not bool(pt_cp.vl["Airbag_1"]["Gurtschalter_Fahrer"])
+
+ self.LH_3_Sign = pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"]
+ self.LH2_steeringState = pt_cp.vl["Lenkhilfe_2"]["LH2_aktLenkeingriff"]
+ self._update_pq_iq_alc_state(pt_cp)
+
+ # Consume blind-spot monitoring info/warning LED states, if available.
+ # Infostufe: BSM LED on, Warnung: BSM LED flashing
+ if self.CP.enableBsm:
+ blindspot_li = bool(ext_cp.vl["SWA_1"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_1"]["SWA_Warnung_SWA_li"])
+ blindspot_re = bool(ext_cp.vl["SWA_1"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_1"]["SWA_Warnung_SWA_re"])
+ force_rhd = self.force_rhd_for_bsm or self._params.get_bool("ForceRHDForBSM")
+ ret.leftBlindspot = blindspot_re if force_rhd else blindspot_li
+ ret.rightBlindspot = blindspot_li if force_rhd else blindspot_re
+
+ # 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_Status"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {}
+
+ cc_only = self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY or self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR
+
+ if not (self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR):
+ ret.stockFcw = bool(ext_cp.vl["AWV"]["AWV_2_Freigabe"])
+ ret.stockAeb = bool(ext_cp.vl["AWV"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["AWV"]["ANB_Zielbremsung_Freigabe"])
+ else:
+ ret.stockFcw = False
+ ret.stockAeb = False
+
+ ret.espActive = bool(pt_cp.vl["Bremse_1"]["BR1_Lampe_ASR"])
+
+ # Update ACC radar status.
+ self.acc_type = 0 if cc_only else ext_cp.vl["ACC_System"]["ACS_Typ_ACC"]
+ cruise_main_switch = bool(pt_cp.vl["Motor_5"]["MO5_GRA_Hauptsch"])
+ self.cruise_main_switch = cruise_main_switch
+ MO2_StaGRA = pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] in (1, 2)
+ ACS_StaADR = False if cc_only else ext_cp.vl["ACC_System"]["ACS_Sta_ADR"] == 1
+ cruiseActive = MO2_StaGRA or ACS_StaADR
+ self.epb_freigabe_ver = bool(aux_cp.vl["EPB_1"]["EP1_Freigabe_Ver"]) if sng_ecd_enabled and not cc_only else False
+ sng_holding = sng_ecd_enabled and self.epb_freigabe_ver
+ if cruiseActive or sng_holding:
+ self.last_cruiseActive = True
+ elif not MO2_StaGRA and not ACS_StaADR and not sng_holding:
+ self.last_cruiseActive = False
+ ret.cruiseState.enabled = self.last_cruiseActive
+ self.br8_acc_anf = bool(pt_cp.vl["Bremse_8"]["BR8_Sta_ACC_Anf"]) if not cc_only else False
+
+ if self.CP.pcmCruise:
+ if cc_only:
+ cruise_faulted = pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] == 3
+ else:
+ cruise_faulted = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_StaACC"] in (6, 7) or ext_cp.vl["ACC_System"]["ACS_Sta_ADR"] == 3 or pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] == 3
+ else:
+ cruise_faulted = pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] == 3
+
+ ret.accFaulted = cruise_faulted
+ ret.cruiseState.available = cruise_main_switch and not cruise_faulted
+ allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled")
+ cruise_main_available = cruise_main_switch
+ ret.cruiseFaultLateralMode = allow_lat_only and cruise_faulted and cruise_main_available
+ ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode
+ ret.blockPcmEnable = ret.cruiseFaultLateralMode
+ ret.carNotReady = bool(pt_cp.vl["Bremse_8"]["BR8_Sta_VerzReg"])
+
+ # Update ACC setpoint. When the setpoint reads as 255, the driver has not
+ # yet established an ACC setpoint, so treat it as zero.
+ if cc_only:
+ ret.cruiseState.speed = pt_cp.vl["Motor_2"]["MO2_GRA_Soll"] * CV.KPH_TO_MS
+ elif self.CP.pcmCruise:
+ ret.cruiseState.speed = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_V_Wunsch"] * CV.KPH_TO_MS
+ else:
+ ret.cruiseState.speed = 0
+ if ret.cruiseState.speed > 70: # 255 kph in m/s == no current setpoint
+ ret.cruiseState.speed = 0
+
+ self.motor2_stock = pt_cp.vl["Motor_2"]
+ self.motor5_stock = pt_cp.vl["Motor_5"]
+
+ if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB:
+ self.motor3_stock = aux_cp.vl["Motor_3"]
+ self.motor1_stock = aux_cp.vl["Motor_1"]
+ self.motor3_frame += 1
+ self.motor1_frame += 1
+
+ if cc_only:
+ self.acc_radar_sollbeschl = 0.0
+ self.acc_radar_regelabw = 0.0
+ self.acc_radar_aendgrad = 0.0
+ self.acc_radar_sta_adr = 0
+ self.acc_radar_fehler = False
+ self.acc_radar_v_wunsch = 0.0
+ self.acc_radar_sta_acc = 0
+ else:
+ self.acc_radar_sollbeschl = ext_cp.vl["ACC_System"]["ACS_Sollbeschl"]
+ self.acc_radar_regelabw = ext_cp.vl["ACC_System"]["ACS_zul_Regelabw"]
+ self.acc_radar_aendgrad = ext_cp.vl["ACC_System"]["ACS_max_AendGrad"]
+ self.acc_radar_sta_adr = int(ext_cp.vl["ACC_System"]["ACS_Sta_ADR"])
+ self.acc_radar_fehler = bool(ext_cp.vl["ACC_System"]["ACS_Fehler"])
+ self.acc_radar_v_wunsch = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_V_Wunsch"]
+ self.acc_radar_sta_acc = int(ext_cp.vl["ACC_GRA_Anzeige"]["ACA_StaACC"])
+
+ ret_iq.accRadarStaAdr = self.acc_radar_sta_adr
+ ret_iq.accRadarFehler = self.acc_radar_fehler
+
+ # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough
+ ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(300, pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_li"],
+ pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_re"])
+ self.leftBlinkerUpdate = pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_li"]
+ self.rightBlinkerUpdate = pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_re"]
+ ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS)
+ self.gra_stock_values = pt_cp.vl["GRA_Neu"]
+
+ # Additional safety checks performed in CarInterface.
+ ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["BR1_ESPASR_passive"])
+
+ ret.lowSpeedAlert = self.update_low_speed_alert(ret.vEgo)
+
+ ret.fuelGauge = pt_cp.vl["Kombi_1"]["Tankinhalt"] / 55.0
+ ret.fuelTankLevelL = pt_cp.vl["Kombi_1"]["Tankinhalt"] # raw liters for konn3kt
+ if aux_cp is not None:
+ self._update_odometer(ret, aux_cp.vl["Kombi_3"]["Kilometerstand"])
+
+ if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB:
+ ret.cruiseState.standstill = self.CP.pcmCruise and bool(pt_cp.vl["Bremse_5"]["BR5_Stillstand"]) and ret.cruiseState.enabled
+ elif sng_ecd_enabled:
+ ret.cruiseState.standstill = sng_holding and ret.standstill
+
+ self.cruise_faulted = ret.accFaulted
+ self.frame += 1
+ self._apply_iq_private_flags(ret_iq)
+ return ret, ret_iq
+
+ def update_mlb(self, pt_cp, br_cp, cam_cp, ext_cp) -> structs.CarState:
+ ret = structs.CarState()
+ ret_iq = structs.IQCarState()
+
+ self.parse_wheel_speeds(ret,
+ pt_cp.vl["ESP_03"]["ESP_VL_Radgeschw"],
+ pt_cp.vl["ESP_03"]["ESP_VR_Radgeschw"],
+ pt_cp.vl["ESP_03"]["ESP_HL_Radgeschw"],
+ pt_cp.vl["ESP_03"]["ESP_HR_Radgeschw"],
+ )
+
+ ret.gasPressed = pt_cp.vl["Motor_03"]["MO_Fahrpedalrohwert_01"] > 0
+ if self.CP.carFingerprint == CAR.PORSCHE_MACAN_MK1:
+ ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], None))
+ else:
+ ret.gearShifter = GearShifter.drive
+
+ cruise_main_switch = bool(pt_cp.vl["LS_01"]["LS_Hauptschalter"])
+ if not self.CP.pcmCruise:
+ ret.cruiseState.available = cruise_main_switch
+ ret.cruiseState.enabled = False
+ ret.accFaulted = False
+ elif self.CP.carFingerprint == CAR.PORSCHE_MACAN_MK1:
+ ret.cruiseState.available = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (2, 3, 4, 5)
+ ret.cruiseState.enabled = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (3, 4, 5)
+ ret.accFaulted = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (6, 7)
+ else:
+ ret.cruiseState.available = pt_cp.vl["TSK_02"]["TSK_Status"] in (0, 1, 2)
+ ret.cruiseState.enabled = pt_cp.vl["TSK_02"]["TSK_Status"] in (1, 2)
+ ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS
+ ret.accFaulted = pt_cp.vl["TSK_02"]["TSK_Status"] in (3,)
+
+ ret.cruiseState.nonAdaptive = bool(pt_cp.vl["LS_01"]["LS_Limiter"])
+ if not self.CP.pcmCruise:
+ self.acc_stock_counters["ACC_01"] = int(ext_cp.vl["ACC_01"]["COUNTER"])
+ self.acc_stock_counters["ACC_02"] = int(ext_cp.vl["ACC_02"]["COUNTER"])
+ self.esp_hold_confirmation = bool(pt_cp.vl["ESP_02"]["ESP_Stillstandsflag"])
+
+ self.parse_mlb_mqb_steering_state(ret, pt_cp)
+ self._update_mlb_iq_alc_state(pt_cp)
+
+ ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0
+ brake_pedal_pressed = bool(pt_cp.vl["Motor_03"]["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"])
+ ret.espDisabled = pt_cp.vl["ESP_01"]["ESP_Tastung_passiv"] != 0
+
+ if self.CP.carFingerprint == CAR.PORSCHE_MACAN_MK1:
+ ret.leftBlinker = bool(pt_cp.vl["Gateway_11"]["BH_Blinker_li"])
+ ret.rightBlinker = bool(pt_cp.vl["Gateway_11"]["BH_Blinker_re"])
+
+ ret.seatbeltUnlatched = pt_cp.vl["Gateway_06"]["AB_Gurtschloss_FA"] != 3
+ ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"],
+ pt_cp.vl["Gateway_05"]["BT_Tuer_geoeffnet"],
+ pt_cp.vl["Gateway_05"]["HL_Tuer_geoeffnet"],
+ pt_cp.vl["Gateway_05"]["HR_Tuer_geoeffnet"]])
+ else:
+ ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_links"])
+ ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_rechts"])
+ ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3
+
+ # 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.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {}
+ self.gra_stock_values = pt_cp.vl["LS_01"]
+
+ ret.fuelGauge = br_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] / 55.0
+ ret.fuelTankLevelL = br_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] # raw liters for konn3kt
+ self._update_odometer(ret, br_cp.vl["Kombi_02"]["KBI_Kilometerstand"])
+
+ ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS)
+
+ ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation
+ ret.standstill = ret.vEgoRaw == 0
+ allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled")
+ ret.cruiseFaultLateralMode = allow_lat_only and ret.accFaulted and cruise_main_switch
+ ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode
+ ret.blockPcmEnable = ret.cruiseFaultLateralMode
+
+ self.cruise_faulted = ret.accFaulted
+ self.frame += 1
+ self._apply_iq_private_flags(ret_iq)
+ return ret, ret_iq
+
+ def update_low_speed_alert(self, v_ego: float) -> bool:
+ # Low speed steer alert hysteresis logic
+ if (self.CP.minSteerSpeed - 1e-3) > CarControllerParams.DEFAULT_MIN_STEER_SPEED and v_ego < (self.CP.minSteerSpeed + 1.):
+ self.low_speed_alert = True
+ elif v_ego > (self.CP.minSteerSpeed + 2.):
+ self.low_speed_alert = False
+ return self.low_speed_alert
+
+ def parse_mlb_mqb_steering_state(self, ret, pt_cp, drive_mode=True):
+ 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
+
+ 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, drive_mode)
+ return
+
+ def update_hca_state(self, hca_status, drive_mode=True, ready_confirms_init=True):
+ # 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
+ init_statuses = ("DISABLED", "READY", "ACTIVE") if ready_confirms_init else ("DISABLED", "ACTIVE")
+ self.eps_init_complete = self.eps_init_complete or hca_status in init_statuses or self.frame > 1000
+ 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
+ return temp_fault, perm_fault
+
+ def update_acc_fault(self, acc_fault, parking_brake=False, drive_mode=True, recovery_frames_max=100):
+ fault = acc_fault
+ if parking_brake and not drive_mode:
+ fault = False
+ self.cruise_recovery_timer = self.frame
+ elif self.frame - self.cruise_recovery_timer < recovery_frames_max:
+ fault = False
+ return fault
+
+ def update_meb_virtual_lkas(self, ret, pt_cp, hca_status):
+ temp_cruise_fault = pt_cp.vl["Motor_51"]["TSK_Status"] == self.MEB_TEMP_CRUISE_FAULT
+ drive_mode = ret.gearShifter == GearShifter.drive
+ if temp_cruise_fault and ret.parkingBrake and not drive_mode:
+ ret.cruiseState.available = True
+ self.tolerance_counter = 0
+ elif self.tolerance_counter < self.MEB_TOLERANCE_MAX:
+ ret.cruiseState.available = True
+ self.tolerance_counter = min(self.tolerance_counter + 1, self.MEB_TOLERANCE_MAX)
+
+ self.prev_lkas_button = self.lkas_button
+ user_disable = any(b.type == ButtonType.cancel and b.pressed for b in ret.buttonEvents)
+ steering_enabled = hca_status == "ACTIVE"
+ cruise_standby = not ret.cruiseState.enabled
+ self.lkas_button = steering_enabled and user_disable and cruise_standby
+
+ if self.prev_lkas_button != self.lkas_button:
+ event = structs.CarState.ButtonEvent()
+ event.type = ButtonType.lkas
+ event.pressed = self.lkas_button
+ ret.buttonEvents = list(ret.buttonEvents) + [event]
+
+ @staticmethod
+ def get_can_parsers(CP, CP_IQ):
+ if CP.flags & VolkswagenFlags.PQ:
+ return CarState.get_can_parsers_pq(CP)
+ if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ return CarState.get_can_parsers_meb(CP)
+
+ # manually configure some optional and variable-rate/edge-triggered messages
+ pt_messages, cam_messages = [], []
+
+ if not CP.flags & VolkswagenFlags.MLB:
+ pt_messages += [
+ ("Blinkmodi_02", 1) # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active)
+ ]
+ if CP.flags & VolkswagenFlags.MLB:
+ pt_messages += [
+ ("Blinkmodi_01", math.nan), # From J519 BCM (is inactive when no lights active, 50Hz when active)
+ ("Kombi_02", math.nan), # Auxiliary-bus cluster odometer
+ ]
+ else:
+ pt_messages += [("Kombi_02", math.nan)] # Auxiliary-bus cluster odometer
+ if CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT:
+ cam_messages += [
+ ("HCA_01", 1), # From R242 Driver assistance camera, 50Hz if steering/1Hz if not
+ ]
+
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).pt),
+ Bus.aux: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).aux),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, CanBus(CP).cam),
+ }
+
+ @staticmethod
+ def get_can_parsers_pq(CP):
+ aux_messages = [("Kombi_3", math.nan)] # Bus 1 cluster odometer
+ if CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB:
+ aux_messages.append(("Motor_3", 0))
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).powertrain),
+ Bus.aux: CANParser(DBC[CP.carFingerprint][Bus.pt], aux_messages, CanBus(CP).aux),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).cam),
+ }
+
+ @staticmethod
+ def get_can_parsers_meb(CP):
+ pt_messages = [
+ ("Blinkmodi_02", 1),
+ ("SMLS_01", 1),
+ # TA_01 lives on bus 0 (car ECU / OP-generated when long is active).
+ # math.nan → ignore_alive=True so it never contributes to can_valid.
+ ("TA_01", math.nan),
+ ("Diagnose_01", math.nan), # Bus 0 cluster odometer
+ ]
+ if CP.networkLocation == NetworkLocation.fwdCamera:
+ pt_messages.append(("AWV_03", 1))
+
+ cam_messages = []
+ if CP.networkLocation == NetworkLocation.gateway:
+ cam_messages.append(("AWV_03", 1))
+
+ return {
+ Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).pt),
+ Bus.main: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).main),
+ Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, CanBus(CP).cam),
+ }
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/fingerprints.py b/iqdbc_repo/iqdbc/car/volkswagen/fingerprints.py
new file mode 100644
index 000000000..60e6793ff
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/fingerprints.py
@@ -0,0 +1,1638 @@
+""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE."""
+from iqdbc.car.structs import CarParams
+from iqdbc.car.volkswagen.values import CAR
+
+Ecu = CarParams.Ecu
+
+# TODO: Sharan Mk2 EPS and DQ250 auto trans both require KWP2000 support for fingerprinting
+
+
+FW_VERSIONS = {
+ CAR.VOLKSWAGEN_ARTEON_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704L906026TM\xf1\x896847',
+ b'\xf1\x873G0906259AH\xf1\x890001',
+ b'\xf1\x873G0906259F \xf1\x890004',
+ b'\xf1\x873G0906259G \xf1\x890004',
+ b'\xf1\x873G0906259G \xf1\x890005',
+ b'\xf1\x873G0906259J \xf1\x890002',
+ b'\xf1\x873G0906259M \xf1\x890003',
+ b'\xf1\x873G0906259N \xf1\x890004',
+ b'\xf1\x873G0906259P \xf1\x890001',
+ b'\xf1\x875NA907115H \xf1\x890002',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158L \xf1\x893611',
+ b'\xf1\x870DL300014C \xf1\x893704',
+ b'\xf1\x870GC300011L \xf1\x891401',
+ b'\xf1\x870GC300013Q \xf1\x892402',
+ b'\xf1\x870GC300014M \xf1\x892802',
+ b'\xf1\x870GC300019G \xf1\x892804',
+ b'\xf1\x870GC300040P \xf1\x891401',
+ b'\xf1\x870GC300043 \xf1\x892303',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e1616001613121157161111572900',
+ b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e1616001613121177161113772900',
+ b'\xf1\x873Q0959655BK\xf1\x890712\xf1\x82\x0e1616001613121157161111572C00',
+ b'\xf1\x873Q0959655CK\xf1\x890711\xf1\x82\x0e1712141712141105121122052900',
+ b'\xf1\x873Q0959655CR\xf1\x890720\xf1\x82\x0e1616001613121105161111052900',
+ b'\xf1\x873Q0959655DA\xf1\x890720\xf1\x82\x0e1712141712141105121122052900',
+ b'\xf1\x873Q0959655DL\xf1\x890732\xf1\x82\x0e1812141812171105141123052J00',
+ b'\xf1\x875QF959655AP\xf1\x890755\xf1\x82\x1311110011111311111100110200--1611125F49',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571B41815A1',
+ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571B00817A1',
+ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571B00818A1',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567B0020800',
+ b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x002MB4092M7N',
+ b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x002NB4202N7N',
+ b'\xf1\x875WA907145Q \xf1\x891063\xf1\x82\x002KB4092KOM',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ b'\xf1\x875Q0907572J \xf1\x890654',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ ],
+ },
+ CAR.VOLKSWAGEN_ATLAS_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8703H906026AA\xf1\x899970',
+ b'\xf1\x8703H906026AG\xf1\x899971',
+ b'\xf1\x8703H906026AG\xf1\x899973',
+ b'\xf1\x8703H906026AJ\xf1\x890638',
+ b'\xf1\x8703H906026AJ\xf1\x891017',
+ b'\xf1\x8703H906026AT\xf1\x891922',
+ b'\xf1\x8703H906026BC\xf1\x892664',
+ b'\xf1\x8703H906026F \xf1\x896696',
+ b'\xf1\x8703H906026F \xf1\x899970',
+ b'\xf1\x8703H906026F \xf1\x899973',
+ b'\xf1\x8703H906026J \xf1\x896026',
+ b'\xf1\x8703H906026J \xf1\x899970',
+ b'\xf1\x8703H906026J \xf1\x899971',
+ b'\xf1\x8703H906026J \xf1\x899972',
+ b'\xf1\x8703H906026S \xf1\x896693',
+ b'\xf1\x8703H906026S \xf1\x899970',
+ b'\xf1\x8703H906026S \xf1\x899972',
+ b'\xf1\x873CN906259 \xf1\x890005',
+ b'\xf1\x873CN906259F \xf1\x890002',
+ b'\xf1\x873CN906259K \xf1\x890002',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158A \xf1\x893387',
+ b'\xf1\x8709G927158DR\xf1\x893536',
+ b'\xf1\x8709G927158DR\xf1\x893742',
+ b'\xf1\x8709G927158EN\xf1\x893691',
+ b'\xf1\x8709G927158F \xf1\x893489',
+ b'\xf1\x8709G927158FT\xf1\x893835',
+ b'\xf1\x8709G927158GK\xf1\x893941',
+ b'\xf1\x8709G927158GL\xf1\x893939',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655BC\xf1\x890503\xf1\x82\x0e1914151912001103111122031200',
+ b'\xf1\x873Q0959655BN\xf1\x890713\xf1\x82\x0e2214152212001105141122052900',
+ b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e1114151112001105111122052900',
+ b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e2214152212001105141122052900',
+ b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105111122052J00',
+ b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105161122052J00',
+ b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1115151112001105121122052J00',
+ b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1115151112001105171122052J00',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B60924A1',
+ b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6G920A1',
+ b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6M921A1',
+ b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6N920A1',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6080105',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6090105',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ b'\xf1\x875Q0907572H \xf1\x890620',
+ b'\xf1\x875Q0907572J \xf1\x890654',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572S \xf1\x890780',
+ ],
+ },
+ CAR.VOLKSWAGEN_CADDY_MK3: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906027T \xf1\x892363',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x872K5959655E \xf1\x890018\xf1\x82\x05000P037605',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0155',
+ ],
+ },
+ CAR.VOLKSWAGEN_CRAFTER_MK2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704L906056BP\xf1\x894729',
+ b'\xf1\x8704L906056EK\xf1\x896391',
+ b'\xf1\x8704L906056SH\xf1\x899973',
+ b'\xf1\x8705L906023BC\xf1\x892688',
+ b'\xf1\x8705L906023MH\xf1\x892588',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655AL\xf1\x890505\xf1\x82\x0e1411001413001203151311031100',
+ b'\xf1\x873Q0959655BG\xf1\x890703\xf1\x82\x0e16120016130012051G1313052900',
+ b'\xf1\x875QF959655AG\xf1\x890753\xf1\x82\x13151300151500111111000502----1111120749',
+ b'\xf1\x875QF959655AS\xf1\x890755\xf1\x82\x1315140015150011111100050200--1311120749',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x872N0909143D\x00\xf1\x897010\xf1\x82\x05183AZ306A2',
+ b'\xf1\x872N0909143E \xf1\x897021\xf1\x82\x05163AZ306A2',
+ b'\xf1\x872N0909143H \xf1\x897045\xf1\x82\x05263AZ309A2',
+ b'\xf1\x872N0909144K \xf1\x897045\xf1\x82\x05233AZ810A2',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572J \xf1\x890156',
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ ],
+ },
+ CAR.VOLKSWAGEN_GOLF_MK7: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906016A \xf1\x897697',
+ b'\xf1\x8704E906016AD\xf1\x895758',
+ b'\xf1\x8704E906016CE\xf1\x899096',
+ b'\xf1\x8704E906016CH\xf1\x899226',
+ b'\xf1\x8704E906016DF\xf1\x896188',
+ b'\xf1\x8704E906016N \xf1\x899105',
+ b'\xf1\x8704E906023AG\xf1\x891726',
+ b'\xf1\x8704E906023BN\xf1\x894518',
+ b'\xf1\x8704E906024K \xf1\x896811',
+ b'\xf1\x8704E906024K \xf1\x899970',
+ b'\xf1\x8704E906027GR\xf1\x892394',
+ b'\xf1\x8704E906027HD\xf1\x892603',
+ b'\xf1\x8704E906027HD\xf1\x893742',
+ b'\xf1\x8704E906027MA\xf1\x894958',
+ b'\xf1\x8704L906021DT\xf1\x895520',
+ b'\xf1\x8704L906021DT\xf1\x898127',
+ b'\xf1\x8704L906021N \xf1\x895518',
+ b'\xf1\x8704L906021N \xf1\x898138',
+ b'\xf1\x8704L906026BN\xf1\x891197',
+ b'\xf1\x8704L906026BP\xf1\x897608',
+ b'\xf1\x8704L906026NF\xf1\x899528',
+ b'\xf1\x8704L906027AA\xf1\x899525',
+ b'\xf1\x8704L906056CL\xf1\x893823',
+ b'\xf1\x8704L906056CR\xf1\x895813',
+ b'\xf1\x8704L906056HE\xf1\x893758',
+ b'\xf1\x8704L906056HN\xf1\x896590',
+ b'\xf1\x8704L906056HT\xf1\x896591',
+ b'\xf1\x8704L997022N \xf1\x899459',
+ b'\xf1\x870EA906016A \xf1\x898343',
+ b'\xf1\x870EA906016E \xf1\x894219',
+ b'\xf1\x870EA906016F \xf1\x894238',
+ b'\xf1\x870EA906016F \xf1\x895002',
+ b'\xf1\x870EA906016Q \xf1\x895993',
+ b'\xf1\x870EA906016S \xf1\x897207',
+ b'\xf1\x875G0906259 \xf1\x890007',
+ b'\xf1\x875G0906259C \xf1\x890002',
+ b'\xf1\x875G0906259D \xf1\x890002',
+ b'\xf1\x875G0906259J \xf1\x890002',
+ b'\xf1\x875G0906259L \xf1\x890002',
+ b'\xf1\x875G0906259N \xf1\x890003',
+ b'\xf1\x875G0906259Q \xf1\x890002',
+ b'\xf1\x875G0906259Q \xf1\x892313',
+ b'\xf1\x875G0906259T \xf1\x890003',
+ b'\xf1\x878V0906259H \xf1\x890002',
+ b'\xf1\x878V0906259J \xf1\x890003',
+ b'\xf1\x878V0906259J \xf1\x890103',
+ b'\xf1\x878V0906259K \xf1\x890001',
+ b'\xf1\x878V0906259K \xf1\x890003',
+ b'\xf1\x878V0906259P \xf1\x890001',
+ b'\xf1\x878V0906259Q \xf1\x890002',
+ b'\xf1\x878V0906259R \xf1\x890002',
+ b'\xf1\x878V0906264F \xf1\x890003',
+ b'\xf1\x878V0906264L \xf1\x890002',
+ b'\xf1\x878V0906264M \xf1\x890001',
+ b'\xf1\x878V09C0BB01 \xf1\x890001',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927749AP\xf1\x892943',
+ b'\xf1\x8709S927158A \xf1\x893585',
+ b'\xf1\x870CW300040H \xf1\x890606',
+ b'\xf1\x870CW300041D \xf1\x891004',
+ b'\xf1\x870CW300041H \xf1\x891010',
+ b'\xf1\x870CW300042F \xf1\x891604',
+ b'\xf1\x870CW300043B \xf1\x891601',
+ b'\xf1\x870CW300043E \xf1\x891603',
+ b'\xf1\x870CW300044S \xf1\x894530',
+ b'\xf1\x870CW300044T \xf1\x895245',
+ b'\xf1\x870CW300045 \xf1\x894531',
+ b'\xf1\x870CW300046A \xf1\x895113',
+ b'\xf1\x870CW300047D \xf1\x895261',
+ b'\xf1\x870CW300047E \xf1\x895261',
+ b'\xf1\x870CW300048J \xf1\x890611',
+ b'\xf1\x870CW300049H \xf1\x890905',
+ b'\xf1\x870CW300050G \xf1\x891905',
+ b'\xf1\x870D9300012 \xf1\x894904',
+ b'\xf1\x870D9300012 \xf1\x894913',
+ b'\xf1\x870D9300012 \xf1\x894937',
+ b'\xf1\x870D9300012 \xf1\x895045',
+ b'\xf1\x870D9300012 \xf1\x895046',
+ b'\xf1\x870D9300014M \xf1\x895004',
+ b'\xf1\x870D9300014Q \xf1\x895006',
+ b'\xf1\x870D9300018 \xf1\x895201',
+ b'\xf1\x870D9300020D \xf1\x894309',
+ b'\xf1\x870D9300020J \xf1\x894902',
+ b'\xf1\x870D9300020Q \xf1\x895201',
+ b'\xf1\x870D9300020S \xf1\x895201',
+ b'\xf1\x870D9300040A \xf1\x893613',
+ b'\xf1\x870D9300040S \xf1\x894311',
+ b'\xf1\x870D9300041H \xf1\x895220',
+ b'\xf1\x870D9300041N \xf1\x894512',
+ b'\xf1\x870D9300041P \xf1\x894507',
+ b'\xf1\x870D9300043F \xf1\x895204',
+ b'\xf1\x870DD300045K \xf1\x891120',
+ b'\xf1\x870DD300046F \xf1\x891601',
+ b'\xf1\x870GC300012A \xf1\x891401',
+ b'\xf1\x870GC300012A \xf1\x891403',
+ b'\xf1\x870GC300012A \xf1\x891422',
+ b'\xf1\x870GC300012M \xf1\x892301',
+ b'\xf1\x870GC300014B \xf1\x892401',
+ b'\xf1\x870GC300014B \xf1\x892403',
+ b'\xf1\x870GC300014B \xf1\x892405',
+ b'\xf1\x870GC300014E \xf1\x892407',
+ b'\xf1\x870GC300020G \xf1\x892401',
+ b'\xf1\x870GC300020G \xf1\x892403',
+ b'\xf1\x870GC300020G \xf1\x892404',
+ b'\xf1\x870GC300020N \xf1\x892804',
+ b'\xf1\x870GC300043T \xf1\x899999',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655AA\xf1\x890386\xf1\x82\x111413001113120043114317121C111C9113',
+ b'\xf1\x875Q0959655AA\xf1\x890386\xf1\x82\x111413001113120053114317121C111C9113',
+ b'\xf1\x875Q0959655AA\xf1\x890388\xf1\x82\x111413001113120043114317121C111C9113',
+ b'\xf1\x875Q0959655AA\xf1\x890388\xf1\x82\x111413001113120043114417121411149113',
+ b'\xf1\x875Q0959655AA\xf1\x890388\xf1\x82\x111413001113120053114317121C111C9113',
+ b'\xf1\x875Q0959655AR\xf1\x890317\xf1\x82\x13141500111233003142114A2131219333313100',
+ b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333423100',
+ b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333463100',
+ b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x13141300111233003142115A1932199333463100',
+ b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x13141600111233003142115A2231229333423100',
+ b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x13141600111233003142115A2232229333463100',
+ b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2251229333463100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2252229333463100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142405A2251229333463100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142405A2252229333463100',
+ b'\xf1\x875Q0959655C \xf1\x890361\xf1\x82\x111413001112120004110415121610169112',
+ b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100',
+ b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x13141600111233003142405A2251229333463100',
+ b'\xf1\x875Q0959655D \xf1\x890388\xf1\x82\x111413001113120006110417121A101A9113',
+ b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13271112111312--071104171825102591131211',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13271112111312--071104171825102591131211',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13271212111312--071104171838103891131211',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13272512111312--07110417182C102C91131211',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13341512112212--071104172328102891131211',
+ b'\xf1\x875Q0959655M \xf1\x890361\xf1\x82\x111413001112120041114115121611169112',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011211200061104171717101791132111',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011211200621143171717111791132111',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200061104171724102491132111',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200621143171724112491132111',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200631143171724122491132111',
+ b'\xf1\x875Q0959655T \xf1\x890825\xf1\x82\x13271200111312--071104171837103791132111',
+ b'\xf1\x875Q0959655T \xf1\x890830\xf1\x82\x13271100111312--071104171826102691131211',
+ b'\xf1\x875QD959655 \xf1\x890388\xf1\x82\x111413001113120006110417121D101D9112',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144F \xf1\x895043\xf1\x82\x0561A01612A0',
+ b'\xf1\x873Q0909144H \xf1\x895061\xf1\x82\x0566A0J612A1',
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A00514A1',
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A01613A1',
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A0J712A1',
+ b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571A0J714A1',
+ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571A01A16A1',
+ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571A0JA15A1',
+ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A01A18A1',
+ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A02A16A1',
+ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A0JA16A1',
+ b'\xf1\x873QM909144 \xf1\x895072\xf1\x82\x0571A01714A1',
+ b'\xf1\x875Q0909143K \xf1\x892033\xf1\x820519A9040203',
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A00441A1',
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A00608A1',
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A00641A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A00442A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A00642A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A07B05A1',
+ b'\xf1\x875Q0909144L \xf1\x891021\xf1\x82\x0521A00502A0',
+ b'\xf1\x875Q0909144L \xf1\x891021\xf1\x82\x0521A00602A0',
+ b'\xf1\x875Q0909144L \xf1\x891021\xf1\x82\x0522A00402A0',
+ b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0511A00403A0',
+ b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516A00604A1',
+ b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A00404A1',
+ b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A00504A1',
+ b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A00604A1',
+ b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A07A02A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A00407A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A00507A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A07B04A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A20B03A1',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A2000400',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A2000600',
+ b'\xf1\x875QD909144B \xf1\x891072\xf1\x82\x0521A00507A1',
+ b'\xf1\x875QM909144A \xf1\x891072\xf1\x82\x0521A20B03A1',
+ b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A00442A1',
+ b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A00642A1',
+ b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A16A1',
+ b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A17A1',
+ b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A18A1',
+ b'\xf1\x875QN909144B \xf1\x895082\xf1\x82\x0571A01A18A1',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x875Q0907567G \xf1\x890390\xf1\x82\x0101',
+ b'\xf1\x875Q0907567J \xf1\x890396\xf1\x82\x0101',
+ b'\xf1\x875Q0907567L \xf1\x890098\xf1\x82\x0101',
+ b'\xf1\x875Q0907572A \xf1\x890141\xf1\x82\x0101',
+ b'\xf1\x875Q0907572B \xf1\x890200\xf1\x82\x0101',
+ b'\xf1\x875Q0907572C \xf1\x890210\xf1\x82\x0101',
+ b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101',
+ b'\xf1\x875Q0907572E \xf1\x89X310\xf1\x82\x0101',
+ b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101',
+ b'\xf1\x875Q0907572G \xf1\x890571',
+ b'\xf1\x875Q0907572H \xf1\x890620',
+ b'\xf1\x875Q0907572J \xf1\x890653',
+ b'\xf1\x875Q0907572J \xf1\x890654',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ b'\xf1\x875Q0907572S \xf1\x890780',
+ ],
+ },
+ CAR.VOLKSWAGEN_GOLF_MK8: {
+ (Ecu.engine, 0x7e0, None): [],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.cornerRadar, 0x74e, None): [
+ b'\xf1\x872Q0907686J \xf1\x890288',
+ ],
+ (Ecu.adas, 0x769, None): [
+ b'\xf1\x875WA980556C \xf1\x890314',
+ b'\xf1\x875WA980556D \xf1\x890364',
+ ],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x875WA907572B \xf1\x890395',
+ b'\xf1\x875WA907572C \xf1\x890461',
+ ],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x875WA980653C \xf1\x893301',
+ b'\xf1\x875WA980653D \xf1\x893405',
+ ],
+ },
+ CAR.VOLKSWAGEN_ID3_MK1: {
+ (Ecu.inverter, 0x17fc007c, None): [
+ b'\xf1\x871EA907121AH\xf1\x896050\xf1\x82010\x00',
+ ],
+ (Ecu.engine, 0x17fc0076, None): [
+ b'\xf1\x870EA906012DG\xf1\x892604',
+ ],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x871EA959655CD\xf1\x890366',
+ ],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654L \xf1\x895332',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [
+ b'\xf1\x872Q0907686L \xf1\x890289',
+ ],
+ (Ecu.adas, 0x769, None): [
+ b'\xf1\x871EA907556R \xf1\x890284',
+ ],
+ (Ecu.parkingAdas, 0x70a, None): [
+ b'\xf1\x871EA919294D \xf1\x890421',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907572H \xf1\x890234',
+ ],
+ },
+ CAR.VOLKSWAGEN_ID3_MK2: {
+ (Ecu.inverter, 0x17fc007c, None): [],
+ (Ecu.engine, 0x17fc0076, None): [],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654P \xf1\x895570',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [],
+ (Ecu.adas, 0x769, None): [],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907567D \xf1\x890250',
+ ],
+ },
+ CAR.VOLKSWAGEN_ID4_MK1: {
+ (Ecu.inverter, 0x17fc007c, None): [
+ b'\xf1\x871EA907121BE\xf1\x896046\xf1\x82020\x00',
+ ],
+ (Ecu.engine, 0x17fc0076, None): [
+ b'\xf1\x870EA906012DK\xf1\x892603',
+ ],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x871EA959655EA\xf1\x890376',
+ b'\xf1\x875WA959655R \xf1\x890717',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x871EA907144AQ\xf1\x895033\xf1\x82\x000_BH0A0_ON',
+ ],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654L \xf1\x895332',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [
+ b'\xf1\x872Q0907686K \xf1\x890289',
+ ],
+ (Ecu.adas, 0x769, None): [
+ b'\xf1\x871EA980556J \xf1\x890397',
+ ],
+ (Ecu.parkingAdas, 0x70a, None): [
+ b'\xf1\x871EA919294D \xf1\x890421',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907572H \xf1\x890234',
+ ],
+ },
+ CAR.VOLKSWAGEN_ID4_MK2: {
+ (Ecu.inverter, 0x17fc007c, None): [
+ b'\xf1\x870ET907121D \xf1\x897246\xf1\x82010',
+ ],
+ (Ecu.engine, 0x17fc0076, None): [
+ b'\xf1\x870EA906014DR\xf1\x893630',
+ ],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980653G \xf1\x895570',
+ b'\xf1\x871EA980653B \xf1\x895510',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [],
+ (Ecu.adas, 0x769, None): [],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907567D \xf1\x890250',
+ b'\xf1\x871EA907567C \xf1\x890099',
+ ],
+ },
+ 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: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906024AF\xf1\x899970',
+ b'\xf1\x8704E906024AK\xf1\x899937',
+ b'\xf1\x8704E906024AS\xf1\x899912',
+ b'\xf1\x8704E906024AS\xf1\x899970',
+ b'\xf1\x8704E906024B \xf1\x895594',
+ b'\xf1\x8704E906024BC\xf1\x899971',
+ b'\xf1\x8704E906024BG\xf1\x891057',
+ b'\xf1\x8704E906024C \xf1\x899970',
+ b'\xf1\x8704E906024C \xf1\x899971',
+ b'\xf1\x8704E906024L \xf1\x895595',
+ b'\xf1\x8704E906024L \xf1\x899970',
+ b'\xf1\x8704E906027MS\xf1\x896223',
+ b'\xf1\x8705E906013BN\xf1\x893711',
+ b'\xf1\x8705E906013DB\xf1\x893361',
+ b'\xf1\x875G0906259T \xf1\x890003',
+ b'\xf1\x875G09C0BB02 \xf1\x890003',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158BQ\xf1\x893545',
+ b'\xf1\x8709H927158 \xf1\x890515',
+ b'\xf1\x8709S927158BS\xf1\x893642',
+ b'\xf1\x8709S927158BS\xf1\x893694',
+ b'\xf1\x8709S927158CK\xf1\x893770',
+ b'\xf1\x8709S927158JC\xf1\x894113',
+ b'\xf1\x8709S927158R \xf1\x893552',
+ b'\xf1\x8709S927158R \xf1\x893587',
+ b'\xf1\x870GC300020N \xf1\x892803',
+ b'\xf1\x870GC300020N \xf1\x892804',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655AG\xf1\x890336\xf1\x82\x1313171231313500314611011530159333463100',
+ b'\xf1\x875Q0959655AG\xf1\x890336\xf1\x82\x1314171231313500314611011630169333463100',
+ b'\xf1\x875Q0959655AG\xf1\x890338\xf1\x82\x1314171231313500314611011630169333463100',
+ b'\xf1\x875Q0959655BM\xf1\x890403\xf1\x82\x1314171231313500314642011650169333463100',
+ b'\xf1\x875Q0959655BM\xf1\x890403\xf1\x82\x1314171231313500314643011650169333463100',
+ b'\xf1\x875Q0959655BR\xf1\x890403\xf1\x82\x1311170031313300314240011150119333433100',
+ b'\xf1\x875Q0959655BR\xf1\x890403\xf1\x82\x1319170031313300314240011550159333463100',
+ b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1314171231313500314642021650169333613100',
+ b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1314171231313500314643021650169333613100',
+ b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1317171231313500314642023050309333613100',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A10A11A1',
+ b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x000_A1080_OM',
+ b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A10A01A1',
+ b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521B00404A1',
+ b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A00642A1',
+ b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A10A01A1',
+ b'\xf1\x875QN909144B \xf1\x895082\xf1\x82\x0571A10A11A1',
+ b'\xf1\x875QV907144F \xf1\x891122\xf1\x82\x0001A00701]V',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907567B \xf1\x890534',
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x875Q0907572N \xf1\x890681',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ ],
+ },
+ CAR.VOLKSWAGEN_PASSAT_MK8: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8703N906026E \xf1\x892114',
+ b'\xf1\x8704E906023AH\xf1\x893379',
+ b'\xf1\x8704E906023BF\xf1\x893842',
+ b'\xf1\x8704E906023BM\xf1\x894522',
+ b'\xf1\x8704L906026DP\xf1\x891538',
+ b'\xf1\x8704L906026ET\xf1\x891990',
+ b'\xf1\x8704L906026FP\xf1\x892012',
+ b'\xf1\x8704L906026GA\xf1\x892013',
+ b'\xf1\x8704L906026GK\xf1\x899971',
+ b'\xf1\x8704L906026KD\xf1\x894798',
+ b'\xf1\x8705L906022A \xf1\x890827',
+ b'\xf1\x873G0906259 \xf1\x890004',
+ b'\xf1\x873G0906259B \xf1\x890002',
+ b'\xf1\x873G0906264 \xf1\x890004',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300041E \xf1\x891006',
+ b'\xf1\x870CW300042H \xf1\x891601',
+ b'\xf1\x870CW300042H \xf1\x891607',
+ b'\xf1\x870CW300043H \xf1\x891601',
+ b'\xf1\x870CW300048R \xf1\x890610',
+ b'\xf1\x870D9300013A \xf1\x894905',
+ b'\xf1\x870D9300014L \xf1\x895002',
+ b'\xf1\x870D9300018C \xf1\x895297',
+ b'\xf1\x870D9300041A \xf1\x894801',
+ b'\xf1\x870D9300042H \xf1\x894901',
+ b'\xf1\x870DD300045T \xf1\x891601',
+ b'\xf1\x870DD300046B \xf1\x891601',
+ b'\xf1\x870DD300046H \xf1\x891601',
+ b'\xf1\x870DL300011H \xf1\x895201',
+ b'\xf1\x870GC300042H \xf1\x891404',
+ b'\xf1\x870GC300043 \xf1\x892301',
+ b'\xf1\x870GC300046P \xf1\x892805',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655AE\xf1\x890195\xf1\x82\r56140056130012416612124111',
+ b'\xf1\x873Q0959655AF\xf1\x890195\xf1\x82\r56140056130012026612120211',
+ b'\xf1\x873Q0959655AN\xf1\x890305\xf1\x82\r58160058140013036914110311',
+ b'\xf1\x873Q0959655AN\xf1\x890306\xf1\x82\r58160058140013036914110311',
+ b'\xf1\x873Q0959655BA\xf1\x890195\xf1\x82\r56140056130012416612124111',
+ b'\xf1\x873Q0959655BA\xf1\x890195\xf1\x82\r56140056130012516612125111',
+ b'\xf1\x873Q0959655BB\xf1\x890195\xf1\x82\r56140056130012026612120211',
+ b'\xf1\x873Q0959655BG\xf1\x890712\xf1\x82\x0e5915005914001305701311052900',
+ b'\xf1\x873Q0959655BJ\xf1\x890703\xf1\x82\x0e5915005914001305701311052900',
+ b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e5915005914001344701311442900',
+ b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e5915005914001354701311542900',
+ b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e5915005914001305701311052900',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011111200631145171716121691132111',
+ b'\xf1\x875QF959655S \xf1\x890639\xf1\x82\x13131100131300111111000120----2211114A48',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566B00611A1',
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566B00711A1',
+ b'\xf1\x875Q0909143K \xf1\x892033\xf1\x820514B0060703',
+ b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522B0060803',
+ b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522B0080803',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526B0060905',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521B00606A1',
+ b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516B00501A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00603A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00703A1',
+ b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563B0000600',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567B0020600',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x873Q0907572A \xf1\x890126',
+ b'\xf1\x873Q0907572A \xf1\x890130',
+ b'\xf1\x873Q0907572B \xf1\x890192',
+ b'\xf1\x873Q0907572B \xf1\x890194',
+ b'\xf1\x873Q0907572C \xf1\x890195',
+ b'\xf1\x873Q0907572C \xf1\x890196',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ b'\xf1\x875Q0907572S \xf1\x890780',
+ ],
+ },
+ CAR.VOLKSWAGEN_PASSAT_MK7: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8703L906018RE\xf1\x899979',
+ ],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x873AA980654D \xf1\x890300\xf1\x82\x0143',
+ ],
+ },
+ CAR.VOLKSWAGEN_PASSAT_NMS: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8706K906016C \xf1\x899609',
+ b'\xf1\x8706K906016E \xf1\x899830',
+ b'\xf1\x8706K906016G \xf1\x891124',
+ b'\xf1\x8706K906071BJ\xf1\x894891',
+ b'\xf1\x8706K906071AF\xf1\x894869',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158AB\xf1\x893318',
+ b'\xf1\x8709G927158BD\xf1\x893121',
+ b'\xf1\x8709G927158DK\xf1\x893594',
+ b'\xf1\x8709G927158FQ\xf1\x893745',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x87561959655 \xf1\x890210\xf1\x82\x1212121111113000102011--121012--101312',
+ b'\xf1\x87561959655C \xf1\x890508\xf1\x82\x1215141111121100314919--153015--304831',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x87561907567A \xf1\x890132',
+ b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0152',
+ ],
+ },
+ CAR.VOLKSWAGEN_PASSAT_NMS_PLUS: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8706K906016J\xf1\x891409',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158FQ\xf1\x893745',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x87561959655D \xf1\x890508\xf1\x82\x1215141111121100314919--153015--304831',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x87561907567A \xf1\x890132',
+ b'\xf1\x873QF907572A \xf1\x890132',
+ ],
+ },
+ CAR.VOLKSWAGEN_PASSAT_B7: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8703L906018RE\xf1\x899979',
+ ],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x873AA980654D \xf1\x890300\xf1\x82\x0143',
+ ],
+ },
+ CAR.VOLKSWAGEN_POLO_MK6: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704C906025H \xf1\x895177',
+ b'\xf1\x8705C906032J \xf1\x891702',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300042D \xf1\x891612',
+ b'\xf1\x870CW300050D \xf1\x891908',
+ b'\xf1\x870CW300051G \xf1\x891909',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x872Q0959655AG\xf1\x890248\xf1\x82\x1218130411110411--04040404231811152H14',
+ b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1248130411110416--04040404784811152H14',
+ b'\xf1\x872Q0959655AS\xf1\x890411\xf1\x82\x1384830511110516041405820599841215391471',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x872Q1909144M \xf1\x896041',
+ b'\xf1\x872Q2909144AB\xf1\x896050',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ ],
+ },
+ CAR.VOLKSWAGEN_SHARAN_MK2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704L906016HE\xf1\x894635',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x877N0959655D \xf1\x890016\xf1\x82\x0801100705----10--',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0153',
+ ],
+ },
+ CAR.SEAT_ALHAMBRA_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704L906016HE\xf1\x894635',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x877N0959655D \xf1\x890016\xf1\x82\x0801100705----10--',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0153',
+ ],
+ },
+ CAR.VOLKSWAGEN_TAOS_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906025CK\xf1\x892228',
+ b'\xf1\x8704E906027NJ\xf1\x891445',
+ b'\xf1\x8704E906027NP\xf1\x891286',
+ b'\xf1\x8705E906013BD\xf1\x892496',
+ b'\xf1\x8705E906013DF\xf1\x893365',
+ b'\xf1\x8705E906013E \xf1\x891624',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158EM\xf1\x893812',
+ b'\xf1\x8709S927158BL\xf1\x893791',
+ b'\xf1\x8709S927158CR\xf1\x893924',
+ b'\xf1\x8709S927158DN\xf1\x893946',
+ b'\xf1\x8709S927158FF\xf1\x893876',
+ b'\xf1\x8709S927158HM\xf1\x894112',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1311111111333500314646021450149333613100',
+ b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1312111111333500314646021550159333613100',
+ b'\xf1\x875Q0959655CE\xf1\x890421\xf1\x82\x1311110011333300314240021350139333613100',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x001O06081OOM',
+ b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521060405A1',
+ b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521060605A1',
+ b'\xf1\x875QV907144F \xf1\x891122\xf1\x82\x0001060801]V',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907567B \xf1\x890534',
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.VOLKSWAGEN_TCROSS_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704C906025AK\xf1\x897053',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300050E \xf1\x891903',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1212130411110411--04041104141311152H14',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x872Q1909144M \xf1\x896041',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.VOLKSWAGEN_TIGUAN_MK2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8703N906026D \xf1\x893680',
+ b'\xf1\x8704E906024AP\xf1\x891461',
+ b'\xf1\x8704E906027NB\xf1\x899504',
+ b'\xf1\x8704L906026EJ\xf1\x893661',
+ b'\xf1\x8704L906026EJ\xf1\x893916',
+ b'\xf1\x8704L906026KR\xf1\x893919',
+ b'\xf1\x8704L906027G \xf1\x899893',
+ b'\xf1\x8705E906018BS\xf1\x890914',
+ b'\xf1\x8705L906022GL\xf1\x892112',
+ b'\xf1\x875N0906259 \xf1\x890002',
+ b'\xf1\x875NA906259H \xf1\x890002',
+ b'\xf1\x875NA907115E \xf1\x890003',
+ b'\xf1\x875NA907115E \xf1\x890005',
+ b'\xf1\x875NA907115J \xf1\x890002',
+ b'\xf1\x875NA907115K \xf1\x890004',
+ b'\xf1\x8783A907115 \xf1\x890007',
+ b'\xf1\x8783A907115B \xf1\x890005',
+ b'\xf1\x8783A907115F \xf1\x890002',
+ b'\xf1\x8783A907115G \xf1\x890001',
+ b'\xf1\x8783A907115K \xf1\x890001',
+ b'\xf1\x8783A907115K \xf1\x890002',
+ b'\xf1\x8783A907115Q \xf1\x890001',
+ b'\xf1\x8783A907115Q \xf1\x890002',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158DS\xf1\x893699',
+ b'\xf1\x8709G927158DT\xf1\x893698',
+ b'\xf1\x8709G927158FM\xf1\x893757',
+ b'\xf1\x8709G927158GC\xf1\x893821',
+ b'\xf1\x8709G927158GD\xf1\x893820',
+ b'\xf1\x8709G927158GM\xf1\x893936',
+ b'\xf1\x8709G927158GN\xf1\x893938',
+ b'\xf1\x8709G927158HB\xf1\x894069',
+ b'\xf1\x8709G927158HC\xf1\x894070',
+ b'\xf1\x870D9300043 \xf1\x895202',
+ b'\xf1\x870DD300046K \xf1\x892302',
+ b'\xf1\x870DL300011N \xf1\x892001',
+ b'\xf1\x870DL300011N \xf1\x892012',
+ b'\xf1\x870DL300011N \xf1\x892014',
+ b'\xf1\x870DL300012M \xf1\x892107',
+ b'\xf1\x870DL300012N \xf1\x892110',
+ b'\xf1\x870DL300012P \xf1\x892103',
+ b'\xf1\x870DL300013A \xf1\x893005',
+ b'\xf1\x870DL300013G \xf1\x892119',
+ b'\xf1\x870DL300013G \xf1\x892120',
+ b'\xf1\x870DL300014C \xf1\x893703',
+ b'\xf1\x870GC300013P \xf1\x892401',
+ b'\xf1\x870GC300018R \xf1\x892802',
+ b'\xf1\x870GC300046Q \xf1\x892802',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655AG\xf1\x890336\xf1\x82\x1316143231313500314617011730179333423100',
+ b'\xf1\x875Q0959655AG\xf1\x890338\xf1\x82\x1316143231313500314617011730179333423100',
+ b'\xf1\x875Q0959655AR\xf1\x890317\xf1\x82\x1331310031333334313132573732379333313100',
+ b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x1311140031333300314232583632369333423100',
+ b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x1312110031333300314232583732379333423100',
+ b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x1331310031333334313132013730379333423100',
+ b'\xf1\x875Q0959655BK\xf1\x890339\xf1\x82\x1331310031333334313132573732379333423100',
+ b'\xf1\x875Q0959655BM\xf1\x890403\xf1\x82\x1316143231313500314641011750179333423100',
+ b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1312110031333300314240013750379333423100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1312110031333300314240583752379333423100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333334313140013750379333423100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333334313140573752379333423100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333336313140013950399333423100',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333336313140573952399333423100',
+ b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1316143231313500314647021750179333613100',
+ b'\xf1\x875Q0959655CD\xf1\x890421\xf1\x82\x13123112313333003145406F6154619333613100',
+ b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x1331310031333300314240024050409333613100',
+ b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x13121100313333003142405G3754379333613100',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820529A6060603',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527A6050705',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527A6070705',
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A60803A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A60604A1',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A6000600',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A6017A00',
+ b'\xf1\x875QF909144 \xf1\x895572\xf1\x82\x0571A60833A1',
+ b'\xf1\x875QF909144A \xf1\x895581\xf1\x82\x0571A60834A1',
+ b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571A60634A1',
+ b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571A62A32A1',
+ b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x002RA60A2ROM',
+ b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x002SA6092SOM',
+ b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A60604A1',
+ b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A60804A1',
+ b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A60604A1',
+ b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A60804A1',
+ b'\xf1\x875QV907144F \xf1\x891122\xf1\x82\x0001A6CA01]V',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907567B \xf1\x890534',
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572AB\xf1\x890397',
+ b'\xf1\x872Q0907572J \xf1\x890156',
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ b'\xf1\x872Q0907572Q \xf1\x890342',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.VOLKSWAGEN_TOURAN_MK2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906025BE\xf1\x890720',
+ b'\xf1\x8704E906027HQ\xf1\x893746',
+ b'\xf1\x8704L906026HM\xf1\x893017',
+ b'\xf1\x8705E906018CQ\xf1\x890808',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300020A \xf1\x891936',
+ b'\xf1\x870CW300041E \xf1\x891005',
+ b'\xf1\x870CW300041Q \xf1\x891606',
+ b'\xf1\x870CW300051M \xf1\x891926',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x1336350021353335314132014730479333313100',
+ b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x13363500213533353141324C4732479333313100',
+ b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1336350021353336314740025250529333613100',
+ b'\xf1\x875QD959655AJ\xf1\x890421\xf1\x82\x1336350021313300314240023330339333663100',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A8090400',
+ b'\xf1\x875QD909144F \xf1\x891082\xf1\x82\x0521A00642A1',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x873Q0907572C \xf1\x890195',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ ],
+ },
+ CAR.VOLKSWAGEN_TRANSPORTER_T61: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704L906056AG\xf1\x899970',
+ b'\xf1\x8704L906056AL\xf1\x899970',
+ b'\xf1\x8704L906057AP\xf1\x891186',
+ b'\xf1\x8704L906057N \xf1\x890413',
+ b'\xf1\x8705L906023E \xf1\x891352',
+ b'\xf1\x8705L906023MR\xf1\x892582',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870BT300012E \xf1\x893105',
+ b'\xf1\x870BT300012G \xf1\x893102',
+ b'\xf1\x870BT300046R \xf1\x893102',
+ b'\xf1\x870DV300012B \xf1\x893701',
+ b'\xf1\x870DV300012B \xf1\x893702',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x872Q0959655AE\xf1\x890506\xf1\x82\x1316170411110411--04041704161611152S1411',
+ b'\xf1\x872Q0959655AE\xf1\x890506\xf1\x82\x1316170411110411--04041704171711152S1411',
+ b'\xf1\x872Q0959655AF\xf1\x890506\xf1\x82\x1316171111110411--04041711121211152S1413',
+ b'\xf1\x872Q0959655AQ\xf1\x890511\xf1\x82\x1316170411110411--0404170426261215391421',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x877LA909144F \xf1\x897150\xf1\x82\x0532380518A2',
+ b'\xf1\x877LA909144F \xf1\x897150\xf1\x82\x05323A5519A2',
+ b'\xf1\x877LA909144G \xf1\x897160\xf1\x82\x05333A5519A2',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ ],
+ },
+ CAR.VOLKSWAGEN_TROC_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8705E906018AT\xf1\x899640',
+ b'\xf1\x8705E906018CK\xf1\x890863',
+ b'\xf1\x8705E906018P \xf1\x896020',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300041S \xf1\x891615',
+ b'\xf1\x870CW300050J \xf1\x891911',
+ b'\xf1\x870CW300051M \xf1\x891925',
+ b'\xf1\x870CW300051M \xf1\x891928',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1111001111001105111111052900',
+ b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1311110012333300314240681152119333463100',
+ b'\xf1\x875Q0959655CF\xf1\x890421\xf1\x82\x1311110012333300314240021150119333613100',
+ b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x13111100123333003142404M1152119333613100',
+ b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x13111100123333003142404M1154119333613100',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521060403A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521060405A1',
+ b'\xf1\x875WA907144M \xf1\x891051\xf1\x82\x001T06081T7N',
+ b'\xf1\x875WA907144Q \xf1\x891063\xf1\x82\x001O06081OOM',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.AUDI_A3_MK3: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906023AN\xf1\x893695',
+ b'\xf1\x8704E906023AR\xf1\x893440',
+ b'\xf1\x8704E906023BL\xf1\x895190',
+ b'\xf1\x8704E906027CJ\xf1\x897798',
+ b'\xf1\x8704L997022N \xf1\x899459',
+ b'\xf1\x875G0906259A \xf1\x890004',
+ b'\xf1\x875G0906259D \xf1\x890002',
+ b'\xf1\x875G0906259L \xf1\x890002',
+ b'\xf1\x875G0906259Q \xf1\x890002',
+ b'\xf1\x875G0906259Q \xf1\x890007',
+ b'\xf1\x878V0906259E \xf1\x890001',
+ b'\xf1\x878V0906259F \xf1\x890002',
+ b'\xf1\x878V0906259H \xf1\x890002',
+ b'\xf1\x878V0906259J \xf1\x890002',
+ b'\xf1\x878V0906259K \xf1\x890001',
+ b'\xf1\x878V0906259K \xf1\x890002',
+ b'\xf1\x878V0906264B \xf1\x890003',
+ b'\xf1\x878V0907115B \xf1\x890007',
+ b'\xf1\x878V0907404A \xf1\x890005',
+ b'\xf1\x878V0907404G \xf1\x890004',
+ b'\xf1\x878V0907404G \xf1\x890005',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300044T \xf1\x895245',
+ b'\xf1\x870CW300048 \xf1\x895201',
+ b'\xf1\x870D9300012 \xf1\x894912',
+ b'\xf1\x870D9300012 \xf1\x894931',
+ b'\xf1\x870D9300012K \xf1\x894513',
+ b'\xf1\x870D9300012L \xf1\x894521',
+ b'\xf1\x870D9300013B \xf1\x894902',
+ b'\xf1\x870D9300013B \xf1\x894931',
+ b'\xf1\x870D9300014Q \xf1\x895006',
+ b'\xf1\x870D9300041N \xf1\x894512',
+ b'\xf1\x870D9300043T \xf1\x899699',
+ b'\xf1\x870DD300046 \xf1\x891604',
+ b'\xf1\x870DD300046A \xf1\x891602',
+ b'\xf1\x870DD300046F \xf1\x891602',
+ b'\xf1\x870DD300046G \xf1\x891601',
+ b'\xf1\x870DL300012E \xf1\x892012',
+ b'\xf1\x870DL300012H \xf1\x892112',
+ b'\xf1\x870GC300011 \xf1\x890403',
+ b'\xf1\x870GC300013M \xf1\x892402',
+ b'\xf1\x870GC300042J \xf1\x891402',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655AB\xf1\x890388\xf1\x82\x111111001111111206110412111321139114',
+ b'\xf1\x875Q0959655AM\xf1\x890315\xf1\x82\x1311111111111111311411011231129321212100',
+ b'\xf1\x875Q0959655AM\xf1\x890318\xf1\x82\x1311111111111112311411011531159321212100',
+ b'\xf1\x875Q0959655AR\xf1\x890315\xf1\x82\x1311110011131115311211012331239321212100',
+ b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x1311110011131100311111011731179321342100',
+ b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13111112111111--171115141112221291163221',
+ b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13111112111111--241115141112221291163221',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13111112111111--241115141112221291163221',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13121111111111--341117141212231291163221',
+ b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13121111111211--261117141112231291163221',
+ b'\xf1\x875Q0959655N \xf1\x890361\xf1\x82\x111212001112110004110411111421149114',
+ b'\xf1\x875Q0959655N \xf1\x890361\xf1\x82\x111212001112111104110411111521159114',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144F \xf1\x895043\xf1\x82\x0561G01A13A0',
+ b'\xf1\x873Q0909144H \xf1\x895061\xf1\x82\x0566G0HA14A1',
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566G0HA14A1',
+ b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571G01A16A1',
+ b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571G0HA16A1',
+ b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571G0JA13A1',
+ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571G0JA14A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521G0G809A1',
+ b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0503G00303A0',
+ b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0503G00803A0',
+ b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0503G0G803A0',
+ b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516G00804A1',
+ b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516G00804A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521G00807A1',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x875Q0907567M \xf1\x890398\xf1\x82\x0101',
+ b'\xf1\x875Q0907567N \xf1\x890400\xf1\x82\x0101',
+ b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101',
+ b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101',
+ b'\xf1\x875Q0907572G \xf1\x890571',
+ b'\xf1\x875Q0907572H \xf1\x890620',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ ],
+ },
+ CAR.AUDI_Q2_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906027JT\xf1\x894145',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300041F \xf1\x891006',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655BD\xf1\x890336\xf1\x82\x1311111111111100311211011231129321312111',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571F60511A1',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ ],
+ },
+ CAR.AUDI_Q3_MK2: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8705E906018N \xf1\x899970',
+ b'\xf1\x8705L906022M \xf1\x890901',
+ b'\xf1\x8783A906259 \xf1\x890001',
+ b'\xf1\x8783A906259 \xf1\x890005',
+ b'\xf1\x8783A906259C \xf1\x890002',
+ b'\xf1\x8783A906259D \xf1\x890001',
+ b'\xf1\x8783A906259F \xf1\x890001',
+ b'\xf1\x8783A906259H \xf1\x890002',
+ b'\xf1\x8783A907115P \xf1\x890002',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8709G927158CN\xf1\x893608',
+ b'\xf1\x8709G927158FL\xf1\x893758',
+ b'\xf1\x8709G927158GG\xf1\x893825',
+ b'\xf1\x8709G927158GP\xf1\x893937',
+ b'\xf1\x8709G927158HC\xf1\x894070',
+ b'\xf1\x8709G927158HG\xf1\x894168',
+ b'\xf1\x870GC300045D \xf1\x892802',
+ b'\xf1\x870GC300046F \xf1\x892701',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655BF\xf1\x890403\xf1\x82\x1321211111211200311121232152219321422111',
+ b'\xf1\x875Q0959655BQ\xf1\x890421\xf1\x82\x132121111121120031112124218A219321532111',
+ b'\xf1\x875Q0959655BQ\xf1\x890421\xf1\x82\x132121111121120031112124218C219321532111',
+ b'\xf1\x875Q0959655CC\xf1\x890421\xf1\x82\x131111111111120031111224118A119321532111',
+ b'\xf1\x875Q0959655CC\xf1\x890421\xf1\x82\x131111111111120031111237116A119321532111',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567G6000300',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567G6000800',
+ b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571G60533A1',
+ b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571G60733A1',
+ b'\xf1\x875QS907145E \xf1\x891122\xf1\x82\x0001G67801]V',
+ b'\xf1\x875TA907145D \xf1\x891051\xf1\x82\x001PG60A1P7N',
+ b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x002VG60A2VOM',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907567C \xf1\x890541',
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.AUDI_Q4_MK1: {
+ (Ecu.inverter, 0x17fc007c, None): [],
+ (Ecu.engine, 0x17fc0076, None): [],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [],
+ (Ecu.cornerRadar, 0x74e, None): [],
+ (Ecu.adas, 0x769, None): [],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [],
+ },
+ CAR.AUDI_Q4_MK2: {
+ (Ecu.inverter, 0x17fc007c, None): [
+ b'\xf1\x870ET907121G \xf1\x897260\xf1\x82040',
+ ],
+ (Ecu.engine, 0x17fc0076, None): [
+ b'\xf1\x870EA906014GC\xf1\x894064',
+ ],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654M \xf1\x895556',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [],
+ (Ecu.adas, 0x769, None): [],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907567B \xf1\x890232',
+ ],
+ },
+ CAR.AUDI_Q5_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x878R0907115N \xf1\x890006',
+ b'\xf1\x878R0907551F \xf1\x890007',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x878R0927158D \xf1\x891010',
+ b'\xf1\x878R0927158AM\xf1\x891003',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x878R0959655F \xf1\x890610\xf1\x82\x050304010402',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x878R0909144R \xf1\x890511\xf1\x82\x01\n\x1a',
+ b'\xf1\x878R0909144F \xf1\x890507\xf1\x82\x01\t\xe6',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x878R0907561A\x00\xf1\x890410\xf1\x80100',
+ ],
+ },
+ CAR.PORSCHE_MACAN_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8795B906259BJ\xf1\x890001',
+ b'\xf1\x8795B906259BM\xf1\x890001',
+ b'\xf1\x8795B90652013\xf1\x893485',
+ b'\xf1\x8795B90654002\xf1\x893495',
+ b'\xf1\x8795B907551AD\xf1\x890001',
+ b'\xf1\x8795B907551D \xf1\x890006',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x8795B927156CE\xf1\x890022',
+ b'\xf1\x8795B927156JH\xf1\x890001',
+ b'\xf1\x8795B927156KD\xf1\x890001',
+ b'\xf1\x8795B927156KK\xf1\x890001',
+ b'\xf1\x8795B927156KP\xf1\x890001',
+ b'\xf1\x8795B927156R \xf1\x890021',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513',
+ b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x050682033514',
+ b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514',
+ b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CG033517',
+ b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CJ02D417',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04#\x04#',
+ b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04/\x04/',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x8795B907567B\x00\xf1\x890800\xf1\x82108',
+ b'\xf1\x8795B907567G\x00\xf1\x890410\xf1\x82104',
+ b'\xf1\x8795B907567H\x00\xf1\x890430\xf1\x82104',
+ b'\xf1\x8795B907567J \xf1\x890440\xf1\x82104',
+ ],
+ },
+ CAR.SEAT_ATECA_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906027KA\xf1\x893749',
+ b'\xf1\x8704L906021EL\xf1\x897542',
+ b'\xf1\x8704L906026BP\xf1\x891198',
+ b'\xf1\x8704L906026BP\xf1\x897608',
+ b'\xf1\x8704L906056CR\xf1\x892181',
+ b'\xf1\x8704L906056CR\xf1\x892797',
+ b'\xf1\x8705E906018AS\xf1\x899596',
+ b'\xf1\x8781A906259B \xf1\x890003',
+ b'\xf1\x878V0906264H \xf1\x890005',
+ b'\xf1\x878V0907115E \xf1\x890002',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300041D \xf1\x891004',
+ b'\xf1\x870CW300041G \xf1\x891003',
+ b'\xf1\x870CW300050J \xf1\x891908',
+ b'\xf1\x870D9300014S \xf1\x895202',
+ b'\xf1\x870D9300042M \xf1\x895016',
+ b'\xf1\x870GC300014P \xf1\x892801',
+ b'\xf1\x870GC300043A \xf1\x892304',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655AC\xf1\x890189\xf1\x82\r11110011110011021511110200',
+ b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r11110011110011021511110200',
+ b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r12110012120012021612110200',
+ b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1212001211001305121211052900',
+ b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1312001313001305171311052900',
+ b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1312001313001305171311052900',
+ b'\xf1\x873Q0959655CM\xf1\x890720\xf1\x82\x0e1312001313001305171311052900',
+ b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100110200--1113121149',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571N60511A1',
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521N01842A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521N01342A1',
+ b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0511N01805A0',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N01309A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N05808A1',
+ b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x0013N619137N',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ b'\xf1\x875Q0907572B \xf1\x890200\xf1\x82\x0101',
+ b'\xf1\x875Q0907572H \xf1\x890620',
+ b'\xf1\x875Q0907572K \xf1\x890402\xf1\x82\x0101',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ ],
+ },
+ CAR.SEAT_LEON_MK4: {
+ (Ecu.engine, 0x7e0, None): [],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW906556JA\xf1\x890780',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x871EA959655CK\xf1\x890166',
+ ],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.cornerRadar, 0x74e, None): [
+ b'\xf1\x872Q0907686E \xf1\x890284',
+ ],
+ (Ecu.adas, 0x769, None): [
+ b'\xf1\x875WA980556D \xf1\x890344',
+ ],
+ (Ecu.parkingAdas, 0x70a, None): [
+ b'\xf1\x875WA919298A \xf1\x890230',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x875WA907572B \xf1\x890395',
+ ],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x875WA980653A \xf1\x893129',
+ ],
+ },
+ CAR.CUPRA_BORN_MK1: {
+ (Ecu.inverter, 0x17fc007c, None): [
+ b'\xf1\x871EA907121AJ\xf1\x893510\xf1\x8201S\x00',
+ ],
+ (Ecu.engine, 0x17fc0076, None): [
+ b'\xf1\x870EA906012EC\xf1\x892855',
+ ],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x871EA959655EH\xf1\x890381',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x871EA907144AQ\xf1\x895033',
+ ],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654L \xf1\x895332',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [
+ b'\xf1\x872Q0907686L \xf1\x890289',
+ ],
+ (Ecu.adas, 0x769, None): [
+ b'\xf1\x871EA980556J \xf1\x890397',
+ ],
+ (Ecu.parkingAdas, 0x70a, None): [
+ b'\xf1\x871EA919294D \xf1\x890421',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907572H \xf1\x890234',
+ ],
+ },
+ CAR.SKODA_ENYAQ_MK1: {
+ (Ecu.inverter, 0x17fc007c, None): [],
+ (Ecu.engine, 0x17fc0076, None): [],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x871EA959655EA\xf1\x890376',
+ ],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654L \xf1\x895332',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [],
+ (Ecu.adas, 0x769, None): [],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907572H \xf1\x890234',
+ ],
+ },
+ CAR.SKODA_ENYAQ_MK2: {
+ (Ecu.inverter, 0x17fc007c, None): [
+ b'\xf1\x870ET907121G \xf1\x897260\xf1\x82040',
+ ],
+ (Ecu.engine, 0x17fc0076, None): [
+ b'\xf1\x870EA906014FS\xf1\x894051',
+ ],
+ (Ecu.transmission, 0x7e1, None): [],
+ (Ecu.srs, 0x715, None): [],
+ (Ecu.eps, 0x712, None): [],
+ (Ecu.fwdCamera, 0x74f, None): [
+ b'\xf1\x871EA980654M \xf1\x895556',
+ ],
+ (Ecu.cornerRadar, 0x74e, None): [],
+ (Ecu.adas, 0x769, None): [],
+ (Ecu.parkingAdas, 0x70a, None): [],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x871EA907567B \xf1\x890232',
+ ],
+ },
+ CAR.SKODA_FABIA_MK4: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8705C906032L \xf1\x891701',
+ b'\xf1\x8705E906018CF\xf1\x891905',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300051G \xf1\x891906',
+ b'\xf1\x870CW300051M \xf1\x891936',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875QF959655AF\xf1\x890753\xf1\x82\x13111100111100111111001102----1111120749',
+ b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100110200--1111120749',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x872Q1909144S \xf1\x896042',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.SKODA_KAMIQ_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704C906025AK\xf1\x897053',
+ b'\xf1\x8705C906032M \xf1\x891333',
+ b'\xf1\x8705C906032M \xf1\x892365',
+ b'\xf1\x8705E906013CK\xf1\x892540',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300020 \xf1\x891906',
+ b'\xf1\x870CW300020 \xf1\x891907',
+ b'\xf1\x870CW300020T \xf1\x892204',
+ b'\xf1\x870CW300050 \xf1\x891709',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1211110411110411--04040404131111112H14',
+ b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x12111104111104112104040404111111112H14',
+ b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x122221042111042121040404042E2711152H14',
+ b'\xf1\x872Q0959655AS\xf1\x890411\xf1\x82\x1311150411110411210404040417151215391413',
+ b'\xf1\x872Q0959655BJ\xf1\x890412\xf1\x82\x132223042111042121040404042B251215391423',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x872Q1909144AB\xf1\x896050',
+ b'\xf1\x872Q1909144M \xf1\x896041',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.SKODA_KAROQ_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8705E906013CL\xf1\x892541',
+ b'\xf1\x8705E906013H \xf1\x892407',
+ b'\xf1\x8705E906018P \xf1\x895472',
+ b'\xf1\x8705E906018P \xf1\x896020',
+ b'\xf1\x8705L906022BS\xf1\x890913',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300020T \xf1\x892202',
+ b'\xf1\x870CW300041S \xf1\x891615',
+ b'\xf1\x870GC300014L \xf1\x892802',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1213001211001101131112012100',
+ b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1213001211001101131122012100',
+ b'\xf1\x873Q0959655DE\xf1\x890731\xf1\x82\x0e1213001211001101131121012J00',
+ b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1312110012120011111100010200--2521210749',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563T6090500',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100500',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100600',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100700',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572AB\xf1\x890397',
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.SKODA_KODIAQ_MK1: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906027DD\xf1\x893123',
+ b'\xf1\x8704E906027LD\xf1\x893433',
+ b'\xf1\x8704E906027NB\xf1\x896517',
+ b'\xf1\x8704E906027NB\xf1\x899504',
+ b'\xf1\x8704L906026DE\xf1\x895418',
+ b'\xf1\x8704L906026EJ\xf1\x893661',
+ b'\xf1\x8704L906026HT\xf1\x893617',
+ b'\xf1\x8705E906018DJ\xf1\x890915',
+ b'\xf1\x8705E906018DJ\xf1\x891903',
+ b'\xf1\x8705L906022GM\xf1\x893411',
+ b'\xf1\x875NA906259E \xf1\x890003',
+ b'\xf1\x875NA907115D \xf1\x890003',
+ b'\xf1\x875NA907115E \xf1\x890003',
+ b'\xf1\x875NA907115E \xf1\x890005',
+ b'\xf1\x8783A907115E \xf1\x890001',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870D9300014S \xf1\x895201',
+ b'\xf1\x870D9300043 \xf1\x895202',
+ b'\xf1\x870DL300011N \xf1\x892014',
+ b'\xf1\x870DL300012G \xf1\x892006',
+ b'\xf1\x870DL300012M \xf1\x892107',
+ b'\xf1\x870DL300012N \xf1\x892110',
+ b'\xf1\x870DL300013G \xf1\x892119',
+ b'\xf1\x870GC300014N \xf1\x892801',
+ b'\xf1\x870GC300018S \xf1\x892803',
+ b'\xf1\x870GC300019H \xf1\x892806',
+ b'\xf1\x870GC300046Q \xf1\x892802',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655AN\xf1\x890306\xf1\x82\r11110011110011031111310311',
+ b'\xf1\x873Q0959655AP\xf1\x890306\xf1\x82\r11110011110011421111314211',
+ b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1213001211001205212111052100',
+ b'\xf1\x873Q0959655BJ\xf1\x890703\xf1\x82\x0e1213001211001205212111052100',
+ b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e1213001211001244212111442100',
+ b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e1213001211001205212112052100',
+ b'\xf1\x873Q0959655CQ\xf1\x890720\xf1\x82\x0e1213111211001205212112052111',
+ b'\xf1\x873Q0959655DJ\xf1\x890731\xf1\x82\x0e1513001511001205232113052J00',
+ b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121240749',
+ b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121246149',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6050405',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6060405',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6070405',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G500',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G600',
+ b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x0025T6BA25OM',
+ b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x002LT61A2LOM',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x872Q0907572AA\xf1\x890396',
+ b'\xf1\x872Q0907572AB\xf1\x890397',
+ b'\xf1\x872Q0907572M \xf1\x890233',
+ b'\xf1\x872Q0907572Q \xf1\x890342',
+ b'\xf1\x872Q0907572R \xf1\x890372',
+ b'\xf1\x872Q0907572T \xf1\x890383',
+ ],
+ },
+ CAR.SKODA_OCTAVIA_MK3: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704C906025L \xf1\x896198',
+ b'\xf1\x8704C906026AB\xf1\x892993',
+ b'\xf1\x8704E906016ER\xf1\x895823',
+ b'\xf1\x8704E906027HD\xf1\x893742',
+ b'\xf1\x8704E906027MH\xf1\x894786',
+ b'\xf1\x8704L906021DT\xf1\x898127',
+ b'\xf1\x8704L906021ER\xf1\x898361',
+ b'\xf1\x8704L906026BP\xf1\x897608',
+ b'\xf1\x8704L906026BS\xf1\x891541',
+ b'\xf1\x8704L906026BT\xf1\x897612',
+ b'\xf1\x875G0906259C \xf1\x890002',
+ b'\xf1\x875G0906259N \xf1\x890003',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300041L \xf1\x891601',
+ b'\xf1\x870CW300041N \xf1\x891605',
+ b'\xf1\x870CW300043B \xf1\x891601',
+ b'\xf1\x870CW300043P \xf1\x891605',
+ b'\xf1\x870CW300049M \xf1\x890901',
+ b'\xf1\x870D9300012H \xf1\x894518',
+ b'\xf1\x870D9300014T \xf1\x895221',
+ b'\xf1\x870D9300041C \xf1\x894936',
+ b'\xf1\x870D9300041H \xf1\x895220',
+ b'\xf1\x870D9300041J \xf1\x894902',
+ b'\xf1\x870D9300041P \xf1\x894507',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x873Q0959655AC\xf1\x890200\xf1\x82\r11120011100010022212110200',
+ b'\xf1\x873Q0959655AK\xf1\x890306\xf1\x82\r31210031210021033733310331',
+ b'\xf1\x873Q0959655AP\xf1\x890305\xf1\x82\r11110011110011213331312131',
+ b'\xf1\x873Q0959655AQ\xf1\x890200\xf1\x82\r11120011100010312212113100',
+ b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r11120011100010022212110200',
+ b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e3221003221002105755331052100',
+ b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e3221003221002132755331322100',
+ b'\xf1\x873Q0959655CM\xf1\x890720\xf1\x82\x0e3221003221002105755331052100',
+ b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e3221003221002105755331052100',
+ b'\xf1\x875QD959655 \xf1\x890388\xf1\x82\x111101000011110006110411111111119111',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A01513A1',
+ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571T01512A1',
+ b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521T00403A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00403A1',
+ b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00603A1',
+ b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516A00604A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521T00401A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521T00601A1',
+ b'\xf1\x875QD909144E \xf1\x891081\xf1\x82\x0521T00503A1',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x875Q0907567P \xf1\x890100\xf1\x82\x0101',
+ b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101',
+ b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101',
+ b'\xf1\x875Q0907572H \xf1\x890620',
+ b'\xf1\x875Q0907572J \xf1\x890654',
+ b'\xf1\x875Q0907572K \xf1\x890402\xf1\x82\x0101',
+ b'\xf1\x875Q0907572P \xf1\x890682',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ ],
+ },
+ CAR.SKODA_SUPERB_MK3: {
+ (Ecu.engine, 0x7e0, None): [
+ b'\xf1\x8704E906027BS\xf1\x892887',
+ b'\xf1\x8704E906027BT\xf1\x899042',
+ b'\xf1\x8704L906026ET\xf1\x891343',
+ b'\xf1\x8704L906026ET\xf1\x891990',
+ b'\xf1\x8704L906026FP\xf1\x891196',
+ b'\xf1\x8704L906026KA\xf1\x896014',
+ b'\xf1\x8704L906026KB\xf1\x894071',
+ b'\xf1\x8704L906026KD\xf1\x894798',
+ b'\xf1\x8704L906026MT\xf1\x893076',
+ b'\xf1\x8705L906022BK\xf1\x899971',
+ b'\xf1\x873G0906259 \xf1\x890004',
+ b'\xf1\x873G0906259B \xf1\x890002',
+ b'\xf1\x873G0906259L \xf1\x890003',
+ b'\xf1\x873G0906264A \xf1\x890002',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'\xf1\x870CW300042H \xf1\x891601',
+ b'\xf1\x870CW300043B \xf1\x891603',
+ b'\xf1\x870CW300049Q \xf1\x890906',
+ b'\xf1\x870D9300011T \xf1\x894801',
+ b'\xf1\x870D9300012 \xf1\x894940',
+ b'\xf1\x870D9300013A \xf1\x894905',
+ b'\xf1\x870D9300014K \xf1\x895006',
+ b'\xf1\x870D9300041H \xf1\x894905',
+ b'\xf1\x870D9300042M \xf1\x895013',
+ b'\xf1\x870D9300043F \xf1\x895202',
+ b'\xf1\x870GC300013K \xf1\x892403',
+ b'\xf1\x870GC300014M \xf1\x892801',
+ b'\xf1\x870GC300019G \xf1\x892803',
+ b'\xf1\x870GC300043 \xf1\x892301',
+ b'\xf1\x870GC300046D \xf1\x892402',
+ ],
+ (Ecu.srs, 0x715, None): [
+ b'\xf1\x875Q0959655AE\xf1\x890130\xf1\x82\x12111200111121001121110012211292221111',
+ b'\xf1\x875Q0959655AE\xf1\x890130\xf1\x82\x12111200111121001121118112231292221111',
+ b'\xf1\x875Q0959655AK\xf1\x890130\xf1\x82\x12111200111121001121110012211292221111',
+ b'\xf1\x875Q0959655AS\xf1\x890317\xf1\x82\x1331310031313100313131823133319331313100',
+ b'\xf1\x875Q0959655AT\xf1\x890317\xf1\x82\x1331310031313100313131013131319331313100',
+ b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1331310031313100313131013141319331413100',
+ b'\xf1\x875Q0959655BK\xf1\x890336\xf1\x82\x1331310031313100313131013141319331413100',
+ b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1333310031313100313152015351539331423100',
+ b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1331310031313100313151013141319331423100',
+ b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1331310031313100313151823143319331423100',
+ b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1333310031313100313152025350539331463100',
+ b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1333310031313100313152855372539331463100',
+ ],
+ (Ecu.eps, 0x712, None): [
+ b'\xf1\x875Q0909143K \xf1\x892033\xf1\x820514UZ070203',
+ b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522UZ050303',
+ b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522UZ070303',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526UZ060505',
+ b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526UZ070505',
+ b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563UZ060600',
+ b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563UZ060700',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567UZ070500',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567UZ070600',
+ b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567UZ070700',
+ ],
+ (Ecu.fwdRadar, 0x757, None): [
+ b'\xf1\x873Q0907572B \xf1\x890192',
+ b'\xf1\x873Q0907572B \xf1\x890194',
+ b'\xf1\x873Q0907572C \xf1\x890195',
+ b'\xf1\x875Q0907572R \xf1\x890771',
+ b'\xf1\x875Q0907572S \xf1\x890780',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/interface.py b/iqdbc_repo/iqdbc/car/volkswagen/interface.py
new file mode 100644
index 000000000..e86118cb9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/interface.py
@@ -0,0 +1,350 @@
+import time
+
+from iqdbc.car import get_safety_config, structs, uds
+from iqdbc.car.carlog import carlog
+from iqdbc.car.interfaces import CarInterfaceBase
+from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery
+from iqdbc.car.volkswagen.carcontroller import CarController
+from iqdbc.car.volkswagen.carstate import CarState
+from iqdbc.car.volkswagen.values import (
+ CAR, CanBus, DashcamOnlyReason, NetworkLocation, RADAR_DISABLE_STATE, TransmissionType,
+ VolkswagenFlags, VolkswagenSafetyFlags, VolkswagenFlagsIQ, get_longitudinal_stopping_speed_override,
+)
+from iqdbc.car.volkswagen.radar_interface import RadarInterface
+import sys
+import os
+iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..')
+sys.path.insert(0, iqpilot_path)
+try:
+ from openpilot.common.params import Params
+except ImportError:
+ pass
+
+try:
+ from openpilot.system.proprietary_runtime._verified_import import import_verified_module
+except Exception:
+ import_verified_module = None
+
+
+class CarInterface(CarInterfaceBase):
+ CarState = CarState
+ CarController = CarController
+ RadarInterface = RadarInterface
+
+ DRIVABLE_GEARS = (structs.CarState.GearShifter.eco, structs.CarState.GearShifter.sport,
+ structs.CarState.GearShifter.manumatic, structs.CarState.GearShifter.neutral)
+
+ @staticmethod
+ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
+ ret.brand = "volkswagen"
+ ret.radarUnavailable = True
+ _params = Params()
+ angle_lat_enabled = _params.get_bool("AngleLateralControl")
+ joystick_mode = _params.get_bool("JoystickDebugMode")
+
+ if ret.flags & VolkswagenFlags.PQ:
+ # Set global PQ35/PQ46/NMS parameters
+ safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenPq)]
+ if candidate == CAR.SEAT_ALHAMBRA_MK1:
+ ret.flags |= VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB.value
+ if not (ret.flags & VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB) and _params.get_bool("VwPqEpsPatched"):
+ ret.minSteerSpeed = 0
+ if angle_lat_enabled:
+ ret.flags |= VolkswagenFlagsIQ.IQ_LVBS_ALC_MODULE.value
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_ALC_MODULE.value
+ if alpha_long:
+ ret.flags |= VolkswagenFlagsIQ.IQ_PQ_SNG_ECD.value
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_SNG_ECD.value
+ ret.enableBsm = 0x3BA in fingerprint[0] # SWA_1
+
+ if 0x440 in fingerprint[0] or docs: # Getriebe_1
+ ret.transmissionType = TransmissionType.automatic
+ else:
+ ret.transmissionType = TransmissionType.manual
+
+ # Auto-detect CC only mode by checking for ACC / AWV presence
+ # ACC_System = 0x368, ACC_GRA_Anzeige = 0x56A, AWV = 0x366
+ has_acc = 0x368 in fingerprint[0] or 0x56A in fingerprint[0]
+ if not has_acc:
+ has_radar = 0x366 in fingerprint[0] # AWV for FCW/AEB
+ if has_radar:
+ ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY.value
+ else:
+ ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR.value
+
+ cc_only_flags = VolkswagenFlagsIQ.IQ_CC_ONLY | VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR
+ if ret.flags & cc_only_flags:
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_NO_CAM_BUS.value
+ if (ret.flags & cc_only_flags) and not fingerprint[0]:
+ ret.flags |= VolkswagenFlagsIQ.IQ_PQ_LOWLINE.value
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_LOWLINE.value
+
+ if any(msg in fingerprint[1] for msg in (0x1A0, 0xC2)): # Bremse_1, Lenkwinkel_1
+ ret.networkLocation = NetworkLocation.gateway
+ else:
+ ret.networkLocation = NetworkLocation.fwdCamera
+
+ ret.dashcamOnly = False
+
+ elif ret.flags & VolkswagenFlags.MLB:
+ # Set global MLB parameters
+ safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMlb)]
+ ret.enableBsm = 0x30F in fingerprint[0] # SWA_01
+ ret.networkLocation = NetworkLocation.gateway
+ ret.transmissionType = TransmissionType.automatic
+ ret.dashcamOnly = False
+
+ elif ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ if ret.flags & VolkswagenFlags.MEB:
+ safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMeb)]
+ else:
+ safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMqbEvo)]
+
+ if ret.flags & VolkswagenFlags.MEB_GEN2:
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.ALT_CRC_VARIANT_1.value
+ if ret.flags & VolkswagenFlags.MQB_EVO:
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.NO_GAS_OFFSET.value
+
+ ret.enableBsm = 0x24C in fingerprint[0] # MEB_Side_Assist_01
+ ret.transmissionType = TransmissionType.direct
+ ret.steerControlType = structs.CarParams.SteerControlType.curvatureDEPRECATED
+ ret.steerAtStandstill = True
+
+ if any(msg in fingerprint[1] for msg in (0x520, 0x86, 0xFD, 0x13D)): # Airbag_02, LWI_01, ESP_21, QFK_01
+ ret.networkLocation = NetworkLocation.gateway
+ else:
+ ret.networkLocation = NetworkLocation.fwdCamera
+
+ if ret.networkLocation == NetworkLocation.gateway:
+ ret.radarUnavailable = False
+
+ if ret.networkLocation == NetworkLocation.fwdCamera:
+ ret.flags |= VolkswagenFlags.DISABLE_RADAR.value
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.DISABLE_RADAR.value
+
+ if 0x30B in fingerprint[0]: # Kombi_01
+ ret.flags |= VolkswagenFlags.KOMBI_PRESENT.value
+ if 0x25D in fingerprint[0]: # KLR_01
+ ret.flags |= VolkswagenFlags.STOCK_KLR_PRESENT.value
+ if all(msg in fingerprint[1] for msg in (0x462, 0x463, 0x464)): # PSD_04, PSD_05, PSD_06
+ ret.flags |= VolkswagenFlags.STOCK_PSD_PRESENT.value
+ if 0x464 in fingerprint[0]: # PSD_06
+ ret.flags |= VolkswagenFlags.STOCK_PSD_06_PRESENT.value
+ if 0x6B2 in fingerprint[0]: # Diagnose_01
+ ret.flags |= VolkswagenFlags.STOCK_DIAGNOSE_01_PRESENT.value
+ if 0x3DC in fingerprint[0]: # Gateway_73
+ ret.flags |= VolkswagenFlags.ALT_GEAR.value
+
+ else:
+ # Set global MQB parameters
+ safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagen)]
+ ret.enableBsm = 0x30F in fingerprint[0] # SWA_01
+
+ if 0xAD in fingerprint[0] or docs: # Getriebe_11
+ ret.transmissionType = TransmissionType.automatic
+ elif 0x187 in fingerprint[0]: # Motor_EV_01
+ ret.transmissionType = TransmissionType.direct
+ else:
+ ret.transmissionType = TransmissionType.manual
+
+ if any(msg in fingerprint[1] for msg in (0x40, 0x86, 0xB2, 0xFD)): # Airbag_01, LWI_01, ESP_19, ESP_21
+ ret.networkLocation = NetworkLocation.gateway
+ else:
+ ret.networkLocation = NetworkLocation.fwdCamera
+
+ if 0x126 in fingerprint[2]: # HCA_01
+ ret.flags |= VolkswagenFlags.STOCK_HCA_PRESENT.value
+ if 0x6B8 in fingerprint[0]: # Kombi_03
+ ret.flags |= VolkswagenFlags.KOMBI_PRESENT.value
+
+ # Auto-detect CC only mode by checking for ACC_06/ACC_07 presence
+ # ACC_06 = 0x122, ACC_07 = 0x12E, ACC_10 = 0x117
+ has_acc = 0x122 in fingerprint[0] or 0x12E in fingerprint[0]
+ if not has_acc:
+ has_radar = 0x117 in fingerprint[0] # ACC_10 for FCW/AEB
+ if has_radar:
+ ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY.value
+ else:
+ ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR.value
+
+ # Global lateral tuning defaults, can be overridden per-vehicle
+
+ ret.steerLimitTimer = 0.4
+ if ret.flags & VolkswagenFlags.PQ:
+ ret.steerActuatorDelay = 0.2
+ ret.longitudinalTuning.kf = 1.2
+ ret.longitudinalTuning.kpBP = [0.]
+ ret.longitudinalTuning.kpV = [.45]
+ ret.longitudinalTuning.kiBP = [0.]
+ ret.longitudinalTuning.kiV = [.69]
+ ret.longitudinalActuatorDelay = 0.6
+ if angle_lat_enabled:
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+ ret.steerAtStandstill = bool(joystick_mode)
+ else:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+ elif ret.flags & VolkswagenFlags.MLB:
+ ret.steerActuatorDelay = 0.2
+ if angle_lat_enabled:
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+ ret.steerAtStandstill = bool(joystick_mode)
+ else:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+ elif ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ ret.steerActuatorDelay = 0.3
+ else:
+ ret.steerActuatorDelay = 0.1
+ if angle_lat_enabled:
+ ret.steerControlType = structs.CarParams.SteerControlType.angle
+ ret.steerAtStandstill = bool(joystick_mode)
+ else:
+ CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
+
+ # Global longitudinal tuning defaults, can be overridden per-vehicle
+
+ if ret.flags & VolkswagenFlags.MEB:
+ ret.longitudinalActuatorDelay = 0.5
+ ret.radarDelay = 0.8
+ ret.longitudinalTuning.kiBP = [0., 30.]
+ ret.longitudinalTuning.kiV = [0.4, 0.]
+
+ ret.alphaLongitudinalAvailable = ret.networkLocation == NetworkLocation.gateway or docs or bool(ret.flags & VolkswagenFlags.DISABLE_RADAR)
+ if alpha_long:
+ # Proof-of-concept, prep for E2E only. No radar points available. Panda ALLOW_DEBUG firmware required.
+ ret.openpilotLongitudinalControl = True
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.LONG_CONTROL.value
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED.value
+ if ret.transmissionType == TransmissionType.manual:
+ ret.minEnableSpeed = 4.5
+
+ # Per-vehicle overrides
+
+ if candidate == CAR.PORSCHE_MACAN_MK1:
+ ret.steerActuatorDelay = 0.07
+
+ if candidate == CAR.VOLKSWAGEN_PASSAT_B7 or CAR.SEAT_ALHAMBRA_MK1:
+ ret.flags |= VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB.value
+ safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_ACC_FTS_EPB.value
+
+ ret.pcmCruise = not ret.openpilotLongitudinalControl
+ ret.stopAccel = -0.55
+ ret.autoResumeSng = ret.minEnableSpeed == -1
+ CAN = CanBus(fingerprint=fingerprint)
+ if CAN.pt >= 4:
+ safety_configs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput))
+ ret.safetyConfigs = safety_configs
+
+ return ret
+
+ @staticmethod
+ def pre_init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv, can_send):
+ if not (CP.flags & VolkswagenFlags.PQ) or (CP.flags & VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB) or import_verified_module is None:
+ return
+ try:
+ params = Params()
+ if params.get_bool("VwPqEpsPatched"):
+ return
+ flasher = import_verified_module("iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.hephaestus.vw_pq_flasher")
+ status = flasher.check_eps_patch_status(1, can_recv, can_send)
+ except Exception:
+ return
+ if status == "patched":
+ params.put_bool("VwPqEpsPatched", True)
+
+ @staticmethod
+ def init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv, can_send):
+ # Disable radar via UDS programming session so openpilot can take over longitudinal.
+ # The radar stops transmitting AWV_03/Strukturen_01 and carcontroller replaces those messages.
+ if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR):
+ RADAR_DISABLE_STATE["error"] = False
+ if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ if CarInterface._is_engine_state_allowed_meb(can_recv):
+ carlog.warning("VW MEB/MQBevo: disabling radar for longitudinal control")
+ if not CarInterface._radar_communication_control(CP, can_recv, can_send):
+ RADAR_DISABLE_STATE["error"] = True
+ else:
+ RADAR_DISABLE_STATE["error"] = True
+ carlog.warning("VW MEB/MQBevo: radar cannot be disabled — engine is on")
+
+ @staticmethod
+ def deinit(CP: structs.CarParams, can_recv, can_send):
+ # Re-enable radar TX on exit (currently never called by openpilot, car recovers after ignition cycle)
+ if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR):
+ if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ CarInterface._radar_communication_control(CP, can_recv, can_send, disable=False)
+
+ @staticmethod
+ def _radar_communication_control(CP, can_recv, can_send, disable=True) -> bool:
+ # Send UDS commands to put the radar (addr 0x757) into programming session,
+ # which silences its CAN TX so openpilot can send replacement messages.
+ bus = CanBus(CP).pt
+ addr_radar = 0x757
+ addr_diag = 0x700 # Functional address for TesterPresent broadcast
+ vw_rx_offset = 0x6A
+
+ tp_req = bytes([uds.SERVICE_TYPE.TESTER_PRESENT, 0x00])
+ tp_resp = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40, 0x00])
+ ext_diag_req = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC])
+ ext_diag_resp = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC])
+ flash_req = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, uds.SESSION_TYPE.PROGRAMMING])
+ empty_resp = b''
+
+ txt = "disable" if disable else "enable"
+
+ for attempt in range(3):
+ try:
+ if disable:
+ # Step 1: TesterPresent — wake up the radar
+ query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)],
+ [tp_req], [tp_resp], vw_rx_offset, functional_addrs=[addr_diag])
+ if not query.get_data(0.5):
+ carlog.warning(f"VW radar {txt}: TesterPresent no response on attempt {attempt + 1}")
+ continue
+
+ # Step 2: Extended diagnostic session
+ query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)],
+ [ext_diag_req], [ext_diag_resp], vw_rx_offset)
+ if not query.get_data(0.5):
+ carlog.warning(f"VW radar {txt}: ExtendedDiagSession no response on attempt {attempt + 1}")
+ continue
+
+ # Step 3: Programming session — radar stops transmitting
+ query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)],
+ [flash_req], [empty_resp], vw_rx_offset)
+ query.get_data(0) # fire-and-forget, no wait needed
+ carlog.warning(f"VW radar {txt}: programming session sent on attempt {attempt + 1}")
+
+ return True
+
+ except Exception as e:
+ carlog.error(f"VW radar {txt}: exception on attempt {attempt + 1}: {repr(e)}")
+ continue
+
+ carlog.error(f"VW radar {txt}: all attempts failed")
+ return False
+
+ @staticmethod
+ def _is_engine_state_allowed_meb(can_recv, timeout: float = 0.5) -> bool:
+ # Read Motor_54 (0x14C) to check Engine_On bit before attempting radar disable.
+ # Programming session is rejected by radar when engine is running.
+ end_time = time.monotonic() + timeout
+ while time.monotonic() < end_time:
+ packets = can_recv(wait_for_one=True) or []
+ for packet in packets:
+ for msg in packet:
+ if msg.address != 0x14C:
+ continue
+ engine_on = bool((msg.dat[9] >> 5) & 0x01)
+ if engine_on:
+ carlog.warning(f"VW radar disable: engine is on, skipping")
+ return False
+ else:
+ carlog.warning(f"VW radar disable: engine is off, proceeding")
+ return True
+ carlog.warning("VW radar disable: Motor_54 not seen within timeout, assuming allowed")
+ return True
+
+ @staticmethod
+ def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams:
+ ret.longitudinalStoppingSpeedOverride = get_longitudinal_stopping_speed_override(candidate, stock_cp.flags)
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/mebcan.py b/iqdbc_repo/iqdbc/car/volkswagen/mebcan.py
new file mode 100644
index 000000000..3c4fc4453
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/mebcan.py
@@ -0,0 +1,388 @@
+from iqdbc.car.volkswagen.mebutils import map_speed_to_acc_tempolimit
+from iqdbc.car.volkswagen.values import VolkswagenFlags
+from iqdbc.car.volkswagen.speed_limit_manager import PSD_TYPE_CURV_SPEED
+from iqdbc.car.common.conversions import Conversions as CV
+
+ACCEL_INACTIVE = 3.01
+ACCEL_OVERRIDE = 0.00
+
+ACC_CTRL_ERROR = 6
+ACC_CTRL_OVERRIDE = 4
+ACC_CTRL_ACTIVE = 3
+ACC_CTRL_ENABLED = 2
+ACC_CTRL_DISABLED = 0
+
+ACC_HMS_RAMP_RELEASE = 5
+ACC_HMS_RELEASE = 4
+ACC_HMS_HOLD = 1
+ACC_HMS_NO_REQUEST = 0
+
+ACC_HUD_ERROR = 6
+ACC_HUD_OVERRIDE = 4
+ACC_HUD_ACTIVE = 3
+ACC_HUD_ENABLED = 2
+ACC_HUD_DISABLED = 0
+
+
+def create_steering_control(packer, bus, apply_curvature, lkas_enabled, power):
+ values = {
+ "Curvature": abs(apply_curvature), # in rad/m
+ "Curvature_VZ": 1 if apply_curvature > 0 and lkas_enabled else 0,
+ "Power": power if lkas_enabled else 0,
+ "RequestStatus": 4 if lkas_enabled else 2,
+ "HighSendRate": lkas_enabled,
+ }
+ return packer.make_can_msg("HCA_03", bus, values)
+
+
+def create_eps_update(packer, bus, eps_stock_values, ea_simulated_torque):
+ values = {s: eps_stock_values[s] for s in [
+ "COUNTER", # Sync counter value to EPS output
+ "EPS_Lenkungstyp", # EPS rack type
+ "EPS_Berechneter_LW", # Absolute raw steering angle
+ "EPS_VZ_BLW", # Raw steering angle sign
+ "EPS_HCA_Status", # EPS HCA control status
+ ]}
+
+ values.update({
+ # Absolute driver torque input and sign, with EA inactivity mitigation
+ "EPS_Lenkmoment": abs(ea_simulated_torque),
+ "EPS_VZ_Lenkmoment": 1 if ea_simulated_torque < 0 else 0,
+ })
+
+ return packer.make_can_msg("LH_EPS_03", bus, values)
+
+
+def create_blinker_control(packer, bus, ea_hud_stock_values, ea_control_stock_values, left_blinker, right_blinker, hide_error):
+ values = {s: ea_hud_stock_values[s] for s in [
+ "EA_Texte",
+ "ACF_Lampe_Hands_Off",
+ "EA_Infotainment_Anf",
+ "EA_Tueren_Anf",
+ "EA_Innenraumlicht_Anf",
+ "zFAS_Warnblinken",
+ "STP_Primaeranz",
+ "EA_Bremslichtblinken",
+ "EA_Blinken",
+ "EA_Unknown",
+ ]}
+
+ if ea_hud_stock_values["EA_Blinken"] == 0:
+ values.update({
+ "EA_Blinken": 1 if left_blinker else (2 if right_blinker else ea_hud_stock_values["EA_Blinken"]),
+ })
+
+ if hide_error and ea_control_stock_values["EA_Funktionsstatus"] in (0, 1, 7, 8):
+ values.update({
+ "EA_Texte": 0,
+ "EA_Unknown": 1,
+ })
+
+ return packer.make_can_msg("EA_02", bus, values)
+
+
+def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, sound_alert):
+ display_mode = 1 if lat_active else 0 # travel assist style showing yellow lanes when op is active
+
+ values = {}
+ if len(ldw_stock_values):
+ values = {s: ldw_stock_values[s] for s in [
+ "LDW_SW_Warnung_links", # Blind spot in warning mode on left side due to lane departure
+ "LDW_SW_Warnung_rechts", # Blind spot in warning mode on right side due to lane departure
+ "LDW_Seite_DLCTLC", # Direction of most likely lane departure (left or right)
+ "LDW_DLC", # Lane departure, distance to line crossing
+ "LDW_TLC", # Lane departure, time to line crossing
+ ]}
+
+ values.update({
+ "LDW_Gong": sound_alert,
+ "LDW_Status_LED_gelb": 1 if lat_active and steering_pressed else 0,
+ "LDW_Status_LED_gruen": 1 if lat_active and not steering_pressed else 0,
+ "LDW_Lernmodus_links": 3 + display_mode if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible + display_mode,
+ "LDW_Lernmodus_rechts": 3 + display_mode if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible + display_mode,
+ "LDW_Texte": hud_alert,
+ })
+ return packer.make_can_msg("LDW_02", bus, values)
+
+
+def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, up=False, down=False, set_button=False):
+ values = {s: gra_stock_values[s] for s in [
+ "GRA_Hauptschalter", # ACC button, on/off
+ "GRA_Typ_Hauptschalter", # ACC main button type
+ "GRA_Codierung", # ACC button configuration/coding
+ "GRA_Tip_Stufe_2", # unknown related to stalk type
+ "GRA_ButtonTypeInfo", # unknown related to stalk type
+ ]}
+
+ values.update({
+ "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16,
+ "GRA_Abbrechen": cancel,
+ "GRA_Tip_Wiederaufnahme": resume or up,
+ "GRA_Tip_Setzen": down,
+ })
+ return packer.make_can_msg("GRA_ACC_01", bus, values)
+
+
+def create_capacitive_wheel_touch(packer, bus, lat_active, klr_stock_values):
+ values = {s: klr_stock_values[s] for s in [
+ "COUNTER",
+ "KLR_Touchintensitaet_1",
+ "KLR_Touchintensitaet_2",
+ "KLR_Touchintensitaet_3",
+ "KLR_Touchauswertung",
+ ]}
+
+ if lat_active:
+ values.update({
+ "COUNTER": (klr_stock_values["COUNTER"] + 1) % 16,
+ "KLR_Touchintensitaet_1": 80,
+ "KLR_Touchintensitaet_2": 200,
+ "KLR_Touchintensitaet_3": 10,
+ "KLR_Touchauswertung": 10,
+ })
+ return packer.make_can_msg("KLR_01", bus, values)
+
+
+def acc_control_value(main_switch_on, acc_faulted, long_active, override):
+
+ if acc_faulted:
+ acc_control = ACC_CTRL_ERROR # error state
+ elif long_active:
+ if override:
+ acc_control = ACC_CTRL_OVERRIDE # overriding
+ else:
+ acc_control = ACC_CTRL_ACTIVE # active long control state
+ elif main_switch_on:
+ acc_control = ACC_CTRL_ENABLED # long control ready
+ else:
+ acc_control = ACC_CTRL_DISABLED # long control deactivated state
+
+ return acc_control
+
+
+def acc_hold_type(main_switch_on, acc_faulted, long_active, starting, stopping, esp_hold, override, override_begin, long_disabling):
+ # warning: car is reacting to hold mechanic even with long control off
+
+ if acc_faulted:
+ acc_hold_type = ACC_HMS_NO_REQUEST # no hold request
+ elif not long_active:
+ if long_disabling:
+ acc_hold_type = ACC_HMS_RAMP_RELEASE # ramp release of requests right after disabling long control (prevents car error with EPB at low speed)
+ else:
+ acc_hold_type = ACC_HMS_NO_REQUEST # no hold request
+ elif override:
+ if override_begin:
+ acc_hold_type = ACC_HMS_RAMP_RELEASE # ramp release of requests at the beginning of override (prevents car error with EPB at low speed)
+ else:
+ acc_hold_type = ACC_HMS_NO_REQUEST # overriding / no request
+ elif starting:
+ acc_hold_type = ACC_HMS_RELEASE # release request and startup
+ elif stopping or esp_hold:
+ acc_hold_type = ACC_HMS_HOLD # hold or hold request
+ else:
+ acc_hold_type = ACC_HMS_NO_REQUEST # no hold request
+
+ return acc_hold_type
+
+
+def create_acc_accel_control(packer, bus, CP, acc_type, acc_enabled, upper_jerk, lower_jerk, upper_control_limit, lower_control_limit,
+ accel, acc_control, acc_hold_type, stopping, starting, esp_hold, speed, override, travel_assist_available):
+ # active longitudinal control disables one pedal driving (regen mode) while using overriding mechnism
+ # error mitigation when stopping or stopped: (newer gen cars can be very sensitive)
+ # - send 0 m stopping distance for cars in kind of parameterized stopping mode (stopping accel -0.2 seen for those cars)
+ # -> this mode is seen for different cars with same firmware radars so could be a coded operational mode
+ # - jerk and control limits values set to 0 when fully stopped
+ # - set accel to 0 / no stop accel for full stop (seems to be compatible with old (non 0 stop accel) and new gen, because HMS state holds the car anyways)
+ # - stopping command sent as long as actually stopping
+ commands = []
+
+ terminal_rollout = 0.5 if CP.flags & VolkswagenFlags.MQB_EVO else 0
+
+ full_stop = stopping and esp_hold
+ full_stop_no_start = esp_hold and not starting
+ actually_stopping = stopping and not esp_hold
+
+ if acc_enabled:
+ if override: # the car expects a non inactive accel while overriding
+ acceleration = ACCEL_OVERRIDE # original ACC still sends active accel in this case (seamless experience)
+ elif full_stop:
+ acceleration = ACCEL_INACTIVE # inactive accel, newer gen >2024 error of not neutral value
+ else:
+ acceleration = accel
+ else:
+ acceleration = ACCEL_INACTIVE # inactive accel
+
+ values = {
+ "ACC_Typ": acc_type,
+ "ACC_Status_ACC": acc_control,
+ "ACC_StartStopp_Info": acc_enabled,
+ "ACC_Sollbeschleunigung_02": acceleration,
+ "ACC_zul_Regelabw_unten": lower_control_limit if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0,
+ "ACC_zul_Regelabw_oben": upper_control_limit if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0,
+ "ACC_neg_Sollbeschl_Grad_02": lower_jerk if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0,
+ "ACC_pos_Sollbeschl_Grad_02": upper_jerk if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0,
+ "ACC_Anfahren": starting,
+ "ACC_Anhalten": 1 if actually_stopping else 0,
+ "ACC_Anhalteweg": terminal_rollout if actually_stopping else 20.46, # if used the car can execute a hard brake probably if target is too close
+ "ACC_Anforderung_HMS": acc_hold_type,
+ "ACC_AKTIV_regelt": 1 if acc_control == ACC_CTRL_ACTIVE else 0,
+ "Speed": speed,
+ "SET_ME_0XFE": 0xFE,
+ "SET_ME_0X1": 0x1,
+ "SET_ME_0X9": 0x9,
+ }
+
+ if CP.flags & VolkswagenFlags.MEB_GEN2:
+ values.update({
+ "SET_ME_0x2FE": 0x2FE, # unclear if neccessary
+ })
+
+ commands.append(packer.make_can_msg("ACC_18", bus, values))
+
+ if travel_assist_available:
+ # satisfy car to prevent errors when pressing Travel Assist Button
+ values_ta = {
+ "Travel_Assist_Status": 4 if acc_enabled else 2,
+ "Travel_Assist_Request": 0,
+ "Travel_Assist_Available": 1,
+ }
+
+ commands.append(packer.make_can_msg("TA_01", bus, values_ta))
+
+ return commands
+
+
+def acc_hud_status_value(main_switch_on, acc_faulted, long_active, override):
+
+ if acc_faulted:
+ acc_hud_control = ACC_HUD_ERROR # error state
+ elif long_active:
+ if override:
+ acc_hud_control = ACC_HUD_OVERRIDE # overriding
+ else:
+ acc_hud_control = ACC_HUD_ACTIVE # active
+ elif main_switch_on:
+ acc_hud_control = ACC_HUD_ENABLED # inactive
+ else:
+ acc_hud_control = ACC_HUD_DISABLED # deactivated
+
+ return acc_hud_control
+
+
+def acc_hud_event(acc_hud_control, esp_hold, speed_limit_predicative, speed_limit_predicative_type, speed_limit):
+ acc_event = 0
+
+ if esp_hold and acc_hud_control == ACC_HUD_ACTIVE:
+ acc_event = 3 # acc ready message at standstill
+ elif acc_hud_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) and speed_limit_predicative:
+ if speed_limit_predicative_type == PSD_TYPE_CURV_SPEED:
+ acc_event = 6 # acc limited by curve (predicative)
+ else:
+ acc_event = 4 # acc limited by speed limit by nav (predicative)
+ elif acc_hud_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) and speed_limit:
+ acc_event = 5 # acc limited by speed limit by camera (recently detected)
+
+ return acc_event
+
+
+def get_desired_gap(distance_bars, desired_gap, current_gap_signal):
+ # mapping desired gap to correct signal of corresponding distance bar
+ gap = 0
+
+ if distance_bars == current_gap_signal:
+ gap = desired_gap
+
+ return gap
+
+
+def create_acc_hud_control(packer, bus, acc_control, set_speed, lead_visible, distance_bars, show_distance_bars, esp_hold, distance, desired_gap, fcw_alert, acc_event, speed_limit):
+
+ values = {
+ "ACC_Status_ACC": acc_control,
+ "ACC_Tempolimit": map_speed_to_acc_tempolimit(speed_limit) if acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # display speed limits (message type defined by ACC_Events)
+ "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36,
+ "ACC_Gesetzte_Zeitluecke": distance_bars, # 5 distance bars available (3 are used by OP)
+ "ACC_Display_Prio": 0 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 1, # probably keeping warning in front
+ "ACC_Optischer_Fahrerhinweis": 1 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # enables optical warning
+ "ACC_Akustischer_Fahrerhinweis": 3 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # enables sound warning
+ "ACC_Texte_Zusatzanz_02": 11 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # type of warning: Break!
+ "ACC_Abstandsindex_02": 569, # seems to be default for MEB but is not static in every case
+ "ACC_EGO_Fahrzeug": 2 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else (1 if acc_control == ACC_HUD_ACTIVE else 0), # red car warn symbol for fcw
+ "Lead_Type_Detected": 1 if lead_visible else 0, # object should be displayed
+ "Lead_Type": 3 if lead_visible else 0, # displaying a car
+ "Lead_Distance": distance if lead_visible else 0, # hud distance of object
+ "ACC_Enabled": 1 if acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0,
+ "ACC_Standby_Override": 1 if acc_control != ACC_HUD_ACTIVE else 0,
+ "Street_Color": 1 if acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # light grey (1) or dark (0) street
+ "Lead_Brightness": 3 if acc_control == ACC_HUD_ACTIVE else 0, # object shows in colour
+ "ACC_Events": acc_event, # e.g. pACC Events
+ "ACC_Event_Wunschgeschw": speed_limit * CV.MS_TO_KPH, # this speed is shown for curve event speeds, not for speed signs (speed signs in "ACC_Tempolimit")
+ "Zeitluecke_1": get_desired_gap(distance_bars, desired_gap, 1), # desired distance to lead object for distance bar 1
+ "Zeitluecke_2": get_desired_gap(distance_bars, desired_gap, 2), # desired distance to lead object for distance bar 2
+ "Zeitluecke_3": get_desired_gap(distance_bars, desired_gap, 3), # desired distance to lead object for distance bar 3
+ "Zeitluecke_4": get_desired_gap(distance_bars, desired_gap, 4), # desired distance to lead object for distance bar 4
+ "Zeitluecke_5": get_desired_gap(distance_bars, desired_gap, 5), # desired distance to lead object for distance bar 5
+ "Zeitluecke_Farbe": 1 if acc_control in (ACC_HUD_ENABLED, ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # yellow (1) or white (0) time gap
+ "ACC_Anzeige_Zeitluecke": show_distance_bars if acc_control != ACC_HUD_DISABLED else 0, # show distance bar selection
+ "SET_ME_0X1": 0x1, # unknown
+ "SET_ME_0X6A": 0x6A, # unknown
+ "SET_ME_0XFFFF": 0xFFFF, # unknown
+ "SET_ME_0X7FFF": 0x7FFF, # unknown
+ }
+
+ return packer.make_can_msg("MEB_ACC_01", bus, values)
+
+
+def create_ea_control(packer, bus):
+ values = {
+ "EA_Funktionsstatus": 1, # Configured but disabled
+ "EA_Sollbeschleunigung": 2046, # Inactive value
+ }
+
+ return packer.make_can_msg("EA_01", bus, values)
+
+
+def create_ea_hud(packer, bus):
+ values = {
+ "EA_Unknown": 1, # Undocumented, value when inactive
+ }
+
+ return packer.make_can_msg("EA_02", bus, values)
+
+
+def create_aeb_control(packer, bus, CP):
+ # Replacement for radar-generated AWV_03 when radar is disabled via UDS programming session.
+ # Sends inactive/safe default values so downstream ECUs don't fault.
+ values = {
+ "SET_ME_63": 63,
+ "SET_ME_30": 30,
+ "SET_ME_127": 127,
+ "SET_ME_127_2": 127,
+ "SET_ME_63_2": 63,
+ "SET_ME_15_1": 15,
+ "SET_ME_255": 255,
+ "SET_ME_1023": 1023,
+ "SET_ME_1": 1,
+ }
+ if CP.flags & VolkswagenFlags.MQB_EVO:
+ values.update({"SET_ME_1_2": 1})
+ return packer.make_can_msg("AWV_03", bus, values)
+
+
+def create_aeb_hud(packer, bus, disabled):
+ # Replacement for radar-generated MEB_AWV_01 HUD message.
+ # When disabled=True (shortly after radar disable), shows AEB-unavailable state.
+ # When disabled=False (steady state), shows AEB active to prevent dash warnings.
+ values = {
+ "AWV_Enabled": not disabled,
+ "AWV_Init": 1,
+ "SET_ME_1": 1,
+ "SET_ME_511": 511,
+ }
+ return packer.make_can_msg("MEB_AWV_01", bus, values)
+
+
+def create_radar_objects(packer, bus):
+ # Send empty MEB_Distance_01 (radar object list at 0x24F) to prevent ECU faults when radar is silent.
+ # Note: infinitecable2 calls this "Strukturen_01"; IQPilot DBC names it "MEB_Distance_01".
+ return packer.make_can_msg("MEB_Distance_01", bus, {})
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/mebutils.py b/iqdbc_repo/iqdbc/car/volkswagen/mebutils.py
new file mode 100644
index 000000000..0fe157b1d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/mebutils.py
@@ -0,0 +1,274 @@
+import numpy as np
+
+from iqdbc.car.common.filter_simple import FirstOrderFilter
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.common.pid import PIDController
+from iqdbc.car import DT_CTRL
+
+
+class LongControlJerk():
+ JERK_LIMIT_MIN = 0.5
+ JERK_LIMIT_MIN_NO_LEAD = 0.7
+ JERK_LIMIT_MAX = 5.0
+ FILTER_GAIN_DISTANCE = [10, 50]
+ FILTER_GAIN_DISTANCE_CHANGE = [0, 20]
+ FILTER_GAIN_MAX = 0.95
+ FILTER_GAIN_MIN = 0.75
+ FILTER_GAIN_NO_LEAD = 0.95
+
+ def __init__(self, dt=DT_CTRL):
+ self.dy_up = 0.
+ self.dy_down = 0.
+ self.jerk_up = 0.
+ self.jerk_down = 0.
+ self.dt = dt
+ self.accel_last = 0.
+ self.distance_last = 0.
+ self.jerk_limit_min = self.JERK_LIMIT_MIN_NO_LEAD
+
+ def update(self, enabled, override, distance, has_lead, accel, critical_state):
+ # jerk limits by accel change and distance are used to improve comfort while ensuring a fast enough car reaction
+ # override mechanics reminder:
+ # (1) sending accel = 0 and directly setting jerk to zero results in round about steady accel until harder accel pedal press -> lack of control
+ # (2) sending accel = 0 and allowing a high jerk results in a abrupt accel cut -> lack of comfort
+ if not enabled:
+ self.jerk_up = 0.
+ self.jerk_down = 0.
+ self.dy_up = 0.
+ self.dy_down = 0.
+ elif override:
+ self.jerk_up = self.JERK_LIMIT_MIN
+ self.jerk_down = self.JERK_LIMIT_MIN
+ self.dy_up = 0.
+ self.dy_down = 0.
+ elif critical_state: # force best car reaction
+ self.jerk_up = self.JERK_LIMIT_MAX
+ self.jerk_down = self.JERK_LIMIT_MAX
+ self.dy_up = 0.
+ self.dy_down = 0.
+ else:
+ jerk_limit_min_target = self.JERK_LIMIT_MIN if has_lead else self.JERK_LIMIT_MIN_NO_LEAD # jerk limit min base line
+ jerk_limit_min_delta = abs(self.JERK_LIMIT_MIN_NO_LEAD - self.JERK_LIMIT_MIN) * self.dt
+ if self.jerk_limit_min < jerk_limit_min_target:
+ self.jerk_limit_min = min(self.jerk_limit_min + jerk_limit_min_delta, jerk_limit_min_target)
+ elif self.jerk_limit_min > jerk_limit_min_target:
+ self.jerk_limit_min = max(self.jerk_limit_min - jerk_limit_min_delta, jerk_limit_min_target)
+
+ if has_lead:
+ distance_change = (self.distance_last - distance) / self.dt if 0 not in (self.distance_last, distance) else 0
+ filter_gain_dist = np.interp(distance, self.FILTER_GAIN_DISTANCE, [self.FILTER_GAIN_MAX, self.jerk_limit_min]) # gain by distance
+ filter_gain_dist_change = np.interp(abs(distance_change), self.FILTER_GAIN_DISTANCE_CHANGE, [self.jerk_limit_min, self.FILTER_GAIN_MAX]) # gain by distance change
+ filter_gain = max(filter_gain_dist, filter_gain_dist_change) # use highest gain
+ else:
+ filter_gain = self.FILTER_GAIN_NO_LEAD
+
+ j = (accel - self.accel_last) / self.dt
+
+ tgt_up = abs(j) if j > 0 else 0.
+ tgt_down = abs(j) if j < 0 else 0.
+
+ # how fast does the car react to acceleration
+ self.dy_up += filter_gain * (tgt_up - self.jerk_up - self.dy_up)
+ self.jerk_up += self.dt * self.dy_up
+ self.jerk_up = np.clip(self.jerk_up, self.jerk_limit_min, self.JERK_LIMIT_MAX)
+
+ # how fast does the car react to braking
+ self.dy_down += filter_gain * (tgt_down - self.jerk_down - self.dy_down)
+ self.jerk_down += self.dt * self.dy_down
+ self.jerk_down = np.clip(self.jerk_down, self.jerk_limit_min, self.JERK_LIMIT_MAX)
+
+ self.accel_last = accel
+ self.distance_last = distance
+
+ def get_jerk_up(self):
+ return self.jerk_up
+
+ def get_jerk_down(self):
+ return self.jerk_down
+
+
+class LongControlLimit():
+ LOWER_LIMIT_FACTOR = 0.024
+ LOWER_LIMIT_MAX = LOWER_LIMIT_FACTOR * 8
+ LOWER_LIMIT_MIN = LOWER_LIMIT_FACTOR * 2
+ UPPER_LIMIT_FACTOR = 0.0625
+ UPPER_LIMIT_MAX = UPPER_LIMIT_FACTOR * 3
+ LIMIT_MIN = 0.
+ LIMIT_DISTANCE = [10, 100] # limit range
+ LIMIT_DISTANCE_CHANGE_DOWN = [0, 20] # high precision for worst case high speed approaching a stopped lead
+ LIMIT_DISTANCE_CHANGE_UP = [0, 5] # precisely follow an accelerating lead especially from stop
+ LIMIT_DISTANCE_CHANGE_UP_ACT = [0, 60]
+ DISTANCE_FILTER_RC = [0.15, 0.6] # smooth noisy distance signal for distant leads
+ DISTANCE_TIMEOUT = 1. # seconds
+
+ def __init__(self, dt=DT_CTRL):
+ self.upper_limit = self.LIMIT_MIN
+ self.lower_limit = self.LIMIT_MIN
+ self.dt = dt
+ self.distance_last = 0.
+ self.distance_filter = FirstOrderFilter(0.0, rc=self.DISTANCE_FILTER_RC[0], dt=dt, initialized=False)
+ self.distance_valid_timer = 0
+
+ def update(self, enabled: bool, speed: float, set_speed: float, distance: float, has_lead: bool, critical_state: bool):
+ # control limits by distance are used to improve comfort while ensuring precise car reaction if neccessary
+ # also used to reduce an effect of decel overshoot when target is breaking
+ # limits are controlled mainly by distance of lead car
+ if not enabled or critical_state: # force most precise accel command execution
+ self.upper_limit = self.LIMIT_MIN
+ self.lower_limit = self.LIMIT_MIN
+ self.distance_valid_timer = 0
+ elif not has_lead:
+ if self.distance_valid_timer < self.DISTANCE_TIMEOUT: # fluctuation block: keep alive
+ self.distance_valid_timer += self.dt
+ else: # force most precise
+ self.upper_limit = self.LIMIT_MIN
+ self.lower_limit = self.LIMIT_MIN
+ else:
+ distance_change_raw = (self.distance_last - distance) / self.dt if 0 not in (self.distance_last, distance) else 0
+ distance_filter_rc = np.interp(distance, self.LIMIT_DISTANCE, self.DISTANCE_FILTER_RC)
+ if (self.distance_last == 0 or self.distance_valid_timer != 0) and distance != 0: # for new lead detection reset filter and correctly force current state upon next iteration
+ self.distance_filter = FirstOrderFilter(0.0, rc=distance_filter_rc, dt=self.dt, initialized=False)
+ distance_change = distance_change_raw
+ else:
+ self.distance_filter.update_alpha(distance_filter_rc)
+ distance_change = self.distance_filter.update(distance_change_raw)
+ self.distance_valid_timer = 0
+
+ # how far can the true accel vary downwards from requested accel
+ upper_limit_dist = np.interp(distance, self.LIMIT_DISTANCE, [self.LIMIT_MIN, self.UPPER_LIMIT_MAX]) # base line based on distance
+ upper_limit_dist_change = np.interp(-min(0, distance_change), self.LIMIT_DISTANCE_CHANGE_UP, [self.UPPER_LIMIT_MAX, self.LIMIT_MIN]) # limit by distance change up
+ upper_limit_dist_change = np.interp(distance, self.LIMIT_DISTANCE_CHANGE_UP_ACT, [upper_limit_dist_change, upper_limit_dist]) # distance change activation
+ self.upper_limit = min(upper_limit_dist, upper_limit_dist_change) # use lowest limit
+
+ # how far can the true accel vary upwards from requested accel
+ set_speed_diff_up = max(0, abs(speed) - abs(set_speed)) # set speed difference down requested by user or speed overshoot (includes hud - real speed difference!)
+ set_speed_diff_up_factor = np.interp(set_speed_diff_up, [1, 1.75], [1., 0.]) # faster requested speed decrease and less speed overshoot downhill
+ lower_limit_dist = np.interp(distance, self.LIMIT_DISTANCE, [self.LOWER_LIMIT_MIN, self.LOWER_LIMIT_MAX]) # base line based on distance
+ lower_limit_dist_speed = lower_limit_dist * set_speed_diff_up_factor
+ lower_limit_dist_change = np.interp(max(0, distance_change), self.LIMIT_DISTANCE_CHANGE_DOWN, [self.LOWER_LIMIT_MAX, self.LIMIT_MIN]) # limit by distance change down
+ self.lower_limit = min(lower_limit_dist_speed, lower_limit_dist_change) # use lowest limit
+
+ self.distance_last = distance
+
+ def get_upper_limit(self):
+ return self.upper_limit
+
+ def get_lower_limit(self):
+ return self.lower_limit
+
+
+def sigmoid_curvature_boost_meb(kappa: float, v_ego: float, kappa_thresh: float = 0.0) -> float:
+ # compensate non linear behaviour: boost low curvatures
+ # this is either a model issue (nerfing low curvatures) or a specific steering rack behaviour
+ v_points = np.array([20.0, 40.0])
+ boost_values = np.array([1.5, 2.1]) # increase boost amplitude with speed
+ boost = float(np.interp(v_ego, v_points, boost_values))
+ steepness_values = np.array([5000.0, 3200.0]) # increase boost area with speed
+ steepness = float(np.interp(v_ego, v_points, steepness_values))
+
+ abs_kappa = abs(kappa)
+ boost_factor = 1.0 + (boost - 1.0) / (1 + np.exp(steepness * (abs_kappa - kappa_thresh)))
+
+ return np.sign(kappa) * abs_kappa * boost_factor
+
+
+def map_speed_to_acc_tempolimit(v_ms):
+ acc_tempolimit_kph = { # DBC Mapping
+ 1: 5, 2: 7, 3: 10, 4: 15, 5: 20, 6: 25, 7: 30, 8: 35,
+ 9: 40, 10: 45, 11: 50, 12: 55, 13: 60, 14: 65, 15: 70,
+ 16: 75, 17: 80, 18: 85, 19: 90, 20: 95, 21: 100, 22: 110,
+ 23: 120, 24: 130, 25: 140, 26: 150, 27: 160, 28: 200,
+ 30: 250
+ }
+
+ v_kph = int(round(v_ms * CV.MS_TO_KPH))
+ acc_value = 0
+
+ for val, limit in sorted(acc_tempolimit_kph.items()):
+ if v_kph >= limit:
+ acc_value = val
+ else:
+ break
+
+ return acc_value
+
+def get_acc_warning_meb(self, acc_hud):
+ # this works as long our radar does not fault while using OP
+ if (acc_hud["ACC_Status_ACC"] in (3, 4) # ACC active or in override mode
+ and acc_hud["ACC_EGO_Fahrzeug"] == 2 # a warning for the lead car is active
+ and acc_hud["ACC_Optischer_Fahrerhinweis"] != 0 # there is an optical warning
+ and acc_hud["ACC_Akustischer_Fahrerhinweis"] != 0 # there is a sound warning
+ and acc_hud["ACC_Display_Prio"] == 0): # this warning has highest priority
+ return True
+ return False
+
+class MultiplicativeUnwindPID(PIDController):
+ def __init__(self, k_p, k_i, k_f=0., k_d=0., pos_limit=1e308, neg_limit=-1e308, rate=100, min_cmd=1e-10, ki_red_time=1.0):
+ super().__init__(k_p, k_i, k_f=k_f, k_d=k_d, pos_limit=pos_limit, neg_limit=neg_limit, rate=rate)
+ self.min_cmd = abs(min_cmd)
+ self.ki_red_time = float(ki_red_time)
+ self.rate = rate
+ self.override_prev = False
+ self.i_unwind_factor = 1.0
+
+ def _calc_unwind_factor(self, override):
+ if not override or self.override_prev:
+ return
+ if self.ki_red_time <= 0.0:
+ self.i_unwind_factor = 1.0
+ return
+ if abs(self.i) <= self.min_cmd:
+ self.i_unwind_factor = 0.0
+ return
+ steps = max(int(self.ki_red_time * self.rate), 1)
+ factor = (self.min_cmd / abs(self.i)) ** (1.0 / steps)
+ self.i_unwind_factor = min(factor, 1.0)
+
+ def update(self, error, error_rate=0.0, speed=0.0, override=False, feedforward=0., freeze_integrator=False):
+ self.speed = speed
+
+ self.p = float(error) * self.k_p
+ self.f = feedforward * self.k_f
+ self.d = error_rate * self.k_d
+
+ if override:
+ self._calc_unwind_factor(override)
+ self.i *= self.i_unwind_factor
+ if abs(self.i) < self.min_cmd:
+ self.i = 0.0
+ else:
+ if not freeze_integrator:
+ self.i = self.i + error * self.k_i * self.i_rate
+
+ # Clip i to prevent exceeding control limits
+ control_no_i = self.p + self.d + self.f
+ control_no_i = np.clip(control_no_i, self.neg_limit, self.pos_limit)
+ self.i = np.clip(self.i, self.neg_limit - control_no_i, self.pos_limit - control_no_i)
+
+ control = self.p + self.i + self.d + self.f
+
+ self.control = np.clip(control, self.neg_limit, self.pos_limit)
+ self.override_prev = override
+ return self.control
+
+class LatControlCurvature():
+ def __init__(self, pid_params, limit, rate):
+ self.pid = MultiplicativeUnwindPID((pid_params.kpBP, pid_params.kpV),
+ (pid_params.kiBP, pid_params.kiV),
+ k_f=pid_params.kf, pos_limit=limit, neg_limit=-limit,
+ rate=rate, min_cmd=6.7e-6, ki_red_time=2.0)
+ def reset(self):
+ self.pid.reset()
+
+ def update(self, CS, CC, desired_curvature):
+ actual_curvature_vm = CC.currentCurvature # includes roll
+ speed_floor = max(CS.vEgo, 0.1)
+ yaw_rate_pose = CC.angularVelocity[2] if len(CC.angularVelocity) > 2 else actual_curvature_vm * speed_floor
+ actual_curvature_pose = yaw_rate_pose / speed_floor
+ actual_curvature = np.interp(CS.vEgo, [2.0, 5.0], [actual_curvature_vm, actual_curvature_pose])
+ desired_curvature_corr = desired_curvature - CC.rollCompensation
+ error = desired_curvature - actual_curvature
+ freeze_integrator = CC.steerLimited or CS.vEgo < 5
+ output_curvature = self.pid.update(error, feedforward=desired_curvature_corr, speed=CS.vEgo,
+ freeze_integrator=freeze_integrator, override=CS.steeringPressed)
+ return output_curvature
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/mlbcan.py b/iqdbc_repo/iqdbc/car/volkswagen/mlbcan.py
new file mode 100644
index 000000000..6f57105fd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/mlbcan.py
@@ -0,0 +1,111 @@
+from iqdbc.car.volkswagen.mqbcan import (volkswagen_mqb_meb_checksum, xor_checksum,
+ acc_control_value as mqb_acc_control_value,
+ acc_hud_status_value as mqb_acc_hud_status_value,
+ create_lka_hud_control as mqb_create_lka_hud_control)
+
+# ACC_01.ACC_Sollbeschleunigung one increment above range max, "no acceleration request"
+ACC_INACTIVE_ACCEL = 3.01
+
+
+def create_hca_steering_control(packer, bus, apply_steer, HCA_Status):
+ values = {
+ "HCA_01_Status_HCA": HCA_Status,
+ "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 HCA_Status in (5, 7) else 0,
+ }
+ return packer.make_can_msg("HCA_01", bus, values)
+
+
+def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control,
+ entering=False, special_mode=False, special_active=False):
+ return mqb_create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control,
+ entering, special_mode, special_active)
+
+
+def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, set_button=False):
+ values = {s: gra_stock_values[s] for s in [
+ "LS_Hauptschalter",
+ "LS_Typ_Hauptschalter",
+ "LS_Codierung",
+ "LS_Tip_Stufe_2",
+ ]}
+
+ values.update({
+ "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16,
+ "LS_Abbrechen": cancel,
+ "LS_Tip_Wiederaufnahme": resume,
+ })
+
+ return packer.make_can_msg("LS_01", bus, values)
+
+
+def acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted):
+ # ACC_01.ACC_Status_ACC uses the same enum as MQB ACC_06: 0 off, 2 standby, 3 active, 4 driver override, 6 fault
+ return mqb_acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted)
+
+
+def acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride):
+ return mqb_acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride)
+
+
+def create_acc_accel_control(packer, bus, accel, acc_control, stopping):
+ acc_enabled = acc_control in (3, 4)
+
+ acc_01_values = {
+ "ACC_Status_ACC": acc_control,
+ "ACC_Sollbeschleunigung": accel if acc_enabled else ACC_INACTIVE_ACCEL,
+ "ACC_zul_Regelabw_unten": 0.2,
+ "ACC_zul_Regelabw_oben": 0.2,
+ "ACC_neg_Sollbeschl_Grad": 4.0 if acc_enabled else 0,
+ "ACC_pos_Sollbeschl_Grad": 4.0 if acc_enabled else 0,
+ "ACC_Dynamik": 3,
+ "ACC_Anhalten": stopping if acc_enabled else False,
+ "ACC_Minimale_Bremsung": 0,
+ }
+
+ return [packer.make_can_msg("ACC_01", bus, acc_01_values)]
+
+
+def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, leadDistance, distanceBars, fcw_alert, leadVisible,
+ unavailable, decel, d_unresponsive, hud_text=0):
+ engaged = acc_hud_status in (3, 4)
+ priodisp = 0 if fcw_alert else 1 if (acc_hud_status == 4 or decel or leadVisible) else 2 if (acc_hud_status in (3, 2)) else 0
+ leadDistanceBars = distanceBars + 1 if distanceBars in (1, 2, 3) else 2
+
+ values = {
+ "ACC_Status_Anzeige": acc_hud_status,
+ "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36,
+ "ACC_Gesetzte_Zeitluecke": leadDistanceBars,
+ "ACC_Anzeige_Zeitluecke": 1 if engaged else 0,
+ "ACC_Tachokranz": 1 if engaged else 0,
+ "ACC_Display_Prio": priodisp,
+ "ACC_Abstandsindex": leadDistance if leadVisible else 0,
+ "ACC_Relevantes_Objekt": 2 if fcw_alert else (1 if leadVisible else 0), # lead car: 1 green, 2 red, 0 off
+ "ACC_Status_Prim_Anz": 2 if fcw_alert else (1 if engaged else 0), # ACC symbol: 1 green, 2 red, 0 off
+ "ACC_Optischer_Fahrerhinweis": 1 if fcw_alert else 0,
+ "ACC_Akustik": 1 if (fcw_alert or d_unresponsive) else 0,
+ "ACC_Texte_Primaeranz": hud_text,
+ }
+
+ return packer.make_can_msg("ACC_02", bus, values)
+
+
+def volkswagen_mlb_checksum(address: int, sig, d: bytearray) -> int:
+ xor_starting_value = {
+ 0x109: 0x08, # ACC_01
+ 0x111: 0x10, # TSK_05
+ 0x30C: 0x0F, # ACC_02
+ 0x324: 0x27, # ACC_04
+ 0x10B: 0xA, # LS_01
+ 0x10D: 0x0C, # ACC_05
+ 0x10F: 0x0E, # ACC_0x10F
+ 0x311: 0x12, # ACC_0x311
+ 0x397: 0x94, # LDW_02
+ 0x10C: 0x0D, # TSK_02
+ }
+ if address in xor_starting_value:
+ return xor_checksum(address, sig, d, xor_starting_value[address])
+ else:
+ return volkswagen_mqb_meb_checksum(address, sig, d)
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/mqbcan.py b/iqdbc_repo/iqdbc/car/volkswagen/mqbcan.py
new file mode 100644
index 000000000..bd759e2ec
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/mqbcan.py
@@ -0,0 +1,326 @@
+from iqdbc.car.crc import CRC8H2F
+
+
+def create_hca_steering_control(packer, bus, apply_torque, HCA_Status):
+ values = {
+ "HCA_01_Status_HCA": HCA_Status,
+ "HCA_01_LM_Offset": abs(apply_torque),
+ "HCA_01_LM_OffSign": 1 if apply_torque < 0 else 0,
+ "HCA_01_Vib_Freq": 18,
+ "HCA_01_Sendestatus": 1 if HCA_Status == 5 else 0,
+ "EA_ACC_Wunschgeschwindigkeit": 327.36,
+ }
+ return packer.make_can_msg("HCA_01", bus, values)
+
+def create_eps_update(packer, bus, eps_stock_values, ea_simulated_torque):
+ values = {s: eps_stock_values[s] for s in [
+ "COUNTER", # Sync counter value to EPS output
+ "EPS_Lenkungstyp", # EPS rack type
+ "EPS_Berechneter_LW", # Absolute raw steering angle
+ "EPS_VZ_BLW", # Raw steering angle sign
+ "EPS_HCA_Status", # EPS HCA control status
+ ]}
+
+ values.update({
+ # Absolute driver torque input and sign, with EA inactivity mitigation
+ "EPS_Lenkmoment": abs(ea_simulated_torque),
+ "EPS_VZ_Lenkmoment": 1 if ea_simulated_torque < 0 else 0,
+ })
+
+ return packer.make_can_msg("LH_EPS_03", bus, values)
+
+
+def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, entering, special_mode=False, special_active=False):
+ values = {}
+ if len(ldw_stock_values):
+ values = {s: ldw_stock_values[s] for s in [
+ "LDW_SW_Warnung_links", # Blind spot in warning mode on left side due to lane departure
+ "LDW_SW_Warnung_rechts", # Blind spot in warning mode on right side due to lane departure
+ "LDW_Seite_DLCTLC", # Direction of most likely lane departure (left or right)
+ "LDW_DLC", # Lane departure, distance to line crossing
+ "LDW_TLC", # Lane departure, time to line crossing
+ ]}
+
+ if entering:
+ yellow_led = int(steering_pressed)
+ green_led = int(not steering_pressed)
+ else:
+ yellow_led = 1 if lat_active and steering_pressed else 0
+ green_led = 1 if lat_active and not steering_pressed else 0
+
+ values.update({
+ "LDW_Status_LED_gelb": yellow_led,
+ "LDW_Status_LED_gruen": green_led,
+ "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible,
+ "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible,
+ "LDW_Texte": hud_alert,
+ })
+ return packer.make_can_msg("LDW_02", bus, values)
+
+
+def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, set_button=False):
+ values = {s: gra_stock_values[s] for s in [
+ "GRA_Hauptschalter", # ACC button, on/off
+ "GRA_Typ_Hauptschalter", # ACC main button type
+ "GRA_Codierung", # ACC button configuration/coding
+ "GRA_Tip_Stufe_2", # unknown related to stalk type
+ "GRA_ButtonTypeInfo", # unknown related to stalk type
+ ]}
+
+ values.update({
+ "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16,
+ "GRA_Abbrechen": cancel,
+ "GRA_Tip_Wiederaufnahme": resume,
+ })
+
+ return packer.make_can_msg("GRA_ACC_01", bus, values)
+
+
+def acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted):
+ if cruiseOverride:
+ acc_control = 4
+ elif long_active:
+ acc_control = 3
+ elif accFaulted:
+ acc_control = 6
+ elif main_switch_on:
+ acc_control = 2
+ else:
+ acc_control = 0
+
+ return acc_control
+
+
+def acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride):
+ if longOverride:
+ hud_status = 4
+ elif longActive:
+ hud_status = 3
+ elif acc_faulted:
+ hud_status = 6
+ elif main_switch_on:
+ hud_status = 2
+ else:
+ hud_status = 0
+ return hud_status
+
+
+def create_acc_accel_control(packer, bus, acc_type, accel, acc_control, stopping, starting, esp_hold, comfortBand, jerkLimit, eBrakeActive, esp_starting_override=None, esp_stopping_override=None):
+ commands = []
+ acc_enabled = acc_control in (3, 4)
+
+ acc_06_values = {
+ "ACC_Typ": acc_type,
+ "ACC_Status_ACC": acc_control,
+ "ACC_StartStopp_Info": acc_enabled,
+ "ACC_Sollbeschleunigung_02": accel if acc_enabled else 3.01,
+ "ACC_zul_Regelabw_unten": 0.2,
+ "ACC_zul_Regelabw_oben": 0.2,
+ "ACC_neg_Sollbeschl_Grad_02": 3.0 if acc_enabled else 0,
+ "ACC_pos_Sollbeschl_Grad_02": 3.0 if acc_enabled else 0,
+ "ACC_Anfahren": starting if acc_enabled else False,
+ "ACC_Anhalten": stopping if acc_enabled else False,
+ }
+ commands.append(packer.make_can_msg("ACC_06", bus, acc_06_values))
+
+ acc_07_starting = starting if esp_starting_override is None else esp_starting_override
+ acc_07_stopping = stopping if esp_stopping_override is None else esp_stopping_override
+
+ if acc_07_starting:
+ acc_hold_type = 4 # hold release / startup
+ elif esp_hold:
+ acc_hold_type = 3 # hold standby
+ elif acc_07_stopping:
+ acc_hold_type = 1 # hold request
+ else:
+ acc_hold_type = 0
+
+ acc_07_values = {
+ "ACC_Anhalteweg": 0.3 if acc_07_stopping and acc_enabled else 20.46, # Distance to stop (stopping coordinator handles terminal roll-out)
+ "ACC_Freilauf_Info": 2 if acc_enabled else 0,
+ "ACC_Folgebeschl": 3.02, # Not using secondary controller accel unless and until we understand its impact
+ "ACC_Sollbeschleunigung_02": accel if acc_enabled else 3.01,
+ "ACC_Anforderung_HMS": acc_hold_type,
+ "ACC_Anfahren": acc_07_starting if acc_enabled else False,
+ "ACC_Anhalten": acc_07_stopping if acc_enabled else False,
+ }
+ commands.append(packer.make_can_msg("ACC_07", bus, acc_07_values))
+
+ return commands
+
+
+def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, leadDistance, distanceBars, fcw_alert, leadVisible, unavailable, decel, d_unresponsive):
+ priodisp = 0 if fcw_alert else 1 if (acc_hud_status == 4 or decel or leadVisible) else 2 if (acc_hud_status in (3, 2)) else 0
+ leadDistanceBars = distanceBars + 1 if distanceBars in (1, 2, 3) else 2
+ values = {
+ "ACC_Status_Anzeige": acc_hud_status,
+ "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36,
+ "ACC_Gesetzte_Zeitluecke": leadDistanceBars,
+ "ACC_Optischer_Fahrerhinweis": 1 if fcw_alert else 0,
+ "ACC_Display_Prio": priodisp,
+ "ACC_Relevantes_Objekt": leadDistanceBars,
+ "ACC_Abstandsindex": leadDistance if leadVisible else 0,
+ "ACC_Akustik_02": fcw_alert,
+ }
+
+ 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)
+
+
+def volkswagen_mqb_meb_checksum(address: int, sig, d: bytearray, const: list[int] | None = None) -> int:
+ crc = 0xFF
+ for i in range(1, len(d)):
+ crc ^= d[i]
+ crc = CRC8H2F[crc]
+ counter = d[1] & 0x0F
+ if const is None:
+ const = VOLKSWAGEN_MQB_MEB_CONSTANTS.get(address)
+ if const:
+ crc ^= const[counter]
+ crc = CRC8H2F[crc]
+ return crc ^ 0xFF
+
+
+def volkswagen_mqb_meb_dyn_len_checksum(address: int, sig, d: bytearray, entry: dict | None = None) -> int:
+ const = None
+ if entry:
+ d = d[:entry["length"]]
+ const = entry["magic"]
+ return volkswagen_mqb_meb_checksum(address, sig, d, const)
+
+
+def volkswagen_mqb_meb_gen2_checksum(address: int, sig, d: bytearray) -> int:
+ entry = VOLKSWAGEN_MQB_MEB_GEN2_CONSTANTS.get(address)
+ if entry:
+ checksum = volkswagen_mqb_meb_dyn_len_checksum(address, sig, d, entry)
+ if checksum == d[0]:
+ return checksum
+ return volkswagen_mqb_meb_checksum(address, sig, d)
+
+
+def xor_checksum(address: int, sig, d: bytearray, initial_value: int = 0) -> int:
+ checksum = initial_value
+ checksum_byte = sig.start_bit // 8
+ for i in range(len(d)):
+ if i != checksum_byte:
+ checksum ^= d[i]
+ return checksum
+
+
+VOLKSWAGEN_MQB_MEB_CONSTANTS: dict[int, list[int]] = {
+ 0x40: [0x40] * 16, # Airbag_01
+ 0x86: [0x86] * 16, # LWI_01
+ 0x9F: [0xF5] * 16, # 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] * 16, # ESP_02
+ 0x102: [0xD7, 0x12, 0x85, 0x7E, 0x0B, 0x34, 0xFA, 0x16,
+ 0x7A, 0x25, 0x2D, 0x8F, 0x04, 0x8E, 0x5D, 0x35], # ESC_50
+ 0x106: [0x07] * 16, # ESP_05
+ 0x10B: [0x77, 0x5C, 0xA0, 0x89, 0x4B, 0x7C, 0xBB, 0xD6,
+ 0x1F, 0x6C, 0x4F, 0xF6, 0x20, 0x2B, 0x43, 0xDD], # Motor_51
+ 0x116: [0xAC] * 16, # ESP_10
+ 0x117: [0x16] * 16, # ACC_10
+ 0x120: [0xC4, 0xE2, 0x4F, 0xE4, 0xF8, 0x2F, 0x56, 0x81,
+ 0x9F, 0xE5, 0x83, 0x44, 0x05, 0x3F, 0x97, 0xDF], # TSK_06
+ 0x121: [0xE9, 0x65, 0xAE, 0x6B, 0x7B, 0x35, 0xE5, 0x5F,
+ 0x4E, 0xC7, 0x86, 0xA2, 0xBB, 0xDD, 0xEB, 0xB4], # Motor_20
+ 0x122: [0x37, 0x7D, 0xF3, 0xA9, 0x18, 0x46, 0x6D, 0x4D,
+ 0x3D, 0x71, 0x92, 0x9C, 0xE5, 0x32, 0x10, 0xB9], # ACC_06
+ 0x126: [0xDA] * 16, # 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
+ 0x25D: [0xDA, 0x6B, 0x0E, 0xB2, 0x78, 0xBD, 0x5A, 0x81,
+ 0x7B, 0xD6, 0x41, 0x39, 0x76, 0xB6, 0xD7, 0x35], # KLR_01
+ 0x26B: [0xCE, 0xCC, 0xBD, 0x69, 0xA1, 0x3C, 0x18, 0x76,
+ 0x0F, 0x04, 0xF2, 0x3A, 0x93, 0x24, 0x19, 0x51], # TA_01
+ 0x30C: [0x0F] * 16, # ACC_02
+ 0x30F: [0x0C] * 16, # SWA_01
+ 0x324: [0x27] * 16, # ACC_04
+ 0x3BE: [0x1F, 0x28, 0xC6, 0x85, 0xE6, 0xF8, 0xB0, 0x19,
+ 0x5B, 0x64, 0x35, 0x21, 0xE4, 0xF7, 0x9C, 0x24], # Motor_14
+ 0x3C0: [0xC3] * 16, # 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
+}
+
+
+VOLKSWAGEN_MQB_MEB_GEN2_CONSTANTS: dict[int, dict] = {
+ 0x0DB: {"length": 42,
+ "magic": [0x09, 0xFA, 0xCA, 0x8E, 0x62, 0xD5, 0xD1, 0xF0,
+ 0x31, 0xA0, 0xAF, 0xDA, 0x4D, 0x1A, 0x0A, 0x97]},
+ 0xFC: {"length": 60,
+ "magic": [0x69, 0xDC, 0xF9, 0x64, 0x6A, 0xCE, 0x55, 0x2C,
+ 0xC4, 0x38, 0x8F, 0xD1, 0xC6, 0x43, 0xB4, 0xB1]},
+ 0x102: {"length": 44,
+ "magic": [0xD7, 0x12, 0x85, 0x7E, 0x0B, 0x34, 0xFA, 0x16,
+ 0x7A, 0x25, 0x2D, 0x8F, 0x04, 0x8E, 0x5D, 0x35]},
+ 0x10B: {"length": 44,
+ "magic": [0x2C, 0xB1, 0x1A, 0x75, 0xBB, 0x65, 0x79, 0x47,
+ 0x81, 0x2B, 0xCC, 0x96, 0x17, 0xDB, 0xC0, 0x94]},
+ 0x13D: {"length": 28,
+ "magic": [0x18, 0x71, 0x10, 0x8D, 0xD7, 0xAA, 0xB0, 0x78,
+ 0xAC, 0x12, 0xAE, 0x0C, 0xDD, 0xF1, 0x85, 0x68]},
+ 0x139: {"length": 28,
+ "magic": [0x96, 0x92, 0x95, 0xB5, 0x6E, 0xE3, 0xBD, 0xB4,
+ 0xFA, 0xAE, 0xBE, 0xCB, 0xCF, 0xA5, 0x77, 0xEF]},
+}
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/pq_radar_handler.py b/iqdbc_repo/iqdbc/car/volkswagen/pq_radar_handler.py
new file mode 100644
index 000000000..8596bc1b6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/pq_radar_handler.py
@@ -0,0 +1,106 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.volkswagen import pqcan
+
+
+class PQRadarHandler:
+ GRA_STEP = 3 # GRA_Neu cadence (~33 Hz), matches stock stalk module
+ SPOOF_STEP = 2 # Motor_2 / Motor_5 spoof cadence (50 Hz)
+
+ ENGAGE_FLOOR = 1.0 * CV.KPH_TO_MS # never SET at/below 1 kph
+ REENGAGE_FLOOR = 2.0 * CV.KPH_TO_MS # hysteresis: only (re)engage above 2 kph
+
+ SETSPEED_TOL_KPH = 1.0 # don't chase set-speed within this band
+ SHORT_STEP_KPH = 1.0 * CV.MPH_TO_KPH # GRA_*_kurz ~= 1 mph
+ LONG_STEP_KPH = 5.0 * CV.MPH_TO_KPH # GRA_*_lang ~= 5 mph
+ TAP_RELEASE_CYCLES = 2 # GRA cycles to release between set-speed taps
+
+ def __init__(self, CAN):
+ self.bus = CAN.ext # radar lives on bus 2 (ext/cam)
+ self.counter = 0
+ self.failed = False # ACS_Fehler / irrev_Fehler -> radar dead for the drive
+ self.want_engaged = False # our belief the radar cruise should be on
+ self._press_phase = 0 # alternate press/release for SET/cancel discrete edges
+ self._tap_cooldown = 0 # set-speed tap rate limiter
+
+ def reset(self):
+ self.want_engaged = False
+ self._press_phase = 0
+ self._tap_cooldown = 0
+
+ @staticmethod
+ def _map_gap_bars(gap_bars):
+ if not gap_bars:
+ return None
+ return int(min(3, max(1, gap_bars)))
+
+ def update(self, packer, frame, CS, *, blend_active, engage_req, cancel_req,
+ set_speed_kph, gap_bars, v_ego):
+ can_sends = []
+
+ if not blend_active:
+ self.reset()
+ return can_sends
+
+ if CS.acc_radar_fehler or CS.acc_radar_sta_adr == 3:
+ self.failed = True
+
+ radar_active = (CS.acc_radar_sta_adr == 1) and not self.failed
+
+ if self.failed:
+ self.want_engaged = False
+ elif cancel_req:
+ self.want_engaged = False
+ elif engage_req and v_ego > self.REENGAGE_FLOOR:
+ self.want_engaged = True
+
+ if (frame % self.SPOOF_STEP) == 0:
+ # Mirror the stock engage handshake ORDER: the radar leads (SET -> ADR active) and only THEN
+ # does the engine report GRA regulating. Asserting MO2_Sta_GRA=1 before the radar's ADR is
+ # active presents an impossible state ("engine regulating but ADR didn't initiate it") and the
+ # radar latches an irreversible fault. So only assert cruise-active once ADR is actually active;
+ # relay Motor_5 (main switch) as verbatim OEM passthrough throughout.
+ hold_engaged = self.want_engaged and radar_active
+ can_sends.append(pqcan.filter_motor2(packer, self.bus, CS.motor2_stock, gra_active=hold_engaged))
+ can_sends.append(pqcan.filter_motor5(packer, self.bus, CS.motor5_stock, gra_active=False))
+
+ if (frame % self.GRA_STEP) == 0:
+ set_btn = resume_btn = cancel = up_s = down_s = up_l = down_l = False
+ self._press_phase ^= 1
+ pressing = self._press_phase == 0
+
+ if self.failed:
+ pass
+ elif cancel_req:
+ # Only actually press cancel when the radar is engaged (or overdriven) -- otherwise it's a
+ # no-op against a passive/off radar and just spams GRA_Abbrechen at ~16 Hz. Fires while
+ # active and stops once the radar leaves the active state.
+ cancel = pressing and radar_active
+ elif self.want_engaged and not radar_active and v_ego > self.ENGAGE_FLOOR:
+ # Engage with RESUME (GRA_Recall), not SET. Ground-truth from an OEM ACC engage (radar leads:
+ # RESUME -> ACS_Sta_ADR 2->1 in ~90ms -> engine MO2_Sta_GRA 0->1 ~80ms later) shows this radar
+ # engages from passive on GRA_Recall; it ignores GRA_Neu_Setzen from that state.
+ resume_btn = pressing
+ elif self.want_engaged and radar_active:
+ if self._tap_cooldown > 0:
+ self._tap_cooldown -= 1
+ elif set_speed_kph > 0:
+ delta = set_speed_kph - CS.acc_radar_v_wunsch
+ if abs(delta) >= self.SETSPEED_TOL_KPH:
+ big = abs(delta) >= self.LONG_STEP_KPH
+ if delta > 0:
+ up_l, up_s = big, not big
+ else:
+ down_l, down_s = big, not big
+ self._tap_cooldown = self.TAP_RELEASE_CYCLES
+
+ self.counter = (self.counter + 1) % 16
+ can_sends.append(pqcan.create_radar_gra(
+ packer, self.bus, CS.gra_stock_values, self.counter,
+ set_btn=set_btn, resume=resume_btn, cancel=cancel, up_short=up_s, down_short=down_s,
+ up_long=up_l, down_long=down_l, zeitluecke=self._map_gap_bars(gap_bars),
+ ))
+
+ return can_sends
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/pqcan.py b/iqdbc_repo/iqdbc/car/volkswagen/pqcan.py
new file mode 100644
index 000000000..cc5c16814
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/pqcan.py
@@ -0,0 +1,208 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+def create_hca_steering_control(packer, bus, apply_torque, HCA_Status):
+ values = {
+ "LM_Offset": abs(apply_torque),
+ "LM_OffSign": 1 if apply_torque < 0 else 0,
+ "HCA_Status": HCA_Status,
+ "Vib_Freq": 16,
+ }
+
+ return packer.make_can_msg("HCA_1", bus, values)
+
+def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, entering, special_mode, special_active):
+ values = {}
+ if len(ldw_stock_values):
+ values = {s: ldw_stock_values[s] for s in [
+ "LDW_SW_Warnung_links", # Blind spot in warning mode on left side due to lane departure
+ "LDW_SW_Warnung_rechts", # Blind spot in warning mode on right side due to lane departure
+ "LDW_Seite_DLCTLC", # Direction of most likely lane departure (left or right)
+ "LDW_DLC", # Lane departure, distance to line crossing
+ "LDW_TLC", # Lane departure, time to line crossing
+ ]}
+
+ if entering:
+ yellow_led = int(steering_pressed)
+ green_led = int(not steering_pressed)
+ elif special_mode:
+ yellow_led = 1 if (lat_active and (steering_pressed or not special_active)) or not lat_active else 0
+ green_led = 1 if lat_active and special_active and not steering_pressed else 0
+ else:
+ yellow_led = 1 if (lat_active and steering_pressed) or not lat_active else 0
+ green_led = 1 if lat_active and not steering_pressed else 0
+
+ values.update({
+ "LDW_Kameratyp": 1,
+ "LDW_Lampe_gelb": yellow_led,
+ "LDW_Lampe_gruen": green_led,
+ "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible,
+ "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible,
+ "LDW_Textbits": hud_alert,
+ })
+
+ return packer.make_can_msg("LDW_Status", bus, values)
+
+
+def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, set_button=False):
+ values = {s: gra_stock_values[s] for s in [
+ "GRA_Hauptschalt", # ACC button, on/off
+ "GRA_Typ_Hauptschalt", # ACC button, momentary vs latching
+ "GRA_Kodierinfo", # ACC button, configuration
+ "GRA_Sender", # ACC button, CAN message originator
+ ]}
+
+ values.update({
+ "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16,
+ "GRA_Abbrechen": cancel,
+ "GRA_Recall": resume,
+ "GRA_Neu_Setzen": set_button,
+ })
+
+ return packer.make_can_msg("GRA_Neu", bus, values)
+
+def create_gra_neu(packer, bus, gra_stock, longActive):
+ values = gra_stock.copy()
+ if longActive:
+ values.update({
+ "GRA_Neu_Setzen": 0,
+ "GRA_Recall": 0,
+ "GRA_Hauptschalt": 0,
+ })
+ return packer.make_can_msg("GRA_Neu", bus, values)
+
+def acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted):
+ if long_active or cruiseOverride:
+ acc_control = 1
+ elif accFaulted:
+ acc_control = 3
+ elif main_switch_on:
+ acc_control = 2
+ else:
+ acc_control = 0
+
+ return acc_control
+
+def acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride):
+ if longOverride:
+ hud_status = 4
+ elif longActive:
+ hud_status = 3
+ elif acc_faulted:
+ hud_status = 6
+ elif main_switch_on:
+ hud_status = 2
+ else:
+ hud_status = 0
+
+ return hud_status
+
+
+def create_acc_accel_control(packer, bus, acc_type, accel, acc_control, stopping, starting, esp_hold, comfortBand, jerkLimit, eBrakeActive, sng_active=False):
+ commands = []
+ acc_enabled = acc_control == 1 and not sng_active
+
+ values = {
+ "ACS_Sta_ADR": 0 if sng_active else acc_control,
+ "ACS_StSt_Info": acc_enabled,
+ "ACS_Typ_ACC": acc_type,
+ "ACS_Anhaltewunsch": (acc_type == 1 and stopping or eBrakeActive) or sng_active,
+ "ACS_FreigSollB": acc_enabled,
+ "ACS_Sollbeschl": accel if acc_enabled else 3.01,
+ "ACS_zul_Regelabw": comfortBand if acc_enabled else 1.27,
+ "ACS_max_AendGrad": jerkLimit if acc_enabled else 5.08,
+ "ACS_Schubabsch": 0,
+ "ACS_MomEingriff": 0,
+ "ACS_ADR_Schub": 0,
+ }
+
+ commands.append(packer.make_can_msg("ACC_System", bus, values))
+
+ return commands
+
+
+def create_sng_handoff_control(packer, bus, handoff_active, decel_req):
+ values = {
+ "SNG_HandoffActive": handoff_active,
+ "SNG_DecelReq": decel_req if handoff_active else 0.0,
+ }
+ return packer.make_can_msg("SNG_1", bus, values)
+
+
+def create_blinker_control(packer, bus, leftBlinker, rightBlinker):
+ values = {
+ "BM_rechts": rightBlinker,
+ "BM_links": leftBlinker,
+ }
+ return packer.make_can_msg("Blinkmodi_02", bus, values)
+
+
+def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, leadDistance, distanceBars, fcw_alert, leadVisible, unavailable, decel, d_unresponsive):
+ priodisp = 0 if fcw_alert else 1 if (acc_hud_status == 4 or decel or leadVisible) else 2 if (acc_hud_status in (3, 2)) else 0
+ leadDistanceBars = distanceBars + 1 if distanceBars in (1, 2, 3) else 2
+ values = {
+ "ACA_StaACC": acc_hud_status,
+ "ACA_AnzDisplay": 1 if acc_hud_status in (3, 4) else 0,
+ "ACA_Zeitluecke": leadDistanceBars,
+ "ACA_V_Wunsch": set_speed,
+ "ACA_gemZeitl": min(15, max(1, int(round(leadDistance)))) if leadVisible else 0,
+ "ACA_PrioDisp": priodisp,
+ "ACA_Akustik1": d_unresponsive,
+ # "ACA_Fahrerhinw": unavailable,
+ "ACA_Akustik2": fcw_alert,
+ "ACA_ACC_Verz": decel,
+ }
+
+ return packer.make_can_msg("ACC_GRA_Anzeige", bus, values)
+
+def filter_motor2(packer, bus, motor2_stock, gra_active=False):
+ values = dict(motor2_stock)
+ if gra_active:
+ values.update({
+ "MO2_Sta_GRA": 1,
+ "MO2_Status_TSK": 1,
+ })
+ else:
+ values.update({
+ "MO2_Sta_GRA": 0,
+ })
+ return packer.make_can_msg("Motor_2", bus, values)
+
+
+def filter_motor5(packer, bus, motor5_stock, gra_active=False):
+ values = dict(motor5_stock)
+ if gra_active:
+ values["MO5_GRA_Hauptsch"] = 1
+ return packer.make_can_msg("Motor_5", bus, values)
+
+
+def create_motor3_resume(packer, bus, motor1_stock, motor3_stock, resume=False):
+ values = dict(motor3_stock)
+ values_motor1 = dict(motor1_stock)
+ if resume:
+ values["MO3_Pedalwert"] = values_motor1["MO1_Pedalwert"]
+ return packer.make_can_msg("Motor_3", bus, values)
+
+
+def create_radar_gra(packer, bus, gra_stock, counter, set_btn=False, cancel=False, resume=False,
+ up_short=False, down_short=False, up_long=False, down_long=False, zeitluecke=None):
+ values = {s: gra_stock[s] for s in [
+ "GRA_Hauptschalt", # ACC main switch passthrough
+ "GRA_Typ_Hauptschalt", # momentary vs latching
+ "GRA_Kodierinfo", # configuration
+ "GRA_Sender", # CAN originator
+ ]}
+ values.update({
+ "COUNTER": counter % 16,
+ "GRA_Neu_Setzen": 1 if set_btn else 0,
+ "GRA_Abbrechen": 1 if cancel else 0,
+ "GRA_Recall": 1 if resume else 0,
+ "GRA_Up_kurz": 1 if up_short else 0,
+ "GRA_Down_kurz": 1 if down_short else 0,
+ "GRA_Up_lang": 1 if up_long else 0,
+ "GRA_Down_lang": 1 if down_long else 0,
+ })
+ if zeitluecke is not None:
+ values["GRA_Zeitluecke"] = zeitluecke
+ return packer.make_can_msg("GRA_Neu", bus, values)
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/radar_interface.py b/iqdbc_repo/iqdbc/car/volkswagen/radar_interface.py
new file mode 100644
index 000000000..7d7aab15b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/radar_interface.py
@@ -0,0 +1,120 @@
+import math
+
+from iqdbc.can import CANParser
+from iqdbc.can.dbc import DBC as DBCLoader
+from iqdbc.car import Bus, structs
+from iqdbc.car.interfaces import RadarInterfaceBase
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.volkswagen.values import DBC, VolkswagenFlags
+
+RADAR_ADDR = 0x24F
+NO_OBJECT = 0
+LANE_TYPES = ("Same_Lane", "Left_Lane", "Right_Lane")
+SIGNAL_SETS = tuple(
+ (
+ f"{prefix}_ObjectID",
+ f"{prefix}_Long_Distance",
+ f"{prefix}_Lat_Distance",
+ f"{prefix}_Rel_Velo",
+ )
+ for lane in LANE_TYPES
+ for idx in (1, 2)
+ for prefix in (f"{lane}_0{idx}",)
+)
+
+
+def get_radar_can_parser(CP):
+ if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ dbc_name = DBC[CP.carFingerprint][Bus.radar]
+ dbc = DBCLoader(dbc_name)
+ if "Strukturen_01" in dbc.name_to_msg:
+ messages = [("Strukturen_01", 25)]
+ elif "MEB_Distance_01" in dbc.name_to_msg:
+ messages = [("MEB_Distance_01", 25)]
+ else:
+ return None
+ else:
+ return None
+
+ return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 2)
+
+
+class RadarInterface(RadarInterfaceBase):
+ def __init__(self, CP, CP_SP):
+ super().__init__(CP, CP_SP)
+
+ self.updated_messages: set[int] = set()
+ self.trigger_msg: int = RADAR_ADDR
+ self._track_id_counter: int = 0
+
+ self.radar_off_can: bool = CP.radarUnavailable
+ self.rcp: CANParser | None = get_radar_can_parser(CP)
+
+ self._pts = self.pts
+
+ def update(self, can_strings):
+ """Entry-point called by the vehicle loop every CAN tick."""
+ if self.radar_off_can or self.rcp is None:
+ return super().update(None)
+
+ vls = self.rcp.update(can_strings)
+ self.updated_messages.update(vls)
+
+ if self.trigger_msg not in self.updated_messages:
+ return None
+
+ radar_data = self._process_radar_frame()
+ self.updated_messages.clear()
+ return radar_data
+
+ def _process_radar_frame(self):
+ ret = structs.RadarData()
+
+ if self.rcp is None:
+ return ret
+
+ if not self.rcp.can_valid:
+ ret.errors.canError = True
+ return ret
+
+ msg = self.rcp.vl["Strukturen_01"] if "Strukturen_01" in self.rcp.vl else self.rcp.vl["MEB_Distance_01"]
+ get = msg.__getitem__
+
+ active_objects: dict[int, tuple[float, float, float]] = {}
+ for obj_id_sig, long_sig, lat_sig, vel_sig in SIGNAL_SETS:
+ obj_id = get(obj_id_sig)
+ if obj_id == NO_OBJECT:
+ continue
+
+ if obj_id in active_objects:
+ ret.errors.canError = True
+ return ret
+
+ active_objects[obj_id] = (
+ get(long_sig), # dRel
+ get(lat_sig), # yRel
+ get(vel_sig), # vRel
+ )
+
+ for obj_id, (d_rel, y_rel, v_rel) in active_objects.items():
+ if obj_id not in self._pts:
+ pt = structs.RadarData.RadarPoint()
+ pt.trackId = self._track_id_counter
+ self._track_id_counter += 1
+ self._pts[obj_id] = pt
+ else:
+ pt = self._pts[obj_id]
+
+ pt.measured = True
+ pt.dRel = d_rel
+ pt.yRel = y_rel
+ pt.vRel = v_rel
+ pt.aRel = math.nan
+ pt.yvRel = math.nan
+
+ inactive_ids = self._pts.keys() - active_objects.keys()
+ for obj_id in inactive_ids:
+ self._pts.pop(obj_id, None)
+
+ ret.points = list(self._pts.values())
+ return ret
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/speed_limit_manager.py b/iqdbc_repo/iqdbc/car/volkswagen/speed_limit_manager.py
new file mode 100644
index 000000000..05b32db47
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/speed_limit_manager.py
@@ -0,0 +1,563 @@
+import time
+import math
+
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.volkswagen.values import VolkswagenFlags
+from iqdbc.car.lateral import ISO_LATERAL_ACCEL
+
+NOT_SET = 0
+SPEED_SUGGESTED_MAX_HIGHWAY_GER_KPH = 130 # 130 kph in germany
+STREET_TYPE_URBAN = 1
+STREET_TYPE_NONURBAN = 2
+STREET_TYPE_HIGHWAY = 3
+SANITY_CHECK_DIFF_PERCENT_LOWER = 30
+SPEED_LIMIT_UNLIMITED_VZE_KPH = int(round(144 * CV.MS_TO_KPH))
+DECELERATION_PREDICATIVE = 1.0
+SEGMENT_DECAY = 10
+PSD_TYPE_SPEED_LIMIT = 1
+PSD_TYPE_CURV_SPEED = 2
+PSD_CURV_SPEED_DECAY = 4
+PSD_UNIT_KPH = 0
+PSD_UNIT_MPH = 1
+
+
+class SpeedLimitManager:
+ def __init__(self, car_params, speed_limit_max_kph=SPEED_SUGGESTED_MAX_HIGHWAY_GER_KPH, predicative=False, predicative_speed_limit=False, predicative_curve=False):
+ self.CP = car_params
+ self.v_limit_psd = NOT_SET
+ self.v_limit_psd_next = NOT_SET
+ self.v_limit_psd_legal = NOT_SET
+ self.v_limit_psd_next_type = NOT_SET
+ self.v_limit_vze = NOT_SET
+ self.v_limit_speed_unit_psd = PSD_UNIT_KPH
+ self.v_limit_vze_sanity_error = False
+ self.v_limit_output_last = NOT_SET
+ self.v_limit_max = speed_limit_max_kph
+ self.predicative = predicative
+ self.predicative_speed_limit = predicative_speed_limit
+ self.predicative_curve = predicative_curve
+ self.predicative_segments = {}
+ self.current_predicative_segment = {"ID": NOT_SET, "Length": NOT_SET, "Speed": NOT_SET, "StreetType": NOT_SET, "OnRampExit": NOT_SET}
+ self.v_limit_psd_next_last_timestamp = 0
+ self.v_limit_psd_next_last = NOT_SET
+ self.v_limit_psd_next_decay_time = NOT_SET
+ self.v_limit_changed = False
+
+ def _reset_predicative(self):
+ self.v_limit_psd_next = NOT_SET
+ self.v_limit_psd_next_type = NOT_SET
+ self.v_limit_psd_next_last_timestamp = 0
+ self.v_limit_psd_next_last = NOT_SET
+ self.v_limit_psd_next_decay_time = NOT_SET
+
+ def enable_predicative_speed_limit(self, predicative=False, reaction_to_speed_limits=False, reaction_to_curves=False):
+ if self.predicative == predicative and self.predicative_speed_limit == reaction_to_speed_limits and self.predicative_curve == reaction_to_curves:
+ return # perf
+
+ if not predicative or (not reaction_to_speed_limits and not reaction_to_curves):
+ self._reset_predicative()
+ self.predicative = False # fully disable execution
+ else:
+ self.predicative = predicative
+
+ if (not reaction_to_speed_limits and self.predicative_speed_limit) or (not reaction_to_curves and self.predicative_curve):
+ self._reset_predicative() # force reset when disabling
+
+ self.predicative_speed_limit = reaction_to_speed_limits
+ self.predicative_curve = reaction_to_curves
+
+
+ def update(self, current_speed_ms, psd_04, psd_05, psd_06, vze, raining, time_car):
+ # try reading speed form traffic sign recognition
+ if vze and self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ self._receive_speed_limit_vze_meb(vze)
+
+ # read speed unit from PSD_06 and also use it for traffic sign recognition if present (for now always seen on bus 0)
+ # the vze location/unit flag is not stable and no corresponding flag has been found yet
+ if psd_06:
+ self._receive_speed_unit_psd(psd_06)
+
+ # try reading speed from predicative street data
+ if psd_04 and psd_05 and psd_06:
+ self._receive_current_segment_psd(psd_05)
+ self._refresh_current_segment()
+ self._build_predicative_segments(psd_04, psd_06, raining, time_car)
+ self._receive_speed_limit_psd_legal(psd_06)
+ self._get_speed_limit_psd()
+ if self.predicative:
+ self._get_speed_limit_psd_next(current_speed_ms) # this is very cpu heavy
+
+ def get_speed_limit_predicative(self):
+ v_limit_output = self.v_limit_psd_next if self.predicative and self.v_limit_psd_next != NOT_SET and self.v_limit_psd_next < self.v_limit_output_last else NOT_SET
+ return v_limit_output * CV.KPH_TO_MS
+
+ def get_speed_limit_predicative_type(self):
+ return self.v_limit_psd_next_type
+
+ def get_speed_limit(self):
+ candidates = {
+ "vze": self.v_limit_vze if self.v_limit_vze != NOT_SET and not self.v_limit_vze_sanity_error else NOT_SET,
+ "psd": self.v_limit_psd if self.v_limit_psd != NOT_SET else NOT_SET,
+ "legal": self.v_limit_psd_legal
+ }
+
+ v_limit_output = NOT_SET
+ for source in ["vze", "psd", "legal"]:
+ v = candidates[source]
+ if v != NOT_SET:
+ v_limit_output = v
+ break
+
+ if v_limit_output > self.v_limit_max:
+ v_limit_output = self.v_limit_max
+
+ self.v_limit_changed = True if self.v_limit_output_last != v_limit_output else False
+ self.v_limit_output_last = v_limit_output
+
+ return v_limit_output * CV.KPH_TO_MS
+
+ def _speed_limit_vze_sanitiy_check(self, speed_limit_vze_new):
+ if self.v_limit_output_last == NOT_SET:
+ self.v_limit_vze_sanity_error = False
+ return
+
+ diff_p = 100 * speed_limit_vze_new / self.v_limit_output_last
+ self.v_limit_vze_sanity_error = True if diff_p < SANITY_CHECK_DIFF_PERCENT_LOWER else False
+ if speed_limit_vze_new > SPEED_LIMIT_UNLIMITED_VZE_KPH: # unlimited sign detected: use psd logic for setting maximum speed
+ self.v_limit_vze_sanity_error = True
+
+ def _receive_speed_unit_psd(self, psd_06):
+ # keep it simple for now, the unit is supplied shortly before the corresponding speed limits are supplied for given segment ID
+ if psd_06["PSD_06_Mux"] == 0 and psd_06["PSD_Sys_Segment_ID"] > 1:
+ self.v_limit_speed_unit_psd = psd_06["PSD_Sys_Geschwindigkeit_Einheit"]
+
+ def _convert_raw_speed_psd(self, raw_speed, street_type):
+ speed = NOT_SET
+
+ if self.v_limit_speed_unit_psd == PSD_UNIT_KPH:
+ if 0 < raw_speed < 11: # 0 - 45 kph
+ speed = (raw_speed - 1) * 5
+ elif 11 <= raw_speed < 23: # 50 - 160 kph
+ speed = 50 + (raw_speed - 11) * 10
+ elif raw_speed == 23: # explicitly no legal speed limit
+ if street_type == STREET_TYPE_HIGHWAY:
+ speed = self.v_limit_max
+
+ elif self.v_limit_speed_unit_psd == PSD_UNIT_MPH:
+ if 3 < raw_speed < 18: # 0 - 70 mph
+ speed = (5 * (raw_speed - 3)) * CV.MPH_TO_KPH
+ elif 18 <= raw_speed < 23: # 75 - 105 mph
+ speed = ((5 * (raw_speed - 3)) + 10) * CV.MPH_TO_KPH
+ elif raw_speed == 23: # explicitly no legal speed limit
+ if street_type == STREET_TYPE_HIGHWAY:
+ speed = self.v_limit_max
+
+ return speed
+
+ def _receive_speed_limit_vze_meb(self, vze):
+ v_limit_vze = vze["VZE_Verkehrszeichen_1"] # main traffic sign
+ # "VZE_Anzeigemodus" has been seen not being stable for different drives in same USA mph car, no other flag has been found yet
+ # for now additionally assume a car with mph speed unit nav data sgements is also supplied with mph converted vze data ("PSD_06" is available on bus 0)
+ # mph speed unit set in signal "Einheiten_01" does not mean the speed data being supplied in mph unit!
+ v_limit_vze = v_limit_vze * CV.MPH_TO_KPH if vze["VZE_Anzeigemodus"] == 1 or self.v_limit_speed_unit_psd == PSD_UNIT_MPH else v_limit_vze
+ self._speed_limit_vze_sanitiy_check(v_limit_vze)
+ self.v_limit_vze = v_limit_vze
+
+ def _receive_current_segment_psd(self, psd_05):
+ if psd_05["PSD_Pos_Standort_Eindeutig"] == 1 and psd_05["PSD_Pos_Segment_ID"] != NOT_SET:
+ self.current_predicative_segment["Length"] = psd_05["PSD_Pos_Segmentlaenge"]
+
+ if self.current_predicative_segment["ID"] != psd_05["PSD_Pos_Segment_ID"]:
+ self.current_predicative_segment["ID"] = psd_05["PSD_Pos_Segment_ID"]
+ self.current_predicative_segment["Speed"] = NOT_SET
+ self.current_predicative_segment["StreetType"] = NOT_SET
+ self.current_predicative_segment["OnRampExit"] = False
+
+ def _get_segment_curvature_psd(self, psd_curvature, psd_sign, scale=2e-5):
+ if psd_curvature in (0, 255):
+ return NOT_SET
+
+ curvature = (255 - psd_curvature) * scale
+ if psd_sign == 1:
+ curvature *= -1
+
+ return curvature
+
+ def _calculate_curve_speed(self, curvature):
+ if curvature == NOT_SET:
+ return NOT_SET
+
+ curv_speed_ms = math.sqrt(ISO_LATERAL_ACCEL / abs(curvature))
+
+ if self.v_limit_speed_unit_psd == PSD_UNIT_MPH:
+ curv_speed = int((curv_speed_ms * CV.MS_TO_MPH) // 5 * 5) * CV.MPH_TO_KPH
+ else:
+ curv_speed = int((curv_speed_ms * CV.MS_TO_KPH) // 5 * 5)
+
+ return curv_speed
+
+ def _refresh_current_segment(self):
+ current_segment = self.current_predicative_segment["ID"]
+ if current_segment != NOT_SET:
+ seg = self.predicative_segments.get(current_segment)
+ if seg:
+ self.current_predicative_segment["Speed"] = self.predicative_segments[current_segment]["Speed"]
+ self.current_predicative_segment["StreetType"] = self.predicative_segments[current_segment]["StreetType"]
+ self.current_predicative_segment["OnRampExit"] = self.predicative_segments[current_segment]["OnRampExit"]
+
+ def _build_predicative_segments(self, psd_04, psd_06, raining, time_car):
+ now = time.time()
+
+ # Segment erfassen/aktualisieren
+ if (psd_04["PSD_ADAS_Qualitaet"] == 1 and
+ psd_04["PSD_wahrscheinlichster_Pfad"] == 1 and
+ psd_04["PSD_Segment_ID"] != NOT_SET):
+
+ segment_id = psd_04["PSD_Segment_ID"]
+ seg = self.predicative_segments.get(segment_id)
+ if seg:
+ seg["Length"] = psd_04["PSD_Segmentlaenge"]
+ seg["Curvature_Begin"] = self._get_segment_curvature_psd(psd_04["PSD_Anfangskruemmung"], psd_04["PSD_Anfangskruemmung_Vorz"])
+ seg["Curvature_End"] = self._get_segment_curvature_psd(psd_04["PSD_Endkruemmung"], psd_04["PSD_Endkruemmung_Vorz"])
+ seg["StreetType"] = self._get_street_type(psd_04["PSD_Strassenkategorie"], psd_04["PSD_Bebauung"])
+ seg["OnRampExit"] = psd_04["PSD_Rampe"] in (1, 2)
+ seg["ID_Prev"] = psd_04["PSD_Vorgaenger_Segment_ID"]
+ seg["Curve_Speed_Begin"] = self._calculate_curve_speed(seg["Curvature_Begin"])
+ seg["Curve_Speed_End"] = self._calculate_curve_speed(seg["Curvature_End"])
+ seg["Timestamp"] = now
+ else:
+ self.predicative_segments[segment_id] = {
+ "ID": segment_id,
+ "Length": psd_04["PSD_Segmentlaenge"],
+ "Curvature_Begin": self._get_segment_curvature_psd(psd_04["PSD_Anfangskruemmung"], psd_04["PSD_Anfangskruemmung_Vorz"]),
+ "Curvature_End": self._get_segment_curvature_psd(psd_04["PSD_Endkruemmung"], psd_04["PSD_Endkruemmung_Vorz"]),
+ "StreetType": self._get_street_type(psd_04["PSD_Strassenkategorie"], psd_04["PSD_Bebauung"]),
+ "OnRampExit": psd_04["PSD_Rampe"] in (1, 2),
+ "ID_Prev": psd_04["PSD_Vorgaenger_Segment_ID"],
+ "Speed": NOT_SET,
+ "Curve_Speed_Begin": NOT_SET,
+ "Curve_Speed_End": NOT_SET,
+ "QualityFlag": False,
+ "Timestamp": now
+ }
+ seg = self.predicative_segments.get(segment_id)
+ seg["Curve_Speed_Begin"] = self._calculate_curve_speed(seg["Curvature_Begin"])
+ seg["Curve_Speed_End"] = self._calculate_curve_speed(seg["Curvature_End"])
+
+ # Schritt 2: Alte Segmente bereinigen
+ current_id = self.current_predicative_segment["ID"]
+ if current_id != NOT_SET:
+ self.predicative_segments = {
+ sid: seg for sid, seg in self.predicative_segments.items()
+ if now - seg.get("Timestamp", 0) <= SEGMENT_DECAY
+ }
+
+ # Geschwindigkeit setzen (speed limits seen for changed limits only)
+ if (psd_06["PSD_06_Mux"] == 2 and
+ psd_06["PSD_Ges_Typ"] == 1 and
+ psd_06["PSD_Ges_Gesetzlich_Kategorie"] == 0 and
+ psd_06["PSD_Ges_Segment_ID"] != NOT_SET):
+
+ raw_speed = psd_06["PSD_Ges_Geschwindigkeit"] if self._speed_limit_is_valid_now_psd(psd_06, raining, time_car) else NOT_SET
+ segment_id = psd_06["PSD_Ges_Segment_ID"]
+
+ if segment_id in self.predicative_segments:
+ speed = self._convert_raw_speed_psd(raw_speed, self.predicative_segments[segment_id]["StreetType"])
+ self.predicative_segments[segment_id]["Speed"] = speed
+ self.predicative_segments[segment_id]["Speed_Type"] = PSD_TYPE_SPEED_LIMIT
+ self.predicative_segments[segment_id]["QualityFlag"] = True
+
+ def _get_time_from_vw_datetime(self, time_car):
+ if time_car:
+ try:
+ t = (time_car["UH_Jahr"], time_car["UH_Monat"], time_car["UH_Tag"], time_car["UH_Stunde"], time_car["UH_Minute"], time_car["UH_Sekunde"], 0, 0, -1)
+ local_time = time.mktime(t)
+ return time.localtime(local_time)
+ except Exception:
+ return time.localtime()
+ else:
+ return time.localtime()
+
+ def _speed_limit_is_valid_now_psd(self, psd_06, raining, time_car):
+ local_time = self._get_time_from_vw_datetime(time_car)
+
+ # by day
+ day_start = psd_06["PSD_Ges_Geschwindigkeit_Tag_Anf"]
+ day_end = psd_06["PSD_Ges_Geschwindigkeit_Tag_Ende"]
+ now_weekday = (local_time.tm_wday + 1) # Python: 0=Mon -> PSD: 1=Mon
+
+ if 1 <= day_start <= 7 and 1 <= day_end <= 7:
+ if day_start <= day_end:
+ is_valid_by_day = day_start <= now_weekday <= day_end
+ else:
+ is_valid_by_day = now_weekday >= day_start or now_weekday <= day_end
+ else:
+ is_valid_by_day = True
+
+ # by time
+ hour_start = psd_06["PSD_Ges_Geschwindigkeit_Std_Anf"]
+ hour_end = psd_06["PSD_Ges_Geschwindigkeit_Std_Ende"]
+ now_hour = local_time.tm_hour
+
+ if (hour_start != 25 and hour_end != 25):
+ if hour_start <= hour_end:
+ is_valid_by_time = hour_start <= now_hour < hour_end
+ else:
+ is_valid_by_time = now_hour >= hour_start or now_hour < hour_end
+ else:
+ is_valid_by_time = True
+
+ # by weather condition
+ weather_condition = psd_06["PSD_Ges_Geschwindigkeit_Witter"]
+ is_valid_by_weather_conditions = weather_condition == 0 or ( raining and weather_condition == 1 )
+
+ checks = [
+ is_valid_by_time,
+ is_valid_by_day,
+ is_valid_by_weather_conditions,
+ ]
+
+ return all(checks)
+
+ def _speed_limit_curve_allowed(self, seg):
+ currently_on_ramp = self.current_predicative_segment.get("OnRampExit", False)
+ seg_on_ramp = seg.get("OnRampExit", False)
+
+ ramp_allowed_on_ramp = currently_on_ramp and seg_on_ramp
+ ramp_allowed = ramp_allowed_on_ramp or not seg_on_ramp
+
+ # on ramp is probably type 2 TODO
+ # for now only allow non urban, there are problems with highway curvature data
+ street_type = seg.get("StreetType", NOT_SET)
+ street_type_allowed = True if street_type == STREET_TYPE_NONURBAN or (street_type == STREET_TYPE_HIGHWAY and ramp_allowed_on_ramp) else False
+
+ speed_curve = seg.get("Curve_Speed", NOT_SET)
+
+ if NOT_SET not in (self.v_limit_output_last, speed_curve):
+ diff_p = 100 * speed_curve / self.v_limit_output_last
+ sanity_error = True if diff_p < SANITY_CHECK_DIFF_PERCENT_LOWER else False
+ else:
+ sanity_error = False
+
+ checks = [
+ ramp_allowed,
+ street_type_allowed,
+ not sanity_error,
+ ]
+
+ return all(checks)
+
+ def _hit_linear_profile(self, v0_ms, a, total_dist_m, L_m, v_b_kmh, v_e_kmh):
+ if L_m is None or L_m <= 0:
+ return None, None
+
+ v_b = v_b_kmh * CV.KPH_TO_MS
+ v_e = v_e_kmh * CV.KPH_TO_MS
+ r = (v_e - v_b) / L_m # m/s pro m
+
+ # Flaches Profil => Standard-Bremsweg gegen v_b am Beginn
+ if abs(r) < 1e-9:
+ if v0_ms <= v_b:
+ return None, None
+ brake_dist = (v0_ms**2 - v_b**2) / (2*a)
+ if brake_dist >= total_dist_m:
+ # Aktivierung am Segmentbeginn
+ return 0.0, v_b_kmh
+ return None, None
+
+ A = r*r
+ B = 2*v_b*r + 2*a
+ C = v_b*v_b + 2*a*total_dist_m - v0_ms*v0_ms
+
+ D = B*B - 4*A*C
+ if D < 0:
+ return None, None
+
+ sqrtD = math.sqrt(D)
+ # Smallest non-negative solution
+ s1 = (-B - sqrtD) / (2*A)
+ s2 = (-B + sqrtD) / (2*A)
+ s_candidates = [s for s in (s1, s2) if s >= 0.0]
+
+ if not s_candidates:
+ return None, None
+
+ s_hit = min(s_candidates)
+ if s_hit > L_m:
+ return None, None
+
+ v_req_ms = v_b + r * s_hit
+ return float(s_hit), (v_req_ms * CV.MS_TO_KPH)
+
+ def _dfs(self, seg_id, total_dist, visited, current_speed_ms, best_result, path):
+ if seg_id in visited or seg_id not in path:
+ return
+ visited.add(seg_id)
+
+ seg = self.predicative_segments.get(seg_id)
+ if not seg:
+ return
+
+ candidates = []
+
+ length = seg.get("Length", NOT_SET)
+
+ # Speed-Limit
+ if self.predicative_speed_limit:
+ sl = seg.get("Speed", NOT_SET)
+ if sl != NOT_SET:
+ qual_ok = seg.get("QualityFlag", False)
+ candidates.append((sl, PSD_TYPE_SPEED_LIMIT, 0.0, qual_ok))
+
+ # Curve-Speed
+ if self.predicative_curve and self._speed_limit_curve_allowed(seg):
+ cs_begin = seg.get("Curve_Speed_Begin", NOT_SET)
+ cs_end = seg.get("Curve_Speed_End", NOT_SET)
+
+ if cs_begin != NOT_SET:
+ candidates.append((cs_begin, PSD_TYPE_CURV_SPEED, 0.0, True))
+
+ if cs_end != NOT_SET and length > 0:
+ candidates.append((cs_end, PSD_TYPE_CURV_SPEED, length, True))
+
+ # Curve-Speed Profile
+ if cs_begin != NOT_SET and cs_end != NOT_SET and length > 0:
+ s_hit, v_req_kmh = self._hit_linear_profile(v0_ms=current_speed_ms, a=DECELERATION_PREDICATIVE,
+ total_dist_m=total_dist, L_m=length, v_b_kmh=cs_begin, v_e_kmh=cs_end)
+ if s_hit is not None and v_req_kmh is not None:
+ candidates.append((v_req_kmh, PSD_TYPE_CURV_SPEED, s_hit, True))
+
+ # check candidates
+ for cand_speed_kmh, cand_type, activation_offset, qual_ok in candidates:
+ if cand_speed_kmh == NOT_SET:
+ continue
+
+ if not qual_ok:
+ continue
+
+ v_target_ms = cand_speed_kmh * CV.KPH_TO_MS
+ if not (v_target_ms < current_speed_ms and (cand_speed_kmh < self.v_limit_output_last or self.v_limit_output_last == NOT_SET)):
+ continue
+
+ brake_dist = (current_speed_ms**2 - v_target_ms**2) / (2 * DECELERATION_PREDICATIVE)
+ if brake_dist <= 0:
+ continue
+
+ dist_to_activation = total_dist + activation_offset
+ if dist_to_activation <= brake_dist:
+ # choose lowest limit or shorter length when equal
+ better = False
+ if cand_speed_kmh < best_result["limit"]:
+ better = True
+ elif cand_speed_kmh == best_result["limit"] and dist_to_activation < best_result["dist"]:
+ better = True
+
+ if better:
+ best_result["limit"] = cand_speed_kmh
+ best_result["type"] = cand_type
+ best_result["dist"] = dist_to_activation # represents distance to limit
+ best_result["length"] = length - activation_offset # represents remaining distance with limit for curves
+
+ children = [sid for sid, s in self.predicative_segments.items() if s.get("ID_Prev") == seg_id]
+ if len(children) > 1:
+ return # Split detected, can not decide unique limit on current path
+
+ for next_id in children:
+ if seg_id == self.current_predicative_segment.get("ID"):
+ next_length = self.current_predicative_segment.get("Length", 0)
+ else:
+ next_length = seg.get("Length", 0)
+
+ self._dfs(next_id, total_dist + next_length, visited.copy(), current_speed_ms, best_result, path)
+
+ def _build_path_psd(self, start_seg_id):
+ path = []
+ current_id = start_seg_id
+ visited = set()
+
+ segment_children_map = {}
+ for sid, seg in self.predicative_segments.items():
+ parent = seg.get("ID_Prev")
+ if parent not in (None, NOT_SET):
+ segment_children_map.setdefault(parent, []).append(sid)
+
+ while current_id != NOT_SET:
+ if current_id in visited:
+ break
+ visited.add(current_id)
+ path.append(current_id)
+ children = segment_children_map.get(current_id, [])
+ if len(children) != 1:
+ break
+ current_id = children[0]
+
+ return path
+
+ def _get_speed_limit_psd_next(self, current_speed_ms):
+ current_id = self.current_predicative_segment.get("ID")
+ self.v_limit_psd_next = NOT_SET
+
+ if current_id == NOT_SET:
+ return
+
+ path = self._build_path_psd(current_id)
+
+ if len(path) <= 1:
+ return
+
+ best_result = {"limit": float('inf'), "type": NOT_SET, "dist": float('inf'), "length": float('inf')}
+ self._dfs(current_id, 0, set(), current_speed_ms, best_result, path)
+
+ now = time.time()
+ if best_result["limit"] != float('inf'):
+ self.v_limit_psd_next = best_result["limit"]
+ self.v_limit_psd_next_type = best_result["type"]
+ self.v_limit_psd_next_last = best_result["limit"]
+ self.v_limit_psd_next_last_timestamp = now
+ self.v_limit_psd_next_decay_time = math.sqrt(2 * best_result["dist"] / DECELERATION_PREDICATIVE)
+ if self.v_limit_psd_next_type == PSD_TYPE_CURV_SPEED:
+ self.v_limit_psd_next_decay_time += max((best_result["length"] / (self.v_limit_psd_next * CV.KPH_TO_MS)), PSD_CURV_SPEED_DECAY)
+ else:
+ if now - self.v_limit_psd_next_last_timestamp <= self.v_limit_psd_next_decay_time and self.v_limit_output_last > self.v_limit_psd_next_last and not self.v_limit_changed:
+ self.v_limit_psd_next = self.v_limit_psd_next_last
+ else:
+ self.v_limit_psd_next_last = NOT_SET
+ self.v_limit_psd_next_decay_time = NOT_SET
+ self.v_limit_psd_next_type = NOT_SET
+
+ def _get_speed_limit_psd(self):
+ seg_id = self.current_predicative_segment.get("ID")
+ if seg_id == NOT_SET:
+ self.v_limit_psd = NOT_SET
+ return
+
+ seg = self.predicative_segments.get(seg_id)
+ if seg and seg.get("Speed") != NOT_SET:
+ self.v_limit_psd = seg.get("Speed")
+
+ def _get_street_type(self, strassenkategorie, bebauung):
+ street_type = NOT_SET
+
+ if strassenkategorie == 1: # base type: urban
+ street_type = STREET_TYPE_URBAN
+
+ elif strassenkategorie in (2, 3, 4): # base type: non urban
+ if bebauung == 1:
+ street_type = STREET_TYPE_URBAN
+ else:
+ street_type = STREET_TYPE_NONURBAN
+
+ elif strassenkategorie == 5: # base type: highway
+ street_type = STREET_TYPE_HIGHWAY
+
+ return street_type
+
+ def _receive_speed_limit_psd_legal(self, psd_06):
+ if psd_06["PSD_06_Mux"] == 2:
+ if psd_06["PSD_Ges_Typ"] == 2:
+ street_type = self.current_predicative_segment["StreetType"]
+ if ((psd_06["PSD_Ges_Gesetzlich_Kategorie"] == STREET_TYPE_URBAN and street_type == STREET_TYPE_URBAN) or
+ (psd_06["PSD_Ges_Gesetzlich_Kategorie"] == STREET_TYPE_NONURBAN and street_type == STREET_TYPE_NONURBAN) or
+ (psd_06["PSD_Ges_Gesetzlich_Kategorie"] == STREET_TYPE_HIGHWAY and street_type == STREET_TYPE_HIGHWAY)):
+ raw_speed = psd_06["PSD_Ges_Geschwindigkeit"]
+ self.v_limit_psd_legal = self._convert_raw_speed_psd(raw_speed, street_type)
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/tests/__init__.py b/iqdbc_repo/iqdbc/car/volkswagen/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/tests/test_iqpilot_vw_toggles.py b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_iqpilot_vw_toggles.py
new file mode 100644
index 000000000..7e0d6c733
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_iqpilot_vw_toggles.py
@@ -0,0 +1,49 @@
+from types import SimpleNamespace
+
+from iqdbc.car.volkswagen import mqbcan, pqcan
+from iqdbc.car.volkswagen.carcontroller import CarController
+from iqdbc.car.volkswagen.values import CAR, MQB_A0_CARS
+
+
+def test_is_mqb_a0_car_matches_expected_platforms():
+ assert CAR.VOLKSWAGEN_POLO_MK6 in MQB_A0_CARS
+ assert CAR.VOLKSWAGEN_TCROSS_MK1 in MQB_A0_CARS
+ assert CAR.SKODA_FABIA_MK4 in MQB_A0_CARS
+ assert CAR.SKODA_KAMIQ_MK1 in MQB_A0_CARS
+ assert CarController._is_mqb_a0_car(CAR.VOLKSWAGEN_POLO_MK6)
+ assert CarController._is_mqb_a0_car(CAR.VOLKSWAGEN_TCROSS_MK1)
+ assert CarController._is_mqb_a0_car(CAR.SKODA_FABIA_MK4)
+ assert CarController._is_mqb_a0_car(CAR.SKODA_KAMIQ_MK1)
+ assert not CarController._is_mqb_a0_car(CAR.VOLKSWAGEN_GOLF_MK7)
+
+
+def test_mqb_steering_torque_scale_only_changes_when_toggle_enabled():
+ controller = object.__new__(CarController)
+ controller.CCS = mqbcan
+ assert controller._get_mqb_steering_torque_scale(0.4, False) == 1.0
+
+ assert controller._get_mqb_steering_torque_scale(0.4, True) == 0.8
+ assert controller._get_mqb_steering_torque_scale(4.0, True) == 1.0
+
+ controller.CCS = pqcan
+ assert controller._get_mqb_steering_torque_scale(0.4, True) == 1.0
+
+
+def test_mqb_a0_resume_spam_requires_toggle_platform_and_window():
+ controller = object.__new__(CarController)
+ controller.CCS = mqbcan
+ controller.is_mqb_a0 = True
+ controller.frame = 10
+ cs = SimpleNamespace(out=SimpleNamespace(standstill=True))
+
+ assert controller._should_spam_mqb_a0_resume(cs, True)
+
+ controller.frame = 20
+ assert not controller._should_spam_mqb_a0_resume(cs, True)
+
+ controller.frame = 10
+ controller.is_mqb_a0 = False
+ assert not controller._should_spam_mqb_a0_resume(cs, True)
+
+ controller.is_mqb_a0 = True
+ assert not controller._should_spam_mqb_a0_resume(cs, False)
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/tests/test_mqb_extended_standstill.py b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_mqb_extended_standstill.py
new file mode 100644
index 000000000..ab79339b7
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_mqb_extended_standstill.py
@@ -0,0 +1,363 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import math
+from types import SimpleNamespace
+
+from iqdbc.car.volkswagen.carcontroller import MQBStandstillManager
+
+
+def _pitch(grade_pct):
+ return math.atan(grade_pct / 100.0)
+
+
+def _mgr():
+ return MQBStandstillManager(vehicle_mass=1540.0, accel_min=-3.5)
+
+
+def _cs(*, esp_hold_confirmation=False, esp_stopping=False, rolling_backward=False,
+ rolling_forward=False, brake_pressed=False, gas_pressed=False, standstill=True, v_ego=0.0,
+ sum_wegimpulse=0):
+ out = SimpleNamespace(brakePressed=brake_pressed, gasPressed=gas_pressed, standstill=standstill, vEgo=v_ego)
+ return SimpleNamespace(out=out, esp_hold_confirmation=esp_hold_confirmation,
+ esp_stopping=esp_stopping, rolling_backward=rolling_backward,
+ rolling_forward=rolling_forward, sum_wegimpulse=sum_wegimpulse)
+
+
+def _run(mgr, cs, *, long_active=True, accel=0.0, stopping=False, starting=False,
+ max_planned_speed=0.0, grade_pct=0.0, tsk_brake_torque=0.0):
+ return mgr.update(cs, long_active, accel, stopping, starting, max_planned_speed,
+ _pitch(grade_pct), tsk_brake_torque)
+
+
+def _safe_speed(mgr, grade_pct, brake_torque=0.0):
+ return mgr.get_safe_speed_for_brake_torque(_pitch(grade_pct), brake_torque)
+
+
+# ── brake press ──────────────────────────────────────────────────────────────
+
+def test_brake_pressed_disables_long_active():
+ mgr = _mgr()
+ long_active, *_ = _run(mgr, _cs(brake_pressed=True), long_active=True)
+ assert not long_active
+
+
+# ── rollback detection ───────────────────────────────────────────────────────
+
+def test_rollback_detected_on_rolling_backward():
+ mgr = _mgr()
+ _run(mgr, _cs(rolling_backward=True))
+ assert mgr.rollback_detected
+
+
+def test_rollback_clears_on_rolling_forward():
+ mgr = _mgr()
+ _run(mgr, _cs(rolling_backward=True))
+ assert mgr.rollback_detected
+ _run(mgr, _cs(rolling_forward=True))
+ assert not mgr.rollback_detected
+
+
+def test_rollback_forces_brake():
+ mgr = _mgr()
+ _run(mgr, _cs(rolling_backward=True))
+ _, accel, *_ = _run(mgr, _cs(), accel=-0.5)
+ assert accel == mgr.accel_min
+
+
+def test_rollback_cleared_when_rolling_forward_passes_through_accel():
+ mgr = _mgr()
+ _run(mgr, _cs(rolling_backward=True))
+ _, accel, *_ = _run(mgr, _cs(rolling_forward=True, standstill=False), accel=-0.5)
+ assert accel == -0.5
+
+
+def test_rollback_forces_brake_with_positive_accel():
+ mgr = _mgr()
+ _run(mgr, _cs(rolling_backward=True))
+ _, accel, stopping, starting, *_ = _run(mgr, _cs(), accel=0.5)
+ assert accel == mgr.accel_min
+ assert stopping
+ assert not starting
+
+
+# ── safe speed braking ───────────────────────────────────────────────────────
+
+def test_flat_ground_passes_raw_accel():
+ mgr = _mgr()
+ _, accel, stopping, starting, *_ = _run(mgr, _cs(v_ego=0.0), accel=-0.55,
+ stopping=True, starting=False, grade_pct=0.0)
+ assert accel == -0.55
+ assert stopping
+ assert not starting
+
+
+def test_current_brake_torque_reduces_safe_speed():
+ mgr = _mgr()
+ zero_brake_safe_speed = _safe_speed(mgr, 20.0)
+ current_brake_safe_speed = _safe_speed(mgr, 20.0, 500.0)
+ assert 0.0 < current_brake_safe_speed < zero_brake_safe_speed
+
+
+def test_current_brake_torque_can_eliminate_safe_speed():
+ mgr = _mgr()
+ assert _safe_speed(mgr, 20.0, 10000.0) == 0.0
+
+
+def test_safe_speed_is_capped_at_10_kph():
+ mgr = _mgr()
+ assert _safe_speed(mgr, 100.0) == MQBStandstillManager.MAX_SAFE_STOPPING_SPEED
+
+
+def test_esp_stopping_passes_raw_accel_on_flat():
+ mgr = _mgr()
+ _, accel, stopping, starting, esp_starting_override, esp_stopping_override = _run(
+ mgr, _cs(esp_stopping=True, v_ego=0.2), accel=-0.55, stopping=True, starting=False,
+ )
+ assert accel == -0.55
+ assert stopping
+ assert not starting
+ assert esp_starting_override is True
+ assert esp_stopping_override is False
+
+
+def test_below_safe_speed_blends_brake():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ required_torque = mgr.get_hill_hold_decel_deficit(_pitch(grade), 0.0) * mgr.vehicle_mass * mgr.ASSUMED_WHEEL_RADIUS
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55, grade_pct=grade,
+ tsk_brake_torque=required_torque * 0.5,
+ )
+ assert mgr.accel_min < accel < -0.55
+ assert stopping
+ assert not starting
+
+
+def test_sufficient_brake_torque_passes_raw_accel():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.2, stopping=True, starting=False,
+ grade_pct=grade, tsk_brake_torque=10000.0,
+ )
+ assert accel == -0.2
+ assert stopping
+ assert not starting
+
+
+def test_below_safe_speed_with_low_planned_speed_uses_blended_braking():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55,
+ max_planned_speed=safe_speed * 0.5, grade_pct=grade,
+ )
+ assert mgr.accel_min <= accel < -0.55
+ assert stopping
+ assert not starting
+
+
+def test_below_safe_speed_with_high_planned_speed_and_negative_accel_uses_blended_braking():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55,
+ max_planned_speed=safe_speed * 2.0, grade_pct=grade,
+ )
+ assert mgr.accel_min <= accel < -0.55
+ assert stopping
+ assert not starting
+
+
+def test_below_safe_speed_with_high_planned_speed_and_positive_accel_uses_hill_takeoff():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(v_ego=safe_speed * 0.5), accel=0.1,
+ max_planned_speed=safe_speed * 2.0, grade_pct=grade,
+ )
+ assert accel == max(0.1, 0.1 * grade, 0.2)
+ assert starting
+ assert not stopping
+
+
+# ── start commit ─────────────────────────────────────────────────────────────
+
+def test_start_commit_on_pre_enable():
+ mgr = _mgr()
+ _run(mgr, _cs(esp_hold_confirmation=True))
+ assert mgr.start_commit_active
+
+
+def test_start_commit_forces_accel():
+ mgr = _mgr()
+ grade = 10.0
+ expected_min = max(0.1 * grade, 0.2)
+ _run(mgr, _cs(esp_hold_confirmation=True), grade_pct=grade)
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(esp_hold_confirmation=True), accel=0.0, grade_pct=grade,
+ )
+ assert accel >= expected_min
+ assert starting
+ assert not stopping
+
+
+def test_start_commit_clears_above_safe_speed_while_moving():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ _run(mgr, _cs(esp_hold_confirmation=True), grade_pct=grade)
+ assert mgr.start_commit_active
+ _run(mgr, _cs(v_ego=safe_speed * 2.0, standstill=True), grade_pct=grade)
+ assert not mgr.start_commit_active
+
+
+def test_start_commit_persists_below_safe_speed():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+ _run(mgr, _cs(esp_hold_confirmation=True), grade_pct=grade)
+ assert mgr.start_commit_active
+ _, accel, stopping, starting, *_ = _run(
+ mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55, grade_pct=grade,
+ )
+ assert mgr.start_commit_active
+ assert accel == max(-0.55, 0.1 * grade, 0.2)
+ assert starting
+ assert not stopping
+
+
+# ── can_stop_forever / ESP override ──────────────────────────────────────────
+
+def test_can_stop_forever_latches_on_esp_stopping():
+ mgr = _mgr()
+ *_, esp_start, esp_stop = _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True)
+ assert mgr.can_stop_forever
+ assert esp_start is True
+ assert esp_stop is False
+
+
+def test_can_stop_forever_persists():
+ mgr = _mgr()
+ _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True)
+ *_, esp_start, esp_stop = _run(mgr, _cs(), accel=-1.0, stopping=True)
+ assert mgr.can_stop_forever
+ assert esp_start is True
+ assert esp_stop is False
+
+
+def test_can_stop_forever_cleared_by_hold_confirmation():
+ mgr = _mgr()
+ _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True)
+ assert mgr.can_stop_forever
+ _run(mgr, _cs(esp_hold_confirmation=True), accel=-1.0, stopping=True)
+ assert not mgr.can_stop_forever
+
+
+def test_hold_confirmation_recovers_stop_forever_after_launch_commit():
+ mgr = _mgr()
+ grade = 20.0
+ safe_speed = _safe_speed(mgr, grade)
+
+ *_, esp_start, esp_stop = _run(mgr, _cs(esp_hold_confirmation=True, sum_wegimpulse=0),
+ accel=0.0, grade_pct=grade)
+ assert mgr.start_commit_active
+ assert mgr.hold_recovery_active
+ assert esp_start is True
+ assert esp_stop is False
+
+ *_, esp_start, esp_stop = _run(mgr, _cs(v_ego=safe_speed * 2.0, standstill=False, sum_wegimpulse=1),
+ accel=0.0, grade_pct=grade)
+ assert not mgr.start_commit_active
+ assert mgr.hold_recovery_active
+ assert esp_start is False
+ assert esp_stop is True
+
+ *_, esp_start, esp_stop = _run(mgr, _cs(esp_stopping=True, v_ego=safe_speed * 2.0, standstill=False,
+ sum_wegimpulse=2), accel=0.0, grade_pct=grade)
+ assert mgr.can_stop_forever
+ assert not mgr.hold_recovery_active
+ assert esp_start is True
+ assert esp_stop is False
+
+
+def test_can_stop_forever_cleared_when_moving():
+ mgr = _mgr()
+ _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True)
+ assert mgr.can_stop_forever
+ _run(mgr, _cs(v_ego=MQBStandstillManager.ESP_OVERRIDE_SPEED + 0.01), accel=0.5)
+ assert not mgr.can_stop_forever
+
+
+def test_can_stop_forever_cleared_when_long_inactive():
+ mgr = _mgr()
+ _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True)
+ assert mgr.can_stop_forever
+ _run(mgr, _cs(), long_active=False)
+ assert not mgr.can_stop_forever
+
+
+def test_esp_override_stop_at_standstill():
+ mgr = _mgr()
+ esp_start = esp_stop = None
+ for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1):
+ *_, esp_start, esp_stop = _run(mgr, _cs(sum_wegimpulse=0), accel=-1.0, stopping=True)
+ assert esp_start is False
+ assert esp_stop is True
+
+
+def test_esp_override_stop_persists_at_standstill():
+ mgr = _mgr()
+ for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1):
+ _run(mgr, _cs(sum_wegimpulse=0), accel=-1.0, stopping=True)
+ *_, esp_start, esp_stop = _run(mgr, _cs(sum_wegimpulse=0), accel=-1.0, stopping=True)
+ assert esp_start is False
+ assert esp_stop is True
+
+
+def test_esp_override_stop_not_sent_while_esp_stopping():
+ mgr = _mgr()
+ *_, esp_start, esp_stop = _run(mgr, _cs(esp_stopping=True, sum_wegimpulse=0),
+ accel=-1.0, stopping=True)
+ assert mgr.can_stop_forever
+ assert esp_start is True
+ assert esp_stop is False
+
+
+def test_esp_override_stop_not_requested_while_moving():
+ mgr = _mgr()
+ esp_start = esp_stop = None
+ for sum_wegimpulse in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1):
+ *_, esp_start, esp_stop = _run(mgr, _cs(sum_wegimpulse=sum_wegimpulse), accel=-1.0, stopping=True)
+ assert esp_start is True
+ assert esp_stop is False
+
+
+def test_esp_override_default_below_grant_speed_when_inactive():
+ mgr = _mgr()
+ *_, esp_start, esp_stop = _run(mgr, _cs(), long_active=False)
+ assert esp_start is True
+ assert esp_stop is False
+
+
+def test_wegimpulse_at_standstill_after_stillness_frames():
+ mgr = _mgr()
+ for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1):
+ _run(mgr, _cs(sum_wegimpulse=0))
+ assert mgr.frames_since_last_wheel_pulse >= MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES
+
+
+def test_wegimpulse_resets_on_change():
+ mgr = _mgr()
+ for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES):
+ _run(mgr, _cs(sum_wegimpulse=0))
+ _run(mgr, _cs(sum_wegimpulse=1))
+ assert mgr.frames_since_last_wheel_pulse == 0
+
+
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/tests/test_pq_can_valid.py b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_pq_can_valid.py
new file mode 100644
index 000000000..5858303e3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_pq_can_valid.py
@@ -0,0 +1,186 @@
+"""
+Regression guard for the class of bug fixed in carstate.py's Diagnose_1 (cluster clock,
+removed) and EPB_1 (stop-and-go hold, now gated on PQ_SNG_ECD): reading a CAN message via
+`some_cp.vl["MsgName"]["Signal"]` without declaring it in get_can_parsers_pq() lazily adds
+it via VLDict.__getitem__ -> CANParser._add_message(key, freq=None), which is NOT the same
+as ignore-alive (that's what math.nan is for -- see
+iqdbc/can/tests/test_packer_parser.py::test_lazy_add_not_ignore_alive). An undeclared
+message defaults to "assume ~1Hz, must be seen within ~10s", so if the real car never sends
+it, CarState.canValid gets stuck False forever.
+
+Rather than fuzzing every VolkswagenFlagsIQ combination (most are unreachable through
+interface.py's real detection logic), each fixture below is the CarParams captured from a
+real konn3kt route for a real car of that variant. We run CarState.update() once (no CAN
+data needs to be fed -- .vl[...] lazily adds and returns default-zero values regardless of
+whether the parser has ever seen a real frame) while recording every message name accessed,
+then assert that set is a subset of what that real car actually transmits (per its captured
+CAN fingerprint). A message accessed but not in the real fingerprint is exactly the bug
+class this guards against.
+"""
+from iqdbc.can.parser import VLDict
+from iqdbc.car import structs
+from iqdbc.car.volkswagen.carstate import CarState
+from iqdbc.car.volkswagen.values import CAR, Bus
+
+
+class _RecordingVLDict(VLDict):
+ """Records every message name read via .vl[...], including ones lazily added for
+ messages never declared in get_can_parsers_pq's message list. Applied by reclassing
+ a live CANParser.vl instance in place (rather than replacing it with a fresh object)
+ so any messages already registered at CANParser construction time, and the parser
+ back-reference _add_message needs, are preserved."""
+ accessed: set[str]
+
+ def __getitem__(self, key):
+ if isinstance(key, str):
+ self.accessed.add(key)
+ return super().__getitem__(key)
+
+
+def _make_car_params(car_fingerprint, flags, network_location, transmission_type, enable_bsm, pcm_cruise):
+ CP = structs.CarParams.new_message()
+ CP.carFingerprint = car_fingerprint
+ CP.flags = flags
+ CP.radarUnavailable = True
+ CP.networkLocation = network_location
+ CP.transmissionType = transmission_type
+ CP.enableBsm = enable_bsm
+ CP.pcmCruise = pcm_cruise
+ CP.minSteerSpeed = 0.0
+ CP_IQ = structs.IQCarParams()
+ return CP, CP_IQ
+
+
+# Real per-variant CarParams captured from konn3kt routes (not hand-derived), so each
+# fixture reflects an actual car rather than a guess at which flag combos are reachable.
+# known_bus1/known_bus2 are the exact message names present in that car's real CAN
+# fingerprint. Bus.pt and Bus.aux both listen on physical bus 1 for PQ (CanBus.powertrain
+# == CanBus.aux == 1); Bus.cam listens on physical bus 2 (CanBus.cam == 2) -- see CanBus in
+# iqdbc/car/volkswagen/values.py. UNK_* (unrecognized DBC addresses) are dropped.
+FIXTURES = [
+ dict(
+ name="jetta_mk6_base",
+ route="a0d99b85ff06857b|0000003a--135c88414f",
+ car_fingerprint=CAR.VOLKSWAGEN_JETTA_MK6,
+ flags=2,
+ network_location="gateway",
+ transmission_type="automatic",
+ enable_bsm=False,
+ pcm_cruise=True,
+ known_bus1={
+ 'ACC_GRA_Anzeige', 'ACC_System', 'AWV', 'Airbag_1', 'Airbag_2', 'BSG_Last', 'Bremse_1',
+ 'Bremse_10', 'Bremse_11', 'Bremse_2', 'Bremse_3', 'Bremse_4', 'Bremse_5', 'Bremse_8',
+ 'Bremse_9', 'Diagnose_1', 'Einheiten_1', 'GRA_Neu', 'Gate_Komf_1', 'Gate_Komf_2',
+ 'Getriebe_1', 'Getriebe_2', 'Getriebe_4', 'Ident', 'Klima_1', 'Kombi_1', 'Kombi_2',
+ 'Kombi_3', 'Lenkhilfe_1', 'Lenkhilfe_2', 'Lenkhilfe_3', 'Lenkwinkel_1', 'Motor_1',
+ 'Motor_10', 'Motor_12', 'Motor_2', 'Motor_3', 'Motor_5', 'Motor_6', 'Motor_7', 'Motor_8',
+ 'Motor_Bremse', 'Motor_Flexia', 'Soll_Verbauliste_neu', 'Systeminfo_1', 'Waehlhebel_1',
+ },
+ known_bus2={
+ 'ACC_GRA_Anzeige', 'ACC_System', 'AWV', 'Airbag_1', 'BSG_Last', 'Bremse_1', 'Bremse_10',
+ 'Bremse_11', 'Bremse_2', 'Bremse_3', 'Bremse_5', 'Bremse_8', 'Diagnose_1', 'Einheiten_1',
+ 'GRA_Neu', 'Gate_Komf_1', 'Gate_Komf_2', 'Getriebe_1', 'Ident', 'Kombi_1', 'Kombi_2',
+ 'Kombi_3', 'Lenkhilfe_2', 'Lenkhilfe_3', 'Lenkwinkel_1', 'Motor_1', 'Motor_10', 'Motor_2',
+ 'Motor_3', 'Motor_5', 'Motor_Flexia', 'Soll_Verbauliste_neu', 'Systeminfo_1',
+ },
+ ),
+ dict(
+ name="passat_nms_sng_ecd",
+ route="0f53129ed44f6920|00000031--0c1aea511e",
+ car_fingerprint=CAR.VOLKSWAGEN_PASSAT_NMS,
+ flags=524418, # PQ | IQ_LVBS_ALC_MODULE | IQ_PQ_SNG_ECD
+ network_location="gateway",
+ transmission_type="automatic",
+ enable_bsm=False,
+ pcm_cruise=False,
+ known_bus1={
+ 'ACC_GRA_Anzeige', 'ACC_System', 'AWV', 'Airbag_1', 'Airbag_2', 'BSG_Last', 'Bremse_1',
+ 'Bremse_10', 'Bremse_11', 'Bremse_2', 'Bremse_3', 'Bremse_4', 'Bremse_5', 'Bremse_8',
+ 'Bremse_9', 'Diagnose_1', 'EPB_1', 'EPB_2', 'Einheiten_1', 'GRA_Neu', 'Gate_Komf_1',
+ 'Gate_Komf_2', 'Getriebe_1', 'Getriebe_2', 'Ident', 'Klima_1', 'Kombi_1', 'Kombi_2',
+ 'Kombi_3', 'Lenkhilfe_1', 'Lenkhilfe_2', 'Lenkhilfe_3', 'Lenkwinkel_1', 'Motor_1',
+ 'Motor_10', 'Motor_12', 'Motor_13', 'Motor_2', 'Motor_3', 'Motor_5', 'Motor_6', 'Motor_7',
+ 'Motor_8', 'Motor_Bremse', 'Motor_Flexia', 'Soll_Verbauliste_neu', 'Systeminfo_1',
+ },
+ known_bus2={
+ 'ACC_GRA_Anzeige', 'ACC_System', 'AWV', 'Airbag_1', 'BSG_Last', 'Bremse_1', 'Bremse_10',
+ 'Bremse_11', 'Bremse_2', 'Bremse_3', 'Bremse_5', 'Bremse_8', 'Diagnose_1', 'EPB_1',
+ 'Einheiten_1', 'GRA_Neu', 'Gate_Komf_1', 'Gate_Komf_2', 'Getriebe_1', 'Ident', 'Kombi_1',
+ 'Kombi_2', 'Kombi_3', 'Lenkhilfe_2', 'Lenkhilfe_3', 'Lenkwinkel_1', 'Motor_1', 'Motor_10',
+ 'Motor_2', 'Motor_3', 'Motor_5', 'Motor_Flexia', 'Soll_Verbauliste_neu', 'Systeminfo_1',
+ },
+ ),
+ dict(
+ name="passat_b7_acc_fts_epb",
+ route="20e3cd4f0d5f39d1|0000008e--274d762bac",
+ car_fingerprint=CAR.VOLKSWAGEN_PASSAT_B7,
+ flags=262146, # PQ | IQ_PQ_ACC_FTS_EPB
+ network_location="gateway",
+ transmission_type="automatic",
+ enable_bsm=True,
+ pcm_cruise=False,
+ known_bus1={
+ 'ACC_GRA_Anzeige', 'ACC_System', 'AWV', 'Airbag_1', 'Airbag_2', 'BSG_Last', 'Bremse_1',
+ 'Bremse_10', 'Bremse_11', 'Bremse_2', 'Bremse_3', 'Bremse_4', 'Bremse_5', 'Bremse_8',
+ 'Bremse_9', 'Daempfer_1', 'Diagnose_1', 'EPB_1', 'Einheiten_1', 'GRA_Neu', 'Gate_Komf_1',
+ 'Gate_Komf_2', 'Getriebe_1', 'Getriebe_2', 'Getriebe_4', 'HCA_1', 'Ident', 'Klima_1',
+ 'Kombi_1', 'Kombi_2', 'Kombi_3', 'Lenkhilfe_1', 'Lenkhilfe_2', 'Lenkhilfe_3',
+ 'Lenkwinkel_1', 'Motor_1', 'Motor_10', 'Motor_12', 'Motor_2', 'Motor_3', 'Motor_5',
+ 'Motor_6', 'Motor_7', 'Motor_8', 'Motor_Bremse', 'Motor_Flexia', 'Parkhilfe_01',
+ 'Soll_Verbauliste_neu', 'Systeminfo_1', 'Waehlhebel_1',
+ },
+ known_bus2={
+ 'ACC_GRA_Anzeige', 'ACC_System', 'AWV', 'Airbag_1', 'BSG_Last', 'Bremse_1', 'Bremse_10',
+ 'Bremse_11', 'Bremse_2', 'Bremse_3', 'Bremse_5', 'Bremse_8', 'Diagnose_1', 'EPB_1',
+ 'Einheiten_1', 'GRA_Neu', 'Gate_Komf_1', 'Gate_Komf_2', 'Getriebe_1', 'HCA_1', 'Ident',
+ 'Kombi_1', 'Kombi_2', 'Kombi_3', 'LDW_Status', 'Lenkhilfe_2', 'Lenkhilfe_3',
+ 'Lenkwinkel_1', 'Motor_1', 'Motor_10', 'Motor_2', 'Motor_3', 'Motor_5', 'Motor_Flexia',
+ 'Parkhilfe_01', 'RDK_Status', 'SWA_1', 'Soll_Verbauliste_neu', 'Systeminfo_1',
+ },
+ ),
+]
+
+
+class TestVolkswagenPqCanValid:
+ def test_only_reads_messages_the_real_car_sends(self, subtests):
+ for fixture in FIXTURES:
+ with subtests.test(car=fixture["name"]):
+ CP, CP_IQ = _make_car_params(
+ fixture["car_fingerprint"], fixture["flags"], fixture["network_location"],
+ fixture["transmission_type"], fixture["enable_bsm"], fixture["pcm_cruise"],
+ )
+
+ CS = CarState(CP, CP_IQ)
+ can_parsers = CS.get_can_parsers(CP, CP_IQ)
+
+ recorders = {}
+ for bus, parser in can_parsers.items():
+ if parser is None:
+ continue
+ parser.vl.__class__ = _RecordingVLDict
+ parser.vl.accessed = set()
+ recorders[bus] = parser.vl
+
+ # no CAN data is fed: .vl[...] lazily adds and returns default-zero values
+ # regardless of whether the parser has ever seen a real frame, so this alone
+ # is enough to harvest every message name update_pq() touches for this variant
+ CS.update(can_parsers)
+
+ accessed_bus1 = recorders[Bus.pt].accessed | recorders[Bus.aux].accessed
+ accessed_bus2 = recorders[Bus.cam].accessed
+
+ extra_bus1 = accessed_bus1 - fixture["known_bus1"]
+ extra_bus2 = accessed_bus2 - fixture["known_bus2"]
+
+ assert not extra_bus1, (
+ f"{fixture['name']}: code reads {sorted(extra_bus1)} on bus 1 (pt/aux) but the "
+ f"real car (route {fixture['route']}) never transmits it -- this needs to be "
+ f"gated behind whatever flag makes it optional, or declared with math.nan if it's "
+ f"genuinely on-demand/rare, not read unconditionally"
+ )
+ assert not extra_bus2, (
+ f"{fixture['name']}: code reads {sorted(extra_bus2)} on bus 2 (cam) but the "
+ f"real car (route {fixture['route']}) never transmits it -- this needs to be "
+ f"gated behind whatever flag makes it optional, or declared with math.nan if it's "
+ f"genuinely on-demand/rare, not read unconditionally"
+ )
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/tests/test_stopping.py b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_stopping.py
new file mode 100644
index 000000000..9a07a21cb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_stopping.py
@@ -0,0 +1,33 @@
+import pytest
+
+from iqdbc.car.volkswagen.interface import CarInterface
+from iqdbc.car.volkswagen.values import (
+ CAR, PASSAT_B7_STOP_ACCEL, PASSAT_B7_STOPPING_SPEED, PQ_STOPPING_SPEED,
+ VolkswagenFlags, apply_pq_stopping_accel, get_longitudinal_stopping_speed_override,
+)
+
+
+@pytest.mark.parametrize("candidate, flags, expected", [
+ (CAR.VOLKSWAGEN_PASSAT_B7, VolkswagenFlags.PQ, PASSAT_B7_STOPPING_SPEED),
+ (CAR.VOLKSWAGEN_JETTA_MK6, VolkswagenFlags.PQ, PQ_STOPPING_SPEED),
+ (CAR.VOLKSWAGEN_GOLF_MK7, 0, 0.0),
+ (CAR.VOLKSWAGEN_ID4_MK1, VolkswagenFlags.MEB, 0.0),
+])
+def test_stopping_speed_override(candidate, flags, expected):
+ assert get_longitudinal_stopping_speed_override(candidate, flags) == expected
+
+
+def test_passat_b7_stop_accel_is_exact():
+ assert apply_pq_stopping_accel(CAR.VOLKSWAGEN_PASSAT_B7, -0.2, True) == PASSAT_B7_STOP_ACCEL == -0.55
+ assert apply_pq_stopping_accel(CAR.VOLKSWAGEN_PASSAT_B7, -0.2, False) == -0.2
+ assert apply_pq_stopping_accel(CAR.VOLKSWAGEN_JETTA_MK6, -0.2, True) == -0.2
+
+
+@pytest.mark.parametrize("candidate", [
+ CAR.VOLKSWAGEN_JETTA_MK6,
+ CAR.VOLKSWAGEN_PASSAT_NMS,
+])
+def test_pq_longitudinal_feedforward_uses_active_schema_field(candidate):
+ fingerprint = {bus: {} for bus in range(8)}
+ cp = CarInterface.get_params(candidate, fingerprint, [], alpha_long=True, is_release=False, docs=False)
+ assert cp.longitudinalTuning.kf == pytest.approx(1.2)
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/tests/test_volkswagen.py b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_volkswagen.py
new file mode 100644
index 000000000..83a6e24bc
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/tests/test_volkswagen.py
@@ -0,0 +1,129 @@
+import random
+import re
+from types import SimpleNamespace
+
+import pytest
+
+from iqdbc.car import structs
+from iqdbc.car.volkswagen.carstate import CarState
+from iqdbc.car.structs import CarParams
+from iqdbc.car.volkswagen.values import CAR, FW_QUERY_CONFIG, WMI
+from iqdbc.car.volkswagen.fingerprints import FW_VERSIONS
+
+Ecu = CarParams.Ecu
+
+CHASSIS_CODE_PATTERN = re.compile('[A-Z0-9]{2}')
+# TODO: determine the unknown groups
+SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )')
+
+
+class TestVolkswagenPlatformConfigs:
+ def test_spare_part_fw_pattern(self, subtests):
+ # Relied on for determining if a FW is likely VW
+ for platform, ecus in FW_VERSIONS.items():
+ with subtests.test(platform=platform.value):
+ for fws in ecus.values():
+ for fw in fws:
+ assert SPARE_PART_FW_PATTERN.match(fw) is not None, f"Bad FW: {fw}"
+
+ def test_chassis_codes(self, subtests):
+ for platform in CAR:
+ with subtests.test(platform=platform.value):
+ assert len(platform.config.wmis) > 0, "WMIs not set"
+ assert len(platform.config.chassis_codes) > 0, "Chassis codes not set"
+ assert all(CHASSIS_CODE_PATTERN.match(cc) for cc in
+ platform.config.chassis_codes), "Bad chassis codes"
+
+ # No two platforms should share chassis codes
+ for comp in CAR:
+ if platform == comp:
+ continue
+
+ shared_chassis_codes = platform.config.chassis_codes & comp.config.chassis_codes
+ if len(shared_chassis_codes) == 0:
+ continue
+
+ # A shared chassis code is unambiguous when the VIN WMI separates the candidates.
+ if platform.config.wmis.isdisjoint(comp.config.wmis):
+ continue
+
+ platform_model_years = getattr(platform.config, "model_years", set())
+ comp_model_years = getattr(comp.config, "model_years", set())
+ if platform_model_years and comp_model_years and platform_model_years.isdisjoint(comp_model_years):
+ continue
+
+ assert set() == shared_chassis_codes, f"Shared chassis codes: {comp}"
+
+ def test_custom_fuzzy_fingerprinting(self, subtests):
+ all_radar_fw = list({fw for ecus in FW_VERSIONS.values() for fw in ecus.get((Ecu.fwdRadar, 0x757, None), [])})
+
+ for platform in CAR:
+ with subtests.test(platform=platform.name):
+ # Fuzzy matching keys off the radar ECU (CHECK_FUZZY_ECUS), so a platform that
+ # declares no radar ECU can never be VIN-matched and should never be expected to match.
+ platform_has_radar = (Ecu.fwdRadar, 0x757, None) in FW_VERSIONS.get(platform, {})
+ for wmi in WMI:
+ for chassis_code in platform.config.chassis_codes | {"00"}:
+ platform_model_years = getattr(platform.config, "model_years", set())
+ model_years = platform_model_years if platform_model_years else {"0"}
+ for model_year in model_years | {"0"}:
+ vin = ["0"] * 17
+ vin[0:3] = wmi
+ vin[6:8] = chassis_code
+ vin[9] = model_year
+ vin = "".join(vin)
+
+ # Check a few FW cases - expected, unexpected
+ for radar_fw in random.sample(all_radar_fw, 5) + [b'\xf1\x875Q0907572G \xf1\x890571', b'\xf1\x877H9907572AA\xf1\x890396']:
+ model_year_match = len(platform_model_years) == 0 or model_year in platform_model_years
+ should_match = ((wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes and model_year_match) and
+ radar_fw in all_radar_fw and platform_has_radar)
+
+ live_fws = {(0x757, None): [radar_fw]}
+ matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fws, vin, FW_VERSIONS)
+
+ expected_matches = {platform} if should_match else set()
+ assert expected_matches == matches, "Bad match"
+
+
+@pytest.mark.parametrize("button_type", (
+ structs.CarState.ButtonEvent.Type.setCruise,
+ structs.CarState.ButtonEvent.Type.resumeCruise,
+))
+def test_button_enable_is_blocked_while_cruise_fault_lateral_mode_is_still_faulted(button_type):
+ state = object.__new__(CarState)
+ state.CP = SimpleNamespace(pcmCruise=False)
+ state.cruise_fault_lateral_active = True
+ state.cruise_faulted = True
+
+ button_events = [structs.CarState.ButtonEvent(pressed=False, type=button_type)]
+
+ assert not state.update_button_enable(button_events)
+
+
+def test_button_enable_recovers_once_cruise_fault_clears():
+ state = object.__new__(CarState)
+ state.CP = SimpleNamespace(pcmCruise=False)
+ state.cruise_fault_lateral_active = True
+ state.cruise_faulted = False
+
+ button_events = [structs.CarState.ButtonEvent(
+ pressed=False,
+ type=structs.CarState.ButtonEvent.Type.setCruise,
+ )]
+
+ assert state.update_button_enable(button_events)
+
+
+def test_pq_hca_ready_does_not_complete_eps_initialization():
+ state = object.__new__(CarState)
+ state.eps_init_complete = False
+
+ state.frame = 0
+ assert state.update_hca_state("READY", ready_confirms_init=False) == (True, False)
+
+ state.frame = 317
+ assert state.update_hca_state("FAULT", ready_confirms_init=False) == (True, False)
+
+ state.frame = 1001
+ assert state.update_hca_state("FAULT", ready_confirms_init=False) == (False, True)
diff --git a/iqdbc_repo/iqdbc/car/volkswagen/values.py b/iqdbc_repo/iqdbc/car/volkswagen/values.py
new file mode 100644
index 000000000..cff8bce3e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/volkswagen/values.py
@@ -0,0 +1,939 @@
+from collections import defaultdict, namedtuple
+from dataclasses import dataclass, field
+from enum import Enum, IntFlag, StrEnum
+
+from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, CanBusBase, CarSpecs, DbcDict, DT_CTRL, PlatformConfig, Platforms, structs, uds
+from iqdbc.car.lateral import CurvatureSteeringLimits
+from iqdbc.can import CANDefine
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
+from iqdbc.car.lateral import AngleSteeringLimits, ISO_LATERAL_ACCEL, ISO_LATERAL_JERK
+from iqdbc.car.fw_query_definitions import EcuAddrSubAddr, FwQueryConfig, Request, p16
+from iqdbc.car.vin import Vin
+
+Ecu = structs.CarParams.Ecu
+NetworkLocation = structs.CarParams.NetworkLocation
+TransmissionType = structs.CarParams.TransmissionType
+DashcamOnlyReason = structs.CarParams.DashcamOnlyReason
+GearShifter = structs.CarState.GearShifter
+Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
+
+
+class CanBus(CanBusBase):
+ def __init__(self, CP=None, fingerprint=None) -> None:
+ super().__init__(CP, fingerprint)
+ self.offset = 0
+
+ @property
+ def pt(self) -> int:
+ # ADAS / Extended CAN, gateway side of the relay
+ return 0
+
+ @property
+ def aux(self) -> int:
+ # NetworkLocation.fwdCamera: radar-camera object fusion CAN
+ # NetworkLocation.gateway: powertrain CAN
+ return 1
+
+ @property
+ def powertrain(self) -> int:
+ return 1
+
+ @property
+ def main(self) -> int:
+ return 1
+
+ @property
+ def cam(self) -> int:
+ # ADAS / Extended CAN, camera side of the relay
+ return 2
+
+ @property
+ def ext(self) -> int:
+ # ADAS / Extended CAN, side of the relay with the ACC radar
+ return 2
+
+# Extra Tolerances For Road Variance
+AVERAGE_ROAD_ROLL = 0.06
+PQ_STOPPING_SPEED = 1.5 * CV.KPH_TO_MS
+PASSAT_B7_STOPPING_SPEED = 0.55 * CV.KPH_TO_MS
+PASSAT_B7_STOP_ACCEL = -0.55
+
+
+class CarControllerParams:
+ ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits(
+ # Max Steering Angle Allowed
+ 500, # deg
+ # Volkswagen uses a vehicle model
+ ([], []),
+ ([], []),
+
+ # Vehicle Model Angle Limits
+ # Add extra tolerance for average banked road since safety doesn't have the roll calculation
+ MAX_LATERAL_ACCEL=ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^2
+ MAX_LATERAL_JERK=ISO_LATERAL_JERK + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^3
+
+ # Limit Angle Rate to both prevent a openpilot fault and for low speed comfort (~12 mph rate down to 0 mph)
+ MAX_ANGLE_RATE=5, # deg/20ms frame
+ )
+
+ 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
+ VW_LOW_SPEED_STATE_SPEED = 0.5 # m/s; below this, always force starting or stopping in MQB legacy long
+ SNG_HANDOFF_SPEED = 5.0 * CV.KPH_TO_MS
+ SNG_HOLD_DECEL_MAX = -0.1
+
+ # 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
+ # based on safety requirements driven by lateral accel testing.
+
+ STEER_MAX = 300 # Max heading control assist torque 3.00 Nm
+ STEER_DRIVER_MULTIPLIER = 3 # weight driver torque heavily
+ STEER_DRIVER_FACTOR = 1 # from dbc
+
+ STEER_TIME_MAX = 360 # Max time that EPS allows uninterrupted HCA steering control
+ STEER_TIME_BM = STEER_TIME_MAX - 120 # Attempts to mitigate the EPS max steer timer begin
+ STEER_TIME_ALERT = STEER_TIME_MAX - 10 # If mitigation fails, time to soft disengage before EPS timer expires
+ STEER_LOW_TORQUE = int(STEER_MAX * 0.20) # Steer timer mitigation performed when torque output under 20%
+ STEER_TIME_LOW_TORQUE = 0.5 # Wait for this duration of STEER_LOW_TORQUE to begin mitigation
+ STEER_TIME_STUCK_TORQUE = 1.9 # EPS limits same torque to 6 seconds, reset timer 3x within that period
+ STEER_TIME_RESET = 1.1 # Duration of HCA disable needed for effective EPS timer reset'
+ IQ_PQ_UNAVAILABLE_HUD_FRAMES = 25
+
+ DEFAULT_MIN_STEER_SPEED = 0.4 # m/s, newer EPS racks fault below this speed, don't show a low speed alert
+
+ ACCEL_MAX = 2.0 # 2.0 m/s max acceleration
+ ACCEL_MIN = -3.5 # 3.5 m/s max deceleration
+ VW_LOW_SPEED_STATE_SPEED = 0.5 # Always send either starting or stopping below this speed
+
+ def __init__(self, CP):
+ can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
+ self.STEER_TIME_RESET = self.__class__.STEER_TIME_RESET
+
+ if CP.flags & VolkswagenFlags.PQ:
+ self.LDW_STEP = 5 # LDW_1 message frequency 20Hz
+ self.ACC_HUD_STEP = 4 # ACC_GRA_Anzeige frequency 25Hz
+ self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm
+ self.STEER_DELTA_UP = 150 # Max HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60))
+ self.STEER_DELTA_DOWN = 300 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60))
+
+ if CP.transmissionType == TransmissionType.automatic:
+ self.shifter_values = can_define.dv["Getriebe_1"]["GE1_Wahl_Pos"]
+ self.hca_status_values = can_define.dv["Lenkhilfe_2"]["LH2_Sta_HCA"]
+
+ self.BUTTONS = [
+ Button(structs.CarState.ButtonEvent.Type.setCruise, "GRA_Neu", "GRA_Neu_Setzen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.resumeCruise, "GRA_Neu", "GRA_Recall", [1]),
+ Button(structs.CarState.ButtonEvent.Type.accelCruise, "GRA_Neu", "GRA_Up_kurz", [1]),
+ Button(structs.CarState.ButtonEvent.Type.decelCruise, "GRA_Neu", "GRA_Down_kurz", [1]),
+ Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_Neu", "GRA_Abbrechen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_Neu", "GRA_Zeitluecke", [1, 2, 3]),
+ ]
+
+ self.LDW_MESSAGES = {
+ "none": 0, # Nothing to display
+ "laneAssistUnavail": 1, # "Lane Assist currently not available."
+ "laneAssistUnavailSysError": 2, # "Lane Assist system error"
+ "laneAssistUnavailNoSensorView": 3, # "Lane Assist not available. No sensor view."
+ "laneAssistTakeOver": 4, # "Lane Assist: Please Take Over Steering"
+ "laneAssistDeactivTrailer": 5, # "Lane Assist: no function with trailer"
+ }
+
+ elif CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
+ self.LDW_STEP = 10
+ self.ACC_HUD_STEP = 6
+ self.STEER_DRIVER_ALLOWANCE = 60
+ self.STEER_DRIVER_MAX = 300
+ self.STEERING_POWER_MAX = 90
+ self.STEERING_POWER_MIN = 4
+ self.STEERING_POWER_STEP = 2
+
+ self.CURVATURE_PID: structs.CarParams.LateralPIDTuning = structs.CarParams.LateralPIDTuning(
+ kpBP=[10., 40.],
+ kiBP=[10., 40.],
+ kf=1.,
+ kpV=[0., 1.45],
+ kiV=[0., 0.12],
+ )
+
+ self.CURVATURE_LIMITS: CurvatureSteeringLimits = CurvatureSteeringLimits(
+ 0.195,
+ )
+
+ if CP.flags & VolkswagenFlags.ALT_GEAR:
+ self.shifter_values = can_define.dv["Gateway_73"]["GE_Fahrstufe"]
+ else:
+ self.shifter_values = can_define.dv["Getriebe_11"]["GE_Fahrstufe"]
+
+ self.hca_status_values = can_define.dv["QFK_01"]["LatCon_HCA_Status"]
+
+ BASE_BUTTONS = [
+ Button(structs.CarState.ButtonEvent.Type.setCruise, "GRA_ACC_01", "GRA_Tip_Setzen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.resumeCruise, "GRA_ACC_01", "GRA_Tip_Wiederaufnahme", [1]),
+ Button(structs.CarState.ButtonEvent.Type.accelCruise, "GRA_ACC_01", "GRA_Tip_Hoch", [1]),
+ Button(structs.CarState.ButtonEvent.Type.decelCruise, "GRA_ACC_01", "GRA_Tip_Runter", [1]),
+ Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_ACC_01", "GRA_Verstellung_Zeitluecke", [1, 2, 3]),
+ ]
+ self.BUTTONS = BASE_BUTTONS + [
+ Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Hauptschalter", [1]),
+ ]
+ self.BUTTONS_ALT = BASE_BUTTONS + [
+ Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Abbrechen", [1]),
+ ]
+
+ self.LDW_MESSAGES = {
+ "none": 0,
+ "laneAssistTakeOverUrgent": 4,
+ "laneAssistTakeOver": 8,
+ }
+ self.LDW_SOUNDS = {
+ "None": 0,
+ "Chime": 1,
+ "Beep": 2,
+ }
+
+ else:
+ self.LDW_STEP = 10 # LDW_02 message frequency 10Hz
+ self.ACC_HUD_STEP = 6 # ACC_02 message frequency 16Hz
+
+ self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"]
+
+ if CP.flags & VolkswagenFlags.MLB:
+ self.STEER_DRIVER_ALLOWANCE = 60 # Driver intervention threshold 0.6 Nm
+ self.STEER_DELTA_UP = 9 # Max HCA reached in 0.66s (STEER_MAX / (50Hz * 0.66))
+ self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60))
+ self.ACC_HUD_TEXT_STEP = int(2.0 / DT_CTRL) # ACC_02 primary display text dwell time
+
+ if CP.carFingerprint == CAR.PORSCHE_MACAN_MK1:
+ self.shifter_values = can_define.dv["Getriebe_03"]["GE_Waehlhebel"]
+ else:
+ self.shifter_values = None
+
+ self.BUTTONS = [
+ Button(structs.CarState.ButtonEvent.Type.setCruise, "LS_01", "LS_Tip_Setzen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.resumeCruise, "LS_01", "LS_Tip_Wiederaufnahme", [1]),
+ Button(structs.CarState.ButtonEvent.Type.accelCruise, "LS_01", "LS_Tip_Hoch", [1]),
+ Button(structs.CarState.ButtonEvent.Type.decelCruise, "LS_01", "LS_Tip_Runter", [1]),
+ Button(structs.CarState.ButtonEvent.Type.cancel, "LS_01", "LS_Abbrechen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "LS_01", "LS_Verstellung_Zeitluecke", [1, 2, 3]),
+ ]
+
+ # ACC_02.ACC_Texte_Primaeranz, primary ACC display text at the bottom of the cluster
+ self.ACC_HUD_TEXTS = {
+ "none": 0,
+ "setSpeed": 21,
+ }
+ self.ACC_HUD_TEXT_DISTANCE = {1: 2, 2: 3, 3: 4, 4: 5} # follow distance bars to display text
+
+ else:
+ self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm
+ self.STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50))
+ 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"]
+ elif CP.transmissionType == TransmissionType.direct:
+ self.shifter_values = can_define.dv["Motor_EV_01"]["MO_Waehlpos"]
+
+ self.BUTTONS = [
+ Button(structs.CarState.ButtonEvent.Type.setCruise, "GRA_ACC_01", "GRA_Tip_Setzen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.resumeCruise, "GRA_ACC_01", "GRA_Tip_Wiederaufnahme", [1]),
+ Button(structs.CarState.ButtonEvent.Type.accelCruise, "GRA_ACC_01", "GRA_Tip_Hoch", [1]),
+ Button(structs.CarState.ButtonEvent.Type.decelCruise, "GRA_ACC_01", "GRA_Tip_Runter", [1]),
+ Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Abbrechen", [1]),
+ Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_ACC_01", "GRA_Verstellung_Zeitluecke", [1, 2, 3]),
+ ]
+
+ self.LDW_MESSAGES = {
+ "none": 0, # Nothing to display
+ "laneAssistUnavailChime": 1, # "Lane Assist currently not available." with chime
+ "laneAssistUnavailNoSensorChime": 3, # "Lane Assist not available. No sensor view." with chime
+ "laneAssistTakeOverUrgent": 4, # "Lane Assist: Please Take Over Steering" with urgent beep
+ "emergencyAssistUrgent": 6, # "Emergency Assist: Please Take Over Steering" with urgent beep
+ "laneAssistTakeOverChime": 7, # "Lane Assist: Please Take Over Steering" with chime
+ "laneAssistTakeOver": 8, # "Lane Assist: Please Take Over Steering" silent
+ "emergencyAssistChangingLanes": 9, # "Emergency Assist: Changing lanes..." with urgent beep
+ "laneAssistDeactivated": 10, # "Lane Assist deactivated." silent with persistent icon afterward
+ }
+
+
+HOLD_MAX_FRAMES = 60
+HOLD_TORQUE_DEADBAND_NM = 20
+HOLD_ACCEL_KI = 0.00002
+
+
+class WMI(StrEnum):
+ VOLKSWAGEN_USA_SUV = "1V2"
+ VOLKSWAGEN_USA_CAR = "1VW"
+ VOLKSWAGEN_MEXICO_SUV = "3VV"
+ VOLKSWAGEN_MEXICO_CAR = "3VW"
+ VOLKSWAGEN_ARGENTINA = "8AW"
+ VOLKSWAGEN_BRASIL = "9BW"
+ SAIC_VOLKSWAGEN = "LSV"
+ SKODA = "TMB"
+ SEAT = "VSS"
+ AUDI_EUROPE_MPV = "WA1"
+ AUDI_GERMANY_CAR = "WAU"
+ MAN = "WMA"
+ PORSCHE_SUV = "WP1"
+ AUDI_SPORT = "WUA"
+ VOLKSWAGEN_COMMERCIAL = "WV1"
+ VOLKSWAGEN_COMMERCIAL_BUS_VAN = "WV2"
+ VOLKSWAGEN_EUROPE_SUV = "WVG"
+ VOLKSWAGEN_EUROPE_CAR = "WVW"
+ VOLKSWAGEN_GROUP_RUS = "XW8"
+
+
+class VolkswagenSafetyFlags(IntFlag):
+ LONG_CONTROL = 1
+ ALT_CRC_VARIANT_1 = 2
+ NO_GAS_OFFSET = 4
+ ALLOW_LONG_ACCEL_WITH_GAS_PRESSED = 8
+ DISABLE_RADAR = 16
+ PQ_ALC_MODULE = 32
+ PQ_LOWLINE = 64
+ PQ_NO_CAM_BUS = 128
+ PQ_ACC_FTS_EPB = 256
+ PQ_SNG_ECD = 512
+
+
+class VolkswagenFlags(IntFlag):
+ # Detected flags
+ STOCK_HCA_PRESENT = 1
+ KOMBI_PRESENT = 4
+
+ # Static flags
+ PQ = 2
+ MLB = 8
+ MEB = 256
+ MEB_GEN2 = 512
+ MQB_EVO = 1024
+
+ # Detected flags (MEB/MQBevo)
+ STOCK_KLR_PRESENT = 2048
+ STOCK_PSD_PRESENT = 4096
+ STOCK_PSD_06_PRESENT = 8192
+ STOCK_DIAGNOSE_01_PRESENT = 16384
+ ALT_GEAR = 32768
+ DISABLE_RADAR = 65536
+
+
+class VolkswagenFlagsIQ(IntFlag):
+ IQ_CC_ONLY = 1 << 5 # CC only mode with radar (has AEB)
+ IQ_CC_ONLY_NO_RADAR = 1 << 6 # CC only mode without radar
+ IQ_LVBS_ALC_MODULE = 1 << 7 # IQ.Lvbs VW ALC hardware module present / intended active path
+ IQ_PQ_LOWLINE = 1 << 17 # Non-ECAN lateral-only PQ: bus 0 dead, TX on bus 1 (ptCAN)
+ IQ_PQ_ACC_FTS_EPB = 1 << 18 # B7 TRW450: ACC FtS + EPB hold, Motor_1 resume spoof on bus 1
+ IQ_PQ_SNG_ECD = 1 << 19
+ IQ_PQ_TIMEBOMB = 1 << 20
+
+
+RADAR_DISABLE_STATE = {"error": False}
+
+
+@dataclass
+class VolkswagenMLBPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mlb'})
+ chassis_codes: set[str] = field(default_factory=set)
+ wmis: set[WMI] = field(default_factory=set)
+
+ def init(self):
+ self.flags |= VolkswagenFlags.MLB
+
+
+@dataclass
+class VolkswagenMQBPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mqb'})
+ # Volkswagen uses the VIN WMI and chassis code to match in the absence of the comma power
+ # on camera-integrated cars, as we lose too many ECUs to reliably identify the vehicle
+ chassis_codes: set[str] = field(default_factory=set)
+ wmis: set[WMI] = field(default_factory=set)
+ model_years: set[str] = field(default_factory=set)
+
+
+@dataclass
+class VolkswagenPQPlatformConfig(VolkswagenMQBPlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_pq'})
+
+ def init(self):
+ self.flags |= VolkswagenFlags.PQ
+
+
+@dataclass
+class VolkswagenMEBPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_meb', Bus.radar: 'vw_meb'})
+ chassis_codes: set[str] = field(default_factory=set)
+ wmis: set[WMI] = field(default_factory=set)
+ model_years: set[str] = field(default_factory=set)
+
+ def init(self):
+ self.flags |= VolkswagenFlags.MEB
+ if self.flags & VolkswagenFlags.MEB_GEN2:
+ self.dbc_dict = {Bus.pt: 'vw_meb_2024', Bus.radar: 'vw_meb_2024'}
+
+
+@dataclass
+class VolkswagenMQBevoPlatformConfig(PlatformConfig):
+ dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mqbevo', Bus.radar: 'vw_mqbevo'})
+ chassis_codes: set[str] = field(default_factory=set)
+ wmis: set[WMI] = field(default_factory=set)
+
+ def init(self):
+ self.flags |= VolkswagenFlags.MQB_EVO
+
+
+@dataclass(frozen=True, kw_only=True)
+class VolkswagenCarSpecs(CarSpecs):
+ centerToFrontRatio: float = 0.45
+ steerRatio: float = 18.4
+ minSteerSpeed: float = CarControllerParams.DEFAULT_MIN_STEER_SPEED
+
+# FIXME: nuke this
+class Footnote(Enum):
+ KAMIQ = CarFootnote(
+ "Not including the China market Kamiq, which is based on the (currently) unsupported PQ34 platform.",
+ Column.MODEL)
+ PASSAT = CarFootnote(
+ "Refers only to the MQB-based European B8 Passat, not the NMS Passat in the USA/China/Mideast markets.",
+ Column.MODEL)
+ SKODA_HEATED_WINDSHIELD = CarFootnote(
+ "Some Škoda vehicles are equipped with heated windshields, which are known " +
+ "to block GPS signal needed for some comma four functionality.",
+ Column.MODEL)
+ VW_EXP_LONG = CarFootnote(
+ "Only available for vehicles using a gateway (J533) harness. At this time, vehicles using a camera harness " +
+ "are limited to using stock ACC.",
+ Column.LONGITUDINAL, docs_only=True)
+ VW_MQB_A0 = CarFootnote(
+ "Model-years 2022 and beyond may have a combined CAN gateway and BCM, which is supported by openpilot " +
+ "in software, but doesn't yet have a harness available from the comma store.",
+ Column.HARDWARE)
+
+
+@dataclass
+class VWCarDocs(CarDocs):
+ package: str = "Adaptive Cruise Control (ACC) & Lane Assist"
+ car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.vw_j533]))
+
+ def init_make(self, CP: structs.CarParams):
+ self.footnotes.append(Footnote.VW_EXP_LONG)
+ if "SKODA" in CP.carFingerprint:
+ self.footnotes.append(Footnote.SKODA_HEATED_WINDSHIELD)
+
+ if abs(CP.minSteerSpeed - CarControllerParams.DEFAULT_MIN_STEER_SPEED) < 1e-3:
+ self.min_steer_speed = 0
+
+
+# Check the 7th and 8th characters of the VIN before adding a new CAR. If the
+# chassis code is already listed below, don't add a new CAR, just add to the
+# FW_VERSIONS for that existing CAR.
+
+class CAR(Platforms):
+ config: VolkswagenMQBPlatformConfig | VolkswagenPQPlatformConfig | VolkswagenMLBPlatformConfig | VolkswagenMEBPlatformConfig | VolkswagenMQBevoPlatformConfig
+
+ VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Arteon 2018-23", video="https://youtu.be/FAomFKPFlDA"),
+ VWCarDocs("Volkswagen Arteon R 2020-23", video="https://youtu.be/FAomFKPFlDA"),
+ VWCarDocs("Volkswagen Arteon eHybrid 2020-23", video="https://youtu.be/FAomFKPFlDA"),
+ VWCarDocs("Volkswagen Arteon Shooting Brake 2020-23", video="https://youtu.be/FAomFKPFlDA"),
+ VWCarDocs("Volkswagen CC 2018-22", video="https://youtu.be/FAomFKPFlDA"),
+ ],
+ VolkswagenCarSpecs(mass=1733, wheelbase=2.84),
+ chassis_codes={"AN", "3H"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
+ )
+ VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Atlas 2018-23"),
+ VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"),
+ VWCarDocs("Volkswagen Teramont 2018-22"),
+ VWCarDocs("Volkswagen Teramont Cross Sport 2021-22"),
+ VWCarDocs("Volkswagen Teramont X 2021-22"),
+ ],
+ VolkswagenCarSpecs(mass=2011, wheelbase=2.98),
+ chassis_codes={"CA"},
+ wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_SUV},
+ )
+ VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Caddy 2019"),
+ VWCarDocs("Volkswagen Caddy Maxi 2019"),
+ ],
+ VolkswagenCarSpecs(mass=1613, wheelbase=2.6),
+ chassis_codes={"2K"},
+ wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN},
+ )
+ VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Crafter 2017-24", video="https://youtu.be/4100gLeabmo"),
+ VWCarDocs("Volkswagen e-Crafter 2018-24", video="https://youtu.be/4100gLeabmo"),
+ VWCarDocs("Volkswagen Grand California 2019-24", video="https://youtu.be/4100gLeabmo"),
+ VWCarDocs("MAN TGE 2017-24", video="https://youtu.be/4100gLeabmo"),
+ VWCarDocs("MAN eTGE 2020-24", video="https://youtu.be/4100gLeabmo"),
+ ],
+ VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS),
+ chassis_codes={"SY", "SZ", "UY", "UZ"},
+ wmis={WMI.VOLKSWAGEN_COMMERCIAL, WMI.MAN},
+ )
+ VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen e-Golf 2014-20"),
+ VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False),
+ VWCarDocs("Volkswagen Golf Alltrack 2015-19", auto_resume=False),
+ VWCarDocs("Volkswagen Golf GTD 2015-20"),
+ VWCarDocs("Volkswagen Golf GTE 2015-20"),
+ VWCarDocs("Volkswagen Golf GTI 2015-21", auto_resume=False),
+ VWCarDocs("Volkswagen Golf R 2015-19"),
+ VWCarDocs("Volkswagen Golf SportsVan 2015-20"),
+ ],
+ VolkswagenCarSpecs(mass=1397, wheelbase=2.62, steerRatio=17.0),
+ chassis_codes={"5G", "AU", "BA", "BE"},
+ wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR},
+ )
+ VOLKSWAGEN_GOLF_MK8 = VolkswagenMQBevoPlatformConfig(
+ [VWCarDocs("Volkswagen Golf 2020-25")],
+ VolkswagenCarSpecs(mass=1397, wheelbase=2.62),
+ chassis_codes={"CD"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
+ )
+ VOLKSWAGEN_ID3_MK1 = VolkswagenMEBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen ID.3 2020-23"),
+ VWCarDocs("Volkswagen MEB Gen 1 2020-23"),
+ ],
+ VolkswagenCarSpecs(mass=1935, wheelbase=2.77),
+ chassis_codes={"E1"},
+ wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR},
+ model_years={"L", "M", "N", "P"},
+ )
+ VOLKSWAGEN_ID3_MK2 = VolkswagenMEBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen ID.3 2024-25"),
+ VWCarDocs("Volkswagen MEB Gen 2 2024-25"),
+ ],
+ VolkswagenCarSpecs(mass=1935, wheelbase=2.77),
+ chassis_codes={"E1"},
+ wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR},
+ model_years={"R", "S"},
+ flags=VolkswagenFlags.MEB_GEN2,
+ )
+ VOLKSWAGEN_ID4_MK1 = VolkswagenMEBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen ID.4 2021-23"),
+ VWCarDocs("Volkswagen ID.5 2022-23"),
+ ],
+ VolkswagenCarSpecs(mass=2224, wheelbase=2.77),
+ chassis_codes={"E2"},
+ wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR, WMI.VOLKSWAGEN_EUROPE_SUV},
+ )
+ VOLKSWAGEN_ID4_MK2 = VolkswagenMEBPlatformConfig(
+ [VWCarDocs("Volkswagen ID.4 2024-25")],
+ VolkswagenCarSpecs(mass=2224, wheelbase=2.77),
+ chassis_codes={"E8"},
+ wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR, WMI.VOLKSWAGEN_EUROPE_SUV},
+ flags=VolkswagenFlags.MEB_GEN2,
+ )
+ VOLKSWAGEN_JETTA_MK6 = VolkswagenPQPlatformConfig(
+ [VWCarDocs("Volkswagen Jetta 2015-18")],
+ VolkswagenCarSpecs(mass=1518, wheelbase=2.65),
+ chassis_codes={"5K", "AJ"},
+ wmis={WMI.VOLKSWAGEN_MEXICO_CAR},
+ )
+ VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Jetta 2019-23"),
+ VWCarDocs("Volkswagen Jetta GLI 2021-23"),
+ ],
+ VolkswagenCarSpecs(mass=1328, wheelbase=2.71),
+ chassis_codes={"BU"},
+ wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR},
+ )
+ VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]),
+ VWCarDocs("Volkswagen Passat Alltrack 2015-22"),
+ VWCarDocs("Volkswagen Passat GTE 2015-22"),
+ ],
+ VolkswagenCarSpecs(mass=1551, wheelbase=2.79),
+ chassis_codes={"3C", "3G"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
+ model_years={"F", "G", "H", "J", "K", "L", "M", "N"}, # 2015-2022
+ )
+ VOLKSWAGEN_PASSAT_MK7 = VolkswagenPQPlatformConfig(
+ [VWCarDocs("Volkswagen Passat 2.0 TDI 2014")],
+ VolkswagenCarSpecs(mass=1836, wheelbase=2.70, steerRatio=13.0, minSteerSpeed=31 * CV.KPH_TO_MS),
+ chassis_codes={"3C"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
+ model_years={"E"}, # 2014
+ )
+ VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig(
+ [VWCarDocs("Volkswagen Passat NMS 2015-17")],
+ VolkswagenCarSpecs(mass=1503, wheelbase=2.80),
+ chassis_codes={"A3"},
+ wmis={WMI.VOLKSWAGEN_USA_CAR},
+ # NMS and NMS+ share chassis code A3; disambiguate by model year
+ model_years={"F", "G", "H"}, # 2015-2017
+ )
+ VOLKSWAGEN_PASSAT_NMS_PLUS = VolkswagenPQPlatformConfig(
+ [VWCarDocs("Volkswagen Passat NMS 2018-22")],
+ VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minEnableSpeed=20 * CV.KPH_TO_MS),
+ chassis_codes={"A3"},
+ wmis={WMI.VOLKSWAGEN_USA_CAR},
+ model_years={"J", "K", "L", "M", "N"}, # 2018-2022
+ )
+ VOLKSWAGEN_PASSAT_B7 = VolkswagenPQPlatformConfig(
+ [VWCarDocs("Volkswagen Passat B7 2008-2011")],
+ VolkswagenCarSpecs(mass=1503, wheelbase=2.712, steerRatio=16.4, minSteerSpeed=0),
+ chassis_codes={"A3"},
+ wmis={WMI.VOLKSWAGEN_USA_CAR},
+ )
+ VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]),
+ VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]),
+ ],
+ VolkswagenCarSpecs(mass=1230, wheelbase=2.55),
+ chassis_codes={"AW"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
+ )
+ VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Sharan 2018-22"),
+ ],
+ VolkswagenCarSpecs(mass=1639, wheelbase=2.92),
+ chassis_codes={"7N"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
+ )
+ SEAT_ALHAMBRA_MK1 = VolkswagenPQPlatformConfig(
+ [
+ VWCarDocs("SEAT Alhambra 2018-20"),
+ ],
+ VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50 * CV.KPH_TO_MS),
+ chassis_codes={"7N"},
+ wmis={WMI.SEAT},
+ )
+ VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Volkswagen Taos 2022-24")],
+ VolkswagenCarSpecs(mass=1498, wheelbase=2.69),
+ chassis_codes={"B2"},
+ wmis={WMI.VOLKSWAGEN_MEXICO_SUV, WMI.VOLKSWAGEN_ARGENTINA},
+ )
+ VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])],
+ VolkswagenCarSpecs(mass=1150, wheelbase=2.60),
+ chassis_codes={"C1"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_SUV},
+ )
+ VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Tiguan 2018-24"),
+ VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"),
+ ],
+ VolkswagenCarSpecs(mass=1715, wheelbase=2.74),
+ chassis_codes={"5N", "AD", "AX", "BW"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_SUV, WMI.VOLKSWAGEN_MEXICO_SUV},
+ )
+ VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Volkswagen Touran 2016-23")],
+ VolkswagenCarSpecs(mass=1516, wheelbase=2.79),
+ chassis_codes={"1T"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_SUV},
+ )
+ VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Volkswagen Caravelle 2020"),
+ VWCarDocs("Volkswagen California 2021-23"),
+ ],
+ VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0),
+ chassis_codes={"7H", "7L"},
+ wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN},
+ )
+ VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Volkswagen T-Roc 2018-23")],
+ VolkswagenCarSpecs(mass=1413, wheelbase=2.63),
+ chassis_codes={"A1"},
+ wmis={WMI.VOLKSWAGEN_EUROPE_SUV},
+ )
+ AUDI_A3_MK3 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Audi A3 2014-19"),
+ VWCarDocs("Audi A3 Sportback e-tron 2017-18"),
+ VWCarDocs("Audi RS3 2018"),
+ VWCarDocs("Audi S3 2015-17"),
+ ],
+ VolkswagenCarSpecs(mass=1335, wheelbase=2.61),
+ chassis_codes={"8V", "FF"},
+ wmis={WMI.AUDI_GERMANY_CAR, WMI.AUDI_SPORT},
+ )
+ AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Audi Q2 2018")],
+ VolkswagenCarSpecs(mass=1205, wheelbase=2.61),
+ chassis_codes={"GA"},
+ wmis={WMI.AUDI_GERMANY_CAR},
+ )
+ AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Audi Q3 2019-24")],
+ VolkswagenCarSpecs(mass=1623, wheelbase=2.68),
+ chassis_codes={"8U", "F3", "FS"},
+ wmis={WMI.AUDI_EUROPE_MPV, WMI.AUDI_GERMANY_CAR},
+ )
+ AUDI_Q4_MK1 = VolkswagenMEBPlatformConfig(
+ [VWCarDocs("Audi Q4 2021-23")],
+ VolkswagenCarSpecs(mass=1965, wheelbase=2.764),
+ chassis_codes={"FZ"},
+ wmis={WMI.AUDI_EUROPE_MPV},
+ model_years={"M", "N", "P"},
+ )
+ AUDI_Q4_MK2 = VolkswagenMEBPlatformConfig(
+ [VWCarDocs("Audi Q4 2024-25")],
+ VolkswagenCarSpecs(mass=1965, wheelbase=2.764),
+ chassis_codes={"FZ"},
+ wmis={WMI.AUDI_EUROPE_MPV},
+ model_years={"R", "S"},
+ flags=VolkswagenFlags.MEB_GEN2,
+ )
+ AUDI_Q5_MK1 = VolkswagenMLBPlatformConfig(
+ [VWCarDocs("Audi Q5 2013-17")],
+ VolkswagenCarSpecs(mass=1895, wheelbase=2.81),
+ chassis_codes={"8R"},
+ wmis={WMI.AUDI_EUROPE_MPV, WMI.AUDI_GERMANY_CAR},
+ )
+ PORSCHE_MACAN_MK1 = VolkswagenMLBPlatformConfig(
+ [VWCarDocs("Porsche Macan 2017-24")],
+ VolkswagenCarSpecs(mass=1895, wheelbase=2.81, steerRatio=16.2),
+ chassis_codes={"95", "A5"},
+ wmis={WMI.PORSCHE_SUV},
+ )
+ SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("CUPRA Ateca 2018-23"),
+ VWCarDocs("SEAT Ateca 2016-23"),
+ VWCarDocs("SEAT Leon 2014-20"),
+ ],
+ VolkswagenCarSpecs(mass=1300, wheelbase=2.64),
+ chassis_codes={"5F"},
+ wmis={WMI.SEAT},
+ )
+ SEAT_LEON_MK4 = VolkswagenMQBevoPlatformConfig(
+ [VWCarDocs("SEAT Leon 2020-25")],
+ VolkswagenCarSpecs(mass=1300, wheelbase=2.685),
+ chassis_codes={"KL"},
+ wmis={WMI.SEAT},
+ )
+ CUPRA_BORN_MK1 = VolkswagenMEBPlatformConfig(
+ [VWCarDocs("CUPRA Born 2022-23")],
+ VolkswagenCarSpecs(mass=1950, wheelbase=2.766, steerRatio=15.9),
+ chassis_codes={"K1"},
+ model_years={"N", "P"},
+ wmis={WMI.SEAT},
+ )
+ SKODA_ENYAQ_MK1 = VolkswagenMEBPlatformConfig(
+ [VWCarDocs("Škoda Enyaq 2021-23")],
+ VolkswagenCarSpecs(mass=1965, wheelbase=2.77),
+ chassis_codes={"NY"},
+ model_years={"M", "N", "P"},
+ wmis={WMI.SKODA},
+ )
+ SKODA_ENYAQ_MK2 = VolkswagenMEBPlatformConfig(
+ [VWCarDocs("Škoda Enyaq 2024-25")],
+ VolkswagenCarSpecs(mass=1965, wheelbase=2.77),
+ chassis_codes={"NY"},
+ model_years={"R", "S"},
+ wmis={WMI.SKODA},
+ flags=VolkswagenFlags.MEB_GEN2,
+ )
+ SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])],
+ VolkswagenCarSpecs(mass=1266, wheelbase=2.56),
+ chassis_codes={"PJ"},
+ wmis={WMI.SKODA},
+ )
+ SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]),
+ VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]),
+ ],
+ VolkswagenCarSpecs(mass=1230, wheelbase=2.66),
+ chassis_codes={"NW"},
+ wmis={WMI.SKODA},
+ )
+ SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Škoda Karoq 2019-23")],
+ VolkswagenCarSpecs(mass=1278, wheelbase=2.66),
+ chassis_codes={"NU"},
+ wmis={WMI.SKODA},
+ )
+ SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Škoda Kodiaq 2017-23")],
+ VolkswagenCarSpecs(mass=1569, wheelbase=2.79),
+ chassis_codes={"NS"},
+ wmis={WMI.SKODA, WMI.VOLKSWAGEN_GROUP_RUS},
+ )
+ SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig(
+ [
+ VWCarDocs("Škoda Octavia 2015-19"),
+ VWCarDocs("Škoda Octavia RS 2016"),
+ VWCarDocs("Škoda Octavia Scout 2017-19"),
+ ],
+ VolkswagenCarSpecs(mass=1388, wheelbase=2.68),
+ chassis_codes={"NE"},
+ wmis={WMI.SKODA},
+ )
+ SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig(
+ [VWCarDocs("Škoda Superb 2015-22")],
+ VolkswagenCarSpecs(mass=1505, wheelbase=2.84),
+ chassis_codes={"3V", "NP"},
+ wmis={WMI.SKODA},
+ )
+
+
+def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]:
+ candidates = set()
+
+ # Compile all FW versions for each ECU
+ all_ecu_versions: dict[EcuAddrSubAddr, set[str]] = defaultdict(set)
+ for ecus in offline_fw_versions.values():
+ for ecu, versions in ecus.items():
+ 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)
+ vin_wmi = vin_obj.wmi if len(vin_obj.wmi) == 3 else None
+ chassis_code = vin_obj.vds[3:5] if len(vin_obj.vds) >= 5 else None
+ model_year_code = vin_obj.vis[0] if len(vin_obj.vis) > 0 else None
+ vin_available = vin_wmi is not None and chassis_code is not None
+
+ fallback_ecus = CHECK_FUZZY_ECUS | {Ecu.fwdCamera, Ecu.adas, Ecu.cornerRadar, Ecu.parkingAdas}
+ fallback_optional_ecus = fallback_ecus - CHECK_FUZZY_ECUS
+
+ for platform in CAR:
+ if not vin_available:
+ matched_ecus = set()
+ optional_ecu_seen = False
+ for ecu, versions in offline_fw_versions[platform].items():
+ if ecu[0] not in fallback_ecus:
+ continue
+
+ found_versions = live_fw_versions.get(ecu[1:], [])
+ if len(found_versions) == 0:
+ continue
+
+ if ecu[0] in fallback_optional_ecus:
+ optional_ecu_seen = True
+
+ if any(found_version in versions for found_version in found_versions):
+ matched_ecus.add(ecu[0])
+ else:
+ matched_ecus = set()
+ break
+
+ if Ecu.fwdRadar in matched_ecus and (len(matched_ecus) >= 2 or not optional_ecu_seen):
+ candidates.add(platform)
+ continue
+
+ valid_ecus = set()
+ for ecu in offline_fw_versions[platform]:
+ addr = ecu[1:]
+ if ecu[0] not in CHECK_FUZZY_ECUS:
+ continue
+
+ # Sanity check that live FW is in the superset of all FW, Volkswagen ECU part numbers are commonly shared
+ found_versions = live_fw_versions.get(addr, [])
+ expected_versions = all_ecu_versions[ecu]
+ if not any(found_version in expected_versions for found_version in found_versions):
+ break
+
+ valid_ecus.add(ecu[0])
+
+ if valid_ecus != CHECK_FUZZY_ECUS:
+ continue
+
+ model_years = getattr(platform.config, "model_years", set())
+ if vin_wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes:
+ if len(model_years) > 0 and model_year_code is not None and model_year_code not in model_years:
+ continue
+ candidates.add(platform)
+
+ return {str(c) for c in candidates}
+
+
+# These ECUs are required to match to gain a VIN match
+CHECK_FUZZY_ECUS = {Ecu.fwdRadar}
+
+# All supported cars should return FW from the engine, srs, eps, and fwdRadar. Cars
+# with a manual trans won't return transmission firmware, but all other cars will.
+#
+# The 0xF187 SW part number query should return in the form of N[NX][NX] NNN NNN [X[X]],
+# where N=number, X=letter, and the trailing two letters are optional. Performance
+# tuners sometimes tamper with that field (e.g. 8V0 9C0 BB0 1 from COBB/EQT). Tampered
+# ECU SW part numbers are invalid for vehicle ID and compatibility checks. Try to have
+# them repaired by the tuner before including them in openpilot.
+
+VOLKSWAGEN_VERSION_REQUEST_MULTI = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_SPARE_PART_NUMBER) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_VERSION_NUMBER) + \
+ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION)
+VOLKSWAGEN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40])
+
+VOLKSWAGEN_RX_OFFSET = 0x6a
+VOLKSWAGEN_RX_OFFSET_CANFD = 0x20000
+
+FW_QUERY_CONFIG = FwQueryConfig(
+ requests=[request for bus, obd_multiplexing in [(1, True), (1, False), (0, False)] for request in [
+ Request(
+ [VOLKSWAGEN_VERSION_REQUEST_MULTI],
+ [VOLKSWAGEN_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.parkingAdas, Ecu.cornerRadar, Ecu.adas],
+ rx_offset=VOLKSWAGEN_RX_OFFSET,
+ bus=bus,
+ obd_multiplexing=obd_multiplexing,
+ ),
+ Request(
+ [VOLKSWAGEN_VERSION_REQUEST_MULTI],
+ [VOLKSWAGEN_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.engine, Ecu.transmission],
+ bus=bus,
+ obd_multiplexing=obd_multiplexing,
+ ),
+ Request(
+ [VOLKSWAGEN_VERSION_REQUEST_MULTI],
+ [VOLKSWAGEN_VERSION_RESPONSE],
+ whitelist_ecus=[Ecu.engine, Ecu.inverter],
+ rx_offset=VOLKSWAGEN_RX_OFFSET_CANFD,
+ bus=bus,
+ obd_multiplexing=obd_multiplexing,
+ ),
+ ]],
+ non_essential_ecus={Ecu.eps: list(CAR)},
+ extra_ecus=[(Ecu.fwdCamera, 0x74f, None),
+ (Ecu.parkingAdas, 0x70a, None),
+ (Ecu.cornerRadar, 0x74e, None),
+ (Ecu.adas, 0x769, None)],
+ match_fw_to_car_fuzzy=match_fw_to_car_fuzzy,
+)
+
+MQB_A0_CARS = {
+ CAR.VOLKSWAGEN_POLO_MK6,
+ CAR.VOLKSWAGEN_TCROSS_MK1,
+ CAR.SKODA_FABIA_MK4,
+ CAR.SKODA_KAMIQ_MK1,
+}
+
+
+def get_longitudinal_stopping_speed_override(candidate: CAR, flags: int) -> float:
+ if candidate == CAR.VOLKSWAGEN_PASSAT_B7:
+ return PASSAT_B7_STOPPING_SPEED
+ if flags & VolkswagenFlags.PQ:
+ return PQ_STOPPING_SPEED
+ return 0.0
+
+
+def apply_pq_stopping_accel(candidate: CAR, accel: float, stopping: bool) -> float:
+ return PASSAT_B7_STOP_ACCEL if candidate == CAR.VOLKSWAGEN_PASSAT_B7 and stopping else accel
+
+
+DBC = CAR.create_dbc_map()
diff --git a/iqdbc_repo/iqdbc/car/xcp.py b/iqdbc_repo/iqdbc/car/xcp.py
new file mode 100644
index 000000000..046df7403
--- /dev/null
+++ b/iqdbc_repo/iqdbc/car/xcp.py
@@ -0,0 +1,266 @@
+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/iqdbc_repo/iqdbc/dbc/ESR.dbc b/iqdbc_repo/iqdbc/dbc/ESR.dbc
new file mode 100644
index 000000000..8544a0c80
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/ESR.dbc
@@ -0,0 +1,1080 @@
+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_: Gateway ESR
+VAL_TABLE_ ForwardReverse 1 "Reverse" 0 "Forward" ;
+VAL_TABLE_ LeftRight 1 "Right Clockwise" 0 "Left CounterClockwise" ;
+VAL_TABLE_ ValidInvalid 1 "Valid" 0 "Invalid" ;
+VAL_TABLE_ TrueFalse 1 "True" 0 "False" ;
+
+
+BO_ 1343 Target64: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1342 Target63: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1341 Target62: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1340 Target61: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1339 Target60: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1338 Target59: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1337 Target58: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1336 Target57: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1335 Target56: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1334 Target55: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1333 Target54: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1332 Target53: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1331 Target52: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1330 Target51: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1329 Target50: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1328 Target49: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1327 Target48: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1326 Target47: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1325 Target46: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1324 Target45: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1323 Target44: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1322 Target43: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1321 Target42: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1320 Target41: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1319 Target40: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1318 Target39: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1317 Target38: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1316 Target37: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1315 Target36: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1314 Target35: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1313 Target34: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1312 Target33: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1311 Target32: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1310 Target31: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1309 Target30: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1308 Target29: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1307 Target28: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1306 Target27: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1305 Target26: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1304 Target25: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1303 Target24: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1302 Target23: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1301 Target22: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1300 Target21: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1299 Target20: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1298 Target19: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1297 Target18: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1296 Target17: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1295 Target16: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1294 Target15: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1293 Target14: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1292 Target13: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1291 Target12: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1290 Target11: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1289 Target10: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1288 Target9: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1287 Target8: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1285 Target6: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1286 Target7: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1284 Target5: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1283 Target4: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1282 Target3: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1281 Target2: 8 Vector__XXX
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1524 VehicleData3: 8 Gateway
+ SG_ CAN_RX_YAW_RATE_BIAS_SHIFT : 15|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_WHEELBASE : 55|8@0+ (2,200) [200|710] "cm" Vector__XXX
+ SG_ CAN_RX_STEERING_GEAR_RATIO : 63|8@0+ (0.125,0) [0|31.875] "" Vector__XXX
+ SG_ CAN_RX_OVERSTEER_UNDERSTEER : 7|8@0- (1,0) [-128|127] "%" Vector__XXX
+ SG_ CAN_RX_FUNNEL_OFFSET_RIGHT : 31|8@0- (0.1,0) [-12.8|12.7] "m" Vector__XXX
+ SG_ CAN_RX_FUNNEL_OFFSET_LEFT : 23|8@0- (0.1,0) [-12.8|12.7] "m" Vector__XXX
+ SG_ CAN_RX_DISTANCE_REAR_AXLE : 47|8@0+ (2,200) [200|710] "cm" Vector__XXX
+ SG_ CAN_RX_CW_BLOCKAGE_TRESHOLD : 39|8@0+ (0.0078125,0) [0|1.9921875] "" Vector__XXX
+ SG_ CAN_RX_BEAMWIDTH_VERT : 14|7@0+ (0.0625,0) [0|7.9375] "deg" Vector__XXX
+
+BO_ 1523 FactoryAlignment: 8 Gateway
+
+BO_ 1522 Vehicle_Data2: 8 Gateway
+ SG_ CAN_RX_WHEEL_SLIP : 41|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_RX_SERV_ALIGN_UPDATES_NEED : 55|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_RX_SERV_ALIGN_TYPE : 47|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_RADAR_HEIGHT : 38|7@0+ (1,0) [0|127] "cm" Vector__XXX
+ SG_ CAN_RX_RADAR_FOV_MR : 30|7@0+ (1,0) [0|127] "deg" Vector__XXX
+ SG_ CAN_RX_RADAR_FOV_LR : 19|5@0+ (1,0) [0|31] "deg" Vector__XXX
+ SG_ CAN_RX_LONG_ACCEL_VALIDITY : 7|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_LONG_ACCEL : 12|9@0- (0.03125,0) [-8|7.96875] "m/s^2" Vector__XXX
+ SG_ CAN_RX_LAT_ACCEL_VALIDITY : 6|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_LAT_ACCEL : 5|9@0- (0.03125,0) [-8|7.96875] "m/s^2" Vector__XXX
+ SG_ CAN_RX_AUTO_ALIGN_DISABLE : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_AUTO_ALIGN_CONVERGED : 42|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_ANGLE_MOUNTING_OFFSET : 63|8@0- (0.0625,0) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_RX_AALIGN_AVG_CTR_TOTAL : 45|3@0+ (250,250) [250|2000] "" Vector__XXX
+
+BO_ 1512 CIPV_Targets_Etc: 8 ESR
+
+BO_ 1511 ESR_History_Fault: 8 ESR
+
+BO_ 1510 ESR_Active_Fault: 8 ESR
+
+BO_ 1508 AD_Data: 8 ESR
+
+BO_ 1489 SensorValidation2: 8 ESR
+ SG_ CAN_TX_VALID_MR_SN : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_VALID_MR_RANGE_RATE : 31|16@0- (0.0078125,0) [-256|255.9921875] "m/s" Vector__XXX
+ SG_ CAN_TX_VALID_MR_RANGE : 15|16@0+ (0.0078125,0) [0|511.9921875] "m" Vector__XXX
+ SG_ CAN_TX_VALID_MR_POWER : 63|8@0- (1,0) [-128|127] "db" Vector__XXX
+ SG_ CAN_TX_VALID_MR_ANGLE : 40|16@1- (0.0625,0) [-2048|2047.9375] "deg" Vector__XXX
+
+BO_ 1488 SensorValidation: 8 ESR
+ SG_ CAN_TX_VALID_LR_SN : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_VALID_LR_RANGE_RATE : 31|16@0- (0.0078125,0) [-256|255.9921875] "m/s" Vector__XXX
+ SG_ CAN_TX_VALID_LR_RANGE : 15|16@0+ (0.0078125,0) [0|511.9921875] "m" Vector__XXX
+ SG_ CAN_TX_VALID_LR_POWER : 63|8@0- (1,0) [-128|127] "db" Vector__XXX
+ SG_ CAN_TX_VALID_LR_ANGLE : 47|16@0- (0.0625,0) [-2048|2047.9375] "deg" Vector__XXX
+
+BO_ 1344 Track_Sensor: 1 ESR
+ SG_ CAN_TX_TRACK_ROLLING_COUNT_2 : 4|1@0+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1280 Target1: 8 ESR
+ SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX
+ SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX
+ SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX
+ SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX
+ SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX
+
+BO_ 1265 SensorInput: 8 Gateway
+ SG_ CAN_RX_USE_ANGLE_MISALIGNMENT : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_RX_SCAN_INDEX_ACK : 7|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_RX_LATERAL_MOUNTING_OFFSET : 47|8@0- (0.01563,0) [-2.00064|1.98501] "m" Vector__XXX
+ SG_ CAN_RX_WIPER_STATUS : 57|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_VOLVO_SHORT_TRACK_ROC : 31|4@0- (500,0) [-4000|3500] "m" Vector__XXX
+ SG_ CAN_RX_VEHICLE_SPEED_VALIDITY : 61|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_TURN_SIGNAL_STATUS : 63|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_RX_RAW_DATA_ENABLE : 56|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_RADAR_CMD_RADIATE : 55|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_MR_ONLY_TRANSMIT : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_RX_MMR_UPSIDE_DOWN : 60|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_MAXIMUM_TRACKS : 53|6@0+ (1,0) [0|63] "" Vector__XXX
+ SG_ CAN_RX_LR_ONLY_TRANSMIT : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_RX_HIGH_YAW_ANGLE : 21|6@0- (1,0) [-32|31] "deg" Vector__XXX
+ SG_ CAN_RX_GROUPING_MODE : 59|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_RX_CLEAR_FAULTS : 22|1@0- (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_RX_BLOCKAGE_DISABLE : 54|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_ANGLE_MISALIGNMENT : 39|8@0- (0.0625,0) [-8|7.9375] "deg" Vector__XXX
+
+BO_ 1264 Vehicle_Data: 8 Gateway
+ SG_ CAN_RX_YAW_RATE_VALIDITY : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_RX_YAW_RATE : 11|12@0- (0.0625,0) [-128|127.9375] "deg/s" Vector__XXX
+ SG_ CAN_RX_VEHICLE_SPEED_DIRECTION : 12|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_VEHICLE_SPEED : 7|11@0+ (0.0625,0) [0|127.9375] "m/s" Vector__XXX
+ SG_ CAN_RX_RADIUS_CURVATURE : 29|14@0- (1,0) [-8192|8191] "m" Vector__XXX
+ SG_ CAN_RX_STEERING_VALIDITY : 47|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_STEERING_ANGLE_SIGN : 46|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_STEERING_ANGLE_RATE_SIGN : 30|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_RX_STEERING_ANGLE_RATE : 50|11@0+ (1,0) [0|2047] "deg/s" Vector__XXX
+ SG_ CAN_RX_STEERING_ANGLE : 45|11@0+ (1,0) [0|2047] "deg" Vector__XXX
+
+BO_ 1251 ESR_Output_InPath: 8 ESR
+ SG_ CAN_TX_PATH_ID_ACC_MOVE : 15|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_TRUCK_TARGET_DET : 7|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_SIDELOBE_BLOCKATE : 5|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_ROLLING_COUNT_3 : 1|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_PATH_ID_FCW_STAT : 47|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_PATH_ID_FCW_MOVE : 39|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_PATH_ID_CMBB_STAT : 31|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_PATH_ID_CMBB_MOVE : 23|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_PATH_ID_ACC_STAT : 63|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_PARTIAL_BLOCKAGE : 4|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_LR_ONLY_GRATING_LOBE_DET : 6|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_LMR_LR_MODE : 3|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_AUTO_ALIGN_ANGLE : 55|8@0- (0.0625,0) [-8|7.9375] "" Vector__XXX
+
+BO_ 1250 ESR_SW: 8 ESR
+ SG_ CAN_TX_SW_VERSION_PLD : 63|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_TX_SW_VERSION_HOST : 15|24@0+ (1,0) [0|16777215] "" Vector__XXX
+ SG_ CAN_TX_SERIAL_NUM : 39|24@0+ (1,0) [0|16777215] "" Vector__XXX
+ SG_ CAN_TX_INTERFACE_VERSION : 7|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_TX_HW_VERSION : 3|4@0+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 1249 ESR_Status2: 8 ESR
+ SG_ CAN_TX_YAW_RATE_BIAS : 47|8@0- (0.125,0) [-16|15.875] "" Vector__XXX
+ SG_ CAN_TX_XCVR_OPERATIONAL : 12|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_VEH_SPD_COMP_FACTOR : 39|6@0- (0.00195,1) [0.9376|1.06045] "" Vector__XXX
+ SG_ CAN_TX_TEMPERATURE : 31|8@0- (1,0) [-128|127] "degC" Vector__XXX
+ SG_ CAN_TX_SW_VERSION_DSP : 55|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_TX_STEERING_ANGLE_ACK : 10|11@0+ (1,0) [0|2047] "deg" Vector__XXX
+ SG_ CAN_TX_ROLLING_COUNT_2 : 1|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ CAN_TX_RAW_DATA_MODE : 11|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_RANGE_PERF_ERROR : 14|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_OVERHEAT_ERROR : 15|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_MAXIMUM_TRACKS_ACK : 7|6@0+ (1,1) [1|64] "" Vector__XXX
+ SG_ CAN_TX_INTERNAL_ERROR : 13|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_TX_GROUPING_MODE : 33|2@0+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 1248 ESR_Status: 8 ESR
+ SG_ CAN_TX_COMM_ERROR : 14|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_TX_RADIUS_CURVATURE_CALC : 13|14@0- (1,0) [-8192|8191] "" Vector__XXX
+ SG_ CAN_TX_YAW_RATE_CALC : 47|12@0- (0.0625,0) [-128|127.9375] "deg/s" Vector__XXX
+ SG_ CAN_TX_VEHICLE_SPEED_CALC : 50|11@0+ (0.0625,0) [0|127.9375] "m/s" Vector__XXX
+ SG_ CAN_TX_DSP_TIMESTAMP : 5|7@0+ (2,0) [0|254] "ms" Vector__XXX
+ SG_ CAN_TX_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_TX_ROLLING_COUNT_1 : 6|2@1+ (1,0) [0|3] "" Vector__XXX
+
+
+
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "BusType" "CAN";
+VAL_ 1264 CAN_RX_YAW_RATE_VALIDITY 1 "Valid" 0 "Invalid" ;
+VAL_ 1264 CAN_RX_VEHICLE_SPEED_DIRECTION 1 "Reverse" 0 "Forward" ;
+VAL_ 1264 CAN_RX_STEERING_VALIDITY 1 "True" 0 "False" ;
+VAL_ 1264 CAN_RX_STEERING_ANGLE_SIGN 1 "Right Clockwise" 0 "Left CounterClockwise" ;
+VAL_ 1264 CAN_RX_STEERING_ANGLE_RATE_SIGN 1 "Right Clockwise" 0 "Left CounterClockwise" ;
+
diff --git a/iqdbc_repo/iqdbc/dbc/FORD_CADS.dbc b/iqdbc_repo/iqdbc/dbc/FORD_CADS.dbc
new file mode 100644
index 000000000..569739c9c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/FORD_CADS.dbc
@@ -0,0 +1,3544 @@
+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_: MRR
+BO_ 1073741824 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX
+ SG_ New_Signal_943 : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_SENSOR_VANGLE_OFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_SENSOR_FOV_VER : 0|8@0+ (1,0) [0|255] "deg" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE_QF : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE_REF : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_MMIC_Temp4 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_MMIC_Temp3 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_MMIC_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_Processor_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_CHECKSUM : 0|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_COUNTER : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_VEHICLE_MODE : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_USC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_USC_CAL_VER_MINOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_SMC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_HW_VERSION : 0|32@0+ (1,0) [0|4.29497e+09] "" Vector__XXX
+ SG_ CAN_FAC_TGT_MTG_SPACE_VER : 0|8@0+ (1,-128) [-128|127] "cm" Vector__XXX
+ SG_ CAN_ANGLE_MISALIGNMENT_VER : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_ANGLE_MOUNTING_VOFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_LATCH_FAULTS : 0|64@0+ (1,0) [0|100] "" Vector__XXX
+ SG_ CAN_ACTIVE_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX
+ SG_ CAN_HISTORY_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX
+ SG_ CAN_SERV_ALIGN_ENABLE : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_LONG_MOUNTING_OFFSET : 0|8@0+ (0.015625,-2) [-2|1.98438] "" Vector__XXX
+ SG_ CAN_BEAMWIDTH_VERT : 0|7@0+ (0.125,0) [0|15.875] "deg" Vector__XXX
+ SG_ CAN_VEHICLE_SPEED_CALC_QF : 0|2@0+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 34 Active_Fault_Latched_2: 8 MRR
+ SG_ IPMA_PCAN_DataRangeCheck : 4|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ IPMA_PCAN_MissingMsg : 3|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ VINSignalCompareFailure : 2|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ModuleNotConfiguredError : 1|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ CarCfgNotConfiguredError : 0|1@1+ (1,0) [0|1] "" External_Tool
+
+BO_ 33 Active_Fault_Latched_1: 8 MRR
+ SG_ Active_Flt_Latched_byte7_bit7 : 63|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit6 : 62|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit5 : 61|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit4 : 60|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ARMtoDSPChksumFault : 59|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ DSPtoArmChksumFault : 58|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ HostToArmChksumFault : 57|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ARMtoHostChksumFault : 56|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ LoopBWOutOfRange : 55|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ DSPOverrunFault : 54|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte6_bit5 : 53|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TuningSensitivityFault : 52|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ SaturatedTuningFreqFault : 51|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ LocalOscPowerFault : 50|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterPowerFault : 49|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte6_bit0 : 48|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit7 : 47|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit6 : 46|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ XCVRDeviceSPIFault : 45|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ FreqSynthesizerSPIFault : 44|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ AnalogConverterDevicSPIFault : 43|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ SidelobeBlockage : 42|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit1 : 41|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ MNRBlocked : 40|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ECUTempHighFault : 39|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterTempHighFault : 38|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ AlignmentRoutineFailedFault : 37|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ UnreasonableRadarData : 36|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ MicroprocessorTempHighFault : 35|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ VerticalAlignmentOutOfRange : 34|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ HorizontalAlignmentOutOfRange : 33|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ FactoryAlignmentMode : 32|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ BatteryLowFault : 31|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ BatteryHighFault : 30|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_1p25SupplyOutOfRange : 29|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte3_bit4 : 28|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ThermistorOutOfRange : 27|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_3p3DACSupplyOutOfRange : 26|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_3p3RAWSupplyOutOfRange : 25|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_5_SupplyOutOfRange : 24|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterIDFault : 23|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit6 : 22|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit5 : 21|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit4 : 20|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit3 : 19|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit2 : 18|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PCANMissingMsgFault : 17|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PCANBusOff : 16|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit7 : 15|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit6 : 14|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ InstructionSetCheckFault : 13|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ StackOverflowFault : 12|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ WatchdogFault : 11|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PLLLockFault : 10|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit1 : 9|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ RAMMemoryTestFault : 8|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ USCValidationFault : 7|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit6 : 6|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit5 : 5|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit4 : 4|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit3 : 3|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ KeepAliveChecksumFault : 2|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ProgramCalibrationFlashChecksum : 1|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ApplicationFlashChecksumFault : 0|1@1+ (1,0) [0|1] "" External_Tool
+
+BO_ 500 XCP_MRR_DAQ_RESP: 8 MRR
+ SG_ MRR_xcp_daq_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 499 XCP_MRR_DTO_RESP: 8 MRR
+ SG_ MRR_xcp_dto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 497 XCP_MRR_CTO_RESP: 8 MRR
+ SG_ MRR_xcp_cto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 1900 Ford_Diag_Resp_Phys: 8 MRR
+ SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467e+19] "" IFV_Host
+
+BO_ 261 MRR_Status_SerialNumber: 8 MRR
+ SG_ CAN_SEQUENCE_NUMBER : 55|16@0+ (1,0) [0|65535] "" External_Tool
+ SG_ CAN_SERIAL_NUMBER : 7|40@0+ (1,0) [0|1.09951e+12] "" External_Tool
+
+BO_ 264 MRR_Status_SwVersion: 8 MRR
+ SG_ CAN_PBL_Field_Revision : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_PBL_Promote_Revision : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Field_Revision : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Promote_Revision : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Release_Revision : 7|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_PBL_Release_Revision : 31|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 373 MRR_Header_SensorPosition: 8 MRR
+ SG_ CAN_SENSOR_POLARITY : 55|1@0+ (1,0) [0|1] "" External_Tool
+ SG_ CAN_SENSOR_LAT_OFFSET : 39|16@0+ (0.01,0) [0|655.35] "cm" External_Tool
+ SG_ CAN_SENSOR_LONG_OFFSET : 23|16@0+ (0.01,0) [0|655.35] "cm" External_Tool
+ SG_ CAN_SENSOR_HANGLE_OFFSET : 7|8@0+ (0.0625,-8) [-8|7.9375] "deg" External_Tool
+
+BO_ 372 MRR_Header_SensorCoverage: 8 MRR
+ SG_ CAN_SENSOR_FOV_HOR : 39|8@0+ (1,0) [0|255] "deg" IFV_VFP
+ SG_ CAN_DOPPLER_COVERAGE : 23|8@0+ (1,-128) [-128|127] "m/s" IFV_VFP
+ SG_ CAN_RANGE_COVERAGE : 7|8@0+ (1,0) [0|255] "m" IFV_VFP
+
+BO_ 371 MRR_Header_AlignmentState: 8 MRR
+ SG_ CAN_AUTO_ALIGN_HANGLE_QF : 13|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_ALIGNMENT_STATUS : 51|4@0+ (1,0) [0|11] "" IFV_VFP
+ SG_ CAN_ALIGNMENT_STATE : 55|3@0+ (1,0) [0|7] "" IFV_VFP
+ SG_ CAN_AUTO_ALIGN_HANGLE_REF : 11|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP
+ SG_ CAN_AUTO_ALIGN_HANGLE : 7|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP
+
+BO_ 369 MRR_Header_Timestamps: 8 MRR
+ SG_ CAN_DET_TIME_SINCE_MEAS : 39|11@0+ (0.1,0) [0|204.7] "ms" IFV_Host
+ SG_ CAN_SENSOR_TIME_STAMP : 7|32@0+ (0.1,0) [0|4.29497e+08] "ms" IFV_VFP
+
+BO_ 368 MRR_Header_InformationDetections: 8 MRR
+ SG_ CAN_ALIGN_UPDATES_DONE : 55|16@0+ (1,0) [0|65535] "" IFV_VFP
+ SG_ CAN_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" IFV_VFP
+ SG_ CAN_NUMBER_OF_DET : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_LOOK_ID : 23|2@0+ (1,0) [0|3] "" External_Tool
+ SG_ CAN_LOOK_INDEX : 7|16@0+ (1,0) [0|65535] "" External_Tool
+
+BO_ 265 MRR_Status_Temp_Volt: 8 MRR
+ SG_ CAN_BATT_VOLTS : 63|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_1_25_V : 55|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_5_V : 47|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_3_3_V_RAW : 31|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_3_3_V_DAC : 15|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_MMIC_Temp1 : 39|8@0+ (1,-50) [-50|205] "C" External_Tool
+ SG_ CAN_Processor_Thermistor : 23|8@0+ (1,-50) [-50|205] "C" External_Tool
+ SG_ CAN_Processor_Temp1 : 7|8@0+ (1,-50) [-50|205] "C" External_Tool
+
+BO_ 291 MRR_Detection_004: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_04 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 351 MRR_Detection_064: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_64 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_64 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_64 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_64 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_64 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_64 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_64 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_64 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_64 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_64 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 350 MRR_Detection_063: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_63 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_63 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_63 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_63 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_63 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_63 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_63 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_63 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_63 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_63 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 349 MRR_Detection_062: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_62 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_62 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_62 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_62 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_62 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_62 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_62 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_62 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_62 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_62 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 348 MRR_Detection_061: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_61 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_61 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_61 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_61 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_61 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_61 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_61 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_61 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_61 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_61 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 347 MRR_Detection_060: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_60 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_60 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_60 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_60 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_60 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_60 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_60 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_60 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_60 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_60 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 346 MRR_Detection_059: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_59 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_59 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_59 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_59 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_59 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_59 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_59 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_59 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_59 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_59 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 345 MRR_Detection_058: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_58 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_58 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_58 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_58 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_58 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_58 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_58 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_58 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_58 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_58 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 344 MRR_Detection_057: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_57 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_57 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_57 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_57 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_57 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_57 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_57 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_57 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_57 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_57 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 343 MRR_Detection_056: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_56 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_56 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_56 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_56 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_56 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_56 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_56 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_56 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_56 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_56 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 342 MRR_Detection_055: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_55 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_55 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_55 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_55 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_55 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_55 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_55 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_55 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_55 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_55 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 335 MRR_Detection_048: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_48 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_48 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_48 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_48 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_48 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_48 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_48 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_48 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_48 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_48 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 334 MRR_Detection_047: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_47 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_47 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_47 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_47 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_47 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_47 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_47 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_47 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_47 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_47 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 333 MRR_Detection_046: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_46 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_46 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_46 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_46 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_46 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_46 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_46 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_46 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_46 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_46 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 332 MRR_Detection_045: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_45 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_45 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_45 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_45 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_45 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_45 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_45 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_45 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_45 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_45 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 331 MRR_Detection_044: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_44 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_44 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_44 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_44 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_44 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_44 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_44 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_44 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_44 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_44 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 330 MRR_Detection_043: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_43 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_43 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_43 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_43 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_43 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_43 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_43 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_43 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_43 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_43 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 329 MRR_Detection_042: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_42 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_42 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_42 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_42 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_42 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_42 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_42 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_42 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_42 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_42 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 328 MRR_Detection_041: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_41 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_41 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_41 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_41 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_41 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_41 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_41 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_41 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_41 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_41 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 327 MRR_Detection_040: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_40 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_40 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_40 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_40 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_40 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_40 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_40 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_40 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_40 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_40 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 325 MRR_Detection_038: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_38 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_38 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_38 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_38 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_38 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_38 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_38 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_38 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_38 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_38 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 324 MRR_Detection_037: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_37 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_37 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_37 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_37 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_37 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_37 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_37 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_37 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_37 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_37 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 323 MRR_Detection_036: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_36 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_36 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_36 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_36 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_36 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_36 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_36 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_36 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_36 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_36 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 322 MRR_Detection_035: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_35 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_35 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_35 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_35 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_35 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_35 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_35 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_35 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_35 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_35 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 321 MRR_Detection_034: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_34 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_34 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_34 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_34 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_34 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_34 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_34 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_34 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_34 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_34 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 320 MRR_Detection_033: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_33 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_33 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_33 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_33 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_33 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_33 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_33 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_33 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_33 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_33 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 319 MRR_Detection_032: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_32 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_32 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_32 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_32 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_32 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_32 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_32 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_32 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_32 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_32 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 318 MRR_Detection_031: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_31 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_31 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_31 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_31 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_31 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_31 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_31 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_31 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_31 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_31 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 317 MRR_Detection_030: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_30 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_30 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_30 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_30 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_30 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_30 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_30 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_30 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_30 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_30 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 316 MRR_Detection_029: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_29 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_29 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_29 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_29 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_29 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_29 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_29 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_29 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_29 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_29 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 314 MRR_Detection_027: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_27 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_27 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_27 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_27 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_27 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_27 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_27 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_27 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_27 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_27 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 313 MRR_Detection_026: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_26 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_26 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_26 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_26 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_26 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_26 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_26 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_26 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_26 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_26 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 312 MRR_Detection_025: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_25 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_25 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_25 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_25 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_25 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_25 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_25 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_25 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_25 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_25 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 311 MRR_Detection_024: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_24 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_24 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_24 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_24 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_24 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_24 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_24 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_24 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_24 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_24 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 310 MRR_Detection_023: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_23 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_23 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_23 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_23 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_23 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_23 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_23 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_23 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_23 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_23 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 309 MRR_Detection_022: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_22 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_22 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_22 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_22 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_22 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_22 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_22 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_22 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_22 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_22 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 308 MRR_Detection_021: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_21 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 307 MRR_Detection_020: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_20 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 306 MRR_Detection_019: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_19 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 305 MRR_Detection_018: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_18 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 341 MRR_Detection_054: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_54 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_54 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_54 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_54 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_54 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_54 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_54 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_54 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_54 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_54 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 340 MRR_Detection_053: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_53 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_53 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_53 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_53 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_53 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_53 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_53 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_53 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_53 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_53 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 339 MRR_Detection_052: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_52 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_52 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_52 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_52 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_52 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_52 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_52 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_52 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_52 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_52 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 338 MRR_Detection_051: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_51 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_51 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_51 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_51 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_51 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_51 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_51 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_51 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_51 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_51 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 337 MRR_Detection_050: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_50 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_50 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_50 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_50 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_50 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_50 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_50 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_50 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_50 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_50 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 336 MRR_Detection_049: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_49 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_49 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_49 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_49 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_49 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_49 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_49 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_49 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_49 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_49 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 326 MRR_Detection_039: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_39 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_39 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_39 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_39 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_39 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_39 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_39 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_39 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_39 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_39 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 315 MRR_Detection_028: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_28 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_28 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_28 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_28 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_28 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_28 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_28 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_28 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_28 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_28 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 304 MRR_Detection_017: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_17 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 303 MRR_Detection_016: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_16 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 302 MRR_Detection_015: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_15 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 301 MRR_Detection_014: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_14 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 300 MRR_Detection_013: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_13 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 299 MRR_Detection_012: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_12 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 298 MRR_Detection_011: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_11 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 297 MRR_Detection_010: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_10 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 296 MRR_Detection_009: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_09 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 295 MRR_Detection_008: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_08 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 294 MRR_Detection_007: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_07 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 293 MRR_Detection_006: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_06 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 292 MRR_Detection_005: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_05 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 290 MRR_Detection_003: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_03 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 289 MRR_Detection_002: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_02 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 256 MRR_Status_CANVersion: 8 MRR
+ SG_ CAN_USC_SECTION_COMPATIBILITY : 23|16@0+ (1,0) [0|65535] "" External_Tool
+ SG_ CAN_PCAN_MINOR_MRR : 7|8@0+ (1,0) [0|255] "" IFV_VFP
+ SG_ CAN_PCAN_MAJOR_MRR : 15|8@0+ (1,0) [0|255] "" IFV_VFP
+
+BO_ 257 MRR_Status_Radar: 8 MRR
+ SG_ CAN_INTERFERENCE_TYPE : 11|2@0+ (1,0) [0|3] "" IFV_Host
+ SG_ CAN_RECOMMEND_UNCONVERGE : 9|1@0+ (1,0) [0|1] "" IFV_Host
+ SG_ CAN_BLOCKAGE_SIDELOBE_FILTER_VAL : 15|4@0+ (1,0) [0|15] "" IFV_Host
+ SG_ CAN_RADAR_ALIGN_INCOMPLETE : 8|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_BLOCKAGE_SIDELOBE : 4|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_BLOCKAGE_MNR : 5|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_EXT_COND_NOK : 1|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_ALIGN_OUT_RANGE : 2|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_ALIGN_NOT_START : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_OVERHEAT_ERROR : 3|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_NOT_OP : 6|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_XCVR_OPERATIONAL : 7|1@0+ (1,0) [0|1] "" IFV_VFP
+
+BO_ 288 MRR_Detection_001: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes";
+BA_DEF_ SG_ "CrossOver_LIN" ENUM "No","Yes","No","Yes";
+BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes","No","Yes","No","Yes";
+BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ SG_ "GenSigTimeoutTime_RCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_OCS" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_CCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_IPMA" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_SCCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_Generic_BCM" INT 0 100000;
+BA_DEF_ BO_ "NmMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "TpTxIndex" INT 0 255;
+BA_DEF_ BO_ "DiagState" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "TpApplType" STRING ;
+BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "Mulitplexer" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "EventRateOfChange" INT 10 10000;
+BA_DEF_ BO_ "GenMsgHandlingTypeDoc" STRING ;
+BA_DEF_ BO_ "GenMsgHandlingTypeCode" STRING ;
+BA_DEF_ BO_ "GenMsgMarked" STRING ;
+BA_DEF_ SG_ "GenSigMarked" STRING ;
+BA_DEF_ SG_ "GenSigVtIndex" STRING ;
+BA_DEF_ SG_ "GenSigVtName" STRING ;
+BA_DEF_ SG_ "GenSigVtEn" STRING ;
+BA_DEF_ SG_ "GenSigSNA" STRING ;
+BA_DEF_ SG_ "GenSigCmt" STRING ;
+BA_DEF_ BO_ "GenMsgCmt" STRING ;
+BA_DEF_ SG_ "GenSigSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType";
+BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000;
+BA_DEF_ SG_ "GenSigMissingSourceValue" INT 0 1e+09;
+BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes";
+BA_DEF_ SG_ "GenSigStartValue" INT 0 1e+09;
+BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes";
+BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "GenMsgSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType";
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000;
+BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000;
+BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100;
+BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000;
+BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes";
+BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes";
+BA_DEF_ BU_ "ILUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BU_ "PowerType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes","Switched","Latched","Sleep","vector_leerstring","vector_leerstring";
+BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000;
+BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000;
+BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ;
+BA_DEF_ BO_ "GenMsgForegroundColor" STRING ;
+BA_ "GenMsgCycleTime" BO_ 34 1000;
+BA_ "GenMsgSendType" BO_ 34 0;
+BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck";
+BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck";
+BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg";
+BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg";
+BA_ "GenSigVtEn" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure";
+BA_ "GenSigVtName" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure";
+BA_ "GenSigVtEn" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError";
+BA_ "GenSigVtName" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError";
+BA_ "GenSigVtEn" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError";
+BA_ "GenSigVtName" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError";
+BA_ "GenMsgCycleTime" BO_ 33 1000;
+BA_ "GenMsgSendType" BO_ 33 0;
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4";
+BA_ "GenSigVtEn" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault";
+BA_ "GenSigVtName" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault";
+BA_ "GenSigVtEn" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault";
+BA_ "GenSigVtName" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault";
+BA_ "GenSigVtEn" SG_ 33 HostToArmChksumFault "HostToArmChksumFault";
+BA_ "GenSigVtName" SG_ 33 HostToArmChksumFault "HostToArmChksumFault";
+BA_ "GenSigVtEn" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault";
+BA_ "GenSigVtName" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault";
+BA_ "GenSigVtEn" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange";
+BA_ "GenSigVtName" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 DSPOverrunFault "DSPOverrunFault";
+BA_ "GenSigVtName" SG_ 33 DSPOverrunFault "DSPOverrunFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5";
+BA_ "GenSigVtEn" SG_ 33 TuningSensitivityFault "TuningSensitivityFault";
+BA_ "GenSigVtName" SG_ 33 TuningSensitivityFault "TuningSensitivityFault";
+BA_ "GenSigVtEn" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault";
+BA_ "GenSigVtName" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault";
+BA_ "GenSigVtEn" SG_ 33 LocalOscPowerFault "LocalOscPowerFault";
+BA_ "GenSigVtName" SG_ 33 LocalOscPowerFault "LocalOscPowerFault";
+BA_ "GenSigVtEn" SG_ 33 TransmitterPowerFault "TransmitterPowerFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterPowerFault "TransmitterPowerFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6";
+BA_ "GenSigVtEn" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault";
+BA_ "GenSigVtName" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault";
+BA_ "GenSigVtEn" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault";
+BA_ "GenSigVtName" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault";
+BA_ "GenSigVtEn" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault";
+BA_ "GenSigVtName" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault";
+BA_ "GenSigVtEn" SG_ 33 SidelobeBlockage "SidelobeBlockage";
+BA_ "GenSigVtName" SG_ 33 SidelobeBlockage "SidelobeBlockage";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1";
+BA_ "GenSigVtEn" SG_ 33 MNRBlocked "MNRBlocked";
+BA_ "GenSigVtName" SG_ 33 MNRBlocked "MNRBlocked";
+BA_ "GenSigVtEn" SG_ 33 ECUTempHighFault "ECUTempHighFault";
+BA_ "GenSigVtName" SG_ 33 ECUTempHighFault "ECUTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault";
+BA_ "GenSigVtName" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault";
+BA_ "GenSigVtEn" SG_ 33 UnreasonableRadarData "UnreasonableRadarData";
+BA_ "GenSigVtName" SG_ 33 UnreasonableRadarData "UnreasonableRadarData";
+BA_ "GenSigVtEn" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault";
+BA_ "GenSigVtName" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange";
+BA_ "GenSigVtName" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange";
+BA_ "GenSigVtName" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode";
+BA_ "GenSigVtName" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode";
+BA_ "GenSigVtEn" SG_ 33 BatteryLowFault "BatteryLowFault";
+BA_ "GenSigVtName" SG_ 33 BatteryLowFault "BatteryLowFault";
+BA_ "GenSigVtEn" SG_ 33 BatteryHighFault "BatteryHighFault";
+BA_ "GenSigVtName" SG_ 33 BatteryHighFault "BatteryHighFault";
+BA_ "GenSigVtEn" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4";
+BA_ "GenSigVtEn" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange";
+BA_ "GenSigVtName" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 TransmitterIDFault "TransmitterIDFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterIDFault "TransmitterIDFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2";
+BA_ "GenSigVtEn" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault";
+BA_ "GenSigVtName" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault";
+BA_ "GenSigVtEn" SG_ 33 PCANBusOff "PCANBusOff";
+BA_ "GenSigVtName" SG_ 33 PCANBusOff "PCANBusOff";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6";
+BA_ "GenSigVtEn" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault";
+BA_ "GenSigVtName" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault";
+BA_ "GenSigVtEn" SG_ 33 StackOverflowFault "StackOverflowFault";
+BA_ "GenSigVtName" SG_ 33 StackOverflowFault "StackOverflowFault";
+BA_ "GenSigVtEn" SG_ 33 WatchdogFault "WatchdogFault";
+BA_ "GenSigVtName" SG_ 33 WatchdogFault "WatchdogFault";
+BA_ "GenSigVtEn" SG_ 33 PLLLockFault "PLLLockFault";
+BA_ "GenSigVtName" SG_ 33 PLLLockFault "PLLLockFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1";
+BA_ "GenSigVtEn" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault";
+BA_ "GenSigVtName" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault";
+BA_ "GenSigVtName" SG_ 33 USCValidationFault "USCValidationFault";
+BA_ "GenSigVtEn" SG_ 33 USCValidationFault "USCValidationFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3";
+BA_ "GenSigVtEn" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault";
+BA_ "GenSigVtName" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault";
+BA_ "GenSigVtEn" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum";
+BA_ "GenSigVtName" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum";
+BA_ "GenSigVtEn" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault";
+BA_ "GenSigVtName" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault";
+BA_ "GenMsgNrOfRepetition" BO_ 500 0;
+BA_ "GenMsgSendType" BO_ 500 1;
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte7 "MRR_xcp_daq_resp_byte7";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte6 "MRR_xcp_daq_resp_byte6";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte5 "MRR_xcp_daq_resp_byte5";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte4 "MRR_xcp_daq_resp_byte4";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte3 "MRR_xcp_daq_resp_byte3";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte2 "MRR_xcp_daq_resp_byte2";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte1 "MRR_xcp_daq_resp_byte1";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte0 "MRR_xcp_daq_resp_byte0";
+BA_ "GenMsgNrOfRepetition" BO_ 499 0;
+BA_ "GenMsgSendType" BO_ 499 1;
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte7 "MRR_xcp_dto_resp_byte7";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte6 "MRR_xcp_dto_resp_byte6";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte5 "MRR_xcp_dto_resp_byte5";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte4 "MRR_xcp_dto_resp_byte4";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte3 "MRR_xcp_dto_resp_byte3";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte2 "MRR_xcp_dto_resp_byte2";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte1 "MRR_xcp_dto_resp_byte1";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte0 "MRR_xcp_dto_resp_byte0";
+BA_ "GenMsgNrOfRepetition" BO_ 497 0;
+BA_ "GenMsgSendType" BO_ 497 1;
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte7 "MRR_xcp_cto_resp_byte7";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte6 "MRR_xcp_cto_resp_byte6";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte5 "MRR_xcp_cto_resp_byte5";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte4 "MRR_xcp_cto_resp_byte4";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte3 "MRR_xcp_cto_resp_byte3";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte2 "MRR_xcp_cto_resp_byte2";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte1 "MRR_xcp_cto_resp_byte1";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte0 "MRR_xcp_cto_resp_byte0";
+BA_ "GenMsgSendType" BO_ 1900 1;
+BA_ "GenMsgNrOfRepetition" BO_ 1900 0;
+BA_ "DiagResponse" BO_ 1900 1;
+BA_ "GenSigCmt" SG_ 1900 TesterPhysicalResCCM "TesterPhysicalResCCM";
+BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 0;
+BA_ "GenMsgSendType" BO_ 261 0;
+BA_ "GenMsgCycleTime" BO_ 261 1000;
+BA_ "GenMsgNrOfRepetition" BO_ 261 0;
+BA_ "GenSigCmt" SG_ 261 CAN_SEQUENCE_NUMBER "CAN_SEQUENCE_NUMBER";
+BA_ "GenSigCmt" SG_ 261 CAN_SERIAL_NUMBER "CAN_SERIAL_NUMBER";
+BA_ "GenSigSendType" SG_ 261 CAN_SERIAL_NUMBER 0;
+BA_ "GenMsgSendType" BO_ 264 1;
+BA_ "GenMsgNrOfRepetition" BO_ 264 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Field_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Promote_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Field_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Promote_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Release_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Release_Revision 0;
+BA_ "GenMsgSendType" BO_ 373 1;
+BA_ "NetworkInitialization" BO_ 373 0;
+BA_ "GenMsgNrOfRepetition" BO_ 373 0;
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_POLARITY 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_POLARITY "CAN_SENSOR_POLARITY";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LAT_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LAT_OFFSET "CAN_SENSOR_LAT_OFFSET";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LONG_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LONG_OFFSET "CAN_SENSOR_LONG_OFFSET";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_HANGLE_OFFSET "CAN_SENSOR_HANGLE_OFFSET";
+BA_ "GenSigStartValue" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0;
+BA_ "GenMsgSendType" BO_ 372 1;
+BA_ "NetworkInitialization" BO_ 372 0;
+BA_ "GenMsgNrOfRepetition" BO_ 372 0;
+BA_ "GenSigSendType" SG_ 372 CAN_SENSOR_FOV_HOR 0;
+BA_ "GenSigCmt" SG_ 372 CAN_SENSOR_FOV_HOR "CAN_SENSOR_FOV_HOR";
+BA_ "GenSigStartValue" SG_ 372 CAN_SENSOR_FOV_HOR 0;
+BA_ "GenSigSendType" SG_ 372 CAN_DOPPLER_COVERAGE 0;
+BA_ "GenSigCmt" SG_ 372 CAN_DOPPLER_COVERAGE "CAN_DOPPLER_COVERAGE";
+BA_ "GenSigStartValue" SG_ 372 CAN_DOPPLER_COVERAGE 0;
+BA_ "GenSigSendType" SG_ 372 CAN_RANGE_COVERAGE 0;
+BA_ "GenSigCmt" SG_ 372 CAN_RANGE_COVERAGE "CAN_RANGE_COVERAGE";
+BA_ "GenMsgSendType" BO_ 371 1;
+BA_ "NetworkInitialization" BO_ 371 0;
+BA_ "GenMsgNrOfRepetition" BO_ 371 0;
+BA_ "GenSigVtEn" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigVtName" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATUS 0;
+BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATE 0;
+BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0;
+BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF "CAN_AUTO_ALIGN_HANGLE_REF";
+BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0;
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE "CAN_AUTO_ALIGN_HANGLE";
+BA_ "GenMsgSendType" BO_ 369 1;
+BA_ "NetworkInitialization" BO_ 369 0;
+BA_ "GenMsgNrOfRepetition" BO_ 369 0;
+BA_ "GenSigCmt" SG_ 369 CAN_DET_TIME_SINCE_MEAS "CAN_DET_TIME_SINCE_MEAS";
+BA_ "GenSigSendType" SG_ 369 CAN_DET_TIME_SINCE_MEAS 0;
+BA_ "GenSigSendType" SG_ 369 CAN_SENSOR_TIME_STAMP 0;
+BA_ "GenSigCmt" SG_ 369 CAN_SENSOR_TIME_STAMP "CAN_SENSOR_TIME_STAMP";
+BA_ "GenMsgSendType" BO_ 368 1;
+BA_ "NetworkInitialization" BO_ 368 0;
+BA_ "GenMsgNrOfRepetition" BO_ 368 0;
+BA_ "GenSigSendType" SG_ 368 CAN_ALIGN_UPDATES_DONE 0;
+BA_ "GenSigCmt" SG_ 368 CAN_ALIGN_UPDATES_DONE "CAN_ALIGN_UPDATES_DONE";
+BA_ "GenSigSendType" SG_ 368 CAN_SCAN_INDEX 0;
+BA_ "GenSigCmt" SG_ 368 CAN_SCAN_INDEX "CAN_SCAN_INDEX";
+BA_ "GenSigSendType" SG_ 368 CAN_NUMBER_OF_DET 0;
+BA_ "GenSigCmt" SG_ 368 CAN_NUMBER_OF_DET "CAN_NUMBER_OF_DET";
+BA_ "GenSigSendType" SG_ 368 CAN_LOOK_ID 0;
+BA_ "GenSigCmt" SG_ 368 CAN_LOOK_ID "CAN_LOOK_ID";
+BA_ "GenSigSendType" SG_ 368 CAN_LOOK_INDEX 0;
+BA_ "GenSigCmt" SG_ 368 CAN_LOOK_INDEX "CAN_LOOK_INDEX";
+BA_ "GenMsgSendType" BO_ 265 1;
+BA_ "NetworkInitialization" BO_ 265 0;
+BA_ "GenMsgNrOfRepetition" BO_ 265 0;
+BA_ "GenSigCmt" SG_ 265 CAN_BATT_VOLTS "CAN_BATT_VOLTS";
+BA_ "GenSigCmt" SG_ 265 CAN_1_25_V "CAN_1_25_V";
+BA_ "GenSigCmt" SG_ 265 CAN_5_V "CAN_5_V";
+BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_RAW "CAN_3_3_V_RAW";
+BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_DAC "CAN_3_3_V_DAC";
+BA_ "GenSigSendType" SG_ 265 CAN_MMIC_Temp1 0;
+BA_ "GenSigCmt" SG_ 265 CAN_MMIC_Temp1 "CAN_MMIC_Temp1";
+BA_ "GenSigStartValue" SG_ 265 CAN_MMIC_Temp1 0;
+BA_ "GenSigSendType" SG_ 265 CAN_Processor_Thermistor 0;
+BA_ "GenSigCmt" SG_ 265 CAN_Processor_Thermistor "CAN_Processor_Thermistor";
+BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Thermistor 0;
+BA_ "GenSigSendType" SG_ 265 CAN_Processor_Temp1 0;
+BA_ "GenSigCmt" SG_ 265 CAN_Processor_Temp1 "CAN_Processor_Temp1";
+BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Temp1 0;
+BA_ "GenMsgSendType" BO_ 291 1;
+BA_ "GenMsgILSupport" BO_ 291 1;
+BA_ "GenMsgNrOfRepetition" BO_ 291 0;
+BA_ "GenMsgCycleTime" BO_ 291 0;
+BA_ "NetworkInitialization" BO_ 291 0;
+BA_ "GenMsgDelayTime" BO_ 291 0;
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 "CAN_DET_CONFID_AZIMUTH_04";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 "CAN_DET_CONFID_AZIMUTH_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 "CAN_DET_CONFID_AZIMUTH_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04 "CAN_DET_SUPER_RES_TARGET_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04 "CAN_DET_ND_TARGET_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04 "CAN_DET_HOST_VEH_CLUTTER_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04 "CAN_DET_VALID_LEVEL_04";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04 "CAN_DET_AZIMUTH_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04 "CAN_DET_RANGE_04";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04 "CAN_DET_RANGE_RATE_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04 "CAN_DET_AMPLITUDE_04";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04 "CAN_SCAN_INDEX_2LSB_04";
+BA_ "GenMsgSendType" BO_ 351 1;
+BA_ "GenMsgILSupport" BO_ 351 1;
+BA_ "GenMsgNrOfRepetition" BO_ 351 0;
+BA_ "GenMsgCycleTime" BO_ 351 0;
+BA_ "NetworkInitialization" BO_ 351 0;
+BA_ "GenMsgDelayTime" BO_ 351 0;
+BA_ "GenSigVtEn" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigVtName" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 "CAN_DET_SUPER_RES_TARGET_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_ND_TARGET_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_ND_TARGET_64 "CAN_DET_ND_TARGET_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 "CAN_DET_HOST_VEH_CLUTTER_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_VALID_LEVEL_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_VALID_LEVEL_64 "CAN_DET_VALID_LEVEL_64";
+BA_ "GenSigStartValue" SG_ 351 CAN_DET_AZIMUTH_64 0;
+BA_ "GenSigSendType" SG_ 351 CAN_DET_AZIMUTH_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_AZIMUTH_64 "CAN_DET_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_64 "CAN_DET_RANGE_64";
+BA_ "GenSigStartValue" SG_ 351 CAN_DET_RANGE_RATE_64 0;
+BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_RATE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_RATE_64 "CAN_DET_RANGE_RATE_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_AMPLITUDE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_AMPLITUDE_64 "CAN_DET_AMPLITUDE_64";
+BA_ "GenSigSendType" SG_ 351 CAN_SCAN_INDEX_2LSB_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_SCAN_INDEX_2LSB_64 "CAN_SCAN_INDEX_2LSB_64";
+BA_ "GenMsgSendType" BO_ 350 1;
+BA_ "GenMsgILSupport" BO_ 350 1;
+BA_ "GenMsgNrOfRepetition" BO_ 350 0;
+BA_ "GenMsgCycleTime" BO_ 350 0;
+BA_ "NetworkInitialization" BO_ 350 0;
+BA_ "GenMsgDelayTime" BO_ 350 0;
+BA_ "GenSigVtEn" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigVtName" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 "CAN_DET_SUPER_RES_TARGET_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_ND_TARGET_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_ND_TARGET_63 "CAN_DET_ND_TARGET_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 "CAN_DET_HOST_VEH_CLUTTER_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_VALID_LEVEL_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_VALID_LEVEL_63 "CAN_DET_VALID_LEVEL_63";
+BA_ "GenSigStartValue" SG_ 350 CAN_DET_AZIMUTH_63 0;
+BA_ "GenSigSendType" SG_ 350 CAN_DET_AZIMUTH_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_AZIMUTH_63 "CAN_DET_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_63 "CAN_DET_RANGE_63";
+BA_ "GenSigStartValue" SG_ 350 CAN_DET_RANGE_RATE_63 0;
+BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_RATE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_RATE_63 "CAN_DET_RANGE_RATE_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_AMPLITUDE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_AMPLITUDE_63 "CAN_DET_AMPLITUDE_63";
+BA_ "GenSigSendType" SG_ 350 CAN_SCAN_INDEX_2LSB_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_SCAN_INDEX_2LSB_63 "CAN_SCAN_INDEX_2LSB_63";
+BA_ "GenMsgSendType" BO_ 349 1;
+BA_ "GenMsgILSupport" BO_ 349 1;
+BA_ "GenMsgNrOfRepetition" BO_ 349 0;
+BA_ "GenMsgCycleTime" BO_ 349 0;
+BA_ "NetworkInitialization" BO_ 349 0;
+BA_ "GenMsgDelayTime" BO_ 349 0;
+BA_ "GenSigVtEn" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigVtName" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 "CAN_DET_SUPER_RES_TARGET_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_ND_TARGET_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_ND_TARGET_62 "CAN_DET_ND_TARGET_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 "CAN_DET_HOST_VEH_CLUTTER_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_VALID_LEVEL_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_VALID_LEVEL_62 "CAN_DET_VALID_LEVEL_62";
+BA_ "GenSigStartValue" SG_ 349 CAN_DET_AZIMUTH_62 0;
+BA_ "GenSigSendType" SG_ 349 CAN_DET_AZIMUTH_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_AZIMUTH_62 "CAN_DET_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_62 "CAN_DET_RANGE_62";
+BA_ "GenSigStartValue" SG_ 349 CAN_DET_RANGE_RATE_62 0;
+BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_RATE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_RATE_62 "CAN_DET_RANGE_RATE_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_AMPLITUDE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_AMPLITUDE_62 "CAN_DET_AMPLITUDE_62";
+BA_ "GenSigSendType" SG_ 349 CAN_SCAN_INDEX_2LSB_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_SCAN_INDEX_2LSB_62 "CAN_SCAN_INDEX_2LSB_62";
+BA_ "GenMsgSendType" BO_ 348 1;
+BA_ "GenMsgILSupport" BO_ 348 1;
+BA_ "GenMsgNrOfRepetition" BO_ 348 0;
+BA_ "GenMsgCycleTime" BO_ 348 0;
+BA_ "NetworkInitialization" BO_ 348 0;
+BA_ "GenMsgDelayTime" BO_ 348 0;
+BA_ "GenSigVtEn" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigVtName" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 "CAN_DET_SUPER_RES_TARGET_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_ND_TARGET_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_ND_TARGET_61 "CAN_DET_ND_TARGET_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 "CAN_DET_HOST_VEH_CLUTTER_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_VALID_LEVEL_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_VALID_LEVEL_61 "CAN_DET_VALID_LEVEL_61";
+BA_ "GenSigStartValue" SG_ 348 CAN_DET_AZIMUTH_61 0;
+BA_ "GenSigSendType" SG_ 348 CAN_DET_AZIMUTH_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_AZIMUTH_61 "CAN_DET_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_61 "CAN_DET_RANGE_61";
+BA_ "GenSigStartValue" SG_ 348 CAN_DET_RANGE_RATE_61 0;
+BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_RATE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_RATE_61 "CAN_DET_RANGE_RATE_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_AMPLITUDE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_AMPLITUDE_61 "CAN_DET_AMPLITUDE_61";
+BA_ "GenSigSendType" SG_ 348 CAN_SCAN_INDEX_2LSB_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_SCAN_INDEX_2LSB_61 "CAN_SCAN_INDEX_2LSB_61";
+BA_ "GenMsgSendType" BO_ 347 1;
+BA_ "GenMsgILSupport" BO_ 347 1;
+BA_ "GenMsgNrOfRepetition" BO_ 347 0;
+BA_ "GenMsgCycleTime" BO_ 347 0;
+BA_ "NetworkInitialization" BO_ 347 0;
+BA_ "GenMsgDelayTime" BO_ 347 0;
+BA_ "GenSigVtEn" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigVtName" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 "CAN_DET_SUPER_RES_TARGET_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_ND_TARGET_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_ND_TARGET_60 "CAN_DET_ND_TARGET_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 "CAN_DET_HOST_VEH_CLUTTER_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_VALID_LEVEL_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_VALID_LEVEL_60 "CAN_DET_VALID_LEVEL_60";
+BA_ "GenSigStartValue" SG_ 347 CAN_DET_AZIMUTH_60 0;
+BA_ "GenSigSendType" SG_ 347 CAN_DET_AZIMUTH_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_AZIMUTH_60 "CAN_DET_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_60 "CAN_DET_RANGE_60";
+BA_ "GenSigStartValue" SG_ 347 CAN_DET_RANGE_RATE_60 0;
+BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_RATE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_RATE_60 "CAN_DET_RANGE_RATE_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_AMPLITUDE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_AMPLITUDE_60 "CAN_DET_AMPLITUDE_60";
+BA_ "GenSigSendType" SG_ 347 CAN_SCAN_INDEX_2LSB_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_SCAN_INDEX_2LSB_60 "CAN_SCAN_INDEX_2LSB_60";
+BA_ "GenMsgSendType" BO_ 346 1;
+BA_ "GenMsgILSupport" BO_ 346 1;
+BA_ "GenMsgNrOfRepetition" BO_ 346 0;
+BA_ "GenMsgCycleTime" BO_ 346 0;
+BA_ "NetworkInitialization" BO_ 346 0;
+BA_ "GenMsgDelayTime" BO_ 346 0;
+BA_ "GenSigVtEn" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigVtName" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 "CAN_DET_SUPER_RES_TARGET_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_ND_TARGET_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_ND_TARGET_59 "CAN_DET_ND_TARGET_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 "CAN_DET_HOST_VEH_CLUTTER_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_VALID_LEVEL_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_VALID_LEVEL_59 "CAN_DET_VALID_LEVEL_59";
+BA_ "GenSigStartValue" SG_ 346 CAN_DET_AZIMUTH_59 0;
+BA_ "GenSigSendType" SG_ 346 CAN_DET_AZIMUTH_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_AZIMUTH_59 "CAN_DET_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_59 "CAN_DET_RANGE_59";
+BA_ "GenSigStartValue" SG_ 346 CAN_DET_RANGE_RATE_59 0;
+BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_RATE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_RATE_59 "CAN_DET_RANGE_RATE_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_AMPLITUDE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_AMPLITUDE_59 "CAN_DET_AMPLITUDE_59";
+BA_ "GenSigSendType" SG_ 346 CAN_SCAN_INDEX_2LSB_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_SCAN_INDEX_2LSB_59 "CAN_SCAN_INDEX_2LSB_59";
+BA_ "GenMsgSendType" BO_ 345 1;
+BA_ "GenMsgILSupport" BO_ 345 1;
+BA_ "GenMsgNrOfRepetition" BO_ 345 0;
+BA_ "GenMsgCycleTime" BO_ 345 0;
+BA_ "NetworkInitialization" BO_ 345 0;
+BA_ "GenMsgDelayTime" BO_ 345 0;
+BA_ "GenSigVtEn" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigVtName" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 "CAN_DET_SUPER_RES_TARGET_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_ND_TARGET_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_ND_TARGET_58 "CAN_DET_ND_TARGET_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 "CAN_DET_HOST_VEH_CLUTTER_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_VALID_LEVEL_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_VALID_LEVEL_58 "CAN_DET_VALID_LEVEL_58";
+BA_ "GenSigStartValue" SG_ 345 CAN_DET_AZIMUTH_58 0;
+BA_ "GenSigSendType" SG_ 345 CAN_DET_AZIMUTH_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_AZIMUTH_58 "CAN_DET_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_58 "CAN_DET_RANGE_58";
+BA_ "GenSigStartValue" SG_ 345 CAN_DET_RANGE_RATE_58 0;
+BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_RATE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_RATE_58 "CAN_DET_RANGE_RATE_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_AMPLITUDE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_AMPLITUDE_58 "CAN_DET_AMPLITUDE_58";
+BA_ "GenSigSendType" SG_ 345 CAN_SCAN_INDEX_2LSB_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_SCAN_INDEX_2LSB_58 "CAN_SCAN_INDEX_2LSB_58";
+BA_ "GenMsgSendType" BO_ 344 1;
+BA_ "GenMsgILSupport" BO_ 344 1;
+BA_ "GenMsgNrOfRepetition" BO_ 344 0;
+BA_ "GenMsgCycleTime" BO_ 344 0;
+BA_ "NetworkInitialization" BO_ 344 0;
+BA_ "GenMsgDelayTime" BO_ 344 0;
+BA_ "GenSigVtEn" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigVtName" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 "CAN_DET_SUPER_RES_TARGET_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_ND_TARGET_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_ND_TARGET_57 "CAN_DET_ND_TARGET_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 "CAN_DET_HOST_VEH_CLUTTER_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_VALID_LEVEL_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_VALID_LEVEL_57 "CAN_DET_VALID_LEVEL_57";
+BA_ "GenSigStartValue" SG_ 344 CAN_DET_AZIMUTH_57 0;
+BA_ "GenSigSendType" SG_ 344 CAN_DET_AZIMUTH_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_AZIMUTH_57 "CAN_DET_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_57 "CAN_DET_RANGE_57";
+BA_ "GenSigStartValue" SG_ 344 CAN_DET_RANGE_RATE_57 0;
+BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_RATE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_RATE_57 "CAN_DET_RANGE_RATE_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_AMPLITUDE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_AMPLITUDE_57 "CAN_DET_AMPLITUDE_57";
+BA_ "GenSigSendType" SG_ 344 CAN_SCAN_INDEX_2LSB_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_SCAN_INDEX_2LSB_57 "CAN_SCAN_INDEX_2LSB_57";
+BA_ "GenMsgSendType" BO_ 343 1;
+BA_ "GenMsgILSupport" BO_ 343 1;
+BA_ "GenMsgNrOfRepetition" BO_ 343 0;
+BA_ "GenMsgCycleTime" BO_ 343 0;
+BA_ "NetworkInitialization" BO_ 343 0;
+BA_ "GenMsgDelayTime" BO_ 343 0;
+BA_ "GenSigVtEn" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigVtName" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 "CAN_DET_SUPER_RES_TARGET_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_ND_TARGET_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_ND_TARGET_56 "CAN_DET_ND_TARGET_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 "CAN_DET_HOST_VEH_CLUTTER_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_VALID_LEVEL_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_VALID_LEVEL_56 "CAN_DET_VALID_LEVEL_56";
+BA_ "GenSigStartValue" SG_ 343 CAN_DET_AZIMUTH_56 0;
+BA_ "GenSigSendType" SG_ 343 CAN_DET_AZIMUTH_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_AZIMUTH_56 "CAN_DET_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_56 "CAN_DET_RANGE_56";
+BA_ "GenSigStartValue" SG_ 343 CAN_DET_RANGE_RATE_56 0;
+BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_RATE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_RATE_56 "CAN_DET_RANGE_RATE_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_AMPLITUDE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_AMPLITUDE_56 "CAN_DET_AMPLITUDE_56";
+BA_ "GenSigSendType" SG_ 343 CAN_SCAN_INDEX_2LSB_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_SCAN_INDEX_2LSB_56 "CAN_SCAN_INDEX_2LSB_56";
+BA_ "GenMsgSendType" BO_ 342 1;
+BA_ "GenMsgILSupport" BO_ 342 1;
+BA_ "GenMsgNrOfRepetition" BO_ 342 0;
+BA_ "GenMsgCycleTime" BO_ 342 0;
+BA_ "NetworkInitialization" BO_ 342 0;
+BA_ "GenMsgDelayTime" BO_ 342 0;
+BA_ "GenSigVtEn" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigVtName" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 "CAN_DET_SUPER_RES_TARGET_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_ND_TARGET_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_ND_TARGET_55 "CAN_DET_ND_TARGET_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 "CAN_DET_HOST_VEH_CLUTTER_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_VALID_LEVEL_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_VALID_LEVEL_55 "CAN_DET_VALID_LEVEL_55";
+BA_ "GenSigStartValue" SG_ 342 CAN_DET_AZIMUTH_55 0;
+BA_ "GenSigSendType" SG_ 342 CAN_DET_AZIMUTH_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_AZIMUTH_55 "CAN_DET_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_55 "CAN_DET_RANGE_55";
+BA_ "GenSigStartValue" SG_ 342 CAN_DET_RANGE_RATE_55 0;
+BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_RATE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_RATE_55 "CAN_DET_RANGE_RATE_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_AMPLITUDE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_AMPLITUDE_55 "CAN_DET_AMPLITUDE_55";
+BA_ "GenSigSendType" SG_ 342 CAN_SCAN_INDEX_2LSB_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_SCAN_INDEX_2LSB_55 "CAN_SCAN_INDEX_2LSB_55";
+BA_ "GenMsgSendType" BO_ 335 1;
+BA_ "GenMsgILSupport" BO_ 335 1;
+BA_ "GenMsgNrOfRepetition" BO_ 335 0;
+BA_ "GenMsgCycleTime" BO_ 335 0;
+BA_ "NetworkInitialization" BO_ 335 0;
+BA_ "GenMsgDelayTime" BO_ 335 0;
+BA_ "GenSigVtEn" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigVtName" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 "CAN_DET_SUPER_RES_TARGET_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_ND_TARGET_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_ND_TARGET_48 "CAN_DET_ND_TARGET_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 "CAN_DET_HOST_VEH_CLUTTER_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_VALID_LEVEL_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_VALID_LEVEL_48 "CAN_DET_VALID_LEVEL_48";
+BA_ "GenSigStartValue" SG_ 335 CAN_DET_AZIMUTH_48 0;
+BA_ "GenSigSendType" SG_ 335 CAN_DET_AZIMUTH_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_AZIMUTH_48 "CAN_DET_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_48 "CAN_DET_RANGE_48";
+BA_ "GenSigStartValue" SG_ 335 CAN_DET_RANGE_RATE_48 0;
+BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_RATE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_RATE_48 "CAN_DET_RANGE_RATE_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_AMPLITUDE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_AMPLITUDE_48 "CAN_DET_AMPLITUDE_48";
+BA_ "GenSigSendType" SG_ 335 CAN_SCAN_INDEX_2LSB_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_SCAN_INDEX_2LSB_48 "CAN_SCAN_INDEX_2LSB_48";
+BA_ "GenMsgSendType" BO_ 334 1;
+BA_ "GenMsgILSupport" BO_ 334 1;
+BA_ "GenMsgNrOfRepetition" BO_ 334 0;
+BA_ "GenMsgCycleTime" BO_ 334 0;
+BA_ "NetworkInitialization" BO_ 334 0;
+BA_ "GenMsgDelayTime" BO_ 334 0;
+BA_ "GenSigVtEn" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigVtName" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 "CAN_DET_SUPER_RES_TARGET_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_ND_TARGET_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_ND_TARGET_47 "CAN_DET_ND_TARGET_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 "CAN_DET_HOST_VEH_CLUTTER_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_VALID_LEVEL_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_VALID_LEVEL_47 "CAN_DET_VALID_LEVEL_47";
+BA_ "GenSigStartValue" SG_ 334 CAN_DET_AZIMUTH_47 0;
+BA_ "GenSigSendType" SG_ 334 CAN_DET_AZIMUTH_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_AZIMUTH_47 "CAN_DET_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_47 "CAN_DET_RANGE_47";
+BA_ "GenSigStartValue" SG_ 334 CAN_DET_RANGE_RATE_47 0;
+BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_RATE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_RATE_47 "CAN_DET_RANGE_RATE_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_AMPLITUDE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_AMPLITUDE_47 "CAN_DET_AMPLITUDE_47";
+BA_ "GenSigSendType" SG_ 334 CAN_SCAN_INDEX_2LSB_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_SCAN_INDEX_2LSB_47 "CAN_SCAN_INDEX_2LSB_47";
+BA_ "GenMsgSendType" BO_ 333 1;
+BA_ "GenMsgILSupport" BO_ 333 1;
+BA_ "GenMsgNrOfRepetition" BO_ 333 0;
+BA_ "GenMsgCycleTime" BO_ 333 0;
+BA_ "NetworkInitialization" BO_ 333 0;
+BA_ "GenMsgDelayTime" BO_ 333 0;
+BA_ "GenSigVtEn" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigVtName" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 "CAN_DET_SUPER_RES_TARGET_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_ND_TARGET_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_ND_TARGET_46 "CAN_DET_ND_TARGET_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 "CAN_DET_HOST_VEH_CLUTTER_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_VALID_LEVEL_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_VALID_LEVEL_46 "CAN_DET_VALID_LEVEL_46";
+BA_ "GenSigStartValue" SG_ 333 CAN_DET_AZIMUTH_46 0;
+BA_ "GenSigSendType" SG_ 333 CAN_DET_AZIMUTH_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_AZIMUTH_46 "CAN_DET_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_46 "CAN_DET_RANGE_46";
+BA_ "GenSigStartValue" SG_ 333 CAN_DET_RANGE_RATE_46 0;
+BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_RATE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_RATE_46 "CAN_DET_RANGE_RATE_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_AMPLITUDE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_AMPLITUDE_46 "CAN_DET_AMPLITUDE_46";
+BA_ "GenSigSendType" SG_ 333 CAN_SCAN_INDEX_2LSB_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_SCAN_INDEX_2LSB_46 "CAN_SCAN_INDEX_2LSB_46";
+BA_ "GenMsgSendType" BO_ 332 1;
+BA_ "GenMsgILSupport" BO_ 332 1;
+BA_ "GenMsgNrOfRepetition" BO_ 332 0;
+BA_ "GenMsgCycleTime" BO_ 332 0;
+BA_ "NetworkInitialization" BO_ 332 0;
+BA_ "GenMsgDelayTime" BO_ 332 0;
+BA_ "GenSigVtEn" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigVtName" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 "CAN_DET_SUPER_RES_TARGET_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_ND_TARGET_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_ND_TARGET_45 "CAN_DET_ND_TARGET_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 "CAN_DET_HOST_VEH_CLUTTER_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_VALID_LEVEL_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_VALID_LEVEL_45 "CAN_DET_VALID_LEVEL_45";
+BA_ "GenSigStartValue" SG_ 332 CAN_DET_AZIMUTH_45 0;
+BA_ "GenSigSendType" SG_ 332 CAN_DET_AZIMUTH_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_AZIMUTH_45 "CAN_DET_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_45 "CAN_DET_RANGE_45";
+BA_ "GenSigStartValue" SG_ 332 CAN_DET_RANGE_RATE_45 0;
+BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_RATE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_RATE_45 "CAN_DET_RANGE_RATE_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_AMPLITUDE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_AMPLITUDE_45 "CAN_DET_AMPLITUDE_45";
+BA_ "GenSigSendType" SG_ 332 CAN_SCAN_INDEX_2LSB_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_SCAN_INDEX_2LSB_45 "CAN_SCAN_INDEX_2LSB_45";
+BA_ "GenMsgSendType" BO_ 331 1;
+BA_ "GenMsgILSupport" BO_ 331 1;
+BA_ "GenMsgNrOfRepetition" BO_ 331 0;
+BA_ "GenMsgCycleTime" BO_ 331 0;
+BA_ "NetworkInitialization" BO_ 331 0;
+BA_ "GenMsgDelayTime" BO_ 331 0;
+BA_ "GenSigVtEn" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigVtName" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 "CAN_DET_SUPER_RES_TARGET_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_ND_TARGET_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_ND_TARGET_44 "CAN_DET_ND_TARGET_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 "CAN_DET_HOST_VEH_CLUTTER_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_VALID_LEVEL_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_VALID_LEVEL_44 "CAN_DET_VALID_LEVEL_44";
+BA_ "GenSigStartValue" SG_ 331 CAN_DET_AZIMUTH_44 0;
+BA_ "GenSigSendType" SG_ 331 CAN_DET_AZIMUTH_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_AZIMUTH_44 "CAN_DET_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_44 "CAN_DET_RANGE_44";
+BA_ "GenSigStartValue" SG_ 331 CAN_DET_RANGE_RATE_44 0;
+BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_RATE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_RATE_44 "CAN_DET_RANGE_RATE_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_AMPLITUDE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_AMPLITUDE_44 "CAN_DET_AMPLITUDE_44";
+BA_ "GenSigSendType" SG_ 331 CAN_SCAN_INDEX_2LSB_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_SCAN_INDEX_2LSB_44 "CAN_SCAN_INDEX_2LSB_44";
+BA_ "GenMsgSendType" BO_ 330 1;
+BA_ "GenMsgILSupport" BO_ 330 1;
+BA_ "GenMsgNrOfRepetition" BO_ 330 0;
+BA_ "GenMsgCycleTime" BO_ 330 0;
+BA_ "NetworkInitialization" BO_ 330 0;
+BA_ "GenMsgDelayTime" BO_ 330 0;
+BA_ "GenSigVtEn" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigVtName" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 "CAN_DET_SUPER_RES_TARGET_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_ND_TARGET_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_ND_TARGET_43 "CAN_DET_ND_TARGET_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 "CAN_DET_HOST_VEH_CLUTTER_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_VALID_LEVEL_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_VALID_LEVEL_43 "CAN_DET_VALID_LEVEL_43";
+BA_ "GenSigStartValue" SG_ 330 CAN_DET_AZIMUTH_43 0;
+BA_ "GenSigSendType" SG_ 330 CAN_DET_AZIMUTH_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_AZIMUTH_43 "CAN_DET_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_43 "CAN_DET_RANGE_43";
+BA_ "GenSigStartValue" SG_ 330 CAN_DET_RANGE_RATE_43 0;
+BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_RATE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_RATE_43 "CAN_DET_RANGE_RATE_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_AMPLITUDE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_AMPLITUDE_43 "CAN_DET_AMPLITUDE_43";
+BA_ "GenSigSendType" SG_ 330 CAN_SCAN_INDEX_2LSB_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_SCAN_INDEX_2LSB_43 "CAN_SCAN_INDEX_2LSB_43";
+BA_ "GenMsgSendType" BO_ 329 1;
+BA_ "GenMsgILSupport" BO_ 329 1;
+BA_ "GenMsgNrOfRepetition" BO_ 329 0;
+BA_ "GenMsgCycleTime" BO_ 329 0;
+BA_ "NetworkInitialization" BO_ 329 0;
+BA_ "GenMsgDelayTime" BO_ 329 0;
+BA_ "GenSigVtEn" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigVtName" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 "CAN_DET_SUPER_RES_TARGET_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_ND_TARGET_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_ND_TARGET_42 "CAN_DET_ND_TARGET_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 "CAN_DET_HOST_VEH_CLUTTER_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_VALID_LEVEL_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_VALID_LEVEL_42 "CAN_DET_VALID_LEVEL_42";
+BA_ "GenSigStartValue" SG_ 329 CAN_DET_AZIMUTH_42 0;
+BA_ "GenSigSendType" SG_ 329 CAN_DET_AZIMUTH_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_AZIMUTH_42 "CAN_DET_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_42 "CAN_DET_RANGE_42";
+BA_ "GenSigStartValue" SG_ 329 CAN_DET_RANGE_RATE_42 0;
+BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_RATE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_RATE_42 "CAN_DET_RANGE_RATE_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_AMPLITUDE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_AMPLITUDE_42 "CAN_DET_AMPLITUDE_42";
+BA_ "GenSigSendType" SG_ 329 CAN_SCAN_INDEX_2LSB_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_SCAN_INDEX_2LSB_42 "CAN_SCAN_INDEX_2LSB_42";
+BA_ "GenMsgSendType" BO_ 328 1;
+BA_ "GenMsgILSupport" BO_ 328 1;
+BA_ "GenMsgNrOfRepetition" BO_ 328 0;
+BA_ "GenMsgCycleTime" BO_ 328 0;
+BA_ "NetworkInitialization" BO_ 328 0;
+BA_ "GenMsgDelayTime" BO_ 328 0;
+BA_ "GenSigVtEn" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigVtName" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 "CAN_DET_SUPER_RES_TARGET_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_ND_TARGET_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_ND_TARGET_41 "CAN_DET_ND_TARGET_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 "CAN_DET_HOST_VEH_CLUTTER_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_VALID_LEVEL_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_VALID_LEVEL_41 "CAN_DET_VALID_LEVEL_41";
+BA_ "GenSigStartValue" SG_ 328 CAN_DET_AZIMUTH_41 0;
+BA_ "GenSigSendType" SG_ 328 CAN_DET_AZIMUTH_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_AZIMUTH_41 "CAN_DET_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_41 "CAN_DET_RANGE_41";
+BA_ "GenSigStartValue" SG_ 328 CAN_DET_RANGE_RATE_41 0;
+BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_RATE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_RATE_41 "CAN_DET_RANGE_RATE_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_AMPLITUDE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_AMPLITUDE_41 "CAN_DET_AMPLITUDE_41";
+BA_ "GenSigSendType" SG_ 328 CAN_SCAN_INDEX_2LSB_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_SCAN_INDEX_2LSB_41 "CAN_SCAN_INDEX_2LSB_41";
+BA_ "GenMsgSendType" BO_ 327 1;
+BA_ "GenMsgILSupport" BO_ 327 1;
+BA_ "GenMsgNrOfRepetition" BO_ 327 0;
+BA_ "GenMsgCycleTime" BO_ 327 0;
+BA_ "NetworkInitialization" BO_ 327 0;
+BA_ "GenMsgDelayTime" BO_ 327 0;
+BA_ "GenSigVtEn" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigVtName" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 "CAN_DET_SUPER_RES_TARGET_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_ND_TARGET_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_ND_TARGET_40 "CAN_DET_ND_TARGET_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 "CAN_DET_HOST_VEH_CLUTTER_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_VALID_LEVEL_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_VALID_LEVEL_40 "CAN_DET_VALID_LEVEL_40";
+BA_ "GenSigStartValue" SG_ 327 CAN_DET_AZIMUTH_40 0;
+BA_ "GenSigSendType" SG_ 327 CAN_DET_AZIMUTH_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_AZIMUTH_40 "CAN_DET_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_40 "CAN_DET_RANGE_40";
+BA_ "GenSigStartValue" SG_ 327 CAN_DET_RANGE_RATE_40 0;
+BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_RATE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_RATE_40 "CAN_DET_RANGE_RATE_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_AMPLITUDE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_AMPLITUDE_40 "CAN_DET_AMPLITUDE_40";
+BA_ "GenSigSendType" SG_ 327 CAN_SCAN_INDEX_2LSB_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_SCAN_INDEX_2LSB_40 "CAN_SCAN_INDEX_2LSB_40";
+BA_ "GenMsgSendType" BO_ 325 1;
+BA_ "GenMsgILSupport" BO_ 325 1;
+BA_ "GenMsgNrOfRepetition" BO_ 325 0;
+BA_ "GenMsgCycleTime" BO_ 325 0;
+BA_ "NetworkInitialization" BO_ 325 0;
+BA_ "GenMsgDelayTime" BO_ 325 0;
+BA_ "GenSigVtEn" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigVtName" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 "CAN_DET_SUPER_RES_TARGET_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_ND_TARGET_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_ND_TARGET_38 "CAN_DET_ND_TARGET_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 "CAN_DET_HOST_VEH_CLUTTER_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_VALID_LEVEL_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_VALID_LEVEL_38 "CAN_DET_VALID_LEVEL_38";
+BA_ "GenSigStartValue" SG_ 325 CAN_DET_AZIMUTH_38 0;
+BA_ "GenSigSendType" SG_ 325 CAN_DET_AZIMUTH_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_AZIMUTH_38 "CAN_DET_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_38 "CAN_DET_RANGE_38";
+BA_ "GenSigStartValue" SG_ 325 CAN_DET_RANGE_RATE_38 0;
+BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_RATE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_RATE_38 "CAN_DET_RANGE_RATE_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_AMPLITUDE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_AMPLITUDE_38 "CAN_DET_AMPLITUDE_38";
+BA_ "GenSigSendType" SG_ 325 CAN_SCAN_INDEX_2LSB_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_SCAN_INDEX_2LSB_38 "CAN_SCAN_INDEX_2LSB_38";
+BA_ "GenMsgSendType" BO_ 324 1;
+BA_ "GenMsgILSupport" BO_ 324 1;
+BA_ "GenMsgNrOfRepetition" BO_ 324 0;
+BA_ "GenMsgCycleTime" BO_ 324 0;
+BA_ "NetworkInitialization" BO_ 324 0;
+BA_ "GenMsgDelayTime" BO_ 324 0;
+BA_ "GenSigVtEn" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigVtName" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 "CAN_DET_SUPER_RES_TARGET_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_ND_TARGET_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_ND_TARGET_37 "CAN_DET_ND_TARGET_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 "CAN_DET_HOST_VEH_CLUTTER_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_VALID_LEVEL_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_VALID_LEVEL_37 "CAN_DET_VALID_LEVEL_37";
+BA_ "GenSigStartValue" SG_ 324 CAN_DET_AZIMUTH_37 0;
+BA_ "GenSigSendType" SG_ 324 CAN_DET_AZIMUTH_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_AZIMUTH_37 "CAN_DET_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_37 "CAN_DET_RANGE_37";
+BA_ "GenSigStartValue" SG_ 324 CAN_DET_RANGE_RATE_37 0;
+BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_RATE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_RATE_37 "CAN_DET_RANGE_RATE_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_AMPLITUDE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_AMPLITUDE_37 "CAN_DET_AMPLITUDE_37";
+BA_ "GenSigSendType" SG_ 324 CAN_SCAN_INDEX_2LSB_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_SCAN_INDEX_2LSB_37 "CAN_SCAN_INDEX_2LSB_37";
+BA_ "GenMsgSendType" BO_ 323 1;
+BA_ "GenMsgILSupport" BO_ 323 1;
+BA_ "GenMsgNrOfRepetition" BO_ 323 0;
+BA_ "GenMsgCycleTime" BO_ 323 0;
+BA_ "NetworkInitialization" BO_ 323 0;
+BA_ "GenMsgDelayTime" BO_ 323 0;
+BA_ "GenSigVtEn" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigVtName" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 "CAN_DET_SUPER_RES_TARGET_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_ND_TARGET_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_ND_TARGET_36 "CAN_DET_ND_TARGET_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 "CAN_DET_HOST_VEH_CLUTTER_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_VALID_LEVEL_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_VALID_LEVEL_36 "CAN_DET_VALID_LEVEL_36";
+BA_ "GenSigStartValue" SG_ 323 CAN_DET_AZIMUTH_36 0;
+BA_ "GenSigSendType" SG_ 323 CAN_DET_AZIMUTH_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_AZIMUTH_36 "CAN_DET_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_36 "CAN_DET_RANGE_36";
+BA_ "GenSigStartValue" SG_ 323 CAN_DET_RANGE_RATE_36 0;
+BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_RATE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_RATE_36 "CAN_DET_RANGE_RATE_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_AMPLITUDE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_AMPLITUDE_36 "CAN_DET_AMPLITUDE_36";
+BA_ "GenSigSendType" SG_ 323 CAN_SCAN_INDEX_2LSB_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_SCAN_INDEX_2LSB_36 "CAN_SCAN_INDEX_2LSB_36";
+BA_ "GenMsgSendType" BO_ 322 1;
+BA_ "GenMsgILSupport" BO_ 322 1;
+BA_ "GenMsgNrOfRepetition" BO_ 322 0;
+BA_ "GenMsgCycleTime" BO_ 322 0;
+BA_ "NetworkInitialization" BO_ 322 0;
+BA_ "GenMsgDelayTime" BO_ 322 0;
+BA_ "GenSigVtEn" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigVtName" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 "CAN_DET_SUPER_RES_TARGET_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_ND_TARGET_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_ND_TARGET_35 "CAN_DET_ND_TARGET_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 "CAN_DET_HOST_VEH_CLUTTER_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_VALID_LEVEL_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_VALID_LEVEL_35 "CAN_DET_VALID_LEVEL_35";
+BA_ "GenSigStartValue" SG_ 322 CAN_DET_AZIMUTH_35 0;
+BA_ "GenSigSendType" SG_ 322 CAN_DET_AZIMUTH_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_AZIMUTH_35 "CAN_DET_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_35 "CAN_DET_RANGE_35";
+BA_ "GenSigStartValue" SG_ 322 CAN_DET_RANGE_RATE_35 0;
+BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_RATE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_RATE_35 "CAN_DET_RANGE_RATE_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_AMPLITUDE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_AMPLITUDE_35 "CAN_DET_AMPLITUDE_35";
+BA_ "GenSigSendType" SG_ 322 CAN_SCAN_INDEX_2LSB_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_SCAN_INDEX_2LSB_35 "CAN_SCAN_INDEX_2LSB_35";
+BA_ "GenMsgSendType" BO_ 321 1;
+BA_ "GenMsgILSupport" BO_ 321 1;
+BA_ "GenMsgNrOfRepetition" BO_ 321 0;
+BA_ "GenMsgCycleTime" BO_ 321 0;
+BA_ "NetworkInitialization" BO_ 321 0;
+BA_ "GenMsgDelayTime" BO_ 321 0;
+BA_ "GenSigVtEn" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigVtName" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 "CAN_DET_SUPER_RES_TARGET_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_ND_TARGET_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_ND_TARGET_34 "CAN_DET_ND_TARGET_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 "CAN_DET_HOST_VEH_CLUTTER_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_VALID_LEVEL_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_VALID_LEVEL_34 "CAN_DET_VALID_LEVEL_34";
+BA_ "GenSigStartValue" SG_ 321 CAN_DET_AZIMUTH_34 0;
+BA_ "GenSigSendType" SG_ 321 CAN_DET_AZIMUTH_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_AZIMUTH_34 "CAN_DET_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_34 "CAN_DET_RANGE_34";
+BA_ "GenSigStartValue" SG_ 321 CAN_DET_RANGE_RATE_34 0;
+BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_RATE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_RATE_34 "CAN_DET_RANGE_RATE_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_AMPLITUDE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_AMPLITUDE_34 "CAN_DET_AMPLITUDE_34";
+BA_ "GenSigSendType" SG_ 321 CAN_SCAN_INDEX_2LSB_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_SCAN_INDEX_2LSB_34 "CAN_SCAN_INDEX_2LSB_34";
+BA_ "GenMsgSendType" BO_ 320 1;
+BA_ "GenMsgILSupport" BO_ 320 1;
+BA_ "GenMsgNrOfRepetition" BO_ 320 0;
+BA_ "GenMsgCycleTime" BO_ 320 0;
+BA_ "NetworkInitialization" BO_ 320 0;
+BA_ "GenMsgDelayTime" BO_ 320 0;
+BA_ "GenSigVtEn" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigVtName" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 "CAN_DET_SUPER_RES_TARGET_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_ND_TARGET_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_ND_TARGET_33 "CAN_DET_ND_TARGET_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 "CAN_DET_HOST_VEH_CLUTTER_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_VALID_LEVEL_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_VALID_LEVEL_33 "CAN_DET_VALID_LEVEL_33";
+BA_ "GenSigStartValue" SG_ 320 CAN_DET_AZIMUTH_33 0;
+BA_ "GenSigSendType" SG_ 320 CAN_DET_AZIMUTH_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_AZIMUTH_33 "CAN_DET_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_33 "CAN_DET_RANGE_33";
+BA_ "GenSigStartValue" SG_ 320 CAN_DET_RANGE_RATE_33 0;
+BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_RATE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_RATE_33 "CAN_DET_RANGE_RATE_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_AMPLITUDE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_AMPLITUDE_33 "CAN_DET_AMPLITUDE_33";
+BA_ "GenSigSendType" SG_ 320 CAN_SCAN_INDEX_2LSB_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_SCAN_INDEX_2LSB_33 "CAN_SCAN_INDEX_2LSB_33";
+BA_ "GenMsgSendType" BO_ 319 1;
+BA_ "GenMsgILSupport" BO_ 319 1;
+BA_ "GenMsgNrOfRepetition" BO_ 319 0;
+BA_ "GenMsgCycleTime" BO_ 319 0;
+BA_ "NetworkInitialization" BO_ 319 0;
+BA_ "GenMsgDelayTime" BO_ 319 0;
+BA_ "GenSigVtEn" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigVtName" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 "CAN_DET_SUPER_RES_TARGET_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_ND_TARGET_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_ND_TARGET_32 "CAN_DET_ND_TARGET_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 "CAN_DET_HOST_VEH_CLUTTER_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_VALID_LEVEL_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_VALID_LEVEL_32 "CAN_DET_VALID_LEVEL_32";
+BA_ "GenSigStartValue" SG_ 319 CAN_DET_AZIMUTH_32 0;
+BA_ "GenSigSendType" SG_ 319 CAN_DET_AZIMUTH_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_AZIMUTH_32 "CAN_DET_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_32 "CAN_DET_RANGE_32";
+BA_ "GenSigStartValue" SG_ 319 CAN_DET_RANGE_RATE_32 0;
+BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_RATE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_RATE_32 "CAN_DET_RANGE_RATE_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_AMPLITUDE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_AMPLITUDE_32 "CAN_DET_AMPLITUDE_32";
+BA_ "GenSigSendType" SG_ 319 CAN_SCAN_INDEX_2LSB_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_SCAN_INDEX_2LSB_32 "CAN_SCAN_INDEX_2LSB_32";
+BA_ "GenMsgSendType" BO_ 318 1;
+BA_ "GenMsgILSupport" BO_ 318 1;
+BA_ "GenMsgNrOfRepetition" BO_ 318 0;
+BA_ "GenMsgCycleTime" BO_ 318 0;
+BA_ "NetworkInitialization" BO_ 318 0;
+BA_ "GenMsgDelayTime" BO_ 318 0;
+BA_ "GenSigVtEn" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigVtName" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 "CAN_DET_SUPER_RES_TARGET_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_ND_TARGET_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_ND_TARGET_31 "CAN_DET_ND_TARGET_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 "CAN_DET_HOST_VEH_CLUTTER_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_VALID_LEVEL_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_VALID_LEVEL_31 "CAN_DET_VALID_LEVEL_31";
+BA_ "GenSigStartValue" SG_ 318 CAN_DET_AZIMUTH_31 0;
+BA_ "GenSigSendType" SG_ 318 CAN_DET_AZIMUTH_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_AZIMUTH_31 "CAN_DET_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_31 "CAN_DET_RANGE_31";
+BA_ "GenSigStartValue" SG_ 318 CAN_DET_RANGE_RATE_31 0;
+BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_RATE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_RATE_31 "CAN_DET_RANGE_RATE_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_AMPLITUDE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_AMPLITUDE_31 "CAN_DET_AMPLITUDE_31";
+BA_ "GenSigSendType" SG_ 318 CAN_SCAN_INDEX_2LSB_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_SCAN_INDEX_2LSB_31 "CAN_SCAN_INDEX_2LSB_31";
+BA_ "GenMsgSendType" BO_ 317 1;
+BA_ "GenMsgILSupport" BO_ 317 1;
+BA_ "GenMsgNrOfRepetition" BO_ 317 0;
+BA_ "GenMsgCycleTime" BO_ 317 0;
+BA_ "NetworkInitialization" BO_ 317 0;
+BA_ "GenMsgDelayTime" BO_ 317 0;
+BA_ "GenSigVtEn" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigVtName" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 "CAN_DET_SUPER_RES_TARGET_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_ND_TARGET_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_ND_TARGET_30 "CAN_DET_ND_TARGET_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 "CAN_DET_HOST_VEH_CLUTTER_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_VALID_LEVEL_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_VALID_LEVEL_30 "CAN_DET_VALID_LEVEL_30";
+BA_ "GenSigStartValue" SG_ 317 CAN_DET_AZIMUTH_30 0;
+BA_ "GenSigSendType" SG_ 317 CAN_DET_AZIMUTH_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_AZIMUTH_30 "CAN_DET_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_30 "CAN_DET_RANGE_30";
+BA_ "GenSigStartValue" SG_ 317 CAN_DET_RANGE_RATE_30 0;
+BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_RATE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_RATE_30 "CAN_DET_RANGE_RATE_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_AMPLITUDE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_AMPLITUDE_30 "CAN_DET_AMPLITUDE_30";
+BA_ "GenSigSendType" SG_ 317 CAN_SCAN_INDEX_2LSB_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_SCAN_INDEX_2LSB_30 "CAN_SCAN_INDEX_2LSB_30";
+BA_ "GenMsgSendType" BO_ 316 1;
+BA_ "GenMsgILSupport" BO_ 316 1;
+BA_ "GenMsgNrOfRepetition" BO_ 316 0;
+BA_ "GenMsgCycleTime" BO_ 316 0;
+BA_ "NetworkInitialization" BO_ 316 0;
+BA_ "GenMsgDelayTime" BO_ 316 0;
+BA_ "GenSigVtEn" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigVtName" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 "CAN_DET_SUPER_RES_TARGET_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_ND_TARGET_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_ND_TARGET_29 "CAN_DET_ND_TARGET_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 "CAN_DET_HOST_VEH_CLUTTER_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_VALID_LEVEL_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_VALID_LEVEL_29 "CAN_DET_VALID_LEVEL_29";
+BA_ "GenSigStartValue" SG_ 316 CAN_DET_AZIMUTH_29 0;
+BA_ "GenSigSendType" SG_ 316 CAN_DET_AZIMUTH_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_AZIMUTH_29 "CAN_DET_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_29 "CAN_DET_RANGE_29";
+BA_ "GenSigStartValue" SG_ 316 CAN_DET_RANGE_RATE_29 0;
+BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_RATE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_RATE_29 "CAN_DET_RANGE_RATE_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_AMPLITUDE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_AMPLITUDE_29 "CAN_DET_AMPLITUDE_29";
+BA_ "GenSigSendType" SG_ 316 CAN_SCAN_INDEX_2LSB_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_SCAN_INDEX_2LSB_29 "CAN_SCAN_INDEX_2LSB_29";
+BA_ "GenMsgSendType" BO_ 314 1;
+BA_ "GenMsgILSupport" BO_ 314 1;
+BA_ "GenMsgNrOfRepetition" BO_ 314 0;
+BA_ "GenMsgCycleTime" BO_ 314 0;
+BA_ "NetworkInitialization" BO_ 314 0;
+BA_ "GenMsgDelayTime" BO_ 314 0;
+BA_ "GenSigVtEn" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigVtName" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 "CAN_DET_SUPER_RES_TARGET_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_ND_TARGET_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_ND_TARGET_27 "CAN_DET_ND_TARGET_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 "CAN_DET_HOST_VEH_CLUTTER_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_VALID_LEVEL_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_VALID_LEVEL_27 "CAN_DET_VALID_LEVEL_27";
+BA_ "GenSigStartValue" SG_ 314 CAN_DET_AZIMUTH_27 0;
+BA_ "GenSigSendType" SG_ 314 CAN_DET_AZIMUTH_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_AZIMUTH_27 "CAN_DET_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_27 "CAN_DET_RANGE_27";
+BA_ "GenSigStartValue" SG_ 314 CAN_DET_RANGE_RATE_27 0;
+BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_RATE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_RATE_27 "CAN_DET_RANGE_RATE_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_AMPLITUDE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_AMPLITUDE_27 "CAN_DET_AMPLITUDE_27";
+BA_ "GenSigSendType" SG_ 314 CAN_SCAN_INDEX_2LSB_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_SCAN_INDEX_2LSB_27 "CAN_SCAN_INDEX_2LSB_27";
+BA_ "GenMsgSendType" BO_ 313 1;
+BA_ "GenMsgILSupport" BO_ 313 1;
+BA_ "GenMsgNrOfRepetition" BO_ 313 0;
+BA_ "GenMsgCycleTime" BO_ 313 0;
+BA_ "NetworkInitialization" BO_ 313 0;
+BA_ "GenMsgDelayTime" BO_ 313 0;
+BA_ "GenSigVtEn" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigVtName" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 "CAN_DET_SUPER_RES_TARGET_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_ND_TARGET_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_ND_TARGET_26 "CAN_DET_ND_TARGET_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 "CAN_DET_HOST_VEH_CLUTTER_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_VALID_LEVEL_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_VALID_LEVEL_26 "CAN_DET_VALID_LEVEL_26";
+BA_ "GenSigStartValue" SG_ 313 CAN_DET_AZIMUTH_26 0;
+BA_ "GenSigSendType" SG_ 313 CAN_DET_AZIMUTH_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_AZIMUTH_26 "CAN_DET_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_26 "CAN_DET_RANGE_26";
+BA_ "GenSigStartValue" SG_ 313 CAN_DET_RANGE_RATE_26 0;
+BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_RATE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_RATE_26 "CAN_DET_RANGE_RATE_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_AMPLITUDE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_AMPLITUDE_26 "CAN_DET_AMPLITUDE_26";
+BA_ "GenSigSendType" SG_ 313 CAN_SCAN_INDEX_2LSB_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_SCAN_INDEX_2LSB_26 "CAN_SCAN_INDEX_2LSB_26";
+BA_ "GenMsgSendType" BO_ 312 1;
+BA_ "GenMsgILSupport" BO_ 312 1;
+BA_ "GenMsgNrOfRepetition" BO_ 312 0;
+BA_ "GenMsgCycleTime" BO_ 312 0;
+BA_ "NetworkInitialization" BO_ 312 0;
+BA_ "GenMsgDelayTime" BO_ 312 0;
+BA_ "GenSigVtEn" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigVtName" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 "CAN_DET_SUPER_RES_TARGET_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_ND_TARGET_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_ND_TARGET_25 "CAN_DET_ND_TARGET_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 "CAN_DET_HOST_VEH_CLUTTER_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_VALID_LEVEL_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_VALID_LEVEL_25 "CAN_DET_VALID_LEVEL_25";
+BA_ "GenSigStartValue" SG_ 312 CAN_DET_AZIMUTH_25 0;
+BA_ "GenSigSendType" SG_ 312 CAN_DET_AZIMUTH_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_AZIMUTH_25 "CAN_DET_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_25 "CAN_DET_RANGE_25";
+BA_ "GenSigStartValue" SG_ 312 CAN_DET_RANGE_RATE_25 0;
+BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_RATE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_RATE_25 "CAN_DET_RANGE_RATE_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_AMPLITUDE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_AMPLITUDE_25 "CAN_DET_AMPLITUDE_25";
+BA_ "GenSigSendType" SG_ 312 CAN_SCAN_INDEX_2LSB_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_SCAN_INDEX_2LSB_25 "CAN_SCAN_INDEX_2LSB_25";
+BA_ "GenMsgSendType" BO_ 311 1;
+BA_ "GenMsgILSupport" BO_ 311 1;
+BA_ "GenMsgNrOfRepetition" BO_ 311 0;
+BA_ "GenMsgCycleTime" BO_ 311 0;
+BA_ "NetworkInitialization" BO_ 311 0;
+BA_ "GenMsgDelayTime" BO_ 311 0;
+BA_ "GenSigVtEn" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigVtName" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 "CAN_DET_SUPER_RES_TARGET_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_ND_TARGET_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_ND_TARGET_24 "CAN_DET_ND_TARGET_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 "CAN_DET_HOST_VEH_CLUTTER_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_VALID_LEVEL_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_VALID_LEVEL_24 "CAN_DET_VALID_LEVEL_24";
+BA_ "GenSigStartValue" SG_ 311 CAN_DET_AZIMUTH_24 0;
+BA_ "GenSigSendType" SG_ 311 CAN_DET_AZIMUTH_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_AZIMUTH_24 "CAN_DET_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_24 "CAN_DET_RANGE_24";
+BA_ "GenSigStartValue" SG_ 311 CAN_DET_RANGE_RATE_24 0;
+BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_RATE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_RATE_24 "CAN_DET_RANGE_RATE_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_AMPLITUDE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_AMPLITUDE_24 "CAN_DET_AMPLITUDE_24";
+BA_ "GenSigSendType" SG_ 311 CAN_SCAN_INDEX_2LSB_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_SCAN_INDEX_2LSB_24 "CAN_SCAN_INDEX_2LSB_24";
+BA_ "GenMsgSendType" BO_ 310 1;
+BA_ "GenMsgILSupport" BO_ 310 1;
+BA_ "GenMsgNrOfRepetition" BO_ 310 0;
+BA_ "GenMsgCycleTime" BO_ 310 0;
+BA_ "NetworkInitialization" BO_ 310 0;
+BA_ "GenMsgDelayTime" BO_ 310 0;
+BA_ "GenSigVtEn" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigVtName" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 "CAN_DET_SUPER_RES_TARGET_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_ND_TARGET_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_ND_TARGET_23 "CAN_DET_ND_TARGET_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 "CAN_DET_HOST_VEH_CLUTTER_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_VALID_LEVEL_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_VALID_LEVEL_23 "CAN_DET_VALID_LEVEL_23";
+BA_ "GenSigStartValue" SG_ 310 CAN_DET_AZIMUTH_23 0;
+BA_ "GenSigSendType" SG_ 310 CAN_DET_AZIMUTH_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_AZIMUTH_23 "CAN_DET_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_23 "CAN_DET_RANGE_23";
+BA_ "GenSigStartValue" SG_ 310 CAN_DET_RANGE_RATE_23 0;
+BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_RATE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_RATE_23 "CAN_DET_RANGE_RATE_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_AMPLITUDE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_AMPLITUDE_23 "CAN_DET_AMPLITUDE_23";
+BA_ "GenSigSendType" SG_ 310 CAN_SCAN_INDEX_2LSB_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_SCAN_INDEX_2LSB_23 "CAN_SCAN_INDEX_2LSB_23";
+BA_ "GenMsgSendType" BO_ 309 1;
+BA_ "GenMsgILSupport" BO_ 309 1;
+BA_ "GenMsgNrOfRepetition" BO_ 309 0;
+BA_ "GenMsgCycleTime" BO_ 309 0;
+BA_ "NetworkInitialization" BO_ 309 0;
+BA_ "GenMsgDelayTime" BO_ 309 0;
+BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 "CAN_DET_CONFID_AZIMUTH_22";
+BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 "CAN_DET_CONFID_AZIMUTH_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 "CAN_DET_CONFID_AZIMUTH_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22 "CAN_DET_SUPER_RES_TARGET_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22 "CAN_DET_ND_TARGET_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22 "CAN_DET_HOST_VEH_CLUTTER_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22 "CAN_DET_VALID_LEVEL_22";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22 "CAN_DET_AZIMUTH_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22 "CAN_DET_RANGE_22";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22 "CAN_DET_RANGE_RATE_22";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22 "CAN_DET_AMPLITUDE_22";
+BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22 0;
+BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22 "CAN_SCAN_INDEX_2LSB_22";
+BA_ "GenMsgSendType" BO_ 308 1;
+BA_ "GenMsgILSupport" BO_ 308 1;
+BA_ "GenMsgNrOfRepetition" BO_ 308 0;
+BA_ "GenMsgCycleTime" BO_ 308 0;
+BA_ "NetworkInitialization" BO_ 308 0;
+BA_ "GenMsgDelayTime" BO_ 308 0;
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 "CAN_DET_CONFID_AZIMUTH_21";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 "CAN_DET_CONFID_AZIMUTH_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 "CAN_DET_CONFID_AZIMUTH_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21 "CAN_DET_SUPER_RES_TARGET_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21 "CAN_DET_ND_TARGET_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21 "CAN_DET_HOST_VEH_CLUTTER_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21 "CAN_DET_VALID_LEVEL_21";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21 "CAN_DET_AZIMUTH_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21 "CAN_DET_RANGE_21";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21 "CAN_DET_RANGE_RATE_21";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21 "CAN_DET_AMPLITUDE_21";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21 "CAN_SCAN_INDEX_2LSB_21";
+BA_ "GenMsgSendType" BO_ 307 1;
+BA_ "GenMsgILSupport" BO_ 307 1;
+BA_ "GenMsgNrOfRepetition" BO_ 307 0;
+BA_ "GenMsgCycleTime" BO_ 307 0;
+BA_ "NetworkInitialization" BO_ 307 0;
+BA_ "GenMsgDelayTime" BO_ 307 0;
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 "CAN_DET_CONFID_AZIMUTH_20";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 "CAN_DET_CONFID_AZIMUTH_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 "CAN_DET_CONFID_AZIMUTH_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20 "CAN_DET_SUPER_RES_TARGET_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20 "CAN_DET_ND_TARGET_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20 "CAN_DET_HOST_VEH_CLUTTER_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20 "CAN_DET_VALID_LEVEL_20";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20 "CAN_DET_AZIMUTH_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20 "CAN_DET_RANGE_20";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20 "CAN_DET_RANGE_RATE_20";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20 "CAN_DET_AMPLITUDE_20";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20 "CAN_SCAN_INDEX_2LSB_20";
+BA_ "GenMsgSendType" BO_ 306 1;
+BA_ "GenMsgILSupport" BO_ 306 1;
+BA_ "GenMsgNrOfRepetition" BO_ 306 0;
+BA_ "GenMsgCycleTime" BO_ 306 0;
+BA_ "NetworkInitialization" BO_ 306 0;
+BA_ "GenMsgDelayTime" BO_ 306 0;
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 "CAN_DET_CONFID_AZIMUTH_19";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 "CAN_DET_CONFID_AZIMUTH_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 "CAN_DET_CONFID_AZIMUTH_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19 "CAN_DET_SUPER_RES_TARGET_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19 "CAN_DET_ND_TARGET_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19 "CAN_DET_HOST_VEH_CLUTTER_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19 "CAN_DET_VALID_LEVEL_19";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19 "CAN_DET_AZIMUTH_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19 "CAN_DET_RANGE_19";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19 "CAN_DET_RANGE_RATE_19";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19 "CAN_DET_AMPLITUDE_19";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19 "CAN_SCAN_INDEX_2LSB_19";
+BA_ "GenMsgSendType" BO_ 305 1;
+BA_ "GenMsgILSupport" BO_ 305 1;
+BA_ "GenMsgNrOfRepetition" BO_ 305 0;
+BA_ "GenMsgCycleTime" BO_ 305 0;
+BA_ "NetworkInitialization" BO_ 305 0;
+BA_ "GenMsgDelayTime" BO_ 305 0;
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 "CAN_DET_CONFID_AZIMUTH_18";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 "CAN_DET_CONFID_AZIMUTH_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 "CAN_DET_CONFID_AZIMUTH_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18 "CAN_DET_SUPER_RES_TARGET_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18 "CAN_DET_ND_TARGET_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18 "CAN_DET_HOST_VEH_CLUTTER_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18 "CAN_DET_VALID_LEVEL_18";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18 "CAN_DET_AZIMUTH_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18 "CAN_DET_RANGE_18";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18 "CAN_DET_RANGE_RATE_18";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18 "CAN_DET_AMPLITUDE_18";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18 "CAN_SCAN_INDEX_2LSB_18";
+BA_ "GenMsgSendType" BO_ 341 1;
+BA_ "GenMsgILSupport" BO_ 341 1;
+BA_ "GenMsgNrOfRepetition" BO_ 341 0;
+BA_ "GenMsgCycleTime" BO_ 341 0;
+BA_ "NetworkInitialization" BO_ 341 0;
+BA_ "GenMsgDelayTime" BO_ 341 0;
+BA_ "GenSigVtEn" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigVtName" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 "CAN_DET_SUPER_RES_TARGET_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_ND_TARGET_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_ND_TARGET_54 "CAN_DET_ND_TARGET_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 "CAN_DET_HOST_VEH_CLUTTER_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_VALID_LEVEL_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_VALID_LEVEL_54 "CAN_DET_VALID_LEVEL_54";
+BA_ "GenSigStartValue" SG_ 341 CAN_DET_AZIMUTH_54 0;
+BA_ "GenSigSendType" SG_ 341 CAN_DET_AZIMUTH_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_AZIMUTH_54 "CAN_DET_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_54 "CAN_DET_RANGE_54";
+BA_ "GenSigStartValue" SG_ 341 CAN_DET_RANGE_RATE_54 0;
+BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_RATE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_RATE_54 "CAN_DET_RANGE_RATE_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_AMPLITUDE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_AMPLITUDE_54 "CAN_DET_AMPLITUDE_54";
+BA_ "GenSigSendType" SG_ 341 CAN_SCAN_INDEX_2LSB_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_SCAN_INDEX_2LSB_54 "CAN_SCAN_INDEX_2LSB_54";
+BA_ "GenMsgSendType" BO_ 340 1;
+BA_ "GenMsgILSupport" BO_ 340 1;
+BA_ "GenMsgNrOfRepetition" BO_ 340 0;
+BA_ "GenMsgCycleTime" BO_ 340 0;
+BA_ "NetworkInitialization" BO_ 340 0;
+BA_ "GenMsgDelayTime" BO_ 340 0;
+BA_ "GenSigVtEn" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigVtName" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 "CAN_DET_SUPER_RES_TARGET_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_ND_TARGET_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_ND_TARGET_53 "CAN_DET_ND_TARGET_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 "CAN_DET_HOST_VEH_CLUTTER_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_VALID_LEVEL_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_VALID_LEVEL_53 "CAN_DET_VALID_LEVEL_53";
+BA_ "GenSigStartValue" SG_ 340 CAN_DET_AZIMUTH_53 0;
+BA_ "GenSigSendType" SG_ 340 CAN_DET_AZIMUTH_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_AZIMUTH_53 "CAN_DET_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_53 "CAN_DET_RANGE_53";
+BA_ "GenSigStartValue" SG_ 340 CAN_DET_RANGE_RATE_53 0;
+BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_RATE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_RATE_53 "CAN_DET_RANGE_RATE_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_AMPLITUDE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_AMPLITUDE_53 "CAN_DET_AMPLITUDE_53";
+BA_ "GenSigSendType" SG_ 340 CAN_SCAN_INDEX_2LSB_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_SCAN_INDEX_2LSB_53 "CAN_SCAN_INDEX_2LSB_53";
+BA_ "GenMsgSendType" BO_ 339 1;
+BA_ "GenMsgILSupport" BO_ 339 1;
+BA_ "GenMsgNrOfRepetition" BO_ 339 0;
+BA_ "GenMsgCycleTime" BO_ 339 0;
+BA_ "NetworkInitialization" BO_ 339 0;
+BA_ "GenMsgDelayTime" BO_ 339 0;
+BA_ "GenSigVtEn" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigVtName" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 "CAN_DET_SUPER_RES_TARGET_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_ND_TARGET_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_ND_TARGET_52 "CAN_DET_ND_TARGET_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 "CAN_DET_HOST_VEH_CLUTTER_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_VALID_LEVEL_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_VALID_LEVEL_52 "CAN_DET_VALID_LEVEL_52";
+BA_ "GenSigStartValue" SG_ 339 CAN_DET_AZIMUTH_52 0;
+BA_ "GenSigSendType" SG_ 339 CAN_DET_AZIMUTH_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_AZIMUTH_52 "CAN_DET_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_52 "CAN_DET_RANGE_52";
+BA_ "GenSigStartValue" SG_ 339 CAN_DET_RANGE_RATE_52 0;
+BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_RATE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_RATE_52 "CAN_DET_RANGE_RATE_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_AMPLITUDE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_AMPLITUDE_52 "CAN_DET_AMPLITUDE_52";
+BA_ "GenSigSendType" SG_ 339 CAN_SCAN_INDEX_2LSB_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_SCAN_INDEX_2LSB_52 "CAN_SCAN_INDEX_2LSB_52";
+BA_ "GenMsgSendType" BO_ 338 1;
+BA_ "GenMsgILSupport" BO_ 338 1;
+BA_ "GenMsgNrOfRepetition" BO_ 338 0;
+BA_ "GenMsgCycleTime" BO_ 338 0;
+BA_ "NetworkInitialization" BO_ 338 0;
+BA_ "GenMsgDelayTime" BO_ 338 0;
+BA_ "GenSigVtEn" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigVtName" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 "CAN_DET_SUPER_RES_TARGET_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_ND_TARGET_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_ND_TARGET_51 "CAN_DET_ND_TARGET_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 "CAN_DET_HOST_VEH_CLUTTER_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_VALID_LEVEL_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_VALID_LEVEL_51 "CAN_DET_VALID_LEVEL_51";
+BA_ "GenSigStartValue" SG_ 338 CAN_DET_AZIMUTH_51 0;
+BA_ "GenSigSendType" SG_ 338 CAN_DET_AZIMUTH_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_AZIMUTH_51 "CAN_DET_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_51 "CAN_DET_RANGE_51";
+BA_ "GenSigStartValue" SG_ 338 CAN_DET_RANGE_RATE_51 0;
+BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_RATE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_RATE_51 "CAN_DET_RANGE_RATE_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_AMPLITUDE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_AMPLITUDE_51 "CAN_DET_AMPLITUDE_51";
+BA_ "GenSigSendType" SG_ 338 CAN_SCAN_INDEX_2LSB_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_SCAN_INDEX_2LSB_51 "CAN_SCAN_INDEX_2LSB_51";
+BA_ "GenMsgSendType" BO_ 337 1;
+BA_ "GenMsgILSupport" BO_ 337 1;
+BA_ "GenMsgNrOfRepetition" BO_ 337 0;
+BA_ "GenMsgCycleTime" BO_ 337 0;
+BA_ "NetworkInitialization" BO_ 337 0;
+BA_ "GenMsgDelayTime" BO_ 337 0;
+BA_ "GenSigVtEn" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigVtName" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 "CAN_DET_SUPER_RES_TARGET_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_ND_TARGET_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_ND_TARGET_50 "CAN_DET_ND_TARGET_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 "CAN_DET_HOST_VEH_CLUTTER_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_VALID_LEVEL_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_VALID_LEVEL_50 "CAN_DET_VALID_LEVEL_50";
+BA_ "GenSigStartValue" SG_ 337 CAN_DET_AZIMUTH_50 0;
+BA_ "GenSigSendType" SG_ 337 CAN_DET_AZIMUTH_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_AZIMUTH_50 "CAN_DET_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_50 "CAN_DET_RANGE_50";
+BA_ "GenSigStartValue" SG_ 337 CAN_DET_RANGE_RATE_50 0;
+BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_RATE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_RATE_50 "CAN_DET_RANGE_RATE_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_AMPLITUDE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_AMPLITUDE_50 "CAN_DET_AMPLITUDE_50";
+BA_ "GenSigSendType" SG_ 337 CAN_SCAN_INDEX_2LSB_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_SCAN_INDEX_2LSB_50 "CAN_SCAN_INDEX_2LSB_50";
+BA_ "GenMsgSendType" BO_ 336 1;
+BA_ "GenMsgILSupport" BO_ 336 1;
+BA_ "GenMsgNrOfRepetition" BO_ 336 0;
+BA_ "GenMsgCycleTime" BO_ 336 0;
+BA_ "NetworkInitialization" BO_ 336 0;
+BA_ "GenMsgDelayTime" BO_ 336 0;
+BA_ "GenSigVtEn" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigVtName" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 "CAN_DET_SUPER_RES_TARGET_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_ND_TARGET_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_ND_TARGET_49 "CAN_DET_ND_TARGET_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 "CAN_DET_HOST_VEH_CLUTTER_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_VALID_LEVEL_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_VALID_LEVEL_49 "CAN_DET_VALID_LEVEL_49";
+BA_ "GenSigStartValue" SG_ 336 CAN_DET_AZIMUTH_49 0;
+BA_ "GenSigSendType" SG_ 336 CAN_DET_AZIMUTH_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_AZIMUTH_49 "CAN_DET_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_49 "CAN_DET_RANGE_49";
+BA_ "GenSigStartValue" SG_ 336 CAN_DET_RANGE_RATE_49 0;
+BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_RATE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_RATE_49 "CAN_DET_RANGE_RATE_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_AMPLITUDE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_AMPLITUDE_49 "CAN_DET_AMPLITUDE_49";
+BA_ "GenSigSendType" SG_ 336 CAN_SCAN_INDEX_2LSB_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_SCAN_INDEX_2LSB_49 "CAN_SCAN_INDEX_2LSB_49";
+BA_ "GenMsgSendType" BO_ 326 1;
+BA_ "GenMsgILSupport" BO_ 326 1;
+BA_ "GenMsgNrOfRepetition" BO_ 326 0;
+BA_ "GenMsgCycleTime" BO_ 326 0;
+BA_ "NetworkInitialization" BO_ 326 0;
+BA_ "GenMsgDelayTime" BO_ 326 0;
+BA_ "GenSigVtEn" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigVtName" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 "CAN_DET_SUPER_RES_TARGET_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_ND_TARGET_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_ND_TARGET_39 "CAN_DET_ND_TARGET_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 "CAN_DET_HOST_VEH_CLUTTER_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_VALID_LEVEL_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_VALID_LEVEL_39 "CAN_DET_VALID_LEVEL_39";
+BA_ "GenSigStartValue" SG_ 326 CAN_DET_AZIMUTH_39 0;
+BA_ "GenSigSendType" SG_ 326 CAN_DET_AZIMUTH_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_AZIMUTH_39 "CAN_DET_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_39 "CAN_DET_RANGE_39";
+BA_ "GenSigStartValue" SG_ 326 CAN_DET_RANGE_RATE_39 0;
+BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_RATE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_RATE_39 "CAN_DET_RANGE_RATE_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_AMPLITUDE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_AMPLITUDE_39 "CAN_DET_AMPLITUDE_39";
+BA_ "GenSigSendType" SG_ 326 CAN_SCAN_INDEX_2LSB_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_SCAN_INDEX_2LSB_39 "CAN_SCAN_INDEX_2LSB_39";
+BA_ "GenMsgSendType" BO_ 315 1;
+BA_ "GenMsgILSupport" BO_ 315 1;
+BA_ "GenMsgNrOfRepetition" BO_ 315 0;
+BA_ "GenMsgCycleTime" BO_ 315 0;
+BA_ "NetworkInitialization" BO_ 315 0;
+BA_ "GenMsgDelayTime" BO_ 315 0;
+BA_ "GenSigVtEn" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigVtName" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 "CAN_DET_SUPER_RES_TARGET_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_ND_TARGET_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_ND_TARGET_28 "CAN_DET_ND_TARGET_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 "CAN_DET_HOST_VEH_CLUTTER_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_VALID_LEVEL_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_VALID_LEVEL_28 "CAN_DET_VALID_LEVEL_28";
+BA_ "GenSigStartValue" SG_ 315 CAN_DET_AZIMUTH_28 0;
+BA_ "GenSigSendType" SG_ 315 CAN_DET_AZIMUTH_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_AZIMUTH_28 "CAN_DET_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_28 "CAN_DET_RANGE_28";
+BA_ "GenSigStartValue" SG_ 315 CAN_DET_RANGE_RATE_28 0;
+BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_RATE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_RATE_28 "CAN_DET_RANGE_RATE_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_AMPLITUDE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_AMPLITUDE_28 "CAN_DET_AMPLITUDE_28";
+BA_ "GenSigSendType" SG_ 315 CAN_SCAN_INDEX_2LSB_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_SCAN_INDEX_2LSB_28 "CAN_SCAN_INDEX_2LSB_28";
+BA_ "GenMsgSendType" BO_ 304 1;
+BA_ "GenMsgILSupport" BO_ 304 1;
+BA_ "GenMsgNrOfRepetition" BO_ 304 0;
+BA_ "GenMsgCycleTime" BO_ 304 0;
+BA_ "NetworkInitialization" BO_ 304 0;
+BA_ "GenMsgDelayTime" BO_ 304 0;
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 "CAN_DET_CONFID_AZIMUTH_17";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 "CAN_DET_CONFID_AZIMUTH_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 "CAN_DET_CONFID_AZIMUTH_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17 "CAN_DET_SUPER_RES_TARGET_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17 "CAN_DET_ND_TARGET_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17 "CAN_DET_HOST_VEH_CLUTTER_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17 "CAN_DET_VALID_LEVEL_17";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17 "CAN_DET_AZIMUTH_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17 "CAN_DET_RANGE_17";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17 "CAN_DET_RANGE_RATE_17";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17 "CAN_DET_AMPLITUDE_17";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17 "CAN_SCAN_INDEX_2LSB_17";
+BA_ "GenMsgSendType" BO_ 303 1;
+BA_ "GenMsgILSupport" BO_ 303 1;
+BA_ "GenMsgNrOfRepetition" BO_ 303 0;
+BA_ "GenMsgCycleTime" BO_ 303 0;
+BA_ "NetworkInitialization" BO_ 303 0;
+BA_ "GenMsgDelayTime" BO_ 303 0;
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 "CAN_DET_CONFID_AZIMUTH_16";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 "CAN_DET_CONFID_AZIMUTH_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 "CAN_DET_CONFID_AZIMUTH_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16 "CAN_DET_SUPER_RES_TARGET_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16 "CAN_DET_ND_TARGET_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16 "CAN_DET_HOST_VEH_CLUTTER_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16 "CAN_DET_VALID_LEVEL_16";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16 "CAN_DET_AZIMUTH_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16 "CAN_DET_RANGE_16";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16 "CAN_DET_RANGE_RATE_16";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16 "CAN_DET_AMPLITUDE_16";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16 "CAN_SCAN_INDEX_2LSB_16";
+BA_ "GenMsgSendType" BO_ 302 1;
+BA_ "GenMsgILSupport" BO_ 302 1;
+BA_ "GenMsgNrOfRepetition" BO_ 302 0;
+BA_ "GenMsgCycleTime" BO_ 302 0;
+BA_ "NetworkInitialization" BO_ 302 0;
+BA_ "GenMsgDelayTime" BO_ 302 0;
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 "CAN_DET_CONFID_AZIMUTH_15";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 "CAN_DET_CONFID_AZIMUTH_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 "CAN_DET_CONFID_AZIMUTH_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15 "CAN_DET_SUPER_RES_TARGET_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15 "CAN_DET_ND_TARGET_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15 "CAN_DET_HOST_VEH_CLUTTER_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15 "CAN_DET_VALID_LEVEL_15";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15 "CAN_DET_AZIMUTH_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15 "CAN_DET_RANGE_15";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15 "CAN_DET_RANGE_RATE_15";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15 "CAN_DET_AMPLITUDE_15";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15 "CAN_SCAN_INDEX_2LSB_15";
+BA_ "GenMsgSendType" BO_ 301 1;
+BA_ "GenMsgILSupport" BO_ 301 1;
+BA_ "GenMsgNrOfRepetition" BO_ 301 0;
+BA_ "GenMsgCycleTime" BO_ 301 0;
+BA_ "NetworkInitialization" BO_ 301 0;
+BA_ "GenMsgDelayTime" BO_ 301 0;
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 "CAN_DET_CONFID_AZIMUTH_14";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 "CAN_DET_CONFID_AZIMUTH_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 "CAN_DET_CONFID_AZIMUTH_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14 "CAN_DET_SUPER_RES_TARGET_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14 "CAN_DET_ND_TARGET_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14 "CAN_DET_HOST_VEH_CLUTTER_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14 "CAN_DET_VALID_LEVEL_14";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14 "CAN_DET_AZIMUTH_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14 "CAN_DET_RANGE_14";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14 "CAN_DET_RANGE_RATE_14";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14 "CAN_DET_AMPLITUDE_14";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14 "CAN_SCAN_INDEX_2LSB_14";
+BA_ "GenMsgSendType" BO_ 300 1;
+BA_ "GenMsgILSupport" BO_ 300 1;
+BA_ "GenMsgNrOfRepetition" BO_ 300 0;
+BA_ "GenMsgCycleTime" BO_ 300 0;
+BA_ "NetworkInitialization" BO_ 300 0;
+BA_ "GenMsgDelayTime" BO_ 300 0;
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 "CAN_DET_CONFID_AZIMUTH_13";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 "CAN_DET_CONFID_AZIMUTH_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 "CAN_DET_CONFID_AZIMUTH_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13 "CAN_DET_SUPER_RES_TARGET_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13 "CAN_DET_ND_TARGET_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13 "CAN_DET_HOST_VEH_CLUTTER_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13 "CAN_DET_VALID_LEVEL_13";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13 "CAN_DET_AZIMUTH_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13 "CAN_DET_RANGE_13";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13 "CAN_DET_RANGE_RATE_13";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13 "CAN_DET_AMPLITUDE_13";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13 "CAN_SCAN_INDEX_2LSB_13";
+BA_ "GenMsgSendType" BO_ 299 1;
+BA_ "GenMsgILSupport" BO_ 299 1;
+BA_ "GenMsgNrOfRepetition" BO_ 299 0;
+BA_ "GenMsgCycleTime" BO_ 299 0;
+BA_ "NetworkInitialization" BO_ 299 0;
+BA_ "GenMsgDelayTime" BO_ 299 0;
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 "CAN_DET_CONFID_AZIMUTH_12";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 "CAN_DET_CONFID_AZIMUTH_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 "CAN_DET_CONFID_AZIMUTH_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12 "CAN_DET_SUPER_RES_TARGET_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12 "CAN_DET_ND_TARGET_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12 "CAN_DET_HOST_VEH_CLUTTER_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12 "CAN_DET_VALID_LEVEL_12";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12 "CAN_DET_AZIMUTH_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12 "CAN_DET_RANGE_12";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12 "CAN_DET_RANGE_RATE_12";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12 "CAN_DET_AMPLITUDE_12";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12 "CAN_SCAN_INDEX_2LSB_12";
+BA_ "GenMsgSendType" BO_ 298 1;
+BA_ "GenMsgILSupport" BO_ 298 1;
+BA_ "GenMsgNrOfRepetition" BO_ 298 0;
+BA_ "GenMsgCycleTime" BO_ 298 0;
+BA_ "NetworkInitialization" BO_ 298 0;
+BA_ "GenMsgDelayTime" BO_ 298 0;
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 "CAN_DET_CONFID_AZIMUTH_11";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 "CAN_DET_CONFID_AZIMUTH_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 "CAN_DET_CONFID_AZIMUTH_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11 "CAN_DET_SUPER_RES_TARGET_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11 "CAN_DET_ND_TARGET_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11 "CAN_DET_HOST_VEH_CLUTTER_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11 "CAN_DET_VALID_LEVEL_11";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11 "CAN_DET_AZIMUTH_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11 "CAN_DET_RANGE_11";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11 "CAN_DET_RANGE_RATE_11";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11 "CAN_DET_AMPLITUDE_11";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11 "CAN_SCAN_INDEX_2LSB_11";
+BA_ "GenMsgSendType" BO_ 297 1;
+BA_ "GenMsgILSupport" BO_ 297 1;
+BA_ "GenMsgNrOfRepetition" BO_ 297 0;
+BA_ "GenMsgCycleTime" BO_ 297 0;
+BA_ "NetworkInitialization" BO_ 297 0;
+BA_ "GenMsgDelayTime" BO_ 297 0;
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 "CAN_DET_CONFID_AZIMUTH_10";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 "CAN_DET_CONFID_AZIMUTH_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 "CAN_DET_CONFID_AZIMUTH_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10 "CAN_DET_SUPER_RES_TARGET_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10 "CAN_DET_ND_TARGET_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10 "CAN_DET_HOST_VEH_CLUTTER_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10 "CAN_DET_VALID_LEVEL_10";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10 "CAN_DET_AZIMUTH_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10 "CAN_DET_RANGE_10";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10 "CAN_DET_RANGE_RATE_10";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10 "CAN_DET_AMPLITUDE_10";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10 "CAN_SCAN_INDEX_2LSB_10";
+BA_ "GenMsgSendType" BO_ 296 1;
+BA_ "GenMsgILSupport" BO_ 296 1;
+BA_ "GenMsgNrOfRepetition" BO_ 296 0;
+BA_ "GenMsgCycleTime" BO_ 296 0;
+BA_ "NetworkInitialization" BO_ 296 0;
+BA_ "GenMsgDelayTime" BO_ 296 0;
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 "CAN_DET_CONFID_AZIMUTH_09";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 "CAN_DET_CONFID_AZIMUTH_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 "CAN_DET_CONFID_AZIMUTH_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09 "CAN_DET_SUPER_RES_TARGET_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09 "CAN_DET_ND_TARGET_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09 "CAN_DET_HOST_VEH_CLUTTER_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09 "CAN_DET_VALID_LEVEL_09";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09 "CAN_DET_AZIMUTH_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09 "CAN_DET_RANGE_09";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09 "CAN_DET_RANGE_RATE_09";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09 "CAN_DET_AMPLITUDE_09";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09 "CAN_SCAN_INDEX_2LSB_09";
+BA_ "GenMsgSendType" BO_ 295 1;
+BA_ "GenMsgILSupport" BO_ 295 1;
+BA_ "GenMsgNrOfRepetition" BO_ 295 0;
+BA_ "GenMsgCycleTime" BO_ 295 0;
+BA_ "NetworkInitialization" BO_ 295 0;
+BA_ "GenMsgDelayTime" BO_ 295 0;
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 "CAN_DET_CONFID_AZIMUTH_08";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 "CAN_DET_CONFID_AZIMUTH_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 "CAN_DET_CONFID_AZIMUTH_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08 "CAN_DET_SUPER_RES_TARGET_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08 "CAN_DET_ND_TARGET_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08 "CAN_DET_HOST_VEH_CLUTTER_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08 "CAN_DET_VALID_LEVEL_08";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08 "CAN_DET_AZIMUTH_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08 "CAN_DET_RANGE_08";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08 "CAN_DET_RANGE_RATE_08";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08 "CAN_DET_AMPLITUDE_08";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08 "CAN_SCAN_INDEX_2LSB_08";
+BA_ "GenMsgSendType" BO_ 294 1;
+BA_ "GenMsgILSupport" BO_ 294 1;
+BA_ "GenMsgNrOfRepetition" BO_ 294 0;
+BA_ "GenMsgCycleTime" BO_ 294 0;
+BA_ "NetworkInitialization" BO_ 294 0;
+BA_ "GenMsgDelayTime" BO_ 294 0;
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 "CAN_DET_CONFID_AZIMUTH_07";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 "CAN_DET_CONFID_AZIMUTH_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 "CAN_DET_CONFID_AZIMUTH_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07 "CAN_DET_SUPER_RES_TARGET_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07 "CAN_DET_ND_TARGET_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07 "CAN_DET_HOST_VEH_CLUTTER_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07 "CAN_DET_VALID_LEVEL_07";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07 "CAN_DET_AZIMUTH_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07 "CAN_DET_RANGE_07";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07 "CAN_DET_RANGE_RATE_07";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07 "CAN_DET_AMPLITUDE_07";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07 "CAN_SCAN_INDEX_2LSB_07";
+BA_ "GenMsgSendType" BO_ 293 1;
+BA_ "GenMsgILSupport" BO_ 293 1;
+BA_ "GenMsgNrOfRepetition" BO_ 293 0;
+BA_ "GenMsgCycleTime" BO_ 293 0;
+BA_ "NetworkInitialization" BO_ 293 0;
+BA_ "GenMsgDelayTime" BO_ 293 0;
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 "CAN_DET_CONFID_AZIMUTH_06";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 "CAN_DET_CONFID_AZIMUTH_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 "CAN_DET_CONFID_AZIMUTH_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06 "CAN_DET_SUPER_RES_TARGET_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06 "CAN_DET_ND_TARGET_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06 "CAN_DET_HOST_VEH_CLUTTER_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06 "CAN_DET_VALID_LEVEL_06";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06 "CAN_DET_AZIMUTH_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06 "CAN_DET_RANGE_06";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06 "CAN_DET_RANGE_RATE_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06 "CAN_DET_AMPLITUDE_06";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06 "CAN_SCAN_INDEX_2LSB_06";
+BA_ "GenMsgSendType" BO_ 292 1;
+BA_ "GenMsgILSupport" BO_ 292 1;
+BA_ "GenMsgNrOfRepetition" BO_ 292 0;
+BA_ "GenMsgCycleTime" BO_ 292 0;
+BA_ "NetworkInitialization" BO_ 292 0;
+BA_ "GenMsgDelayTime" BO_ 292 0;
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 "CAN_DET_CONFID_AZIMUTH_05";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 "CAN_DET_CONFID_AZIMUTH_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 "CAN_DET_CONFID_AZIMUTH_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05 "CAN_DET_SUPER_RES_TARGET_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05 "CAN_DET_ND_TARGET_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05 "CAN_DET_HOST_VEH_CLUTTER_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05 "CAN_DET_VALID_LEVEL_05";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05 "CAN_DET_AZIMUTH_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05 "CAN_DET_RANGE_05";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05 "CAN_DET_RANGE_RATE_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05 "CAN_DET_AMPLITUDE_05";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05 "CAN_SCAN_INDEX_2LSB_05";
+BA_ "GenMsgSendType" BO_ 290 1;
+BA_ "GenMsgILSupport" BO_ 290 1;
+BA_ "GenMsgNrOfRepetition" BO_ 290 0;
+BA_ "GenMsgCycleTime" BO_ 290 0;
+BA_ "NetworkInitialization" BO_ 290 0;
+BA_ "GenMsgDelayTime" BO_ 290 0;
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 "CAN_DET_CONFID_AZIMUTH_03";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 "CAN_DET_CONFID_AZIMUTH_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 "CAN_DET_CONFID_AZIMUTH_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03 "CAN_DET_SUPER_RES_TARGET_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03 "CAN_DET_ND_TARGET_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03 "CAN_DET_HOST_VEH_CLUTTER_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03 "CAN_DET_VALID_LEVEL_03";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03 "CAN_DET_AZIMUTH_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03 "CAN_DET_RANGE_03";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03 "CAN_DET_RANGE_RATE_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03 "CAN_DET_AMPLITUDE_03";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03 "CAN_SCAN_INDEX_2LSB_03";
+BA_ "GenMsgSendType" BO_ 289 1;
+BA_ "GenMsgILSupport" BO_ 289 1;
+BA_ "GenMsgNrOfRepetition" BO_ 289 0;
+BA_ "GenMsgCycleTime" BO_ 289 0;
+BA_ "NetworkInitialization" BO_ 289 0;
+BA_ "GenMsgDelayTime" BO_ 289 0;
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 "CAN_DET_CONFID_AZIMUTH_02";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 "CAN_DET_CONFID_AZIMUTH_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 "CAN_DET_CONFID_AZIMUTH_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02 "CAN_DET_SUPER_RES_TARGET_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02 "CAN_DET_ND_TARGET_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02 "CAN_DET_HOST_VEH_CLUTTER_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02 "CAN_DET_VALID_LEVEL_02";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02 "CAN_DET_AZIMUTH_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02 "CAN_DET_RANGE_02";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02 "CAN_DET_RANGE_RATE_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02 "CAN_DET_AMPLITUDE_02";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02 "CAN_SCAN_INDEX_2LSB_02";
+BA_ "GenMsgSendType" BO_ 256 1;
+BA_ "GenMsgILSupport" BO_ 256 1;
+BA_ "GenMsgNrOfRepetition" BO_ 256 0;
+BA_ "NetworkInitialization" BO_ 256 0;
+BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MINOR_MRR "CAN_PCAN_MINOR_MRR";
+BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MINOR_MRR 0;
+BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MAJOR_MRR "CAN_PCAN_MAJOR_MRR";
+BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MAJOR_MRR 0;
+BA_ "GenMsgCycleTime" BO_ 257 30;
+BA_ "GenMsgSendType" BO_ 257 0;
+BA_ "GenMsgILSupport" BO_ 257 1;
+BA_ "GenMsgNrOfRepetition" BO_ 257 0;
+BA_ "NetworkInitialization" BO_ 257 0;
+BA_ "GenSigCmt" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtEn" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtName" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtName" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigCmt" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigStartValue" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0;
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0;
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE 0;
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_MNR 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_EXT_COND_NOK 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_NOT_START 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_OVERHEAT_ERROR 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_NOT_OP 0;
+BA_ "GenSigCmt" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigVtEn" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigVtName" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigSendType" SG_ 257 CAN_XCVR_OPERATIONAL 0;
+BA_ "GenMsgSendType" BO_ 288 1;
+BA_ "GenMsgILSupport" BO_ 288 1;
+BA_ "GenMsgNrOfRepetition" BO_ 288 0;
+BA_ "GenMsgCycleTime" BO_ 288 0;
+BA_ "NetworkInitialization" BO_ 288 0;
+BA_ "GenMsgDelayTime" BO_ 288 0;
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 "CAN_DET_CONFID_AZIMUTH_01";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 "CAN_DET_CONFID_AZIMUTH_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 "CAN_DET_CONFID_AZIMUTH_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01 "CAN_DET_SUPER_RES_TARGET_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01 "CAN_DET_ND_TARGET_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01 "CAN_DET_HOST_VEH_CLUTTER_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01 "CAN_DET_VALID_LEVEL_01";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01 "CAN_DET_AZIMUTH_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01 "CAN_DET_RANGE_01";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01 "CAN_DET_RANGE_RATE_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01 "CAN_DET_AMPLITUDE_01";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01 "CAN_SCAN_INDEX_2LSB_01";
+BA_DEF_DEF_ "CrossOver_InfoCAN" "No";
+BA_DEF_DEF_ "CrossOver_LIN" "No";
+BA_DEF_DEF_ "UsedOnPgmDBC" "Yes";
+BA_DEF_DEF_ "ContentDependant" "No";
+BA_DEF_DEF_ "GenSigTimeoutTime_RCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_OCS" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_CCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_IPMA" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_SCCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_Generic_BCM" 0;
+BA_DEF_DEF_ "NmMessage" "No";
+BA_DEF_DEF_ "DiagResponse" "No";
+BA_DEF_DEF_ "DiagRequest" "No";
+BA_DEF_DEF_ "TpTxIndex" 0;
+BA_DEF_DEF_ "DiagState" "No";
+BA_DEF_DEF_ "TpApplType" "";
+BA_DEF_DEF_ "NmAsrMessage" "No";
+BA_DEF_DEF_ "Mulitplexer" "No";
+BA_DEF_DEF_ "ConfiguredTransmitter" "No";
+BA_DEF_DEF_ "EventRateOfChange" 10000;
+BA_DEF_DEF_ "GenMsgHandlingTypeDoc" "";
+BA_DEF_DEF_ "GenMsgHandlingTypeCode" "";
+BA_DEF_DEF_ "GenMsgMarked" "";
+BA_DEF_DEF_ "GenSigMarked" "";
+BA_DEF_DEF_ "GenSigVtIndex" "";
+BA_DEF_DEF_ "GenSigVtName" "";
+BA_DEF_DEF_ "GenSigVtEn" "";
+BA_DEF_DEF_ "GenSigSNA" "";
+BA_DEF_DEF_ "GenSigCmt" "";
+BA_DEF_DEF_ "GenMsgCmt" "";
+BA_DEF_DEF_ "GenSigSendType" "NoSigSendType";
+BA_DEF_DEF_ "GenSigInactiveValue" 0;
+BA_DEF_DEF_ "GenSigMissingSourceValue" 0;
+BA_DEF_DEF_ "WakeupSignal" "No";
+BA_DEF_DEF_ "GenSigStartValue" 0;
+BA_DEF_DEF_ "GenMsgILSupport" "Yes";
+BA_DEF_DEF_ "NetworkInitializationCommand" "No";
+BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+BA_DEF_DEF_ "GenMsgCycleTimeFast" 0;
+BA_DEF_DEF_ "GenMsgDelayTime" 0;
+BA_DEF_DEF_ "GenMsgNrOfRepetition" 0;
+BA_DEF_DEF_ "GenMsgStartDelayTime" 0;
+BA_DEF_DEF_ "NetworkInitialization" "No";
+BA_DEF_DEF_ "MessageGateway" "No";
+BA_DEF_DEF_ "ILUsed" "Yes";
+BA_DEF_DEF_ "NetworkInitializationUsed" "No";
+BA_DEF_DEF_ "PowerType" "Switched";
+BA_DEF_DEF_ "NodeStartUpTime" 250;
+BA_DEF_DEF_ "NodeWakeUpTime" 10;
+BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff";
+BA_DEF_DEF_ "GenMsgForegroundColor" "#000000";
+VAL_ 34 IPMA_PCAN_DataRangeCheck 1 "Fault Present" 0 "No Fault";
+VAL_ 34 IPMA_PCAN_MissingMsg 1 "Fault Present" 0 "No Fault ";
+VAL_ 34 VINSignalCompareFailure 1 "Fault Present" 0 "No Fault";
+VAL_ 34 ModuleNotConfiguredError 1 "Fault Present" 0 "No Fault";
+VAL_ 34 CarCfgNotConfiguredError 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ARMtoDSPChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 DSPtoArmChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 HostToArmChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ARMtoHostChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 LoopBWOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 DSPOverrunFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte6_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TuningSensitivityFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 SaturatedTuningFreqFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 LocalOscPowerFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterPowerFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte6_bit0 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 XCVRDeviceSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 FreqSynthesizerSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 AnalogConverterDevicSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 SidelobeBlockage 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit1 1 "Fault Present" 0 "No Fault";
+VAL_ 33 MNRBlocked 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ECUTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 AlignmentRoutineFailedFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 UnreasonableRadarData 1 "Fault Present" 0 "No Fault";
+VAL_ 33 MicroprocessorTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 VerticalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 HorizontalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 FactoryAlignmentMode 1 "Fault Present" 0 "No Fault";
+VAL_ 33 BatteryLowFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 BatteryHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_1p25SupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte3_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ThermistorOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_3p3DACSupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_3p3RAWSupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_5_SupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterIDFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit3 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit2 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PCANMissingMsgFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PCANBusOff 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 InstructionSetCheckFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 StackOverflowFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 WatchdogFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PLLLockFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit1 1 "Fault Present" 0 "No Fault";
+VAL_ 33 RAMMemoryTestFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 USCValidationFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit3 1 "Fault Present" 0 "No Fault";
+VAL_ 33 KeepAliveChecksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ProgramCalibrationFlashChecksum 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ApplicationFlashChecksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 371 CAN_AUTO_ALIGN_HANGLE_QF 3 "Accurate" 2 "Inaccurate" 1 "Temporarily undefined" 0 "Undefined";
+VAL_ 371 CAN_ALIGNMENT_STATUS 15 "Undefined_2" 14 "Undefined_1" 13 "Low Amplitude (Flat-plate only)" 12 "No Peak (Flat-plate only)" 11 "Fail Ver and Hor OutOfRange" 10 "Fail Vertical Align OutOfRange" 9 "Fail Horizontal Align OutOfRange" 8 "Fail Time Out" 7 "Fail Only Right Target Found" 6 "Fail Only Left Target Found" 5 "Fail Variance Too Large" 4 "Fail Deviation Too Large" 3 "Fail No Target" 2 "Success" 1 "Busy" 0 "Off";
+VAL_ 371 CAN_ALIGNMENT_STATE 6 "Static alignment flat-plate" 5 "Static alignment 2-target" 4 "Static alignment 1-target" 3 "Service alignment" 2 "Short track alignment" 1 "Auto alignment" 0 "Off";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 351 CAN_DET_CONFID_AZIMUTH_64 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 350 CAN_DET_CONFID_AZIMUTH_63 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 349 CAN_DET_CONFID_AZIMUTH_62 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 348 CAN_DET_CONFID_AZIMUTH_61 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 347 CAN_DET_CONFID_AZIMUTH_60 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 346 CAN_DET_CONFID_AZIMUTH_59 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 345 CAN_DET_CONFID_AZIMUTH_58 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 344 CAN_DET_CONFID_AZIMUTH_57 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 343 CAN_DET_CONFID_AZIMUTH_56 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 342 CAN_DET_CONFID_AZIMUTH_55 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 335 CAN_DET_CONFID_AZIMUTH_48 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 334 CAN_DET_CONFID_AZIMUTH_47 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 333 CAN_DET_CONFID_AZIMUTH_46 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 332 CAN_DET_CONFID_AZIMUTH_45 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 331 CAN_DET_CONFID_AZIMUTH_44 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 330 CAN_DET_CONFID_AZIMUTH_43 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 329 CAN_DET_CONFID_AZIMUTH_42 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 328 CAN_DET_CONFID_AZIMUTH_41 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 327 CAN_DET_CONFID_AZIMUTH_40 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 325 CAN_DET_CONFID_AZIMUTH_38 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 324 CAN_DET_CONFID_AZIMUTH_37 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 323 CAN_DET_CONFID_AZIMUTH_36 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 322 CAN_DET_CONFID_AZIMUTH_35 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 321 CAN_DET_CONFID_AZIMUTH_34 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 320 CAN_DET_CONFID_AZIMUTH_33 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 319 CAN_DET_CONFID_AZIMUTH_32 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 318 CAN_DET_CONFID_AZIMUTH_31 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 317 CAN_DET_CONFID_AZIMUTH_30 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 316 CAN_DET_CONFID_AZIMUTH_29 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 314 CAN_DET_CONFID_AZIMUTH_27 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 313 CAN_DET_CONFID_AZIMUTH_26 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 312 CAN_DET_CONFID_AZIMUTH_25 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 311 CAN_DET_CONFID_AZIMUTH_24 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 310 CAN_DET_CONFID_AZIMUTH_23 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 309 CAN_DET_CONFID_AZIMUTH_22 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 341 CAN_DET_CONFID_AZIMUTH_54 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 340 CAN_DET_CONFID_AZIMUTH_53 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 339 CAN_DET_CONFID_AZIMUTH_52 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 338 CAN_DET_CONFID_AZIMUTH_51 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 337 CAN_DET_CONFID_AZIMUTH_50 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 336 CAN_DET_CONFID_AZIMUTH_49 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 326 CAN_DET_CONFID_AZIMUTH_39 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 315 CAN_DET_CONFID_AZIMUTH_28 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 257 CAN_INTERFERENCE_TYPE 2 "Star PD-Like" 1 "Slow FMCW" 0 "No Interference";
+VAL_ 257 CAN_RECOMMEND_UNCONVERGE 1 "Recommended" 0 "Not Recommended";
+VAL_ 257 CAN_RADAR_ALIGN_INCOMPLETE 1 "Alignment Incomplete" 0 "Alignment Completed";
+VAL_ 257 CAN_BLOCKAGE_SIDELOBE 1 "Radar Blockage" 0 "No Radar Blockage";
+VAL_ 257 CAN_BLOCKAGE_MNR 1 "Radar Blockage" 0 "No Radar Blockage";
+VAL_ 257 CAN_RADAR_EXT_COND_NOK 1 "Too high temp or insufficient pw" 0 "External conditions OK";
+VAL_ 257 CAN_RADAR_ALIGN_OUT_RANGE 1 "Radar out of range" 0 "Radar within range";
+VAL_ 257 CAN_RADAR_ALIGN_NOT_START 1 "Radar align not started" 0 "Radar align started";
+VAL_ 257 CAN_RADAR_OVERHEAT_ERROR 1 "Radar overheat condition" 0 "No Overheat";
+VAL_ 257 CAN_RADAR_NOT_OP 1 "Radar not operational" 0 "Radar operational";
+VAL_ 257 CAN_XCVR_OPERATIONAL 1 "On" 0 "Off ";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
diff --git a/iqdbc_repo/iqdbc/dbc/FORD_CADS_64.dbc b/iqdbc_repo/iqdbc/dbc/FORD_CADS_64.dbc
new file mode 100644
index 000000000..2ae927a6f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/FORD_CADS_64.dbc
@@ -0,0 +1,7289 @@
+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_: MRR
+BO_ 1073741824 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX
+ SG_ New_Signal_943 : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_SENSOR_VANGLE_OFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_SENSOR_FOV_VER : 0|8@0+ (1,0) [0|255] "deg" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE_QF : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE_REF : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_MMIC_Temp4 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_MMIC_Temp3 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_MMIC_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_Processor_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_CHECKSUM : 0|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_COUNTER : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_VEHICLE_MODE : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_USC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_USC_CAL_VER_MINOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_SMC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_HW_VERSION : 0|32@0+ (1,0) [0|4.29497e+09] "" Vector__XXX
+ SG_ CAN_FAC_TGT_MTG_SPACE_VER : 0|8@0+ (1,-128) [-128|127] "cm" Vector__XXX
+ SG_ CAN_ANGLE_MISALIGNMENT_VER : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_ANGLE_MOUNTING_VOFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_LATCH_FAULTS : 0|64@0+ (1,0) [0|100] "" Vector__XXX
+ SG_ CAN_ACTIVE_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX
+ SG_ CAN_HISTORY_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX
+ SG_ CAN_SERV_ALIGN_ENABLE : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_LONG_MOUNTING_OFFSET : 0|8@0+ (0.015625,-2) [-2|1.98438] "" Vector__XXX
+ SG_ CAN_BEAMWIDTH_VERT : 0|7@0+ (0.125,0) [0|15.875] "deg" Vector__XXX
+ SG_ CAN_VEHICLE_SPEED_CALC_QF : 0|2@0+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 34 Active_Fault_Latched_2: 8 MRR
+ SG_ IPMA_PCAN_DataRangeCheck : 4|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ IPMA_PCAN_MissingMsg : 3|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ VINSignalCompareFailure : 2|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ModuleNotConfiguredError : 1|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ CarCfgNotConfiguredError : 0|1@1+ (1,0) [0|1] "" External_Tool
+
+BO_ 33 Active_Fault_Latched_1: 8 MRR
+ SG_ Active_Flt_Latched_byte7_bit7 : 63|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit6 : 62|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit5 : 61|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit4 : 60|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ARMtoDSPChksumFault : 59|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ DSPtoArmChksumFault : 58|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ HostToArmChksumFault : 57|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ARMtoHostChksumFault : 56|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ LoopBWOutOfRange : 55|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ DSPOverrunFault : 54|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte6_bit5 : 53|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TuningSensitivityFault : 52|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ SaturatedTuningFreqFault : 51|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ LocalOscPowerFault : 50|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterPowerFault : 49|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte6_bit0 : 48|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit7 : 47|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit6 : 46|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ XCVRDeviceSPIFault : 45|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ FreqSynthesizerSPIFault : 44|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ AnalogConverterDevicSPIFault : 43|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ SidelobeBlockage : 42|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit1 : 41|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ MNRBlocked : 40|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ECUTempHighFault : 39|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterTempHighFault : 38|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ AlignmentRoutineFailedFault : 37|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ UnreasonableRadarData : 36|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ MicroprocessorTempHighFault : 35|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ VerticalAlignmentOutOfRange : 34|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ HorizontalAlignmentOutOfRange : 33|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ FactoryAlignmentMode : 32|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ BatteryLowFault : 31|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ BatteryHighFault : 30|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_1p25SupplyOutOfRange : 29|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte3_bit4 : 28|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ThermistorOutOfRange : 27|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_3p3DACSupplyOutOfRange : 26|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_3p3RAWSupplyOutOfRange : 25|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_5_SupplyOutOfRange : 24|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterIDFault : 23|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit6 : 22|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit5 : 21|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit4 : 20|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit3 : 19|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit2 : 18|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PCANMissingMsgFault : 17|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PCANBusOff : 16|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit7 : 15|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit6 : 14|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ InstructionSetCheckFault : 13|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ StackOverflowFault : 12|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ WatchdogFault : 11|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PLLLockFault : 10|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit1 : 9|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ RAMMemoryTestFault : 8|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ USCValidationFault : 7|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit6 : 6|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit5 : 5|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit4 : 4|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit3 : 3|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ KeepAliveChecksumFault : 2|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ProgramCalibrationFlashChecksum : 1|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ApplicationFlashChecksumFault : 0|1@1+ (1,0) [0|1] "" External_Tool
+
+BO_ 500 XCP_MRR_DAQ_RESP: 8 MRR
+ SG_ MRR_xcp_daq_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 499 XCP_MRR_DTO_RESP: 8 MRR
+ SG_ MRR_xcp_dto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 497 XCP_MRR_CTO_RESP: 8 MRR
+ SG_ MRR_xcp_cto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 1900 Ford_Diag_Resp_Phys: 8 MRR
+ SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467e+19] "" IFV_Host
+
+BO_ 261 MRR_Status_SerialNumber: 8 MRR
+ SG_ CAN_SEQUENCE_NUMBER : 55|16@0+ (1,0) [0|65535] "" External_Tool
+ SG_ CAN_SERIAL_NUMBER : 7|40@0+ (1,0) [0|1.09951e+12] "" External_Tool
+
+BO_ 264 MRR_Status_SwVersion: 8 MRR
+ SG_ CAN_PBL_Field_Revision : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_PBL_Promote_Revision : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Field_Revision : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Promote_Revision : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Release_Revision : 7|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_PBL_Release_Revision : 31|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 373 MRR_Header_SensorPosition: 8 MRR
+ SG_ CAN_SENSOR_POLARITY : 55|1@0+ (1,0) [0|1] "" External_Tool
+ SG_ CAN_SENSOR_LAT_OFFSET : 39|16@0+ (0.01,0) [0|655.35] "cm" External_Tool
+ SG_ CAN_SENSOR_LONG_OFFSET : 23|16@0+ (0.01,0) [0|655.35] "cm" External_Tool
+ SG_ CAN_SENSOR_HANGLE_OFFSET : 7|8@0+ (0.0625,-8) [-8|7.9375] "deg" External_Tool
+
+BO_ 372 MRR_Header_SensorCoverage: 8 MRR
+ SG_ CAN_SENSOR_FOV_HOR : 39|8@0+ (1,0) [0|255] "deg" IFV_VFP
+ SG_ CAN_DOPPLER_COVERAGE : 23|8@0+ (1,-128) [-128|127] "m/s" IFV_VFP
+ SG_ CAN_RANGE_COVERAGE : 7|8@0+ (1,0) [0|255] "m" IFV_VFP
+
+BO_ 371 MRR_Header_AlignmentState: 8 MRR
+ SG_ CAN_AUTO_ALIGN_HANGLE_QF : 13|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_ALIGNMENT_STATUS : 51|4@0+ (1,0) [0|11] "" IFV_VFP
+ SG_ CAN_ALIGNMENT_STATE : 55|3@0+ (1,0) [0|7] "" IFV_VFP
+ SG_ CAN_AUTO_ALIGN_HANGLE_REF : 11|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP
+ SG_ CAN_AUTO_ALIGN_HANGLE : 7|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP
+
+BO_ 369 MRR_Header_Timestamps: 8 MRR
+ SG_ CAN_DET_TIME_SINCE_MEAS : 39|11@0+ (0.1,0) [0|204.7] "ms" IFV_Host
+ SG_ CAN_SENSOR_TIME_STAMP : 7|32@0+ (0.1,0) [0|4.29497e+08] "ms" IFV_VFP
+
+BO_ 368 MRR_Header_InformationDetections: 8 MRR
+ SG_ CAN_ALIGN_UPDATES_DONE : 55|16@0+ (1,0) [0|65535] "" IFV_VFP
+ SG_ CAN_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" IFV_VFP
+ SG_ CAN_NUMBER_OF_DET : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_LOOK_ID : 23|2@0+ (1,0) [0|3] "" External_Tool
+ SG_ CAN_LOOK_INDEX : 7|16@0+ (1,0) [0|65535] "" External_Tool
+
+BO_ 265 MRR_Status_Temp_Volt: 8 MRR
+ SG_ CAN_BATT_VOLTS : 63|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_1_25_V : 55|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_5_V : 47|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_3_3_V_RAW : 31|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_3_3_V_DAC : 15|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_MMIC_Temp1 : 39|8@0+ (1,-50) [-50|205] "C" External_Tool
+ SG_ CAN_Processor_Thermistor : 23|8@0+ (1,-50) [-50|205] "C" External_Tool
+ SG_ CAN_Processor_Temp1 : 7|8@0+ (1,-50) [-50|205] "C" External_Tool
+
+BO_ 291 MRR_Detection_004: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_04_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_04_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_04_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_04_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_04_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_04_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_04_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_04_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_04_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_04_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_04_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_04_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_04_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_04_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_04_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 351 MRR_Detection_064: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_64 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_64 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_64 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_64 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_64 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_64 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_64 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_64 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_64 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_64 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 350 MRR_Detection_063: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_63 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_63 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_63 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_63 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_63 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_63 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_63 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_63 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_63 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_63 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 349 MRR_Detection_062: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_62 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_62 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_62 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_62 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_62 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_62 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_62 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_62 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_62 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_62 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 348 MRR_Detection_061: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_61 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_61 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_61 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_61 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_61 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_61 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_61 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_61 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_61 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_61 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 347 MRR_Detection_060: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_60 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_60 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_60 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_60 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_60 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_60 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_60 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_60 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_60 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_60 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 346 MRR_Detection_059: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_59 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_59 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_59 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_59 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_59 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_59 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_59 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_59 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_59 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_59 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 345 MRR_Detection_058: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_58 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_58 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_58 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_58 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_58 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_58 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_58 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_58 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_58 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_58 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 344 MRR_Detection_057: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_57 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_57 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_57 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_57 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_57 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_57 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_57 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_57 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_57 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_57 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 343 MRR_Detection_056: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_56 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_56 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_56 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_56 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_56 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_56 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_56 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_56 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_56 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_56 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 342 MRR_Detection_055: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_55 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_55 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_55 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_55 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_55 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_55 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_55 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_55 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_55 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_55 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 335 MRR_Detection_048: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_48 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_48 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_48 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_48 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_48 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_48 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_48 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_48 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_48 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_48 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 334 MRR_Detection_047: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_47 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_47 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_47 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_47 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_47 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_47 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_47 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_47 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_47 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_47 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 333 MRR_Detection_046: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_46 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_46 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_46 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_46 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_46 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_46 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_46 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_46 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_46 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_46 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 332 MRR_Detection_045: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_45 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_45 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_45 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_45 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_45 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_45 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_45 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_45 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_45 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_45 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 331 MRR_Detection_044: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_44 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_44 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_44 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_44 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_44 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_44 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_44 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_44 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_44 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_44 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 330 MRR_Detection_043: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_43 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_43 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_43 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_43 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_43 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_43 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_43 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_43 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_43 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_43 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 329 MRR_Detection_042: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_42 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_42 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_42 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_42 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_42 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_42 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_42 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_42 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_42 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_42 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 328 MRR_Detection_041: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_41 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_41 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_41 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_41 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_41 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_41 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_41 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_41 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_41 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_41 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 327 MRR_Detection_040: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_40 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_40 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_40 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_40 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_40 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_40 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_40 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_40 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_40 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_40 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 325 MRR_Detection_038: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_38 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_38 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_38 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_38 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_38 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_38 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_38 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_38 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_38 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_38 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 324 MRR_Detection_037: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_37 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_37 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_37 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_37 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_37 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_37 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_37 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_37 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_37 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_37 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 323 MRR_Detection_036: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_36 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_36 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_36 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_36 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_36 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_36 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_36 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_36 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_36 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_36 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 322 MRR_Detection_035: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_35 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_35 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_35 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_35 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_35 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_35 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_35 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_35 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_35 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_35 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 321 MRR_Detection_034: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_34 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_34 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_34 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_34 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_34 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_34 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_34 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_34 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_34 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_34 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 320 MRR_Detection_033: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_33 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_33 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_33 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_33 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_33 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_33 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_33 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_33 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_33 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_33 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 319 MRR_Detection_032: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_32 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_32 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_32 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_32 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_32 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_32 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_32 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_32 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_32 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_32 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 318 MRR_Detection_031: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_31 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_31 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_31 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_31 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_31 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_31 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_31 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_31 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_31 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_31 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 317 MRR_Detection_030: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_30 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_30 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_30 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_30 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_30 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_30 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_30 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_30 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_30 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_30 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 316 MRR_Detection_029: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_29 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_29 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_29 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_29 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_29 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_29 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_29 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_29 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_29 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_29 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 314 MRR_Detection_027: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_27 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_27 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_27 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_27 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_27 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_27 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_27 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_27 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_27 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_27 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 313 MRR_Detection_026: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_26 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_26 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_26 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_26 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_26 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_26 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_26 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_26 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_26 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_26 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 312 MRR_Detection_025: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_25 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_25 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_25 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_25 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_25 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_25 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_25 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_25 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_25 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_25 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 311 MRR_Detection_024: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_24 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_24 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_24 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_24 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_24 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_24 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_24 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_24 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_24 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_24 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 310 MRR_Detection_023: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_23 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_23 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_23 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_23 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_23 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_23 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_23 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_23 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_23 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_23 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 309 MRR_Detection_022: 24 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_22_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_22_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_22_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_22_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_22_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_22_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_22_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_22_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_22_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_22_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_22_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_22_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_22_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_22_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_22_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_22_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_22_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_22_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_22_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_22_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_22_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_22_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_22_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_22_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_22_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_22_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_22_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_22_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_22_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_22_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 308 MRR_Detection_021: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_21_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_21_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_21_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_21_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_21_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_21_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_21_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_21_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_21_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_21_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_21_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_21_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_21_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_21_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_21_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 307 MRR_Detection_020: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_20_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_20_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_20_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_20_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_20_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_20_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_20_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_20_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_20_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_20_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_20_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_20_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_20_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_20_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_20_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 306 MRR_Detection_019: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_19_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_19_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_19_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_19_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_19_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_19_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_19_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_19_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_19_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_19_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_19_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_19_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_19_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_19_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_19_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 305 MRR_Detection_018: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_18_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_18_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_18_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_18_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_18_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_18_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_18_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_18_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_18_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_18_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_18_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_18_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_18_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_18_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_18_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 341 MRR_Detection_054: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_54 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_54 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_54 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_54 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_54 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_54 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_54 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_54 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_54 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_54 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 340 MRR_Detection_053: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_53 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_53 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_53 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_53 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_53 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_53 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_53 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_53 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_53 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_53 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 339 MRR_Detection_052: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_52 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_52 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_52 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_52 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_52 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_52 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_52 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_52 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_52 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_52 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 338 MRR_Detection_051: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_51 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_51 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_51 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_51 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_51 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_51 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_51 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_51 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_51 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_51 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 337 MRR_Detection_050: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_50 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_50 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_50 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_50 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_50 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_50 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_50 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_50 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_50 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_50 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 336 MRR_Detection_049: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_49 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_49 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_49 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_49 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_49 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_49 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_49 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_49 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_49 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_49 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 326 MRR_Detection_039: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_39 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_39 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_39 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_39 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_39 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_39 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_39 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_39 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_39 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_39 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 315 MRR_Detection_028: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_28 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_28 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_28 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_28 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_28 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_28 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_28 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_28 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_28 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_28 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 304 MRR_Detection_017: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_17_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_17_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_17_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_17_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_17_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_17_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_17_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_17_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_17_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_17_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_17_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_17_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_17_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_17_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_17_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 303 MRR_Detection_016: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_16_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_16_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_16_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_16_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_16_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_16_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_16_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_16_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_16_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_16_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_16_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_16_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_16_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_16_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_16_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 302 MRR_Detection_015: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_15_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_15_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_15_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_15_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_15_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_15_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_15_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_15_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_15_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_15_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_15_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_15_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_15_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_15_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_15_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 301 MRR_Detection_014: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_14_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_14_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_14_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_14_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_14_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_14_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_14_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_14_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_14_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_14_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_14_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_14_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_14_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_14_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_14_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 300 MRR_Detection_013: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_13_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_13_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_13_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_13_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_13_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_13_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_13_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_13_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_13_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_13_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_13_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_13_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_13_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_13_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_13_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 299 MRR_Detection_012: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_12_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_12_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_12_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_12_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_12_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_12_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_12_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_12_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_12_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_12_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_12_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_12_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_12_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_12_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_12_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 298 MRR_Detection_011: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_11_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_11_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_11_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_11_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_11_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_11_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_11_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_11_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_11_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_11_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_11_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_11_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_11_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_11_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_11_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 297 MRR_Detection_010: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_10_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_10_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_10_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_10_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_10_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_10_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_10_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_10_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_10_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_10_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_10_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_10_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_10_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_10_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_10_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 296 MRR_Detection_009: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_09_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_09_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_09_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_09_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_09_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_09_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_09_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_09_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_09_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_09_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_09_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_09_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_09_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_09_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_09_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 295 MRR_Detection_008: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_08_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_08_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_08_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_08_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_08_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_08_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_08_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_08_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_08_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_08_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_08_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_08_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_08_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_08_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_08_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 294 MRR_Detection_007: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_07_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_07_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_07_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_07_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_07_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_07_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_07_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_07_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_07_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_07_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_07_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_07_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_07_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_07_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_07_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 293 MRR_Detection_006: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_06_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_06_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_06_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_06_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_06_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_06_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_06_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_06_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_06_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_06_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_06_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_06_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_06_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_06_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_06_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 292 MRR_Detection_005: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_05_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_05_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_05_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_05_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_05_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_05_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_05_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_05_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_05_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_05_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_05_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_05_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_05_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_05_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_05_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 290 MRR_Detection_003: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_03_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_03_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_03_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_03_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_03_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_03_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_03_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_03_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_03_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_03_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_03_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_03_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_03_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_03_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_03_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 289 MRR_Detection_002: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_02_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_02_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_02_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_02_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_02_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_02_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_02_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_02_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_02_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_02_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_02_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_02_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_02_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_02_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_02_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 256 MRR_Status_CANVersion: 8 MRR
+ SG_ CAN_USC_SECTION_COMPATIBILITY : 23|16@0+ (1,0) [0|65535] "" External_Tool
+ SG_ CAN_PCAN_MINOR_MRR : 7|8@0+ (1,0) [0|255] "" IFV_VFP
+ SG_ CAN_PCAN_MAJOR_MRR : 15|8@0+ (1,0) [0|255] "" IFV_VFP
+
+BO_ 257 MRR_Status_Radar: 8 MRR
+ SG_ CAN_INTERFERENCE_TYPE : 11|2@0+ (1,0) [0|3] "" IFV_Host
+ SG_ CAN_RECOMMEND_UNCONVERGE : 9|1@0+ (1,0) [0|1] "" IFV_Host
+ SG_ CAN_BLOCKAGE_SIDELOBE_FILTER_VAL : 15|4@0+ (1,0) [0|15] "" IFV_Host
+ SG_ CAN_RADAR_ALIGN_INCOMPLETE : 8|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_BLOCKAGE_SIDELOBE : 4|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_BLOCKAGE_MNR : 5|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_EXT_COND_NOK : 1|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_ALIGN_OUT_RANGE : 2|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_ALIGN_NOT_START : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_OVERHEAT_ERROR : 3|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_NOT_OP : 6|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_XCVR_OPERATIONAL : 7|1@0+ (1,0) [0|1] "" IFV_VFP
+
+BO_ 288 MRR_Detection_001: 64 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_01_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_01_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_01_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_01_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_01_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_CONFID_AZIMUTH_01_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_01_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_01_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_01_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_01_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_01_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_01_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_01_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_01_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_01_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes";
+BA_DEF_ SG_ "CrossOver_LIN" ENUM "No","Yes","No","Yes";
+BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes","No","Yes","No","Yes";
+BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ SG_ "GenSigTimeoutTime_RCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_OCS" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_CCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_IPMA" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_SCCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_Generic_BCM" INT 0 100000;
+BA_DEF_ BO_ "NmMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "TpTxIndex" INT 0 255;
+BA_DEF_ BO_ "DiagState" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "TpApplType" STRING ;
+BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "Mulitplexer" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "EventRateOfChange" INT 10 10000;
+BA_DEF_ BO_ "GenMsgHandlingTypeDoc" STRING ;
+BA_DEF_ BO_ "GenMsgHandlingTypeCode" STRING ;
+BA_DEF_ BO_ "GenMsgMarked" STRING ;
+BA_DEF_ SG_ "GenSigMarked" STRING ;
+BA_DEF_ SG_ "GenSigVtIndex" STRING ;
+BA_DEF_ SG_ "GenSigVtName" STRING ;
+BA_DEF_ SG_ "GenSigVtEn" STRING ;
+BA_DEF_ SG_ "GenSigSNA" STRING ;
+BA_DEF_ SG_ "GenSigCmt" STRING ;
+BA_DEF_ BO_ "GenMsgCmt" STRING ;
+BA_DEF_ SG_ "GenSigSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType";
+BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000;
+BA_DEF_ SG_ "GenSigMissingSourceValue" INT 0 1e+09;
+BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes";
+BA_DEF_ SG_ "GenSigStartValue" INT 0 1e+09;
+BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes";
+BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "GenMsgSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType";
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000;
+BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000;
+BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100;
+BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000;
+BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes";
+BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes";
+BA_DEF_ BU_ "ILUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BU_ "PowerType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes","Switched","Latched","Sleep","vector_leerstring","vector_leerstring";
+BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000;
+BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000;
+BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ;
+BA_DEF_ BO_ "GenMsgForegroundColor" STRING ;
+BA_ "GenMsgCycleTime" BO_ 34 1000;
+BA_ "GenMsgSendType" BO_ 34 0;
+BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck";
+BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck";
+BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg";
+BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg";
+BA_ "GenSigVtEn" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure";
+BA_ "GenSigVtName" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure";
+BA_ "GenSigVtEn" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError";
+BA_ "GenSigVtName" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError";
+BA_ "GenSigVtEn" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError";
+BA_ "GenSigVtName" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError";
+BA_ "GenMsgCycleTime" BO_ 33 1000;
+BA_ "GenMsgSendType" BO_ 33 0;
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4";
+BA_ "GenSigVtEn" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault";
+BA_ "GenSigVtName" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault";
+BA_ "GenSigVtEn" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault";
+BA_ "GenSigVtName" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault";
+BA_ "GenSigVtEn" SG_ 33 HostToArmChksumFault "HostToArmChksumFault";
+BA_ "GenSigVtName" SG_ 33 HostToArmChksumFault "HostToArmChksumFault";
+BA_ "GenSigVtEn" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault";
+BA_ "GenSigVtName" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault";
+BA_ "GenSigVtEn" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange";
+BA_ "GenSigVtName" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 DSPOverrunFault "DSPOverrunFault";
+BA_ "GenSigVtName" SG_ 33 DSPOverrunFault "DSPOverrunFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5";
+BA_ "GenSigVtEn" SG_ 33 TuningSensitivityFault "TuningSensitivityFault";
+BA_ "GenSigVtName" SG_ 33 TuningSensitivityFault "TuningSensitivityFault";
+BA_ "GenSigVtEn" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault";
+BA_ "GenSigVtName" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault";
+BA_ "GenSigVtEn" SG_ 33 LocalOscPowerFault "LocalOscPowerFault";
+BA_ "GenSigVtName" SG_ 33 LocalOscPowerFault "LocalOscPowerFault";
+BA_ "GenSigVtEn" SG_ 33 TransmitterPowerFault "TransmitterPowerFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterPowerFault "TransmitterPowerFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6";
+BA_ "GenSigVtEn" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault";
+BA_ "GenSigVtName" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault";
+BA_ "GenSigVtEn" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault";
+BA_ "GenSigVtName" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault";
+BA_ "GenSigVtEn" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault";
+BA_ "GenSigVtName" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault";
+BA_ "GenSigVtEn" SG_ 33 SidelobeBlockage "SidelobeBlockage";
+BA_ "GenSigVtName" SG_ 33 SidelobeBlockage "SidelobeBlockage";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1";
+BA_ "GenSigVtEn" SG_ 33 MNRBlocked "MNRBlocked";
+BA_ "GenSigVtName" SG_ 33 MNRBlocked "MNRBlocked";
+BA_ "GenSigVtEn" SG_ 33 ECUTempHighFault "ECUTempHighFault";
+BA_ "GenSigVtName" SG_ 33 ECUTempHighFault "ECUTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault";
+BA_ "GenSigVtName" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault";
+BA_ "GenSigVtEn" SG_ 33 UnreasonableRadarData "UnreasonableRadarData";
+BA_ "GenSigVtName" SG_ 33 UnreasonableRadarData "UnreasonableRadarData";
+BA_ "GenSigVtEn" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault";
+BA_ "GenSigVtName" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange";
+BA_ "GenSigVtName" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange";
+BA_ "GenSigVtName" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode";
+BA_ "GenSigVtName" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode";
+BA_ "GenSigVtEn" SG_ 33 BatteryLowFault "BatteryLowFault";
+BA_ "GenSigVtName" SG_ 33 BatteryLowFault "BatteryLowFault";
+BA_ "GenSigVtEn" SG_ 33 BatteryHighFault "BatteryHighFault";
+BA_ "GenSigVtName" SG_ 33 BatteryHighFault "BatteryHighFault";
+BA_ "GenSigVtEn" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4";
+BA_ "GenSigVtEn" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange";
+BA_ "GenSigVtName" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 TransmitterIDFault "TransmitterIDFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterIDFault "TransmitterIDFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2";
+BA_ "GenSigVtEn" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault";
+BA_ "GenSigVtName" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault";
+BA_ "GenSigVtEn" SG_ 33 PCANBusOff "PCANBusOff";
+BA_ "GenSigVtName" SG_ 33 PCANBusOff "PCANBusOff";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6";
+BA_ "GenSigVtEn" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault";
+BA_ "GenSigVtName" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault";
+BA_ "GenSigVtEn" SG_ 33 StackOverflowFault "StackOverflowFault";
+BA_ "GenSigVtName" SG_ 33 StackOverflowFault "StackOverflowFault";
+BA_ "GenSigVtEn" SG_ 33 WatchdogFault "WatchdogFault";
+BA_ "GenSigVtName" SG_ 33 WatchdogFault "WatchdogFault";
+BA_ "GenSigVtEn" SG_ 33 PLLLockFault "PLLLockFault";
+BA_ "GenSigVtName" SG_ 33 PLLLockFault "PLLLockFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1";
+BA_ "GenSigVtEn" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault";
+BA_ "GenSigVtName" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault";
+BA_ "GenSigVtName" SG_ 33 USCValidationFault "USCValidationFault";
+BA_ "GenSigVtEn" SG_ 33 USCValidationFault "USCValidationFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3";
+BA_ "GenSigVtEn" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault";
+BA_ "GenSigVtName" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault";
+BA_ "GenSigVtEn" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum";
+BA_ "GenSigVtName" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum";
+BA_ "GenSigVtEn" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault";
+BA_ "GenSigVtName" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault";
+BA_ "GenMsgNrOfRepetition" BO_ 500 0;
+BA_ "GenMsgSendType" BO_ 500 1;
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte7 "MRR_xcp_daq_resp_byte7";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte6 "MRR_xcp_daq_resp_byte6";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte5 "MRR_xcp_daq_resp_byte5";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte4 "MRR_xcp_daq_resp_byte4";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte3 "MRR_xcp_daq_resp_byte3";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte2 "MRR_xcp_daq_resp_byte2";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte1 "MRR_xcp_daq_resp_byte1";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte0 "MRR_xcp_daq_resp_byte0";
+BA_ "GenMsgNrOfRepetition" BO_ 499 0;
+BA_ "GenMsgSendType" BO_ 499 1;
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte7 "MRR_xcp_dto_resp_byte7";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte6 "MRR_xcp_dto_resp_byte6";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte5 "MRR_xcp_dto_resp_byte5";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte4 "MRR_xcp_dto_resp_byte4";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte3 "MRR_xcp_dto_resp_byte3";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte2 "MRR_xcp_dto_resp_byte2";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte1 "MRR_xcp_dto_resp_byte1";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte0 "MRR_xcp_dto_resp_byte0";
+BA_ "GenMsgNrOfRepetition" BO_ 497 0;
+BA_ "GenMsgSendType" BO_ 497 1;
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte7 "MRR_xcp_cto_resp_byte7";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte6 "MRR_xcp_cto_resp_byte6";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte5 "MRR_xcp_cto_resp_byte5";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte4 "MRR_xcp_cto_resp_byte4";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte3 "MRR_xcp_cto_resp_byte3";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte2 "MRR_xcp_cto_resp_byte2";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte1 "MRR_xcp_cto_resp_byte1";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte0 "MRR_xcp_cto_resp_byte0";
+BA_ "GenMsgSendType" BO_ 1900 1;
+BA_ "GenMsgNrOfRepetition" BO_ 1900 0;
+BA_ "DiagResponse" BO_ 1900 1;
+BA_ "GenSigCmt" SG_ 1900 TesterPhysicalResCCM "TesterPhysicalResCCM";
+BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 0;
+BA_ "GenMsgSendType" BO_ 261 0;
+BA_ "GenMsgCycleTime" BO_ 261 1000;
+BA_ "GenMsgNrOfRepetition" BO_ 261 0;
+BA_ "GenSigCmt" SG_ 261 CAN_SEQUENCE_NUMBER "CAN_SEQUENCE_NUMBER";
+BA_ "GenSigCmt" SG_ 261 CAN_SERIAL_NUMBER "CAN_SERIAL_NUMBER";
+BA_ "GenSigSendType" SG_ 261 CAN_SERIAL_NUMBER 0;
+BA_ "GenMsgSendType" BO_ 264 1;
+BA_ "GenMsgNrOfRepetition" BO_ 264 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Field_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Promote_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Field_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Promote_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Release_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Release_Revision 0;
+BA_ "GenMsgSendType" BO_ 373 1;
+BA_ "NetworkInitialization" BO_ 373 0;
+BA_ "GenMsgNrOfRepetition" BO_ 373 0;
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_POLARITY 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_POLARITY "CAN_SENSOR_POLARITY";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LAT_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LAT_OFFSET "CAN_SENSOR_LAT_OFFSET";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LONG_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LONG_OFFSET "CAN_SENSOR_LONG_OFFSET";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_HANGLE_OFFSET "CAN_SENSOR_HANGLE_OFFSET";
+BA_ "GenSigStartValue" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0;
+BA_ "GenMsgSendType" BO_ 372 1;
+BA_ "NetworkInitialization" BO_ 372 0;
+BA_ "GenMsgNrOfRepetition" BO_ 372 0;
+BA_ "GenSigSendType" SG_ 372 CAN_SENSOR_FOV_HOR 0;
+BA_ "GenSigCmt" SG_ 372 CAN_SENSOR_FOV_HOR "CAN_SENSOR_FOV_HOR";
+BA_ "GenSigStartValue" SG_ 372 CAN_SENSOR_FOV_HOR 0;
+BA_ "GenSigSendType" SG_ 372 CAN_DOPPLER_COVERAGE 0;
+BA_ "GenSigCmt" SG_ 372 CAN_DOPPLER_COVERAGE "CAN_DOPPLER_COVERAGE";
+BA_ "GenSigStartValue" SG_ 372 CAN_DOPPLER_COVERAGE 0;
+BA_ "GenSigSendType" SG_ 372 CAN_RANGE_COVERAGE 0;
+BA_ "GenSigCmt" SG_ 372 CAN_RANGE_COVERAGE "CAN_RANGE_COVERAGE";
+BA_ "GenMsgSendType" BO_ 371 1;
+BA_ "NetworkInitialization" BO_ 371 0;
+BA_ "GenMsgNrOfRepetition" BO_ 371 0;
+BA_ "GenSigVtEn" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigVtName" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATUS 0;
+BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATE 0;
+BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0;
+BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF "CAN_AUTO_ALIGN_HANGLE_REF";
+BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0;
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE "CAN_AUTO_ALIGN_HANGLE";
+BA_ "GenMsgSendType" BO_ 369 1;
+BA_ "NetworkInitialization" BO_ 369 0;
+BA_ "GenMsgNrOfRepetition" BO_ 369 0;
+BA_ "GenSigCmt" SG_ 369 CAN_DET_TIME_SINCE_MEAS "CAN_DET_TIME_SINCE_MEAS";
+BA_ "GenSigSendType" SG_ 369 CAN_DET_TIME_SINCE_MEAS 0;
+BA_ "GenSigSendType" SG_ 369 CAN_SENSOR_TIME_STAMP 0;
+BA_ "GenSigCmt" SG_ 369 CAN_SENSOR_TIME_STAMP "CAN_SENSOR_TIME_STAMP";
+BA_ "GenMsgSendType" BO_ 368 1;
+BA_ "NetworkInitialization" BO_ 368 0;
+BA_ "GenMsgNrOfRepetition" BO_ 368 0;
+BA_ "GenSigSendType" SG_ 368 CAN_ALIGN_UPDATES_DONE 0;
+BA_ "GenSigCmt" SG_ 368 CAN_ALIGN_UPDATES_DONE "CAN_ALIGN_UPDATES_DONE";
+BA_ "GenSigSendType" SG_ 368 CAN_SCAN_INDEX 0;
+BA_ "GenSigCmt" SG_ 368 CAN_SCAN_INDEX "CAN_SCAN_INDEX";
+BA_ "GenSigSendType" SG_ 368 CAN_NUMBER_OF_DET 0;
+BA_ "GenSigCmt" SG_ 368 CAN_NUMBER_OF_DET "CAN_NUMBER_OF_DET";
+BA_ "GenSigSendType" SG_ 368 CAN_LOOK_ID 0;
+BA_ "GenSigCmt" SG_ 368 CAN_LOOK_ID "CAN_LOOK_ID";
+BA_ "GenSigSendType" SG_ 368 CAN_LOOK_INDEX 0;
+BA_ "GenSigCmt" SG_ 368 CAN_LOOK_INDEX "CAN_LOOK_INDEX";
+BA_ "GenMsgSendType" BO_ 265 1;
+BA_ "NetworkInitialization" BO_ 265 0;
+BA_ "GenMsgNrOfRepetition" BO_ 265 0;
+BA_ "GenSigCmt" SG_ 265 CAN_BATT_VOLTS "CAN_BATT_VOLTS";
+BA_ "GenSigCmt" SG_ 265 CAN_1_25_V "CAN_1_25_V";
+BA_ "GenSigCmt" SG_ 265 CAN_5_V "CAN_5_V";
+BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_RAW "CAN_3_3_V_RAW";
+BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_DAC "CAN_3_3_V_DAC";
+BA_ "GenSigSendType" SG_ 265 CAN_MMIC_Temp1 0;
+BA_ "GenSigCmt" SG_ 265 CAN_MMIC_Temp1 "CAN_MMIC_Temp1";
+BA_ "GenSigStartValue" SG_ 265 CAN_MMIC_Temp1 0;
+BA_ "GenSigSendType" SG_ 265 CAN_Processor_Thermistor 0;
+BA_ "GenSigCmt" SG_ 265 CAN_Processor_Thermistor "CAN_Processor_Thermistor";
+BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Thermistor 0;
+BA_ "GenSigSendType" SG_ 265 CAN_Processor_Temp1 0;
+BA_ "GenSigCmt" SG_ 265 CAN_Processor_Temp1 "CAN_Processor_Temp1";
+BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Temp1 0;
+BA_ "GenMsgSendType" BO_ 291 1;
+BA_ "GenMsgILSupport" BO_ 291 1;
+BA_ "GenMsgNrOfRepetition" BO_ 291 0;
+BA_ "GenMsgCycleTime" BO_ 291 0;
+BA_ "NetworkInitialization" BO_ 291 0;
+BA_ "GenMsgDelayTime" BO_ 291 0;
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 "CAN_DET_CONFID_AZIMUTH_04_01";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 "CAN_DET_CONFID_AZIMUTH_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 "CAN_DET_CONFID_AZIMUTH_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_01 "CAN_DET_SUPER_RES_TARGET_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_01 "CAN_DET_ND_TARGET_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_01 "CAN_DET_HOST_VEH_CLUTTER_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_01 "CAN_DET_VALID_LEVEL_04_01";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_01 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_01 "CAN_DET_AZIMUTH_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_01 "CAN_DET_RANGE_04_01";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_01 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_01 "CAN_DET_RANGE_RATE_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_01 "CAN_DET_AMPLITUDE_04_01";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_01 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_01 "CAN_SCAN_INDEX_2LSB_04_01";
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 "CAN_DET_CONFID_AZIMUTH_04_02";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 "CAN_DET_CONFID_AZIMUTH_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 "CAN_DET_CONFID_AZIMUTH_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_02 "CAN_DET_SUPER_RES_TARGET_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_02 "CAN_DET_ND_TARGET_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_02 "CAN_DET_HOST_VEH_CLUTTER_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_02 "CAN_DET_VALID_LEVEL_04_02";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_02 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_02 "CAN_DET_AZIMUTH_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_02 "CAN_DET_RANGE_04_02";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_02 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_02 "CAN_DET_RANGE_RATE_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_02 "CAN_DET_AMPLITUDE_04_02";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_02 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_02 "CAN_SCAN_INDEX_2LSB_04_02";
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 "CAN_DET_CONFID_AZIMUTH_04_03";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 "CAN_DET_CONFID_AZIMUTH_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 "CAN_DET_CONFID_AZIMUTH_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_03 "CAN_DET_SUPER_RES_TARGET_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_03 "CAN_DET_ND_TARGET_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_03 "CAN_DET_HOST_VEH_CLUTTER_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_03 "CAN_DET_VALID_LEVEL_04_03";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_03 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_03 "CAN_DET_AZIMUTH_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_03 "CAN_DET_RANGE_04_03";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_03 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_03 "CAN_DET_RANGE_RATE_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_03 "CAN_DET_AMPLITUDE_04_03";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_03 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_03 "CAN_SCAN_INDEX_2LSB_04_03";
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 "CAN_DET_CONFID_AZIMUTH_04_04";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 "CAN_DET_CONFID_AZIMUTH_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 "CAN_DET_CONFID_AZIMUTH_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_04 "CAN_DET_SUPER_RES_TARGET_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_04 "CAN_DET_ND_TARGET_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_04 "CAN_DET_HOST_VEH_CLUTTER_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_04 "CAN_DET_VALID_LEVEL_04_04";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_04 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_04 "CAN_DET_AZIMUTH_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_04 "CAN_DET_RANGE_04_04";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_04 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_04 "CAN_DET_RANGE_RATE_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_04 "CAN_DET_AMPLITUDE_04_04";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_04 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_04 "CAN_SCAN_INDEX_2LSB_04_04";
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 "CAN_DET_CONFID_AZIMUTH_04_05";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 "CAN_DET_CONFID_AZIMUTH_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 "CAN_DET_CONFID_AZIMUTH_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_05 "CAN_DET_SUPER_RES_TARGET_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_05 "CAN_DET_ND_TARGET_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_05 "CAN_DET_HOST_VEH_CLUTTER_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_05 "CAN_DET_VALID_LEVEL_04_05";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_05 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_05 "CAN_DET_AZIMUTH_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_05 "CAN_DET_RANGE_04_05";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_05 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_05 "CAN_DET_RANGE_RATE_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_05 "CAN_DET_AMPLITUDE_04_05";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_05 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_05 "CAN_SCAN_INDEX_2LSB_04_05";
+BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 "CAN_DET_CONFID_AZIMUTH_04_06";
+BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 "CAN_DET_CONFID_AZIMUTH_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 "CAN_DET_CONFID_AZIMUTH_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_06 "CAN_DET_SUPER_RES_TARGET_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_06 "CAN_DET_ND_TARGET_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_06 "CAN_DET_HOST_VEH_CLUTTER_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_06 "CAN_DET_VALID_LEVEL_04_06";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_06 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_06 "CAN_DET_AZIMUTH_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_06 "CAN_DET_RANGE_04_06";
+BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_06 0;
+BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_06 "CAN_DET_RANGE_RATE_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_06 "CAN_DET_AMPLITUDE_04_06";
+BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_06 0;
+BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_06 "CAN_SCAN_INDEX_2LSB_04_06";
+BA_ "GenMsgSendType" BO_ 351 1;
+BA_ "GenMsgILSupport" BO_ 351 1;
+BA_ "GenMsgNrOfRepetition" BO_ 351 0;
+BA_ "GenMsgCycleTime" BO_ 351 0;
+BA_ "NetworkInitialization" BO_ 351 0;
+BA_ "GenMsgDelayTime" BO_ 351 0;
+BA_ "GenSigVtEn" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigVtName" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 "CAN_DET_SUPER_RES_TARGET_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_ND_TARGET_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_ND_TARGET_64 "CAN_DET_ND_TARGET_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 "CAN_DET_HOST_VEH_CLUTTER_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_VALID_LEVEL_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_VALID_LEVEL_64 "CAN_DET_VALID_LEVEL_64";
+BA_ "GenSigStartValue" SG_ 351 CAN_DET_AZIMUTH_64 0;
+BA_ "GenSigSendType" SG_ 351 CAN_DET_AZIMUTH_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_AZIMUTH_64 "CAN_DET_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_64 "CAN_DET_RANGE_64";
+BA_ "GenSigStartValue" SG_ 351 CAN_DET_RANGE_RATE_64 0;
+BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_RATE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_RATE_64 "CAN_DET_RANGE_RATE_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_AMPLITUDE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_AMPLITUDE_64 "CAN_DET_AMPLITUDE_64";
+BA_ "GenSigSendType" SG_ 351 CAN_SCAN_INDEX_2LSB_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_SCAN_INDEX_2LSB_64 "CAN_SCAN_INDEX_2LSB_64";
+BA_ "GenMsgSendType" BO_ 350 1;
+BA_ "GenMsgILSupport" BO_ 350 1;
+BA_ "GenMsgNrOfRepetition" BO_ 350 0;
+BA_ "GenMsgCycleTime" BO_ 350 0;
+BA_ "NetworkInitialization" BO_ 350 0;
+BA_ "GenMsgDelayTime" BO_ 350 0;
+BA_ "GenSigVtEn" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigVtName" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 "CAN_DET_SUPER_RES_TARGET_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_ND_TARGET_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_ND_TARGET_63 "CAN_DET_ND_TARGET_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 "CAN_DET_HOST_VEH_CLUTTER_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_VALID_LEVEL_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_VALID_LEVEL_63 "CAN_DET_VALID_LEVEL_63";
+BA_ "GenSigStartValue" SG_ 350 CAN_DET_AZIMUTH_63 0;
+BA_ "GenSigSendType" SG_ 350 CAN_DET_AZIMUTH_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_AZIMUTH_63 "CAN_DET_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_63 "CAN_DET_RANGE_63";
+BA_ "GenSigStartValue" SG_ 350 CAN_DET_RANGE_RATE_63 0;
+BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_RATE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_RATE_63 "CAN_DET_RANGE_RATE_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_AMPLITUDE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_AMPLITUDE_63 "CAN_DET_AMPLITUDE_63";
+BA_ "GenSigSendType" SG_ 350 CAN_SCAN_INDEX_2LSB_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_SCAN_INDEX_2LSB_63 "CAN_SCAN_INDEX_2LSB_63";
+BA_ "GenMsgSendType" BO_ 349 1;
+BA_ "GenMsgILSupport" BO_ 349 1;
+BA_ "GenMsgNrOfRepetition" BO_ 349 0;
+BA_ "GenMsgCycleTime" BO_ 349 0;
+BA_ "NetworkInitialization" BO_ 349 0;
+BA_ "GenMsgDelayTime" BO_ 349 0;
+BA_ "GenSigVtEn" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigVtName" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 "CAN_DET_SUPER_RES_TARGET_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_ND_TARGET_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_ND_TARGET_62 "CAN_DET_ND_TARGET_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 "CAN_DET_HOST_VEH_CLUTTER_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_VALID_LEVEL_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_VALID_LEVEL_62 "CAN_DET_VALID_LEVEL_62";
+BA_ "GenSigStartValue" SG_ 349 CAN_DET_AZIMUTH_62 0;
+BA_ "GenSigSendType" SG_ 349 CAN_DET_AZIMUTH_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_AZIMUTH_62 "CAN_DET_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_62 "CAN_DET_RANGE_62";
+BA_ "GenSigStartValue" SG_ 349 CAN_DET_RANGE_RATE_62 0;
+BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_RATE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_RATE_62 "CAN_DET_RANGE_RATE_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_AMPLITUDE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_AMPLITUDE_62 "CAN_DET_AMPLITUDE_62";
+BA_ "GenSigSendType" SG_ 349 CAN_SCAN_INDEX_2LSB_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_SCAN_INDEX_2LSB_62 "CAN_SCAN_INDEX_2LSB_62";
+BA_ "GenMsgSendType" BO_ 348 1;
+BA_ "GenMsgILSupport" BO_ 348 1;
+BA_ "GenMsgNrOfRepetition" BO_ 348 0;
+BA_ "GenMsgCycleTime" BO_ 348 0;
+BA_ "NetworkInitialization" BO_ 348 0;
+BA_ "GenMsgDelayTime" BO_ 348 0;
+BA_ "GenSigVtEn" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigVtName" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 "CAN_DET_SUPER_RES_TARGET_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_ND_TARGET_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_ND_TARGET_61 "CAN_DET_ND_TARGET_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 "CAN_DET_HOST_VEH_CLUTTER_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_VALID_LEVEL_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_VALID_LEVEL_61 "CAN_DET_VALID_LEVEL_61";
+BA_ "GenSigStartValue" SG_ 348 CAN_DET_AZIMUTH_61 0;
+BA_ "GenSigSendType" SG_ 348 CAN_DET_AZIMUTH_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_AZIMUTH_61 "CAN_DET_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_61 "CAN_DET_RANGE_61";
+BA_ "GenSigStartValue" SG_ 348 CAN_DET_RANGE_RATE_61 0;
+BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_RATE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_RATE_61 "CAN_DET_RANGE_RATE_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_AMPLITUDE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_AMPLITUDE_61 "CAN_DET_AMPLITUDE_61";
+BA_ "GenSigSendType" SG_ 348 CAN_SCAN_INDEX_2LSB_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_SCAN_INDEX_2LSB_61 "CAN_SCAN_INDEX_2LSB_61";
+BA_ "GenMsgSendType" BO_ 347 1;
+BA_ "GenMsgILSupport" BO_ 347 1;
+BA_ "GenMsgNrOfRepetition" BO_ 347 0;
+BA_ "GenMsgCycleTime" BO_ 347 0;
+BA_ "NetworkInitialization" BO_ 347 0;
+BA_ "GenMsgDelayTime" BO_ 347 0;
+BA_ "GenSigVtEn" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigVtName" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 "CAN_DET_SUPER_RES_TARGET_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_ND_TARGET_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_ND_TARGET_60 "CAN_DET_ND_TARGET_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 "CAN_DET_HOST_VEH_CLUTTER_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_VALID_LEVEL_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_VALID_LEVEL_60 "CAN_DET_VALID_LEVEL_60";
+BA_ "GenSigStartValue" SG_ 347 CAN_DET_AZIMUTH_60 0;
+BA_ "GenSigSendType" SG_ 347 CAN_DET_AZIMUTH_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_AZIMUTH_60 "CAN_DET_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_60 "CAN_DET_RANGE_60";
+BA_ "GenSigStartValue" SG_ 347 CAN_DET_RANGE_RATE_60 0;
+BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_RATE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_RATE_60 "CAN_DET_RANGE_RATE_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_AMPLITUDE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_AMPLITUDE_60 "CAN_DET_AMPLITUDE_60";
+BA_ "GenSigSendType" SG_ 347 CAN_SCAN_INDEX_2LSB_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_SCAN_INDEX_2LSB_60 "CAN_SCAN_INDEX_2LSB_60";
+BA_ "GenMsgSendType" BO_ 346 1;
+BA_ "GenMsgILSupport" BO_ 346 1;
+BA_ "GenMsgNrOfRepetition" BO_ 346 0;
+BA_ "GenMsgCycleTime" BO_ 346 0;
+BA_ "NetworkInitialization" BO_ 346 0;
+BA_ "GenMsgDelayTime" BO_ 346 0;
+BA_ "GenSigVtEn" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigVtName" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 "CAN_DET_SUPER_RES_TARGET_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_ND_TARGET_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_ND_TARGET_59 "CAN_DET_ND_TARGET_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 "CAN_DET_HOST_VEH_CLUTTER_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_VALID_LEVEL_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_VALID_LEVEL_59 "CAN_DET_VALID_LEVEL_59";
+BA_ "GenSigStartValue" SG_ 346 CAN_DET_AZIMUTH_59 0;
+BA_ "GenSigSendType" SG_ 346 CAN_DET_AZIMUTH_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_AZIMUTH_59 "CAN_DET_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_59 "CAN_DET_RANGE_59";
+BA_ "GenSigStartValue" SG_ 346 CAN_DET_RANGE_RATE_59 0;
+BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_RATE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_RATE_59 "CAN_DET_RANGE_RATE_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_AMPLITUDE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_AMPLITUDE_59 "CAN_DET_AMPLITUDE_59";
+BA_ "GenSigSendType" SG_ 346 CAN_SCAN_INDEX_2LSB_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_SCAN_INDEX_2LSB_59 "CAN_SCAN_INDEX_2LSB_59";
+BA_ "GenMsgSendType" BO_ 345 1;
+BA_ "GenMsgILSupport" BO_ 345 1;
+BA_ "GenMsgNrOfRepetition" BO_ 345 0;
+BA_ "GenMsgCycleTime" BO_ 345 0;
+BA_ "NetworkInitialization" BO_ 345 0;
+BA_ "GenMsgDelayTime" BO_ 345 0;
+BA_ "GenSigVtEn" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigVtName" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 "CAN_DET_SUPER_RES_TARGET_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_ND_TARGET_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_ND_TARGET_58 "CAN_DET_ND_TARGET_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 "CAN_DET_HOST_VEH_CLUTTER_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_VALID_LEVEL_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_VALID_LEVEL_58 "CAN_DET_VALID_LEVEL_58";
+BA_ "GenSigStartValue" SG_ 345 CAN_DET_AZIMUTH_58 0;
+BA_ "GenSigSendType" SG_ 345 CAN_DET_AZIMUTH_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_AZIMUTH_58 "CAN_DET_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_58 "CAN_DET_RANGE_58";
+BA_ "GenSigStartValue" SG_ 345 CAN_DET_RANGE_RATE_58 0;
+BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_RATE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_RATE_58 "CAN_DET_RANGE_RATE_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_AMPLITUDE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_AMPLITUDE_58 "CAN_DET_AMPLITUDE_58";
+BA_ "GenSigSendType" SG_ 345 CAN_SCAN_INDEX_2LSB_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_SCAN_INDEX_2LSB_58 "CAN_SCAN_INDEX_2LSB_58";
+BA_ "GenMsgSendType" BO_ 344 1;
+BA_ "GenMsgILSupport" BO_ 344 1;
+BA_ "GenMsgNrOfRepetition" BO_ 344 0;
+BA_ "GenMsgCycleTime" BO_ 344 0;
+BA_ "NetworkInitialization" BO_ 344 0;
+BA_ "GenMsgDelayTime" BO_ 344 0;
+BA_ "GenSigVtEn" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigVtName" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 "CAN_DET_SUPER_RES_TARGET_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_ND_TARGET_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_ND_TARGET_57 "CAN_DET_ND_TARGET_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 "CAN_DET_HOST_VEH_CLUTTER_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_VALID_LEVEL_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_VALID_LEVEL_57 "CAN_DET_VALID_LEVEL_57";
+BA_ "GenSigStartValue" SG_ 344 CAN_DET_AZIMUTH_57 0;
+BA_ "GenSigSendType" SG_ 344 CAN_DET_AZIMUTH_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_AZIMUTH_57 "CAN_DET_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_57 "CAN_DET_RANGE_57";
+BA_ "GenSigStartValue" SG_ 344 CAN_DET_RANGE_RATE_57 0;
+BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_RATE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_RATE_57 "CAN_DET_RANGE_RATE_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_AMPLITUDE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_AMPLITUDE_57 "CAN_DET_AMPLITUDE_57";
+BA_ "GenSigSendType" SG_ 344 CAN_SCAN_INDEX_2LSB_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_SCAN_INDEX_2LSB_57 "CAN_SCAN_INDEX_2LSB_57";
+BA_ "GenMsgSendType" BO_ 343 1;
+BA_ "GenMsgILSupport" BO_ 343 1;
+BA_ "GenMsgNrOfRepetition" BO_ 343 0;
+BA_ "GenMsgCycleTime" BO_ 343 0;
+BA_ "NetworkInitialization" BO_ 343 0;
+BA_ "GenMsgDelayTime" BO_ 343 0;
+BA_ "GenSigVtEn" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigVtName" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 "CAN_DET_SUPER_RES_TARGET_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_ND_TARGET_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_ND_TARGET_56 "CAN_DET_ND_TARGET_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 "CAN_DET_HOST_VEH_CLUTTER_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_VALID_LEVEL_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_VALID_LEVEL_56 "CAN_DET_VALID_LEVEL_56";
+BA_ "GenSigStartValue" SG_ 343 CAN_DET_AZIMUTH_56 0;
+BA_ "GenSigSendType" SG_ 343 CAN_DET_AZIMUTH_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_AZIMUTH_56 "CAN_DET_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_56 "CAN_DET_RANGE_56";
+BA_ "GenSigStartValue" SG_ 343 CAN_DET_RANGE_RATE_56 0;
+BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_RATE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_RATE_56 "CAN_DET_RANGE_RATE_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_AMPLITUDE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_AMPLITUDE_56 "CAN_DET_AMPLITUDE_56";
+BA_ "GenSigSendType" SG_ 343 CAN_SCAN_INDEX_2LSB_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_SCAN_INDEX_2LSB_56 "CAN_SCAN_INDEX_2LSB_56";
+BA_ "GenMsgSendType" BO_ 342 1;
+BA_ "GenMsgILSupport" BO_ 342 1;
+BA_ "GenMsgNrOfRepetition" BO_ 342 0;
+BA_ "GenMsgCycleTime" BO_ 342 0;
+BA_ "NetworkInitialization" BO_ 342 0;
+BA_ "GenMsgDelayTime" BO_ 342 0;
+BA_ "GenSigVtEn" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigVtName" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 "CAN_DET_SUPER_RES_TARGET_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_ND_TARGET_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_ND_TARGET_55 "CAN_DET_ND_TARGET_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 "CAN_DET_HOST_VEH_CLUTTER_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_VALID_LEVEL_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_VALID_LEVEL_55 "CAN_DET_VALID_LEVEL_55";
+BA_ "GenSigStartValue" SG_ 342 CAN_DET_AZIMUTH_55 0;
+BA_ "GenSigSendType" SG_ 342 CAN_DET_AZIMUTH_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_AZIMUTH_55 "CAN_DET_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_55 "CAN_DET_RANGE_55";
+BA_ "GenSigStartValue" SG_ 342 CAN_DET_RANGE_RATE_55 0;
+BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_RATE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_RATE_55 "CAN_DET_RANGE_RATE_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_AMPLITUDE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_AMPLITUDE_55 "CAN_DET_AMPLITUDE_55";
+BA_ "GenSigSendType" SG_ 342 CAN_SCAN_INDEX_2LSB_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_SCAN_INDEX_2LSB_55 "CAN_SCAN_INDEX_2LSB_55";
+BA_ "GenMsgSendType" BO_ 335 1;
+BA_ "GenMsgILSupport" BO_ 335 1;
+BA_ "GenMsgNrOfRepetition" BO_ 335 0;
+BA_ "GenMsgCycleTime" BO_ 335 0;
+BA_ "NetworkInitialization" BO_ 335 0;
+BA_ "GenMsgDelayTime" BO_ 335 0;
+BA_ "GenSigVtEn" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigVtName" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 "CAN_DET_SUPER_RES_TARGET_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_ND_TARGET_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_ND_TARGET_48 "CAN_DET_ND_TARGET_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 "CAN_DET_HOST_VEH_CLUTTER_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_VALID_LEVEL_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_VALID_LEVEL_48 "CAN_DET_VALID_LEVEL_48";
+BA_ "GenSigStartValue" SG_ 335 CAN_DET_AZIMUTH_48 0;
+BA_ "GenSigSendType" SG_ 335 CAN_DET_AZIMUTH_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_AZIMUTH_48 "CAN_DET_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_48 "CAN_DET_RANGE_48";
+BA_ "GenSigStartValue" SG_ 335 CAN_DET_RANGE_RATE_48 0;
+BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_RATE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_RATE_48 "CAN_DET_RANGE_RATE_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_AMPLITUDE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_AMPLITUDE_48 "CAN_DET_AMPLITUDE_48";
+BA_ "GenSigSendType" SG_ 335 CAN_SCAN_INDEX_2LSB_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_SCAN_INDEX_2LSB_48 "CAN_SCAN_INDEX_2LSB_48";
+BA_ "GenMsgSendType" BO_ 334 1;
+BA_ "GenMsgILSupport" BO_ 334 1;
+BA_ "GenMsgNrOfRepetition" BO_ 334 0;
+BA_ "GenMsgCycleTime" BO_ 334 0;
+BA_ "NetworkInitialization" BO_ 334 0;
+BA_ "GenMsgDelayTime" BO_ 334 0;
+BA_ "GenSigVtEn" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigVtName" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 "CAN_DET_SUPER_RES_TARGET_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_ND_TARGET_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_ND_TARGET_47 "CAN_DET_ND_TARGET_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 "CAN_DET_HOST_VEH_CLUTTER_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_VALID_LEVEL_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_VALID_LEVEL_47 "CAN_DET_VALID_LEVEL_47";
+BA_ "GenSigStartValue" SG_ 334 CAN_DET_AZIMUTH_47 0;
+BA_ "GenSigSendType" SG_ 334 CAN_DET_AZIMUTH_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_AZIMUTH_47 "CAN_DET_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_47 "CAN_DET_RANGE_47";
+BA_ "GenSigStartValue" SG_ 334 CAN_DET_RANGE_RATE_47 0;
+BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_RATE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_RATE_47 "CAN_DET_RANGE_RATE_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_AMPLITUDE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_AMPLITUDE_47 "CAN_DET_AMPLITUDE_47";
+BA_ "GenSigSendType" SG_ 334 CAN_SCAN_INDEX_2LSB_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_SCAN_INDEX_2LSB_47 "CAN_SCAN_INDEX_2LSB_47";
+BA_ "GenMsgSendType" BO_ 333 1;
+BA_ "GenMsgILSupport" BO_ 333 1;
+BA_ "GenMsgNrOfRepetition" BO_ 333 0;
+BA_ "GenMsgCycleTime" BO_ 333 0;
+BA_ "NetworkInitialization" BO_ 333 0;
+BA_ "GenMsgDelayTime" BO_ 333 0;
+BA_ "GenSigVtEn" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigVtName" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 "CAN_DET_SUPER_RES_TARGET_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_ND_TARGET_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_ND_TARGET_46 "CAN_DET_ND_TARGET_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 "CAN_DET_HOST_VEH_CLUTTER_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_VALID_LEVEL_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_VALID_LEVEL_46 "CAN_DET_VALID_LEVEL_46";
+BA_ "GenSigStartValue" SG_ 333 CAN_DET_AZIMUTH_46 0;
+BA_ "GenSigSendType" SG_ 333 CAN_DET_AZIMUTH_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_AZIMUTH_46 "CAN_DET_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_46 "CAN_DET_RANGE_46";
+BA_ "GenSigStartValue" SG_ 333 CAN_DET_RANGE_RATE_46 0;
+BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_RATE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_RATE_46 "CAN_DET_RANGE_RATE_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_AMPLITUDE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_AMPLITUDE_46 "CAN_DET_AMPLITUDE_46";
+BA_ "GenSigSendType" SG_ 333 CAN_SCAN_INDEX_2LSB_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_SCAN_INDEX_2LSB_46 "CAN_SCAN_INDEX_2LSB_46";
+BA_ "GenMsgSendType" BO_ 332 1;
+BA_ "GenMsgILSupport" BO_ 332 1;
+BA_ "GenMsgNrOfRepetition" BO_ 332 0;
+BA_ "GenMsgCycleTime" BO_ 332 0;
+BA_ "NetworkInitialization" BO_ 332 0;
+BA_ "GenMsgDelayTime" BO_ 332 0;
+BA_ "GenSigVtEn" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigVtName" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 "CAN_DET_SUPER_RES_TARGET_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_ND_TARGET_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_ND_TARGET_45 "CAN_DET_ND_TARGET_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 "CAN_DET_HOST_VEH_CLUTTER_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_VALID_LEVEL_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_VALID_LEVEL_45 "CAN_DET_VALID_LEVEL_45";
+BA_ "GenSigStartValue" SG_ 332 CAN_DET_AZIMUTH_45 0;
+BA_ "GenSigSendType" SG_ 332 CAN_DET_AZIMUTH_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_AZIMUTH_45 "CAN_DET_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_45 "CAN_DET_RANGE_45";
+BA_ "GenSigStartValue" SG_ 332 CAN_DET_RANGE_RATE_45 0;
+BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_RATE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_RATE_45 "CAN_DET_RANGE_RATE_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_AMPLITUDE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_AMPLITUDE_45 "CAN_DET_AMPLITUDE_45";
+BA_ "GenSigSendType" SG_ 332 CAN_SCAN_INDEX_2LSB_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_SCAN_INDEX_2LSB_45 "CAN_SCAN_INDEX_2LSB_45";
+BA_ "GenMsgSendType" BO_ 331 1;
+BA_ "GenMsgILSupport" BO_ 331 1;
+BA_ "GenMsgNrOfRepetition" BO_ 331 0;
+BA_ "GenMsgCycleTime" BO_ 331 0;
+BA_ "NetworkInitialization" BO_ 331 0;
+BA_ "GenMsgDelayTime" BO_ 331 0;
+BA_ "GenSigVtEn" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigVtName" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 "CAN_DET_SUPER_RES_TARGET_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_ND_TARGET_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_ND_TARGET_44 "CAN_DET_ND_TARGET_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 "CAN_DET_HOST_VEH_CLUTTER_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_VALID_LEVEL_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_VALID_LEVEL_44 "CAN_DET_VALID_LEVEL_44";
+BA_ "GenSigStartValue" SG_ 331 CAN_DET_AZIMUTH_44 0;
+BA_ "GenSigSendType" SG_ 331 CAN_DET_AZIMUTH_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_AZIMUTH_44 "CAN_DET_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_44 "CAN_DET_RANGE_44";
+BA_ "GenSigStartValue" SG_ 331 CAN_DET_RANGE_RATE_44 0;
+BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_RATE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_RATE_44 "CAN_DET_RANGE_RATE_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_AMPLITUDE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_AMPLITUDE_44 "CAN_DET_AMPLITUDE_44";
+BA_ "GenSigSendType" SG_ 331 CAN_SCAN_INDEX_2LSB_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_SCAN_INDEX_2LSB_44 "CAN_SCAN_INDEX_2LSB_44";
+BA_ "GenMsgSendType" BO_ 330 1;
+BA_ "GenMsgILSupport" BO_ 330 1;
+BA_ "GenMsgNrOfRepetition" BO_ 330 0;
+BA_ "GenMsgCycleTime" BO_ 330 0;
+BA_ "NetworkInitialization" BO_ 330 0;
+BA_ "GenMsgDelayTime" BO_ 330 0;
+BA_ "GenSigVtEn" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigVtName" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 "CAN_DET_SUPER_RES_TARGET_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_ND_TARGET_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_ND_TARGET_43 "CAN_DET_ND_TARGET_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 "CAN_DET_HOST_VEH_CLUTTER_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_VALID_LEVEL_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_VALID_LEVEL_43 "CAN_DET_VALID_LEVEL_43";
+BA_ "GenSigStartValue" SG_ 330 CAN_DET_AZIMUTH_43 0;
+BA_ "GenSigSendType" SG_ 330 CAN_DET_AZIMUTH_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_AZIMUTH_43 "CAN_DET_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_43 "CAN_DET_RANGE_43";
+BA_ "GenSigStartValue" SG_ 330 CAN_DET_RANGE_RATE_43 0;
+BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_RATE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_RATE_43 "CAN_DET_RANGE_RATE_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_AMPLITUDE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_AMPLITUDE_43 "CAN_DET_AMPLITUDE_43";
+BA_ "GenSigSendType" SG_ 330 CAN_SCAN_INDEX_2LSB_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_SCAN_INDEX_2LSB_43 "CAN_SCAN_INDEX_2LSB_43";
+BA_ "GenMsgSendType" BO_ 329 1;
+BA_ "GenMsgILSupport" BO_ 329 1;
+BA_ "GenMsgNrOfRepetition" BO_ 329 0;
+BA_ "GenMsgCycleTime" BO_ 329 0;
+BA_ "NetworkInitialization" BO_ 329 0;
+BA_ "GenMsgDelayTime" BO_ 329 0;
+BA_ "GenSigVtEn" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigVtName" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 "CAN_DET_SUPER_RES_TARGET_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_ND_TARGET_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_ND_TARGET_42 "CAN_DET_ND_TARGET_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 "CAN_DET_HOST_VEH_CLUTTER_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_VALID_LEVEL_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_VALID_LEVEL_42 "CAN_DET_VALID_LEVEL_42";
+BA_ "GenSigStartValue" SG_ 329 CAN_DET_AZIMUTH_42 0;
+BA_ "GenSigSendType" SG_ 329 CAN_DET_AZIMUTH_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_AZIMUTH_42 "CAN_DET_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_42 "CAN_DET_RANGE_42";
+BA_ "GenSigStartValue" SG_ 329 CAN_DET_RANGE_RATE_42 0;
+BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_RATE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_RATE_42 "CAN_DET_RANGE_RATE_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_AMPLITUDE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_AMPLITUDE_42 "CAN_DET_AMPLITUDE_42";
+BA_ "GenSigSendType" SG_ 329 CAN_SCAN_INDEX_2LSB_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_SCAN_INDEX_2LSB_42 "CAN_SCAN_INDEX_2LSB_42";
+BA_ "GenMsgSendType" BO_ 328 1;
+BA_ "GenMsgILSupport" BO_ 328 1;
+BA_ "GenMsgNrOfRepetition" BO_ 328 0;
+BA_ "GenMsgCycleTime" BO_ 328 0;
+BA_ "NetworkInitialization" BO_ 328 0;
+BA_ "GenMsgDelayTime" BO_ 328 0;
+BA_ "GenSigVtEn" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigVtName" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 "CAN_DET_SUPER_RES_TARGET_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_ND_TARGET_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_ND_TARGET_41 "CAN_DET_ND_TARGET_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 "CAN_DET_HOST_VEH_CLUTTER_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_VALID_LEVEL_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_VALID_LEVEL_41 "CAN_DET_VALID_LEVEL_41";
+BA_ "GenSigStartValue" SG_ 328 CAN_DET_AZIMUTH_41 0;
+BA_ "GenSigSendType" SG_ 328 CAN_DET_AZIMUTH_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_AZIMUTH_41 "CAN_DET_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_41 "CAN_DET_RANGE_41";
+BA_ "GenSigStartValue" SG_ 328 CAN_DET_RANGE_RATE_41 0;
+BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_RATE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_RATE_41 "CAN_DET_RANGE_RATE_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_AMPLITUDE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_AMPLITUDE_41 "CAN_DET_AMPLITUDE_41";
+BA_ "GenSigSendType" SG_ 328 CAN_SCAN_INDEX_2LSB_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_SCAN_INDEX_2LSB_41 "CAN_SCAN_INDEX_2LSB_41";
+BA_ "GenMsgSendType" BO_ 327 1;
+BA_ "GenMsgILSupport" BO_ 327 1;
+BA_ "GenMsgNrOfRepetition" BO_ 327 0;
+BA_ "GenMsgCycleTime" BO_ 327 0;
+BA_ "NetworkInitialization" BO_ 327 0;
+BA_ "GenMsgDelayTime" BO_ 327 0;
+BA_ "GenSigVtEn" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigVtName" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 "CAN_DET_SUPER_RES_TARGET_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_ND_TARGET_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_ND_TARGET_40 "CAN_DET_ND_TARGET_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 "CAN_DET_HOST_VEH_CLUTTER_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_VALID_LEVEL_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_VALID_LEVEL_40 "CAN_DET_VALID_LEVEL_40";
+BA_ "GenSigStartValue" SG_ 327 CAN_DET_AZIMUTH_40 0;
+BA_ "GenSigSendType" SG_ 327 CAN_DET_AZIMUTH_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_AZIMUTH_40 "CAN_DET_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_40 "CAN_DET_RANGE_40";
+BA_ "GenSigStartValue" SG_ 327 CAN_DET_RANGE_RATE_40 0;
+BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_RATE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_RATE_40 "CAN_DET_RANGE_RATE_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_AMPLITUDE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_AMPLITUDE_40 "CAN_DET_AMPLITUDE_40";
+BA_ "GenSigSendType" SG_ 327 CAN_SCAN_INDEX_2LSB_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_SCAN_INDEX_2LSB_40 "CAN_SCAN_INDEX_2LSB_40";
+BA_ "GenMsgSendType" BO_ 325 1;
+BA_ "GenMsgILSupport" BO_ 325 1;
+BA_ "GenMsgNrOfRepetition" BO_ 325 0;
+BA_ "GenMsgCycleTime" BO_ 325 0;
+BA_ "NetworkInitialization" BO_ 325 0;
+BA_ "GenMsgDelayTime" BO_ 325 0;
+BA_ "GenSigVtEn" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigVtName" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 "CAN_DET_SUPER_RES_TARGET_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_ND_TARGET_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_ND_TARGET_38 "CAN_DET_ND_TARGET_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 "CAN_DET_HOST_VEH_CLUTTER_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_VALID_LEVEL_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_VALID_LEVEL_38 "CAN_DET_VALID_LEVEL_38";
+BA_ "GenSigStartValue" SG_ 325 CAN_DET_AZIMUTH_38 0;
+BA_ "GenSigSendType" SG_ 325 CAN_DET_AZIMUTH_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_AZIMUTH_38 "CAN_DET_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_38 "CAN_DET_RANGE_38";
+BA_ "GenSigStartValue" SG_ 325 CAN_DET_RANGE_RATE_38 0;
+BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_RATE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_RATE_38 "CAN_DET_RANGE_RATE_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_AMPLITUDE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_AMPLITUDE_38 "CAN_DET_AMPLITUDE_38";
+BA_ "GenSigSendType" SG_ 325 CAN_SCAN_INDEX_2LSB_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_SCAN_INDEX_2LSB_38 "CAN_SCAN_INDEX_2LSB_38";
+BA_ "GenMsgSendType" BO_ 324 1;
+BA_ "GenMsgILSupport" BO_ 324 1;
+BA_ "GenMsgNrOfRepetition" BO_ 324 0;
+BA_ "GenMsgCycleTime" BO_ 324 0;
+BA_ "NetworkInitialization" BO_ 324 0;
+BA_ "GenMsgDelayTime" BO_ 324 0;
+BA_ "GenSigVtEn" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigVtName" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 "CAN_DET_SUPER_RES_TARGET_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_ND_TARGET_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_ND_TARGET_37 "CAN_DET_ND_TARGET_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 "CAN_DET_HOST_VEH_CLUTTER_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_VALID_LEVEL_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_VALID_LEVEL_37 "CAN_DET_VALID_LEVEL_37";
+BA_ "GenSigStartValue" SG_ 324 CAN_DET_AZIMUTH_37 0;
+BA_ "GenSigSendType" SG_ 324 CAN_DET_AZIMUTH_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_AZIMUTH_37 "CAN_DET_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_37 "CAN_DET_RANGE_37";
+BA_ "GenSigStartValue" SG_ 324 CAN_DET_RANGE_RATE_37 0;
+BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_RATE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_RATE_37 "CAN_DET_RANGE_RATE_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_AMPLITUDE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_AMPLITUDE_37 "CAN_DET_AMPLITUDE_37";
+BA_ "GenSigSendType" SG_ 324 CAN_SCAN_INDEX_2LSB_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_SCAN_INDEX_2LSB_37 "CAN_SCAN_INDEX_2LSB_37";
+BA_ "GenMsgSendType" BO_ 323 1;
+BA_ "GenMsgILSupport" BO_ 323 1;
+BA_ "GenMsgNrOfRepetition" BO_ 323 0;
+BA_ "GenMsgCycleTime" BO_ 323 0;
+BA_ "NetworkInitialization" BO_ 323 0;
+BA_ "GenMsgDelayTime" BO_ 323 0;
+BA_ "GenSigVtEn" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigVtName" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 "CAN_DET_SUPER_RES_TARGET_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_ND_TARGET_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_ND_TARGET_36 "CAN_DET_ND_TARGET_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 "CAN_DET_HOST_VEH_CLUTTER_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_VALID_LEVEL_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_VALID_LEVEL_36 "CAN_DET_VALID_LEVEL_36";
+BA_ "GenSigStartValue" SG_ 323 CAN_DET_AZIMUTH_36 0;
+BA_ "GenSigSendType" SG_ 323 CAN_DET_AZIMUTH_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_AZIMUTH_36 "CAN_DET_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_36 "CAN_DET_RANGE_36";
+BA_ "GenSigStartValue" SG_ 323 CAN_DET_RANGE_RATE_36 0;
+BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_RATE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_RATE_36 "CAN_DET_RANGE_RATE_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_AMPLITUDE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_AMPLITUDE_36 "CAN_DET_AMPLITUDE_36";
+BA_ "GenSigSendType" SG_ 323 CAN_SCAN_INDEX_2LSB_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_SCAN_INDEX_2LSB_36 "CAN_SCAN_INDEX_2LSB_36";
+BA_ "GenMsgSendType" BO_ 322 1;
+BA_ "GenMsgILSupport" BO_ 322 1;
+BA_ "GenMsgNrOfRepetition" BO_ 322 0;
+BA_ "GenMsgCycleTime" BO_ 322 0;
+BA_ "NetworkInitialization" BO_ 322 0;
+BA_ "GenMsgDelayTime" BO_ 322 0;
+BA_ "GenSigVtEn" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigVtName" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 "CAN_DET_SUPER_RES_TARGET_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_ND_TARGET_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_ND_TARGET_35 "CAN_DET_ND_TARGET_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 "CAN_DET_HOST_VEH_CLUTTER_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_VALID_LEVEL_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_VALID_LEVEL_35 "CAN_DET_VALID_LEVEL_35";
+BA_ "GenSigStartValue" SG_ 322 CAN_DET_AZIMUTH_35 0;
+BA_ "GenSigSendType" SG_ 322 CAN_DET_AZIMUTH_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_AZIMUTH_35 "CAN_DET_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_35 "CAN_DET_RANGE_35";
+BA_ "GenSigStartValue" SG_ 322 CAN_DET_RANGE_RATE_35 0;
+BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_RATE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_RATE_35 "CAN_DET_RANGE_RATE_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_AMPLITUDE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_AMPLITUDE_35 "CAN_DET_AMPLITUDE_35";
+BA_ "GenSigSendType" SG_ 322 CAN_SCAN_INDEX_2LSB_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_SCAN_INDEX_2LSB_35 "CAN_SCAN_INDEX_2LSB_35";
+BA_ "GenMsgSendType" BO_ 321 1;
+BA_ "GenMsgILSupport" BO_ 321 1;
+BA_ "GenMsgNrOfRepetition" BO_ 321 0;
+BA_ "GenMsgCycleTime" BO_ 321 0;
+BA_ "NetworkInitialization" BO_ 321 0;
+BA_ "GenMsgDelayTime" BO_ 321 0;
+BA_ "GenSigVtEn" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigVtName" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 "CAN_DET_SUPER_RES_TARGET_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_ND_TARGET_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_ND_TARGET_34 "CAN_DET_ND_TARGET_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 "CAN_DET_HOST_VEH_CLUTTER_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_VALID_LEVEL_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_VALID_LEVEL_34 "CAN_DET_VALID_LEVEL_34";
+BA_ "GenSigStartValue" SG_ 321 CAN_DET_AZIMUTH_34 0;
+BA_ "GenSigSendType" SG_ 321 CAN_DET_AZIMUTH_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_AZIMUTH_34 "CAN_DET_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_34 "CAN_DET_RANGE_34";
+BA_ "GenSigStartValue" SG_ 321 CAN_DET_RANGE_RATE_34 0;
+BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_RATE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_RATE_34 "CAN_DET_RANGE_RATE_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_AMPLITUDE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_AMPLITUDE_34 "CAN_DET_AMPLITUDE_34";
+BA_ "GenSigSendType" SG_ 321 CAN_SCAN_INDEX_2LSB_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_SCAN_INDEX_2LSB_34 "CAN_SCAN_INDEX_2LSB_34";
+BA_ "GenMsgSendType" BO_ 320 1;
+BA_ "GenMsgILSupport" BO_ 320 1;
+BA_ "GenMsgNrOfRepetition" BO_ 320 0;
+BA_ "GenMsgCycleTime" BO_ 320 0;
+BA_ "NetworkInitialization" BO_ 320 0;
+BA_ "GenMsgDelayTime" BO_ 320 0;
+BA_ "GenSigVtEn" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigVtName" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 "CAN_DET_SUPER_RES_TARGET_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_ND_TARGET_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_ND_TARGET_33 "CAN_DET_ND_TARGET_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 "CAN_DET_HOST_VEH_CLUTTER_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_VALID_LEVEL_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_VALID_LEVEL_33 "CAN_DET_VALID_LEVEL_33";
+BA_ "GenSigStartValue" SG_ 320 CAN_DET_AZIMUTH_33 0;
+BA_ "GenSigSendType" SG_ 320 CAN_DET_AZIMUTH_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_AZIMUTH_33 "CAN_DET_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_33 "CAN_DET_RANGE_33";
+BA_ "GenSigStartValue" SG_ 320 CAN_DET_RANGE_RATE_33 0;
+BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_RATE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_RATE_33 "CAN_DET_RANGE_RATE_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_AMPLITUDE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_AMPLITUDE_33 "CAN_DET_AMPLITUDE_33";
+BA_ "GenSigSendType" SG_ 320 CAN_SCAN_INDEX_2LSB_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_SCAN_INDEX_2LSB_33 "CAN_SCAN_INDEX_2LSB_33";
+BA_ "GenMsgSendType" BO_ 319 1;
+BA_ "GenMsgILSupport" BO_ 319 1;
+BA_ "GenMsgNrOfRepetition" BO_ 319 0;
+BA_ "GenMsgCycleTime" BO_ 319 0;
+BA_ "NetworkInitialization" BO_ 319 0;
+BA_ "GenMsgDelayTime" BO_ 319 0;
+BA_ "GenSigVtEn" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigVtName" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 "CAN_DET_SUPER_RES_TARGET_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_ND_TARGET_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_ND_TARGET_32 "CAN_DET_ND_TARGET_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 "CAN_DET_HOST_VEH_CLUTTER_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_VALID_LEVEL_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_VALID_LEVEL_32 "CAN_DET_VALID_LEVEL_32";
+BA_ "GenSigStartValue" SG_ 319 CAN_DET_AZIMUTH_32 0;
+BA_ "GenSigSendType" SG_ 319 CAN_DET_AZIMUTH_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_AZIMUTH_32 "CAN_DET_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_32 "CAN_DET_RANGE_32";
+BA_ "GenSigStartValue" SG_ 319 CAN_DET_RANGE_RATE_32 0;
+BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_RATE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_RATE_32 "CAN_DET_RANGE_RATE_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_AMPLITUDE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_AMPLITUDE_32 "CAN_DET_AMPLITUDE_32";
+BA_ "GenSigSendType" SG_ 319 CAN_SCAN_INDEX_2LSB_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_SCAN_INDEX_2LSB_32 "CAN_SCAN_INDEX_2LSB_32";
+BA_ "GenMsgSendType" BO_ 318 1;
+BA_ "GenMsgILSupport" BO_ 318 1;
+BA_ "GenMsgNrOfRepetition" BO_ 318 0;
+BA_ "GenMsgCycleTime" BO_ 318 0;
+BA_ "NetworkInitialization" BO_ 318 0;
+BA_ "GenMsgDelayTime" BO_ 318 0;
+BA_ "GenSigVtEn" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigVtName" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 "CAN_DET_SUPER_RES_TARGET_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_ND_TARGET_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_ND_TARGET_31 "CAN_DET_ND_TARGET_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 "CAN_DET_HOST_VEH_CLUTTER_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_VALID_LEVEL_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_VALID_LEVEL_31 "CAN_DET_VALID_LEVEL_31";
+BA_ "GenSigStartValue" SG_ 318 CAN_DET_AZIMUTH_31 0;
+BA_ "GenSigSendType" SG_ 318 CAN_DET_AZIMUTH_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_AZIMUTH_31 "CAN_DET_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_31 "CAN_DET_RANGE_31";
+BA_ "GenSigStartValue" SG_ 318 CAN_DET_RANGE_RATE_31 0;
+BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_RATE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_RATE_31 "CAN_DET_RANGE_RATE_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_AMPLITUDE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_AMPLITUDE_31 "CAN_DET_AMPLITUDE_31";
+BA_ "GenSigSendType" SG_ 318 CAN_SCAN_INDEX_2LSB_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_SCAN_INDEX_2LSB_31 "CAN_SCAN_INDEX_2LSB_31";
+BA_ "GenMsgSendType" BO_ 317 1;
+BA_ "GenMsgILSupport" BO_ 317 1;
+BA_ "GenMsgNrOfRepetition" BO_ 317 0;
+BA_ "GenMsgCycleTime" BO_ 317 0;
+BA_ "NetworkInitialization" BO_ 317 0;
+BA_ "GenMsgDelayTime" BO_ 317 0;
+BA_ "GenSigVtEn" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigVtName" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 "CAN_DET_SUPER_RES_TARGET_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_ND_TARGET_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_ND_TARGET_30 "CAN_DET_ND_TARGET_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 "CAN_DET_HOST_VEH_CLUTTER_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_VALID_LEVEL_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_VALID_LEVEL_30 "CAN_DET_VALID_LEVEL_30";
+BA_ "GenSigStartValue" SG_ 317 CAN_DET_AZIMUTH_30 0;
+BA_ "GenSigSendType" SG_ 317 CAN_DET_AZIMUTH_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_AZIMUTH_30 "CAN_DET_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_30 "CAN_DET_RANGE_30";
+BA_ "GenSigStartValue" SG_ 317 CAN_DET_RANGE_RATE_30 0;
+BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_RATE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_RATE_30 "CAN_DET_RANGE_RATE_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_AMPLITUDE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_AMPLITUDE_30 "CAN_DET_AMPLITUDE_30";
+BA_ "GenSigSendType" SG_ 317 CAN_SCAN_INDEX_2LSB_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_SCAN_INDEX_2LSB_30 "CAN_SCAN_INDEX_2LSB_30";
+BA_ "GenMsgSendType" BO_ 316 1;
+BA_ "GenMsgILSupport" BO_ 316 1;
+BA_ "GenMsgNrOfRepetition" BO_ 316 0;
+BA_ "GenMsgCycleTime" BO_ 316 0;
+BA_ "NetworkInitialization" BO_ 316 0;
+BA_ "GenMsgDelayTime" BO_ 316 0;
+BA_ "GenSigVtEn" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigVtName" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 "CAN_DET_SUPER_RES_TARGET_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_ND_TARGET_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_ND_TARGET_29 "CAN_DET_ND_TARGET_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 "CAN_DET_HOST_VEH_CLUTTER_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_VALID_LEVEL_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_VALID_LEVEL_29 "CAN_DET_VALID_LEVEL_29";
+BA_ "GenSigStartValue" SG_ 316 CAN_DET_AZIMUTH_29 0;
+BA_ "GenSigSendType" SG_ 316 CAN_DET_AZIMUTH_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_AZIMUTH_29 "CAN_DET_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_29 "CAN_DET_RANGE_29";
+BA_ "GenSigStartValue" SG_ 316 CAN_DET_RANGE_RATE_29 0;
+BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_RATE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_RATE_29 "CAN_DET_RANGE_RATE_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_AMPLITUDE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_AMPLITUDE_29 "CAN_DET_AMPLITUDE_29";
+BA_ "GenSigSendType" SG_ 316 CAN_SCAN_INDEX_2LSB_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_SCAN_INDEX_2LSB_29 "CAN_SCAN_INDEX_2LSB_29";
+BA_ "GenMsgSendType" BO_ 314 1;
+BA_ "GenMsgILSupport" BO_ 314 1;
+BA_ "GenMsgNrOfRepetition" BO_ 314 0;
+BA_ "GenMsgCycleTime" BO_ 314 0;
+BA_ "NetworkInitialization" BO_ 314 0;
+BA_ "GenMsgDelayTime" BO_ 314 0;
+BA_ "GenSigVtEn" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigVtName" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 "CAN_DET_SUPER_RES_TARGET_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_ND_TARGET_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_ND_TARGET_27 "CAN_DET_ND_TARGET_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 "CAN_DET_HOST_VEH_CLUTTER_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_VALID_LEVEL_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_VALID_LEVEL_27 "CAN_DET_VALID_LEVEL_27";
+BA_ "GenSigStartValue" SG_ 314 CAN_DET_AZIMUTH_27 0;
+BA_ "GenSigSendType" SG_ 314 CAN_DET_AZIMUTH_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_AZIMUTH_27 "CAN_DET_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_27 "CAN_DET_RANGE_27";
+BA_ "GenSigStartValue" SG_ 314 CAN_DET_RANGE_RATE_27 0;
+BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_RATE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_RATE_27 "CAN_DET_RANGE_RATE_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_AMPLITUDE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_AMPLITUDE_27 "CAN_DET_AMPLITUDE_27";
+BA_ "GenSigSendType" SG_ 314 CAN_SCAN_INDEX_2LSB_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_SCAN_INDEX_2LSB_27 "CAN_SCAN_INDEX_2LSB_27";
+BA_ "GenMsgSendType" BO_ 313 1;
+BA_ "GenMsgILSupport" BO_ 313 1;
+BA_ "GenMsgNrOfRepetition" BO_ 313 0;
+BA_ "GenMsgCycleTime" BO_ 313 0;
+BA_ "NetworkInitialization" BO_ 313 0;
+BA_ "GenMsgDelayTime" BO_ 313 0;
+BA_ "GenSigVtEn" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigVtName" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 "CAN_DET_SUPER_RES_TARGET_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_ND_TARGET_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_ND_TARGET_26 "CAN_DET_ND_TARGET_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 "CAN_DET_HOST_VEH_CLUTTER_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_VALID_LEVEL_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_VALID_LEVEL_26 "CAN_DET_VALID_LEVEL_26";
+BA_ "GenSigStartValue" SG_ 313 CAN_DET_AZIMUTH_26 0;
+BA_ "GenSigSendType" SG_ 313 CAN_DET_AZIMUTH_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_AZIMUTH_26 "CAN_DET_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_26 "CAN_DET_RANGE_26";
+BA_ "GenSigStartValue" SG_ 313 CAN_DET_RANGE_RATE_26 0;
+BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_RATE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_RATE_26 "CAN_DET_RANGE_RATE_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_AMPLITUDE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_AMPLITUDE_26 "CAN_DET_AMPLITUDE_26";
+BA_ "GenSigSendType" SG_ 313 CAN_SCAN_INDEX_2LSB_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_SCAN_INDEX_2LSB_26 "CAN_SCAN_INDEX_2LSB_26";
+BA_ "GenMsgSendType" BO_ 312 1;
+BA_ "GenMsgILSupport" BO_ 312 1;
+BA_ "GenMsgNrOfRepetition" BO_ 312 0;
+BA_ "GenMsgCycleTime" BO_ 312 0;
+BA_ "NetworkInitialization" BO_ 312 0;
+BA_ "GenMsgDelayTime" BO_ 312 0;
+BA_ "GenSigVtEn" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigVtName" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 "CAN_DET_SUPER_RES_TARGET_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_ND_TARGET_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_ND_TARGET_25 "CAN_DET_ND_TARGET_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 "CAN_DET_HOST_VEH_CLUTTER_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_VALID_LEVEL_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_VALID_LEVEL_25 "CAN_DET_VALID_LEVEL_25";
+BA_ "GenSigStartValue" SG_ 312 CAN_DET_AZIMUTH_25 0;
+BA_ "GenSigSendType" SG_ 312 CAN_DET_AZIMUTH_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_AZIMUTH_25 "CAN_DET_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_25 "CAN_DET_RANGE_25";
+BA_ "GenSigStartValue" SG_ 312 CAN_DET_RANGE_RATE_25 0;
+BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_RATE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_RATE_25 "CAN_DET_RANGE_RATE_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_AMPLITUDE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_AMPLITUDE_25 "CAN_DET_AMPLITUDE_25";
+BA_ "GenSigSendType" SG_ 312 CAN_SCAN_INDEX_2LSB_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_SCAN_INDEX_2LSB_25 "CAN_SCAN_INDEX_2LSB_25";
+BA_ "GenMsgSendType" BO_ 311 1;
+BA_ "GenMsgILSupport" BO_ 311 1;
+BA_ "GenMsgNrOfRepetition" BO_ 311 0;
+BA_ "GenMsgCycleTime" BO_ 311 0;
+BA_ "NetworkInitialization" BO_ 311 0;
+BA_ "GenMsgDelayTime" BO_ 311 0;
+BA_ "GenSigVtEn" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigVtName" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 "CAN_DET_SUPER_RES_TARGET_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_ND_TARGET_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_ND_TARGET_24 "CAN_DET_ND_TARGET_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 "CAN_DET_HOST_VEH_CLUTTER_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_VALID_LEVEL_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_VALID_LEVEL_24 "CAN_DET_VALID_LEVEL_24";
+BA_ "GenSigStartValue" SG_ 311 CAN_DET_AZIMUTH_24 0;
+BA_ "GenSigSendType" SG_ 311 CAN_DET_AZIMUTH_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_AZIMUTH_24 "CAN_DET_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_24 "CAN_DET_RANGE_24";
+BA_ "GenSigStartValue" SG_ 311 CAN_DET_RANGE_RATE_24 0;
+BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_RATE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_RATE_24 "CAN_DET_RANGE_RATE_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_AMPLITUDE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_AMPLITUDE_24 "CAN_DET_AMPLITUDE_24";
+BA_ "GenSigSendType" SG_ 311 CAN_SCAN_INDEX_2LSB_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_SCAN_INDEX_2LSB_24 "CAN_SCAN_INDEX_2LSB_24";
+BA_ "GenMsgSendType" BO_ 310 1;
+BA_ "GenMsgILSupport" BO_ 310 1;
+BA_ "GenMsgNrOfRepetition" BO_ 310 0;
+BA_ "GenMsgCycleTime" BO_ 310 0;
+BA_ "NetworkInitialization" BO_ 310 0;
+BA_ "GenMsgDelayTime" BO_ 310 0;
+BA_ "GenSigVtEn" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigVtName" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 "CAN_DET_SUPER_RES_TARGET_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_ND_TARGET_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_ND_TARGET_23 "CAN_DET_ND_TARGET_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 "CAN_DET_HOST_VEH_CLUTTER_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_VALID_LEVEL_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_VALID_LEVEL_23 "CAN_DET_VALID_LEVEL_23";
+BA_ "GenSigStartValue" SG_ 310 CAN_DET_AZIMUTH_23 0;
+BA_ "GenSigSendType" SG_ 310 CAN_DET_AZIMUTH_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_AZIMUTH_23 "CAN_DET_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_23 "CAN_DET_RANGE_23";
+BA_ "GenSigStartValue" SG_ 310 CAN_DET_RANGE_RATE_23 0;
+BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_RATE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_RATE_23 "CAN_DET_RANGE_RATE_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_AMPLITUDE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_AMPLITUDE_23 "CAN_DET_AMPLITUDE_23";
+BA_ "GenSigSendType" SG_ 310 CAN_SCAN_INDEX_2LSB_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_SCAN_INDEX_2LSB_23 "CAN_SCAN_INDEX_2LSB_23";
+BA_ "GenMsgSendType" BO_ 309 1;
+BA_ "GenMsgILSupport" BO_ 309 1;
+BA_ "GenMsgNrOfRepetition" BO_ 309 0;
+BA_ "GenMsgCycleTime" BO_ 309 0;
+BA_ "NetworkInitialization" BO_ 309 0;
+BA_ "GenMsgDelayTime" BO_ 309 0;
+BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 "CAN_DET_CONFID_AZIMUTH_22_01";
+BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 "CAN_DET_CONFID_AZIMUTH_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 "CAN_DET_CONFID_AZIMUTH_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_01 "CAN_DET_SUPER_RES_TARGET_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22_01 "CAN_DET_ND_TARGET_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_01 "CAN_DET_HOST_VEH_CLUTTER_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22_01 "CAN_DET_VALID_LEVEL_22_01";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22_01 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22_01 "CAN_DET_AZIMUTH_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22_01 "CAN_DET_RANGE_22_01";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22_01 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22_01 "CAN_DET_RANGE_RATE_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22_01 "CAN_DET_AMPLITUDE_22_01";
+BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22_01 0;
+BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22_01 "CAN_SCAN_INDEX_2LSB_22_01";
+BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 "CAN_DET_CONFID_AZIMUTH_22_02";
+BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 "CAN_DET_CONFID_AZIMUTH_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 "CAN_DET_CONFID_AZIMUTH_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_02 "CAN_DET_SUPER_RES_TARGET_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22_02 "CAN_DET_ND_TARGET_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_02 "CAN_DET_HOST_VEH_CLUTTER_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22_02 "CAN_DET_VALID_LEVEL_22_02";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22_02 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22_02 "CAN_DET_AZIMUTH_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22_02 "CAN_DET_RANGE_22_02";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22_02 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22_02 "CAN_DET_RANGE_RATE_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22_02 "CAN_DET_AMPLITUDE_22_02";
+BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22_02 0;
+BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22_02 "CAN_SCAN_INDEX_2LSB_22_02";
+BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 "CAN_DET_CONFID_AZIMUTH_22_03";
+BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 "CAN_DET_CONFID_AZIMUTH_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 "CAN_DET_CONFID_AZIMUTH_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_03 "CAN_DET_SUPER_RES_TARGET_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22_03 "CAN_DET_ND_TARGET_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_03 "CAN_DET_HOST_VEH_CLUTTER_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22_03 "CAN_DET_VALID_LEVEL_22_03";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22_03 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22_03 "CAN_DET_AZIMUTH_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22_03 "CAN_DET_RANGE_22_03";
+BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22_03 0;
+BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22_03 "CAN_DET_RANGE_RATE_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22_03 "CAN_DET_AMPLITUDE_22_03";
+BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22_03 0;
+BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22_03 "CAN_SCAN_INDEX_2LSB_22_03";
+BA_ "GenMsgSendType" BO_ 308 1;
+BA_ "GenMsgILSupport" BO_ 308 1;
+BA_ "GenMsgNrOfRepetition" BO_ 308 0;
+BA_ "GenMsgCycleTime" BO_ 308 0;
+BA_ "NetworkInitialization" BO_ 308 0;
+BA_ "GenMsgDelayTime" BO_ 308 0;
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 "CAN_DET_CONFID_AZIMUTH_21_01";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 "CAN_DET_CONFID_AZIMUTH_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 "CAN_DET_CONFID_AZIMUTH_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_01 "CAN_DET_SUPER_RES_TARGET_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_01 "CAN_DET_ND_TARGET_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_01 "CAN_DET_HOST_VEH_CLUTTER_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_01 "CAN_DET_VALID_LEVEL_21_01";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_01 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_01 "CAN_DET_AZIMUTH_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_01 "CAN_DET_RANGE_21_01";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_01 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_01 "CAN_DET_RANGE_RATE_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_01 "CAN_DET_AMPLITUDE_21_01";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_01 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_01 "CAN_SCAN_INDEX_2LSB_21_01";
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 "CAN_DET_CONFID_AZIMUTH_21_02";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 "CAN_DET_CONFID_AZIMUTH_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 "CAN_DET_CONFID_AZIMUTH_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_02 "CAN_DET_SUPER_RES_TARGET_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_02 "CAN_DET_ND_TARGET_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_02 "CAN_DET_HOST_VEH_CLUTTER_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_02 "CAN_DET_VALID_LEVEL_21_02";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_02 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_02 "CAN_DET_AZIMUTH_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_02 "CAN_DET_RANGE_21_02";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_02 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_02 "CAN_DET_RANGE_RATE_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_02 "CAN_DET_AMPLITUDE_21_02";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_02 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_02 "CAN_SCAN_INDEX_2LSB_21_02";
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 "CAN_DET_CONFID_AZIMUTH_21_03";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 "CAN_DET_CONFID_AZIMUTH_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 "CAN_DET_CONFID_AZIMUTH_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_03 "CAN_DET_SUPER_RES_TARGET_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_03 "CAN_DET_ND_TARGET_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_03 "CAN_DET_HOST_VEH_CLUTTER_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_03 "CAN_DET_VALID_LEVEL_21_03";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_03 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_03 "CAN_DET_AZIMUTH_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_03 "CAN_DET_RANGE_21_03";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_03 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_03 "CAN_DET_RANGE_RATE_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_03 "CAN_DET_AMPLITUDE_21_03";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_03 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_03 "CAN_SCAN_INDEX_2LSB_21_03";
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 "CAN_DET_CONFID_AZIMUTH_21_04";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 "CAN_DET_CONFID_AZIMUTH_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 "CAN_DET_CONFID_AZIMUTH_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_04 "CAN_DET_SUPER_RES_TARGET_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_04 "CAN_DET_ND_TARGET_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_04 "CAN_DET_HOST_VEH_CLUTTER_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_04 "CAN_DET_VALID_LEVEL_21_04";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_04 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_04 "CAN_DET_AZIMUTH_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_04 "CAN_DET_RANGE_21_04";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_04 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_04 "CAN_DET_RANGE_RATE_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_04 "CAN_DET_AMPLITUDE_21_04";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_04 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_04 "CAN_SCAN_INDEX_2LSB_21_04";
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 "CAN_DET_CONFID_AZIMUTH_21_05";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 "CAN_DET_CONFID_AZIMUTH_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 "CAN_DET_CONFID_AZIMUTH_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_05 "CAN_DET_SUPER_RES_TARGET_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_05 "CAN_DET_ND_TARGET_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_05 "CAN_DET_HOST_VEH_CLUTTER_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_05 "CAN_DET_VALID_LEVEL_21_05";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_05 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_05 "CAN_DET_AZIMUTH_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_05 "CAN_DET_RANGE_21_05";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_05 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_05 "CAN_DET_RANGE_RATE_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_05 "CAN_DET_AMPLITUDE_21_05";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_05 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_05 "CAN_SCAN_INDEX_2LSB_21_05";
+BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 "CAN_DET_CONFID_AZIMUTH_21_06";
+BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 "CAN_DET_CONFID_AZIMUTH_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 "CAN_DET_CONFID_AZIMUTH_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_06 "CAN_DET_SUPER_RES_TARGET_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_06 "CAN_DET_ND_TARGET_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_06 "CAN_DET_HOST_VEH_CLUTTER_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_06 "CAN_DET_VALID_LEVEL_21_06";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_06 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_06 "CAN_DET_AZIMUTH_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_06 "CAN_DET_RANGE_21_06";
+BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_06 0;
+BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_06 "CAN_DET_RANGE_RATE_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_06 "CAN_DET_AMPLITUDE_21_06";
+BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_06 0;
+BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_06 "CAN_SCAN_INDEX_2LSB_21_06";
+BA_ "GenMsgSendType" BO_ 307 1;
+BA_ "GenMsgILSupport" BO_ 307 1;
+BA_ "GenMsgNrOfRepetition" BO_ 307 0;
+BA_ "GenMsgCycleTime" BO_ 307 0;
+BA_ "NetworkInitialization" BO_ 307 0;
+BA_ "GenMsgDelayTime" BO_ 307 0;
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 "CAN_DET_CONFID_AZIMUTH_20_01";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 "CAN_DET_CONFID_AZIMUTH_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 "CAN_DET_CONFID_AZIMUTH_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_01 "CAN_DET_SUPER_RES_TARGET_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_01 "CAN_DET_ND_TARGET_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_01 "CAN_DET_HOST_VEH_CLUTTER_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_01 "CAN_DET_VALID_LEVEL_20_01";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_01 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_01 "CAN_DET_AZIMUTH_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_01 "CAN_DET_RANGE_20_01";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_01 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_01 "CAN_DET_RANGE_RATE_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_01 "CAN_DET_AMPLITUDE_20_01";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_01 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_01 "CAN_SCAN_INDEX_2LSB_20_01";
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 "CAN_DET_CONFID_AZIMUTH_20_02";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 "CAN_DET_CONFID_AZIMUTH_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 "CAN_DET_CONFID_AZIMUTH_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_02 "CAN_DET_SUPER_RES_TARGET_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_02 "CAN_DET_ND_TARGET_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_02 "CAN_DET_HOST_VEH_CLUTTER_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_02 "CAN_DET_VALID_LEVEL_20_02";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_02 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_02 "CAN_DET_AZIMUTH_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_02 "CAN_DET_RANGE_20_02";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_02 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_02 "CAN_DET_RANGE_RATE_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_02 "CAN_DET_AMPLITUDE_20_02";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_02 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_02 "CAN_SCAN_INDEX_2LSB_20_02";
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 "CAN_DET_CONFID_AZIMUTH_20_03";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 "CAN_DET_CONFID_AZIMUTH_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 "CAN_DET_CONFID_AZIMUTH_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_03 "CAN_DET_SUPER_RES_TARGET_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_03 "CAN_DET_ND_TARGET_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_03 "CAN_DET_HOST_VEH_CLUTTER_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_03 "CAN_DET_VALID_LEVEL_20_03";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_03 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_03 "CAN_DET_AZIMUTH_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_03 "CAN_DET_RANGE_20_03";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_03 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_03 "CAN_DET_RANGE_RATE_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_03 "CAN_DET_AMPLITUDE_20_03";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_03 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_03 "CAN_SCAN_INDEX_2LSB_20_03";
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 "CAN_DET_CONFID_AZIMUTH_20_04";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 "CAN_DET_CONFID_AZIMUTH_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 "CAN_DET_CONFID_AZIMUTH_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_04 "CAN_DET_SUPER_RES_TARGET_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_04 "CAN_DET_ND_TARGET_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_04 "CAN_DET_HOST_VEH_CLUTTER_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_04 "CAN_DET_VALID_LEVEL_20_04";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_04 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_04 "CAN_DET_AZIMUTH_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_04 "CAN_DET_RANGE_20_04";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_04 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_04 "CAN_DET_RANGE_RATE_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_04 "CAN_DET_AMPLITUDE_20_04";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_04 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_04 "CAN_SCAN_INDEX_2LSB_20_04";
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 "CAN_DET_CONFID_AZIMUTH_20_05";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 "CAN_DET_CONFID_AZIMUTH_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 "CAN_DET_CONFID_AZIMUTH_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_05 "CAN_DET_SUPER_RES_TARGET_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_05 "CAN_DET_ND_TARGET_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_05 "CAN_DET_HOST_VEH_CLUTTER_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_05 "CAN_DET_VALID_LEVEL_20_05";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_05 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_05 "CAN_DET_AZIMUTH_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_05 "CAN_DET_RANGE_20_05";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_05 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_05 "CAN_DET_RANGE_RATE_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_05 "CAN_DET_AMPLITUDE_20_05";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_05 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_05 "CAN_SCAN_INDEX_2LSB_20_05";
+BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 "CAN_DET_CONFID_AZIMUTH_20_06";
+BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 "CAN_DET_CONFID_AZIMUTH_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 "CAN_DET_CONFID_AZIMUTH_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_06 "CAN_DET_SUPER_RES_TARGET_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_06 "CAN_DET_ND_TARGET_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_06 "CAN_DET_HOST_VEH_CLUTTER_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_06 "CAN_DET_VALID_LEVEL_20_06";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_06 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_06 "CAN_DET_AZIMUTH_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_06 "CAN_DET_RANGE_20_06";
+BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_06 0;
+BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_06 "CAN_DET_RANGE_RATE_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_06 "CAN_DET_AMPLITUDE_20_06";
+BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_06 0;
+BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_06 "CAN_SCAN_INDEX_2LSB_20_06";
+BA_ "GenMsgSendType" BO_ 306 1;
+BA_ "GenMsgILSupport" BO_ 306 1;
+BA_ "GenMsgNrOfRepetition" BO_ 306 0;
+BA_ "GenMsgCycleTime" BO_ 306 0;
+BA_ "NetworkInitialization" BO_ 306 0;
+BA_ "GenMsgDelayTime" BO_ 306 0;
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 "CAN_DET_CONFID_AZIMUTH_19_01";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 "CAN_DET_CONFID_AZIMUTH_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 "CAN_DET_CONFID_AZIMUTH_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_01 "CAN_DET_SUPER_RES_TARGET_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_01 "CAN_DET_ND_TARGET_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_01 "CAN_DET_HOST_VEH_CLUTTER_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_01 "CAN_DET_VALID_LEVEL_19_01";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_01 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_01 "CAN_DET_AZIMUTH_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_01 "CAN_DET_RANGE_19_01";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_01 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_01 "CAN_DET_RANGE_RATE_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_01 "CAN_DET_AMPLITUDE_19_01";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_01 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_01 "CAN_SCAN_INDEX_2LSB_19_01";
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 "CAN_DET_CONFID_AZIMUTH_19_02";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 "CAN_DET_CONFID_AZIMUTH_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 "CAN_DET_CONFID_AZIMUTH_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_02 "CAN_DET_SUPER_RES_TARGET_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_02 "CAN_DET_ND_TARGET_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_02 "CAN_DET_HOST_VEH_CLUTTER_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_02 "CAN_DET_VALID_LEVEL_19_02";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_02 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_02 "CAN_DET_AZIMUTH_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_02 "CAN_DET_RANGE_19_02";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_02 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_02 "CAN_DET_RANGE_RATE_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_02 "CAN_DET_AMPLITUDE_19_02";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_02 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_02 "CAN_SCAN_INDEX_2LSB_19_02";
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 "CAN_DET_CONFID_AZIMUTH_19_03";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 "CAN_DET_CONFID_AZIMUTH_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 "CAN_DET_CONFID_AZIMUTH_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_03 "CAN_DET_SUPER_RES_TARGET_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_03 "CAN_DET_ND_TARGET_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_03 "CAN_DET_HOST_VEH_CLUTTER_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_03 "CAN_DET_VALID_LEVEL_19_03";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_03 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_03 "CAN_DET_AZIMUTH_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_03 "CAN_DET_RANGE_19_03";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_03 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_03 "CAN_DET_RANGE_RATE_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_03 "CAN_DET_AMPLITUDE_19_03";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_03 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_03 "CAN_SCAN_INDEX_2LSB_19_03";
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 "CAN_DET_CONFID_AZIMUTH_19_04";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 "CAN_DET_CONFID_AZIMUTH_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 "CAN_DET_CONFID_AZIMUTH_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_04 "CAN_DET_SUPER_RES_TARGET_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_04 "CAN_DET_ND_TARGET_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_04 "CAN_DET_HOST_VEH_CLUTTER_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_04 "CAN_DET_VALID_LEVEL_19_04";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_04 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_04 "CAN_DET_AZIMUTH_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_04 "CAN_DET_RANGE_19_04";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_04 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_04 "CAN_DET_RANGE_RATE_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_04 "CAN_DET_AMPLITUDE_19_04";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_04 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_04 "CAN_SCAN_INDEX_2LSB_19_04";
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 "CAN_DET_CONFID_AZIMUTH_19_05";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 "CAN_DET_CONFID_AZIMUTH_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 "CAN_DET_CONFID_AZIMUTH_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_05 "CAN_DET_SUPER_RES_TARGET_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_05 "CAN_DET_ND_TARGET_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_05 "CAN_DET_HOST_VEH_CLUTTER_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_05 "CAN_DET_VALID_LEVEL_19_05";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_05 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_05 "CAN_DET_AZIMUTH_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_05 "CAN_DET_RANGE_19_05";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_05 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_05 "CAN_DET_RANGE_RATE_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_05 "CAN_DET_AMPLITUDE_19_05";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_05 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_05 "CAN_SCAN_INDEX_2LSB_19_05";
+BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 "CAN_DET_CONFID_AZIMUTH_19_06";
+BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 "CAN_DET_CONFID_AZIMUTH_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 "CAN_DET_CONFID_AZIMUTH_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_06 "CAN_DET_SUPER_RES_TARGET_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_06 "CAN_DET_ND_TARGET_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_06 "CAN_DET_HOST_VEH_CLUTTER_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_06 "CAN_DET_VALID_LEVEL_19_06";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_06 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_06 "CAN_DET_AZIMUTH_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_06 "CAN_DET_RANGE_19_06";
+BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_06 0;
+BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_06 "CAN_DET_RANGE_RATE_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_06 "CAN_DET_AMPLITUDE_19_06";
+BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_06 0;
+BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_06 "CAN_SCAN_INDEX_2LSB_19_06";
+BA_ "GenMsgSendType" BO_ 305 1;
+BA_ "GenMsgILSupport" BO_ 305 1;
+BA_ "GenMsgNrOfRepetition" BO_ 305 0;
+BA_ "GenMsgCycleTime" BO_ 305 0;
+BA_ "NetworkInitialization" BO_ 305 0;
+BA_ "GenMsgDelayTime" BO_ 305 0;
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 "CAN_DET_CONFID_AZIMUTH_18_01";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 "CAN_DET_CONFID_AZIMUTH_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 "CAN_DET_CONFID_AZIMUTH_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_01 "CAN_DET_SUPER_RES_TARGET_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_01 "CAN_DET_ND_TARGET_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_01 "CAN_DET_HOST_VEH_CLUTTER_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_01 "CAN_DET_VALID_LEVEL_18_01";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_01 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_01 "CAN_DET_AZIMUTH_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_01 "CAN_DET_RANGE_18_01";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_01 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_01 "CAN_DET_RANGE_RATE_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_01 "CAN_DET_AMPLITUDE_18_01";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_01 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_01 "CAN_SCAN_INDEX_2LSB_18_01";
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 "CAN_DET_CONFID_AZIMUTH_18_02";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 "CAN_DET_CONFID_AZIMUTH_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 "CAN_DET_CONFID_AZIMUTH_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_02 "CAN_DET_SUPER_RES_TARGET_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_02 "CAN_DET_ND_TARGET_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_02 "CAN_DET_HOST_VEH_CLUTTER_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_02 "CAN_DET_VALID_LEVEL_18_02";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_02 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_02 "CAN_DET_AZIMUTH_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_02 "CAN_DET_RANGE_18_02";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_02 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_02 "CAN_DET_RANGE_RATE_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_02 "CAN_DET_AMPLITUDE_18_02";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_02 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_02 "CAN_SCAN_INDEX_2LSB_18_02";
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 "CAN_DET_CONFID_AZIMUTH_18_03";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 "CAN_DET_CONFID_AZIMUTH_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 "CAN_DET_CONFID_AZIMUTH_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_03 "CAN_DET_SUPER_RES_TARGET_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_03 "CAN_DET_ND_TARGET_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_03 "CAN_DET_HOST_VEH_CLUTTER_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_03 "CAN_DET_VALID_LEVEL_18_03";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_03 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_03 "CAN_DET_AZIMUTH_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_03 "CAN_DET_RANGE_18_03";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_03 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_03 "CAN_DET_RANGE_RATE_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_03 "CAN_DET_AMPLITUDE_18_03";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_03 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_03 "CAN_SCAN_INDEX_2LSB_18_03";
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 "CAN_DET_CONFID_AZIMUTH_18_04";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 "CAN_DET_CONFID_AZIMUTH_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 "CAN_DET_CONFID_AZIMUTH_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_04 "CAN_DET_SUPER_RES_TARGET_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_04 "CAN_DET_ND_TARGET_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_04 "CAN_DET_HOST_VEH_CLUTTER_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_04 "CAN_DET_VALID_LEVEL_18_04";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_04 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_04 "CAN_DET_AZIMUTH_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_04 "CAN_DET_RANGE_18_04";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_04 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_04 "CAN_DET_RANGE_RATE_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_04 "CAN_DET_AMPLITUDE_18_04";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_04 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_04 "CAN_SCAN_INDEX_2LSB_18_04";
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 "CAN_DET_CONFID_AZIMUTH_18_05";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 "CAN_DET_CONFID_AZIMUTH_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 "CAN_DET_CONFID_AZIMUTH_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_05 "CAN_DET_SUPER_RES_TARGET_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_05 "CAN_DET_ND_TARGET_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_05 "CAN_DET_HOST_VEH_CLUTTER_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_05 "CAN_DET_VALID_LEVEL_18_05";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_05 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_05 "CAN_DET_AZIMUTH_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_05 "CAN_DET_RANGE_18_05";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_05 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_05 "CAN_DET_RANGE_RATE_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_05 "CAN_DET_AMPLITUDE_18_05";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_05 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_05 "CAN_SCAN_INDEX_2LSB_18_05";
+BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 "CAN_DET_CONFID_AZIMUTH_18_06";
+BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 "CAN_DET_CONFID_AZIMUTH_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 "CAN_DET_CONFID_AZIMUTH_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_06 "CAN_DET_SUPER_RES_TARGET_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_06 "CAN_DET_ND_TARGET_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_06 "CAN_DET_HOST_VEH_CLUTTER_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_06 "CAN_DET_VALID_LEVEL_18_06";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_06 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_06 "CAN_DET_AZIMUTH_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_06 "CAN_DET_RANGE_18_06";
+BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_06 0;
+BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_06 "CAN_DET_RANGE_RATE_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_06 "CAN_DET_AMPLITUDE_18_06";
+BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_06 0;
+BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_06 "CAN_SCAN_INDEX_2LSB_18_06";
+BA_ "GenMsgSendType" BO_ 341 1;
+BA_ "GenMsgILSupport" BO_ 341 1;
+BA_ "GenMsgNrOfRepetition" BO_ 341 0;
+BA_ "GenMsgCycleTime" BO_ 341 0;
+BA_ "NetworkInitialization" BO_ 341 0;
+BA_ "GenMsgDelayTime" BO_ 341 0;
+BA_ "GenSigVtEn" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigVtName" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 "CAN_DET_SUPER_RES_TARGET_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_ND_TARGET_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_ND_TARGET_54 "CAN_DET_ND_TARGET_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 "CAN_DET_HOST_VEH_CLUTTER_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_VALID_LEVEL_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_VALID_LEVEL_54 "CAN_DET_VALID_LEVEL_54";
+BA_ "GenSigStartValue" SG_ 341 CAN_DET_AZIMUTH_54 0;
+BA_ "GenSigSendType" SG_ 341 CAN_DET_AZIMUTH_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_AZIMUTH_54 "CAN_DET_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_54 "CAN_DET_RANGE_54";
+BA_ "GenSigStartValue" SG_ 341 CAN_DET_RANGE_RATE_54 0;
+BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_RATE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_RATE_54 "CAN_DET_RANGE_RATE_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_AMPLITUDE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_AMPLITUDE_54 "CAN_DET_AMPLITUDE_54";
+BA_ "GenSigSendType" SG_ 341 CAN_SCAN_INDEX_2LSB_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_SCAN_INDEX_2LSB_54 "CAN_SCAN_INDEX_2LSB_54";
+BA_ "GenMsgSendType" BO_ 340 1;
+BA_ "GenMsgILSupport" BO_ 340 1;
+BA_ "GenMsgNrOfRepetition" BO_ 340 0;
+BA_ "GenMsgCycleTime" BO_ 340 0;
+BA_ "NetworkInitialization" BO_ 340 0;
+BA_ "GenMsgDelayTime" BO_ 340 0;
+BA_ "GenSigVtEn" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigVtName" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 "CAN_DET_SUPER_RES_TARGET_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_ND_TARGET_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_ND_TARGET_53 "CAN_DET_ND_TARGET_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 "CAN_DET_HOST_VEH_CLUTTER_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_VALID_LEVEL_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_VALID_LEVEL_53 "CAN_DET_VALID_LEVEL_53";
+BA_ "GenSigStartValue" SG_ 340 CAN_DET_AZIMUTH_53 0;
+BA_ "GenSigSendType" SG_ 340 CAN_DET_AZIMUTH_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_AZIMUTH_53 "CAN_DET_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_53 "CAN_DET_RANGE_53";
+BA_ "GenSigStartValue" SG_ 340 CAN_DET_RANGE_RATE_53 0;
+BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_RATE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_RATE_53 "CAN_DET_RANGE_RATE_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_AMPLITUDE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_AMPLITUDE_53 "CAN_DET_AMPLITUDE_53";
+BA_ "GenSigSendType" SG_ 340 CAN_SCAN_INDEX_2LSB_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_SCAN_INDEX_2LSB_53 "CAN_SCAN_INDEX_2LSB_53";
+BA_ "GenMsgSendType" BO_ 339 1;
+BA_ "GenMsgILSupport" BO_ 339 1;
+BA_ "GenMsgNrOfRepetition" BO_ 339 0;
+BA_ "GenMsgCycleTime" BO_ 339 0;
+BA_ "NetworkInitialization" BO_ 339 0;
+BA_ "GenMsgDelayTime" BO_ 339 0;
+BA_ "GenSigVtEn" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigVtName" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 "CAN_DET_SUPER_RES_TARGET_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_ND_TARGET_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_ND_TARGET_52 "CAN_DET_ND_TARGET_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 "CAN_DET_HOST_VEH_CLUTTER_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_VALID_LEVEL_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_VALID_LEVEL_52 "CAN_DET_VALID_LEVEL_52";
+BA_ "GenSigStartValue" SG_ 339 CAN_DET_AZIMUTH_52 0;
+BA_ "GenSigSendType" SG_ 339 CAN_DET_AZIMUTH_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_AZIMUTH_52 "CAN_DET_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_52 "CAN_DET_RANGE_52";
+BA_ "GenSigStartValue" SG_ 339 CAN_DET_RANGE_RATE_52 0;
+BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_RATE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_RATE_52 "CAN_DET_RANGE_RATE_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_AMPLITUDE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_AMPLITUDE_52 "CAN_DET_AMPLITUDE_52";
+BA_ "GenSigSendType" SG_ 339 CAN_SCAN_INDEX_2LSB_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_SCAN_INDEX_2LSB_52 "CAN_SCAN_INDEX_2LSB_52";
+BA_ "GenMsgSendType" BO_ 338 1;
+BA_ "GenMsgILSupport" BO_ 338 1;
+BA_ "GenMsgNrOfRepetition" BO_ 338 0;
+BA_ "GenMsgCycleTime" BO_ 338 0;
+BA_ "NetworkInitialization" BO_ 338 0;
+BA_ "GenMsgDelayTime" BO_ 338 0;
+BA_ "GenSigVtEn" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigVtName" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 "CAN_DET_SUPER_RES_TARGET_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_ND_TARGET_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_ND_TARGET_51 "CAN_DET_ND_TARGET_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 "CAN_DET_HOST_VEH_CLUTTER_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_VALID_LEVEL_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_VALID_LEVEL_51 "CAN_DET_VALID_LEVEL_51";
+BA_ "GenSigStartValue" SG_ 338 CAN_DET_AZIMUTH_51 0;
+BA_ "GenSigSendType" SG_ 338 CAN_DET_AZIMUTH_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_AZIMUTH_51 "CAN_DET_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_51 "CAN_DET_RANGE_51";
+BA_ "GenSigStartValue" SG_ 338 CAN_DET_RANGE_RATE_51 0;
+BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_RATE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_RATE_51 "CAN_DET_RANGE_RATE_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_AMPLITUDE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_AMPLITUDE_51 "CAN_DET_AMPLITUDE_51";
+BA_ "GenSigSendType" SG_ 338 CAN_SCAN_INDEX_2LSB_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_SCAN_INDEX_2LSB_51 "CAN_SCAN_INDEX_2LSB_51";
+BA_ "GenMsgSendType" BO_ 337 1;
+BA_ "GenMsgILSupport" BO_ 337 1;
+BA_ "GenMsgNrOfRepetition" BO_ 337 0;
+BA_ "GenMsgCycleTime" BO_ 337 0;
+BA_ "NetworkInitialization" BO_ 337 0;
+BA_ "GenMsgDelayTime" BO_ 337 0;
+BA_ "GenSigVtEn" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigVtName" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 "CAN_DET_SUPER_RES_TARGET_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_ND_TARGET_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_ND_TARGET_50 "CAN_DET_ND_TARGET_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 "CAN_DET_HOST_VEH_CLUTTER_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_VALID_LEVEL_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_VALID_LEVEL_50 "CAN_DET_VALID_LEVEL_50";
+BA_ "GenSigStartValue" SG_ 337 CAN_DET_AZIMUTH_50 0;
+BA_ "GenSigSendType" SG_ 337 CAN_DET_AZIMUTH_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_AZIMUTH_50 "CAN_DET_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_50 "CAN_DET_RANGE_50";
+BA_ "GenSigStartValue" SG_ 337 CAN_DET_RANGE_RATE_50 0;
+BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_RATE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_RATE_50 "CAN_DET_RANGE_RATE_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_AMPLITUDE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_AMPLITUDE_50 "CAN_DET_AMPLITUDE_50";
+BA_ "GenSigSendType" SG_ 337 CAN_SCAN_INDEX_2LSB_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_SCAN_INDEX_2LSB_50 "CAN_SCAN_INDEX_2LSB_50";
+BA_ "GenMsgSendType" BO_ 336 1;
+BA_ "GenMsgILSupport" BO_ 336 1;
+BA_ "GenMsgNrOfRepetition" BO_ 336 0;
+BA_ "GenMsgCycleTime" BO_ 336 0;
+BA_ "NetworkInitialization" BO_ 336 0;
+BA_ "GenMsgDelayTime" BO_ 336 0;
+BA_ "GenSigVtEn" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigVtName" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 "CAN_DET_SUPER_RES_TARGET_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_ND_TARGET_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_ND_TARGET_49 "CAN_DET_ND_TARGET_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 "CAN_DET_HOST_VEH_CLUTTER_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_VALID_LEVEL_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_VALID_LEVEL_49 "CAN_DET_VALID_LEVEL_49";
+BA_ "GenSigStartValue" SG_ 336 CAN_DET_AZIMUTH_49 0;
+BA_ "GenSigSendType" SG_ 336 CAN_DET_AZIMUTH_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_AZIMUTH_49 "CAN_DET_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_49 "CAN_DET_RANGE_49";
+BA_ "GenSigStartValue" SG_ 336 CAN_DET_RANGE_RATE_49 0;
+BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_RATE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_RATE_49 "CAN_DET_RANGE_RATE_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_AMPLITUDE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_AMPLITUDE_49 "CAN_DET_AMPLITUDE_49";
+BA_ "GenSigSendType" SG_ 336 CAN_SCAN_INDEX_2LSB_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_SCAN_INDEX_2LSB_49 "CAN_SCAN_INDEX_2LSB_49";
+BA_ "GenMsgSendType" BO_ 326 1;
+BA_ "GenMsgILSupport" BO_ 326 1;
+BA_ "GenMsgNrOfRepetition" BO_ 326 0;
+BA_ "GenMsgCycleTime" BO_ 326 0;
+BA_ "NetworkInitialization" BO_ 326 0;
+BA_ "GenMsgDelayTime" BO_ 326 0;
+BA_ "GenSigVtEn" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigVtName" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 "CAN_DET_SUPER_RES_TARGET_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_ND_TARGET_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_ND_TARGET_39 "CAN_DET_ND_TARGET_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 "CAN_DET_HOST_VEH_CLUTTER_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_VALID_LEVEL_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_VALID_LEVEL_39 "CAN_DET_VALID_LEVEL_39";
+BA_ "GenSigStartValue" SG_ 326 CAN_DET_AZIMUTH_39 0;
+BA_ "GenSigSendType" SG_ 326 CAN_DET_AZIMUTH_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_AZIMUTH_39 "CAN_DET_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_39 "CAN_DET_RANGE_39";
+BA_ "GenSigStartValue" SG_ 326 CAN_DET_RANGE_RATE_39 0;
+BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_RATE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_RATE_39 "CAN_DET_RANGE_RATE_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_AMPLITUDE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_AMPLITUDE_39 "CAN_DET_AMPLITUDE_39";
+BA_ "GenSigSendType" SG_ 326 CAN_SCAN_INDEX_2LSB_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_SCAN_INDEX_2LSB_39 "CAN_SCAN_INDEX_2LSB_39";
+BA_ "GenMsgSendType" BO_ 315 1;
+BA_ "GenMsgILSupport" BO_ 315 1;
+BA_ "GenMsgNrOfRepetition" BO_ 315 0;
+BA_ "GenMsgCycleTime" BO_ 315 0;
+BA_ "NetworkInitialization" BO_ 315 0;
+BA_ "GenMsgDelayTime" BO_ 315 0;
+BA_ "GenSigVtEn" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigVtName" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 "CAN_DET_SUPER_RES_TARGET_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_ND_TARGET_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_ND_TARGET_28 "CAN_DET_ND_TARGET_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 "CAN_DET_HOST_VEH_CLUTTER_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_VALID_LEVEL_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_VALID_LEVEL_28 "CAN_DET_VALID_LEVEL_28";
+BA_ "GenSigStartValue" SG_ 315 CAN_DET_AZIMUTH_28 0;
+BA_ "GenSigSendType" SG_ 315 CAN_DET_AZIMUTH_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_AZIMUTH_28 "CAN_DET_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_28 "CAN_DET_RANGE_28";
+BA_ "GenSigStartValue" SG_ 315 CAN_DET_RANGE_RATE_28 0;
+BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_RATE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_RATE_28 "CAN_DET_RANGE_RATE_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_AMPLITUDE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_AMPLITUDE_28 "CAN_DET_AMPLITUDE_28";
+BA_ "GenSigSendType" SG_ 315 CAN_SCAN_INDEX_2LSB_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_SCAN_INDEX_2LSB_28 "CAN_SCAN_INDEX_2LSB_28";
+BA_ "GenMsgSendType" BO_ 304 1;
+BA_ "GenMsgILSupport" BO_ 304 1;
+BA_ "GenMsgNrOfRepetition" BO_ 304 0;
+BA_ "GenMsgCycleTime" BO_ 304 0;
+BA_ "NetworkInitialization" BO_ 304 0;
+BA_ "GenMsgDelayTime" BO_ 304 0;
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 "CAN_DET_CONFID_AZIMUTH_17_01";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 "CAN_DET_CONFID_AZIMUTH_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 "CAN_DET_CONFID_AZIMUTH_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_01 "CAN_DET_SUPER_RES_TARGET_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_01 "CAN_DET_ND_TARGET_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_01 "CAN_DET_HOST_VEH_CLUTTER_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_01 "CAN_DET_VALID_LEVEL_17_01";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_01 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_01 "CAN_DET_AZIMUTH_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_01 "CAN_DET_RANGE_17_01";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_01 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_01 "CAN_DET_RANGE_RATE_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_01 "CAN_DET_AMPLITUDE_17_01";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_01 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_01 "CAN_SCAN_INDEX_2LSB_17_01";
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 "CAN_DET_CONFID_AZIMUTH_17_02";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 "CAN_DET_CONFID_AZIMUTH_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 "CAN_DET_CONFID_AZIMUTH_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_02 "CAN_DET_SUPER_RES_TARGET_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_02 "CAN_DET_ND_TARGET_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_02 "CAN_DET_HOST_VEH_CLUTTER_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_02 "CAN_DET_VALID_LEVEL_17_02";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_02 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_02 "CAN_DET_AZIMUTH_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_02 "CAN_DET_RANGE_17_02";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_02 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_02 "CAN_DET_RANGE_RATE_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_02 "CAN_DET_AMPLITUDE_17_02";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_02 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_02 "CAN_SCAN_INDEX_2LSB_17_02";
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 "CAN_DET_CONFID_AZIMUTH_17_03";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 "CAN_DET_CONFID_AZIMUTH_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 "CAN_DET_CONFID_AZIMUTH_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_03 "CAN_DET_SUPER_RES_TARGET_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_03 "CAN_DET_ND_TARGET_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_03 "CAN_DET_HOST_VEH_CLUTTER_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_03 "CAN_DET_VALID_LEVEL_17_03";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_03 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_03 "CAN_DET_AZIMUTH_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_03 "CAN_DET_RANGE_17_03";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_03 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_03 "CAN_DET_RANGE_RATE_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_03 "CAN_DET_AMPLITUDE_17_03";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_03 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_03 "CAN_SCAN_INDEX_2LSB_17_03";
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 "CAN_DET_CONFID_AZIMUTH_17_04";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 "CAN_DET_CONFID_AZIMUTH_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 "CAN_DET_CONFID_AZIMUTH_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_04 "CAN_DET_SUPER_RES_TARGET_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_04 "CAN_DET_ND_TARGET_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_04 "CAN_DET_HOST_VEH_CLUTTER_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_04 "CAN_DET_VALID_LEVEL_17_04";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_04 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_04 "CAN_DET_AZIMUTH_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_04 "CAN_DET_RANGE_17_04";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_04 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_04 "CAN_DET_RANGE_RATE_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_04 "CAN_DET_AMPLITUDE_17_04";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_04 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_04 "CAN_SCAN_INDEX_2LSB_17_04";
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 "CAN_DET_CONFID_AZIMUTH_17_05";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 "CAN_DET_CONFID_AZIMUTH_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 "CAN_DET_CONFID_AZIMUTH_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_05 "CAN_DET_SUPER_RES_TARGET_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_05 "CAN_DET_ND_TARGET_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_05 "CAN_DET_HOST_VEH_CLUTTER_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_05 "CAN_DET_VALID_LEVEL_17_05";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_05 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_05 "CAN_DET_AZIMUTH_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_05 "CAN_DET_RANGE_17_05";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_05 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_05 "CAN_DET_RANGE_RATE_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_05 "CAN_DET_AMPLITUDE_17_05";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_05 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_05 "CAN_SCAN_INDEX_2LSB_17_05";
+BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 "CAN_DET_CONFID_AZIMUTH_17_06";
+BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 "CAN_DET_CONFID_AZIMUTH_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 "CAN_DET_CONFID_AZIMUTH_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_06 "CAN_DET_SUPER_RES_TARGET_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_06 "CAN_DET_ND_TARGET_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_06 "CAN_DET_HOST_VEH_CLUTTER_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_06 "CAN_DET_VALID_LEVEL_17_06";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_06 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_06 "CAN_DET_AZIMUTH_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_06 "CAN_DET_RANGE_17_06";
+BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_06 0;
+BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_06 "CAN_DET_RANGE_RATE_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_06 "CAN_DET_AMPLITUDE_17_06";
+BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_06 0;
+BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_06 "CAN_SCAN_INDEX_2LSB_17_06";
+BA_ "GenMsgSendType" BO_ 303 1;
+BA_ "GenMsgILSupport" BO_ 303 1;
+BA_ "GenMsgNrOfRepetition" BO_ 303 0;
+BA_ "GenMsgCycleTime" BO_ 303 0;
+BA_ "NetworkInitialization" BO_ 303 0;
+BA_ "GenMsgDelayTime" BO_ 303 0;
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 "CAN_DET_CONFID_AZIMUTH_16_01";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 "CAN_DET_CONFID_AZIMUTH_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 "CAN_DET_CONFID_AZIMUTH_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_01 "CAN_DET_SUPER_RES_TARGET_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_01 "CAN_DET_ND_TARGET_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_01 "CAN_DET_HOST_VEH_CLUTTER_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_01 "CAN_DET_VALID_LEVEL_16_01";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_01 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_01 "CAN_DET_AZIMUTH_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_01 "CAN_DET_RANGE_16_01";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_01 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_01 "CAN_DET_RANGE_RATE_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_01 "CAN_DET_AMPLITUDE_16_01";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_01 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_01 "CAN_SCAN_INDEX_2LSB_16_01";
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 "CAN_DET_CONFID_AZIMUTH_16_02";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 "CAN_DET_CONFID_AZIMUTH_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 "CAN_DET_CONFID_AZIMUTH_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_02 "CAN_DET_SUPER_RES_TARGET_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_02 "CAN_DET_ND_TARGET_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_02 "CAN_DET_HOST_VEH_CLUTTER_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_02 "CAN_DET_VALID_LEVEL_16_02";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_02 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_02 "CAN_DET_AZIMUTH_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_02 "CAN_DET_RANGE_16_02";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_02 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_02 "CAN_DET_RANGE_RATE_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_02 "CAN_DET_AMPLITUDE_16_02";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_02 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_02 "CAN_SCAN_INDEX_2LSB_16_02";
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 "CAN_DET_CONFID_AZIMUTH_16_03";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 "CAN_DET_CONFID_AZIMUTH_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 "CAN_DET_CONFID_AZIMUTH_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_03 "CAN_DET_SUPER_RES_TARGET_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_03 "CAN_DET_ND_TARGET_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_03 "CAN_DET_HOST_VEH_CLUTTER_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_03 "CAN_DET_VALID_LEVEL_16_03";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_03 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_03 "CAN_DET_AZIMUTH_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_03 "CAN_DET_RANGE_16_03";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_03 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_03 "CAN_DET_RANGE_RATE_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_03 "CAN_DET_AMPLITUDE_16_03";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_03 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_03 "CAN_SCAN_INDEX_2LSB_16_03";
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 "CAN_DET_CONFID_AZIMUTH_16_04";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 "CAN_DET_CONFID_AZIMUTH_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 "CAN_DET_CONFID_AZIMUTH_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_04 "CAN_DET_SUPER_RES_TARGET_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_04 "CAN_DET_ND_TARGET_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_04 "CAN_DET_HOST_VEH_CLUTTER_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_04 "CAN_DET_VALID_LEVEL_16_04";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_04 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_04 "CAN_DET_AZIMUTH_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_04 "CAN_DET_RANGE_16_04";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_04 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_04 "CAN_DET_RANGE_RATE_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_04 "CAN_DET_AMPLITUDE_16_04";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_04 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_04 "CAN_SCAN_INDEX_2LSB_16_04";
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 "CAN_DET_CONFID_AZIMUTH_16_05";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 "CAN_DET_CONFID_AZIMUTH_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 "CAN_DET_CONFID_AZIMUTH_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_05 "CAN_DET_SUPER_RES_TARGET_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_05 "CAN_DET_ND_TARGET_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_05 "CAN_DET_HOST_VEH_CLUTTER_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_05 "CAN_DET_VALID_LEVEL_16_05";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_05 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_05 "CAN_DET_AZIMUTH_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_05 "CAN_DET_RANGE_16_05";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_05 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_05 "CAN_DET_RANGE_RATE_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_05 "CAN_DET_AMPLITUDE_16_05";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_05 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_05 "CAN_SCAN_INDEX_2LSB_16_05";
+BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 "CAN_DET_CONFID_AZIMUTH_16_06";
+BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 "CAN_DET_CONFID_AZIMUTH_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 "CAN_DET_CONFID_AZIMUTH_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_06 "CAN_DET_SUPER_RES_TARGET_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_06 "CAN_DET_ND_TARGET_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_06 "CAN_DET_HOST_VEH_CLUTTER_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_06 "CAN_DET_VALID_LEVEL_16_06";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_06 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_06 "CAN_DET_AZIMUTH_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_06 "CAN_DET_RANGE_16_06";
+BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_06 0;
+BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_06 "CAN_DET_RANGE_RATE_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_06 "CAN_DET_AMPLITUDE_16_06";
+BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_06 0;
+BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_06 "CAN_SCAN_INDEX_2LSB_16_06";
+BA_ "GenMsgSendType" BO_ 302 1;
+BA_ "GenMsgILSupport" BO_ 302 1;
+BA_ "GenMsgNrOfRepetition" BO_ 302 0;
+BA_ "GenMsgCycleTime" BO_ 302 0;
+BA_ "NetworkInitialization" BO_ 302 0;
+BA_ "GenMsgDelayTime" BO_ 302 0;
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 "CAN_DET_CONFID_AZIMUTH_15_01";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 "CAN_DET_CONFID_AZIMUTH_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 "CAN_DET_CONFID_AZIMUTH_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_01 "CAN_DET_SUPER_RES_TARGET_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_01 "CAN_DET_ND_TARGET_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_01 "CAN_DET_HOST_VEH_CLUTTER_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_01 "CAN_DET_VALID_LEVEL_15_01";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_01 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_01 "CAN_DET_AZIMUTH_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_01 "CAN_DET_RANGE_15_01";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_01 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_01 "CAN_DET_RANGE_RATE_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_01 "CAN_DET_AMPLITUDE_15_01";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_01 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_01 "CAN_SCAN_INDEX_2LSB_15_01";
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 "CAN_DET_CONFID_AZIMUTH_15_02";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 "CAN_DET_CONFID_AZIMUTH_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 "CAN_DET_CONFID_AZIMUTH_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_02 "CAN_DET_SUPER_RES_TARGET_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_02 "CAN_DET_ND_TARGET_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_02 "CAN_DET_HOST_VEH_CLUTTER_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_02 "CAN_DET_VALID_LEVEL_15_02";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_02 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_02 "CAN_DET_AZIMUTH_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_02 "CAN_DET_RANGE_15_02";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_02 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_02 "CAN_DET_RANGE_RATE_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_02 "CAN_DET_AMPLITUDE_15_02";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_02 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_02 "CAN_SCAN_INDEX_2LSB_15_02";
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 "CAN_DET_CONFID_AZIMUTH_15_03";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 "CAN_DET_CONFID_AZIMUTH_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 "CAN_DET_CONFID_AZIMUTH_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_03 "CAN_DET_SUPER_RES_TARGET_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_03 "CAN_DET_ND_TARGET_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_03 "CAN_DET_HOST_VEH_CLUTTER_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_03 "CAN_DET_VALID_LEVEL_15_03";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_03 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_03 "CAN_DET_AZIMUTH_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_03 "CAN_DET_RANGE_15_03";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_03 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_03 "CAN_DET_RANGE_RATE_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_03 "CAN_DET_AMPLITUDE_15_03";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_03 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_03 "CAN_SCAN_INDEX_2LSB_15_03";
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 "CAN_DET_CONFID_AZIMUTH_15_04";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 "CAN_DET_CONFID_AZIMUTH_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 "CAN_DET_CONFID_AZIMUTH_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_04 "CAN_DET_SUPER_RES_TARGET_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_04 "CAN_DET_ND_TARGET_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_04 "CAN_DET_HOST_VEH_CLUTTER_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_04 "CAN_DET_VALID_LEVEL_15_04";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_04 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_04 "CAN_DET_AZIMUTH_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_04 "CAN_DET_RANGE_15_04";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_04 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_04 "CAN_DET_RANGE_RATE_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_04 "CAN_DET_AMPLITUDE_15_04";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_04 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_04 "CAN_SCAN_INDEX_2LSB_15_04";
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 "CAN_DET_CONFID_AZIMUTH_15_05";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 "CAN_DET_CONFID_AZIMUTH_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 "CAN_DET_CONFID_AZIMUTH_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_05 "CAN_DET_SUPER_RES_TARGET_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_05 "CAN_DET_ND_TARGET_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_05 "CAN_DET_HOST_VEH_CLUTTER_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_05 "CAN_DET_VALID_LEVEL_15_05";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_05 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_05 "CAN_DET_AZIMUTH_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_05 "CAN_DET_RANGE_15_05";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_05 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_05 "CAN_DET_RANGE_RATE_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_05 "CAN_DET_AMPLITUDE_15_05";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_05 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_05 "CAN_SCAN_INDEX_2LSB_15_05";
+BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 "CAN_DET_CONFID_AZIMUTH_15_06";
+BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 "CAN_DET_CONFID_AZIMUTH_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 "CAN_DET_CONFID_AZIMUTH_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_06 "CAN_DET_SUPER_RES_TARGET_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_06 "CAN_DET_ND_TARGET_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_06 "CAN_DET_HOST_VEH_CLUTTER_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_06 "CAN_DET_VALID_LEVEL_15_06";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_06 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_06 "CAN_DET_AZIMUTH_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_06 "CAN_DET_RANGE_15_06";
+BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_06 0;
+BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_06 "CAN_DET_RANGE_RATE_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_06 "CAN_DET_AMPLITUDE_15_06";
+BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_06 0;
+BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_06 "CAN_SCAN_INDEX_2LSB_15_06";
+BA_ "GenMsgSendType" BO_ 301 1;
+BA_ "GenMsgILSupport" BO_ 301 1;
+BA_ "GenMsgNrOfRepetition" BO_ 301 0;
+BA_ "GenMsgCycleTime" BO_ 301 0;
+BA_ "NetworkInitialization" BO_ 301 0;
+BA_ "GenMsgDelayTime" BO_ 301 0;
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 "CAN_DET_CONFID_AZIMUTH_14_01";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 "CAN_DET_CONFID_AZIMUTH_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 "CAN_DET_CONFID_AZIMUTH_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_01 "CAN_DET_SUPER_RES_TARGET_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_01 "CAN_DET_ND_TARGET_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_01 "CAN_DET_HOST_VEH_CLUTTER_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_01 "CAN_DET_VALID_LEVEL_14_01";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_01 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_01 "CAN_DET_AZIMUTH_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_01 "CAN_DET_RANGE_14_01";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_01 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_01 "CAN_DET_RANGE_RATE_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_01 "CAN_DET_AMPLITUDE_14_01";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_01 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_01 "CAN_SCAN_INDEX_2LSB_14_01";
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 "CAN_DET_CONFID_AZIMUTH_14_02";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 "CAN_DET_CONFID_AZIMUTH_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 "CAN_DET_CONFID_AZIMUTH_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_02 "CAN_DET_SUPER_RES_TARGET_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_02 "CAN_DET_ND_TARGET_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_02 "CAN_DET_HOST_VEH_CLUTTER_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_02 "CAN_DET_VALID_LEVEL_14_02";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_02 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_02 "CAN_DET_AZIMUTH_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_02 "CAN_DET_RANGE_14_02";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_02 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_02 "CAN_DET_RANGE_RATE_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_02 "CAN_DET_AMPLITUDE_14_02";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_02 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_02 "CAN_SCAN_INDEX_2LSB_14_02";
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 "CAN_DET_CONFID_AZIMUTH_14_03";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 "CAN_DET_CONFID_AZIMUTH_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 "CAN_DET_CONFID_AZIMUTH_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_03 "CAN_DET_SUPER_RES_TARGET_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_03 "CAN_DET_ND_TARGET_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_03 "CAN_DET_HOST_VEH_CLUTTER_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_03 "CAN_DET_VALID_LEVEL_14_03";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_03 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_03 "CAN_DET_AZIMUTH_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_03 "CAN_DET_RANGE_14_03";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_03 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_03 "CAN_DET_RANGE_RATE_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_03 "CAN_DET_AMPLITUDE_14_03";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_03 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_03 "CAN_SCAN_INDEX_2LSB_14_03";
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 "CAN_DET_CONFID_AZIMUTH_14_04";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 "CAN_DET_CONFID_AZIMUTH_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 "CAN_DET_CONFID_AZIMUTH_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_04 "CAN_DET_SUPER_RES_TARGET_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_04 "CAN_DET_ND_TARGET_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_04 "CAN_DET_HOST_VEH_CLUTTER_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_04 "CAN_DET_VALID_LEVEL_14_04";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_04 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_04 "CAN_DET_AZIMUTH_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_04 "CAN_DET_RANGE_14_04";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_04 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_04 "CAN_DET_RANGE_RATE_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_04 "CAN_DET_AMPLITUDE_14_04";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_04 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_04 "CAN_SCAN_INDEX_2LSB_14_04";
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 "CAN_DET_CONFID_AZIMUTH_14_05";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 "CAN_DET_CONFID_AZIMUTH_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 "CAN_DET_CONFID_AZIMUTH_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_05 "CAN_DET_SUPER_RES_TARGET_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_05 "CAN_DET_ND_TARGET_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_05 "CAN_DET_HOST_VEH_CLUTTER_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_05 "CAN_DET_VALID_LEVEL_14_05";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_05 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_05 "CAN_DET_AZIMUTH_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_05 "CAN_DET_RANGE_14_05";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_05 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_05 "CAN_DET_RANGE_RATE_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_05 "CAN_DET_AMPLITUDE_14_05";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_05 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_05 "CAN_SCAN_INDEX_2LSB_14_05";
+BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 "CAN_DET_CONFID_AZIMUTH_14_06";
+BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 "CAN_DET_CONFID_AZIMUTH_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 "CAN_DET_CONFID_AZIMUTH_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_06 "CAN_DET_SUPER_RES_TARGET_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_06 "CAN_DET_ND_TARGET_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_06 "CAN_DET_HOST_VEH_CLUTTER_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_06 "CAN_DET_VALID_LEVEL_14_06";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_06 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_06 "CAN_DET_AZIMUTH_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_06 "CAN_DET_RANGE_14_06";
+BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_06 0;
+BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_06 "CAN_DET_RANGE_RATE_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_06 "CAN_DET_AMPLITUDE_14_06";
+BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_06 0;
+BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_06 "CAN_SCAN_INDEX_2LSB_14_06";
+BA_ "GenMsgSendType" BO_ 300 1;
+BA_ "GenMsgILSupport" BO_ 300 1;
+BA_ "GenMsgNrOfRepetition" BO_ 300 0;
+BA_ "GenMsgCycleTime" BO_ 300 0;
+BA_ "NetworkInitialization" BO_ 300 0;
+BA_ "GenMsgDelayTime" BO_ 300 0;
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 "CAN_DET_CONFID_AZIMUTH_13_01";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 "CAN_DET_CONFID_AZIMUTH_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 "CAN_DET_CONFID_AZIMUTH_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_01 "CAN_DET_SUPER_RES_TARGET_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_01 "CAN_DET_ND_TARGET_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_01 "CAN_DET_HOST_VEH_CLUTTER_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_01 "CAN_DET_VALID_LEVEL_13_01";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_01 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_01 "CAN_DET_AZIMUTH_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_01 "CAN_DET_RANGE_13_01";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_01 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_01 "CAN_DET_RANGE_RATE_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_01 "CAN_DET_AMPLITUDE_13_01";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_01 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_01 "CAN_SCAN_INDEX_2LSB_13_01";
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 "CAN_DET_CONFID_AZIMUTH_13_02";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 "CAN_DET_CONFID_AZIMUTH_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 "CAN_DET_CONFID_AZIMUTH_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_02 "CAN_DET_SUPER_RES_TARGET_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_02 "CAN_DET_ND_TARGET_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_02 "CAN_DET_HOST_VEH_CLUTTER_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_02 "CAN_DET_VALID_LEVEL_13_02";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_02 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_02 "CAN_DET_AZIMUTH_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_02 "CAN_DET_RANGE_13_02";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_02 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_02 "CAN_DET_RANGE_RATE_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_02 "CAN_DET_AMPLITUDE_13_02";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_02 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_02 "CAN_SCAN_INDEX_2LSB_13_02";
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 "CAN_DET_CONFID_AZIMUTH_13_03";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 "CAN_DET_CONFID_AZIMUTH_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 "CAN_DET_CONFID_AZIMUTH_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_03 "CAN_DET_SUPER_RES_TARGET_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_03 "CAN_DET_ND_TARGET_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_03 "CAN_DET_HOST_VEH_CLUTTER_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_03 "CAN_DET_VALID_LEVEL_13_03";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_03 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_03 "CAN_DET_AZIMUTH_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_03 "CAN_DET_RANGE_13_03";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_03 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_03 "CAN_DET_RANGE_RATE_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_03 "CAN_DET_AMPLITUDE_13_03";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_03 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_03 "CAN_SCAN_INDEX_2LSB_13_03";
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 "CAN_DET_CONFID_AZIMUTH_13_04";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 "CAN_DET_CONFID_AZIMUTH_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 "CAN_DET_CONFID_AZIMUTH_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_04 "CAN_DET_SUPER_RES_TARGET_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_04 "CAN_DET_ND_TARGET_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_04 "CAN_DET_HOST_VEH_CLUTTER_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_04 "CAN_DET_VALID_LEVEL_13_04";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_04 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_04 "CAN_DET_AZIMUTH_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_04 "CAN_DET_RANGE_13_04";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_04 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_04 "CAN_DET_RANGE_RATE_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_04 "CAN_DET_AMPLITUDE_13_04";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_04 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_04 "CAN_SCAN_INDEX_2LSB_13_04";
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 "CAN_DET_CONFID_AZIMUTH_13_05";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 "CAN_DET_CONFID_AZIMUTH_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 "CAN_DET_CONFID_AZIMUTH_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_05 "CAN_DET_SUPER_RES_TARGET_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_05 "CAN_DET_ND_TARGET_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_05 "CAN_DET_HOST_VEH_CLUTTER_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_05 "CAN_DET_VALID_LEVEL_13_05";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_05 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_05 "CAN_DET_AZIMUTH_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_05 "CAN_DET_RANGE_13_05";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_05 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_05 "CAN_DET_RANGE_RATE_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_05 "CAN_DET_AMPLITUDE_13_05";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_05 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_05 "CAN_SCAN_INDEX_2LSB_13_05";
+BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 "CAN_DET_CONFID_AZIMUTH_13_06";
+BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 "CAN_DET_CONFID_AZIMUTH_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 "CAN_DET_CONFID_AZIMUTH_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_06 "CAN_DET_SUPER_RES_TARGET_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_06 "CAN_DET_ND_TARGET_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_06 "CAN_DET_HOST_VEH_CLUTTER_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_06 "CAN_DET_VALID_LEVEL_13_06";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_06 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_06 "CAN_DET_AZIMUTH_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_06 "CAN_DET_RANGE_13_06";
+BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_06 0;
+BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_06 "CAN_DET_RANGE_RATE_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_06 "CAN_DET_AMPLITUDE_13_06";
+BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_06 0;
+BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_06 "CAN_SCAN_INDEX_2LSB_13_06";
+BA_ "GenMsgSendType" BO_ 299 1;
+BA_ "GenMsgILSupport" BO_ 299 1;
+BA_ "GenMsgNrOfRepetition" BO_ 299 0;
+BA_ "GenMsgCycleTime" BO_ 299 0;
+BA_ "NetworkInitialization" BO_ 299 0;
+BA_ "GenMsgDelayTime" BO_ 299 0;
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 "CAN_DET_CONFID_AZIMUTH_12_01";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 "CAN_DET_CONFID_AZIMUTH_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 "CAN_DET_CONFID_AZIMUTH_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_01 "CAN_DET_SUPER_RES_TARGET_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_01 "CAN_DET_ND_TARGET_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_01 "CAN_DET_HOST_VEH_CLUTTER_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_01 "CAN_DET_VALID_LEVEL_12_01";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_01 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_01 "CAN_DET_AZIMUTH_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_01 "CAN_DET_RANGE_12_01";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_01 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_01 "CAN_DET_RANGE_RATE_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_01 "CAN_DET_AMPLITUDE_12_01";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_01 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_01 "CAN_SCAN_INDEX_2LSB_12_01";
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 "CAN_DET_CONFID_AZIMUTH_12_02";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 "CAN_DET_CONFID_AZIMUTH_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 "CAN_DET_CONFID_AZIMUTH_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_02 "CAN_DET_SUPER_RES_TARGET_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_02 "CAN_DET_ND_TARGET_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_02 "CAN_DET_HOST_VEH_CLUTTER_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_02 "CAN_DET_VALID_LEVEL_12_02";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_02 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_02 "CAN_DET_AZIMUTH_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_02 "CAN_DET_RANGE_12_02";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_02 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_02 "CAN_DET_RANGE_RATE_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_02 "CAN_DET_AMPLITUDE_12_02";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_02 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_02 "CAN_SCAN_INDEX_2LSB_12_02";
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 "CAN_DET_CONFID_AZIMUTH_12_03";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 "CAN_DET_CONFID_AZIMUTH_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 "CAN_DET_CONFID_AZIMUTH_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_03 "CAN_DET_SUPER_RES_TARGET_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_03 "CAN_DET_ND_TARGET_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_03 "CAN_DET_HOST_VEH_CLUTTER_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_03 "CAN_DET_VALID_LEVEL_12_03";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_03 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_03 "CAN_DET_AZIMUTH_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_03 "CAN_DET_RANGE_12_03";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_03 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_03 "CAN_DET_RANGE_RATE_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_03 "CAN_DET_AMPLITUDE_12_03";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_03 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_03 "CAN_SCAN_INDEX_2LSB_12_03";
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 "CAN_DET_CONFID_AZIMUTH_12_04";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 "CAN_DET_CONFID_AZIMUTH_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 "CAN_DET_CONFID_AZIMUTH_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_04 "CAN_DET_SUPER_RES_TARGET_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_04 "CAN_DET_ND_TARGET_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_04 "CAN_DET_HOST_VEH_CLUTTER_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_04 "CAN_DET_VALID_LEVEL_12_04";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_04 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_04 "CAN_DET_AZIMUTH_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_04 "CAN_DET_RANGE_12_04";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_04 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_04 "CAN_DET_RANGE_RATE_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_04 "CAN_DET_AMPLITUDE_12_04";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_04 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_04 "CAN_SCAN_INDEX_2LSB_12_04";
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 "CAN_DET_CONFID_AZIMUTH_12_05";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 "CAN_DET_CONFID_AZIMUTH_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 "CAN_DET_CONFID_AZIMUTH_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_05 "CAN_DET_SUPER_RES_TARGET_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_05 "CAN_DET_ND_TARGET_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_05 "CAN_DET_HOST_VEH_CLUTTER_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_05 "CAN_DET_VALID_LEVEL_12_05";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_05 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_05 "CAN_DET_AZIMUTH_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_05 "CAN_DET_RANGE_12_05";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_05 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_05 "CAN_DET_RANGE_RATE_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_05 "CAN_DET_AMPLITUDE_12_05";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_05 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_05 "CAN_SCAN_INDEX_2LSB_12_05";
+BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 "CAN_DET_CONFID_AZIMUTH_12_06";
+BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 "CAN_DET_CONFID_AZIMUTH_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 "CAN_DET_CONFID_AZIMUTH_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_06 "CAN_DET_SUPER_RES_TARGET_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_06 "CAN_DET_ND_TARGET_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_06 "CAN_DET_HOST_VEH_CLUTTER_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_06 "CAN_DET_VALID_LEVEL_12_06";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_06 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_06 "CAN_DET_AZIMUTH_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_06 "CAN_DET_RANGE_12_06";
+BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_06 0;
+BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_06 "CAN_DET_RANGE_RATE_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_06 "CAN_DET_AMPLITUDE_12_06";
+BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_06 0;
+BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_06 "CAN_SCAN_INDEX_2LSB_12_06";
+BA_ "GenMsgSendType" BO_ 298 1;
+BA_ "GenMsgILSupport" BO_ 298 1;
+BA_ "GenMsgNrOfRepetition" BO_ 298 0;
+BA_ "GenMsgCycleTime" BO_ 298 0;
+BA_ "NetworkInitialization" BO_ 298 0;
+BA_ "GenMsgDelayTime" BO_ 298 0;
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 "CAN_DET_CONFID_AZIMUTH_11_01";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 "CAN_DET_CONFID_AZIMUTH_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 "CAN_DET_CONFID_AZIMUTH_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_01 "CAN_DET_SUPER_RES_TARGET_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_01 "CAN_DET_ND_TARGET_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_01 "CAN_DET_HOST_VEH_CLUTTER_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_01 "CAN_DET_VALID_LEVEL_11_01";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_01 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_01 "CAN_DET_AZIMUTH_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_01 "CAN_DET_RANGE_11_01";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_01 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_01 "CAN_DET_RANGE_RATE_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_01 "CAN_DET_AMPLITUDE_11_01";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_01 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_01 "CAN_SCAN_INDEX_2LSB_11_01";
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 "CAN_DET_CONFID_AZIMUTH_11_02";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 "CAN_DET_CONFID_AZIMUTH_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 "CAN_DET_CONFID_AZIMUTH_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_02 "CAN_DET_SUPER_RES_TARGET_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_02 "CAN_DET_ND_TARGET_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_02 "CAN_DET_HOST_VEH_CLUTTER_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_02 "CAN_DET_VALID_LEVEL_11_02";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_02 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_02 "CAN_DET_AZIMUTH_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_02 "CAN_DET_RANGE_11_02";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_02 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_02 "CAN_DET_RANGE_RATE_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_02 "CAN_DET_AMPLITUDE_11_02";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_02 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_02 "CAN_SCAN_INDEX_2LSB_11_02";
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 "CAN_DET_CONFID_AZIMUTH_11_03";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 "CAN_DET_CONFID_AZIMUTH_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 "CAN_DET_CONFID_AZIMUTH_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_03 "CAN_DET_SUPER_RES_TARGET_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_03 "CAN_DET_ND_TARGET_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_03 "CAN_DET_HOST_VEH_CLUTTER_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_03 "CAN_DET_VALID_LEVEL_11_03";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_03 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_03 "CAN_DET_AZIMUTH_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_03 "CAN_DET_RANGE_11_03";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_03 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_03 "CAN_DET_RANGE_RATE_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_03 "CAN_DET_AMPLITUDE_11_03";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_03 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_03 "CAN_SCAN_INDEX_2LSB_11_03";
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 "CAN_DET_CONFID_AZIMUTH_11_04";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 "CAN_DET_CONFID_AZIMUTH_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 "CAN_DET_CONFID_AZIMUTH_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_04 "CAN_DET_SUPER_RES_TARGET_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_04 "CAN_DET_ND_TARGET_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_04 "CAN_DET_HOST_VEH_CLUTTER_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_04 "CAN_DET_VALID_LEVEL_11_04";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_04 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_04 "CAN_DET_AZIMUTH_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_04 "CAN_DET_RANGE_11_04";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_04 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_04 "CAN_DET_RANGE_RATE_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_04 "CAN_DET_AMPLITUDE_11_04";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_04 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_04 "CAN_SCAN_INDEX_2LSB_11_04";
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 "CAN_DET_CONFID_AZIMUTH_11_05";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 "CAN_DET_CONFID_AZIMUTH_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 "CAN_DET_CONFID_AZIMUTH_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_05 "CAN_DET_SUPER_RES_TARGET_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_05 "CAN_DET_ND_TARGET_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_05 "CAN_DET_HOST_VEH_CLUTTER_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_05 "CAN_DET_VALID_LEVEL_11_05";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_05 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_05 "CAN_DET_AZIMUTH_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_05 "CAN_DET_RANGE_11_05";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_05 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_05 "CAN_DET_RANGE_RATE_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_05 "CAN_DET_AMPLITUDE_11_05";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_05 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_05 "CAN_SCAN_INDEX_2LSB_11_05";
+BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 "CAN_DET_CONFID_AZIMUTH_11_06";
+BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 "CAN_DET_CONFID_AZIMUTH_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 "CAN_DET_CONFID_AZIMUTH_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_06 "CAN_DET_SUPER_RES_TARGET_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_06 "CAN_DET_ND_TARGET_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_06 "CAN_DET_HOST_VEH_CLUTTER_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_06 "CAN_DET_VALID_LEVEL_11_06";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_06 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_06 "CAN_DET_AZIMUTH_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_06 "CAN_DET_RANGE_11_06";
+BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_06 0;
+BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_06 "CAN_DET_RANGE_RATE_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_06 "CAN_DET_AMPLITUDE_11_06";
+BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_06 0;
+BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_06 "CAN_SCAN_INDEX_2LSB_11_06";
+BA_ "GenMsgSendType" BO_ 297 1;
+BA_ "GenMsgILSupport" BO_ 297 1;
+BA_ "GenMsgNrOfRepetition" BO_ 297 0;
+BA_ "GenMsgCycleTime" BO_ 297 0;
+BA_ "NetworkInitialization" BO_ 297 0;
+BA_ "GenMsgDelayTime" BO_ 297 0;
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 "CAN_DET_CONFID_AZIMUTH_10_01";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 "CAN_DET_CONFID_AZIMUTH_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 "CAN_DET_CONFID_AZIMUTH_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_01 "CAN_DET_SUPER_RES_TARGET_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_01 "CAN_DET_ND_TARGET_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_01 "CAN_DET_HOST_VEH_CLUTTER_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_01 "CAN_DET_VALID_LEVEL_10_01";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_01 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_01 "CAN_DET_AZIMUTH_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_01 "CAN_DET_RANGE_10_01";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_01 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_01 "CAN_DET_RANGE_RATE_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_01 "CAN_DET_AMPLITUDE_10_01";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_01 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_01 "CAN_SCAN_INDEX_2LSB_10_01";
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 "CAN_DET_CONFID_AZIMUTH_10_02";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 "CAN_DET_CONFID_AZIMUTH_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 "CAN_DET_CONFID_AZIMUTH_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_02 "CAN_DET_SUPER_RES_TARGET_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_02 "CAN_DET_ND_TARGET_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_02 "CAN_DET_HOST_VEH_CLUTTER_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_02 "CAN_DET_VALID_LEVEL_10_02";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_02 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_02 "CAN_DET_AZIMUTH_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_02 "CAN_DET_RANGE_10_02";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_02 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_02 "CAN_DET_RANGE_RATE_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_02 "CAN_DET_AMPLITUDE_10_02";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_02 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_02 "CAN_SCAN_INDEX_2LSB_10_02";
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 "CAN_DET_CONFID_AZIMUTH_10_03";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 "CAN_DET_CONFID_AZIMUTH_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 "CAN_DET_CONFID_AZIMUTH_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_03 "CAN_DET_SUPER_RES_TARGET_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_03 "CAN_DET_ND_TARGET_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_03 "CAN_DET_HOST_VEH_CLUTTER_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_03 "CAN_DET_VALID_LEVEL_10_03";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_03 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_03 "CAN_DET_AZIMUTH_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_03 "CAN_DET_RANGE_10_03";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_03 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_03 "CAN_DET_RANGE_RATE_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_03 "CAN_DET_AMPLITUDE_10_03";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_03 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_03 "CAN_SCAN_INDEX_2LSB_10_03";
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 "CAN_DET_CONFID_AZIMUTH_10_04";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 "CAN_DET_CONFID_AZIMUTH_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 "CAN_DET_CONFID_AZIMUTH_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_04 "CAN_DET_SUPER_RES_TARGET_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_04 "CAN_DET_ND_TARGET_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_04 "CAN_DET_HOST_VEH_CLUTTER_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_04 "CAN_DET_VALID_LEVEL_10_04";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_04 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_04 "CAN_DET_AZIMUTH_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_04 "CAN_DET_RANGE_10_04";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_04 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_04 "CAN_DET_RANGE_RATE_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_04 "CAN_DET_AMPLITUDE_10_04";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_04 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_04 "CAN_SCAN_INDEX_2LSB_10_04";
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 "CAN_DET_CONFID_AZIMUTH_10_05";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 "CAN_DET_CONFID_AZIMUTH_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 "CAN_DET_CONFID_AZIMUTH_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_05 "CAN_DET_SUPER_RES_TARGET_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_05 "CAN_DET_ND_TARGET_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_05 "CAN_DET_HOST_VEH_CLUTTER_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_05 "CAN_DET_VALID_LEVEL_10_05";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_05 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_05 "CAN_DET_AZIMUTH_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_05 "CAN_DET_RANGE_10_05";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_05 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_05 "CAN_DET_RANGE_RATE_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_05 "CAN_DET_AMPLITUDE_10_05";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_05 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_05 "CAN_SCAN_INDEX_2LSB_10_05";
+BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 "CAN_DET_CONFID_AZIMUTH_10_06";
+BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 "CAN_DET_CONFID_AZIMUTH_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 "CAN_DET_CONFID_AZIMUTH_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_06 "CAN_DET_SUPER_RES_TARGET_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_06 "CAN_DET_ND_TARGET_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_06 "CAN_DET_HOST_VEH_CLUTTER_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_06 "CAN_DET_VALID_LEVEL_10_06";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_06 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_06 "CAN_DET_AZIMUTH_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_06 "CAN_DET_RANGE_10_06";
+BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_06 0;
+BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_06 "CAN_DET_RANGE_RATE_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_06 "CAN_DET_AMPLITUDE_10_06";
+BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_06 0;
+BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_06 "CAN_SCAN_INDEX_2LSB_10_06";
+BA_ "GenMsgSendType" BO_ 296 1;
+BA_ "GenMsgILSupport" BO_ 296 1;
+BA_ "GenMsgNrOfRepetition" BO_ 296 0;
+BA_ "GenMsgCycleTime" BO_ 296 0;
+BA_ "NetworkInitialization" BO_ 296 0;
+BA_ "GenMsgDelayTime" BO_ 296 0;
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 "CAN_DET_CONFID_AZIMUTH_09_01";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 "CAN_DET_CONFID_AZIMUTH_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 "CAN_DET_CONFID_AZIMUTH_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_01 "CAN_DET_SUPER_RES_TARGET_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_01 "CAN_DET_ND_TARGET_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_01 "CAN_DET_HOST_VEH_CLUTTER_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_01 "CAN_DET_VALID_LEVEL_09_01";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_01 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_01 "CAN_DET_AZIMUTH_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_01 "CAN_DET_RANGE_09_01";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_01 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_01 "CAN_DET_RANGE_RATE_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_01 "CAN_DET_AMPLITUDE_09_01";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_01 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_01 "CAN_SCAN_INDEX_2LSB_09_01";
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 "CAN_DET_CONFID_AZIMUTH_09_02";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 "CAN_DET_CONFID_AZIMUTH_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 "CAN_DET_CONFID_AZIMUTH_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_02 "CAN_DET_SUPER_RES_TARGET_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_02 "CAN_DET_ND_TARGET_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_02 "CAN_DET_HOST_VEH_CLUTTER_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_02 "CAN_DET_VALID_LEVEL_09_02";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_02 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_02 "CAN_DET_AZIMUTH_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_02 "CAN_DET_RANGE_09_02";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_02 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_02 "CAN_DET_RANGE_RATE_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_02 "CAN_DET_AMPLITUDE_09_02";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_02 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_02 "CAN_SCAN_INDEX_2LSB_09_02";
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 "CAN_DET_CONFID_AZIMUTH_09_03";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 "CAN_DET_CONFID_AZIMUTH_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 "CAN_DET_CONFID_AZIMUTH_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_03 "CAN_DET_SUPER_RES_TARGET_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_03 "CAN_DET_ND_TARGET_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_03 "CAN_DET_HOST_VEH_CLUTTER_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_03 "CAN_DET_VALID_LEVEL_09_03";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_03 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_03 "CAN_DET_AZIMUTH_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_03 "CAN_DET_RANGE_09_03";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_03 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_03 "CAN_DET_RANGE_RATE_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_03 "CAN_DET_AMPLITUDE_09_03";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_03 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_03 "CAN_SCAN_INDEX_2LSB_09_03";
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 "CAN_DET_CONFID_AZIMUTH_09_04";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 "CAN_DET_CONFID_AZIMUTH_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 "CAN_DET_CONFID_AZIMUTH_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_04 "CAN_DET_SUPER_RES_TARGET_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_04 "CAN_DET_ND_TARGET_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_04 "CAN_DET_HOST_VEH_CLUTTER_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_04 "CAN_DET_VALID_LEVEL_09_04";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_04 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_04 "CAN_DET_AZIMUTH_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_04 "CAN_DET_RANGE_09_04";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_04 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_04 "CAN_DET_RANGE_RATE_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_04 "CAN_DET_AMPLITUDE_09_04";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_04 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_04 "CAN_SCAN_INDEX_2LSB_09_04";
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 "CAN_DET_CONFID_AZIMUTH_09_05";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 "CAN_DET_CONFID_AZIMUTH_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 "CAN_DET_CONFID_AZIMUTH_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_05 "CAN_DET_SUPER_RES_TARGET_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_05 "CAN_DET_ND_TARGET_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_05 "CAN_DET_HOST_VEH_CLUTTER_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_05 "CAN_DET_VALID_LEVEL_09_05";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_05 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_05 "CAN_DET_AZIMUTH_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_05 "CAN_DET_RANGE_09_05";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_05 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_05 "CAN_DET_RANGE_RATE_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_05 "CAN_DET_AMPLITUDE_09_05";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_05 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_05 "CAN_SCAN_INDEX_2LSB_09_05";
+BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 "CAN_DET_CONFID_AZIMUTH_09_06";
+BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 "CAN_DET_CONFID_AZIMUTH_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 "CAN_DET_CONFID_AZIMUTH_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_06 "CAN_DET_SUPER_RES_TARGET_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_06 "CAN_DET_ND_TARGET_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_06 "CAN_DET_HOST_VEH_CLUTTER_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_06 "CAN_DET_VALID_LEVEL_09_06";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_06 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_06 "CAN_DET_AZIMUTH_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_06 "CAN_DET_RANGE_09_06";
+BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_06 0;
+BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_06 "CAN_DET_RANGE_RATE_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_06 "CAN_DET_AMPLITUDE_09_06";
+BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_06 0;
+BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_06 "CAN_SCAN_INDEX_2LSB_09_06";
+BA_ "GenMsgSendType" BO_ 295 1;
+BA_ "GenMsgILSupport" BO_ 295 1;
+BA_ "GenMsgNrOfRepetition" BO_ 295 0;
+BA_ "GenMsgCycleTime" BO_ 295 0;
+BA_ "NetworkInitialization" BO_ 295 0;
+BA_ "GenMsgDelayTime" BO_ 295 0;
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 "CAN_DET_CONFID_AZIMUTH_08_01";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 "CAN_DET_CONFID_AZIMUTH_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 "CAN_DET_CONFID_AZIMUTH_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_01 "CAN_DET_SUPER_RES_TARGET_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_01 "CAN_DET_ND_TARGET_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_01 "CAN_DET_HOST_VEH_CLUTTER_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_01 "CAN_DET_VALID_LEVEL_08_01";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_01 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_01 "CAN_DET_AZIMUTH_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_01 "CAN_DET_RANGE_08_01";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_01 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_01 "CAN_DET_RANGE_RATE_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_01 "CAN_DET_AMPLITUDE_08_01";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_01 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_01 "CAN_SCAN_INDEX_2LSB_08_01";
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 "CAN_DET_CONFID_AZIMUTH_08_02";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 "CAN_DET_CONFID_AZIMUTH_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 "CAN_DET_CONFID_AZIMUTH_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_02 "CAN_DET_SUPER_RES_TARGET_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_02 "CAN_DET_ND_TARGET_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_02 "CAN_DET_HOST_VEH_CLUTTER_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_02 "CAN_DET_VALID_LEVEL_08_02";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_02 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_02 "CAN_DET_AZIMUTH_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_02 "CAN_DET_RANGE_08_02";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_02 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_02 "CAN_DET_RANGE_RATE_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_02 "CAN_DET_AMPLITUDE_08_02";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_02 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_02 "CAN_SCAN_INDEX_2LSB_08_02";
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 "CAN_DET_CONFID_AZIMUTH_08_03";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 "CAN_DET_CONFID_AZIMUTH_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 "CAN_DET_CONFID_AZIMUTH_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_03 "CAN_DET_SUPER_RES_TARGET_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_03 "CAN_DET_ND_TARGET_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_03 "CAN_DET_HOST_VEH_CLUTTER_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_03 "CAN_DET_VALID_LEVEL_08_03";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_03 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_03 "CAN_DET_AZIMUTH_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_03 "CAN_DET_RANGE_08_03";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_03 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_03 "CAN_DET_RANGE_RATE_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_03 "CAN_DET_AMPLITUDE_08_03";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_03 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_03 "CAN_SCAN_INDEX_2LSB_08_03";
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 "CAN_DET_CONFID_AZIMUTH_08_04";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 "CAN_DET_CONFID_AZIMUTH_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 "CAN_DET_CONFID_AZIMUTH_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_04 "CAN_DET_SUPER_RES_TARGET_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_04 "CAN_DET_ND_TARGET_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_04 "CAN_DET_HOST_VEH_CLUTTER_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_04 "CAN_DET_VALID_LEVEL_08_04";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_04 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_04 "CAN_DET_AZIMUTH_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_04 "CAN_DET_RANGE_08_04";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_04 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_04 "CAN_DET_RANGE_RATE_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_04 "CAN_DET_AMPLITUDE_08_04";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_04 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_04 "CAN_SCAN_INDEX_2LSB_08_04";
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 "CAN_DET_CONFID_AZIMUTH_08_05";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 "CAN_DET_CONFID_AZIMUTH_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 "CAN_DET_CONFID_AZIMUTH_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_05 "CAN_DET_SUPER_RES_TARGET_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_05 "CAN_DET_ND_TARGET_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_05 "CAN_DET_HOST_VEH_CLUTTER_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_05 "CAN_DET_VALID_LEVEL_08_05";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_05 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_05 "CAN_DET_AZIMUTH_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_05 "CAN_DET_RANGE_08_05";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_05 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_05 "CAN_DET_RANGE_RATE_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_05 "CAN_DET_AMPLITUDE_08_05";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_05 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_05 "CAN_SCAN_INDEX_2LSB_08_05";
+BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 "CAN_DET_CONFID_AZIMUTH_08_06";
+BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 "CAN_DET_CONFID_AZIMUTH_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 "CAN_DET_CONFID_AZIMUTH_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_06 "CAN_DET_SUPER_RES_TARGET_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_06 "CAN_DET_ND_TARGET_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_06 "CAN_DET_HOST_VEH_CLUTTER_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_06 "CAN_DET_VALID_LEVEL_08_06";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_06 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_06 "CAN_DET_AZIMUTH_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_06 "CAN_DET_RANGE_08_06";
+BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_06 0;
+BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_06 "CAN_DET_RANGE_RATE_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_06 "CAN_DET_AMPLITUDE_08_06";
+BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_06 0;
+BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_06 "CAN_SCAN_INDEX_2LSB_08_06";
+BA_ "GenMsgSendType" BO_ 294 1;
+BA_ "GenMsgILSupport" BO_ 294 1;
+BA_ "GenMsgNrOfRepetition" BO_ 294 0;
+BA_ "GenMsgCycleTime" BO_ 294 0;
+BA_ "NetworkInitialization" BO_ 294 0;
+BA_ "GenMsgDelayTime" BO_ 294 0;
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 "CAN_DET_CONFID_AZIMUTH_07_01";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 "CAN_DET_CONFID_AZIMUTH_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 "CAN_DET_CONFID_AZIMUTH_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_01 "CAN_DET_SUPER_RES_TARGET_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_01 "CAN_DET_ND_TARGET_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_01 "CAN_DET_HOST_VEH_CLUTTER_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_01 "CAN_DET_VALID_LEVEL_07_01";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_01 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_01 "CAN_DET_AZIMUTH_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_01 "CAN_DET_RANGE_07_01";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_01 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_01 "CAN_DET_RANGE_RATE_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_01 "CAN_DET_AMPLITUDE_07_01";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_01 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_01 "CAN_SCAN_INDEX_2LSB_07_01";
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 "CAN_DET_CONFID_AZIMUTH_07_02";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 "CAN_DET_CONFID_AZIMUTH_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 "CAN_DET_CONFID_AZIMUTH_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_02 "CAN_DET_SUPER_RES_TARGET_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_02 "CAN_DET_ND_TARGET_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_02 "CAN_DET_HOST_VEH_CLUTTER_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_02 "CAN_DET_VALID_LEVEL_07_02";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_02 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_02 "CAN_DET_AZIMUTH_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_02 "CAN_DET_RANGE_07_02";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_02 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_02 "CAN_DET_RANGE_RATE_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_02 "CAN_DET_AMPLITUDE_07_02";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_02 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_02 "CAN_SCAN_INDEX_2LSB_07_02";
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 "CAN_DET_CONFID_AZIMUTH_07_03";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 "CAN_DET_CONFID_AZIMUTH_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 "CAN_DET_CONFID_AZIMUTH_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_03 "CAN_DET_SUPER_RES_TARGET_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_03 "CAN_DET_ND_TARGET_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_03 "CAN_DET_HOST_VEH_CLUTTER_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_03 "CAN_DET_VALID_LEVEL_07_03";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_03 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_03 "CAN_DET_AZIMUTH_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_03 "CAN_DET_RANGE_07_03";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_03 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_03 "CAN_DET_RANGE_RATE_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_03 "CAN_DET_AMPLITUDE_07_03";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_03 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_03 "CAN_SCAN_INDEX_2LSB_07_03";
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 "CAN_DET_CONFID_AZIMUTH_07_04";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 "CAN_DET_CONFID_AZIMUTH_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 "CAN_DET_CONFID_AZIMUTH_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_04 "CAN_DET_SUPER_RES_TARGET_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_04 "CAN_DET_ND_TARGET_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_04 "CAN_DET_HOST_VEH_CLUTTER_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_04 "CAN_DET_VALID_LEVEL_07_04";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_04 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_04 "CAN_DET_AZIMUTH_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_04 "CAN_DET_RANGE_07_04";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_04 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_04 "CAN_DET_RANGE_RATE_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_04 "CAN_DET_AMPLITUDE_07_04";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_04 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_04 "CAN_SCAN_INDEX_2LSB_07_04";
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 "CAN_DET_CONFID_AZIMUTH_07_05";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 "CAN_DET_CONFID_AZIMUTH_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 "CAN_DET_CONFID_AZIMUTH_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_05 "CAN_DET_SUPER_RES_TARGET_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_05 "CAN_DET_ND_TARGET_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_05 "CAN_DET_HOST_VEH_CLUTTER_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_05 "CAN_DET_VALID_LEVEL_07_05";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_05 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_05 "CAN_DET_AZIMUTH_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_05 "CAN_DET_RANGE_07_05";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_05 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_05 "CAN_DET_RANGE_RATE_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_05 "CAN_DET_AMPLITUDE_07_05";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_05 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_05 "CAN_SCAN_INDEX_2LSB_07_05";
+BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 "CAN_DET_CONFID_AZIMUTH_07_06";
+BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 "CAN_DET_CONFID_AZIMUTH_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 "CAN_DET_CONFID_AZIMUTH_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_06 "CAN_DET_SUPER_RES_TARGET_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_06 "CAN_DET_ND_TARGET_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_06 "CAN_DET_HOST_VEH_CLUTTER_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_06 "CAN_DET_VALID_LEVEL_07_06";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_06 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_06 "CAN_DET_AZIMUTH_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_06 "CAN_DET_RANGE_07_06";
+BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_06 0;
+BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_06 "CAN_DET_RANGE_RATE_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_06 "CAN_DET_AMPLITUDE_07_06";
+BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_06 0;
+BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_06 "CAN_SCAN_INDEX_2LSB_07_06";
+BA_ "GenMsgSendType" BO_ 293 1;
+BA_ "GenMsgILSupport" BO_ 293 1;
+BA_ "GenMsgNrOfRepetition" BO_ 293 0;
+BA_ "GenMsgCycleTime" BO_ 293 0;
+BA_ "NetworkInitialization" BO_ 293 0;
+BA_ "GenMsgDelayTime" BO_ 293 0;
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 "CAN_DET_CONFID_AZIMUTH_06_01";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 "CAN_DET_CONFID_AZIMUTH_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 "CAN_DET_CONFID_AZIMUTH_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_01 "CAN_DET_SUPER_RES_TARGET_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_01 "CAN_DET_ND_TARGET_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_01 "CAN_DET_HOST_VEH_CLUTTER_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_01 "CAN_DET_VALID_LEVEL_06_01";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_01 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_01 "CAN_DET_AZIMUTH_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_01 "CAN_DET_RANGE_06_01";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_01 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_01 "CAN_DET_RANGE_RATE_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_01 "CAN_DET_AMPLITUDE_06_01";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_01 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_01 "CAN_SCAN_INDEX_2LSB_06_01";
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 "CAN_DET_CONFID_AZIMUTH_06_02";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 "CAN_DET_CONFID_AZIMUTH_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 "CAN_DET_CONFID_AZIMUTH_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_02 "CAN_DET_SUPER_RES_TARGET_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_02 "CAN_DET_ND_TARGET_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_02 "CAN_DET_HOST_VEH_CLUTTER_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_02 "CAN_DET_VALID_LEVEL_06_02";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_02 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_02 "CAN_DET_AZIMUTH_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_02 "CAN_DET_RANGE_06_02";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_02 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_02 "CAN_DET_RANGE_RATE_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_02 "CAN_DET_AMPLITUDE_06_02";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_02 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_02 "CAN_SCAN_INDEX_2LSB_06_02";
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 "CAN_DET_CONFID_AZIMUTH_06_03";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 "CAN_DET_CONFID_AZIMUTH_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 "CAN_DET_CONFID_AZIMUTH_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_03 "CAN_DET_SUPER_RES_TARGET_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_03 "CAN_DET_ND_TARGET_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_03 "CAN_DET_HOST_VEH_CLUTTER_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_03 "CAN_DET_VALID_LEVEL_06_03";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_03 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_03 "CAN_DET_AZIMUTH_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_03 "CAN_DET_RANGE_06_03";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_03 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_03 "CAN_DET_RANGE_RATE_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_03 "CAN_DET_AMPLITUDE_06_03";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_03 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_03 "CAN_SCAN_INDEX_2LSB_06_03";
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 "CAN_DET_CONFID_AZIMUTH_06_04";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 "CAN_DET_CONFID_AZIMUTH_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 "CAN_DET_CONFID_AZIMUTH_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_04 "CAN_DET_SUPER_RES_TARGET_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_04 "CAN_DET_ND_TARGET_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_04 "CAN_DET_HOST_VEH_CLUTTER_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_04 "CAN_DET_VALID_LEVEL_06_04";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_04 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_04 "CAN_DET_AZIMUTH_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_04 "CAN_DET_RANGE_06_04";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_04 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_04 "CAN_DET_RANGE_RATE_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_04 "CAN_DET_AMPLITUDE_06_04";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_04 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_04 "CAN_SCAN_INDEX_2LSB_06_04";
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 "CAN_DET_CONFID_AZIMUTH_06_05";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 "CAN_DET_CONFID_AZIMUTH_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 "CAN_DET_CONFID_AZIMUTH_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_05 "CAN_DET_SUPER_RES_TARGET_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_05 "CAN_DET_ND_TARGET_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_05 "CAN_DET_HOST_VEH_CLUTTER_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_05 "CAN_DET_VALID_LEVEL_06_05";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_05 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_05 "CAN_DET_AZIMUTH_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_05 "CAN_DET_RANGE_06_05";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_05 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_05 "CAN_DET_RANGE_RATE_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_05 "CAN_DET_AMPLITUDE_06_05";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_05 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_05 "CAN_SCAN_INDEX_2LSB_06_05";
+BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 "CAN_DET_CONFID_AZIMUTH_06_06";
+BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 "CAN_DET_CONFID_AZIMUTH_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 "CAN_DET_CONFID_AZIMUTH_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_06 "CAN_DET_SUPER_RES_TARGET_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_06 "CAN_DET_ND_TARGET_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_06 "CAN_DET_HOST_VEH_CLUTTER_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_06 "CAN_DET_VALID_LEVEL_06_06";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_06 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_06 "CAN_DET_AZIMUTH_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_06 "CAN_DET_RANGE_06_06";
+BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_06 0;
+BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_06 "CAN_DET_RANGE_RATE_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_06 "CAN_DET_AMPLITUDE_06_06";
+BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_06 0;
+BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_06 "CAN_SCAN_INDEX_2LSB_06_06";
+BA_ "GenMsgSendType" BO_ 292 1;
+BA_ "GenMsgILSupport" BO_ 292 1;
+BA_ "GenMsgNrOfRepetition" BO_ 292 0;
+BA_ "GenMsgCycleTime" BO_ 292 0;
+BA_ "NetworkInitialization" BO_ 292 0;
+BA_ "GenMsgDelayTime" BO_ 292 0;
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 "CAN_DET_CONFID_AZIMUTH_05_01";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 "CAN_DET_CONFID_AZIMUTH_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 "CAN_DET_CONFID_AZIMUTH_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_01 "CAN_DET_SUPER_RES_TARGET_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_01 "CAN_DET_ND_TARGET_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_01 "CAN_DET_HOST_VEH_CLUTTER_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_01 "CAN_DET_VALID_LEVEL_05_01";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_01 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_01 "CAN_DET_AZIMUTH_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_01 "CAN_DET_RANGE_05_01";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_01 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_01 "CAN_DET_RANGE_RATE_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_01 "CAN_DET_AMPLITUDE_05_01";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_01 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_01 "CAN_SCAN_INDEX_2LSB_05_01";
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 "CAN_DET_CONFID_AZIMUTH_05_02";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 "CAN_DET_CONFID_AZIMUTH_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 "CAN_DET_CONFID_AZIMUTH_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_02 "CAN_DET_SUPER_RES_TARGET_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_02 "CAN_DET_ND_TARGET_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_02 "CAN_DET_HOST_VEH_CLUTTER_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_02 "CAN_DET_VALID_LEVEL_05_02";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_02 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_02 "CAN_DET_AZIMUTH_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_02 "CAN_DET_RANGE_05_02";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_02 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_02 "CAN_DET_RANGE_RATE_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_02 "CAN_DET_AMPLITUDE_05_02";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_02 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_02 "CAN_SCAN_INDEX_2LSB_05_02";
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 "CAN_DET_CONFID_AZIMUTH_05_03";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 "CAN_DET_CONFID_AZIMUTH_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 "CAN_DET_CONFID_AZIMUTH_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_03 "CAN_DET_SUPER_RES_TARGET_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_03 "CAN_DET_ND_TARGET_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_03 "CAN_DET_HOST_VEH_CLUTTER_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_03 "CAN_DET_VALID_LEVEL_05_03";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_03 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_03 "CAN_DET_AZIMUTH_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_03 "CAN_DET_RANGE_05_03";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_03 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_03 "CAN_DET_RANGE_RATE_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_03 "CAN_DET_AMPLITUDE_05_03";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_03 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_03 "CAN_SCAN_INDEX_2LSB_05_03";
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 "CAN_DET_CONFID_AZIMUTH_05_04";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 "CAN_DET_CONFID_AZIMUTH_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 "CAN_DET_CONFID_AZIMUTH_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_04 "CAN_DET_SUPER_RES_TARGET_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_04 "CAN_DET_ND_TARGET_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_04 "CAN_DET_HOST_VEH_CLUTTER_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_04 "CAN_DET_VALID_LEVEL_05_04";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_04 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_04 "CAN_DET_AZIMUTH_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_04 "CAN_DET_RANGE_05_04";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_04 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_04 "CAN_DET_RANGE_RATE_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_04 "CAN_DET_AMPLITUDE_05_04";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_04 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_04 "CAN_SCAN_INDEX_2LSB_05_04";
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 "CAN_DET_CONFID_AZIMUTH_05_05";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 "CAN_DET_CONFID_AZIMUTH_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 "CAN_DET_CONFID_AZIMUTH_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_05 "CAN_DET_SUPER_RES_TARGET_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_05 "CAN_DET_ND_TARGET_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_05 "CAN_DET_HOST_VEH_CLUTTER_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_05 "CAN_DET_VALID_LEVEL_05_05";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_05 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_05 "CAN_DET_AZIMUTH_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_05 "CAN_DET_RANGE_05_05";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_05 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_05 "CAN_DET_RANGE_RATE_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_05 "CAN_DET_AMPLITUDE_05_05";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_05 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_05 "CAN_SCAN_INDEX_2LSB_05_05";
+BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 "CAN_DET_CONFID_AZIMUTH_05_06";
+BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 "CAN_DET_CONFID_AZIMUTH_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 "CAN_DET_CONFID_AZIMUTH_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_06 "CAN_DET_SUPER_RES_TARGET_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_06 "CAN_DET_ND_TARGET_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_06 "CAN_DET_HOST_VEH_CLUTTER_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_06 "CAN_DET_VALID_LEVEL_05_06";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_06 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_06 "CAN_DET_AZIMUTH_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_06 "CAN_DET_RANGE_05_06";
+BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_06 0;
+BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_06 "CAN_DET_RANGE_RATE_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_06 "CAN_DET_AMPLITUDE_05_06";
+BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_06 0;
+BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_06 "CAN_SCAN_INDEX_2LSB_05_06";
+BA_ "GenMsgSendType" BO_ 290 1;
+BA_ "GenMsgILSupport" BO_ 290 1;
+BA_ "GenMsgNrOfRepetition" BO_ 290 0;
+BA_ "GenMsgCycleTime" BO_ 290 0;
+BA_ "NetworkInitialization" BO_ 290 0;
+BA_ "GenMsgDelayTime" BO_ 290 0;
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 "CAN_DET_CONFID_AZIMUTH_03_01";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 "CAN_DET_CONFID_AZIMUTH_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 "CAN_DET_CONFID_AZIMUTH_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_01 "CAN_DET_SUPER_RES_TARGET_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_01 "CAN_DET_ND_TARGET_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_01 "CAN_DET_HOST_VEH_CLUTTER_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_01 "CAN_DET_VALID_LEVEL_03_01";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_01 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_01 "CAN_DET_AZIMUTH_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_01 "CAN_DET_RANGE_03_01";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_01 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_01 "CAN_DET_RANGE_RATE_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_01 "CAN_DET_AMPLITUDE_03_01";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_01 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_01 "CAN_SCAN_INDEX_2LSB_03_01";
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 "CAN_DET_CONFID_AZIMUTH_03_02";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 "CAN_DET_CONFID_AZIMUTH_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 "CAN_DET_CONFID_AZIMUTH_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_02 "CAN_DET_SUPER_RES_TARGET_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_02 "CAN_DET_ND_TARGET_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_02 "CAN_DET_HOST_VEH_CLUTTER_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_02 "CAN_DET_VALID_LEVEL_03_02";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_02 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_02 "CAN_DET_AZIMUTH_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_02 "CAN_DET_RANGE_03_02";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_02 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_02 "CAN_DET_RANGE_RATE_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_02 "CAN_DET_AMPLITUDE_03_02";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_02 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_02 "CAN_SCAN_INDEX_2LSB_03_02";
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 "CAN_DET_CONFID_AZIMUTH_03_03";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 "CAN_DET_CONFID_AZIMUTH_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 "CAN_DET_CONFID_AZIMUTH_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_03 "CAN_DET_SUPER_RES_TARGET_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_03 "CAN_DET_ND_TARGET_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_03 "CAN_DET_HOST_VEH_CLUTTER_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_03 "CAN_DET_VALID_LEVEL_03_03";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_03 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_03 "CAN_DET_AZIMUTH_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_03 "CAN_DET_RANGE_03_03";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_03 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_03 "CAN_DET_RANGE_RATE_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_03 "CAN_DET_AMPLITUDE_03_03";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_03 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_03 "CAN_SCAN_INDEX_2LSB_03_03";
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 "CAN_DET_CONFID_AZIMUTH_03_04";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 "CAN_DET_CONFID_AZIMUTH_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 "CAN_DET_CONFID_AZIMUTH_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_04 "CAN_DET_SUPER_RES_TARGET_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_04 "CAN_DET_ND_TARGET_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_04 "CAN_DET_HOST_VEH_CLUTTER_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_04 "CAN_DET_VALID_LEVEL_03_04";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_04 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_04 "CAN_DET_AZIMUTH_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_04 "CAN_DET_RANGE_03_04";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_04 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_04 "CAN_DET_RANGE_RATE_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_04 "CAN_DET_AMPLITUDE_03_04";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_04 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_04 "CAN_SCAN_INDEX_2LSB_03_04";
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 "CAN_DET_CONFID_AZIMUTH_03_05";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 "CAN_DET_CONFID_AZIMUTH_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 "CAN_DET_CONFID_AZIMUTH_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_05 "CAN_DET_SUPER_RES_TARGET_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_05 "CAN_DET_ND_TARGET_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_05 "CAN_DET_HOST_VEH_CLUTTER_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_05 "CAN_DET_VALID_LEVEL_03_05";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_05 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_05 "CAN_DET_AZIMUTH_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_05 "CAN_DET_RANGE_03_05";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_05 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_05 "CAN_DET_RANGE_RATE_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_05 "CAN_DET_AMPLITUDE_03_05";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_05 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_05 "CAN_SCAN_INDEX_2LSB_03_05";
+BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 "CAN_DET_CONFID_AZIMUTH_03_06";
+BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 "CAN_DET_CONFID_AZIMUTH_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 "CAN_DET_CONFID_AZIMUTH_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_06 "CAN_DET_SUPER_RES_TARGET_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_06 "CAN_DET_ND_TARGET_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_06 "CAN_DET_HOST_VEH_CLUTTER_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_06 "CAN_DET_VALID_LEVEL_03_06";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_06 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_06 "CAN_DET_AZIMUTH_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_06 "CAN_DET_RANGE_03_06";
+BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_06 0;
+BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_06 "CAN_DET_RANGE_RATE_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_06 "CAN_DET_AMPLITUDE_03_06";
+BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_06 0;
+BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_06 "CAN_SCAN_INDEX_2LSB_03_06";
+BA_ "GenMsgSendType" BO_ 289 1;
+BA_ "GenMsgILSupport" BO_ 289 1;
+BA_ "GenMsgNrOfRepetition" BO_ 289 0;
+BA_ "GenMsgCycleTime" BO_ 289 0;
+BA_ "NetworkInitialization" BO_ 289 0;
+BA_ "GenMsgDelayTime" BO_ 289 0;
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 "CAN_DET_CONFID_AZIMUTH_02_01";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 "CAN_DET_CONFID_AZIMUTH_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 "CAN_DET_CONFID_AZIMUTH_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_01 "CAN_DET_SUPER_RES_TARGET_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_01 "CAN_DET_ND_TARGET_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_01 "CAN_DET_HOST_VEH_CLUTTER_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_01 "CAN_DET_VALID_LEVEL_02_01";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_01 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_01 "CAN_DET_AZIMUTH_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_01 "CAN_DET_RANGE_02_01";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_01 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_01 "CAN_DET_RANGE_RATE_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_01 "CAN_DET_AMPLITUDE_02_01";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_01 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_01 "CAN_SCAN_INDEX_2LSB_02_01";
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 "CAN_DET_CONFID_AZIMUTH_02_02";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 "CAN_DET_CONFID_AZIMUTH_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 "CAN_DET_CONFID_AZIMUTH_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_02 "CAN_DET_SUPER_RES_TARGET_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_02 "CAN_DET_ND_TARGET_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_02 "CAN_DET_HOST_VEH_CLUTTER_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_02 "CAN_DET_VALID_LEVEL_02_02";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_02 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_02 "CAN_DET_AZIMUTH_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_02 "CAN_DET_RANGE_02_02";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_02 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_02 "CAN_DET_RANGE_RATE_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_02 "CAN_DET_AMPLITUDE_02_02";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_02 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_02 "CAN_SCAN_INDEX_2LSB_02_02";
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 "CAN_DET_CONFID_AZIMUTH_02_03";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 "CAN_DET_CONFID_AZIMUTH_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 "CAN_DET_CONFID_AZIMUTH_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_03 "CAN_DET_SUPER_RES_TARGET_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_03 "CAN_DET_ND_TARGET_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_03 "CAN_DET_HOST_VEH_CLUTTER_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_03 "CAN_DET_VALID_LEVEL_02_03";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_03 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_03 "CAN_DET_AZIMUTH_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_03 "CAN_DET_RANGE_02_03";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_03 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_03 "CAN_DET_RANGE_RATE_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_03 "CAN_DET_AMPLITUDE_02_03";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_03 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_03 "CAN_SCAN_INDEX_2LSB_02_03";
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 "CAN_DET_CONFID_AZIMUTH_02_04";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 "CAN_DET_CONFID_AZIMUTH_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 "CAN_DET_CONFID_AZIMUTH_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_04 "CAN_DET_SUPER_RES_TARGET_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_04 "CAN_DET_ND_TARGET_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_04 "CAN_DET_HOST_VEH_CLUTTER_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_04 "CAN_DET_VALID_LEVEL_02_04";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_04 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_04 "CAN_DET_AZIMUTH_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_04 "CAN_DET_RANGE_02_04";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_04 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_04 "CAN_DET_RANGE_RATE_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_04 "CAN_DET_AMPLITUDE_02_04";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_04 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_04 "CAN_SCAN_INDEX_2LSB_02_04";
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 "CAN_DET_CONFID_AZIMUTH_02_05";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 "CAN_DET_CONFID_AZIMUTH_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 "CAN_DET_CONFID_AZIMUTH_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_05 "CAN_DET_SUPER_RES_TARGET_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_05 "CAN_DET_ND_TARGET_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_05 "CAN_DET_HOST_VEH_CLUTTER_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_05 "CAN_DET_VALID_LEVEL_02_05";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_05 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_05 "CAN_DET_AZIMUTH_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_05 "CAN_DET_RANGE_02_05";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_05 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_05 "CAN_DET_RANGE_RATE_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_05 "CAN_DET_AMPLITUDE_02_05";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_05 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_05 "CAN_SCAN_INDEX_2LSB_02_05";
+BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 "CAN_DET_CONFID_AZIMUTH_02_06";
+BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 "CAN_DET_CONFID_AZIMUTH_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 "CAN_DET_CONFID_AZIMUTH_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_06 "CAN_DET_SUPER_RES_TARGET_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_06 "CAN_DET_ND_TARGET_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_06 "CAN_DET_HOST_VEH_CLUTTER_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_06 "CAN_DET_VALID_LEVEL_02_06";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_06 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_06 "CAN_DET_AZIMUTH_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_06 "CAN_DET_RANGE_02_06";
+BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_06 0;
+BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_06 "CAN_DET_RANGE_RATE_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_06 "CAN_DET_AMPLITUDE_02_06";
+BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_06 0;
+BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_06 "CAN_SCAN_INDEX_2LSB_02_06";
+BA_ "GenMsgSendType" BO_ 256 1;
+BA_ "GenMsgILSupport" BO_ 256 1;
+BA_ "GenMsgNrOfRepetition" BO_ 256 0;
+BA_ "NetworkInitialization" BO_ 256 0;
+BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MINOR_MRR "CAN_PCAN_MINOR_MRR";
+BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MINOR_MRR 0;
+BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MAJOR_MRR "CAN_PCAN_MAJOR_MRR";
+BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MAJOR_MRR 0;
+BA_ "GenMsgCycleTime" BO_ 257 30;
+BA_ "GenMsgSendType" BO_ 257 0;
+BA_ "GenMsgILSupport" BO_ 257 1;
+BA_ "GenMsgNrOfRepetition" BO_ 257 0;
+BA_ "NetworkInitialization" BO_ 257 0;
+BA_ "GenSigCmt" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtEn" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtName" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtName" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigCmt" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigStartValue" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0;
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0;
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE 0;
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_MNR 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_EXT_COND_NOK 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_NOT_START 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_OVERHEAT_ERROR 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_NOT_OP 0;
+BA_ "GenSigCmt" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigVtEn" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigVtName" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigSendType" SG_ 257 CAN_XCVR_OPERATIONAL 0;
+BA_ "GenMsgSendType" BO_ 288 1;
+BA_ "GenMsgILSupport" BO_ 288 1;
+BA_ "GenMsgNrOfRepetition" BO_ 288 0;
+BA_ "GenMsgCycleTime" BO_ 288 0;
+BA_ "NetworkInitialization" BO_ 288 0;
+BA_ "GenMsgDelayTime" BO_ 288 0;
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 "CAN_DET_CONFID_AZIMUTH_01_01";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 "CAN_DET_CONFID_AZIMUTH_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 "CAN_DET_CONFID_AZIMUTH_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_01 "CAN_DET_SUPER_RES_TARGET_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_01 "CAN_DET_ND_TARGET_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_01 "CAN_DET_HOST_VEH_CLUTTER_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_01 "CAN_DET_VALID_LEVEL_01_01";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_01 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_01 "CAN_DET_AZIMUTH_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_01 "CAN_DET_RANGE_01_01";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_01 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_01 "CAN_DET_RANGE_RATE_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_01 "CAN_DET_AMPLITUDE_01_01";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_01 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_01 "CAN_SCAN_INDEX_2LSB_01_01";
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 "CAN_DET_CONFID_AZIMUTH_01_02";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 "CAN_DET_CONFID_AZIMUTH_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 "CAN_DET_CONFID_AZIMUTH_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_02 "CAN_DET_SUPER_RES_TARGET_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_02 "CAN_DET_ND_TARGET_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_02 "CAN_DET_HOST_VEH_CLUTTER_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_02 "CAN_DET_VALID_LEVEL_01_02";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_02 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_02 "CAN_DET_AZIMUTH_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_02 "CAN_DET_RANGE_01_02";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_02 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_02 "CAN_DET_RANGE_RATE_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_02 "CAN_DET_AMPLITUDE_01_02";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_02 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_02 "CAN_SCAN_INDEX_2LSB_01_02";
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 "CAN_DET_CONFID_AZIMUTH_01_03";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 "CAN_DET_CONFID_AZIMUTH_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 "CAN_DET_CONFID_AZIMUTH_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_03 "CAN_DET_SUPER_RES_TARGET_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_03 "CAN_DET_ND_TARGET_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_03 "CAN_DET_HOST_VEH_CLUTTER_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_03 "CAN_DET_VALID_LEVEL_01_03";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_03 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_03 "CAN_DET_AZIMUTH_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_03 "CAN_DET_RANGE_01_03";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_03 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_03 "CAN_DET_RANGE_RATE_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_03 "CAN_DET_AMPLITUDE_01_03";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_03 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_03 "CAN_SCAN_INDEX_2LSB_01_03";
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 "CAN_DET_CONFID_AZIMUTH_01_04";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 "CAN_DET_CONFID_AZIMUTH_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 "CAN_DET_CONFID_AZIMUTH_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_04 "CAN_DET_SUPER_RES_TARGET_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_04 "CAN_DET_ND_TARGET_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_04 "CAN_DET_HOST_VEH_CLUTTER_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_04 "CAN_DET_VALID_LEVEL_01_04";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_04 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_04 "CAN_DET_AZIMUTH_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_04 "CAN_DET_RANGE_01_04";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_04 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_04 "CAN_DET_RANGE_RATE_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_04 "CAN_DET_AMPLITUDE_01_04";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_04 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_04 "CAN_SCAN_INDEX_2LSB_01_04";
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 "CAN_DET_CONFID_AZIMUTH_01_05";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 "CAN_DET_CONFID_AZIMUTH_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 "CAN_DET_CONFID_AZIMUTH_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_05 "CAN_DET_SUPER_RES_TARGET_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_05 "CAN_DET_ND_TARGET_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_05 "CAN_DET_HOST_VEH_CLUTTER_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_05 "CAN_DET_VALID_LEVEL_01_05";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_05 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_05 "CAN_DET_AZIMUTH_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_05 "CAN_DET_RANGE_01_05";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_05 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_05 "CAN_DET_RANGE_RATE_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_05 "CAN_DET_AMPLITUDE_01_05";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_05 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_05 "CAN_SCAN_INDEX_2LSB_01_05";
+BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 "CAN_DET_CONFID_AZIMUTH_01_06";
+BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 "CAN_DET_CONFID_AZIMUTH_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 "CAN_DET_CONFID_AZIMUTH_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_06 "CAN_DET_SUPER_RES_TARGET_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_06 "CAN_DET_ND_TARGET_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_06 "CAN_DET_HOST_VEH_CLUTTER_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_06 "CAN_DET_VALID_LEVEL_01_06";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_06 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_06 "CAN_DET_AZIMUTH_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_06 "CAN_DET_RANGE_01_06";
+BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_06 0;
+BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_06 "CAN_DET_RANGE_RATE_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_06 "CAN_DET_AMPLITUDE_01_06";
+BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_06 0;
+BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_06 "CAN_SCAN_INDEX_2LSB_01_06";
+BA_DEF_DEF_ "CrossOver_InfoCAN" "No";
+BA_DEF_DEF_ "CrossOver_LIN" "No";
+BA_DEF_DEF_ "UsedOnPgmDBC" "Yes";
+BA_DEF_DEF_ "ContentDependant" "No";
+BA_DEF_DEF_ "GenSigTimeoutTime_RCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_OCS" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_CCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_IPMA" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_SCCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_Generic_BCM" 0;
+BA_DEF_DEF_ "NmMessage" "No";
+BA_DEF_DEF_ "DiagResponse" "No";
+BA_DEF_DEF_ "DiagRequest" "No";
+BA_DEF_DEF_ "TpTxIndex" 0;
+BA_DEF_DEF_ "DiagState" "No";
+BA_DEF_DEF_ "TpApplType" "";
+BA_DEF_DEF_ "NmAsrMessage" "No";
+BA_DEF_DEF_ "Mulitplexer" "No";
+BA_DEF_DEF_ "ConfiguredTransmitter" "No";
+BA_DEF_DEF_ "EventRateOfChange" 10000;
+BA_DEF_DEF_ "GenMsgHandlingTypeDoc" "";
+BA_DEF_DEF_ "GenMsgHandlingTypeCode" "";
+BA_DEF_DEF_ "GenMsgMarked" "";
+BA_DEF_DEF_ "GenSigMarked" "";
+BA_DEF_DEF_ "GenSigVtIndex" "";
+BA_DEF_DEF_ "GenSigVtName" "";
+BA_DEF_DEF_ "GenSigVtEn" "";
+BA_DEF_DEF_ "GenSigSNA" "";
+BA_DEF_DEF_ "GenSigCmt" "";
+BA_DEF_DEF_ "GenMsgCmt" "";
+BA_DEF_DEF_ "GenSigSendType" "NoSigSendType";
+BA_DEF_DEF_ "GenSigInactiveValue" 0;
+BA_DEF_DEF_ "GenSigMissingSourceValue" 0;
+BA_DEF_DEF_ "WakeupSignal" "No";
+BA_DEF_DEF_ "GenSigStartValue" 0;
+BA_DEF_DEF_ "GenMsgILSupport" "Yes";
+BA_DEF_DEF_ "NetworkInitializationCommand" "No";
+BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+BA_DEF_DEF_ "GenMsgCycleTimeFast" 0;
+BA_DEF_DEF_ "GenMsgDelayTime" 0;
+BA_DEF_DEF_ "GenMsgNrOfRepetition" 0;
+BA_DEF_DEF_ "GenMsgStartDelayTime" 0;
+BA_DEF_DEF_ "NetworkInitialization" "No";
+BA_DEF_DEF_ "MessageGateway" "No";
+BA_DEF_DEF_ "ILUsed" "Yes";
+BA_DEF_DEF_ "NetworkInitializationUsed" "No";
+BA_DEF_DEF_ "PowerType" "Switched";
+BA_DEF_DEF_ "NodeStartUpTime" 250;
+BA_DEF_DEF_ "NodeWakeUpTime" 10;
+BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff";
+BA_DEF_DEF_ "GenMsgForegroundColor" "#000000";
+VAL_ 34 IPMA_PCAN_DataRangeCheck 1 "Fault Present" 0 "No Fault";
+VAL_ 34 IPMA_PCAN_MissingMsg 1 "Fault Present" 0 "No Fault ";
+VAL_ 34 VINSignalCompareFailure 1 "Fault Present" 0 "No Fault";
+VAL_ 34 ModuleNotConfiguredError 1 "Fault Present" 0 "No Fault";
+VAL_ 34 CarCfgNotConfiguredError 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ARMtoDSPChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 DSPtoArmChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 HostToArmChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ARMtoHostChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 LoopBWOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 DSPOverrunFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte6_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TuningSensitivityFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 SaturatedTuningFreqFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 LocalOscPowerFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterPowerFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte6_bit0 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 XCVRDeviceSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 FreqSynthesizerSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 AnalogConverterDevicSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 SidelobeBlockage 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit1 1 "Fault Present" 0 "No Fault";
+VAL_ 33 MNRBlocked 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ECUTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 AlignmentRoutineFailedFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 UnreasonableRadarData 1 "Fault Present" 0 "No Fault";
+VAL_ 33 MicroprocessorTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 VerticalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 HorizontalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 FactoryAlignmentMode 1 "Fault Present" 0 "No Fault";
+VAL_ 33 BatteryLowFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 BatteryHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_1p25SupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte3_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ThermistorOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_3p3DACSupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_3p3RAWSupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_5_SupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterIDFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit3 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit2 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PCANMissingMsgFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PCANBusOff 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 InstructionSetCheckFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 StackOverflowFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 WatchdogFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PLLLockFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit1 1 "Fault Present" 0 "No Fault";
+VAL_ 33 RAMMemoryTestFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 USCValidationFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit3 1 "Fault Present" 0 "No Fault";
+VAL_ 33 KeepAliveChecksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ProgramCalibrationFlashChecksum 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ApplicationFlashChecksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 371 CAN_AUTO_ALIGN_HANGLE_QF 3 "Accurate" 2 "Inaccurate" 1 "Temporarily undefined" 0 "Undefined";
+VAL_ 371 CAN_ALIGNMENT_STATUS 15 "Undefined_2" 14 "Undefined_1" 13 "Low Amplitude (Flat-plate only)" 12 "No Peak (Flat-plate only)" 11 "Fail Ver and Hor OutOfRange" 10 "Fail Vertical Align OutOfRange" 9 "Fail Horizontal Align OutOfRange" 8 "Fail Time Out" 7 "Fail Only Right Target Found" 6 "Fail Only Left Target Found" 5 "Fail Variance Too Large" 4 "Fail Deviation Too Large" 3 "Fail No Target" 2 "Success" 1 "Busy" 0 "Off";
+VAL_ 371 CAN_ALIGNMENT_STATE 6 "Static alignment flat-plate" 5 "Static alignment 2-target" 4 "Static alignment 1-target" 3 "Service alignment" 2 "Short track alignment" 1 "Auto alignment" 0 "Off";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 351 CAN_DET_CONFID_AZIMUTH_64 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 350 CAN_DET_CONFID_AZIMUTH_63 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 349 CAN_DET_CONFID_AZIMUTH_62 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 348 CAN_DET_CONFID_AZIMUTH_61 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 347 CAN_DET_CONFID_AZIMUTH_60 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 346 CAN_DET_CONFID_AZIMUTH_59 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 345 CAN_DET_CONFID_AZIMUTH_58 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 344 CAN_DET_CONFID_AZIMUTH_57 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 343 CAN_DET_CONFID_AZIMUTH_56 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 342 CAN_DET_CONFID_AZIMUTH_55 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 335 CAN_DET_CONFID_AZIMUTH_48 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 334 CAN_DET_CONFID_AZIMUTH_47 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 333 CAN_DET_CONFID_AZIMUTH_46 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 332 CAN_DET_CONFID_AZIMUTH_45 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 331 CAN_DET_CONFID_AZIMUTH_44 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 330 CAN_DET_CONFID_AZIMUTH_43 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 329 CAN_DET_CONFID_AZIMUTH_42 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 328 CAN_DET_CONFID_AZIMUTH_41 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 327 CAN_DET_CONFID_AZIMUTH_40 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 325 CAN_DET_CONFID_AZIMUTH_38 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 324 CAN_DET_CONFID_AZIMUTH_37 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 323 CAN_DET_CONFID_AZIMUTH_36 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 322 CAN_DET_CONFID_AZIMUTH_35 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 321 CAN_DET_CONFID_AZIMUTH_34 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 320 CAN_DET_CONFID_AZIMUTH_33 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 319 CAN_DET_CONFID_AZIMUTH_32 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 318 CAN_DET_CONFID_AZIMUTH_31 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 317 CAN_DET_CONFID_AZIMUTH_30 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 316 CAN_DET_CONFID_AZIMUTH_29 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 314 CAN_DET_CONFID_AZIMUTH_27 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 313 CAN_DET_CONFID_AZIMUTH_26 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 312 CAN_DET_CONFID_AZIMUTH_25 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 311 CAN_DET_CONFID_AZIMUTH_24 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 310 CAN_DET_CONFID_AZIMUTH_23 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 309 CAN_DET_CONFID_AZIMUTH_22_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 309 CAN_DET_CONFID_AZIMUTH_22_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 309 CAN_DET_CONFID_AZIMUTH_22_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 341 CAN_DET_CONFID_AZIMUTH_54 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 340 CAN_DET_CONFID_AZIMUTH_53 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 339 CAN_DET_CONFID_AZIMUTH_52 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 338 CAN_DET_CONFID_AZIMUTH_51 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 337 CAN_DET_CONFID_AZIMUTH_50 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 336 CAN_DET_CONFID_AZIMUTH_49 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 326 CAN_DET_CONFID_AZIMUTH_39 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 315 CAN_DET_CONFID_AZIMUTH_28 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 257 CAN_INTERFERENCE_TYPE 2 "Star PD-Like" 1 "Slow FMCW" 0 "No Interference";
+VAL_ 257 CAN_RECOMMEND_UNCONVERGE 1 "Recommended" 0 "Not Recommended";
+VAL_ 257 CAN_RADAR_ALIGN_INCOMPLETE 1 "Alignment Incomplete" 0 "Alignment Completed";
+VAL_ 257 CAN_BLOCKAGE_SIDELOBE 1 "Radar Blockage" 0 "No Radar Blockage";
+VAL_ 257 CAN_BLOCKAGE_MNR 1 "Radar Blockage" 0 "No Radar Blockage";
+VAL_ 257 CAN_RADAR_EXT_COND_NOK 1 "Too high temp or insufficient pw" 0 "External conditions OK";
+VAL_ 257 CAN_RADAR_ALIGN_OUT_RANGE 1 "Radar out of range" 0 "Radar within range";
+VAL_ 257 CAN_RADAR_ALIGN_NOT_START 1 "Radar align not started" 0 "Radar align started";
+VAL_ 257 CAN_RADAR_OVERHEAT_ERROR 1 "Radar overheat condition" 0 "No Overheat";
+VAL_ 257 CAN_RADAR_NOT_OP 1 "Radar not operational" 0 "Radar operational";
+VAL_ 257 CAN_XCVR_OPERATIONAL 1 "On" 0 "Off ";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
diff --git a/iqdbc_repo/iqdbc/dbc/README.md b/iqdbc_repo/iqdbc/dbc/README.md
new file mode 100644
index 000000000..39e71e9fa
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/README.md
@@ -0,0 +1,49 @@
+## DBC file basics
+
+A DBC file encodes, in a humanly readable way, the information needed to understand a vehicle's CAN bus traffic. A vehicle might have multiple CAN buses and every CAN bus is represented by its own dbc file.
+Wondering what's the DBC file format? [Here](http://www.socialledge.com/sjsu/index.php?title=DBC_Format) and [Here](https://github.com/stefanhoelzl/CANpy/blob/master/docs/DBC_Specification.md) a couple of good overviews.
+
+## How to start reverse engineering cars
+
+[iqdbc](https://github.com/commaai/iqdbc) is integrated with [cabana](https://github.com/commaai/openpilot/tree/master/tools/cabana).
+
+Use [panda](https://github.com/commaai/panda) to connect your car to a computer.
+
+## How to use reverse engineered DBC
+To create custom CAN simulations or send reverse engineered signals back to the car you can use [CANdevStudio](https://github.com/GENIVI/CANdevStudio) project.
+
+## DBC file preprocessor
+
+DBC files for different models of the same brand have a lot of overlap. Therefore, we wrote a preprocessor to create DBC files from a brand DBC file and a model specific DBC file. The source DBC files can be found in the generator folder. After changing one of the files run the generator.py script to regenerate the output files. These output files will be placed in the root of the iqdbc repository and are suffixed by _generated.
+
+## Good practices for contributing to iqdbc
+
+- Comments: the best way to store comments is to add them directly to the DBC files. For example:
+ ```
+ CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+ ```
+ is a comment that refers to signal `LONG_ACCEL` in message `490`. Using comments is highly recommended, especially for doubts and uncertainties. [cabana](https://community.comma.ai/cabana/) can easily display/add/edit comments to signals and messages.
+
+- Units: when applicable, it's recommended to convert signals into physical units, by using a proper signal factor. Using a SI unit is preferred, unless a non-SI unit rounds the signal factor much better.
+For example:
+ ```
+ SG_ VEHICLE_SPEED : 7|15@0+ (0.00278,0) [0|70] "m/s" PCM
+ ```
+ is better than:
+ ```
+ SG_ VEHICLE_SPEED : 7|15@0+ (0.00620,0) [0|115] "mph" PCM
+ ```
+ However, the cleanest option is really:
+ ```
+ SG_ VEHICLE_SPEED : 7|15@0+ (0.01,0) [0|250] "kph" PCM
+ ```
+
+- Signal size: always use the smallest amount of bits possible. For example, let's say I'm reverse engineering the gas pedal position and I've determined that it's in a 3 bytes message. For 0% pedal position I read a message value of `0x00 0x00 0x00`, while for 100% of pedal position I read `0x64 0x00 0x00`: clearly, the gas pedal position is within the first byte of the message and I might be tempted to define the signal `GAS_POS` as:
+ ```
+ SG_ GAS_POS : 7|8@0+ (1,0) [0|100] "%" PCM
+ ```
+ However, I can't be sure that the very first bit of the message is referred to the pedal position: I haven't seen it changing! Therefore, a safer way of defining the signal is:
+ ```
+ SG_ GAS_POS : 6|7@0+ (1,0) [0|100] "%" PCM
+ ```
+ which leaves the first bit unallocated. This prevents from very erroneous reading of the gas pedal position, in case the first bit is indeed used for something else.
diff --git a/iqdbc_repo/iqdbc/dbc/__init__.py b/iqdbc_repo/iqdbc/dbc/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/dbc/acura_ilx_2016_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/acura_ilx_2016_can_generated.dbc
new file mode 100644
index 000000000..7f0e2db09
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/acura_ilx_2016_can_generated.dbc
@@ -0,0 +1,439 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_a.dbc starts here";
+BO_ 660 SCM_FEEDBACK: 8 SCM
+ SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 422 SCM_BUTTONS: 8 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON
+ SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON
+
+VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
+VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+
+
+CM_ "Imported file _steering_sensors_b.dbc starts here";
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_a.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "acura_ilx_2016_can.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/acura_ilx_2016_nidec.dbc b/iqdbc_repo/iqdbc/dbc/acura_ilx_2016_nidec.dbc
new file mode 100644
index 000000000..e73fcc422
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/acura_ilx_2016_nidec.dbc
@@ -0,0 +1,185 @@
+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_: ADAS RADAR NEO XXX
+
+
+BO_ 768 VEHICLE_STATE: 8 ADAS
+ SG_ SET_ME_XF9 : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ VEHICLE_SPEED : 15|8@0+ (1,0) [0|255] "kph" Vector__XXX
+
+BO_ 769 VEHICLE_STATE2: 8 ADAS
+ SG_ SET_ME_0F18510 : 7|28@0+ (1,0) [0|268435455] "" Vector__XXX
+ SG_ SET_ME_25A0000 : 27|28@0+ (1,0) [0|268435455] "" Vector__XXX
+
+BO_ 1024 RADAR_DIAGNOSTIC: 8 RADAR
+ SG_ RADAR_STATE : 7|8@0+ (1,0) [0|255] "" NEO
+
+BO_ 1040 XXX_101: 8 RADAR
+
+BO_ 1041 XXX_102: 8 RADAR
+
+BO_ 1042 XXX_103: 8 RADAR
+
+BO_ 1043 XXX_104: 8 RADAR
+
+BO_ 1044 XXX_105: 8 RADAR
+
+BO_ 1045 XXX_106: 8 RADAR
+
+BO_ 1046 XXX_107: 8 RADAR
+
+BO_ 1047 XXX_108: 8 RADAR
+
+BO_ 1056 XXX_109: 8 RADAR
+
+BO_ 1057 XXX_110: 8 RADAR
+
+BO_ 1058 XXX_111: 8 RADAR
+
+BO_ 1059 XXX_112: 8 RADAR
+
+BO_ 1060 XXX_113: 8 RADAR
+
+BO_ 1072 TRACK_0: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1073 TRACK_1: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1074 TRACK_2: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1075 TRACK_3: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1076 TRACK_4: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1077 TRACK_5: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1078 TRACK_6: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1079 TRACK_7: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1080 TRACK_8: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1081 TRACK_9: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1088 TRACK_10: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1089 TRACK_11: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1090 TRACK_12: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1091 TRACK_13: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1092 TRACK_14: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1093 TRACK_15: 8 RADAR
+ SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
+ SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO
+ SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO
+
+BO_ 1279 XXX_114: 8 RADAR
+
+BO_ 1280 XXX_115: 8 RADAR
+
+BO_ 1296 XXX_116: 8 RADAR
+
+BO_ 1297 XXX_117: 8 RADAR
+
+BO_TX_BU_ 768 : NEO,ADAS;
+BO_TX_BU_ 769 : NEO,ADAS;
+
+
+CM_ SG_ 1024 RADAR_STATE "need to find out more diagnostic values";
+VAL_ 1024 RADAR_STATE 121 "ok" 110 "faulted" 105 "wrong_config";
diff --git a/iqdbc_repo/iqdbc/dbc/acura_rdx_2018_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/acura_rdx_2018_can_generated.dbc
new file mode 100644
index 000000000..0c8fe4be5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/acura_rdx_2018_can_generated.dbc
@@ -0,0 +1,403 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_a.dbc starts here";
+BO_ 660 SCM_FEEDBACK: 8 SCM
+ SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 422 SCM_BUTTONS: 8 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON
+ SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON
+
+VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
+VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+
+
+CM_ "Imported file _steering_sensors_b.dbc starts here";
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_b.dbc starts here";
+BO_ 404 STEERING_CONTROL: 4 EON
+ SG_ STEER_TORQUE : 7|12@0- (1,0) [-768|768] "" EPS
+ SG_ SET_ME_X00 : 11|4@0+ (1,0) [0|15] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00_2 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS
+
+BO_ 399 STEER_STATUS: 6 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|12@0- (-1,0) [-2047.5|2047.5] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_CONTROL_ACTIVE : 36|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_STATUS : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+CM_ "acura_rdx_2018_can.dbc starts here";
+
+BO_ 392 GEARBOX_AUTO: 6 XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON
+
+VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ;
+VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
diff --git a/iqdbc_repo/iqdbc/dbc/acura_rdx_2020_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/acura_rdx_2020_can_generated.dbc
new file mode 100644
index 000000000..0001e71b4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/acura_rdx_2020_can_generated.dbc
@@ -0,0 +1,576 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _bosch_2018.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX
+ SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 232 BRAKE_HOLD: 7 XXX
+ SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX
+ SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+BO_ 446 BRAKE_MODULE: 3 VSA
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS
+ SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 545 ECON_STATUS: 6 SCM
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY
+
+BO_ 576 LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 577 LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 579 RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 580 RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 927 RADAR_HUD: 8 RADAR
+ SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
+ SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
+ SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
+ SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 13274 LKAS_HUD_A: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+BO_ 13275 LKAS_HUD_B: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+
+CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1";
+CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded";
+CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded";
+CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded";
+CM_ SG_ 577 LINE_DASHED "1 = line is dashed";
+CM_ SG_ 577 LINE_SOLID "1 = line is solid";
+
+VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active";
+VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal";
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ;
+VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN";
+VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN";
+
+
+CM_ "Imported file _bosch_radar_acc.dbc starts here";
+BO_ 479 ACC_CONTROL: 8 EON
+ SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX
+ SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX
+ SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX
+ SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 495 ACC_CONTROL_ON: 8 XXX
+ SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX
+ SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled";
+CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event";
+CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event";
+CM_ SG_ 479 AEB_PREPARE "set 1s before AEB";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _bosch_standstill.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+
+CM_ "Imported file _steering_sensors_b.dbc starts here";
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "acura_rdx_2020_can.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/bmw_e9x_e8x.dbc b/iqdbc_repo/iqdbc/dbc/bmw_e9x_e8x.dbc
new file mode 100644
index 000000000..7ec95c0b1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/bmw_e9x_e8x.dbc
@@ -0,0 +1,913 @@
+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_: EON XXX RDC SZL VGSG JBBF RFK FLA RAD1 CAS CID AHM HKL HUD EKP DWA DSC SM_BF GWS VDM DDE1 ACI CCC DSC SM_FA CTM LDM RSE MRSZ VDA EDCK ZBE EGS ACC_Sensor Kombi IHKA ARS ACSM FZD PGS NVC AFS DME FRMFA EMF FKA VSW EPS PDC DKG EHC Diagnosetool_PT_CAN Diagnosetool_K_CAN_System Vector__XXX
+
+
+BO_ 170 AccPedal: 8 DME
+ SG_ KickDownPressed : 53|1@0+ (1,0) [0|3] "" XXX
+ SG_ CruisePedalActive : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruisePedalInactive : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ ThrottlelPressed : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ AcceleratorPedalPressed : 52|1@0+ (1,0) [0|7] "" XXX
+ SG_ AcceleratorPedalPercentage : 16|16@1+ (0.04,0) [0|100] "" XXX
+ SG_ Counter_170 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ EngineSpeed : 32|16@1+ (0.25,0) [0|8000] "rpm" XXX
+ SG_ Checksum_170 : 0|8@1- (1,0) [0|65535] "" XXX
+
+BO_ 404 CruiseControl: 4 SZL
+ SG_ plus1mph_request : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ minus1mph_request : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cancel_request_up_stalk : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cancel_request_up_or_down_stalk : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ Resume_request : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ setMe_0xFC : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ plus5mph_request : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ minus5mph_request : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ requests_0xF : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ Counter_404 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ Checksum_404 : 7|8@0+ (1,0) [0|15] "" XXX
+
+BO_ 512 CruiseControlStatus: 8 DME
+ SG_ CruiseControlInactiveFlag : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseCoontrolActiveFlag : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseControlSetpointSpeed : 7|8@0+ (0.25,0) [0|255] "mph" XXX
+
+BO_ 168 EngineAndBrake: 8 DME
+ SG_ Checksum_EngineAndBrake : 0|8@1+ (1,0) [0|0] "" XXX
+ SG_ BrakePressed : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ Brake_active2 : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ST_RCPT_ENG_DSC : 52|2@1+ (1,0) [0|0] "" XXX
+ SG_ ST_RCPT_ENG_ARS : 50|2@1+ (1,0) [0|0] "" XXX
+ SG_ ST_RCPT_ENG_ACC : 48|2@1+ (1,0) [0|0] "" XXX
+ SG_ ST_RCPT_ENG_EGS : 54|2@1+ (1,0) [0|0] "" XXX
+ SG_ ST_DMEA_SWO : 44|2@1+ (1,0) [0|0] "" XXX
+ SG_ EngineTorque : 12|12@1- (0.03125,0) [-1024|1023] "" XXX
+ SG_ ALIV_TORQ_1_DME : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ EngineTorqueWoInterv : 24|16@1- (0.03125,0) [-1024|1023.96875] "" XXX
+
+BO_ 470 SteeringButtons: 2 SZL
+ SG_ Volume_DOWN : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ Volume_UP : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ VoiceControl : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ Telephone : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ Next_up : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ Previous_down : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 403 DynamicCruiseControlStatus: 8 DSC
+ SG_ Counter_403 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ CruiseActive : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseSpeedChangeRequest : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseControlSetpointSpeed : 15|8@0+ (1,-2) [0|255] "kph/mph" XXX
+
+BO_ 201 SteeringWheelAngle_DSC: 8 SZL
+ SG_ Counter_201 : 20|4@1+ (1,0) [0|15] "" DSC
+ SG_ SteeringPositionComplementLow : 24|11@1- (1,0) [0|1] "" DSC
+ SG_ SteeringPosition : 0|16@1- (0.0428316886,0) [-600|600] "deg" DSC
+
+BO_ 206 WheelSpeeds: 8 DSC
+ SG_ Wheel_FL : 0|16@1- (0.0625,0) [0|255] "kph" XXX
+ SG_ Wheel_FR : 16|16@1- (0.0625,0) [0|255] "kph" XXX
+ SG_ Wheel_RL : 32|16@1- (0.0625,0) [0|255] "kph" XXX
+ SG_ Wheel_RR : 48|16@1- (0.0625,0) [0|255] "kph" XXX
+
+BO_ 884 WheelToleranceAdjustment: 8 DSC
+
+BO_ 678 WiperSwitch: 8 SZL
+ SG_ AutoWipersOn : 0|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 304 TerminalStatus: 8 CAS
+ SG_ AccOn : 23|1@1+ (1,0) [0|255] "" XXX
+ SG_ IgnitionOff : 22|1@1+ (1,0) [0|3] "" XXX
+ SG_ Counter_304 : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ Checksum_304 : 36|4@1+ (1,0) [0|255] "" XXX
+
+BO_ 169 Torque2: 8 DME
+ SG_ TORQ_AVL_SPAR_POS : 52|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX
+ SG_ TORQ_AVL_SPAR_NEG : 40|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX
+ SG_ TORQ_AVL_MAX : 28|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX
+ SG_ TORQ_AVL_MIN : 16|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX
+ SG_ ST_INFS : 14|2@1+ (1,0) [0|0] "" XXX
+ SG_ ST_SW_LEV_RPM : 12|2@1+ (1,0) [0|0] "" XXX
+ SG_ ALIV_TORQ_2_DME : 8|4@1+ (1,0) [0|0] "" XXX
+ SG_ CHKSM_TORQ_2_DME : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 184 TorqueTransmisionRequest: 8 LDM
+ SG_ Checksum_184 : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ Counter_184 : 8|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 196 SteeringWheelAngle: 7 DSC
+ SG_ SteeringSpeed : 24|16@1- (0.0428316886,0) [0|255] "degree/s" XXX
+ SG_ SteeringPosition : 0|16@1- (0.0428316886,0) [-600|600] "degree" XXX
+
+BO_ 180 WheelTorqueDriveTrain1: 8 DME
+
+BO_ 182 DynamicCruiseControlTorqueDemand: 8 DSC
+ SG_ TORQ_TAR_DSC : 12|12@1- (0.5,0) [0|1000] "" XXX
+ SG_ Counter_182 : 8|4@1+ (1,0) [0|14] "" XXX
+ SG_ Checksum_182 : 0|8@1+ (1,0) [0|15] "" XXX
+
+BO_ 186 TransmissionData: 8 EGS
+ SG_ Counter_186 : 48|4@1+ (1,0) [0|14] "" XXX
+ SG_ Shifting : 4|1@1+ (1,0) [0|15] "" XXX
+ SG_ OutputShaftSpeed : 24|16@1- (0.125,0) [0|255] "rpm" XXX
+ SG_ GearRatio : 8|8@1+ (0.05,0) [0|255] "" XXX
+ SG_ GearTar : 0|4@1+ (1,-4) [0|255] "" XXX
+ SG_ Checksum_186 : 40|8@1+ (1,0) [0|15] "" XXX
+
+BO_ 191 RequestedWheelTorqueDriveTrain: 8 LDM
+ SG_ Checksum_191 : 0|8@1+ (1,0) [0|19] "" XXX
+ SG_ Counter_191 : 8|4@1- (1,0) [0|255] "" XXX
+ SG_ TorqueReq : 16|12@1- (0.5,350) [-1024|1023.96875] "" XXX
+
+BO_ 414 StatusDSC_KCAN: 8 DSC
+ SG_ BrakePressure : 48|8@1- (1,0) [0|255] "" XXX
+ SG_ BrakeStates : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Checksum_414 : 56|8@1+ (1,0) [0|15] "" XXX
+ SG_ Counter_414 : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ DTC_on : 12|1@1+ (1,0) [0|3] "" XXX
+ SG_ DSC_full_off : 8|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 416 Speed: 8 DSC
+ SG_ AccX : 28|12@1- (1,0) [0|15] "" XXX
+ SG_ YawRate : 40|12@1- (1,0) [0|255] "" XXX
+ SG_ VehicleSpeed : 0|12@1- (0.103,0) [0|255] "kph" XXX
+ SG_ MovingReverse : 13|1@1+ (1,0) [0|3] "" XXX
+ SG_ AccY : 16|12@1- (1,0) [0|255] "" XXX
+ SG_ Counter_416 : 52|4@1+ (1,0) [0|14] "" XXX
+ SG_ Checksum_416 : 56|8@1+ (1,0) [0|15] "" XXX
+ SG_ MovingForward : 12|1@1+ (1,0) [0|15] "" XXX
+
+BO_ 418 TransimissionData2: 8 EGS
+ SG_ ManualMode : 50|1@0+ (1,0) [0|255] "" XXX
+ SG_ Counter_418 : 28|4@1+ (1,0) [0|14] "" XXX
+ SG_ Checksum_418 : 56|8@1+ (1,0) [0|15] "" XXX
+
+BO_ 690 WheelPressure_KCAN: 8 DSC
+
+BO_ 691 AccelerationData: 8 DSC
+
+BO_ 402 GearSelectorSwitch_1: 4 XXX
+ SG_ Counter_402 : 24|4@1+ (1,0) [0|14] "" XXX
+
+BO_ 408 GearSelectorSwitch: 8 GWS
+ SG_ ParkButtonSecond : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ SideButton : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ SportButtonPressed : 34|2@1+ (1,0) [0|255] "" XXX
+ SG_ M3_button : 36|2@1+ (1,0) [0|3] "" XXX
+ SG_ SideButtonXOR11 : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ param1XOR11 : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ m3ShifterPositionXOR1111 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ always11 : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ m3ShifterPosition : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ param1 : 20|2@1+ (1,0) [0|3] "" XXX
+ SG_ param5 : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ Counter_408 : 0|4@1+ (1,0) [0|14] "" XXX
+ SG_ ParkButtonFirst : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ ShifterPositionXOR1111 : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ ShifterPosition : 12|4@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 422 DistanceRoute: 8 DSC
+
+BO_ 436 InstrumentClusterStatus_KOMBI: 8 CCC
+ SG_ HandbrakeActive : 41|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 464 EngineData: 8 DME
+ SG_ RPM_IDLG_TAR : 56|8@1+ (5,0) [0|1270] "1/min" XXX
+ SG_ CTR_SLCK : 48|2@1+ (1,0) [0|0] "" XXX
+ SG_ IJV_FU : 32|16@1+ (1,-48) [0|0] "C" XXX
+ SG_ AIP_ENG : 24|8@1+ (2,598) [600|1106] "hPa" XXX
+ SG_ ST_SW_WAUP : 22|2@1+ (1,0) [0|0] "" XXX
+ SG_ ST_ENG_RUN : 20|2@1+ (1,0) [0|0] "" XXX
+ SG_ Counter_464 : 16|4@1+ (1,0) [0|14] "" XXX
+ SG_ TEMP_EOI : 8|8@1+ (1,-48) [0|0] "C" XXX
+ SG_ TEMP_ENG : 0|8@1+ (1,-48) [0|0] "C" XXX
+
+BO_ 945 TransmissionData3: 8 DKG
+ SG_ Checksum_946 : 0|8@1+ (1,0) [0|19] "" XXX
+ SG_ Counter_945 : 8|4@1+ (1,0) [0|14] "" XXX
+
+BO_ 200 SteeringWheelAngle_slow: 6 SZL
+ SG_ SteeringPosition : 0|16@1- (0.0428316886,0) [-600|600] "degree" XXX
+ SG_ SteeringSpeed : 24|16@1- (0.0428316886,0) [-65535|65535] "degree/s" XXX
+ SG_ Counter_200 : 20|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 466 TransmissionDataDisplay: 8 EGS
+ SG_ ShiftLeverMode : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ GearAct : 12|4@1+ (1,-4) [0|15] "" XXX
+ SG_ Counter_466 : 28|4@1+ (1,0) [0|14] "" XXX
+ SG_ ShiftLeverPosition : 0|4@1+ (1,0) [0|8] "" XXX
+ SG_ xFF : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ ShiftLeverPositionXOR : 4|4@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ SportButtonState : 26|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 437 HeatFlow_LoadTorqueClimate: 8 IHKA
+
+BO_ 1152 NetworkManagment1: 8 XXX
+
+BO_ 1170 NetworkManagment2: 8 XXX
+
+BO_ 1175 NetworkManagment3: 8 XXX
+
+BO_ 1176 NetworkManagment4: 8 XXX
+
+BO_ 1193 NetworkManagment5: 8 XXX
+
+BO_ 1246 GWS_ShiftLeverHeartbeat: 8 XXX
+ SG_ IgnOff : 12|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 438 HeatFlowEngine: 8 DME
+
+BO_ 784 AmbientTemperature_RelativeTime: 8 Kombi
+
+BO_ 821 ElectricFuelPumpStatus: 8 EKP
+
+BO_ 1007 EngineOBD_data: 8 DME
+
+BO_ 1432 ServicesDKG: 8 XXX
+
+BO_ 309 CrashDisconnectControl: 8 ACSM
+
+BO_ 502 TurnSignals: 2 FRMFA
+ SG_ TurnSignalIdle : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ TurnSignalActive : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RightTurn : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LeftTurn : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ HoldActivated : 0|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 514 Dimming: 8 FRMFA
+
+BO_ 538 LampStatus: 8 FRMFA
+
+BO_ 550 RainSensorWiperSpeed: 8 FZD
+
+BO_ 578 ClimateFrontStatus: 8 IHKA
+
+BO_ 704 LCD_lighting: 8 Kombi
+
+BO_ 758 LightControl: 8 FRMFA
+
+BO_ 760 Time_Date: 8 Kombi
+
+BO_ 762 OccupancySeatBeltContact: 8 ACSM
+ SG_ NEW_SIGNAL_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 0|8@1+ (1,0) [0|15] "" XXX
+
+BO_ 764 TrunkStatus: 8 CAS
+
+BO_ 797 TirePressureStatus: 8 DSC
+
+BO_ 816 Range_Mileage: 8 Kombi
+
+BO_ 823 StatusFuelControl: 8 DME
+
+BO_ 897 EngineOilLevel: 8 DME
+
+BO_ 940 RunOnTimeTerminal30: 8 JBBF
+
+BO_ 947 PowerManagmentConsumptionControl: 8 DME
+
+BO_ 948 PowerBatteryVoltage: 8 DME
+ SG_ BatteryVoltage : 7|24@0+ (0.001,0) [0|65535] "" XXX
+
+BO_ 958 PowerRunningTime: 8 CAS
+
+BO_ 1408 ServicesKGM: 8 XXX
+
+BO_ 1426 ServicesDME: 8 XXX
+
+BO_ 1449 ServicesDSC: 8 XXX
+
+BO_ 1504 ServicesKOMBI: 8 XXX
+
+BO_ 1522 ServicesKBM: 8 XXX
+
+BO_ 209 Accelerometer1: 8 XXX
+ SG_ Counter_209 : 52|4@1+ (1,0) [0|255] "" XXX
+ SG_ Unknown : 16|16@1- (1,0) [0|65535] "" XXX
+ SG_ YawRate : 0|16@1- (1,0) [0|7] "" XXX
+ SG_ PitchRate : 32|16@1- (1,0) [0|65535] "" XXX
+ SG_ CRC8_209 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 172 WheelTorqueDrivetrain2: 8 DME
+
+BO_ 128 SYNC: 5 XXX
+ SG_ State2 : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ State1 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Counter_128 : 28|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 320 Unknown140: 2 XXX
+ SG_ State : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 212 Unknown_d4: 8 XXX
+ SG_ State1 : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Counter_212 : 52|4@1+ (1,0) [0|255] "" XXX
+ SG_ Checksum_212 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 205 Accelerometer2: 8 XXX
+ SG_ Counter_205 : 52|4@1+ (1,0) [0|255] "" XXX
+ SG_ LateralAcceleration : 32|16@1- (1,0) [0|255] "" XXX
+ SG_ YawRate : 0|16@1- (1,0) [0|255] "" XXX
+ SG_ CRC8_205 : 16|16@1- (1,0) [0|65535] "" XXX
+
+BO_ 790 OperationPushButtonDTC: 2 JBBF
+ SG_ setMe_0x3FFF : 2|14@1+ (1,0) [0|63] "" DSC
+ SG_ DTC_pressed : 0|1@1+ (1,0) [0|3] "" DSC
+
+BO_ 1577 Unknown_629: 8 XXX
+
+BO_ 133 Synchronization_SC_VDA: 8 DSC
+
+BO_ 173 Delay_request_ACC: 8 LDM
+
+BO_ 177 Torque_request_steering: 8 DSC
+
+BO_ 181 Torque_request_EGS: 8 EGS
+ SG_ Checksum_Torque_request_EGS : 0|8@1+ (1,0) [0|0] "" XXX
+ SG_ Gearbox_temperature : 56|8@1+ (1,0) [0|0] "C" XXX
+
+BO_ 183 Torque_request_ACC: 8 LDM
+
+BO_ 187 Target_torque_request: 8 DSC
+
+BO_ 188 Status_target_torque_conversion: 8 VGSG
+
+BO_ 190 Alive_Counter: 8 ARS
+
+BO_ 192 Alive_Central_Gateway: 8 JBBF
+
+BO_ 193 Alive_counter_telephone: 8 CCC
+
+BO_ 213 Request_wheel_torque_brake: 8 DSC
+
+BO_ 215 Alive_Counter_Security: 8 ACSM
+
+BO_ 216 CLU1_VDA: 8 VDA
+
+BO_ 225 Wheel_torque_brake: 8 DSC
+
+BO_ 226 Status_central_locking_BFT: 8 JBBF
+
+BO_ 227 CLU2_VDA: 8 VDA
+
+BO_ 230 Status_central_locking_BFTH: 8 JBBF
+
+BO_ 234 Status_central_locking_FAT: 8 JBBF
+
+BO_ 238 Central_locking_status_FATH: 8 JBBF
+
+BO_ 242 Status_central_locking_HK: 8 JBBF
+
+BO_ 244 CLU3_VDA: 8 VDA
+
+BO_ 247 lateral_dynamics_ARS_VDM: 8 ARS
+
+BO_ 249 Vertical_dynamics_VDM_ARS: 8 VDM
+
+BO_ 250 Control_window_lifter_FAT: 8 FRMFA
+
+BO_ 251 Control_window_lifter_BFT: 8 JBBF
+
+BO_ 252 Control_window_lifter_FATH: 8 JBBF
+
+BO_ 253 Control_window_lifter_BFTH: 8 JBBF
+
+BO_ 254 Voltage_level_sensors: 8 VDM
+
+BO_ 280 Exchange_AFS_DSC: 8 AFS
+
+BO_ 286 Control_interventions_DSC_AFS: 8 DSC
+
+BO_ 288 Status_partial_setpoints_AFS_DSC_2: 8 AFS
+
+BO_ 298 Sensor_data_ROSE: 8 ASCM
+
+BO_ 300 input_data_ROSE: 8 DSC
+
+BO_ 336 Request_1_ACC: 8 LDM
+
+BO_ 339 Request_2_ACC: 8 LDM
+
+BO_ 345 Object_data_ACC: 8 ACC_Sensor
+
+BO_ 348 Status_ACC: 8 ACC_Sensor
+
+BO_ 351 Requirement_angle_FFP: 8 LDM
+
+BO_ 357 CLU_Status_VDA: 8 VDA
+
+BO_ 370 Acknowledgment_request_Kombination: 8 CCC
+
+BO_ 373 Display_motor_data: 8 DME
+
+BO_ 400 display_ACC: 8 LDM
+
+BO_ 405 Operation_push_button_MSA: 8 IHKA
+
+BO_ 419 Raw_data_longitudinal_acceleration: 8 DSC
+
+BO_ 423 actuation_request_EMF: 8 DSC
+
+BO_ 426 Effect_ErgoCommander: 8 CCC
+
+BO_ 428 Status_ARS_module: 8 ARS
+
+BO_ 440 Operation_ErgoCommander: 8 ZBE
+
+BO_ 450 Distance_message_PDC: 8 PDC
+
+BO_ 451 Distance_message_2_PDC: 8 PDC
+
+BO_ 454 Acoustic_message_PDC: 8 PDC
+
+BO_ 472 Operation_air_conditioning_air_distribution_FA: 8 CCC
+
+BO_ 473 Operation_pushbutton_MDrive: 8 SZL
+
+BO_ 474 Climate_control_remote_control: 8 CAS
+
+BO_ 476 Operation_stratification_seat_heating: 8 CCC
+
+BO_ 478 Air_conditioning_controls_rear: 8 CCC
+
+BO_ 480 Operation_air_conditioning_air_distribution_BF: 8 CCC
+
+BO_ 482 Operation_air_conditioning_front: 8 CCC
+
+BO_ 483 Operation_pushbutton_interior_lighting: 8 FZD
+
+BO_ 487 Operation_seat_heating_seat_climate_FA: 8 IHKA
+
+BO_ 488 Operation_seat_heating_seat_climate_BF: 8 IHKA
+
+BO_ 490 Steering_column_adjustment_control: 8 IHKA
+
+BO_ 491 Operation_active_seat_FA: 8 IHKA
+
+BO_ 492 Operation_active_seat_BF: 8 IHKA
+
+BO_ 494 Steering_column_switch_operation: 8 FRMFA
+
+BO_ 499 Operation_seat_memory_FA: 8 XXX
+
+BO_ 504 Operation_SHD_MDS: 8 FZD
+
+BO_ 507 Status_EPS: 8 EPS
+
+BO_ 508 Status_AFS: 8 AFS
+
+BO_ 509 Status_request_EMF_KCAN: 8 EMF
+
+BO_ 510 Crash: 8 ACSM
+
+BO_ 513 Status_EMF_KCAN: 8 EMF
+
+BO_ 517 Acoustic_request_Kombi: 8 Kombi
+
+BO_ 518 Control_Display_Shiftlights: 8 DME
+
+BO_ 523 Memory_adjustment: 8 SM_FA
+
+BO_ 524 Steering_column_control: 8 SM_FA
+
+BO_ 525 Position_steering_column: 8 IHKA
+
+BO_ 528 Operation_HUD: 8 CCC
+
+BO_ 529 Status_HUD: 8 HUD
+
+BO_ 530 Height_levels_air_spring: 8 EHC
+
+BO_ 540 Operation_NightVision: 8 CCC
+
+BO_ 542 Status_NightVision: 8 NVC
+
+BO_ 548 Operation_push_button_NSW: 8 FRMFA
+
+BO_ 552 Operation_special_function: 8 CCC
+
+BO_ 554 Status_BFS: 8 JBBF
+
+BO_ 556 Operation_push_button_NSL: 8 FRMFA
+
+BO_ 558 Status_BFSH: 8 XXX
+
+BO_ 562 Status_FAS: 8 JBBF
+
+BO_ 566 Status_FASH: 8 XXX
+
+BO_ 570 Status_radio_key: 8 CAS
+
+BO_ 571 Status_climate_front_extended: 8 IHKA
+
+BO_ 573 Request_display_climate: 8 IHKA
+
+BO_ 574 Status_Klima_Fond: 8 FKA
+
+BO_ 582 Status_air_conditioning_front_control_unit: 8 IHKA
+
+BO_ 584 Status_rear_view_camera: 8 RFK
+
+BO_ 585 Control_rear_view_camera: 8 CCC
+
+BO_ 586 Status_PDC: 8 PDC
+
+BO_ 587 Status_door_sensors: 8 FRMFA
+
+BO_ 594 Wiper_status: 8 JBBF
+
+BO_ 598 Challenge_Passive_Access: 8 CAS
+
+BO_ 600 Status_Transmission_Passive_Access: 8 PGS
+
+BO_ 604 Operation_of_climate_additional_programs: 8 CCC
+
+BO_ 621 Operation_blinds_MK: 8 IHKA
+
+BO_ 622 Control_FH_SHD_central_comfort: 8 CAS
+
+BO_ 635 Status_Shiftlights: 8 Kombi
+
+BO_ 637 Status_convertible_top_manual_convertible: 8 CAS
+
+BO_ 638 Status_convertible_top_convertible: 8 CTM
+
+BO_ 639 Status_central_locking_convertible_top: 8 JBBF
+
+BO_ 642 Control_security_vehicle_2: 8 XXX
+
+BO_ 644 Control_remote_start_safety_vehicle: 8 CAS
+
+BO_ 646 Electrochromic_control: 8 FZD
+
+BO_ 652 Pushbutton_vertical_dynamics: 8 GWS
+
+BO_ 653 Operation_pushbutton_sport: 8 GWS
+
+BO_ 656 Control_response_hydrogen_vehicle: 8 XXX
+
+BO_ 658 Control_high_beam_assistant: 8 FLA
+
+BO_ 670 Central_locking_control_for_security_vehicle: 8 XXX
+
+BO_ 671 Remote_control_FondCommander: 8 CAS
+
+BO_ 672 Central_locking_control: 8 CAS
+
+BO_ 674 Operation_of_climate_stand_functions: 8 CCC
+
+BO_ 676 Operation_personalization: 8 Kombi
+
+BO_ 692 DWA_Alarm: 8 DWA
+
+BO_ 694 Control_horn_DWA: 8 DWA
+
+BO_ 696 Operation_onboard_computer: 8 CCC
+
+BO_ 697 Operation_RSE: 8 CCC
+
+BO_ 698 Stopwatch: 8 Kombi
+
+BO_ 701 Request_switching_display: 8 CCC
+
+BO_ 702 Switch_status_display: 8 VSW
+
+BO_ 703 Water_valve_control: 8 IHKA
+
+BO_ 706 Temperatur_Ist_Fond: 8 FKA
+
+BO_ 711 Display_Kombination_extended: 8 DME
+
+BO_ 714 Outside_temperature: 8 Kombi
+
+BO_ 716 Control_monitor_rear: 8 RSE
+
+BO_ 718 Control_monitor: 8 CCC
+
+BO_ 719 Status_of_auxiliary_water_pump: 8 JBBF
+
+BO_ 720 Status_Sensor_AUC: 8 JBBF
+
+BO_ 721 Status_fitting_window_V: 8 FZD
+
+BO_ 722 Status_pressure_refrigeration_circuit: 8 JBBF
+
+BO_ 723 Status_stratification_rear: 8 JBBF
+
+BO_ 725 Status_heating_rear_window: 8 JBBF
+
+BO_ 726 Status_valve_air_conditioning_compressor: 8 JBBF
+
+BO_ 730 Status_tailgate_lift: 8 HKL
+
+BO_ 734 Switch_control_display: 8 VSW
+
+BO_ 738 Status_setting_video_night_vision: 8 NVC
+
+BO_ 739 Status_setting_video_rear_view_camera: 8 RFK
+
+BO_ 740 Status_trailer: 8 AHM
+
+BO_ 742 Status_of_air_distribution_FA: 8 IHKA
+
+BO_ 746 Status_air_distribution_BF: 8 IHKA
+
+BO_ 750 Status_climate_additional_programs: 8 IHKA
+
+BO_ 752 Status_air_condition_functions: 8 IHKA
+
+BO_ 753 Status_driver_detection: 8 MRSZ
+
+BO_ 755 Display_switching_instruction: 8 DME
+
+BO_ 756 Air_conditioning_control_SH_ZH_auxiliary_water_pump: 8 IHKA
+
+BO_ 759 Units: 8 Kombi
+
+BO_ 768 Status_RSE: 8 RSE
+
+BO_ 772 Status_Gang: 8 EGS
+
+BO_ 773 Operation_button_convertible_top: 8 IHKA
+
+BO_ 774 Vehicle_tilt: 8 FRMFA
+
+BO_ 775 Operation_button_flap_convertible_top: 8 IHKA
+
+BO_ 776 Status_MSA: 8 DME
+
+BO_ 785 Refill_quantity: 8 Kombi
+
+BO_ 786 Service_Call_Teleservice: 8 Kombi
+
+BO_ 787 Status_Service_Call_Teleservice: 8 CCC
+
+BO_ 788 Status_driving_light: 8 FZD
+
+BO_ 789 Vehicle_mode: 8 JBBF
+
+BO_ 791 Operation_button_parking_aids: 8 IHKA
+
+BO_ 792 Status_antennas_Passive_Access: 8 PGS
+
+BO_ 793 Operation_push_button_RDC: 8 JBBF
+
+BO_ 794 Operation_button_HDC: 8 IHKA
+
+BO_ 795 Operation_of_tailgate_interior_button: 8 IHKA
+
+BO_ 796 Status_tire_pressure: 8 RDC
+
+BO_ 801 Operation_button_camera_BF: 8 IHKA
+
+BO_ 802 Damper_current: 8 EDCK
+
+BO_ 806 Status_damper_program: 8 VDM
+
+BO_ 808 Relativzeit: 8 Kombi
+
+BO_ 813 Display_HDC: 8 DSC
+
+BO_ 814 Status_climate_internal_control_info: 8 IHKA
+
+BO_ 817 Programming_of_step_cruise_control: 8 CCC
+
+BO_ 818 Driver_display_speed_range: 8 DME
+
+BO_ 822 Display_check_control_message_role: 8 Kombi
+
+BO_ 824 Control_display_check_control_message: 8 Kombi
+
+BO_ 825 Status_display_climate: 8 CCC
+
+BO_ 826 Status_Monitor_Front: 8 CID
+
+BO_ 828 Status_Monitor_Fond_1: 8 CID
+
+BO_ 830 Status_Monitor_Fond_2: 8 CID
+
+BO_ 841 Raw_data_level_tank: 8 JBBF
+
+BO_ 843 Seat_back_lock_status_FA: 8 SM_FA
+
+BO_ 845 Status_seat_back_lock_BF: 8 SM_BF
+
+BO_ 847 Status_contact_handbrake: 8 JBBF
+ SG_ Handbrake_push : 0|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 858 Appointment_Condition_Based_Service: 8 CCC
+
+BO_ 860 Status_onboard_computer: 8 Kombi
+
+BO_ 862 Onboard_computer_data_trip_data: 8 Kombi
+
+BO_ 864 Data_onboard_computer_start_of_journey: 8 Kombi
+
+BO_ 866 Data_onboard_computer_average_values: 8 Kombi
+
+BO_ 868 Data_onboard_computer_arrival: 8 Kombi
+
+BO_ 869 Status_terminal_request: 8 CAS
+
+BO_ 870 Display_Kombination_external_display: 8 Kombi
+
+BO_ 871 Control_display_of_demand_oriented_service: 8 Kombi
+
+BO_ 877 Setting_the_driving_dynamics_switch: 8 JBBF
+
+BO_ 886 Status_wear_lamella: 8 VGSG
+
+BO_ 893 Status_DKG: 8 DKG
+
+BO_ 894 Temperatur_Bremse: 8 DSC
+
+BO_ 895 Range_of_diesel_exhaust_gas_additive: 8 DDE1
+
+BO_ 896 chassis_number: 8 CAS
+
+BO_ 898 Electronic_engine_oil_dipstick_M: 8 DME
+
+BO_ 899 Motor_data_2: 8 DME
+
+BO_ 904 Vehicle_type: 8 CAS
+
+BO_ 907 Status_battery: 8 DME
+
+BO_ 910 Start_speed: 8 DME
+
+BO_ 914 Status_System_AFS: 8 AFS
+
+BO_ 916 RDA_request_data_storage: 8 Kombi
+
+BO_ 917 Coding_power_management: 8 CAS
+
+BO_ 920 Operation_chassis: 8 CCC
+
+BO_ 921 Status_MDrive: 6 DME
+
+BO_ 926 Operation_time_date: 8 CCC
+
+BO_ 928 Vehicle_state: 8 JBBF
+
+BO_ 931 Request_Remote_Services: 8 CCC
+
+BO_ 937 Status_motor_control_CKM: 8 DME
+
+BO_ 939 Status_Shiftlights_CKM: 8 Kombi
+
+BO_ 944 Status_gear_reverse: 8 FRMFA
+
+BO_ 949 Status_water_valve: 8 JBBF
+
+BO_ 950 Position_window_lifter_FAT: 8 FRMFA
+
+BO_ 951 Position_window_lifter_FATH: 8 JBBF
+
+BO_ 952 Position_window_regulator_BFT: 8 FRMFA
+
+BO_ 953 Position_window_regulator_BFTH: 8 JBBF
+
+BO_ 954 Position_SHD: 8 FZD
+
+BO_ 956 Position_window_lifter_security_vehicle: 8 XXX
+
+BO_ 957 Status_consumer_shutdown: 8 FRMFA
+
+BO_ 959 Position_window_rear_window: 8 CTM
+
+BO_ 960 Configuration_FAS: 8 SM_FA
+
+BO_ 961 Configuration_BFS: 8 SM_BF
+
+BO_ 964 Status_EDCK_CKM: 8 JBBF
+
+BO_ 967 Access_radio: 8 RAD1
+
+BO_ 968 Operation_push_button_radio: 8 RAD1
+
+BO_ 974 Radio_audio_control_interface_display: 8 ACI
+
+BO_ 975 Acknowledgment_access_radio_audio_control_interface: 8 ACI
+
+BO_ 979 Status_solar_sensor: 8 FZD
+
+BO_ 980 Configuration_of_central_locking_CKM: 8 Kombi
+
+BO_ 981 Status_central_locking_CKM: 8 CAS
+
+BO_ 982 Configuration_DWA_CKM: 8 Kombi
+
+BO_ 983 Status_DWA_CKM: 8 FZD
+
+BO_ 984 Configuration_RLS_CKM: 8 Kombi
+
+BO_ 985 Status_RLS_CKM: 8 FZD
+
+BO_ 986 Configuration_of_memory_positions_CKM: 8 Kombi
+
+BO_ 987 Status_memory_positions_CKM: 8 SM_FA
+
+BO_ 988 Configuration_light_CKM: 8 Kombi
+
+BO_ 989 Status_light_CKM: 8 FRMFA
+
+BO_ 990 Configuration_Climate_CKM: 8 CCC
+
+BO_ 991 Status_Klima_CKM: 8 IHKA
+
+BO_ 994 Configuration_of_tailgate_CKM: 8 CCC
+
+BO_ 995 Status_tailgate_CKM: 8 HKL
+
+BO_ 996 Configuration_rear_view_camera_CKM: 8 CCC
+
+
+
+
+CM_ SG_ 170 ThrottlelPressed "Active when accelerator pedal pressed or cruise control: drives";
+CM_ SG_ 170 AcceleratorPedalPressed "Active only when driver actually presses the pedal";
+CM_ SG_ 170 AcceleratorPedalPercentage "ToDo Factor to be adjusted";
+CM_ SG_ 404 plus1mph_request "Appears when +1mph/kph stalk is depressed";
+CM_ SG_ 404 minus1mph_request "Appears when -1mph/kph stalk is depressed";
+CM_ SG_ 404 Cancel_request_up_stalk "Appears when cancel stalk (up) is depressed";
+CM_ SG_ 404 Cancel_request_up_or_down_stalk "Appears when cancel stalk (up or down) is depressed";
+CM_ SG_ 404 Resume_request "It appears when resume stalk button is depressed";
+CM_ SG_ 404 Counter_404 "Message is sent at higher rate when cruise stalk is pressed";
+
+CM_ SG_ 168 BrakePressed "Brake when driver presses the brake or hill hold";
+CM_ SG_ 168 EngineTorque "Engine torque without inertia - combustion torque";
+CM_ SG_ 168 EngineTorqueWoInterv "Engine torque without inertia and without shift intervention";
+CM_ SG_ 168 ALIV_TORQ_1_DME "Counter TORQ_1";
+
+CM_ SG_ 169 ALIV_TORQ_2_DME "Counter TORQ_2";
+
+CM_ SG_ 182 TORQ_TAR_DSC "torque target DSC";
+
+CM_ SG_ 403 CruiseControlSetpointSpeed "Speed target - unit depends on locale";
+CM_ SG_ 186 GearTar "Values corresponds to forward gears. TBD Add enums for park, reverse";
+CM_ SG_ 466 GearAct "TransmissionDataDisplay";
+CM_ SG_ 414 DSC_full_off "0x4 enabling, 0xA enabled. TBD";
+
+CM_ SG_ 416 YawRate "Lateral Acceleration";
+
+CM_ SG_ 408 ParkButtonSecond "Redundant buton. 0x1 = pressed;";
+CM_ SG_ 408 SideButton "0x1 = pressed;";
+CM_ SG_ 408 SportButtonPressed "0x1 = pressed;";
+CM_ SG_ 408 M3_button "M3 POWER (?)";
+CM_ SG_ 408 SideButtonXOR11 "Complement value";
+CM_ SG_ 408 param1 "can not be 0x03. Always 0 in 135i.";
+CM_ SG_ 408 param5 "Always 0 in 135i.";
+CM_ SG_ 408 ParkButtonFirst "0x1 = pressed";
+CM_ SG_ 408 ShifterPosition "0001 = N|R, 0010 = R, 0011 = N|D, 0100 = D, 0101 = -1, 0110 = +1, 0111 = ManualMode, 1000 = inBetween,";
+
+CM_ SG_ 466 ShiftLeverMode "On the dashboard, there are displayed: D1...D7 in Normal. S1...S6 in Sport. M1..M7 in Manual";
+
+CM_ SG_ 502 TurnSignalIdle "Turn signal off";
+CM_ SG_ 502 TurnSignalActive "Turn signal on or transitioning";
+CM_ SG_ 502 RightTurn "Indicates right blinker or when steering returning right clears left blinker";
+CM_ SG_ 502 LeftTurn "Indicates left blinker or when steering returning left clears right blinker";
+CM_ SG_ 502 HoldActivated "Spikes down if blinker cleared with timeout or turn. Stays off if blinker cleared with stalk";
+
+CM_ SG_ 790 setMe_0x3FFF "All ones";
+CM_ SG_ 790 DTC_pressed "Traction control off. Message transmitted when pressed. Few presses may be required followed by off.";
+
+VAL_ 408 ShifterPosition 1 "D" 2 "S" 3 "N" 4 "R" 5 "P" ;
+
+VAL_ 464 ST_SW_WAUP 3 "signal invalid" 2 "EGS forced switching active" 1 "engine warm" 0 "warming up" ;
+VAL_ 464 ST_ENG_RUN 3 "signal invalid" 2 "engine running" 1 "engine starting" 0 "engine off" ;
+VAL_ 464 CTR_SLCK 3 "signal invalid" 2 "requirement Shiftlock" 1 "no requirement Shiftlock" 0 "not allowed" ;
+
+VAL_ 466 ShiftLeverMode 0 "Normal" 1 "Sport" 2 "Manual" ;
+VAL_ 466 ShiftLeverPosition 0 "Off" 1 "P" 2 "R" 4 "N" 8 "D" ;
diff --git a/iqdbc_repo/iqdbc/dbc/cadillac_ct6_chassis.dbc b/iqdbc_repo/iqdbc/dbc/cadillac_ct6_chassis.dbc
new file mode 100644
index 000000000..9de969d76
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/cadillac_ct6_chassis.dbc
@@ -0,0 +1,95 @@
+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_: K182_PACM K43_PSCM K17_EBCM NEO K124_ASCM
+
+
+
+BO_ 823 PACMParkAssitCmd: 7 NEO
+ SG_ RollingCounter : 35|2@0+ (1,0) [0|0] "" NEO
+ SG_ SteeringWheelChecksum : 47|16@0+ (1,0) [0|0] "" NEO
+ SG_ SteeringWheelCmd : 23|16@0+ (1,0) [0|0] "" NEO
+
+BO_ 560 EBCMRegen: 6 K17_EBCM
+ SG_ Regen : 1|10@0+ (1,0) [0|0] "" NEO
+
+BO_ 338 ASCMLKASteeringCmd: 6 NEO
+ SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO
+ SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO
+ SG_ LKASMode : 36|2@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO
+
+BO_ 340 ASCMBLKASteeringCmd: 6 NEO
+ SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO
+ SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO
+ SG_ LKASteeringCmdActive2 : 35|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO
+
+BO_ 368 EBCMFrictionBrakeStatus: 8 K17_EBCM
+ SG_ FrictionBrakePressure : 23|16@0+ (1,0) [0|0] "" NEO
+
+BO_ 789 EBCMFrictionBrakeCmd: 5 K17_EBCM
+ SG_ RollingCounter : 37|6@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO
+
+BO_TX_BU_ 823 : K43_PSCM,NEO;
+BO_TX_BU_ 789 : NEO,K17_EBCM;
+
+
+CM_ BU_ K182_PACM "Parking Assist Control Module";
+CM_ BU_ K43_PSCM "Power Steering Control Module";
+CM_ BU_ K17_EBCM "Electronic Brake Control Module";
+CM_ BU_ NEO "Comma NEO";
+CM_ BU_ K124_ASCM "Active Safety Control Module";
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "UseGMParameterIDs" 0;
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+
+VAL_ 338 LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 338 LKASMode 2 "supercruise" 1 "lkas" 0 "Inactive" ;
diff --git a/iqdbc_repo/iqdbc/dbc/cadillac_ct6_object.dbc b/iqdbc_repo/iqdbc/dbc/cadillac_ct6_object.dbc
new file mode 100644
index 000000000..3f7cf64cd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/cadillac_ct6_object.dbc
@@ -0,0 +1,3470 @@
+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_: RRSRR_FO LRSRR_FO CIPM_FO _DOFIMU2_FO _DOFIMU1_FO DMS_FO AMM_FO EOCM2B_IMX6_FO EOCM2B_K2_FO EOCM2B_K1_FO EOCM2A_IMX6_FO EOCM2A_K2_FO EOCM2A_K1_FO NVS_FO Dummy_FO TestTool_FO LRR_FO RFSRR_FO LFSRR_FO RSRR_FO VIS_FO EOCM_F_FO VIS2_FO
+VAL_TABLE_ vt_BooleanValues 1 "true" 0 "false" ;
+VAL_TABLE_ FrntVsnInPthVehBrkNwSt 10 "Active" 5 "Inactive" ;
+VAL_TABLE_ FrntVsnClostPedBrkNwSt 10 "Active" 5 "Inactive" ;
+VAL_TABLE_ DrvrMonSysEngSt 7 "Unused and Reserved 1" 6 "Recovering" 5 "Tracking" 4 "Searching" 3 "Video test port only" 2 "Idle" 1 "Invalid state" 0 "Does not exist or DME" ;
+VAL_TABLE_ DrvrMonEngUnrecvrFltCod 7 "Unused and Reserved 3" 6 "Unused and Reserved 2" 5 "Unused and Reserved 1" 4 "Vehicle power supply Errors" 3 "Problem with LED illuminators" 2 "Vehicle input signals Errors" 1 "Problem with imager" 0 "Ok" ;
+VAL_TABLE_ DrvrMonEngRecvrFltCod 3 "Engine is unable to find a face" 2 "Input Images too dark" 1 "Input images too bright" 0 "Ok" ;
+VAL_TABLE_ DrvrMntrSysVTP 1 "Video test port active" 0 "Video test port inactive" ;
+VAL_TABLE_ DrvrAttnStatCnfdc 3 "High" 2 "Medium" 1 "Low" 0 "Lowest" ;
+VAL_TABLE_ DrvrAttnStat 7 "Invalid" 6 "Driver is exhibiting sleep" 5 "Driver is exhibiting microsleep" 4 "Attention is Center Console" 3 "Attention is Drivers Lap" 2 "Attention is Off Road" 1 "Attention is On Road" 0 "Unknown" ;
+VAL_TABLE_ PPSMd 7 "GNSS and RTX and DR and MM" 6 "DR ONLY" 5 "GNSS and RTX and DR" 4 "GNSS and SBAS and DR" 3 "GNSS and DR" 2 "GNSS and RTX" 1 "GNSS and SBAS" 0 "GNSS Standalone" ;
+VAL_TABLE_ AdvDrvAstMpPrfShrtAcur 3 "Accuracy Is Unknown" 2 "Lowest Accuracy" 1 "Medium Accuracy" 0 "Highest Accuracy" ;
+VAL_TABLE_ AdvDrAstMpStbRtOfWay 3 "Not Applicable" 2 "Unknown" 1 "Sub Path Has Right Of Way Over Path" 0 "Path Has Right Of Way Over Sub Path" ;
+VAL_TABLE_ AdvDrAstMpStbPrtCalRut 3 "Not Applicable" 2 "Unknown" 1 "Path From This Point On Is Part Of Calculated Route" 0 "Path From This Point On Is Not Part Of Calculated Route" ;
+VAL_TABLE_ AdvDrAstMpStbMsgTyp 7 "Unused and Reserved 2" 6 "Metadata" 5 "Profile Long" 4 "Profile Short" 3 "Stub" 2 "Segment" 1 "Position" 0 "Unused and Reserved 1" ;
+VAL_TABLE_ AdvDrAstMpStbFmOfWay 15 "Not Applicable" 14 "Pedestrian Zone" 13 "Entrance To Or Exit To Service" 12 "Entrance To Or Exit Of A Car Park" 11 "Service Road Or Frontage Road" 10 "Slip Road per Ramp" 9 "Slip Road per Ramp On A Freeway Or Controlled Access Road" 8 "Parallel Road" 7 "Unused and Reserved 2" 6 "Unused and Reserved 1" 5 "Traffic Square per Special Traffic Figure" 4 "Roundabout Circle" 3 "Single Carriageway" 2 "Multiple Carriageway Or Multiply Digitized Road" 1 "Freeway Or Controlled Access Road That Is Not A Slip Road Or Ramp" 0 "Unknown" ;
+VAL_TABLE_ AdvDrAstMpStbCmplxInsct 3 "Not Applicable" 2 "Unknown" 1 "Stub Is Part Of Complex Intersection" 0 "Stub Is Not Part Of Complex Intersection" ;
+VAL_TABLE_ AdvDrAstMpSegTunl 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Tunnel" 0 "Segment Is Not A Part Of Tunnel" ;
+VAL_TABLE_ AdvDrAstMpSegPrtCalRut 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Calculated Route" 0 "Segment Is Not Part Of Calculated Route" ;
+VAL_TABLE_ AdvDrAstMpSegMsgTyp 7 "Unused and Reserved 2" 6 "Metadata" 5 "Profile Long" 4 "Profile Short" 3 "Stub" 2 "Segment" 1 "Position" 0 "Unused and Reserved 1" ;
+VAL_TABLE_ AdvDrAstMpSegFrmOfWay 15 "Not Applicable" 14 "Pedestrian Zone" 13 "Entrance To Or Exit To Service" 12 "Entrance To Or Exit Of A Car Park" 11 "Service Road Or Frontage Road" 10 "Slip Road per Ramp" 9 "Slip Road per Ramp On A Freeway Or Controlled Access Road" 8 "Parallel Road" 7 "Unused and Reserved 2" 6 "Unused and Reserved 1" 5 "Traffic Square per Special Traffic Figure" 4 "Roundabout Circle" 3 "Single Carriageway" 2 "Multiple Carriageway Or Multiply Digitized Road" 1 "Freeway Or Controlled Access Road That Is Not A Slip Road or Ramp" 0 "Unknown" ;
+VAL_TABLE_ AdvDrAstMpSegEffSdLmtTp 7 "Not Applicable" 6 "Explicit Snow" 5 "Explicit Rain" 4 "Explicit Time Of Day" 3 "Explicit By Day" 2 "Explicit By Night" 1 "Explicit On Traffic Sign" 0 "Implicit" ;
+VAL_TABLE_ AdvDrAstMpSegDivdRd 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Divided Road" 0 "Segment Is Not Part Of Divided Road" ;
+VAL_TABLE_ AdvDrAstMpSegCmplxInsct 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Complex Intersection" 0 "Segment Is Not Part Of Complex Intersection" ;
+VAL_TABLE_ AdvDrAstMpSegBrdg 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Bridge" 0 "Segment Not Part Of Bridge" ;
+VAL_TABLE_ AdvDrAstMpSegBldUpAra 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Built Up Area" 0 "Segment Is Not Part Of Built Up Area" ;
+VAL_TABLE_ AdvDrAstMpMtdtSpdUnt 1 "Miles Per Hour" 0 "Kilometers Per Hour" ;
+VAL_TABLE_ AdvDrAstMpMtdtDrvSd 1 "Driving Side Right" 0 "Driving Side Left" ;
+VAL_TABLE_ WSMR_WiFiAssnReq 3 "Unexpected Undefined Connection Behavior" 2 "Wi Fi association failed with available credentials" 1 "Failed to receive Wi Fi credentials after 255 attempts" 0 "SSID and Passphrase Request" ;
+VAL_TABLE_ StrgColCommsFlt 2 "Disabled Communications DTC" 1 "No Communications Fault" 0 "Communications Fault" ;
+VAL_TABLE_ CPMAPINFO4 1 "Hardware Or Software Error" 0 "No Hardware Or Software Error" ;
+VAL_TABLE_ AdvDrvAstMpPrfShrt2Acur 3 "Accuracy Is Unknown" 2 "Lowest Accuracy" 1 "Medium Accuracy" 0 "Highest Accuracy" ;
+VAL_TABLE_ InterLghtStat 1 "Interior Lights On" 0 "Interior Light Off" ;
+VAL_TABLE_ VehLnStatConf 2 "High Confidence" 1 "Low Confidence" 0 "No Confidence" 3 "Very High Confidence" ;
+VAL_TABLE_ VehLnStat 3 "Lane Change To Right" 2 "Lane Change To Left" 1 "Staying in Lane" 0 "Unknown" ;
+VAL_TABLE_ HrznPrvdRstRq 1 "Reset Not Required" 0 "Reset Required" ;
+VAL_TABLE_ ExptNxtTrnstnDirConf 3 "Very High Confidence" 2 "High Confidence" 1 "Low Confidence" 0 "No Confidence" ;
+VAL_TABLE_ ExptNxtTrnstnDir 7 "Reserved4" 6 "Reserved3" 5 "Reserved2" 4 "Reserved1" 3 "Traversing Middle Transition" 2 "Traversing Next Transition Right" 1 "Traversing Next Transition Left" 0 "Unknown" ;
+VAL_TABLE_ ADASISMsgTypRetrans 7 "GM System Specific" 6 "Meta Data" 5 "Profile Long" 4 "Profile Short" 3 "Stub" 2 "Segment" 1 "Position" 0 "Checksum" ;
+VAL_TABLE_ NVSysStat 7 "Needs Headlights" 6 "Temporarily Unavailable" 5 "Not Dark" 4 "Needs Service" 3 "Active" 2 "Inactive" 1 "Initializing" 0 "Unknown" ;
+VAL_TABLE_ NVSysPedWrnIndReq 3 "Unused & Reserved" 2 "Pedestrian Alert" 1 "Pedestrian Detected" 0 "None" ;
+VAL_TABLE_ NVSysPedDetCstReq 2 "On" 1 "Off" 0 "No Value" ;
+VAL_TABLE_ NVSysPedDetCsCrStVal 2 "On" 1 "Off" 0 "No Value" ;
+VAL_TABLE_ FwVsnCinCoutPotT9Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT8Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT7Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT6Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT5Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT4Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT3Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT2Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT1Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT12Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT11Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT10Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ GFHBObjDirTrk8 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk7 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk6 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk5 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk4 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk3 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk2 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBObjDirTrk1 1 "Ahead Traffic" 0 "Incoming Traffic" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk8 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk7 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk6 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk5 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk4 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk3 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk2 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnRelLaneTrk1 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk8 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk7 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk6 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk5 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk4 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk3 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk2 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnMesStatTrk1 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk8 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk7 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk6 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk5 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk4 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk3 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk2 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ;
+VAL_TABLE_ GFHBFwVsnCnfdncTrk1 0 "Invalid" 3 "Confident" 2 "Speculative" 1 "Highly Speculative" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev8 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev7 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev6 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev5 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev4 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev3 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev2 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ;
+VAL_TABLE_ GFHBFVsnObjTypTrkRev1 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car" 0 "Unknown" ;
+VAL_TABLE_ CRL_Cnfdnc 7 "Reserved4" 6 "Reserved3" 5 "Reserved2" 4 "Reserved1" 3 "Best" 2 "Marking Present" 1 "Weak Marking" 0 "No Lane" ;
+VAL_TABLE_ CLL_Cnfdnc 7 "Reserved4" 6 "Reserved3" 5 "Reserved2" 4 "Reserved1" 3 "Best" 2 "Marking Present" 1 "Weak Marking" 0 "No Lane" ;
+VAL_TABLE_ VBBrkCtrlSt 4 "Release Control" 3 "Hold Vehicle" 2 "Apply Brake" 1 "Decrease Torque" 0 "No Action" ;
+VAL_TABLE_ ObstacleType 6 "NO_OBJECT" 5 "OBJ_GUARDRAIL" 4 "OBJ_TUNNEL " 3 "OBJ_TRAFFIC_SIGN" 2 "OBJ_VEHICLE" 1 "OBJ_BRIDGE " 0 "OBJ_UNKNOWN" ;
+VAL_TABLE_ VpathMode 2 "Mid Hi Speed" 1 "Low Speed" 0 "Disabled" ;
+VAL_TABLE_ LaneChngStatus 2 "Lane Change Right" 1 "Lane Change Left" 0 "Idle" ;
+VAL_TABLE_ TravelDirection 3 "Other (excessive side slip)" 2 "reverse / stopped in rvrs gear" 1 "Forward / stopped in frwd gear" 0 "Unknown" ;
+VAL_TABLE_ TrueOrFalse 1 "true" 0 "false" ;
+VAL_TABLE_ ModeCommand 5 "Sensing with Reduced Power" 4 "Undefined" 3 "Radio Silent" 2 "Sensing" 1 "Not Sensing" 0 "Undefined" ;
+VAL_TABLE_ LaneSnsLLnPosValid 1 "Invalid" 0 "Valid" ;
+VAL_TABLE_ LnSnsRLnPosValid 1 "Invalid" 0 "Valid" ;
+VAL_TABLE_ Elevation 3 "Low " 2 "mid (reserved)" 1 "high " 0 "Unknown" ;
+VAL_TABLE_ ModeCommandFdbk 5 "Sensing with reduced power" 4 "Undefined" 3 "Radio Silent" 2 "Sensing" 1 "Not Sensing" 0 "Undefined" ;
+VAL_TABLE_ relativeLane 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ;
+VAL_TABLE_ RoadTypeInfo 5 "Constiction Zone Exit" 4 "Construction Zone Entry" 3 "Highway" 2 "Secondary Road" 1 "City" 0 "Unknown" ;
+VAL_TABLE_ ObjectLossInfo 2 "elevation conditions" 1 "tight curve" 0 "not lost" ;
+VAL_TABLE_ MeasurementStatus 3 "Measured this cycle" 2 "Latent track not detctd this cyc" 1 "New Object" 0 "No Object" ;
+VAL_TABLE_ ObjectType 7 "no object present" 6 "fixed roadside object" 5 "fixed overhead object" 4 "pedestrian" 3 "motocycle / bicycle" 2 "Large vehicle (semi)" 1 "4 Wheel Vehicle (car, small trk)" 0 "Unknown" ;
+VAL_TABLE_ Confidence 3 "confident" 2 "speculative" 1 "highly speculative" 0 "invalid" ;
+VAL_TABLE_ DynamicProp 4 "Moving in opposite direction" 3 "Moving in same direction as host" 2 "Has moved but currently stopped" 1 "Has never moved" 0 "Unknown" ;
+VAL_TABLE_ DrvWndPosSt 6 "Fully Opened" 5 "Open More Than C" 4 "Position C" 3 "Position B" 2 "Position A" 1 "Open Less Than A" 0 "Fully Closed" ;
+VAL_TABLE_ VehMovSta 4 "Invalid" 3 "Reverse" 2 "Forward" 1 "Neutral" 0 "Parked" ;
+VAL_TABLE_ OtsdAmbtLtLvlStat 2 "Day" 1 "Night" 0 "Unknown" ;
+VAL_TABLE_ RtTrnLmpAtv 2 "On with telltale" 1 "On without telltale" 0 "Off" ;
+VAL_TABLE_ LftTrnLmpAtv 2 "On with telltale" 1 "On without telltale" 0 "Off" ;
+VAL_TABLE_ HdlmpBmSelectStat 2 "High Beams" 1 "Low Beams" 0 "Unknown" ;
+VAL_TABLE_ DTCI_DTCFaultType 3 "Type C" 2 "Type B" 1 "Type A" 0 "Not Supported" ;
+VAL_TABLE_ TrnsShftLvrPos 13 "Forward Range J" 12 "Forward Range I" 15 "Lever Position Unknown" 11 "Forward Range H" 10 "Forward Range G" 9 "Forward Range F" 8 "Forward Range E" 7 "Forward Range D" 6 "Forward Range C" 5 "Forward Range B" 4 "Forward Range A" 3 "Neutral Range" 2 "Reverse Range" 1 "Park Range" 0 "Between Ranges" ;
+VAL_TABLE_ SysPwrMd 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off" ;
+VAL_TABLE_ ValidityStates 1 "Invalid" 0 "Valid" ;
+
+
+BO_ 1548 ADAS_Profile_Short2_FO: 8 AMM_FO
+ SG_ AdvDrvAstMpPrfShrt2Val1 : 1|10@0+ (1,0) [0|1023] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2Val0 : 33|10@0+ (1,0) [0|1023] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2Updt : 39|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2RTrns : 3|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2Typ : 38|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2PthIdx : 23|6@0+ (1,0) [0|63] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2Ofst : 52|13@0+ (1,0) [0|8191] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2MsgTp : 55|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2Dist1 : 17|10@0+ (1,0) [0|1023] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2CycCnt : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2CtlPt : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpPrfShrt2Acur : 5|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 1547 ADAS_Profile_Long2_FO: 8 AMM_FO
+ SG_ AdvDrAstMpProfLng2Val : 39|32@0+ (1,0) [0|4294967295] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2Updt : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2RTrns : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2PrfTyp : 4|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2PthIdx : 13|6@0+ (1,0) [0|63] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2Ofst : 20|13@0+ (1,0) [0|8191] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2MgTyp : 23|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2CycCt : 15|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLng2CtrlPt : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 1630 USDT_Resp_From_EOCM2B_K2_FO: 8 EOCM2B_K2_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1374 UUDT_Resp_From_EOCM2B_K2_FO: 8 EOCM2B_K2_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 606 USDT_Req_to_EOCM2B_K2_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2B_K2_FO
+
+BO_ 328 Vehicle_Info_FO: 5 EOCM2A_K1_FO
+ SG_ StrWhAngGrd : 27|12@0- (1,0) [-2048|2047] "deg/sec" DMS_FO
+ SG_ TrnsShftLvrPos : 31|4@0+ (1,0) [0|15] "" DMS_FO
+ SG_ StrWhAng_148 : 15|16@0- (0.0625,0) [-2048|2047.9375] "deg" DMS_FO
+ SG_ TrnsShftLvrPosV : 3|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ StrWhAngV_148 : 4|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ StrWhAngMsk_148 : 5|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ StrWhAngGrdV : 6|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ StrWhAngGrdMsk : 7|1@0+ (1,0) [0|1] "" DMS_FO
+
+BO_ 1930 DTC_Triggered_78A_FO: 7 LRSRR_FO
+ SG_ DTCI_CodeSupported_78A : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_78A : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_78A : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_78A : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_78A : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_78A : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_78A : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_78A : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_78A : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_78A : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_78A : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_78A : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_78A : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_78A : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_78A : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_78A : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_78A : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_78A : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_78A : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_78A : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1624 USDT_Resp_From_LRSRR: 8 LRSRR_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1368 UUDT_Resp_From_LRSRR: 8 LRSRR_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 600 USDT_Req_to_LRSRR: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LRSRR_FO
+
+BO_ 613 PPS_QualMetrics_FO: 8 EOCM2A_K1_FO
+ SG_ PPSPstnDilPrcs : 47|10@0+ (0.1,0) [0|102.3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSMd : 53|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPS3DAbsPosErrEstmt : 9|10@0+ (0.1,0) [0|102.3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSAbsHdngErrEstmt : 0|7@0+ (0.5,0) [0|63.5] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSAbsVelErrEstmt : 30|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSPosQltyMtrcsChksm : 50|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPS2DAbsPosErrEstmt : 25|10@0+ (0.1,0) [0|102.3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSPosQltyMtcBrstID : 2|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPS2DAbsPosErrEstmtV : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPS3DAbsPosErrEstmtV : 4|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSAbsHdngErrEstmtV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSAbsVelErrEstmtV : 31|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSMdV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSPstnDilPrcsV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+
+BO_ 612 PPS_Time_FO: 8 EOCM2A_K1_FO
+ SG_ PPSTmdayV : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSCldrDayV : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSCldrDay : 8|9@0+ (1,0) [0|511] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSTmBrstID : 52|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSTmday : 31|27@0+ (1,0) [0|134217727] "ms" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSTmChksm : 50|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSCldrYrV : 1|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSCldrYr : 15|7@0+ (1,2014) [2014|2141] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+
+BO_ 611 PPS_SigAcqTime_FO: 6 EOCM2A_K1_FO
+ SG_ PPSSigAqTmBrstID : 38|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSSigAcqTmV : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSSigAcqTm : 7|32@0+ (1,0) [0|4294967295] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSSigAqTmChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+
+BO_ 610 PPS_PosLong_FO: 6 EOCM2A_K1_FO
+ SG_ PPSLongBrstID : 39|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSLong : 6|31@0- (1,0) [-1073741824|1073741823] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSLongV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSLongChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+
+BO_ 609 PPS_PosLat_FO: 6 EOCM2A_K1_FO
+ SG_ PPSLatV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSLatChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSLatBrstID : 36|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSLat : 5|30@0- (1,0) [-536870912|536870911] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+
+BO_ 1160 PassPhrase_3_AMM_FO: 8 EOCM2A_K1_FO
+ SG_ WiFiPssPhrsDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 1159 PassPhrase_2_AMM_FO: 8 EOCM2A_K1_FO
+ SG_ WiFiPssPhrsDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 1158 PassPhrase_1_AMM_FO: 8 EOCM2A_K1_FO
+ SG_ WiFiPssPhrsDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 1546 ADAS_Protection_FO: 4 AMM_FO
+ SG_ AdvDrAstMpPrfLng2Avbl : 11|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPosAvbl : 15|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpHwFlt : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtAvbl : 8|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpProtChksm : 23|16@0+ (1,0) [0|65535] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpProtRTrns : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpProtCycCtMsg : 2|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbAvbl : 9|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpSegAvbl : 10|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfShrtAvbl : 14|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfShrt2Avbl : 13|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrAstMpPrfLngAvbl : 12|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ AdvDrvAstMpInpSigFld : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 1545 ADAS_Metadata_FO: 8 AMM_FO
+ SG_ AdvDrAstMpMtdtVerYrQtr : 60|2@0+ (1,1) [1|4] "Qtr" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtVerYr : 53|6@0+ (1,2000) [2000|2063] "Year" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtSpdUnt : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtPrvdr : 7|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtMsgTyp : 58|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtMnrPrtVr : 23|4@0+ (1,0) [0|15] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtCycCnt : 18|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtRgnCd : 38|15@0+ (1,0) [0|32767] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtHwVer : 16|9@0+ (1,0) [0|511] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtMnrPrtSbVr : 4|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtMjrPrtVr : 55|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtDrvSd : 19|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpMtdtCntryCd : 1|10@0+ (1,0) [0|1023] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 1543 ADAS_Profile_Long_FO: 8 AMM_FO
+ SG_ AdvDrAstMpPrfLngUpdt : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngRTrns : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngCtlPt : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngTyp : 4|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngCycCt : 15|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngPthIdx : 13|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngMsgTp : 23|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngOfst : 20|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPrfLngVal : 39|32@0+ (1,0) [0|4294967295] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 1544 ADAS_Profile_Short_FO: 8 AMM_FO
+ SG_ AdvDrvAstMpPrfShrtVal1 : 1|10@0+ (1,0) [0|1023] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtVal0 : 33|10@0+ (1,0) [0|1023] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtDist1 : 17|10@0+ (1,0) [0|1023] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtCycCnt : 7|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtAcur : 5|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtCtlPt : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtRetr : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtTyp : 38|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtUpdt : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtPthIdx : 23|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtMsgTp : 55|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrvAstMpPrfShrtOfst : 52|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 1542 ADAS_Stub_FO: 8 AMM_FO
+ SG_ AdvDrAstMpStbSubPthIdx : 63|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbUpdt : 55|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbPrtCalRut : 57|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbNmLnDrvDir : 54|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbCycCnt : 51|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbCmplxInsct : 49|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbTrnAngl : 47|8@0+ (1.417,0) [0|361.335] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbRtOfWay : 38|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbRelProb : 36|5@0+ (3.333,0) [0|103.323] "%" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbRetr : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbNmLnOppDir : 31|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbPathIdx : 29|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbLstStbOfst : 23|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbMsgTyp : 22|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbFmOfWay : 19|4@0+ (1,0) [0|15] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbFuncRdCls : 7|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpStbOfst : 4|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 1541 ADAS_Segment_FO: 8 AMM_FO
+ SG_ AdvDrAstMpSegRelProb : 12|5@0+ (3.333,0) [0|103.323] "%" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegUpdt : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegTunl : 25|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegCycCnt : 39|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegCmplxInsct : 37|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegBldUpAra : 43|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegBrdg : 41|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegRTrns : 1|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegDivdRd : 31|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegPthIdx : 7|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegPrtCalRut : 27|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegNmLnOppDir : 29|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegNmLnDrvDir : 55|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegMsgTyp : 46|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegFunRdCls : 23|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegFrmOfWay : 35|4@0+ (1,0) [0|15] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegEffSpdLmt : 20|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegEffSdLmtTp : 15|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpSegOffset : 52|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 608 PPS_ElevHdSpd_FO: 8 EOCM2A_K1_FO
+ SG_ PPSVel : 31|8@0+ (1,0) [0|255] "km / h" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSVelV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSElvHedngSpdBrstID : 5|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSElvHdengSpdChksm : 50|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSHedngV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSHedng : 2|19@0+ (0.001,0) [0|524.287] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSElvtnV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+ SG_ PPSElvtn : 39|21@0+ (1,-100000) [-100000|1997151] "cm" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO
+
+BO_ 1168 WiFi_Station_AMM_FO: 5 AMM_FO
+ SG_ WSMR_WiFiStnMpMACAddr : 15|32@0+ (1,0) [0|4294967295] "" EOCM2B_K1_FO,EOCM2A_K1_FO
+ SG_ WSMR_WiFiAssnReq : 1|2@0+ (1,0) [0|3] "" EOCM2B_K1_FO,EOCM2A_K1_FO
+
+BO_ 1161 WiFi_AP_Data_AMM_FO: 2 EOCM2A_K1_FO
+ SG_ WAPDM_SecurityType : 15|4@0+ (1,0) [0|15] "" EOCM2B_K1_FO,AMM_FO
+ SG_ WAPDM_WiFiEnStat : 0|1@0+ (1,0) [0|1] "" EOCM2B_K1_FO,AMM_FO
+ SG_ WAPDM_EncrptnType : 11|4@0+ (1,0) [0|15] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 1157 SSID_AMM_3_FO: 8 EOCM2A_K1_FO
+ SG_ WiFiSSIDDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 326 DMS_Eye_AOI_Info_FO: 6 DMS_FO
+ SG_ DrvrMontSysInit : 1|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMontSysAvlbl : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMontMdlDatFlshProgrs : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonEngRecvrFltCodARC : 36|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrAttnStatChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrAttnStat : 39|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrAttnStatPrd : 22|15@0+ (0.025,0) [0|819.175] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonEngRecvrFltCodV : 23|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonEngUnrecvrFltCod : 10|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonEngUnrecvrFltCodV : 11|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrAttnStatCnfdc : 13|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonEngRecvrFltCod : 15|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrAttnStatV : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 324 DMS_RawMeasurement_Info2_FO: 8 DMS_FO
+ SG_ DrvrMonFrmNum : 47|8@0+ (1,0) [0|255] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMntrSysVTP : 29|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonSysEngStV : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonSysEngSt : 28|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonFrmNumV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrHeadRotAngZV : 4|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrHeadRotAngYV : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrHeadRotAngXV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrHeadRotAngARC : 52|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonLatV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrMonLat : 50|11@0+ (0.001,0) [0|2.047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvHeadRotAngZ : 25|10@0- (0.00625,0) [-3.2|3.19375] "rad" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ DrvHeadRotAngY : 23|10@0- (0.00625,0) [-3.2|3.19375] "rad" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ DrvrHeadRotAngX : 1|10@0- (0.00625,0) [-3.2|3.19375] "rad" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 322 DMS_RawMeasurement_Info1_FO: 8 DMS_FO
+ SG_ DrvrEyeClosrRt : 47|8@0+ (0.005,0) [0|1.275] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrEyeClosrLft : 39|8@0+ (0.005,0) [0|1.275] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvHeadPosZV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvHeadPosYV : 4|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvHeadPosXV : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrEyeClosrRtV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrEyeClosrLftV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvrEyeClosrARC : 52|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ DrvHeadPosZ : 50|11@0- (0.005,0) [-5.12|5.115] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ DrvHeadPosY : 18|11@0- (0.005,0) [-5.12|5.115] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ DrvHeadPosX : 2|11@0- (0.005,0) [-5.12|5.115] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 320 Inertial2_Rates_FO: 8 _DOFIMU2_FO
+ SG_ MstrTgrSyncInrtl2Rte : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2YawRteV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2YawRte : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2RollRteV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2RollRte : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2RteChksum : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2PitchRteV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2PitchRte : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 308 Inertial1_Rates_FO: 8 _DOFIMU1_FO
+ SG_ MstrTrgrSyncInrtl1Rte : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1YawRteV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1YawRte : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1RollRteV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1RollRte : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1RteChksum : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1PitchRteV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial1PitchRte : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 312 Inertial2_Accel2_FO: 8 _DOFIMU2_FO
+ SG_ MstrTrigSyncInrtl22 : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSns2AccFrm2Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr2YawAccV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr2YawAcc : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr2RollAccV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr2RollAcc : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr2PtchAccV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr2PtchAcc : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 306 Inertial1_Accel2_FO: 8 _DOFIMU1_FO
+ SG_ MstrTrigSyncInrtl12 : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1AccelFrm2Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1YawAccV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1YawAcc : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1RollAccV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1RollAcc : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1PtchAccV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1PtchAcc : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 310 Inertial2_Accel1_FO: 8 _DOFIMU2_FO
+ SG_ MstrTrigSyncInrtl21 : 7|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2VertAccV : 34|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2VertAcc : 33|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2LonAccV : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2LonAcc : 1|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2LatAccV : 18|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ Inertial2LatAcc : 17|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ IntlSnsr2AcelFm1Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 304 Inertial1_Accel1_FO: 8 _DOFIMU1_FO
+ SG_ MstrTrigSyncInrtl11 : 7|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1VertAccV : 34|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1VertAcc : 33|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1LonAccV : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1LonAcc : 1|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1LatAccV : 18|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InrtlSnsr1LatAcc : 17|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ IntlSnsr1AcelFm1Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 356 Map_Pos_Correction_FO: 4 EOCM2A_K1_FO
+ SG_ LongErrPstn : 7|8@0- (0.5,0) [-64|63.5] "m" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ LatErrPstn : 15|8@0- (0.5,0) [-64|63.5] "m" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ PstnErrChcksm : 18|11@0+ (1,0) [0|2047] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ PstnErrARC : 20|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 354 Map_Retrans_Request_FO: 1 EOCM2A_K1_FO
+ SG_ HrznPrvdRstRq : 2|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ ADASISRwDtMplxdCycCnt : 7|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ ADASISMsgTypRetrans : 5|3@0+ (1,0) [0|7] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 352 Map_Path_Correction_FO: 6 EOCM2A_K1_FO
+ SG_ ExptNxtTrnstnDir : 37|3@0+ (1,0) [0|7] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ MstProbLnV : 15|1@0+ (1,0) [0|1] "" AMM_FO
+ SG_ MstProbLn : 14|5@0+ (1,0) [0|31] "" AMM_FO
+ SG_ PathCrtnChcksm : 34|11@0+ (1,0) [0|2047] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ PathCrtnARC : 4|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ EgoLnCurvV : 2|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ EgoLnCurv : 23|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m^2" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ VehLnStatV : 1|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ VehLnStatConf : 6|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ VehLnStat : 9|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ ExptNxtTransDirV : 0|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ ExptNxtTrnstnDirConf : 39|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 264 Inertial_Trigger_FO: 1 EOCM2A_K1_FO
+ SG_ InrtlSnsrMstrTrgrSync : 7|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,_DOFIMU2_FO,_DOFIMU1_FO
+
+BO_ 1156 SSID_AMM_2_FO: 8 EOCM2A_K1_FO
+ SG_ WiFiSSIDDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 1155 SSID_AMM_1_FO: 8 EOCM2A_K1_FO
+ SG_ WiFiSSIDDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO
+
+BO_ 1927 DTC_Triggered_787_FO: 7 DMS_FO
+ SG_ DTCI_CodeSupported_787 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_787 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_787 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_787 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_787 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_787 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_787 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_787 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_787 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_787 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_787 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_787 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_787 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_787 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_787 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_787 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_787 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_787 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_787 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_787 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1926 DTC_Triggered_786_FO: 7 AMM_FO
+ SG_ DTCI_CodeSupported_786 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_786 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_786 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_786 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_786 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_786 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_786 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_786 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_786 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_786 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_786 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_786 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_786 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_786 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_786 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_786 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_786 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_786 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_786 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_786 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1928 DTC_Triggered_788_FO: 7 _DOFIMU1_FO
+ SG_ DTCI_CodeSupported_788 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_788 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_788 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_788 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_788 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_788 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_788 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_788 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_788 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_788 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_788 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_788 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_788 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_788 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_788 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_788 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_788 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_788 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_788 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_788 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1929 DTC_Triggered_789_FO: 7 _DOFIMU2_FO
+ SG_ DTCI_CodeSupported_789 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_789 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_789 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_789 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_789 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_789 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_789 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_789 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_789 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_789 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_789 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_789 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_789 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_789 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_789 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_789 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_789 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_789 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_789 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_789 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1352 UUDT_Resp_From_6DOFIMU2_FO: 8 _DOFIMU2_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 588 USDT_Req_to_EOCM2B_K1_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2B_K1_FO
+
+BO_ 1356 UUDT_Resp_From_EOCM2B_K1_FO: 8 EOCM2B_K1_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1612 USDT_Resp_From_EOCM2B_K1_FO: 8 EOCM2B_K1_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1616 USDT_Resp_From_EOCM2A_IMX6_FO: 8 EOCM2A_IMX6_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1360 UUDT_Resp_From_EOCM2A_IMX6_FO: 8 EOCM2A_IMX6_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 592 USDT_Req_to_EOCM2A_IMX6_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2A_IMX6_FO
+
+BO_ 1610 USDT_Resp_From_EOCM2A_K1_FO: 8 EOCM2A_K1_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1354 UUDT_Resp_From_EOCM2A_K1_FO: 8 EOCM2A_K1_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 586 USDT_Req_to_EOCM2A_K1_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2A_K1_FO
+
+BO_ 1925 DTC_Triggered_785_FO: 7 NVS_FO
+ SG_ DTCI_CodeSupported_785 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_785 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_785 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_785 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_785 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_785 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_785 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_785 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_785 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_785 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_785 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_785 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_785 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_785 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_785 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_785 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_785 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_785 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_785 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_785 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1859 VIN_Digits_10_to_17_FO: 8 EOCM_F_FO
+ SG_ VehIdNmDig10_17 : 7|64@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO
+
+BO_ 1857 VIN_Digits_2_to_9_FO: 8 EOCM_F_FO
+ SG_ VehIdNmDig2_9 : 7|64@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO
+
+BO_ 771 Outside_Air_Temperature_FO: 2 EOCM_F_FO
+ SG_ OtsAirTmpCrValV : 0|1@0+ (1,0) [0|1] "" NVS_FO
+ SG_ OtsAirTmpCrVal : 15|8@0+ (0.5,-40) [-40|87.5] "deg C" NVS_FO
+
+BO_ 777 Night_Vision_System_Ped_FO: 1 NVS_FO
+ SG_ NVSysStat : 3|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ NVSysPedWrnIndReq : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ NVSysPedDetCsCrStVal : 5|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ NVSysPedDetCstStAvl : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 607 USDT_Req_to_NVS_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" NVS_FO
+
+BO_ 1631 USDT_Resp_From_NVS_FO: 8 NVS_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1375 UUDT_Resp_From_NVS_FO: 8 NVS_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1540 ADAS_Position_FO: 8 AMM_FO
+ SG_ AdvDrAstMpLatOffst : 40|9@0+ (1,-256) [-256|255] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnIndx : 63|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnCnf : 61|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPsnIdxCrLn : 58|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnPthIndx : 46|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnProb : 31|5@0+ (3.333,0) [0|103.323] "%" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnCycCnt : 26|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnAge : 24|9@0+ (5,0) [0|2555] "ms" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnRelHd : 23|8@0+ (1.417,0) [0|361.335] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnMsgTyp : 7|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+ SG_ AdvDrAstMpPstnOfst : 4|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO
+
+BO_ 1608 USDT_Resp_From_6DOFIMU2_FO: 8 _DOFIMU2_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 871 LGT_ObjectDetect_Info_8_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk8 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk8 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk8 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk8 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev8 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev8 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev8 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk8 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk8 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk8 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 870 LGT_ObjectDetect_Info_7_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk7 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk7 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk7 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk7 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev7 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev7 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev7 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk7 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk7 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk7 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 869 LGT_ObjectDetect_Info_6_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk6 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk6 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk6 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk6 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev6 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev6 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev6 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk6 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk6 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk6 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 868 LGT_ObjectDetect_Info_5_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk5 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk5 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk5 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk5 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev5 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev5 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev5 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk5 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk5 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk5 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 867 LGT_ObjectDetect_Info_4_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk4 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk4 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk4 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk4 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev4 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev4 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev4 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk4 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk4 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk4 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 866 LGT_ObjectDetect_Info_3_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk3 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk3 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk3 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk3 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev3 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev3 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev3 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk3 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk3 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk3 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 865 LGT_ObjectDetect_Info_2_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk2 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk2 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk2 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk2 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev2 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev2 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev2 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk2 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk2 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 864 LGT_ObjectDetect_Info_1_FO: 8 VIS2_FO
+ SG_ GFHBFwVsnWidthTrk1 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnVertPosTrk1 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO
+ SG_ GFHBFwVsnRelLaneTrk1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthRtTrk1 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ GFHBFwVsnCnfdncTrk1 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnRngTrkRev1 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO
+ SG_ GFHBFwVsnAzmthTrkRev1 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO
+ SG_ GFHBFVsnObjTypTrkRev1 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ GFHBObjDirTrk1 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ GFHBFwVsnMesStatTrk1 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ GFHBFwVsnObjIDTrk1 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1915 DTC_Triggered_77B_FO: 7 VIS_FO
+ SG_ DTCI_DTCFaultType_77B : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_CodeSupported_77B : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_77B : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_77B : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_77B : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_77B : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_77B : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_77B : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_77B : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_77B : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_77B : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_77B : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_77B : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_77B : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_77B : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_77B : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_77B : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_77B : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_77B : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_77B : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1923 DTC_Triggered_783_FO: 7 RSRR_FO
+ SG_ DTCI_WrnIndRqdSt_783 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_783 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_783 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_783 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_783 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_783 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_783 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCSource_783 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_783 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_783 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFailType_783 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_783 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CodeSupported_783 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_783 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_783 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_783 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_783 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_783 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_783 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_783 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1924 DTC_Triggered_784_FO: 7 RRSRR_FO
+ SG_ DTCI_HistStat_784 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_784 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_784 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_784 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_784 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_784 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_784 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_784 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_784 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_784 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_784 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_784 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_784 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CodeSupported_784 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_784 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCFailType_784 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_784 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_784 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCSource_784 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_784 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1922 DTC_Triggered_782_FO: 7 RFSRR_FO
+ SG_ DTCI_WrnIndRqdSt_782 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_782 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_782 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_782 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_782 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_782 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_782 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_782 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_782 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_782 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_782 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_782 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_782 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_782 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCSource_782 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_782 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_782 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFailType_782 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_CurrentStatus_782 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_CodeSupported_782 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1920 DTC_Triggered_780_FO: 7 LRR_FO
+ SG_ DTCI_CurrentStatus_780 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_780 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_780 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_780 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_780 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_780 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_780 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_780 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_780 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_780 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_780 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_780 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_780 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_780 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_780 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCSource_780 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_780 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_780 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFailType_780 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_CodeSupported_780 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1921 DTC_Triggered_781_FO: 7 LFSRR_FO
+ SG_ DTCI_CurrentStatus_781 : 41|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_WrnIndRqdSt_781 : 47|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused7_781 : 1|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused6_781 : 2|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused5_781 : 3|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused4_781 : 4|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused3_781 : 5|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused2_781 : 6|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCIUnused1_781 : 7|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdPwrUpSt_781 : 45|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstNPsdCdClrdSt_781 : 42|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldPwrUpSt_781 : 46|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_TstFldCdClrdStat_781 : 43|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_HistStat_781 : 44|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCTriggered_781 : 0|1@0+ (1,0) [0|1] "" TestTool_FO
+ SG_ DTCI_DTCSource_781 : 15|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCNumber_781 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO
+ SG_ DTCI_DTCFaultType_781 : 55|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_DTCFailType_781 : 39|8@0+ (1,0) [0|255] "" TestTool_FO
+ SG_ DTCI_CodeSupported_781 : 40|1@0+ (1,0) [0|1] "" TestTool_FO
+
+BO_ 1034 Curvature_Right_Line_FO: 7 VIS2_FO
+ SG_ CRL_Cnfdnc : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ CRL_ViewRng : 33|15@0+ (0.0039064,0) [0|128.0010088] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ CRL_CoefdA : 17|16@0- (3.6622E-009,0) [-0.0001200029696|0.0001199993074] "1/m^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ CRL_CoefA : 1|16@0- (6.1036E-007,0) [-0.02000027648|0.01999966612] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 1033 Curvature_Left_Line_FO: 7 VIS2_FO
+ SG_ CLL_Cnfdnc : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ CLL_ViewRng : 33|15@0+ (0.0039064,0) [0|128.0010088] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ CLL_CoefdA : 17|16@0- (3.6622E-009,0) [-0.0001200029696|0.0001199993074] "1/m^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ CLL_CoefA : 1|16@0- (6.1036E-007,0) [-0.02000027648|0.01999966612] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+
+BO_ 1365 UUDT_Resp_From_VIS2_FO: 8 VIS2_FO
+ SG_ DgnInf_OBJ555 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1621 USDT_Resp_From_VIS2_FO: 8 VIS2_FO
+ SG_ DgnInf_OBJ655 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1094 F_Vision_Obj_Track_12: 8 VIS2_FO
+ SG_ FwdVsnObjTypTr12Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk12Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk12Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FVisionWidthTrk12 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FVisionMeasStatTrk12 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk12 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisionRelLaneTrk12 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk12 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO
+ SG_ FVisionConfTrk12 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ ObjDirTrk12 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk12 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk12 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1093 F_Vision_Obj_Track_11: 8 VIS2_FO
+ SG_ FwdVsnObjTypTr11Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk11Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk11Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FVisionWidthTrk11 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FVisionMeasStatTrk11 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk11 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisionRelLaneTrk11 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk11 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO
+ SG_ FVisionConfTrk11 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ ObjDirTrk11 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk11 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk11 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1100 F_Vision_Obj_Track_12_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT12Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk12 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk12 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk12 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk12 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr12 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk12 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo12 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1099 F_Vision_Obj_Track_11_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT11Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk11 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk11 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk11 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk11 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr11 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk11 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo11 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1098 F_Vision_Obj_Track_10_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT10Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk10 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk10 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk10 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk10 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr10 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk10 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo10 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1097 F_Vision_Obj_Track_9_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT9Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk9 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk9 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk9 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk9 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr9 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk9 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo9 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1096 F_Vision_Obj_Track_8_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT8Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk8 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk8 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk8 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk8 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr8 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk8 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo8 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1095 F_Vision_Obj_Track_7_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT7Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk7 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk7 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk7 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk7 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr7 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk7 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo7 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 863 F_Vision_GFHB_Data_FO: 8 VIS2_FO
+ SG_ RgDtLgtSrcHrtAngl : 49|10@0- (0.04,0) [-20.48|20.44] "deg" EOCM_F_FO
+ SG_ RgDtLgtSrcHrtAngVcty : 55|6@0- (1,0) [-32|31] "deg/sec" EOCM_F_FO
+ SG_ LfDtLgtSrcHrtAngl : 33|10@0- (0.04,0) [-20.48|20.44] "deg" EOCM_F_FO
+ SG_ LfDtLgtSrcHrtAnVcty : 39|6@0- (1,0) [-32|31] "deg/sec" EOCM_F_FO
+ SG_ AdvWthrStat : 25|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ DtctdLghtSrcDstnc : 22|7@0+ (10,0) [0|1270] "m" EOCM_F_FO
+ SG_ DtctdLghtSrcVrtclAngl : 1|10@0- (0.04,0) [-20.48|20.44] "deg" EOCM_F_FO
+ SG_ IntLghtRngAct : 2|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ DtctdLghtSrcDstncV : 3|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ TwnDtctnSts : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ DtctdLghtSrcDrvngDrctn : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 862 LGT_ControlHighBeamGlare_FO: 2 VIS2_FO
+ SG_ FwdCamSysOpStat : 10|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ EnvIllum : 2|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RdTyp : 5|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ AutoHgBmSts : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1068 F_Vision_Obj_Track_6_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT6Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk6 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk6 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk6 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk6 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr6 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk6 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo6 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1067 F_Vision_Obj_Track_5_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT5Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk5 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk5 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk5 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk5 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr5 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk5 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo5 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1066 F_Vision_Obj_Track_4_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT4Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk4 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk4 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk4 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk4 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr4 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk4 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo4 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1065 F_Vision_Obj_Track_3_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT3Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk3 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk3 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk3 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk3 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr3 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk3 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo3 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1064 F_Vision_Obj_Track_2_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT2Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk2 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk2 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk2 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk2 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr2 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk2 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo2 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1063 F_Vision_Obj_Track_1_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT1Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk1 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk1 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk1 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk1 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk1 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr1 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo1 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1151 Long_Range_Radar_add_Info_5_FO: 8 LRR_FO
+ SG_ FrtRdrRdEdgLtLatRdEdgDst : 63|8@0- (0.1,0) [-12.8|12.7] "m/m" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtCrvtPrvDst : 5|4@0+ (10,0) [0|150] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtTanHdgAng : 15|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtCrvtV : 48|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtCrvtGradV : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtCrvtGrad : 39|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtCrvtConf : 55|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtCrvt : 23|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM_F_FO
+ SG_ FrtRdrRdEdgLtTanHdgAngV : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAddInfo5BurstID : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1150 Long_Range_Radar_add_Info_4_FO: 8 LRR_FO
+ SG_ FrtRdrRdEdgRtLatRdEdgDst : 63|8@0- (0.1,0) [-12.8|12.7] "m/m" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtCrvtPrvDst : 5|4@0+ (10,0) [0|150] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtTanHdgAngV : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtTanHdgAng : 15|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtCrvtV : 48|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtCrvtGradV : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtCrvtGrad : 39|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtCrvtConf : 55|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM_F_FO
+ SG_ FrtRdrRdEdgRtCrvt : 23|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM_F_FO
+ SG_ FLRRAddInfo4BurstID : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1088 F_Vision_Obj_Header_2: 8 VIS2_FO
+ SG_ FrntVsnInPthVehBrkNwSt : 35|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FrntVsnClostPedBrkNwSt : 39|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FrntVsnClostPedObjID : 29|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FrntVsnClostPedAlrtNwFlg : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrntVsnClostPedNotftnFlg : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrntVsnInPthVehAlrtNwFlg : 2|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnVldTgtNum2 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FrtVsnTmStmp2V : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnTmStmp2 : 10|11@0+ (1,0) [0|2047] "" EOCM_F_FO
+ SG_ FrtVsnRollCnt2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FrtVsnBrstChksum2 : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+
+BO_ 854 F_Vision_Environment_7: 3 VIS2_FO
+ SG_ FwdVsnCnstrctAreaDst : 13|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnCnstrctZnDet : 15|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnEgoVehLnPos : 17|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnRdTypDet : 9|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnTunnlDetd : 23|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnTunnlDst : 21|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBrstID5 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 853 F_Vision_Environment_6: 8 VIS2_FO
+ SG_ LnMrkg4LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvtGrad : 47|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvt : 31|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBrstID4 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 852 F_Vision_Environment_5: 8 VIS2_FO
+ SG_ LnMrkg3LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvtGrad : 47|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvt : 31|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBrstID3 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 602 USDT_Req_to_RRSRR: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RRSRR_FO
+
+BO_ 1626 USDT_Resp_From_RRSRR: 8 RRSRR_FO
+ SG_ DgnInf_OBJ65A : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1370 UUDT_Resp_From_RRSRR: 8 RRSRR_FO
+ SG_ DgnInf_OBJ55A : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1536 RR_SRR_Trace_data: 8 RRSRR_FO
+ SG_ RRSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ RRSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ RRSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO
+
+BO_ 1210 RR_SRR_Object_Track10: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1209 RR_SRR_Object_Track9: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1208 RR_SRR_Object_Track8: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1207 RR_SRR_Object_Track7: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1206 RR_SRR_Object_Track6: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1205 RR_SRR_Object_Track5: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 262 LHT_AutoHighBeamAssistStatus_FO: 5 EOCM_F_FO
+ SG_ NtVsnSysEnbld : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO
+ SG_ VehMovState : 5|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO
+ SG_ NVSysPedDetCstReq : 2|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO
+ SG_ StrWhAngV : 8|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO,VIS_FO
+ SG_ StrWhAngMsk : 9|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ StrWhAng : 23|16@0- (0.0625,0) [-2048|2047.9375] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO,VIS_FO
+ SG_ RtTrnLmpAtv : 13|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ MpDataAvlbl : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ LftTrnLmpAtv : 11|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ HdlmpBmSelectStat : 33|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ BldUpArDet : 14|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ FrFogLmpsAct : 15|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO,VIS_FO
+
+BO_ 309 LHT_CameraObjConfirmation_FO: 1 VIS_FO
+ SG_ HiBmRecmnd : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ CtLghtDet : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 2034 CCP_Data_Transmission_Object_FO: 8 VIS2_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 2032 CCP_Command_Receive_Object_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" VIS2_FO
+
+BO_ 1362 F_Vis_Obj_Conf_CPS_1B: 8 EOCM_F_FO
+ SG_ FObjConfCPSTrkObjectIDB : 7|6@0+ (1,0) [0|63] "" VIS_FO
+ SG_ CPSVisConfLonPos1 : 20|12@0- (0.125,0) [-256|255.875] "m" VIS_FO
+ SG_ CPSVisConfLatPos1 : 15|10@0- (0.125,0) [-64|63.875] "m" VIS_FO
+ SG_ CPSVisConfChecksum : 50|11@0+ (1,0) [0|2047] "" VIS_FO
+ SG_ FObjConfCPSTrkRangeRate : 45|11@0- (0.125,0) [-128|127.875] "m/s" VIS_FO
+ SG_ CPSConfTimeStamp : 24|11@0+ (1,0) [0|2047] "ms" VIS_FO
+ SG_ CPSConfTimeStampV : 21|1@0+ (1,0) [0|1] "" VIS_FO
+ SG_ FObjConfCPSRollingTrkCnt : 1|2@0+ (1,0) [0|3] "" VIS_FO
+
+BO_ 1413 TOS_ACC_IDS: 5 EOCM_F_FO
+ SG_ TOS_ACC_IDSRollCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ TOS_ACC_IDSFuncState : 5|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ TOS_ACC_ID1 : 3|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ TOS_ACC_ID2 : 13|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ TOS_ACC_ID3 : 23|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ TOS_ACC_ID4 : 17|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ TOS_ACC_ID5 : 27|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ TOS_ACC_ID6 : 37|6@0+ (1,0) [0|63] "" Dummy_FO
+
+BO_ 1412 F_ACC_Target: 8 EOCM_F_FO
+ SG_ FACCTOSRollCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FACCTOSFuncState : 5|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FACCTOSLongPos : 3|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FACCTOSLatPos : 23|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FACCTOSMeasStat : 28|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FACCTOSLongVel : 26|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FACCTOSTrgtDecelFlg : 47|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FACCTOSDynProp : 46|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FACCTOSLatVel : 42|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FACCTOSRelLane : 63|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FACCTOSHiThrtID : 61|6@0+ (1,0) [0|63] "" Dummy_FO
+
+BO_ 1409 F_CPS_TOS_B: 8 EOCM_F_FO
+ SG_ CPSTOSObjType : 7|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ CPSTOSHiThrtPriNo : 60|5@0+ (1,0) [0|31] "" Dummy_FO
+ SG_ CPSTOSRelLongAcc : 53|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ CPSTOSConfAsmt : 21|12@0+ (1,0) [0|4095] "" Dummy_FO
+ SG_ CPSTOSNumCycTrkd : 4|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ CPSTOSTimeToColl : 1|12@0+ (0.025,0) [0|102.375] "s" Dummy_FO
+ SG_ CPSTOSClosestInPthVehRng : 47|10@0+ (0.25,0) [0|255.75] "m" Dummy_FO
+ SG_ CPSTOSClosestInPthObID : 37|6@0+ (1,0) [0|63] "m" Dummy_FO
+ SG_ CPSTOSMeasStat : 39|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ CPSTOSFuncState : 25|2@0+ (1,0) [0|3] "" Dummy_FO
+
+BO_ 1408 F_CPS_TOS_A: 8 EOCM_F_FO
+ SG_ CPSTOSLongPos : 7|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ CPSTOSLatPos : 11|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ CPSTOSLongVel : 16|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ CPSTOSDynProp : 37|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ CPSTOSLatVel : 34|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ CPSTOSARelLane : 63|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ CPSTOSHiThrtID : 61|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ CPSTOSHighestThreatObAsmt : 55|8@0+ (1,0) [0|255] "" Dummy_FO
+
+BO_ 1344 FLPEstimate: 8 EOCM_F_FO
+ SG_ FLPRollCount : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ NewLaneIndex : 5|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ VehPathInOK : 3|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LaneSnsInOK : 2|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ MapInOK : 1|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FWDObjFusInOK : 0|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LngthFrstSeg : 15|4@0+ (10,0) [0|150] "m" Dummy_FO
+ SG_ LngthScndSeg : 11|4@0+ (10,0) [0|150] "m" Dummy_FO
+ SG_ CurvFrstSeg : 23|13@0- (5E-005,0) [-0.2048|0.20475] "1/m" Dummy_FO
+ SG_ CurvScndSeg : 26|3@0- (0.001,0) [-0.004|0.003] "1/m" Dummy_FO
+ SG_ OffstLaneCntr : 39|8@0- (0.05,0) [-6.4|6.35] "m" Dummy_FO
+ SG_ TngntLaneHead : 47|8@0- (0.002,0) [-0.256|0.254] "m/m" Dummy_FO
+ SG_ LaneWidth : 55|8@0+ (0.05,0) [0|12.75] "m" Dummy_FO
+ SG_ FLPDataTimeStampV : 63|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FLPDataTimeStamp : 62|7@0+ (16,0) [0|2032] "ms" Dummy_FO
+
+BO_ 770 F_Fwd_Collision_Alert: 8 EOCM_F_FO
+ SG_ Vpath_Accel : 51|11@0- (0.125,0) [-128|127.875] "m/s^2" NVS_FO,Dummy_FO
+ SG_ FCA_Ra : 7|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FCA_Range : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FCA_AlertLevel : 44|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FCA_Alert_Sup : 31|16@0+ (1,0) [0|65535] "" Dummy_FO
+ SG_ FCAStatus : 46|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FCA_VehAhead : 47|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FCA_CPS_Alert : 42|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FCAChime : 41|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FCADiagOK : 40|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ NBSMS_Alert : 55|1@0+ (1,0) [0|1] "" Dummy_FO
+
+BO_ 1601 USDT_Resp_From_VIS: 8 VIS_FO
+ SG_ DgnInf_OBJ641 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1606 USDT_Resp_From_RFSRR: 8 RFSRR_FO
+ SG_ DgnInf_OBJ646 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1603 USDT_Resp_From_LFSRR: 8 LFSRR_FO
+ SG_ DgnInf_OBJ643 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1602 USDT_Resp_From_LRR: 8 LRR_FO
+ SG_ DgnInf_OBJ642 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1625 USDT_Resp_From_RSRR: 8 RSRR_FO
+ SG_ DgnInf_OBJ644 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1611 USDT_Resp_From_FEOCM_FO: 8 EOCM_F_FO
+ SG_ DgnInf_OBJ64B : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 768 F_Smgr_Vehicle_Motion: 8 EOCM_F_FO
+ SG_ SmgrMotRollAngle : 44|10@0- (0.1,0) [-51.2|51.1] "deg" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotRollAngleV : 0|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotChecksum : 50|11@0+ (1,0) [0|2047] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotPitchAngle : 39|11@0- (0.1,0) [-102.4|102.3] "deg" CIPM_FO,NVS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotPitchAngleV : 1|1@0+ (1,0) [0|1] "" CIPM_FO,NVS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotLongSpeedV : 2|1@0+ (1,0) [0|1] " " CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotLongSpeed : 18|11@0- (0.1,0) [-102.4|102.3] "m/s" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotYawRate : 14|12@0- (0.05,0) [-102.4|102.35] "deg/s" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotYawRateV : 15|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+ SG_ SmgrMotRollingCnt : 4|2@0+ (1,0) [0|3] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO
+
+BO_ 1350 UUDT_Resp_From_RFSRR: 8 RFSRR_FO
+ SG_ DgnInf_OBJ546 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1369 UUDT_Resp_From_RSRR: 8 RSRR_FO
+ SG_ DgnInf_OBJ544 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1347 UUDT_Resp_From_LFSRR: 8 LFSRR_FO
+ SG_ DgnInf_OBJ543 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1346 UUDT_Resp_From_LRR: 8 LRR_FO
+ SG_ DgnInf_OBJ542 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1345 UUDT_Resp_From_VIS: 8 VIS_FO
+ SG_ DgnInf_OBJ541 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 579 USDT_Req_to_LFSRR: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LFSRR_FO
+
+BO_ 577 USDT_Req_to_VIS: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" VIS_FO
+
+BO_ 578 USDT_Req_to_LRR: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LRR_FO
+
+BO_ 582 USDT_Req_to_RFSRR: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RFSRR_FO
+
+BO_ 601 USDT_Req_to_RSRR: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RSRR_FO
+
+BO_ 1355 UUDT_Resp_From_FEOCM_FO: 8 EOCM_F_FO
+ SG_ DgnInf_OBJ54B : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 587 USDT_Req_to_FEOCM_obj: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2A_K2_FO,EOCM_F_FO
+
+BO_ 784 Body_Info_FOB: 6 EOCM_F_FO
+ SG_ StrgColUpDwnPos : 39|8@0+ (1,0) [0|255] "" DMS_FO
+ SG_ CPMAPINFO4 : 47|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ StrgColInOutPos : 31|8@0+ (1,0) [0|255] "" DMS_FO
+ SG_ StrgColCommsFlt : 19|2@0+ (1,0) [0|3] "" DMS_FO
+ SG_ DrDoorOpenSwActV : 16|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ DrDoorOpenSwAct : 17|1@0+ (1,0) [0|1] "" DMS_FO
+ SG_ DrvWndPosStat : 22|3@0+ (1,0) [0|7] "" CIPM_FO,DMS_FO,VIS2_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ InterLghtStat : 23|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,VIS2_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ DrvrHndsOnWhlZn3 : 13|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,DMS_FO,VIS2_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ DrvrHndsOnWhlZn2 : 14|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,VIS2_FO
+ SG_ DrvrHndsOnWhlZn1 : 15|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,VIS2_FO
+ SG_ WSWshSwAtv : 11|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,VIS_FO,VIS2_FO
+ SG_ SysPwrMdV : 8|1@0+ (1,0) [0|1] "" NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO,LRSRR_FO,CIPM_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,VIS2_FO
+ SG_ SysPwrMd : 10|2@0+ (1,0) [0|3] "" NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO,LRSRR_FO,CIPM_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,VIS2_FO
+ SG_ WSWprAct : 2|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ RtLwBmFld : 4|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ OtsdAmbtLtLvlStatV : 5|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ OtsdAmbtLtLvlStat : 7|2@0+ (1,0) [0|3] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ LowBmAct : 1|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ LftLwBmFld : 3|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ HighBmAct : 0|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO
+ SG_ TrStLgMdAtv : 12|1@0+ (1,0) [0|1] "" CIPM_FO,NVS_FO,RRSRR_FO,LRSRR_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,LRR_FO,RFSRR_FO,LFSRR_FO,RSRR_FO,VIS_FO,VIS2_FO
+
+BO_ 1539 RF_SRR_Trace_Data: 8 RFSRR_FO
+ SG_ RFSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ RFSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ RFSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO
+
+BO_ 776 F_Vehicle_Path_Data_2: 7 EOCM_F_FO
+ SG_ Vpath_Data2ModeInfo : 44|2@0+ (1,0) [0|3] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath2_Checksum : 42|11@0+ (1,0) [0|2047] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RFSRR_FO,LFSRR_FO,RSRR_FO,LRR_FO
+ SG_ Vpath_Data2RollCnt : 46|2@0+ (1,0) [0|3] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2YawRateV : 2|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2LongVelV : 1|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,NVS_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2LatVelV : 47|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2TravlDirctn : 4|2@0+ (1,0) [0|3] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2LongVel : 15|12@0- (0.0625,0) [-128|127.9375] "m/s" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,NVS_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2YawRate : 19|12@0- (0.0625,0) [-128|127.9375] "deg/s" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_Data2LatVel : 39|8@0- (0.05,0) [-6.4|6.35] "m/s" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+
+BO_ 161 F_Master_Time_Sync: 7 EOCM_F_FO
+ SG_ FTimeSyncMstrChksm : 35|12@0+ (1,0) [0|4095] "" AMM_FO,CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ FTimeSyncMstrClock : 7|32@0+ (1,0) [0|4294967295] "ms" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ SensorModeCmdLRR : 39|3@0+ (1,0) [0|7] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ SensorModeCmdSRR : 50|3@0+ (1,0) [0|7] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ SensorModeCmdFCamera : 53|3@0+ (1,0) [0|7] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ FTimeSyncMstrClockV : 36|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,LRR_FO,RFSRR_FO,LFSRR_FO
+
+BO_ 774 F_Vehicle_Path_Estimate: 8 EOCM_F_FO
+ SG_ Vpath_RollingCount : 7|2@0+ (1,0) [0|3] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_TrnCtrLngOfstV : 1|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,LRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LFSRR_FO
+ SG_ Vpath_Checksum : 50|11@0+ (1,0) [0|2047] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_TrnCtrLngOfst : 15|8@0- (0.1,0) [-12.8|12.7] "m" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,LRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LFSRR_FO
+ SG_ Vpath_TrnCtrLatOfst : 21|14@0- (1,0) [-8192|8191] "m" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,LRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LFSRR_FO
+ SG_ Vpath_Curvature : 39|16@0- (1E-005,0) [-0.32768|0.32767] "1/m" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO
+ SG_ Vpath_CurvatureV : 0|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,LRR_FO,RSRR_FO,RFSRR_FO,LFSRR_FO
+
+BO_ 848 F_Vision_Environment: 8 VIS_FO
+ SG_ FwdVsnEnvIllum : 37|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnRtV : 1|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnRt : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnChngStatus : 39|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseSystemOK : 4|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSnsLLnPosValid : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSenseDistToLLnEdge : 14|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsRLnPosValid : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsDistToRLnEdge : 22|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseTimeStampV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseTimeStamp : 34|11@0+ (1,0) [0|2047] "ms" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseSystemOKV : 3|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 849 F_Vision_Environment_2: 8 VIS_FO
+ SG_ LnSnsLatVRelToRgtMrkg : 23|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ LnSnsRtLnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntRtV : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnMrkgWdthRt : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsRtAnchrLn : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtAnchrLn : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrRghtV : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrRght : 47|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntRt : 31|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstID : 2|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLatVRelToLftMrkg : 15|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 1184 R_SRR_Object_Header: 8 RSRR_FO
+ SG_ RSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ RSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ RSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+ SG_ RSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1185 R_SRR_Object_Track1: 8 RSRR_FO
+ SG_ RSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1186 R_SRR_Object_Track2: 8 RSRR_FO
+ SG_ RSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1187 R_SRR_Object_Track3: 8 RSRR_FO
+ SG_ RSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1188 R_SRR_Object_Track4: 8 RSRR_FO
+ SG_ RSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1189 R_SRR_Object_Track5: 8 RSRR_FO
+ SG_ RSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1190 R_SRR_Object_Track6: 8 RSRR_FO
+ SG_ RSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1191 R_SRR_Object_Track7: 8 RSRR_FO
+ SG_ RSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1192 R_SRR_Object_Track8: 8 RSRR_FO
+ SG_ RSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1193 R_SRR_Object_Track9: 8 RSRR_FO
+ SG_ RSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1194 R_SRR_Object_Track10: 8 RSRR_FO
+ SG_ RSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1410 RVB_TVR_Debug: 6 EOCM_F_FO
+ SG_ VBBrkRqActv : 7|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ PATOSTTC : 37|12@0+ (0.025,0) [0|102.375] "s" Dummy_FO
+ SG_ BWTOSObjID : 27|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ BWTOSLonPstn : 23|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ VBSwInd : 10|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ VBBrkCtrlSt : 15|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ BrkPlsRqst : 6|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VBOpSt : 12|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ VBAccelOvrrd : 0|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VBUnavail : 1|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VBFld : 2|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VBDisbld : 3|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VBEnbl : 4|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VBBrkPrfReq : 5|1@0+ (1,0) [0|1] "" Dummy_FO
+
+BO_ 1216 LF_SRR_Object_Header: 8 LFSRR_FO
+ SG_ LFSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ LFSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ LFSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+ SG_ LFSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ LFSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1217 LF_SRR_Object_Track1: 8 LFSRR_FO
+ SG_ LFSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1218 LF_SRR_Object_Track2: 8 LFSRR_FO
+ SG_ LFSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1219 LF_SRR_Object_Track3: 8 LFSRR_FO
+ SG_ LFSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1220 LF_SRR_Object_Track4: 8 LFSRR_FO
+ SG_ LFSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1221 LF_SRR_Object_Track5: 8 LFSRR_FO
+ SG_ LFSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1222 LF_SRR_Object_Track6: 8 LFSRR_FO
+ SG_ LFSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1223 LF_SRR_Object_Track7: 8 LFSRR_FO
+ SG_ LFSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1224 LF_SRR_Object_Track8: 8 LFSRR_FO
+ SG_ LFSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1225 LF_SRR_Object_Track9: 8 LFSRR_FO
+ SG_ LFSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1226 LF_SRR_Object_Track10: 8 LFSRR_FO
+ SG_ LFSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ LFSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ LFSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ LFSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ LFSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ LFSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ LFSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ LFSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+
+BO_ 1232 RF_SRR_Object_Header: 8 RFSRR_FO
+ SG_ RFSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RFSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ RFSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ RFSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+ SG_ RFSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1233 RF_SRR_Object_Track1: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1234 RF_SRR_Object_Track2: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1235 RF_SRR_Object_Track3: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1236 RF_SRR_Object_Track4: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1237 RF_SRR_Object_Track5: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1238 RF_SRR_Object_Track6: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1239 RF_SRR_Object_Track7: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1240 RF_SRR_Object_Track8: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1241 RF_SRR_Object_Track9: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1242 RF_SRR_Object_Track10: 8 RFSRR_FO
+ SG_ RFSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RFSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RFSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RFSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RFSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RFSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RFSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RFSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RFSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1056 F_Vision_Obj_Header: 6 VIS_FO
+ SG_ FVsnSnsrBlckd : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ ClstInPathVehObjID : 30|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FrtVsnFld : 6|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnIniDiagSuccCmpt : 5|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnSrvAlgnInPrcs : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnUnvlbl : 7|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVISModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FVisionNumValidTrgts : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FVisionTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ VISBurstChecksum : 39|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+
+BO_ 1057 F_Vision_Obj_Track_1: 8 VIS_FO
+ SG_ FwdVsnRngTrk1Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk1Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr1Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk1 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisBurstIDTrk1 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk1 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk1 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk1 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk1 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ ObjDirTrk1 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1058 F_Vision_Obj_Track_2: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk2 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk2Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk2Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ ObjDirTrk2 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FwdVsnObjTypTr2Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk2 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk2 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk2 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk2 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1059 F_Vision_Obj_Track_3: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk3 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk3Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk3Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr3Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk3 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk3 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk3 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk3 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk3 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk3 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1060 F_Vision_Obj_Track_4: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk4 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisionMeasStatTrk4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk4 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FwdVsnRngTrk4Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk4Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr4Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk4 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk4 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ ObjDirTrk4 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionConfTrk4 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk4 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1061 F_Vision_Obj_Track_5: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk5 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk5Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk5Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr5Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk5 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk5 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk5 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk5 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk5 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk5 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1062 F_Vision_Obj_Track_6: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk6 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk6Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk6Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr6Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk6 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk6 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk6 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk6 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk6 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk6 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1538 LF_SRR_Trace_Data: 8 LFSRR_FO
+ SG_ LFSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ LFSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ LFSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO
+
+BO_ 1537 R_SRR_Trace_data: 8 RSRR_FO
+ SG_ RSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ RSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO
+ SG_ RSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO
+
+BO_ 1089 F_Vision_Obj_Track_7: 8 VIS2_FO
+ SG_ FVisBurstIDTrk7 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk7 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk7 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk7 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk7 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FwdVsnRngTrk7Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnObjTypTr7Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk7Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk7 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ ObjDirTrk7 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1090 F_Vision_Obj_Track_8: 8 VIS2_FO
+ SG_ FVisBurstIDTrk8 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk8 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk8Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk8 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk8Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnObjTypTr8Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk8 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionConfTrk8 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk8 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk8 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1091 F_Vision_Obj_Track_9: 8 VIS2_FO
+ SG_ FwdVsnVertPosTrk9 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk9Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk9Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr9Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk9 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk9 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk9 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk9 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk9 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk9 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1092 F_Vision_Obj_Track_10: 8 VIS2_FO
+ SG_ FwdVsnRngTrk10Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk10Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr10Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk10 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ ObjDirTrk10 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk10 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk10 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk10 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk10 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk10 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1120 F_LRR_Obj_Header: 8 LRR_FO
+ SG_ FLRRRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRModeCmdFdbk : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRNumValidTargets : 20|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ FLRRTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRTimeStamp : 2|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ FLRRRoadTypeInfo : 5|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+ SG_ FLRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRLonVelPlsblityFlt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRYawRtPlsblityFlt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRTunlDtctd : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1121 F_LRR_Obj_Track_1: 8 LRR_FO
+ SG_ FLRRTrk1BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk1Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk1RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk1RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk1DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk1Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk1Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk1MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk1ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FLRRTrk1Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1122 F_LRR_Obj_Track_2: 8 LRR_FO
+ SG_ FLRRTrk2BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk2Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk2RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk2RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk2DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk2Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk2Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk2MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk2ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FLRRTrk2Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1123 F_LRR_Obj_Track_3: 8 LRR_FO
+ SG_ FLRRTrk3BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk3Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk3RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk3RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk3DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk3Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk3Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk3MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk3ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FLRRTrk3Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1124 F_LRR_Obj_Track_4: 8 LRR_FO
+ SG_ FLRRTrk4BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk4Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk4RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk4RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk4DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk4Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk4Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk4MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk4ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FLRRTrk4Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1125 F_LRR_Obj_Track_5: 8 LRR_FO
+ SG_ FLRRTrk5BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk5Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk5RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk5RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk5DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk5Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk5Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk5MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk5ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FLRRTrk5Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1126 F_LRR_Obj_Track_6: 8 LRR_FO
+ SG_ FLRRTrk6BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk6Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk6RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk6Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk6RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk6DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk6Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk6Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk6MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk6ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1127 F_LRR_Obj_Track_7: 8 LRR_FO
+ SG_ FLRRTrk7Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk7BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk7Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk7RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk7RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk7DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk7Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk7Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk7MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk7ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1128 F_LRR_Obj_Track_8: 8 LRR_FO
+ SG_ FLRRTrk8Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk8BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk8Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk8RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk8RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk8DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk8Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk8Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk8MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk8ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1129 F_LRR_Obj_Track_9: 8 LRR_FO
+ SG_ FLRRTrk9Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk9BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk9Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk9RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk9RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk9DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk9Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk9Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk9MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk9ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1130 F_LRR_Obj_Track_10: 8 LRR_FO
+ SG_ FLRRTrk10Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk10BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk10Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk10RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk10RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk10DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk10Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk10Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk10MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk10ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1131 F_LRR_Obj_Track_11: 8 LRR_FO
+ SG_ FLRRTrk11Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk11BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk11Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk11RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk11RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk11DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk11Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk11Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk11MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk11ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1132 F_LRR_Obj_Track_12: 8 LRR_FO
+ SG_ FLRRTrk12Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk12BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk12Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk12RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk12RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk12DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk12Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk12Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk12MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk12ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1133 F_LRR_Obj_Track_13: 8 LRR_FO
+ SG_ FLRRTrk13Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk13BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk13Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk13RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk13RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk13DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk13Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk13Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk13MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk13ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1134 F_LRR_Obj_Track_14: 8 LRR_FO
+ SG_ FLRRTrk14Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk14BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk14Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk14RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk14RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk14DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk14Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk14Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk14MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk14ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1135 F_LRR_Obj_Track_15: 8 LRR_FO
+ SG_ FLRRTrk15Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk15MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk15Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk15ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FLRRTrk15BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk15Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk15RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk15RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk15DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk15Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+
+BO_ 1136 F_LRR_Obj_Track_16: 8 LRR_FO
+ SG_ FLRRTrk16Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk16BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk16Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk16RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk16RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk16DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk16Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk16Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk16MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk16ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1137 F_LRR_Obj_Track_17: 8 LRR_FO
+ SG_ FLRRTrk17Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk17BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk17Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk17RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk17RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk17DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk17Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk17Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk17MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk17ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1138 F_LRR_Obj_Track_18: 8 LRR_FO
+ SG_ FLRRTrk18Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk18BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk18Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk18RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk18RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk18DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk18Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk18Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk18MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk18ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1139 F_LRR_Obj_Track_19: 8 LRR_FO
+ SG_ FLRRTrk19Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk19BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk19Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk19RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk19RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk19DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk19Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk19Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk19MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk19ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1140 F_LRR_Obj_Track_20: 8 LRR_FO
+ SG_ FLRRTrk20Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk20BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk20Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO
+ SG_ FLRRTrk20RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ FLRRTrk20RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO
+ SG_ FLRRTrk20DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk20Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO
+ SG_ FLRRTrk20Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FLRRTrk20MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk20ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1141 Long_Range_Radar_add_Info_1: 8 LRR_FO
+ SG_ FLRRAddInfo1BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ Cut_In_Out_Pot_Objtrk1 : 15|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO
+ SG_ ObjLossInfoObjTrk1 : 9|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ Cut_In_Out_Pot_Objtrk2 : 23|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO
+ SG_ ObjLossInfoObjTrk2 : 17|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ Cut_In_Out_Pot_Objtrk3 : 31|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO
+ SG_ ObjLossInfoObjTrk3 : 25|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ Cut_In_Out_Pot_Objtrk4 : 39|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO
+ SG_ ObjLossInfoObjTrk4 : 33|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ Cut_In_Out_Pot_Objtrk5 : 47|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO
+ SG_ ObjLossInfoObjTrk5 : 41|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ Cut_In_Out_Pot_Objtrk6 : 55|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO
+ SG_ ObjLossInfoObjTrk6 : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1321 F_Fwd_Fus_Obj_TrackB_9: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn9 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB9RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB9Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB9MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB9DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB9RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB9RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB9Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB9ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB9ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB9ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB9ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB9ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB9ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB9NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB9LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB9LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1320 F_Fwd_Fus_Obj_TrackB_8: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn8 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB8RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB8Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB8MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB8DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB8RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB8RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB8Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB8ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB8ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB8ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB8ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB8ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB8ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB8NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB8LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB8LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1319 F_Fwd_Fus_Obj_TrackB_7: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn7 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB7RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB7Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB7MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB7DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB7RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB7RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB7Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB7ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB7ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB7ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB7ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB7ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB7ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB7NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB7LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB7LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1318 F_Fwd_Fus_Obj_TrackB_6: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn6 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB6RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB6Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB6MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB6DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB6RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB6RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB6Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB6ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB6ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB6ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB6ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB6ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB6ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB6NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB6LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB6LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1317 F_Fwd_Fus_Obj_TrackB_5: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn5 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB5RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB5Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB5MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB5DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB5RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB5RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB5Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB5ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB5ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB5ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB5ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB5ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB5ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB5NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB5LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB5LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1316 F_Fwd_Fus_Obj_TrackB_4: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn4 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB4RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB4Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB4MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB4DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB4RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB4RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB4Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB4ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB4ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB4ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB4ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB4ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB4ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB4NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB4LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB4LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1315 F_Fwd_Fus_Obj_TrackB_3: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn3 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB3RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB3Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB3MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB3DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB3RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB3RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB3Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB3ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB3ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB3ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB3ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB3ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB3ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB3NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB3LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB3LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1314 F_Fwd_Fus_Obj_TrackB_2: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn2 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB2RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB2Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB2MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB2DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB2RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB2RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB2Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB2ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB2ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB2ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB2ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB2ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB2ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB2NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB2LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB2LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1327 F_Fwd_Fus_Obj_TrackB_15: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn15 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB15RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB15Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB15MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB15DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB15RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB15RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB15Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB15ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB15ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB15ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB15ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTkB15ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB15ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB15NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB15LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB15LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1326 F_Fwd_Fus_Obj_TrackB_14: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn14 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB14RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB14Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB14MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB14DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB14RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB14RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB14Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB14ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB14ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB14ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB14ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB14ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB14ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB14NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB14LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB14LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1325 F_Fwd_Fus_Obj_TrackB_13: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn13 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB13RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB13Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB13MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB13DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB13RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB13RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB13Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB13ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB13ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB13ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB13ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB13ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB13ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB13NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB13LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB13LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1324 F_Fwd_Fus_Obj_TrackB_12: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn12 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB12RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB12Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB12MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB12DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB12RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB12RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB12Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB12ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB12ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB12ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB12ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB12ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB12ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB12NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB12LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB12LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1323 F_Fwd_Fus_Obj_TrackB_11: 7 EOCM_F_FO
+ SG_ FwdFusTrkB11DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB11RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB11RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB11Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB11ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB11ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB11ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB11ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB11ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB11ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB11NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB11LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB11LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkBAnlgRlLn11 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB11RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB11Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB11MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+
+BO_ 1322 F_Fwd_Fus_Obj_TrackB_10: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn10 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB10RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB10Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB10MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB10DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB10RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB10RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB10Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB10ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB10ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB10ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB10ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB10ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB10ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB10NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB10LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB10LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1313 F_Fwd_Fus_Obj_TrackB_1: 7 EOCM_F_FO
+ SG_ FwdFusTrkBAnlgRlLn1 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO
+ SG_ FwdFusTrkB1RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB1Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FwdFusTrkB1MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkB1DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB1RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO
+ SG_ FwdFusTrkB1RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkB1Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO
+ SG_ FFusTrkB1ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB1ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB1ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB1ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FFusTrkB1ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB1ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FwdFusTrkB1NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB1LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkB1LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1305 F_Fwd_Fus_Obj_TrackA_9: 8 EOCM_F_FO
+ SG_ FwdFusTrkA9RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA9ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA9MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA9LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA9RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA9Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA9LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA9RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA9MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA9ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1304 F_Fwd_Fus_Obj_TrackA_8: 8 EOCM_F_FO
+ SG_ FwdFusTrkA8RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA8ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA8MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA8LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA8RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA8Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA8LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA8RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA8MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA8ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1303 F_Fwd_Fus_Obj_TrackA_7: 8 EOCM_F_FO
+ SG_ FwdFusTrkA7RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA7ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA7MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA7LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA7RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA7Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA7LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA7RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA7MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA7ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1302 F_Fwd_Fus_Obj_TrackA_6: 8 EOCM_F_FO
+ SG_ FwdFusTrkA6RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA6ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA6MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA6LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA6RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA6Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA6LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA6RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA6MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA6ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1301 F_Fwd_Fus_Obj_TrackA_5: 8 EOCM_F_FO
+ SG_ FwdFusTrkA5RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA5ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA5MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA5LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA5RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA5Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA5LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA5RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA5MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA5ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1300 F_Fwd_Fus_Obj_TrackA_4: 8 EOCM_F_FO
+ SG_ FwdFusTrkA4RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA4ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA4MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA4LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA4RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA4Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA4LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA4RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA4MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA4ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1299 F_Fwd_Fus_Obj_TrackA_3: 8 EOCM_F_FO
+ SG_ FwdFusTrkA3RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA3ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA3MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA3LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA3RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA3Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA3LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA3RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA3MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA3ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1298 F_Fwd_Fus_Obj_TrackA_2: 8 EOCM_F_FO
+ SG_ FwdFusTrkA2RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA2ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA2MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA2LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA2RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA2Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA2LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA2RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA2MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA2ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1311 F_Fwd_Fus_Obj_TrackA_15: 8 EOCM_F_FO
+ SG_ FwdFusTrkA15RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA15ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA15MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA15LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA15RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA15Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA15LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA15RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA15MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA15ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1310 F_Fwd_Fus_Obj_TrackA_14: 8 EOCM_F_FO
+ SG_ FwdFusTrkA14RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA14ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA14MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA14LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA14RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA14Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA14LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA14RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA14MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA14ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1309 F_Fwd_Fus_Obj_TrackA_13: 8 EOCM_F_FO
+ SG_ FwdFusTrkA13RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA13ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA13MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA13LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA13RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA13Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA13LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA13RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA13MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA13ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1308 F_Fwd_Fus_Obj_TrackA_12: 8 EOCM_F_FO
+ SG_ FwdFusTrkA12RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA12ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA12MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA12LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA12RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA12Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA12LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA12RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA12MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA12ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1307 F_Fwd_Fus_Obj_TrackA_11: 8 EOCM_F_FO
+ SG_ FwdFusTrkA11ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA11MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA11LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA11RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA11Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA11LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA11RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA11MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA11ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+ SG_ FwdFusTrkA11RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+
+BO_ 1306 F_Fwd_Fus_Obj_TrackA_10: 8 EOCM_F_FO
+ SG_ FwdFusTrkA10RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA10ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA10MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA10LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA10RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA10Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA10LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA10RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA10MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA10ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1297 F_Fwd_Fus_Obj_TrackA_1: 8 EOCM_F_FO
+ SG_ FwdFusTrkA1RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA1ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ FwdFusTrkA1MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ FwdFusTrkA1LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+ SG_ FwdFusTrkA1RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA1Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA1LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ FwdFusTrkA1RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO
+ SG_ FwdFusTrkA1MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ FwdFusTrkA1ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 1296 F_Fwd_Fus_Obj_Header: 7 EOCM_F_FO
+ SG_ F_FusHeadRollingCount : 7|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ F_FusHeadFuncState : 5|2@0+ (1,0) [0|3] "" Dummy_FO
+ SG_ F_FusHedNmValTargts : 3|4@0+ (1,0) [0|15] "" Dummy_FO
+ SG_ F_FusHead_LrrOK : 15|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHead_LFSRROK : 14|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHead_VIsOK : 13|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHead_MapDataOK : 12|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHeadTimStmpV : 11|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHeadTimStmp : 10|11@0+ (1,0) [0|2047] "ms" Dummy_FO
+ SG_ F_FusHead_LCSRROK : 31|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHead_RCSRROK : 30|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHead_RFSRROK : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ F_FusHed_ObjClstrCurv : 28|13@0- (5E-005,0) [-0.2048|0.20475] "1/m" Dummy_FO
+ SG_ F_FusHdObjClstTanHdng : 47|8@0- (0.002,0) [-0.256|0.254] "m/m" Dummy_FO
+ SG_ RoadTypeInfo : 55|3@0+ (1,0) [0|7] "" Dummy_FO
+
+BO_ 257 USDT_Req_to_All_FO_ECUs: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LRSRR_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2A_K2_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K1_FO,NVS_FO,CIPM_FO,VIS2_FO,RRSRR_FO,VIS_FO,RFSRR_FO,LRR_FO,LFSRR_FO,RSRR_FO,EOCM_F_FO
+
+BO_ 584 USDT_Req_to_6DOFIMU2_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" _DOFIMU2_FO
+
+BO_ 1348 UUDT_Resp_From_6DOFIMU1_FO: 8 _DOFIMU1_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1604 USDT_Resp_From_6DOFIMU1_FO: 8 _DOFIMU1_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 580 USDT_Req_to_6DOFIMU1_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" _DOFIMU1_FO
+
+BO_ 1349 UUDT_Resp_From_DMS_FO: 8 DMS_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1605 USDT_Resp_From_DMS_FO: 8 DMS_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 581 USDT_Req_to_DMS_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" DMS_FO
+
+BO_ 1372 UUDT_Resp_From_AMM_FO: 8 AMM_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1628 USDT_Resp_From_AMM_FO: 8 AMM_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 604 USDT_Req_to_AMM_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" AMM_FO
+
+BO_ 1622 USDT_Resp_From_EOCM2B_IMX6_FO: 8 EOCM2B_IMX6_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 1366 UUDT_Resp_From_EOCM2B_IMX6_FO: 8 EOCM2B_IMX6_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO
+
+BO_ 598 USDT_Req_to_EOCM2B_IMX6_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2B_IMX6_FO
+
+BO_ 590 USDT_Req_to_Free_4E_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Vector__XXX
+
+BO_ 1338 VPDR_Debug: 8 EOCM_F_FO
+ SG_ FrtRWARateDiagFA : 43|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FrtRWABiasDiagFA : 42|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ HWAFrtVal : 41|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ HWADotValFrt : 40|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAxRangeFA : 39|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAxRateFA : 38|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAxBiasFA : 37|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehAxCompFA : 36|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAxVal : 35|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAxVal : 34|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FrtRWACorrFA : 33|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FrtRWARangeDiagFA : 32|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAyBiasFA : 31|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehAyCompFA : 30|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAyVal : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAyVal : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehAxCorrFA : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAxRangeFA : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAxRateFA : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAxBiasFA : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehWzVal : 23|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehWzVal : 22|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehAyCorrDiagFA : 21|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAyRangeFA : 20|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAyRateFA : 19|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehAyBiasFA : 18|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAyRangeFA : 17|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehAyRateFA : 16|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehWzCorrDiagFA : 15|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehWzRangeFA : 14|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehWzRateFA : 13|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S1VehWzBiasFA : 12|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehWzRangeFA : 11|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehWzRateFA : 10|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ S2VehWzBiasFA : 9|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehWzCompFA : 8|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlVxLFCorrDiagFA : 7|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlVxRFCorrDiagFA : 6|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlVxLRCorrDiagFA : 5|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlVxRRCorrDiagFA : 4|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlLFVal : 3|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlRFVal : 2|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlLRVal : 1|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ WhlRRVal : 0|1@0+ (1,0) [0|1] "" Dummy_FO
+
+BO_ 1328 Diag_Debug1: 8 EOCM_F_FO
+ SG_ AlrtWrnIndReqFP : 1|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AlrtWrnIndReqFA : 0|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILRSRRSnsr_FP : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILRSRRSnsr_FA : 23|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILRSRRFrehns_FA : 22|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathEstCrvCSFP : 21|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathEstCrvCSFA : 20|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathWzEstCSFP : 19|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathWzEstCSFA : 18|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathVyEstCSFP : 17|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathVyEstCSFA : 16|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathVxEstCSFP : 15|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VehPathVxEstCSFA : 14|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTTCCSFP : 13|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTTCCSFA : 12|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLyCSFP : 11|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLyCSFA : 10|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThLxVxAxCSFP : 9|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThLxVxAxCSFA : 8|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ CurSetValDiagFP : 7|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ CurSetValDiagFA : 6|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ CrsAltDvrSlTpDiagFP : 5|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ CrsAltDvrSlTpDiagFA : 4|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FCAStatDiagFP : 3|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FCAStatDiagFA : 2|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBBrkCtrlStFP : 62|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBBrkCtrlStFA : 61|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBOpStFP : 60|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBOpStFA : 59|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBBrkCtrlAccFP : 58|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBBrkCtrlAccFA : 57|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBAxlTrqRqFP : 56|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ RVBAxlTrqRqFA : 55|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRUPATTCFP : 54|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRUPATTCFA : 53|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtObjIDFP : 52|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtObjIDFA : 51|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtTTCFP : 50|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtTTCFA : 49|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtLxFP : 48|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtLxFA : 47|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtLyFP : 46|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TVRHiThrtLyFA : 45|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFFuncStFP : 44|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFFuncStFA : 43|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFObjIDFP : 42|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFObjIDFA : 41|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFLatPstnVelRatFP : 40|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFLatPstnVelRatFA : 39|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFLonPstnVelFP : 38|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFLonPstnVelFA : 37|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFRltvLatVelDiagFP : 36|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFRltvLatVelDiagFA : 35|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFRltvLatPstnDiagFP : 34|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFRltvLatPstnDiagFA : 33|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFNrRltvLonPstnFP : 32|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFNrRltvLonPstnFA : 31|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFLonPstnVelRatFP : 30|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFLonPstnVelRatFA : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFConfDiagFP : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFConfDiagFA : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFRltvLnDiagFP : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ROFRltvLnDiagFA : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+
+BO_ 1335 Diag_Debug3: 8 EOCM_F_FO
+ SG_ BrkSysCmdAxDiagFPQ : 63|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ BrkSysCmdAxDiagFAQ : 62|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AxleTorqReqDiagFPQ : 61|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AxleTorqReqDiagFAQ : 60|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AutoBrkTypeDiagFPQ : 59|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AutoBrkTypeDiagFAQ : 58|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTTCFPQ : 57|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTTCFAQ : 56|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTmpMemFPQ : 55|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTmpMemFAQ : 54|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLxVxAxFPQ : 53|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLxVxAxFAQ : 52|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtVyFPQ : 51|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtVyFAQ : 50|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLyFPQ : 49|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLyFAQ : 48|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtConPriFPQ : 47|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtConPriFAQ : 46|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtCJLFPQ : 45|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtCJLFAQ : 44|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPDynPropDiagFPQ : 43|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPDynPropDiagFAQ : 42|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRdTypInfoFPQ : 41|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRdTypInfoFAQ : 40|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRltvLnDiagFPQ : 39|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRltvLnDiagFAQ : 38|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumCycDiagFPQ : 37|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumCycDiagFAQ : 36|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumFusCyclsFPQ : 35|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumFusCyclsFAQ : 34|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNrRltvLonPstnFPQ : 33|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNrRltvLonPstnFAQ : 32|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonVelAccRatFPQ : 31|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonVelAccRatFAQ : 30|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPstnVelRatFPQ : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPstnVelRatFAQ : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPosVelAccFPQ : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPosVelAccFAQ : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatVelDiagFPQ : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatVelDiagFAQ : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatPstnDiagFPQ : 23|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatPstnDiagFAQ : 22|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFConfDiagFPQ : 21|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFConfDiagFAQ : 20|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFOvrlpRtlChk_FAQ : 19|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFOvrlpRtlChk_FAQ : 18|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRROvrlpRtlChk_FAQ : 17|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISOvrlpRtlChk_FAQ : 16|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISAlign_FAQ : 15|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISSnsr_FAQ : 14|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISSnsr_FPQ : 13|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISFrshns_FAQ : 12|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRAlign_FAQ : 11|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRFrshns_FAQ : 10|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRSnsr_FAQ : 9|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRSnsr_FPQ : 8|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRAlign_FAQ : 7|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRFrehns_FAQ : 6|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRSnsr_FAQ : 5|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRSnsr_FPQ : 4|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRSnsr_FPQ : 3|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRSnsr_FAQ : 2|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRFrshns_FAQ : 1|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRAlign_FAQ : 0|1@0+ (1,0) [0|1] "" Dummy_FO
+
+BO_ 1331 Diag_Debug2: 8 EOCM_F_FO
+ SG_ TCPHiThrtTmpMemFP : 63|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTmpMemFA : 62|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtConPriFP : 61|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtConPriFA : 60|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtCJLFP : 59|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTTCFP : 58|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtTTCFA : 57|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtVyFP : 56|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtVyFA : 55|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLyFP : 54|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLyFA : 53|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLxVxAxFP : 52|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtLxVxAxFA : 51|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRdTypInfoFP : 50|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRdTypInfoFA : 49|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AutoBrkTypeDiagFA : 48|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ BrkSysCmdAxDiagFP : 47|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ BrkSysCmdAxDiagFA : 46|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AxleTorqReqDiagFP : 45|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AxleTorqReqDiagFA : 44|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPDynPropDiagFP : 43|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPDynPropDiagFA : 42|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ TCPHiThrtCJLFA : 41|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumFusCyclsFP : 40|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ AutoBrkTypeDiagFP : 39|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumFusCyclsFA : 38|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatVelDiagFP : 37|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatVelDiagFA : 36|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatPstnDiagFP : 35|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLatPstnDiagFA : 34|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumCycDiagFP : 33|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNumCycDiagFA : 32|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRltvLnDiagFP : 31|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFRltvLnDiagFA : 30|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFConfDiagFP : 29|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFConfDiagFA : 28|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonVelAccRatFP : 27|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonVelAccRatFA : 26|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPstnVelRatFP : 25|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPstnVelRatFA : 24|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNrRltvLonPstnFP : 23|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFNrRltvLonPstnFA : 22|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPosVelAccFP : 21|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ FOFLonPosVelAccFA : 20|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISOvrlpRtlChk_FA : 19|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRROvrlpRtlChk_FA : 18|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFOvrlpRtlChk_FA : 17|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFOvrlpRtlChk_FA : 16|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISAlign_FA : 15|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISFrshns_FA : 14|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISSnsr_FP : 13|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ VISSnsr_FA : 12|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRAlign_FA : 11|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRFrshns_FA : 10|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRSnsr_FP : 9|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ LRRSnsr_FA : 8|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRAlign_FA : 7|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRFrehns_FA : 6|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRSnsr_FP : 5|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ IRFSRRSnsr_FA : 4|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRAlign_FA : 3|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRFrshns_FA : 2|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRSnsr_FP : 1|1@0+ (1,0) [0|1] "" Dummy_FO
+ SG_ ILFSRRSnsr_FA : 0|1@0+ (1,0) [0|1] "" Dummy_FO
+
+BO_ 1787 AL_Test_Tool_Rsp_RFSRR: 8 RFSRR_FO
+ SG_ RFSRREngRspDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Dummy_FO
+
+BO_ 1788 AL_Test_Tool_Rsp_LFSRR: 8 LFSRR_FO
+ SG_ LFSRREngRspDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Dummy_FO
+
+BO_ 1790 AL_Test_Tool_Req_RFSRR: 8 Dummy_FO
+ SG_ RFSRREngCmdDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RFSRR_FO
+
+BO_ 1791 AL_Test_Tool_Req_LFSRR: 8 Dummy_FO
+ SG_ LFSRREngCmdDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LFSRR_FO
+
+BO_ 1786 AL_Test_Tool_Rsp_RSRR: 8 RSRR_FO
+ SG_ RSRREngRspDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Dummy_FO
+
+BO_ 1789 AL_Test_Tool_Req_RSRR: 8 Dummy_FO
+ SG_ RSRREngCmdDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RSRR_FO
+
+BO_ 1149 F_LRR_Azmth_Rate_Info_4: 8 LRR_FO
+ SG_ FLRRTrk20AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk19AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk18AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk17AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk16AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRAzRtInf4BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1148 F_LRR_Azmth_Rate_Info_3: 8 LRR_FO
+ SG_ FLRRTrk15AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk14AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk13AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk12AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk11AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRAzRtInf3BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1147 F_LRR_Azmth_Rate_Info_2: 8 LRR_FO
+ SG_ FLRRTrk9AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk8AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk7AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk6AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk10AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRAzRtInf2BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1146 F_LRR_Azmth_Rate_Info_1: 8 LRR_FO
+ SG_ FLRRTrk5AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk4AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk3AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk2AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRTrk1AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FLRRAzRtInf1BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1143 Long_Range_Radar_add_Info_3: 8 LRR_FO
+ SG_ FLRRAddInfo3BurstID : 57|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk13ObstType : 60|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk20ObstTypeConf : 52|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk20ObstType : 55|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk19ObstTypeConf : 44|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk19ObstType : 47|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk18ObstTypeConf : 36|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk18ObstType : 39|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk17ObstTypeConf : 28|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk17ObstType : 31|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk16ObstTypeConf : 20|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk16ObstType : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk15ObstTypeConf : 12|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk15ObstType : 15|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk14ObstTypeConf : 4|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk14ObstType : 7|3@0+ (1,0) [0|7] "" EOCM_F_FO
+
+BO_ 1142 Long_Range_Radar_add_Info_2: 8 LRR_FO
+ SG_ FLRRAddInfo2BurstID : 62|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRTrk13ObstTypeConf : 60|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk12ObstTypeConf : 52|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk12ObstType : 55|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk11ObstTypeConf : 44|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk11ObstType : 47|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk10ObstTypeConf : 36|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk10ObstType : 39|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk9ObstTypeConf : 28|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk9ObstType : 31|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk8ObstTypeConf : 20|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk8ObstType : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk7ObstTypeConf : 12|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk7ObstType : 15|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRTrk1ObstTypeConf : 4|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO
+ SG_ FLRRTrk1ObstType : 7|3@0+ (1,0) [0|7] "" EOCM_F_FO
+
+BO_ 851 F_Vision_Environment_4: 8 VIS_FO
+ SG_ LnMrkg3LnPrvwDst : 45|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTtlNmLnMrkgDetRt : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsRtLinCrsTm : 25|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsNumPrlLnsDetRt : 33|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsNumPrlLnsDetLt : 36|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntLftV : 31|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtLinCrsTm : 30|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnPrvwDst : 50|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMrkgTypChgDst : 40|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMrkgWdth : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMarkrElvtd : 51|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4AnchrLnLin : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMrkgWdth : 41|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMarkrElvtd : 46|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3AnchrLnLin : 52|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstID2 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntLft : 15|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 597 USDT_Req_to_VIS2_FO: 8 TestTool_FO
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" CIPM_FO,VIS2_FO
+
+BO_ 1204 RR_SRR_Object_Track4: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1203 RR_SRR_Object_Track3: 8 RRSRR_FO
+ SG_ RRSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+ SG_ RRSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1202 RR_SRR_Object_Track2: 8 RRSRR_FO
+ SG_ RRSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+
+BO_ 1201 RR_SRR_Object_Track1: 8 RRSRR_FO
+ SG_ RRSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO
+ SG_ RRSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO
+ SG_ RRSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO
+ SG_ RRSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO
+ SG_ RRSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ RRSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO
+
+BO_ 1200 RR_SRR_Object_Header: 8 RRSRR_FO
+ SG_ RRSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "" EOCM_F_FO
+ SG_ RRSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ RRSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ RRSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ RRSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ RRSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+
+BO_ 850 F_Vision_Environment_3: 8 VIS_FO
+ SG_ LnSnsTtlNmLnMrkgDetLt : 58|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtLnMrkgWdth : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtLnMrkgTypChgDst : 62|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnLftV : 23|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnLft : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrLftV : 15|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrLft : 39|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrTypRght : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrTypLft : 53|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrElvtdRght : 54|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrElvtdLft : 55|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstID1 : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnQltyCnfdncLvlRght : 22|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnQltyCnfdncLvlLft : 14|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnPrvwDstncRght : 2|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnPrvwDstncLft : 5|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 1414 RVB_TVR_Debug2_FO: 7 EOCM_F_FO
+ SG_ VBBrkCntlAccel : 45|12@0- (0.01,0) [-20.48|20.47] "m/s^2" Dummy_FO
+ SG_ VBTOSObjID : 35|6@0+ (1,0) [0|63] "" Dummy_FO
+ SG_ VBTOSTTC : 31|12@0+ (0.025,0) [0|102.375] "s" Dummy_FO
+ SG_ VBTOSLatPstn : 11|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO
+ SG_ VBTOSLonPstn : 7|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO
+
diff --git a/iqdbc_repo/iqdbc/dbc/cadillac_ct6_powertrain.dbc b/iqdbc_repo/iqdbc/dbc/cadillac_ct6_powertrain.dbc
new file mode 100644
index 000000000..2d0bb1217
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/cadillac_ct6_powertrain.dbc
@@ -0,0 +1,248 @@
+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_: K16_BECM K73_TCIC K9_BCM K43_PSCM K17_EBCM K20_ECM K114B_HPCM NEO K124_ASCM
+VAL_TABLE_ TurnSignals 2 "Right Turn" 1 "Left Turn" 0 "None" ;
+VAL_TABLE_ ACCLeadCar 1 "Present" 0 "Not Present" ;
+VAL_TABLE_ ACCCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ BrakePedalPressed 1 "Pressed" 0 "Depressed" ;
+VAL_TABLE_ DistanceButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ LKAButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_TABLE_ PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ;
+VAL_TABLE_ DoorStatus 1 "Opened" 0 "Closed" ;
+VAL_TABLE_ SeatBeltStatus 1 "Latched" 0 "Unlatched" ;
+VAL_TABLE_ LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ;
+VAL_TABLE_ GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ;
+VAL_TABLE_ GasRegenCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HandsOffSWDetectionStatus 1 "Hands On" 0 "Hands Off" ;
+VAL_TABLE_ HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ;
+
+
+BO_ 717 ASCM_2CD: 5 K124_ASCM
+
+BO_ 869 ASCM_365: 4 K124_ASCM
+
+BO_ 1034 ASCM_40A: 7 K124_ASCM
+
+BO_ 1296 ASCM_510: 4 K124_ASCM
+
+BO_ 1930 ASCM_78A: 7 K124_ASCM
+
+BO_ 190 ECMAcceleratorPos: 6 K20_ECM
+ SG_ BrakePedalPos : 15|8@0+ (1,0) [0|0] "sticky" NEO
+ SG_ GasPedalAndAcc : 23|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 201 ECMEngineStatus: 8 K20_ECM
+ SG_ EngineTPS : 39|8@0+ (0.392156863,0) [0|100.000000065] "%" NEO
+ SG_ EngineRPM : 15|16@0+ (0.25,0) [0|0] "RPM" NEO
+
+BO_ 209 EBCMBrakePedalSensors: 7 K17_EBCM
+ SG_ Counter1 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ Counter2 : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ BrakePedalPosition1 : 5|14@0+ (1,0) [0|16383] "" XXX
+ SG_ BrakePedalPosition2 : 21|14@0- (-1,0) [0|16383] "" XXX
+ SG_ BrakeNormalized1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BrakeNormalized2 : 47|8@0- (-1,0) [0|255] "" XXX
+
+BO_ 241 EBCMBrakePedalPosition: 6 K17_EBCM
+ SG_ BrakePedalPosition : 15|8@0+ (1,0) [0|255] "" NEO
+
+BO_ 298 BCMDoorBeltStatus: 8 K9_BCM
+ SG_ RearLeftDoor : 8|1@0+ (1,0) [0|0] "" NEO
+ SG_ FrontLeftDoor : 9|1@0+ (1,0) [0|0] "" NEO
+ SG_ FrontRightDoor : 10|1@0+ (1,0) [0|0] "" NEO
+ SG_ RearRightDoor : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ LeftSeatBelt : 12|1@0+ (1,0) [0|0] "" NEO
+ SG_ RightSeatBelt : 53|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 309 ECMPRDNL: 8 K20_ECM
+ SG_ PRNDL : 2|3@0+ (1,0) [0|0] "" NEO
+
+BO_ 320 BCMTurnSignals: 3 K9_BCM
+ SG_ TurnSignals : 19|2@0+ (1,0) [0|0] "" NEO
+
+BO_ 336 ASCMLKASStatus: 1 NEO
+ SG_ Available : 7|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 338 ASCMLKASteeringCmd: 6 NEO
+ SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO
+ SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO
+ SG_ LKASMode : 36|2@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO
+
+BO_ 340 ASCMBLKASteeringCmd: 6 NEO
+ SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO
+ SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO
+ SG_ LKASMode : 36|2@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO
+
+BO_ 381 MSG_17D: 8 K20_ECM
+ SG_ MSG17D_AccPower : 35|12@0- (1,0) [0|0] "" NEO
+
+BO_ 356 PSCMStatus: 8 K43_PSCM
+ SG_ LKATorqueDeliveredStatus : 7|3@0+ (1,0) [0|7] "" NEO
+ SG_ LKADriverAppldTrq : 2|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO
+ SG_ LKATBDTorque : 21|14@0- (-0.005,0) [-10.24|10.23] "Nm" NEO
+ SG_ RollingCounter : 39|2@0+ (1,0) [0|0] "" NEO
+ SG_ LKATotalTorqueDelivered : 37|14@0- (0.01,0) [-10.24|10.23] "Nm" NEO
+
+BO_ 417 AcceleratorPedal: 7 XXX
+ SG_ AcceleratorPedal : 55|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 451 GasAndAcc: 8 XXX
+ SG_ GasPedalAndAcc2 : 55|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 452 AcceleratorPedal2: 8 XXX
+ SG_ AcceleratorPedal2 : 47|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 481 ASCMSteeringButton: 7 K124_ASCM
+ SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO
+
+BO_ 485 PSCMSteeringAngle: 8 K43_PSCM
+ SG_ SteeringWheelAngle : 15|16@0- (0.0625,0) [-2047|2047] "deg" NEO
+ SG_ SteeringWheelRate : 27|12@0- (1,0) [-2047|2047] "deg/s" NEO
+
+BO_ 489 EBCMVehicleDynamic: 8 K17_EBCM
+ SG_ YawRate : 51|12@0- (0.0625,0) [-2047|2047] "grad/s" NEO
+ SG_ LateralAcceleration : 3|12@0- (0.0161,0) [-2047|2047] "m/s2" NEO
+ SG_ BrakePedalPressed : 6|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM
+ SG_ HVBatteryVoltage : 31|12@0+ (0.125,0) [0|511.875] "V" NEO
+ SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO
+
+BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM
+ SG_ GasRegenAlwaysOne : 9|1@0+ (1,1) [1|1] "" NEO
+ SG_ GasRegenAlwaysThree : 15|2@0+ (1,1) [1|1] "" NEO
+ SG_ GasRegenChecksum : 47|24@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenCmdActiveInv : 32|1@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO
+ SG_ RollingCounter2 : 36|4@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenAlwaysOne2 : 23|1@0+ (1,0) [0|1] "" NEO
+ SG_ GasRegenCmd : 22|15@0+ (1,0) [0|0] "" NEO
+
+BO_ 810 TCICOnStarGPSPosition: 8 K73_TCIC
+ SG_ GPSLongitude : 39|32@0+ (1,-2147483648) [0|0] "milliarcsecond" NEO
+ SG_ GPSLatitude : 7|32@0+ (1,0) [0|0] "milliarcsecond" NEO
+
+BO_ 840 EBCMWheelSpdFront: 4 K17_EBCM
+ SG_ FLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ FRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO
+
+BO_ 842 EBCMWheelSpdRear: 4 K17_EBCM
+ SG_ RLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ RRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO
+
+BO_ 880 ASCMActiveCruiseControlStatus: 6 K124_ASCM
+ SG_ ACCLeadCar : 44|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCAlwaysOne2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCAlwaysOne : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCSpeedSetpoint : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" NEO
+ SG_ ACCGapLevel : 21|2@0+ (1,0) [0|0] "" NEO
+ SG_ ACCResumeButton : 1|1@0+ (1,0) [0|0] "" NEO
+ SG_ ACCCmdActive : 23|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 1001 ECMVehicleSpeed: 8 K20_ECM
+ SG_ VehicleSpeed : 7|16@0+ (0.01,0) [0|0] "mph" NEO
+
+BO_ 1033 ASCMKeepAlive: 7 NEO
+ SG_ ASCMKeepAliveAllZero : 7|56@0+ (1,0) [0|0] "" NEO
+
+BO_ 1217 ECMEngineCoolantTemp: 8 K20_ECM
+ SG_ EngineCoolantTemp : 23|8@0+ (1,-40) [0|0] "C" NEO
+
+BO_ 1249 VIN_Part2: 8 K20_ECM
+ SG_ VINPart2 : 7|64@0+ (1,0) [0|0] "" NEO
+
+BO_ 1300 VIN_Part1: 8 K20_ECM
+ SG_ VINPart1 : 7|64@0+ (1,0) [0|0] "" NEO
+
+BO_ 1912 PSCM_778: 8 K43_PSCM
+
+BO_TX_BU_ 338 : K124_ASCM,NEO;
+BO_TX_BU_ 880 : NEO,K124_ASCM;
+BO_TX_BU_ 1033 : K124_ASCM,NEO;
+BO_TX_BU_ 715 : NEO,K124_ASCM;
+
+
+CM_ BU_ K16_BECM "Battery Energy Control Module";
+CM_ BU_ K73_TCIC "Telematics Communication Control Module";
+CM_ BU_ K9_BCM "Body Control Module";
+CM_ BU_ K43_PSCM "Power Steering Control Module";
+CM_ BU_ K17_EBCM "Electronic Brake Control Module";
+CM_ BU_ K20_ECM "Engine Control Module";
+CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module";
+CM_ BU_ NEO "Comma NEO";
+CM_ BU_ K124_ASCM "Active Safety Control Module";
+CM_ SG_ 381 MSG17D_AccPower "Need to investigate";
+CM_ SG_ 190 GasPedalAndAcc "ACC baseline is 62";
+CM_ SG_ 451 GasPedalAndAcc2 "ACC baseline is 62";
+CM_ SG_ 715 RollingCounter2 "Values cycle between 0, 7, 10, 13";
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+BA_ "UseGMParameterIDs" 0;
+VAL_ 481 DistanceButton 1 "Active" 0 "Inactive" ;
+VAL_ 481 LKAButton 1 "Active" 0 "Inactive" ;
+VAL_ 481 ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_ 309 PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ;
+VAL_ 338 LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 338 LKASMode 2 "supercruise" 1 "lkas" 0 "Inactive" ;
+VAL_ 880 ACCLeadCar 1 "Present" 0 "Not Present" ;
+VAL_ 880 ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ;
+VAL_ 880 ACCResumeButton 1 "Pressed" 0 "Depressed" ;
+VAL_ 880 ACCCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 356 LKATorqueDeliveredStatus 7 "Override Fault" 6 "LKAS Fault but Responsive" 5 "TBD but Responsive" 4 "TBD but Responsive" 3 "Fault" 1 "Active" 0 "Inactive" ;
+VAL_ 489 BrakePedalPressed 1 "Pressed" 0 "Depressed" ;
+VAL_ 715 GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ;
+VAL_ 715 GasRegenCmdActive 1 "Active" 0 "Inactive" ;
diff --git a/iqdbc_repo/iqdbc/dbc/chrysler_cusw.dbc b/iqdbc_repo/iqdbc/dbc/chrysler_cusw.dbc
new file mode 100644
index 000000000..880f6e725
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/chrysler_cusw.dbc
@@ -0,0 +1,192 @@
+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
+
+
+BO_ 492 EPS_STATUS: 8 XXX
+ SG_ TORQUE_DRIVER : 3|12@0+ (1,-1024) [0|2048] "Nm" XXX
+ SG_ LKAS_STATE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_FAULT : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_HIGH_TORQUE : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ TORQUE_MOTOR : 27|12@0+ (1,-2048) [0|1] "" XXX
+ SG_ LAT_TORQUE_REQUEST : 47|12@0+ (1,-2048) [0|4095] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1250 DOORS: 8 XXX
+ SG_ DOOR_OPEN_FL : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRUNK : 14|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1262 GEAR: 8 XXX
+ SG_ PRNDL : 11|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 875 SEATBELT_STATUS: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 16|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1264 STEERING_LEVERS: 7 XXX
+ SG_ TURN_SIGNALS : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGH_BEAM_FLASH : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 480 TRACTION_BUTTON: 8 XXX
+ SG_ TRACTION_OFF : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 740 WHEEL_SPEEDS_REAR: 8 XXX
+ SG_ WHEEL_SPEED_RL : 5|13@0+ (0.0087,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 20|13@0+ (0.0087,0) [0|1] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 520 EPS_STATUS_2: 7 XXX
+ SG_ NEW_SIGNAL_1 : 3|12@0+ (1,-2048) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 19|12@0+ (1,-2048) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 43|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 494 STEERING: 6 XXX
+ SG_ STEER_ANGLE : 5|14@0+ (0.1,-720) [0|1] "deg" XXX
+ SG_ STEERING_RATE : 19|12@0+ (1,-2000) [0|1] "" XXX
+ SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 738 BRAKE_2: 8 XXX
+ SG_ BRAKE_TORQUE : 7|12@0+ (1,0) [0|15] "" XXX
+ SG_ BRAKE_LIGHTS : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HUMAN : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 742 WHEEL_SPEEDS_FRONT: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|13@0+ (0.0087,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_FR : 20|13@0+ (0.0087,0) [0|1] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 502 LKAS_COMMAND: 4 XXX
+ SG_ STEERING_TORQUE : 7|11@0+ (1,-1024) [0|4087] "" XXX
+ SG_ LKAS_CONTROL_BIT : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 31|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1498 LKAS_1: 2 XXX
+
+BO_ 1500 DAS_6: 4 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_0XAC : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1508 LKAS_HEARTBIT: 8 XXX
+ SG_ LKAS_STATUS_OK : 28|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 762 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Accel : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Decel : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_OnOff : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 484 BRAKE_1: 8 XXX
+ SG_ BRAKE_PSI : 7|12@0+ (1,0) [0|1] "" XXX
+ SG_ VEHICLE_SPEED : 35|12@0+ (0.0174,0) [0|4095] "m/s" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 500 GEARBOX_1: 7 XXX
+ SG_ DESIRED_GEAR : 35|4@0+ (1,0) [0|1] "" XXX
+ SG_ ACTUAL_GEAR : 39|4@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 43|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 510 ACCEL_GAS: 5 XXX
+ SG_ ACC_ACTIVE : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_HUMAN : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_ACC : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 490 DASHBOARD: 4 XXX
+ SG_ ACC_SPEED_CONFIG_KPH : 7|8@0+ (0.1625,0) [0|1] "m/s" XXX
+
+BO_ 1006 ACC_HUD: 7 XXX
+ SG_ ACC_STATE : 7|3@0+ (1,0) [0|15] "" XXX
+ SG_ ACC_SET_SPEED_KMH : 14|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ DISTANCE_SETTING : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ DISTANCE_TO_LEAD : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 748 ACC_CONTROL: 8 XXX
+ SG_ ACC_MAIN_ON : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_VALUE : 13|10@0+ (1,0) [0|1023] "" XXX
+ SG_ GAS_VALID : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_VALUE : 28|10@0+ (1,0) [0|1023] "" XXX
+ SG_ BRAKE_VALID : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN_1 : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN_2 : 46|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 496 CLUSTER_1: 8 XXX
+ SG_ TACHOMETER : 3|12@0+ (1.024,0) [0|3] "" XXX
+ SG_ SPEEDOMETER : 19|12@0+ (0.01065,0) [0|1] "m/s" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+
+
+CM_ SG_ 1250 TRUNK "1 = open, 0 = closed";
+CM_ SG_ 1250 DOOR_OPEN_FL "1 = open, 0 = closed";
+CM_ SG_ 1250 DOOR_OPEN_FR "1 = open, 0 = closed";
+CM_ SG_ 1250 DOOR_OPEN_RL "1 = open, 0 = closed";
+CM_ SG_ 1250 DOOR_OPEN_RR "1 = open, 0 = closed";
+CM_ SG_ 1262 PRNDL "1 = park, 2 = reverse, 3 = neutral, 4 = drive, 5 = sport (snicker... sport)";
+CM_ SG_ 875 SEATBELT_DRIVER_UNLATCHED "1 = unlatched, 0 = safety first";
+CM_ SG_ 1264 TURN_SIGNALS "0 = off, 1 = left blinker, 2 = right blinker";
+CM_ SG_ 480 TRACTION_OFF "0 = TCS on, 1 = TCS off (light on dash ON)";
+CM_ SG_ 1500 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 1492 LEAD_CAR "lead car present = 4, no car = 2 ";
+CM_ SG_ 498 ACC_STATUS_2 "1 no ACC, 3 icpno ";
+CM_ SG_ 498 ACC_STATUS_1 "0x00 = acc off, 0x03 = acc on, green, 0x02 acc on, white";
+CM_ SG_ 1006 ACC_STATE "0 = ACC off, 6 = ACC active (white), 8 = ACC engaged (green)";
+CM_ SG_ 502 LKAS_STATE "2 = active (green), 1 = error";
+CM_ SG_ 1006 ACC_SET_SPEED_KMH "min set appears to be 68 km/h, errors below 59 km/h ";
+VAL_ 1262 PRNDL 1 "P" 2 "R" 3 "N" 4 "D" 5 "S";
diff --git a/iqdbc_repo/iqdbc/dbc/chrysler_pacifica_2017_hybrid_generated.dbc b/iqdbc_repo/iqdbc/dbc/chrysler_pacifica_2017_hybrid_generated.dbc
new file mode 100644
index 000000000..3f035ddc2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/chrysler_pacifica_2017_hybrid_generated.dbc
@@ -0,0 +1,369 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _stellantis_common.dbc starts here";
+BO_ 258 STEERING: 8 XXX
+ SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX
+ SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX
+ SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 264 ECM_1: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 280 ECM_TRQ: 8 XXX
+ SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+ SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+
+BO_ 284 ESP_8: 8 XXX
+ SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 288 ECM_2: 7 XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 320 ESP_1: 8 XXX
+ SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX
+ SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX
+ SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 268 ESP_2: 8 ESC
+ SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 344 ESP_6: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 368 Transmission_Status: 8 XXX
+ SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 464 ORC_1: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 500 DAS_3: 8 XXX
+ SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX
+ SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 501 DAS_4: 8 XXX
+ SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX
+ SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX
+ SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 544 EPS_2: 8 XXX
+ SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX
+ SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX
+ SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 559 ECM_5: 8 XXX
+ SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 571 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 625 DAS_5: 8 XXX
+ SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX
+ SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX
+ SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 669 EPB_1: 3 XXX
+ SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 678 DAS_6: 8 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 720 BSM_1: 6 XXX
+ SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 792 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 820 BCM_1: 8 XXX
+ SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE"
+VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ;
+VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ;
+
+CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision";
+CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque";
+CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
+
+CM_ "chrysler_pacifica_2017_hybrid.dbc starts here";
+
+BO_ 514 SPEED_1: 8 XXX
+ SG_ SPEED_LEFT : 7|12@0+ (0.071028,0) [0|65535] "m/s" XXX
+ SG_ SPEED_RIGHT : 23|12@0+ (0.071028,0) [0|1023] "m/s" XXX
+
+BO_ 653 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|4] "" XXX
+
+BO_ 746 GEAR: 5 XXX
+ SG_ PRNDL : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ GEAR_CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 31|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 736 TRIP: 8 XXX
+ SG_ COUNTER : 7|16@0+ (1,0) [0|65535] "Meters" XXX
+ SG_ COUNTER_2 : 23|16@0+ (1,0) [0|65535] "Meters" XXX
+
+BO_ 658 LKAS_COMMAND: 6 XXX
+ SG_ COUNTER : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEERING_TORQUE : 2|11@0+ (1,-1024) [0|1] "" XXX
+ SG_ LKAS_CONTROL_BIT : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 705 AUTO_PARK_BUTTON: 8 XXX
+ SG_ AUTO_PARK_TOGGLE_2 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_TOGGLE_1 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ INCREASING_UNKNOWN : 38|7@0+ (1,0) [0|15] "" XXX
+
+BO_ 719 AUTO_PARK_SIGNALS_1: 8 XXX
+ SG_ AUTO_PARK_UNKNOWN_1 : 7|16@0+ (1,0) [0|31] "" XXX
+
+BO_ 671 AUTO_PARK_REQUEST: 8 XXX
+ SG_ AUTO_PARK_CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_PARK_STATUS : 7|5@0+ (1,0) [0|15] "" XXX
+ SG_ AUTO_PARK_COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ AUTO_PARK_MODE : 22|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_PARK_CMD : 2|11@0+ (1,-1024) [0|1] "NM" XXX
+
+BO_ 784 AUTO_PARK_LESS_INTERESTING: 8 XXX
+ SG_ INCREASING_UNKNOWN : 55|8@0+ (1,0) [0|7] "" XXX
+ SG_ AUTO_PARK_PERPENDICULAR_2 : 61|1@0+ (1,0) [0|255] "" XXX
+
+BO_ 826 AUTO_PARK_SIGNALS_3: 8 XXX
+ SG_ AUTO_PARK_HAS_CONTROL_3 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUMAN_HAS_CONTROL : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_GEAR_1 : 27|4@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_PARK_GEAR_2 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ AUTO_PARK_GEAR_3 : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 332 STEERING_2: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ ENERGY_RELATED : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ STEER_ANGLE_2 : 7|13@0+ (0.3187251,-1307.888) [-360|360] "deg" XXX
+
+BO_ 331 BRAKE_3: 8 XXX
+ SG_ BRAKE_RELATED_3 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 608 PARKSENSE_SIGNAL: 8 XXX
+ SG_ PARKSENSE_DISABLED : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ IN_REVERSE : 10|1@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_1 : 16|1@0+ (1,0) [0|255] "" XXX
+ SG_ HUMAN_HAS_CONTROL : 17|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 729 LKAS_HEARTBIT: 5 XXX
+ SG_ LKAS_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_1 : 7|24@0+ (1,0) [0|255] "" XXX
+ SG_ FORWARD_2 : 30|6@0+ (1,0) [0|127] "" XXX
+ SG_ FORWARD_3 : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 257 ACCEL_RELATED_101: 5 XXX
+ SG_ ENERGY_OR_RPM : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 825 AUDIBLE_BEEP_339: 2 XXX
+ SG_ BEEP_339 : 7|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 168 ACCEL_RELATED_a8: 8 XXX
+ SG_ ACCEL_RELATED : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 270 ACCEL_RELATED_10e: 8 XXX
+ SG_ ACCEL_OR_RPM : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ ELECTRIC_MOTOR : 23|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 291 ENERGY_RELATED_123: 8 XXX
+ SG_ ENERGY_GAIN_LOSS : 18|11@0- (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ ENERGY_SMOOTHER_CURVE : 35|12@0+ (1,0) [0|2047] "" XXX
+
+BO_ 294 ENERGY_RELATED_126: 8 XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_126_1 : 3|12@0+ (1,0) [0|4095] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ UNKNOWN_126_2 : 35|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ENERGY_GAIN_LOSS_NOISY : 19|12@0+ (1,0) [0|2047] "" XXX
+
+BO_ 308 ACCEL_GAS_134: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ ACCEL_134 : 46|7@0+ (1,0) [0|127] "" XXX
+
+BO_ 532 ENERGY_RELATED_214: 8 XXX
+ SG_ NOISY_SLOWLY_DECREASING : 19|12@0+ (1,0) [0|255] "" XXX
+ SG_ ENERGY_RELATED : 0|9@0+ (1,0) [0|255] "" XXX
+
+BO_ 655 CHARGING_MAYBE_28F: 8 XXX
+ SG_ CHARGING : 1|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 660 BRAKE_RELATED_294: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PERHAPS_294 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 764 ACCEL_RELATED_2FC: 8 XXX
+ SG_ ACCEL_2FC : 13|6@0+ (1,0) [0|255] "" XXX
+
+BO_ 816 TRACTION_BUTTON: 8 XXX
+ SG_ TRACTION_OFF : 19|1@0+ (1,0) [0|3] "" XXX
+ SG_ TOGGLE_PARKSENSE : 52|1@0+ (1,0) [0|3] "" XXX
+ SG_ TOGGLE_LKAS : 53|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 878 ACCEL_RELATED_36E: 8 XXX
+ SG_ ACCEL_OR_RPM_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ACCEL_OR_RPM_1 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 324 SPEED_2: 8 XXX
+ SG_ SPEED_2 : 31|16@0+ (0.01,0) [0|255] "m/s" XXX
+
+BO_ 832 UNKNOWN_340: 8 XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+
+CM_ SG_ 653 BRAKE_PRESSURE "max seems to be 148";
+CM_ SG_ 746 PRNDL "5=L, 4=D, 3=N, 2=R, 1=P";
+CM_ SG_ 320 BRAKE_PRESSED_2 "Value is 5 when brake is pressed by human, 1 when ACC brake";
+CM_ SG_ 320 BRAKE_PRESSED_ACC "set when ACC brakes";
+CM_ SG_ 792 TURN_SIGNALS "1=Left, 2=Right";
+CM_ SG_ 264 ACCEL_PEDAL "not in ACC so seems to be actual pedal. Use for gasPressed";
+CM_ SG_ 544 LKAS_STATE "2 when autopark has control, 8 when is actuatable by lkas, 4 when there is a fault";
+CM_ SG_ 658 LKAS_STEERING_TORQUE "Most sent by stock system is 1024+-230. + is left. typically changes by 2 or 3 each 0.01s";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 705 AUTO_PARK_TOGGLE_1 "set briefly when turning on or off self-parking";
+CM_ SG_ 671 AUTO_PARK_CMD "Request Appears to be in NM";
+CM_ SG_ 671 AUTO_PARK_STATUS "1 = IDLE / NO REQUEST 9 = START REQUEST 10 = REQUEST MODE 11 = REQUEST MODE";
+CM_ SG_ 826 AUTO_PARK_GEAR_1 "Reverse=0, Forward=f";
+CM_ SG_ 826 AUTO_PARK_GEAR_2 "Reverse=0, Forward=f";
+CM_ SG_ 826 AUTO_PARK_GEAR_3 "Reverse=0, Forward=f";
+CM_ SG_ 332 STEER_ANGLE_2 "slightly lags the other steer_angle signal. also more noisy.";
+CM_ SG_ 608 PARKSENSE_DISABLED "set if parksense is disabled";
+CM_ SG_ 729 LKAS_STATUS_OK "Set to 0x0820 when LKAS system is plugged in.";
+CM_ SG_ 825 BEEP_339 "sent every 0.5s. 0050 is no beep. To beep send 4355 or 4155. Used by ParkSense warning.";
+CM_ SG_ 270 ELECTRIC_MOTOR "0x7fff indicates electric motor not in use";
+CM_ SG_ 291 ENERGY_GAIN_LOSS "unsure what this actually is";
+CM_ SG_ 291 ENERGY_SMOOTHER_CURVE "unsure what it is, but smoother";
+CM_ SG_ 308 ACCEL_134 "only set when human presses accel pedal";
+CM_ SG_ 532 NOISY_SLOWLY_DECREASING "perhaps battery but do not know";
+CM_ SG_ 816 TRACTION_OFF "set when traction off button is enabled";
+CM_ SG_ 816 TOGGLE_PARKSENSE "sending 3000071ec0ff9000 enables or disables parksense";
+CM_ SG_ 324 SPEED_2 "signal is approx half other speeds";
+CM_ SG_ 501 ACC_SPEED_CONFIG_KPH "speed configured for ACC";
+CM_ SG_ 501 ACC_SPEED_CONFIG_MPH "speed configured for ACC";
+CM_ SG_ 501 CRUISE_STATE "may just be an icon, but seems to indicate different cruise modes: ACC and Non-ACC and engaged state for both.";
+CM_ SG_ 625 SPEED "zero on non-acc drives";
+
+VAL_ 501 CRUISE_STATE 0 "Off" 1 "CC On" 2 "CC Engaged" 3 "ACC On" 4 "ACC Engaged";
+VAL_ 746 PRNDL 5 "L" 4 "D" 3 "N" 2 "R" 1 "P";
+VAL_ 792 TURN_SIGNALS 2 "Right" 1 "Left";
diff --git a/iqdbc_repo/iqdbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc b/iqdbc_repo/iqdbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc
new file mode 100644
index 000000000..07c37e1fa
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc
@@ -0,0 +1,230 @@
+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
+
+
+BO_ 544 a_1: 8 XXX
+ SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX
+ SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX
+ SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX
+ SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 576 b_1: 8 XXX
+ SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 608 a_2: 8 XXX
+ SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX
+ SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX
+ SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX
+ SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 640 b_2: 8 XXX
+ SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 644 a_3: 8 XXX
+ SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX
+ SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX
+ SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX
+ SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 648 b_3: 8 XXX
+ SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 652 a_4: 8 XXX
+ SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX
+ SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX
+ SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX
+ SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 656 b_4: 8 XXX
+ SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX
+ SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 512 unknown_200: 8 XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ increasing : 31|16@0+ (1,0) [0|255] "" XXX
+ SG_ zeros_0 : 3|12@0+ (1,0) [0|63] "" XXX
+ SG_ zeros_1 : 47|12@0+ (1,0) [0|63] "" XXX
+ SG_ status0 : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ unknown_0 : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 514 unknown_202: 8 XXX
+ SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ sig3 : 31|8@0+ (1,0) [0|65535] "" XXX
+ SG_ increasing : 39|12@0+ (1,0) [0|15] "" XXX
+
+BO_ 706 c_1: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+
+BO_ 708 c_2: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 710 c_3: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 712 c_4: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 714 c_5: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 716 c_6: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 718 c_7: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 720 c_8: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 722 c_9: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 724 c_10: 8 XXX
+ SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX
+ SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 674 d_1: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 676 d_2: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 678 d_3: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 680 d_4: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 682 d_5: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 684 d_6: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 686 d_7: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 688 d_8: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 690 d_9: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 692 d_10: 8 XXX
+ SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX
+
+BO_ 672 NEW_MSG_5: 8 XXX
+ SG_ NEW_SIGNAL_1 : 9|10@0+ (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_2 : 45|10@0+ (1,0) [0|1023] "" XXX
+
+
+
+
+CM_ SG_ 544 track_id "for message a_1 track_id is always 1, similar for other messages and track_id";
+CM_ SG_ 544 REL_ACCEL "perhaps REL_ACCEL because it responds faster and before REL_SPEED";
+CM_ SG_ 544 sig2 "perhaps distance to object. LONG_DIST or REL_ACCEL or REL_SPEED";
+CM_ SG_ 576 zeros "not always zero, sometimes has value when another car changes lanes";
+CM_ SG_ 706 LAT_DIST "positive is to the right, negative is to the left";
diff --git a/iqdbc_repo/iqdbc/dbc/chrysler_ram_dt_generated.dbc b/iqdbc_repo/iqdbc/dbc/chrysler_ram_dt_generated.dbc
new file mode 100644
index 000000000..b7761e4a2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/chrysler_ram_dt_generated.dbc
@@ -0,0 +1,251 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _stellantis_common_ram_dt_generated.dbc starts here";
+CM_ "Generated from _stellantis_common.dbc"
+
+BO_ 35 STEERING: 8 XXX
+ SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX
+ SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX
+ SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 37 ECM_1: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 181 ECM_TRQ: 8 XXX
+ SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+ SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+
+BO_ 121 ESP_8: 8 XXX
+ SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 123 ECM_2: 7 XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 131 ESP_1: 8 XXX
+ SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX
+ SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX
+ SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 113 ESP_2: 8 ESC
+ SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 139 ESP_6: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 147 Transmission_Status: 8 XXX
+ SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 464 ORC_1: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 153 DAS_3: 8 XXX
+ SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX
+ SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 232 DAS_4: 8 XXX
+ SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX
+ SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX
+ SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 49 EPS_2: 8 XXX
+ SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX
+ SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX
+ SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 157 ECM_5: 8 XXX
+ SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 177 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 163 DAS_5: 8 XXX
+ SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX
+ SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX
+ SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 213 EPB_1: 3 XXX
+ SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 250 DAS_6: 8 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 720 BSM_1: 6 XXX
+ SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 792 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 657 BCM_1: 8 XXX
+ SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 131 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE"
+VAL_ 147 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ;
+VAL_ 213 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ;
+
+CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision";
+CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque";
+CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
+
+CM_ "chrysler_ram_dt.dbc starts here";
+
+BO_ 53 PCM_2: 8 XXX
+ SG_ ENG_TORQUE_REQ : 3|12@0+ (1,0) [0|7] "" XXX
+ SG_ ENG_TORQUE_OUT : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 133 TCM_1: 8 XXX
+ SG_ SHIFT_PENDING : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACTUAL_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DESIRED_GEAR : 15|4@0+ (1,0) [0|1] "" XXX
+ SG_ TC_LOCKED : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ OUTPUT_SPEED : 31|16@0+ (1,0) [0|65534] "rpm" XXX
+ SG_ INPUT_SPEED : 47|16@0+ (1,0) [0|65534] "rpm" XXX
+ SG_ OUTPUT_SPEED_SIGN : 57|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 135 ABS_2: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_BRAKE : 15|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 137 ESP_4: 8 XXX
+ SG_ Yaw_Rate : 7|16@0+ (0.01,-327.68) [-327.68|327.66] "deg/s" XXX
+ SG_ Acceleration : 32|8@1+ (0.08,-10.24) [-10.24|10.08] "m/s2" XXX
+
+BO_ 164 EPS_3: 8 XXX
+ SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 166 LKAS_COMMAND: 8 XXX
+ SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX
+ SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX
+ SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 221 Center_Stack_1: 8 XXX
+ SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 650 Center_Stack_2: 8 XXX
+ SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX
+
+
+CM_ SG_ 133 ACTUAL_GEAR "0xd = P, 0x1-8 = D (actual gear), 0xb = R or N?? TODO find R vs N";
+CM_ SG_ 153 ACC_Engaged "SENT BY FORWARD CAMERA 1 = ACTIVE, 3 = ENGAGED, 0 = DISENGAGED/OFF";
+CM_ SG_ 166 LKAS_CONTROL_BIT "0=IDLE, 1=HAS 2=LKAS 3=ABSD, 4=TJA, 7=SNA";
+CM_ SG_ 250 Auto_High_Beam "1 = HIGH BEAMS OK 0 = HIGH BEAMS OFF ";
+CM_ SG_ 250 LKAS_LANE_LINES "9 = LEFT CAUTION, 11 = VERY LEFT CAUTION 10 = RIGHT CAUTION, 14 = VERY RIGHT, 4 = NO LINES DETECTED, 3 = LINES DETECTED, SYSTEM ACTIVE";
+CM_ SG_ 464 Driver_Seatbelt_Status "1 unbuckled 0 buckled";
+CM_ SG_ 792 High_Beam_Lever_Status "1 is high beam, 0 reg";
diff --git a/iqdbc_repo/iqdbc/dbc/chrysler_ram_hd_generated.dbc b/iqdbc_repo/iqdbc/dbc/chrysler_ram_hd_generated.dbc
new file mode 100644
index 000000000..c7d540c48
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/chrysler_ram_hd_generated.dbc
@@ -0,0 +1,217 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _stellantis_common_ram_hd_generated.dbc starts here";
+CM_ "Generated from _stellantis_common.dbc"
+
+BO_ 258 STEERING: 8 XXX
+ SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX
+ SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX
+ SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 264 ECM_1: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 280 ECM_TRQ: 8 XXX
+ SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+ SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+
+BO_ 284 ESP_8: 8 XXX
+ SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 288 ECM_2: 7 XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 320 ESP_1: 8 XXX
+ SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX
+ SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX
+ SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 268 ESP_2: 8 ESC
+ SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 344 ESP_6: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 368 Transmission_Status: 8 XXX
+ SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 464 ORC_1: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 500 DAS_3: 8 XXX
+ SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX
+ SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 501 DAS_4: 8 XXX
+ SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX
+ SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX
+ SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 544 EPS_2: 8 XXX
+ SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX
+ SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX
+ SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 559 ECM_5: 8 XXX
+ SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 570 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 625 DAS_5: 8 XXX
+ SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX
+ SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX
+ SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 669 EPB_1: 3 XXX
+ SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 629 DAS_6: 8 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 720 BSM_1: 6 XXX
+ SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 792 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 820 BCM_1: 8 XXX
+ SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE"
+VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ;
+VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ;
+
+CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision";
+CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque";
+CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
+
+CM_ "chrysler_ram_hd.dbc starts here";
+
+BO_ 545 EPS_3: 8 XXX
+ SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 630 LKAS_COMMAND: 8 XXX
+ SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX
+ SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX
+ SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 816 Center_Stack_1: 8 XXX
+ SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 650 Center_Stack_2: 8 XXX
+ SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/comma_body.dbc b/iqdbc_repo/iqdbc/dbc/comma_body.dbc
new file mode 100644
index 000000000..2b89f3a74
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/comma_body.dbc
@@ -0,0 +1,89 @@
+VERSION "0.0.02"
+
+BO_ 513 MOTORS_DATA: 8 XXX
+ SG_ SPEED_L : 7|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ SPEED_R : 23|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ ELEC_ANGLE_L : 39|8@0+ (1,0) [0|0] "deprecated" XXX
+ SG_ ELEC_ANGLE_R : 47|8@0+ (1,0) [0|0] "deprecated" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 514 VAR_VALUES: 3 XXX
+ SG_ IGNITION : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENABLE_MOTORS : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ FAULT : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ MOTOR_ERR_L : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ MOTOR_ERR_R : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 515 BODY_DATA: 4 XXX
+ SG_ MCU_TEMP : 7|8@0+ (0.1,0) [0|125] "" XXX
+ SG_ BATT_VOLTAGE : 15|16@0+ (0.01,0) [0|60] "" XXX
+ SG_ BATT_PERCENTAGE : 31|7@0+ (1,0) [0|100] "" XXX
+ SG_ CHARGER_CONNECTED : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 516 MOTORS_CURRENT: 8 XXX
+ SG_ LEFT_PHA_AB : 7|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ LEFT_PHA_BC : 23|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ RIGHT_PHA_AB : 39|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ RIGHT_PHA_BC : 55|16@0- (1,0) [-32768|32767] "" XXX
+
+BO_ 517 MOTORS_ANGLE: 8 XXX
+ SG_ LEFT_ANGLE_SENSOR : 7|16@0+ (1,0) [0|16384] "" XXX
+ SG_ RIGHT_ANGLE_SENSOR : 23|16@0+ (1,0) [0|16384] "" XXX
+ SG_ LEFT_HALL_SENSOR : 39|16@0+ (1,0) [0|360] "" XXX
+ SG_ RIGHT_HALL_SENSOR : 55|16@0+ (1,0) [0|360] "" XXX
+
+BO_ 592 TORQUE_CMD: 6 XXX
+ SG_ TORQUE_L : 7|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ TORQUE_R : 23|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 593 MAX_MOTOR_RPM_CMD: 5 XXX
+ SG_ MAX_RPM_L : 7|16@0+ (1,0) [0|1000] "" XXX
+ SG_ MAX_RPM_R : 23|16@0+ (1,0) [0|1000] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 769 KNEE_MOTORS_DATA: 8 XXX
+ SG_ SPEED_L : 7|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ SPEED_R : 23|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ ELEC_ANGLE_L : 39|8@0+ (1,0) [0|0] "deprecated" XXX
+ SG_ ELEC_ANGLE_R : 47|8@0+ (1,0) [0|0] "deprecated" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 770 KNEE_VAR_VALUES: 3 XXX
+ SG_ IGNITION : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENABLE_MOTORS : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ FAULT : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ MOTOR_ERR_L : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ MOTOR_ERR_R : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 771 KNEE_DATA: 4 XXX
+ SG_ MCU_TEMP : 7|8@0+ (0.1,0) [0|125] "" XXX
+ SG_ BATT_VOLTAGE : 15|16@0+ (0.01,0) [0|60] "" XXX
+ SG_ BATT_PERCENTAGE : 31|7@0+ (1,0) [0|100] "" XXX
+ SG_ CHARGER_CONNECTED : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 772 KNEE_MOTORS_CURRENT: 8 XXX
+ SG_ LEFT_PHA_AB : 7|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ LEFT_PHA_BC : 23|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ RIGHT_PHA_AB : 39|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ RIGHT_PHA_BC : 55|16@0- (1,0) [-32768|32767] "" XXX
+
+BO_ 773 KNEE_MOTORS_ANGLE: 8 XXX
+ SG_ LEFT_ANGLE_SENSOR : 7|16@0+ (1,0) [0|16384] "" XXX
+ SG_ RIGHT_ANGLE_SENSOR : 23|16@0+ (1,0) [0|16384] "" XXX
+ SG_ LEFT_HALL_SENSOR : 39|16@0+ (1,0) [0|360] "" XXX
+ SG_ RIGHT_HALL_SENSOR : 55|16@0+ (1,0) [0|360] "" XXX
+
+BO_ 848 KNEE_TORQUE_CMD: 6 XXX
+ SG_ TORQUE_L : 7|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ TORQUE_R : 23|16@0- (1,0) [-1000|1000] "" XXX
+ SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 849 KNEE_MAX_MOTOR_RPM_CMD: 5 XXX
+ SG_ MAX_RPM_L : 7|16@0+ (1,0) [0|1000] "" XXX
+ SG_ MAX_RPM_R : 23|16@0+ (1,0) [0|1000] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/fca_giorgio.dbc b/iqdbc_repo/iqdbc/dbc/fca_giorgio.dbc
new file mode 100644
index 000000000..f3e22cf41
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/fca_giorgio.dbc
@@ -0,0 +1,243 @@
+BO_ 171 NEW_MSG_AB: 8 XXX
+ SG_ NEW_SIGNAL_5 : 3|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_6 : 21|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_1 : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 51|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 222 EPS_1: 6 EPS
+ SG_ STEERING_ANGLE : 5|14@0+ (0.1,-716.8) [0|16383] "deg" XXX
+ SG_ STEERING_RATE : 19|12@0+ (0.5,-1000) [0|4095] "deg/s" XXX
+ SG_ UNKNOWN_1 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 228 NEW_MSG_E4: 6 XXX
+ SG_ NEW_SIGNAL_1 : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 238 ABS_1: 8 ABS
+ SG_ WHEEL_SPEED_FL : 7|13@0+ (0.017,0) [0|8191] "m/s" XXX
+ SG_ WHEEL_SPEED_FR : 10|13@0+ (0.017,0) [0|8191] "m/s" XXX
+ SG_ WHEEL_SPEED_RL : 29|13@0+ (0.017,0) [0|8191] "m/s" XXX
+ SG_ WHEEL_SPEED_RR : 32|13@0+ (0.017,0) [0|8191] "m/s" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 241 NEW_MSG_F1: 8 XXX
+ SG_ MAYBE_VOLTAGE : 18|10@0+ (0.02,0) [0|1023] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 249 NEW_MSG_F9: 4 XXX
+ SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 250 ABS_3: 8 ABS
+ SG_ BRAKE_PRESSURE_THRESHOLD : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL_SWITCH : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ XCOUNTER : 38|4@0+ (1,0) [0|15] "" XXX
+ SG_ XCHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 252 ENGINE_1: 8 ENGINE
+ SG_ ENGINE_RPM : 7|14@0+ (1,0) [0|255] "rev/min" XXX
+ SG_ ACCEL_PEDAL : 20|8@0+ (0.4,0) [0|255] "percent" XXX
+ SG_ REVERSE : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 254 ABS_2: 8 ABS
+ SG_ LONG_ACCEL : 7|12@0+ (0.01,-20.48) [0|4095] "m/s2" XXX
+ SG_ LATERAL_ACCEL : 11|12@0+ (0.01,-20.48) [0|4095] "m/s2" XXX
+ SG_ YAW_RATE : 31|12@0+ (-0.0014,2.86) [0|4095] "rad/s" XXX
+ SG_ NEW_SIGNAL_1 : 47|9@0+ (1,0) [0|511] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 257 ABS_6: 8 ABS
+ SG_ MAYBE_ACC_BRAKE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ VEHICLE_SPEED : 15|11@0+ (0.017,0) [0|2047] "" XXX
+ SG_ BRAKE_PRESSURE_1 : 20|11@0+ (1,0) [0|2047] "" XXX
+ SG_ BRAKE_PRESSURE_2 : 43|12@0+ (1,0) [0|4095] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 262 EPS_2: 7 EPS
+ SG_ UNKNOWN_TORQUE : 7|12@0+ (1,-2000) [0|4095] "" XXX
+ SG_ UNKNOWN_1 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN_STATUS : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_TORQUE : 23|11@0+ (1,-1024) [0|2047] "" XXX
+ SG_ UNKNOWN_2 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_STATUS : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKA_FAULT : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 263 ABS_4: 8 ABS
+ SG_ BRAKE_PRESSURE : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 265 NEW_MSG_109: 8 XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 270 ABS_7: 7 XXX
+ SG_ LONG_ACCEL_RAW : 7|12@0+ (0.01,-20.48) [0|4095] "" XXX
+ SG_ LATERAL_ACCEL_RAW : 11|12@0+ (0.01,-20.48) [0|4095] "" XXX
+ SG_ YAW_RATE_RAW : 31|12@0+ (-0.0014,2.86) [0|4095] "" XXX
+ SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 278 ABS_5: 8 ABS
+ SG_ WHEEL_IMPULSE_FL : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_IMPULSE_FR : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_IMPULSE_RL : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_IMPULSE_RR : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ACTIVE_FL : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACTIVE_FR : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACTIVE_RL : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACTIVE_RR : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_1 : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_1 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_2 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_2 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 280 NEW_MSG_118: 6 XXX
+ SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 282 NEW_MSG_11A: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|11@0+ (1,-1000) [0|2047] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 284 NEW_MSG_11C: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_2 : 11|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_3 : 28|13@0+ (1,0) [0|8191] "" XXX
+ SG_ NEW_SIGNAL_4 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ VEHICLE_SPEED : 47|12@0+ (0.017,0) [0|4095] "m/s" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 288 NEW_MSG_120: 6 XXX
+ SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 290 EPS_3: 4 EPS
+ SG_ EPS_TORQUE : 7|12@0+ (1,-2048) [0|4095] "" XXX
+ SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 501 NEW_MSG_1F5: 5 XXX
+ SG_ NEW_SIGNAL_2 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 502 LKA_COMMAND: 8 CAMERA
+ SG_ LKA_TORQUE : 7|11@0+ (1,-1024) [0|2047] "" XXX
+ SG_ HAPTIC_WARN_1 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_ACTIVE : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ HAPTIC_WARN_2 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 508 NEW_MSG_1FC: 8 XXX
+ SG_ NEW_SIGNAL_1 : 6|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 601 NEW_MSG_259: 8 XXX
+ SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 762 NEW_MSG_2FA: 3 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 766 CAM_UNKNOWN_1: 4 CAMERA
+
+BO_ 900 NEW_MSG_384: 8 XXX
+ SG_ NEW_SIGNAL_1 : 19|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 1040 NEW_MSG_410: 8 XXX
+ SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1046 NEW_MSG_416: 8 XXX
+ SG_ MUX M : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ UNKNOWN_M0_1 m0 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M0_2 m0 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M0_3 m0 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M0_4 m0 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M0_5 m0 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M0_6 m0 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M0_7 m0 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_1 m1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_2 m1 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_3 m1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_4 m1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_5 m1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_6 m1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M1_7 m1 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_1 m2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_2 m2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_3 m2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_4 m2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_5 m2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_6 m2 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_M2_7 m2 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1194 CAM_UNKNOWN_2: 8 CAMERA
+
+BO_ 1198 LKA_HUD_1: 8 CAMERA
+ SG_ NEW_SIGNAL_1 : 4|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_3 : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1351 LKA_HUD_2: 8 CAMERA
+ SG_ NEW_SIGNAL_1 : 51|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1442 ACC_1: 8 RADAR
+ SG_ HUD_SPEED : 7|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ TARGET_SPEED : 15|8@0+ (0.433,0) [0|255] "m/s" XXX
+ SG_ NEW_SIGNAL_3 : 17|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_4 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_STATUS : 22|2@0+ (1,0) [0|3] "" XXX
+ SG_ MAYBE_TJA : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1458 CAM_UNKNOWN_5: 4 CAMERA
+ SG_ NEW_SIGNAL_1 : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1854 BCM_1: 4 BCM
+ SG_ RIGHT_TURN_STALK : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_TURN_STALK : 17|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1865 NEW_MSG_749: 8 XXX
+ SG_ NEW_SIGNAL_1 : 23|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 506855454 CAM_UNKNOWN_6: 1 CAMERA
+
+CM_ SG_ 254 LONG_ACCEL "scale TBD";
+CM_ SG_ 254 LATERAL_ACCEL "scale TBD";
+CM_ SG_ 254 YAW_RATE "scale estimated";
+CM_ SG_ 257 MAYBE_ACC_BRAKE "may correlate with ACC-actuated braking";
+CM_ SG_ 278 FORWARD_1 "probably per-axle";
+CM_ SG_ 278 REVERSE_1 "probably per-axle";
+CM_ SG_ 278 FORWARD_2 "probably per-axle";
+CM_ SG_ 278 REVERSE_2 "probably per-axle";
+CM_ SG_ 282 NEW_SIGNAL_1 "smoothed yaw rate with low speed cutoff, maybe active forward lighting target angle";
+CM_ SG_ 284 VEHICLE_SPEED "scale estimated";
+CM_ SG_ 502 HAPTIC_WARN_1 "correlates with steering wheel haptic";
+CM_ SG_ 502 HAPTIC_WARN_2 "correlates with steering wheel haptic";
+CM_ BO_ 1198 "Definite LKA activity, probably contains lane-line recognition and lane departure signals, indicator of LKA vs TJA, perhaps indicator of active assist in map-permitted areas";
+VAL_ 262 LKA_STATUS 0 "standby" 1 "lka_active";
diff --git a/iqdbc_repo/iqdbc/dbc/ford_cgea1_2_bodycan_2011.dbc b/iqdbc_repo/iqdbc/dbc/ford_cgea1_2_bodycan_2011.dbc
new file mode 100644
index 000000000..49fcae19c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/ford_cgea1_2_bodycan_2011.dbc
@@ -0,0 +1,1070 @@
+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
+
+
+BO_ 58 BCM_m_FrP01: 8 XXX
+ SG_ ChildLockCmd : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ ChildLockCmd_UB : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ CLockCmd : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ CLockCmd_UB : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ DDShortDrop : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ DDShortDrop_UB : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ DirectionIndication : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ DirectionIndication_UB : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ EpsDrvInfo_D_Dsply : 36|4@0+ (1,0) [0|0] "" XXX
+ SG_ EpsDrvInfo_D_Dsply_UB : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ GearRvrseActv_D_Actl : 38|2@0+ (1,0) [0|0] "" XXX
+ SG_ GearRvrseActv_D_Actl_UB : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehVActlEng_D_Qf_3A : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_ActlEng_UB_3A : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_ActlEng_3A : 55|16@0+ (0.01,0) [0|0] "kph" XXX
+ SG_ Veh_V_DsplyCcSet : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_RqCcSet : 32|9@0+ (0.5,0) [0|0] "kph" XXX
+ SG_ WasherFluidLevelLow : 5|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 64 BCM_m_FrP02: 8 XXX
+ SG_ FuelCutoffReq : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ FuelCutoffReq_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ KVRFRSettings : 54|15@0+ (1,0) [0|0] "" XXX
+ SG_ KVRFRSettings_UB : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ PsngrFrntDetct_D_Actl : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ PsngrFrntDetct_D_Actl_UB : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ RILReq : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ RILReq_UB : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBuckleDriver : 31|2@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBuckleDriver_UB : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBuckleMid : 29|2@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBuckleMid_UB : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBucklePsngr : 27|2@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBucklePsngr_UB : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBuckleDriver : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBuckleDriver_UB : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBucklePsngr : 37|2@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBucklePsngr_UB : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotationCnt : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotationCnt_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotationCntQF : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRr_D_Actl_UB_40 : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRr_D_Actl_40 : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRl_D_Actl_UB_40 : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRl_D_Actl_40 : 33|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 131 MS_Steering_Data: 8 XXX
+ SG_ SteColumn_Status_UB : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteColumn_Status : 31|3@0+ (1,0) [0|0] "" XXX
+ SG_ SteCol_Manual_Override_UB : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteCol_Manual_Override : 27|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Send_UB : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Send : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Phone_UB : 17|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Phone : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_OK_UB : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_OK : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Volume_Up_UB : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Volume_Down_UB : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Voice_PTT_UB : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Seek_Right_UB : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Seek_Left_UB : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Mode_UB : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Mode : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Media_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Volume_Up : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Volume_Down : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Voice_PTT : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Seek_Right : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Seek_Left : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Media : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehYaw_W_Actl : 55|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+ SG_ SteWhlCtl_End_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_End : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehYaw_W_Actl_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Mute_UB : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Mute : 12|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 257 Driver_Seat_Information: 8 XXX
+ SG_ Reverse_Mirror_Stat : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ Memory_Feedback_Rqst : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Easy_Entry_Exit_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 260 Driver_Seat_Information_2: 8 XXX
+ SG_ Memory_Cmd : 15|4@0+ (1,0) [0|0] "" XXX
+ SG_ Easy_Entry_Rqst : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvSeat_Stat : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ Cancel_Auto_Movement : 1|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 269 IdleShutdown_Legacy: 8 XXX
+ SG_ IDLE_ENGINE_SHUTDOWN : 23|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 272 Keyfob_Pad_Stat: 8 XXX
+ SG_ L_Pwr_Sliding_Dr_Rqst : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Decklid_Rqst : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ R_Pwr_Sliding_Dr_Rqst : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ Keyfob_Pad_Msg_Count : 23|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ Keyfob_Pad_Id_Number : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ Keyfob_Pad_Button_Pressed : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Liftgate_Rqst : 30|1@0+ (1,0) [0|0] "" XXX
+ SG_ Keycode_Status : 27|20@0+ (1,0) [0|0] "" XXX
+
+BO_ 275 Power_Liftgate_Mode_StatM: 8 XXX
+ SG_ Power_Liftgate_Mode_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrTgateChime_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 276 Running_Board_CmdM: 8 XXX
+ SG_ Running_Board_Cmd : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 277 Running_Board_StatM: 8 XXX
+ SG_ Running_Board_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 288 ClmtCtrlSeat_SetCmdlegacy1: 8 XXX
+ SG_ ClmtCtrlSeat_SetCmd_Dvr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 289 ClmtCtrlSeat_SetStat_DvrM: 8 XXX
+ SG_ ClmtCtrlSeat_SetStat_Dvr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 290 ClmtCtrlSeat_SetCmdlegacy2: 8 XXX
+ SG_ ClmtCtrlSeat_SetCmd_Psgr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 291 ClmtCtrlSeat_SetStat_PsgrM: 8 XXX
+ SG_ ClmtCtrlSeat_SetStat_Psgr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 292 ClmtCtrlSeatSet_Cmd_v2_MS: 8 XXX
+ SG_ ClmtCtrlSeat_SetCmd_Psgr : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ ClmtCtrlSeat_SetCmd_Dvr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 293 ClmtCtrlSeatSet_Stat_v2: 8 XXX
+ SG_ ClmtCtrlSeat_SetStat_Psgr : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ ClmtCtrlSeat_SetStat_Dvr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 304 Mirror_Manual_Override_M: 8 XXX
+ SG_ Mirror_Manual_Override : 7|1@0+ (1,0) [0|0] "Binary" XXX
+
+BO_ 305 Memory_Sw_StatM: 8 XXX
+ SG_ Memory_Sw_Message_Count : 15|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ Memory_Set_Sw_Stat : 7|1@0+ (1,0) [0|0] "Binary" XXX
+ SG_ Memory_Set_Cancel : 3|1@0+ (1,0) [0|0] "Binary" XXX
+ SG_ Memory_3_Sw_Stat : 4|1@0+ (1,0) [0|0] "Binary" XXX
+ SG_ Memory_2_Sw_Stat : 5|1@0+ (1,0) [0|0] "Binary" XXX
+ SG_ Memory_1_Sw_Stat : 6|1@0+ (1,0) [0|0] "Binary" XXX
+
+BO_ 306 Driver_Lock_Sw_StatM: 8 XXX
+ SG_ Driver_Door_Key_Unlock : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Driver_Door_Key_Lock : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Driver_Lock_Sw_Message_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ Driver_Lock_Sw_Stat : 15|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 309 Memory_Cancel_Cmd_M: 8 XXX
+ SG_ Memory_Cancel_Cmd : 7|1@0+ (1,0) [0|0] "Binary" XXX
+
+BO_ 310 Driver_Door_Lock_CmdM: 8 XXX
+ SG_ Driver_Door_Lock_Msg_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ Driver_Door_Lock_Cmd : 15|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 311 Pass_Mirror_Sw_StatM: 8 XXX
+ SG_ Pass_Mirror_Sw_UD_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Mirror_Sw_LR_Stat : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 313 RPwrSlideDr_Unlock_RqstM: 8 XXX
+ SG_ RPwrSlideDr_Unlock_Rqst : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 320 LPwrSlideDr_Unlock_RqstM: 8 XXX
+ SG_ LPwrSlideDr_Unlock_Rqst : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 321 Passive_Entry_Ctrl_Data: 8 XXX
+ SG_ PE_Control_Data_1 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Control_Cmd : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ PK_SearchResults_Prog : 63|4@0+ (1,0) [0|0] "" XXX
+ SG_ PK_SearchResults_MyKey : 4|4@0+ (1,0) [0|0] "" XXX
+ SG_ PK_SearchResults_Found : 59|4@0+ (1,0) [0|0] "" XXX
+ SG_ PK_Search_EvNum : 15|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ PE_Control_Data_5 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Control_Data_4 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Control_Data_3 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Control_Data_2 : 31|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 322 Passive_Entry_Target_Data: 8 XXX
+ SG_ PE_Target_Data_5 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Target_Cmd : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Target_Status : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Target_Data_1 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Search_Rqst : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Target_Data_4 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Target_Data_3 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Target_Data_2 : 23|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 577 BCM_m_FrP28: 8 XXX
+ SG_ WheelRotToothCntFrL : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntFrL_UB : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntFrR : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntFrR_UB : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntReL : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntReL_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntReR : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ WheelRotToothCntReR_UB : 43|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 736 FCIM_Button_Press: 8 XXX
+ SG_ FCIM_Target_ID : 13|4@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Button_Type : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Button_State : 15|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 806 Compressor_Req: 8 XXX
+ SG_ HvacEvap_Te_Rq : 33|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ HvacAirCond_B_Rq : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacEvap_Te_Offst : 1|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+
+BO_ 842 MassageSeat_Data1: 8 XXX
+ SG_ SeatLmbrUpDrv_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrMidDrv_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrLoDrv_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlUpDrv_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlLoDrv_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 843 MassageSeat_Data2: 8 XXX
+ SG_ SeatLmbrUpPsgr_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrMidPsgr_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrLoPsgr_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlUpPsgr_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlLoPsgr_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 844 MassageSeat_Stat1: 8 XXX
+ SG_ StmsLmbrDrv_D_Stat : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ StmsCshnDrv_D_Stat : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ SeatSwtchDrv_B_Stat : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDrv_D_Stat : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ SeatAirAmb_P_Actl : 7|16@0+ (0.01,0) [0|0] "KiloPascal" XXX
+ SG_ SeatPDrv_B_Stat : 20|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 845 MassageSeat_Stat2: 8 XXX
+ SG_ StmsLmbrPsgr_D_Stat : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ StmsCshnPsgr_D_Stat : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ SeatSwtchPsgr_B_Stat : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatPPsgr_B_Stat : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnPsgr_D_Stat : 6|3@0+ (1,0) [0|0] "" XXX
+ SG_ PsgrMemFeedback_Rsp : 3|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 846 MassageSeat_Req_MS: 8 XXX
+ SG_ SeatFnPsgr_D_Rq : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDrv_D_Rq : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDfaltPsgr_B_Rq : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDfaltDrv_B_Rq : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnChngPsgr_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnChngDrv_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ PsgrMemory_Rq : 3|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 849 MassageSeat_Data3: 8 XXX
+ SG_ SeatCshnDrvRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnDrvRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnDrvFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnDrvFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 850 MassageSeat_Data4: 8 XXX
+ SG_ SeatCshnPsgrRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnPsgrRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnPsgrFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnPsgrFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 853 EFP_CC_Status_MS: 8 XXX
+ SG_ Save_My_Temp : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Left_Temp_Setpt : 31|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RrDefrost_HtdMirrorReq : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Control_Status : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ MultipleButtonPressReq : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_System_Mode_Req : 19|3@0+ (1,0) [0|0] "" XXX
+ SG_ Recirc_Request : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Rt_Temp_Setpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ AC_Request : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Windshield_ModeRequest : 15|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Panel_Mode_Request : 7|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Overriding_ModeReq : 10|3@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_Request : 3|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Rear_Right_Temp_Setpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ Forced_Recirc_Req : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Left_Temp_Setpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX
+
+BO_ 854 EFP_CC_Seat_Req_Stat_MS: 8 XXX
+ SG_ Front_Rear_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX
+ SG_ Pass_Rr_Cond_Seat_Req : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Rr_Cond_Seat_Lvl : 8|3@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Fr_Cond_Seat_Req : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Fr_Cond_Seat_Lvl : 11|3@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Rr_Cond_Seat_Req : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Rr_Cond_Seat_Lvl : 2|3@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Fr_Cond_Seat_Req : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Fr_Cond_Seat_Lvl : 5|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 855 RCCM_CC_Status: 8 XXX
+ SG_ RrBlwrCondStLdShedStat : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ FrBlwrCondStLdShedStat : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_Rr_Rt_TempSetpt : 63|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Rr_Left_TempSetpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Fr_Rt_TempSetpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Fr_Left_TempSetpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Fr_Rr_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX
+ SG_ Panel_Mode_State : 7|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ RrDefHtdMirrLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX
+ SG_ Windshield_Mode_State : 15|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Recirc_Door_State : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_System_Mode_State : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ Default_Defrost_State : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Auto_AC_Indicator_Temp : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_State : 3|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ RrDefrost_HtdMirrState : 8|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 856 RCCM_CC_Seat_Status: 8 XXX
+ SG_ Active_My_Temp : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_HtdStrWhl_Req : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PR_Cond_Seat_Lvl : 31|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PR_Cond_Seat_Req : 28|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PF_Cond_Seat_Req : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PF_Cond_Seat_Lvl : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DR_Cond_Seat_Req : 12|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DR_Cond_Seat_Lvl : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DF_Cond_Seat_Req : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DF_Cond_Seat_Lvl : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ PassRrCondStLdShedStat : 26|2@0+ (1,0) [0|0] "" XXX
+ SG_ PassFrCondStLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvRrCondStLdShedStat : 10|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvFrCondStLdShedStat : 1|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 857 RCCM_CC_MBP_Press_Stat: 8 XXX
+ SG_ Report_Active : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Temp_Units : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Fan_Bars_Disply : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Temp_Units : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyPass10 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyPass1 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyDrvr10 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyDrvr1 : 15|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 859 MFD_CC_Status_MS: 8 XXX
+ SG_ Rear_Mode_Bttn_Status : 38|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 860 EFP_CC_Info_Status_MS: 8 XXX
+ SG_ Rear_Panel_Btn_State : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Floor_Btn_State : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ HtdStrWhl_SftBtt_Stt : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ AC_Sft_Button_State : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvRrCondSeatSftBttnSt : 47|3@0+ (1,0) [0|0] "" XXX
+ SG_ DrvFrCondSeatSftBtnStt : 37|3@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RecircSBtn_St : 27|2@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrDefrSBtn_St : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ PasRrCondSeatSftBttnSt : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ PasFrCondSeatSftBtnStt : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ MyTemp_Soft_Bttn_State : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_MaxACSBtn_St : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearPowerButtonState : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearCoolBarsDisplayed : 11|3@0+ (1,0) [0|0] "Bars_On" XXX
+ SG_ Rear_Sft_Control_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrNeutralBarDsp_St : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrHeatBarsDsp_St : 31|3@0+ (1,0) [0|0] "Bars_On" XXX
+ SG_ Rear_Fan_Bars_Displayed : 19|3@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrCtrlBtn_St : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Auto_Button_State : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_FrPowerSBtn_St : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_FrDefrostSBtn_St : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_Soft_Btn_Stt : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_MODE_State : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_FAN_State : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Dual_Button_State : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarPnlSBtn_St : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarPnFlrSBtn_St : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarFlrWsSBtn_St : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarDrvFlrSBtn_St : 3|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 861 HSWheel_CC_Info_Stat: 8 XXX
+ SG_ HtdStrWhl_SftBtt_State : 57|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 862 Climate_Control_Data_2: 8 XXX
+ SG_ HvacRec_Pc_Est : 31|7@0+ (1,0) [0|0] "%" XXX
+ SG_ HvacEngIdleInc_B_Rq : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacAir_Flw_Est : 13|9@0+ (0.5,0) [0|0] "liter/second" XXX
+ SG_ AmbTempImpr : 7|10@0+ (0.25,-128.0) [0|0] "degreesC" XXX
+
+BO_ 900 Vehicle_Access_RqstM: 8 XXX
+ SG_ PE_AssocConfirm_D_Actl : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ DrTgateOpen_D_RqRfa : 51|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Decklid_Inhibit_Rqst : 53|2@0+ (1,0) [0|0] "" XXX
+ SG_ PK_Program : 45|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Packet_Cnt : 31|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ PE_Control_Status : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Control_Code : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Perimeter_Lighting_Stat : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_RKE_Flash_Rqst : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Lock_EvNum : 23|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ PE_Lock_Requestor : 39|5@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Lock_Sub_Id : 11|4@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Lock_Status : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_DrvCfg_Horn_Rqst : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ PEBackupSlot_Stats : 55|2@0+ (1,0) [0|0] "" XXX
+ SG_ PE_Fob_Number : 43|4@0+ (1,0) [0|0] "Number" XXX
+ SG_ PE_Keypad_LiftGlass_Rqst : 49|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 901 Vehicle_Lock_Status: 8 XXX
+ SG_ CntrStkKeycodeActl : 55|16@0+ (1,0) [0|0] "" XXX
+ SG_ CntrStk_D_RqAssoc_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ CntrStk_D_RqAssoc : 43|3@0+ (1,0) [0|0] "" XXX
+ SG_ KeyTypeChngMykey_D_Rq : 45|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Lock_Sub_Id : 21|4@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Lock_Status : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Lock_Requestor : 39|5@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Lock_EvNum : 31|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ Trim_Switch_Status_Count : 15|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ Trim_Switch_Status : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ DF_KeyCyl_Switch_Stat_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ DF_KeyCyl_Switch_Stat : 34|2@0+ (1,0) [0|0] "" XXX
+ SG_ Perimeter_Alarm_Status : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ KeyTypeChngMykey_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 902 Remote_Start: 8 XXX
+ SG_ Remote_Start_Req : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 903 CC_FCIM_Update: 8 XXX
+ SG_ Rr_Temp_M_H_Heat_Ind : 30|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_7_Indicator : 45|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_6_Indicator : 46|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_5_Indicator : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_4_Indicator : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_3_Indicator : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_2_Indicator : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Fan_Low_Indicator : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ AC_Indicator : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_Indicator : 37|1@0+ (1,0) [0|0] "" XXX
+ SG_ Panel_Mode_Indicator : 38|1@0+ (1,0) [0|0] "" XXX
+ SG_ Windshield_Mode_Indicator : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_High_Cool_Ind : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_M_H_Cool_Ind : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_M_L_Cool_Ind : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_Low_Cool_Ind : 27|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_Center_Ind_On : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_High_Heat_Ind : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_M_L_Heat_Ind : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Temp_Low_Heat_Ind : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Control_Indicator : 17|1@0+ (1,0) [0|0] "" XXX
+ SG_ Auto_Indicator_Rear : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Indicator_Rear : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_U_R_Seat_Cool_Ind : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_M_Seat_Cool_Ind : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_L_L_Seat_Cool_Ind : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_U_R_Seat_Heat_Ind : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_M_Seat_Heat_Ind : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_L_L_Seat_Heat_Ind : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_U_R_Seat_Cool_Ind : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_M_Seat_Cool_Ind : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_L_L_Seat_Cool_Ind : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_U_R_Seat_Heat_Ind : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_M_Seat_Heat_Ind : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_L_L_Seat_Heat_Ind : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Single_Mode_Indicator : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Auto_Indicator : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Recirc_Indicator : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ Max_AC_Econ_Indicator : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_DefHtd_Mirr_Indicator : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ Defrost_Indicator : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Temp_Dual_Indicator : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Indicator_Front : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 904 CC_NavChassis_Info_Status: 8 XXX
+ SG_ Rear_Defrost_Soft_Bttn_Stt : 52|1@0+ (1,0) [0|0] "" XXX
+ SG_ Recirc_Soft_Button_State : 54|2@0+ (1,0) [0|0] "" XXX
+ SG_ Max_AC_Soft_Button_State : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_Soft_Btn_Stt : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Power_Soft_Btn_State : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Defrost_Soft_Btn_Stt : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Power_Button_State : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_FAN_Indicator : 27|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_MODE_Indicator : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Rear_Set_Temp_Display : 17|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Rear_Set_Temp_Units : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Heat_Bars_Displayed : 42|3@0+ (1,0) [0|0] "Bars_On" XXX
+ SG_ CC_Bar_Rear_Set_Temp_Dig3 : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Rear_Set_Temp_Dig2 : 15|8@0+ (1,0) [0|0] "ASCII" XXX
+ SG_ CC_Bar_Rear_Set_Temp_Dig1 : 7|8@0+ (1,0) [0|0] "ASCII" XXX
+ SG_ Rear_Neutral_Bar_Displayed : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Fan_Bars_Displayed : 46|3@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Control_Button_State : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Auto_Button_State : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ AC_Sft_Button_State : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Cool_Bars_Displayed : 38|3@0+ (1,0) [0|0] "Bars_On" XXX
+ SG_ Dual_Button_State : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Sft_Btn_FlrWs_State : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Sft_Btn_Floor_State : 30|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Sft_Btn_PnFlr_State : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_Bar_Sft_Btn_Pnl_State : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Sft_Control_Status : 23|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 920 FCIM_CC_Status: 8 XXX
+ SG_ Manual_Temp_Knob_Pos : 8|9@0+ (1,0) [0|0] "Degrees CW" XXX
+ SG_ Manual_Blower_Knob_Pos : 24|9@0+ (1,0) [0|0] "Degrees CW" XXX
+ SG_ Rear_Blower_IncreaseButton : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Blower_DecreaseButton : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Temp_Decrease_Button : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Temp_Increase_Button : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Control_Button : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ Auto_Button_Rear : 44|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Button_Rear : 45|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_Heated_Seat_Btn : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_Cooled_Seat_Btn : 46|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_Cooled_Seat_Btn : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_Heated_Seat_Btn : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ Blower_Decrease_Button : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ Blower_Increase_Button : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Defrost_Mode_Button : 27|1@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_Button : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ Panel_Floor_Mode_Button : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ Panel_Mode_Button : 30|1@0+ (1,0) [0|0] "" XXX
+ SG_ Mode_Change_Button : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_Temp_Increase : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_Temp_Decrease : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_Temp_Decrease : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Lft_Side_Temp_Increase : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ Auto_Button_Front : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Recirc_Button : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Max_AC_Econ_Button : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ AC_Button : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rr_Def_Htd_Mirr_Button : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Defrost_Button : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rt_Side_Temp_Dual_Button : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Button_Front : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ Climate_Button : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ CcdMde_D_Rq : 54|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 921 Nav_CC_Status: 8 XXX
+ SG_ Front_System_Button_Status : 7|5@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Temp_Button_Status : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Man_Temp_Bar_Status : 11|4@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Fan_Button_Status : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Man_ATC_Button_Status : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Blower_Bar_Status : 2|3@0+ (1,0) [0|0] "# of Bars" XXX
+
+BO_ 922 VoiceRec_CC_Request: 8 XXX
+ SG_ Recirculate_On : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ Recirculate_Off : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Defrost_On : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Defrost_Off : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Max_AC_On : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Max_AC_Off : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Defrost_On : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Defrost_Off : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Blower_Increment : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Blower_Decrement : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ Dual_Zone_Off : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Driver_Temp_Increment : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ Driver_Temp_Decrement : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ Climate_On : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ Climate_Off : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ Automatic_Mode : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ AC_On : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ AC_Off : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Voice_Blower_Limit : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ Driver_Set_Temp : 31|8@0+ (0.5,0) [0|0] "Degrees" XXX
+
+BO_ 928 Ignition_Switch_PositionM: 8 XXX
+ SG_ AirAmb_Te_ActlFilt_UB : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirAmb_Te_ActlFilt : 49|10@0+ (0.25,-128.0) [0|0] "deg C" XXX
+ SG_ OdometerMasterValue_UB : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ OdometerMasterValue : 31|24@0+ (1,0) [0|0] "km" XXX
+ SG_ Remote_Start_Status : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ Key_In_Ignition_Stat : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ Ignition_Switch_Stable : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ Ignition_Status : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ BOO_Switch_Status : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ Remote_Device_Feedback : 23|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 934 Side_Detect_L_StatusM: 8 XXX
+ SG_ Cross_Traffic_L_SnState : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_L_SysOpState : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_L_SnsrState : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_L_Illum : 15|8@0+ (1,0) [0|0] "%" XXX
+ SG_ Side_Detect_L_Detect : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_Op_State : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_Alert : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_L_Alert : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 935 Side_Detect_R_StatusM: 8 XXX
+ SG_ Cross_Traffic_R_Alert : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_SnState : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_Op_State : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_R_Detect : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_R_Illum : 15|8@0+ (1,0) [0|0] "%" XXX
+ SG_ SideDetect_R_SnsrState : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_R_SysOpState : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_R_Alert : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 944 Body_Information_6_MS: 8 XXX
+ SG_ DRV_SELECT_STAT : 3|4@0+ (1,0) [0|0] "" XXX
+ SG_ reserve_2bits : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ reserve_2 : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ reserve_3 : 4|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 945 Ajar_Stat: 8 XXX
+ SG_ Decklid_Ajar_Status : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ Hood_Ajar_Status : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ LG_Glass_Ajar_Status : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ DF_Door_Ajar_Status : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ PF_Door_Ajar_Status : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ DR_Door_Ajar_Status : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ PR_Door_Ajar_Status : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ LG_Door_Ajar_Status : 1|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 946 Body_Information_5_MS: 8 XXX
+ SG_ CoolantFanStepAct_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondRec_B_Rq_UB : 38|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondRec_B_Rq : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondEvdc_D_Stats_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondEvdc_D_Stats : 37|3@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondClutch_B_Stats_UB : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondClutch_B_Stats : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ CoolantFanStepAct : 47|5@0+ (1,0) [0|0] "Steps" XXX
+ SG_ AirCondFluidHi_P_Actl_UB : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondFluidHi_P_Actl : 31|8@0+ (0.125,0) [0|0] "bar" XXX
+ SG_ SECONDARY_HEATER_STAT_UB : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ CURRENT_DRAW_UB : 62|1@0+ (1,0) [0|0] "" XXX
+ SG_ SECONDARY_HEATER_STAT : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ CURRENT_DRAW : 55|8@0+ (0.5,0) [0|0] "Amps" XXX
+
+BO_ 947 BodyInformation_3_MS: 8 XXX
+ SG_ CamraDefog_B_Req_UB : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrStats_D_Actl_UB : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearFog_Lamp_Dbnce_UB : 49|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrStats_D_Actl : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraDefog_B_Req : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearFog_Lamp_Dbnce : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ CarMode : 53|4@0+ (1,0) [0|0] "" XXX
+ SG_ Day_Night_Status : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Parklamp_Status : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ Dimming_Lvl : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ Litval : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ Mfs_Turn_Stalk_SW_Status : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ PwMdeExten_D_Actl : 63|5@0+ (1,0) [0|0] "" XXX
+ SG_ STR_WHL_ANGLE : 39|15@0+ (0.1,-1000.0) [0|0] "Degrees" XXX
+ SG_ Turn_Seq_Cmd_Right : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Turn_Seq_Cmd_Left : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ Smart_Wiper_Motor_Stat_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Smart_Wiper_Motor_Stat : 55|2@0+ (1,0) [0|0] "" XXX
+ SG_ Mfs_Turn_Stalk_SW_Status_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ reserve : 1|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 950 RKE_Packet: 8 XXX
+ SG_ RemoteKey_Packet_TIC : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Packet_RollB : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Packet_RollA : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Packet_Ctrl : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Packet_CkSum : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 951 TPM_Frame: 8 XXX
+ SG_ TirePress_Frame_Temp : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Frame_Status : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Frame_Press : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Frame_ID : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Frame_CkSum : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 952 RKE_TPM_Info: 8 XXX
+ SG_ TirePress_HitRate_Ctrl : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_HitRate_Ctrl : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Antenna_Ctrl : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Filter_Ctrl : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Filter_Ctrl : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ Modulation_Ctrl : 1|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 953 RKE_Info: 8 XXX
+ SG_ RemoteKey_Info_TIC : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Info_RollB : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Info_RollA : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Info_Ctrl : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ RemoteKey_Info_CkSum : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 954 Tire_Pressure_Info: 8 XXX
+ SG_ TirePress_Info_MaxInd : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Info_Index : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TirePress_Info_ID : 7|32@0+ (1,0) [0|0] "" XXX
+
+BO_ 956 Body_Information_7_MS: 8 XXX
+ SG_ GearLvrPos_D_Actl_UB : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTot_Tq_Actl : 31|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ GearLvrPos_D_Actl : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ ApedPos_Pc_ActlArb : 15|10@0+ (0.1,0) [0|0] "%" XXX
+ SG_ PrplWhlTot_Tq_Actl_UB : 17|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngOff_T_Actl : 47|16@0+ (1,0) [0|0] "seconds" XXX
+ SG_ ApedPos_Pc_ActlArb_UB : 20|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 958 Rear_FoglampStat: 8 XXX
+ SG_ RearFog_Lamp_Ind : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 963 BCM_to_MS_Body: 8 XXX
+ SG_ LF_Low_Beam_CKT_CAN : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ IKT_Program_Status : 51|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Spd_Slow_Puddle_Status : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ Illuminated_Exit_Status : 43|2@0+ (1,0) [0|0] "" XXX
+ SG_ Illuminated_Entry_Status : 45|2@0+ (1,0) [0|0] "" XXX
+ SG_ Door_Courtesy_Light_Status : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ Courtesy_Demand_BSave_Stat : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ Alarm_Lights_Courtesy_Stat : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ Courtesy_Delay_Status : 37|2@0+ (1,0) [0|0] "" XXX
+ SG_ Courtesy_Mode_Status : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Fog_Light_SW_Status : 22|2@0+ (1,0) [0|0] "" XXX
+ SG_ Brake_Lamp_On_Status : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ ParkLamps_CKT_CAN : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ RF_Low_Beam_CKT_CAN : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Brk_Fluid_Lvl_Low : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Park_Brake_Status : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ High_Beam_Indicator_Rqst : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Headlamp_On_Wrning_Cmd : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ Key_In_Ignition_Warn_Cmd : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Park_Brake_Chime_Rqst : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ Daytime_Running_Lamps : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ AutoHighBeam_Cmd : 18|2@0+ (1,0) [0|0] "" XXX
+ SG_ Perimeter_Alarm_Chime_Rqst : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSensrDataUpperLim_UB : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSensrDataLowerLim_UB : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSensrDataUpperLim : 63|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSensrDataLowerLim : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ AutoHighBeam_Cmd_UB : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrkBrkActv_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ Headlamp_Switch_Stat : 49|2@0+ (1,0) [0|0] "" XXX
+ SG_ Perimeter_Alarm_Inclin_Cmd : 53|2@0+ (1,0) [0|0] "" XXX
+ SG_ Perimeter_Alarm_Intrus_Cmd : 55|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 964 BodyInformation_2_MS: 8 XXX
+ SG_ LockInhibit : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ MetricActvTe_B_Actl_UB : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ MetricActvTe_B_Actl : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Liftgate_Mode_Cmd : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirAmb_Te_Actl : 55|10@0+ (0.25,-128.0) [0|0] "degC" XXX
+ SG_ EngClntTe_D_Qf : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_Cmd : 26|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_Cmd : 28|2@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPStatusCoding : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ Delay_Accy : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ Volume_Cutback : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ MetricActv_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatTgate_B_Actl : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatRr_B_Actl : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatRl_B_Actl : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatPsngr_B_Actl : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatInnrTgate_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatHood_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatDrv_B_Actl : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngClnt_Te_Actl : 23|8@0+ (1,-60.0) [0|0] "degC" XXX
+ SG_ AirAmbTe_D_Qf_UB : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ Volume_Cutback_UB : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_Cmd_UB : 57|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPStatusCoding_UB : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Liftgate_Mode_Cmd_UB : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ MetricActv_B_Actl_UB : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_Cmd_UB : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirAmbTe_D_Qf : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ AirAmb_Te_Actl_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngClnt_Te_Actl_UB : 24|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 966 Delay_AccyM_for_P473: 8 XXX
+ SG_ Delay_Accy : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 967 CMPS_FDM_Info_StatusMS: 8 XXX
+ SG_ Segment_MSD_UB : 37|1@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_LSD_UB : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ Compass_Display_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_LSD : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_MSD : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ Cal_Icon : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ Zone_Icon : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ Compass_Display : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ Zone_Icon_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cal_Icon_UB : 33|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 968 EATC_FDM_Info_Status: 8 XXX
+ SG_ Outside_Rear_Temp_Digit3 : 47|4@0+ (1,0) [0|0] "BCD" XXX
+ SG_ Outside_Rear_Temp_Digit2 : 35|4@0+ (1,0) [0|0] "BCD" XXX
+ SG_ Outside_Rear_Temp_Digit1 : 39|4@0+ (1,0) [0|0] "BCD" XXX
+ SG_ EATC_Out_Rear_Units : 58|2@0+ (1,0) [0|0] "" XXX
+ SG_ Outside_Rear_Temp_Digit4 : 55|2@0+ (1,0) [0|0] "" XXX
+ SG_ EATC_RHS_Units : 60|2@0+ (1,0) [0|0] "" XXX
+ SG_ EATC_Fan_Speed : 51|3@0+ (1,0) [0|0] "" XXX
+ SG_ EATC_Outside_Rear_Display : 62|2@0+ (1,0) [0|0] "" XXX
+ SG_ RHS_Temp_Display_Digit2 : 31|8@0+ (1,0) [0|0] "ASCII" XXX
+ SG_ RHS_Temp_Display_Digit3 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ RHS_Temp_Display_Digit1 : 23|8@0+ (1,0) [0|0] "ASCII" XXX
+ SG_ EATC_RHS_Display : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ LHS_Temp_Display_Digit3 : 43|2@0+ (1,0) [0|0] "" XXX
+ SG_ LHS_Temp_Display_Digit2 : 15|8@0+ (1,0) [0|0] "ASCII" XXX
+ SG_ LHS_Temp_Display_Digit1 : 7|8@0+ (1,0) [0|0] "ASCII" XXX
+ SG_ EATC_LHS_Display : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ EATC_LHS_Units : 53|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 969 Aux_Body_Ctrl_Mod_Status: 8 XXX
+ SG_ Perimeter_Alrm_Intrus_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Turn_Outage_Stat_Rt_Rear : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Turn_Outage_Stat_Left_Rear : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ Perimeter_Alrm_Inclin_Stat : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 976 Veh_Characteristic_Set_2: 8 XXX
+ SG_ VehMykey_Vl_LimRq_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamraFrntStat_D_Stat : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraZoomMan_D_Actl : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ CamZoomActiveState : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlStat_D_Actl : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlDyn_D_Actl : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamPDCGuidStat : 31|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehMykey_Vl_LimRq : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ IgnKeyType_D_Actl : 4|4@0+ (1,0) [0|0] "" XXX
+ SG_ New_Module_Attn_Event : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Beltminder_Warn_Stats : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Attn_Info_Audio : 7|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 977 ClmtCtrlSeat_SetCmd_LRPM: 8 XXX
+ SG_ ClmtCtrlSeat_SetCmd_LRP : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 978 ClmtCtrlSeat_SetStat_LRPM: 8 XXX
+ SG_ ClmtCtrlSeat_SetStat_LRP : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 979 ClmtCtrlSeat_SetCmd_RRPM: 8 XXX
+ SG_ ClmtCtrlSeat_SetCmd_RRP : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 980 ClmtCtrlSeat_SetStat_RRPM: 8 XXX
+ SG_ ClmtCtrlSeat_SetStat_RRP : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 981 Rear_HVAC_Control_Status: 8 XXX
+ SG_ Temp_Knob_Position : 23|9@0+ (1,0) [0|0] "Degrees CW" XXX
+ SG_ Rear_Lock_Ind_State : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Blower_Knob_Position : 7|9@0+ (1,0) [0|0] "Degrees CW" XXX
+ SG_ AUTO_Ind_State : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Panel_Mode_Ind_State : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Panel_Floor_Md_Ind_State : 10|2@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_Ind_State : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Status : 14|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 982 Rear_HVAC_Control_Update: 8 XXX
+ SG_ Power_State_Commanded : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Lock_Indicator : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Panel_Floor_Mode_Indicator : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ R_Floor_Mode_Indicator : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ AUTO_Mode_Indicator : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ F_Panel_Mode_Indicator : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ R_Panel_Mode_Indicator : 12|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 986 Personality_APIM_Data3_MS: 8 XXX
+ SG_ LightAmbIntSwtchInc_B : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbIntSwtchDec_B : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbIntsty_No_Rq : 15|8@0+ (1,0) [0|0] "% Intensity" XXX
+ SG_ LightAmbColor_No_Rq : 7|8@0+ (1,0) [0|0] "Color Index" XXX
+ SG_ LightAmbClrSwtchInc_B : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbClrSwtchDec_B : 23|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 987 RHVAC_Data: 8 XXX
+ SG_ CamraDefog_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 992 Personality_Data_MS: 8 XXX
+ SG_ PersSetupRestr_D_Actl : 45|2@0+ (1,0) [0|0] "" XXX
+ SG_ PersSetupAccessCtrl : 43|1@0+ (1,0) [0|0] "SES" XXX
+ SG_ PersSetup_No_Actl : 55|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ MsgCntrPersIndex_D_Rq_UB : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrFeatNoRq_UB : 46|1@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrFeatConfigRq_UB : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrDsplyOp_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrPersIndex_D_Rq : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrFeatConfigRq : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrFeatNoRq : 7|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ MsgCntrDsplyOp_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 993 Personality_DSM_Data: 8 XXX
+ SG_ PersIndexDsm_D_Actl : 47|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoDsmActl : 31|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigDsmActl : 15|16@0+ (1,0) [0|0] "" XXX
+ SG_ PersStore_D_Actl : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ MemSwtch_D_RqRecall : 5|3@0+ (1,0) [0|0] "" XXX
+ SG_ MemSwtch_D_RqAssoc : 2|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 994 Personality_Data_MS_2: 8 XXX
+ SG_ RecallEvent_No_Cnt : 63|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ PersNo_D_Actl : 55|3@0+ (1,0) [0|0] "" XXX
+ SG_ PersNoPos_D_Actl : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ PersStore_D_Rq_UB : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkPersIndex_D_Actl_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkFeatNoActl_UB : 52|1@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkFeatConfigActl_UB : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkDsplyOp_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkPersIndex_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkFeatNoActl : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ PersStore_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkFeatConfigActl : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkDsplyOp_D_Rq : 47|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 996 Personality_HCMB_Data: 8 XXX
+ SG_ PersIndexHcmb_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoHcmbActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigHcmbActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 999 Personality_HVAC_Data: 8 XXX
+ SG_ LightAmbIntsty_No_Actl : 55|8@0+ (1,0) [0|0] "% Intensity" XXX
+ SG_ LightAmbColor_No_Actl : 47|8@0+ (1,0) [0|0] "Color Index" XXX
+ SG_ PersIndexHvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoHvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigHvacActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1000 ACM_Status_Message: 8 XXX
+ SG_ Multimedia_System : 26|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1001 Personality_RFA_Data: 8 XXX
+ SG_ PersIndexRfa_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoRfaActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigRfaActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1005 Personality_RHVAC_Data: 8 XXX
+ SG_ PersIndexRhvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoRhvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigRhvacActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1006 Nav_HMI_Status: 8 XXX
+ SG_ Nav_Unit_Setting : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fuel_Econ_AFE_Reset_Req : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ DistanceBarSetting : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamraZoomMan_D_Rq : 22|3@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlStat_D_Rq : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlDyn_D_Rq : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamAutoTowbarZoom : 17|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1023 Reserve_3FF_MKX_Audio: 8 XXX
+ SG_ reserve : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1034 GGCC_Config_Mgmt_ID_1: 8 XXX
+ SG_ VehicleGGCCData : 7|64@0+ (1,0) [0|0] "mixed" XXX
+
+BO_ 1050 Climate_Control_Data: 8 XXX
+ SG_ SecondaryHeater_Rqst : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ Passenger_Sunload_Raw : 15|8@0+ (5.0,0) [0|0] "W/m^2" XXX
+ SG_ Driver_Sunload_Raw : 7|8@0+ (5.0,0) [0|0] "W/m^2" XXX
+ SG_ HvacEvap_Te_Rq : 43|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ HvacRemoteStrt_N_Rq : 47|4@0+ (100.0,450.0) [0|0] "RPM" XXX
+ SG_ Remote_Start_QuietMode : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ InCarTempQF : 30|2@0+ (1,0) [0|0] "" XXX
+ SG_ HvacAirCond_B_Rq : 27|1@0+ (1,0) [0|0] "" XXX
+ SG_ InCarTemp : 39|8@0+ (0.5,-57.0) [0|0] "degreesC" XXX
+ SG_ Outside_Air_Temp_Stat : 23|8@0+ (0.5,-40.0) [0|0] "Degrees C" XXX
+ SG_ HvacEvap_Te_Actl : 49|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+
+BO_ 1059 Engine_Data_MS: 8 XXX
+ SG_ Res_UreaLvlLo_B_Dsply_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ Res_UreaLvlLo_B_Dsply : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fuel_Level_State : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdOffRoadMode_D_Stats_UB : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ AwdRnge_D_Actl_UB : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearDiffLckLamp_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ AwdOffRoadMode_D_Stats : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdRnge_D_Actl : 45|3@0+ (1,0) [0|0] "" XXX
+ SG_ RearDiffLckLamp_D_Rq : 34|2@0+ (1,0) [0|0] "" XXX
+ SG_ VEH_SPD : 7|16@0+ (0.01,-100.0) [0|0] "KPH" XXX
+ SG_ ENG_SPD : 23|16@0+ (0.25,0) [0|0] "RPM" XXX
+ SG_ Fuel_Level_State_UB : 37|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1061 Engine_Data_2_MS: 8 XXX
+ SG_ RstrnImpactEvntStatus_UB : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAirIn_Te_Actl_UB : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAirIn_Te_Actl : 55|10@0+ (0.25,-128.0) [0|0] "degC" XXX
+ SG_ ACCompressorDisp_UB : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ ACCompressorDisp : 46|7@0+ (1,0) [0|0] "%" XXX
+ SG_ RstrnImpactEvntStatus : 59|3@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_N_Actl_UB : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_N_Actl : 28|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ VehVActlEng_D_Qf : 31|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_ActlEng_UB : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_ActlEng : 15|16@0+ (0.01,0) [0|0] "kph" XXX
+ SG_ PwPck_D_Stat_UB : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ PwPck_D_Stat : 7|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1062 ACM_NAV_WHEEL_INFO: 8 XXX
+ SG_ WhlRotatRr_No_Cnt_UB : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatRl_No_Cnt_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFr_No_Cnt_UB : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFl_No_Cnt_UB : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRr_D_Actl_UB : 44|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRl_D_Actl_UB : 45|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFr_D_Actl_UB : 46|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFl_D_Actl_UB : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ WHEEL_ROLLING_TIMESTAMP_UB : 62|1@0+ (1,0) [0|0] "" XXX
+ SG_ ACM_NAV_WHEEL_INFO_RESET : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatRr_No_Cnt : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFr_No_Cnt : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRr_D_Actl : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRl_D_Actl : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFr_D_Actl : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFl_D_Actl : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ WHEEL_ROLLING_TIMESTAMP : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1068 Battery_Mgmt_2_MS: 8 XXX
+ SG_ Shed_T_Eng_Off_B : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_Level_Req : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_Feature_Group_ID : 7|5@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_Drain_Eng_Off_B : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ Batt_Lo_SoC_B : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Batt_Crit_SoC_B : 0|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1125 GPS_Data_Nav_1: 8 XXX
+ SG_ GpsHsphLattSth_D_Actl : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ GpsHsphLongEast_D_Actl : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_Longitude_Minutes : 46|6@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ GPS_Longitude_Min_dec : 55|14@0+ (0.0001,0) [0|0] "Minutes" XXX
+ SG_ GPS_Longitude_Degrees : 39|9@0+ (1,-179.0) [0|0] "Degrees" XXX
+ SG_ GPS_Latitude_Minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ GPS_Latitude_Min_dec : 23|14@0+ (0.0001,0) [0|0] "Minutes" XXX
+ SG_ GPS_Latitude_Degrees : 7|8@0+ (1,-89.0) [0|0] "Degrees" XXX
+
+BO_ 1126 GPS_Data_Nav_2: 8 XXX
+ SG_ Gps_B_Falt : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ GpsUtcYr_No_Actl : 55|5@0+ (1,1.0) [0|0] "Year" XXX
+ SG_ GpsUtcMnth_No_Actl : 47|4@0+ (1,1.0) [0|0] "Month" XXX
+ SG_ GpsUtcDay_No_Actl : 37|5@0+ (1,1.0) [0|0] "Day" XXX
+ SG_ GPS_UTC_seconds : 23|6@0+ (1,0) [0|0] "seconds" XXX
+ SG_ GPS_UTC_minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ GPS_UTC_hours : 7|5@0+ (1,0) [0|0] "Hours" XXX
+ SG_ GPS_Pdop : 31|5@0+ (0.2,0) [0|0] "" XXX
+ SG_ GPS_Compass_direction : 26|4@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_Actual_vs_Infer_pos : 38|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1127 GPS_Data_Nav_3: 8 XXX
+ SG_ GPS_Vdop : 63|5@0+ (0.2,0) [0|0] "" XXX
+ SG_ GPS_Speed : 47|8@0+ (1,0) [0|0] "MPH" XXX
+ SG_ GPS_Sat_num_in_view : 7|5@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_MSL_altitude : 15|12@0+ (10.0,-20460.0) [0|0] "feet" XXX
+ SG_ GPS_Heading : 31|16@0+ (0.01,0) [0|0] "Degrees" XXX
+ SG_ GPS_Hdop : 55|5@0+ (0.2,0) [0|0] "" XXX
+ SG_ GPS_dimension : 2|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 1144 GPS_Data_Nav_4: 8 XXX
+ SG_ VehPos_L_Est : 39|32@0+ (0.01,0) [0|0] "meter" XXX
+ SG_ VehHead_W_Actl : 23|16@0+ (0.01,-327.68) [0|0] "degrees/second" XXX
+ SG_ VehHead_An_Est : 7|16@0+ (0.01,0) [0|0] "degrees" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/ford_cgea1_2_ptcan_2011.dbc b/iqdbc_repo/iqdbc/dbc/ford_cgea1_2_ptcan_2011.dbc
new file mode 100644
index 000000000..128721cbb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/ford_cgea1_2_ptcan_2011.dbc
@@ -0,0 +1,1487 @@
+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
+
+
+BO_ 65 Global_PATS_Control_Info: 8 XXX
+ SG_ immoControlData_T1 : 15|40@0+ (1,0) [0|0] "" XXX
+ SG_ immoControlCmd_T1 : 7|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 66 Global_PATS_Control_Info2: 8 XXX
+ SG_ immoControlData_T2 : 15|40@0+ (1,0) [0|0] "" XXX
+ SG_ immoControlCmd_T2 : 7|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 71 Global_PATS_Target_Info: 8 XXX
+ SG_ immoTarget1Status : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ immoTarget1Data : 15|40@0+ (1,0) [0|0] "" XXX
+ SG_ immoTarget1Cmd : 4|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 72 Global_PATS_Target_Info_2: 8 XXX
+ SG_ immoTarget2Status : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ immoTarget2Data : 15|40@0+ (1,0) [0|0] "" XXX
+ SG_ immoTarget2Cmd : 4|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 73 Global_PATS_SubTarget_FoE: 8 XXX
+ SG_ immoSubTarget1Data_T1 : 15|40@0+ (1,0) [0|0] "" XXX
+ SG_ immoSubTarget1Cmd_T1 : 7|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 74 VehEmergencyData1: 8 XXX
+ SG_ VedsPasSideBag_D_Ltchd : 60|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsPasCrtnBag_D_Ltchd : 55|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsPasBelt_D_Ltchd : 52|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsPasBag_D_Ltchd : 47|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsMultiEvnt_D_Ltchd : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsMaxDeltaV_D_Ltchd : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VedsKneeBag_D_Ltchd : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsEvntType_D_Ltchd : 31|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsEvntRoll_D_Ltchd : 28|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsDrvSideBag_D_Ltchd : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsDrvCrtnBag_D_Ltchd : 20|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsDrvBelt_D_Ltchd : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsDrvBag_D_Ltchd : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ eCallNotification : 2|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 75 VehEmergencyData2: 8 XXX
+ SG_ VedsRw3rBckl_D_Ltchd : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw3mBckl_D_Ltchd : 31|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw3lBckl_D_Ltchd : 28|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw2rBckl_D_Ltchd : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw2mBckl_D_Ltchd : 20|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw2lBckl_D_Ltchd : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw1PasChld_D_Ltchd : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw1PasBckl_D_Ltchd : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw1DrvBckl_D_Ltchd : 4|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw2rRib_D_Ltchd : 47|3@0+ (1,0) [0|0] "" XXX
+ SG_ VedsRw2lRib_D_Ltchd : 36|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 116 BrakeSnData_2_CG1: 8 XXX
+ SG_ VehDynamicsSOS : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ AwdLck_Tq_RqMx : 27|12@0+ (1,0) [0|0] "Nm" XXX
+ SG_ AwdLck_Tq_RqMn : 23|12@0+ (1,0) [0|0] "Nm" XXX
+ SG_ SteWhlComp_An_Est : 7|15@0+ (0.1,-1600.0) [0|0] "deg" XXX
+ SG_ StopLamp_B_RqBrk : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ BrkTerrMdeChng_D_Rdy : 45|3@0+ (1,0) [0|0] "" XXX
+ SG_ BrkTerrMde_D_Actl : 42|3@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCompAnEst_D_Qf : 47|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 117 BrakeSnData_3_CG1: 8 XXX
+ SG_ HsaStat_D_Dsply : 35|3@0+ (1,0) [0|0] "" XXX
+ SG_ HsaTrnAout_Tq_Rq : 55|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ HsaStat_D_Actl : 38|3@0+ (1,0) [0|0] "" XXX
+ SG_ HsaRoad_Grad_Est : 32|9@0+ (0.5,-127.0) [0|0] "%" XXX
+ SG_ VehYawComp_W_Actl : 7|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX
+ SG_ VehYaw_W_Rq : 11|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX
+ SG_ VehSideSlip_An_Est : 31|9@0+ (0.002,-0.5) [0|0] "rad" XXX
+
+BO_ 124 BrakeSnData_4_CG1: 8 XXX
+ SG_ EngRun_D_ReqBrk : 10|2@0+ (1,0) [0|0] "" XXX
+ SG_ BrkTotTqRqArb_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ BrkTotTqRqArb_No_Cnt : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ BrkTot_Tq_RqArb : 7|13@0+ (4.0,0) [0|0] "Nm" XXX
+ SG_ BrkTot_Tq_Actl : 39|13@0+ (4.0,0) [0|0] "Nm" XXX
+ SG_ VehOverGnd_V_Est : 55|16@0+ (0.01,0) [0|0] "kph" XXX
+
+BO_ 129 Steering_Wheel_Data2: 8 XXX
+ SG_ SteWhlCtl_RSide_OK : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_RSide_CursorUp : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_RSide_CursorRt : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_RSide_CursorLeft : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_RSide_CursorDown : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_LSide_OK : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_LSide_CursorUp : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_LSide_CursorRt : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_LSide_CursorLeft : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_LSide_CursorDown : 0|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 130 EPAS_INFO: 8 XXX
+ SG_ SteMdule_U_Meas : 39|8@0+ (0.05,6.0) [0|0] "Volts" XXX
+ SG_ SteMdule_I_Est : 21|12@0+ (0.05,-64.0) [0|0] "Amps" XXX
+ SG_ EPAS_FAILURE : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SteeringColumnTorque : 7|8@0+ (0.0625,-8.0) [0|0] "Nm" XXX
+ SG_ SAPPAngleControlStat6 : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat5 : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat4 : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat3 : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat2 : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat1 : 23|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 131 Steering_Data: 8 XXX
+ SG_ SteWhlCtl_Mute : 38|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Mode : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_OK : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Phone : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_End : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Send : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Voice_PTT : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Seek_Left : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Seek_Right : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Media : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Volume_Down : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlCtl_Volume_Up : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ Smart_Wiper_Motor_Stat : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Mfs_Turn_Stalk_SW_Status : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ HighBeam_FlashToPassSw : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ SteColumn_Status : 13|3@0+ (1,0) [0|0] "" XXX
+ SG_ SteCol_Manual_Override : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ CcButtnStat_D_Actl : 34|11@0+ (1,0) [0|0] "" XXX
+ SG_ HeatedWash_Mode_Stat : 55|3@0+ (1,0) [0|0] "" XXX
+ SG_ LaSwtchPos_D_Stat : 18|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 132 Steering_Wheel_Data_CG1: 8 XXX
+ SG_ SteWhlRelInit_An_Sns : 7|15@0+ (0.1,-1600.0) [0|0] "deg" XXX
+ SG_ SteWhlRelCalib_An_Sns : 23|15@0+ (0.1,-1600.0) [0|0] "deg" XXX
+ SG_ SteWhlRelInit2_An_Sns : 55|16@0+ (0.1,-3200.0) [0|0] "deg" XXX
+ SG_ SteWhlAn_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlAn_No_Cnt : 47|4@0+ (1,0) [0|0] "Counts" XXX
+
+BO_ 145 Yaw_Data: 8 XXX
+ SG_ VehYaw_W_Actl : 39|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+ SG_ VehRol_W_Actl : 23|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+ SG_ VehPtch_W_Actl : 7|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+
+BO_ 146 Accel_Data: 8 XXX
+ SG_ VehVertAActl_D_Qf : 38|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehLongAActl_D_Qf : 22|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehLatAActl_D_Qf : 6|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehVert_A_Actl : 36|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX
+ SG_ VehLong_A_Actl : 20|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX
+ SG_ VehLat_A_Actl : 4|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX
+
+BO_ 258 Cluster_Legacy: 8 XXX
+ SG_ Veh_V_CompLimMx : 27|12@0+ (0.1,0) [0|0] "km/h" XXX
+ SG_ DISPLAY_SPEED_SCALING : 20|4@0+ (0.5,100.0) [0|0] "%" XXX
+ SG_ DISPLAY_SPEED_OFFSET : 23|3@0+ (0.5,0) [0|0] "kph" XXX
+ SG_ Reverse_Mirror_Cmd : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ Autolamp_Delay_Cmd : 7|8@0+ (1,0) [0|0] "Seconds" XXX
+ SG_ Running_Board_Cmd : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Liftgate_Mode_Cmd : 11|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 259 Body_MsgCntr_Stat_CG1: 8 XXX
+ SG_ PE_PEPS_System_Stat : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ Keycode_Status : 11|20@0+ (1,0) [0|0] "" XXX
+ SG_ Autolamp_Delay_Stat : 7|8@0+ (1,0) [0|0] "Seconds" XXX
+ SG_ HvacEvap_Te_Rq_UB : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacEvap_Te_Rq : 55|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ Remote_Start_QuietMode_UB : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ Remote_Start_QuietMode : 32|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 264 Side_Detect_CmdM: 8 XXX
+ SG_ Cross_Traffic_Cmd : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ Side_Detect_Cmd : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 266 ParkAid_Audible_Warn_CmdM: 8 XXX
+ SG_ AutoPark_Cancel_Request : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ ParkAid_Audible_Warn_Cmd : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ ParkAid_Aud_Frt_Warn_Cmd : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 267 ParkAid_Audible_Warn_Stat: 8 XXX
+ SG_ RpaChime_D_Rq : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ FpaChime_D_Rq : 12|4@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPStatusCoding : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ Volume_Cutback : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ ParkAid_Fault_Condition : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ ParkAid_Audible_Warn_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ ParkAid_Aud_Frt_Trgt_Warn : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ ParkAid_Aud_Frt_Warn_Stat : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 292 ClmtCtrlSeatSet_Cmd_v2: 8 XXX
+ SG_ ClmtCtrlSeat_SetCmd_Dvr : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ ClmtCtrlSeat_SetCmd_Psgr : 15|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 293 ClmtCtrlSeatSetStat_v2_HS: 8 XXX
+ SG_ ClmtCtrlSeat_SetStat_Psgr : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ ClmtCtrlSeat_SetStat_Dvr : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 336 TransData_1_CG1: 8 XXX
+ SG_ TrnAinIdl_N_RqMn : 34|11@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ TrnAin_N_RqMxPrtct : 23|10@0+ (25.0,0) [0|0] "rpm" XXX
+ SG_ TrnAin_Tq_RqFstMx : 29|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_Tq_RqSlwMxPrs : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX
+
+BO_ 337 EngineData_1_CG1: 8 XXX
+ SG_ TrnEngBrk_B_Allw : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAout_W_ActlUnfilt : 23|15@0+ (0.1,0) [0|0] "rad/s" XXX
+ SG_ TrnIpcDsplyGear_D_Actl : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrnIpcDsplyMde_D_Stat : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ TrnIpcDsplyMde_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrnIpcDsplyGear_D_Stat : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ TurboBoostPressure : 55|16@0+ (0.01,0) [0|0] "bar" XXX
+
+BO_ 338 TransData_2_CG1: 8 XXX
+ SG_ GearPos_D_Actl : 55|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAout2_Tq_Actl : 39|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ TrnTotTq_Rt_Actl : 23|16@0+ (0.001,0) [0|0] "" XXX
+ SG_ TrnGbox_Rt_Pred : 7|16@0+ (0.001,0) [0|0] "" XXX
+
+BO_ 339 EngineData_2_CG1: 8 XXX
+ SG_ TrnAin_Tq_MxSpcPdlEngN : 55|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_Tq_MnSpcEngN : 31|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngPtoEngag_B_Actl : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAin_N_SpcEcho : 4|13@0+ (2.0,0) [0|0] "rpm" XXX
+
+BO_ 340 EngineData_3_CG1: 8 XXX
+ SG_ AirAmb_Te_ActlFilt : 33|10@0+ (0.25,-128.0) [0|0] "deg C" XXX
+ SG_ EngAout_N_RqMxPrtct : 12|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ TqmTerrMdeChng_D_Rdy : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutIdl_N_RqVsc : 7|11@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ TqmTerrMde_D_Actl : 36|3@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTotVrt_Tq_RqArb : 55|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+
+BO_ 341 EngineData_11_CG1: 8 XXX
+ SG_ DieslPrtc_D_RqDsply : 42|3@0+ (1,0) [0|0] "" XXX
+ SG_ EngPullUpPullDown_D_Rq : 20|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAin_Tq_RqDrv : 15|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ DieslPrtcRgen_D_Actl : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ DieslPrtcRgen_D_Rq : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_Aa_Actl : 39|10@0+ (0.05,-25.6) [0|0] "rpm/ms" XXX
+ SG_ EngIgnIndTq_Rt_MnEc : 31|8@0+ (0.005,0) [0|0] "" XXX
+ SG_ EngFuelCutFull_B_Allw : 45|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngStrtStopDis_B_Rq : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrplTqSys_D_Stat : 2|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutTqDtrb_B_Actl : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngTurboMde_D_Actl : 44|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngTeColdPrtct_D_Stats : 54|2@0+ (1,0) [0|0] "" XXX
+ SG_ EXHAUST_OVERTEMP_PROTECT : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngExhOvrTe_B_RqDsply : 55|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 342 Engine_Data_6: 8 XXX
+ SG_ EngOvrhtMitgActv_D_Ind : 36|2@0+ (1,0) [0|0] "" XXX
+ SG_ Res_UreaLvlLo_B_Dsply : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngClntTe_D_Qf : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngAcsyArcPmp_Tq_Actl : 63|8@0+ (0.5,0) [0|0] "Nm" XXX
+ SG_ EngOilLvlDsply_D_Rq : 43|4@0+ (1,0) [0|0] "" XXX
+ SG_ EngCtlAlive_No_Cnt : 47|4@0+ (1,0) [0|0] "" XXX
+ SG_ EngCtl_No_Cs : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ EngOil_Te_Actl : 15|8@0+ (1,-60.0) [0|0] "degC" XXX
+ SG_ EngClnt_Te_Actl : 7|8@0+ (1,-60.0) [0|0] "degC" XXX
+
+BO_ 343 EngineData_13_CG1: 8 XXX
+ SG_ EngStrtFail_B_Actl : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngStrt_B_Complt : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngStrtSpin_B_Rdy : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngWarmUp_B_Complt : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutTqCtl_B_Falt : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutActl_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutActl_No_Cnt : 45|4@0+ (1,0) [0|0] "" XXX
+ SG_ VehVLim_V_RqArb : 39|9@0+ (0.5,0) [0|0] "kph" XXX
+
+BO_ 344 EngineData_14: 8 XXX
+ SG_ ApedPosScal_Pc_Actl : 9|10@0+ (0.1,0) [0|0] "%" XXX
+ SG_ ApedPosPcActl_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ ApedPosPcActl_No_Cnt : 13|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 345 Engine_Data_7_CG1: 8 XXX
+ SG_ EngDecelFuelCut_B_Allw : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ FuelFlw_Vl_Dsply : 55|10@0+ (25.0,0) [0|0] "Micro_Liter" XXX
+ SG_ FuelFillInlet_B_Dsply : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngSrvcRqd_B_Rq : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ OdoCount : 47|8@0+ (0.2,0) [0|0] "Meters" XXX
+ SG_ EngOilLife_Pc_Actl : 39|7@0+ (1,0) [0|0] "%" XXX
+ SG_ AirAmbTe_D_Qf : 28|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngTqSlwDly_T_Est : 23|11@0+ (1,0) [0|0] "ms" XXX
+ SG_ TrnKickDown_B_RqDrv : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirAmb_Te_Actl : 1|10@0+ (0.25,-128.0) [0|0] "degC" XXX
+ SG_ AirAmb_P_Actl : 7|6@0+ (10.0,500.0) [0|0] "mbar" XXX
+ SG_ FuelFilterLamp_B_Dsply : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondRec_B_Rq : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondEvdc_D_Stats : 60|3@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondClutch_B_Stats : 57|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 346 EngineData_4_CG1: 8 XXX
+ SG_ TrnAin_Tq_Rq : 12|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_Tq_RqWoMdfy : 55|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_Tq_ActlWoMdfy : 36|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_Tq_Actl : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAinCtlN_B_Allw : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAinTq_D_Qf : 17|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 348 EngineData_16_CG1: 8 XXX
+ SG_ EngOilLvlWarn_D_Rq1 : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ EngExhBrkOnLamp_B_Rq : 51|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngExhBrkAutoLamp_B_Rq : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_N_MxAllw : 36|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ EngAoutIdl_N_MnAllw : 31|11@0+ (1,0) [0|0] "rpm" XXX
+ SG_ EngAoutIdlRqEc_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutIdlRqEc_No_Cnt : 12|4@0+ (1,0) [0|0] "" XXX
+ SG_ EngAoutIdl_N_RqEc : 7|11@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ EngExhBrkMde_D_Actl : 55|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 349 EngineData_17_CG1: 8 XXX
+ SG_ EngResv_Tq_Actl : 52|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngAout_Tq_ActlSlw : 47|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngExhCat_Te_Est : 13|10@0+ (2.0,-60.0) [0|0] "degC" XXX
+ SG_ EngCylCutIndTq_Rt_Actl : 39|8@0+ (0.005,0) [0|0] "Nm" XXX
+ SG_ Eng_Aa_CalcEvntCyc : 7|10@0+ (0.05,-25.6) [0|0] "rpm/ms" XXX
+ SG_ Eng_Aa_CalcEvntCbust : 19|10@0+ (0.05,-25.6) [0|0] "rpm/ms" XXX
+ SG_ WaterInFuel : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ GlowIndication : 24|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 350 EngineData_18_CG1: 8 XXX
+ SG_ EngAoutTqActl_D_Qf : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_Tq_MnSpcNRtrd : 36|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngAout_Tq_Actl : 31|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngAoutLss_Tq_EstSpcN : 12|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngAout_Tq_MnSpcN : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX
+
+BO_ 351 EngineData_19: 8 XXX
+ SG_ VehPreDelvr_V_LimMx : 15|16@0+ (0.01,0) [0|0] "kph" XXX
+ SG_ BattLo_U_MeasEngMdule : 7|8@0+ (0.1,0) [0|0] "V" XXX
+ SG_ EngStall_B_Actl : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngDashPotActv_B_Actl : 46|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_Tq_MnAllw : 42|11@0+ (1,-500.0) [0|0] "Nm" XXX
+
+BO_ 352 TransData_3_CG1: 8 XXX
+ SG_ TrnAinCtlN_N_RqMx : 7|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ TrnAin_Tq_RqSlwMxShif : 42|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAinCtlN_B_RqEnbl : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnGboxIn_N_Actl : 23|13@0+ (2.0,0) [0|0] "rpm" XXX
+
+BO_ 353 Engine_Data_8: 8 XXX
+ SG_ TrnAinTqDtrb_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAin_Tq_MnSpcEngN : 34|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngAout_N_RqMnPrtct : 20|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ EngAout_N_MnAllw : 4|13@0+ (2.0,0) [0|0] "rpm" XXX
+
+BO_ 354 CGEA_Urea_Strategy_CG1: 8 XXX
+ SG_ UreaQltySys_D_RqDsply : 27|3@0+ (1,0) [0|0] "" XXX
+ SG_ UreaLvlTxt_D_RqDsply : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ VehUreaImmo_No_DsplyMx : 12|3@0+ (1,0) [0|0] "Counts" XXX
+ SG_ VehUreaWarn_V_DsplyMx : 23|7@0+ (1,0) [0|0] "km/h" XXX
+ SG_ VehUreaRnge_L_DsplyMx : 7|11@0+ (1,0) [0|0] "km" XXX
+
+BO_ 355 EngineData_10: 8 XXX
+ SG_ WhlRearDual_D_Stat : 57|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngPtoMde_D_Actl : 60|3@0+ (1,0) [0|0] "" XXX
+ SG_ ManRgenVeh_V_MinAllw : 55|7@0+ (1,0) [0|0] "kilometer/hour" XXX
+ SG_ ManRgenTxt_D_RqDsply : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ ManRgenSoot_Pc_RqDsply : 39|7@0+ (1,0) [0|0] "%" XXX
+ SG_ ManRgenInhbt_T_RqDsply : 23|16@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ ManRgenInhbt_Pc_Soot : 47|7@0+ (1,0) [0|0] "%" XXX
+ SG_ ManRgenInhbt_L_RqDsply : 7|16@0+ (1,0) [0|0] "kilometer" XXX
+
+BO_ 357 EngBrakeData: 8 XXX
+ SG_ CmbbDeny_B_ActlPrpl : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ BpedDrvAppl_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ BpedDrvAppl_No_Cnt : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ BpedDrvAppl_D_Actl : 31|2@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbEngTqMn_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_DsplyCcSet : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ AccEngStat_D_Actl : 2|3@0+ (1,0) [0|0] "" XXX
+ SG_ CcMde_D_Actl : 13|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAinTqDtrb_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ CcStat_D_Actl : 10|3@0+ (1,0) [0|0] "" XXX
+ SG_ CcOvrrdActv_B_Actl : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ PwPck_D_Stat : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 389 ACCDATA_CG1: 8 XXX
+ SG_ AccPrpl_A_Pred : 14|10@0+ (0.01,-5.0) [0|0] "m/s^2" XXX
+ SG_ AccBrkPrkEl_B_Rq : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cmbb_B_Enbl : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbOvrrd_B_RqDrv : 57|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbDeny_B_Actl : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccVeh_V_Trg : 7|9@0+ (0.5,0) [0|0] "kph" XXX
+ SG_ CmbbEngTqMn_B_Rq : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccPrpl_A_Rq : 55|10@0+ (0.01,-5.0) [0|0] "m/s^2" XXX
+ SG_ AccDeny_B_Rq : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccCancl_B_Rq : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkTot_A_Rq : 39|13@0+ (0.0039,-20.0) [0|0] "m/s^2" XXX
+ SG_ AccBrkPrchg_B_Rq : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkDecel_B_Rq : 61|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 392 HeadUpDisplayStat: 8 XXX
+ SG_ Hud_B_Falt : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ HudActv_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ Hud_B_Avail : 6|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 393 ACCDATA_2_CG1: 8 XXX
+ SG_ ACC_AUTOBRAKE_CANCEL : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ ACC_RESUME_ACTIVE : 57|1@0+ (1,0) [0|0] "" XXX
+ SG_ FcwAudioWarn_B_Rq : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ CadsAudioMute_D_Rq : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ AccWarn_D_Dsply : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ HudDsplyIntns_No_Actl : 55|8@0+ (0.5,0) [0|0] "%" XXX
+ SG_ FcwVisblWarn_B_Rq : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ HudBlk3_B_Rq : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ HudBlk2_B_Rq : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ HudBlk1_B_Rq : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ HudFlashRate_D_Actl : 45|2@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBrkDecel_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBrkDecel_A_Rq : 23|13@0+ (0.0039,-20.0) [0|0] "m/s^2" XXX
+ SG_ CmbbBrkPrchg_D_Rq : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBrkDecel_B_Rq : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBaSens_D_Rq : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ AccPrpl_V_Rq : 7|16@0+ (0.01,0) [0|0] "kph" XXX
+
+BO_ 394 ACCDATA_3: 8 XXX
+ SG_ CadsMntr_No_Chk : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ FcwDeny_B_Dsply : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ FdaWarn_B_Rq : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ FcwMemStat_B_Actl : 30|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccTGap_B_Dsply : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccMsgTxt_D_Rq : 39|4@0+ (1,0) [0|0] "" XXX
+ SG_ CadsAlignIncplt_B_Actl : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccLowVMde_B_Dsply : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccFllwMde_B_Dsply : 17|1@0+ (1,0) [0|0] "" XXX
+ SG_ CadsRadrBlck_B_Actl : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ FdaStat_D_Dsply : 3|3@0+ (1,0) [0|0] "" XXX
+ SG_ FdaDeny_B_Dsply : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccTrgDist_D_Dsply : 28|4@0+ (1,0) [0|0] "" XXX
+ SG_ CadsChime_B_Rq : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbPostEvnt_B_Dsply : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ FcwCmbbSrvcRqd_B_Rq : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccStopMde_B_Dsply : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ CadsCamraBlck_B_Actl : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ FcwMemSens_D_Actl : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ FcwMemDfaltOn_B_Actl : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccSrvcRqd_B_Rq : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ FcwMsgTxt_D_Rq : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ FcwMemAudioOn_B_Actl : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccTGap_D_Dsply : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ AccMemEnbl_B_RqDrv : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ FdaMem_B_Stat : 41|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 512 TorqueDataEngFlags: 8 XXX
+ SG_ BrkOnOffSwtch_D_Actl : 54|2@0+ (1,0) [0|0] "" XXX
+ SG_ PrplTqMnSat_B_Actl : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTot_Tq_Rq : 39|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ PrplWhlTot_Tq_LimMn : 23|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ PrplWhlTot_Tq_Actl : 7|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ ACCompressorDisp : 63|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 513 EngVehicleSpThrottle_CG1: 8 XXX
+ SG_ ApedPos_PcRate_ActlArb : 63|8@0+ (0.04,-5.0) [0|0] "%/ms" XXX
+ SG_ Veh_V_RqCcSet : 45|9@0+ (0.5,0) [0|0] "kph" XXX
+ SG_ VehVActlEng_D_Qf : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ reserve : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout_N_Actl : 7|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ Veh_V_ActlEng : 23|16@0+ (0.01,0) [0|0] "kph" XXX
+ SG_ ApedPos_Pc_ActlArb : 39|10@0+ (0.1,0) [0|0] "%" XXX
+ SG_ ApedPosPcActl_D_Qf : 52|2@0+ (1,0) [0|0] "" XXX
+ SG_ Autostart_B_Stat : 50|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 529 DesiredTorqBrk_CG1: 8 XXX
+ SG_ CmbbBrkDis_B_Actl : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ CMbbDeny_B_ActlBrk : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ RgenTqLimActv_B_Actl : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ CcDis_B_Cmd : 53|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrk_Pc_Rq : 39|7@0+ (1,0) [0|0] "%" XXX
+ SG_ RearDiffLck_Tq_RqMx : 23|12@0+ (1,0) [0|0] "Nm" XXX
+ SG_ VehLongOvrGnd_A_Est : 47|10@0+ (0.035,-17.9) [0|0] "m/s^2" XXX
+ SG_ StabCtlBrkActv_B_Actl : 27|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBrkPrchg_B_Actl : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBrkDecel_B_Actl : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbBaSensInc_B_Actl : 57|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkWarm_B_Actl : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkTotTqMn_B_Actl : 62|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkPrchgActv_B_Actl : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkDis_B_Actl : 50|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkDeny_B_Actl : 49|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccBrkActv_B_Actl : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrplDrgCtlActv_B_Actl : 52|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTot_Tq_RqMx : 7|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ AbsActv_B_Actl : 51|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 533 WheelSpeed_CG1: 8 XXX
+ SG_ WhlRr_W_Meas : 55|15@0+ (0.01,0) [0|0] "rad/s" XXX
+ SG_ WhlRl_W_Meas : 39|15@0+ (0.01,0) [0|0] "rad/s" XXX
+ SG_ WhlFr_W_Meas : 23|15@0+ (0.01,0) [0|0] "rad/s" XXX
+ SG_ WhlFl_W_Meas : 7|15@0+ (0.01,0) [0|0] "rad/s" XXX
+
+BO_ 534 WheelData: 8 XXX
+ SG_ WhlRotatRr_No_Cnt : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRr_D_Actl : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRl_D_Actl : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFr_D_Actl : 37|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFl_D_Actl : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFr_No_Cnt : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ WHEEL_ROLLING_TIMESTAMP : 47|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 557 InfoCAN_22D: 8 XXX
+ SG_ Multimedia_System : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 560 TransGearData: 8 XXX
+ SG_ TrnIpcDsplyRng_D_Actl : 14|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrnGbox_Rt_Actl : 47|16@0+ (0.001,0) [0|0] "" XXX
+ SG_ TrnShifMde_D_RqDrv : 3|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrnSrvcRqd_B_Rq : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ GearPos_D_Trg : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrnCnvtClu_D_Actl : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ TrnShifActv_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ RtmTerrMdeChng_D_Rdy : 58|3@0+ (1,0) [0|0] "" XXX
+ SG_ RtmTerrMde_D_Actl : 61|3@0+ (1,0) [0|0] "" XXX
+ SG_ GearRvrseActv_B_Actl : 62|1@0+ (1,0) [0|0] "" XXX
+ SG_ GearLvrPos_D_Actl : 23|4@0+ (1,0) [0|0] "" XXX
+ SG_ GboxOil_Te_Actl : 31|8@0+ (1,-60.0) [0|0] "degC" XXX
+
+BO_ 561 TransGearData_2: 8 XXX
+ SG_ MtrGen1Aout_Tq_Rq : 53|14@0+ (0.1,-800.0) [0|0] "Nm" XXX
+ SG_ MtrGen1AoutTqRq_No_Cs : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ MtrGen1AoutTqRq_No_Cnt : 15|4@0+ (1,0) [0|0] "" XXX
+ SG_ CoolFanTrn_D_Rq : 31|5@0+ (1,0) [0|0] "" XXX
+ SG_ TrnMsgTxt_D_Rq : 39|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrnMil_D_Rq : 26|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngExhBrkTq_Pc_Rq : 23|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 562 TransGearData_3_CG1: 8 XXX
+ SG_ TrnPto_D_Rdy : 12|2@0+ (1,0) [0|0] "" XXX
+ SG_ TipInMgrInhbt_B_RqTrn : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAinIdl_Tq_Actl : 39|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAinLss_Tq_Est : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_Tq_RqSlwMn : 23|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ GearEngag_D_Actl : 10|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAinTqDtrb_B_Rq : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnTotLss_Tq_Actl : 55|8@0+ (0.5,0) [0|0] "Nm" XXX
+
+BO_ 563 TransGearData_4_CG1: 8 XXX
+ SG_ TrnAinCtlN_N_RqMn : 20|13@0+ (2.0,0) [0|0] "rpm" XXX
+ SG_ TrnAinTqMn_No_Cs : 63|8@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAinTqMn_No_Cnt : 11|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAinRq_Pc_SpcPdl : 7|10@0+ (0.1,0) [0|0] "%" XXX
+ SG_ TrnAin_Tq_RqFstMn : 42|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ TrnAin_N_SpcEng : 39|13@0+ (2.0,0) [0|0] "rpm" XXX
+
+BO_ 570 Suspension_Stat: 8 XXX
+ SG_ CcdMsgTxt_D_RqDsply : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ SuspRear_L_Prev : 48|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX
+ SG_ SuspRear_L_Actl : 32|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX
+ SG_ SuspFrnt_L_Prev : 16|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX
+ SG_ SuspFrnt_L_Actl : 0|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX
+
+BO_ 571 ColumnLockData: 8 XXX
+ SG_ SteWhlLckMsgTxt_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 576 Body_Information_4_CG1: 8 XXX
+ SG_ HvacRec_Pc_Est_UB : 51|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacRec_Pc_Est : 38|7@0+ (1,0) [0|0] "%" XXX
+ SG_ HvacEngIdleInc_B_Rq_UB : 49|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacEngIdleInc_B_Rq : 53|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacAir_Flw_Est_UB : 52|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacAir_Flw_Est : 31|9@0+ (0.5,0) [0|0] "liter/second" XXX
+ SG_ AmbTempImpr_UB : 50|1@0+ (1,0) [0|0] "" XXX
+ SG_ AmbTempImpr : 47|10@0+ (0.25,-128.0) [0|0] "degreesC" XXX
+ SG_ DriverCrankingReq : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fcw_B_DenyMntr : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngOff_T_Actl : 7|16@0+ (1,0) [0|0] "seconds" XXX
+ SG_ CmbbMntr_B_Err : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ CmbbDeny_B_RqMntr : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccMntr_B_Err : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccDeny_B_RqMntr : 19|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 592 EONV_Status: 8 XXX
+ SG_ EONV_FAULT : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_KAL_IC_RQST : 53|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_T_STATUS : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_VREF_FLT : 62|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_VBATT_FLT : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_CANISTER_VENT_FLT : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_CVS_CLOSED : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_BATT_VOLT : 23|16@0+ (0.0009765625,0) [0|0] "volts" XXX
+ SG_ EONV_TANK_FLT : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_TANK_PRESS : 7|16@0+ (0.001953125,-64.0) [0|0] "inches H2O" XXX
+
+BO_ 597 EONV_Control: 8 XXX
+ SG_ EONV_POS_DET_THRESHOLD : 23|16@0+ (0.001953125,-64.0) [0|0] "inches H2O" XXX
+ SG_ EONV_STAY_ALIVE : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_CVS_MODE : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ EONV_NEG_DET_THRESHOLD : 39|16@0+ (0.001953125,-64.0) [0|0] "inches H2O" XXX
+ SG_ EONV_MIL_ON : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ EonvMsgTxOff_B_Rq : 4|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 608 Information4x4_CG1: 8 XXX
+ SG_ AwdRngeShifActv_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrnAout_Tq_RqMx : 47|13@0+ (1,-1250.0) [0|0] "Nm" XXX
+ SG_ AwdRngeFalt_D_Stat : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdLck_Tq_Actl : 15|12@0+ (1,0) [0|0] "Nm" XXX
+ SG_ AwdRnge_D_Actl : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ AwdTerrMdeChng_D_Rdy : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ AwdTerrMde_D_Actl : 58|3@0+ (1,0) [0|0] "" XXX
+ SG_ AwdOffRoadMode_D_Stats : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdStat_D_RqDsply : 63|5@0+ (1,0) [0|0] "" XXX
+ SG_ AwdLoLamp_D_RqDsply : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdHiLamp_D_RqDsply : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdAutoLamp_D_RqDsply : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdLckLamp_D_RqDsply : 27|2@0+ (1,0) [0|0] "" XXX
+ SG_ AwdLck_D_Stat : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ Awd2wdLamp_D_RqDsply : 2|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 609 AWD_4x4_Data: 8 XXX
+ SG_ AwdLck_Tq_Rq : 27|12@0+ (1,0) [0|0] "Nm" XXX
+ SG_ AwdSrvcRqd_B_Rq : 44|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 613 PassengerSeatOCSInfo: 8 XXX
+ SG_ VehicleMYCalibrationId : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VehicleCalibrationId : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSensrDataUpperLim : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSensrDataLowerLim : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSLevel2Error : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ ObjectEntrapped : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ OCSLevel1Error : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 736 FCIM_Button_Press_HS: 8 XXX
+ SG_ FCIM_Target_ID : 13|4@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Button_Type : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Button_State : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Target_ID_UB : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Button_Type_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ FCIM_Button_State_UB : 8|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 806 Compressor_Req_HS: 8 XXX
+ SG_ HvacEvap_Te_Rq : 33|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ HvacAirCond_B_Rq : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacEvap_Te_Offst : 1|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+
+BO_ 832 RCMStatusMessage: 8 XXX
+ SG_ eCallNotification : 2|2@0+ (1,0) [0|0] "" XXX
+ SG_ CrashNotification : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBucklePsngr : 57|2@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBuckleMid : 59|2@0+ (1,0) [0|0] "" XXX
+ SG_ ThirdRowBuckleDriver : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBucklePsngr : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBuckleMid : 49|2@0+ (1,0) [0|0] "" XXX
+ SG_ SecondRowBuckleDriver : 51|2@0+ (1,0) [0|0] "" XXX
+ SG_ FirstRowBuckleDriver : 55|2@0+ (1,0) [0|0] "" XXX
+ SG_ RstrnTotalEvntCnt : 43|4@0+ (1,0) [0|0] "" XXX
+ SG_ RstrnCurrentEvntCnt : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ RILReq : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ FuelCutoffReq : 13|4@0+ (1,0) [0|0] "" XXX
+ SG_ SeatbeltIndicatorReq : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatbeltChimeReq : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ BeltMinderProgConfReq : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ BeltMinderLevelReq : 19|4@0+ (1,0) [0|0] "" XXX
+ SG_ FirstRowBucklePsngr : 53|2@0+ (1,0) [0|0] "" XXX
+ SG_ InfoLampReq : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ GenRedLampReq : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ RstrnTextMsgReq : 27|2@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNumRcvd : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ RstrnStatDeployEnbld : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ RstrnImpactEvntStatus : 46|3@0+ (1,0) [0|0] "" XXX
+ SG_ PassRstrnInd_Req : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ RstrnStatTrigEvnt : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ PsngrFrntDetct_D_Actl : 31|2@0+ (1,0) [0|0] "" XXX
+ SG_ Beltminder_Warn_Stats : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ EDRTriggerEvntSync : 47|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 842 MassageSeat_Data1_HS: 8 XXX
+ SG_ SeatLmbrUpDrv_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrMidDrv_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrLoDrv_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlUpDrv_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlLoDrv_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 843 MassageSeat_Data2_HS: 8 XXX
+ SG_ SeatLmbrUpPsgr_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrMidPsgr_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatLmbrLoPsgr_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlUpPsgr_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatBlLoPsgr_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 844 MassageSeat_Stat1_HS: 8 XXX
+ SG_ StmsLmbrDrv_D_Stat : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ StmsCshnDrv_D_Stat : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ SeatSwtchDrv_B_Stat : 31|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDrv_D_Stat : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ SeatAirAmb_P_Actl : 7|16@0+ (0.01,0) [0|0] "KiloPascal" XXX
+ SG_ SeatPDrv_B_Stat : 20|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 845 MassageSeat_Stat2_HS: 8 XXX
+ SG_ StmsLmbrPsgr_D_Stat : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ StmsCshnPsgr_D_Stat : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ SeatSwtchPsgr_B_Stat : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatPPsgr_B_Stat : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnPsgr_D_Stat : 6|3@0+ (1,0) [0|0] "" XXX
+ SG_ PsgrMemFeedback_Rsp : 3|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 846 MassageSeat_Req: 8 XXX
+ SG_ SeatFnPsgr_D_Rq : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDrv_D_Rq : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDfaltPsgr_B_Rq : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnDfaltDrv_B_Rq : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnChngPsgr_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ SeatFnChngDrv_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ PsgrMemory_Rq : 3|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 848 RestraintsData: 8 XXX
+ SG_ PassRstrnInd_Stat_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ SeatBltWrnChmeStat : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Seatbelt_IndctrStat : 4|3@0+ (1,0) [0|0] "" XXX
+ SG_ RILStat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ PassRstrnInd_Stat : 15|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 849 MassageSeat_Data3_HS: 8 XXX
+ SG_ SeatCshnDrvRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnDrvRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnDrvFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnDrvFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 850 MassageSeat_Data4_HS: 8 XXX
+ SG_ SeatCshnPsgrRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnPsgrRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnPsgrFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX
+ SG_ SeatCshnPsgrFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX
+
+BO_ 853 EFP_CC_Status: 8 XXX
+ SG_ Save_My_Temp : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Left_Temp_Setpt : 31|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RrDefrost_HtdMirrorReq : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Control_Status : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ MultipleButtonPressReq : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_System_Mode_Req : 19|3@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Left_Temp_Setpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ Recirc_Request : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Rt_Temp_Setpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ AC_Request : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Windshield_ModeRequest : 15|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Panel_Mode_Request : 7|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Overriding_ModeReq : 10|3@0+ (1,0) [0|0] "" XXX
+ SG_ Forced_Recirc_Req : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_Request : 3|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Rear_Right_Temp_Setpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX
+
+BO_ 854 EFP_CC_Seat_Req_Stat: 8 XXX
+ SG_ Front_Rear_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX
+ SG_ Pass_Rr_Cond_Seat_Req : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Rr_Cond_Seat_Lvl : 8|3@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Fr_Cond_Seat_Req : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Fr_Cond_Seat_Lvl : 11|3@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Rr_Cond_Seat_Req : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Rr_Cond_Seat_Lvl : 2|3@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Fr_Cond_Seat_Req : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Fr_Cond_Seat_Lvl : 5|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 855 RCCM_CC_Status_HS: 8 XXX
+ SG_ RrBlwrCondStLdShedStat : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ FrBlwrCondStLdShedStat : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_Rr_Rt_TempSetpt : 63|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Rr_Left_TempSetpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Fr_Rt_TempSetpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RCCM_Fr_Rr_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX
+ SG_ Panel_Mode_State : 7|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ RrDefHtdMirrLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX
+ SG_ Windshield_Mode_State : 15|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ Recirc_Door_State : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_System_Mode_State : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ Default_Defrost_State : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Auto_AC_Indicator_Temp : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ Floor_Mode_State : 3|4@0+ (8.33,0) [0|0] "%" XXX
+ SG_ RCCM_Fr_Left_TempSetpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX
+ SG_ RrDefrost_HtdMirrState : 8|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 856 RCCM_CC_Seat_Status_HS: 8 XXX
+ SG_ Active_My_Temp : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_HtdStrWhl_Req : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PR_Cond_Seat_Lvl : 31|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PR_Cond_Seat_Req : 28|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PF_Cond_Seat_Req : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_PF_Cond_Seat_Lvl : 23|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DR_Cond_Seat_Req : 12|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DR_Cond_Seat_Lvl : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DF_Cond_Seat_Req : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ RCCM_DF_Cond_Seat_Lvl : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ PassRrCondStLdShedStat : 26|2@0+ (1,0) [0|0] "" XXX
+ SG_ PassFrCondStLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvRrCondStLdShedStat : 10|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvFrCondStLdShedStat : 1|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 857 RCCM_CC_MBP_Press_Stat_HS: 8 XXX
+ SG_ MultBtnPushDsplyPass10 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyPass1 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ Report_Active : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ Pass_Temp_Units : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Fan_Bars_Disply : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ Drvr_Temp_Units : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyDrvr10 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ MultBtnPushDsplyDrvr1 : 15|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 859 MFD_CC_Status_HS: 8 XXX
+ SG_ Rear_Mode_Bttn_Status : 38|1@0+ (1,0) [0|0] "" XXX
+ SG_ ConditionSt_ButtonStat : 20|5@0+ (1,0) [0|0] "" XXX
+ SG_ Driver_Set_Temp : 31|8@0+ (0.5,0) [0|0] "Degrees" XXX
+ SG_ Frt_System_Button_Stat : 7|5@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Blower_Bar_Status : 2|3@0+ (1,0) [0|0] "# of Bars" XXX
+ SG_ Rear_Fan_Button_Status : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Man_Temp_Bar_Stat : 11|4@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Temp_Button_Status : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ Voice_Blower_Limit : 21|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 860 EFP_CC_Info_Status: 8 XXX
+ SG_ Rear_Panel_Btn_State : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Floor_Btn_State : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ HtdStrWhl_SftBtt_Stt : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ AC_Sft_Button_State : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvRrCondSeatSftBttnSt : 47|3@0+ (1,0) [0|0] "" XXX
+ SG_ DrvFrCondSeatSftBtnStt : 37|3@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RecircSBtn_St : 27|2@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrDefrSBtn_St : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ PasRrCondSeatSftBttnSt : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ PasFrCondSeatSftBtnStt : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ MyTemp_Soft_Bttn_State : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_MaxACSBtn_St : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearPowerButtonState : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearCoolBarsDisplayed : 11|3@0+ (1,0) [0|0] "Bars_On" XXX
+ SG_ Rear_Sft_Control_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrNeutralBarDsp_St : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrHeatBarsDsp_St : 31|3@0+ (1,0) [0|0] "Bars_On" XXX
+ SG_ Rear_Fan_Bars_Displayed : 19|3@0+ (1,0) [0|0] "" XXX
+ SG_ CC_RrCtrlBtn_St : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ Rear_Auto_Button_State : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_FrPowerSBtn_St : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_FrDefrostSBtn_St : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_Soft_Btn_Stt : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_MODE_State : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Front_AUTO_FAN_State : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Dual_Button_State : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarPnlSBtn_St : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarPnFlrSBtn_St : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarFlrWsSBtn_St : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CC_BarDrvFlrSBtn_St : 3|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 890 Active_Noise: 8 XXX
+ SG_ ANC_Chime_Supported : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ ActvNseAudio_D_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ ActvNse_B_Actv : 5|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 891 Active_Noise_Data: 8 XXX
+ SG_ CabnSndAmb_Db_Actl : 7|8@0+ (1,30.0) [0|0] "decibel" XXX
+
+BO_ 906 Body_Information_1: 8 XXX
+ SG_ CcdMde_D_Rq_UB : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ CcdMde_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ CarMode : 5|4@0+ (1,0) [0|0] "" XXX
+ SG_ SecondaryHeater_Rqst : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ Passenger_Sunload_Raw : 47|8@0+ (5.0,0) [0|0] "W/m^2" XXX
+ SG_ Driver_Sunload_Raw : 39|8@0+ (5.0,0) [0|0] "W/m^2" XXX
+ SG_ HvacEvap_Te_Actl_UB : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX
+ SG_ SecondaryHeater_Rqst_UB : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ Outside_Air_Temp_Stat_UB : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ Outside_Air_Temp_Stat : 15|8@0+ (0.5,-40.0) [0|0] "Degrees C" XXX
+ SG_ Veh_Lock_Status : 54|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Lock_Requestor : 52|5@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Lock_EvNum : 63|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ immoIndicatorCmd : 22|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 909 Body_Information_6: 8 XXX
+ SG_ PEBackupSlot_Stats_UB : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ PEBackupSlot_Stats : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ KeyMykeyTot_No_Cnt : 47|4@0+ (1,0) [0|0] "Counts" XXX
+ SG_ SideDetect_R_SysOpState_UB : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_R_SysOpState : 28|2@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_R_SnsrState_UB : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_R_SnsrState : 31|2@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_L_SysOpState_UB : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_L_SysOpState : 18|2@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_L_SnsrState_UB : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ SideDetect_L_SnsrState : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_SnState_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_SnState : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_Op_State_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_Op_State : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_Alert_UB : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_R_Alert : 14|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_SnState_UB : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_SnState : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_Op_State_UB : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_Op_State : 4|2@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_Alert_UB : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cross_Traffic_L_Alert : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ IgnKeyType_D_Actl : 39|4@0+ (1,0) [0|0] "" XXX
+ SG_ KeyAdmnTot_No_Cnt : 35|4@0+ (1,0) [0|0] "Counts" XXX
+
+BO_ 936 ParkAid_Data: 8 XXX
+ SG_ SAPPErrorCoding : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ ExtSteeringAngleReq : 7|15@0+ (0.1,-1000.0) [0|0] "Degrees" XXX
+ SG_ EPASExtAngleStatReq : 8|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 937 ParkAid_Range_to_Target: 8 XXX
+ SG_ RangeToClosestObstacle : 55|12@0+ (1,0) [0|0] "cm" XXX
+ SG_ RangeRearCornerRtSn : 35|12@0+ (1,0) [0|0] "cm" XXX
+ SG_ RangeRearCornerLeftSn : 31|12@0+ (1,0) [0|0] "cm" XXX
+ SG_ RangeRearCenterRtSn : 11|12@0+ (1,0) [0|0] "cm" XXX
+ SG_ RangeRearCenterLeftSn : 7|12@0+ (1,0) [0|0] "cm" XXX
+
+BO_ 939 ParkAid_Data_CG1: 8 XXX
+ SG_ EPASExtAngleStatReq : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ ExtSteeringAngleReq : 6|15@0+ (0.1,-1000.0) [0|0] "Degrees" XXX
+ SG_ SAPPErrorCoding : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ RangeToClosestObstacle : 27|12@0+ (1,0) [0|0] "cm" XXX
+
+BO_ 942 BodyInformation_2: 8 XXX
+ SG_ Easy_Entry_Exit_Stat : 14|2@0+ (1,0) [0|0] "" XXX
+ SG_ Memory_Feedback_Rqst : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ Delay_Accy : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fuel_Econ_AFE_Reset_Req_UB : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ Multimedia_System : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatDrv_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatHood_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatInnrTgate_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatPsngr_B_Actl : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatRl_B_Actl : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatRr_B_Actl : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrStatTgate_B_Actl : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fuel_Econ_AFE_Reset_Req : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Nav_Unit_Setting : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cancel_Auto_Movement : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cancel_Auto_Movement_UB : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrvSeat_Stat : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ DrvSeat_Stat_UB : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ Easy_Entry_Rqst : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ Easy_Entry_Rqst_UB : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Multimedia_System_UB : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ Memory_Cmd : 39|4@0+ (1,0) [0|0] "" XXX
+ SG_ Memory_Cmd_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ Memory_Feedback_Rqst_UB : 45|1@0+ (1,0) [0|0] "" XXX
+ SG_ Decklid_Ajar_Status : 44|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 947 BodyInformation_3: 8 XXX
+ SG_ RearFog_Lamp_Ind_UB : 49|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearFog_Lamp_Ind : 50|1@0+ (1,0) [0|0] "" XXX
+ SG_ PwMdeExten_D_Actl : 63|5@0+ (1,0) [0|0] "" XXX
+ SG_ Turn_Ind_Cmd_Right : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Turn_Ind_Cmd_Left : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ Ignition_Switch_Stable : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ Parklamp_Status : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ Litval : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ Key_In_Ignition_Stat : 11|2@0+ (1,0) [0|0] "" XXX
+ SG_ Ignition_Status : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ Dimming_Lvl : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ Day_Night_Status : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ Remote_Start_Status : 13|2@0+ (1,0) [0|0] "" XXX
+ SG_ DRV_SELECT_STAT : 19|4@0+ (1,0) [0|0] "" XXX
+ SG_ PrkBrkActv_B_Actl : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ HtdStrWhl_SftBtt_State_UB : 51|1@0+ (1,0) [0|0] "" XXX
+ SG_ HtdStrWhl_SftBtt_State : 53|2@0+ (1,0) [0|0] "" XXX
+ SG_ HvacRemoteStrt_N_Rq_UB : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacRemoteStrt_N_Rq : 23|4@0+ (100.0,450.0) [0|0] "RPM" XXX
+ SG_ HvacAirCond_B_Rq_UB : 57|1@0+ (1,0) [0|0] "" XXX
+ SG_ Remote_Start_Warn_Req : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ HvacAirCond_B_Rq : 58|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 948 Tire_Pressure_Status: 8 XXX
+ SG_ Tire_Press_ILR_Stat2 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_IRR_Stat2 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_LR_OLR_Stat2 : 19|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_RR_ORR_Stat2 : 23|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_RF_Stat2 : 11|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_LF_Stat2 : 15|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_System_Stat2 : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ Tire_Press_Telltale : 3|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 949 Tire_Pressure_Data: 8 XXX
+ SG_ Tire_Press_RR_ORR_Data : 23|8@0+ (1,0) [0|0] "Psi" XXX
+ SG_ Tire_Press_RF_Data : 15|8@0+ (1,0) [0|0] "Psi" XXX
+ SG_ Tire_Press_LR_OLR_Data : 31|8@0+ (1,0) [0|0] "Psi" XXX
+ SG_ Tire_Press_IRR_Data : 39|8@0+ (1,0) [0|0] "Psi" XXX
+ SG_ Tire_Press_ILR_Data : 47|8@0+ (1,0) [0|0] "Psi" XXX
+ SG_ Tire_Press_LF_Data : 7|8@0+ (1,0) [0|0] "Psi" XXX
+
+BO_ 955 Smart_Headlamp_Stat: 8 XXX
+ SG_ Headlamp_Switch_Stat : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ Fog_Lamp_Dbnce : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ Digital_Dimmer_Sw_Stat : 3|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 957 Rear_FogLamp: 8 XXX
+ SG_ RearFog_Lamp_Dbnce : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 963 BCM_to_HS_Body: 8 XXX
+ SG_ DrTgateChime_D_Rq_UB : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrTgateChime_D_Rq : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraDefog_B_Actl : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ Reverse_Mirror_Stat : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Liftgate_Mode_Stat : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ IKT_Program_Status : 51|2@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_Spd_Slow_Puddle_Status : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ Illuminated_Exit_Status : 43|2@0+ (1,0) [0|0] "" XXX
+ SG_ Illuminated_Entry_Status : 45|2@0+ (1,0) [0|0] "" XXX
+ SG_ Door_Courtesy_Light_Status : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ Courtesy_Demand_BSave_Stat : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ Alarm_Lights_Courtesy_Stat : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ Courtesy_Delay_Status : 37|2@0+ (1,0) [0|0] "" XXX
+ SG_ Courtesy_Mode_Status : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ Front_Fog_Light_SW_Status : 22|2@0+ (1,0) [0|0] "" XXX
+ SG_ Brake_Lamp_On_Status : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ LowBeam_CKT_CAN : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ ParkLamps_CKT_CAN : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ RF_Low_Beam_CKT_CAN : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ Brk_Fluid_Lvl_Low : 15|2@0+ (1,0) [0|0] "" XXX
+ SG_ LF_Low_Beam_CKT_CAN : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ High_Beam_Indicator_Rqst : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ Brake_Warn_Indicator_Rqst : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ Headlamp_On_Wrning_Cmd : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ Key_In_Ignition_Warn_Cmd : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fog_Lamps_Rly_Ckt_CAN : 10|1@0+ (1,0) [0|0] "" XXX
+ SG_ Power_Liftgate_Mode_Stat_UB : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ Reverse_Mirror_Stat_UB : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ Park_Brake_Chime_Rqst : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ Daytime_Running_Lamps : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Running_Board_Stat_UB : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ Running_Board_Stat : 58|2@0+ (1,0) [0|0] "" XXX
+ SG_ Perimeter_Alarm_Chime_Rqst : 20|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 967 CMPS_FDM_Info_Status: 8 XXX
+ SG_ CamraFrntStat_D_Stat : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ Zone_Icon_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_Compass_direction : 47|4@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_MSD_UB : 37|1@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_LSD_UB : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ ExcessiveMagnetism : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ Compass_Display_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_LSD : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ Segment_MSD : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ Cal_Icon : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ Zone_Icon : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ Compass_Display : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cal_Icon_UB : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearCameraDelayStat : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlTow_D_Actl : 25|2@0+ (1,0) [0|0] "SE" XXX
+ SG_ CamZoomActiveState : 29|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraZoomMan_D_Actl : 18|3@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlStat_D_Actl : 27|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlDyn_D_Actl : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamPDCGuidStat : 31|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 970 Lane_Assist_Data1: 8 XXX
+ SG_ LkaActvStats_D_Req : 7|3@0+ (1,0) [0|0] "" XXX
+ SG_ LdwActvStats_D_Req : 4|3@0+ (1,0) [0|0] "" XXX
+ SG_ LdwActvIntns_D_Req : 1|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 971 Lane_Assist_Data2: 8 XXX
+ SG_ LaRefAng_No_Req : 19|12@0+ (0.05,-102.4) [0|0] "mrad" XXX
+ SG_ LaRampType_B_Req : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaCurvature_No_Calc : 3|12@0+ (5e-06,-0.01) [0|0] "1/m" XXX
+
+BO_ 972 Lane_Assist_Data3: 8 XXX
+ SG_ LaHandsOff_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaActDeny_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaActAvail_D_Actl : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 984 IPMA_Data: 8 XXX
+ SG_ LaSwtch_D_RqDrv : 45|1@0+ (1,0) [0|0] "" XXX
+ SG_ DasWarn_D_Dsply : 44|2@0+ (1,0) [0|0] "" XXX
+ SG_ DasStats_D_Dsply : 47|2@0+ (1,0) [0|0] "" XXX
+ SG_ DasAlrtLvl_D_Dsply : 55|3@0+ (1,0) [0|0] "" XXX
+ SG_ CamraStats_D_Dsply : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ CamraDefog_B_Req : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaSwtchStat_No_Actl : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaHandsOff_D_Dsply : 42|2@0+ (1,0) [0|0] "" XXX
+ SG_ LaDenyStats_B_Dsply : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaActvStats_D_Dsply : 52|5@0+ (1,0) [0|0] "" XXX
+ SG_ AhbcHiBeam_D_Rq : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ PersIndexIpma_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoIpmaActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigIpmaActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 986 Personality_APIM_Data3: 8 XXX
+ SG_ LightAmbIntSwtchInc_B : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbIntSwtchDec_B : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbIntsty_No_Rq : 15|8@0+ (1,0) [0|0] "% Intensity" XXX
+ SG_ LightAmbColor_No_Rq : 7|8@0+ (1,0) [0|0] "Color Index" XXX
+ SG_ LightAmbClrSwtchInc_B : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbClrSwtchDec_B : 23|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 991 Personality_VDM_Data: 8 XXX
+ SG_ PersIndexVdm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoVdmActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigVdmActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 992 Personality_IPC_Data: 8 XXX
+ SG_ MsgCntrPersIndex_D_Rq : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrFeatConfigRq : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ MsgCntrFeatNoRq : 7|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ MsgCntrDsplyOp_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 993 Personality_Data_HS: 8 XXX
+ SG_ PersSetupRestr_D_Actl : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ PersSetupAccessCtrl : 19|1@0+ (1,0) [0|0] "SES" XXX
+ SG_ PersSetup_No_Actl : 31|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ PersConflict_D_Actl : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ AssocConfirm_D_Actl : 15|3@0+ (1,0) [0|0] "" XXX
+ SG_ RecallEvent_No_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX
+ SG_ PersNo_D_Actl : 10|3@0+ (1,0) [0|0] "" XXX
+ SG_ PersStore_D_Actl_UB : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ PersStore_D_Actl : 12|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 994 Personality_APIM_Data: 8 XXX
+ SG_ CamraOvrlTow_D_Rq : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ Pers4OptIn_B_Stats : 43|1@0+ (1,0) [0|0] "" XXX
+ SG_ Pers3OptIn_B_Stats : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ Pers2OptIn_B_Stats : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ Pers1OptIn_B_Stats : 44|1@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkPersIndex_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkFeatNoActl : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ PersStore_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkFeatConfigActl : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ CtrStkDsplyOp_D_Rq : 47|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 995 Personality_BCM_Data: 8 XXX
+ SG_ PersIndexBcm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoBcm_No_Actl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigBcmActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 996 Personality_HCMB_Data_HS: 8 XXX
+ SG_ PersIndexHcmb_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PersIndexHcmb_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoHcmbActl_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoHcmbActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigHcmbActl_UB : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatConfigHcmbActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 997 Personality_CCM_Data: 8 XXX
+ SG_ PersIndexCcm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoCcmActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigCcmActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 998 Personality_SCCM_Data: 8 XXX
+ SG_ PersIndexSccm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoSccmActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigSccmActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 999 Personality_HVAC_Data_HS: 8 XXX
+ SG_ LightAmbIntsty_No_Actl_UB : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbIntsty_No_Actl : 55|8@0+ (1,0) [0|0] "% Intensity" XXX
+ SG_ LightAmbColor_No_Actl_UB : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ LightAmbColor_No_Actl : 47|8@0+ (1,0) [0|0] "Color Index" XXX
+ SG_ PersIndexHvac_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoHvacActl_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatConfigHvacActl_UB : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ PersIndexHvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoHvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigHvacActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1001 Personality_RFA_Data_HS: 8 XXX
+ SG_ PersIndexRfa_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoRfaActl_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatConfigRfaActl_UB : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ PersIndexRfa_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoRfaActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigRfaActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1002 Personality_APIM_Data2: 8 XXX
+ SG_ PersIndexApim_D_Actl : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoApimActl : 39|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigApimActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ CntrStkKeycodeActl : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ CntrStk_D_RqRecall : 52|3@0+ (1,0) [0|0] "" XXX
+ SG_ CntrStk_D_RqAssoc : 55|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 1003 Personality_IPC_Data_2: 8 XXX
+ SG_ PersIndexIpc_D_Actl : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoIpcActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigIpcActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1004 Personality_DSM_Data_HS: 8 XXX
+ SG_ PersIndexDsm_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PersIndexDsm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoDsmActl_UB : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoDsmActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigDsmActl_UB : 36|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatConfigDsmActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1005 Personality_RHVAC_Data_HS: 8 XXX
+ SG_ PersIndexRhvac_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoRhvacActl_UB : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ FeatConfigRhvacActl_UB : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ PersIndexRhvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ FeatNoRhvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX
+ SG_ FeatConfigRhvacActl : 7|16@0+ (1,0) [0|0] "" XXX
+
+BO_ 1031 Diesel_Data_Legacy_1: 8 XXX
+ SG_ W2S_COMMAND : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TURBO_BOOST : 1|10@0+ (0.1,-30.0) [0|0] "PSI" XXX
+ SG_ IDLE_ENGINE_SHUTDOWN : 42|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1034 GGCC_Config_Mgmt_ID_1: 8 XXX
+ SG_ VehicleGGCCData : 7|64@0+ (1,0) [0|0] "mixed" XXX
+
+BO_ 1036 Desired_Torq_BrkSys_Stat: 8 XXX
+ SG_ BRK_TC_TEMPORARILY_UNAVAIL : 47|1@0+ (1,0) [0|0] "" XXX
+ SG_ TRLR_SWAY_EVNT_IN_PROGRESS : 22|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1043 ADAPTIVE_HEADLAMP_STAT: 8 XXX
+ SG_ ADAPTIVE_HEADLAMP_FAILURE : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1044 AccelerationData: 8 XXX
+ SG_ VehVertComp_A_Actl : 1|10@0+ (0.01,-0.4) [0|0] "m/s^2" XXX
+ SG_ VehRolComp_W_Actl : 19|12@0+ (0.0002,-0.82) [0|0] "rad/s" XXX
+ SG_ VehYawNonLin_W_Rq : 51|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX
+ SG_ VehYawLin_W_Rq : 35|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX
+
+BO_ 1045 BrakeSysFeatures: 8 XXX
+ SG_ TCMode : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrvSlipCtlLamp_D_Rq : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ RSCMode : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ EBAMode : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrvAntiLckLamp_D_Rq : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ ChimeBrk_B_Rq : 38|1@0+ (1,0) [0|0] "" XXX
+ SG_ BrkLamp_B_Rq : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehVActlBrk_No_Cs : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VehVActlBrk_No_Cnt : 23|4@0+ (1,0) [0|0] "" XXX
+ SG_ Veh_V_ActlBrk : 7|16@0+ (0.01,0) [0|0] "kph" XXX
+ SG_ DrvSlipCtlMde_D_Ind : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehRol_An_Dsply : 55|7@0+ (1,-64.0) [0|0] "Degrees" XXX
+ SG_ VehPtch_An_Dsply : 47|7@0+ (1,-64.0) [0|0] "Degrees" XXX
+ SG_ VehVActlBrk_D_Qf : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ HILL_DESC_MC : 37|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 1046 BrakeSysFeatures_2: 8 XXX
+ SG_ BpedMove_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ BpedMove_No_Cnt : 3|4@0+ (1,0) [0|0] "" XXX
+ SG_ BpedMove_D_Actl : 7|2@0+ (1,0) [0|0] "" XXX
+ SG_ AbsMduleAlive_No_Cnt : 39|4@0+ (1,0) [0|0] "" XXX
+ SG_ Abs_No_Cs : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ BrkAsst_B_Actl : 33|1@0+ (1,0) [0|0] "" XXX
+ SG_ StabCtlBrk_B_Avail : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrvHdcWarnInfo_D_Rq : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvHdcMsg_D_Rq : 10|3@0+ (1,0) [0|0] "" XXX
+ SG_ DrvHdcLampInfo_D_Rq : 12|2@0+ (1,0) [0|0] "" XXX
+ SG_ Abs_B_Falt : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehLongComp_A_Actl : 49|10@0+ (0.035,-17.9) [0|0] "m/s^2" XXX
+ SG_ TRAILER_SWAY_CONFIG_STAT : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehLatComp_A_Actl : 47|10@0+ (0.035,-17.9) [0|0] "m/s^2" XXX
+
+BO_ 1047 TractionCtrlStatus_CG1: 8 XXX
+ SG_ EngEotcCtlMde_B_Ind : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ YawStabilityIndex : 48|9@0+ (1,-256.0) [0|0] "%" XXX
+ SG_ TCS_ENG_FAILD : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ TCS_ENG_ONLY_PRESENT : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ TCS_BRK_FAILD : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTqRqMn_No_Cnt : 47|4@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTot_Tq_RqMn : 23|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX
+ SG_ EngEotcCtlLamp_D_Rq : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ PrplWhlTqRqMn_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ HdcMde_D_Actl : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ VehicleDir_D_Est : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ TracCtlPtActv_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1056 PowertrainData_1_CG1: 8 XXX
+ SG_ FUEL_ALCOHOL_PERCNT : 63|8@0+ (0.3937008,0) [0|0] "%" XXX
+ SG_ TrnTotTq_Rt_Est : 39|16@0+ (0.001,0) [0|0] "" XXX
+ SG_ TrnTotLss_Tq_Est : 31|8@0+ (0.5,0) [0|0] "Nm" XXX
+ SG_ ECMMILRequest : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ AirCondFluidHi_P_Actl : 55|8@0+ (0.125,0) [0|0] "bar" XXX
+ SG_ OilPressureWarning : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ CluPdlPos_Pc_Meas : 7|10@0+ (0.1,0) [0|0] "%" XXX
+ SG_ VehVLimStat_D_Actl : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ VehVLimActv_B_Actl : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ CluPdlPosPcMeas_D_Qf : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ CoolantFanStepAct : 23|5@0+ (1,0) [0|0] "Steps" XXX
+
+BO_ 1058 PowertrainData_2_CG1: 8 XXX
+ SG_ EngIdlShutDown_D_Stat : 19|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngAout2_Tq_Actl : 55|11@0+ (1,-500.0) [0|0] "Nm" XXX
+ SG_ EngMsgTxt_D_Rq : 21|2@0+ (1,0) [0|0] "" XXX
+ SG_ EngClnt_Te_ActlDiag : 39|8@0+ (1,-40.0) [0|0] "degC" XXX
+ SG_ ThrPos_Pc_CalcDiag : 7|8@0+ (0.392157,0) [0|0] "%" XXX
+ SG_ EngLoad_Pc_CalcDiag : 47|8@0+ (0.392157,0) [0|0] "%" XXX
+ SG_ EngAirIn_Te_Actl : 15|10@0+ (0.25,-128.0) [0|0] "degC" XXX
+ SG_ ApedPos_Pc_ActlDiag : 31|8@0+ (0.392157,0) [0|0] "%" XXX
+
+BO_ 1064 StrgWheel_PolicePkg: 8 XXX
+ SG_ PoliceAux4Lamp_B_Rq : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ PoliceAux3Lamp_B_Rq : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ PoliceAux2Lamp_B_Rq : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ PoliceAux1Lamp_B_Rq : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1067 Battery_Mgmt_1: 8 XXX
+ SG_ AlternatorExcDutyCycle : 31|5@0+ (3.22581,0) [0|0] "%" XXX
+ SG_ EngineEffStatus : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ AvailableCurrentAtIdle : 23|8@0+ (1,0) [0|0] "Amps" XXX
+ SG_ AvailableCurrent : 15|8@0+ (1,0) [0|0] "Amps" XXX
+ SG_ ActualCurrent : 7|8@0+ (1,0) [0|0] "Amps" XXX
+ SG_ NoAlternatorResponse : 26|1@0+ (1,0) [0|0] "" XXX
+ SG_ AlternatorTempFault : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ AlternatorMechFault : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ AlternatorElFault : 37|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1068 Battery_Mgmt_2: 8 XXX
+ SG_ ChargeMode : 39|3@0+ (1,0) [0|0] "" XXX
+ SG_ ChargeVoltageReq : 7|6@0+ (0.1,10.6) [0|0] "Volts" XXX
+ SG_ ChargeVoltageReqMax : 23|6@0+ (0.1,10.6) [0|0] "Volts" XXX
+ SG_ FrontBatteryTemp : 47|8@0+ (1,-60.0) [0|0] "DegC" XXX
+ SG_ IBoost_Msg : 52|4@0+ (1,0) [0|0] "" XXX
+ SG_ IdleSpeedIncrease_El : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ MaxLashStep : 11|3@0+ (0.1,0) [0|0] "Volts" XXX
+ SG_ PowerSystemStatus : 15|4@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_T_Eng_Off_B : 17|1@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_Level_Req : 55|3@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_Feature_Group_ID : 36|5@0+ (1,0) [0|0] "" XXX
+ SG_ Shed_Drain_Eng_Off_B : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ Batt_Lo_SoC_B : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ VoltageRampRateUpMax : 31|6@0+ (0.1,0) [0|0] "Volts/sec" XXX
+ SG_ Batt_Crit_SoC_B : 24|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1069 Battery_Mgmt_3: 8 XXX
+ SG_ BSFault : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ BSBattSOC : 30|7@0+ (1,0) [0|0] "%" XXX
+ SG_ BSBattQDeltaRideAh : 38|15@0+ (0.0078125,-100.0) [0|0] "Ah" XXX
+ SG_ BSBattQCapAh : 22|7@0+ (1,0) [0|0] "Ah" XXX
+ SG_ BSBattCurrent : 5|14@0+ (0.0625,-512.0) [0|0] "Amps" XXX
+ SG_ BattULoState_D_Qlty : 7|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1072 Cluster_Information: 8 XXX
+ SG_ ManRgen_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ Easy_Entry_Exit_Cmd : 49|1@0+ (1,0) [0|0] "" XXX
+ SG_ KeyTypeChngMykey_D_Rq : 53|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvSlipCtlMde_B_Rq : 19|1@0+ (1,0) [0|0] "" XXX
+ SG_ MetricActv_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ LdwDfaltOn_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ Fda_B_Stat : 9|1@0+ (1,0) [0|0] "" XXX
+ SG_ ePRNDL_MODE : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ AccDeny_B_RqIpc : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ MetricActvTe_B_Actl : 23|1@0+ (1,0) [0|0] "" XXX
+ SG_ EngOilLife_B_RqReset : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ OdometerMasterValue : 31|24@0+ (1,0) [0|0] "km" XXX
+ SG_ New_Module_Attn_Event : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ TRAILER_SWAY_CONFIG_CMD : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ ParkDetect_Stat : 62|1@0+ (1,0) [0|0] "" XXX
+ SG_ Attn_Info_Audio : 59|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkMde_D_Rq : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ TRAILER_BRAKE_CONFIG : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehMykey_Vl_LimRq : 63|1@0+ (1,0) [0|0] "" XXX
+ SG_ VehMykey_V_LimRqMx : 51|1@0+ (1,0) [0|0] "" XXX
+ SG_ EmgcyCallAsstMykey_Rq : 50|1@0+ (1,0) [0|0] "" XXX
+ SG_ DrvSlipCtlMde_D_Rq : 17|2@0+ (1,0) [0|0] "" XXX
+ SG_ AccEnbl_B_RqDrv : 20|1@0+ (1,0) [0|0] "" XXX
+ SG_ AutoHighBeam_Cmd : 55|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1075 Cluster_Information_3_CG1: 8 XXX
+ SG_ CamraFrntStat_D_Rq : 58|1@0+ (1,0) [0|0] "" XXX
+ SG_ DieslFuelBio_B_ActlDrv : 56|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearCameraDelayCmd : 59|1@0+ (1,0) [0|0] "" XXX
+ SG_ UreaWarnReset : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ DistanceBarSetting : 49|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamraZoomMan_D_Rq : 63|3@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlStat_D_Rq : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamraOvrlDyn_D_Rq : 25|1@0+ (1,0) [0|0] "" XXX
+ SG_ CamAutoTowbarZoom : 24|1@0+ (1,0) [0|0] "" XXX
+ SG_ FuelSecndActv_B_Actl : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ HILL_DESC_SW : 38|1@0+ (1,0) [0|0] "" XXX
+ SG_ FuelLvlPssvSide_No_Raw : 19|10@0+ (1,0) [0|0] "" XXX
+ SG_ SPDJBCompassCMDDecalibrate : 50|1@0+ (1,0) [0|0] "" XXX
+ SG_ SPDJBCompassCMDChangeZone : 51|1@0+ (1,0) [0|0] "" XXX
+ SG_ SPDJBCompassCmdDesiredZone : 55|4@0+ (1,0) [0|0] "" XXX
+ SG_ FUEL_SENSOR_NUM : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ W2S_LAMP_OK : 37|1@0+ (1,0) [0|0] "" XXX
+ SG_ Beltminder_Warn_Stats_IPC : 32|1@0+ (1,0) [0|0] "" XXX
+ SG_ FuelLvlActvSide_No_Raw : 13|10@0+ (1,0) [0|0] "" XXX
+ SG_ FuelLvl_Pc_Dsply : 7|10@0+ (0.108696,-5.22) [0|0] "%" XXX
+ SG_ FUEL_LVL_PER_MEAN : 47|8@0+ (0.434783,-5.22) [0|0] "% Indication" XXX
+ SG_ Fuel_Level_State : 34|2@0+ (1,0) [0|0] "" XXX
+ SG_ H2O_IN_FUEL_LAMP_OK_OBD : 36|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1093 TrailerBrakeInfo: 8 XXX
+ SG_ TrlrLampCnnct_B_Actl : 22|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkActCnnct_B_Actl : 16|1@0+ (1,0) [0|0] "" XXX
+ SG_ StopLamp_B_RqTrlrBrk : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkOut_No_Dsply : 3|4@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkGain_No_Actl : 21|5@0+ (0.5,0) [0|0] "" XXX
+ SG_ TrlrBrkDsply_B_Rq : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkDcnnt_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkCtl_B_Falt : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkActCirct_B_Falt : 39|1@0+ (1,0) [0|0] "" XXX
+ SG_ TrlrBrkMde_D_Actl : 23|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1104 SHCM_Status: 8 XXX
+ SG_ CURRENT_DRAW : 15|8@0+ (0.5,0) [0|0] "Amps" XXX
+ SG_ SECONDARY_HEATER_STAT : 7|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1107 PassengerOCSSerialNum: 8 XXX
+ SG_ OCSSerialNoByte8 : 63|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ OCSSerialNoByte1 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1108 RCMSerialNumber: 8 XXX
+ SG_ RCMSerialNoByte8 : 63|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ RCMSerialNoByte1 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1109 eCall_Info: 8 XXX
+ SG_ eCallConfirmation : 7|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 1125 GPS_Data_Nav_1_HS: 8 XXX
+ SG_ GpsHsphLattSth_D_Actl : 25|2@0+ (1,0) [0|0] "" XXX
+ SG_ GpsHsphLongEast_D_Actl : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_Longitude_Minutes : 46|6@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ GPS_Longitude_Min_dec : 55|14@0+ (0.0001,0) [0|0] "Minutes" XXX
+ SG_ GPS_Longitude_Degrees : 39|9@0+ (1,-179.0) [0|0] "Degrees" XXX
+ SG_ GPS_Latitude_Minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ GPS_Latitude_Min_dec : 23|14@0+ (0.0001,0) [0|0] "Minutes" XXX
+ SG_ GPS_Latitude_Degrees : 7|8@0+ (1,-89.0) [0|0] "Degrees" XXX
+
+BO_ 1126 GPS_Data_Nav_2_HS: 8 XXX
+ SG_ Gps_B_Falt : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ GpsUtcYr_No_Actl : 55|5@0+ (1,1.0) [0|0] "Year" XXX
+ SG_ GpsUtcMnth_No_Actl : 47|4@0+ (1,1.0) [0|0] "Month" XXX
+ SG_ GpsUtcDay_No_Actl : 37|5@0+ (1,1.0) [0|0] "Day" XXX
+ SG_ GPS_UTC_seconds : 23|6@0+ (1,0) [0|0] "seconds" XXX
+ SG_ GPS_UTC_minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX
+ SG_ GPS_UTC_hours : 7|5@0+ (1,0) [0|0] "Hours" XXX
+ SG_ GPS_Pdop : 31|5@0+ (0.2,0) [0|0] "" XXX
+ SG_ GPS_Compass_direction : 26|4@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_Actual_vs_Infer_pos : 38|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1127 GPS_Data_Nav_3_HS: 8 XXX
+ SG_ GPS_Vdop : 63|5@0+ (0.2,0) [0|0] "" XXX
+ SG_ GPS_Speed : 47|8@0+ (1,0) [0|0] "MPH" XXX
+ SG_ GPS_Sat_num_in_view : 7|5@0+ (1,0) [0|0] "" XXX
+ SG_ GPS_MSL_altitude : 15|12@0+ (10.0,-20460.0) [0|0] "feet" XXX
+ SG_ GPS_Heading : 31|16@0+ (0.01,0) [0|0] "Degrees" XXX
+ SG_ GPS_Hdop : 55|5@0+ (0.2,0) [0|0] "" XXX
+ SG_ GPS_dimension : 2|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 1152 All_Terrain_Data: 8 XXX
+ SG_ HdcSwitchPos_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ TerrStat_D_RqDsply : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ TerrMde_D_RqDrv : 3|3@0+ (1,0) [0|0] "" XXX
+
+BO_ 1186 Information_4x4_2_CG1: 8 XXX
+ SG_ RearDiffFalt_D_Stat : 23|2@0+ (1,0) [0|0] "" XXX
+ SG_ RearDiffLck_Tq_Actl : 7|12@0+ (1,0) [0|0] "Nm" XXX
+ SG_ RearDiffLckMsg_D_Rq : 20|3@0+ (1,0) [0|0] "" XXX
+ SG_ AwdSrvcRqd_B_Rq : 21|1@0+ (1,0) [0|0] "" XXX
+ SG_ RearDiffLckLamp_D_Rq : 11|2@0+ (1,0) [0|0] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/ford_fusion_2018_adas.dbc b/iqdbc_repo/iqdbc/dbc/ford_fusion_2018_adas.dbc
new file mode 100644
index 000000000..2e1647b3d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/ford_fusion_2018_adas.dbc
@@ -0,0 +1,421 @@
+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
+
+BO_ 1280 Object_00: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1281 Object_01: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1282 Object_02: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1283 Object_03: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1284 Object_04: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1285 Object_05: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1286 Object_06: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1287 Object_07: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1288 Object_08: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1289 Object_09: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1290 Object_10: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1291 Object_11: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1292 Object_12: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1293 Object_13: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1294 Object_14: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1295 Object_15: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1296 Object_16: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1297 Object_17: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1298 Object_18: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1299 Object_19: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1300 Object_20: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1301 Object_21: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1302 Object_22: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1303 Object_23: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1304 Object_24: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1305 Object_25: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1306 Object_26: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1307 Object_27: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1308 Object_28: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1309 Object_29: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1310 Object_30: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1311 Object_31: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1312 Object_32: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1313 Object_33: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1314 Object_34: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1315 Object_35: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1316 Object_36: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1317 Object_37: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1318 Object_38: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1319 Object_39: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1320 Object_40: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1321 Object_41: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1322 Object_42: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1323 Object_43: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1324 Object_44: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1325 Object_45: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1326 Object_46: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1327 Object_47: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1328 Object_48: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1329 Object_49: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1330 Object_50: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1331 Object_51: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1332 Object_52: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1333 Object_53: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1334 Object_54: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1335 Object_55: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1336 Object_56: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1337 Object_57: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1338 Object_58: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1339 Object_59: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1340 Object_60: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1341 Object_61: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1342 Object_62: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
+BO_ 1343 Object_63: 8 XXX
+ SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX
+ SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX
+ SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX
+ SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX
+
diff --git a/iqdbc_repo/iqdbc/dbc/ford_fusion_2018_pt.dbc b/iqdbc_repo/iqdbc/dbc/ford_fusion_2018_pt.dbc
new file mode 100644
index 000000000..c4b706d06
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/ford_fusion_2018_pt.dbc
@@ -0,0 +1,139 @@
+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
+
+BO_ 130 EPAS_INFO: 8 XXX
+ SG_ SteMdule_U_Meas : 39|8@0+ (0.05,6.0) [0|0] "Volts" XXX
+ SG_ SteMdule_I_Est : 21|12@0+ (0.05,-64.0) [0|0] "Amps" XXX
+ SG_ EPAS_FAILURE : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SteeringColumnTorque : 7|8@0+ (0.0625,-8.0) [0|0] "Nm" XXX
+ SG_ SAPPAngleControlStat6 : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat5 : 14|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat4 : 13|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat3 : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat2 : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ SAPPAngleControlStat1 : 23|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 118 Steering_Wheel_Data_CG1: 8 XXX
+ SG_ SteWhlRelInit_An_Sns : 6|15@0+ (0.1,-1600.0) [0|0] "deg" XXX
+ SG_ SteWhlRelCalib_An_Sns : 23|15@0+ (0.1,-1600.0) [0|0] "deg" XXX
+ SG_ SteWhlRelInit2_An_Sns : 55|16@0+ (0.1,-3200.0) [0|0] "deg" XXX
+ SG_ SteWhlAn_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ SteWhlAn_No_Cnt : 47|4@0+ (1,0) [0|0] "Counts" XXX
+
+BO_ 131 Steering_Buttons: 8 XXX
+ SG_ Right_Turn_Light : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Left_Turn_Light : 4|1@0+ (1,0) [0|0] "" XXX
+ SG_ Dist_Decr : 12|1@0+ (1,0) [0|0] "" XXX
+ SG_ Dist_Incr : 11|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cancel : 8|1@0+ (1,0) [0|0] "" XXX
+ SG_ Resume : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ Set : 28|1@0+ (1,0) [0|0] "" XXX
+ SG_ Main : 38|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 145 Yaw_Data: 8 XXX
+ SG_ VehYaw_W_Actl : 39|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+ SG_ VehRol_W_Actl : 23|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+ SG_ VehPtch_W_Actl : 7|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX
+
+BO_ 146 Accel_Data: 8 XXX
+ SG_ VehVertAActl_D_Qf : 38|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehLongAActl_D_Qf : 22|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehLatAActl_D_Qf : 6|2@0+ (1,0) [0|0] "" XXX
+ SG_ VehVert_A_Actl : 36|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX
+ SG_ VehLong_A_Actl : 20|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX
+ SG_ VehLat_A_Actl : 4|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX
+
+BO_ 357 Cruise_Status: 8 XXX
+ SG_ Brake_Drv_Appl : 5|1@0+ (1,0) [0|0] "" XXX
+ SG_ Cruise_State : 11|4@0+ (1,0) [0|0] "" XXX
+ SG_ Set_Speed : 23|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 516 EngineData_14: 8 XXX
+ SG_ ApedPosScal_Pc_Actl : 1|10@0+ (0.1,0) [0|0] "%" XXX
+
+BO_ 535 WheelSpeed_CG1: 8 XXX
+ SG_ WhlRr_W_Meas : 55|14@0+ (0.04,0) [0|0] "rad/s" XXX
+ SG_ WhlRl_W_Meas : 39|14@0+ (0.04,0) [0|0] "rad/s" XXX
+ SG_ WhlFr_W_Meas : 23|14@0+ (0.04,0) [0|0] "rad/s" XXX
+ SG_ WhlFl_W_Meas : 7|14@0+ (0.04,0) [0|0] "rad/s" XXX
+
+BO_ 534 WheelData: 8 XXX
+ SG_ WhlRotatRr_No_Cnt : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRr_D_Actl : 33|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirRl_D_Actl : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFr_D_Actl : 37|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlDirFl_D_Actl : 35|2@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFr_No_Cnt : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ WHEEL_ROLLING_TIMESTAMP : 47|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 947 Doors: 8 XXX
+ SG_ Door_FL_Open : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ Door_FR_Open : 60|1@0+ (1,0) [0|0] "" XXX
+ SG_ Door_RL_Open : 48|1@0+ (1,0) [0|0] "" XXX
+ SG_ Door_RR_Open : 49|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 963 BCM_to_HS_Body: 8 XXX
+ SG_ Brake_Lights : 8|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 970 Lane_Keep_Assist_Control: 8 XXX
+ SG_ Lkas_Action : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ Lkas_Alert : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ Lane_Curvature : 15|12@0+ (5e-06,-0.01) [0|0] "1/m" XXX
+ SG_ Steer_Angle_Req : 19|12@0+ (0.04297,-88.00445) [0|0] "deg" XXX
+
+BO_ 972 Lane_Keep_Assist_Status: 8 XXX
+ SG_ LaHandsOff_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaActDeny_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ LaActAvail_D_Actl : 5|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 984 Lane_Keep_Assist_Ui: 8 XXX
+ SG_ Set_Me_X80 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ Set_Me_X45 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ Lines_Hud : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ Hands_Warning_W_Chime : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ Hands_Warning : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ Set_Me_X30 : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ SG_ 970 Lkas_Action "only vals 4, 5, 8, 9 seem to work. 4 and 5 are a bit smoother" ;
+
+VAL_ 357 Cruise_State 4 "active" 3 "standby" 0 "off" ;
+VAL_ 970 Lkas_Action 15 "off" 9 "abrupt" 8 "abrupt2" 5 "smooth" 4 "smooth2" ;
+VAL_ 970 Lkas_Alert 15 "no_alert" 3 "high_intensity" 2 "mid_intensity" 1 "low_intensity" ;
+VAL_ 972 LaActAvail_D_Actl 3 "available" 2 "tbd" 1 "not_available" 0 "fault" ;
+VAL_ 984 Lines_Hud 15 "none" 11 "grey_yellow" 8 "green_red" 7 "yellow_grey" 6 "grey_grey" 4 "red_green" 3 "green_green" ;
diff --git a/iqdbc_repo/iqdbc/dbc/ford_lincoln_base_pt.dbc b/iqdbc_repo/iqdbc/dbc/ford_lincoln_base_pt.dbc
new file mode 100644
index 000000000..828e4118e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/ford_lincoln_base_pt.dbc
@@ -0,0 +1,12717 @@
+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_: VDM CMR_DSMC SOBDMC_HPCM_FD1 IPMA_ADAS PSCM ABS_ESC TCCM TCM_DSL PCM_HEV PCM ECM_Diesel GENERIC_GWMWakeup GWM _delete TSTR
+
+VAL_TABLE_ DcacRdy_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "Faulted" 4 "ProtectionTempearture" 3 "ProtectionOverload" 2 "ProtectionGfci" 1 "Active" 0 "Idle";
+VAL_TABLE_ HvacCmprLim_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "CompressorHeadPressure" 4 "AvailableTorque" 3 "PedalPosition" 2 "RPM" 1 "ECT" 0 "NoLimit";
+VAL_TABLE_ AdvStrt_D_Stat 15 "NotUsed_15" 14 "NotUsed_14" 13 "NotUsed_13" 12 "NotUsed_12" 11 "NotUsed_11" 10 "NotUsed_10" 9 "NotUsed_9" 8 "NotUsed_8" 7 "NotUsed_7" 6 "NotUsed_6" 5 "NotUsed_5" 4 "NotUsed_4" 3 "NotUsed_3" 2 "NotUsed_2" 1 "NotUsed_1" 0 "NoAction";
+VAL_TABLE_ VehOnSrc_D_Stat 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "OverTheAir" 3 "RemoteParkAssist" 2 "RemoteStart" 1 "Manual" 0 "Off";
+VAL_TABLE_ NoMessage_Msg1_63 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ TrlrRvrseEnbl_D2_Stat 7 "NotUsed" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive";
+VAL_TABLE_ Off_On_FlashChime 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "FlashChime" 1 "On" 0 "Off";
+VAL_TABLE_ DieslPrtcWarn_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_OverLoaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_OverLimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_OverLoaded" 0 "DPF_Normal_Operation";
+VAL_TABLE_ StrtrMtrCtlMsgTxt_D2_Rq 3 "NotUsed" 2 "ShiftToNeutralToStart" 1 "ShiftToParkToStart" 0 "NoRequest";
+VAL_TABLE_ PaakMyKey_D_Rq 3 "NotUsed" 2 "ConfirmNewPaakMyKey" 1 "RequestNewPaakMyKey" 0 "None";
+VAL_TABLE_ PaakMyKeySearch_D_Stat 7 "PhoneErased" 6 "LockButtonTimeOut" 5 "PressLockButton" 4 "ConfirmHmi" 3 "MyKeyPaakFound" 2 "StandardPaakFound" 1 "NoValidPaakFound" 0 "Null";
+VAL_TABLE_ TrlrIdType_D_Stat 3 "Gooseneck" 2 "FifthWheel" 1 "Conventional" 0 "Null";
+VAL_TABLE_ TrlrAidSetup_D2_Rq 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "CompleteSetup" 5 "ReturnToSetup" 4 "StickerNotCircled" 3 "ConfirmSetup" 2 "EndSetup" 1 "BeginSetup" 0 "Inactive";
+VAL_TABLE_ TrlrAidEnbl_D2_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Deactivate" 2 "ActivateTrg" 1 "ActivateTba" 0 "Inactive";
+VAL_TABLE_ BattChrgMde_D_Actl 3 "NotUsed" 2 "ConstantCurrent" 1 "ConstantVoltage" 0 "NotCharging";
+VAL_TABLE_ LcwaLeft_D_Stat 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Disabled" 2 "TemporaryUnavailable" 1 "SensorBlocked" 0 "Available";
+VAL_TABLE_ LcwaMsgTxt_D_Stat 3 "SodXFaulty" 2 "SodXBlocked" 1 "TrailerConnected" 0 "NoMessage";
+VAL_TABLE_ Level_0_3 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Level_0";
+VAL_TABLE_ SteWhlSwtchMde_D_Stat 3 "NotUsed_2" 2 "NotUsed_1" 1 "Dialog" 0 "Domain";
+VAL_TABLE_ TrlrRvrse_D_Stat 3 "Faulty" 2 "TrailerReverseGuidanceLite" 1 "On" 0 "Off";
+VAL_TABLE_ TrlrAid_D2_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "DirtyCamera" 9 "IncorrectLighting" 8 "TrackingLost" 7 "TrackingUnknownConfidence" 6 "TrackingHighConfidence" 5 "TrackingMediumConfidence" 4 "TrackingLowConfidence" 3 "TurnRequested" 2 "DriveStraighRequested" 1 "Initializing" 0 "NotTracking";
+VAL_TABLE_ AwdDrvMde_D2 15 "Faulty" 14 "NotUsed_7" 13 "NotUsed_6" 12 "NotUsed_5" 11 "NotUsed_4" 10 "NotUsed_3" 9 "NotUsed_2" 8 "NotUsed_1" 7 "NotAvailable" 6 "TowHaul" 5 "RockCrawl" 4 "Baja" 3 "MudAndSand" 2 "Weather" 1 "Sport" 0 "Normal";
+VAL_TABLE_ TrlrAidSetup_D2_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "SetupAcquisitionSuccess" 4 "TbaTadMonitor" 3 "SetupStartAcquisition" 2 "SetupPrepForAcquisition" 1 "TbaActive" 0 "Null";
+VAL_TABLE_ CamraRearOn_D2_Stat2 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Decommission" 2 "Activate" 1 "Deactivate" 0 "Null";
+VAL_TABLE_ AirCondClu_D_Stat 7 "NotUsed" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad";
+VAL_TABLE_ BattChrgTrgtSoC_D_Rq 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_TABLE_ OffNormalSoft 3 "NotUsed" 2 "Soft" 1 "Normal" 0 "Off";
+VAL_TABLE_ OffOnDisabledInhibited 3 "Inhibited" 2 "Disabled" 1 "On" 0 "Off";
+VAL_TABLE_ DgtlCommGtwyMde_D_Rq 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "AcPnC" 4 "AcEIM" 3 "DcPnC" 2 "DcEIM" 1 "AttemptDgtlComm" 0 "NoDgtlComm";
+VAL_TABLE_ BattDcCnnct_D_Cmd 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "WeldCheck" 3 "OkToDischarge" 2 "Closed" 1 "Precharge" 0 "Open";
+VAL_TABLE_ Null_NoFault_Fault 3 "NotUsed" 2 "Fault" 1 "NoFault" 0 "Null";
+VAL_TABLE_ ModemReset_D_Rq 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "BrandConnectReset2" 5 "BrandConnectReset1" 4 "CcsReset" 3 "OnlineTrafficReset" 2 "PaakReset" 1 "WifiHotspotReset" 0 "Null";
+VAL_TABLE_ PrkAsstSlotId_D_Stat 7 "Faulty" 6 "Slot6" 5 "Slot5" 4 "Slot4" 3 "Slot3" 2 "Slot2" 1 "Slot1" 0 "NoSlotFound";
+VAL_TABLE_ RstrnOnPsngr_D_RqMnu 15 "Faulty" 14 "NotUsed_11" 13 "NotUsed_10" 12 "ConfiguredOff" 11 "NotUsed_9" 10 "On" 9 "NotUsed_8" 8 "NotUsed_7" 7 "NotUsed_6" 6 "NotUsed_5" 5 "Off" 4 "NotUsed_4" 3 "NotUsed_3" 2 "NotUsed_2" 1 "NotUsed_1" 0 "NoAction";
+VAL_TABLE_ BalrInnrLeft_D_Stat 3 "Reporting" 2 "NotReporting" 1 "SystemStandby" 0 "Initialization";
+VAL_TABLE_ Zero_1_2_4 3 "Four" 2 "Two" 1 "One" 0 "Zero";
+VAL_TABLE_ NoReq_AutoUp_Stop 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_TABLE_ BalrSnsLeft_D_Falt 3 "Invalid" 2 "SystemFailure" 1 "Blocked" 0 "Clear";
+VAL_TABLE_ Null_Low_Med_High 3 "High" 2 "Medium" 1 "Low" 0 "Null";
+VAL_TABLE_ Null_NotPressed_Pressed 3 "NotUsed" 2 "Pressed" 1 "NotPressed" 0 "Null";
+VAL_TABLE_ Low_Med_High 3 "NotUsed" 2 "High" 1 "Medium" 0 "Low";
+VAL_TABLE_ Null_NotAvail_Avail 3 "NotUsed" 2 "Available" 1 "NotAvailable" 0 "Null";
+VAL_TABLE_ ChrgGoTMnte_D_Stat 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0";
+VAL_TABLE_ NoData_Faulty_1E_1F 31 "Faulty" 30 "NoDataExists";
+VAL_TABLE_ PwFlwBatt_D_Dsply 15 "NotUsed_8" 14 "NotUsed_7" 13 "NotUsed_6" 12 "NotUsed_5" 11 "NotUsed_4" 10 "NotUsed_3" 9 "NotUsed_2" 8 "NotUsed_1" 7 "FlwFromWallToBatt" 6 "FlwFromAllWhlsToBatt" 5 "FlwFromBattToAllWhls" 4 "FlwFromFrontWhlsToBatt" 3 "FlwFromBattToFrontWhls" 2 "FlwFromRearWhlsToBatt" 1 "FlwFromBattToRearWhls" 0 "NoFlow";
+VAL_TABLE_ PwFlwFuelDrv_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "FlwFromFuelToAllWhls" 2 "FlwFromFuelToFrontWhls" 1 "FlwFromFuelToRearWhls" 0 "NoFlow";
+VAL_TABLE_ TrlrAidMsgTxt_D2_Rq 63 "Message63" 62 "Message62" 61 "Message61" 60 "Message60" 55 "Message55" 50 "Message50" 45 "Message45" 40 "Message40" 35 "Message35" 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ TrlrAidEnbl_D2_Stat 7 "NotUsed_1" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive";
+VAL_TABLE_ RbaCta_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off";
+VAL_TABLE_ NoRequest_Mode1_2_3 3 "Mode_3" 2 "Mode_2" 1 "Mode_1" 0 "NoRequest";
+VAL_TABLE_ RvltnMatchAllw_D_Stat 3 "RevolutionMatchDisabled" 2 "RevolutionMatchEnabled" 1 "ChangeWithDriveMode" 0 "NoSelection";
+VAL_TABLE_ BattTracCnnct_D_Cmd 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "WeldCheck" 3 "OkToDischarge" 2 "Closed" 1 "Precharge" 0 "Open";
+VAL_TABLE_ NotDiagnose_FailPass 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_TABLE_ Null_Off_UnavailFaulty 3 "Faulty" 2 "Unavailable" 1 "Off" 0 "Null";
+VAL_TABLE_ OffOnDisabledNotUsed 3 "NotUsed" 2 "Disabled" 1 "On" 0 "Off";
+VAL_TABLE_ OffGraphicTextBoth 3 "Both" 2 "Text" 1 "Graphic" 0 "Off";
+VAL_TABLE_ NoneInactiveActive_NotUsed 3 "NotUsed" 2 "Active" 1 "Inactive" 0 "None";
+VAL_TABLE_ Off_On_NotUsed 3 "NotUsed_2" 2 "NotUsed_1" 1 "On" 0 "Off";
+VAL_TABLE_ RbaSys_D_Stat 3 "Faulty" 2 "Available" 1 "Suspended" 0 "Disabled";
+VAL_TABLE_ BrkAppl_D_RqPt 3 "BrakesSlowRelease" 2 "BrakesFastRelease" 1 "BrakesEngage" 0 "NotActive";
+VAL_TABLE_ Mtr2State_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_1" 4 "ReadinessState" 3 "DeactivationState" 2 "PowerGeneration" 1 "PowerConsumption" 0 "Null";
+VAL_TABLE_ HybVehMde_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Fuel" 2 "HybridElectric" 1 "AllElectric" 0 "Null";
+VAL_TABLE_ ChrgStat_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed" 4 "ChargingCompleted" 3 "NotCharging" 2 "ChargingInDrivingState" 1 "ChargingInParkingState" 0 "Null";
+VAL_TABLE_ Null_HiPower_Low_Med 3 "MediumPower" 2 "LowPower" 1 "HighPower" 0 "Null";
+VAL_TABLE_ Inactive_Enable_Disable_NotUsed 0 "Inactive" 2 "Disable" 1 "Enable";
+VAL_TABLE_ Inactive_OffOn_NotUsed 0 "Inactive" 1 "On" 2 "Off" 3 "NotUsed";
+VAL_TABLE_ Null_NotPressed_Faulty 3 "Faulty" 2 "Pressed" 1 "NotPressed" 0 "Null";
+VAL_TABLE_ TrailCtl_D_Stat 7 "Faulty" 6 "DescentOnly" 5 "EnabledDeny" 4 "StandbyOverThreshold" 3 "StandbyOverride" 2 "Active" 1 "EnabledDescent" 0 "Off";
+VAL_TABLE_ Faulty_3F 63 "Faulty";
+VAL_TABLE_ ChrgOvrdExitScrn_D_Rq 3 "NotUsed_1" 2 "Request_override" 1 "Do_not_request_override" 0 "Inactive";
+VAL_TABLE_ Quality_Data_Faulty 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Faulty";
+VAL_TABLE_ TrlrHitchYaw_D_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "FaultyYrsuConnection" 9 "FaultyYrsu" 8 "HiConfdLrndAngle" 7 "LowConfdLrndAngle" 6 "HiConfdAngleMem" 5 "LowConfdAngleMem" 4 "InitNoTadAngle" 3 "InitInputs" 2 "TadTrlrDataOutOfRange" 1 "TadNotWithinSpecification" 0 "NoConnectionWithYrsu";
+VAL_TABLE_ NoData_Faulty_FFFFFFFFFFFE_FF -1 "Faulty_FFFFFFFFFFFF" -2 "NoDataExists_FFFFFFFFFFFE";
+VAL_TABLE_ NoFault_Fault 1 "Fault" 0 "No_Fault";
+VAL_TABLE_ OtaTrg_D_Stat 3 "NotUsed_1" 2 "Accepted" 1 "NotAccepted" 0 "Null";
+VAL_TABLE_ EdmMsgTxt_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OverallGoodScore" 10 "WorkOnCompliance" 9 "GoodCompliance" 8 "WorkOnGearShifting" 7 "GoodGearShifting" 6 "WorkOnEfficientSpeed" 5 "GoodEfficientSpeed" 4 "WorkOnDeceleration" 3 "GoodDeceleration" 2 "WorkOnAcceleration" 1 "GoodAcceleration" 0 "NoMessage";
+VAL_TABLE_ EdmLamp_D_Dsply 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "NotUsed_1" 8 "CoastingEngineBrake" 7 "CoastingShiftToNeutral" 6 "FreewayJunction" 5 "Curve2" 4 "Curve1" 3 "SpeedLimit" 2 "Crossing" 1 "FreewayExit" 0 "NoRecommendation";
+VAL_TABLE_ AwdCnnct_D_Stat 3 "Connecting" 2 "Disconnecting" 1 "Connected" 0 "Disconnected";
+VAL_TABLE_ EngAirFiltMsgTxt_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "EngineAirFilterMonitorFalt" 4 "ResetComplete" 3 "Clogged" 2 "ReplaceNow" 1 "ReplaceSoon" 0 "NoMessage";
+VAL_TABLE_ ElPwPoint_D_Rq 3 "On" 2 "Off2" 1 "Off1" 0 "Null";
+VAL_TABLE_ EngExhMdeQuiet_D2_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null";
+VAL_TABLE_ RearDiffThrml_D_Stat 3 "NotUsed_1" 2 "AboveThermalLimit" 1 "ThermalLimit" 0 "Normal";
+VAL_TABLE_ NoInhibit_Inhibit 1 "Inhibit" 0 "NoInhibit";
+VAL_TABLE_ PersRecallSrc_D_Actl 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "MemorySwitch" 3 "RemoteStart" 2 "KeyFob" 1 "CenterStack" 0 "Null";
+VAL_TABLE_ BattTracChiller_D_Stat 3 "NotUsed" 2 "ChillerNotAvailable" 1 "ChillerBrieflyAvailable" 0 "ChillerAvailable";
+VAL_TABLE_ SelDrvMdeChassis2_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "RoughRoadMode" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode";
+VAL_TABLE_ TrnFaltOpenClu_B_Stat 1 "MayOpenClutch" 0 "Normal";
+VAL_TABLE_ UrbanAreaDetct_D_Stat 3 "NotUsed_1" 2 "City" 1 "Subdivision" 0 "None";
+VAL_TABLE_ Closed_Open 1 "Open" 0 "Closed";
+VAL_TABLE_ AdbBrdrDist 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_TABLE_ TCU_ESN_D_Rq 3 "NotUsed" 2 "TCU_ESN_Request" 1 "NoRequest" 0 "Inactive";
+VAL_TABLE_ FactoryReset_Rq 1 "ResetFactoryDefaults" 0 "Inactive";
+VAL_TABLE_ TCU_Init_Actvtn_St 3 "NotUsed" 2 "InitialActivateDeny" 1 "InitialActivateAccept" 0 "Invalid";
+VAL_TABLE_ TCU_Final_Actvtn_St 3 "NotUsed" 2 "FinalActivateDeny" 1 "FinalActivateAccept" 0 "Invalid";
+VAL_TABLE_ WaitToStartLamp_D_Falt 3 "NotUsed" 2 "Wait_to_start_lamp_failed" 1 "Diagnosis_not_ready" 0 "Wait_to_start_lamp_OK";
+VAL_TABLE_ BattTracCoolLvl_D_Rq 7 "Faulty" 6 "NotUsed" 5 "ChillerCoolingBattFirst" 4 "ChillerCoolingCabinFirst" 3 "ForcedCoolingRadiator" 2 "OpportunisticCoolingRad" 1 "CoolantFlowBypassLine" 0 "Off";
+VAL_TABLE_ BattClntVlvOvrrd_D_Rq 3 "NotUsed" 2 "OverrideTbcvToChiller" 1 "OverrideTbcvToRadiator" 0 "NoOverrideToTbcvCLogic";
+VAL_TABLE_ NonMagnetic_Magnetic 1 "Magnetic" 0 "NonMagnetic";
+VAL_TABLE_ RideHghtMde_D_Stat 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "AdjUpAero" 8 "AdjUpOffRoad" 7 "AdjUpNormal" 6 "AdjDownKneel" 5 "AdjDownAero" 4 "AdjDownNormal" 3 "OffRoad" 2 "Kneel" 1 "Aero" 0 "Normal";
+VAL_TABLE_ AutoTowAllw_D_StatMnu 3 "TowHaulCommandedOn" 2 "AutoTowHaulEnabled" 1 "AutoTowHaulDisabled" 0 "NoSelection";
+VAL_TABLE_ SrpEventRight_D_Stat 3 "Faulty" 2 "Bump" 1 "Pothole" 0 "NoEvent";
+VAL_TABLE_ RearDiff_D_Stat 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "NotUsed_1" 8 "TorqueReqNotHonored" 7 "MissingSignal" 6 "ModuleFault" 5 "HydroTempSensorFault" 4 "ClutchPressSensorFault" 3 "AccumPressSensorFault" 2 "ControlValveFault" 1 "MotorFault" 0 "Normal";
+VAL_TABLE_ NotAllowed_Allowed 1 "Allowed" 0 "NotAllowed";
+VAL_TABLE_ EngTrlrCnnct_D_Stat 3 "NotUsed_1" 2 "UnverifiedTrailer" 1 "HeavyTrailer" 0 "NoTrailer";
+VAL_TABLE_ Faulty_FFFF 65535 "Faulty";
+VAL_TABLE_ NoData_Faulty_3FFE_3FFF 16383 "Faulty" 16382 "NoDataExists";
+VAL_TABLE_ Faulty_3FFF 16383 "Faulty";
+VAL_TABLE_ NotExceeded_Exceeded 1 "Exceeded" 0 "NotExceeded";
+VAL_TABLE_ EmgcyCall_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "ManualEmergencyCall" 3 "AutoEmergencyCall" 2 "NoEvent" 1 "EmergencyCallNotSupported" 0 "Null";
+VAL_TABLE_ NotAsserted_Asserted 1 "Asserted" 0 "NotAsserted";
+VAL_TABLE_ AirSprngRate_D_Stat 3 "Faulty" 2 "Firm" 1 "Medium" 0 "Soft";
+VAL_TABLE_ AirSprngRate_D_Rq 3 "NoRequest" 2 "Firm" 1 "Medium" 0 "Soft";
+VAL_TABLE_ GearLvr_D_ActlDrv 15 "Fault" 14 "Unknown_Position" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Range6" 10 "Range5" 9 "Range4" 8 "Range3_M3_L3" 7 "Range2_M2_L2" 6 "Range1_M1_L1" 5 "Low" 4 "Sport_DriveSport_Mposition" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_TABLE_ ChrgrInPwMde_D_Actl 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "EvseFault" 7 "EvseNotCompatible" 6 "IcCharging" 5 "DcCharging" 4 "AcDigital" 3 "AcBasic" 2 "DigitalCommDetected" 1 "EvsePaused" 0 "EvseNotDetected";
+VAL_TABLE_ ChrgCordLck_D_Stat 7 "Faulty" 6 "LockFail" 5 "UnlockFail" 4 "LockInProgress" 3 "UnlockInProgress" 2 "Lock" 1 "Unlock" 0 "Retain";
+VAL_TABLE_ LkaActvStats_D2_Req 7 "NotUsed" 6 "LkaIncrIntervRight" 5 "LkaSupprRight" 4 "LkaStandIntervRight" 3 "LkaSupprLeft" 2 "LkaStandIntervLeft" 1 "LkaIncrIntervLeft" 0 "LkaNoInterv";
+VAL_TABLE_ OffOnNoDataFaulty 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off";
+VAL_TABLE_ NoMessage_Msg1_3 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ TrnRng_D_RqGsm 15 "Fault" 14 "UnknownPosition" 13 "Undefined_2" 12 "Undefined_1" 11 "_6" 10 "_5" 9 "_4" 8 "_3" 7 "_2" 6 "_1" 5 "Low" 4 "Sport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_TABLE_ PrkBrkActv_D_RqGsmGear 3 "NotUsed" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "Null";
+VAL_TABLE_ TrnPrkSys_D_Actl 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "FrequencyError" 8 "OutOfRangeHigh" 7 "OutOfRangeLow" 6 "Override" 5 "OutOfPark" 4 "TransitionCloseToOutOfPark" 3 "AtNoSpring" 2 "TransitionCloseToPark" 1 "Park" 0 "NotKnown";
+VAL_TABLE_ OKLowUnknownInvalid 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK";
+VAL_TABLE_ Dsp_RotAddrBtnEv_St 15 "NotUsed_1" 14 "Pos_7Steps" 13 "Pos_6Steps" 12 "Pos_5Steps" 11 "Pos_4Steps" 10 "Pos_3Steps" 9 "Pos_2Steps" 8 "Pos_1Step" 7 "NotPressed" 6 "Neg_1Steps" 5 "Neg_2Steps" 4 "Neg_3Steps" 3 "Neg_4Steps" 2 "Neg_5Steps" 1 "Neg_6Steps" 0 "Neg_7Steps";
+VAL_TABLE_ PrkAidDrvDir_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "BackwardNegative" 4 "ForwardNegative" 3 "BackwardPositive" 2 "ForwardPositive" 1 "NoMotion" 0 "DirectionNotKnown";
+VAL_TABLE_ EngExhMdeQuiet_D2_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null";
+VAL_TABLE_ GasPrtc_D_RqDsply 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "GpfOverLimit" 1 "GpfAtLimit" 0 "NormalOperation";
+VAL_TABLE_ TjaWarn_D_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "HardTakeOverLevel2" 2 "HardTakeOverLevel1" 1 "TrafficJamAssistCancel" 0 "NoWarning";
+VAL_TABLE_ Faulty_7FF 2047 "Faulty";
+VAL_TABLE_ Tja_D_Stat 7 "NotUsed_1" 6 "ActiveWarningRight" 5 "ActiveWarningLeft" 4 "ActiveInterventionRight" 3 "ActiveInterventionLeft" 2 "Active" 1 "Standby" 0 "Off";
+VAL_TABLE_ TjaMsgTxt_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "TurnOnAdaptCruiseControl" 2 "TrafficJamAssistSelected" 1 "TrafficJamAssistUnavailabl" 0 "NoMessage";
+VAL_TABLE_ PwSrcULowMde_D_Actl 3 "NotUsed_1" 2 "ReverseBoost" 1 "ForwardBuck" 0 "Standby";
+VAL_TABLE_ ApaTrgtDist_D_Stat 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 0 "Off";
+VAL_TABLE_ Memory_2_SwPsngr_Stat 1 "Pressed" 0 "Null";
+VAL_TABLE_ Pers3Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null";
+VAL_TABLE_ PwSrcULoMde_D_Rq 3 "NotUsed_1" 2 "ReverseBoost" 1 "ForwardBuck" 0 "Standby";
+VAL_TABLE_ AccMsgTxt_D2_Rq 15 "NotUsed_1" 14 "NCC_Enabled_Warning" 13 "IACC_TJA_Selected" 12 "ACC_TJA_Selected" 11 "IACC_Selected" 10 "Press_Brake_To_Hold" 9 "Only_Following_In_Low_Spd" 8 "TJA_Unavailable" 7 "Shift_Down" 6 "IACC_Unavailable" 5 "ACC_Selected" 4 "ACC_Overridden" 3 "Brake_Capacity_Warning" 2 "ACC_Cancelled" 1 "ACC_Unavailable" 0 "No_Text";
+VAL_TABLE_ WakeAlarm0_B_Typ 1 "CanAndEcuDriveCircuit" 0 "CanOnly";
+VAL_TABLE_ WakeAlarm0_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff";
+VAL_TABLE_ EmPrflNo_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null";
+VAL_TABLE_ EmPrflKeyAssoc_D_Rq 7 "NotUsed_3" 6 "DisassociatePhone" 5 "EnterPhoneAssociation" 4 "OverwriteKey" 3 "DisassociateKey" 2 "ExitKeyAssociation" 1 "EnterKeyAssociation" 0 "Null";
+VAL_TABLE_ Em_D_Stat 3 "NotSupported" 2 "ProfilesOff" 1 "ProfilesOn" 0 "Null";
+VAL_TABLE_ EmPrflButtnAssoc_D_Rq 3 "NotUsed" 2 "ExitButtonAssociation" 1 "EnterButtonAssociation" 0 "Null";
+VAL_TABLE_ EmPrflNo_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null";
+VAL_TABLE_ EmPrflKeyAssoc_D_Stat 7 "WrongDevice" 6 "KeyAssociateFailed" 5 "KeyAssociateSuccess" 4 "KeyAlreadyInUse" 3 "KeyDisassociated" 2 "KeyAssociationExited" 1 "KeyAssociationEntered" 0 "Null";
+VAL_TABLE_ EsaEnbl_D2_Rq 3 "NotConfigured" 2 "Enabled" 1 "Pending" 0 "Disabled";
+VAL_TABLE_ PersNo_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "NotDetermined" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_TABLE_ WiprFront_D_Stat2 15 "NO_DATA_EXISTS" 14 "STALLED" 13 "NotUsed" 12 "AUTO_ADJUST" 11 "COURTESYWIPE" 10 "AUTO_HIGH" 9 "AUTO_LOW" 8 "WASH" 7 "MIST_FLICK" 6 "MAN_HIGH" 5 "MAN_LOW" 4 "MAN_INT_ON" 3 "MAN_INT_OFF" 2 "OFF_MOVING" 1 "AUTO_OFF" 0 "OFF";
+VAL_TABLE_ TurnLghtSwtch_D_Stat2 3 "NotUsed" 2 "Right" 1 "Left" 0 "Off";
+VAL_TABLE_ CcButtnOnOffCnclPress3 1 "Pressed" 0 "Not pressed";
+VAL_TABLE_ SelDrvMdePos01_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_TABLE_ SelDrvMdePos01_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_TABLE_ ImmedFastMediumSlow 3 "Slow" 2 "Medium" 1 "Fast" 0 "Immediately";
+VAL_TABLE_ AdbHiBeamKeepOff_D_Rq 3 "KeepBothOff" 2 "KeepLeftOff" 1 "KeepRightOff" 0 "BothFreeRunning";
+VAL_TABLE_ AdbLampOnOff_D_Rq 3 "BothOn" 2 "LeftOnRightOff" 1 "RightOnLeftOff" 0 "BothOff";
+VAL_TABLE_ AdbMde1_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None";
+VAL_TABLE_ Closed_Open_Active_Denied 3 "Denied" 2 "Active" 1 "Open" 0 "Closed";
+VAL_TABLE_ OffLowMedMax 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off";
+VAL_TABLE_ IaccLamp_D_Rq 3 "NotUsed_2" 2 "NotUsed_1" 1 "DisplayIaccIcon" 0 "DoNotDisplayIaccIcon";
+VAL_TABLE_ Low_High_Confidence 1 "High_Confidence" 0 "Low_Confidence";
+VAL_TABLE_ Fault_Occupied_Empty_Un 3 "Unknown" 2 "Empty" 1 "Occupied" 0 "Fault";
+VAL_TABLE_ Off_On_Flash_Triggered 3 "Triggered" 2 "Flash" 1 "On" 0 "Off";
+VAL_TABLE_ IaccVLim_D_Rq 252 "NotUsed_2" 250 "LimitSpeed_250" 240 "LimitSpeed_240" 230 "LimitSpeed_230" 220 "LimitSpeed_220" 210 "LimitSpeed_210" 200 "LimitSpeed_200" 190 "LimitSpeed_190" 150 "LimitSpeed_150" 140 "LimitSpeed_140" 130 "LimitSpeed_130" 120 "LimitSpeed_120" 110 "LimitSpeed_110" 100 "LimitSpeed_100" 90 "LimitSpeed_90" 80 "LimitSpeed_80" 70 "LimitSpeed_70" 60 "LimitSpeed_60" 50 "LimitSpeed_50" 40 "LimitSpeed_40" 30 "LimitSpeed_30" 20 "LimtSpeed_20" 251 "NotUsed_1" 255 "Faulty" 254 "NoDataExists" 253 "NotUsed_3" 180 "LimitSpeed_180" 179 "LimitSpeed_179" 178 "LimitSpeed_178" 177 "LimitSpeed_177" 176 "LimitSpeed_176" 175 "LimitSpeed_175" 174 "LimitSpeed_174" 173 "LimitSpeed_173" 172 "LimitSpeed_172" 171 "LimitSpeed_171" 170 "LimitSpeed_170" 169 "LimitSpeed_169" 168 "LimitSpeed_168" 167 "LimitSpeed_167" 166 "LimitSpeed_166" 165 "LimitSpeed_165" 164 "LimitSpeed_164" 163 "LimitSpeed_163" 162 "LimitSpeed_162" 161 "LimitSpeed_161" 160 "LimitSpeed_160" 15 "LimitSpeed_15" 14 "LimitSpeed_14" 13 "LimitSpeed_13" 12 "LimitSpeed_12" 11 "LimitSpeed_11" 10 "LimitSpeed_10" 9 "LimitSpeed_9" 8 "LimitSpeed_8" 7 "LimitSpeed_7" 6 "LimitSpeed_6" 5 "LimitSpeed_5" 4 "LimitSpeed_4" 3 "LimitSpeed_3" 2 "LimitSpeed_2" 1 "LimitSpeed_1" 0 "LimitSpeed_0";
+VAL_TABLE_ IaccVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null";
+VAL_TABLE_ SelDrvMdeAwd_D_Rq 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode";
+VAL_TABLE_ SelDrvMdeAwd_D_Stat 0 "NotAvailable" 1 "Available" 2 "TemporarilyNotAvailable" 3 "Faulty";
+VAL_TABLE_ SelDrvMdeAwd2_D_Stat 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode";
+VAL_TABLE_ RearDiffLckMsg2_D_Rq 15 "NotUsed_3" 14 "NotUsed_2" 13 "NotUsed_1" 12 "ElsdReduced" 11 "LockingFeatureNotAvailable" 10 "EsldOff" 9 "ElsdRestored" 8 "ElsdOverheated" 7 "Locker_Disabled" 6 "Locker_Enabled" 5 "LockerSpeed5" 4 "LockerSpeed4" 3 "LockerSpeed3" 2 "LockerSpeed2" 1 "LockerSpeed1" 0 "NormalNoMessage ";
+VAL_TABLE_ Counts_ZeroToSeven 4 "FourCounts" 3 "ThreeCounts" 2 "TwoCounts" 1 "OneCount" 0 "ZeroCounts" 7 "SevenOrMoreCounts" 6 "SixCounts" 5 "FiveCounts";
+VAL_TABLE_ HeadLghtHiPrmsn_D_Stat 3 "CancelAndSuppress" 2 "Cancel" 1 "Hold" 0 "AllowChange";
+VAL_TABLE_ SelDrvMdeSwtch 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed";
+VAL_TABLE_ NotAvail_Temp_Faulty 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable";
+VAL_TABLE_ AwdDrvMde 7 "Faulty" 6 "NotAvailable" 5 "RockCrawl" 4 "Baja" 3 "MudAndSand" 2 "Weather" 1 "Sport" 0 "Normal";
+VAL_TABLE_ SelDrvMdePt_D_Rq 31 "Faulty" 30 "NotUsed15" 29 "NotUsed14" 28 "NotUsed13" 27 "NotUsed12" 26 "NotUsed11" 25 "NotUsed10" 24 "NotUsed9" 23 "NotUsed8" 22 "NotUsed7" 21 "NotUsed6" 20 "NotUsed5" 19 "NotUsed4" 18 "EvLaterChargerMode" 17 "EvNowMode" 16 "DragMode" 15 "HighSpeedDesertMode_Baja" 14 "SportAdaptiveMode" 13 "NotAvailable_13" 12 "NotAvailable_12" 11 "NotAvailable_11" 10 "NotAvailable_10" 9 "RockCrawlMode" 8 "MudRutsMode" 7 "SandMode" 6 "EconomyMode" 5 "GrassGravelSnow" 4 "NotAvailable_04" 3 "TowHaulMode" 2 "NotAvailable_02" 1 "SportMode" 0 "NormalMode";
+VAL_TABLE_ SelDrvMde_D_Stat 3 "NotUsed" 2 "DriveModeChangeRequest" 1 "DriveModeChangeSelection" 0 "NoDriveModeChangeRequest";
+VAL_TABLE_ NoMessage_Msg1_15 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ SelDrvMdeChassis_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "NotUsed1" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode";
+VAL_TABLE_ NotAvailable_Available 1 "Available" 0 "NotAvailable";
+VAL_TABLE_ PwStep_D_Stat 3 "PositionNotKnown" 2 "StepsNotStowed" 1 "StepsStowed" 0 "Off";
+VAL_TABLE_ PwStep_D_DrvInhbt 3 "NotUsed" 2 "DriveInhibitMalfunction" 1 "DriveInhibited" 0 "DriveNotInhibited";
+VAL_TABLE_ NoMessage_Msg1_31 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ VehTrvlDir_D_Stat 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "Reverse" 2 "LikelyReverse" 1 "Forward" 0 "LikelyForward";
+VAL_TABLE_ TrnRng_D_RqFap 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Backwards" 3 "Forwards" 2 "NoMotion" 1 "Immobilize" 0 "NoRequest";
+VAL_TABLE_ SelDrvMdeSusp_D_Stat 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable";
+VAL_TABLE_ OffOnNoReqFaulty 3 "Faulty" 2 "NoRequest" 1 "On" 0 "Off";
+VAL_TABLE_ LatCtl_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "InterventionRight" 2 "InterventionLeft" 1 "ContinuousPathFollowing" 0 "NoLateralControl";
+VAL_TABLE_ LatCtlSte_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Denied" 3 "RampOut" 2 "ContLatControlInProgress" 1 "Available" 0 "Unavailable";
+VAL_TABLE_ SlowMedFastImmed 3 "Immediately" 2 "Fast" 1 "Medium" 0 "Slow";
+VAL_TABLE_ ComfortablePreciseNotUsed 3 "NotUsed2" 2 "NotUsed1" 1 "Precise" 0 "Comfortable";
+VAL_TABLE_ LatCtlLim_D_Stat 3 "LimitWithDriverActive" 2 "LimitReached" 1 "LimitClose" 0 "LimitNotReached";
+VAL_TABLE_ FuelLvlWarn_D_ActlEng 7 "DteLevel5Lowest" 6 "DteLevel4" 5 "DteLevel3" 4 "DteLevel2NonMyKey" 3 "DteLevel1MyKey" 2 "VeryLow" 1 "Low" 0 "OK";
+VAL_TABLE_ AwdMde_D_RqDrv 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo";
+VAL_TABLE_ ApaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed";
+VAL_TABLE_ AdptDrvMdePt_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Powertrain2Sport" 2 "Powertrain2Normal" 1 "Powertrain2Comfort" 0 "AdaptiveNotActive";
+VAL_TABLE_ AdptDrvMdeChassis_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Chassis2Sport" 2 "Chassis2Normal" 1 "Chassis2Comfort" 0 "AdaptiveNotActive";
+VAL_TABLE_ PwStepMsgTxt_D_Rq 1 "DriveInhibited" 0 "NoMessage" 3 "NotUsed" 2 "Malfunction";
+VAL_TABLE_ OffLowMedHigh 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_TABLE_ NotDeterminedLowMedHigh 3 "High" 2 "Medium" 1 "Low" 0 "NotDetermined";
+VAL_TABLE_ CmbbObjClass_D_Stat 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "Unclassified_Vehicle" 5 "Bicycle" 4 "Pedestrian" 3 "Truck" 2 "Motorcycle" 1 "Vehicle" 0 "Undetermined";
+VAL_TABLE_ HeadLghtHiCtrl_D_RqAhb 7 "NotUsed2" 6 "NotUsed1" 5 "Auto_HiBeam" 4 "Auto_LoBeam" 3 "Flash" 2 "Man_HiBeam" 1 "Man_LoBeam" 0 "Null";
+VAL_TABLE_ AhbHiBeam_D_Rq 3 "NotUsed" 2 "HighBeamRecommended" 1 "LowBeamRecommended" 0 "DeactivatedUnavailable";
+VAL_TABLE_ AhbStatGfhbFdbk_D_Actl 3 "GfhbHighBeamFullyOn" 2 "GfhbHighBeamPartlyOn" 1 "GfhbHighBeamOff" 0 "GfhbUnavailable";
+VAL_TABLE_ AhbcRampingV_D_Rq 3 "Slow" 2 "Medium" 1 "Fast" 0 "Immediately";
+VAL_TABLE_ ApaGearShif_D_RqDrv 7 "NotUSed2" 6 "NotUsed1" 5 "ShiftToP" 4 "ShiftToN" 3 "ShiftToD" 2 "ShiftToR" 1 "NoRequest" 0 "Null";
+VAL_TABLE_ ApaLongCtl_D_RqDrv 7 "NotUsed3" 6 "NotUsed2" 5 "ReleaseBrake" 4 "DriveBackward" 3 "DriveForward" 2 "Stop" 1 "NoRequest" 0 "Null";
+VAL_TABLE_ ApaActvSide2_D_Stat 3 "NoSide" 2 "Right" 1 "Left" 0 "Null";
+VAL_TABLE_ ApaScan_D_Stat 3 "ParkSlotReady" 2 "ParkSlotFound" 1 "NoParkSlot" 0 "Null";
+VAL_TABLE_ ApaSelSapp_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null";
+VAL_TABLE_ ApaSys_D_Stat 7 "Faulty" 6 "Finished" 5 "NotAccessible" 4 "ApaCancelled" 3 "Overspeed" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ ApaSteScanMde_D_Stat 3 "Steering" 2 "Scanning" 1 "NotScanning" 0 "Null";
+VAL_TABLE_ ApaAcsy_D_RqDrv 7 "CloseDoor" 6 "SelectSideRight" 5 "SelectSideLeft" 4 "CheckForObject" 3 "PressApaButton" 2 "SelectSide" 1 "NoRequest" 0 "Null";
+VAL_TABLE_ ApaSteWhl_D_RqDrv 3 "TakeControl" 2 "RemoveHands" 1 "NoRequest" 0 "Null";
+VAL_TABLE_ WiprFrontSwtch_D_Stat 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "PositionNotDetermined" 8 "High" 7 "Low" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Off";
+VAL_TABLE_ Off_On_Unknown_Invalid 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off";
+VAL_TABLE_ Unknown_7FFE_Invalid_7FFF 32767 "Invalid" 32766 "Unknown";
+VAL_TABLE_ OffOnNotUsedFaulty 3 "Faulty" 2 "NotUsed" 1 "On" 0 "Off";
+VAL_TABLE_ BrkBstrVac_D_Stat 3 "NotUsed" 2 "BoosterVacEstimator" 1 "BoosterVacSensor" 0 "NoBoosterVacuumMonitor";
+VAL_TABLE_ AwdMde_D_RqArb 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo";
+VAL_TABLE_ CtaAlrt2_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "AlertZone4" 3 "AlertZone3" 2 "AlertZone2" 1 "AlertZone1" 0 "Off";
+VAL_TABLE_ BttRightLeft_D_Stat 7 "NotUsed" 6 "Disabled" 5 "Off" 4 "OffTemp" 3 "NotConnected" 2 "Pending" 1 "Connected" 0 "NotDetermined";
+VAL_TABLE_ Null_NoRequest_Request 3 "NotUsed" 2 "Request" 1 "NoRequest" 0 "Null";
+VAL_TABLE_ PoliceIdlMde_D_Stat 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "PepsActive" 8 "Decommissioned" 7 "ActiveFault" 6 "ArmFault" 5 "PrearmedFault" 4 "OffFault" 3 "Active" 2 "Arm" 1 "Prearmed" 0 "Off";
+VAL_TABLE_ TripComputerMetricImperial 0 "TripComputer_metric" 1 "TripComputer_imperial";
+VAL_TABLE_ GrdAsstAllw_D_DsplyPt 3 "NotUsed" 2 "On" 1 "Off" 0 "NoModeSelected";
+VAL_TABLE_ PrkBrkMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "No_Message";
+VAL_TABLE_ AutoHoldMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ AutoHoldMde_D_Ind 3 "Indication_3" 2 "Indication_2" 1 "Indication_1" 0 "Off";
+VAL_TABLE_ AutoRgenTxt_B_RqDsply 1 "AutExhFilterCleanOFF" 0 "AutExhFilterCleanON";
+VAL_TABLE_ TrnMsgTxt2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "TransTooHot_LoudChime" 3 "PressBrake_LoudChime" 2 "PressBrake_SoftChime" 1 "PressBrake_NoChime" 0 "NoText_NoChime";
+VAL_TABLE_ TrnGearMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage";
+VAL_TABLE_ ChargeProfIDPref_Rq 3 "NotUsed" 2 "Value" 1 "ChargeNow" 0 "Inactive";
+VAL_TABLE_ EngExhMdeQuiet_D_Stat 3 "Faulty" 2 "QuietExhaust" 1 "LoudExhaust" 0 "Null";
+VAL_TABLE_ ConsAvgTrip_No_Dsply 4095 "Faulty" 4094 "No_Data_Exists";
+VAL_TABLE_ ElTrip_L_Dsply 65535 "Fault" 65534 "No_Data_Exists";
+VAL_TABLE_ ElLongTerm_L_Dsply 16777215 "Fault" 16777214 "No_Data_Exists";
+VAL_TABLE_ GearSelLck_D_Rq 3 "PreventionBlocker" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_TABLE_ BrkPadMsgTxt_D_Rq 3 "Faulty" 2 "PadsOk" 1 "ReplacePads" 0 "Null";
+VAL_TABLE_ BrkAutoHold_D_Stat 7 "Faulty" 6 "NotUsed" 5 "Releasing" 4 "HeldSecondary" 3 "HeldSecure" 2 "Held" 1 "Inactive" 0 "Off";
+VAL_TABLE_ SuspDrvMde_D_Rq 7 "Faulty" 6 "NotUsed2" 5 "NotUsed1" 4 "Drag" 3 "Track" 2 "Snow_Wet" 1 "Sport" 0 "Normal";
+VAL_TABLE_ NotPressed_PressedNotUsed 3 "NotUsed2" 2 "NotUsed1" 1 "Pressed" 0 "Not_Pressed";
+VAL_TABLE_ WhlRearDual_D_Stat 3 "NotUsed" 2 "Dual" 1 "Single" 0 "NoDataExists";
+VAL_TABLE_ TracKeyMde_D_Stat 3 "NotUsed" 2 "NotActive" 1 "Active" 0 "ModeNotDetermined";
+VAL_TABLE_ HudMde_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Manual" 3 "Drag" 2 "RoadCourse" 1 "Tach" 0 "Off";
+VAL_TABLE_ TrnManShifGear_D_IndDrv 7 "Indicate_Reverse_Gear" 6 "Indicate_Gear6" 5 "Indicate_Gear5" 4 "Indicate_Gear4" 3 "Indicate_Gear3" 2 "Indicate_Gear2" 1 "Indicate_Gear1" 0 "No_Indication";
+VAL_TABLE_ TrnStrtStop_D_Stat 3 "NotUsed_2" 2 "NotUsed_1" 1 "LowTransmissionTemperature" 0 "NoDriverIndicationRequired";
+VAL_TABLE_ LsmcBrkDecel_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Denied" 3 "FaultDegraded" 2 "FaultExt" 1 "On" 0 "Off";
+VAL_TABLE_ StePinOffst_D_Stat 3 "FineOffset" 2 "CoarseOffset" 1 "StoredOffset" 0 "OffsetNotCalculated";
+VAL_TABLE_ NoMessage_Override_Faulty 3 "NotUsed" 2 "Faulty" 1 "Override" 0 "NoMessage";
+VAL_TABLE_ TrnIpcDsplyRng2_D_Actl 15 "No_Range_Selected" 14 "Range_14" 13 "Range_13" 12 "Range_12" 11 "Range_11" 10 "Range_10" 9 "Range_9" 8 "Range_8" 7 "Range_7" 6 "Range_6" 5 "Range_5" 4 "Range_4" 3 "Range_3" 2 "Range_2" 1 "Range_1" 0 "NotUsed";
+VAL_TABLE_ OffOn_RampUpDown 3 "Ramp_Down" 2 "Ramp_Up" 1 "On" 0 "Off";
+VAL_TABLE_ DieslMsgTxt_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "ReducedEnginePower" 0 "NoMessage";
+VAL_TABLE_ NoMessage_Msg1_7 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ TrnAltShifMde_D_Rdy 3 "Faulty" 2 "NotUsed" 1 "UnavailDueToDynCond" 0 "ModeChangeAvailable";
+VAL_TABLE_ LnchCtl 3 "NotUsed2" 2 "NotUsed1" 1 "LC_On" 0 "LC_Off";
+VAL_TABLE_ BrkLineLck_D_Rq 3 "Off" 2 "Engage" 1 "Initiate" 0 "NoRequest";
+VAL_TABLE_ BrkLineLck_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "NotAvailable" 3 "Off" 2 "Engaged" 1 "Initiated" 0 "Available";
+VAL_TABLE_ LnchCtlSys_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "On_LC_Unavailable_TC_On" 3 "On_LC_Unavailable" 2 "On_LC_Available" 1 "On_LC_Active" 0 "LC_OFF";
+VAL_TABLE_ ActvFrontSteLck_D_Stat 3 "Test_passed" 2 "Test_failed" 1 "Test_cannot_run" 0 "Test_incomplete";
+VAL_TABLE_ Rght_Lefthand_Traffic 1 "Left_Hand_Traffic" 0 "Right_Hand_Traffic";
+VAL_TABLE_ NotPressed_Pressed_Faulty 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed";
+VAL_TABLE_ TrlrTrgtAcquire_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "ActivateRVCforTBA" 4 "CancelAcquisition" 3 "RetryAcquisition" 2 "AcquisitionSuccessful" 1 "StartAcquisition" 0 "Inactive";
+VAL_TABLE_ TrlrTrgtAcquire_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "RVCforTBA_Activated" 3 "Processing" 2 "TargetNotAcquired" 1 "TargetAcquired" 0 "Null";
+VAL_TABLE_ TrlrAidSetup_D_Rq 3 "ConfirmSetup" 2 "EndSetup" 1 "BeginSetup" 0 "Inactive";
+VAL_TABLE_ TrlBrkInitOut 3 "Heavy" 2 "Medium" 1 "Light" 0 "Null";
+VAL_TABLE_ IsaOffst_D_Stat 15 "Faulty" 14 "Null" 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero";
+VAL_TABLE_ IsaVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null";
+VAL_TABLE_ ApaChime_D_Rq 7 "NotUsed2" 6 "NotUsed1" 5 "Warning_Chime" 4 "Finish_Chime" 3 "Stop_Now_Chime" 2 "Spot_Ready_Chime" 1 "Spot_Found_Chime" 0 "No_Chime";
+VAL_TABLE_ SlMde_D_RqDsply 3 "NotUsed" 2 "ManualSpeed_LimiterSymbol" 1 "AutoSpeed_LimiterSymbol" 0 "NoSpeed_LimiterSymbol";
+VAL_TABLE_ SlMde_D_Rq 3 "IsaNotConfigured" 2 "Manual_Mode" 1 "Auto_Mode" 0 "Null";
+VAL_TABLE_ NotSupported_Supported 1 "Supported" 0 "NotSupported";
+VAL_TABLE_ OffOn_NotUsed_NoData 3 "No_Data_Present" 2 "NotUsed" 1 "On" 0 "Off";
+VAL_TABLE_ Faulty_FF 255 "Faulty";
+VAL_TABLE_ BrkDrvMde_D_Rq 7 "Faulty" 6 "RockCrawl" 5 "Baja" 4 "DragOrMudAndSand" 3 "Track" 2 "Snow_Wet" 1 "Sport" 0 "Normal";
+VAL_TABLE_ TrnIpcDsplyRng_D_Stat 3 "NotUsed" 2 "Flash" 1 "On" 0 "Blank_No_Display";
+VAL_TABLE_ NoYesNoDataFaulty 3 "Faulty" 2 "NoDataExists" 1 "Yes" 0 "No";
+VAL_TABLE_ SidePrkSnsR4_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_TABLE_ TsrVlPrmntMsgTxt_D_Rq 3 "NotUsed" 2 "ShowPermanentlyWithSupp" 1 "ShowPermanentlyWithoutSupp" 0 "DoNotShowSignPermanent";
+VAL_TABLE_ TsrVl1RstrcMsgTxt2_D_Rq 7 "NotUsed" 6 "Time" 5 "Trailer" 4 "Snow" 3 "RainWet" 2 "NoRecognizableRestrictn" 1 "NoSpeedLimitRestrictn" 0 "Null";
+VAL_TABLE_ PtDrvMde_D_Rq 15 "Faulty" 14 "NotUsed11" 13 "NotUsed10" 12 "NotUsed9" 11 "NotUsed8" 10 "NotUsed7" 9 "NotUsed6" 8 "NotUsed5" 7 "Drag" 6 "Rock" 5 "Baja" 4 "Sand" 3 "TowHaulGradeAssist" 2 "SnowWet" 1 "Sport" 0 "Normal";
+VAL_TABLE_ SteEffort_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "SpecialMode_2" 3 "SpecialMode_1" 2 "Comfort" 1 "Sport" 0 "Normal";
+VAL_TABLE_ TsrOvtkMsgTxt2_D_Rq 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "LimForTrucksCancelled" 9 "LimForTrucksWoQlfdRstrc" 8 "LimForTrucksWithoutRstrc" 7 "LimAllCancelled" 6 "LimAllWithRstrcTime" 5 "LimAllWithRstrcTrailer" 4 "LimAllWithRstrcSnow" 3 "LimAllWithRstrcRain" 2 "LimAllWithoutQlfdRstrc" 1 "LimAllWithoutRestriction" 0 "OvertakingAllowed";
+VAL_TABLE_ TrlrAnOffstDir 3 "NotUSed" 2 "Right" 1 "Left_or_Center" 0 "Null";
+VAL_TABLE_ Null_Off_On 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ TrlrBrkMde_D_Rq 1 "ElectricOverHydraulic" 0 "Electric";
+VAL_TABLE_ TrlrAidSetup_D_Stat 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "EnterParameters" 2 "EndSetup" 1 "BeginSetup" 0 "Null";
+VAL_TABLE_ TrlrAidMsgTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ Invalid_7F 127 "Invalid";
+VAL_TABLE_ Faulty_1FFF 8191 "Faulty";
+VAL_TABLE_ VehStab_D_Stat 15 "Faulty" 14 "No_Data_Exists" 13 "NotUsed6" 12 "NotUsed5" 11 "NotUsed4" 10 "NotUsed3" 9 "NotUsed2" 8 "NotUsed1" 7 "High_SSRA_no_OS" 6 "Straight" 5 "Post_Oversteer" 4 "Post_Transition" 3 "Countersteer" 2 "Understeer" 1 "Oversteer" 0 "Linear";
+VAL_TABLE_ NoData_Faulty_1FF_1FE 511 "Faulty" 510 "NoDataExists";
+VAL_TABLE_ TrlrAidEnbl_D_Rq 3 "NotAvailable" 2 "DeactivateTba" 1 "ActivateTba" 0 "Inactive";
+VAL_TABLE_ FohEng_D_Rq 3 "AutoEnable_ParkEnable" 2 "AutoDisable_ParkEnable" 1 "AutoEnable_ParkDisable" 0 "Disable_Stop";
+VAL_TABLE_ Null_Hi_NotUsed_Low 3 "Low" 2 "Not_Used" 1 "High" 0 "Null";
+VAL_TABLE_ Current_Color 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Null" 7 "Color7" 6 "Color6" 5 "Color5" 4 "Color4" 3 "Color3" 2 "Color2" 1 "Color1" 0 "Off";
+VAL_TABLE_ Blended_Color 15 "NotUsed10" 14 "NotUsed9" 13 "NotUsed8" 12 "NotUsed7" 11 "NotUsed6" 10 "NotUsed5" 9 "NotUsed4" 8 "NotUsed3" 7 "NotUsed2" 6 "NotUsed1" 5 "_5" 4 "_4" 3 "_3" 2 "_2" 1 "_1" 0 "Null";
+VAL_TABLE_ OffOn_Null_NotUsed 3 "NotUsed" 2 "Null" 1 "On" 0 "Off";
+VAL_TABLE_ DieslPrtc2_D_RqDsply 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_Overloaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_Overlimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_Overloaded" 0 "DPF_Normal_Operation";
+VAL_TABLE_ Null_Pers1_4_Vehicle 7 "Unused_2" 6 "Unused_1" 5 "Vehicle" 4 "PERS_4" 3 "PERS_3" 2 "PERS_2" 1 "PERS_1" 0 "Null";
+VAL_TABLE_ PrkLckCtlEnbl_D_RqIpc 3 "Rq_Towing" 2 "Rq_Enable" 1 "Rq_Disable" 0 "Null";
+VAL_TABLE_ PrkLckCtlUnlck_D_Stat 3 "Trans_And_Steer_Unlckd" 2 "Steering_Unlckd" 1 "Transmission_Unlckd" 0 "Null";
+VAL_TABLE_ VehKeyActv_D_Stat 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Key8Active" 7 "Key7Active" 6 "Key6Active" 5 "Key5Active" 4 "Key4Active" 3 "Key3Active" 2 "Key2Active" 1 "Key1Active" 0 "NoKeyActive";
+VAL_TABLE_ VehLckInd_D_Rq 3 "NotUsed" 2 "On_Day" 1 "On_Night" 0 "Off";
+VAL_TABLE_ PrkBrkDynmc_D_Allw 3 "NotUsed" 2 "EPB_ECD_NotPossible" 1 "EPB_ECD_Possible" 0 "Used_at_Start_Up";
+VAL_TABLE_ TowBarMsgTxt_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "TowBar_Ext_No_Trlr" 3 "Error_Dealer_Fix" 2 "Start_Engine_Swivel" 1 "Check_Tow_Bar" 0 "Null";
+VAL_TABLE_ PrkBrk_D_Stat 7 "Gen_Faults_or_Maint_Mode" 6 "ECD_by_Brake_ECU_Active" 5 "EPB_Limphome_Active" 4 "Rear_Caliper_Open" 3 "RWU_by_EPB_Active" 2 "Rear_Caliper_Transition" 1 "Rear_Caliper_Closed" 0 "Not_Supported";
+VAL_TABLE_ NoData_Faulty_3E_3F 63 "Faulty" 62 "NoDataExists";
+VAL_TABLE_ Unknown_Invalid_1FE_1FF 511 "Invalid" 510 "Unknown";
+VAL_TABLE_ Invalid_0x0 0 "Invalid";
+VAL_TABLE_ Unknown_Invalid_3E_3F 63 "Invalid" 62 "Unknown";
+VAL_TABLE_ Faulty_1FF 511 "Faulty";
+VAL_TABLE_ NoData_Faulty_1FFF_1FFE 8191 "Faulty" 8190 "NoDataExists";
+VAL_TABLE_ Null_Off_On_Faulty 3 "Faulty" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ EngOilSrvcMsgTxt_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "ResetComplete" 3 "ResetInProgress" 2 "ChangeOilNow" 1 "ChangeOilSoon" 0 "NoText";
+VAL_TABLE_ AirSusp_D_RqDrv 3 "NotUsed" 2 "On" 1 "Off" 0 "NoModeSelected";
+VAL_TABLE_ AwdSys_D_Stat 3 "Faulty" 2 "NotUsed" 1 "_4x4_L_H_Active" 0 "_4x4_L_H_Inactive";
+VAL_TABLE_ EmotiveType_D_Dsply 3 "EmotiveDisplay_3" 2 "EmotiveDisplay_2" 1 "EmotiveDisplay_1" 0 "Null";
+VAL_TABLE_ AutoRgen_D_Rq 3 "NotUsed" 2 "AutExhFilterCleanOFF" 1 "AutExhFilterCleanON" 0 "No_Mode_Selected";
+VAL_TABLE_ TrnSrvcRqd_B_Rq 1 "On" 0 "Off";
+VAL_TABLE_ PlgOvrrdStrt_D_Cmd 3 "NotUsed" 2 "Override_Plug_Status" 1 "Dont_Override_Plug_Status" 0 "Null_State";
+VAL_TABLE_ immoSecureIdleMode 3 "NotUsed2" 2 "NotUsed1" 1 "Active" 0 "Inactive";
+VAL_TABLE_ SteWhlOffstRq_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Allow_External_Angle_Req" 0 "Deny_External_Angle_Req";
+VAL_TABLE_ SteMdule_D_Stat 7 "NotUsed" 6 "EPAS_Failure3" 5 "EPAS_Failure2" 4 "System_Failure" 3 "EPAS_Shutdown" 2 "Normal_Op_Full_Assist" 1 "Normal_Op_Limited_Assist" 0 "EPAS_Initialization";
+VAL_TABLE_ Faulty_FFF 4095 "Faulty";
+VAL_TABLE_ Faulty_3FF 1023 "Faulty";
+VAL_TABLE_ NoData_Faulty_FE_FF 255 "Faulty" 254 "NoDataExists";
+VAL_TABLE_ ChkPlgtoStrt_D_Dsply 3 "NotUsed" 2 "Is_VehicleUnplugged_Prompt" 1 "Check_Plug_to_Start" 0 "No_Message_Display";
+VAL_TABLE_ PwrFlowTxt_D_Dsply 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "Disply_Rgen_Chrg_Txt" 10 "Disp_Fast_Charge_Txt" 9 "Disp_Fast_Charge_Cmplt_Txt" 8 "Disp_Charge_Cmplt_Txt" 7 "Disp_Remote_Start_Txt" 6 "Disp_Eng_Drv_Txt" 5 "Disp_Elec_Drv_Txt" 4 "Disp_Idle_with_Chrg_Txt" 3 "Disp_Idle_Txt" 2 "Disp_Charg_HV_Batt_Txt" 1 "Disp_Hyb_Drive_Txt" 0 "No_Text";
+VAL_TABLE_ EngOnMsg_D_Dsply 14 "_0xE_to_1F_NotUsed" 12 "Battery_Temperature" 11 "Hill_Decent_Control" 10 "Fuel_Maintenance" 9 "Oil_Maintenance" 8 "Normal_Operation" 7 "Low_Gear" 6 "Batt_Charging" 5 "Engine_Cold" 4 "Neutral_Gear" 3 "Heater_Setting" 2 "High_Speed" 1 "Acceleration" 0 "No_Display" 13 "Drive_Mode_Selection";
+VAL_TABLE_ PtDataKeyId_D_Stat 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "Tot_Veh_NUT" 9 "Cust_4_NUT" 8 "Cust_3_NUT" 7 "Cust_2_NUT" 6 "Cust_1_NUT" 5 "Tot_Veh_Stat" 4 "Cust_4_Stat" 3 "Cust_3_Stat" 2 "Cust_2_Stat" 1 "Cust_1_Stat" 0 "Null";
+VAL_TABLE_ ChrgStat_D_Dsply 7 "NotUsed" 6 "Complete" 5 "Scheduled" 4 "In_Progress" 3 "Fault_Outside_Car" 2 "Fault_Inside_Car" 1 "Fault_Unknown_Location" 0 "Not_Ready";
+VAL_TABLE_ TrnLvrV_D_Rq 3 "Full_Speed" 2 "Aggressive" 1 "Normal" 0 "Quiet";
+VAL_TABLE_ EngStrtStop_B_SrcOil 1 "Eng_start_stop_for_oilmnt" 0 "Not_Requested";
+VAL_TABLE_ FuelMaintMde_D_Rq 3 "Feature_Not_Present" 2 "Fuel_Maint_Req_Now" 1 "Fuel_Maint_Req_Soon" 0 "NoRequest";
+VAL_TABLE_ FuelMaintMde_D_Dsply 3 "Feature_Not_Present" 2 "In_Fuel_Maint_Mode" 1 "Close_to_Fuel_Maint" 0 "OK";
+VAL_TABLE_ DynoMde_B_Cmd 1 "Two_Wheel_Dyno" 0 "Normal_Operation";
+VAL_TABLE_ HvacPrecondRecirc_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "Recirc" 0 "Outside";
+VAL_TABLE_ HvacPrecondAC_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "On" 0 "Off";
+VAL_TABLE_ HybMdeStat_D_Dsply 7 "NotUsed2" 6 "EV_Charge" 5 "EV_Override" 4 "Forced_EV_Mode" 3 "Forced_Charge_Sustain_Mode" 2 "Auto_Charge_Sustain_Mode" 1 "Auto_Charge_Deplete_Mode" 0 "Null_State";
+VAL_TABLE_ PwFlowPlgBatt_D_Dsply 3 "NotUsed" 2 "Flow_from_Plug_to_Batt" 1 "Flow_from_Batt_to_Plug" 0 "No_Flow";
+VAL_TABLE_ PwFlowEngMtr_D_Dsply 3 "NotUsed" 2 "Flow_from_Eng_to_Mtr" 1 "Flow_from_Mtr_to_Eng" 0 "No_Flow";
+VAL_TABLE_ PwFlowEngFuel_D_Dsply 3 "NotUsed" 2 "Flow_from_Eng_to_Fuel" 1 "Flow_from_Fuel_to_Eng" 0 "No_Flow";
+VAL_TABLE_ PwFlowMtrDrv_D_Dsply 3 "NotUsed" 2 "Flow_from_Mtr_to_Axle" 1 "Flow_from_Axle_to_Mtr" 0 "No_FLow";
+VAL_TABLE_ PwFlowEngDrv_D_Dsply 3 "NotUsed" 2 "Flow_from_Eng_to_Axle" 1 "Flow_from_Axle_to_Eng" 0 "No_Flow";
+VAL_TABLE_ PwFlowBattMtr_D_Dsply 3 "NotUsed" 2 "Flow_from_Batt_to_Mtr" 1 "Flow_from_Mtr_to_Batt" 0 "No_Flow";
+VAL_TABLE_ Null_Override_Invalid 3 "NotUsed" 2 "Invalid" 1 "Override" 0 "Null";
+VAL_TABLE_ HybMdeMsgTxt_D_Rq 7 "NotUsed2" 6 "NotUsed1" 5 "EV_Not_Avail_Message" 4 "EV_Mode_Message" 3 "Delayed_Discharge_Message" 2 "Override_Available_Message" 1 "AutoMode_Message" 0 "Null_NoMessage_Request";
+VAL_TABLE_ HybMdeLimMsgTxt_D_Rq 3 "Limited_Req_Full_Defrost" 2 "Limited_Climate_Defrost" 1 "Limited_System_Performance" 0 "Null";
+VAL_TABLE_ CenterStackRing_D_Actl 3 "LimitedOn" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ NoData_Faulty_FFFE_FFFF 65535 "Faulty" 65534 "NoDataExists";
+VAL_TABLE_ NoData_Faulty_FFE_FFF 4095 "Faulty" 4094 "NoDataExists";
+VAL_TABLE_ NoData_Faulty_7FFE_7FFF 32767 "Faulty" 32766 "NoDataExists";
+VAL_TABLE_ NoData_Faulty_3FE_3FF 1023 "Faulty" 1022 "NoDataExists";
+VAL_TABLE_ ReFuelSysStat_D_Dsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Refuel_Err" 3 "Close_Fuel_Door" 2 "Refuel_Ready" 1 "Wait_To_Fuel" 0 "Null";
+VAL_TABLE_ OffOn_NotUsed 3 "NotUsed2" 2 "NotUsed1" 1 "On" 0 "Off";
+VAL_TABLE_ DrQltyDrv_D_StatGsm 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "ClosedDegraded" 2 "OpenDegraded" 1 "ClosedOkay" 0 "OpenOkay";
+VAL_TABLE_ ChrgrInPwType_D_Actl 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "DC_Fast_Charging" 2 "AC_Level2_240v" 1 "AC_Level1_120v" 0 "EVSE_Not_Detected";
+VAL_TABLE_ ChrgCrdLck_D_Falt 3 "NotUsed" 2 "HardwareFault" 1 "CsiFault" 0 "NoFault";
+VAL_TABLE_ ChrgStat_D2_Dsply 15 "NotUsed_2" 14 "NotUsed_1" 13 "ChargeTargetReached" 12 "DriveConditioning" 11 "CabinPreconditioning" 10 "ChargingSystemMaintain" 9 "ChargingInductive" 8 "ChargingDCFastChange" 7 "ChargingAC" 6 "ChargeScheduled" 5 "EvsePaused" 4 "EvseNotDetected" 3 "EvseNotCompatible" 2 "FaultOutsideCar" 1 "FaultInsideCar" 0 "NotReady";
+VAL_TABLE_ EngMdeMsgTxt_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Charge" 3 "GlowingCharge" 2 "Hybrid" 1 "Ev" 0 "NoMessage";
+VAL_TABLE_ BattRgenLoStat_D_Qlty 3 "OK" 2 "Not_Within_Spec" 1 "Eval_In_Progress" 0 "Faulty";
+VAL_TABLE_ OpenClosedRetainDisable 3 "Disable" 2 "Retain" 1 "Closed" 0 "Open";
+VAL_TABLE_ OpenClosedStuckOpenClosed 3 "StuckClosed" 2 "StuckOpen" 1 "Closed" 0 "Open";
+VAL_TABLE_ NoData_Faulty_7FE_7FF 2047 "Faulty" 2046 "NoDataExists";
+VAL_TABLE_ DrTgateChime2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Long_Repeated" 3 "Fast" 2 "Short" 1 "Long" 0 "Off";
+VAL_TABLE_ EngIdlShutDwnTxt_D_Rq 3 "NotUsed" 2 "EngineShutdownOnPrevDrive" 1 "FeatureDisabledDueToFault" 0 "NoMessage";
+VAL_TABLE_ DrvPerfMde 3 "Sport" 2 "Normal" 1 "NotUsed" 0 "NoModeSelected";
+VAL_TABLE_ NoData_Fault_1FF_1FE 511 "Fault" 510 "NoDataExists";
+VAL_TABLE_ NoData_Fault_FFE_FFF 4095 "Fault" 4094 "NoDataExists";
+VAL_TABLE_ WeekdayEndHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24";
+VAL_TABLE_ WeekdayEndMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd";
+VAL_TABLE_ WeekdayStartHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24";
+VAL_TABLE_ WeekdayStartMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd";
+VAL_TABLE_ EngIdlShutDown_D_Stat 3 "Not_used" 2 "Engine_Shutdown" 1 "Initiated_Countdown" 0 "Normal_Operation";
+VAL_TABLE_ StopStrtDrvMde_D_Indic 3 "NotUsed" 2 "StartStop_IndirectDeselect" 1 "StopStart_Deselected" 0 "StopStart_Selected";
+VAL_TABLE_ StopStrtDrvMde_D_RqMnu 3 "NotUsed2" 2 "NotUsed1" 1 "StopStart_Deselected" 0 "StopStart_Selected";
+VAL_TABLE_ StopStrtStdby_D_Indic 6 "NotUsed2" 5 "Telltale_Struck_Out" 4 "Telltale_Flashing_Amber" 3 "Telltale_On_Amber" 2 "Telltale_Flashing_Green" 1 "Telltale_On_Green" 0 "Telltale_Off" 7 "NotUsed3";
+VAL_TABLE_ Quality_Faulty 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty";
+VAL_TABLE_ TrnDtpCmd_D_Actl 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "Relatch" 3 "Deploy" 2 "Self_Test" 1 "No_Command" 0 "NotUsed1";
+VAL_TABLE_ TrnGsmNtmState_D_Actl 3 "Faulty" 2 "Neutral_Tow_Mode" 1 "Car_Wash_Mode" 0 "None";
+VAL_TABLE_ TrnTrcmPwmSig_D_Actl 15 "Faulty" 14 "NoDataExists" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Default_To_Park" 7 "Neutral_Tow" 6 "Car_Wash_Mode" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "No_Gear";
+VAL_TABLE_ RgenBrkDynoMde_B_Actl 1 "TwoWheelDyno" 0 "NormalOperation";
+VAL_TABLE_ Fault_3FFF 16383 "Fault";
+VAL_TABLE_ CtaInnr_D_Stat 3 "Reporting" 2 "Not_Reporting" 1 "System_Standby" 0 "Initialization";
+VAL_TABLE_ PrkBrkActv_D_RqTrnGear 3 "NotUsed2" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "NotUsed1";
+VAL_TABLE_ NoRequest_Request 1 "Request" 0 "NoRequest";
+VAL_TABLE_ Fault_FFF_NoData 4094 "NoDataExists" 4095 "Fault";
+VAL_TABLE_ Fault_3FF_NoData 1022 "NoDataExists" 1023 "Fault";
+VAL_TABLE_ Foh_D_Stat 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "Stopping" 3 "Running" 2 "Starting" 1 "Prestart" 0 "Off";
+VAL_TABLE_ OffOnNoDataUnused 3 "Unused" 2 "NoDataExists" 1 "On" 0 "Off";
+VAL_TABLE_ FohFalt_D_Stat 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "FuelTypeDoesNotMatchFOH" 10 "Lifecycle_ModeNotSet" 9 "AuxElectricCoolantPumpInop" 8 "TimeDelayAvoidExcessCycl" 7 "Fuel_Level_OutofRange" 6 "External_Fault" 5 "Internal_Fault" 4 "Voltage_limitation" 3 "Impact_Event" 2 "CoolantTemp_OutofRange" 1 "AmbientTemp_OutofRange" 0 "No_Disable";
+VAL_TABLE_ FohRqRun_B_Rq 1 "SubmitRequest_toRun" 0 "DoesNotSubmitRequest_toRun";
+VAL_TABLE_ OKLowVeryLow 3 "NotUsed" 2 "VeryLow" 1 "Low" 0 "OK";
+VAL_TABLE_ Fault_1FF 511 "Fault";
+VAL_TABLE_ SteWhlHeat 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Reserved_3" 8 "Reserved_2" 7 "Reserved_1" 6 "Level_3_Heating" 5 "Level_3_Heating_LS" 4 "Level_2_Heating" 3 "Level_2_Heating_LS" 2 "Level_1_Heating" 1 "Level_1_Heating_LS" 0 "Off";
+VAL_TABLE_ OffOnUnusedFault 3 "Fault" 2 "Unused" 1 "On" 0 "Off";
+VAL_TABLE_ NullKphMph 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null";
+VAL_TABLE_ TsrVLim1MsgTxt_D_Rq 255 "NoLimit" 254 "NotUsed2" 253 "NotUsed1" 252 "NotToBeDisplayed" 251 "LimitCancelled" 31 "1F_FA_Message31_250" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "Null";
+VAL_TABLE_ TsrVl1RstrcMsgTxt_D_Rq 3 "NotUsed" 2 "NoRecognizableRestriction" 1 "NoSpeedLimitRestriction" 0 "Null";
+VAL_TABLE_ TsrMsgTxt_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "RecgnzdSignNotUsblForDsply" 8 "LimitedSystemPerformance" 7 "OffRoad" 6 "RegionNotSupported" 5 "CountryNotSupported" 4 "WrngNavDatIncompDatCarrier" 3 "NoNavDataAvailable" 2 "NoNavAvailableSwitchedOff" 1 "NoInformationAllOK" 0 "Null";
+VAL_TABLE_ TsrOvtkTypeMsgTxt_D_Rq 3 "NotUsed" 2 "Explicit" 1 "Implicit" 0 "Null";
+VAL_TABLE_ TsrOvtkStatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null";
+VAL_TABLE_ TsrOvtkMsgTxt_D_Rq 7 "LimForTrucksCancelled" 6 "LimForTrucksWoQlfdRstrc" 5 "LimForTrucksWithoutRstrc" 4 "LimAllCancelled" 3 "LimAllWithoutQlfdRstrc" 2 "LimAllWithoutRestriction" 1 "OvertakingAllowed" 0 "Null";
+VAL_TABLE_ Null_False_True 3 "NotUsed" 2 "True" 1 "False" 0 "Null";
+VAL_TABLE_ TsrStatMsgTxt_D_Rq 7 "NotUsed" 6 "NoDataExists" 5 "TSR_Error" 4 "Available_NavigationOnly" 3 "Available_CameraOnly" 2 "Available_FusionMode" 1 "TSR_Off" 0 "Null";
+VAL_TABLE_ NoMessage_DisplayMessage 1 "DisplayMessage" 0 "NoMessage";
+VAL_TABLE_ FdsmTrgRight 1 "Object_in_Right_Lobe" 0 "No_Object";
+VAL_TABLE_ FdsmTrgCntr 1 "Object_in_Center_Lobe" 0 "No_Object";
+VAL_TABLE_ FdsmTrgLeft 1 "Object_in_Left_Lobe" 0 "No_Object";
+VAL_TABLE_ EngineBrakeOff_Active 1 "Engine_Braking_Activated" 0 "Engine_Braking_Off";
+VAL_TABLE_ NoEngineBrake_Brake 1 "Engine_Braking" 0 "No_Engine_Braking";
+VAL_TABLE_ PlgActv_D_ActlChrgr 3 "Faulty" 2 "Not used_2" 1 "On_Plug__Connected_" 0 "Off_Plug__Disconnected_";
+VAL_TABLE_ EngSrvcRqd_B_Rq 1 "Engine_Service_Required" 0 "No_engine_service_required";
+VAL_TABLE_ WeekendEndHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24";
+VAL_TABLE_ WeekendEndMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd";
+VAL_TABLE_ WeekendStartHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24";
+VAL_TABLE_ WeekendStartMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd";
+VAL_TABLE_ LscmbbBaSens_D_Rq 3 "Level3_EBA" 2 "Level2_EBA" 1 "Level1_EBA" 0 "Norman_EBA";
+VAL_TABLE_ Allowed_Denied 1 "Denied" 0 "Allowed";
+VAL_TABLE_ LscmbbBrkPrchg_D_Rq 3 "NotUsed" 2 "Level2_PreCharge" 1 "Level1_PreCharge" 0 "No_Precharge";
+VAL_TABLE_ LscmbbBrkDecel_B_Enabl 1 "ConductLSCMbBDecelReq" 0 "DoNotConductLSCMbBDecelReq";
+VAL_TABLE_ PrkAidMsgTxt_D_Rq 15 "All_Sns_Blk" 14 "R_Sns_ON_F_Sns_Blk" 13 "R_Sns_Blk_F_Sns_ON" 12 "R_Sns_Inactive_Trlr_atch" 11 "Not_Avail_Trlr_attchd" 10 "Fail_Mode_no_Chime" 9 "Fail_Mode_with_Chime" 8 "R_Sns_Trlr_F_Sns_Blk" 7 "NotUsed3" 6 "Park_Sys_Alternate_Mode" 5 "R_Snsrs_On_F_Snsrs_On" 4 "NotUsed2" 3 "Reset_Message_Warn" 2 "R_Snsrs_Off_F_Snsrs_On" 1 "R_Snsrs_On_F_Snsrs_Off" 0 "All_Park_Sensors_Off";
+VAL_TABLE_ PrkAidSns_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_TABLE_ PrkAid_D_Falt 7 "NotUsed2" 6 "NotUsed1" 5 "Failure_Front_PSM_Sensors" 4 "No_Data_Exists" 3 "Failure_Rear_Sensors" 2 "Speaker_Fault" 1 "ECU_Fault" 0 "No_Fault";
+VAL_TABLE_ OffOnNoDataFault 3 "Fault" 2 "No_Data_Exists" 1 "On" 0 "Off";
+VAL_TABLE_ ApaActvSd_D_Actl 3 "Dirver_Side" 2 "Passenger_Side" 1 "No_Side" 0 "Null";
+VAL_TABLE_ ApaMdeStat_D_RqDrv 7 "Faulty" 6 "Off" 5 "NotUsed2" 4 "NotUsed1" 3 "POA" 2 "PPA" 1 "SAPP" 0 "Inactive";
+VAL_TABLE_ ApaMde_D_Avail 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "PPA_POA" 7 "SAPP_POA" 6 "POA" 5 "PPA" 4 "SAPP" 3 "SAPP_PPA_POA" 2 "SAPP_PPA" 1 "None" 0 "Null";
+VAL_TABLE_ ApaMde_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "POA" 3 "PPA" 2 "SAPP" 1 "Off" 0 "Null";
+VAL_TABLE_ FrostWarn_D_Stat 3 "NotUsed" 2 "On_Amber" 1 "On_Red" 0 "Off";
+VAL_TABLE_ SteWhlLckMsgTxt_D_Rq 3 "NotUsed" 2 "Message_2" 1 "Message_1" 0 "No_Message";
+VAL_TABLE_ GearRvrse_D_Actl 7 "Fault" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Active_confirmed" 2 "Active_not_confirmed" 1 "Inactive_confirmed" 0 "Inactive_not_confirmed";
+VAL_TABLE_ SideDetect_SnStat_Invalid 3 "Invalid" 2 "System_Failure" 1 "Blocked" 0 "Clear";
+VAL_TABLE_ SideDetect_OpStat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off";
+VAL_TABLE_ SideDetect_Present 4 "Sensor_Blocked" 3 "Sensor_Fault" 2 "Flash_On" 1 "Alert_On" 0 "AlertOff_FlashOff_SensrClr";
+VAL_TABLE_ Off_On_Flash_BulbProveout 3 "Bulb_Proveout" 2 "Flash" 1 "On" 0 "Off";
+VAL_TABLE_ SideDetect_BLIS_Off_On 2 "BLIS_On_Second_Warning_ON" 1 "BLIS_On_Second_Warning_OFF" 0 "Off";
+VAL_TABLE_ SideDetect_report 3 "Reporting" 2 "Not_Reporting" 1 "System_Standby" 0 "Initialization";
+VAL_TABLE_ DrTGate_D_Rq 3 "NotUsed" 2 "Closing" 1 "Opening" 0 "Not_Moving";
+VAL_TABLE_ WndwSide_D_Stat 3 "BothWindow_Operating" 2 "RearWindow_Operating" 1 "FrontWindow_Operating" 0 "NoWindows_Operating";
+VAL_TABLE_ DcacElPw_D_Rq 3 "NotUsed" 2 "AC_HighPower_Requested" 1 "AC_LowPower_Requested" 0 "AC_Power_NotRequested";
+VAL_TABLE_ False_True 1 "True" 0 "False";
+VAL_TABLE_ Null_Reset 1 "Reset" 0 "Null";
+VAL_TABLE_ HvacBlwrFront_D_Stat 31 "Not_Used" 20 "Full_On" 19 "95_Percent" 18 "90_Percent" 17 "85_Percent" 16 "80_Percent" 15 "75_Percent" 14 "70_Percent" 13 "65_Percent" 12 "60_Percent" 11 "55_Percent" 10 "50_Percent" 9 "45_Percent" 8 "40_Percent" 7 "35_Percent" 6 "30_Percent" 5 "25_Percent" 4 "20_Percent" 3 "15_Percent" 2 "10_Percent" 1 "5_Percent" 0 "Off";
+VAL_TABLE_ immoMsgTxt_D_Rq 15 "Immo_Msg_15" 14 "Immo_Msg_14" 13 "Immo_Msg_13" 12 "Immo_Msg_12" 11 "Immo_Msg_11" 10 "Immo_Msg_10" 9 "Immo_Msg_9" 8 "Immo_Msg_8" 7 "Immo_Msg_7" 6 "Immo_Msg_6" 5 "Immo_Msg_5" 4 "Immo_Msg_4" 3 "Immo_Msg_3" 2 "Immo_Msg_2" 1 "Immo_Msg_1" 0 "Immo_Msg_0_Null";
+VAL_TABLE_ BattTracWarnLamp_B_Rq 1 "On" 0 "Off";
+VAL_TABLE_ BattTracSrvcRqd_B_Rq 1 "On" 0 "Off";
+VAL_TABLE_ HtrnWarnLamp_B_Dsply 1 "On" 0 "Off";
+VAL_TABLE_ HtrnSrvcRqd_B_Dsply 1 "On" 0 "Off";
+VAL_TABLE_ NoData_Faulty_7E_7F 127 "Faulty" 126 "NoDataExists";
+VAL_TABLE_ PreCondACSet_D_Actl 3 "Last_User_Setting" 2 "Auto" 1 "On" 0 "Off";
+VAL_TABLE_ PreCondFanSet_D_Actl 15 "Not_used" 14 "Not_used" 13 "Not_used" 12 "Not_used" 11 "Not_used" 10 "Not_used" 9 "Last_user_setting" 8 "Auto" 7 "Speed_7" 6 "Speed_6" 5 "Speed_5" 4 "Speed_4" 3 "Speed_3" 2 "Speed_2" 1 "Speed_1" 0 "OFF";
+VAL_TABLE_ PreCondID_No_Actl 0 "Invalid";
+VAL_TABLE_ PreCondRecrcSet_D_Actl 3 "Last_User_Setting" 2 "Auto" 1 "Recirc" 0 "Outside/Fresh";
+VAL_TABLE_ PreCondTeSet_Te_Actl 31 "HI" 1 "LO" 0 "Last_driver_setting";
+VAL_TABLE_ PreCondTPRDef_D_Actl 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ PreCondModeSet_D_Actl 15 "Not_used" 14 "Not_used" 13 "Not_used" 12 "Not_used" 11 "LastUserSetting" 10 "Auto" 9 "Max_Defrost" 8 "Windshield_Panel_Floor" 7 "Windshield_Panel" 6 "Windshield_(Defrost)" 5 "Windshield_Floor" 4 "Floor" 3 "Panel_Floor" 2 "Panel_(Vent)" 1 "Max_A/C" 0 "Off";
+VAL_TABLE_ ChargePortPwr_St 2 "LowPower" 1 "HighPower" 0 "Null";
+VAL_TABLE_ ChargeProfIDPref_St 3 "NotUsed" 2 "Value" 1 "ChargeNow" 0 "Null";
+VAL_TABLE_ ChrgGlobSched_D_Actl 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ ChrgLocEndHr_No_Actl 31 "Invalid" 30 "Unknown";
+VAL_TABLE_ ChrgLocEndMin_No_Actl 63 "Invalid" 62 "Unknown";
+VAL_TABLE_ ChrgLocProgram_D_Actl 7 "Not_used" 6 "Not_used" 5 "Not_used" 4 "Manual" 3 "TimeofUse" 2 "SmMet" 1 "ChargeImm" 0 "Null";
+VAL_TABLE_ ChrgLocSchedCat_D_Actl 11 "Reserved" 10 "Window_10" 9 "Window_9" 8 "Window_8" 7 "Window_7" 6 "Window_6" 5 "Window_5" 4 "Window_4" 3 "Window_3" 2 "Window_2" 1 "Window_1" 0 "Null";
+VAL_TABLE_ ChrgLocHsphs_D_Actl 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "SouthEast_Lat-_Long+" 3 "SouthWest_Lat-_Long-" 2 "NorthEast_Lat+_Long+" 1 "NorthWest_Lat+_Long-" 0 "NoDataExists";
+VAL_TABLE_ FuelPumpPwr_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Power_Off_Default" 3 "Power_Off_Command" 2 "Power_Off_Service" 1 "Power_Off_Impact" 0 "Power_On";
+VAL_TABLE_ ChrgrRdyStat_D_Actl 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Charging" 2 "ChargerFault" 1 "ChargerReady" 0 "NotReady";
+VAL_TABLE_ PrmtrAlrmEvnt_D_Stat 15 "Diag_Tamper" 14 "Trailer" 13 "Shock_Sensor" 12 "Post_Crash" 11 "Panic" 10 "Intrusion" 9 "Inclination" 8 "Ign_Tamper" 7 "LG_Door" 6 "Decklid" 5 "Hood" 4 "PR_Door" 3 "PF_Door" 2 "DR_Door" 1 "DF_Door" 0 "Null";
+VAL_TABLE_ SecurityMsgTxt_D_Rq 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ BattChrgRdyStat_D_Actl 7 "NotUsed2" 6 "NotUsed1" 5 "Faulted" 4 "ChargeComplete" 3 "Charging" 2 "BatteryChargeReady" 1 "ChargeWait" 0 "NotReady";
+VAL_TABLE_ BattChrgInhbt_D_Rq 3 "MaintainTargetSoc" 2 "NotUsed" 1 "InhibitChargingThermal" 0 "Enable_Charging";
+VAL_TABLE_ Fault_7FF_NoData 2047 "Fault" 2046 "NoDataExists";
+VAL_TABLE_ Deactivate_Activate 1 "Activate" 0 "Deactivate";
+VAL_TABLE_ PtcHtr_D_Stat 3 "Faulty" 2 "NotUsed" 1 "On" 0 "Off";
+VAL_TABLE_ PtcHtr_D_Cmd 3 "TurnOn" 2 "AutoMode" 1 "TurnOff" 0 "NoDecision_Initializing";
+VAL_TABLE_ Fault_FFFFFF 16777215 "Fault";
+VAL_TABLE_ NoData_Fault_FFFE_FFFF 65535 "Fault" 65534 "NoDataExists";
+VAL_TABLE_ EngOffTe_B_Dsply 1 "Eng_warm_engh_for_pd" 0 "Eng_not_warm_engh_for_pd";
+VAL_TABLE_ Fault_FFFF_NoData_FFFE 65535 "Fault" 65534 "NoDataExists";
+VAL_TABLE_ Fault_1FFF 8191 "Fault";
+VAL_TABLE_ TrlrBattChrg_D_Stat 3 "Reverse" 2 "Normal" 1 "Low" 0 "Null";
+VAL_TABLE_ TrlrLampCtl_D_Stat 3 "NotUsed" 2 "TrlrLampCnnctDrvFailure" 1 "TrlrLampNotCnnctDrvFailure" 0 "Null";
+VAL_TABLE_ ElPw_D_StatStrtStop 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Supported_Level_4" 8 "Supported_Level_3" 7 "Supported_Level_2" 6 "Supported_Level_1" 5 "Limited_Support" 4 "Fault_Limited" 3 "LV_Event_in_Progress" 2 "Not_Supported_Imminent" 1 "Supported_All" 0 "Not_Supported";
+VAL_TABLE_ ImpactEvntFdbck_D_Stat 3 "NotUsed" 2 "EventComplete" 1 "EventInProgress" 0 "Normal";
+VAL_TABLE_ StopStrtIODTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_TABLE_ NoData_Fault_7FFE_7FFF 32767 "Fault" 32766 "NoDataExists";
+VAL_TABLE_ NoData_Fault_3E_3F 63 "Fault" 62 "NoDataExists";
+VAL_TABLE_ DrvSte_D_Stat 15 "NotUsed10" 14 "NotUsed9" 13 "NotUsed8" 12 "NotUsed7" 11 "NotUsed6" 10 "NotUsed5" 9 "NotUsed4" 8 "NotUsed3" 7 "NotUsed2" 6 "NotUsed1" 5 "Request_Active" 4 "Ignition_Off" 3 "DSR_in_Normal_Idle_Mode" 2 "EPAS_Comm_Disturbed" 1 "DSR_Request_Not_Applicable" 0 "DSR_Deactivated";
+VAL_TABLE_ StrtrMtrCtlMsgTxt_D_Rq 7 "Start_In_Gear_Allowed" 6 "Pending_Start_Cancelled" 5 "Start_Pending_Please_Wait" 4 "Cranking_Limit_Exceeded" 3 "Press_Brk_and_Shift_to_P_N" 2 "Press_Clutch_and_Brake" 1 "Press_Clutch_To_Start" 0 "No_Display";
+VAL_TABLE_ Null_Open 1 "Open" 0 "Null";
+VAL_TABLE_ Invalid_OffOn 0 "Invalid" 1 "Off" 2 "On";
+VAL_TABLE_ TempDegreesC_DegreesF 0 "Temperature_deg_c" 1 "Temperature_deg_f";
+VAL_TABLE_ BeltminderAudioMute 2 "On" 1 "Off" 0 "Invalid";
+VAL_TABLE_ Chime_Source 2 "Cluster" 1 "Infotainment_Sys" 0 "Invalid";
+VAL_TABLE_ Invalid_DayNight 2 "Night" 1 "Day" 0 "Invalid";
+VAL_TABLE_ Invalid_12h_24h 2 "24h_mode" 1 "12h_mode" 0 "Invalid";
+VAL_TABLE_ Invalid_Theme1_2 2 "Theme_2" 1 "Theme_1" 0 "Invalid";
+VAL_TABLE_ LanguageSelect_St 30 "Slovak" 29 "Arabic" 28 "Cantonese" 27 "Mandarin_Chinese" 26 "Korean" 25 "Japanese_Kanji" 24 "Japanese_Katakana" 23 "Braz_Portuguese" 22 "EU_Portuguese" 21 "Finish" 20 "Norwegian" 19 "Danish" 18 "Swedish" 17 "Hungarian" 16 "Greek" 15 "Czech" 14 "Polish" 13 "Flemish" 12 "Dutch" 11 "Russian" 10 "Turkish" 9 "Mex_Spanish" 8 "EU_Spanish" 7 "Cana_French" 6 "EU_French" 5 "Italian" 4 "German" 3 "NA_English" 2 "UK_English" 1 "Unknown" 0 "Invalid";
+VAL_TABLE_ Blower_Indicate 15 "Display_Blank" 14 "14_Indicators_On" 13 "13_Indicators_On" 12 "12_Indicators_On" 11 "11_Indicators_On" 10 "10_Indicators_On" 9 "9_Indicators_On" 8 "8_Indicators_On" 7 "7_Indicators_On" 6 "6_Indicators_On" 5 "5_Indicators_On" 4 "4_Indicators_On" 3 "3_Indicators_On" 2 "2_Indicators_On" 1 "1_Indicator_On" 0 "Indicators_Off";
+VAL_TABLE_ CC_Fr_Stat_User_Adj 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "Fr_Blwr_Spd_Selection" 2 "FRHS_SetPt_Selection" 1 "FLHS_SetPt_Selection" 0 "None";
+VAL_TABLE_ HeadLghtHiFdbck_D_Stat 3 "NotUsed" 2 "Cancel" 1 "Hold" 0 "Allow_Change";
+VAL_TABLE_ Backlit_LED_Status 15 "Unused3" 14 "Unused2" 13 "Unused1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off";
+VAL_TABLE_ Veh_Lock_Status 3 "UNLOCK_DRV" 2 "UNLOCK_ALL" 1 "LOCK_ALL" 0 "LOCK_DBL";
+VAL_TABLE_ PrkLckCtlMsgTxt_D_Rq 3 "BTSI_DI_3" 2 "BTSI_DI_2" 1 "BTSI_DI_1" 0 "Null_BTSI_DI";
+VAL_TABLE_ NoShift_Shift 1 "Shift" 0 "NoShift";
+VAL_TABLE_ CcdMsgTxt_D_RqDsply 15 "Unused8" 14 "Unused7" 13 "Unused6" 12 "Unused5" 11 "Unused4" 10 "Unused3" 9 "Unused2" 8 "StationaryMode" 7 "Mode_Change_Unavailable" 6 "CCD_Temporarily_Off" 5 "CCD_Service_Required" 4 "Faulty" 3 "Sport" 2 "Normal" 1 "Comfort" 0 "No_Mode_Selected";
+VAL_TABLE_ CrashEvnt_D_Stat 3 "Invalid" 2 "Fuel_Cutoff_Event" 1 "Deploy_Event" 0 "No_Event";
+VAL_TABLE_ ReducedGuard_D_Stat 3 "NotUsed" 2 "Alarm_On" 1 "Alarm_Off_Previously_On" 0 "Alarm_Off";
+VAL_TABLE_ HvacPrecondBlwr_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Last_User_Setting" 8 "Auto" 7 "Speed7" 6 "Speed6" 5 "Speed5" 4 "Speed4" 3 "Speed3" 2 "Speed2" 1 "Speed1" 0 "Off";
+VAL_TABLE_ HvacPrecondMode_D_Rq 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "Last_User_Settings" 10 "Auto" 9 "Max_Defrost" 8 "Windshield_Panel_Floor" 7 "Windshield_Panel" 6 "Windshield" 5 "Windshield_Floor" 4 "Floor" 3 "Panel_Floor" 2 "Panel" 1 "MAX_AC" 0 "Off";
+VAL_TABLE_ ButtonNotPressed 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_TABLE_ Null_Pressed 1 "Pressed" 0 "Null";
+VAL_TABLE_ FobComm_D_Stat 3 "NotUsed" 2 "RemEngStartOK" 1 "RemEngStartFail" 0 "Null";
+VAL_TABLE_ PudLamp_D_Rq 3 "RAMP_DOWN" 2 "RAMP_UP" 1 "ON" 0 "OFF";
+VAL_TABLE_ WndwGlbl_D_Cmd 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "GLEARN" 3 "GCLOSE" 2 "GOPEN" 1 "GSTOP" 0 "Null";
+VAL_TABLE_ LockMsg 7 "MSG7" 6 "MSG6" 5 "MSG5" 4 "MSG4" 3 "MSG3" 2 "MSG2" 1 "MSG1" 0 "NO_WARNING";
+VAL_TABLE_ ChildLockDisplay 3 "NOT_SUPPORTED" 2 "ERROR" 1 "CHILD_UNLOCK" 0 "CHILD_LOCK";
+VAL_TABLE_ Null_Lock_Unlock 3 "NotUsed" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_TABLE_ Wiper 15 "NO_DATA_EXISTS" 14 "STALLED" 13 "RESERVED" 12 "AUTO_ADJUST" 11 "COURTESYWIPE" 10 "AUTO_HIGH" 9 "AUTO_LOW" 8 "WASH" 7 "MIST_FLICK" 6 "MAN_HIGH" 5 "MAN_LOW" 4 "MAN_INT_ON" 3 "MAN_INT_OFF" 2 "OFF_MOVING" 1 "AUTO_OFF" 0 "OFF";
+VAL_TABLE_ Turn_switch 3 "Unused_Treat_As_Off" 2 "Right" 1 "Left" 0 "Off";
+VAL_TABLE_ PrkLght_D_Stat 3 "Park_Both" 2 "Park_Right" 1 "Park_Left" 0 "Off";
+VAL_TABLE_ LghtAmb_D_Sns 7 "No_Data_Exists" 6 "Unused2" 5 "Unused1" 4 "Tunnel_Off" 3 "Tunnel_On" 2 "Twilight" 1 "Light" 0 "Dark";
+VAL_TABLE_ HeadLghtSwtch_D_Stat 3 "Autolamp" 2 "Headlamp" 1 "Parklamp" 0 "Off";
+VAL_TABLE_ EmgcyBrkLamp_D_Rq 3 "NotUsed" 2 "Active_at_standstill" 1 "Active_at_speed" 0 "Inactive";
+VAL_TABLE_ GearLvrPos_D_Unfilt 7 "Invalid" 6 "NotUsed" 5 "In_between" 4 "Low" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_TABLE_ EDrvTqMntrRconfg_D_Cmd 7 "OK" 6 "Disable_Cruise" 5 "NotUsed4" 4 "Supercreep" 3 "NotUsed3" 2 "NotUsed2" 1 "Engine_shutdown" 0 "NotUsed";
+VAL_TABLE_ OpenPressedFault 3 "Fault" 2 "Unused" 1 "Pressed" 0 "Open";
+VAL_TABLE_ LaHandsOff_D_Dsply 3 "Suppressed" 2 "Level2" 1 "Level1" 0 "HandsOn";
+VAL_TABLE_ Avail_Unavail 1 "Unavailable" 0 "Available";
+VAL_TABLE_ LaActvStats_D_Dsply 31 "Unused7" 30 "LA_Off" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 24 "InerveneLeft_InterveneRght" 23 "WarnLeft_InterveneRight" 22 "SuppressLeft_InterveneRght" 21 "AvailLeft_InterveneRhtt" 20 "NoLeft_InterveneRight" 19 "InterveneLeft_WarnRight" 18 "WarnLeft_WarnRight" 17 "SuppressLeft_WarnRight" 16 "AvailableLeft_WarnRight" 15 "NoLeft_WarnRight" 14 "InterveneLeft_SuppressRght" 13 "WarnLeft_SuppressRight" 12 "SuppressLeft_SuppressRight" 11 "AvailLeft_SuppressRight" 10 "NoLeft_SuppressRight" 9 "InterveneLeft_AvailRight" 8 "WarnLeft_AvailRight" 7 "SuppressLeft_AvailRight" 6 "AvailableLeft_AvailRight" 5 "NoLeft_AvailableRight" 4 "InterveneLeft_NoRight" 3 "WarnLeft_NoRight" 2 "SuppressLeft_NoRight" 1 "AvailableLeft_NoRight" 0 "NoLeft_NoRight";
+VAL_TABLE_ AhbcHiBeam_D_Rq 3 "Deactivated_Unavailabl" 2 "Unused" 1 "Main_HighBeamRecommend" 0 "Dipped_LowBeamRecommend";
+VAL_TABLE_ GrllShtrPos_D_Cmd 15 "Fully_Open" 14 "Position14" 13 "Position13" 12 "Position12" 11 "Position11" 10 "Position10" 9 "Position9" 8 "Position8" 7 "Position7" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Fully_Closed";
+VAL_TABLE_ LifeCycMde_D_Actl 3 "Transport" 2 "NotUsed" 1 "Factory" 0 "Normal";
+VAL_TABLE_ TrnMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage";
+VAL_TABLE_ DieslPrtcRgen_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Full_Regen_2" 4 "Full_Regen_1" 3 "HeatUp_3" 2 "HeatUp_2" 1 "HeatUp_1" 0 "Normal_Mode_NoRegen";
+VAL_TABLE_ ClimtHeat_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "PtcHtrTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownHeatingReq" 1 "OpportunisticHeatingReq" 0 "NoHeatingRequest";
+VAL_TABLE_ TrnCapHlth_Actl 3 "Capacitor_OK" 2 "Degraded_Capacitor" 1 "Capacitor_State_Unknown" 0 "Capacitor_Fault";
+VAL_TABLE_ TrnSecPrkStat_D_Actl 7 "Faulty" 6 "Fault_Released" 5 "Fault_Latched" 4 "Recouple_in_Progress" 3 "Mechanism_Released" 2 "RTP_in_Progress" 1 "Pending" 0 "Latched";
+VAL_TABLE_ TrnGear_D_Actl 7 "Fault" 6 "NotUsed" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "Transition_State";
+VAL_TABLE_ TrnNtrlTowCmd_D_Actl 3 "NotUsed" 2 "Neutral_Tow_Entry" 1 "Car_Wash_Mode" 0 "Normal_Mode";
+VAL_TABLE_ TrnValidGear_D_Cnfm 3 "Accept" 2 "Reject" 1 "Internal_Request" 0 "No_Command";
+VAL_TABLE_ TrnGear_D_RqPt 7 "Fault" 6 "NotUsed" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "No_Gear";
+VAL_TABLE_ TrnValidGearRq_D_Stat 3 "Valid_Request" 2 "Valid_Degraded_Request" 1 "Invalid_Request" 0 "No_Request";
+VAL_TABLE_ NoData_Fault_3FE_3FF 1023 "Fault" 1022 "NoDataExists";
+VAL_TABLE_ ClimtCool_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "ElACTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownCoolReq" 1 "OpportunisticCoolingReq" 0 "NoCoolingRequest";
+VAL_TABLE_ HtrnHvilOpen_B_Actl 1 "HVIL_is_Open" 0 "Normal_Operation";
+VAL_TABLE_ EngTeHi_B_Actl 1 "EngineTempHigh" 0 "Normal";
+VAL_TABLE_ Eng_D_StatPwPck 7 "NotUsed3" 6 "NotUsed2" 5 "Engine_Start_Cold_Cat" 4 "Engine_Disabled" 3 "Engine_Running" 2 "Engine_Run_CSER" 1 "Engine_Start" 0 "Off";
+VAL_TABLE_ EngFuelCutFull_B_Inhbt 1 "Inhibit_DFSO" 0 "Normal";
+VAL_TABLE_ EngFuelCutFull_B_Rq 1 "FuelCutRequest" 0 "NormalOperation";
+VAL_TABLE_ Fault_7FF 2047 "Fault";
+VAL_TABLE_ EngStopFst_B_Rq 1 "FastEngineShutdown" 0 "NormalOperation";
+VAL_TABLE_ EngStrtCold_B_Rq 1 "ExtremeColdStart" 0 "NormalStart";
+VAL_TABLE_ EngStrtSmooth_D_Rq 7 "NotUsed" 6 "Smooth_NoPedal" 5 "Smooth_LightPedal" 4 "Smooth_MediumPedal" 3 "Smooth_HeavyPedal" 2 "Smooth_WOP" 1 "Smooth_Cold" 0 "Smooth_ExtremeCold";
+VAL_TABLE_ Fault_FFF 4095 "Fault";
+VAL_TABLE_ VehStrtStop_D_Rq 3 "NotUsed" 2 "Vehicle_Start_Request" 1 "Vehicle_Stop_Request" 0 "NoRequest";
+VAL_TABLE_ HvacRec_D_RqMxBatt 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "No_Override" 9 "90Percent_RecircMax" 8 "80Percent_RecircMax" 7 "70Percent_RecircMax" 6 "60Percent_RecircMax" 5 "50Percent_RecircMax" 4 "40Percent_RecircMax" 3 "30Percent_RecircMax" 2 "20Percent_RecircMax" 1 "10Percent_RecircMax" 0 "0Percent_RecircFullOpen";
+VAL_TABLE_ FuelCtlOpenLp_B_Inhbt 1 " Inhibit_FullPedal_Actions" 0 "Normal_Operation";
+VAL_TABLE_ EngStrtStop_B_SrcSrvc 1 "Eng_StartStop_for_Service" 0 "Not_Requested";
+VAL_TABLE_ EngStrtStop_B_SrcCat 1 "Eng_StartStop_for_Catalyst" 0 "Not_Requested";
+VAL_TABLE_ PrkBrkStatus 7 "GeneralFault_MaintenceMode" 6 "ECD_by_Brake_ECU_Active" 5 "EPB_Limphome_Active" 4 "Rear_Caliper_Open" 3 "RWU_By_EPB_Active" 2 "Rear_Caliper_Transition" 1 "Rear_Caliper_Closed" 0 "Not_Supported";
+VAL_TABLE_ ElLoadCtl_D_Rq 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "HoldAllDrvrInvisibleLoads" 3 "StdDriverInvisibleLoadsOn" 2 "AllDriverInvisibleLoadsOn" 1 "All_Possible_Loads_Off" 0 "No_Request";
+VAL_TABLE_ BattTracCool 3 "NotUsed" 2 "DCDC_Overtemperature" 1 "CoolingRequiredbyDCDC" 0 "NoCoolingRequiredbyDCDC";
+VAL_TABLE_ NotReady_Active_Fault 3 "Fault" 2 "Active" 1 "Ready" 0 "Not_Ready";
+VAL_TABLE_ Quality_Data 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Fault";
+VAL_TABLE_ PwSrcULoFalt_D_Stat 3 "Fault_No_Output" 2 "Fault_Reduced_Output" 1 "Fault_NonSpecific" 0 "No_Fault";
+VAL_TABLE_ Connect_Discon_Loose 1 "Loose_or_Disconnected" 0 "Connected";
+VAL_TABLE_ DontCare_StartInhibit 1 "Start_Inhibit" 0 "Dont_Care";
+VAL_TABLE_ BattULoChrg_D_Rq 3 "Low_Battery_Temperature" 2 "Charging_Requested" 1 "Chrg_Requested_HighCurrent" 0 "No_Request";
+VAL_TABLE_ PwSysULoFalt_D_Stat 15 "Not_Used_6" 14 "LowBatterySOC" 13 "PSS_Shed2_Contin" 12 "Not_Used_4" 11 "Not_Used_3" 10 "Not_Used_2" 9 "BattMonitoringSensorFault" 8 "LowBattVoltDuringPwSrcOn" 7 "LowBatt2_PowerSaveMode" 6 "LowBatt1_Warning" 5 "Overvoltage" 4 "Fault_NoOutput" 3 "Fault_ReducedOutput" 2 "Fault_Nonspecific" 1 "Cluster_Proveout" 0 "No_Fault";
+VAL_TABLE_ AccStopMde_D_Rq 3 "Stop_Mode_Active" 2 "EPBApplyOrBrakeReleaseWarn" 1 "Limit_Rolling_Speed" 0 "Stop_Mode_Not_Active";
+VAL_TABLE_ EngFuelCutFull_B_Sched 1 "DFSO_Event_Scheduled" 0 "Normal";
+VAL_TABLE_ Eng_D_Stat 3 "NotUsed" 2 "EngAutoStopped" 1 "EngOn" 0 "EngOff";
+VAL_TABLE_ ElPw_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Fault_Limited" 3 "LV_Event_In_Progress" 2 "Not_Supported_Imminent" 1 "Supported" 0 "Not_Supported";
+VAL_TABLE_ PwPckTq_D_Stat 3 "PwPckOn_TqAvailable" 2 "StartInPrgrss_TqNotAvail" 1 "PwPckOn_TqNotAvailable" 0 "PwPckOff_TqNotAvailable";
+VAL_TABLE_ BattTracCool_D_Falt 3 "NotUsed" 2 "CoolSysPartialyOperational" 1 "Cooling_System_Faulted" 0 "Cooling_System_Operational";
+VAL_TABLE_ Fault_FF 255 "Fault";
+VAL_TABLE_ ElCmprOverTe_D_Stat 3 "OverTempStop" 2 "OverTempWarning" 1 "Normal" 0 "Undefined";
+VAL_TABLE_ ElCmprUHi_D_Stat 3 "Overvoltage" 2 "Undervoltage" 1 "InRange" 0 "Undetermined";
+VAL_TABLE_ ElCmpr_D_Stat 7 "Signal_Invalid" 6 "Comp_Off_ActlSpd_Abnormal" 5 "Comp_Off_TrgtSpd_OutRange" 4 "Comp_Shutdown" 3 "Comp_Stopped_Self_Protect" 2 "Comp_Degraded" 1 "Comp_On" 0 "Comp_Off";
+VAL_TABLE_ Southern_Northern 3 "Fault" 2 "Northern" 1 "Southern" 0 "Invalid";
+VAL_TABLE_ PsngrFrntDetct_D_Actl 3 "Unknown" 2 "Empty" 0 "Faulty" 1 "Occupied";
+VAL_TABLE_ Normal_Mode1_2 3 "Undefined" 2 "Mode2" 1 "Mode1" 0 "Normal_Mode";
+VAL_TABLE_ LaActvAvail 3 "LKA_LCA_LDW_Avail" 2 "LCA_LKA_Avail_LDW_Suppress" 1 "LCA_LKA_Suppress_LDW_Avail" 0 "LCA_LKA_LDW_Suppress";
+VAL_TABLE_ LA_NotDenied 1 "LA_Denied" 0 "LA_Not_Denied";
+VAL_TABLE_ HandsOn_Off 1 "Hands_Off" 0 "Hands_On";
+VAL_TABLE_ Smooth_Quick 1 "Quick" 0 "Smooth";
+VAL_TABLE_ None_Low_Med_High 3 "High" 2 "Medium" 1 "Low" 0 "None";
+VAL_TABLE_ LdwActvStats 7 "LDW_Suppress_Right_Left" 6 "Not_Used2" 5 "LDW_Suppress_Right" 4 "LDW_Warning_Right" 3 "LDW_Suppress_Left" 2 "LDW_Warning_Left" 1 "LDW_DemoVibration" 0 "LDW_Idle";
+VAL_TABLE_ Fault_3FF 1023 "Fault";
+VAL_TABLE_ EngStrtStop 15 "Unused_7" 14 "Unused_6" 13 "Unused_5" 12 "Unused_4" 11 "Unused_3" 10 "Unused_2" 9 "Unused_1" 8 "Force_Pull_Down" 7 "Force_Pull_Up" 6 "Pull_Down_Inhibit_Pull_Up" 5 "Inhibit_Change" 4 "Inhibit_Pull_Up" 3 "Pull_Down" 2 "Inhibit_Pull_Down" 1 "Pull_Up" 0 "No_Request";
+VAL_TABLE_ TrnMde_D_Rq 15 "Unused_4" 14 "Unused_3" 13 "Unused_2" 12 "Unused_1" 11 "InOutLckedHydStandby" 10 "InputOutputLocked" 9 "OutputLockedHydStandby" 8 "OutputLocked" 7 "ReducedOutTqHydStandby" 6 "Reduced_Output_Torque" 5 "TransInTqHydStandby" 4 "Transmit_Input_Torque" 3 "ActNeutralHydStandby" 2 "Active_Neutral" 1 "NeutralHydraulicStdby" 0 "Neutral";
+VAL_TABLE_ Fault_F 15 "Fault";
+VAL_TABLE_ Fault_1F 31 "Fault";
+VAL_TABLE_ TmsStatRqDsply 15 "Reserved4" 14 "Reserved3" 13 "Reserved2" 12 "Crawl_Mode_4LOW_Reqd" 11 "Economy_Mode_Select" 10 "ModeChangeNotAvailable" 9 "Terrain_Sys_Not_Avail" 8 "Terrain_System_Fault" 7 "Mode_Change_InProgress" 6 "Dynamics_Mode_Select" 5 "Rock_Crawl_Mode_Select" 4 "Sand_Mode_Select" 3 "Mud_Ruts_Mode_Select" 2 "Low_Mu_Mode_Select" 1 "Special_Modes_Off" 0 "No_Message";
+VAL_TABLE_ LockInhibit 1 "Inhibit" 0 "No_Inhibit";
+VAL_TABLE_ DieslFuelBio_B_ActlDrv 1 "Biodiesel_User" 0 "Non_Biodiesel_User";
+VAL_TABLE_ Invalid_FFF 4095 "Invalid";
+VAL_TABLE_ ParkAid_Chime 15 "Zone15_Chime" 14 "Zone14_Chime" 13 "Zone13_Chime" 12 "Zone12_Chime" 11 "Zone11_Chime" 10 "Zone10_Chime" 9 "Zone9_Chime" 8 "Zone8_Chime" 7 "Zone7_Chime" 6 "Zone6_Chime" 5 "Zone5_Chime" 4 "Zone4_Chime" 3 "Zone3_Chime" 2 "Zone2_Chime" 1 "Zone1_Chime" 0 "No_Chime";
+VAL_TABLE_ Shed_Feature_Group_ID 16 "PtcHeater" 14 "HtdMirr" 13 "HvacRearBlwr_Third" 12 "HvacRearBlwr_Second" 11 "HvacRearBlwr_First" 31 "All LSHED1 Features" 10 "Htd_Windscrn" 9 "SpltHtdBcklight_HtdMirr" 8 "HtdBcklight_HtdMirr" 7 "HtdCoolSeat_FrtDriver" 6 "HtdCoolSeat_FrtPass" 5 "HtdCoolSeat_RearPass" 4 "HtdCoolSeat_RearDriver" 3 "SmartTrlrTowBattCharge" 2 "Htd_StrWhl" 1 "Htd_Washer_Fluid" 0 "No_LSHED1_Features" 15 "Engine_Coolant_Fan";
+VAL_TABLE_ CoolantFanStepAct 31 "Unused7" 30 "Unused6" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 23 "Step23" 22 "Step22" 21 "Step21" 20 "Step20" 19 "Step19" 18 "Step18" 17 "Step17" 16 "Step16" 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 24 "Max_Fan_Speed_Req" 0 "Fan_Cmd_Off";
+VAL_TABLE_ Null_Cancel 1 "Cancel" 0 "Null";
+VAL_TABLE_ Veh_Lock_Requestor 31 "Unused8" 30 "Unused7" 29 "Unused6" 28 "Rgtm_Shutlock_Switch" 27 "Boundary_Alert" 26 "Transit_Vehicle_Relock" 25 "Transit_Cargo_Relock" 24 "Transit_Ajar_Lock" 23 "Diagnostics" 22 "Console_Lock" 21 "Child_Lock" 20 "Double_Lock" 19 "Passive_Pasenger" 18 "Passive_Driver" 17 "Slam_Lock_Protect" 16 "SYNC" 15 "Passport" 14 "Passive_Smart_Unlock" 13 "Autorelock" 12 "RemoteStart" 0 "Null" 1 "Autolock" 11 "Smart_Unlock" 10 "Sliding_Door" 9 "Passive" 8 "Remote" 7 "Programming" 6 "Powerslide" 5 "Keypad" 4 "Key_Cylinder" 3 "Interior" 2 "Auto_Unlock";
+VAL_TABLE_ EPAS_FAILURE 3 "SERVICE_POWER_STEERING_NOW" 2 "SERVICE_POWER_STEERING" 1 "POWER_STRG_ASSIST_FAULT" 0 "EPAS_OK_NO_MESSAGE";
+VAL_TABLE_ Perimeter_Alarm_Mode 3 "Activated" 2 "Armed" 1 "Prearmed" 0 "Disarmed";
+VAL_TABLE_ Invalid_FFFF 65535 "Invalid";
+VAL_TABLE_ FdaStat_D_Dsply 7 "Undefined_3" 6 "Undefined_2" 5 "Undefined_1" 4 "Distance_Alert_Unavailable" 3 "DistanceAlertUnavail_Low" 2 "DistanceAlertUnavailActive" 1 "Distance_Alert_Available" 0 "Distance_Alert_Off";
+VAL_TABLE_ OilPressureWarning 1 "Low_Pressure_Lamp_On" 0 "Normal_Pressure_Lamp_Off";
+VAL_TABLE_ MyKey_KeyTypeChangeReq 3 "Search_PE_BackupSlot" 2 "Clear_All_MyKeys" 1 "Request_New_MyKey" 0 "None";
+VAL_TABLE_ MyKey_Key_Count 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero" 15 "Invalid" 14 "Unlimited";
+VAL_TABLE_ GearEngag_D_Actl 7 "Undefined" 6 "Fwd_Clutch_Fully_Engaged" 5 "Neutral_Idle" 4 "Disengaged_to_Neutral_Idle" 3 "Disengaged_to_Neutral_Park" 2 "Engagement_in_Progress" 1 "InitializeFwdClutchEngagmt" 0 "Park_Neutral";
+VAL_TABLE_ Shed_Level_Req 7 "Unused_2" 6 "Loads_On" 5 "SHED_ENG_OFF" 4 "SOON_ENG_OFF" 3 "SHED2_CONTIN" 2 "SHED2_TRANS" 1 "SHED1" 0 "NO_SHED";
+VAL_TABLE_ BpedMove_D_Actl 3 "Unknown" 2 "DriverApplyingBrakePedal" 1 "NoAutonomousBrkPdlMovement" 0 "AutonomousBrkPedalMove";
+VAL_TABLE_ Eastern_Western 0 "Invalid" 1 "Eastern" 2 "Western" 3 "Fault";
+VAL_TABLE_ EATC_Temp_Digit3 2 "_5" 1 "_0" 0 "OFF";
+VAL_TABLE_ EATC_Units 2 "Fahrenheit" 1 "Celsius" 0 "Off";
+VAL_TABLE_ BattTracOffFst_D_Actl 3 "Unexpected_Contactor_Open" 2 "Restraints_Impact_Event" 1 "Interlock_Open" 0 "Normal";
+VAL_TABLE_ Invalid_1FF 511 "Invalid";
+VAL_TABLE_ ChargeMode 7 "Undefined_2" 6 "Undefined_1" 5 "Battery_Identify" 4 "Battery_Refresh" 3 "SlowRegenAllowNoDischarge" 2 "Fast_Regen_Allowed" 1 "Slow_Regen_Allowed" 0 "Conventional_Charging";
+VAL_TABLE_ Unknown_FFFE_Invalid_FFFF 65535 "Invalid" 65534 "Unknown";
+VAL_TABLE_ SAPPAngleControlStat5 1 "StrgColTorqueExceed_EAROn" 0 "ExternalSigContentOKforEAC";
+VAL_TABLE_ Closed_Open_Active_Fault 3 "Fault" 2 "Active" 1 "Open" 0 "Closed";
+VAL_TABLE_ SAPPAngleControlStat2 1 "Rel_ExtSteeringAngleReqx" 0 "NoRel_ExtSteeringAngleReqx";
+VAL_TABLE_ SAPPAngleControlStat3 1 "EARactiveNoReverseEngage" 0 "ExternalSigContentOKforEAC";
+VAL_TABLE_ RstrnImpactEvntStatus 7 "Invalid" 6 "Not_Used_4" 5 "Threshold_2_Exceeded" 4 "Not_Used_3" 3 "Threshold_1_Exceeded" 2 "Not_Used_2" 1 "Not_Used_1" 0 "Normal";
+VAL_TABLE_ EDRTriggerEvntSync 1 "Threshold_Exceeded" 0 "Normal";
+VAL_TABLE_ EngTeColdPrtct_D_Stats 3 "Engine_Warm_RdcPwr" 2 "OK_to_Drive" 1 "Engine_Warm_PlsWait" 0 "Normal_Operation";
+VAL_TABLE_ HILL_DESC_MC 7 "Fault_Detected" 6 "Cooling_Down" 5 "Abort_Apply_Brakes" 4 "Active" 3 "Disabled" 2 "Enabled" 1 "Off_Road" 0 "Normal";
+VAL_TABLE_ Closed_Ajar 1 "Ajar" 0 "Closed";
+VAL_TABLE_ CADS_Autio_Mute 7 "Unknown" 6 "Attenuation_6" 5 "Attenuation_5" 4 "Attenuation_4" 3 "Attenuation_3" 2 "Attenuation_2" 1 "Attenuation_1" 0 "No_Attenuation_of_Audio";
+VAL_TABLE_ Quality_Factor 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_TABLE_ Null_Day_Night 3 "NotUsed" 2 "Night" 1 "Day" 0 "Null";
+VAL_TABLE_ Null_Flash_High 3 "NotUsed" 2 "High" 1 "Flash_to_Pass" 0 "Null";
+VAL_TABLE_ GearPos_D_Actl 15 "Unknown" 14 "Reverse" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Tenth" 9 "Ninth" 8 "Eighth" 7 "Seventh" 6 "Sixth" 5 "Fifth" 4 "Fourth" 3 "Third" 2 "Second" 1 "First" 0 "Neutral";
+VAL_TABLE_ OffOn_SlowFast_Flash 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_TABLE_ AwdStat_D_RqDsply 31 "NotUsed9" 30 "NotUsed8" 29 "NotUsed7" 28 "To_Engage_4x4_Release_Aped" 27 "To_Engage_4x4_Slow_To_3MPH" 26 "Shift_To_Neutral" 25 "Lkr_Mode_Unavail_TMS" 24 " _4x4_Mode_Unavail_TMS" 23 "Out_of_4Low_Crawl" 22 "AWD_PTU_Oil_Changed" 21 "Change_AWD_PTU_Oil" 20 "Neutral_Tow_Disabled" 19 "Neutral_Tow_Enabled" 18 "AWD_OFF" 17 "_4x4_Off_Road_Speed" 16 "_4x4_Extreme_Off_Road_Mode" 15 "_4x4_Exiting_Off_Road" 14 "_4x4_Off_Road_Mode" 10 "_4x4_Locked_Temporarily" 9 "Shift_In_Progress" 13 "Blocked_Shift_Assist" 12 "_4x4_Auto_Restored" 11 "_4x4_Disabled_Temporarily" 7 "Out_of_4Low__Neutral" 6 "Out_of_4Low__Brake" 5 "Out_of_4Low__Speed" 4 "Into_4Low__Clutch" 3 "Into_4Low__Neutral" 2 "Into_4Low__Brake" 1 "Into_4Low__Speed" 0 "Normal__No_Message" 8 "Out_of_4Low__Clutch";
+VAL_TABLE_ AngleReached 1 "RequestedAngleNotReached" 0 "RequestedAngleCanBeReached";
+VAL_TABLE_ WhlDir 3 "Failed" 2 "Unknown" 1 "Backward" 0 "Forward";
+VAL_TABLE_ VehVLimStat_D_Actl 7 "Undefined_3" 6 "Undefined_2" 5 "Undefined_1" 4 "ASL_Fault_Condition" 3 "Active_and_Limiting" 2 "Active_but_Not_Limiting" 1 "Standby" 0 "Off";
+VAL_TABLE_ Unknown_Fault_1FE_1FF 511 "Fault" 510 "Unknown";
+VAL_TABLE_ Fault_NoFault 1 "Fault" 0 "No_Fault";
+VAL_TABLE_ TrnIpcDsplyMde_D_Actl 7 "Manual_3" 6 "Manual_2" 5 "Manual_1_Low" 4 "Sport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_TABLE_ TrnIpcDsplyMde_D_Stat 3 "Reserved_Blank_No_Display" 2 "Flash" 1 "On" 0 "Blank_No_Display";
+VAL_TABLE_ TrnIpcDsplyGear_D_Actl 15 "No_Gear_Selected" 14 "_14th_Gear" 13 "_13th_Gear" 12 "_12th_Gear" 11 "_11th_Gear" 10 "_10th_Gear" 9 "_9th_Gear" 8 "_8th_Gear" 7 "_7th_Gear" 6 "_6th_Gear" 5 "_5th_Gear" 4 "_4th_Gear" 3 "_3rd_Gear" 2 "_2nd_Gear" 1 "_1st_Gear" 0 "Neutral";
+VAL_TABLE_ TerrMde_D_Actl 7 "Fail_Safe_Default" 6 "Dynamic_Mode" 5 "Rock_Crawl_Mode" 4 "Mud_Ruts_Mode" 3 "Sand_Mode" 2 "Undefined" 1 "Low_Mu_Mode" 0 "Special_Operating_Mode_Off";
+VAL_TABLE_ TerrMdeChng_D_Rdy 7 "Fault" 6 "Undefined_2" 5 "Undefined_1" 4 "ModeUnavailDrInputRqd" 3 "SpOpModes_NotSupported" 2 "ModeUnavailDynamicCond" 1 "Module_In_Initialization" 0 "Mode_Change_Available";
+VAL_TABLE_ Unknown_Fault_FFFE_FFFF 65535 "Fault" 65534 "Unknown";
+VAL_TABLE_ Invalid_FFFFFF 16777215 "Invalid";
+VAL_TABLE_ AutoParkSpdExitCond 1 "SpeedLimitExceededEAROn" 0 "ExternalSigContentOKforEAC";
+VAL_TABLE_ EngOilLvlDsply_D_Rq 15 "EngOil_LevelSys_CheckFault" 14 "Reserved_2" 13 "Reserved_1" 12 "Conditions_Unsuitable" 11 "Dipstick_Below_Minimum" 10 "Dipstick_Above_Maximum" 9 "Dipstick_Minimum" 8 "Dipstick_12_5_MinMaxRange" 7 "Dipstick_25_MinMaxRange" 6 "Dipstick_37_5_MinMaxRange" 5 "Dipstick_50_MinMaxRange" 4 "Dipstick_62_5_MinMaxRange" 3 "Dipstick_75_MinMaxRange" 2 "Dipstick_87_5_MinMaxRange" 1 "Dipstick_Maximum_Displayed" 0 "No_Message";
+VAL_TABLE_ HdcMde_D_Actl 7 "Fault" 6 "Temporarily_Unavailable" 5 "NotEnabled_WrongGearSel" 4 "NotEnabled_SpdLimitExceed" 3 "Active_Braking" 2 "Not_Active_Braking" 1 "Off" 0 "Undefined";
+VAL_TABLE_ GearLvrPos_D_Actl 15 "Fault" 14 "Unknown_Position" 13 "Undefined_Treat_as__Fault" 12 "Undefined_Treat_as_Fault" 11 "sixth" 10 "fifth" 9 "fourth" 8 "third" 7 "second" 6 "first" 5 "Low" 4 "Sport_DriveSport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_TABLE_ FcwMsgTxt_D_Rq 7 "Undefined_3" 6 "Undefined_2" 5 "Low_Visibility" 4 "Unavailable_DueTo_LowSpeed" 3 "Available" 2 "Unavailable" 1 "Off" 0 "No_Text";
+VAL_TABLE_ FcwSens_B_Actl 3 "FCW_Sensitivity_3" 2 "FCW_Sensitivity_2" 1 "FCW_Sensitivity_1" 0 "Not_Used";
+VAL_TABLE_ LastSettind_DefaultOn 1 "Default_On" 0 "Last_Setting";
+VAL_TABLE_ EngTurboMde_D_Actl 3 "Fault" 2 "One_Turbo_Active" 1 "Two_Turbos_Active" 0 "Initializing";
+VAL_TABLE_ EngPullUpPullDown 15 "Undefined_7" 14 "Undefined_6" 13 "Undefined_5" 12 "Undefined_4" 8 "Force_Pull_Down" 7 "Force_Pull_Up" 6 "PullDown_Inhibit_PullUp" 5 "Inhibit_Change" 4 "Inhibit_Pull_Up" 3 "Pull_Down" 2 "Inhibit_Pull_Down" 1 "Pull_Up" 0 "No_Request" 11 "Undefined_3" 10 "Undefined_2" 9 "Undefined_1";
+VAL_TABLE_ EngMde_D_Rq 8 "VSC_Sets_Speed_Type_3" 7 "VSC_Sets_Speed_Type_2" 6 "VSC_Sets_Torque_Type_2" 5 "Dependability_Shutdown" 4 "Dependability_Follow" 3 "Start" 2 "VSC_Sets_Torque_Type_1" 1 "VSC_Sets_Speed_Type_1" 0 "Off" 15 "Undefined_7" 14 "Undefined_6" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Undefined_2" 9 "Undefined_1";
+VAL_TABLE_ DrvHdcMsg_D_Rq 7 "Undefined" 6 "Speed_too_High" 5 "Temporarily_Unavailable" 4 "System_Fault" 3 "Select_Gear" 2 "Off" 1 "On" 0 "No_Message";
+VAL_TABLE_ CmbbBrkPrchg_B_Rq 3 "Undefined" 2 "Level_2_PreCharge_Request" 1 "Level_1_PreCharge_Request" 0 "No_PreCharge_Request";
+VAL_TABLE_ CmbbBaSens_D_Rq 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Normal";
+VAL_TABLE_ CcStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "Active" 4 "Active_Que_Assist" 3 "Standby" 2 "Standby_Denied" 1 "Denied" 0 "Off";
+VAL_TABLE_ CadsAudioMute_D_Rq 3 "Reserved" 2 "Partial_Audio_Mute" 1 "Full_Audio_Mute" 0 "No_Audio_Mute";
+VAL_TABLE_ BpedDrvAppl_D_Actl 3 "_Not_Allowed" 2 "Driver_Braking" 1 "Driver_Not_Braking" 0 "Not_Allowed";
+VAL_TABLE_ AslIconDsply_D_Rq 3 "On_Passive_Overridden" 2 "On_Active" 1 "On_Passive" 0 "Off";
+VAL_TABLE_ Unknown_Fault_3E_3F 63 "Fault" 62 "Unknown";
+VAL_TABLE_ AccWarn_D_Dsply 3 "BrakeReleaseWarn_In_StopMd" 2 "Brake_Capacity_Warning" 1 "Cancel_Warning" 0 "No_Warning";
+VAL_TABLE_ AccTrgDist2_D_Dsply 15 "DIST_ACTIVE_13_Farthest" 14 "DIST_ACTIVE_12" 13 "DIST_ACTIVE_11" 12 "DIST_ACTIVE_10" 11 "DIST_ACTIVE_9" 10 "DIST_ACTIVE_8" 9 "DIST_ACTIVE_7" 8 "DIST_ACTIVE_6" 7 "DIST_ACTIVE_5" 6 "DIST_ACTIVE_4" 5 "DIST_ACTIVE_3" 4 "DIST_ACTIVE_2" 3 "DIST_ACTIVE_1_Closest" 2 "DIST_ACTIVE_No_Target" 1 "DIST_STANDBY" 0 "DIST_OFF";
+VAL_TABLE_ AccTGap_D_Dsply 7 "Undefined_2" 6 "Undefined_1" 5 "Time_Gap_5" 4 "Time_Gap_4" 3 "Time_Gap_3" 2 "Time_Gap_2" 1 "Time_Gap_1" 0 "Not_Used";
+VAL_TABLE_ AccEngStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "ACCSoonCancel_due_Low_Spd" 4 "Shift_Down_Recommendation" 3 "Shift_Up_Recommendation" 2 "ACCNotAllowedToBeActivated" 1 "ACCStandby_due_Auto_Cancel" 0 "Normal_Operation";
+VAL_TABLE_ NotPressed_Pressed 1 "Pressed" 0 "Not_Pressed";
+VAL_TABLE_ TrnGear_D_RqDrv 31 "Fault" 30 "NotUsed_25" 29 "NotUsed_24" 28 "NotUsed_23" 27 "NotUsed_22" 26 "Return_to_Park" 25 "NotUsed_20" 24 "NotUsed_19" 23 "NotUsed_18" 22 "NotUsed_17" 21 "Return_To_Park" 20 "NotUsed_15" 19 "NotUsed_14" 18 "NotUsed_13" 17 "NotUsed_12" 16 "Manual" 15 "Not_Used11" 14 "Not_Used10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "Drive" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "Neutral" 3 "NotUsed_1" 2 "Reverse" 1 "Park" 0 "No_Gear";
+VAL_TABLE_ Open_Close 1 "Close" 0 "Open";
+VAL_TABLE_ OpenCloseRetainUndef 3 "Undefined" 2 "Retain" 1 "Close" 0 "Open";
+VAL_TABLE_ DasWarn 3 "Undefined" 2 "Warning_Level_2" 1 "Warning_Level_1" 0 "No_Warning";
+VAL_TABLE_ DasAlert 5 "Alertness_Level_5" 4 "Alertness_Level_4" 3 "Alertness_Level_3" 2 "Alertness_Level_2" 1 "Alertness_Level_1" 0 "Undefined";
+VAL_TABLE_ DasStat 3 "Available" 2 "Unavailable_Other" 1 "Feedback_due_to_Speed" 0 "Off";
+VAL_TABLE_ No_Crank_Req 1 "Crank_Request" 0 "No_Crank_Request";
+VAL_TABLE_ DrvSlipCtlMde_D_Rq 3 "App_Specific_Off_Mode_3" 2 "App_Specific_Off_Mode_2" 1 "App_Specific_Off_Mode_1" 0 "Default_Mode";
+VAL_TABLE_ AwdOffRoadMode 3 "Invalid" 2 "Extreme_Off_Road" 1 "Off_Road" 0 "Normal_Mode";
+VAL_TABLE_ NotQuiet_Quiet 1 "Quiet" 0 "Not_Quiet";
+VAL_TABLE_ Normal_AdaptiveCruise 1 "Adaptive_Cruise" 0 "Normal_Cruise";
+VAL_TABLE_ Remote_Device_Feedback 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "Shutdown" 3 "Running" 2 "Starting" 1 "Acknowledge" 0 "Null";
+VAL_TABLE_ TrnManShif_D_IndDrv 7 "Undefined_3" 6 "Undefined_2" 5 "Shift_to_Neutral" 4 "Downshift_Recommendation" 3 "Upshift_Warning" 2 "Upshift_Performance" 1 "Upshift_Fuel_Economy" 0 "No_Indication";
+VAL_TABLE_ Unlock_Lock 1 "Locked" 0 "Unlock";
+VAL_TABLE_ DieslPrtc_D_RqDsply 7 "Unused_2" 6 "Unused_1" 5 "DPF_SOOT_Level3_Blocked" 4 "DPFSootLvl2_SevereOverload" 3 "DPFRegen_ExhFilterComplete" 2 "DPFRegen_CleanExhFilter" 1 "DPF_Soot_Level1_Overloaded" 0 "DPF_OK_Normal_Operation";
+VAL_TABLE_ PE_BackupSlot_Status 3 "No_Valid_FOB_In_Slot" 2 "MyKey_FOB_In_Slot" 1 "Standard_FOB_In_Slot" 0 "Null";
+VAL_TABLE_ Unknown_Fault_FFE_FFF 4095 "Fault" 4094 "Unknown";
+VAL_TABLE_ Unknown_Fault_1FFE_1FFF 8191 "Fault" 8190 "Unknown";
+VAL_TABLE_ TrnCnvtClu_D_Actl 3 "Transition_or_Micro_Slip" 2 "Lock_Up_Fixed" 1 "Lock_Up_Slip" 0 "No_Lock_Up";
+VAL_TABLE_ InhibitNoinhibit 1 "Inhibit" 0 "No_Inibit";
+VAL_TABLE_ DisableEnable 1 "Enable" 0 "Disable";
+VAL_TABLE_ Unknown_Fault_7FFE_7FFF 32767 "Fault" 32766 "Unknown";
+VAL_TABLE_ Side_Detect_Sn_State 3 "Second_Warning_Audio" 2 "System_Failure" 1 "Blocked" 0 "Clear";
+VAL_TABLE_ Litval_values 255 "Invalid" 254 "Unknown" 5 "Day" 4 "Twilight_4" 3 "Twilight_3" 2 "Twilight_2" 1 "Twilight_1" 0 "Night";
+VAL_TABLE_ Dimming_Lvl 255 "Invalid" 254 "Unknown" 18 "Day_6" 17 "Day_5" 16 "Day_4" 15 "Day_3" 14 "Day_2" 13 "Day_1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off";
+VAL_TABLE_ EngStrtStop_B_SrcChtLo 1 "Eng_StartStop_for_CHT_Low" 0 "Not_Requested";
+VAL_TABLE_ EngStrtStop_B_SrcChtHi 1 "Eng_StartStop_for_CHT_Hi" 0 "Not_Requested";
+VAL_TABLE_ EngDiag_D_RqHtrn 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NoUsed1" 3 "Eng_Diag_Cstdn" 2 "Eng_Diag_Run" 1 "Eng_Diag_Crank" 0 "Eng_Diag_Normal";
+VAL_TABLE_ NotOperating 1 "Operating" 0 "Not_Operating";
+VAL_TABLE_ CamraStat 3 "FrtCam_TempUnavailOther" 2 "FrtCam_TempUnavailVisibile" 1 "Front_Camera_Service_Reqd" 0 "Front_Camera_OK";
+VAL_TABLE_ EngPtoMde_D_Actl 7 "Undefined" 6 "Split_Shaft_Stationary" 5 "Not_Used_2" 4 "PTO_Mobile" 3 "Not_Used_1" 2 "PTO_Stationary" 1 "BCP" 0 "Off";
+VAL_TABLE_ ManRgen_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "CustInitManExhFilterClean" 0 "No_Customer_Request";
+VAL_TABLE_ Remote_Start_Status 3 "Invalid" 2 "Unknown" 1 "Remote" 0 "Null";
+VAL_TABLE_ Lock_Subld 15 "Unused7" 14 "Unused6" 13 "Unused5" 12 "Unused4" 11 "Unused3" 10 "Unused2" 9 "Unused1" 8 "Customer_8" 7 "Customer_7" 6 "Customer_6" 5 "Customer_5" 4 "Customer_4" 3 "Customer_3" 2 "Customer_2" 1 "Customer_1" 0 "Null";
+VAL_TABLE_ Brake_Fluid 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK";
+VAL_TABLE_ Unknown_Invalid_FE_FF 255 "Invalid" 254 "Unknown";
+VAL_TABLE_ Invalid_FF 255 "Invalid";
+VAL_TABLE_ NotLow_Low 1 "Low" 0 "Not_Low";
+VAL_TABLE_ Disabled_Enabled_Status 2 "Status" 3 "NotUsed" 1 "Enabled" 0 "Disabled";
+VAL_TABLE_ Key_In_Ignition_Status 1 "In" 0 "Out";
+VAL_TABLE_ Ignition_Status 0 "Unknown" 1 "Off" 15 "Invalid" 8 "Start" 4 "Run" 2 "Accessory";
+VAL_TABLE_ Disabled_Enabled_Faulted 3 "Faulted" 2 "Unused" 1 "Enabled" 0 "Disabled";
+VAL_TABLE_ Disabled_Enabled_NoSupport 2 "Unused" 3 "Not_Supported" 1 "Enabled" 0 "Disabled";
+VAL_TABLE_ Unknown_Fault_FE_FF 255 "Fault" 254 "Unknown";
+VAL_TABLE_ Null_Unlock 1 "Unlock" 0 "Null";
+VAL_TABLE_ Null_Active 1 "Active" 0 "Null";
+VAL_TABLE_ HsaStat_D_Actl 7 "Faulty" 6 "FaultyWithDriverIndication" 5 "SlowRelease" 4 "FastRelease" 3 "ActiveBrakePedalReleased" 2 "ActiveBrakePedalPressed" 1 "FindingGradient" 0 "Inactive";
+VAL_TABLE_ Off_Auto_Manual 3 "Undefined" 2 "Manual" 1 "Automatic" 0 "Off";
+VAL_TABLE_ HsaStat_D_Dsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "NotAvailable" 3 "SlowReleaseWithChime" 2 "SlowReleaseWithoutChime" 1 "Active" 0 "Inactive";
+VAL_TABLE_ EngMsgTxt_D_Rq 3 "Undefined_2" 2 "Undefined_1" 1 "Power_Reduced_to_LowerTemp" 0 "No_Message";
+VAL_TABLE_ PassRstrnInd_Req 3 "ABOnNotIllum_OffNotIllum" 2 "AirbagOnNot_Illum_OffIllum" 1 "AirbagOn_Illum_OffNotIllum" 0 "AirbagOn_Illum_Off_Illum";
+VAL_TABLE_ RearDiffLckMsg_D_Rq 7 "Locker_Disabled" 6 "Locker_Enabled" 5 "Locker_Accel_Pedal" 4 "Speed4" 3 "Speed3" 2 "Spee2" 1 "Speed1" 0 "Normal__No_Message ";
+VAL_TABLE_ GPS_Compass_dirctn 7 "NorthWest" 6 "West" 5 "SouthWest" 4 "South" 3 "SouthEast" 2 "East" 1 "NorthEast" 0 "North";
+VAL_TABLE_ GPS_Actual_Infer 1 "Inferred_Position" 0 "Actual_Postition";
+VAL_TABLE_ DrvHdcWarnInfo_D_Rq 3 "Undefined" 2 "Lamp_On_Continuously" 1 "Lamp_Flashing" 0 "Lamp_Off_Continuously";
+VAL_TABLE_ DieslPrtcRgen_D_Actl 3 "Undefined" 2 "Regen_Level_2" 1 "Regen_Level_1" 0 "No_regen";
+VAL_TABLE_ Off_On 1 "On" 0 "Off";
+VAL_TABLE_ CcMde_D_Actl 7 "TapDownWaiting" 6 "TapUpWaiting" 5 "Resuming_Low" 4 "Resuming_High" 3 "Decelerating" 2 "Accelerating" 1 "Keeping_Speed" 0 "Not_Active";
+VAL_TABLE_ InactiveActive 1 "Active" 0 "Inactive";
+VAL_TABLE_ ManRgenTxt_D_RqDsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Cleaning_Aborted_Stopped" 3 "Cleaning_Completed" 2 "Cleaning_In_Progress" 1 "Cleaning_Allowed" 0 "Cleaning_Not_Allowed";
+VAL_TABLE_ Fault_FFFF 65535 "Fault";
+VAL_TABLE_ Fault_7F 127 "Fault";
+VAL_TABLE_ EngOilLvlWarn_D_Rq 7 "Undefined_3" 6 "Undefined_2" 5 "Engine_Oil_Monitor_Fault" 3 "Engine_Oil_High" 2 "Engine_Oil_Critical_Low" 1 "Engine_Oil_Low" 0 "No_Message" 4 "Engine_Oil_Critical_High";
+VAL_TABLE_ UreaQltySys_D_RqDsply 7 "Undefined" 6 "ZZ_Overrides" 5 "EngineIdled" 4 "Engine_Idle_Upon_Refuel" 3 "SPEED_LIMITED_to_YY_mph" 2 "YY_MPH_MAX_UPON_Restart" 1 "CONTAMINATED_ExhFluid" 0 "NoQualityProblem";
+VAL_TABLE_ Unknown_Invalid_1E_1F 31 "Invalid" 30 "Unknown";
+VAL_TABLE_ Unknown_Invalid_3FFE_3FFF 16383 "Invalid" 16382 "Unknown";
+VAL_TABLE_ NoYes 1 "Yes" 0 "No";
+VAL_TABLE_ AwdRnge_D_Actl 7 "Unknown" 6 "High_Range_2wd" 5 "High_Range_Auto" 4 "High_Range_Locked" 3 "Neutral" 2 "Low_Range_2wd" 1 "Low_Range_Auto" 0 "Low_Range_Locked";
+VAL_TABLE_ AwdLck_D_Stat 9 "Undefined" 8 "Under_External_Torque_Ctrl" 7 "Torque_Limited_by_Cmd" 6 "Fully_Locked_by_Cmd" 5 "Disabled" 4 "Warning" 3 "Fault" 2 "Inactive" 1 "Completely_Opened_by_Cmd" 0 "OK";
+VAL_TABLE_ Unknown_Fault_3FE_3FF 1023 "Fault" 1022 "Unknown";
+VAL_TABLE_ LockSwStat 3 "Invalid" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_TABLE_ Null_Override 1 "Override" 0 "Null";
+VAL_TABLE_ Off_On_Flash 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_TABLE_ immoTargetStatCoding 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "DISABLED_RESET " 2 "ENABLED_NONMOTIVE_START" 1 "ENABLED_MOTIVE_START" 0 "DISABLED";
+VAL_TABLE_ BeltBuckle 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_TABLE_ RILReqCoding 3 "Not_Used" 2 "Plant_Mode" 1 "On" 0 "Off";
+VAL_TABLE_ Update_Bit 1 "Fresh_data" 0 "Unchanged_data";
+VAL_TABLE_ Running_Board 3 "Unused" 2 "Manually_Deployed" 1 "All_Enabled" 0 "All_Disabled";
+VAL_TABLE_ HudFlashRate 3 "Unused" 2 "Flash_4Hz_50Prct_DutyCycle" 1 "On" 0 "Off";
+VAL_TABLE_ Turn_Seq 3 "Seq" 2 "On" 1 "Off" 0 "Null";
+VAL_TABLE_ immoTargetCmdCoding 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "TARGET1_IDBLOCK2" 2 "TARGET1_IDBLOCK1" 1 "CHALLENGE" 0 "IDLE";
+VAL_TABLE_ immoSubTargetCmdCoding 7 "Unused3" 6 "Unused2" 5 "ECHO_TARGET1_IDBLOCK2" 4 "Unused1" 3 "RQST_TARGET1_IDBLOCK2" 2 "RQST_TARGET1_IDBLOCK1" 1 "RESPONSE" 0 "IDLE";
+VAL_TABLE_ immoCtrlCmdCoding 0 "IDLE" 1 "MOTIVE_START_RQST" 2 "NONMOTIVE_START_RQST" 3 "RQST_TARGET1_IDBLOCK1" 4 "RQST_TARGET1_IDBLOCK2" 5 "Unused" 6 "ECHO_TARGET1_IDBLOCK2" 7 "SHUTDOWN";
+VAL_TABLE_ Rvc_Zoom 7 "Unknown" 6 "Invalid" 5 "Zoom_Level_V" 4 "Zoom_Level_IV" 3 "Zoom_Level_III" 2 "Zoom_Level_II" 1 "Zoom_Level_I" 0 "Off";
+VAL_TABLE_ NotPark 1 "Park" 0 "Not_Park";
+VAL_TABLE_ Electric_EOH 1 "Electric_Over_Hydraulic" 0 "Electric";
+VAL_TABLE_ PersOptIn 1 "OPTED_IN" 0 "NOT_OPTED_IN";
+VAL_TABLE_ PersonalSetUp 3 "Non_Moveable_Person" 2 "Moveable_Person" 1 "Vehicle" 0 "Factory";
+VAL_TABLE_ Full_Limited 1 "Limited" 0 "Full";
+VAL_TABLE_ NoConflict_Conflict 1 "Conflict" 0 "No_Conflict";
+VAL_TABLE_ Assoc_Confirm 0 "None" 7 "Associate" 6 "Keycode_Rejected" 5 "Keycode_Accepted" 4 "In_Progress" 3 "Erase" 2 "Duplicate" 1 "Disassociate";
+VAL_TABLE_ Pers1_4 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_TABLE_ Null_Query 7 "Unused_2" 6 "Unused_1" 5 "Copy" 4 "Restore" 3 "Upload" 2 "Set" 1 "Query" 0 "Null";
+VAL_TABLE_ EngExhBrkMde_D_Actl 6 "ExhBrkDisable_NoError" 5 "ExhBrkActive_AUTO" 4 "ExhBrkActive_ON" 3 "ExhBrkRequest_AUTO" 2 "ExhBrkRequest_ON" 1 "ExhBrkNoRequest_OFF" 0 "ExhBrkUnavailable_Error";
+VAL_TABLE_ UreaLvlTxt_D_RqDsply 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "System_Error" 10 "Engine_Idled_See_Manual" 9 "Engine_Idled_Upon_Refuel" 8 "Speed_Limited_To_XX_mph" 7 "XXmph_Max_Upon_Restart" 6 "Speed_Limited_To_YY_mph" 5 "YYmph_Max_Upon_Restart" 4 "SpdLimtd_YYmph_In_XXmiles" 3 "ExFlRange_XXMiles_ScndWarn" 2 "Exh_Fluid_Range_XX_Miles" 1 "Exh_Fluid_Under_Half_Full" 0 "Exh_Fluid_Over_Half_Full";
+VAL_TABLE_ RearDiffFalt_D_Stat 3 "Diff_Failed_Closed" 2 "Diff_Failed_Open" 1 "Fault_Non_Specific" 0 "No_Fault";
+VAL_TABLE_ CCOverridden 1 "Cruise_Overridden" 0 "Cruise_Req_Not_Overridden";
+VAL_TABLE_ Ign_Key_Device_Type 15 "Invalid" 14 "Unknown" 3 "Key_Not_Prgrm_Read_Failure" 2 "Key_In_Ign_My_Key" 1 "Key_In_Ign_Standard_Key" 0 "Key_Read_In_Progress";
+VAL_TABLE_ Off_No_Eff_Unknown_Invalid 3 "Invalid" 2 "Unknown" 1 "No_Effect" 0 "Off";
+VAL_TABLE_ Null_Out 1 "Out" 0 "Null";
+VAL_TABLE_ FUEL_SENSORS 1 "Dual_Sensors" 0 "Single_Sensor";
+
+
+BO_ 823 DTE_HPCMtoECG: 8 Vector__XXX
+ SG_ DteVehPwId_No_Actl : 47|5@0+ (1,0) [0|31] "unitless" GWM
+ SG_ DteVehEId_No_Actl : 39|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ DteVehEffId_No_Actl : 6|7@0+ (1,0) [0|127] "unitless" GWM
+ SG_ DteVeh_Pw_Actl : 31|8@0+ (50,0) [0|12750] "watts" GWM
+ SG_ DteVeh_Eff_Actl : 23|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" GWM
+ SG_ DteVeh_E_Actl : 15|8@0+ (100,0) [0|25500] "watt*hour" GWM
+ SG_ DteAcceptNew_B_Rq : 7|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 824 DTE_ECGtoHPCM: 8 GWM
+ SG_ DteCldTrlrOn_B_Stat : 51|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldTrlrOff_B_Stat : 52|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldTrip_L_Actl : 47|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX
+ SG_ DteCldTraffic_B_Stat : 53|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldTerrain_B_Stat : 54|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldRoute_B_Stat : 55|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldPayload_B_Stat : 16|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldId_No_Actl : 21|5@0+ (1,0) [0|31] "unitless" Vector__XXX
+ SG_ DteCldExtTe_B_Stat : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldExt_Eff_Actl : 39|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX
+ SG_ DteCldDrv_Eff_Actl : 31|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX
+ SG_ DteCldDcac_B_Stat : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DteCldClimt_Eff_Actl : 15|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX
+ SG_ DteCldBattULo_Eff_Actl : 7|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX
+
+BO_ 949 Tire_Pressure_Data_FD1: 8 GWM
+ SG_ Tire_Press_RR_ORR_Data : 39|16@0+ (1,0) [0|65533] "kilopascal" VDM
+ SG_ Tire_Press_LR_OLR_Data : 55|16@0+ (1,0) [0|65533] "kilopascal" VDM
+ SG_ Tire_Press_LF_Data : 7|16@0+ (1,0) [0|65533] "kilopascal" VDM
+ SG_ Tire_Press_RF_Data : 23|16@0+ (1,0) [0|65533] "kilopascal" VDM
+
+BO_ 1825 TesterPhysicalReqVDM_FD1: 64 GWM
+ SG_ TesterPhysicalReqVDM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" VDM
+
+BO_ 524 AWD_Torque_Data: 8 TCCM
+ SG_ PrplWhlTotTqRqMxAwd_No_Cs : 23|8@0+ (1,0) [0|255] "Unitless" ECM_Diesel
+ SG_ PrplWhlTot_Tq_RqMxAwd : 7|16@0+ (4,-131072) [-131072|131068] "Nm" ECM_Diesel
+ SG_ PrplWhlTotTqRqMxAwd_No_Cnt : 31|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel
+
+BO_ 740 PHEV_Battery_Data1_FD1: 8 GWM
+ SG_ BattAuxCnnct_B_Cmd : 53|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1160 ECG_Data2_FD1: 8 GWM
+ SG_ DgtlCommPncReset_B_Req : 62|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DataMntrSustn_B_Rq : 63|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PwSustnRdata_B_RqTelem : 60|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 776 SmartChargingData_ECG_3: 8 GWM
+ SG_ ScMnSoc_Pc_RqCld : 55|7@0+ (1,0) [0|127] "percent" Vector__XXX
+ SG_ ScChrgrPwMax_Pw_RqCld : 39|12@0+ (50,0) [0|204700] "watts" Vector__XXX
+ SG_ ScLocPwId_No_RqCld : 43|3@0+ (1,0) [0|7] "unitless" Vector__XXX
+ SG_ PrcondEdit_D_RqCld : 10|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ GoTEditMnte_T_RqCld : 29|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ GoTEditHr_T_RqCld : 15|5@0+ (1,0) [0|29] "SED" Vector__XXX
+ SG_ ChrgToPcEdit_Pc_RqCld : 7|7@0+ (1,0) [0|125] "percent" Vector__XXX
+ SG_ AirAmb_Te_ActlCld : 23|10@0+ (0.25,-128) [-128|127.75] "degC" Vector__XXX
+ SG_ ScFreshDataEnbl_B_Rq : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ScEnbl_D_RqCld : 25|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 775 SmartChargingData_ECG_2: 8 GWM
+ SG_ ScDayOfWeekId_D_RqCld : 63|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ScLocSetId_No_RqCld : 10|3@0+ (1,0) [0|7] "unitless" Vector__XXX
+ SG_ ScLocRdius_L_RqCld : 55|7@0+ (100,0) [0|12700] "meter" Vector__XXX
+ SG_ ScChrgToPc_Pc_RqCld : 47|7@0+ (1,0) [0|127] "percent" Vector__XXX
+ SG_ ScChrgPrfl_No_RqCld : 23|24@0+ (1,0) [0|16777215] "unitless" Vector__XXX
+ SG_ ScChrgDurSet_D_RqCld : 12|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ScChrgDur_T_RqCld : 7|11@0+ (1,0) [0|2045] "minute" Vector__XXX
+
+BO_ 774 SmartChargingData_ECG_1: 8 GWM
+ SG_ ScLocLongPostv_B_RqCld : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ScLocLongFrct_An_RqCld : 35|20@0+ (1E-006,0) [0|1.048575] "degrees" Vector__XXX
+ SG_ ScLocLongDeg_An_RqCld : 63|8@0+ (1,0) [0|255] "degrees" Vector__XXX
+ SG_ ScLocLattPostv_B_RqCld : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ScLocLattFrct_An_RqCld : 23|20@0+ (1E-006,0) [0|1.048575] "degrees" Vector__XXX
+ SG_ ScLocLattDeg_An_RqCld : 15|7@0+ (1,0) [0|127] "percent" Vector__XXX
+ SG_ ScLocId_No_RqCld : 6|3@0+ (1,0) [0|7] "unitless" Vector__XXX
+ SG_ ScLocDelete_B_RqCld : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 811 APIM_Data_FD1: 8 GWM
+ SG_ DistToStopover_L_Actl : 31|16@0+ (0.1,0) [0|6553.4] "kilometer" Vector__XXX
+ SG_ StopoverType_D_Stat : 47|3@0+ (1,0) [0|0] "SED" Vector__XXX
+ SG_ ExtLghtDsply_D_Stat : 7|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ExtLghtRight_D_RqMnu : 11|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ AutoLghtOvrrd_B_RqDrv : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ExtLghtRear_D_RqMnu : 14|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ExtLghtLeft_D_RqMnu : 1|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ExtLghtFront_D_RqMnu : 4|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ GoTEditMnte_T_RqMnu : 63|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ GoTEditHr_T_RqMnu : 44|5@0+ (1,0) [0|29] "SED" Vector__XXX
+
+BO_ 850 HEV_ChargeStat_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ VehElRngeNut_L_Dsply : 11|12@0+ (0.1,0) [0|409.3] "km" GWM
+ SG_ NxtUsgSocEst_Pc_Dsply : 7|8@0+ (0.5,0) [0|126.5] "unitless" GWM
+ SG_ EstmChrgTimeLP_St : 39|8@0+ (0.1,0) [0|25.4] "hour" GWM
+ SG_ EstmChrgTimeHP_St : 47|8@0+ (0.1,0) [0|25.4] "hour" GWM
+ SG_ ChargeNowDuration_St : 31|8@0+ (0.1,0) [0|25.4] "hour" GWM
+
+BO_ 563 MasterReset_HS3_ECGDat_FD1: 8 GWM
+ SG_ DrvBhavWarn_B_Rq : 12|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ OfbChrgSetSync_D_Rq : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ KeyOffPwMde_D_Stat : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ModemReset_D_Stat : 5|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ FactoryReset_St : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 1833 TesterPhysicalResVDM: 64 VDM
+ SG_ TesterPhysicalResVDM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 570 Suspension_Data: 8 VDM
+ SG_ SuspClkSync_No_Rq : 63|8@0+ (1,0) [0|253] "unitless" GWM
+ SG_ SuspRearRight_L_Actl : 42|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM
+ SG_ SuspFrntRight_L_Actl : 35|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM
+ SG_ SuspRear_L_Prev : 28|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM
+ SG_ SuspRear_L_Actl : 21|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM
+ SG_ SuspFrnt_L_Prev : 14|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM
+ SG_ SuspFrnt_L_Actl : 7|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM
+
+BO_ 837 VeyDynamics_Data: 8 VDM
+ SG_ Ccd_B_Falt : 24|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdeSusp_D_Stat : 20|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdptDrvMdePt_D_Rq : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ AdptDrvMdeChassis_D_Rq : 10|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ CcdMsgTxt_D_RqDsply : 7|4@0+ (1,0) [0|15] "SED" ECM_Diesel,GWM
+
+BO_ 885 ECG_Data3_FD1: 8 GWM
+ SG_ BattULoChrg_D_RqOta : 55|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ VehStrtInhbt_T_Dsply : 39|16@0+ (1,0) [0|65535] "second" Vector__XXX
+ SG_ VehStrtInhbt_D_Dsply : 27|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ VehOnRqstr_D_Stat : 21|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ VehStrtInhbt_D_RqCld : 23|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ VehOn_D_RqCld : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ CanMsg375_No_Cnt : 11|4@0+ (1,0) [0|15] "unitless" Vector__XXX
+ SG_ CanMsg375_No_Crc : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ OtaActv_D_Stat : 31|4@0+ (1,0) [0|15] "SED" Vector__XXX
+
+BO_ 1150 LocationServices_Data1_FD1: 8 GWM
+ SG_ LocationServices_1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" SOBDMC_HPCM_FD1,IPMA_ADAS
+
+BO_ 542 LocationServices_3_FD1: 8 GWM
+ SG_ LocationServices_3 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" Vector__XXX
+
+BO_ 2612224016 PARSEDPushPCMtoGWM_ECG: 8 PCM_HEV
+ SG_ PARSEDPushPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 810 ECG_Data_FD1: 8 GWM
+ SG_ OBCCSerial_D_Rq : 45|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TlghtTest_D_RqArb : 47|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ChrgrPncSustn_B_Rq : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ NtfyDrvTrgtDist_L_Rq : 23|12@0+ (0.1,0) [0.1|409.4] "Km" SOBDMC_HPCM_FD1
+ SG_ NtfyDrvSocLvl1_Pc_Rq : 39|7@0+ (1,0) [1|100] "%" SOBDMC_HPCM_FD1
+ SG_ PtRmtRprt_D_Stat : 27|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ ChrgrPncEnbl_D_Rq : 9|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ExtLghtDsply_B_StatArb : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ExtLghtRight_D_RqOta : 12|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ExtLghtRear_D_RqOta : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ExtLghtLeft_D_RqOta : 3|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ExtLghtFront_D_RqOta : 6|3@0+ (1,0) [0|7] "SED" Vector__XXX
+
+BO_ 550 ECG_Data4_FD1: 8 GWM
+ SG_ PtWakeupActv1_B_Rq : 7|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+
+BO_ 639 OffBrdChrg_Signals2: 8 GWM
+ SG_ OfbChrgPrflUpdate_B_Rq : 31|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgClearAll_B_Rq : 7|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTTouch_D_Rq : 17|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTPrcond_D_Rq : 19|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTOn_D_Rq : 10|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTMnte_D_Rq : 23|4@0+ (1,0) [0|15] "minute" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTHr_T_Rq : 15|5@0+ (1,0) [0|29] "hour" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTExtHtr_D_Rq : 1|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTElement_D_Rq : 5|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTDelete_B_Rq : 6|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgGoTUpdate_B_Rq : 8|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+
+BO_ 530 OffBrdChrg_Signals: 8 GWM
+ SG_ OfbChrgLocIdTrgt_No_Rq : 7|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1
+ SG_ OfbChrgToPcWknd_D_Actl : 58|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1
+ SG_ OfbChrgToPcWkdy_D_Actl : 61|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1
+ SG_ OfbChrgSetNow_D_Rq : 63|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgSetDelete_B_Rq : 2|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OfbChrgPrflWknd_No_Rq : 39|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1
+ SG_ OfbChrgPrflWkdy_No_Rq : 15|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1
+ SG_ OfbChrgLocIdUns_B_Rq : 3|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1142 ConsTip_Data_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ConsTipV_No_Dsply : 49|10@0+ (0.1,0) [0|102.1] "percent" GWM
+
+BO_ 817 Locking_Systems_2_FD1: 8 GWM
+ SG_ ChildLckMde_B_Stat : 56|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ VehLckInd_D_Rq : 58|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ DrTgateOpen_B_Rq : 59|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DrTgateExtSwMde_B_Stat : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Remote_Device_Feedback : 50|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ Veh_Lock_Requestor : 55|5@0+ (1,0) [0|31] "SED" Vector__XXX
+ SG_ R_Pwr_Sliding_Dr_Rqst : 36|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Power_Liftgate_Rqst : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Veh_Lock_EvNum : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ Power_Decklid_Rqst : 1|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ L_Pwr_Sliding_Dr_Rqst : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Keyfob_Pad_Msg_Count : 15|8@0+ (1,0) [0|255] "Counts" Vector__XXX
+ SG_ Veh_Lock_Sub_Id : 63|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ Veh_Lock_Status : 34|2@0+ (1,0) [0|3] "SED" CMR_DSMC
+ SG_ ChildLck_D_Dsply : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ WindowLockout_B_Stat : 35|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ RollCodeUnlock : 23|16@0+ (1,0) [0|65535] "Unitless" Vector__XXX
+ SG_ Lockmsgtxt_D_Rq : 39|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ FobComm_D_Stat : 5|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ LockInhibit : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 879 BCMC_Data_FD1: 8 GWM
+ SG_ WndwRearHeat_I_Actl : 7|11@0+ (0.1,0) [0|204.6] "ampere" ECM_Diesel
+ SG_ WndwRearHeat_D_Stat : 12|3@0+ (1,0) [0|7] "SED" ECM_Diesel
+
+BO_ 878 DCACA_Data4: 8 PCM_HEV
+ SG_ DcacGfciTest_B_Rq : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DcacOut_Pw_DsplyMx : 23|10@0+ (10,0) [0|10220] "watts" GWM
+ SG_ DcacOut1_Pw_Dsply : 39|7@0+ (100,0) [0|12600] "watts" GWM
+ SG_ DcacOut2_Pw_Dsply : 47|7@0+ (100,0) [0|12600] "watts" GWM
+ SG_ DcacHw_D_Confg : 11|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ DcacFaltMsgTxt_D_Rq : 15|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ DcacLoFuelMsgTxt_D_Rq : 29|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ DcacEngOnMsgTxt_D_Rq : 55|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ DcacElPw_D_Stat : 2|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PwBedPnlEnbl_B_Rq : 3|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DcacOn_B_Rq : 4|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DcacSys_B_Falt : 5|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DcacLedCtl_D_Rq : 7|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 395 HeadUpDisplayReq_FD1: 8 GWM
+ SG_ SelDrvMdeCnfm_D_Stat : 35|2@0+ (1,0) [0|3] "SED" ABS_ESC
+
+BO_ 2611055832 PARSEDPhysGWM_ECGtoSODR: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoSODR : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2611054808 PARSEDPhysGWM_ECGtoSODL: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoSODL : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2611026136 PARSEDPhysGWM_ECGtoSODCMD: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoSODCMD : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2611025112 PARSEDPhysGWM_ECGtoSODCMC: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoSODCMC : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2610975960 PARSEDPhysGWM_ECGtoCCM: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoCCM : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2610007256 OTAPhysGWM_ECGtoSODR: 8 GWM
+ SG_ OTAPhysGWM_ECGtoSODR : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2610006232 OTAPhysGWM_ECGtoSODL: 8 GWM
+ SG_ OTAPhysGWM_ECGtoSODL : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2609977560 OTAPhysGWM_ECGtoSODCMD: 8 GWM
+ SG_ OTAPhysGWM_ECGtoSODCMD : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2609976536 OTAPhysGWM_ECGtoSODCMC: 8 GWM
+ SG_ OTAPhysGWM_ECGtoSODCMC : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2609927384 OTAPhysGWM_ECGtoCCM: 8 GWM
+ SG_ OTAPhysGWM_ECGtoCCM : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2611175523 PARSEDPhysSODRtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODRtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224099 PARSEDPushSODRtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODR2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2611175522 PARSEDPhysSODLtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODLtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224098 PARSEDPushSODLtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODL2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2611175494 PARSEDPhysSODCMDtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODCMDtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224070 PARSEDPushSODCMDtoGWM: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODCMD2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2611175493 PARSEDPhysSODCMCtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODCMCtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224069 PARSEDPushSODCMCtoGWM: 8 IPMA_ADAS
+ SG_ PARSEDPhysSODCMC2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2611175445 PARSEDPhysCCMtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysCCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224021 PARSEDPushCCMtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysCCM2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126947 OTAPhysSODRtoGWM_ECG: 8 IPMA_ADAS
+ SG_ OTAPhysSODRtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126946 OTAPhysSODLtoGWM_ECG: 8 IPMA_ADAS
+ SG_ OTAPhysSODLtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126918 OTAPhysSODCMDtoGWM_ECG: 8 IPMA_ADAS
+ SG_ OTAPhysSODCMDtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126917 OTAPhysSODCMCtoGWM_ECG: 8 IPMA_ADAS
+ SG_ OTAPhysSODCMCtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126869 OTAPhysCCMtoGWM_ECG: 8 IPMA_ADAS
+ SG_ OTAPhysCCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 984 IPMA_Data: 8 IPMA_ADAS
+ SG_ FeatConfigIpmaActl : 7|16@0+ (1,0) [0|65535] "Undefined" GWM
+ SG_ FeatNoIpmaActl : 23|16@0+ (1,0) [0|65535] "Number" GWM
+ SG_ PersIndexIpma_D_Actl : 39|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ AhbcRampingV_D_Rq : 57|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ LaActvStats_D_Dsply : 55|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ LaDenyStats_B_Dsply : 32|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LaHandsOff_D_Dsply : 50|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CamraDefog_B_Req : 36|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CamraStats_D_Dsply : 35|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ DasAlrtLvl_D_Dsply : 42|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ DasStats_D_Dsply : 47|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ DasWarn_D_Dsply : 44|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AhbHiBeam_D_Rq : 59|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ Passthru_63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ Passthru_48 : 48|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 985 IPMA_Data2: 8 IPMA_ADAS
+ SG_ LdwChime_B_Rq : 34|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TsrRegionTxt_D_Stat : 47|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SblmPedCrossScnr_B_Stat : 33|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LongCtrlEnbl_D_Rq : 42|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ SblmRndAbtScnr_B_Stat : 9|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DasAlrtInfo_D_Dsply : 13|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ IaccVLim_D_Rq : 23|8@0+ (1,0) [0|255] "SED" ECM_Diesel,GWM
+ SG_ IaccVLimUnit_D_Rq : 11|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM
+ SG_ IsaVLim_D_Rq : 7|8@0+ (1,0) [0|255] "SED" ECM_Diesel,GWM
+ SG_ SblmStopScnr_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SblmYieldScnr_B_Stat : 31|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ IsaVLimUnit_D_Rq : 15|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM
+ SG_ AdbDividedRoad_B_Stat : 30|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LcwaMsgTxt_D_Stat : 37|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbDrvSide_B_Stat : 35|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 992 Personality_Data_FD1: 8 GWM
+ SG_ MsgCntrDsplyOp_D_Rq : 36|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ MsgCntrFeatNoRq : 7|16@0+ (1,0) [0|65535] "Number" IPMA_ADAS
+ SG_ MsgCntrFeatConfigRq : 23|16@0+ (1,0) [0|65535] "unitless" IPMA_ADAS
+ SG_ MsgCntrPersIndex_D_Rq : 39|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+
+BO_ 2612019416 PARSEDPushFcGWM_ECGtoPCM: 8 GWM
+ SG_ PARSEDPhysGWM_ECG2toPCM : 7|29@0+ (1,0) [0|536870911] "unitless" PCM,PCM_HEV,ECM_Diesel
+
+BO_ 943 IPMA_Data4: 8 IPMA_ADAS
+ SG_ VehVActlAdas_D_Qf : 9|2@0+ (1,0) [0|3] "SED" PCM,PCM_HEV,ECM_Diesel
+ SG_ Veh_V_RqLsc : 23|14@0+ (0.01,0) [0|163.83] "kph" PCM,PCM_HEV,ECM_Diesel
+ SG_ Veh_V_ActlAdas : 7|14@0+ (0.01,0) [0|163.83] "kph" PCM,PCM_HEV,ECM_Diesel
+ SG_ AdasLcDistToObj_L_Actl : 39|12@0+ (0.002,0) [0|8.186] "meter" PCM,PCM_HEV,ECM_Diesel
+
+BO_ 515 PowertrainData_12: 8 ECM_Diesel
+ SG_ PtIgnSwtch_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" GWM
+ SG_ PtIgnSwtch_No_Cnt : 5|4@0+ (1,0) [0|15] "Unitless" GWM
+ SG_ PtIgnSwtch_D_Stat : 7|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 1111 TrailerAid_Stat2_FD1: 8 GWM
+ SG_ TrlrYawWActl_D_Qf : 43|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrYaw_W_Actl : 7|16@0+ (0.0002,-6.5) [-6.5|6.6066] "radians/second" IPMA_ADAS,PSCM
+ SG_ TrlrHitYaw_AnRate_Actl : 27|12@0+ (0.1,-50) [-50|359.3] "degrees/second" IPMA_ADAS,PSCM
+ SG_ TrlrHitchYaw_D_Stat : 47|4@0+ (1,0) [0|15] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrHitchYaw_An_Actl : 23|12@0+ (0.1,-90) [-90|319.3] "degrees" IPMA_ADAS,PSCM
+
+BO_ 1106 TrailerAid_Stat1_FD1: 8 GWM
+ SG_ TrlrSnsId_No_Actl : 7|48@0+ (1,0) [0|281474976710653] "unitless" IPMA_ADAS,PSCM
+
+BO_ 1985 TesterPhysicalReqCMR_DSMC: 64 TSTR
+ SG_ TesterPhysicalReqCMR_DSMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" CMR_DSMC
+
+BO_ 1993 TesterPhysicalResCMR_DSMC: 64 CMR_DSMC
+ SG_ TesterPhysicalResCMR_DSMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1104 DrvStatMonData: 8 CMR_DSMC
+ SG_ DrvEngageLevel_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS
+ SG_ DrvEngageLevel_No_Cnt : 19|4@0+ (1,0) [0|15] "Unitless" IPMA_ADAS
+ SG_ DrvEngageLevel_D_Stat : 13|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ DrvImpLvlConfid_D_Stat : 39|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ DrvImpairLvl_D_Stat : 23|4@0+ (1,0) [0|15] "SED" IPMA_ADAS
+ SG_ DrvEngLvlConfid_D_Stat : 10|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ DrvCamPassIR_D_Stat : 36|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ DrvCamera_D_Stat : 15|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ DrvCamDrvIR_D_Stat : 1|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ DrvAttentZone_D_Stat : 5|4@0+ (1,0) [0|15] "SED" IPMA_ADAS
+ SG_ DrvAlertSt_D_Stat : 7|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+
+BO_ 1503 CMR_DSMC_AutoSar_NetwrkMgt: 8 CMR_DSMC
+ SG_ CMR_DSMC_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_GWNMProxY : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_AutoSarNMReserved : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_AutoSarNMReserve4 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_AutoSarNMReserve3 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_AutoSarNMReserve2 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CMR_DSMC_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+
+BO_ 2610995416 PARSEDPhysGWM_ECGtoABS: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoABS : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC
+
+BO_ 2612043992 PARSEDPushFcGWM_ECGtoABS: 8 GWM
+ SG_ PARSEDPhysGWM_ECG2toABS : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC
+
+BO_ 2609946840 OTAPhysGWM_ECGtoABS: 8 GWM
+ SG_ OTAPhysGWM_ECGtoABS : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC
+
+BO_ 2611175464 PARSEDPhysABStoGWM_ECG: 8 ABS_ESC
+ SG_ PARSEDPhysABStoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "Unitless" GWM
+
+BO_ 2612224040 PARSEDPushABStoGWM_ECG: 8 ABS_ESC
+ SG_ PARSEDPhysABS2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126888 OTAPhysABStoGWM_ECG: 8 ABS_ESC
+ SG_ OTAPhysABStoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610988248 PARSEDPhysGWM_ECGtoIPMA: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoIPMA : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 2609939672 OTAPhysGWM_ECGtoIPMA: 8 GWM
+ SG_ OTAPhysGWM_ECGtoIPMA : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS
+
+BO_ 1114 TrailerAid_Data_FD1: 8 GWM
+ SG_ TrailCtlSwtch_B_Stat2 : 16|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ TrlBrkInitOut_D_Rq : 60|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 1116 TrailerAid_Data3_FD1: 8 GWM
+ SG_ TrlrAidSetup_D2_Rq : 4|4@0+ (1,0) [0|15] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrAidEnbl_D2_Rq : 7|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrTrgtToBmpr_L_Actl : 38|7@0+ (0.0127,0) [0|1.6129] "meter" IPMA_ADAS
+ SG_ TrlrTrgtPtrnId_No_Mem : 45|6@0+ (1,0) [0|63] "unitless" IPMA_ADAS
+ SG_ TrlrRvrseCancl_B_Rq : 0|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrIdType_D_Stat : 51|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrId_No_Actl : 55|4@0+ (1,0) [0|15] "unitless" IPMA_ADAS,PSCM
+ SG_ TrlrBallToBmpr_L_Actl : 22|7@0+ (0.0127,0) [0|1.6129] "meter" IPMA_ADAS,PSCM
+ SG_ TrlrAxleToBmpr_L_Actl : 31|9@0+ (0.0254,0) [0|12.9794] "meter" IPMA_ADAS,PSCM
+ SG_ TrlrAnOffstDir_D_Mem : 47|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM
+ SG_ TrlrAnOffst_An_Mem : 15|9@0+ (0.1,0) [0|51.1] "degrees" IPMA_ADAS
+ SG_ TrlrTrgtOffst_L_Actl : 63|7@0+ (0.0127,0) [0|1.6129] "meter" IPMA_ADAS
+
+BO_ 2611175457 PARSEDPhysIPMAtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysIPMAtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224033 PARSEDPushIPMAtoGWM_ECG: 8 IPMA_ADAS
+ SG_ PARSEDPhysIPMA2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126881 OTAPhysIPMAtoGWM_ECG: 8 IPMA_ADAS
+ SG_ OTAPhysIPMAtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 1085 Low_Voltage_Power_Data_FD1: 8 PCM
+ SG_ ULoRgenTestMde_B_Stat : 50|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwSrcULoOvrTe_B_Actl : 7|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwSrcULoFalt_D_Stat : 5|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PwSrcULoDcnnt_B_Stat : 3|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwSrcULo_Pc_Mx : 31|8@0+ (0.4,0) [0|101.6] "%" GWM
+ SG_ PwSrcULoComm_B_Falt : 2|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwSrcULo_I_Mx : 23|8@0+ (1,0) [0|254] "ampere" PCM_HEV,GWM
+ SG_ PwSrcULo_I_Actl : 15|8@0+ (1,0) [0|254] "ampere" PCM_HEV,GWM
+
+BO_ 791 Cluster_HEV_Data8_FD1: 8 GWM
+ SG_ EngAirFilt_B_RqReset : 48|1@0+ (1,0) [0|1] "SED" ECM_Diesel
+ SG_ GpsElMdeSel_B_Rq : 50|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ LongTermReset_B_Rq : 49|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DrvEffLvl_No_Stat : 61|6@0+ (1,0) [0|61] "unitless" Vector__XXX
+ SG_ ConsAvgTrip_Fe_Dsply : 31|24@0+ (0.0001,0) [0|1677.7215] "litre/100km" Vector__XXX
+
+BO_ 2610970840 PARSEDPhysGWM_ECGtoPCM: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoPCM : 7|29@0+ (1,0) [0|536870911] "unitless" ECM_Diesel,PCM_HEV,PCM
+
+BO_ 2609922264 OTAPhysGWM_ECGtoPCM: 8 GWM
+ SG_ OTAPhysGWM_ECGtoPCM : 7|29@0+ (1,0) [0|536870911] "unitless" ECM_Diesel,PCM_HEV,PCM
+
+BO_ 868 BattRgenLo_4_FD1: 8 GWM
+ SG_ BattRgenLoStat_D_Qlty : 25|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM
+ SG_ BattRgenLoSoc_Pc_Actl : 23|7@0+ (1,0) [0|100] "percent" PCM_HEV,PCM
+ SG_ BattRgenLoPulse_U_Pred : 15|8@0+ (0.0625,0) [0|15.9375] "volt" PCM_HEV,PCM
+ SG_ BattRgenLoPrtct_B_Stat : 39|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM
+ SG_ BattRgenLoDChrg_D_Stat : 27|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM
+ SG_ BattRgenLoDchrg_B_Rq : 28|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM
+ SG_ BattRgenLoChrg_D_Stat : 30|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM
+ SG_ BattRgenLoChrg_B_Rq : 31|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM
+ SG_ BattRgenLo_T_Est : 7|8@0+ (8,0) [0|2040] "second" PCM_HEV,PCM
+ SG_ BattRgenLo_B_Falt : 16|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM
+
+BO_ 867 BattRgenLo_3_FD1: 8 GWM
+ SG_ BattRgenLoBalnc_B_Rq : 16|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM
+ SG_ BattRgenLo_Te_Hi : 55|8@0+ (1,-20) [-20|235] "degC" PCM_HEV,PCM
+ SG_ BattRgenLo_Te_Actl : 47|8@0+ (1,-60) [-60|194] "degC" PCM_HEV,PCM
+ SG_ BattRgenLo_R_Actl : 31|9@0+ (0.0625,0) [0|31.9375] "milliohm" PCM_HEV,PCM
+ SG_ BattRgenLo_AhRide_Actl : 15|15@0+ (0.0078125,-100) [-100|155.9921875] "amperehour" PCM_HEV,PCM
+ SG_ BattRgenLo_Ah_Actl : 7|8@0+ (0.1,0) [0|25.5] "amperehour" PCM_HEV,PCM
+
+BO_ 866 BattRgenLo_2_FD1: 8 GWM
+ SG_ BattRgenLoOpen_U_Actl : 55|9@0+ (0.025,8.5) [8.5|21.275] "volt" PCM_HEV,PCM
+ SG_ BattRgenLoDchrg_U_Mn : 39|9@0+ (0.025,4) [4|16.775] "volt" PCM_HEV,PCM
+ SG_ BattRgenLoDchrg_I_Mx : 31|8@0+ (2,0) [0|510] "ampere" PCM_HEV,PCM
+ SG_ BattRgenLoChrg_U_Mx : 15|9@0+ (0.025,10.6) [10.6|23.375] "volt" PCM_HEV,PCM
+ SG_ BattRgenLoChrg_I_Mx : 7|8@0+ (2,0) [0|510] "ampere" PCM_HEV,PCM
+
+BO_ 865 BattRgenLo_1_FD1: 8 GWM
+ SG_ BattRgenLo_U_Actl : 23|11@0+ (0.015625,0) [0|31.96875] "volt" PCM_HEV,PCM
+ SG_ BattRgenLo_I_Actl : 7|16@0+ (0.015625,-512) [-512|511.96875] "ampere" PCM_HEV,PCM
+
+BO_ 2611175440 PARSEDPhysPCMtoGWM_ECG: 8 PCM
+ SG_ PARSEDPhysPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126864 OTAPhysPCMtoGWM_ECG: 8 PCM
+ SG_ OTAPhysPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2611175441 PARSEDHPCMtoGWM_ECG_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ PARSEDPhysHPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2612224017 PARSEDPushSOBDMCtoGWM_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ PARSEDPhysHPCM2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 2610126865 OTAPhysSOBDMCtoGWM_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ OTAPhysHPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM
+
+BO_ 1679 SOBDMC_RapidData_Resp4_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ UUDTSOBDMCResponse4 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1678 SOBDMC_RapidData_Resp3_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ UUDTSOBDMCResponse3 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1677 SOBDMC_RapidData_Resp2_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ UUDTSOBDMCResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1676 SOBDMC_RapidData_Resp1_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ UUDTSOBDMCResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1445 SOBDMC_AutoSar_NetMgmt_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ SOBDMC_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ SOBDMC_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+
+BO_ 1144 MHT_EV_Wakeup_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ WakeAlarm0_T_Rq : 7|15@0+ (1,0) [0|32767] "minute" GWM
+ SG_ WakeAlarm0_B_Typ : 21|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PreCondBatt_B_Actl : 32|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HtrnDcdcDis_B_Rq : 26|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgNowEvnt_B_Stat : 22|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CabinDrvSustn_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BattChrgTrgtSoC_D_Rq : 35|3@0+ (1,0) [0|7] "Percent" GWM
+ SG_ CabnEvapSovFront_B_Rq : 38|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HeatCoreSovRear_B_Rq : 36|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BattChlrSov_B_Rq : 39|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CabnEvapSovRear_B_Rq : 37|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BrkAppl_D_RqPt : 25|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ HtrnCnnctPwr_B_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PtcHtr_D_Stat : 18|2@0+ (1,0) [0|3] "SED" GWM,PCM_HEV
+ SG_ HtrnClntFlw_D_Rq : 20|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BattTracDrvSustn_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BattTracClntVlv_B_Rq : 47|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 1141 Cluster_HEV_Data9_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ OfbChrgSetSync_D_Stat : 31|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PtRmtRprt_D_Rq : 59|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ MtrTrac2_Tq_Actl : 29|12@0+ (1,-2047) [-2047|2048] "Nm" GWM
+ SG_ NtfctnConflict1_D_Rq : 53|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 1140 Cluster_HEV_Data7_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ RgenEvntLvl_Pc_Dsply : 9|10@0+ (0.1,0) [0|102.1] "percent" GWM
+ SG_ BrkEvntComplt_B_Dsply : 31|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PreCondStat_D_Dsply : 12|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 1139 GWM_HPCM_i_FrP11_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ActChrgStrtYr_No2_Actl : 7|7@0+ (1,2017) [2017|2144] "year" GWM
+ SG_ BattChrgTrgtLMax_T_Est : 10|11@0+ (1,0) [0|2045] "minute" GWM
+ SG_ ActChrgStrtYr_No_Actl : 60|5@0+ (1,2010) [2010|2040] "year" GWM
+ SG_ ActChrgStrtMin_No_Actl : 29|6@0+ (1,0) [0|61] "minute" GWM
+ SG_ ActChrgStrtHr_No_Actl : 36|5@0+ (1,0) [0|29] "hour" GWM
+ SG_ ActChrgStrtDay_No_Actl : 44|5@0+ (1,1) [1|31] "days" GWM
+ SG_ ActChrgStrMnth_No_Actl : 51|4@0+ (1,1) [1|15] "month" GWM
+
+BO_ 1138 GWM_HPCM_i_FrP10_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ActChrgEndYr_No2_Actl : 7|7@0+ (1,2017) [2017|2144] "year" GWM
+ SG_ BattChrgTrgtLMin_T_Est : 10|11@0+ (1,0) [0|2045] "minute" GWM
+ SG_ ActChrgEndYr_No_Actl : 60|5@0+ (1,2010) [2010|2040] "year" GWM
+ SG_ ActChrgEndMnth_No_Actl : 51|4@0+ (1,1) [1|15] "month" GWM
+ SG_ ActChrgEndMin_No_Actl : 29|6@0+ (1,0) [0|61] "minute" GWM
+ SG_ ActChrgEndHr_No_Actl : 36|5@0+ (1,0) [0|29] "hour" GWM
+ SG_ ActChrgEndDay_No_Actl : 44|5@0+ (1,1) [1|31] "days" GWM
+
+BO_ 1089 MtrTracData_1_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ Mtr2Aout_W_ActlMntr : 45|10@0+ (6.28,-3209) [-3209|3209.16] "radians/sec" GWM
+ SG_ Inv1_Te_Actl : 63|8@0+ (1,-40) [-40|213] "degC" GWM
+ SG_ MtrTrac2Coil_Te_Actl : 23|8@0+ (1,-40) [-40|213] "degC" GWM
+ SG_ MtrTrac2_U_Actl : 39|10@0+ (1,0) [0|1023] "volt" GWM
+ SG_ MtrTrac2Falt_B_Stat : 50|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ MtrTrac2TeAlrm_B_Stat : 49|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ Mtr2CntlTeAlrm_B_Stat : 51|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ MtrTrac2Inv_Te_Actl : 31|8@0+ (1,-40) [-40|213] "degC" GWM
+ SG_ MtrTrac2_I_Actl : 7|16@0+ (0.1,-1000) [-1000|5553.4] "ampere" GWM
+
+BO_ 1088 PreCond_Hev_Data1_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ChrgTMatch_B_Stat : 55|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgStat_D2_Dsply : 7|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ HvacPrecondRecirc_D_Rq : 63|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ HvacPrecondMode2_D_Rq : 51|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ HvacPrecondBlwr2_D_Rq : 61|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ HvacPrecondAC_D_Rq : 57|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ HvacPrecond_Te_Rq : 44|5@0+ (0.5,14.5) [14.5|30] "deg C" GWM
+ SG_ BattChrgInhbt_D_Rq : 53|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 1040 AC_Compressor_Req_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ElCmprEnbl_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV
+ SG_ ElCmpr_N_Rq : 15|8@0+ (50,0) [0|12750] "RPM" GWM
+
+BO_ 1016 GoTimeSettings_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ChrgGoTElement_B_Dsply : 27|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocIdCurnt_D_Uns : 31|4@0+ (1,0) [0|15] "unitless" GWM
+ SG_ ChrgGoTTouchEnbl_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgGoTTouch_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgGoTPrcond_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ChrgGoTNext_D_Stat : 19|4@0+ (1,0) [0|15] "Unitless" GWM
+ SG_ ChrgGoTMnte_D_Stat : 23|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ ChrgGoTHr_T_Stat : 15|5@0+ (1,0) [0|29] "hour" GWM
+ SG_ ChrgGoTExtHtrEnbl_B_Rq : 1|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgGoTExtHtr_B_Stat : 2|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgGoTElement_D_Stat : 6|4@0+ (1,0) [0|15] "Unitless" GWM
+ SG_ ChrgGoTAllOn_B_Stat : 7|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 1013 ChargeSettings_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ChrgToPcWkndSav_D_Stat : 60|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ChrgToPcWkdySav_D_Stat : 63|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ChrgProgIdSaved_D_Stat : 51|4@0+ (1,0) [0|15] "Unitless" GWM
+ SG_ ChrgNowEnbl_B_Saved : 56|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocIdUnsAck_B_Stat : 57|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocIdCurnt_D_Sav : 55|4@0+ (1,0) [0|15] "unitless" GWM
+ SG_ ChrgPrflWknd_No_Actl : 31|24@0+ (1,0) [0|16777215] "unitless" GWM
+ SG_ ChrgPrflWkdy_No_Actl : 7|24@0+ (1,0) [0|16777215] "unitless" GWM
+
+BO_ 1012 Saved_Charge_Location_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ ChrgNowCurnt_B_Dsply : 58|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocSaved_B_Dsply : 57|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocLongPostv_B_Sav : 59|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocLongFrct_An_Sav : 47|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM
+ SG_ ChrgLocLongDeg_An_Sav : 39|8@0+ (1,0) [0|255] "degrees" GWM
+ SG_ ChrgLocLattPostv_B_Sav : 24|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocLattFrct_An_Sav : 7|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM
+ SG_ ChrgLocLattDeg_An_Sav : 31|7@0+ (1,0) [0|127] "unitless" GWM
+ SG_ ChrgLocId_D_Sav : 19|4@0+ (1,0) [0|15] "unitless" GWM
+
+BO_ 1011 Unsaved_Charge_LocationFD1: 8 SOBDMC_HPCM_FD1
+ SG_ ChrgLocLongPostv_B_Uns : 59|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocLongFrct_An_Uns : 47|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM
+ SG_ ChrgLocLongDeg_An_Uns : 39|8@0+ (1,0) [0|255] "degrees" GWM
+ SG_ ChrgLocLattPostv_B_Uns : 24|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ChrgLocLattFrct_An_Uns : 7|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM
+ SG_ ChrgLocLattDeg_An_Uns : 31|7@0+ (1,0) [0|127] "unitless" GWM
+ SG_ ChrgLocId_D_Uns : 19|4@0+ (1,0) [0|15] "unitless" GWM
+
+BO_ 871 Cluster_HEV_Data4_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ BattElecPerf_D_Actl : 55|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ BattChrgTrgtLPt_T_Est : 2|11@0+ (1,0) [0|2045] "minute" GWM
+ SG_ BattChrgTrgSocPt_T_Est : 18|11@0+ (1,0) [0|2045] "minute" GWM
+ SG_ BattChrgCmpltPt_T_Est : 34|11@0+ (1,0) [0|2045] "minute" GWM
+
+BO_ 786 Cluster_HEV_Data1_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ RgenTrip_Pc_Dsply : 33|10@0+ (0.1,0) [0|102.3] "percent" GWM
+ SG_ RgenTrip_L_Dsply : 55|16@0+ (0.1,0) [0|6553.3] "kilometer" GWM
+ SG_ ChrgStat_D_Dsply : 36|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 72 Global_PATS_Target2_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ immoTarget2Status : 7|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ immoTarget2Data : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" GWM
+ SG_ immoTarget2Cmd : 4|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 912 PowerDist_Data1_FD1: 8 GWM
+ SG_ CabnEvapSovFront_D_Stat : 15|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+ SG_ BattChlrSov_D_Stat : 7|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracClntVlv_D_Stat : 28|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+
+BO_ 874 PowerDistData_2_FD1: 8 GWM
+ SG_ AirCondCluOpen_D_Falt : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ AirCondCluLife_D_Falt : 19|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ AirCondCluGnd_D_Falt : 21|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ AirCondClu_D_Stat : 31|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ AirCondCluBatt_D_Falt : 23|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ BattTracShrtGrnd_D_Falt : 9|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracShrtBatt_D_Falt : 11|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracOpnCirct_D_Falt : 13|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracLifeLim_D_Falt : 15|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattChlrShrtGrnd_D_Falt : 1|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattChlrShrtBatt_D_Falt : 3|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattChlrOpnCirct_D_Falt : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattChlrLifeLim_D_Falt : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracLow_D_Falt : 28|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+
+BO_ 651 TCU_Send_Signals_FD1: 8 GWM
+ SG_ TelematicsSrvc_D_St : 47|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+ SG_ EmgcyCallMute_D_Stat : 39|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ OfbChrgSetSync_D_Rq : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 529 APIM_Request_Signals_5_FD1: 8 GWM
+ SG_ OnbChrgToPcWknd_D_Actl : 2|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1
+ SG_ OnbChrgToPcWkdy_D_Actl : 60|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1
+ SG_ OnbChrgSetNow_D_Rq : 63|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgSetDelete_B_Rq : 3|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgPrflWknd_No_Rq : 39|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1
+ SG_ OnbChrgPrflWkdy_No_Rq : 15|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1
+ SG_ OnbChrgPrflUpdate_B_Rq : 56|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgLocIdUns_B_Rq : 57|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgLocIdTrgt_No_Rq : 7|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1
+
+BO_ 66 Global_PATS_Ctrl_Info2_FD1: 8 GWM
+ SG_ immoControlData_T2 : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" SOBDMC_HPCM_FD1
+ SG_ immoControlCmd_T2 : 7|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+
+BO_ 2610971864 PARSEDPhysGWMtoSOBDMC_FD1: 8 GWM
+ SG_ PARSEDPhysGWM_ECGtoHPCM : 7|29@0+ (1,0) [0|536870911] "unitless" SOBDMC_HPCM_FD1
+
+BO_ 2612002008 PARSEDFuncGWM_ECG_FD1: 8 GWM
+ SG_ PARSEDFuncGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM_HEV,PCM,SOBDMC_HPCM_FD1
+
+BO_ 2609923288 OTAPhysGWM_ECGtoSOBDMC_FD1: 8 GWM
+ SG_ OTAPhysGWM_ECGtoHPCM : 7|29@0+ (1,0) [0|536870911] "unitless" SOBDMC_HPCM_FD1
+
+BO_ 2610953432 OTAFuncGWM_ECG_FD1: 8 GWM
+ SG_ OTAFuncGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM_HEV,PCM,SOBDMC_HPCM_FD1
+
+BO_ 2022 TesterPhysicalReqSOBDMC_FD: 64 TSTR
+ SG_ TesterPhysicalReqSOBDMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" SOBDMC_HPCM_FD1
+
+BO_ 1124 APIMGPS_Data_Nav_3_FD1: 8 GWM
+ SG_ GPS_Vdop : 63|5@0+ (0.2,0) [0|5.8] "unitless" IPMA_ADAS
+ SG_ GPS_Speed : 47|8@0+ (1,0) [0|253] "MPH" Vector__XXX
+ SG_ GPS_Sat_num_in_view : 7|5@0+ (1,0) [0|29] "unitless" SOBDMC_HPCM_FD1
+ SG_ GPS_MSL_altitude : 15|12@0+ (10,-20460) [-20460|20470] "feet" Vector__XXX
+ SG_ GPS_Heading : 31|16@0+ (0.01,0) [0|655.33] "Degrees" IPMA_ADAS
+ SG_ GPS_Hdop : 55|5@0+ (0.2,0) [0|5.8] "unitless" IPMA_ADAS
+ SG_ GPS_dimension : 2|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1119 Voltage_Power_Data2_FD1: 8 GWM
+ SG_ CoolFanDcdc_D_Rq : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ DcdcClntFlw_D_Rq : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+
+BO_ 132 GlobalClock_Data_FD1: 8 GWM
+ SG_ GlblClkYr_No_Actl : 7|8@0+ (1,2000) [2000|2255] "year" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GlblClkScnd_No_Actl : 47|8@0+ (1,0) [0|255] "second" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GlblClkMnte_No_Actl : 39|8@0+ (1,0) [0|255] "minute" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GlblClkHr_No_Actl : 55|8@0+ (1,0) [0|255] "hour" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GlblClkDay_No_Actl : 23|16@0+ (1,0) [0|65535] "julian day" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS
+
+BO_ 1990 TesterPhysicalReqSODR: 64 TSTR
+ SG_ TesterPhysicalReqSODR : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS
+
+BO_ 1892 TesterPhysicalReqCCM: 64 TSTR
+ SG_ TesterPhysicalReqCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS
+
+BO_ 1798 TesterPhysicalReqIPMA: 64 TSTR
+ SG_ TesterPhysicalReqIPMA : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS
+
+BO_ 1123 APIMGPS_Data_Nav_2_FD1: 8 GWM
+ SG_ GpsUtcYr_No_Actl : 55|5@0+ (1,2010) [2010|2040] "Year" IPMA_ADAS
+ SG_ GpsUtcMnth_No_Actl : 47|4@0+ (1,1) [1|15] "Month" IPMA_ADAS
+ SG_ GpsUtcDay_No_Actl : 37|5@0+ (1,1) [1|32] "Day" IPMA_ADAS
+ SG_ GPS_UTC_seconds : 23|6@0+ (1,0) [0|59] "seconds" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GPS_UTC_minutes : 15|6@0+ (1,0) [0|59] "Minutes" IPMA_ADAS
+ SG_ GPS_UTC_hours : 7|5@0+ (1,0) [0|23] "Hours" IPMA_ADAS
+ SG_ GPS_Pdop : 31|5@0+ (0.2,0) [0|5.8] "unitless" IPMA_ADAS
+ SG_ GPS_Compass_direction : 26|4@0+ (1,0) [0|15] "SED" IPMA_ADAS
+ SG_ GPS_Actual_vs_Infer_pos : 38|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ Gps_B_Falt : 2|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS
+
+BO_ 1122 APIMGPS_Data_Nav_1_FD1: 8 GWM
+ SG_ GpsHsphLongEast_D_Actl : 9|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,SOBDMC_HPCM_FD1
+ SG_ GpsHsphLattSth_D_Actl : 25|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,SOBDMC_HPCM_FD1
+ SG_ GPS_Longitude_Minutes : 46|6@0+ (1,0) [0|61] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GPS_Longitude_Min_dec : 55|14@0+ (0.0001,0) [0|1.6381] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GPS_Longitude_Degrees : 39|9@0+ (1,-179) [-179|330] "Degrees" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GPS_Latitude_Minutes : 15|6@0+ (1,0) [0|61] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GPS_Latitude_Min_dec : 23|14@0+ (0.0001,0) [0|1.6381] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS
+ SG_ GPS_Latitude_Degrees : 7|8@0+ (1,-89) [-89|164] "Degrees" SOBDMC_HPCM_FD1,IPMA_ADAS
+
+BO_ 1003 Personality_BCM2_Data_FD1: 8 GWM
+ SG_ PersRecallSrc_D_Actl : 63|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ Pers4Key_D_Stat : 49|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Pers3Key_D_Stat : 41|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Pers2Key_D_Stat : 43|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Pers1Key_D_Stat : 12|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ EmPrflNo_D_Stat : 52|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ EmPrflKeyAssoc_D_Stat : 55|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ VehKeyActv_D_Stat : 47|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ PersNoPos_D_Actl : 18|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ PersSetupRestr_D_Actl : 21|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PersSetupAccessCtrl : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PersSetup_No_Actl : 31|16@0+ (1,0) [0|65535] "Number" Vector__XXX
+ SG_ PersConflict_D_Actl : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AssocConfirm_D_Actl : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ RecallEvent_No_Cnt : 7|8@0+ (1,0) [0|255] "Counts" IPMA_ADAS
+ SG_ PersNo_D_Actl : 10|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS
+
+BO_ 994 Personality_APIM_Data_FD1: 8 GWM
+ SG_ PersStore_D_Rq : 36|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ Pers4OptIn_B_Stats : 43|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Pers3OptIn_B_Stats : 33|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Pers2OptIn_B_Stats : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Pers1OptIn_B_Stats : 44|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CtrStkPersIndex_D_Actl : 39|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS
+ SG_ CtrStkFeatNoActl : 23|16@0+ (1,0) [0|65535] "Undefined" ABS_ESC,IPMA_ADAS
+ SG_ CtrStkFeatConfigActl : 7|16@0+ (1,0) [0|65535] "Undefined" ABS_ESC,IPMA_ADAS
+ SG_ CtrStkDsplyOp_D_Rq : 47|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS
+
+BO_ 778 ParkAid_Aud_Warn_CmdM_FD1: 8 GWM
+ SG_ PrkAidFront_D_RqDrv : 5|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ PrkAidAcsyRear_D_RqDrv : 13|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ PrkAidAcsyFront_D_RqDrv : 15|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ Cta_D_Rq : 1|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ PrkAidRear_D_RqDrv : 3|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ SteEffort_D_Rq : 10|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ Sod_D_Rq : 7|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+
+BO_ 549 IPC_Infotainment_FD1: 8 GWM
+ SG_ Veh_V2_Dsply : 39|9@0+ (1,0) [0|511] "unitless" IPMA_ADAS
+ SG_ IPC_MyKeyVolLimit_St : 9|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ HdcOn_B_Rq : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ IPC_Attn_Info_Audio : 4|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ BeltminderAudioMute : 6|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Power_Up_Chime_Modules : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Chime_Source : 15|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ IPC_New_Attn_Event : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 551 APIM_Request_Signals_1_FD1: 8 GWM
+ SG_ PmCabnLvl_D_Stat : 36|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ PmCabn_D_Stat : 38|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Cntr_Plg_Mode_Cmd : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ChrgCrdLckEnbl_B_Stat : 47|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PwRnngBoardT_D_Rq : 25|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PwRnngBoardSwtch_D_Rq : 27|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PwRnngBoardMde_D_Rq : 29|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Btt_L_Actl2 : 55|7@0+ (0.1,0) [0|12.5] "meter" IPMA_ADAS
+ SG_ Rba_D_Rq : 31|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ EmPrflNo_D_Rq : 61|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ EmPrflButtnAssoc_D_Rq : 33|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ EmPrflKeyAssoc_D_Rq : 46|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ Em_D_Stat : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ChrgOvrdExitScrn_D_Rq : 58|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 1010 IPMA_Data3: 8 IPMA_ADAS
+ SG_ MbdblActv_B_RqAdas : 48|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CbdblActv_B_RqAdas : 49|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AdbUrbanArea_B_Stat : 40|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LightRng_L_Max : 55|6@0+ (2,0) [0|126] "meter" GWM
+ SG_ LightPathOffst_L_Actl : 31|10@0+ (0.01,-5.12) [-5.12|5.11] "meter" GWM
+ SG_ LightPath_An_Actl : 12|11@0+ (0.0005,-0.5) [-0.5|0.5235] "radians" GWM
+ SG_ LightCurv_NoRate_Actl : 37|13@0+ (2.5E-007,-0.001024) [-0.001024|0.00102375] "1/meter" GWM
+ SG_ LightCurv_No_Actl : 7|11@0+ (2E-005,-0.02) [-0.02|0.02094] "1/meter" GWM
+
+BO_ 1070 Battery_Mgmt_24V_FD1: 8 GWM
+ SG_ BattULo24_D_Falt : 55|2@0+ (1,0) [0|3] "SED" PCM
+ SG_ BattULo24_Te_Actl : 47|7@0+ (1,-40) [-40|86] "degC" PCM
+ SG_ BattULo24State_D_Qlty : 25|2@0+ (1,0) [0|3] "SED" PCM
+ SG_ BattULo24Soc_Pc_Actl : 39|7@0+ (1,0) [0|127] "percent" PCM
+ SG_ BattULo24_I_Actl : 23|14@0+ (0.0625,-512) [-512|511.875] "ampere" PCM
+ SG_ BattULo24_B_Falt : 8|1@0+ (1,0) [0|1] "SED" PCM
+ SG_ BattULo24_Ah_DeltaRide : 7|15@0+ (0.0078125,-100) [-100|155.9921875] "amperehour" PCM
+
+BO_ 1186 Driveline_Data_2: 8 TCCM
+ SG_ SelDrvMdeAwd2_D_Stat : 31|5@0+ (1,0) [0|31] "SED" ABS_ESC,GWM
+ SG_ RearDiffLckMsg_D_Rq : 20|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ RearDiffLckLamp_D_Rq : 11|2@0+ (1,0) [0|3] "SED" VDM,GWM,ABS_ESC
+ SG_ RearDiffLck_Tq_Actl : 7|12@0+ (1,0) [0|4093] "Nm" ABS_ESC,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ RearDiffFalt_D_Stat : 23|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+ SG_ LsdSrvcRqd_B_Rq : 21|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 611 Driveline_Data_1: 8 TCCM
+ SG_ AwdSys_D_Stat : 27|2@0+ (1,0) [0|3] "SED" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ AwdStat_D_RqDsply : 63|5@0+ (1,0) [0|31] "SED" TCM_DSL,ABS_ESC,GWM
+ SG_ AwdLck_D_Stat : 31|4@0+ (1,0) [0|15] "SED" TCM_DSL,GWM,ABS_ESC
+ SG_ AwdSrvcRqd_B_Rq : 0|1@0+ (1,0) [0|1] "SED" GWM,PCM,PCM_HEV,TCM_DSL,ABS_ESC
+ SG_ NtrlTowAvail_B_Stat : 4|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AwdLck_Tq_Rq : 15|12@0+ (1,0) [0|4093] "Nm" PCM_HEV,GWM,ABS_ESC
+ SG_ TrnAout_Tq_RqMx : 47|13@0+ (1,-1250) [-1250|6941] "Nm" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ AwdOffRoadMode_D_Stats : 25|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ AwdLoLamp_D_RqDsply : 35|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AwdHiLamp_D_RqDsply : 19|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC
+ SG_ AwdAutoLamp_D_RqDsply : 17|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC
+ SG_ Awd2wdLamp_D_RqDsply : 2|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AwdRnge_D_Actl : 7|3@0+ (1,0) [0|7] "SED" VDM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,ABS_ESC,GWM,IPMA_ADAS
+
+BO_ 1461 PSCM_AutoSar_NetwrkMgmt: 8 PSCM
+ SG_ PSCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+ SG_ PSCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC
+
+BO_ 1047 TrailerAid_Data2: 8 PSCM
+ SG_ TrlrAnOffst_An2_Calc : 39|8@0+ (0.5,-64) [-64|63.5] "degrees" IPMA_ADAS
+ SG_ TrlrAn_An_WarnCalc : 28|5@0+ (1,0) [0|31] "degrees" IPMA_ADAS
+ SG_ TrlrAn_An_MxCalc : 55|7@0+ (1,0) [0|127] "degrees" IPMA_ADAS
+ SG_ TrlrAidTrlrId_No_Rq : 63|4@0+ (1,0) [0|15] "unitless" GWM
+ SG_ TrlrAidTrgtId_No_Rq : 44|5@0+ (1,0) [0|31] "unitless" IPMA_ADAS
+ SG_ TrlrAidSetup_D2_Stat : 47|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ TrlrAidEnbl_D2_Stat : 31|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS,GWM,PCM,ECM_Diesel
+ SG_ TrlrAidMsgTxt_D2_Rq : 14|6@0+ (1,0) [0|63] "SED" IPMA_ADAS,GWM,ABS_ESC
+ SG_ EsaOn_B_Stat : 23|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HitchToTrlrAxle_L_Calc : 7|9@0+ (0.0254,0) [0|12.9794] "meter" IPMA_ADAS
+ SG_ SelDrvMdeSte_D_Stat : 17|2@0+ (1,0) [0|3] "SED" ABS_ESC
+
+BO_ 972 Lane_Assist_Data3_FD1: 8 PSCM
+ SG_ LatCtlSte_D_Stat : 18|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,GWM
+ SG_ LatCtlLim_D_Stat : 33|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ LatCtlCpblty_D_Stat : 39|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ LatCtlCpbltyDStat_No_Cnt : 37|4@0+ (1,0) [0|15] "Unitless" IPMA_ADAS,GWM
+ SG_ LatCtlCpbltyDStat_No_Cs : 47|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM
+ SG_ TrlrAn_An_TrgtCalc : 31|8@0+ (1,-128) [-128|127] "degrees" IPMA_ADAS
+ SG_ LsmcBrkDecelEnbl_D_Rq : 1|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ TjaHandsOnCnfdnc_B_Est : 3|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ LaHandsOff_B_Actl : 7|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ LaActDeny_B_Actl : 6|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ LaActAvail_D_Actl : 5|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ LsmcBrk_Tq_Rq : 15|13@0+ (4,0) [0|32764] "Nm" ABS_ESC
+
+BO_ 130 EPAS_INFO: 8 PSCM
+ SG_ TrlrHitchLamp_D_Rqst : 24|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ VehVTrlrAid_B_Rq : 25|1@0+ (1,0) [0|1] "SED" PCM_HEV,GWM,ECM_Diesel,PCM
+ SG_ Veh_V_RqMxTrlrAid : 63|8@0+ (0.1,0) [0|25.5] "km/h" PCM_HEV,GWM,ECM_Diesel,PCM
+ SG_ DrvSteActv_B_Stat : 10|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ DrvSte_Tq_Actl : 47|8@0+ (0.0625,-8) [-8|7.8125] "Nm" GWM,ABS_ESC
+ SG_ SteMdule_D_Stat : 55|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ SteMdule_U_Meas : 39|8@0+ (0.05,6) [6|18.7] "Volts" GWM
+ SG_ SteMdule_I_Est : 21|12@0+ (0.05,-64) [-64|140.7] "Amps" GWM
+ SG_ EPAS_Failure : 9|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ SteeringColumnTorque : 7|8@0+ (0.0625,-8) [-8|7.8125] "Nm" GWM,IPMA_ADAS,ABS_ESC
+ SG_ SAPPAngleControlStat6 : 15|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ SAPPAngleControlStat5 : 14|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ SAPPAngleControlStat4 : 13|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ SAPPAngleControlStat3 : 12|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ SAPPAngleControlStat2 : 11|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ SAPPAngleControlStat1 : 23|2@0+ (1,0) [0|3] "SED" GWM,IPMA_ADAS
+
+BO_ 126 SteeringPinion_Data: 8 PSCM
+ SG_ StePw_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM
+ SG_ StePinRelInit_An_Sns : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM
+ SG_ StePinCompAnEst_D_Qf : 43|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM
+ SG_ StePinComp_An_Est : 22|15@0+ (0.1,-1600) [-1600|1676.7] "degrees" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM
+ SG_ StePinAn_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" VDM,ABS_ESC,TCCM,GWM
+ SG_ StePinAn_No_Cnt : 47|4@0+ (1,0) [0|15] "unitless" VDM,TCCM,GWM,ABS_ESC
+
+BO_ 133 SteeringPinion_Data_Alt: 8 PSCM
+ SG_ StePw_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM
+ SG_ StePinRelInit_An_Sns : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM
+ SG_ StePinCompAnEst_D_Qf : 43|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM
+ SG_ StePinComp_An_Est : 22|15@0+ (0.1,-1600) [-1600|1676.7] "degrees" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM
+ SG_ StePinAn_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" VDM,ABS_ESC,TCCM,GWM
+ SG_ StePinAn_No_Cnt : 47|4@0+ (1,0) [0|15] "unitless" VDM,TCCM,GWM,ABS_ESC
+
+BO_ 1430 ABS_AutoSar_NetworkMgt: 8 ABS_ESC
+ SG_ ABS_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ABS_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" GWM
+
+BO_ 1200 ABS_BrkBst_Data: 8 ABS_ESC
+ SG_ BrkHold_D_Stat : 34|3@0+ (1,0) [0|7] "SED" ECM_Diesel,GWM,IPMA_ADAS,PCM,PCM_HEV
+ SG_ HsaTrnAout_Tq_Rq : 23|16@0+ (4,-131072) [-131072|131060] "Nm" GWM
+ SG_ BrkBstrVac_P_Actl : 7|7@0+ (8,0) [0|1008] "Millibar" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ YawStabilityIndex : 0|9@0+ (1,-256) [-256|255] "%" VDM,IPMA_ADAS,PSCM,GWM
+ SG_ BrkTot_Tq_RqDrv : 47|13@0+ (4,0) [0|32760] "Nm" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM,TCCM,PSCM
+ SG_ BrkTotTqRqDrv_No_Cnt : 39|4@0+ (1,0) [0|15] "unitless" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ BrkTotTqRqDrv_No_Cs : 63|8@0+ (1,0) [0|255] "unitless" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ HsaStat_D_Dsply : 50|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 1102 SelectDriveModeData2: 8 ABS_ESC
+ SG_ SelDrvMdePos12_D_Stat : 34|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos11_D_Stat : 45|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos10_D_Stat : 55|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos09_D_Stat : 50|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos08_D_Stat : 61|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos07_D_Stat : 39|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos06_D_Stat : 29|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos05_D_Stat : 18|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos04_D_Stat : 23|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos03_D_Stat : 13|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos02_D_Stat : 2|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePos01_D_Stat : 7|5@0+ (1,0) [0|31] "SED" GWM
+
+BO_ 1056 SelectDriveModeData: 8 ABS_ESC
+ SG_ AutoEpbMsgTxt_D_Rq : 58|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ AutoEpbDsply_D_Stat : 37|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AutoEpbButtnOn_B_Stat : 48|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos12_B_Avail : 54|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos11_B_Avail : 55|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos10_B_Avail : 40|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos09_B_Avail : 41|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos08_B_Avail : 42|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos07_B_Avail : 43|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos06_B_Avail : 44|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos05_B_Avail : 45|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos04_B_Avail : 46|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos03_B_Avail : 47|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos02_B_Avail : 32|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SelDrvMdePos01_B_Avail : 24|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ActvDrvMde_D2_Stat : 53|5@0+ (1,0) [0|31] "SED" IPMA_ADAS,GWM
+ SG_ SelDrvMde_D2_Rq : 63|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ SelDrvMdePt_D_Rq : 31|5@0+ (1,0) [0|31] "SED" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ SelDrvMdeMsgTxt_D_Rq : 19|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ SelDrvMde_D_Stat : 26|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AwdMde_D_RqBrk : 35|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 1054 BrakeSysFeatures_3: 8 ABS_ESC
+ SG_ AirDamUp_B_RqBrk : 32|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM_HEV,PCM
+ SG_ RbaBrk_D_Stat : 63|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ SelDrvMdeChassis2_D_Rq : 45|5@0+ (1,0) [0|31] "SED" PSCM,GWM
+ SG_ TrailCtl_D_Stat : 55|3@0+ (1,0) [0|7] "SED" TCCM,PCM,GWM
+ SG_ TrailCtlMsgTxt_D_Rq : 52|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ BrkBstrVac_D_Stat : 18|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ DrvSlipCtlOffLamp_D_Rq : 23|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ DrvSlipCtlMdeMsg_D_Rq : 13|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ AutoHoldMsgTxt_D_Rq : 4|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ CtaBrk_D_Stat : 47|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ SelDrvMdeAwd_D_Rq : 29|5@0+ (1,0) [0|31] "SED" TCCM,GWM
+ SG_ AutoHoldSwMde_B_Ind : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AutoHoldMde_D_Ind : 15|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SelDrvMdeChassis_D_Rq : 39|5@0+ (1,0) [0|31] "SED" VDM,GWM
+ SG_ ApaBrk_D_Stat : 34|2@0+ (1,0) [0|3] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,GWM
+
+BO_ 1046 BrakeSysFeatures_2: 8 ABS_ESC
+ SG_ HsaMde_D_Mem : 33|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BrkBstrVac_B_Rq : 27|1@0+ (1,0) [0|1] "Discrete" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ HdcMde_D_Actl : 31|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ RearDiffLck_Tq2_RqMx : 51|12@0+ (4,0) [0|16376] "Nm" GWM
+ SG_ TRLR_SWAY_EVNT_IN_PROG : 25|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TRLR_SWAY_CONFIG_STAT : 26|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TCMode : 15|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ DrvSlipCtlLamp_D_Rq : 42|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ Abs_B_Falt : 5|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ DrvSlipCtlMde_D_Ind : 44|2@0+ (1,0) [0|3] "SED" TCCM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ DrvAntiLckLamp_D_Rq : 55|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM,IPMA_ADAS
+ SG_ BpedMove_No_Cnt : 3|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel,GWM
+ SG_ StabCtlBrk_B_Avail : 4|1@0+ (1,0) [0|1] "SED" VDM,TCCM,GWM
+ SG_ DrvHdcWarnInfo_D_Rq : 35|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ DrvHdcMsg_D_Rq : 10|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ DrvHdcLampInfo_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BpedMove_D_Actl : 7|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM
+ SG_ ChimeBrk_B_Rq : 14|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BrkLamp_B_Rq : 13|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HILL_DESC_MC : 47|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ RearDiffElckrOpen_B_Rq : 40|1@0+ (1,0) [0|1] "SED" GWM,TCCM
+
+BO_ 1045 BrakeSysFeatures: 8 ABS_ESC
+ SG_ VehStab_D_Stat : 55|4@0+ (1,0) [0|15] "SED" TCCM,PCM_HEV,PCM,GWM
+ SG_ BrkFluidLvl_D_Stat : 17|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ LsmcBrkDecel_D_Stat : 39|3@0+ (1,0) [0|7] "SED" PSCM,GWM
+ SG_ VehYawNonLin_W_Rq : 51|12@0+ (0.03663,-75) [-75|74.92659] "deg/s" ECM_Diesel,GWM
+ SG_ VehYawLin_W_Rq : 35|12@0+ (0.03663,-75) [-75|74.92659] "deg/s" ECM_Diesel,GWM
+ SG_ VehVActlBrk_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM,IPMA_ADAS
+ SG_ Veh_V_ActlBrk : 7|16@0+ (0.01,0) [0|655.35] "kph" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM
+ SG_ VehVActlBrk_No_Cnt : 21|4@0+ (1,0) [0|15] "Unitless" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM,IPMA_ADAS
+ SG_ VehVActlBrk_D_Qf : 23|2@0+ (1,0) [0|3] "SED" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM
+
+BO_ 1044 BrakeSnData_6: 8 ABS_ESC
+ SG_ StePinOffst_An_Est : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" GWM,PSCM
+ SG_ StePinOffst_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" GWM,PSCM
+ SG_ StePinOffst_No_Cnt : 21|4@0+ (1,0) [0|15] "unitless" GWM,PSCM
+ SG_ StePinOffst_D_Stat : 23|2@0+ (1,0) [0|3] "SED" GWM,PSCM
+
+BO_ 1042 TrailerBrakeData: 8 ABS_ESC
+ SG_ VehRol_An_Dsply : 31|7@0+ (1,-64) [-64|61] "degrees" GWM
+ SG_ VehPtch_An_Dsply : 23|7@0+ (1,-64) [-64|61] "degrees" GWM,TCCM
+ SG_ TrlrBrk_Pc_Rq : 14|7@0+ (1,0) [0|127] "percent" GWM
+
+BO_ 535 WheelSpeed: 8 ABS_ESC
+ SG_ WhlRr_W_Meas : 54|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL
+ SG_ WhlRl_W_Meas : 38|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL
+ SG_ WhlFr_W_Meas : 22|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL
+ SG_ WhlFl_W_Meas : 6|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL
+
+BO_ 534 WheelData: 8 ABS_ESC
+ SG_ BrkObdData_No_Actl : 63|8@0+ (1,0) [0|255] "unitless" SOBDMC_HPCM_FD1,GWM
+ SG_ BrkObdIndex_No_Actl : 53|6@0+ (1,0) [0|63] "unitless" SOBDMC_HPCM_FD1,GWM
+ SG_ WhlRotatRr_No_Cnt : 23|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM
+ SG_ WhlDirRr_D_Actl : 33|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ECM_Diesel,PCM_HEV,PSCM
+ SG_ WhlDirRl_D_Actl : 39|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,PSCM,ECM_Diesel,PCM_HEV
+ SG_ WhlDirFr_D_Actl : 37|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ECM_Diesel,PCM_HEV,PSCM
+ SG_ WhlDirFl_D_Actl : 35|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ECM_Diesel,PCM_HEV,PSCM
+ SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM
+ SG_ WhlRotatFr_No_Cnt : 7|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM
+ SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM
+
+BO_ 532 DesiredTorqBrk_2: 8 ABS_ESC
+ SG_ RgenTqFalt_B_Actl : 59|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV
+ SG_ RgenBrkDynoMde_B_Actl : 58|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV
+ SG_ PrplWhlTqRqMn_No_Cs : 55|8@0+ (1,0) [0|255] "Unitless" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ PrplWhlTot_Tq_RqMn : 7|16@0+ (4,-131072) [-131072|131068] "Nm" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ PrplWhlTqRqMn_No_Cnt : 63|4@0+ (1,0) [0|15] "Unitless" GWM,ECM_Diesel,PCM,PCM_HEV
+
+BO_ 531 DesiredTorqBrk: 8 ABS_ESC
+ SG_ VehStop_D_Stat : 28|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM
+ SG_ TracCtlPtActv_B_Actl : 31|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,TCCM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM
+ SG_ LscmbbMntr_B_Err : 17|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LscmbbBrkDis_B_Actl : 19|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LscmbbDeny_B_ActlBrk : 18|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PrkBrkYwLamp_D_Rq : 38|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PrkBrkRedLamp_D_Rq : 30|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ LscmbbBrkDecel_B_Actl : 20|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AbsActv_B_Actl : 45|1@0+ (1,0) [0|1] "SED" VDM,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM
+ SG_ StabCtlBrkActv_B_Actl : 23|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,PCM,PCM_HEV,TCM_DSL,PSCM,TCCM,ECM_Diesel,GWM
+ SG_ CmbbBrkPrchg_B_Actl : 59|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ CmbbBrkDecel_B_Actl : 58|1@0+ (1,0) [0|1] "SED" CMR_DSMC,IPMA_ADAS,GWM
+ SG_ CmbbBaSensInc_B_Actl : 57|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ AccBrkWarm_B_Actl : 63|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ AccBrkTotTqMn_B_Actl : 62|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ AccBrkPrchgActv_B_Actl : 61|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ AccBrkDis_B_Actl : 44|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ AccBrkDeny_B_Actl : 42|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ AccBrkActv_B_Actl : 43|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,ECM_Diesel,GWM
+ SG_ PrplDrgCtlActv_B_Actl : 46|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM
+ SG_ PrplWhlTot_Tq_RqMx : 7|16@0+ (4,-131072) [-131072|131068] "Nm" ECM_Diesel,PCM,PCM_HEV,TCCM,GWM
+ SG_ LscmbbBaSensInc_B_Actl : 21|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CmbbBrkDis_B_Actl : 56|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM,GWM
+ SG_ CmbbDeny_B_ActlBrk : 60|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ CcDis_B_Cmd : 47|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,GWM
+ SG_ VehLongOvrGnd_A_Est : 41|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,IPMA_ADAS,TCCM,GWM
+ SG_ LscmbBrkPrchg_B_Actl : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AccStopActv_B_ActlBrk : 22|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ AccDis_B_ActlEpb : 32|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ PrkBrkMsgTxt_D_Rq : 36|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkBrkStatus : 26|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM
+
+BO_ 136 ActiveFronSteering_Req: 8 ABS_ESC
+ SG_ SteWhlBrkOffst_An_Rq : 7|15@0+ (0.1,-1600) [-1600|1676.5] "degrees" GWM
+ SG_ SteWhlBrkAnRq_No_Cs : 23|8@0+ (1,0) [0|255] "Unitless" GWM
+ SG_ SteWhlBrkAnRq_No_Cnt : 31|4@0+ (1,0) [0|15] "Unitless" GWM
+
+BO_ 125 BrakeSnData_4: 8 ABS_ESC
+ SG_ VehRolComp_W_Actl : 51|12@0+ (0.03663,-75) [-75|74.92659] "degrees/sec" VDM,GWM
+ SG_ VehVertComp_A_Actl : 45|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,PSCM,GWM
+ SG_ BrkTotTqRqArb_No_Cs : 23|8@0+ (1,0) [0|255] "Unitless" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ BrkTotTqRqArb_No_Cnt : 31|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ BrkTot_Tq_RqArb : 4|13@0+ (4,0) [0|32756] "Nm" VDM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM
+ SG_ BrkTot_Tq_Actl : 27|13@0+ (4,0) [0|32756] "Nm" ECM_Diesel,PCM,PCM_HEV,PSCM,GWM,TCCM
+ SG_ HsaStat_D_Actl : 7|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM
+
+BO_ 119 BrakeSnData_3: 8 ABS_ESC
+ SG_ VehTrvlDir_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ VehOverGnd_V_Est : 7|16@0+ (0.01,0) [0|655.33] "kph" VDM,IPMA_ADAS,TCCM,PSCM,GWM
+ SG_ VehLongComp_A_Actl : 49|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM
+ SG_ VehLatComp_A_Actl : 43|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,TCCM,GWM
+ SG_ VehYawComp_W_Actl : 19|12@0+ (0.03663,-75) [-75|74.92659] "deg/s" VDM,TCCM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM
+
+BO_ 118 BrakeSnData_5: 8 ABS_ESC
+ SG_ BrkCtrFnd_B_Stat : 39|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AwdLck_Tq_RqMx : 35|12@0+ (1,0) [0|4095] "Nm" GWM,TCCM
+ SG_ AwdLck_Tq_RqMn : 51|12@0+ (1,0) [0|4095] "Nm" GWM,TCCM
+ SG_ DrvSte_D_Stat : 19|4@0+ (1,0) [0|15] "SED" PSCM,GWM
+ SG_ DrvSte_Tq_Rq : 31|8@0+ (0.0625,-8) [-8|7.8125] "Nm" PSCM,GWM
+ SG_ EmgcyBrkLamp_D_Rq : 21|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ StopLamp_B_RqBrk : 7|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 73 Global_PATS_SubTarget: 8 ABS_ESC
+ SG_ immoSubTarget1Data_T1 : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" ECM_Diesel,GWM,PCM,PCM_HEV
+ SG_ immoSubTarget1Cmd_T1 : 7|3@0+ (1,0) [0|7] "SED" ECM_Diesel,GWM,PCM,PCM_HEV
+
+BO_ 1034 GGCC_Config_Mgmt_ID_1_FD1: 8 GWM
+ SG_ VehicleGGCCData : 7|64@0+ (1,0) [0|1.84467E+019] "mixed" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL
+
+BO_ 1440 TCM_AutoSar_NetworkMgt: 8 TCM_DSL
+ SG_ TCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+
+BO_ 561 TransGearData_2: 8 TCM_DSL
+ SG_ TrnMsgTxt2_D_Rq : 39|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TrnMsgTxt_D_Rq : 23|4@0+ (1,0) [0|15] "SED" GWM
+
+BO_ 330 TransData_3: 8 TCM_DSL
+ SG_ TrnAout_W_ActlUnfilt : 22|15@0+ (0.1,0) [0|3276.5] "rad/s" ECM_Diesel,GWM
+
+BO_ 1090 MtrTrac_Data2_FD1: 8 PCM_HEV
+ SG_ Mtr2State_D_ActlMntr : 31|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ Inv1Ain_I_ActlMntr : 7|15@0+ (0.1,-1000) [-1000|2276.5] "ampere" GWM
+ SG_ HybVehMde_D_ActlMntr : 20|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ChrgStat_D_ActlMntr : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ VehElRnge_L_Dsply : 28|12@0+ (0.1,0) [0|409.3] "kilometer" GWM
+
+BO_ 870 Cluster_HEV_Data3_FD1: 8 PCM_HEV
+ SG_ EngMdeMsgTxt_D_Rq : 12|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ EffRgenThres_Pc_Dsply : 9|10@0+ (0.1,-102.3) [-102.3|0] "percent" GWM
+ SG_ RngPerChrgInst_L_Dsply : 45|12@0+ (0.1,0) [0|409.3] "km" GWM
+
+BO_ 869 Cluster_HEV_Data2: 8 PCM_HEV
+ SG_ PwrFlowTxt_D_Dsply : 21|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ EngOnMsg2_D_Dsply : 54|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ EngOnMsg1_D_Dsply : 38|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ FuelMaintMde_D_Dsply : 23|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ EffWhlLvl2_Pc_Dsply : 17|10@0+ (0.2,-102.2) [-102.2|102.4] "percent" GWM
+ SG_ EffWhlThres_Pc_Dsply : 49|10@0+ (0.1,0) [0|102.3] "percent" GWM
+ SG_ EngPwLvl_Pc_Dsply : 1|10@0+ (0.1,0) [0|102.3] "percent" GWM
+ SG_ EngActv_B_Dsply : 2|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EffWhlThresOn_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 606 HEV_Powertrain_Data8_FD1: 8 PCM_HEV
+ SG_ ElVehLaterMde_D_Stat : 7|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ElVehNowMde_D_Stat : 5|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 374 PowertrainData_10: 8 PCM
+ SG_ GearEngag_D_Actl : 47|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TrnRng_D_Rq : 27|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,PSCM,ECM_Diesel,GWM
+ SG_ TrnPrkSys_D_Actl : 31|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,ECM_Diesel,GWM
+ SG_ GearLvr_D_ActlDrv : 7|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,TCCM,ECM_Diesel,GWM
+ SG_ GearPos_No_Cs : 23|8@0+ (1,0) [0|255] "unitless" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,ECM_Diesel,GWM
+ SG_ GearPos_D_Trg : 15|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,TCCM,ECM_Diesel,GWM
+ SG_ GearPos_No_Cnt : 11|4@0+ (1,0) [0|15] "unitless" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,ECM_Diesel,GWM
+ SG_ TrnIgnOffDly_T_Rq : 39|8@0+ (4,0) [0|1020] "ms" GWM
+ SG_ GearPos_D_Actl : 3|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,PSCM,IPMA_ADAS,ABS_ESC,ECM_Diesel,GWM
+
+BO_ 603 HEV_Powertrain_Data2: 8 PCM_HEV
+ SG_ WhlDirAvgDrv_D_Actl : 6|2@0+ (1,0) [0|3] "SED" ABS_ESC,IPMA_ADAS,GWM
+ SG_ PrplTqMnRgen_B_Actl : 7|1@0+ (1,0) [0|1] "SED" ABS_ESC,GWM
+ SG_ BattTracCnnct_D_Rq : 20|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 602 HEV_Powertrain_Data: 8 PCM_HEV
+ SG_ HtrnWarnLamp_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HybPwLimOn_B_Stat : 7|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwPckTqRdy_B_Dsply : 31|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 1152 HEV_Powertrain_Data6: 8 PCM_HEV
+ SG_ BattTracDiagClr_B_Stat : 2|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EngTeHi_B_Actl : 5|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,GWM
+ SG_ DcdcOn_B_Rq : 6|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ULoBattSpprtSustn_B_Rq : 7|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,GWM
+ SG_ VehElEff_No_Avg : 15|7@0+ (10,-100) [-100|1150] "watt*hr/km" SOBDMC_HPCM_FD1,GWM
+
+BO_ 872 Cluster_HEV_Data5: 8 PCM_HEV
+ SG_ PlgActvArb_B_Dsply : 51|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HybMdeStat_D_Dsply : 39|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,GWM
+
+BO_ 560 TransGearData: 8 TCM_DSL
+ SG_ SelDrvMdeSwtch_D_Stat3 : 15|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC
+ SG_ TrnSrvcRqd_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TrnShifActv_B_Actl : 0|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC,ECM_Diesel
+ SG_ GearLvrPos_D_Actl : 12|4@0+ (1,0) [0|15] "SED" VDM,IPMA_ADAS,GWM,ABS_ESC,PSCM,TCCM,ECM_Diesel
+ SG_ GboxOil_Te_Actl : 39|8@0+ (1,-60) [-60|193] "degC" SOBDMC_HPCM_FD1,GWM,TCCM,ECM_Diesel
+
+BO_ 369 EngineData_1: 8 PCM
+ SG_ SeatWorkSrfc_B_Falt : 12|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TrnIpcDsplyRng2_D_Actl : 23|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ TrnIpcDsplyRng_D_Stat : 9|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrnIpcDsplyGear_D_Actl : 7|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ TrnIpcDsplyMde_D_Stat : 3|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrnIpcDsplyMde_D_Actl : 15|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TrnIpcDsplyGear_D_Stat : 1|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 92 Gear_Shift_by_Wire_3: 8 PCM_HEV
+ SG_ TrnLvrV_D_Rq : 43|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrnSbwSysHlth_D_Actl : 1|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrnGearNtmAllow_B_Stat : 47|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TrnDtpCmd_D_Actl : 46|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ GearSelLck_D_Rq : 41|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrnGearCmd_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" GWM
+ SG_ TrnValidGear_D_Cnfm : 11|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrnNtrlTowCmd_D_Actl : 6|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ABS_ESC
+ SG_ TrnGearCmd_Pc_ActlPt : 9|10@0+ (0.1,0) [0|102.2] "percent duty cycle" GWM
+ SG_ TrnGear_D_RqPt : 4|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TrnCmdState_B_Actl : 39|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TrnCmdCnt_B_Actl : 7|1@0+ (1,0) [0|1] "unitless" GWM
+ SG_ PrkBrkActv_D_RqTrnGear : 38|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC
+ SG_ TrnGearMsgTxt_D_Rq : 36|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ TrnGearCmd_No_Cnt : 15|4@0+ (1,0) [0|15] "Unitless" GWM
+
+BO_ 2030 TesterPhysicalResSOBDMCFD1: 64 ECM_Diesel
+ SG_ TesterPhysicalResSOBDMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1087 Powertrain_Data_5: 8 PCM_HEV
+ SG_ BattRgenLoChrg_D_RqEng : 15|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdasLcObtclAbrt_B_Stat : 0|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ BattRgenLoDChrg_D_RqEng : 13|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AirDamPos_D_Stat : 11|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC
+ SG_ FapLcInhbt_B_Rq : 1|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ FapLcStopHold_B_Rq : 2|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ FapLcPrchgBrk_B_Rq : 3|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ FapLcObstcl_B_Stat : 4|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ FapLcMaxGrdInhbt_B_Stat : 5|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ FapLcMaxGrdAbrt_B_Stat : 6|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+ SG_ FapLcActv_B_Stat : 7|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS
+
+BO_ 332 CGEA_Urea_Strategy: 8 ECM_Diesel
+ SG_ UreaLvlQlty_D_RqDsply : 51|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ UreaLvlTxtWarn_D_Rq : 63|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ UreaQltySysWarn_D_Rq : 59|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ DieslPrtcWarn_D_Rq : 55|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ UreaQltyFlg_B_RqDsply : 24|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ UreaLvl_Pc_Actl : 47|8@0+ (0.4,0) [0|102] "percent" GWM
+ SG_ VehUreaRnge2_L_DsplyMx : 3|12@0+ (1,0) [0|4095] "kilometer" GWM
+ SG_ UreaQltySys_D_RqDsply : 27|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ UreaLvlTxt_D_RqDsply : 31|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ VehUreaWarn_V_DsplyMx : 23|7@0+ (1,0) [0|127] "km/h" GWM
+
+BO_ 1896 TesterPhysicalResABS: 64 ABS_ESC
+ SG_ TesterPhysicalResABS : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1889 TesterPhysicalReqTCCM: 64 TSTR
+ SG_ TesterPhysicalReqTCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TCCM
+
+BO_ 1888 TesterPhysicalReqABS: 64 TSTR
+ SG_ TesterPhysicalReqABS : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" ABS_ESC
+
+BO_ 1848 TesterPhysicalResPSCM: 64 PSCM
+ SG_ TesterPhysicalResPSCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1840 TesterPhysicalReqPSCM: 64 TSTR
+ SG_ TesterPhysicalReqPSCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" PSCM
+
+BO_ 1713 ABS_Rapid_Data_Response_2: 8 ABS_ESC
+ SG_ UUDTABSResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1712 ABS_Rapid_Data_Response_1: 8 ABS_ESC
+ SG_ UUDTABSResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 2025 TesterPhysicalResTCM: 64 TCM_DSL
+ SG_ TesterPhysicalResTCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 2024 TesterPhysicalResPCM: 64 PCM_HEV
+ SG_ TesterPhysicalResPCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 2017 TesterPhysicalReqTCM: 64 TSTR
+ SG_ TesterPhysicalReqTCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TCM_DSL
+
+BO_ 2016 TesterPhysicalReqPCM: 64 TSTR
+ SG_ TesterPhysicalReqPCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" ECM_Diesel,PCM,PCM_HEV
+
+BO_ 2015 TesterFunctionalReq_FD1: 64 TSTR
+ SG_ TesterFunctionalReq : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCCM,TCM_DSL,PSCM,ABS_ESC,GWM
+
+BO_ 1897 TesterPhysicalResTCCM: 64 TCCM
+ SG_ TesterPhysicalResTCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1814 TesterPhysicalReqGWM_FD1: 64 TSTR
+ SG_ TesterPhysicalReqGWM_F1 : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" GWM
+
+BO_ 1701 TCM_Rapid_Data_Response_2: 8 TCM_DSL
+ SG_ UUDTTCMResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1700 TCM_Rapid_Data_Response_1: 8 TCM_DSL
+ SG_ UUDTTCMResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1697 PCM_Rapid_Data_Response_2: 8 PCM_HEV
+ SG_ UUDTPCMResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1696 PCM_Rapid_Data_Response_1: 8 PCM_HEV
+ SG_ UUDTPCMResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR
+
+BO_ 1429 PCM_AutoSar_NetworkMgmt: 8 PCM_HEV
+ SG_ PCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+ SG_ PCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" TCM_DSL
+
+BO_ 1100 PowertrainData_9: 8 PCM_HEV
+ SG_ EngExhMdeQuiet_D2_Stat : 28|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ HvacCmprLim_D_Stat : 34|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ WakeAlarm1_T_Rq : 55|15@0+ (1,0) [0|32767] "minute" GWM
+ SG_ WakeAlarm1_B_Typ : 56|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ Veh_V_DsplyTrailCtlSet : 47|6@0+ (0.5,0) [0|31] "unitless" GWM
+ SG_ TrailCtlPt_B_Falt : 36|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+ SG_ AutoTowAllw_D_StatMnu : 25|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AutoTowActv_B_Stat : 39|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ GrossTrainWeight_M_Est : 7|8@0+ (100,0) [0|25300] "kilogram" VDM,ABS_ESC,PSCM,IPMA_ADAS,TCCM,TCM_DSL,GWM
+
+BO_ 1098 EffDrvModeData: 8 ECM_Diesel
+ SG_ EdmVeh_V_Dsply : 31|5@0+ (5,0) [0|155] "km/h" GWM
+ SG_ EdmSailMdeOn_B_Stat : 25|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EdmPrev_Fe_Dsply : 23|8@0+ (0.1,0) [0|25.5] "litre/100km" GWM
+ SG_ EdmMsgTxt_D_Rq : 11|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ EdmLamp_D_Dsply : 15|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ EdmCurrent_Fe_Dsply : 7|8@0+ (0.1,0) [0|25.5] "litre/100km" GWM
+ SG_ EdmCmplnc_B_Dsply : 26|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EdmCmplnc_Pc_Dsply : 24|8@0+ (0.392157,0) [0|100.000035] "percent" GWM
+
+BO_ 1086 PowertrainData_3: 8 PCM_HEV
+ SG_ EngMnfld_P_Actl : 47|13@0+ (0.1,-206.8) [-206.8|612.3] "kilopascal" GWM
+ SG_ FuelPumpPwr_B_Rq : 20|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BattULoChrg_U_Cmd : 15|8@0+ (0.025,10.6) [10.6|16.975] "volt" GWM
+ SG_ ElLoadCtl_D_Rq : 23|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 1071 Engine_Clutch_Data: 8 PCM_HEV
+ SG_ EngAout_N_Dsply : 52|13@0+ (2,0) [0|16382] "rpm" GWM
+ SG_ CluPdl_PcRate_Actl : 7|8@0+ (0.04,-5) [-5|5.2] "%/ms" GWM
+ SG_ CluPdlPosPcMeas_D_Qf : 11|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+ SG_ CluPdlPos_Pc_Meas : 9|10@0+ (0.1,0) [0|102.3] "%" ABS_ESC,GWM
+ SG_ EngAoutIdl_N_Ntrl : 31|11@0+ (2,0) [0|4094] "rpm" ABS_ESC,GWM
+
+BO_ 1069 PowertrainData_2: 8 PCM_HEV
+ SG_ SlMde_D_Stat : 57|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SlMde_D_RqDsply : 59|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ IsaOffst_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ GrllShtrPos_D_Cmd : 55|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ GrllShtrPos_B_Falt : 51|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ObdWarmUp_B_Complt : 12|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,GWM
+ SG_ EngMsgTxt_D_Rq : 11|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ EngClnt_Te_ActlDiag : 39|8@0+ (1,-40) [-40|215] "degC" SOBDMC_HPCM_FD1,TCM_DSL,GWM
+ SG_ EngLoad_Pc_CalcDiag : 47|8@0+ (0.392157,0) [0|100.000035] "%" SOBDMC_HPCM_FD1,TCM_DSL,GWM
+ SG_ EngAirIn_Te_Actl : 9|10@0+ (0.25,-128) [-128|127.25] "degC" GWM,TCM_DSL
+ SG_ ApedPos_Pc_ActlDiag : 31|8@0+ (0.392157,0) [0|100.000035] "%" SOBDMC_HPCM_FD1,TCM_DSL,GWM
+
+BO_ 1060 Powertrain_Data_4: 8 PCM_HEV
+ SG_ RearDiffOilTeWarn_B_Rq : 20|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ RearDiffOil_Te_Actl : 15|9@0+ (1,-40) [-40|470] "degC" GWM
+ SG_ BpedDrvMsgTxt_B_Dsply : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ FuelLvl_Pc_DsplyEng : 41|10@0+ (0.108696,-5.217408) [-5.217408|105.9786] "percent" GWM
+ SG_ FuelLvlWarn_D_ActlEng : 19|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ FuelRange_L_DsplyEng : 39|14@0+ (0.1,0) [0|1638.3] "kilometer" GWM
+ SG_ SelDrvMdePt_D_Stat : 25|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+
+BO_ 1057 PowertrainData_1: 8 PCM_HEV
+ SG_ FohEng_D_Rq : 1|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ EngIdlShutDwnTxt_D_Rq : 17|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ EngIdlShutDown_D_Stat : 9|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ FUEL_ALCOHOL_PERCNT : 63|8@0+ (0.393700787,0) [0|99.999899898] "Percent" GWM
+ SG_ TrnTotTq_Rt_Est : 39|16@0+ (0.001,0) [0|65.533] "Unitless" GWM
+ SG_ TrnTotLss_Tq_Est : 31|8@0+ (0.5,0) [0|126.5] "Nm" GWM
+ SG_ ECMMILRequest : 3|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AirCondFluidHi_P_Actl : 55|8@0+ (0.125,0) [0|31.625] "bar" SOBDMC_HPCM_FD1,GWM
+ SG_ OilPressureWarning : 18|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ VehVLimStat_D_Actl : 6|3@0+ (1,0) [0|7] "SED" GWM,TCM_DSL
+ SG_ VehVLimActv_B_Actl : 7|1@0+ (1,0) [0|1] "SED" GWM,TCM_DSL
+ SG_ CoolantFanStepAct : 23|5@0+ (1,0) [0|31] "Steps" GWM
+
+BO_ 1055 PowertrainData_7: 8 PCM_HEV
+ SG_ EcoCochInstNeg_B_Dsply : 53|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EcoCochShif_Pc_Dsply : 39|8@0+ (0.392157,0) [0|100.000035] "percent" GWM
+ SG_ EcoCochInst_Pc_Dsply : 47|10@0+ (0.1,0) [0|102.3] "percent" GWM
+ SG_ EcoCochIdlFuel_Pc_Dsply : 31|8@0+ (0.392157,0) [0|100.000035] "percent" GWM
+ SG_ EcoCochDecel_Pc_Dsply : 23|8@0+ (0.392157,0) [0|100.000035] "percent" GWM
+ SG_ EcoCochCrus_Pc_Dsply : 15|8@0+ (0.392157,0) [0|100.000035] "percent" GWM
+ SG_ EcoCochA_Pc_Dsply : 7|8@0+ (0.392157,0) [0|100.000035] "percent" GWM
+
+BO_ 562 PowertrainData_11: 8 ECM_Diesel
+ SG_ GearNtrl_No_Cs : 15|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ GearNtrl_No_Cnt : 5|4@0+ (1,0) [0|15] "unitless" GWM
+ SG_ GearNtrl_D_Stat : 7|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+
+BO_ 523 Engine_Data_18: 8 ECM_Diesel
+ SG_ EngAirFiltMsgTxt_D_Rq : 2|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ WaterInFuel_B_Falt : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ UreaMnAdd_L2_Actl : 23|8@0+ (0.1,0) [0|25.4] "litre" GWM
+ SG_ VehUreaRnge3_L_DsplyMx : 31|16@0+ (1,0) [0|65535] "unitless" GWM
+ SG_ UreaMxAdd_L2_Actl : 47|9@0+ (0.1,0) [0|51] "litre" GWM
+
+BO_ 517 PowertrainData_6: 8 PCM_HEV
+ SG_ FapLc_B_Err : 10|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ BrkTot_Tq_RqFapLc : 7|13@0+ (4,0) [0|32764] "Nm" ABS_ESC,GWM
+ SG_ TrnAin_Pc_RqDrv : 9|10@0+ (0.1,0) [0|102.3] "percent" TCCM,GWM
+
+BO_ 516 EngVehicleSpThrottle: 8 PCM_HEV
+ SG_ EngAoutNActl_D_QF : 31|2@0+ (1,0) [0|3] "SED" TCM_DSL,GWM
+ SG_ EngAout3_N_Actl : 55|16@0+ (0.25,0) [0|16383.5] "RPM" SOBDMC_HPCM_FD1,GWM
+ SG_ ApedPos_PcRate_ActlArb : 23|8@0+ (0.04,-5) [-5|5.12] "%/ms" TCM_DSL,GWM
+ SG_ ApedPos_Pc_ActlArb : 1|10@0+ (0.1,0) [0|102.3] "%" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,TCCM,ABS_ESC,PSCM,TCM_DSL,GWM
+ SG_ ApedPosPcActl_D_Qf : 7|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,SOBDMC_HPCM_FD1,ABS_ESC,PSCM,TCM_DSL,GWM
+ SG_ EngAout_N_Actl : 28|13@0+ (2,0) [0|16382] "rpm" VDM,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM
+ SG_ ApedPosPcActl_No_Cnt : 5|4@0+ (1,0) [0|15] "Unitless" ABS_ESC,SOBDMC_HPCM_FD1,GWM
+ SG_ ApedPosPcActl_No_Cs : 47|8@0+ (1,0) [0|255] "Unitless" ABS_ESC,SOBDMC_HPCM_FD1,GWM
+
+BO_ 514 EngVehicleSpThrottle2: 8 PCM_HEV
+ SG_ StrtrMtrDlyStrt_B_Stat : 39|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ VehVTrlrAid_B_Avail : 23|1@0+ (1,0) [0|1] "SED" PSCM,GWM
+ SG_ StrtrMtrCtlMsgTxt_D_Rq : 7|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ VehVActlEng_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" PSCM,GWM
+ SG_ VehVActlEng_No_Cnt : 22|4@0+ (1,0) [0|15] "Unitless" PSCM,GWM
+ SG_ Veh_V_RqCcSet : 32|9@0+ (0.5,0) [0|255.5] "kph" IPMA_ADAS,ABS_ESC,TCM_DSL,GWM
+ SG_ VehVActlEng_D_Qf : 38|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ABS_ESC,PSCM,TCM_DSL,GWM
+ SG_ Veh_V_ActlEng : 55|16@0+ (0.01,0) [0|655.35] "kph" VDM,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,PSCM,TCM_DSL,GWM
+ SG_ GearRvrse_D_Actl : 4|3@0+ (1,0) [0|7] "SED" CMR_DSMC,IPMA_ADAS,ABS_ESC,PSCM,GWM
+ SG_ StrtrMtrCtlMsgTxt_D2_Rq : 1|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 512 TorqueDataEngFlags: 8 PCM_HEV
+ SG_ PrplWhlTotTqRq_No_Cs : 63|8@0+ (1,0) [0|255] "Unitless" ABS_ESC,GWM
+ SG_ PrplWhlTotTqRq_No_Cnt : 51|4@0+ (1,0) [0|15] "Unitless" ABS_ESC,GWM
+ SG_ PrplWhlTot_Tq_Rq : 39|16@0+ (4,-131072) [-131072|131068] "Nm" VDM,TCCM,ABS_ESC,GWM
+ SG_ PrplWhlTot_Tq_LimMn : 23|16@0+ (4,-131072) [-131072|131068] "Nm" ABS_ESC,GWM
+ SG_ PtDrvMde_D_Stat : 55|4@0+ (1,0) [0|15] "SED" IPMA_ADAS,GWM
+
+BO_ 381 EngineData_17: 8 ECM_Diesel
+ SG_ EngOilLife_T_Actl : 23|11@0+ (1,0) [0|2047] "days" GWM
+ SG_ EngOilSrvcMsgTxt_D_Rq : 55|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ DistToNextOilChange : 7|16@0+ (1,0) [0|65535] "unitless" GWM
+ SG_ RunDryPrevent_B_Stat : 28|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ WaterInFuel : 52|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ GlowIndication : 51|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 380 EngineData_16: 8 PCM
+ SG_ EngOilLvlWarn_D_Rq1 : 55|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ EngExhBrkOnLamp_B_Rq : 27|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EngExhBrkAutoLamp_B_Rq : 3|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EngAout_N_MxAllw : 52|13@0+ (2,0) [0|16382] "rpm" SOBDMC_HPCM_FD1,GWM
+ SG_ EngExhBrkMde_D_Actl : 31|4@0+ (1,0) [0|15] "SED" TCM_DSL,GWM
+
+BO_ 377 EngineData_7: 8 PCM_HEV
+ SG_ HvacAirFullOut_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ FuelFlw_Vl_Dsply : 49|10@0+ (25,0) [0|25575] "Micro_Liter" GWM
+ SG_ FuelFillInlet_B_Dsply : 32|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EngSrvcRqd_B_Rq : 19|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ OdoCount : 47|8@0+ (0.2,0) [0|50.8] "Meters" GWM
+ SG_ EngOilLife_Pc_Actl : 39|7@0+ (1,0) [0|100] "Percent" GWM
+ SG_ FuelFilterLamp_B_Dsply : 50|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AirCondRec_B_Rq : 55|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AirCondClutch_B_Stats : 51|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 376 EngineClimateData: 8 PCM_HEV
+ SG_ GasPrtc_D_RqDsply : 22|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ EngAout_Aa_Actl : 17|10@0+ (0.05,-25.6) [-25.6|25.55] "rpm/ms" ABS_ESC,GWM
+ SG_ DynoMde_B_Cmd : 4|1@0+ (1,0) [0|1] "SED" TCM_DSL,ABS_ESC,GWM
+ SG_ AslIconDsply_D_Rq : 3|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AslChime_B_Rq : 39|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HvacHtrCore2_Te_Actl : 1|10@0+ (0.25,-50) [-50|205.5] "degC" SOBDMC_HPCM_FD1,GWM
+ SG_ EcssLamp_D_RqDsply : 19|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AirAmbTe_D_Qf : 35|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,TCCM,GWM
+ SG_ AirAmb_Te_ActlFilt : 49|10@0+ (0.25,-128) [-128|127.75] "deg C" SOBDMC_HPCM_FD1,IPMA_ADAS,GWM
+ SG_ AirAmb_Te_Actl : 33|10@0+ (0.25,-128) [-128|127.75] "degC" ABS_ESC,TCCM,GWM
+ SG_ AirAmb_P_Actl : 55|6@0+ (10,500) [500|1110] "mbar" ABS_ESC,TCM_DSL,GWM
+
+BO_ 373 EngineData_11: 8 ECM_Diesel
+ SG_ DieslPrtc2_D_RqDsply : 47|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ DieslPrtcRgen_D_Actl : 38|2@0+ (1,0) [0|3] "SED" TCM_DSL,GWM
+ SG_ EngTeColdPrtct_D_Stats : 4|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ EngExhOvrTe_B_RqDsply : 39|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 359 VehicleOperatingModes: 8 PCM_HEV
+ SG_ PrplWhlRgenMn_Tq_Actl : 25|13@0+ (4,-16380) [-16380|16380] "Nm" ABS_ESC,GWM
+ SG_ ElPw_D_StatStrtStop : 31|4@0+ (1,0) [0|15] "SED" ABS_ESC,PSCM,GWM
+ SG_ TrnAin_Tq_Actl : 42|11@0+ (1,-500) [-500|1547] "Nm" ABS_ESC,GWM
+ SG_ PrplWhlTot2_Tq_Actl : 15|16@0+ (4,-131072) [-131072|131060] "Nm" ABS_ESC,PSCM,TCCM,GWM
+ SG_ PwPckTq_D_Stat : 5|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM
+ SG_ Eng_D_Stat : 7|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+ SG_ PlgActvArb_B_Actl : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ElPw_D_Stat : 3|3@0+ (1,0) [0|7] "SED" VDM,CMR_DSMC,IPMA_ADAS,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM
+ SG_ TrnAinTq_D_Qf : 44|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+
+BO_ 358 Stop_Start: 8 PCM_HEV
+ SG_ StopStrtStdby_D_Indic : 55|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ StopStrtIODTxt_D_Rq : 52|5@0+ (1,0) [0|31] "SED" GWM
+ SG_ StopStrtDrvMde_D_Indic : 13|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ StopStrtMsgTxt_D_Rq : 11|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ OdoTripVerify_L_Actl : 31|24@0+ (0.1,0) [0|1677721.4] "km" GWM
+ SG_ HiElPwInhbt_B_Stat : 15|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AutoStopPtDelta_I_Est : 7|8@0+ (1,-127) [-127|127] "Amps" GWM
+
+BO_ 357 EngBrakeData: 8 PCM_HEV
+ SG_ BPedDrvAppl_D_QF : 15|2@0+ (1,0) [0|3] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,PSCM,TCM_DSL,GWM
+ SG_ CmbbDeny_B_ActlPrpl : 3|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ PrplTqMnSat_B_Actl : 41|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ BpedDrvAppl_D_Actl : 5|2@0+ (1,0) [0|3] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM
+ SG_ CmbbEngTqMn_B_Actl : 7|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM
+ SG_ Veh_V_DsplyCcSet : 23|8@0+ (1,0) [0|253] "Unitless" GWM,IPMA_ADAS
+ SG_ AccEngStat_D_Actl : 2|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,GWM
+ SG_ CcMde_D_Actl : 13|3@0+ (1,0) [0|7] "SED" VDM,TCM_DSL,ABS_ESC,GWM
+ SG_ CcStat_D_Actl : 10|3@0+ (1,0) [0|7] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,TCCM,TCM_DSL,GWM
+ SG_ EngAout_N_MnAllw : 52|13@0+ (2,0) [0|16382] "rpm" SOBDMC_HPCM_FD1,GWM
+ SG_ CcOvrrdActv_B_Actl : 6|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,ABS_ESC,TCCM,TCM_DSL,GWM
+ SG_ AccStopMde_D_Rq : 39|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,ABS_ESC,GWM
+
+BO_ 355 EngineData_10: 8 ECM_Diesel
+ SG_ AutoRgenTxt_B_RqDsply : 48|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AccFllwMdeActv_B_Actl : 32|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ EngPtoMde_D_Actl : 60|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ManRgenTxt_D_RqDsply : 63|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ManRgenSoot_Pc_RqDsply : 39|7@0+ (1,0) [0|126] "%" GWM
+ SG_ DieslMsgTxt_D_Rq : 57|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 342 EngineData_6: 8 PCM_HEV
+ SG_ EngOvrhtMitgActv_D_Ind : 36|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ EngClntTe_D_Qf : 33|2@0+ (1,0) [0|3] "SED" VDM,SOBDMC_HPCM_FD1,TCM_DSL,GWM
+ SG_ EngGoutLss_Tq_Est : 31|8@0+ (1,0) [0|255] "Nm" SOBDMC_HPCM_FD1,GWM
+ SG_ EngOil_Te_Actl : 15|8@0+ (1,-60) [-60|193] "degC" GWM
+ SG_ EngClnt_Te_Actl : 7|8@0+ (1,-60) [-60|195] "degC" VDM,SOBDMC_HPCM_FD1,TCM_DSL,GWM
+
+BO_ 71 Global_PATS_TargetInfo: 8 PCM_HEV
+ SG_ immoTarget1Status : 7|3@0+ (1,0) [0|7] "SED" ABS_ESC,TCM_DSL,GWM
+ SG_ immoTarget1Data : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" ABS_ESC,GWM
+ SG_ immoTarget1Cmd : 4|3@0+ (1,0) [0|7] "SED" ABS_ESC,GWM
+
+BO_ 1822 TesterPhysicalResGWM_FD1: 64 GWM
+ SG_ TesterPhysicalResGWM_F1 : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1438 GWM_AutoSar_NetMgmt_FD1: 8 GWM
+ SG_ GWM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+ SG_ GWM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC
+
+BO_ 954 Body_Info_10_FD1: 8 GWM
+ SG_ GenericSwtch3_No_Actl : 15|3@0+ (1,0) [0|7] "unitless" Vector__XXX
+ SG_ GenericSwtch2_No_Actl : 4|3@0+ (1,0) [0|7] "unitless" Vector__XXX
+ SG_ GenericSwtch1_No_Actl : 7|3@0+ (1,0) [0|7] "unitless" Vector__XXX
+
+BO_ 1006 Personality_IPMB_Data: 8 IPMA_ADAS
+ SG_ PersIndexIpmb_D_Actl : 39|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ FeatNoIpmbActl : 23|16@0+ (1,0) [0|65535] "Number" GWM
+ SG_ FeatConfigIpmbActl : 7|16@0+ (1,0) [0|65535] "Undefined" GWM
+
+BO_ 820 Adaptive_Headlamp_Stat: 8 GWM
+ SG_ AhbStatGfhbFdbk_D_Actl : 53|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ HeadLghtDrvSide_B_Stat : 33|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ HeadLghtHiOn_B_StatHcm : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Adaptive_Hdlmp_Fault : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 137 ActiveFrontStrg_Stat_FD1: 8 GWM
+ SG_ SteWhlOffstRq_D_Stat : 43|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ SteWhlOffst_An_TotActl : 23|15@0+ (0.1,-1600) [-1600|1676.5] "degrees" ABS_ESC
+ SG_ SteWhlBrkOffst_An_Actl : 7|15@0+ (0.1,-1600) [-1600|1676.5] "degrees" ABS_ESC
+ SG_ SteWhlBrkAnActl_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" ABS_ESC
+ SG_ SteWhlBrkAnActl_No_Cnt : 47|4@0+ (1,0) [0|15] "Unitless" ABS_ESC
+
+BO_ 129 Steering_Wheel_Data2_FD1: 8 GWM
+ SG_ SelDrvMdeSwtch_D_Stat4 : 21|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ SteWhlSwtchView_B_Stat : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchSet_B_Stat : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchPhon_B_Stat : 9|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchNav_B_Stat : 10|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchMed_B_Stat : 11|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchIod_B_Stat : 12|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchHud_B_Stat : 13|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchBack_B_Stat : 14|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchMenu_B_Stat : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteEffortInc_B_RqDrv : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SelDrvMdeInc_B_RqDrv : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SelDrvMdeDec_B_RqDrv : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SuspDampInc_B_RqDrv : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchUp_B_Stat : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchRght_B_Stat : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchOk_B_Stat : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchLeft_B_Stat : 1|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchDown_B_Stat : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchHome_B_Stat : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ SteWhlSwtchInfo_B_Stat : 18|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 935 Side_Detect_R_Stat: 8 IPMA_ADAS
+ SG_ SodRight_D_Stat : 15|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ CtaAlrtRight2_D_Stat : 30|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ BttRight_D_Stat : 45|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ BttRight_D_RqDrv : 47|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CtaBrkRightMsgTxt_B_Rq : 42|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CtaRightBrkEnbl_B_Rq : 31|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ CtaRightBrkDecel_B_Rq : 7|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ Side_Detect_R_Illum : 39|8@0+ (1,0) [0|255] "Percent" GWM
+ SG_ CtaSnsRight_D_Stat : 25|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CtaAlrtRight_D_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CtaRight_D_Stat : 18|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ SodSnsRight_D_Stat : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SodAlrtRight_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SodDetctRight_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ SodWarnRight_Prd_Rq : 6|7@0+ (1,0) [0|127] "millisecond" GWM
+
+BO_ 1108 RCMSerialNumber_FD1: 8 GWM
+ SG_ RCMSerialNoByte8 : 63|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte7 : 55|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte6 : 47|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte5 : 39|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte4 : 31|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte3 : 23|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte2 : 15|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+ SG_ RCMSerialNoByte1 : 7|8@0+ (1,0) [0|253] "Unitless" ABS_ESC
+
+BO_ 261 APIM_Request_Signals_FD1: 8 GWM
+ SG_ ChrgStatDsply_D_Rq : 47|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ OffPeakTimeSetMin_Rq : 13|6@0+ (1,0) [0|63] "unitless" Vector__XXX
+ SG_ OffPeakTimeSetHR_Rq : 7|5@0+ (1,0) [0|31] "unitless" Vector__XXX
+ SG_ NextUsageTimeToggle_Rq : 15|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ LongTermParking_Rq : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ CbnCmrtPrefLstNmItm_Rq : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ CbnCmrtPrefListIndx_Rq : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ ModemReset_D_Rq : 45|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1
+ SG_ StopStrtDrvMde_B_RqBtn3 : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TCU_ESN_D_Rq : 22|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ FactoryReset_Rq : 18|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1146 TrailerInfo_2_FD1: 8 GWM
+ SG_ TrlrAidSwtch_D_RqDrv : 35|2@0+ (1,0) [0|3] "SED" PSCM,IPMA_ADAS
+ SG_ TrlrAidCtl_U_RqDrv : 31|12@0+ (0.00125,0) [0|5.11625] "volt" PSCM
+
+BO_ 533 APIM_Send_Signals_2_FD1: 8 GWM
+ SG_ DcacGfciTestBttn_B_Stat : 9|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ TrlrBrkGain_No_Rq : 55|5@0+ (0.5,0) [0|15.5] "unitless" Vector__XXX
+ SG_ DcacPwResetButtn_B_Stat : 11|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacPwOffButtn_B_Stat : 12|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacPwLoButtn_B_Stat : 13|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacPwHiButtn_B_Stat : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacPwButtn_B_Falt : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ TrlrHitch_D_RqMnu : 23|4@0+ (1,0) [0|15] "SED" IPMA_ADAS
+ SG_ AutoEpbZoomView_B_Stat : 32|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ AutoEpbButtn_B_Stat : 19|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ TrlrAidMde_D_Rq : 5|2@0+ (1,0) [0|3] "SED" PSCM
+ SG_ TCU_Init_Actvtn_St : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TCU_Final_Actvtn_St : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ OtaTrg_D_Stat : 41|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ OnbChrgGoTTouch_D_Rq : 43|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTPrcond_D_Rq : 34|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTOn_D_Rq : 25|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTMnte_D_Rq : 47|4@0+ (1,0) [0|15] "minute" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTHr_T_Rq : 39|5@0+ (1,0) [0|29] "hour" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTExtHtr_D_Rq : 27|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTElement_D_Rq : 31|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1
+ SG_ OnbChrgGoTDelete_B_Rq : 17|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ OnbChrgClearAll_B_Rq : 18|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ PaakMyKey_D_Rq : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ OnbChrgGoTUpdate_B_Rq : 16|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1041 AC_Compressor_Data_FD1: 8 GWM
+ SG_ ElCmprUHi_U_Actl : 31|8@0+ (2,0) [0|510] "volt" SOBDMC_HPCM_FD1
+ SG_ ElCmprUHi_D_Stat : 23|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprOverTe_D_Stat : 21|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmpr_N_Actl : 15|8@0+ (50,0) [0|12700] "RPM" SOBDMC_HPCM_FD1
+ SG_ ElCmpr_Pw_Actl : 7|8@0+ (40,0) [0|10160] "watts" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ ElCmpr_D_Stat : 19|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprPerfErr_D_Falt : 43|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprInnrErr_D_Falt : 35|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprLostComm_D_Falt : 33|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprOverLoad_D_Falt : 47|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprOverTe_D_Falt : 45|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprBattURng_D_Falt : 37|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprBattSysU_D_Falt : 39|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ ElCmprSysU_D_Falt : 41|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1067 Battery_Mgmt_4_FD1: 8 GWM
+ SG_ BattULoAuxIsol_D_Rq : 25|2@0+ (1,0) [0|3] "SED" PCM_HEV
+ SG_ BattULoAux_U_Rq : 55|12@0+ (0.00390625,0) [0|15.9921875] "volt" PCM_HEV
+ SG_ BattULoAuxSoc_Pc_Actl : 15|7@0+ (1,0) [0|127] "percent" PCM_HEV
+ SG_ BattULoAux_I_Actl : 23|12@0+ (0.0625,-128) [-128|127.875] "ampere" PCM_HEV
+ SG_ BattULoAux_D_Qlty : 27|2@0+ (1,0) [0|3] "SED" PCM_HEV
+ SG_ BattULoCrnkStrt_U_Pred : 47|7@0+ (0.1,0) [0|12.7] "volt" PCM_HEV
+ SG_ BattULoCrnkBelt_U_Pred : 39|7@0+ (0.1,0) [0|12.7] "volt" PCM_HEV
+ SG_ BattULoAux_U_Actl : 7|8@0+ (0.0625,0) [0|15.875] "volt" PCM_HEV
+ SG_ BattULoAux_B_Falt : 8|1@0+ (1,0) [0|1] "SED" PCM_HEV
+
+BO_ 1112 Battery_Traction_6_FD1: 8 GWM
+ SG_ BattTracChrgSustn_B_Rq : 4|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracCnnct_D_Cmd : 18|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracHvilOpen_B_Stat : 8|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracDcdcDis_B_Rq : 7|1@0+ (1,0) [0|1] "SED" PCM_HEV
+ SG_ HtrnClntPump_D_Stat : 6|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ BattTracDelta_Te_Actl : 63|8@0+ (0.5,-60) [-60|67.5] "degC" SOBDMC_HPCM_FD1
+ SG_ BattTracClntPmp_D_Stat : 33|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+
+BO_ 139 CruiseCtrl_Strg_Data_FD1: 8 GWM
+ SG_ AfsPw_B_Rq : 24|1@0+ (1,0) [0|1] "SED" PCM
+ SG_ AccButtnGpTogglePress2 : 25|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TjaButtnOnOffPress2 : 26|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ActvFrontSteMsgTxt_D_Rq : 31|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ ActvFrontSteLck_D_Stat : 17|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ SelDrvMdeAdptSte_D_Stat : 28|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ AslButtnOnOffPress2 : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AslButtnOnOffCnclPres2 : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcButtnOnPress2 : 18|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcButtnOnOffPress2 : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcButtnOnOffCnclPress2 : 20|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcButtnOffPress2 : 21|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAsllButtnResPress2 : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnSetPress2 : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnSetIncPress2 : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnSetDecPress2 : 9|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnResIncPress2 : 10|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnResDecPress2 : 11|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnOnPress2 : 12|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnOnOffCncl2 : 13|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnOffCnclPres2 : 14|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnIndxIncPres2 : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnIndxDecPres2 : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnDeny_B_Actl2 : 1|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnCnclResPres2 : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnCnclPress2 : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AccButtnGapIncPress2 : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AccButtnGapDecPress2 : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 1121 AllTerrainControlData_FD1: 8 GWM
+ SG_ SelDrvMdeSwtch_No_Actl : 2|2@0+ (1,0) [0|3] "unitless" ABS_ESC
+ SG_ SelDrvMdeSwtch_D_Stat : 4|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ SelDrvMdeCnt_D_Stat : 7|3@0+ (1,0) [0|7] "Counts" ABS_ESC
+
+BO_ 1120 FourByFourSwitchData_FD1: 8 GWM
+ SG_ DrvSlipCtlMde_B_Rq3 : 14|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ HybMdeSwtch_B_Rq : 13|1@0+ (1,0) [0|1] "SED" PCM_HEV
+ SG_ TrailCtlSwtch_B_Stat3 : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ RearDiffLck_D_RqDrv : 4|2@0+ (1,0) [0|3] "SED" PCM,TCCM
+ SG_ AwdMde_D_RqDrv : 7|3@0+ (1,0) [0|7] "SED" TCCM
+ SG_ HdcSwtchPos_B_Actl : 0|1@0+ (1,0) [0|1] "SED" ABS_ESC
+
+BO_ 1050 Climate_Control_Data_FD1: 8 GWM
+ SG_ AutoHoldSwtch_D_Stat : 20|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ LpdbPtc3_B_Rq : 36|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ LpdbPtc2_B_Rq : 37|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ LpdbPtc1_B_Rq : 38|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ LpdbHeatWiprPrk_B_Rq : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ LpdbDfrstRearOn_B_Rq : 24|1@0+ (1,0) [0|1] "SED" ECM_Diesel
+ SG_ SteWhlHeat_D_Rq : 13|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ MirrorHeatOn_B_Rq : 14|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Remote_Start_QuietMode : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Outside_Air_Temp_Stat : 7|8@0+ (0.5,-40) [-40|86.5] "Degrees C" VDM,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM
+
+BO_ 1137 Cluster_HEV_Data10_FD1: 8 PCM_HEV
+ SG_ RngPerChrgAvg_L_Dsply : 7|12@0+ (0.1,0) [0|409.3] "km" GWM
+
+BO_ 1255 BoundaryAlert_Right_4: 8 IPMA_ADAS
+ SG_ BalrRight4Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight4Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight4Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight4CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight4CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1254 BoundaryAlert_Right_3: 8 IPMA_ADAS
+ SG_ BalrRight3Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight3Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight3Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight3CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight3CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1253 BoundaryAlert_Right_2: 8 IPMA_ADAS
+ SG_ BalrRight2Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight2Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight2Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight2CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight2CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1252 BoundaryAlert_Right_1: 8 IPMA_ADAS
+ SG_ BalrRight1Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight1Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight1Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrRight1CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrRight1CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1251 BoundaryAlert_Left_4: 8 IPMA_ADAS
+ SG_ BalrLeft4Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft4Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft4Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft4CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft4CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1250 BoundaryAlert_Left_3: 8 IPMA_ADAS
+ SG_ BalrLeft3Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft3Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft3Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft3CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft3CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1249 BoundaryAlert_Left_2: 8 IPMA_ADAS
+ SG_ BalrLeft2Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft2Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft2Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft2CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft2CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1248 BoundaryAlert_Left_1: 8 IPMA_ADAS
+ SG_ BalrLeft1Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft1Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft1Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrLeft1CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+ SG_ BalrLeft1CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM
+
+BO_ 1113 TrailerAid_Stat3: 8 IPMA_ADAS
+ SG_ TrlrTrgtAcquire_D_Stat : 51|3@0+ (1,0) [0|7] "SED" PSCM,GWM
+ SG_ TrlrAnOffst_An_Calc : 48|9@0+ (0.1,0) [0|51.1] "degrees" GWM
+ SG_ TrlrAnOffstDir_D_Calc : 33|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrlrAnCalib_B_Complt : 40|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TrlrRvrse_D_Stat : 42|2@0+ (1,0) [0|3] "SED" GWM,PSCM
+ SG_ TrlrAid_D2_Stat : 55|4@0+ (1,0) [0|15] "SED" GWM,PSCM
+ SG_ TrlrAidTrgtId_No_Actl : 47|5@0+ (1,0) [0|31] "unitless" GWM,PSCM
+ SG_ TrlrAid_An3_Actl : 28|11@0+ (0.125,-90) [-90|165.75] "degrees" PSCM,GWM
+ SG_ TrlrAid_AnRate2_Actl : 22|10@0+ (0.125,-50) [-50|77.75] "degrees/second" PSCM,GWM
+ SG_ HitchToVehAxle_L_Calc : 7|8@0+ (0.0127,-0.508) [-0.508|2.7178] "meter" PSCM,GWM
+ SG_ HitchToTrlrAxle_L_Calc2 : 15|9@0+ (0.0254,0) [0|12.9794] "meter" GWM
+
+BO_ 1105 Image_Processing_Data: 8 IPMA_ADAS
+ SG_ TrlrAidSwtchLamp_B_Rq : 32|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TrlrHitchMsgTxt_D_Rq : 47|6@0+ (1,0) [0|63] "SED" GWM
+ SG_ TrlrHitchIcon_D_Rq : 36|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ TrlrHitchChime_D_Rq : 39|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TrlrAidEnbl_D_RqAdas : 5|3@0+ (1,0) [0|7] "SED" GWM,PSCM
+ SG_ TrlrRvrseMsgTxt_D2_Rq : 31|6@0+ (1,0) [0|63] "SED" PSCM,GWM
+ SG_ TrlrRvrseEnbl_D2_Stat : 18|3@0+ (1,0) [0|7] "SED" PSCM,GWM
+ SG_ RbaMsg_D_Rq : 22|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BrkDecel_B_RqRba : 8|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ BrkEnbl_B_RqRba : 23|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ Rba_D_Stat : 14|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ RbaAlrt_D_Dsply : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ RbaMnu_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CamraFrntStat_D_Stat : 7|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TrlrHitchLamp_D_Rq2 : 15|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 938 ParkAid_Aud_Warn_Stat: 8 IPMA_ADAS
+ SG_ SidePrkSnsR2_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ SidePrkSnsR1_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ SidePrkSnsL2_D_Stat : 51|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ ApaMde_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ApaActvSd_D_Actl : 14|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PrkAidSwtch_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ ApaMde_D_Avail : 12|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsFrCrnr_D_Stat : 47|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsFrCntr_D_Stat : 35|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsFlCrnr_D_Stat : 27|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsFlCntr_D_Stat : 31|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkBrkEl_B_RqFap : 20|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ RpaChime_D_Rq : 7|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ FpaChime_D_Rq : 3|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidMsgTxt_D_Rq : 19|4@0+ (1,0) [0|15] "SED" GWM,PSCM
+ SG_ SidePrkSnsL1_D_Stat : 55|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidAudioMute_B_Rq : 15|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 939 ParkAid_Aud_Warn_Stat2: 8 IPMA_ADAS
+ SG_ ApaBrk_D_Rq : 51|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SidePrkSnsR4_D_Stat : 55|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ SidePrkSnsR3_D_Stat : 47|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ SidePrkSnsL4_D_Stat : 43|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ SidePrkSnsL3_D_Stat : 37|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidChime_D_Stat : 4|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PrkAidSnsRlCntr_D_Stat : 15|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsRrCrnr_D_Stat : 31|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsRrCntr_D_Stat : 19|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidSnsRlCrnr_D_Stat : 11|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ PrkAidRear_D_Stat : 39|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PrkAidFront_D_Stat : 2|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PrkAid_D_Falt : 7|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ApaLongCtrlEnbl_D_Rq : 0|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM
+ SG_ ApaBrk_A_Rq : 63|8@0+ (0.05,-12.75) [-12.75|0] "m/sec^2" ABS_ESC,ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ PrkAidLamp_D_Rq : 33|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 937 ParkAid_Data_2: 8 IPMA_ADAS
+ SG_ Veh_V_RqFap : 31|8@0+ (0.1,0) [0|25.5] "km/h" ECM_Diesel,PCM,PCM_HEV
+ SG_ TrnRngDRqFap_No_Cs : 23|8@0+ (1,0) [0|255] "unitless" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnRngDRqFap_No_Cnt : 15|4@0+ (1,0) [0|15] "unitless" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnRng_D_RqFap : 11|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM
+ SG_ FapLcDistToObj_L_Actl : 7|8@0+ (0.01,0) [0|2.53] "meter" ECM_Diesel,PCM,PCM_HEV
+
+BO_ 936 ParkAid_Data: 8 IPMA_ADAS
+ SG_ ApaButtnPrssd_B_Stat : 58|1@0+ (1,0) [0|1] "SED" PSCM
+ SG_ SAPPStatusCoding : 7|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ ApaSys_D_Stat : 61|3@0+ (1,0) [0|7] "SED" PSCM,GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ ApaSteWhl_D_RqDrv : 63|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaSteScanMde_D_Stat : 49|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaSelSapp_D_Stat : 51|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaSelPpa_D_Stat : 53|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaSelPoa_D_Stat : 55|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaScan_D_Stat : 41|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaLongCtl_D_RqDrv : 44|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ApaGearShif_D_RqDrv : 47|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ApaActvSide2_D_Stat : 33|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ ApaAcsy_D_RqDrv : 36|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ ApaTrgtDist_D_Stat : 11|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ ApaMsgTxt_D_Rq : 15|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ ApaChime_D_Rq : 39|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ EPASExtAngleStatReq : 23|1@0+ (1,0) [0|1] "SED" PSCM,GWM,ABS_ESC
+ SG_ ExtSteeringAngleReq2 : 22|15@0+ (0.1,-1000) [-1000|2276.5] "Degrees" GWM,PSCM
+
+BO_ 877 HEV_Powertrain_Data7_FD1: 8 PCM_HEV
+ SG_ RngImpctDrv_L_Dsply : 39|9@0+ (1,-255) [-255|256] "km" GWM
+ SG_ RngImpctClim_L_Dsply : 16|9@0+ (1,-255) [-255|256] "km" GWM
+ SG_ VehElEffAvg_No_Dsply : 23|7@0+ (10,-100) [-100|1150] "wattHr/km" GWM
+ SG_ PwFlwFuelDrv_D_Dsply : 15|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ PwFlwFuelClimt_B_Dsply : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwFlwFuelBatt_B_Dsply : 1|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwFlwBattClimt_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ PwFlwBatt_D_Dsply : 7|4@0+ (1,0) [0|15] "SED" GWM
+
+BO_ 589 Battery_Traction_5_FD1: 8 GWM
+ SG_ BattTrac2_Pw_LimChrg : 31|13@0+ (50,0) [0|409550] "watts" PCM_HEV
+ SG_ BattTrac2_Pw_LimDchrg : 34|13@0+ (50,0) [0|409550] "watts" PCM_HEV
+ SG_ BattTrac2_Pw_DchrgInst : 53|13@0+ (50,0) [0|409550] "watts" PCM_HEV
+ SG_ BattTrac2_Pw_ChrgInst : 7|13@0+ (50,0) [0|409550] "watts" PCM_HEV
+
+BO_ 588 Battery_Traction_4_FD1: 8 GWM
+ SG_ BattTracSoc2_Pc_Actl : 29|14@0+ (0.01,0) [0|163.81] "%" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTrac_Te_Actl : 9|10@0+ (0.5,-50) [-50|460.5] "degC" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracDiagClr_B_Rq : 30|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 587 Battery_Traction_3_FD1: 8 GWM
+ SG_ BattTracClnt_Te_Actl : 41|8@0+ (0.5,-60) [-60|67.5] "degC" SOBDMC_HPCM_FD1
+ SG_ BattTracWarnLamp_B_Rq : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ BattTracSrvcRqd_B_Rq : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ BattTracSoc_Pc_MxPrtct : 35|10@0+ (0.1,0) [0|100] "%" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracSoc_Pc_MnPrtct : 29|10@0+ (0.1,0) [0|100] "%" PCM_HEV
+ SG_ BattTracSoc_Pc_LimLo : 23|10@0+ (0.1,0) [0|100] "%" PCM_HEV
+ SG_ BattTracSoc_Pc_LimHi : 1|10@0+ (0.1,0) [0|100] "%" PCM_HEV
+
+BO_ 389 PreCond_Hev_Data2_FD1: 8 SOBDMC_HPCM_FD1
+ SG_ BattTracClntFlw_Pc_Rq : 63|7@0+ (1,0) [0|127] "percent" GWM
+ SG_ HtrnOvrTeLamp_B_Dsply : 5|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HtrnMil_D_Rq : 7|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ HtrnAin_UHi_Actl : 39|10@0+ (0.5,0) [0|510.5] "volt" GWM,PCM_HEV
+ SG_ HtrnSrvcRqd_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HtrnHvilOpen_B_Actl : 24|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV
+ SG_ PtWakeupDeltaT_T_Rq : 2|11@0+ (1,0) [0|2045] "minute" GWM
+ SG_ PreCondActv_B_Actl : 50|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DrvCondTpRrDefrs_B_Rq : 49|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BattTrac_I_EstVsc : 23|15@0+ (0.05,-750) [-750|888.25] "Amps" GWM
+
+BO_ 1009 APIM_Send_Signals1_FD1: 8 GWM
+ SG_ ChrgCordUnlock_B_Rq : 60|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AutoHoldSwtch_D_Stat3 : 50|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ TrlrTrgtAcquire_D_Rq : 63|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ TrlrAidCancl_B_Rq : 48|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM
+ SG_ CenterStackRing_D_Actl : 59|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ APIM_NumberofTracks_St : 39|16@0+ (1,0) [0|65535] "unitless" Vector__XXX
+ SG_ APIM_ActiveTrackNum_St : 7|32@0+ (1,0) [0|4294967295] "unitless" Vector__XXX
+ SG_ ValetMode_D_Stat : 57|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TrlrAidSetup_D_Stat : 55|3@0+ (1,0) [0|7] "SED" Vector__XXX
+
+BO_ 360 Gear_Shift_by_Wire_2_FD1: 8 GWM
+ SG_ GsmSrvcRqd_B_Rq : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TrnGearPwmFalt_B_Actl : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ GearButtnStuck_B_Actl : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+
+BO_ 122 Battery_Traction_1_FD1: 8 GWM
+ SG_ BattTrac_U_LimLo : 47|8@0+ (2,0) [0|510] "volt" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTrac_U_LimHi : 39|8@0+ (2,0) [0|510] "volt" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ VehStrtInhbt_B_RqBatt : 23|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracOffFst_D_Actl : 22|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracOff_B_Actl : 20|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTracMil_D_Rq : 19|2@0+ (1,0) [0|3] "SED" PCM_HEV
+ SG_ BattTrac_U_Actl : 17|10@0+ (0.5,0) [0|510.5] "Volts" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ BattTrac_I_Actl : 6|15@0+ (0.05,-750) [-750|888.25] "Amps" SOBDMC_HPCM_FD1,PCM_HEV
+
+BO_ 90 Gear_Shift_by_Wire_FD1: 8 GWM
+ SG_ TrnGsmNtmState_D_Actl : 55|2@0+ (1,0) [0|3] "SED" ABS_ESC,PCM,PCM_HEV,TCM_DSL
+ SG_ DrQltyDrv_D_StatGsm : 42|3@0+ (1,0) [0|7] "SED" ABS_ESC,PCM,PCM_HEV,TCM_DSL,IPMA_ADAS
+ SG_ TrnBtsiOvrrd_B_Stat : 43|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ GsmGearMsgTxt_D_Rq : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TrnRng_D_RqGsm : 51|4@0+ (1,0) [0|15] "SED" PCM,TCM_DSL
+ SG_ PrkBrkActv_D_RqGsmGear : 53|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ TrnValidGearRq_D_Stat : 25|2@0+ (1,0) [0|3] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearRqCnt_B_Actl : 26|1@0+ (1,0) [0|1] "unitless" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_U_Actl : 23|8@0+ (0.05,0) [0|12.7] "VOLT" TCM_DSL
+ SG_ TrnGearButtn_B_ActlR2 : 8|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlR1 : 9|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlR0 : 10|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlP2 : 11|1@0+ (1,0) [0|1] "SED" TCM_DSL,PCM,PCM_HEV
+ SG_ TrnGearButtn_B_ActlP1 : 12|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlP0 : 13|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlN2 : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlN1 : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlN0 : 0|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlM2 : 1|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlM1 : 2|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlM0 : 3|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlD2 : 4|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlD1 : 5|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGearButtn_B_ActlD0 : 6|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGear_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" SOBDMC_HPCM_FD1,PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGear_No_Cnt : 47|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1,PCM,PCM_HEV,TCM_DSL
+ SG_ TrnGear_D_RqDrv : 31|5@0+ (1,0) [0|31] "SED" SOBDMC_HPCM_FD1,PCM,PCM_HEV,TCM_DSL
+ SG_ BrkSwtchPos_B_ActlGsm : 7|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+
+BO_ 1091 TrailerInfo_FD1: 8 GWM
+ SG_ ParkLampTrlrOut_B_Stat : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TrlrLampCtl_D_Stat : 4|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TrlrBattChrg_D_Stat : 2|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ StopLampTrlrOut_B_Stat : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TurnLampTrlrRr_B_Stat : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TurnLampTrlrRl_B_Stat : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TrlrLampCnnct_B_Actl : 7|1@0+ (1,0) [0|1] "SED" VDM,PCM_HEV,ECM_Diesel,PCM,TCM_DSL,ABS_ESC,IPMA_ADAS,PSCM
+
+BO_ 138 ActiveFrontStrg_Stat2_FD1: 8 GWM
+ SG_ SteWhlRelCalib_T_Actl : 7|8@0+ (1,0) [0|255] "ms" ABS_ESC
+ SG_ SteWhlRelCalib_An_Sns : 15|15@0+ (0.1,-1600) [-1600|1676.5] "deg" CMR_DSMC,PSCM,TCCM
+
+BO_ 131 Steering_Data_FD1: 8 GWM
+ SG_ HeadLghtHiFlash_D_Stat : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TurnLghtSwtch_D_Stat : 5|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM
+ SG_ WiprFront_D_Stat : 3|4@0+ (1,0) [0|15] "SED" ABS_ESC,IPMA_ADAS,PCM,PCM_HEV
+ SG_ LghtAmb_D_Sns : 15|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ AccButtnGapDecPress : 12|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ AccButtnGapIncPress : 11|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ AslButtnOnOffCnclPress : 10|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ AslButtnOnOffPress : 9|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ CcAslButtnCnclPress : 8|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ LaSwtchPos_D_Stat : 23|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ CcAslButtnCnclResPress : 21|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcAslButtnDeny_B_Actl : 20|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcAslButtnIndxDecPress : 19|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ CcAslButtnIndxIncPress : 18|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ CcAslButtnOffCnclPress : 17|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnOnOffCncl : 16|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnOnPress : 31|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcAslButtnResDecPress : 30|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAslButtnResIncPress : 29|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcAslButtnSetDecPress : 28|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcAslButtnSetIncPress : 27|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcAslButtnSetPress : 26|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CcAsllButtnResPress : 25|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcButtnOffPress : 24|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcButtnOnOffCnclPress : 39|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcButtnOnOffPress : 38|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ CcButtnOnPress : 37|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ HeadLghtHiFlash_D_Actl : 36|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ HeadLghtHiOn_B_StatAhb : 34|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ AhbStat_B_Dsply : 33|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AccButtnGapTogglePress : 32|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ WiprFrontSwtch_D_Stat : 47|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ HeadLghtHiCtrl_D_RqAhb : 43|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ TjaButtnOnOffPress : 40|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+
+BO_ 787 Power_Liftgate_Stat_FD1: 8 GWM
+ SG_ DrLckCnt_No_ActlTgate : 12|4@0+ (1,0) [0|15] "unitless" Vector__XXX
+ SG_ DrTgateChime2_D_Rq : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ DrTGate_D_Rq : 2|2@0+ (1,0) [0|3] "SED" ECM_Diesel
+ SG_ PwLftgtIntSw_B_Stat : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Power_Liftgate_Mode_Stt : 4|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 953 Body_Info_8_FD1: 8 GWM
+ SG_ BattRgenLoDChrg_D_Rq : 27|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM
+ SG_ BattRgenLoChrg_D_Rq : 25|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM
+ SG_ ChrgCordLck_B_Stat : 31|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ChrgCordResp2_No_Actl : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ ChrgCordResp1_No_Actl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ WakeAlarm3_D_Stat : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ WakeAlarm2_D_Stat : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ WakeAlarm1_D_Stat : 5|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM_HEV
+ SG_ WakeAlarm0_D_Stat : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1093 TrailerBrakeInfo_FD1: 8 GWM
+ SG_ TrlBrkInitOut_D_Stat : 10|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TrlrBrkOut_No_Dsply : 23|4@0+ (1,0) [0|15] "unitless" Vector__XXX
+ SG_ TrlrBrkMde_D_Actl : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TrlrBrkGain_No_Actl : 15|5@0+ (0.5,0) [0|15.5] "unitless" Vector__XXX
+ SG_ TrlrBrkDsply_B_Rq : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TrlrBrkDcnnt_B_Actl : 5|1@0+ (1,0) [0|1] "SED" VDM
+ SG_ TrlrBrkActCnnct_B_Actl : 6|1@0+ (1,0) [0|1] "SED" VDM,ECM_Diesel,PCM,TCM_DSL,ABS_ESC,PSCM,TCCM,IPMA_ADAS
+ SG_ StopLamp_B_RqTrlrBrk : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TrlrBrkCtl_B_Falt : 4|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ TrlrBrkActCirct_B_Falt : 1|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+
+BO_ 792 IPC_Send_Signals_2_FD1: 8 GWM
+ SG_ FuelRange_L_Dsply : 45|14@0+ (0.1,0) [0|1638.3] "km" ECM_Diesel
+ SG_ ElTrip_L_Dsply : 31|16@0+ (0.1,0) [0|6553.3] "unitless" Vector__XXX
+ SG_ ElLongTerm_L_Dsply : 7|24@0+ (0.1,0) [0|1677721.3] "unitless" Vector__XXX
+
+BO_ 968 Cluster_Lighting_Rq_FD1: 8 GWM
+ SG_ SlMde_D_Rq : 27|2@0+ (1,0) [0|3] "SED" ECM_Diesel
+ SG_ IsaOffst_D_Rq : 31|4@0+ (1,0) [0|15] "SED" ECM_Diesel
+
+BO_ 819 Pass_Dr_Stat_FD1: 8 GWM
+ SG_ RollCode_No_ActlPdm : 31|16@0+ (1,0) [0|65535] "Unitless" Vector__XXX
+ SG_ Memory_3_SwPsngr_Stat : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Memory_2_SwPsngr_Stat : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Memory_1_SwPsngr_Stat : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ BLISLEDStatPassSide : 2|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ WndwPsngrSide_D_Stat : 4|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM
+ SG_ Pasngr_Lock_Sw_Stat : 6|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Pasngr_Lock_Sw_Cnt : 15|8@0+ (1,0) [0|255] "Cnt" Vector__XXX
+ SG_ ChildLckFdbckRp_B_Stat : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 818 Driver_Dr_Stat_FD1: 8 GWM
+ SG_ BLISLEDStatDriverSide : 47|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ ChildLckPw_N_Cnt : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ WndwDrvSide_D_Stat : 1|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM
+ SG_ RollCodeDrvDrKeyCyl : 23|16@0+ (1,0) [0|65535] "Unitless" Vector__XXX
+ SG_ KeyCylSwDrvDr_D_Stat : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Driver_Lock_Sw_Stat : 5|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Driver_Lock_Sw_Cnt : 15|8@0+ (1,0) [0|255] "Cnt" Vector__XXX
+ SG_ ChildLckPw_D_Rq : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ChildLckFdbckRd_B_Stat : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ RvrseMirrorChime_B_Rq : 45|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 806 Compressor_Req_FD1: 8 GWM
+ SG_ SnowPlowMde_B_Enbl : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ StopStrtDrvMde_B_RqBtn : 3|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM
+ SG_ HvacHtrCore_Te_Rq : 49|10@0+ (0.25,-50) [-50|205.75] "degC" PCM_HEV,SOBDMC_HPCM_FD1,ECM_Diesel
+ SG_ ClimtHeat_D_Rq : 20|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV
+ SG_ ClimtCool_D_Rq : 23|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV
+ SG_ HvacEvap_Te_Rq : 33|10@0+ (0.125,-50) [-50|77.875] "Degrees C" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV
+ SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50) [-50|77.75] "Degrees C" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV
+ SG_ HvacAirCond_B_Rq : 7|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ HvacEvap_Te_Offst : 1|10@0+ (0.125,-50) [-50|77.875] "Degrees C" ECM_Diesel,PCM,PCM_HEV
+ SG_ ClimtPw_B_Rq : 5|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM
+
+BO_ 765 Mc_Send_Signals_2_FD1: 8 GWM
+ SG_ Mc_VehTimeFrmtUsrSel_St : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Running_Board_Cmd : 21|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ EngExhMdeQuiet_D2_Rq : 55|3@0+ (1,0) [0|7] "SED" PCM
+ SG_ EdmSailMde_B_RqDrv : 48|1@0+ (1,0) [0|1] "SED" ECM_Diesel
+ SG_ DrvInputRequired_B_Rq : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AwdRnge_D_ActlIpc : 29|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ BalrSwtch_D_Stat : 57|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ BalrMde_D_Rq : 59|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ WaitToStartLamp_D_Falt : 50|2@0+ (1,0) [0|3] "SED" ECM_Diesel
+ SG_ EsaOn_B_Rq : 15|1@0+ (1,0) [0|1] "SED" PSCM
+ SG_ BttOn_B_Rq : 26|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ Btt_L_Actl : 39|7@0+ (0.1,0) [0|12.5] "meter" IPMA_ADAS
+ SG_ SelDrvMdeTxtReset_B_Rq : 40|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ SelDrvMdeDsply_B_Avail : 41|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ Mc_VehUntTrpCoUsrSel_St : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Mc_VehUnitTempUsrSel_St : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Mc_VehLangUsrSel_St : 7|6@0+ (1,0) [0|63] "SED" Vector__XXX
+
+BO_ 559 ElecHorizon_Data2_FD1: 8 GWM
+ SG_ EhData2_No_Actl : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" IPMA_ADAS,ECM_Diesel
+
+BO_ 558 ElecHorizon_Data1_FD1: 8 GWM
+ SG_ EhData1_No_Actl : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" IPMA_ADAS,ECM_Diesel
+
+BO_ 934 Side_Detect_L_Stat: 8 IPMA_ADAS
+ SG_ CtaAlrtLeft2_D_Stat : 30|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ CtaBrkLeftMsgTxt_B_Rq : 42|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CtaLeftBrkDecel_B_Rq : 7|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ CtaLeftBrkEnbl_B_Rq : 31|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ Side_Detect_L_Illum : 39|8@0+ (1,0) [0|255] "Percent" GWM
+ SG_ BttLeft_D_Stat : 45|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ BttLeft_D_RqDrv : 47|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CtaSnsLeft_D_Stat : 25|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SodDetctLeft_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ CtaLeft_D_Stat : 18|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ CtaAlrtLeft_D_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SodLeft_D_Stat : 15|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ SodSnsLeft_D_Stat : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SodAlrtLeft_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SodWarnLeft_Prd_Rq : 6|7@0+ (1,0) [0|127] "millisecond" GWM
+
+BO_ 1072 Cluster_Info1_FD1: 8 GWM
+ SG_ LscmbbStat_B_Actl : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ HaDsplyCpblty_B_Stat : 42|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ AccDeny_B_RqIpc : 7|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ DrvSlipCtlMde_D_Rq : 33|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ EngIdlShutDown_B_RqDrv : 3|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ HsaMde_D_Rq : 54|2@0+ (1,0) [0|3] "SED" ABS_ESC
+ SG_ NtrlTowMdeEnbl_B_RqDrv : 1|1@0+ (1,0) [0|1] "SED" TCCM,TCM_DSL,PCM_HEV,PCM
+ SG_ BulbChkActv_B_Stat : 55|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ParkDetect_Stat : 52|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM
+ SG_ ReducedGuard_D_Rq : 51|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TrlrBrkMde_D_Rq : 57|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TRLR_SWAY_CONFIG_CMD : 56|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ TRAILER_BRAKE_CONFIG : 37|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Power_Liftgate_Mode_Cmd : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ AccEnbl_B_RqDrv : 35|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ OdometerMasterValue : 15|24@0+ (1,0) [0|16777214] "km" VDM,SOBDMC_HPCM_FD1,TCCM,CMR_DSMC,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM,TCM_DSL
+ SG_ EngOilLife_B_RqReset : 43|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ ePRNDL_MODE : 0|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ DrvSlipCtlMde_B_Rq2 : 34|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ MetricActv_B_Actl : 6|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ KeyTypeChngMykey_D_Rq : 41|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ManRgen_D_Rq : 5|2@0+ (1,0) [0|3] "SED" ECM_Diesel
+
+BO_ 909 Body_Info_6_FD1: 8 GWM
+ SG_ IgnPsswrdDsply_B_Rq : 57|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ ElPwPoint_D_Rq : 59|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PoliceIdlMde_D_Stat : 55|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ DrLatchMsgTxt_D_Rq : 43|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ SecurityMsgTxt_D_Rq : 47|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PrmtrAlrmEvnt_D_Stat : 35|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ HeadLghtHiPrmsn_D_Stat : 51|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ SteWhlLckMsgTxt_D_Rq : 25|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ immoMsgTxt_D_Rq : 39|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ PrsnlDevcChrgEnbl_B_Rq : 40|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TracKeyMde_D_Stat : 45|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PEBackupSlot_Stats : 27|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ KeyMykeyTot_No_Cnt : 3|4@0+ (1,0) [0|15] "Counts" Vector__XXX
+ SG_ Keycode_Status : 15|20@0+ (1,0) [0|1048575] "unitless" Vector__XXX
+ SG_ KeyAdmnTot_No_Cnt : 7|4@0+ (1,0) [0|15] "Counts" Vector__XXX
+
+BO_ 963 BCM_Lamp_Stat_FD1: 8 GWM
+ SG_ Illuminated_Entry_Stat : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Dr_Courtesy_Light_Stat : 49|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Courtesy_Delay_Status : 51|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ImpactEvntFdbck_D_Stat : 53|2@0+ (1,0) [0|3] "SED" CMR_DSMC
+ SG_ WrlssAcsyChrgInhbt_B_Rq : 40|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PudLampPsngr_D_Rq : 57|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ HeadLampLoOut_B_Stat : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CrnrLghtRight_Pc_Rq : 47|7@0+ (1,0) [0|100] "percent" Vector__XXX
+ SG_ CrnrLghtLeft_Pc_Rq : 39|7@0+ (1,0) [0|100] "percent" Vector__XXX
+ SG_ HeadLghtHiFdbck_D_Stat : 55|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PudLampDrv_D_Rq : 59|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ TrnNotInPrkChime_B_Rq : 24|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PrkLightChime_B_Rq : 25|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ KeyInIgnWarn_B_Cmd : 27|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ HomeSafeLtChime_B_Rq : 28|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ StopLghtOn_B_Stat : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ RvrseLghtOn_B_Stat : 9|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PrkLght_D_Stat : 13|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ HeadLghtSwtch_D_Stat : 15|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ HeadLampLoFrOn_B_Stat : 2|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ HeadLampLoFlOn_B_Stat : 3|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ HeadLampLoActv_B_Stat : 4|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PCM,ECM_Diesel
+ SG_ Headlamp_On_Wrning_Cmd : 29|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Park_Brake_Chime_Rqst : 26|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ HeadLghtHiOn_B_Stat : 1|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM
+ SG_ BrkWarnInd_B_Rq : 20|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Brk_Fluid_Lvl_Low : 31|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ ReducedGuard_D_Stat : 19|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Perimeter_Alarm_Status : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ Courtesy_BSave_Stat : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ DrTgateLck_D_Stat : 61|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ WndwGlbl_D_Cmd : 23|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ PudLamp_D_Rq : 11|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ DayRnngLampOn_B_Stat : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PerimeterAlarmChimeRq : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 145 Yaw_Data_FD1: 8 GWM
+ SG_ VehYawWActl_D_Qf : 53|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ABS_ESC
+ SG_ VehRolWActl_D_Qf : 55|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ABS_ESC
+ SG_ VehRollYawW_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,ABS_ESC
+ SG_ VehRollYaw_No_Cnt : 47|8@0+ (1,0) [0|255] "Unitless" VDM,IPMA_ADAS,ABS_ESC
+ SG_ VehYaw_W_Actl : 23|16@0+ (0.0002,-6.5) [-6.5|6.6066] "rad/s" VDM,ABS_ESC,PSCM,IPMA_ADAS
+ SG_ VehRol_W_Actl : 7|16@0+ (0.0002,-6.5) [-6.5|6.6066] "rad/s" VDM,ABS_ESC,IPMA_ADAS
+
+BO_ 76 RCMStatusMessage2_FD1: 8 GWM
+ SG_ FirstRowBuckleMid : 28|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ SecondRowBucklePsngr : 23|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ SecondRowBuckleMid : 9|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ SecondRowBuckleDriver : 11|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ FirstRowBuckleDriver : 15|2@0+ (1,0) [0|3] "SED" CMR_DSMC,ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL
+ SG_ RILReq : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ FirstRowBucklePsngr : 13|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ RstrnImpactEvntStatus : 3|3@0+ (1,0) [0|7] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL
+ SG_ PsngrFrntDetct_D_Actl : 5|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ EDRTriggerEvntSync : 29|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ PassRstrnInd_Req : 31|2@0+ (1,0) [0|3] "SED" Vector__XXX
+
+BO_ 65 Global_PATS_Cntrl_Info_FD1: 8 GWM
+ SG_ immoControlData_T1 : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" ECM_Diesel,PCM,PCM_HEV
+ SG_ immoControlCmd_T1 : 7|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV
+
+BO_ 1076 Cluster_Info_3_FD1: 8 GWM
+ SG_ HILL_DESC_SW : 32|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ AutoRgen_D_Rq : 34|2@0+ (1,0) [0|3] "SED" ECM_Diesel
+ SG_ W2S_LAMP_OK : 37|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ OdoTripRx_B_Actl : 2|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ Veh_V_CompLimMx : 47|12@0+ (0.1,0) [0|409.5] "km/h" ECM_Diesel,PCM,PCM_HEV
+ SG_ DrvSlipCtlMde_B_RqMyKey : 38|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ FuelLvlWarn_D_Actl : 51|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ FuelSecndActv_B_Actl : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ FuelLvlPssvSide_No_Raw : 17|10@0+ (1,0) [0|1023] "Unitless" ECM_Diesel,PCM,PCM_HEV
+ SG_ FUEL_SENSOR_NUM : 35|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ FuelLvlActvSide_No_Raw : 49|10@0+ (1,0) [0|1023] "Unitless" ECM_Diesel,PCM,PCM_HEV
+ SG_ FuelLvl_Pc_Dsply : 1|10@0+ (0.108696,-5.217408) [-5.217408|105.9786] "Percent" VDM,ECM_Diesel
+ SG_ DISPLAY_SPEED_SCALING : 23|4@0+ (0.5,100) [100|107.5] "%" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV
+ SG_ DISPLAY_SPEED_OFFSET : 7|3@0+ (0.5,0) [0|3.5] "kph" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV
+
+BO_ 862 Climate_Cntrl_Data_2_FD1: 8 GWM
+ SG_ AutoStpHvacDelta_I_Est : 15|8@0+ (1,-192) [-192|62] "ampere" Vector__XXX
+ SG_ HvacBlwrFront_D_Stat : 55|5@0+ (1,0) [0|31] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ CabnAmb_Te_Actl : 39|8@0+ (0.5,-57) [-57|70] "degreesC" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ HvacRemoteStrt_N_Rq : 7|4@0+ (100,450) [450|1950] "RPM" ECM_Diesel,PCM,PCM_HEV
+ SG_ ClimtThrmlLoad_No_Actl : 47|8@0+ (1,0) [0|254] "unitless" SOBDMC_HPCM_FD1,PCM_HEV
+ SG_ HvacRec_Pc_Est : 23|7@0+ (1,0) [0|127] "Percent" PCM_HEV,SOBDMC_HPCM_FD1
+ SG_ HvacAir_Flw_Est : 16|9@0+ (0.5,0) [0|255.5] "liter/second" SOBDMC_HPCM_FD1
+
+BO_ 931 Body_Info_9_FD1: 8 GWM
+ SG_ PtWakeReas_D_Stat : 38|4@0+ (1,0) [0|15] "SED" PCM_HEV
+ SG_ VehOnSrc_D_Stat : 19|4@0+ (1,0) [0|15] "SED" ABS_ESC,PCM_HEV,ECM_Diesel,PCM
+ SG_ StrtrMtrCtlDStat_No_Cs : 31|8@0+ (1,0) [0|255] "unitless" PCM_HEV,ECM_Diesel,PCM
+ SG_ EngStrtActv_B_Stat : 39|1@0+ (1,0) [0|1] "SED" PCM_HEV,ECM_Diesel,PCM
+ SG_ EngStrt_B_Rq : 0|1@0+ (1,0) [0|1] "SED" PCM_HEV,ECM_Diesel,PCM
+ SG_ DrvInCtl_B_Stat : 1|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ AdvStrt_D_Stat : 23|4@0+ (1,0) [0|15] "SED" PCM_HEV,ECM_Diesel,PCM
+ SG_ CrnkInhbt_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" ECM_Diesel,PCM,PCM_HEV
+ SG_ CrnkInhbt_No_Cnt : 6|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel,PCM,PCM_HEV
+ SG_ CrnkInhbt_B_Stat : 7|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ IgnPreOffActv_B_Stat : 2|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+
+BO_ 578 Body_Info_4_FD1: 8 GWM
+ SG_ PtLatchActv_B_RqBcm : 56|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL
+ SG_ immoSecureIdleMode : 61|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ ReFuelSwtchStat_D_Actl : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ FuelPumpPwr_D_Stat : 50|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ BattULo_U_Actl : 39|8@0+ (0.0625,0) [0|15.875] "volt" CMR_DSMC,SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,PSCM,ECM_Diesel,PCM,PCM_HEV
+ SG_ PrkLckCtl_B_Enbl : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PrkLckCtlMsgTxt_D_Rq : 55|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PrkLckCtlAvail_T_Stat : 47|8@0+ (1,0) [0|255] "second" Vector__XXX
+ SG_ BrkTrnShifLck_B_Stat : 23|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL
+ SG_ PrkLckCtlUnlck_D_Stat : 58|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ PrkLckCtlTow_B_Enbl : 59|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DriverCrankingReq : 51|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ EngOff_T_Actl : 7|16@0+ (1,0) [0|65534] "second^0.5" ABS_ESC,IPMA_ADAS,TCCM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL
+ SG_ DcacElPw_D_Rq : 53|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM
+ SG_ BattULo_I_Actl : 21|14@0+ (0.0625,-512) [-512|511.875] "ampere" ECM_Diesel,PCM,PCM_HEV
+
+BO_ 947 BodyInfo_3_FD1: 8 GWM
+ SG_ ValetMode_D_Mem : 16|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DimmingLvlEvnt_No_Actl : 18|2@0+ (1,0) [0|3] "unitless" Vector__XXX
+ SG_ DrStatDrvErrCnt_B_Stat : 19|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ TurnLghtRight_D_Rq : 63|2@0+ (1,0) [0|3] "SED" CMR_DSMC,IPMA_ADAS
+ SG_ TurnLghtRightOn_B_Stat : 35|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ TurnLghtLeftOn_B_Stat : 54|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ FogLghtRearOn_B_Stat : 1|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ Backlit_LED_Status : 23|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ TurnLghtLeft_D_Rq : 9|2@0+ (1,0) [0|3] "SED" CMR_DSMC,IPMA_ADAS
+ SG_ FogLghtFrontOn_B_Stat : 56|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ IgnKeyType_D_Actl : 39|4@0+ (1,0) [0|15] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV
+ SG_ Parklamp_Status : 3|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ Litval : 47|8@0+ (1,0) [0|253] "SED" IPMA_ADAS
+ SG_ Key_In_Ignition_Stat : 11|1@0+ (1,0) [0|1] "SED" ABS_ESC
+ SG_ Ignition_Status : 7|4@0+ (1,0) [0|15] "SED" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL
+ SG_ Dimming_Lvl : 31|8@0+ (1,0) [0|253] "SED" IPMA_ADAS
+ SG_ Day_Night_Status : 15|2@0+ (1,0) [0|3] "SED" CMR_DSMC,ECM_Diesel,IPMA_ADAS,PCM
+ SG_ Remote_Start_Status : 13|2@0+ (1,0) [0|3] "SED" CMR_DSMC,IPMA_ADAS
+ SG_ DrStatTgate_B_Actl : 0|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ DrStatRr_B_Actl : 49|1@0+ (1,0) [0|1] "SED" ABS_ESC,IPMA_ADAS
+ SG_ DrStatRl_B_Actl : 48|1@0+ (1,0) [0|1] "SED" ABS_ESC,IPMA_ADAS
+ SG_ DrStatPsngr_B_Actl : 60|1@0+ (1,0) [0|1] "SED" CMR_DSMC,ABS_ESC,IPMA_ADAS
+ SG_ DrStatInnrTgate_B_Actl : 58|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ DrStatHood_B_Actl : 59|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DrStatDrv_B_Actl : 61|1@0+ (1,0) [0|1] "SED" CMR_DSMC,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,TCCM
+ SG_ PrkBrkActv_B_Actl : 55|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,TCCM,TCM_DSL
+ SG_ LifeCycMde_D_Actl : 53|4@0+ (1,0) [0|15] "SED" VDM,SOBDMC_HPCM_FD1,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM,TCM_DSL
+ SG_ Delay_Accy : 57|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CrashEvnt_D_Stat : 34|2@0+ (1,0) [0|3] "SED" Vector__XXX
+ SG_ FuelPmpInhbt_B_Stat : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ BodySrvcRqd_B_Rq : 10|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 1084 Battery_Mgmt_3_FD1: 8 GWM
+ SG_ BattULoChrg_URate_RqMx : 63|6@0+ (0.1,0) [0|6.3] "volts/second" ECM_Diesel,PCM,PCM_HEV
+ SG_ BattULoChrg_U_RqMx : 55|6@0+ (0.1,10.6) [10.6|16.9] "volt" ECM_Diesel,PCM,PCM_HEV
+ SG_ BattULoChrg_U_RqMn : 45|6@0+ (0.1,10.6) [10.6|16.9] "volt" ECM_Diesel,PCM,PCM_HEV
+ SG_ BattULoState_D_Qlty : 47|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ BSFault : 7|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV
+ SG_ BattULo2_Te_Actl : 30|7@0+ (1,-40) [-40|86] "degC" ECM_Diesel,PCM,PCM_HEV
+ SG_ BSBattSOC : 22|7@0+ (1,0) [0|127] "%" ECM_Diesel,PCM,PCM_HEV
+ SG_ BSBattQDeltaRideAh : 6|15@0+ (0.0078125,-100) [-100|155.9921875] "ampere*hour" ECM_Diesel,PCM,PCM_HEV
+ SG_ BSBattQCapAh : 38|7@0+ (1,0) [0|127] "ampere*hour" ECM_Diesel,PCM,PCM_HEV
+
+BO_ 1068 Battery_Mgmt_2_FD1: 8 GWM
+ SG_ EngStrtInhbt_B_RqBatt : 2|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM
+ SG_ BattULoChrg_D_Rq : 7|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM
+ SG_ PwSysULoFalt_D_Stat : 12|4@0+ (1,0) [0|15] "SED" Vector__XXX
+ SG_ Shed_T_Eng_Off_B : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Shed_Feature_Group_ID : 20|5@0+ (1,0) [0|31] "SED" ECM_Diesel,PCM,PCM_HEV,IPMA_ADAS
+ SG_ Shed_Drain_Eng_Off_B : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Shed_Level_Req : 23|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,IPMA_ADAS
+ SG_ BattULoSrvc_T_Actl : 39|12@0+ (1,0) [0|4095] "days" Vector__XXX
+ SG_ ULoRgenTestMde_B_Rq : 31|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM
+ SG_ ChargeMode : 15|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM
+ SG_ IdleSpeedIncrease_El : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ Batt_Lo_SoC_B : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ PeriodicElLoad_B_Stat : 1|1@0+ (1,0) [0|1] "SED" ECM_Diesel
+ SG_ Batt_Crit_SoC_B : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 146 Accel_Data_FD1: 8 GWM
+ SG_ VehVert2_A_Actl : 36|13@0+ (0.01,-40) [-40|41.89] "m/s^2" VDM,TCCM,IPMA_ADAS,ABS_ESC,ECM_Diesel
+ SG_ VehLatLongVertA_No_Cs : 55|8@0+ (1,0) [0|255] "Unitless" TCCM,IPMA_ADAS,ABS_ESC
+ SG_ VehLatLongVert_No_Cnt : 63|8@0+ (1,0) [0|255] "Unitless" VDM,TCCM,IPMA_ADAS,ABS_ESC
+ SG_ VehLong2_A_Actl : 20|13@0+ (0.01,-40) [-40|41.89] "m/s^2" VDM,TCCM,ABS_ESC,ECM_Diesel,IPMA_ADAS
+ SG_ VehLat2_A_Actl : 4|13@0+ (0.01,-40) [-40|41.89] "m/s^2" VDM,TCCM,ABS_ESC,ECM_Diesel,IPMA_ADAS
+ SG_ VehVertAActl_D_Qf : 38|2@0+ (1,0) [0|3] "SED" VDM,TCCM,IPMA_ADAS,ABS_ESC
+ SG_ VehLongAActl_D_Qf : 22|2@0+ (1,0) [0|3] "SED" VDM,TCCM,ABS_ESC,ECM_Diesel
+ SG_ VehLatAActl_D_Qf : 6|2@0+ (1,0) [0|3] "SED" VDM,TCCM,ABS_ESC
+
+BO_ 1900 TesterPhysicalResCCM: 64 IPMA_ADAS
+ SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1806 TesterPhysicalResIPMA: 64 IPMA_ADAS
+ SG_ TesterPhysicalResIPMA : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 997 Personality_CCM_Data: 8 IPMA_ADAS
+ SG_ PersIndexCcm_D_Actl : 39|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ FeatNoCcmActl : 23|16@0+ (1,0) [0|65535] "Number" GWM
+ SG_ FeatConfigCcmActl : 7|16@0+ (1,0) [0|65535] "Undefined" GWM
+
+BO_ 983 Steer_Assist_Data: 8 IPMA_ADAS
+ SG_ CmbbObjRelLong_V_Actl : 39|10@0+ (0.1,-102.1) [-102.1|0] "meters/sec" PSCM
+ SG_ CmbbObjRelLat_V_Actl : 23|9@0+ (0.1,-25.5) [-25.5|25.4] "meters/sec" PSCM
+ SG_ CmbbObjDistLong_L_Actl : 7|10@0+ (0.1,0) [0|102.1] "meter" PSCM
+ SG_ CmbbObjDistLat_L_Actl : 45|9@0+ (0.1,-25.5) [-25.5|25.4] "meter" PSCM
+ SG_ CmbbObjConfdnc_D_Stat : 9|2@0+ (1,0) [0|3] "SED" PSCM
+ SG_ CmbbObjColl_T_Actl : 30|7@0+ (0.05,0) [0|6.25] "second" PSCM
+ SG_ CmbbObjClass_D_Stat : 13|4@0+ (1,0) [0|15] "SED" PSCM
+ SG_ EsaEnbl_D2_Rq : 52|2@0+ (1,0) [0|3] "SED" PSCM
+
+BO_ 982 LateralMotionControl2: 8 IPMA_ADAS
+ SG_ LatCtlCrv_NoRate2_Actl : 55|11@0+ (1E-006,-0.001024) [-0.001024|0.001023] "meter^2" PSCM
+ SG_ LatCtlPath_No_Cnt : 60|4@0+ (1,0) [0|15] "Unitless" PSCM
+ SG_ LatCtlPath_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" PSCM
+ SG_ LatCtl_D2_Rq : 6|3@0+ (1,0) [0|7] "SED" PSCM
+ SG_ HandsOffCnfm_B_Rq : 7|1@0+ (1,0) [0|1] "SED" PSCM
+ SG_ LatCtlRampType_D_Rq : 1|2@0+ (1,0) [0|3] "SED" PSCM
+ SG_ LatCtlPrecision_D_Rq : 3|2@0+ (1,0) [0|3] "SED" PSCM
+ SG_ LatCtlPathOffst_L_Actl : 33|10@0+ (0.01,-5.12) [-5.12|5.11] "meter" PSCM
+ SG_ LatCtlPath_An_Actl : 28|11@0+ (0.0005,-0.5) [-0.5|0.5235] "radians" PSCM
+ SG_ LatCtlCurv_No_Actl : 23|11@0+ (2E-005,-0.02) [-0.02|0.02094] "1/meter" PSCM
+
+BO_ 981 GlareFreeBeam: 8 IPMA_ADAS
+ SG_ AdbRamping_T_Rq : 44|4@0+ (200,0) [0|3000] "millisecond" GWM
+ SG_ AdbBrdrTop_An_Rq : 7|8@0+ (0.04,-9.54) [-9.54|0.58] "degrees" GWM
+ SG_ AdbBrdrRight_L_Stat : 37|9@0+ (2,0) [0|1018] "meter" GWM
+ SG_ AdbBrdrRight_An_Rq : 31|10@0+ (0.04,-20.4) [-20.4|20.44] "degrees" GWM
+ SG_ AdbBrdrLeft_L_Stat : 40|9@0+ (2,0) [0|1018] "meter" GWM
+ SG_ AdbBrdrLeft_An_Rq : 9|10@0+ (0.04,-20.4) [-20.4|20.44] "degrees" GWM
+ SG_ AdbBrdrBottom_An_Rq : 15|6@0+ (0.04,-1.86) [-1.86|0.58] "degrees" GWM
+ SG_ AdbBeam_D_Rq : 63|3@0+ (1,0) [0|7] "SED" GWM
+
+BO_ 980 AutoDriveBeam_Data1: 8 IPMA_ADAS
+ SG_ AdbBrdr1DistRigh_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AdbBrdr1DistLeft_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AdbMde1_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbIntns1_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbBrdr1Up_An_Rq : 36|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM
+ SG_ AdbBrdr1Right_An_Rq : 31|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM
+ SG_ AdbBrdr1Low_An_Rq : 8|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM
+ SG_ AdbBrdr1Left_An_Rq : 7|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM
+ SG_ AdbBrdr1CritRigh_T_Stat : 43|4@0+ (100,0) [0|1500] "millisecond" GWM
+ SG_ AdbBrdr1CritLeft_T_Stat : 55|4@0+ (100,0) [0|1500] "millisecond" GWM
+
+BO_ 979 LateralMotionControl: 8 IPMA_ADAS
+ SG_ LatCtlRng_L_Max : 63|6@0+ (2,0) [0|126] "meter" GWM
+ SG_ HandsOffCnfm_B_Rq : 51|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ LatCtl_D_Rq : 36|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ LatCtlRampType_D_Rq : 53|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ LatCtlPrecision_D_Rq : 33|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ LatCtlPathOffst_L_Actl : 47|10@0+ (0.01,-5.12) [-5.12|5.11] "meter" GWM
+ SG_ LatCtlPath_An_Actl : 31|11@0+ (0.0005,-0.5) [-0.5|0.5235] "radians" GWM
+ SG_ LatCtlCurv_NoRate_Actl : 12|13@0+ (2.5E-007,-0.001024) [-0.001024|0.00102375] "1/meter" GWM
+ SG_ LatCtlCurv_No_Actl : 7|11@0+ (2E-005,-0.02) [-0.02|0.02094] "1/meter" GWM
+
+BO_ 976 SuspensionRoad_Data: 8 IPMA_ADAS
+ SG_ SuspClkSync_No_Actl : 55|8@0+ (1,0) [0|253] "unitless" GWM
+ SG_ SrpSigValid_B_Stat : 47|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ SrpHghtRight_L_Actl : 24|9@0+ (0.000625,-0.16) [-0.16|0.158125] "meter" GWM
+ SG_ SrpHghtLeft_L_Actl : 17|9@0+ (0.000625,-0.16) [-0.16|0.158125] "meter" GWM
+ SG_ SrpEventRight_D_Stat : 19|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SrpEventLeft_D_Stat : 21|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ SrpDistRight_L_Actl : 14|9@0+ (0.02,0) [0|10.18] "meter" GWM
+ SG_ SrpDistLeft_L_Actl : 7|9@0+ (0.02,0) [0|10.18] "meter" GWM
+
+BO_ 973 Traffic_RecognitnData: 8 IPMA_ADAS
+ SG_ TsrVl2PrmntMsgTxt_D_Rq : 60|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrVl1PrmntMsgTxt_D_Rq : 41|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrVl2RstrcMsgTxt2_D_Rq : 63|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TsrVl1RstrcMsgTxt2_D_Rq : 51|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TsrOvtkMsgTxt2_D_Rq : 55|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ WwaWarn_B_Rq : 48|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TsrVlUnitMsgTxt_D_Rq : 43|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrVLim2MsgTxt_D_Rq : 39|8@0+ (1,0) [0|255] "SED" GWM
+ SG_ TsrVLim1MsgTxt_D_Rq : 31|8@0+ (1,0) [0|255] "SED" GWM
+ SG_ TsrVl2StatMsgTxt_D_Rq : 47|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrVl2RstrcMsgTxt_D_Rq : 17|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrVl1StatMsgTxt_D_Rq : 21|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrVl1RstrcMsgTxt_D_Rq : 23|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrStatMsgTxt_D_Rq : 10|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TsrOvtkStatMsgTxt_D_Rq : 1|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrOvtkMsgTxt_D_Rq : 15|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TsrOswWarnMsgTxt_D_Rq : 3|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ TsrMsgTxt_D_Rq : 7|4@0+ (1,0) [0|15] "SED" GWM
+
+BO_ 970 Lane_Assist_Data1: 8 IPMA_ADAS
+ SG_ LkaDrvOvrrd_D_Rq : 38|2@0+ (1,0) [0|3] "SED" PSCM
+ SG_ LkaActvStats_D2_Req : 7|3@0+ (1,0) [0|7] "SED" PSCM
+ SG_ LaRefAng_No_Req : 19|12@0+ (0.05,-102.4) [-102.4|102.3] "mrad" PSCM
+ SG_ LaRampType_B_Req : 39|1@0+ (1,0) [0|1] "SED" PSCM
+ SG_ LaCurvature_No_Calc : 15|12@0+ (5E-006,-0.01024) [-0.01024|0.01023] "1/m" PSCM
+ SG_ LdwActvStats_D_Req : 4|3@0+ (1,0) [0|7] "SED" PSCM
+ SG_ LdwActvIntns_D_Req : 1|2@0+ (1,0) [0|3] "SED" PSCM
+
+BO_ 962 AutoDriveBeam_Data3: 8 IPMA_ADAS
+ SG_ AdbBrdr3DistRigh_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AdbBrdr3DistLeft_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AdbMde3_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbIntns3_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbBrdr3Up_An_Rq : 36|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM
+ SG_ AdbBrdr3Right_An_Rq : 31|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM
+ SG_ AdbBrdr3Low_An_Rq : 8|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM
+ SG_ AdbBrdr3Left_An_Rq : 7|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM
+ SG_ AdbBrdr3CritRigh_T_Stat : 43|4@0+ (100,0) [0|1500] "millisecond" GWM
+ SG_ AdbBrdr3CritLeft_T_Stat : 55|4@0+ (100,0) [0|1500] "millisecond" GWM
+
+BO_ 961 AutoDriveBeam_Data2: 8 IPMA_ADAS
+ SG_ AdbBrdr2DistRigh_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AdbBrdr2DistLeft_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AdbMde2_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbIntns2_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AdbBrdr2Up_An_Rq : 36|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM
+ SG_ AdbBrdr2Right_An_Rq : 31|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM
+ SG_ AdbBrdr2Low_An_Rq : 8|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM
+ SG_ AdbBrdr2Left_An_Rq : 7|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM
+ SG_ AdbBrdr2CritRigh_T_Stat : 43|4@0+ (100,0) [0|1500] "millisecond" GWM
+ SG_ AdbBrdr2CritLeft_T_Stat : 55|4@0+ (100,0) [0|1500] "millisecond" GWM
+
+BO_ 394 ACCDATA_3: 8 IPMA_ADAS
+ SG_ HaDsply_No_Cs : 63|8@0+ (1,0) [0|255] "Unitless" GWM
+ SG_ HaDsply_No_Cnt : 4|4@0+ (1,0) [0|15] "Unitless" GWM
+ SG_ AccStopStat_D_Dsply : 41|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AccTrgDist2_D_Dsply : 27|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ AccStopRes_B_Dsply : 54|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ TjaWarn_D_Rq : 50|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ Tja_D_Stat : 44|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ TjaMsgTxt_D_Dsply : 53|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ IaccLamp_D_Rq : 46|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ AccMsgTxt_D2_Rq : 31|4@0+ (1,0) [0|15] "SED" GWM
+ SG_ FcwDeny_B_Dsply : 10|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ FcwMemStat_B_Actl : 13|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AccTGap_B_Dsply : 35|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CadsAlignIncplt_B_Actl : 11|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AccFllwMde_B_Dsply : 17|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CadsRadrBlck_B_Actl : 22|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CmbbPostEvnt_B_Dsply : 15|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AccStopMde_B_Dsply : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ FcwMemSens_D_Actl : 20|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ FcwMsgTxt_D_Rq : 7|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ AccWarn_D_Dsply : 39|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ FcwVisblWarn_B_Rq : 47|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ FcwAudioWarn_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ AccTGap_D_Dsply : 34|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ AccMemEnbl_B_RqDrv : 36|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ FdaMem_B_Stat : 37|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 391 ACCDATA_2: 8 IPMA_ADAS
+ SG_ CmbbBrkDecel_No_Cnt : 47|4@0+ (1,0) [0|15] "Unitless" GWM,ABS_ESC
+ SG_ HudDsplyIntns_No_Actl : 31|8@0+ (0.5,0) [0|100] "%" GWM
+ SG_ HudBlk3_B_Rq : 37|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HudBlk2_B_Rq : 51|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HudBlk1_B_Rq : 50|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ HudFlashRate_D_Actl : 53|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CmbbBrkDecel_No_Cs : 7|8@0+ (1,0) [0|255] "Unitless" GWM,ABS_ESC
+ SG_ CmbbBrkDecel_A_Rq : 12|13@0+ (0.0039,-20) [-20|11.9449] "m/s^2" ABS_ESC,GWM
+ SG_ CmbbBrkPrchg_D_Rq : 55|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+ SG_ CmbbBrkDecel_B_Rq : 15|1@0+ (1,0) [0|1] "SED" ABS_ESC,GWM
+ SG_ CmbbBaSens_D_Rq : 14|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM
+
+BO_ 390 ACCDATA: 8 IPMA_ADAS
+ SG_ AccBrkPulse_B_Rq : 36|1@0+ (1,0) [0|1] "SED" ABS_ESC,GWM
+ SG_ AccAutoResum_D_Rq : 7|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM,ECM_Diesel
+ SG_ AccBrkTot_A_Rq : 4|13@0+ (0.0039,-20) [-20|11.9449] "m/s^2" GWM,ABS_ESC
+ SG_ AccPrpl_A_Pred : 17|10@0+ (0.01,-5) [-5|5.23] "m/s^2" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ AccVeh_V_Trg : 32|9@0+ (0.5,0) [0|255.5] "kph" GWM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL
+ SG_ AccBrkPrkEl_B_Rq : 38|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ Cmbb_B_Enbl : 50|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CmbbOvrrd_B_RqDrv : 51|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CmbbDeny_B_Actl : 37|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ CmbbEngTqMn_B_Rq : 52|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,GWM
+ SG_ AccPrpl_A_Rq : 49|10@0+ (0.01,-5) [-5|5.23] "m/s^2" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ AccDeny_B_Rq : 53|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ AccResumEnbl_B_Rq : 33|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM,PCM_HEV
+ SG_ AccCancl_B_Rq : 39|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC,ECM_Diesel,PCM,PCM_HEV
+ SG_ AccBrkPrchg_B_Rq : 54|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ AccBrkDecel_B_Rq : 55|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC
+ SG_ AccStopStat_B_Rq : 34|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC
+
+BO_ 1441 TCCM_AutoSar_NetwkMgmt: 8 TCCM
+ SG_ TCCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+ SG_ TCCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX
+
+BO_ 1787 TesterPhysicalResSODCMD: 64 IPMA_ADAS
+ SG_ TesterPhysicalResSODCMD : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1779 TesterPhysicalReqSODCMD: 64 TSTR
+ SG_ TesterPhysicalReqSODCMD : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS
+
+BO_ 1786 TesterPhysicalResSODCMC: 64 IPMA_ADAS
+ SG_ TesterPhysicalResSODCMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1778 TesterPhysicalReqSODCMC: 64 TSTR
+ SG_ TesterPhysicalReqSODCMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS
+
+BO_ 1153 All_Terrain_Data_FD1: 8 GWM
+ SG_ TerrMde_D_RqDrv : 3|3@0+ (1,0) [0|7] "SED" Vector__XXX
+
+BO_ 942 ParkAid_Data2: 8 IPMA_ADAS
+ SG_ PrkAidRdiusRight_L_Dsply : 15|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ PrkAidRdiusLeft_L_Dsply : 7|8@0+ (1,0) [0|255] "unitless" GWM
+ SG_ PrkAidDrvDir_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM
+ SG_ PrkAidAcsyRear_D_Stat : 18|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ PrkAidAcsyFront_D_Stat : 20|2@0+ (1,0) [0|3] "SED" GWM
+
+BO_ 930 Bndry_Alert_R_Data: 8 IPMA_ADAS
+ SG_ BalrWndwRight_B_Stat : 19|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrSnsRight_D_Falt : 21|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwPsngrRear_D_RqBalrr : 25|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwPsngr_D_RqBalrr : 27|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwDrvRear_D_RqBalrr : 29|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwDrv_D_RqBalrr : 31|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrRight_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrMdeSelRight_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrMdeRight_D_Stat : 23|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrLckRight_B_Stat : 11|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrChimeRight_D_Rq : 2|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ CamraRearOn_B_RqBalrr : 7|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DrLckCnt_No_ActlBalrr : 5|3@0+ (1,0) [0|7] "unitless" GWM
+ SG_ DrLckActv_B_RqBalrr : 6|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 929 Bndry_Alert_L_Data: 8 IPMA_ADAS
+ SG_ BalrChimeLeft_D_Rq : 2|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrLeft_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrWndwLeft_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ WndwPsngrRear_D_RqBalrl : 25|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwPsngr_D_RqBalrl : 27|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwDrvRear_D_RqBalrl : 29|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ WndwDrv_D_RqBalrl : 31|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrSnsLeft_D_Falt : 21|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrMdeSelLeft_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ BalrMdeLeft_D_Stat : 23|2@0+ (1,0) [0|3] "SED" GWM
+ SG_ BalrLckLeft_B_Stat : 11|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ CamraRearOn_B_RqBalrl : 7|1@0+ (1,0) [0|1] "SED" GWM
+ SG_ DrLckCnt_No_ActlBalrl : 5|3@0+ (1,0) [0|7] "unitless" GWM
+ SG_ DrLckActv_B_RqBalrl : 6|1@0+ (1,0) [0|1] "SED" GWM
+
+BO_ 402 Dsp_Request_Signals11_FD1: 8 GWM
+ SG_ PrkAidSwtch_D_RqMnu : 11|1@0+ (1,0) [0|1] "SED" IPMA_ADAS
+ SG_ ApaSwtch_D_RqMnu : 10|2@0+ (1,0) [0|3] "SED" IPMA_ADAS
+ SG_ ApaMdeStat_D_RqDrv : 2|3@0+ (1,0) [0|7] "SED" IPMA_ADAS
+ SG_ CamraViewSplit_B_Rq : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CamraZoomMan_D_Rq : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ CamraOvrlStat_D_Rq : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CamraOvrlDyn_D_Rq : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ CamAutoTowbarZoom : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX
+ SG_ DistanceBarSetting : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX
+
+BO_ 924 DCACA_Data3_FD1: 8 GWM
+ SG_ DcacOut_Pw_Mx : 34|11@0+ (5,0) [0|10225] "watts" PCM,PCM_HEV
+ SG_ DcacOut2_Pw_Actl : 31|13@0+ (1,0) [0|8189] "watts" PCM_HEV
+ SG_ DcacOut1_Pw_Actl : 12|13@0+ (1,0) [0|8189] "watts" PCM,PCM_HEV
+ SG_ DcacIn_Pw_Mx : 7|11@0+ (5,0) [0|10225] "watts" PCM,PCM_HEV
+
+BO_ 923 DCACA_Data2_FD1: 8 GWM
+ SG_ DcacIn_U2_Actl : 39|12@0+ (0.01,0) [0|40.93] "volt" PCM
+ SG_ DcacIn_U_Actl : 19|12@0+ (0.1,0) [0|409.3] "volt" PCM,PCM_HEV
+ SG_ DcacIn_I_Actl : 15|11@0+ (0.1,0) [0|204.5] "Amps" PCM,PCM_HEV
+ SG_ Dcac_Te_Actl : 7|8@0+ (1,-60) [-60|193] "degC" PCM
+
+BO_ 1998 TesterPhysicalResSODR: 64 IPMA_ADAS
+ SG_ TesterPhysicalResSODR : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1996 TesterPhysicalResSODL: 64 IPMA_ADAS
+ SG_ TesterPhysicalResSODL : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR
+
+BO_ 1988 TesterPhysicalReqSODL: 64 TSTR
+ SG_ TesterPhysicalReqSODL : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS
+
+BO_ 922 DCACA_Data1_FD1: 8 GWM
+ SG_ DcacBp2BrkrOpn_B_Falt : 13|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacBp1BrkrOpn_B_Falt : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacIpRcBrkrOpn_B_Falt : 10|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacRdy_D2_Stat : 23|2@0+ (1,0) [0|3] "SED" PCM,PCM_HEV
+ SG_ DcacOvrld_B_Falt : 8|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacOverTe_B_Falt : 9|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacGfci_B_Falt : 11|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacErr_B_Stat : 12|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacAcUDetct_B_Falt : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacRdy_D_Stat : 2|3@0+ (1,0) [0|7] "SED" Vector__XXX
+ SG_ DcacPlugPrsnt_B_Stat : 3|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV
+ SG_ DcacClntFlw_D_Rq : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+ SG_ CoolFanDcac_D_Rq : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
+
+BO_ 1082 INSTRUMENT_PANEL: 8 GWM
+ SG_ METRIC_UNITS : 54|1@0+ (1,0) [0|1] "SED" IPMA,PCM,PCM_HEV
+
+BO_TX_BU_ 2612224016 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 878 : PCM,PCM_HEV;
+BO_TX_BU_ 1085 : ECM_Diesel,PCM;
+BO_TX_BU_ 2611175440 : ECM_Diesel,PCM_HEV,PCM;
+BO_TX_BU_ 2610126864 : ECM_Diesel,PCM_HEV,PCM;
+BO_TX_BU_ 786 : PCM_HEV,SOBDMC_HPCM_FD1;
+BO_TX_BU_ 1090 : SOBDMC_HPCM_FD1,PCM_HEV;
+BO_TX_BU_ 374 : PCM_HEV,TCM_DSL,PCM;
+BO_TX_BU_ 872 : SOBDMC_HPCM_FD1,PCM_HEV;
+BO_TX_BU_ 560 : PCM,PCM_HEV,TCM_DSL;
+BO_TX_BU_ 369 : PCM_HEV,TCM_DSL,PCM;
+BO_TX_BU_ 92 : PCM,TCM_DSL,PCM_HEV;
+BO_TX_BU_ 2030 : SOBDMC_HPCM_FD1,ECM_Diesel;
+BO_TX_BU_ 1087 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 2024 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1697 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1696 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1429 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1100 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1086 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1071 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1069 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1060 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1057 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 1055 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 517 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 516 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 514 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 512 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 380 : ECM_Diesel,PCM;
+BO_TX_BU_ 377 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 376 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 359 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 358 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 357 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 342 : ECM_Diesel,PCM,PCM_HEV;
+BO_TX_BU_ 71 : ECM_Diesel,PCM,PCM_HEV;
+
+CM_ "New CAN FD network";
+CM_ BU_ CMR_DSMC "Driver Status Monitor Camera";
+CM_ BU_ IPMA_ADAS "Assist Driving Alert System";
+CM_ BU_ PSCM "Passenger Front Climate Control Seat Module";
+CM_ BU_ ABS_ESC "Anti-lock Brake / Traction Control Module";
+CM_ BU_ TCCM "Transfer Case Control Module, 4x4 Control Module";
+CM_ BU_ TCM_DSL "Transmission Control Module";
+CM_ BU_ PCM "Powertrain Control Module";
+CM_ BU_ ECM_Diesel "Diesel";
+CM_ BU_ GWM "Gateway Module CGEA1.3(Star Architecture)";
+CM_ BU_ TSTR "Diagnostic Tester";
+
+CM_ SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs "Signal not transmitted on gas variants.";
+CM_ SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt "Signal not transmitted on gas variants.";
+CM_ SG_ 1150 LocationServices_1 "Tx by HS3 APIM";
+CM_ SG_ 542 LocationServices_3 "Tx by HS3 APIM";
+CM_ SG_ 810 NtfyDrvTrgtDist_L_Rq "Object.SetTripRangeAlert_Rq This signal is meant to provide the customer settings for the target distance remote notification";
+CM_ SG_ 810 NtfyDrvSocLvl1_Pc_Rq "Object.SetCustomerLevelAlert_Rq This signal is meant to provide the customer settings for the SOC remote notification.";
+CM_ SG_ 810 PtRmtRprt_D_Stat "Object.RemoteDataReport_St";
+CM_ SG_ 550 PtWakeupActv1_B_Rq "ECG Application signal";
+CM_ SG_ 982 LatCtlPath_No_Cnt "Signal not transmitted on gas variants.";
+CM_ SG_ 982 LatCtlPath_No_Cs "Signal not transmitted on gas variants.";
+CM_ SG_ 1104 DrvEngageLevel_No_Cs "Signal not transmitted on gas variants.";
+CM_ SG_ 1104 DrvEngageLevel_No_Cnt "Signal not transmitted on gas variants.";
+CM_ SG_ 1085 ULoRgenTestMde_B_Stat "Signal not transmitted on HEV variants.";
+CM_ SG_ 1085 PwSrcULoComm_B_Falt "Signal not transmitted on HEV variants.";
+CM_ SG_ 1445 SOBDMC_AutoSarNMReserved4 "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 1445 SOBDMC_AutoSarNMReserved3 "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 1445 SOBDMC_AutoSarNMReserved2 "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 1445 SOBDMC_AutoSarNMReserved1 "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 1445 SOBDMC_AutoSarNMNodeId "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 1445 SOBDMC_AutoSarNMControl "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 1088 HvacPrecondMode2_D_Rq "Signal not transmitted on vehicles that do not have the Fuel operated heater feature.";
+CM_ SG_ 1088 HvacPrecondBlwr2_D_Rq "Signal not transmitted on vehicles that do not have the Fuel operated heater feature.";
+CM_ SG_ 786 ChrgStat_D_Dsply "Signal not transmitted by PCM_HEV";
+CM_ SG_ 66 immoControlData_T2 "Not transmitted on all vehicle variants";
+CM_ SG_ 66 immoControlCmd_T2 "Not transmitted on all vehicle variants";
+CM_ SG_ 549 BeltminderAudioMute "Object.MyKey.BeltMinderAudioMute.St";
+CM_ SG_ 549 Power_Up_Chime_Modules "Object.AlertMethod.IPC _Infotainment";
+CM_ SG_ 549 Chime_Source "Object.AlertMethod.IPC_infotainment";
+CM_ SG_ 611 AwdStat_D_RqDsply "Signal not transmitted on programs that do not have AWD.";
+CM_ SG_ 611 AwdSrvcRqd_B_Rq "Signal not transmitted on programs that do not have AWD.";
+CM_ SG_ 611 AwdLck_Tq_Rq "Signal not transmitted on programs that do not have AWD.";
+CM_ SG_ 130 VehVTrlrAid_B_Rq "VR session start- req. limit blower speed no more than X volts. CC restriction on time msg. will be honored.Double Event msg1st event to request limit, 2nd event to release limit, No msg. CC Grammar v7.xls";
+CM_ SG_ 130 SteMdule_U_Meas "DCR 1745 to update Tx from GWM to EP100ms. SteMdule_I_Est & SteMdule_U_Meas are used by BMS system & filtered. The filter uses standard periodic rate & changing to EP would adversely affect the filter.(jweinfur)";
+CM_ SG_ 130 SteMdule_I_Est "DCR 1745 to update Tx from GWM to EP100ms. SteMdule_I_Est & SteMdule_U_Meas are used by BMS system & filtered. The filter uses standard periodic rate & changing to EP would adversely affect the filter.(jweinfur)";
+CM_ SG_ 126 StePinRelInit_An_Sns "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present.";
+CM_ SG_ 126 StePinAn_No_Cs "Signal not transmitted on gas variants.";
+CM_ BO_ 133 "Seen on Ford Edge MK2";
+CM_ SG_ 133 StePinRelInit_An_Sns "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present.";
+CM_ SG_ 133 StePinAn_No_Cs "Signal not transmitted on gas variants.";
+CM_ SG_ 1200 BrkTot_Tq_RqDrv "DCR 1836 to update Tx from GWM to EP100ms rejected due MPS6 TCM requires BrkTot_Tq_RqDrv at 20ms (bshu1).";
+CM_ SG_ 1046 TCMode "Signal data set to 0x0 for ABS only vehicle option content";
+CM_ SG_ 1046 DrvAntiLckLamp_D_Rq "update value table v8.34, not align w/GSDB, need etracker. ABS & IPC implemented as updated.";
+CM_ SG_ 1046 BpedMove_D_Actl "CCMGenSigTimeoutTime=1000";
+CM_ SG_ 1044 StePinOffst_An_Est "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present.";
+CM_ SG_ 1044 StePinOffst_No_Cs "Signal not transmitted on gas variants.";
+CM_ SG_ 534 BrkObdData_No_Actl "Signal not transmitted on gas, diesel and HEV. Only supported on PHEV.";
+CM_ SG_ 534 BrkObdIndex_No_Actl "Signal not transmitted on gas, diesel and HEV. Only supported on PHEV.";
+CM_ SG_ 534 WhlRotatRr_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)";
+CM_ SG_ 534 WhlRotatRl_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)";
+CM_ SG_ 534 WhlRotatFr_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)";
+CM_ SG_ 534 WhlRotatFl_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)";
+CM_ SG_ 531 VehLongOvrGnd_A_Est "CCMGenSigTimeoutTime=1000";
+CM_ SG_ 1034 VehicleGGCCData "RCMGenSigTimeout=6000";
+CM_ SG_ 1090 Mtr2State_D_ActlMntr "Signal Not transmitted on PCM_HEV variant";
+CM_ SG_ 1090 Inv1Ain_I_ActlMntr "Signal Not transmitted on PCM_HEV variant";
+CM_ SG_ 1090 VehElRnge_L_Dsply "Signal Not transmitted on HPCM variant";
+CM_ SG_ 374 TrnRng_D_Rq "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 374 TrnPrkSys_D_Actl "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 374 GearLvr_D_ActlDrv "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 374 GearPos_No_Cs "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 374 GearPos_D_Trg "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 374 GearPos_No_Cnt "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 374 GearPos_D_Actl "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 603 WhlDirAvgDrv_D_Actl "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx";
+CM_ SG_ 603 PrplTqMnRgen_B_Actl "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx";
+CM_ SG_ 603 BattTracCnnct_D_Rq "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx";
+CM_ SG_ 872 HybMdeStat_D_Dsply "Signal not transmitted by HPCM";
+CM_ SG_ 560 SelDrvMdeSwtch_D_Stat3 "ECM_HEV, PCM & PCM_HEV do not support or Transmit signal.";
+CM_ SG_ 560 TrnSrvcRqd_B_Rq "Signal not transmitted on Diesel & HEV variants. MHT(U611/625) HPCM Rx 0x230 from PCM_HEV. Powersplit FWD HEVs(Cx482/3 430) HPCM Tx 0x230.";
+CM_ SG_ 560 TrnShifActv_B_Actl "Signal not transmitted on HEV variants. MHT(U611/625) HPCM Rx 0x230 from PCM_HEV. Powersplit FWD HEVs(Cx482/3 430) HPCM Tx 0x230.";
+CM_ SG_ 560 GboxOil_Te_Actl "Signal not transmitted on HEV variants. MHT(U611/625) HPCM Rx 0x230 from PCM_HEV. Powersplit FWD HEVs(Cx482/3 430) HPCM Tx 0x230.";
+CM_ SG_ 369 SeatWorkSrfc_B_Falt "Signal Not transmitted by TCM_DSL";
+CM_ SG_ 369 TrnIpcDsplyRng2_D_Actl "Signal not transmitted on HEV variants.";
+CM_ SG_ 369 TrnIpcDsplyRng_D_Stat "Signal not transmitted on HEV variants.";
+CM_ SG_ 92 TrnLvrV_D_Rq "Signal not transmitted on vehicles with PCM_HEV";
+CM_ SG_ 92 TrnSbwSysHlth_D_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnGearNtmAllow_B_Stat "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnDtpCmd_D_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnGearCmd_No_Cs "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnValidGear_D_Cnfm "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnNtrlTowCmd_D_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnGearCmd_Pc_ActlPt "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnGear_D_RqPt "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnCmdState_B_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnCmdCnt_B_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 PrkBrkActv_D_RqTrnGear "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnGearMsgTxt_D_Rq "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 92 TrnGearCmd_No_Cnt "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 1087 BattRgenLoChrg_D_RqEng "Signal not transmitted on diesel variant";
+CM_ SG_ 1087 BattRgenLoDChrg_D_RqEng "Signal not transmitted on diesel variant";
+CM_ SG_ 1087 FapLcInhbt_B_Rq "Signal not transmitted on diesel variant";
+CM_ SG_ 1100 EngExhMdeQuiet_D2_Stat "Signal not transmitted on HEV & Diesel programs";
+CM_ SG_ 1100 HvacCmprLim_D_Stat "Signal not transmitted on Diesel variants";
+CM_ SG_ 1100 WakeAlarm1_T_Rq "Signal not transmitted on Gas variants";
+CM_ SG_ 1100 WakeAlarm1_B_Typ "Signal not transmitted on Gas variants";
+CM_ SG_ 1100 Veh_V_DsplyTrailCtlSet "Signal not transmitted on HEV & Diesel programs";
+CM_ SG_ 1100 TrailCtlPt_B_Falt "Signal not transmitted on HEV & Diesel programs";
+CM_ SG_ 1100 AutoTowAllw_D_StatMnu "Signal not transmitted on Gas & Diesel variants";
+CM_ SG_ 1100 AutoTowActv_B_Stat "Signal not transmitted on Gas & Diesel variants";
+CM_ SG_ 1086 EngMnfld_P_Actl "Signal not transmitted on HEV & Diesel programs";
+CM_ SG_ 1086 ElLoadCtl_D_Rq "Signal not transmitted on HEV variants.";
+CM_ SG_ 1071 CluPdl_PcRate_Actl "Signal not transmitted on HEV and Gas variants.";
+CM_ SG_ 1071 CluPdlPosPcMeas_D_Qf "Signal not transmitted on HEV and Gas variants.";
+CM_ SG_ 1071 CluPdlPos_Pc_Meas "Signal not transmitted on HEV and Gas variants.";
+CM_ SG_ 1071 EngAoutIdl_N_Ntrl "Signal not transmitted on HEV variants and diesel.";
+CM_ SG_ 1069 SlMde_D_Stat "IPC and HUD_ADV Receve from HS3 FGW 0x42D, not HS3 0x38A, MSG DCR 506. Signal not transmitted on Gas & HEV variants";
+CM_ SG_ 1069 SlMde_D_RqDsply "IPC and HUD_ADV Receve from HS3 FGW 0x42D, not HS3 0x38A, MSG DCR 506. Signal not transmitted on Gas & HEV variants";
+CM_ SG_ 1069 IsaOffst_D_Stat "Signal not transmitted on Gas & HEV variants";
+CM_ SG_ 1069 ObdWarmUp_B_Complt "Signal not transmitted on diesel variants.";
+CM_ SG_ 1069 EngMsgTxt_D_Rq "Signal not transmitted on diesel variants.";
+CM_ SG_ 1069 EngClnt_Te_ActlDiag "Signal not transmitted on gas variants.";
+CM_ SG_ 1069 EngLoad_Pc_CalcDiag "Signal not transmitted on gas variants.";
+CM_ SG_ 1069 ApedPos_Pc_ActlDiag "Signal not transmitted on gas variants.";
+CM_ SG_ 1060 RearDiffOilTeWarn_B_Rq "Signal not transmitted on HEV & Diesel programs";
+CM_ SG_ 1060 RearDiffOil_Te_Actl "Signal not transmitted on HEV & Diesel programs";
+CM_ SG_ 1057 FohEng_D_Rq "Signal not transmitted on vehicles that do not have the fuel operated heater feature. Signal not transmitted on HEV programs";
+CM_ SG_ 1057 EngIdlShutDown_D_Stat "Signal not transmitted on diesel variants.";
+CM_ SG_ 1057 FUEL_ALCOHOL_PERCNT "signal not transmitted on diesel and HEV variants.";
+CM_ SG_ 1057 TrnTotTq_Rt_Est "Signal not transmitted on gas and HEV variants.";
+CM_ SG_ 1057 TrnTotLss_Tq_Est "Signal not transmitted on gas and HEV variants.";
+CM_ SG_ 1057 VehVLimStat_D_Actl "Signal not transmitted on gas and HEV variants.";
+CM_ SG_ 1057 VehVLimActv_B_Actl "Signal not transmitted on gas and HEV variants.";
+CM_ SG_ 562 GearNtrl_No_Cs "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 562 GearNtrl_No_Cnt "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. ";
+CM_ SG_ 516 EngAoutNActl_D_QF "Signal not transmitted on Gas & HEV variants";
+CM_ SG_ 516 EngAout3_N_Actl "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 516 ApedPos_Pc_ActlArb "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 516 ApedPosPcActl_No_Cnt "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 516 ApedPosPcActl_No_Cs "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 514 VehVTrlrAid_B_Avail "Signal not transmitted on HEV variants.";
+CM_ SG_ 514 GearRvrse_D_Actl "Do not implement GearRvrse_D_Actl until eTracker 8804151 is approved, 11/24/09";
+CM_ SG_ 512 PrplWhlTotTqRq_No_Cs "Signal not transmitted on gas & Diesel variants.";
+CM_ SG_ 512 PrplWhlTotTqRq_No_Cnt "Signal not transmitted on gas & Diesel variants.";
+CM_ SG_ 512 PtDrvMde_D_Stat "Signal not transmitted on Gas & HEV variants.";
+CM_ SG_ 380 EngExhBrkOnLamp_B_Rq "Signal not transmitted on Gas variants";
+CM_ SG_ 380 EngExhBrkAutoLamp_B_Rq "Signal not transmitted on Gas variants";
+CM_ SG_ 380 EngAout_N_MxAllw "Signal not transmitted on Gas variants";
+CM_ SG_ 380 EngExhBrkMde_D_Actl "Signal not transmitted on Gas variants";
+CM_ SG_ 377 HvacAirFullOut_B_Rq "Signal not transmitted on diesel variant";
+CM_ SG_ 377 FuelFlw_Vl_Dsply "Signal not transmitted on diesel variants.";
+CM_ SG_ 377 FuelFillInlet_B_Dsply "Signal not transmitted on diesel variants.";
+CM_ SG_ 377 OdoCount "Signal not transmitted on diesel variants.";
+CM_ SG_ 377 EngOilLife_Pc_Actl "Signal not transmitted on diesel variants.";
+CM_ SG_ 377 FuelFilterLamp_B_Dsply "Signal not transmitted on Gas & HEV variants";
+CM_ SG_ 377 AirCondRec_B_Rq "Signal not transmitted on diesel variants.";
+CM_ SG_ 377 AirCondClutch_B_Stats "Signal not transmitted on diesel variants.";
+CM_ SG_ 376 GasPrtc_D_RqDsply "Signal not transmitted on HEV & Diesel variants.";
+CM_ SG_ 376 EngAout_Aa_Actl "Signal not transmitted on HEV variants.";
+CM_ SG_ 376 AslIconDsply_D_Rq "Signal not transmitted on HEV variants.";
+CM_ SG_ 376 AslChime_B_Rq "Signal not transmitted on HEV variants.";
+CM_ SG_ 376 HvacHtrCore2_Te_Actl "Signal not transmitted on Gas & Diesel variants";
+CM_ SG_ 376 EcssLamp_D_RqDsply "Signal not transmitted on Gas & HEV variants";
+CM_ SG_ 376 AirAmb_Te_Actl "Signal not transmitted on Gas variants";
+CM_ SG_ 359 PrplWhlRgenMn_Tq_Actl "Signal not transmitted on Gas & Diesel variants";
+CM_ SG_ 359 ElPw_D_StatStrtStop "Signal not transmitted on HEV variants.";
+CM_ SG_ 359 TrnAin_Tq_Actl "Signal not transmitted on HEV variances.";
+CM_ SG_ 359 PlgActvArb_B_Actl "Only supported on PHEV programs. PlgActvArb_B_Actl HPCM will Tx on Powersplit PHEVs, On MHT PHEVs the PCM_HEV will Tx and HPCM will Rx.";
+CM_ SG_ 359 TrnAinTq_D_Qf "Signal not transmitted on HEV variances.";
+CM_ SG_ 358 StopStrtStdby_D_Indic "Signal not transmitted on HEV variants.";
+CM_ SG_ 358 StopStrtIODTxt_D_Rq "Signal not transmitted on HEV variants.";
+CM_ SG_ 358 StopStrtDrvMde_D_Indic "Signal not transmitted on HEV variants.";
+CM_ SG_ 358 StopStrtMsgTxt_D_Rq "Signal not transmitted on HEV variants.";
+CM_ SG_ 358 HiElPwInhbt_B_Stat "Signal not transmitted on HEV programs";
+CM_ SG_ 358 AutoStopPtDelta_I_Est "Signal not transmitted on HEV variants. ";
+CM_ SG_ 357 BpedDrvAppl_D_Actl "CCMGenSigTimeoutTime=1000";
+CM_ SG_ 357 CcStat_D_Actl "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 357 EngAout_N_MnAllw "Signal not transmitted on Gas & Diesel variants.";
+CM_ SG_ 357 AccStopMde_D_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 342 EngOvrhtMitgActv_D_Ind "Signal not transmitted on diesel.";
+CM_ SG_ 342 EngGoutLss_Tq_Est "Signal not transmitted on gas and diesel variants.";
+CM_ SG_ 342 EngOil_Te_Actl "Signal not transmitted on Gas & HEV variants. ";
+CM_ SG_ 954 GenericSwtch2_No_Actl "U625 Police Wig Wag feature";
+CM_ SG_ 935 SodRight_D_Stat "IPCGenSigTimeoutTime=1600";
+CM_ SG_ 935 Side_Detect_R_Illum "DDMGenSigTimeoutTime=2000";
+CM_ SG_ 935 SodSnsRight_D_Stat "IPCGenSigTimeoutTime=1600";
+CM_ SG_ 935 SodAlrtRight_D_Stat "DDMGenSigTimeoutTime=2000";
+CM_ SG_ 1112 BattTracClntPmp_D_Stat "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx";
+CM_ SG_ 1050 Outside_Air_Temp_Stat "Filtered value, i.e. same as disply for customer";
+CM_ SG_ 1009 CenterStackRing_D_Actl "The Center Stack sends the CPLR a signal to turn On or Off the light Ring, This is a customer selectable preference switch";
+CM_ SG_ 1009 APIM_NumberofTracks_St "Object NumberofTracks";
+CM_ SG_ 1009 APIM_ActiveTrackNum_St "Object.ActiveTrackNum";
+CM_ SG_ 360 GsmSrvcRqd_B_Rq "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 360 TrnGearPwmFalt_B_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 360 GearButtnStuck_B_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGsmNtmState_D_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 DrQltyDrv_D_StatGsm "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnBtsiOvrrd_B_Stat "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnValidGearRq_D_Stat "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearRqCnt_B_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_U_Actl "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlR2 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlR1 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlR0 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlP2 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlP1 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlP0 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlN2 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlN1 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlN0 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlM2 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlM1 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlM0 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlD2 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlD1 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGearButtn_B_ActlD0 "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGear_No_Cs "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGear_No_Cnt "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 TrnGear_D_RqDrv "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 90 BrkSwtchPos_B_ActlGsm "Signal not transmitted on vehicles that do not have shift by wire.";
+CM_ SG_ 138 SteWhlRelCalib_An_Sns "Signal is not transmitted on vehicles where PSCM is transmitting the message that contains this signal. Signal data set to 0x0 for ABS only vehicle option content";
+CM_ SG_ 1093 StopLamp_B_RqTrlrBrk "Signal not transmitted on all variants.";
+CM_ SG_ 792 ElTrip_L_Dsply "Key cycle trip distance driven with the engine off (Trip EV Miles)";
+CM_ SG_ 792 ElLongTerm_L_Dsply "Long term distance distance driven with the engine off since the last long term reset (Long Term EV Miles).";
+CM_ SG_ 765 Mc_VehTimeFrmtUsrSel_St "Object.BodyInterface.Settings.VehicleTimeFormatUserSelection";
+CM_ SG_ 765 Mc_VehUntTrpCoUsrSel_St "Object.VehicleSettings.Disp_Miles_Kilometers.Rq";
+CM_ SG_ 765 Mc_VehUnitTempUsrSel_St "Object.VehicleSettings.Disp_Temperature.Rq";
+CM_ SG_ 765 Mc_VehLangUsrSel_St "Object.BodyInterface.Settings.VehicleLanguageUserSelection Object Vehicle Settings.Disp_LangSel";
+CM_ SG_ 934 Side_Detect_L_Illum "DDMGenSigTimeoutTime=2000";
+CM_ SG_ 934 SodLeft_D_Stat "IPCGenSigTimeoutTime=1600";
+CM_ SG_ 934 SodSnsLeft_D_Stat "IPCGenSigTimeoutTime=1600";
+CM_ SG_ 934 SodAlrtLeft_D_Stat "DDMGenSigTimeoutTime=2000";
+CM_ SG_ 1072 MetricActv_B_Actl "0 =Inactive(English), 1=Active(Metric)";
+CM_ SG_ 145 VehYaw_W_Actl "CCMGenSigTimeoutTime=1000";
+CM_ SG_ 931 CrnkInhbt_No_Cs "Signal not transmitted on gas and HEV variants.";
+CM_ SG_ 931 CrnkInhbt_No_Cnt "Signal not transmitted on gas and HEV variants.";
+CM_ SG_ 947 Dimming_Lvl "Refer to Vehicle Interior Illum Dimming Ctrl Sys Eng Spec, Table 2";
+CM_ SG_ 947 PrkBrkActv_B_Actl "Signal not transmitted on vehicles with electric park brake. ";
+CM_ SG_ 394 HaDsply_No_Cs "Signal not transmitted on gas variants.";
+CM_ SG_ 394 HaDsply_No_Cnt "Signal not transmitted on gas variants.";
+CM_ SG_ 391 CmbbBrkDecel_A_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 391 CmbbBrkPrchg_D_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 391 CmbbBrkDecel_B_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 391 CmbbBaSens_D_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 390 AccBrkTot_A_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 390 AccBrkPrkEl_B_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 390 AccPrpl_A_Rq "PCMGenSigTimeoutTime=1000";
+CM_ SG_ 390 AccBrkPrchg_B_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 390 AccBrkDecel_B_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 390 AccStopStat_B_Rq "ABSGenSigTimeoutTime=1000";
+CM_ SG_ 942 PrkAidRdiusRight_L_Dsply "MSGDCR 679, set all signals to OnChange";
+CM_ SG_ 942 PrkAidRdiusLeft_L_Dsply "MSGDCR 679, set all signals to OnChange";
+CM_ SG_ 942 PrkAidDrvDir_D_Stat "MSGDCR 679, set all signals to OnChange";
+
+BA_DEF_ BO_ "OvtpPushApplication" ENUM "FALSE","TRUE";
+BA_DEF_ BU_ "OvtpOperationMode" ENUM "SERVER","CLIENT";
+BA_DEF_ BU_ "OvtpEcuAddress" INT 0 1022;
+BA_DEF_ SG_ "ECGUsedRxSignal" ENUM "No","Yes";
+BA_DEF_ SG_ "U_S650_MY2022_Rx" ENUM "No","Yes";
+BA_DEF_ SG_ "ECGUsedTxSignal" ENUM "No","Yes";
+BA_DEF_ SG_ "U_S650_MY2022_Tx" ENUM "No","Yes";
+BA_DEF_ SG_ "GenSigTimeoutTime_CHCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_SOBDMC_HPCM_F" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_CMR_DSMC" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ECM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ECM_HEVDSL" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_AWD_DLCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ECM_HEV" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_GENERIC" INT 0 100000;
+BA_DEF_ BO_ "VFrameFormat" ENUM "StandardCAN","ExtendedCAN","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","StandardCAN_FD","ExtendedCAN_FD";
+BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_HCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ECM_Diesel" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TCCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TCM_DSL" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_IPMA_ADAS" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_PCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_PCM_HEV" INT 0 100000;
+BA_DEF_ "BusType" STRING;
+BA_DEF_ BO_ "FrameRouting" STRING;
+BA_DEF_ BO_ "FrameGatewayNetwork" STRING;
+BA_DEF_ BO_ "FrameGateway_LC1" HEX 0 1407;
+BA_DEF_ BO_ "FrameGatewayLC1_HS3" HEX 0 1407;
+BA_DEF_ BO_ "FrameGatewayMS1" HEX 0 1407;
+BA_DEF_ BO_ "FrameGatewayHS3" HEX 0 1407;
+BA_DEF_ BO_ "FrameGatewayHS2" HEX 0 1407;
+BA_DEF_ BO_ "FrameGatewayHS1" HEX 0 1407;
+BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes";
+BA_DEF_ BO_ "FrameGatewayId" HEX 0 1407;
+BA_DEF_ BO_ "EventRateOfChange" INT 10 10000;
+BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes";
+BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000;
+BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100;
+BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000;
+BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000;
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_ BO_ "GenMsgSendType" ENUM "FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType";
+BA_DEF_ SG_ "U_T6_MCA_MY2020_Tx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_P702_MY2021_Tx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_CX727_MY2021_Tx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_F5X_MY20_Tx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_Commodity_MYXX_Tx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_T6_MCA_MY2020_Rx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_P702_MY2021_Rx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_CX727_MY2021_Rx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_F5X_MY20_Rx" ENUM "No","Yes";
+BA_DEF_ SG_ "U_Commodity_MYXX_Rx" ENUM "No","Yes";
+BA_DEF_ SG_ "GenSigStartValue" HEX 0 268435455;
+BA_DEF_ SG_ "MetaData" ENUM "No","Yes";
+BA_DEF_ SG_ "ApprovedOrphan" ENUM "No","Yes";
+BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes";
+BA_DEF_ SG_ "GenSigStartValueInteger" INT 0 1000000000;
+BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes";
+BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes";
+BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes";
+BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000;
+BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType";
+BA_DEF_ BO_ "SCP_FreshnessValueLength" INT 0 512;
+BA_DEF_ BO_ "AuthFreshnessCounterSyncAttempt" INT 0 512;
+BA_DEF_ BO_ "SCP_DataID" INT 0 65535;
+BA_DEF_ BO_ "SCP_FreshnessValueTxLength" INT 0 512;
+BA_DEF_ BO_ "SCP_AuthInfoTxLength" INT 0 512;
+BA_DEF_ BO_ "SC_Message" ENUM "No","Yes";
+BA_DEF_ BO_ "ProgBWConditional" STRING;
+BA_DEF_ BO_ "GenMsgRoutingTimeoutTime" INT 0 5000;
+BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes";
+BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes";
+BA_DEF_ BO_ "TpApplType" STRING;
+BA_DEF_ BO_ "DiagState" ENUM "No","Yes";
+BA_DEF_ BO_ "TpTxIndex" INT 0 536870911;
+BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes";
+BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes";
+BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes";
+BA_DEF_ BO_ "NmMessage" ENUM "No","Yes";
+BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes";
+BA_DEF_ BU_ "Terminator" ENUM "No","Yes";
+BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000;
+BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000;
+BA_DEF_ BU_ "NmAsrNodeIdentifier" HEX 128 255;
+BA_DEF_ BU_ "NmAsrNode" ENUM "No","Yes";
+BA_DEF_ BU_ "PowerType" ENUM "Switched","Latched","Sleep","vector_leerstring","vector_leerstring";
+BA_DEF_ BU_ "DiagNode" ENUM "GGDS","GDS","NONE";
+BA_DEF_ BU_ "EOL_SB_Flash" ENUM "GGDS","GDS","NONE","vector_leerstring";
+BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes";
+BA_DEF_ BU_ "NmNode" ENUM "No","Yes";
+BA_DEF_ BU_ "NmStationAddress" INT 0 255;
+BA_DEF_ BU_ "ILUsed" ENUM "No","Yes";
+BA_DEF_ BU_ "NosPackage" ENUM "None","I3_1","I3_2","1.0.1","RP","EuCD","Volcano","I3_3","FNOS_Autosar";
+BA_DEF_ BU_ "LIN_Master" ENUM "No","Yes";
+BA_DEF_ BU_ "PackageID" STRING;
+BA_DEF_ BU_ "GatewayECU" ENUM "No","Yes";
+BA_DEF_ "NetworkSpeed" ENUM "500kBits/s","125kBit/s";
+BA_DEF_ "VersionNumber" INT 0 10000;
+BA_DEF_ "StarNetworkGwType" ENUM "0=NotDefined","1=HS1","2=HS2","3=HS3","4=HS4","5=HS5","6=MS1","7=HS6","8=HS7","9=MS2","10=FD1","11=FD2","12=FD3","13=FD4","14=FD5","15=FD6","16=FD7","17=FD8";
+BA_DEF_ "CMDB_Version" STRING;
+BA_DEF_ "NmType" STRING;
+BA_DEF_ "NmAsrMessageCount" INT 128 128;
+BA_DEF_ "NmAsrBaseAddress" HEX 1408 1408;
+BA_DEF_ "DBName" STRING;
+BA_DEF_ "VersionDay" INT 1 31;
+BA_DEF_ "Manufacturer" STRING;
+BA_DEF_ "VersionMonth" INT 1 12;
+BA_DEF_ "VersionYear" INT 2000 3000;
+BA_DEF_ "NmBaseAddress" HEX 1280 1280;
+BA_DEF_ "NmMessageCount" INT 0 128;
+BA_DEF_DEF_ "OvtpPushApplication" "FALSE";
+BA_DEF_DEF_ "OvtpOperationMode" "SERVER";
+BA_DEF_DEF_ "OvtpEcuAddress" 0;
+BA_DEF_DEF_ "ECGUsedRxSignal" "No";
+BA_DEF_DEF_ "U_S650_MY2022_Rx" "No";
+BA_DEF_DEF_ "ECGUsedTxSignal" "No";
+BA_DEF_DEF_ "U_S650_MY2022_Tx" "No";
+BA_DEF_DEF_ "GenSigTimeoutTime_CHCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_SOBDMC_HPCM_F" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_CMR_DSMC" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ECM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ECM_HEVDSL" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_AWD_DLCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ECM_HEV" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_GENERIC" 0;
+BA_DEF_DEF_ "VFrameFormat" "ExtendedCAN_FD";
+BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_HCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ECM_Diesel" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TCCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TCM_DSL" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_IPMA_ADAS" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_PCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_PCM_HEV" 0;
+BA_DEF_DEF_ "BusType" "";
+BA_DEF_DEF_ "FrameRouting" "NONE";
+BA_DEF_DEF_ "FrameGatewayNetwork" "NONE";
+BA_DEF_DEF_ "FrameGateway_LC1" 0;
+BA_DEF_DEF_ "FrameGatewayLC1_HS3" 0;
+BA_DEF_DEF_ "FrameGatewayMS1" 0;
+BA_DEF_DEF_ "FrameGatewayHS3" 0;
+BA_DEF_DEF_ "FrameGatewayHS2" 0;
+BA_DEF_DEF_ "FrameGatewayHS1" 0;
+BA_DEF_DEF_ "NetworkInitialization" "Yes";
+BA_DEF_DEF_ "FrameGatewayId" 0;
+BA_DEF_DEF_ "EventRateOfChange" 10000;
+BA_DEF_DEF_ "ConfiguredTransmitter" "No";
+BA_DEF_DEF_ "GenMsgStartDelayTime" 0;
+BA_DEF_DEF_ "GenMsgNrOfRepetition" 1;
+BA_DEF_DEF_ "GenMsgDelayTime" 20;
+BA_DEF_DEF_ "GenMsgCycleTimeFast" 0;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
+BA_DEF_DEF_ "U_T6_MCA_MY2020_Tx" "No";
+BA_DEF_DEF_ "U_P702_MY2021_Tx" "No";
+BA_DEF_DEF_ "U_CX727_MY2021_Tx" "No";
+BA_DEF_DEF_ "U_F5X_MY20_Tx" "No";
+BA_DEF_DEF_ "U_Commodity_MYXX_Tx" "No";
+BA_DEF_DEF_ "U_T6_MCA_MY2020_Rx" "No";
+BA_DEF_DEF_ "U_P702_MY2021_Rx" "No";
+BA_DEF_DEF_ "U_CX727_MY2021_Rx" "No";
+BA_DEF_DEF_ "U_F5X_MY20_Rx" "No";
+BA_DEF_DEF_ "U_Commodity_MYXX_Rx" "No";
+BA_DEF_DEF_ "GenSigStartValue" 0;
+BA_DEF_DEF_ "MetaData" "No";
+BA_DEF_DEF_ "ApprovedOrphan" "No";
+BA_DEF_DEF_ "ContentDependant" "No";
+BA_DEF_DEF_ "GenSigStartValueInteger" 0;
+BA_DEF_DEF_ "UsedOnPgmDBC" "Yes";
+BA_DEF_DEF_ "CrossOver_InfoCAN" "No";
+BA_DEF_DEF_ "WakeupSignal" "No";
+BA_DEF_DEF_ "GenSigInactiveValue" 0;
+BA_DEF_DEF_ "GenSigSendType" "NoSigSendType";
+BA_DEF_DEF_ "SCP_FreshnessValueLength" 64;
+BA_DEF_DEF_ "AuthFreshnessCounterSyncAttempt" 2;
+BA_DEF_DEF_ "SCP_DataID" 0;
+BA_DEF_DEF_ "SCP_FreshnessValueTxLength" 8;
+BA_DEF_DEF_ "SCP_AuthInfoTxLength" 56;
+BA_DEF_DEF_ "SC_Message" "No";
+BA_DEF_DEF_ "ProgBWConditional" "NONE";
+BA_DEF_DEF_ "GenMsgRoutingTimeoutTime" 0;
+BA_DEF_DEF_ "MessageGateway" "No";
+BA_DEF_DEF_ "NmAsrMessage" "No";
+BA_DEF_DEF_ "TpApplType" "";
+BA_DEF_DEF_ "DiagState" "No";
+BA_DEF_DEF_ "TpTxIndex" 0;
+BA_DEF_DEF_ "NetworkInitializationCommand" "No";
+BA_DEF_DEF_ "DiagRequest" "No";
+BA_DEF_DEF_ "DiagResponse" "No";
+BA_DEF_DEF_ "NmMessage" "No";
+BA_DEF_DEF_ "GenMsgILSupport" "Yes";
+BA_DEF_DEF_ "Terminator" "No";
+BA_DEF_DEF_ "NodeWakeUpTime" 10;
+BA_DEF_DEF_ "NodeStartUpTime" 250;
+BA_DEF_DEF_ "NmAsrNodeIdentifier" 128;
+BA_DEF_DEF_ "NmAsrNode" "No";
+BA_DEF_DEF_ "PowerType" "Switched";
+BA_DEF_DEF_ "DiagNode" "GGDS";
+BA_DEF_DEF_ "EOL_SB_Flash" "GGDS";
+BA_DEF_DEF_ "NetworkInitializationUsed" "No";
+BA_DEF_DEF_ "NmNode" "No";
+BA_DEF_DEF_ "NmStationAddress" 0;
+BA_DEF_DEF_ "ILUsed" "Yes";
+BA_DEF_DEF_ "NosPackage" "I3_3";
+BA_DEF_DEF_ "LIN_Master" "No";
+BA_DEF_DEF_ "PackageID" "08.05.00.00.71.xx.xx.rr.00.00";
+BA_DEF_DEF_ "GatewayECU" "No";
+BA_DEF_DEF_ "NetworkSpeed" "500kBits/s";
+BA_DEF_DEF_ "VersionNumber" 1;
+BA_DEF_DEF_ "StarNetworkGwType" "0=NotDefined";
+BA_DEF_DEF_ "CMDB_Version" "v11.01";
+BA_DEF_DEF_ "NmType" "Ford-OSEK";
+BA_DEF_DEF_ "NmAsrMessageCount" 128;
+BA_DEF_DEF_ "NmAsrBaseAddress" 1408;
+BA_DEF_DEF_ "DBName" "";
+BA_DEF_DEF_ "VersionDay" 1;
+BA_DEF_DEF_ "Manufacturer" "Ford";
+BA_DEF_DEF_ "VersionMonth" 1;
+BA_DEF_DEF_ "VersionYear" 2011;
+BA_DEF_DEF_ "NmBaseAddress" 1280;
+BA_DEF_DEF_ "NmMessageCount" 128;
+BA_ "BusType" "CAN FD";
+BA_ "VersionYear" 2019;
+BA_ "VersionMonth" 4;
+BA_ "Manufacturer" "Ford";
+BA_ "VersionDay" 11;
+BA_ "CMDB_Version" "FNV2_v18.07";
+BA_ "StarNetworkGwType" 10;
+BA_ "VersionNumber" 6;
+BA_ "NmType" "Ford-OSEK";
+BA_ "DBName" "FD1_CAN";
+BA_ "NmStationAddress" BU_ VDM 48;
+BA_ "OvtpEcuAddress" BU_ VDM 32;
+BA_ "OvtpEcuAddress" BU_ CMR_DSMC 187;
+BA_ "NmStationAddress" BU_ CMR_DSMC 95;
+BA_ "PowerType" BU_ CMR_DSMC 2;
+BA_ "NmAsrNode" BU_ CMR_DSMC 1;
+BA_ "NmAsrNodeIdentifier" BU_ CMR_DSMC 223;
+BA_ "OvtpEcuAddress" BU_ SOBDMC_HPCM_FD1 17;
+BA_ "NmStationAddress" BU_ SOBDMC_HPCM_FD1 37;
+BA_ "OvtpEcuAddress" BU_ IPMA_ADAS 33;
+BA_ "NmStationAddress" BU_ IPMA_ADAS 28;
+BA_ "NodeStartUpTime" BU_ IPMA_ADAS 300;
+BA_ "OvtpEcuAddress" BU_ PSCM 48;
+BA_ "NmStationAddress" BU_ PSCM 53;
+BA_ "PowerType" BU_ PSCM 1;
+BA_ "NmAsrNode" BU_ PSCM 1;
+BA_ "NmAsrNodeIdentifier" BU_ PSCM 181;
+BA_ "Terminator" BU_ PSCM 1;
+BA_ "OvtpEcuAddress" BU_ ABS_ESC 40;
+BA_ "NmStationAddress" BU_ ABS_ESC 22;
+BA_ "PowerType" BU_ ABS_ESC 2;
+BA_ "NmAsrNode" BU_ ABS_ESC 1;
+BA_ "NmAsrNodeIdentifier" BU_ ABS_ESC 150;
+BA_ "NodeStartUpTime" BU_ ABS_ESC 1000;
+BA_ "NodeWakeUpTime" BU_ ABS_ESC 300;
+BA_ "OvtpEcuAddress" BU_ TCCM 25;
+BA_ "NmStationAddress" BU_ TCCM 33;
+BA_ "NmAsrNode" BU_ TCCM 1;
+BA_ "NmAsrNodeIdentifier" BU_ TCCM 161;
+BA_ "NodeStartUpTime" BU_ TCCM 1000;
+BA_ "NodeWakeUpTime" BU_ TCCM 25;
+BA_ "OvtpEcuAddress" BU_ TCM_DSL 24;
+BA_ "NmStationAddress" BU_ TCM_DSL 32;
+BA_ "PowerType" BU_ TCM_DSL 1;
+BA_ "NmAsrNode" BU_ TCM_DSL 1;
+BA_ "NmAsrNodeIdentifier" BU_ TCM_DSL 160;
+BA_ "NodeWakeUpTime" BU_ TCM_DSL 200;
+BA_ "NosPackage" BU_ TCM_DSL 4;
+BA_ "OvtpEcuAddress" BU_ PCM_HEV 16;
+BA_ "NmStationAddress" BU_ PCM_HEV 21;
+BA_ "PowerType" BU_ PCM_HEV 1;
+BA_ "NmAsrNode" BU_ PCM_HEV 1;
+BA_ "NmAsrNodeIdentifier" BU_ PCM_HEV 149;
+BA_ "NodeStartUpTime" BU_ PCM_HEV 350;
+BA_ "OvtpEcuAddress" BU_ PCM 16;
+BA_ "NmStationAddress" BU_ PCM 21;
+BA_ "PowerType" BU_ PCM 1;
+BA_ "NmAsrNode" BU_ PCM 1;
+BA_ "NmAsrNodeIdentifier" BU_ PCM 149;
+BA_ "NodeStartUpTime" BU_ PCM 350;
+BA_ "OvtpEcuAddress" BU_ ECM_Diesel 16;
+BA_ "NmStationAddress" BU_ ECM_Diesel 21;
+BA_ "PowerType" BU_ ECM_Diesel 1;
+BA_ "NmAsrNode" BU_ ECM_Diesel 1;
+BA_ "NmAsrNodeIdentifier" BU_ ECM_Diesel 149;
+BA_ "OvtpEcuAddress" BU_ GWM 216;
+BA_ "OvtpOperationMode" BU_ GWM 1;
+BA_ "NmStationAddress" BU_ GWM 30;
+BA_ "PowerType" BU_ GWM 2;
+BA_ "NmAsrNode" BU_ GWM 1;
+BA_ "NmAsrNodeIdentifier" BU_ GWM 158;
+BA_ "NodeStartUpTime" BU_ GWM 100;
+BA_ "Terminator" BU_ GWM 1;
+BA_ "GatewayECU" BU_ GWM 1;
+BA_ "NosPackage" BU_ GWM 4;
+BA_ "GenMsgSendType" BO_ 823 5;
+BA_ "GenMsgCycleTime" BO_ 823 1000;
+BA_ "VFrameFormat" BO_ 823 14;
+BA_ "GenMsgSendType" BO_ 824 5;
+BA_ "GenMsgCycleTime" BO_ 824 1000;
+BA_ "VFrameFormat" BO_ 824 14;
+BA_ "FrameGatewayId" BO_ 949 949;
+BA_ "FrameGatewayNetwork" BO_ 949 "HS1_CAN";
+BA_ "FrameRouting" BO_ 949 "";
+BA_ "VFrameFormat" BO_ 949 14;
+BA_ "GenMsgILSupport" BO_ 1825 0;
+BA_ "DiagRequest" BO_ 1825 1;
+BA_ "GenMsgSendType" BO_ 1825 1;
+BA_ "GenMsgDelayTime" BO_ 1825 0;
+BA_ "NetworkInitialization" BO_ 1825 0;
+BA_ "VFrameFormat" BO_ 1825 14;
+BA_ "GenMsgDelayTime" BO_ 524 0;
+BA_ "GenMsgCycleTime" BO_ 524 10;
+BA_ "GenMsgSendType" BO_ 524 0;
+BA_ "ProgBWConditional" BO_ 524 "MSGDCR1008_CX48X_V03_HS1D_56.84_mHEV_54.89";
+BA_ "VFrameFormat" BO_ 524 14;
+BA_ "FrameRouting" BO_ 740 "";
+BA_ "FrameGatewayNetwork" BO_ 740 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 740 740;
+BA_ "VFrameFormat" BO_ 740 14;
+BA_ "GenMsgCycleTime" BO_ 1160 1000;
+BA_ "GenMsgSendType" BO_ 1160 5;
+BA_ "VFrameFormat" BO_ 1160 14;
+BA_ "GenMsgCycleTime" BO_ 776 1000;
+BA_ "GenMsgSendType" BO_ 776 5;
+BA_ "VFrameFormat" BO_ 776 14;
+BA_ "GenMsgCycleTime" BO_ 775 1000;
+BA_ "GenMsgSendType" BO_ 775 5;
+BA_ "VFrameFormat" BO_ 775 14;
+BA_ "GenMsgCycleTime" BO_ 774 1000;
+BA_ "GenMsgSendType" BO_ 774 5;
+BA_ "VFrameFormat" BO_ 774 14;
+BA_ "FrameGatewayId" BO_ 811 811;
+BA_ "FrameGatewayNetwork" BO_ 811 "HS3_CAN";
+BA_ "FrameRouting" BO_ 811 "";
+BA_ "VFrameFormat" BO_ 811 14;
+BA_ "GenMsgSendType" BO_ 850 0;
+BA_ "GenMsgCycleTime" BO_ 850 150;
+BA_ "VFrameFormat" BO_ 850 14;
+BA_ "GenMsgCycleTime" BO_ 563 1000;
+BA_ "GenMsgSendType" BO_ 563 5;
+BA_ "VFrameFormat" BO_ 563 14;
+BA_ "GenMsgILSupport" BO_ 1833 0;
+BA_ "DiagResponse" BO_ 1833 1;
+BA_ "GenMsgSendType" BO_ 1833 1;
+BA_ "GenMsgDelayTime" BO_ 1833 0;
+BA_ "NetworkInitialization" BO_ 1833 0;
+BA_ "VFrameFormat" BO_ 1833 14;
+BA_ "FrameRouting" BO_ 570 "";
+BA_ "GenMsgSendType" BO_ 570 0;
+BA_ "GenMsgCycleTime" BO_ 570 20;
+BA_ "GenMsgDelayTime" BO_ 570 10;
+BA_ "VFrameFormat" BO_ 570 14;
+BA_ "FrameRouting" BO_ 837 "";
+BA_ "GenMsgSendType" BO_ 837 5;
+BA_ "GenMsgCycleTime" BO_ 837 1000;
+BA_ "VFrameFormat" BO_ 837 14;
+BA_ "FrameRouting" BO_ 885 "";
+BA_ "GenMsgSendType" BO_ 885 0;
+BA_ "GenMsgCycleTime" BO_ 885 200;
+BA_ "VFrameFormat" BO_ 885 14;
+BA_ "FrameRouting" BO_ 1150 "";
+BA_ "FrameGatewayNetwork" BO_ 1150 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 1150 1118;
+BA_ "VFrameFormat" BO_ 1150 14;
+BA_ "FrameRouting" BO_ 542 "";
+BA_ "FrameGatewayNetwork" BO_ 542 "HS4_CAN";
+BA_ "FrameGatewayId" BO_ 542 542;
+BA_ "VFrameFormat" BO_ 542 14;
+BA_ "FrameRouting" BO_ 2612224016 "";
+BA_ "TpTxIndex" BO_ 2612224016 464535768;
+BA_ "GenMsgSendType" BO_ 2612224016 1;
+BA_ "GenMsgCycleTime" BO_ 2612224016 0;
+BA_ "GenMsgDelayTime" BO_ 2612224016 0;
+BA_ "NetworkInitialization" BO_ 2612224016 0;
+BA_ "OvtpPushApplication" BO_ 2612224016 1;
+BA_ "VFrameFormat" BO_ 2612224016 15;
+BA_ "FrameRouting" BO_ 810 "";
+BA_ "GenMsgCycleTime" BO_ 810 1000;
+BA_ "GenMsgSendType" BO_ 810 5;
+BA_ "VFrameFormat" BO_ 810 14;
+BA_ "FrameRouting" BO_ 550 "";
+BA_ "GenMsgCycleTime" BO_ 550 1000;
+BA_ "GenMsgSendType" BO_ 550 5;
+BA_ "VFrameFormat" BO_ 550 14;
+BA_ "FrameRouting" BO_ 639 "";
+BA_ "GenMsgCycleTime" BO_ 639 1000;
+BA_ "GenMsgSendType" BO_ 639 5;
+BA_ "VFrameFormat" BO_ 639 14;
+BA_ "FrameRouting" BO_ 530 "";
+BA_ "GenMsgCycleTime" BO_ 530 1000;
+BA_ "GenMsgSendType" BO_ 530 5;
+BA_ "VFrameFormat" BO_ 530 14;
+BA_ "FrameRouting" BO_ 1142 "";
+BA_ "GenMsgSendType" BO_ 1142 0;
+BA_ "GenMsgCycleTime" BO_ 1142 500;
+BA_ "VFrameFormat" BO_ 1142 14;
+BA_ "FrameRouting" BO_ 817 "";
+BA_ "FrameGatewayId" BO_ 817 817;
+BA_ "FrameGatewayNetwork" BO_ 817 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 817 14;
+BA_ "FrameRouting" BO_ 879 "";
+BA_ "FrameGatewayNetwork" BO_ 879 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 879 879;
+BA_ "VFrameFormat" BO_ 879 14;
+BA_ "FrameRouting" BO_ 878 "";
+BA_ "GenMsgSendType" BO_ 878 5;
+BA_ "GenMsgCycleTime" BO_ 878 1000;
+BA_ "VFrameFormat" BO_ 878 14;
+BA_ "FrameRouting" BO_ 395 "";
+BA_ "FrameGatewayNetwork" BO_ 395 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 395 395;
+BA_ "VFrameFormat" BO_ 395 14;
+BA_ "TpTxIndex" BO_ 2611055832 463572184;
+BA_ "FrameRouting" BO_ 2611055832 "";
+BA_ "NetworkInitialization" BO_ 2611055832 0;
+BA_ "GenMsgDelayTime" BO_ 2611055832 0;
+BA_ "GenMsgSendType" BO_ 2611055832 1;
+BA_ "VFrameFormat" BO_ 2611055832 15;
+BA_ "TpTxIndex" BO_ 2611054808 463571160;
+BA_ "FrameRouting" BO_ 2611054808 "";
+BA_ "NetworkInitialization" BO_ 2611054808 0;
+BA_ "GenMsgDelayTime" BO_ 2611054808 0;
+BA_ "GenMsgSendType" BO_ 2611054808 1;
+BA_ "VFrameFormat" BO_ 2611054808 15;
+BA_ "TpTxIndex" BO_ 2611026136 463542488;
+BA_ "FrameRouting" BO_ 2611026136 "";
+BA_ "NetworkInitialization" BO_ 2611026136 0;
+BA_ "GenMsgDelayTime" BO_ 2611026136 0;
+BA_ "GenMsgSendType" BO_ 2611026136 1;
+BA_ "VFrameFormat" BO_ 2611026136 15;
+BA_ "TpTxIndex" BO_ 2611025112 463541464;
+BA_ "FrameRouting" BO_ 2611025112 "";
+BA_ "NetworkInitialization" BO_ 2611025112 0;
+BA_ "GenMsgDelayTime" BO_ 2611025112 0;
+BA_ "GenMsgSendType" BO_ 2611025112 1;
+BA_ "VFrameFormat" BO_ 2611025112 15;
+BA_ "TpTxIndex" BO_ 2610975960 463492312;
+BA_ "FrameRouting" BO_ 2610975960 "";
+BA_ "NetworkInitialization" BO_ 2610975960 0;
+BA_ "GenMsgDelayTime" BO_ 2610975960 0;
+BA_ "GenMsgSendType" BO_ 2610975960 1;
+BA_ "VFrameFormat" BO_ 2610975960 15;
+BA_ "FrameRouting" BO_ 2610007256 "";
+BA_ "NetworkInitialization" BO_ 2610007256 0;
+BA_ "GenMsgDelayTime" BO_ 2610007256 0;
+BA_ "GenMsgSendType" BO_ 2610007256 1;
+BA_ "TpTxIndex" BO_ 2610007256 462523608;
+BA_ "VFrameFormat" BO_ 2610007256 15;
+BA_ "FrameRouting" BO_ 2610006232 "";
+BA_ "NetworkInitialization" BO_ 2610006232 0;
+BA_ "GenMsgDelayTime" BO_ 2610006232 0;
+BA_ "GenMsgSendType" BO_ 2610006232 1;
+BA_ "TpTxIndex" BO_ 2610006232 462522584;
+BA_ "VFrameFormat" BO_ 2610006232 15;
+BA_ "FrameRouting" BO_ 2609977560 "";
+BA_ "NetworkInitialization" BO_ 2609977560 0;
+BA_ "GenMsgDelayTime" BO_ 2609977560 0;
+BA_ "GenMsgSendType" BO_ 2609977560 1;
+BA_ "TpTxIndex" BO_ 2609977560 462493912;
+BA_ "VFrameFormat" BO_ 2609977560 15;
+BA_ "FrameRouting" BO_ 2609976536 "";
+BA_ "NetworkInitialization" BO_ 2609976536 0;
+BA_ "GenMsgDelayTime" BO_ 2609976536 0;
+BA_ "GenMsgSendType" BO_ 2609976536 1;
+BA_ "TpTxIndex" BO_ 2609976536 462492888;
+BA_ "VFrameFormat" BO_ 2609976536 15;
+BA_ "FrameRouting" BO_ 2609927384 "";
+BA_ "NetworkInitialization" BO_ 2609927384 0;
+BA_ "GenMsgDelayTime" BO_ 2609927384 0;
+BA_ "GenMsgSendType" BO_ 2609927384 1;
+BA_ "TpTxIndex" BO_ 2609927384 462443736;
+BA_ "VFrameFormat" BO_ 2609927384 15;
+BA_ "TpTxIndex" BO_ 2611175523 463572184;
+BA_ "FrameRouting" BO_ 2611175523 "";
+BA_ "NetworkInitialization" BO_ 2611175523 0;
+BA_ "GenMsgDelayTime" BO_ 2611175523 0;
+BA_ "GenMsgSendType" BO_ 2611175523 1;
+BA_ "VFrameFormat" BO_ 2611175523 15;
+BA_ "TpTxIndex" BO_ 2612224099 464620760;
+BA_ "OvtpPushApplication" BO_ 2612224099 1;
+BA_ "FrameRouting" BO_ 2612224099 "";
+BA_ "NetworkInitialization" BO_ 2612224099 0;
+BA_ "GenMsgDelayTime" BO_ 2612224099 0;
+BA_ "GenMsgSendType" BO_ 2612224099 1;
+BA_ "VFrameFormat" BO_ 2612224099 15;
+BA_ "TpTxIndex" BO_ 2611175522 463571160;
+BA_ "FrameRouting" BO_ 2611175522 "";
+BA_ "NetworkInitialization" BO_ 2611175522 0;
+BA_ "GenMsgDelayTime" BO_ 2611175522 0;
+BA_ "GenMsgSendType" BO_ 2611175522 1;
+BA_ "VFrameFormat" BO_ 2611175522 15;
+BA_ "TpTxIndex" BO_ 2612224098 464619736;
+BA_ "OvtpPushApplication" BO_ 2612224098 1;
+BA_ "FrameRouting" BO_ 2612224098 "";
+BA_ "NetworkInitialization" BO_ 2612224098 0;
+BA_ "GenMsgDelayTime" BO_ 2612224098 0;
+BA_ "GenMsgSendType" BO_ 2612224098 1;
+BA_ "VFrameFormat" BO_ 2612224098 15;
+BA_ "TpTxIndex" BO_ 2611175494 463542488;
+BA_ "FrameRouting" BO_ 2611175494 "";
+BA_ "NetworkInitialization" BO_ 2611175494 0;
+BA_ "GenMsgDelayTime" BO_ 2611175494 0;
+BA_ "GenMsgSendType" BO_ 2611175494 1;
+BA_ "VFrameFormat" BO_ 2611175494 15;
+BA_ "TpTxIndex" BO_ 2612224070 464591064;
+BA_ "OvtpPushApplication" BO_ 2612224070 1;
+BA_ "FrameRouting" BO_ 2612224070 "";
+BA_ "NetworkInitialization" BO_ 2612224070 0;
+BA_ "GenMsgDelayTime" BO_ 2612224070 0;
+BA_ "GenMsgSendType" BO_ 2612224070 1;
+BA_ "VFrameFormat" BO_ 2612224070 15;
+BA_ "TpTxIndex" BO_ 2611175493 463541464;
+BA_ "FrameRouting" BO_ 2611175493 "";
+BA_ "NetworkInitialization" BO_ 2611175493 0;
+BA_ "GenMsgDelayTime" BO_ 2611175493 0;
+BA_ "GenMsgSendType" BO_ 2611175493 1;
+BA_ "VFrameFormat" BO_ 2611175493 15;
+BA_ "TpTxIndex" BO_ 2612224069 464590040;
+BA_ "OvtpPushApplication" BO_ 2612224069 1;
+BA_ "FrameRouting" BO_ 2612224069 "";
+BA_ "NetworkInitialization" BO_ 2612224069 0;
+BA_ "GenMsgDelayTime" BO_ 2612224069 0;
+BA_ "GenMsgSendType" BO_ 2612224069 1;
+BA_ "VFrameFormat" BO_ 2612224069 15;
+BA_ "TpTxIndex" BO_ 2611175445 463492312;
+BA_ "FrameRouting" BO_ 2611175445 "";
+BA_ "NetworkInitialization" BO_ 2611175445 0;
+BA_ "GenMsgDelayTime" BO_ 2611175445 0;
+BA_ "GenMsgSendType" BO_ 2611175445 1;
+BA_ "VFrameFormat" BO_ 2611175445 15;
+BA_ "TpTxIndex" BO_ 2612224021 464540888;
+BA_ "OvtpPushApplication" BO_ 2612224021 1;
+BA_ "FrameRouting" BO_ 2612224021 "";
+BA_ "NetworkInitialization" BO_ 2612224021 0;
+BA_ "GenMsgDelayTime" BO_ 2612224021 0;
+BA_ "GenMsgSendType" BO_ 2612224021 1;
+BA_ "VFrameFormat" BO_ 2612224021 15;
+BA_ "TpTxIndex" BO_ 2610126947 462523608;
+BA_ "FrameRouting" BO_ 2610126947 "";
+BA_ "NetworkInitialization" BO_ 2610126947 0;
+BA_ "GenMsgDelayTime" BO_ 2610126947 0;
+BA_ "GenMsgSendType" BO_ 2610126947 1;
+BA_ "VFrameFormat" BO_ 2610126947 15;
+BA_ "TpTxIndex" BO_ 2610126946 462522584;
+BA_ "FrameRouting" BO_ 2610126946 "";
+BA_ "NetworkInitialization" BO_ 2610126946 0;
+BA_ "GenMsgDelayTime" BO_ 2610126946 0;
+BA_ "GenMsgSendType" BO_ 2610126946 1;
+BA_ "VFrameFormat" BO_ 2610126946 15;
+BA_ "TpTxIndex" BO_ 2610126918 462493912;
+BA_ "FrameRouting" BO_ 2610126918 "";
+BA_ "NetworkInitialization" BO_ 2610126918 0;
+BA_ "GenMsgDelayTime" BO_ 2610126918 0;
+BA_ "GenMsgSendType" BO_ 2610126918 1;
+BA_ "VFrameFormat" BO_ 2610126918 15;
+BA_ "TpTxIndex" BO_ 2610126917 462492888;
+BA_ "FrameRouting" BO_ 2610126917 "";
+BA_ "NetworkInitialization" BO_ 2610126917 0;
+BA_ "GenMsgDelayTime" BO_ 2610126917 0;
+BA_ "GenMsgSendType" BO_ 2610126917 1;
+BA_ "VFrameFormat" BO_ 2610126917 15;
+BA_ "FrameRouting" BO_ 2610126869 "";
+BA_ "NetworkInitialization" BO_ 2610126869 0;
+BA_ "GenMsgDelayTime" BO_ 2610126869 0;
+BA_ "GenMsgSendType" BO_ 2610126869 1;
+BA_ "TpTxIndex" BO_ 2610126869 462443736;
+BA_ "VFrameFormat" BO_ 2610126869 15;
+BA_ "FrameRouting" BO_ 984 "";
+BA_ "GenMsgCycleTime" BO_ 984 1000;
+BA_ "GenMsgSendType" BO_ 984 5;
+BA_ "VFrameFormat" BO_ 984 14;
+BA_ "FrameRouting" BO_ 985 "";
+BA_ "GenMsgSendType" BO_ 985 5;
+BA_ "GenMsgCycleTime" BO_ 985 1000;
+BA_ "VFrameFormat" BO_ 985 14;
+BA_ "FrameRouting" BO_ 992 "";
+BA_ "FrameGatewayNetwork" BO_ 992 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 992 992;
+BA_ "VFrameFormat" BO_ 992 14;
+BA_ "OvtpPushApplication" BO_ 2612019416 1;
+BA_ "FrameRouting" BO_ 2612019416 "";
+BA_ "TpTxIndex" BO_ 2612019416 464535768;
+BA_ "NetworkInitialization" BO_ 2612019416 0;
+BA_ "GenMsgDelayTime" BO_ 2612019416 0;
+BA_ "GenMsgSendType" BO_ 2612019416 1;
+BA_ "VFrameFormat" BO_ 2612019416 15;
+BA_ "FrameRouting" BO_ 943 "";
+BA_ "GenMsgSendType" BO_ 943 0;
+BA_ "GenMsgCycleTime" BO_ 943 20;
+BA_ "GenMsgDelayTime" BO_ 943 10;
+BA_ "VFrameFormat" BO_ 943 14;
+BA_ "FrameRouting" BO_ 515 "";
+BA_ "GenMsgSendType" BO_ 515 5;
+BA_ "GenMsgCycleTime" BO_ 515 100;
+BA_ "VFrameFormat" BO_ 515 14;
+BA_ "FrameRouting" BO_ 1111 "";
+BA_ "FrameGatewayId" BO_ 1111 1111;
+BA_ "FrameGatewayNetwork" BO_ 1111 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 1111 14;
+BA_ "FrameRouting" BO_ 1106 "";
+BA_ "FrameGatewayId" BO_ 1106 1106;
+BA_ "FrameGatewayNetwork" BO_ 1106 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 1106 14;
+BA_ "FrameRouting" BO_ 982 "";
+BA_ "GenMsgSendType" BO_ 982 0;
+BA_ "GenMsgCycleTime" BO_ 982 50;
+BA_ "VFrameFormat" BO_ 982 14;
+BA_ "FrameRouting" BO_ 1985 "";
+BA_ "NetworkInitialization" BO_ 1985 0;
+BA_ "GenMsgDelayTime" BO_ 1985 0;
+BA_ "GenMsgSendType" BO_ 1985 1;
+BA_ "DiagRequest" BO_ 1985 1;
+BA_ "GenMsgILSupport" BO_ 1985 0;
+BA_ "VFrameFormat" BO_ 1985 14;
+BA_ "FrameRouting" BO_ 1993 "";
+BA_ "NetworkInitialization" BO_ 1993 0;
+BA_ "GenMsgDelayTime" BO_ 1993 0;
+BA_ "GenMsgSendType" BO_ 1993 1;
+BA_ "DiagResponse" BO_ 1993 1;
+BA_ "GenMsgILSupport" BO_ 1993 0;
+BA_ "VFrameFormat" BO_ 1993 14;
+BA_ "FrameRouting" BO_ 1104 "";
+BA_ "GenMsgCycleTime" BO_ 1104 200;
+BA_ "GenMsgSendType" BO_ 1104 0;
+BA_ "VFrameFormat" BO_ 1104 14;
+BA_ "FrameRouting" BO_ 1503 "";
+BA_ "NetworkInitialization" BO_ 1503 0;
+BA_ "GenMsgCycleTime" BO_ 1503 1000;
+BA_ "GenMsgSendType" BO_ 1503 0;
+BA_ "NmAsrMessage" BO_ 1503 1;
+BA_ "GenMsgILSupport" BO_ 1503 0;
+BA_ "VFrameFormat" BO_ 1503 14;
+BA_ "TpTxIndex" BO_ 2610995416 463511768;
+BA_ "FrameRouting" BO_ 2610995416 "";
+BA_ "NetworkInitialization" BO_ 2610995416 0;
+BA_ "GenMsgDelayTime" BO_ 2610995416 0;
+BA_ "GenMsgSendType" BO_ 2610995416 1;
+BA_ "VFrameFormat" BO_ 2610995416 15;
+BA_ "TpTxIndex" BO_ 2612043992 464560344;
+BA_ "OvtpPushApplication" BO_ 2612043992 1;
+BA_ "FrameRouting" BO_ 2612043992 "";
+BA_ "NetworkInitialization" BO_ 2612043992 0;
+BA_ "GenMsgDelayTime" BO_ 2612043992 0;
+BA_ "GenMsgSendType" BO_ 2612043992 1;
+BA_ "VFrameFormat" BO_ 2612043992 15;
+BA_ "FrameRouting" BO_ 2609946840 "";
+BA_ "NetworkInitialization" BO_ 2609946840 0;
+BA_ "GenMsgDelayTime" BO_ 2609946840 0;
+BA_ "GenMsgSendType" BO_ 2609946840 1;
+BA_ "TpTxIndex" BO_ 2609946840 462463192;
+BA_ "VFrameFormat" BO_ 2609946840 15;
+BA_ "TpTxIndex" BO_ 2611175464 463511768;
+BA_ "FrameRouting" BO_ 2611175464 "";
+BA_ "NetworkInitialization" BO_ 2611175464 0;
+BA_ "GenMsgDelayTime" BO_ 2611175464 0;
+BA_ "GenMsgSendType" BO_ 2611175464 1;
+BA_ "VFrameFormat" BO_ 2611175464 15;
+BA_ "TpTxIndex" BO_ 2612224040 464560344;
+BA_ "OvtpPushApplication" BO_ 2612224040 1;
+BA_ "FrameRouting" BO_ 2612224040 "";
+BA_ "NetworkInitialization" BO_ 2612224040 0;
+BA_ "GenMsgDelayTime" BO_ 2612224040 0;
+BA_ "GenMsgSendType" BO_ 2612224040 1;
+BA_ "VFrameFormat" BO_ 2612224040 15;
+BA_ "TpTxIndex" BO_ 2610126888 462463192;
+BA_ "FrameRouting" BO_ 2610126888 "";
+BA_ "NetworkInitialization" BO_ 2610126888 0;
+BA_ "GenMsgDelayTime" BO_ 2610126888 0;
+BA_ "GenMsgSendType" BO_ 2610126888 1;
+BA_ "VFrameFormat" BO_ 2610126888 15;
+BA_ "TpTxIndex" BO_ 2610988248 463504600;
+BA_ "FrameRouting" BO_ 2610988248 "";
+BA_ "NetworkInitialization" BO_ 2610988248 0;
+BA_ "GenMsgDelayTime" BO_ 2610988248 0;
+BA_ "GenMsgSendType" BO_ 2610988248 1;
+BA_ "VFrameFormat" BO_ 2610988248 15;
+BA_ "FrameRouting" BO_ 2609939672 "";
+BA_ "NetworkInitialization" BO_ 2609939672 0;
+BA_ "GenMsgDelayTime" BO_ 2609939672 0;
+BA_ "GenMsgSendType" BO_ 2609939672 1;
+BA_ "TpTxIndex" BO_ 2609939672 462456024;
+BA_ "VFrameFormat" BO_ 2609939672 15;
+BA_ "FrameRouting" BO_ 1114 "";
+BA_ "FrameGatewayNetwork" BO_ 1114 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 1114 1114;
+BA_ "VFrameFormat" BO_ 1114 14;
+BA_ "FrameRouting" BO_ 1116 "";
+BA_ "FrameGatewayNetwork" BO_ 1116 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 1116 1116;
+BA_ "VFrameFormat" BO_ 1116 14;
+BA_ "TpTxIndex" BO_ 2611175457 463504600;
+BA_ "FrameRouting" BO_ 2611175457 "";
+BA_ "NetworkInitialization" BO_ 2611175457 0;
+BA_ "GenMsgDelayTime" BO_ 2611175457 0;
+BA_ "GenMsgSendType" BO_ 2611175457 1;
+BA_ "VFrameFormat" BO_ 2611175457 15;
+BA_ "TpTxIndex" BO_ 2612224033 464553176;
+BA_ "OvtpPushApplication" BO_ 2612224033 1;
+BA_ "FrameRouting" BO_ 2612224033 "";
+BA_ "NetworkInitialization" BO_ 2612224033 0;
+BA_ "GenMsgDelayTime" BO_ 2612224033 0;
+BA_ "GenMsgSendType" BO_ 2612224033 1;
+BA_ "VFrameFormat" BO_ 2612224033 15;
+BA_ "TpTxIndex" BO_ 2610126881 462456024;
+BA_ "FrameRouting" BO_ 2610126881 "";
+BA_ "NetworkInitialization" BO_ 2610126881 0;
+BA_ "GenMsgDelayTime" BO_ 2610126881 0;
+BA_ "GenMsgSendType" BO_ 2610126881 1;
+BA_ "VFrameFormat" BO_ 2610126881 15;
+BA_ "FrameRouting" BO_ 1085 "";
+BA_ "GenMsgSendType" BO_ 1085 0;
+BA_ "GenMsgCycleTime" BO_ 1085 50;
+BA_ "VFrameFormat" BO_ 1085 14;
+BA_ "FrameRouting" BO_ 981 "";
+BA_ "GenMsgSendType" BO_ 981 0;
+BA_ "GenMsgCycleTime" BO_ 981 30;
+BA_ "VFrameFormat" BO_ 981 14;
+BA_ "FrameRouting" BO_ 791 "";
+BA_ "FrameGatewayId" BO_ 791 791;
+BA_ "FrameGatewayNetwork" BO_ 791 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 791 14;
+BA_ "TpTxIndex" BO_ 2610970840 463487192;
+BA_ "FrameRouting" BO_ 2610970840 "";
+BA_ "NetworkInitialization" BO_ 2610970840 0;
+BA_ "GenMsgDelayTime" BO_ 2610970840 0;
+BA_ "GenMsgSendType" BO_ 2610970840 1;
+BA_ "VFrameFormat" BO_ 2610970840 15;
+BA_ "TpTxIndex" BO_ 2609922264 462438616;
+BA_ "FrameRouting" BO_ 2609922264 "";
+BA_ "NetworkInitialization" BO_ 2609922264 0;
+BA_ "GenMsgDelayTime" BO_ 2609922264 0;
+BA_ "GenMsgSendType" BO_ 2609922264 1;
+BA_ "VFrameFormat" BO_ 2609922264 15;
+BA_ "FrameRouting" BO_ 868 "";
+BA_ "FrameGatewayNetwork" BO_ 868 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 868 868;
+BA_ "VFrameFormat" BO_ 868 14;
+BA_ "FrameRouting" BO_ 867 "";
+BA_ "FrameGatewayNetwork" BO_ 867 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 867 867;
+BA_ "VFrameFormat" BO_ 867 14;
+BA_ "FrameRouting" BO_ 866 "";
+BA_ "FrameGatewayNetwork" BO_ 866 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 866 866;
+BA_ "VFrameFormat" BO_ 866 14;
+BA_ "FrameRouting" BO_ 865 "";
+BA_ "FrameGatewayNetwork" BO_ 865 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 865 865;
+BA_ "VFrameFormat" BO_ 865 14;
+BA_ "TpTxIndex" BO_ 2611175440 463487192;
+BA_ "FrameRouting" BO_ 2611175440 "";
+BA_ "NetworkInitialization" BO_ 2611175440 0;
+BA_ "GenMsgDelayTime" BO_ 2611175440 0;
+BA_ "GenMsgCycleTime" BO_ 2611175440 0;
+BA_ "GenMsgSendType" BO_ 2611175440 1;
+BA_ "VFrameFormat" BO_ 2611175440 15;
+BA_ "TpTxIndex" BO_ 2610126864 462438616;
+BA_ "FrameRouting" BO_ 2610126864 "";
+BA_ "NetworkInitialization" BO_ 2610126864 0;
+BA_ "GenMsgDelayTime" BO_ 2610126864 0;
+BA_ "GenMsgSendType" BO_ 2610126864 1;
+BA_ "VFrameFormat" BO_ 2610126864 15;
+BA_ "TpTxIndex" BO_ 2611175441 463488216;
+BA_ "FrameRouting" BO_ 2611175441 "";
+BA_ "NetworkInitialization" BO_ 2611175441 0;
+BA_ "GenMsgDelayTime" BO_ 2611175441 0;
+BA_ "GenMsgSendType" BO_ 2611175441 1;
+BA_ "VFrameFormat" BO_ 2611175441 15;
+BA_ "TpTxIndex" BO_ 2612224017 463488216;
+BA_ "OvtpPushApplication" BO_ 2612224017 1;
+BA_ "FrameRouting" BO_ 2612224017 "";
+BA_ "NetworkInitialization" BO_ 2612224017 0;
+BA_ "GenMsgDelayTime" BO_ 2612224017 0;
+BA_ "GenMsgSendType" BO_ 2612224017 1;
+BA_ "VFrameFormat" BO_ 2612224017 15;
+BA_ "FrameRouting" BO_ 2610126865 "";
+BA_ "NetworkInitialization" BO_ 2610126865 0;
+BA_ "GenMsgDelayTime" BO_ 2610126865 0;
+BA_ "GenMsgSendType" BO_ 2610126865 1;
+BA_ "TpTxIndex" BO_ 2610126865 462439640;
+BA_ "VFrameFormat" BO_ 2610126865 15;
+BA_ "FrameRouting" BO_ 1679 "";
+BA_ "GenMsgCycleTime" BO_ 1679 0;
+BA_ "GenMsgSendType" BO_ 1679 1;
+BA_ "TpApplType" BO_ 1679 "DiagUUDTResponse";
+BA_ "GenMsgILSupport" BO_ 1679 0;
+BA_ "VFrameFormat" BO_ 1679 14;
+BA_ "FrameRouting" BO_ 1678 "";
+BA_ "GenMsgCycleTime" BO_ 1678 0;
+BA_ "GenMsgSendType" BO_ 1678 1;
+BA_ "TpApplType" BO_ 1678 "DiagUUDTResponse";
+BA_ "GenMsgILSupport" BO_ 1678 0;
+BA_ "VFrameFormat" BO_ 1678 14;
+BA_ "FrameRouting" BO_ 1677 "";
+BA_ "GenMsgCycleTime" BO_ 1677 0;
+BA_ "GenMsgSendType" BO_ 1677 1;
+BA_ "TpApplType" BO_ 1677 "DiagUUDTResponse";
+BA_ "GenMsgILSupport" BO_ 1677 0;
+BA_ "VFrameFormat" BO_ 1677 14;
+BA_ "FrameRouting" BO_ 1676 "";
+BA_ "GenMsgCycleTime" BO_ 1676 0;
+BA_ "GenMsgSendType" BO_ 1676 1;
+BA_ "TpApplType" BO_ 1676 "DiagUUDTResponse";
+BA_ "GenMsgILSupport" BO_ 1676 0;
+BA_ "VFrameFormat" BO_ 1676 14;
+BA_ "FrameRouting" BO_ 1445 "";
+BA_ "GenMsgILSupport" BO_ 1445 0;
+BA_ "NmAsrMessage" BO_ 1445 1;
+BA_ "GenMsgSendType" BO_ 1445 0;
+BA_ "GenMsgCycleTime" BO_ 1445 1000;
+BA_ "NetworkInitialization" BO_ 1445 0;
+BA_ "VFrameFormat" BO_ 1445 14;
+BA_ "FrameRouting" BO_ 1144 "";
+BA_ "GenMsgSendType" BO_ 1144 5;
+BA_ "GenMsgCycleTime" BO_ 1144 1000;
+BA_ "VFrameFormat" BO_ 1144 14;
+BA_ "FrameRouting" BO_ 1141 "";
+BA_ "GenMsgSendType" BO_ 1141 0;
+BA_ "GenMsgCycleTime" BO_ 1141 500;
+BA_ "VFrameFormat" BO_ 1141 14;
+BA_ "FrameRouting" BO_ 1140 "";
+BA_ "GenMsgSendType" BO_ 1140 0;
+BA_ "GenMsgCycleTime" BO_ 1140 1000;
+BA_ "VFrameFormat" BO_ 1140 14;
+BA_ "FrameRouting" BO_ 1139 "";
+BA_ "GenMsgCycleTime" BO_ 1139 1500;
+BA_ "GenMsgSendType" BO_ 1139 0;
+BA_ "VFrameFormat" BO_ 1139 14;
+BA_ "FrameRouting" BO_ 1138 "";
+BA_ "GenMsgCycleTime" BO_ 1138 1500;
+BA_ "GenMsgSendType" BO_ 1138 0;
+BA_ "VFrameFormat" BO_ 1138 14;
+BA_ "FrameRouting" BO_ 1089 "";
+BA_ "GenMsgCycleTime" BO_ 1089 1000;
+BA_ "GenMsgSendType" BO_ 1089 0;
+BA_ "VFrameFormat" BO_ 1089 14;
+BA_ "FrameRouting" BO_ 1088 "";
+BA_ "GenMsgCycleTime" BO_ 1088 1000;
+BA_ "GenMsgSendType" BO_ 1088 0;
+BA_ "VFrameFormat" BO_ 1088 14;
+BA_ "FrameRouting" BO_ 1040 "";
+BA_ "GenMsgCycleTime" BO_ 1040 100;
+BA_ "GenMsgSendType" BO_ 1040 0;
+BA_ "VFrameFormat" BO_ 1040 14;
+BA_ "FrameRouting" BO_ 1016 "";
+BA_ "GenMsgCycleTime" BO_ 1016 1000;
+BA_ "GenMsgSendType" BO_ 1016 5;
+BA_ "VFrameFormat" BO_ 1016 14;
+BA_ "FrameRouting" BO_ 1013 "";
+BA_ "GenMsgCycleTime" BO_ 1013 1000;
+BA_ "GenMsgSendType" BO_ 1013 5;
+BA_ "VFrameFormat" BO_ 1013 14;
+BA_ "FrameRouting" BO_ 1012 "";
+BA_ "GenMsgCycleTime" BO_ 1012 1000;
+BA_ "GenMsgSendType" BO_ 1012 5;
+BA_ "VFrameFormat" BO_ 1012 14;
+BA_ "FrameRouting" BO_ 1011 "";
+BA_ "GenMsgCycleTime" BO_ 1011 1000;
+BA_ "GenMsgSendType" BO_ 1011 5;
+BA_ "VFrameFormat" BO_ 1011 14;
+BA_ "FrameRouting" BO_ 871 "";
+BA_ "GenMsgCycleTime" BO_ 871 100;
+BA_ "GenMsgSendType" BO_ 871 0;
+BA_ "VFrameFormat" BO_ 871 14;
+BA_ "FrameRouting" BO_ 786 "";
+BA_ "GenMsgCycleTime" BO_ 786 100;
+BA_ "GenMsgSendType" BO_ 786 0;
+BA_ "VFrameFormat" BO_ 786 14;
+BA_ "FrameRouting" BO_ 72 "";
+BA_ "GenMsgDelayTime" BO_ 72 10;
+BA_ "GenMsgCycleTime" BO_ 72 20;
+BA_ "GenMsgSendType" BO_ 72 0;
+BA_ "VFrameFormat" BO_ 72 14;
+BA_ "FrameRouting" BO_ 912 "";
+BA_ "FrameGatewayNetwork" BO_ 912 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 912 912;
+BA_ "VFrameFormat" BO_ 912 14;
+BA_ "FrameRouting" BO_ 874 "";
+BA_ "FrameGatewayNetwork" BO_ 874 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 874 874;
+BA_ "VFrameFormat" BO_ 874 14;
+BA_ "FrameRouting" BO_ 651 "";
+BA_ "FrameGatewayNetwork" BO_ 651 "HS4_CAN";
+BA_ "FrameGatewayId" BO_ 651 651;
+BA_ "VFrameFormat" BO_ 651 14;
+BA_ "FrameRouting" BO_ 529 "";
+BA_ "FrameGatewayNetwork" BO_ 529 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 529 529;
+BA_ "VFrameFormat" BO_ 529 14;
+BA_ "FrameRouting" BO_ 66 "";
+BA_ "FrameGatewayNetwork" BO_ 66 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 66 66;
+BA_ "DiagResponse" BO_ 66 0;
+BA_ "VFrameFormat" BO_ 66 14;
+BA_ "TpTxIndex" BO_ 2610971864 463488216;
+BA_ "FrameRouting" BO_ 2610971864 "";
+BA_ "NetworkInitialization" BO_ 2610971864 0;
+BA_ "GenMsgDelayTime" BO_ 2610971864 0;
+BA_ "GenMsgSendType" BO_ 2610971864 1;
+BA_ "VFrameFormat" BO_ 2610971864 15;
+BA_ "TpTxIndex" BO_ 2612002008 464518360;
+BA_ "FrameRouting" BO_ 2612002008 "";
+BA_ "NetworkInitialization" BO_ 2612002008 0;
+BA_ "GenMsgDelayTime" BO_ 2612002008 0;
+BA_ "GenMsgSendType" BO_ 2612002008 1;
+BA_ "VFrameFormat" BO_ 2612002008 15;
+BA_ "FrameRouting" BO_ 2609923288 "";
+BA_ "NetworkInitialization" BO_ 2609923288 0;
+BA_ "GenMsgDelayTime" BO_ 2609923288 0;
+BA_ "GenMsgSendType" BO_ 2609923288 1;
+BA_ "TpTxIndex" BO_ 2609923288 462439640;
+BA_ "VFrameFormat" BO_ 2609923288 15;
+BA_ "TpTxIndex" BO_ 2610953432 463469784;
+BA_ "FrameRouting" BO_ 2610953432 "";
+BA_ "NetworkInitialization" BO_ 2610953432 0;
+BA_ "GenMsgDelayTime" BO_ 2610953432 0;
+BA_ "GenMsgSendType" BO_ 2610953432 1;
+BA_ "VFrameFormat" BO_ 2610953432 15;
+BA_ "FrameRouting" BO_ 2022 "";
+BA_ "GenMsgILSupport" BO_ 2022 0;
+BA_ "DiagRequest" BO_ 2022 1;
+BA_ "GenMsgSendType" BO_ 2022 1;
+BA_ "GenMsgDelayTime" BO_ 2022 0;
+BA_ "VFrameFormat" BO_ 2022 14;
+BA_ "FrameRouting" BO_ 1124 "";
+BA_ "FrameGatewayId" BO_ 1124 1124;
+BA_ "FrameGatewayNetwork" BO_ 1124 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1124 14;
+BA_ "FrameRouting" BO_ 1119 "";
+BA_ "FrameGatewayId" BO_ 1119 1119;
+BA_ "FrameGatewayNetwork" BO_ 1119 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1119 14;
+BA_ "FrameRouting" BO_ 132 "";
+BA_ "FrameGatewayNetwork" BO_ 132 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 132 132;
+BA_ "VFrameFormat" BO_ 132 14;
+BA_ "FrameRouting" BO_ 1990 "";
+BA_ "NetworkInitialization" BO_ 1990 0;
+BA_ "GenMsgDelayTime" BO_ 1990 0;
+BA_ "GenMsgSendType" BO_ 1990 1;
+BA_ "DiagRequest" BO_ 1990 1;
+BA_ "GenMsgILSupport" BO_ 1990 0;
+BA_ "VFrameFormat" BO_ 1990 14;
+BA_ "FrameRouting" BO_ 1892 "";
+BA_ "NetworkInitialization" BO_ 1892 0;
+BA_ "GenMsgDelayTime" BO_ 1892 0;
+BA_ "GenMsgSendType" BO_ 1892 1;
+BA_ "DiagRequest" BO_ 1892 1;
+BA_ "GenMsgILSupport" BO_ 1892 0;
+BA_ "VFrameFormat" BO_ 1892 14;
+BA_ "FrameRouting" BO_ 1798 "";
+BA_ "NetworkInitialization" BO_ 1798 0;
+BA_ "GenMsgDelayTime" BO_ 1798 0;
+BA_ "GenMsgSendType" BO_ 1798 1;
+BA_ "DiagRequest" BO_ 1798 1;
+BA_ "GenMsgILSupport" BO_ 1798 0;
+BA_ "VFrameFormat" BO_ 1798 14;
+BA_ "FrameRouting" BO_ 1123 "";
+BA_ "FrameGatewayNetwork" BO_ 1123 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 1123 1123;
+BA_ "VFrameFormat" BO_ 1123 14;
+BA_ "FrameRouting" BO_ 1122 "";
+BA_ "FrameGatewayNetwork" BO_ 1122 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 1122 1122;
+BA_ "VFrameFormat" BO_ 1122 14;
+BA_ "FrameRouting" BO_ 1003 "";
+BA_ "FrameGatewayNetwork" BO_ 1003 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 1003 1003;
+BA_ "VFrameFormat" BO_ 1003 14;
+BA_ "FrameRouting" BO_ 994 "";
+BA_ "FrameGatewayNetwork" BO_ 994 "HS3_CAN";
+BA_ "FrameGatewayId" BO_ 994 994;
+BA_ "VFrameFormat" BO_ 994 14;
+BA_ "FrameRouting" BO_ 778 "";
+BA_ "FrameGatewayId" BO_ 778 778;
+BA_ "FrameGatewayNetwork" BO_ 778 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 778 14;
+BA_ "FrameRouting" BO_ 549 "";
+BA_ "FrameGatewayId" BO_ 549 549;
+BA_ "FrameGatewayNetwork" BO_ 549 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 549 14;
+BA_ "FrameRouting" BO_ 551 "";
+BA_ "FrameGatewayId" BO_ 551 551;
+BA_ "FrameGatewayNetwork" BO_ 551 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 551 14;
+BA_ "FrameRouting" BO_ 1010 "";
+BA_ "GenMsgCycleTime" BO_ 1010 50;
+BA_ "GenMsgSendType" BO_ 1010 0;
+BA_ "VFrameFormat" BO_ 1010 14;
+BA_ "FrameRouting" BO_ 1070 "";
+BA_ "FrameGatewayNetwork" BO_ 1070 "HS1_CAN";
+BA_ "FrameGatewayId" BO_ 1070 1070;
+BA_ "VFrameFormat" BO_ 1070 14;
+BA_ "FrameRouting" BO_ 1186 "";
+BA_ "GenMsgSendType" BO_ 1186 0;
+BA_ "GenMsgCycleTime" BO_ 1186 100;
+BA_ "VFrameFormat" BO_ 1186 14;
+BA_ "FrameRouting" BO_ 611 "";
+BA_ "GenMsgSendType" BO_ 611 0;
+BA_ "GenMsgCycleTime" BO_ 611 100;
+BA_ "VFrameFormat" BO_ 611 14;
+BA_ "FrameRouting" BO_ 1461 "";
+BA_ "GenMsgILSupport" BO_ 1461 0;
+BA_ "NmAsrMessage" BO_ 1461 1;
+BA_ "GenMsgSendType" BO_ 1461 0;
+BA_ "GenMsgCycleTime" BO_ 1461 1000;
+BA_ "NetworkInitialization" BO_ 1461 0;
+BA_ "VFrameFormat" BO_ 1461 14;
+BA_ "FrameRouting" BO_ 1047 "";
+BA_ "GenMsgSendType" BO_ 1047 5;
+BA_ "GenMsgCycleTime" BO_ 1047 1000;
+BA_ "VFrameFormat" BO_ 1047 14;
+BA_ "FrameRouting" BO_ 972 "";
+BA_ "GenMsgSendType" BO_ 972 0;
+BA_ "GenMsgCycleTime" BO_ 972 30;
+BA_ "GenMsgDelayTime" BO_ 972 10;
+BA_ "VFrameFormat" BO_ 972 14;
+BA_ "FrameRouting" BO_ 130 "";
+BA_ "GenMsgSendType" BO_ 130 0;
+BA_ "GenMsgCycleTime" BO_ 130 20;
+BA_ "GenMsgDelayTime" BO_ 130 10;
+BA_ "VFrameFormat" BO_ 130 14;
+BA_ "FrameRouting" BO_ 126 "";
+BA_ "GenMsgSendType" BO_ 126 0;
+BA_ "GenMsgCycleTime" BO_ 126 10;
+BA_ "GenMsgDelayTime" BO_ 126 0;
+BA_ "VFrameFormat" BO_ 126 14;
+BA_ "FrameRouting" BO_ 133 "";
+BA_ "GenMsgSendType" BO_ 133 0;
+BA_ "GenMsgCycleTime" BO_ 133 10;
+BA_ "GenMsgDelayTime" BO_ 133 0;
+BA_ "VFrameFormat" BO_ 133 14;
+BA_ "FrameRouting" BO_ 1430 "";
+BA_ "GenMsgILSupport" BO_ 1430 0;
+BA_ "NmAsrMessage" BO_ 1430 1;
+BA_ "GenMsgSendType" BO_ 1430 0;
+BA_ "GenMsgCycleTime" BO_ 1430 1000;
+BA_ "NetworkInitialization" BO_ 1430 0;
+BA_ "VFrameFormat" BO_ 1430 14;
+BA_ "FrameRouting" BO_ 1200 "";
+BA_ "GenMsgSendType" BO_ 1200 0;
+BA_ "GenMsgCycleTime" BO_ 1200 20;
+BA_ "GenMsgDelayTime" BO_ 1200 10;
+BA_ "VFrameFormat" BO_ 1200 14;
+BA_ "FrameRouting" BO_ 1102 "";
+BA_ "GenMsgSendType" BO_ 1102 5;
+BA_ "GenMsgCycleTime" BO_ 1102 100000;
+BA_ "GenMsgStartDelayTime" BO_ 1102 1130;
+BA_ "VFrameFormat" BO_ 1102 14;
+BA_ "FrameRouting" BO_ 1056 "";
+BA_ "GenMsgSendType" BO_ 1056 5;
+BA_ "GenMsgCycleTime" BO_ 1056 1000;
+BA_ "VFrameFormat" BO_ 1056 14;
+BA_ "FrameRouting" BO_ 1054 "";
+BA_ "GenMsgSendType" BO_ 1054 5;
+BA_ "GenMsgCycleTime" BO_ 1054 1000;
+BA_ "VFrameFormat" BO_ 1054 14;
+BA_ "FrameRouting" BO_ 1046 "";
+BA_ "GenMsgSendType" BO_ 1046 0;
+BA_ "GenMsgCycleTime" BO_ 1046 100;
+BA_ "VFrameFormat" BO_ 1046 14;
+BA_ "FrameRouting" BO_ 1045 "";
+BA_ "GenMsgSendType" BO_ 1045 0;
+BA_ "GenMsgCycleTime" BO_ 1045 20;
+BA_ "GenMsgDelayTime" BO_ 1045 10;
+BA_ "VFrameFormat" BO_ 1045 14;
+BA_ "FrameRouting" BO_ 1044 "";
+BA_ "GenMsgSendType" BO_ 1044 0;
+BA_ "GenMsgCycleTime" BO_ 1044 100;
+BA_ "VFrameFormat" BO_ 1044 14;
+BA_ "FrameRouting" BO_ 1042 "";
+BA_ "GenMsgSendType" BO_ 1042 0;
+BA_ "GenMsgCycleTime" BO_ 1042 50;
+BA_ "VFrameFormat" BO_ 1042 14;
+BA_ "FrameRouting" BO_ 535 "";
+BA_ "GenMsgSendType" BO_ 535 0;
+BA_ "GenMsgCycleTime" BO_ 535 10;
+BA_ "GenMsgDelayTime" BO_ 535 0;
+BA_ "VFrameFormat" BO_ 535 14;
+BA_ "FrameRouting" BO_ 534 "";
+BA_ "GenMsgSendType" BO_ 534 0;
+BA_ "GenMsgCycleTime" BO_ 534 20;
+BA_ "GenMsgDelayTime" BO_ 534 10;
+BA_ "VFrameFormat" BO_ 534 14;
+BA_ "FrameRouting" BO_ 532 "";
+BA_ "GenMsgSendType" BO_ 532 0;
+BA_ "GenMsgCycleTime" BO_ 532 20;
+BA_ "GenMsgDelayTime" BO_ 532 10;
+BA_ "VFrameFormat" BO_ 532 14;
+BA_ "FrameRouting" BO_ 531 "";
+BA_ "GenMsgSendType" BO_ 531 0;
+BA_ "GenMsgCycleTime" BO_ 531 20;
+BA_ "GenMsgDelayTime" BO_ 531 10;
+BA_ "VFrameFormat" BO_ 531 14;
+BA_ "FrameRouting" BO_ 136 "";
+BA_ "GenMsgSendType" BO_ 136 0;
+BA_ "GenMsgCycleTime" BO_ 136 10;
+BA_ "GenMsgDelayTime" BO_ 136 0;
+BA_ "VFrameFormat" BO_ 136 14;
+BA_ "FrameRouting" BO_ 125 "";
+BA_ "GenMsgSendType" BO_ 125 0;
+BA_ "GenMsgCycleTime" BO_ 125 20;
+BA_ "GenMsgDelayTime" BO_ 125 10;
+BA_ "VFrameFormat" BO_ 125 14;
+BA_ "FrameRouting" BO_ 119 "";
+BA_ "GenMsgSendType" BO_ 119 0;
+BA_ "GenMsgCycleTime" BO_ 119 20;
+BA_ "GenMsgDelayTime" BO_ 119 10;
+BA_ "VFrameFormat" BO_ 119 14;
+BA_ "FrameRouting" BO_ 118 "";
+BA_ "GenMsgSendType" BO_ 118 5;
+BA_ "GenMsgCycleTime" BO_ 118 500;
+BA_ "VFrameFormat" BO_ 118 14;
+BA_ "FrameRouting" BO_ 73 "";
+BA_ "GenMsgSendType" BO_ 73 0;
+BA_ "GenMsgCycleTime" BO_ 73 20;
+BA_ "GenMsgDelayTime" BO_ 73 10;
+BA_ "VFrameFormat" BO_ 73 14;
+BA_ "FrameRouting" BO_ 1034 "";
+BA_ "FrameGatewayId" BO_ 1034 1034;
+BA_ "FrameGatewayNetwork" BO_ 1034 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1034 14;
+BA_ "FrameRouting" BO_ 1440 "";
+BA_ "GenMsgILSupport" BO_ 1440 0;
+BA_ "NmAsrMessage" BO_ 1440 1;
+BA_ "GenMsgSendType" BO_ 1440 0;
+BA_ "GenMsgCycleTime" BO_ 1440 1000;
+BA_ "NetworkInitialization" BO_ 1440 0;
+BA_ "VFrameFormat" BO_ 1440 14;
+BA_ "FrameRouting" BO_ 561 "";
+BA_ "GenMsgSendType" BO_ 561 0;
+BA_ "GenMsgCycleTime" BO_ 561 100;
+BA_ "VFrameFormat" BO_ 561 14;
+BA_ "FrameRouting" BO_ 330 "";
+BA_ "GenMsgSendType" BO_ 330 0;
+BA_ "GenMsgCycleTime" BO_ 330 10;
+BA_ "GenMsgDelayTime" BO_ 330 0;
+BA_ "VFrameFormat" BO_ 330 14;
+BA_ "FrameRouting" BO_ 1090 "";
+BA_ "GenMsgSendType" BO_ 1090 0;
+BA_ "GenMsgCycleTime" BO_ 1090 1000;
+BA_ "VFrameFormat" BO_ 1090 14;
+BA_ "FrameRouting" BO_ 870 "";
+BA_ "GenMsgSendType" BO_ 870 0;
+BA_ "GenMsgCycleTime" BO_ 870 100;
+BA_ "VFrameFormat" BO_ 870 14;
+BA_ "FrameRouting" BO_ 869 "";
+BA_ "GenMsgSendType" BO_ 869 0;
+BA_ "GenMsgCycleTime" BO_ 869 100;
+BA_ "VFrameFormat" BO_ 869 14;
+BA_ "FrameRouting" BO_ 606 "";
+BA_ "GenMsgSendType" BO_ 606 5;
+BA_ "GenMsgCycleTime" BO_ 606 1000;
+BA_ "VFrameFormat" BO_ 606 14;
+BA_ "FrameRouting" BO_ 374 "";
+BA_ "GenMsgSendType" BO_ 374 5;
+BA_ "GenMsgCycleTime" BO_ 374 100;
+BA_ "VFrameFormat" BO_ 374 14;
+BA_ "FrameRouting" BO_ 603 "";
+BA_ "GenMsgSendType" BO_ 603 0;
+BA_ "GenMsgCycleTime" BO_ 603 20;
+BA_ "GenMsgDelayTime" BO_ 603 10;
+BA_ "VFrameFormat" BO_ 603 14;
+BA_ "FrameRouting" BO_ 602 "";
+BA_ "GenMsgSendType" BO_ 602 0;
+BA_ "GenMsgCycleTime" BO_ 602 100;
+BA_ "VFrameFormat" BO_ 602 14;
+BA_ "FrameRouting" BO_ 1152 "";
+BA_ "GenMsgSendType" BO_ 1152 5;
+BA_ "GenMsgCycleTime" BO_ 1152 1000;
+BA_ "VFrameFormat" BO_ 1152 14;
+BA_ "FrameRouting" BO_ 872 "";
+BA_ "GenMsgSendType" BO_ 872 0;
+BA_ "GenMsgCycleTime" BO_ 872 100;
+BA_ "VFrameFormat" BO_ 872 14;
+BA_ "FrameRouting" BO_ 560 "";
+BA_ "GenMsgSendType" BO_ 560 0;
+BA_ "GenMsgCycleTime" BO_ 560 20;
+BA_ "GenMsgDelayTime" BO_ 560 10;
+BA_ "VFrameFormat" BO_ 560 14;
+BA_ "FrameRouting" BO_ 369 "";
+BA_ "GenMsgSendType" BO_ 369 0;
+BA_ "GenMsgCycleTime" BO_ 369 30;
+BA_ "GenMsgDelayTime" BO_ 369 10;
+BA_ "VFrameFormat" BO_ 369 14;
+BA_ "FrameRouting" BO_ 92 "";
+BA_ "GenMsgSendType" BO_ 92 5;
+BA_ "GenMsgCycleTime" BO_ 92 100;
+BA_ "VFrameFormat" BO_ 92 14;
+BA_ "FrameRouting" BO_ 2030 "";
+BA_ "GenMsgILSupport" BO_ 2030 0;
+BA_ "DiagResponse" BO_ 2030 1;
+BA_ "GenMsgSendType" BO_ 2030 1;
+BA_ "GenMsgDelayTime" BO_ 2030 0;
+BA_ "NetworkInitialization" BO_ 2030 0;
+BA_ "VFrameFormat" BO_ 2030 14;
+BA_ "FrameRouting" BO_ 1087 "";
+BA_ "GenMsgSendType" BO_ 1087 0;
+BA_ "GenMsgCycleTime" BO_ 1087 100;
+BA_ "VFrameFormat" BO_ 1087 14;
+BA_ "FrameRouting" BO_ 332 "";
+BA_ "GenMsgSendType" BO_ 332 0;
+BA_ "GenMsgCycleTime" BO_ 332 200;
+BA_ "VFrameFormat" BO_ 332 14;
+BA_ "FrameRouting" BO_ 1896 "";
+BA_ "GenMsgILSupport" BO_ 1896 0;
+BA_ "DiagResponse" BO_ 1896 1;
+BA_ "GenMsgSendType" BO_ 1896 1;
+BA_ "GenMsgDelayTime" BO_ 1896 0;
+BA_ "NetworkInitialization" BO_ 1896 0;
+BA_ "VFrameFormat" BO_ 1896 14;
+BA_ "FrameRouting" BO_ 1889 "";
+BA_ "GenMsgILSupport" BO_ 1889 0;
+BA_ "DiagRequest" BO_ 1889 1;
+BA_ "GenMsgSendType" BO_ 1889 1;
+BA_ "GenMsgDelayTime" BO_ 1889 0;
+BA_ "NetworkInitialization" BO_ 1889 0;
+BA_ "VFrameFormat" BO_ 1889 14;
+BA_ "FrameRouting" BO_ 1888 "";
+BA_ "GenMsgILSupport" BO_ 1888 0;
+BA_ "DiagRequest" BO_ 1888 1;
+BA_ "GenMsgSendType" BO_ 1888 1;
+BA_ "GenMsgDelayTime" BO_ 1888 0;
+BA_ "NetworkInitialization" BO_ 1888 0;
+BA_ "VFrameFormat" BO_ 1888 14;
+BA_ "FrameRouting" BO_ 1848 "";
+BA_ "GenMsgILSupport" BO_ 1848 0;
+BA_ "DiagResponse" BO_ 1848 1;
+BA_ "GenMsgSendType" BO_ 1848 1;
+BA_ "GenMsgDelayTime" BO_ 1848 0;
+BA_ "NetworkInitialization" BO_ 1848 0;
+BA_ "VFrameFormat" BO_ 1848 14;
+BA_ "FrameRouting" BO_ 1840 "";
+BA_ "GenMsgILSupport" BO_ 1840 0;
+BA_ "DiagRequest" BO_ 1840 1;
+BA_ "GenMsgSendType" BO_ 1840 1;
+BA_ "GenMsgDelayTime" BO_ 1840 0;
+BA_ "NetworkInitialization" BO_ 1840 0;
+BA_ "VFrameFormat" BO_ 1840 14;
+BA_ "FrameRouting" BO_ 1713 "";
+BA_ "GenMsgILSupport" BO_ 1713 0;
+BA_ "TpApplType" BO_ 1713 "DiagUUDTResponse";
+BA_ "GenMsgSendType" BO_ 1713 1;
+BA_ "NetworkInitialization" BO_ 1713 0;
+BA_ "VFrameFormat" BO_ 1713 14;
+BA_ "FrameRouting" BO_ 1712 "";
+BA_ "GenMsgILSupport" BO_ 1712 0;
+BA_ "TpApplType" BO_ 1712 "DiagUUDTResponse";
+BA_ "GenMsgSendType" BO_ 1712 1;
+BA_ "NetworkInitialization" BO_ 1712 0;
+BA_ "VFrameFormat" BO_ 1712 14;
+BA_ "FrameRouting" BO_ 2025 "";
+BA_ "GenMsgILSupport" BO_ 2025 0;
+BA_ "DiagResponse" BO_ 2025 1;
+BA_ "GenMsgSendType" BO_ 2025 1;
+BA_ "GenMsgDelayTime" BO_ 2025 0;
+BA_ "NetworkInitialization" BO_ 2025 0;
+BA_ "VFrameFormat" BO_ 2025 14;
+BA_ "FrameRouting" BO_ 2024 "";
+BA_ "GenMsgILSupport" BO_ 2024 0;
+BA_ "DiagResponse" BO_ 2024 1;
+BA_ "GenMsgSendType" BO_ 2024 1;
+BA_ "GenMsgDelayTime" BO_ 2024 0;
+BA_ "NetworkInitialization" BO_ 2024 0;
+BA_ "VFrameFormat" BO_ 2024 14;
+BA_ "FrameRouting" BO_ 2017 "";
+BA_ "GenMsgILSupport" BO_ 2017 0;
+BA_ "DiagRequest" BO_ 2017 1;
+BA_ "GenMsgSendType" BO_ 2017 1;
+BA_ "GenMsgDelayTime" BO_ 2017 0;
+BA_ "NetworkInitialization" BO_ 2017 0;
+BA_ "VFrameFormat" BO_ 2017 14;
+BA_ "FrameRouting" BO_ 2016 "";
+BA_ "GenMsgILSupport" BO_ 2016 0;
+BA_ "DiagRequest" BO_ 2016 1;
+BA_ "GenMsgSendType" BO_ 2016 1;
+BA_ "GenMsgDelayTime" BO_ 2016 0;
+BA_ "NetworkInitialization" BO_ 2016 0;
+BA_ "VFrameFormat" BO_ 2016 14;
+BA_ "FrameRouting" BO_ 2015 "";
+BA_ "GenMsgILSupport" BO_ 2015 0;
+BA_ "DiagState" BO_ 2015 1;
+BA_ "GenMsgSendType" BO_ 2015 1;
+BA_ "GenMsgDelayTime" BO_ 2015 0;
+BA_ "NetworkInitialization" BO_ 2015 0;
+BA_ "VFrameFormat" BO_ 2015 14;
+BA_ "FrameRouting" BO_ 1897 "";
+BA_ "GenMsgILSupport" BO_ 1897 0;
+BA_ "DiagResponse" BO_ 1897 1;
+BA_ "GenMsgSendType" BO_ 1897 1;
+BA_ "GenMsgDelayTime" BO_ 1897 0;
+BA_ "NetworkInitialization" BO_ 1897 0;
+BA_ "VFrameFormat" BO_ 1897 14;
+BA_ "FrameRouting" BO_ 1814 "";
+BA_ "GenMsgILSupport" BO_ 1814 0;
+BA_ "DiagRequest" BO_ 1814 1;
+BA_ "GenMsgSendType" BO_ 1814 1;
+BA_ "GenMsgDelayTime" BO_ 1814 0;
+BA_ "NetworkInitialization" BO_ 1814 0;
+BA_ "VFrameFormat" BO_ 1814 14;
+BA_ "FrameRouting" BO_ 1701 "";
+BA_ "GenMsgILSupport" BO_ 1701 0;
+BA_ "TpApplType" BO_ 1701 "DiagUUDTResponse";
+BA_ "GenMsgSendType" BO_ 1701 1;
+BA_ "NetworkInitialization" BO_ 1701 0;
+BA_ "VFrameFormat" BO_ 1701 14;
+BA_ "FrameRouting" BO_ 1700 "";
+BA_ "GenMsgILSupport" BO_ 1700 0;
+BA_ "TpApplType" BO_ 1700 "DiagUUDTResponse";
+BA_ "GenMsgSendType" BO_ 1700 1;
+BA_ "NetworkInitialization" BO_ 1700 0;
+BA_ "VFrameFormat" BO_ 1700 14;
+BA_ "FrameRouting" BO_ 1697 "";
+BA_ "GenMsgILSupport" BO_ 1697 0;
+BA_ "TpApplType" BO_ 1697 "DiagUUDTResponse";
+BA_ "GenMsgSendType" BO_ 1697 1;
+BA_ "NetworkInitialization" BO_ 1697 0;
+BA_ "VFrameFormat" BO_ 1697 14;
+BA_ "FrameRouting" BO_ 1696 "";
+BA_ "GenMsgILSupport" BO_ 1696 0;
+BA_ "TpApplType" BO_ 1696 "DiagUUDTResponse";
+BA_ "GenMsgSendType" BO_ 1696 1;
+BA_ "NetworkInitialization" BO_ 1696 0;
+BA_ "VFrameFormat" BO_ 1696 14;
+BA_ "FrameRouting" BO_ 1429 "";
+BA_ "GenMsgILSupport" BO_ 1429 0;
+BA_ "NmAsrMessage" BO_ 1429 1;
+BA_ "GenMsgSendType" BO_ 1429 0;
+BA_ "GenMsgCycleTime" BO_ 1429 1000;
+BA_ "NetworkInitialization" BO_ 1429 0;
+BA_ "VFrameFormat" BO_ 1429 14;
+BA_ "FrameRouting" BO_ 1100 "";
+BA_ "GenMsgSendType" BO_ 1100 0;
+BA_ "GenMsgCycleTime" BO_ 1100 100;
+BA_ "VFrameFormat" BO_ 1100 14;
+BA_ "FrameRouting" BO_ 1098 "";
+BA_ "GenMsgSendType" BO_ 1098 5;
+BA_ "GenMsgCycleTime" BO_ 1098 500;
+BA_ "VFrameFormat" BO_ 1098 14;
+BA_ "FrameRouting" BO_ 1086 "";
+BA_ "GenMsgSendType" BO_ 1086 0;
+BA_ "GenMsgCycleTime" BO_ 1086 100;
+BA_ "VFrameFormat" BO_ 1086 14;
+BA_ "FrameRouting" BO_ 1071 "";
+BA_ "GenMsgSendType" BO_ 1071 0;
+BA_ "GenMsgCycleTime" BO_ 1071 100;
+BA_ "VFrameFormat" BO_ 1071 14;
+BA_ "FrameRouting" BO_ 1069 "";
+BA_ "GenMsgSendType" BO_ 1069 0;
+BA_ "GenMsgCycleTime" BO_ 1069 100;
+BA_ "VFrameFormat" BO_ 1069 14;
+BA_ "FrameRouting" BO_ 1060 "";
+BA_ "GenMsgSendType" BO_ 1060 0;
+BA_ "GenMsgCycleTime" BO_ 1060 100;
+BA_ "VFrameFormat" BO_ 1060 14;
+BA_ "FrameRouting" BO_ 1057 "";
+BA_ "GenMsgSendType" BO_ 1057 0;
+BA_ "GenMsgCycleTime" BO_ 1057 100;
+BA_ "VFrameFormat" BO_ 1057 14;
+BA_ "FrameRouting" BO_ 1055 "";
+BA_ "GenMsgSendType" BO_ 1055 0;
+BA_ "GenMsgCycleTime" BO_ 1055 100;
+BA_ "VFrameFormat" BO_ 1055 14;
+BA_ "FrameRouting" BO_ 562 "";
+BA_ "GenMsgSendType" BO_ 562 0;
+BA_ "GenMsgCycleTime" BO_ 562 100;
+BA_ "VFrameFormat" BO_ 562 14;
+BA_ "FrameRouting" BO_ 523 "";
+BA_ "GenMsgSendType" BO_ 523 0;
+BA_ "GenMsgCycleTime" BO_ 523 1000;
+BA_ "VFrameFormat" BO_ 523 14;
+BA_ "FrameRouting" BO_ 517 "";
+BA_ "GenMsgSendType" BO_ 517 0;
+BA_ "GenMsgCycleTime" BO_ 517 20;
+BA_ "GenMsgDelayTime" BO_ 517 10;
+BA_ "VFrameFormat" BO_ 517 14;
+BA_ "FrameRouting" BO_ 516 "";
+BA_ "GenMsgSendType" BO_ 516 0;
+BA_ "GenMsgCycleTime" BO_ 516 10;
+BA_ "GenMsgDelayTime" BO_ 516 0;
+BA_ "VFrameFormat" BO_ 516 14;
+BA_ "FrameRouting" BO_ 514 "";
+BA_ "GenMsgSendType" BO_ 514 0;
+BA_ "GenMsgCycleTime" BO_ 514 20;
+BA_ "GenMsgDelayTime" BO_ 514 10;
+BA_ "VFrameFormat" BO_ 514 14;
+BA_ "FrameRouting" BO_ 512 "";
+BA_ "GenMsgSendType" BO_ 512 0;
+BA_ "GenMsgCycleTime" BO_ 512 20;
+BA_ "GenMsgDelayTime" BO_ 512 10;
+BA_ "VFrameFormat" BO_ 512 14;
+BA_ "FrameRouting" BO_ 381 "";
+BA_ "GenMsgSendType" BO_ 381 0;
+BA_ "GenMsgCycleTime" BO_ 381 100;
+BA_ "VFrameFormat" BO_ 381 14;
+BA_ "FrameRouting" BO_ 380 "";
+BA_ "GenMsgSendType" BO_ 380 0;
+BA_ "GenMsgCycleTime" BO_ 380 100;
+BA_ "VFrameFormat" BO_ 380 14;
+BA_ "FrameRouting" BO_ 377 "";
+BA_ "GenMsgSendType" BO_ 377 0;
+BA_ "GenMsgCycleTime" BO_ 377 100;
+BA_ "VFrameFormat" BO_ 377 14;
+BA_ "FrameRouting" BO_ 376 "";
+BA_ "GenMsgSendType" BO_ 376 0;
+BA_ "GenMsgCycleTime" BO_ 376 100;
+BA_ "VFrameFormat" BO_ 376 14;
+BA_ "FrameRouting" BO_ 373 "";
+BA_ "GenMsgSendType" BO_ 373 0;
+BA_ "GenMsgCycleTime" BO_ 373 20;
+BA_ "GenMsgDelayTime" BO_ 373 10;
+BA_ "VFrameFormat" BO_ 373 14;
+BA_ "FrameRouting" BO_ 359 "";
+BA_ "GenMsgSendType" BO_ 359 0;
+BA_ "GenMsgCycleTime" BO_ 359 10;
+BA_ "GenMsgDelayTime" BO_ 359 0;
+BA_ "VFrameFormat" BO_ 359 14;
+BA_ "FrameRouting" BO_ 358 "";
+BA_ "GenMsgSendType" BO_ 358 0;
+BA_ "GenMsgCycleTime" BO_ 358 100;
+BA_ "VFrameFormat" BO_ 358 14;
+BA_ "FrameRouting" BO_ 357 "";
+BA_ "GenMsgSendType" BO_ 357 0;
+BA_ "GenMsgCycleTime" BO_ 357 20;
+BA_ "GenMsgDelayTime" BO_ 357 10;
+BA_ "VFrameFormat" BO_ 357 14;
+BA_ "FrameRouting" BO_ 355 "";
+BA_ "GenMsgSendType" BO_ 355 0;
+BA_ "GenMsgCycleTime" BO_ 355 100;
+BA_ "VFrameFormat" BO_ 355 14;
+BA_ "FrameRouting" BO_ 342 "";
+BA_ "GenMsgSendType" BO_ 342 0;
+BA_ "GenMsgCycleTime" BO_ 342 100;
+BA_ "VFrameFormat" BO_ 342 14;
+BA_ "FrameRouting" BO_ 71 "";
+BA_ "GenMsgSendType" BO_ 71 0;
+BA_ "GenMsgCycleTime" BO_ 71 20;
+BA_ "GenMsgDelayTime" BO_ 71 10;
+BA_ "VFrameFormat" BO_ 71 14;
+BA_ "FrameRouting" BO_ 1822 "";
+BA_ "GenMsgILSupport" BO_ 1822 0;
+BA_ "DiagResponse" BO_ 1822 1;
+BA_ "GenMsgSendType" BO_ 1822 1;
+BA_ "GenMsgDelayTime" BO_ 1822 0;
+BA_ "NetworkInitialization" BO_ 1822 0;
+BA_ "VFrameFormat" BO_ 1822 14;
+BA_ "FrameRouting" BO_ 1438 "";
+BA_ "GenMsgILSupport" BO_ 1438 0;
+BA_ "NmAsrMessage" BO_ 1438 1;
+BA_ "GenMsgSendType" BO_ 1438 0;
+BA_ "GenMsgCycleTime" BO_ 1438 1000;
+BA_ "NetworkInitialization" BO_ 1438 0;
+BA_ "VFrameFormat" BO_ 1438 14;
+BA_ "FrameRouting" BO_ 954 "";
+BA_ "FrameGatewayId" BO_ 954 954;
+BA_ "FrameGatewayNetwork" BO_ 954 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 954 14;
+BA_ "FrameRouting" BO_ 1006 "";
+BA_ "GenMsgSendType" BO_ 1006 5;
+BA_ "GenMsgCycleTime" BO_ 1006 1000;
+BA_ "VFrameFormat" BO_ 1006 14;
+BA_ "FrameRouting" BO_ 820 "";
+BA_ "FrameGatewayNetwork" BO_ 820 "HS2_CAN";
+BA_ "FrameGatewayId" BO_ 820 820;
+BA_ "VFrameFormat" BO_ 820 14;
+BA_ "FrameRouting" BO_ 137 "";
+BA_ "FrameGatewayId" BO_ 137 137;
+BA_ "FrameGatewayNetwork" BO_ 137 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 137 14;
+BA_ "FrameRouting" BO_ 129 "";
+BA_ "FrameGatewayId" BO_ 129 129;
+BA_ "FrameGatewayNetwork" BO_ 129 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 129 14;
+BA_ "FrameRouting" BO_ 935 "";
+BA_ "GenMsgSendType" BO_ 935 5;
+BA_ "GenMsgCycleTime" BO_ 935 200;
+BA_ "VFrameFormat" BO_ 935 14;
+BA_ "FrameRouting" BO_ 1108 "";
+BA_ "FrameGatewayId" BO_ 1108 1108;
+BA_ "FrameGatewayNetwork" BO_ 1108 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 1108 14;
+BA_ "FrameRouting" BO_ 261 "";
+BA_ "FrameGatewayId" BO_ 261 261;
+BA_ "FrameGatewayNetwork" BO_ 261 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 261 14;
+BA_ "FrameRouting" BO_ 1146 "";
+BA_ "FrameGatewayId" BO_ 1146 1146;
+BA_ "FrameGatewayNetwork" BO_ 1146 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1146 14;
+BA_ "FrameRouting" BO_ 533 "";
+BA_ "FrameGatewayId" BO_ 533 533;
+BA_ "FrameGatewayNetwork" BO_ 533 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 533 14;
+BA_ "FrameRouting" BO_ 1041 "";
+BA_ "FrameGatewayId" BO_ 1041 1041;
+BA_ "FrameGatewayNetwork" BO_ 1041 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1041 14;
+BA_ "FrameRouting" BO_ 1067 "";
+BA_ "FrameGatewayId" BO_ 1067 1067;
+BA_ "FrameGatewayNetwork" BO_ 1067 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1067 14;
+BA_ "FrameRouting" BO_ 1112 "";
+BA_ "FrameGatewayId" BO_ 1112 1112;
+BA_ "FrameGatewayNetwork" BO_ 1112 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1112 14;
+BA_ "FrameRouting" BO_ 139 "";
+BA_ "FrameGatewayId" BO_ 139 139;
+BA_ "FrameGatewayNetwork" BO_ 139 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 139 14;
+BA_ "FrameRouting" BO_ 1121 "";
+BA_ "FrameGatewayId" BO_ 1121 1121;
+BA_ "FrameGatewayNetwork" BO_ 1121 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 1121 14;
+BA_ "FrameRouting" BO_ 1120 "";
+BA_ "FrameGatewayId" BO_ 1120 1120;
+BA_ "FrameGatewayNetwork" BO_ 1120 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 1120 14;
+BA_ "FrameRouting" BO_ 1050 "";
+BA_ "FrameGatewayId" BO_ 1050 1050;
+BA_ "FrameGatewayNetwork" BO_ 1050 "MS1_CAN";
+BA_ "VFrameFormat" BO_ 1050 14;
+BA_ "FrameRouting" BO_ 1137 "";
+BA_ "GenMsgSendType" BO_ 1137 0;
+BA_ "GenMsgCycleTime" BO_ 1137 1000;
+BA_ "VFrameFormat" BO_ 1137 14;
+BA_ "FrameRouting" BO_ 1255 "";
+BA_ "GenMsgSendType" BO_ 1255 0;
+BA_ "GenMsgCycleTime" BO_ 1255 1000;
+BA_ "VFrameFormat" BO_ 1255 14;
+BA_ "FrameRouting" BO_ 1254 "";
+BA_ "GenMsgSendType" BO_ 1254 0;
+BA_ "GenMsgCycleTime" BO_ 1254 1000;
+BA_ "VFrameFormat" BO_ 1254 14;
+BA_ "FrameRouting" BO_ 1253 "";
+BA_ "GenMsgSendType" BO_ 1253 0;
+BA_ "GenMsgCycleTime" BO_ 1253 1000;
+BA_ "VFrameFormat" BO_ 1253 14;
+BA_ "FrameRouting" BO_ 1252 "";
+BA_ "GenMsgSendType" BO_ 1252 0;
+BA_ "GenMsgCycleTime" BO_ 1252 1000;
+BA_ "VFrameFormat" BO_ 1252 14;
+BA_ "FrameRouting" BO_ 1251 "";
+BA_ "GenMsgSendType" BO_ 1251 0;
+BA_ "GenMsgCycleTime" BO_ 1251 1000;
+BA_ "VFrameFormat" BO_ 1251 14;
+BA_ "FrameRouting" BO_ 1250 "";
+BA_ "GenMsgSendType" BO_ 1250 0;
+BA_ "GenMsgCycleTime" BO_ 1250 1000;
+BA_ "VFrameFormat" BO_ 1250 14;
+BA_ "FrameRouting" BO_ 1249 "";
+BA_ "GenMsgSendType" BO_ 1249 0;
+BA_ "GenMsgCycleTime" BO_ 1249 1000;
+BA_ "VFrameFormat" BO_ 1249 14;
+BA_ "FrameRouting" BO_ 1248 "";
+BA_ "GenMsgSendType" BO_ 1248 0;
+BA_ "GenMsgCycleTime" BO_ 1248 1000;
+BA_ "VFrameFormat" BO_ 1248 14;
+BA_ "FrameRouting" BO_ 1113 "";
+BA_ "GenMsgSendType" BO_ 1113 0;
+BA_ "GenMsgCycleTime" BO_ 1113 50;
+BA_ "VFrameFormat" BO_ 1113 14;
+BA_ "FrameRouting" BO_ 1105 "";
+BA_ "GenMsgSendType" BO_ 1105 5;
+BA_ "GenMsgCycleTime" BO_ 1105 1000;
+BA_ "VFrameFormat" BO_ 1105 14;
+BA_ "FrameRouting" BO_ 938 "";
+BA_ "GenMsgSendType" BO_ 938 5;
+BA_ "GenMsgCycleTime" BO_ 938 200;
+BA_ "VFrameFormat" BO_ 938 14;
+BA_ "FrameRouting" BO_ 939 "";
+BA_ "GenMsgSendType" BO_ 939 5;
+BA_ "GenMsgCycleTime" BO_ 939 200;
+BA_ "VFrameFormat" BO_ 939 14;
+BA_ "FrameRouting" BO_ 937 "";
+BA_ "GenMsgSendType" BO_ 937 0;
+BA_ "GenMsgCycleTime" BO_ 937 20;
+BA_ "GenMsgDelayTime" BO_ 937 10;
+BA_ "VFrameFormat" BO_ 937 14;
+BA_ "FrameRouting" BO_ 936 "";
+BA_ "GenMsgSendType" BO_ 936 0;
+BA_ "GenMsgCycleTime" BO_ 936 20;
+BA_ "GenMsgDelayTime" BO_ 936 10;
+BA_ "VFrameFormat" BO_ 936 14;
+BA_ "FrameRouting" BO_ 877 "";
+BA_ "GenMsgSendType" BO_ 877 5;
+BA_ "GenMsgCycleTime" BO_ 877 1000;
+BA_ "VFrameFormat" BO_ 877 14;
+BA_ "FrameRouting" BO_ 589 "";
+BA_ "FrameGatewayId" BO_ 589 589;
+BA_ "FrameGatewayNetwork" BO_ 589 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 589 14;
+BA_ "FrameRouting" BO_ 588 "";
+BA_ "FrameGatewayId" BO_ 588 588;
+BA_ "FrameGatewayNetwork" BO_ 588 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 588 14;
+BA_ "FrameRouting" BO_ 587 "";
+BA_ "FrameGatewayId" BO_ 587 587;
+BA_ "FrameGatewayNetwork" BO_ 587 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 587 14;
+BA_ "FrameRouting" BO_ 389 "";
+BA_ "GenMsgSendType" BO_ 389 0;
+BA_ "GenMsgCycleTime" BO_ 389 100;
+BA_ "VFrameFormat" BO_ 389 14;
+BA_ "FrameRouting" BO_ 1009 "";
+BA_ "FrameGatewayId" BO_ 1009 1009;
+BA_ "FrameGatewayNetwork" BO_ 1009 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1009 14;
+BA_ "FrameRouting" BO_ 360 "";
+BA_ "FrameGatewayId" BO_ 360 360;
+BA_ "FrameGatewayNetwork" BO_ 360 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 360 14;
+BA_ "FrameRouting" BO_ 122 "";
+BA_ "FrameGatewayId" BO_ 122 122;
+BA_ "FrameGatewayNetwork" BO_ 122 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 122 14;
+BA_ "FrameRouting" BO_ 90 "";
+BA_ "FrameGatewayId" BO_ 90 90;
+BA_ "FrameGatewayNetwork" BO_ 90 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 90 14;
+BA_ "FrameRouting" BO_ 1091 "";
+BA_ "FrameGatewayId" BO_ 1091 1091;
+BA_ "FrameGatewayNetwork" BO_ 1091 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1091 14;
+BA_ "FrameRouting" BO_ 138 "";
+BA_ "FrameGatewayId" BO_ 138 138;
+BA_ "FrameGatewayNetwork" BO_ 138 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 138 14;
+BA_ "FrameRouting" BO_ 131 "";
+BA_ "FrameGatewayId" BO_ 131 131;
+BA_ "FrameGatewayNetwork" BO_ 131 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 131 14;
+BA_ "FrameRouting" BO_ 787 "";
+BA_ "FrameGatewayId" BO_ 787 787;
+BA_ "FrameGatewayNetwork" BO_ 787 "MS2_CAN";
+BA_ "VFrameFormat" BO_ 787 14;
+BA_ "FrameRouting" BO_ 953 "";
+BA_ "FrameGatewayId" BO_ 953 953;
+BA_ "FrameGatewayNetwork" BO_ 953 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 953 14;
+BA_ "FrameRouting" BO_ 1093 "";
+BA_ "FrameGatewayId" BO_ 1093 1093;
+BA_ "FrameGatewayNetwork" BO_ 1093 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1093 14;
+BA_ "FrameRouting" BO_ 792 "";
+BA_ "FrameGatewayId" BO_ 792 792;
+BA_ "FrameGatewayNetwork" BO_ 792 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 792 14;
+BA_ "FrameRouting" BO_ 968 "";
+BA_ "FrameGatewayId" BO_ 968 968;
+BA_ "FrameGatewayNetwork" BO_ 968 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 968 14;
+BA_ "FrameRouting" BO_ 819 "";
+BA_ "FrameGatewayId" BO_ 819 819;
+BA_ "FrameGatewayNetwork" BO_ 819 "MS1_CAN";
+BA_ "VFrameFormat" BO_ 819 14;
+BA_ "FrameRouting" BO_ 818 "";
+BA_ "FrameGatewayId" BO_ 818 818;
+BA_ "FrameGatewayNetwork" BO_ 818 "MS1_CAN";
+BA_ "VFrameFormat" BO_ 818 14;
+BA_ "FrameRouting" BO_ 806 "";
+BA_ "FrameGatewayId" BO_ 806 806;
+BA_ "FrameGatewayNetwork" BO_ 806 "MS1_CAN";
+BA_ "VFrameFormat" BO_ 806 14;
+BA_ "FrameRouting" BO_ 765 "";
+BA_ "FrameGatewayId" BO_ 765 765;
+BA_ "FrameGatewayNetwork" BO_ 765 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 765 14;
+BA_ "FrameRouting" BO_ 559 "";
+BA_ "FrameGatewayId" BO_ 559 559;
+BA_ "FrameGatewayNetwork" BO_ 559 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 559 14;
+BA_ "FrameRouting" BO_ 558 "";
+BA_ "FrameGatewayId" BO_ 558 558;
+BA_ "FrameGatewayNetwork" BO_ 558 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 558 14;
+BA_ "FrameRouting" BO_ 934 "";
+BA_ "GenMsgSendType" BO_ 934 5;
+BA_ "GenMsgCycleTime" BO_ 934 200;
+BA_ "VFrameFormat" BO_ 934 14;
+BA_ "FrameRouting" BO_ 1072 "";
+BA_ "FrameGatewayId" BO_ 1072 1072;
+BA_ "FrameGatewayNetwork" BO_ 1072 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1072 14;
+BA_ "FrameRouting" BO_ 909 "";
+BA_ "FrameGatewayId" BO_ 909 909;
+BA_ "FrameGatewayNetwork" BO_ 909 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 909 14;
+BA_ "FrameRouting" BO_ 963 "";
+BA_ "FrameGatewayId" BO_ 963 963;
+BA_ "FrameGatewayNetwork" BO_ 963 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 963 14;
+BA_ "FrameRouting" BO_ 145 "";
+BA_ "FrameGatewayId" BO_ 145 145;
+BA_ "FrameGatewayNetwork" BO_ 145 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 145 14;
+BA_ "FrameRouting" BO_ 76 "";
+BA_ "FrameGatewayId" BO_ 76 76;
+BA_ "FrameGatewayNetwork" BO_ 76 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 76 14;
+BA_ "FrameRouting" BO_ 65 "";
+BA_ "DiagResponse" BO_ 65 0;
+BA_ "FrameGatewayId" BO_ 65 65;
+BA_ "FrameGatewayNetwork" BO_ 65 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 65 14;
+BA_ "FrameRouting" BO_ 1076 "";
+BA_ "FrameGatewayId" BO_ 1076 1076;
+BA_ "FrameGatewayNetwork" BO_ 1076 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 1076 14;
+BA_ "FrameRouting" BO_ 862 "";
+BA_ "FrameGatewayId" BO_ 862 862;
+BA_ "FrameGatewayNetwork" BO_ 862 "MS1_CAN";
+BA_ "VFrameFormat" BO_ 862 14;
+BA_ "FrameRouting" BO_ 931 "";
+BA_ "FrameGatewayId" BO_ 931 931;
+BA_ "FrameGatewayNetwork" BO_ 931 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 931 14;
+BA_ "FrameRouting" BO_ 578 "";
+BA_ "FrameGatewayId" BO_ 578 578;
+BA_ "FrameGatewayNetwork" BO_ 578 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 578 14;
+BA_ "FrameRouting" BO_ 947 "";
+BA_ "FrameGatewayId" BO_ 947 947;
+BA_ "FrameGatewayNetwork" BO_ 947 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 947 14;
+BA_ "FrameRouting" BO_ 1084 "";
+BA_ "FrameGatewayId" BO_ 1084 1084;
+BA_ "FrameGatewayNetwork" BO_ 1084 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1084 14;
+BA_ "FrameRouting" BO_ 1068 "";
+BA_ "FrameGatewayId" BO_ 1068 1068;
+BA_ "FrameGatewayNetwork" BO_ 1068 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 1068 14;
+BA_ "FrameRouting" BO_ 146 "";
+BA_ "FrameGatewayId" BO_ 146 146;
+BA_ "FrameGatewayNetwork" BO_ 146 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 146 14;
+BA_ "FrameRouting" BO_ 1900 "";
+BA_ "GenMsgILSupport" BO_ 1900 0;
+BA_ "DiagResponse" BO_ 1900 1;
+BA_ "GenMsgSendType" BO_ 1900 1;
+BA_ "GenMsgDelayTime" BO_ 1900 0;
+BA_ "NetworkInitialization" BO_ 1900 0;
+BA_ "VFrameFormat" BO_ 1900 14;
+BA_ "FrameRouting" BO_ 1806 "";
+BA_ "GenMsgILSupport" BO_ 1806 0;
+BA_ "DiagResponse" BO_ 1806 1;
+BA_ "GenMsgSendType" BO_ 1806 1;
+BA_ "GenMsgDelayTime" BO_ 1806 0;
+BA_ "NetworkInitialization" BO_ 1806 0;
+BA_ "VFrameFormat" BO_ 1806 14;
+BA_ "FrameRouting" BO_ 997 "";
+BA_ "GenMsgSendType" BO_ 997 5;
+BA_ "GenMsgCycleTime" BO_ 997 1000;
+BA_ "VFrameFormat" BO_ 997 14;
+BA_ "FrameRouting" BO_ 983 "";
+BA_ "GenMsgSendType" BO_ 983 0;
+BA_ "GenMsgCycleTime" BO_ 983 50;
+BA_ "VFrameFormat" BO_ 983 14;
+BA_ "FrameRouting" BO_ 980 "";
+BA_ "GenMsgSendType" BO_ 980 0;
+BA_ "GenMsgCycleTime" BO_ 980 30;
+BA_ "GenMsgDelayTime" BO_ 980 10;
+BA_ "VFrameFormat" BO_ 980 14;
+BA_ "FrameRouting" BO_ 979 "";
+BA_ "GenMsgSendType" BO_ 979 0;
+BA_ "GenMsgCycleTime" BO_ 979 50;
+BA_ "VFrameFormat" BO_ 979 14;
+BA_ "FrameRouting" BO_ 976 "";
+BA_ "GenMsgSendType" BO_ 976 0;
+BA_ "GenMsgCycleTime" BO_ 976 100;
+BA_ "VFrameFormat" BO_ 976 14;
+BA_ "FrameRouting" BO_ 973 "";
+BA_ "GenMsgSendType" BO_ 973 5;
+BA_ "GenMsgCycleTime" BO_ 973 1000;
+BA_ "VFrameFormat" BO_ 973 14;
+BA_ "FrameRouting" BO_ 970 "";
+BA_ "GenMsgSendType" BO_ 970 0;
+BA_ "GenMsgCycleTime" BO_ 970 30;
+BA_ "GenMsgDelayTime" BO_ 970 10;
+BA_ "VFrameFormat" BO_ 970 14;
+BA_ "FrameRouting" BO_ 962 "";
+BA_ "GenMsgSendType" BO_ 962 5;
+BA_ "GenMsgCycleTime" BO_ 962 1000;
+BA_ "VFrameFormat" BO_ 962 14;
+BA_ "FrameRouting" BO_ 961 "";
+BA_ "GenMsgSendType" BO_ 961 5;
+BA_ "GenMsgCycleTime" BO_ 961 1000;
+BA_ "VFrameFormat" BO_ 961 14;
+BA_ "FrameRouting" BO_ 394 "";
+BA_ "GenMsgSendType" BO_ 394 5;
+BA_ "GenMsgCycleTime" BO_ 394 200;
+BA_ "VFrameFormat" BO_ 394 14;
+BA_ "FrameRouting" BO_ 391 "";
+BA_ "GenMsgSendType" BO_ 391 0;
+BA_ "GenMsgCycleTime" BO_ 391 20;
+BA_ "GenMsgDelayTime" BO_ 391 10;
+BA_ "VFrameFormat" BO_ 391 14;
+BA_ "FrameRouting" BO_ 390 "";
+BA_ "GenMsgSendType" BO_ 390 0;
+BA_ "GenMsgCycleTime" BO_ 390 20;
+BA_ "GenMsgDelayTime" BO_ 390 10;
+BA_ "VFrameFormat" BO_ 390 14;
+BA_ "FrameRouting" BO_ 1441 "";
+BA_ "GenMsgILSupport" BO_ 1441 0;
+BA_ "NmAsrMessage" BO_ 1441 1;
+BA_ "GenMsgSendType" BO_ 1441 0;
+BA_ "GenMsgCycleTime" BO_ 1441 1000;
+BA_ "NetworkInitialization" BO_ 1441 0;
+BA_ "VFrameFormat" BO_ 1441 14;
+BA_ "FrameRouting" BO_ 1787 "";
+BA_ "GenMsgILSupport" BO_ 1787 0;
+BA_ "DiagResponse" BO_ 1787 1;
+BA_ "GenMsgSendType" BO_ 1787 1;
+BA_ "GenMsgDelayTime" BO_ 1787 0;
+BA_ "VFrameFormat" BO_ 1787 14;
+BA_ "FrameRouting" BO_ 1779 "";
+BA_ "GenMsgILSupport" BO_ 1779 0;
+BA_ "DiagRequest" BO_ 1779 1;
+BA_ "GenMsgSendType" BO_ 1779 1;
+BA_ "GenMsgDelayTime" BO_ 1779 0;
+BA_ "VFrameFormat" BO_ 1779 14;
+BA_ "FrameRouting" BO_ 1786 "";
+BA_ "GenMsgILSupport" BO_ 1786 0;
+BA_ "DiagResponse" BO_ 1786 1;
+BA_ "GenMsgSendType" BO_ 1786 1;
+BA_ "GenMsgDelayTime" BO_ 1786 0;
+BA_ "VFrameFormat" BO_ 1786 14;
+BA_ "FrameRouting" BO_ 1778 "";
+BA_ "GenMsgILSupport" BO_ 1778 0;
+BA_ "DiagRequest" BO_ 1778 1;
+BA_ "GenMsgSendType" BO_ 1778 1;
+BA_ "GenMsgDelayTime" BO_ 1778 0;
+BA_ "VFrameFormat" BO_ 1778 14;
+BA_ "FrameRouting" BO_ 1153 "";
+BA_ "FrameGatewayId" BO_ 1153 1152;
+BA_ "FrameGatewayNetwork" BO_ 1153 "HS2_CAN";
+BA_ "VFrameFormat" BO_ 1153 14;
+BA_ "FrameRouting" BO_ 942 "";
+BA_ "GenMsgSendType" BO_ 942 5;
+BA_ "GenMsgCycleTime" BO_ 942 1000;
+BA_ "VFrameFormat" BO_ 942 14;
+BA_ "FrameRouting" BO_ 930 "";
+BA_ "GenMsgSendType" BO_ 930 5;
+BA_ "GenMsgCycleTime" BO_ 930 1000;
+BA_ "VFrameFormat" BO_ 930 14;
+BA_ "FrameRouting" BO_ 929 "";
+BA_ "GenMsgSendType" BO_ 929 5;
+BA_ "GenMsgCycleTime" BO_ 929 1000;
+BA_ "VFrameFormat" BO_ 929 14;
+BA_ "FrameRouting" BO_ 402 "";
+BA_ "FrameGatewayId" BO_ 402 402;
+BA_ "FrameGatewayNetwork" BO_ 402 "HS3_CAN";
+BA_ "VFrameFormat" BO_ 402 14;
+BA_ "FrameRouting" BO_ 924 "";
+BA_ "FrameGatewayId" BO_ 924 924;
+BA_ "FrameGatewayNetwork" BO_ 924 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 924 14;
+BA_ "FrameRouting" BO_ 923 "";
+BA_ "FrameGatewayId" BO_ 923 923;
+BA_ "FrameGatewayNetwork" BO_ 923 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 923 14;
+BA_ "FrameRouting" BO_ 1998 "";
+BA_ "GenMsgILSupport" BO_ 1998 0;
+BA_ "DiagResponse" BO_ 1998 1;
+BA_ "GenMsgSendType" BO_ 1998 1;
+BA_ "GenMsgDelayTime" BO_ 1998 0;
+BA_ "NetworkInitialization" BO_ 1998 0;
+BA_ "VFrameFormat" BO_ 1998 14;
+BA_ "FrameRouting" BO_ 1996 "";
+BA_ "GenMsgILSupport" BO_ 1996 0;
+BA_ "DiagResponse" BO_ 1996 1;
+BA_ "GenMsgSendType" BO_ 1996 1;
+BA_ "GenMsgDelayTime" BO_ 1996 0;
+BA_ "NetworkInitialization" BO_ 1996 0;
+BA_ "VFrameFormat" BO_ 1996 14;
+BA_ "FrameRouting" BO_ 1988 "";
+BA_ "GenMsgILSupport" BO_ 1988 0;
+BA_ "DiagRequest" BO_ 1988 1;
+BA_ "GenMsgSendType" BO_ 1988 1;
+BA_ "GenMsgDelayTime" BO_ 1988 0;
+BA_ "NetworkInitialization" BO_ 1988 0;
+BA_ "VFrameFormat" BO_ 1988 14;
+BA_ "FrameRouting" BO_ 922 "";
+BA_ "FrameGatewayId" BO_ 922 922;
+BA_ "FrameGatewayNetwork" BO_ 922 "HS1_CAN";
+BA_ "VFrameFormat" BO_ 922 14;
+BA_ "GenSigSendType" SG_ 823 DteVehPwId_No_Actl 3;
+BA_ "ECGUsedRxSignal" SG_ 823 DteVehPwId_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 823 DteVehEId_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 823 DteVehEffId_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 823 DteVeh_Pw_Actl 1;
+BA_ "GenSigStartValue" SG_ 823 DteVeh_Eff_Actl 100;
+BA_ "ECGUsedRxSignal" SG_ 823 DteVeh_Eff_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 823 DteVeh_E_Actl 1;
+BA_ "GenSigSendType" SG_ 823 DteAcceptNew_B_Rq 3;
+BA_ "ECGUsedRxSignal" SG_ 823 DteAcceptNew_B_Rq 1;
+BA_ "GenSigSendType" SG_ 824 DteCldTrlrOn_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldTrlrOn_B_Stat 1;
+BA_ "GenSigSendType" SG_ 824 DteCldTrlrOff_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldTrlrOff_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 824 DteCldTrip_L_Actl 100;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldTrip_L_Actl 1;
+BA_ "GenSigSendType" SG_ 824 DteCldTraffic_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldTraffic_B_Stat 1;
+BA_ "GenSigSendType" SG_ 824 DteCldTerrain_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldTerrain_B_Stat 1;
+BA_ "GenSigSendType" SG_ 824 DteCldRoute_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldRoute_B_Stat 1;
+BA_ "GenSigSendType" SG_ 824 DteCldPayload_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldPayload_B_Stat 1;
+BA_ "GenSigSendType" SG_ 824 DteCldId_No_Actl 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldId_No_Actl 1;
+BA_ "GenSigSendType" SG_ 824 DteCldExtTe_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldExtTe_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 824 DteCldExt_Eff_Actl 100;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldExt_Eff_Actl 1;
+BA_ "GenSigStartValue" SG_ 824 DteCldDrv_Eff_Actl 100;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldDrv_Eff_Actl 1;
+BA_ "GenSigSendType" SG_ 824 DteCldDcac_B_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldDcac_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 824 DteCldClimt_Eff_Actl 100;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldClimt_Eff_Actl 1;
+BA_ "GenSigStartValue" SG_ 824 DteCldBattULo_Eff_Actl 100;
+BA_ "ECGUsedTxSignal" SG_ 824 DteCldBattULo_Eff_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_RR_ORR_Data 65533;
+BA_ "GenSigStartValue" SG_ 949 Tire_Press_RR_ORR_Data 65533;
+BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_LR_OLR_Data 65533;
+BA_ "GenSigStartValue" SG_ 949 Tire_Press_LR_OLR_Data 65533;
+BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_LF_Data 65533;
+BA_ "GenSigStartValue" SG_ 949 Tire_Press_LF_Data 65533;
+BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_RF_Data 65533;
+BA_ "GenSigStartValue" SG_ 949 Tire_Press_RF_Data 65533;
+BA_ "GenSigSendType" SG_ 1825 TesterPhysicalReqVDM 3;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1;
+BA_ "MetaData" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1;
+BA_ "ContentDependant" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 524 PrplWhlTot_Tq_RqMxAwd 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 524 PrplWhlTot_Tq_RqMxAwd 1;
+BA_ "GenSigStartValue" SG_ 524 PrplWhlTot_Tq_RqMxAwd 65535;
+BA_ "GenSigStartValueInteger" SG_ 524 PrplWhlTot_Tq_RqMxAwd 65535;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1;
+BA_ "MetaData" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1;
+BA_ "ContentDependant" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 740 BattAuxCnnct_B_Cmd 1;
+BA_ "GenSigSendType" SG_ 1160 DgtlCommPncReset_B_Req 3;
+BA_ "ECGUsedTxSignal" SG_ 1160 DgtlCommPncReset_B_Req 1;
+BA_ "ECGUsedTxSignal" SG_ 1160 DataMntrSustn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1160 DataMntrSustn_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 1160 PwSustnRdata_B_RqTelem 1;
+BA_ "GenSigSendType" SG_ 1160 PwSustnRdata_B_RqTelem 3;
+BA_ "ECGUsedTxSignal" SG_ 776 ScMnSoc_Pc_RqCld 1;
+BA_ "GenSigStartValue" SG_ 776 ScMnSoc_Pc_RqCld 100;
+BA_ "GenSigSendType" SG_ 776 ScMnSoc_Pc_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 ScChrgrPwMax_Pw_RqCld 1;
+BA_ "GenSigSendType" SG_ 776 ScChrgrPwMax_Pw_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 ScLocPwId_No_RqCld 1;
+BA_ "GenSigSendType" SG_ 776 ScLocPwId_No_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 PrcondEdit_D_RqCld 1;
+BA_ "GenSigSendType" SG_ 776 PrcondEdit_D_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 GoTEditMnte_T_RqCld 1;
+BA_ "GenSigStartValue" SG_ 776 GoTEditMnte_T_RqCld 14;
+BA_ "GenSigSendType" SG_ 776 GoTEditMnte_T_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 GoTEditHr_T_RqCld 1;
+BA_ "GenSigStartValue" SG_ 776 GoTEditHr_T_RqCld 30;
+BA_ "GenSigSendType" SG_ 776 GoTEditHr_T_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 ChrgToPcEdit_Pc_RqCld 1;
+BA_ "GenSigStartValue" SG_ 776 ChrgToPcEdit_Pc_RqCld 126;
+BA_ "GenSigSendType" SG_ 776 ChrgToPcEdit_Pc_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 AirAmb_Te_ActlCld 1;
+BA_ "GenSigStartValueInteger" SG_ 776 AirAmb_Te_ActlCld 512;
+BA_ "UsedOnPgmDBC" SG_ 776 AirAmb_Te_ActlCld 1;
+BA_ "GenSigSendType" SG_ 776 AirAmb_Te_ActlCld 3;
+BA_ "ECGUsedTxSignal" SG_ 776 ScFreshDataEnbl_B_Rq 1;
+BA_ "GenSigSendType" SG_ 776 ScFreshDataEnbl_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 776 ScEnbl_D_RqCld 1;
+BA_ "GenSigStartValue" SG_ 776 ScEnbl_D_RqCld 1;
+BA_ "GenSigSendType" SG_ 776 ScEnbl_D_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScDayOfWeekId_D_RqCld 1;
+BA_ "GenSigStartValue" SG_ 775 ScDayOfWeekId_D_RqCld 1;
+BA_ "GenSigSendType" SG_ 775 ScDayOfWeekId_D_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScLocSetId_No_RqCld 1;
+BA_ "GenSigSendType" SG_ 775 ScLocSetId_No_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScLocRdius_L_RqCld 1;
+BA_ "GenSigStartValue" SG_ 775 ScLocRdius_L_RqCld 1;
+BA_ "GenSigSendType" SG_ 775 ScLocRdius_L_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScChrgToPc_Pc_RqCld 1;
+BA_ "GenSigStartValue" SG_ 775 ScChrgToPc_Pc_RqCld 100;
+BA_ "GenSigSendType" SG_ 775 ScChrgToPc_Pc_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScChrgPrfl_No_RqCld 1;
+BA_ "GenSigSendType" SG_ 775 ScChrgPrfl_No_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScChrgDurSet_D_RqCld 1;
+BA_ "GenSigStartValue" SG_ 775 ScChrgDurSet_D_RqCld 1;
+BA_ "GenSigSendType" SG_ 775 ScChrgDurSet_D_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 775 ScChrgDur_T_RqCld 1;
+BA_ "GenSigSendType" SG_ 775 ScChrgDur_T_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocLongPostv_B_RqCld 1;
+BA_ "GenSigSendType" SG_ 774 ScLocLongPostv_B_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocLongFrct_An_RqCld 1;
+BA_ "GenSigStartValue" SG_ 774 ScLocLongFrct_An_RqCld 1048575;
+BA_ "GenSigSendType" SG_ 774 ScLocLongFrct_An_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocLongDeg_An_RqCld 1;
+BA_ "GenSigSendType" SG_ 774 ScLocLongDeg_An_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocLattPostv_B_RqCld 1;
+BA_ "GenSigSendType" SG_ 774 ScLocLattPostv_B_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocLattFrct_An_RqCld 1;
+BA_ "GenSigStartValue" SG_ 774 ScLocLattFrct_An_RqCld 1048575;
+BA_ "GenSigSendType" SG_ 774 ScLocLattFrct_An_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocLattDeg_An_RqCld 1;
+BA_ "GenSigSendType" SG_ 774 ScLocLattDeg_An_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocId_No_RqCld 1;
+BA_ "GenSigSendType" SG_ 774 ScLocId_No_RqCld 3;
+BA_ "ECGUsedTxSignal" SG_ 774 ScLocDelete_B_RqCld 1;
+BA_ "GenSigSendType" SG_ 774 ScLocDelete_B_RqCld 3;
+BA_ "GenSigStartValue" SG_ 811 DistToStopover_L_Actl 65535;
+BA_ "WakeupSignal" SG_ 811 ExtLghtRight_D_RqMnu 1;
+BA_ "WakeupSignal" SG_ 811 AutoLghtOvrrd_B_RqDrv 1;
+BA_ "WakeupSignal" SG_ 811 ExtLghtRear_D_RqMnu 1;
+BA_ "WakeupSignal" SG_ 811 ExtLghtLeft_D_RqMnu 1;
+BA_ "WakeupSignal" SG_ 811 ExtLghtFront_D_RqMnu 1;
+BA_ "GenSigStartValue" SG_ 811 GoTEditMnte_T_RqMnu 14;
+BA_ "GenSigStartValue" SG_ 811 GoTEditHr_T_RqMnu 30;
+BA_ "U_CX727_MY2021_Tx" SG_ 850 VehElRngeNut_L_Dsply 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 850 NxtUsgSocEst_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 850 EstmChrgTimeLP_St 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 850 EstmChrgTimeLP_St 1;
+BA_ "ECGUsedRxSignal" SG_ 850 EstmChrgTimeHP_St 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 850 EstmChrgTimeHP_St 1;
+BA_ "ECGUsedRxSignal" SG_ 850 ChargeNowDuration_St 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 850 ChargeNowDuration_St 1;
+BA_ "ECGUsedTxSignal" SG_ 563 DrvBhavWarn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 563 DrvBhavWarn_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 563 OfbChrgSetSync_D_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 563 KeyOffPwMde_D_Stat 1;
+BA_ "GenSigSendType" SG_ 563 KeyOffPwMde_D_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 563 ModemReset_D_Stat 1;
+BA_ "GenSigSendType" SG_ 563 ModemReset_D_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 563 FactoryReset_St 1;
+BA_ "GenSigSendType" SG_ 563 FactoryReset_St 3;
+BA_ "GenSigSendType" SG_ 1833 TesterPhysicalResVDM 3;
+BA_ "GenSigStartValueInteger" SG_ 570 SuspRearRight_L_Actl 511;
+BA_ "GenSigStartValue" SG_ 570 SuspRearRight_L_Actl 511;
+BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspRearRight_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 570 SuspFrntRight_L_Actl 511;
+BA_ "GenSigStartValue" SG_ 570 SuspFrntRight_L_Actl 511;
+BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspFrntRight_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 570 SuspRear_L_Prev 511;
+BA_ "GenSigStartValue" SG_ 570 SuspRear_L_Prev 511;
+BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspRear_L_Prev 1;
+BA_ "U_P702_MY2021_Rx" SG_ 570 SuspRear_L_Prev 1;
+BA_ "GenSigStartValueInteger" SG_ 570 SuspRear_L_Actl 511;
+BA_ "GenSigStartValue" SG_ 570 SuspRear_L_Actl 511;
+BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspRear_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 570 SuspRear_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 570 SuspFrnt_L_Prev 511;
+BA_ "GenSigStartValue" SG_ 570 SuspFrnt_L_Prev 511;
+BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspFrnt_L_Prev 1;
+BA_ "U_P702_MY2021_Rx" SG_ 570 SuspFrnt_L_Prev 1;
+BA_ "GenSigStartValueInteger" SG_ 570 SuspFrnt_L_Actl 511;
+BA_ "GenSigStartValue" SG_ 570 SuspFrnt_L_Actl 511;
+BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspFrnt_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 570 SuspFrnt_L_Actl 1;
+BA_ "GenSigSendType" SG_ 837 Ccd_B_Falt 3;
+BA_ "GenSigInactiveValue" SG_ 837 Ccd_B_Falt 0;
+BA_ "GenSigSendType" SG_ 837 SelDrvMdeSusp_D_Stat 3;
+BA_ "GenSigInactiveValue" SG_ 837 SelDrvMdeSusp_D_Stat 0;
+BA_ "U_CX727_MY2021_Rx" SG_ 837 SelDrvMdeSusp_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 837 SelDrvMdeSusp_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 837 SelDrvMdeSusp_D_Stat 1;
+BA_ "GenSigSendType" SG_ 837 AdptDrvMdePt_D_Rq 3;
+BA_ "GenSigInactiveValue" SG_ 837 AdptDrvMdePt_D_Rq 0;
+BA_ "U_CX727_MY2021_Rx" SG_ 837 AdptDrvMdePt_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 837 AdptDrvMdePt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 837 AdptDrvMdePt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 837 AdptDrvMdeChassis_D_Rq 3;
+BA_ "GenSigInactiveValue" SG_ 837 AdptDrvMdeChassis_D_Rq 0;
+BA_ "U_CX727_MY2021_Rx" SG_ 837 AdptDrvMdeChassis_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 837 AdptDrvMdeChassis_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 837 AdptDrvMdeChassis_D_Rq 1;
+BA_ "GenSigSendType" SG_ 837 CcdMsgTxt_D_RqDsply 3;
+BA_ "GenSigInactiveValue" SG_ 837 CcdMsgTxt_D_RqDsply 0;
+BA_ "UsedOnPgmDBC" SG_ 837 CcdMsgTxt_D_RqDsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 837 CcdMsgTxt_D_RqDsply 1;
+BA_ "ECGUsedTxSignal" SG_ 885 BattULoChrg_D_RqOta 1;
+BA_ "ECGUsedTxSignal" SG_ 885 VehStrtInhbt_T_Dsply 1;
+BA_ "ECGUsedTxSignal" SG_ 885 VehStrtInhbt_D_Dsply 1;
+BA_ "ECGUsedTxSignal" SG_ 885 VehOnRqstr_D_Stat 1;
+BA_ "ECGUsedTxSignal" SG_ 885 VehStrtInhbt_D_RqCld 1;
+BA_ "ECGUsedTxSignal" SG_ 885 VehOn_D_RqCld 1;
+BA_ "ECGUsedTxSignal" SG_ 885 CanMsg375_No_Cnt 1;
+BA_ "ECGUsedTxSignal" SG_ 885 CanMsg375_No_Crc 1;
+BA_ "ECGUsedTxSignal" SG_ 885 OtaActv_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1150 LocationServices_1 1;
+BA_ "GenSigSendType" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 3;
+BA_ "U_P702_MY2021_Tx" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 1;
+BA_ "ECGUsedRxSignal" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 810 OBCCSerial_D_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 810 OBCCSerial_D_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 810 TlghtTest_D_RqArb 1;
+BA_ "GenSigSendType" SG_ 810 TlghtTest_D_RqArb 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ChrgrPncSustn_B_Rq 1;
+BA_ "GenSigStartValue" SG_ 810 ChrgrPncSustn_B_Rq 0;
+BA_ "GenSigStartValueInteger" SG_ 810 ChrgrPncSustn_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 810 NtfyDrvTrgtDist_L_Rq 1;
+BA_ "GenSigStartValue" SG_ 810 NtfyDrvTrgtDist_L_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 810 NtfyDrvTrgtDist_L_Rq 1;
+BA_ "WakeupSignal" SG_ 810 NtfyDrvTrgtDist_L_Rq 1;
+BA_ "GenSigSendType" SG_ 810 NtfyDrvTrgtDist_L_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1;
+BA_ "GenSigStartValue" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1;
+BA_ "WakeupSignal" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1;
+BA_ "GenSigSendType" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 810 PtRmtRprt_D_Stat 1;
+BA_ "WakeupSignal" SG_ 810 PtRmtRprt_D_Stat 1;
+BA_ "GenSigSendType" SG_ 810 PtRmtRprt_D_Stat 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ChrgrPncEnbl_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 810 ChrgrPncEnbl_D_Rq 3;
+BA_ "GenSigStartValueInteger" SG_ 810 ChrgrPncEnbl_D_Rq 3;
+BA_ "GenSigSendType" SG_ 810 ChrgrPncEnbl_D_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtDsply_B_StatArb 1;
+BA_ "WakeupSignal" SG_ 810 ExtLghtDsply_B_StatArb 1;
+BA_ "GenSigSendType" SG_ 810 ExtLghtDsply_B_StatArb 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtRight_D_RqOta 1;
+BA_ "WakeupSignal" SG_ 810 ExtLghtRight_D_RqOta 1;
+BA_ "GenSigSendType" SG_ 810 ExtLghtRight_D_RqOta 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtRear_D_RqOta 1;
+BA_ "WakeupSignal" SG_ 810 ExtLghtRear_D_RqOta 1;
+BA_ "GenSigSendType" SG_ 810 ExtLghtRear_D_RqOta 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtLeft_D_RqOta 1;
+BA_ "WakeupSignal" SG_ 810 ExtLghtLeft_D_RqOta 1;
+BA_ "GenSigSendType" SG_ 810 ExtLghtLeft_D_RqOta 3;
+BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtFront_D_RqOta 1;
+BA_ "WakeupSignal" SG_ 810 ExtLghtFront_D_RqOta 1;
+BA_ "GenSigSendType" SG_ 810 ExtLghtFront_D_RqOta 3;
+BA_ "ECGUsedTxSignal" SG_ 550 PtWakeupActv1_B_Rq 1;
+BA_ "WakeupSignal" SG_ 550 PtWakeupActv1_B_Rq 1;
+BA_ "GenSigSendType" SG_ 550 PtWakeupActv1_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgPrflUpdate_B_Rq 1;
+BA_ "GenSigSendType" SG_ 639 OfbChrgPrflUpdate_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgClearAll_B_Rq 1;
+BA_ "GenSigSendType" SG_ 639 OfbChrgClearAll_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTTouch_D_Rq 1;
+BA_ "GenSigSendType" SG_ 639 OfbChrgGoTTouch_D_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTPrcond_D_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTOn_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 639 OfbChrgGoTOn_D_Rq 2;
+BA_ "GenSigStartValueInteger" SG_ 639 OfbChrgGoTOn_D_Rq 2;
+BA_ "GenSigSendType" SG_ 639 OfbChrgGoTOn_D_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTMnte_D_Rq 1;
+BA_ "MetaData" SG_ 639 OfbChrgGoTMnte_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 639 OfbChrgGoTMnte_D_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTHr_T_Rq 1;
+BA_ "GenSigStartValue" SG_ 639 OfbChrgGoTHr_T_Rq 30;
+BA_ "GenSigStartValueInteger" SG_ 639 OfbChrgGoTHr_T_Rq 30;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTExtHtr_D_Rq 1;
+BA_ "GenSigSendType" SG_ 639 OfbChrgGoTExtHtr_D_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTElement_D_Rq 1;
+BA_ "MetaData" SG_ 639 OfbChrgGoTElement_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 639 OfbChrgGoTElement_D_Rq 1;
+BA_ "GenSigSendType" SG_ 639 OfbChrgGoTElement_D_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTDelete_B_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTUpdate_B_Rq 1;
+BA_ "GenSigSendType" SG_ 639 OfbChrgGoTUpdate_B_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgLocIdTrgt_No_Rq 1;
+BA_ "MetaData" SG_ 530 OfbChrgLocIdTrgt_No_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 530 OfbChrgLocIdTrgt_No_Rq 1;
+BA_ "GenSigSendType" SG_ 530 OfbChrgLocIdTrgt_No_Rq 3;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgToPcWknd_D_Actl 1;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgToPcWkdy_D_Actl 1;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgSetNow_D_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgSetDelete_B_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgPrflWknd_No_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgPrflWkdy_No_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgLocIdUns_B_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 1142 ConsTipV_No_Dsply 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1142 ConsTipV_No_Dsply 1;
+BA_ "WakeupSignal" SG_ 817 DrTgateOpen_B_Rq 1;
+BA_ "WakeupSignal" SG_ 817 DrTgateExtSwMde_B_Stat 1;
+BA_ "WakeupSignal" SG_ 817 Remote_Device_Feedback 1;
+BA_ "WakeupSignal" SG_ 817 Veh_Lock_Requestor 1;
+BA_ "WakeupSignal" SG_ 817 R_Pwr_Sliding_Dr_Rqst 1;
+BA_ "WakeupSignal" SG_ 817 Power_Liftgate_Rqst 1;
+BA_ "WakeupSignal" SG_ 817 Veh_Lock_EvNum 1;
+BA_ "WakeupSignal" SG_ 817 Power_Decklid_Rqst 1;
+BA_ "WakeupSignal" SG_ 817 L_Pwr_Sliding_Dr_Rqst 1;
+BA_ "WakeupSignal" SG_ 817 Keyfob_Pad_Msg_Count 1;
+BA_ "WakeupSignal" SG_ 817 Veh_Lock_Status 1;
+BA_ "GenSigStartValueInteger" SG_ 817 Veh_Lock_Status 1;
+BA_ "GenSigStartValue" SG_ 817 Veh_Lock_Status 1;
+BA_ "WakeupSignal" SG_ 817 ChildLck_D_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 817 ChildLck_D_Dsply 1;
+BA_ "GenSigStartValue" SG_ 817 ChildLck_D_Dsply 1;
+BA_ "WakeupSignal" SG_ 817 Lockmsgtxt_D_Rq 1;
+BA_ "WakeupSignal" SG_ 817 LockInhibit 1;
+BA_ "GenSigSendType" SG_ 878 DcacGfciTest_B_Rq 3;
+BA_ "GenSigStartValue" SG_ 878 DcacOut_Pw_DsplyMx 0;
+BA_ "GenSigStartValue" SG_ 878 DcacOut1_Pw_Dsply 0;
+BA_ "GenSigStartValue" SG_ 878 DcacOut2_Pw_Dsply 0;
+BA_ "GenSigSendType" SG_ 878 DcacHw_D_Confg 3;
+BA_ "UsedOnPgmDBC" SG_ 878 DcacHw_D_Confg 1;
+BA_ "GenSigStartValueInteger" SG_ 878 DcacHw_D_Confg 1;
+BA_ "GenSigStartValue" SG_ 878 DcacHw_D_Confg 1;
+BA_ "GenSigSendType" SG_ 878 DcacFaltMsgTxt_D_Rq 3;
+BA_ "UsedOnPgmDBC" SG_ 878 DcacFaltMsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 878 DcacFaltMsgTxt_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 878 DcacFaltMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 878 DcacLoFuelMsgTxt_D_Rq 3;
+BA_ "GenSigSendType" SG_ 878 DcacEngOnMsgTxt_D_Rq 3;
+BA_ "GenSigSendType" SG_ 878 DcacElPw_D_Stat 3;
+BA_ "UsedOnPgmDBC" SG_ 878 DcacElPw_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 878 DcacElPw_D_Stat 1;
+BA_ "GenSigStartValue" SG_ 878 DcacElPw_D_Stat 1;
+BA_ "GenSigSendType" SG_ 878 PwBedPnlEnbl_B_Rq 3;
+BA_ "GenSigSendType" SG_ 878 DcacOn_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 878 DcacOn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 878 DcacSys_B_Falt 3;
+BA_ "U_P702_MY2021_Tx" SG_ 878 DcacSys_B_Falt 1;
+BA_ "GenSigSendType" SG_ 878 DcacLedCtl_D_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 878 DcacLedCtl_D_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 2611055832 PARSEDPhysGWM_ECGtoSODR 1;
+BA_ "GenSigSendType" SG_ 2611055832 PARSEDPhysGWM_ECGtoSODR 3;
+BA_ "ECGUsedTxSignal" SG_ 2611054808 PARSEDPhysGWM_ECGtoSODL 1;
+BA_ "GenSigSendType" SG_ 2611054808 PARSEDPhysGWM_ECGtoSODL 3;
+BA_ "ECGUsedTxSignal" SG_ 2611026136 PARSEDPhysGWM_ECGtoSODCMD 1;
+BA_ "GenSigSendType" SG_ 2611026136 PARSEDPhysGWM_ECGtoSODCMD 3;
+BA_ "ECGUsedTxSignal" SG_ 2611025112 PARSEDPhysGWM_ECGtoSODCMC 1;
+BA_ "GenSigSendType" SG_ 2611025112 PARSEDPhysGWM_ECGtoSODCMC 3;
+BA_ "ECGUsedTxSignal" SG_ 2610975960 PARSEDPhysGWM_ECGtoCCM 1;
+BA_ "GenSigSendType" SG_ 2610975960 PARSEDPhysGWM_ECGtoCCM 3;
+BA_ "ECGUsedTxSignal" SG_ 2610007256 OTAPhysGWM_ECGtoSODR 1;
+BA_ "GenSigSendType" SG_ 2610007256 OTAPhysGWM_ECGtoSODR 3;
+BA_ "ECGUsedTxSignal" SG_ 2610006232 OTAPhysGWM_ECGtoSODL 1;
+BA_ "GenSigSendType" SG_ 2610006232 OTAPhysGWM_ECGtoSODL 3;
+BA_ "ECGUsedTxSignal" SG_ 2609977560 OTAPhysGWM_ECGtoSODCMD 1;
+BA_ "GenSigSendType" SG_ 2609977560 OTAPhysGWM_ECGtoSODCMD 3;
+BA_ "ECGUsedTxSignal" SG_ 2609976536 OTAPhysGWM_ECGtoSODCMC 1;
+BA_ "GenSigSendType" SG_ 2609976536 OTAPhysGWM_ECGtoSODCMC 3;
+BA_ "ECGUsedTxSignal" SG_ 2609927384 OTAPhysGWM_ECGtoCCM 1;
+BA_ "GenSigSendType" SG_ 2609927384 OTAPhysGWM_ECGtoCCM 3;
+BA_ "ECGUsedRxSignal" SG_ 2611175523 PARSEDPhysSODRtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175523 PARSEDPhysSODRtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224099 PARSEDPhysSODR2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224099 PARSEDPhysSODR2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2611175522 PARSEDPhysSODLtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175522 PARSEDPhysSODLtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224098 PARSEDPhysSODL2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224098 PARSEDPhysSODL2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2611175494 PARSEDPhysSODCMDtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175494 PARSEDPhysSODCMDtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224070 PARSEDPhysSODCMD2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224070 PARSEDPhysSODCMD2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2611175493 PARSEDPhysSODCMCtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175493 PARSEDPhysSODCMCtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224069 PARSEDPhysSODCMC2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224069 PARSEDPhysSODCMC2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2611175445 PARSEDPhysCCMtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175445 PARSEDPhysCCMtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224021 PARSEDPhysCCM2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224021 PARSEDPhysCCM2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126947 OTAPhysSODRtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126947 OTAPhysSODRtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126946 OTAPhysSODLtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126946 OTAPhysSODLtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126918 OTAPhysSODCMDtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126918 OTAPhysSODCMDtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126917 OTAPhysSODCMCtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126917 OTAPhysSODCMCtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126869 OTAPhysCCMtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126869 OTAPhysCCMtoGWM_ECG 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 FeatConfigIpmaActl 1;
+BA_ "CrossOver_InfoCAN" SG_ 984 FeatNoIpmaActl 1;
+BA_ "GenSigStartValue" SG_ 984 PersIndexIpma_D_Actl 4;
+BA_ "GenSigStartValueInteger" SG_ 984 PersIndexIpma_D_Actl 4;
+BA_ "CrossOver_InfoCAN" SG_ 984 PersIndexIpma_D_Actl 1;
+BA_ "GenSigSendType" SG_ 984 PersIndexIpma_D_Actl 3;
+BA_ "U_P702_MY2021_Rx" SG_ 984 AhbcRampingV_D_Rq 1;
+BA_ "GenSigSendType" SG_ 984 AhbcRampingV_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 LaActvStats_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 LaActvStats_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 LaDenyStats_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 LaDenyStats_B_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 LaHandsOff_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 LaHandsOff_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 CamraDefog_B_Req 1;
+BA_ "GenSigSendType" SG_ 984 CamraDefog_B_Req 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 CamraStats_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 CamraStats_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 DasAlrtLvl_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 DasAlrtLvl_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 DasStats_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 DasStats_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 984 DasWarn_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 984 DasWarn_D_Dsply 3;
+BA_ "GenSigSendType" SG_ 984 AhbHiBeam_D_Rq 3;
+BA_ "GenSigSendType" SG_ 985 LdwChime_B_Rq 3;
+BA_ "GenSigSendType" SG_ 985 TsrRegionTxt_D_Stat 3;
+BA_ "GenSigSendType" SG_ 985 SblmPedCrossScnr_B_Stat 3;
+BA_ "GenSigSendType" SG_ 985 LongCtrlEnbl_D_Rq 3;
+BA_ "GenSigSendType" SG_ 985 SblmRndAbtScnr_B_Stat 3;
+BA_ "GenSigSendType" SG_ 985 DasAlrtInfo_D_Dsply 3;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IaccVLim_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 985 IaccVLim_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 985 IaccVLim_D_Rq 254;
+BA_ "GenSigStartValueInteger" SG_ 985 IaccVLim_D_Rq 254;
+BA_ "GenSigSendType" SG_ 985 IaccVLim_D_Rq 3;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IaccVLimUnit_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 985 IaccVLimUnit_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 985 IaccVLimUnit_D_Rq 3;
+BA_ "GenSigStartValueInteger" SG_ 985 IaccVLimUnit_D_Rq 3;
+BA_ "GenSigSendType" SG_ 985 IaccVLimUnit_D_Rq 3;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IsaVLim_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 985 IsaVLim_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 985 IsaVLim_D_Rq 254;
+BA_ "GenSigStartValueInteger" SG_ 985 IsaVLim_D_Rq 254;
+BA_ "GenSigSendType" SG_ 985 IsaVLim_D_Rq 3;
+BA_ "GenSigSendType" SG_ 985 SblmStopScnr_B_Stat 3;
+BA_ "GenSigSendType" SG_ 985 SblmYieldScnr_B_Stat 3;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IsaVLimUnit_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 985 IsaVLimUnit_D_Rq 1;
+BA_ "GenSigSendType" SG_ 985 IsaVLimUnit_D_Rq 3;
+BA_ "GenSigSendType" SG_ 985 AdbDividedRoad_B_Stat 3;
+BA_ "GenSigSendType" SG_ 985 LcwaMsgTxt_D_Stat 3;
+BA_ "GenSigSendType" SG_ 985 AdbDrvSide_B_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrDsplyOp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrDsplyOp_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrFeatNoRq 1;
+BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrFeatNoRq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrFeatConfigRq 1;
+BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrFeatConfigRq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrPersIndex_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 992 MsgCntrPersIndex_D_Rq 4;
+BA_ "GenSigStartValueInteger" SG_ 992 MsgCntrPersIndex_D_Rq 4;
+BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrPersIndex_D_Rq 1;
+BA_ "GenSigSendType" SG_ 2612019416 PARSEDPhysGWM_ECG2toPCM 3;
+BA_ "ECGUsedTxSignal" SG_ 2612019416 PARSEDPhysGWM_ECG2toPCM 1;
+BA_ "UsedOnPgmDBC" SG_ 943 VehVActlAdas_D_Qf 1;
+BA_ "MetaData" SG_ 943 VehVActlAdas_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 943 VehVActlAdas_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 943 Veh_V_RqLsc 1;
+BA_ "UsedOnPgmDBC" SG_ 943 Veh_V_ActlAdas 1;
+BA_ "GenSigStartValue" SG_ 943 AdasLcDistToObj_L_Actl 4094;
+BA_ "UsedOnPgmDBC" SG_ 515 PtIgnSwtch_No_Cs 1;
+BA_ "MetaData" SG_ 515 PtIgnSwtch_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 515 PtIgnSwtch_No_Cnt 1;
+BA_ "MetaData" SG_ 515 PtIgnSwtch_No_Cnt 1;
+BA_ "GenSigSendType" SG_ 515 PtIgnSwtch_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 515 PtIgnSwtch_D_Stat 2;
+BA_ "GenSigStartValueInteger" SG_ 1111 TrlrYawWActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 1111 TrlrYawWActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrYawWActl_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrYawWActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 1111 TrlrYaw_W_Actl 65534;
+BA_ "GenSigStartValue" SG_ 1111 TrlrYaw_W_Actl 65534;
+BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrYaw_W_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrYaw_W_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1111 TrlrHitYaw_AnRate_Actl 4094;
+BA_ "GenSigStartValue" SG_ 1111 TrlrHitYaw_AnRate_Actl 4093;
+BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrHitYaw_AnRate_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrHitYaw_AnRate_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrHitchYaw_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrHitchYaw_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1111 TrlrHitchYaw_An_Actl 4094;
+BA_ "GenSigStartValue" SG_ 1111 TrlrHitchYaw_An_Actl 4093;
+BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrHitchYaw_An_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrHitchYaw_An_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1106 TrlrSnsId_No_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1106 TrlrSnsId_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 982 LatCtlCrv_NoRate2_Actl 1024;
+BA_ "UsedOnPgmDBC" SG_ 982 LatCtlPath_No_Cnt 1;
+BA_ "ContentDependant" SG_ 982 LatCtlPath_No_Cnt 1;
+BA_ "MetaData" SG_ 982 LatCtlPath_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 982 LatCtlPath_No_Cs 1;
+BA_ "ContentDependant" SG_ 982 LatCtlPath_No_Cs 1;
+BA_ "MetaData" SG_ 982 LatCtlPath_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 982 HandsOffCnfm_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 982 HandsOffCnfm_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlRampType_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlRampType_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlPrecision_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlPrecision_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 982 LatCtlPathOffst_L_Actl 512;
+BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlPathOffst_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlPathOffst_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 982 LatCtlPath_An_Actl 1000;
+BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlPath_An_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlPath_An_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 982 LatCtlCurv_No_Actl 1000;
+BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlCurv_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlCurv_No_Actl 1;
+BA_ "GenSigSendType" SG_ 1985 TesterPhysicalReqCMR_DSMC 3;
+BA_ "GenSigSendType" SG_ 1993 TesterPhysicalResCMR_DSMC 3;
+BA_ "MetaData" SG_ 1104 DrvEngageLevel_No_Cs 1;
+BA_ "ContentDependant" SG_ 1104 DrvEngageLevel_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 1104 DrvEngageLevel_No_Cs 1;
+BA_ "MetaData" SG_ 1104 DrvEngageLevel_No_Cnt 1;
+BA_ "ContentDependant" SG_ 1104 DrvEngageLevel_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 1104 DrvEngageLevel_No_Cnt 1;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_GWOnBoardTester 255;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_GWNMProxY 255;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_GWNMProxY 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_GWNMProxY 255;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserved 255;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserved 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserved 255;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserve4 255;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserve4 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserve4 255;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserve3 255;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserve3 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserve3 255;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserve2 255;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserve2 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserve2 255;
+BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMNodeId 223;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMNodeId 1;
+BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMNodeId 222;
+BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMControl 1;
+BA_ "ECGUsedTxSignal" SG_ 2610995416 PARSEDPhysGWM_ECGtoABS 1;
+BA_ "GenSigSendType" SG_ 2610995416 PARSEDPhysGWM_ECGtoABS 3;
+BA_ "ECGUsedTxSignal" SG_ 2612043992 PARSEDPhysGWM_ECG2toABS 1;
+BA_ "GenSigSendType" SG_ 2612043992 PARSEDPhysGWM_ECG2toABS 3;
+BA_ "ECGUsedTxSignal" SG_ 2609946840 OTAPhysGWM_ECGtoABS 1;
+BA_ "GenSigSendType" SG_ 2609946840 OTAPhysGWM_ECGtoABS 3;
+BA_ "ECGUsedRxSignal" SG_ 2611175464 PARSEDPhysABStoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175464 PARSEDPhysABStoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224040 PARSEDPhysABS2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224040 PARSEDPhysABS2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126888 OTAPhysABStoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126888 OTAPhysABStoGWM_ECG 3;
+BA_ "ECGUsedTxSignal" SG_ 2610988248 PARSEDPhysGWM_ECGtoIPMA 1;
+BA_ "ECGUsedTxSignal" SG_ 2609939672 OTAPhysGWM_ECGtoIPMA 1;
+BA_ "GenSigSendType" SG_ 2609939672 OTAPhysGWM_ECGtoIPMA 3;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1114 TrailCtlSwtch_B_Stat2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1114 TrailCtlSwtch_B_Stat2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1116 TrlrAidSetup_D2_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1116 TrlrAidSetup_D2_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1116 TrlrAidEnbl_D2_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1116 TrlrAidEnbl_D2_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1116 TrlrTrgtToBmpr_L_Actl 0;
+BA_ "U_P702_MY2021_Rx" SG_ 1116 TrlrIdType_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1116 TrlrIdType_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1116 TrlrBallToBmpr_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1116 TrlrAxleToBmpr_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1116 TrlrAnOffst_An_Mem 0;
+BA_ "GenSigStartValueInteger" SG_ 1116 TrlrTrgtOffst_L_Actl 0;
+BA_ "ECGUsedRxSignal" SG_ 2611175457 PARSEDPhysIPMAtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175457 PARSEDPhysIPMAtoGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2612224033 PARSEDPhysIPMA2toGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612224033 PARSEDPhysIPMA2toGWM_ECG 3;
+BA_ "ECGUsedRxSignal" SG_ 2610126881 OTAPhysIPMAtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126881 OTAPhysIPMAtoGWM_ECG 3;
+BA_ "UsedOnPgmDBC" SG_ 1085 ULoRgenTestMde_B_Stat 1;
+BA_ "ContentDependant" SG_ 1085 ULoRgenTestMde_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 ULoRgenTestMde_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 ULoRgenTestMde_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoOvrTe_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoOvrTe_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoOvrTe_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoFalt_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoFalt_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoFalt_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoDcnnt_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoDcnnt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoDcnnt_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULo_Pc_Mx 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULo_Pc_Mx 1;
+BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoComm_B_Falt 1;
+BA_ "ContentDependant" SG_ 1085 PwSrcULoComm_B_Falt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoComm_B_Falt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoComm_B_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1085 PwSrcULo_I_Mx 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULo_I_Mx 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULo_I_Mx 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1085 PwSrcULo_I_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULo_I_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULo_I_Actl 1;
+BA_ "GenSigStartValue" SG_ 981 AdbBrdrTop_An_Rq 254;
+BA_ "GenSigStartValue" SG_ 981 AdbBrdrRight_L_Stat 510;
+BA_ "GenSigStartValue" SG_ 981 AdbBrdrRight_An_Rq 1022;
+BA_ "GenSigStartValue" SG_ 981 AdbBrdrLeft_L_Stat 510;
+BA_ "GenSigStartValue" SG_ 981 AdbBrdrLeft_An_Rq 1022;
+BA_ "GenSigStartValue" SG_ 981 AdbBrdrBottom_An_Rq 62;
+BA_ "U_P702_MY2021_Rx" SG_ 791 EngAirFilt_B_RqReset 1;
+BA_ "CrossOver_InfoCAN" SG_ 791 GpsElMdeSel_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 791 LongTermReset_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 791 DrvEffLvl_No_Stat 1;
+BA_ "ECGUsedTxSignal" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 1;
+BA_ "U_P702_MY2021_Rx" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 1;
+BA_ "GenSigSendType" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 3;
+BA_ "ECGUsedTxSignal" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 1;
+BA_ "U_P702_MY2021_Rx" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 1;
+BA_ "GenSigSendType" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 3;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoStat_D_Qlty 1;
+BA_ "GenSigStartValue" SG_ 868 BattRgenLoStat_D_Qlty 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoSoc_Pc_Actl 1;
+BA_ "GenSigStartValue" SG_ 868 BattRgenLoSoc_Pc_Actl 50;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoPulse_U_Pred 1;
+BA_ "GenSigStartValue" SG_ 868 BattRgenLoPulse_U_Pred 216;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoPrtct_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoDChrg_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoDchrg_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoChrg_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoChrg_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLo_T_Est 1;
+BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLo_B_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLoBalnc_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_Te_Hi 1;
+BA_ "GenSigStartValue" SG_ 867 BattRgenLo_Te_Hi 45;
+BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_Te_Actl 1;
+BA_ "GenSigStartValue" SG_ 867 BattRgenLo_Te_Actl 85;
+BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_R_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_AhRide_Actl 1;
+BA_ "GenSigStartValue" SG_ 867 BattRgenLo_AhRide_Actl 12800;
+BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_Ah_Actl 1;
+BA_ "GenSigStartValue" SG_ 867 BattRgenLo_Ah_Actl 50;
+BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoOpen_U_Actl 1;
+BA_ "GenSigStartValue" SG_ 866 BattRgenLoOpen_U_Actl 180;
+BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoDchrg_U_Mn 1;
+BA_ "GenSigStartValue" SG_ 866 BattRgenLoDchrg_U_Mn 280;
+BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoDchrg_I_Mx 1;
+BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoChrg_U_Mx 1;
+BA_ "GenSigStartValue" SG_ 866 BattRgenLoChrg_U_Mx 96;
+BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoChrg_I_Mx 1;
+BA_ "U_P702_MY2021_Rx" SG_ 865 BattRgenLo_U_Actl 1;
+BA_ "GenSigStartValue" SG_ 865 BattRgenLo_U_Actl 768;
+BA_ "U_P702_MY2021_Rx" SG_ 865 BattRgenLo_I_Actl 1;
+BA_ "GenSigStartValue" SG_ 865 BattRgenLo_I_Actl 32768;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 1;
+BA_ "U_P702_MY2021_Tx" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 1;
+BA_ "ECGUsedRxSignal" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 3;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 1;
+BA_ "U_P702_MY2021_Tx" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 1;
+BA_ "ECGUsedRxSignal" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 3;
+BA_ "GenSigSendType" SG_ 2611175441 PARSEDPhysHPCMtoGWM_ECG 3;
+BA_ "GenSigSendType" SG_ 2612224017 PARSEDPhysHPCM2toGWM_ECG 3;
+BA_ "U_P702_MY2021_Tx" SG_ 2610126865 OTAPhysHPCMtoGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610126865 OTAPhysHPCMtoGWM_ECG 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1679 UUDTSOBDMCResponse4 1;
+BA_ "UsedOnPgmDBC" SG_ 1679 UUDTSOBDMCResponse4 1;
+BA_ "GenSigSendType" SG_ 1679 UUDTSOBDMCResponse4 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1678 UUDTSOBDMCResponse3 1;
+BA_ "UsedOnPgmDBC" SG_ 1678 UUDTSOBDMCResponse3 1;
+BA_ "GenSigSendType" SG_ 1678 UUDTSOBDMCResponse3 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1677 UUDTSOBDMCResponse2 1;
+BA_ "UsedOnPgmDBC" SG_ 1677 UUDTSOBDMCResponse2 1;
+BA_ "GenSigSendType" SG_ 1677 UUDTSOBDMCResponse2 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1676 UUDTSOBDMCResponse1 1;
+BA_ "UsedOnPgmDBC" SG_ 1676 UUDTSOBDMCResponse1 1;
+BA_ "GenSigSendType" SG_ 1676 UUDTSOBDMCResponse1 3;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved4 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved3 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved2 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved1 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMNodeId 165;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMNodeId 165;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMControl 1;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_GWOnBoardTester 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1445 SOBDMC_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1445 SOBDMC_GWNMProxy 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_GWNMProxy 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1144 WakeAlarm0_T_Rq 1;
+BA_ "GenSigStartValue" SG_ 1144 WakeAlarm0_T_Rq 32767;
+BA_ "GenSigStartValueInteger" SG_ 1144 WakeAlarm0_T_Rq 32767;
+BA_ "U_CX727_MY2021_Tx" SG_ 1144 WakeAlarm0_B_Typ 1;
+BA_ "GenSigSendType" SG_ 1144 WakeAlarm0_B_Typ 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1144 PreCondBatt_B_Actl 1;
+BA_ "GenSigSendType" SG_ 1144 PreCondBatt_B_Actl 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1144 HtrnDcdcDis_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1144 HtrnDcdcDis_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 HtrnDcdcDis_B_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1144 ChrgNowEvnt_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1144 ChrgNowEvnt_B_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1144 CabinDrvSustn_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1144 CabinDrvSustn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 CabinDrvSustn_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 BattChrgTrgtSoC_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 CabnEvapSovFront_B_Rq 3;
+BA_ "WakeupSignal" SG_ 1144 CabnEvapSovFront_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 CabnEvapSovFront_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 HeatCoreSovRear_B_Rq 3;
+BA_ "WakeupSignal" SG_ 1144 HeatCoreSovRear_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 HeatCoreSovRear_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 BattChlrSov_B_Rq 3;
+BA_ "WakeupSignal" SG_ 1144 BattChlrSov_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 BattChlrSov_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 CabnEvapSovRear_B_Rq 3;
+BA_ "WakeupSignal" SG_ 1144 CabnEvapSovRear_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 CabnEvapSovRear_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 BrkAppl_D_RqPt 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1144 BrkAppl_D_RqPt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1144 BrkAppl_D_RqPt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 BrkAppl_D_RqPt 1;
+BA_ "GenSigSendType" SG_ 1144 HtrnCnnctPwr_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 HtrnCnnctPwr_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1144 PtcHtr_D_Stat 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1144 PtcHtr_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1144 PtcHtr_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 PtcHtr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1144 HtrnClntFlw_D_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 HtrnClntFlw_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 BattTracDrvSustn_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1144 BattTracDrvSustn_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 BattTracDrvSustn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1144 BattTracClntVlv_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1144 BattTracClntVlv_B_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1141 OfbChrgSetSync_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1141 OfbChrgSetSync_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1141 PtRmtRprt_D_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 1141 PtRmtRprt_D_Rq 1;
+BA_ "WakeupSignal" SG_ 1141 PtRmtRprt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1141 MtrTrac2_Tq_Actl 4095;
+BA_ "GenSigStartValue" SG_ 1141 MtrTrac2_Tq_Actl 4095;
+BA_ "U_P702_MY2021_Tx" SG_ 1141 MtrTrac2_Tq_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1141 MtrTrac2_Tq_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1141 NtfctnConflict1_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1141 NtfctnConflict1_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1140 RgenEvntLvl_Pc_Dsply 1;
+BA_ "GenSigStartValue" SG_ 1140 RgenEvntLvl_Pc_Dsply 1022;
+BA_ "GenSigStartValueInteger" SG_ 1140 RgenEvntLvl_Pc_Dsply 1023;
+BA_ "U_CX727_MY2021_Tx" SG_ 1140 BrkEvntComplt_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1140 PreCondStat_D_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1140 PreCondStat_D_Dsply 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1139 ActChrgStrtYr_No2_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtYr_No2_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrtYr_No2_Actl 0;
+BA_ "U_P702_MY2021_Tx" SG_ 1139 BattChrgTrgtLMax_T_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtYr_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrtYr_No_Actl 0;
+BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtYr_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtMin_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtMin_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtHr_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtHr_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtDay_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1139 ActChrgStrtDay_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrtDay_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtDay_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrMnth_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1139 ActChrgStrMnth_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrMnth_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrMnth_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndYr_No2_Actl 0;
+BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndYr_No2_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1138 ActChrgEndYr_No2_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1138 BattChrgTrgtLMin_T_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndYr_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndYr_No_Actl 0;
+BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndYr_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndMnth_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1138 ActChrgEndMnth_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndMnth_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndMnth_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndMin_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndMin_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndHr_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndHr_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndDay_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1138 ActChrgEndDay_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndDay_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndDay_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 Mtr2Aout_W_ActlMntr 1;
+BA_ "GenSigStartValue" SG_ 1089 Mtr2Aout_W_ActlMntr 1023;
+BA_ "GenSigStartValueInteger" SG_ 1089 Mtr2Aout_W_ActlMntr 1023;
+BA_ "ECGUsedRxSignal" SG_ 1089 Mtr2Aout_W_ActlMntr 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 Inv1_Te_Actl 1;
+BA_ "GenSigStartValue" SG_ 1089 Inv1_Te_Actl 254;
+BA_ "GenSigStartValueInteger" SG_ 1089 Inv1_Te_Actl 254;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2Coil_Te_Actl 1;
+BA_ "GenSigStartValue" SG_ 1089 MtrTrac2Coil_Te_Actl 254;
+BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2Coil_Te_Actl 254;
+BA_ "ECGUsedRxSignal" SG_ 1089 MtrTrac2Coil_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2_U_Actl 1;
+BA_ "GenSigStartValue" SG_ 1089 MtrTrac2_U_Actl 1023;
+BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2_U_Actl 1023;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2Falt_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2TeAlrm_B_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1089 MtrTrac2TeAlrm_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 Mtr2CntlTeAlrm_B_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1089 Mtr2CntlTeAlrm_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2Inv_Te_Actl 1;
+BA_ "GenSigStartValue" SG_ 1089 MtrTrac2Inv_Te_Actl 214;
+BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2Inv_Te_Actl 214;
+BA_ "ECGUsedRxSignal" SG_ 1089 MtrTrac2Inv_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2_I_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2_I_Actl 10000;
+BA_ "U_CX727_MY2021_Tx" SG_ 1088 ChrgTMatch_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 ChrgStat_D2_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1088 ChrgStat_D2_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondRecirc_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondMode2_D_Rq 1;
+BA_ "ContentDependant" SG_ 1088 HvacPrecondMode2_D_Rq 1;
+BA_ "WakeupSignal" SG_ 1088 HvacPrecondMode2_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondBlwr2_D_Rq 1;
+BA_ "ContentDependant" SG_ 1088 HvacPrecondBlwr2_D_Rq 1;
+BA_ "WakeupSignal" SG_ 1088 HvacPrecondBlwr2_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondAC_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecond_Te_Rq 1;
+BA_ "GenSigStartValue" SG_ 1088 HvacPrecond_Te_Rq 2;
+BA_ "GenSigStartValueInteger" SG_ 1088 HvacPrecond_Te_Rq 2;
+BA_ "U_P702_MY2021_Tx" SG_ 1088 BattChrgInhbt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1040 ElCmprEnbl_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1040 ElCmprEnbl_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1040 ElCmprEnbl_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1040 ElCmpr_N_Rq 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTElement_B_Dsply 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTElement_B_Dsply 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1016 ChrgGoTElement_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgLocIdCurnt_D_Uns 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgLocIdCurnt_D_Uns 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgLocIdCurnt_D_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTTouchEnbl_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTTouchEnbl_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTTouch_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTTouch_B_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTTouch_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTPrcond_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTPrcond_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTNext_D_Stat 1;
+BA_ "MetaData" SG_ 1016 ChrgGoTNext_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1016 ChrgGoTNext_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1016 ChrgGoTNext_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTNext_D_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTNext_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTMnte_D_Stat 1;
+BA_ "MetaData" SG_ 1016 ChrgGoTMnte_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1016 ChrgGoTMnte_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1016 ChrgGoTMnte_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTMnte_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTHr_T_Stat 1;
+BA_ "GenSigStartValue" SG_ 1016 ChrgGoTHr_T_Stat 30;
+BA_ "GenSigStartValueInteger" SG_ 1016 ChrgGoTHr_T_Stat 30;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTHr_T_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTExtHtrEnbl_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTExtHtrEnbl_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTExtHtr_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTExtHtr_B_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTExtHtr_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTElement_D_Stat 1;
+BA_ "MetaData" SG_ 1016 ChrgGoTElement_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1016 ChrgGoTElement_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1016 ChrgGoTElement_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTElement_D_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTElement_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTAllOn_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1016 ChrgGoTAllOn_B_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTAllOn_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgToPcWkndSav_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1013 ChrgToPcWkndSav_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgToPcWkndSav_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgToPcWkdySav_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1013 ChrgToPcWkdySav_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgToPcWkdySav_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgProgIdSaved_D_Stat 1;
+BA_ "MetaData" SG_ 1013 ChrgProgIdSaved_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1013 ChrgProgIdSaved_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1013 ChrgProgIdSaved_D_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgProgIdSaved_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgNowEnbl_B_Saved 1;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgNowEnbl_B_Saved 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgLocIdUnsAck_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1013 ChrgLocIdUnsAck_B_Stat 3;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgLocIdUnsAck_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgLocIdCurnt_D_Sav 1;
+BA_ "MetaData" SG_ 1013 ChrgLocIdCurnt_D_Sav 1;
+BA_ "GenSigSendType" SG_ 1013 ChrgLocIdCurnt_D_Sav 3;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgLocIdCurnt_D_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgPrflWknd_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgPrflWknd_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgPrflWkdy_No_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 1013 ChrgPrflWkdy_No_Actl 1;
+BA_ "GenSigSendType" SG_ 1012 ChrgNowCurnt_B_Dsply 3;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgNowCurnt_B_Dsply 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1012 ChrgNowCurnt_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgNowCurnt_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 1012 ChrgLocSaved_B_Dsply 3;
+BA_ "UsedOnPgmDBC" SG_ 1012 ChrgLocSaved_B_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocSaved_B_Dsply 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1012 ChrgLocSaved_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocSaved_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLongPostv_B_Sav 1;
+BA_ "UsedOnPgmDBC" SG_ 1012 ChrgLocLongPostv_B_Sav 1;
+BA_ "CrossOver_InfoCAN" SG_ 1012 ChrgLocLongPostv_B_Sav 1;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLongPostv_B_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLongFrct_An_Sav 1;
+BA_ "GenSigStartValue" SG_ 1012 ChrgLocLongFrct_An_Sav 1048575;
+BA_ "GenSigStartValueInteger" SG_ 1012 ChrgLocLongFrct_An_Sav 1048575;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLongFrct_An_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLongDeg_An_Sav 1;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLongDeg_An_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLattPostv_B_Sav 1;
+BA_ "UsedOnPgmDBC" SG_ 1012 ChrgLocLattPostv_B_Sav 1;
+BA_ "CrossOver_InfoCAN" SG_ 1012 ChrgLocLattPostv_B_Sav 1;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLattPostv_B_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLattFrct_An_Sav 1;
+BA_ "GenSigStartValue" SG_ 1012 ChrgLocLattFrct_An_Sav 1048575;
+BA_ "GenSigStartValueInteger" SG_ 1012 ChrgLocLattFrct_An_Sav 1048575;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLattFrct_An_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLattDeg_An_Sav 1;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLattDeg_An_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocId_D_Sav 1;
+BA_ "GenSigSendType" SG_ 1012 ChrgLocId_D_Sav 3;
+BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocId_D_Sav 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLongPostv_B_Uns 1;
+BA_ "UsedOnPgmDBC" SG_ 1011 ChrgLocLongPostv_B_Uns 1;
+BA_ "CrossOver_InfoCAN" SG_ 1011 ChrgLocLongPostv_B_Uns 1;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLongPostv_B_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLongFrct_An_Uns 1;
+BA_ "GenSigStartValue" SG_ 1011 ChrgLocLongFrct_An_Uns 1048575;
+BA_ "GenSigStartValueInteger" SG_ 1011 ChrgLocLongFrct_An_Uns 1048575;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLongFrct_An_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLongDeg_An_Uns 1;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLongDeg_An_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLattPostv_B_Uns 1;
+BA_ "UsedOnPgmDBC" SG_ 1011 ChrgLocLattPostv_B_Uns 1;
+BA_ "CrossOver_InfoCAN" SG_ 1011 ChrgLocLattPostv_B_Uns 1;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLattPostv_B_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLattFrct_An_Uns 1;
+BA_ "GenSigStartValue" SG_ 1011 ChrgLocLattFrct_An_Uns 1048575;
+BA_ "GenSigStartValueInteger" SG_ 1011 ChrgLocLattFrct_An_Uns 1048575;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLattFrct_An_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLattDeg_An_Uns 1;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLattDeg_An_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocId_D_Uns 1;
+BA_ "GenSigSendType" SG_ 1011 ChrgLocId_D_Uns 3;
+BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocId_D_Uns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 871 BattElecPerf_D_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 871 BattElecPerf_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 871 BattChrgTrgtLPt_T_Est 1;
+BA_ "ECGUsedRxSignal" SG_ 871 BattChrgTrgtLPt_T_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 871 BattChrgTrgSocPt_T_Est 1;
+BA_ "ECGUsedRxSignal" SG_ 871 BattChrgTrgSocPt_T_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 871 BattChrgCmpltPt_T_Est 1;
+BA_ "ECGUsedRxSignal" SG_ 871 BattChrgCmpltPt_T_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 786 RgenTrip_Pc_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 786 RgenTrip_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 786 RgenTrip_Pc_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 786 RgenTrip_L_Dsply 1;
+BA_ "GenSigStartValue" SG_ 786 RgenTrip_L_Dsply 65535;
+BA_ "GenSigStartValueInteger" SG_ 786 RgenTrip_L_Dsply 65535;
+BA_ "CrossOver_InfoCAN" SG_ 786 RgenTrip_L_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 786 RgenTrip_L_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 786 ChrgStat_D_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 786 ChrgStat_D_Dsply 1;
+BA_ "UsedOnPgmDBC" SG_ 72 immoTarget2Status 1;
+BA_ "UsedOnPgmDBC" SG_ 72 immoTarget2Data 1;
+BA_ "UsedOnPgmDBC" SG_ 72 immoTarget2Cmd 1;
+BA_ "U_P702_MY2021_Rx" SG_ 912 CabnEvapSovFront_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 912 BattChlrSov_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 912 BattTracClntVlv_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 874 BattTracShrtGrnd_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 874 BattTracShrtBatt_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 874 BattTracOpnCirct_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 874 BattChlrShrtGrnd_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 874 BattChlrShrtBatt_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 874 BattChlrOpnCirct_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 651 TelematicsSrvc_D_St 1;
+BA_ "ECGUsedTxSignal" SG_ 651 OfbChrgSetSync_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgToPcWknd_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgToPcWknd_D_Actl 1;
+BA_ "ECGUsedTxSignal" SG_ 529 OnbChrgToPcWknd_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgToPcWkdy_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgToPcWkdy_D_Actl 1;
+BA_ "ECGUsedTxSignal" SG_ 529 OnbChrgToPcWkdy_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgSetNow_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgSetDelete_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgSetDelete_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgPrflWknd_No_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgPrflWkdy_No_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgPrflUpdate_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgPrflUpdate_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgLocIdUns_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgLocIdUns_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1;
+BA_ "MetaData" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 66 immoControlData_T2 1;
+BA_ "ContentDependant" SG_ 66 immoControlData_T2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 66 immoControlCmd_T2 1;
+BA_ "ContentDependant" SG_ 66 immoControlCmd_T2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 2610971864 PARSEDPhysGWM_ECGtoHPCM 1;
+BA_ "GenSigSendType" SG_ 2610971864 PARSEDPhysGWM_ECGtoHPCM 3;
+BA_ "ECGUsedTxSignal" SG_ 2610971864 PARSEDPhysGWM_ECGtoHPCM 1;
+BA_ "ECGUsedTxSignal" SG_ 2612002008 PARSEDFuncGWM_ECG 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2612002008 PARSEDFuncGWM_ECG 1;
+BA_ "U_P702_MY2021_Rx" SG_ 2612002008 PARSEDFuncGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2612002008 PARSEDFuncGWM_ECG 3;
+BA_ "U_P702_MY2021_Rx" SG_ 2609923288 OTAPhysGWM_ECGtoHPCM 1;
+BA_ "GenSigSendType" SG_ 2609923288 OTAPhysGWM_ECGtoHPCM 3;
+BA_ "ECGUsedTxSignal" SG_ 2609923288 OTAPhysGWM_ECGtoHPCM 1;
+BA_ "ECGUsedTxSignal" SG_ 2610953432 OTAFuncGWM_ECG 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2610953432 OTAFuncGWM_ECG 1;
+BA_ "U_P702_MY2021_Rx" SG_ 2610953432 OTAFuncGWM_ECG 1;
+BA_ "GenSigSendType" SG_ 2610953432 OTAFuncGWM_ECG 3;
+BA_ "GenSigSendType" SG_ 2022 TesterPhysicalReqSOBDMC 3;
+BA_ "U_P702_MY2021_Rx" SG_ 2022 TesterPhysicalReqSOBDMC 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Vdop 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Speed 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Sat_num_in_view 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1124 GPS_Sat_num_in_view 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_MSL_altitude 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Heading 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Hdop 1;
+BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_dimension 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1124 GPS_dimension 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1119 CoolFanDcdc_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1119 DcdcClntFlw_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkYr_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkScnd_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkMnte_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkHr_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkDay_No_Actl 1;
+BA_ "GenSigSendType" SG_ 1990 TesterPhysicalReqSODR 3;
+BA_ "GenSigSendType" SG_ 1892 TesterPhysicalReqCCM 3;
+BA_ "GenSigSendType" SG_ 1798 TesterPhysicalReqIPMA 3;
+BA_ "GenSigStartValueInteger" SG_ 1123 GpsUtcYr_No_Actl 0;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GpsUtcYr_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1123 GpsUtcMnth_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1123 GpsUtcMnth_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GpsUtcMnth_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1123 GpsUtcDay_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1123 GpsUtcDay_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GpsUtcDay_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_UTC_seconds 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_UTC_minutes 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_UTC_hours 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_Pdop 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_Compass_direction 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_Actual_vs_Infer_pos 1;
+BA_ "CrossOver_InfoCAN" SG_ 1123 Gps_B_Falt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GpsHsphLongEast_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GpsHsphLattSth_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Longitude_Minutes 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Longitude_Min_dec 1;
+BA_ "GenSigStartValueInteger" SG_ 1122 GPS_Longitude_Degrees 179;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Longitude_Degrees 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Latitude_Minutes 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Latitude_Min_dec 1;
+BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Latitude_Degrees 1;
+BA_ "GenSigStartValue" SG_ 1003 PersNoPos_D_Actl 4;
+BA_ "GenSigStartValueInteger" SG_ 1003 PersNoPos_D_Actl 4;
+BA_ "CrossOver_InfoCAN" SG_ 1003 PersNoPos_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1003 PersSetupRestr_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1003 PersSetupAccessCtrl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1003 PersSetup_No_Actl 1;
+BA_ "GenSigStartValue" SG_ 1003 PersConflict_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1003 PersConflict_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1003 PersConflict_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1003 AssocConfirm_D_Actl 1;
+BA_ "MetaData" SG_ 1003 RecallEvent_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1003 RecallEvent_No_Cnt 1;
+BA_ "GenSigStartValue" SG_ 1003 PersNo_D_Actl 4;
+BA_ "GenSigStartValueInteger" SG_ 1003 PersNo_D_Actl 4;
+BA_ "CrossOver_InfoCAN" SG_ 1003 PersNo_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 PersStore_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 Pers4OptIn_B_Stats 1;
+BA_ "WakeupSignal" SG_ 994 Pers4OptIn_B_Stats 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 Pers3OptIn_B_Stats 1;
+BA_ "WakeupSignal" SG_ 994 Pers3OptIn_B_Stats 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 Pers2OptIn_B_Stats 1;
+BA_ "WakeupSignal" SG_ 994 Pers2OptIn_B_Stats 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 Pers1OptIn_B_Stats 1;
+BA_ "WakeupSignal" SG_ 994 Pers1OptIn_B_Stats 1;
+BA_ "GenSigStartValue" SG_ 994 CtrStkPersIndex_D_Actl 4;
+BA_ "GenSigStartValueInteger" SG_ 994 CtrStkPersIndex_D_Actl 4;
+BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkPersIndex_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkFeatNoActl 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkFeatConfigActl 1;
+BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkDsplyOp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 778 PrkAidFront_D_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 778 Cta_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 778 Cta_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 778 Cta_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 778 PrkAidRear_D_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 778 Sod_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 778 Sod_D_Rq 2;
+BA_ "GenSigStartValue" SG_ 778 Sod_D_Rq 2;
+BA_ "WakeupSignal" SG_ 549 Power_Up_Chime_Modules 1;
+BA_ "WakeupSignal" SG_ 551 Cntr_Plg_Mode_Cmd 1;
+BA_ "GenSigStartValue" SG_ 551 Btt_L_Actl2 30;
+BA_ "GenSigStartValueInteger" SG_ 551 Btt_L_Actl2 126;
+BA_ "WakeupSignal" SG_ 551 Em_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1010 CbdblActv_B_RqAdas 1;
+BA_ "UsedOnPgmDBC" SG_ 1010 CbdblActv_B_RqAdas 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1010 LightRng_L_Max 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1010 LightPathOffst_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1010 LightPathOffst_L_Actl 512;
+BA_ "U_P702_MY2021_Rx" SG_ 1010 LightPath_An_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1010 LightPath_An_Actl 1000;
+BA_ "U_P702_MY2021_Rx" SG_ 1010 LightCurv_NoRate_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1010 LightCurv_NoRate_Actl 4096;
+BA_ "U_P702_MY2021_Rx" SG_ 1010 LightCurv_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1010 LightCurv_No_Actl 1000;
+BA_ "GenSigStartValue" SG_ 1070 BattULo24_Te_Actl 127;
+BA_ "GenSigStartValueInteger" SG_ 1070 BattULo24_Te_Actl 127;
+BA_ "UsedOnPgmDBC" SG_ 1070 BattULo24_Te_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24State_D_Qlty 1;
+BA_ "GenSigStartValue" SG_ 1070 BattULo24State_D_Qlty 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24Soc_Pc_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1070 BattULo24Soc_Pc_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24_I_Actl 1;
+BA_ "GenSigStartValue" SG_ 1070 BattULo24_I_Actl 8192;
+BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24_B_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24_Ah_DeltaRide 1;
+BA_ "GenSigStartValue" SG_ 1070 BattULo24_Ah_DeltaRide 12800;
+BA_ "GenSigStartValueInteger" SG_ 1186 SelDrvMdeAwd2_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1186 SelDrvMdeAwd2_D_Stat 31;
+BA_ "U_CX727_MY2021_Rx" SG_ 1186 SelDrvMdeAwd2_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1186 SelDrvMdeAwd2_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1186 SelDrvMdeAwd2_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffLckMsg_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1186 RearDiffLckLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffLckLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1186 RearDiffLck_Tq_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1186 RearDiffLck_Tq_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffLck_Tq_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1186 RearDiffFalt_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffFalt_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1186 LsdSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1186 LsdSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdSys_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdSys_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdSys_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdStat_D_RqDsply 1;
+BA_ "ContentDependant" SG_ 611 AwdStat_D_RqDsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdStat_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdStat_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdStat_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdLck_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 611 AwdLck_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdLck_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdLck_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdLck_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdSrvcRqd_B_Rq 1;
+BA_ "ContentDependant" SG_ 611 AwdSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdSrvcRqd_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 NtrlTowAvail_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdLck_Tq_Rq 1;
+BA_ "ContentDependant" SG_ 611 AwdLck_Tq_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdLck_Tq_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdLck_Tq_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 TrnAout_Tq_RqMx 1;
+BA_ "GenSigStartValueInteger" SG_ 611 TrnAout_Tq_RqMx 8191;
+BA_ "GenSigStartValue" SG_ 611 TrnAout_Tq_RqMx 8191;
+BA_ "U_P702_MY2021_Rx" SG_ 611 TrnAout_Tq_RqMx 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 TrnAout_Tq_RqMx 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 TrnAout_Tq_RqMx 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdOffRoadMode_D_Stats 1;
+BA_ "UsedOnPgmDBC" SG_ 611 AwdOffRoadMode_D_Stats 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdOffRoadMode_D_Stats 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdLoLamp_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdLoLamp_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdHiLamp_D_RqDsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdHiLamp_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdHiLamp_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdAutoLamp_D_RqDsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdAutoLamp_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdAutoLamp_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 Awd2wdLamp_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 Awd2wdLamp_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 611 AwdRnge_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 611 AwdRnge_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 611 AwdRnge_D_Actl 7;
+BA_ "GenSigStartValue" SG_ 611 AwdRnge_D_Actl 7;
+BA_ "U_P702_MY2021_Rx" SG_ 611 AwdRnge_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdRnge_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 611 AwdRnge_D_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 611 AwdRnge_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1461 PSCM_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_GWOnBoardTester 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_GWOnBoardTester 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_GWOnBoardTester 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1461 PSCM_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_GWNMProxy 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_GWNMProxy 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_GWNMProxy 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_GWNMProxy 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved4 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_AutoSarNMReserved4 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved4 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved3 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_AutoSarNMReserved3 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved3 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved2 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved1 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMNodeId 181;
+BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMNodeId 181;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMNodeId 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMControl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMControl 1;
+BA_ "GenSigStartValueInteger" SG_ 1047 TrlrAnOffst_An2_Calc 128;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAnOffst_An2_Calc 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAn_An_WarnCalc 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAn_An_MxCalc 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidTrlrId_No_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidTrgtId_No_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidSetup_D2_Stat 1;
+BA_ "GenSigSendType" SG_ 1047 TrlrAidEnbl_D2_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1047 TrlrAidEnbl_D2_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1047 TrlrAidEnbl_D2_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidEnbl_D2_Stat 1;
+BA_ "GenSigSendType" SG_ 1047 TrlrAidMsgTxt_D2_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1047 TrlrAidMsgTxt_D2_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidMsgTxt_D2_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1047 EsaOn_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 1047 EsaOn_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1047 EsaOn_B_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1047 EsaOn_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 EsaOn_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 HitchToTrlrAxle_L_Calc 1;
+BA_ "GenSigSendType" SG_ 1047 SelDrvMdeSte_D_Stat 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1047 SelDrvMdeSte_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1047 SelDrvMdeSte_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1047 SelDrvMdeSte_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1047 SelDrvMdeSte_D_Stat 1;
+BA_ "GenSigSendType" SG_ 972 LatCtlSte_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 972 LatCtlSte_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LatCtlSte_D_Stat 1;
+BA_ "GenSigSendType" SG_ 972 LatCtlLim_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 972 LatCtlLim_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LatCtlLim_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 972 LatCtlCpbltyDStat_No_Cnt 1;
+BA_ "MetaData" SG_ 972 LatCtlCpbltyDStat_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 972 LatCtlCpbltyDStat_No_Cs 1;
+BA_ "MetaData" SG_ 972 LatCtlCpbltyDStat_No_Cs 1;
+BA_ "GenSigStartValueInteger" SG_ 972 TrlrAn_An_TrgtCalc 128;
+BA_ "U_P702_MY2021_Tx" SG_ 972 TrlrAn_An_TrgtCalc 1;
+BA_ "U_P702_MY2021_Rx" SG_ 972 LsmcBrkDecelEnbl_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LsmcBrkDecelEnbl_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 972 TjaHandsOnCnfdnc_B_Est 1;
+BA_ "GenSigStartValue" SG_ 972 TjaHandsOnCnfdnc_B_Est 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 972 TjaHandsOnCnfdnc_B_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 TjaHandsOnCnfdnc_B_Est 1;
+BA_ "CrossOver_InfoCAN" SG_ 972 LaHandsOff_B_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 972 LaHandsOff_B_Actl 1;
+BA_ "GenSigStartValue" SG_ 972 LaHandsOff_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 972 LaHandsOff_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LaHandsOff_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 972 LaActDeny_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 972 LaActDeny_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LaActDeny_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 972 LaActAvail_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 972 LaActAvail_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LaActAvail_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 972 LsmcBrk_Tq_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 972 LsmcBrk_Tq_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 130 TrlrHitchLamp_D_Rqst 1;
+BA_ "UsedOnPgmDBC" SG_ 130 TrlrHitchLamp_D_Rqst 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 TrlrHitchLamp_D_Rqst 1;
+BA_ "CrossOver_InfoCAN" SG_ 130 VehVTrlrAid_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 130 VehVTrlrAid_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 130 VehVTrlrAid_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 VehVTrlrAid_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 130 Veh_V_RqMxTrlrAid 255;
+BA_ "GenSigStartValue" SG_ 130 Veh_V_RqMxTrlrAid 255;
+BA_ "U_P702_MY2021_Rx" SG_ 130 Veh_V_RqMxTrlrAid 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 130 Veh_V_RqMxTrlrAid 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 Veh_V_RqMxTrlrAid 1;
+BA_ "UsedOnPgmDBC" SG_ 130 DrvSteActv_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 130 DrvSteActv_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 DrvSteActv_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 130 DrvSte_Tq_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 130 DrvSte_Tq_Actl 128;
+BA_ "U_P702_MY2021_Rx" SG_ 130 DrvSte_Tq_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 DrvSte_Tq_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SteMdule_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SteMdule_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SteMdule_U_Meas 1;
+BA_ "GenSigStartValueInteger" SG_ 130 SteMdule_U_Meas 255;
+BA_ "GenSigStartValue" SG_ 130 SteMdule_U_Meas 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SteMdule_U_Meas 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SteMdule_U_Meas 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SteMdule_I_Est 1;
+BA_ "GenSigStartValueInteger" SG_ 130 SteMdule_I_Est 4095;
+BA_ "GenSigStartValue" SG_ 130 SteMdule_I_Est 4095;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SteMdule_I_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SteMdule_I_Est 1;
+BA_ "CrossOver_InfoCAN" SG_ 130 EPAS_Failure 1;
+BA_ "UsedOnPgmDBC" SG_ 130 EPAS_Failure 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 EPAS_Failure 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 EPAS_Failure 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SteeringColumnTorque 1;
+BA_ "GenSigStartValueInteger" SG_ 130 SteeringColumnTorque 254;
+BA_ "GenSigStartValue" SG_ 130 SteeringColumnTorque 254;
+BA_ "U_CX727_MY2021_Rx" SG_ 130 SteeringColumnTorque 1;
+BA_ "U_P702_MY2021_Rx" SG_ 130 SteeringColumnTorque 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SteeringColumnTorque 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SteeringColumnTorque 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat6 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat6 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat6 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat5 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat5 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat5 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat4 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat4 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat4 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat3 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat3 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat3 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat2 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat2 1;
+BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat1 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat1 1;
+BA_ "UsedOnPgmDBC" SG_ 126 StePw_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 126 StePw_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePw_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 126 StePw_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "GenSigStartValueInteger" SG_ 126 StePinRelInit_An_Sns 65535;
+BA_ "ContentDependant" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "GenSigStartValue" SG_ 126 StePinRelInit_An_Sns 65535;
+BA_ "U_P702_MY2021_Rx" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "U_P702_MY2021_Tx" SG_ 126 StePinRelInit_An_Sns 1;
+BA_ "CrossOver_InfoCAN" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "ECGUsedRxSignal" SG_ 126 StePinCompAnEst_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 126 StePinComp_An_Est 16000;
+BA_ "U_P702_MY2021_Rx" SG_ 126 StePinComp_An_Est 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinComp_An_Est 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePinComp_An_Est 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinComp_An_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 126 StePinComp_An_Est 1;
+BA_ "ECGUsedRxSignal" SG_ 126 StePinComp_An_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 126 StePinAn_No_Cs 1;
+BA_ "ContentDependant" SG_ 126 StePinAn_No_Cs 1;
+BA_ "MetaData" SG_ 126 StePinAn_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 126 StePinAn_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinAn_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinAn_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 126 StePinAn_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 126 StePinAn_No_Cnt 1;
+BA_ "MetaData" SG_ 126 StePinAn_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 126 StePinAn_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinAn_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinAn_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 126 StePinAn_No_Cnt 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1430 ABS_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_GWOnBoardTester 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_GWOnBoardTester 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1430 ABS_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_GWNMProxy 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_GWNMProxy 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_GWNMProxy 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved4 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved4 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved3 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved3 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved2 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved1 255;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMNodeId 150;
+BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMNodeId 150;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMNodeId 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMControl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMControl 1;
+BA_ "GenSigStartValueInteger" SG_ 1200 HsaTrnAout_Tq_Rq 32768;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 HsaTrnAout_Tq_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 HsaTrnAout_Tq_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1200 BrkBstrVac_P_Actl 127;
+BA_ "GenSigStartValue" SG_ 1200 BrkBstrVac_P_Actl 127;
+BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkBstrVac_P_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkBstrVac_P_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkBstrVac_P_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkBstrVac_P_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1200 YawStabilityIndex 256;
+BA_ "U_CX727_MY2021_Rx" SG_ 1200 YawStabilityIndex 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1200 YawStabilityIndex 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 YawStabilityIndex 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 YawStabilityIndex 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkTot_Tq_RqDrv 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkTot_Tq_RqDrv 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkTot_Tq_RqDrv 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkTot_Tq_RqDrv 1;
+BA_ "MetaData" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1;
+BA_ "MetaData" SG_ 1200 BrkTotTqRqDrv_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1200 HsaStat_D_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1200 HsaStat_D_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos12_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos12_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos12_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos12_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos12_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos11_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos11_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos11_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos11_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos11_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos10_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos10_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos10_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos10_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos10_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos09_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos09_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos09_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos09_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos09_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos08_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos08_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos08_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos08_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos08_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos07_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos07_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos07_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos07_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos07_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos06_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos06_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos06_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos06_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos06_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos05_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos05_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos05_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos05_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos05_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos04_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos04_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos04_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos04_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos04_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos03_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos03_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos03_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos03_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos03_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos02_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos02_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos02_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos02_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos02_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos01_D_Stat 31;
+BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos01_D_Stat 31;
+BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos01_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos01_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos01_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1056 AutoEpbMsgTxt_D_Rq 3;
+BA_ "GenSigSendType" SG_ 1056 AutoEpbDsply_D_Stat 3;
+BA_ "GenSigSendType" SG_ 1056 AutoEpbButtnOn_B_Stat 3;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos12_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos12_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos12_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos11_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos11_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos11_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos10_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos10_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos10_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos09_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos09_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos09_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos08_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos08_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos08_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos07_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos07_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos07_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos06_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos06_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos06_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos05_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos05_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos05_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos04_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos04_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos04_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos03_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos03_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos03_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos02_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos02_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos02_B_Avail 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos01_B_Avail 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos01_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos01_B_Avail 1;
+BA_ "GenSigStartValueInteger" SG_ 1056 ActvDrvMde_D2_Stat 31;
+BA_ "GenSigStartValue" SG_ 1056 ActvDrvMde_D2_Stat 31;
+BA_ "GenSigSendType" SG_ 1056 ActvDrvMde_D2_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 ActvDrvMde_D2_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 ActvDrvMde_D2_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1056 SelDrvMde_D2_Rq 31;
+BA_ "GenSigStartValue" SG_ 1056 SelDrvMde_D2_Rq 31;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMde_D2_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMde_D2_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMde_D2_Rq 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdePt_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1056 SelDrvMdePt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1056 SelDrvMdePt_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMdeMsgTxt_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdeMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdeMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1056 SelDrvMde_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMde_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMde_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1056 AwdMde_D_RqBrk 5;
+BA_ "GenSigStartValue" SG_ 1056 AwdMde_D_RqBrk 5;
+BA_ "GenSigSendType" SG_ 1056 AwdMde_D_RqBrk 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1056 AwdMde_D_RqBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1056 AwdMde_D_RqBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 AirDamUp_B_RqBrk 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 AirDamUp_B_RqBrk 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1054 AirDamUp_B_RqBrk 1;
+BA_ "GenSigSendType" SG_ 1054 AirDamUp_B_RqBrk 3;
+BA_ "GenSigSendType" SG_ 1054 RbaBrk_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 RbaBrk_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 RbaBrk_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1054 SelDrvMdeChassis2_D_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1054 SelDrvMdeChassis2_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1054 SelDrvMdeChassis2_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 SelDrvMdeChassis2_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1054 TrailCtl_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1054 TrailCtl_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 TrailCtl_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 TrailCtl_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 TrailCtl_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1054 TrailCtlMsgTxt_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 TrailCtlMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 TrailCtlMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1054 BrkBstrVac_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1054 BrkBstrVac_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 BrkBstrVac_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 BrkBstrVac_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 BrkBstrVac_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1054 DrvSlipCtlOffLamp_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 DrvSlipCtlOffLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 DrvSlipCtlOffLamp_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1054 AutoHoldMsgTxt_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 AutoHoldMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 AutoHoldMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1054 CtaBrk_D_Stat 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 CtaBrk_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 CtaBrk_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1054 SelDrvMdeAwd_D_Rq 31;
+BA_ "GenSigStartValue" SG_ 1054 SelDrvMdeAwd_D_Rq 31;
+BA_ "GenSigSendType" SG_ 1054 SelDrvMdeAwd_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1054 SelDrvMdeAwd_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 SelDrvMdeAwd_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1054 AutoHoldSwMde_B_Ind 1;
+BA_ "ContentDependant" SG_ 1054 AutoHoldSwMde_B_Ind 1;
+BA_ "GenSigSendType" SG_ 1054 AutoHoldSwMde_B_Ind 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 AutoHoldSwMde_B_Ind 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 AutoHoldSwMde_B_Ind 1;
+BA_ "GenSigSendType" SG_ 1054 AutoHoldMde_D_Ind 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 AutoHoldMde_D_Ind 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 AutoHoldMde_D_Ind 1;
+BA_ "GenSigSendType" SG_ 1054 SelDrvMdeChassis_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 SelDrvMdeChassis_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 SelDrvMdeChassis_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1054 ApaBrk_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1054 ApaBrk_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 ApaBrk_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1054 ApaBrk_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1054 ApaBrk_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 HsaMde_D_Mem 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 HsaMde_D_Mem 1;
+BA_ "GenSigStartValueInteger" SG_ 1046 HsaMde_D_Mem 1;
+BA_ "GenSigStartValue" SG_ 1046 HsaMde_D_Mem 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 HsaMde_D_Mem 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 HsaMde_D_Mem 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 BrkBstrVac_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 BrkBstrVac_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 BrkBstrVac_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 BrkBstrVac_B_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 BrkBstrVac_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 BrkBstrVac_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 HdcMde_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 HdcMde_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 HdcMde_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 HdcMde_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1046 RearDiffLck_Tq2_RqMx 4094;
+BA_ "GenSigStartValue" SG_ 1046 RearDiffLck_Tq2_RqMx 4094;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 RearDiffLck_Tq2_RqMx 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 RearDiffLck_Tq2_RqMx 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 TRLR_SWAY_EVNT_IN_PROG 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 TRLR_SWAY_EVNT_IN_PROG 1;
+BA_ "ECGUsedRxSignal" SG_ 1046 TRLR_SWAY_EVNT_IN_PROG 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 TRLR_SWAY_CONFIG_STAT 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 TRLR_SWAY_CONFIG_STAT 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 TCMode 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 TCMode 1;
+BA_ "ContentDependant" SG_ 1046 TCMode 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 TCMode 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 TCMode 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 TCMode 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 TCMode 1;
+BA_ "ECGUsedRxSignal" SG_ 1046 TCMode 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 DrvSlipCtlLamp_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 DrvSlipCtlLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 Abs_B_Falt 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 Abs_B_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 Abs_B_Falt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 Abs_B_Falt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 Abs_B_Falt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 Abs_B_Falt 1;
+BA_ "ECGUsedRxSignal" SG_ 1046 Abs_B_Falt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "ECGUsedRxSignal" SG_ 1046 DrvSlipCtlMde_D_Ind 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 DrvAntiLckLamp_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 DrvAntiLckLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 DrvAntiLckLamp_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 DrvAntiLckLamp_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvAntiLckLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvAntiLckLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 BpedMove_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 BpedMove_No_Cnt 1;
+BA_ "MetaData" SG_ 1046 BpedMove_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 BpedMove_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 BpedMove_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 BpedMove_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 StabCtlBrk_B_Avail 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 StabCtlBrk_B_Avail 1;
+BA_ "GenSigStartValueInteger" SG_ 1046 StabCtlBrk_B_Avail 1;
+BA_ "GenSigStartValue" SG_ 1046 StabCtlBrk_B_Avail 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 StabCtlBrk_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 StabCtlBrk_B_Avail 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 DrvHdcWarnInfo_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 DrvHdcWarnInfo_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvHdcWarnInfo_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvHdcWarnInfo_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 DrvHdcMsg_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 DrvHdcMsg_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvHdcMsg_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvHdcMsg_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 DrvHdcLampInfo_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 DrvHdcLampInfo_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvHdcLampInfo_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvHdcLampInfo_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 BpedMove_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 BpedMove_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1046 BpedMove_D_Actl 3;
+BA_ "GenSigStartValue" SG_ 1046 BpedMove_D_Actl 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1046 BpedMove_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 BpedMove_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 BpedMove_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 ChimeBrk_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 ChimeBrk_B_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 ChimeBrk_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 ChimeBrk_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 BrkLamp_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 BrkLamp_B_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 BrkLamp_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 BrkLamp_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1046 HILL_DESC_MC 1;
+BA_ "UsedOnPgmDBC" SG_ 1046 HILL_DESC_MC 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1046 HILL_DESC_MC 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 HILL_DESC_MC 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1046 RearDiffElckrOpen_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1045 VehStab_D_Stat 14;
+BA_ "GenSigStartValue" SG_ 1045 VehStab_D_Stat 14;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 VehStab_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehStab_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehStab_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 VehStab_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 BrkFluidLvl_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 BrkFluidLvl_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 LsmcBrkDecel_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 LsmcBrkDecel_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1045 VehYawNonLin_W_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1045 VehYawNonLin_W_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1045 VehYawNonLin_W_Rq 4094;
+BA_ "GenSigStartValue" SG_ 1045 VehYawNonLin_W_Rq 4094;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 VehYawNonLin_W_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehYawNonLin_W_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehYawNonLin_W_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 VehYawNonLin_W_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1045 VehYawLin_W_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1045 VehYawLin_W_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1045 VehYawLin_W_Rq 4094;
+BA_ "GenSigStartValue" SG_ 1045 VehYawLin_W_Rq 4094;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 VehYawLin_W_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehYawLin_W_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehYawLin_W_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 VehYawLin_W_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "MetaData" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "UsedOnPgmDBC" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 Veh_V_ActlBrk 1;
+BA_ "CrossOver_InfoCAN" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "MetaData" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "MetaData" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1045 VehVActlBrk_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 1044 StePinOffst_An_Est 1;
+BA_ "GenSigStartValueInteger" SG_ 1044 StePinOffst_An_Est 65534;
+BA_ "ContentDependant" SG_ 1044 StePinOffst_An_Est 1;
+BA_ "GenSigStartValue" SG_ 1044 StePinOffst_An_Est 65533;
+BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_An_Est 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_An_Est 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_An_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_An_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "ContentDependant" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "MetaData" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 1044 StePinOffst_No_Cnt 1;
+BA_ "MetaData" SG_ 1044 StePinOffst_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_D_Stat 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1042 VehRol_An_Dsply 64;
+BA_ "GenSigStartValue" SG_ 1042 VehRol_An_Dsply 0;
+BA_ "U_P702_MY2021_Tx" SG_ 1042 VehRol_An_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1042 VehPtch_An_Dsply 64;
+BA_ "GenSigStartValue" SG_ 1042 VehPtch_An_Dsply 0;
+BA_ "U_P702_MY2021_Rx" SG_ 1042 VehPtch_An_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1042 VehPtch_An_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1042 TrlrBrk_Pc_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 535 WhlRr_W_Meas 1;
+BA_ "U_P702_MY2021_Rx" SG_ 535 WhlRr_W_Meas 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlRr_W_Meas 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlRr_W_Meas 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlRr_W_Meas 1;
+BA_ "U_P702_MY2021_Tx" SG_ 535 WhlRr_W_Meas 1;
+BA_ "UsedOnPgmDBC" SG_ 535 WhlRl_W_Meas 1;
+BA_ "U_P702_MY2021_Rx" SG_ 535 WhlRl_W_Meas 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlRl_W_Meas 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlRl_W_Meas 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlRl_W_Meas 1;
+BA_ "U_P702_MY2021_Tx" SG_ 535 WhlRl_W_Meas 1;
+BA_ "UsedOnPgmDBC" SG_ 535 WhlFr_W_Meas 1;
+BA_ "U_P702_MY2021_Rx" SG_ 535 WhlFr_W_Meas 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlFr_W_Meas 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlFr_W_Meas 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlFr_W_Meas 1;
+BA_ "U_P702_MY2021_Tx" SG_ 535 WhlFr_W_Meas 1;
+BA_ "UsedOnPgmDBC" SG_ 535 WhlFl_W_Meas 1;
+BA_ "U_P702_MY2021_Rx" SG_ 535 WhlFl_W_Meas 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlFl_W_Meas 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlFl_W_Meas 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlFl_W_Meas 1;
+BA_ "U_P702_MY2021_Tx" SG_ 535 WhlFl_W_Meas 1;
+BA_ "ContentDependant" SG_ 534 BrkObdData_No_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 BrkObdData_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 BrkObdData_No_Actl 1;
+BA_ "ContentDependant" SG_ 534 BrkObdIndex_No_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 BrkObdIndex_No_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 BrkObdIndex_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatRr_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatRr_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatRr_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatRr_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatRr_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirRr_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirRl_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirFr_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirFl_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatRl_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatRl_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatRl_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatRl_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatRl_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatFr_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatFr_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatFr_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatFr_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatFr_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatFl_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatFl_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatFl_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatFl_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatFl_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 532 RgenTqFalt_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 532 RgenTqFalt_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 532 RgenTqFalt_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 532 RgenTqFalt_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 532 RgenBrkDynoMde_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 532 RgenBrkDynoMde_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 532 RgenBrkDynoMde_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 532 RgenBrkDynoMde_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 532 PrplWhlTqRqMn_No_Cs 1;
+BA_ "MetaData" SG_ 532 PrplWhlTqRqMn_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 532 PrplWhlTqRqMn_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 532 PrplWhlTqRqMn_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 532 PrplWhlTot_Tq_RqMn 1;
+BA_ "U_P702_MY2021_Rx" SG_ 532 PrplWhlTot_Tq_RqMn 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 532 PrplWhlTot_Tq_RqMn 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 532 PrplWhlTot_Tq_RqMn 1;
+BA_ "U_P702_MY2021_Tx" SG_ 532 PrplWhlTot_Tq_RqMn 1;
+BA_ "UsedOnPgmDBC" SG_ 532 PrplWhlTqRqMn_No_Cnt 1;
+BA_ "MetaData" SG_ 532 PrplWhlTqRqMn_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1;
+BA_ "GenSigStartValueInteger" SG_ 531 VehStop_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 531 VehStop_D_Stat 2;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 VehStop_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 VehStop_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 TracCtlPtActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 TracCtlPtActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 TracCtlPtActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 TracCtlPtActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 TracCtlPtActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 TracCtlPtActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbMntr_B_Err 1;
+BA_ "UsedOnPgmDBC" SG_ 531 LscmbbMntr_B_Err 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbMntr_B_Err 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbBrkDis_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 LscmbbBrkDis_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbBrkDis_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbDeny_B_ActlBrk 1;
+BA_ "UsedOnPgmDBC" SG_ 531 LscmbbDeny_B_ActlBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbDeny_B_ActlBrk 1;
+BA_ "WakeupSignal" SG_ 531 PrkBrkYwLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkYwLamp_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkYwLamp_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkYwLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkYwLamp_D_Rq 1;
+BA_ "WakeupSignal" SG_ 531 PrkBrkRedLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkRedLamp_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkRedLamp_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkRedLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkRedLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbBrkDecel_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 LscmbbBrkDecel_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbBrkDecel_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AbsActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AbsActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 531 AbsActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 AbsActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AbsActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AbsActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AbsActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 531 StabCtlBrkActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBrkPrchg_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 CmbbBrkPrchg_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBrkPrchg_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBrkPrchg_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBrkDecel_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 CmbbBrkDecel_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBrkDecel_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBrkDecel_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBaSensInc_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 CmbbBaSensInc_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBaSensInc_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBaSensInc_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkWarm_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccBrkWarm_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkWarm_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkWarm_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkTotTqMn_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccBrkTotTqMn_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkTotTqMn_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkTotTqMn_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkPrchgActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccBrkPrchgActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkPrchgActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkPrchgActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkDis_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccBrkDis_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkDis_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkDis_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkDeny_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccBrkDeny_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 AccBrkDeny_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AccBrkDeny_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkDeny_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkDeny_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccBrkActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 AccBrkActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AccBrkActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 PrplDrgCtlActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 PrplDrgCtlActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 PrplDrgCtlActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 PrplDrgCtlActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 PrplDrgCtlActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 PrplDrgCtlActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 PrplWhlTot_Tq_RqMx 1;
+BA_ "UsedOnPgmDBC" SG_ 531 PrplWhlTot_Tq_RqMx 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 PrplWhlTot_Tq_RqMx 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 PrplWhlTot_Tq_RqMx 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 PrplWhlTot_Tq_RqMx 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 PrplWhlTot_Tq_RqMx 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbBaSensInc_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 LscmbbBaSensInc_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbBaSensInc_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBrkDis_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 CmbbBrkDis_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 531 CmbbBrkDis_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 CmbbBrkDis_B_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBrkDis_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBrkDis_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "UsedOnPgmDBC" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbDeny_B_ActlBrk 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 CcDis_B_Cmd 1;
+BA_ "UsedOnPgmDBC" SG_ 531 CcDis_B_Cmd 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 CcDis_B_Cmd 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 CcDis_B_Cmd 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 CcDis_B_Cmd 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 CcDis_B_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 VehLongOvrGnd_A_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 531 VehLongOvrGnd_A_Est 1;
+BA_ "GenSigStartValueInteger" SG_ 531 VehLongOvrGnd_A_Est 511;
+BA_ "U_P702_MY2021_Rx" SG_ 531 VehLongOvrGnd_A_Est 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 VehLongOvrGnd_A_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 VehLongOvrGnd_A_Est 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 LscmbBrkPrchg_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 531 LscmbBrkPrchg_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbBrkPrchg_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccStopActv_B_ActlBrk 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccStopActv_B_ActlBrk 1;
+BA_ "U_P702_MY2021_Rx" SG_ 531 AccStopActv_B_ActlBrk 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AccStopActv_B_ActlBrk 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccStopActv_B_ActlBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccStopActv_B_ActlBrk 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 AccDis_B_ActlEpb 1;
+BA_ "UsedOnPgmDBC" SG_ 531 AccDis_B_ActlEpb 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 AccDis_B_ActlEpb 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 AccDis_B_ActlEpb 1;
+BA_ "WakeupSignal" SG_ 531 PrkBrkMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkMsgTxt_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkMsgTxt_D_Rq 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkStatus 1;
+BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkStatus 1;
+BA_ "GenSigStartValueInteger" SG_ 531 PrkBrkStatus 7;
+BA_ "GenSigStartValue" SG_ 531 PrkBrkStatus 7;
+BA_ "U_P702_MY2021_Rx" SG_ 531 PrkBrkStatus 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 PrkBrkStatus 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkStatus 1;
+BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkStatus 1;
+BA_ "ECGUsedRxSignal" SG_ 531 PrkBrkStatus 1;
+BA_ "GenSigStartValueInteger" SG_ 136 SteWhlBrkOffst_An_Rq 32766;
+BA_ "GenSigStartValue" SG_ 136 SteWhlBrkOffst_An_Rq 32765;
+BA_ "U_P702_MY2021_Tx" SG_ 136 SteWhlBrkOffst_An_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 136 SteWhlBrkAnRq_No_Cs 1;
+BA_ "MetaData" SG_ 136 SteWhlBrkAnRq_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 136 SteWhlBrkAnRq_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 136 SteWhlBrkAnRq_No_Cnt 1;
+BA_ "MetaData" SG_ 136 SteWhlBrkAnRq_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 136 SteWhlBrkAnRq_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 125 VehRolComp_W_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 125 VehRolComp_W_Actl 4094;
+BA_ "GenSigStartValue" SG_ 125 VehRolComp_W_Actl 4094;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 VehRolComp_W_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 VehRolComp_W_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 125 VehVertComp_A_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 125 VehVertComp_A_Actl 1022;
+BA_ "GenSigStartValue" SG_ 125 VehVertComp_A_Actl 1022;
+BA_ "U_P702_MY2021_Rx" SG_ 125 VehVertComp_A_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 VehVertComp_A_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 VehVertComp_A_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 125 BrkTotTqRqArb_No_Cs 1;
+BA_ "MetaData" SG_ 125 BrkTotTqRqArb_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTotTqRqArb_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTotTqRqArb_No_Cs 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 125 BrkTotTqRqArb_No_Cnt 1;
+BA_ "MetaData" SG_ 125 BrkTotTqRqArb_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTotTqRqArb_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTotTqRqArb_No_Cnt 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 125 BrkTot_Tq_RqArb 1;
+BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTot_Tq_RqArb 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTot_Tq_RqArb 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTot_Tq_RqArb 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTot_Tq_RqArb 1;
+BA_ "ECGUsedRxSignal" SG_ 125 BrkTot_Tq_RqArb 1;
+BA_ "UsedOnPgmDBC" SG_ 125 BrkTot_Tq_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 125 BrkTot_Tq_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTot_Tq_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTot_Tq_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTot_Tq_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTot_Tq_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 125 HsaStat_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 125 HsaStat_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 125 HsaStat_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 HsaStat_D_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 125 HsaStat_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 125 HsaStat_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 119 VehTrvlDir_D_Stat 6;
+BA_ "GenSigStartValue" SG_ 119 VehTrvlDir_D_Stat 6;
+BA_ "U_P702_MY2021_Tx" SG_ 119 VehTrvlDir_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 119 VehOverGnd_V_Est 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 119 VehOverGnd_V_Est 1;
+BA_ "U_P702_MY2021_Rx" SG_ 119 VehOverGnd_V_Est 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 119 VehOverGnd_V_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 119 VehOverGnd_V_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 119 VehLongComp_A_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 119 VehLongComp_A_Actl 1022;
+BA_ "GenSigStartValue" SG_ 119 VehLongComp_A_Actl 1022;
+BA_ "U_P702_MY2021_Rx" SG_ 119 VehLongComp_A_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 119 VehLongComp_A_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 119 VehLongComp_A_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 119 VehLongComp_A_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 119 VehLongComp_A_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 119 VehLatComp_A_Actl 1022;
+BA_ "GenSigStartValue" SG_ 119 VehLatComp_A_Actl 1022;
+BA_ "U_P702_MY2021_Rx" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 119 VehLatComp_A_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 119 VehYawComp_W_Actl 4094;
+BA_ "GenSigStartValue" SG_ 119 VehYawComp_W_Actl 4094;
+BA_ "U_CX727_MY2021_Rx" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 119 VehYawComp_W_Actl 1;
+BA_ "GenSigSendType" SG_ 118 BrkCtrFnd_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 118 BrkCtrFnd_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 118 AwdLck_Tq_RqMx 1;
+BA_ "U_P702_MY2021_Rx" SG_ 118 AwdLck_Tq_RqMx 1;
+BA_ "U_P702_MY2021_Tx" SG_ 118 AwdLck_Tq_RqMx 1;
+BA_ "UsedOnPgmDBC" SG_ 118 AwdLck_Tq_RqMn 1;
+BA_ "U_P702_MY2021_Rx" SG_ 118 AwdLck_Tq_RqMn 1;
+BA_ "U_P702_MY2021_Tx" SG_ 118 AwdLck_Tq_RqMn 1;
+BA_ "UsedOnPgmDBC" SG_ 118 DrvSte_D_Stat 1;
+BA_ "GenSigSendType" SG_ 118 DrvSte_D_Stat 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 118 DrvSte_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 118 DrvSte_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 118 DrvSte_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 118 DrvSte_Tq_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 118 DrvSte_Tq_Rq 128;
+BA_ "U_CX727_MY2021_Rx" SG_ 118 DrvSte_Tq_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 118 DrvSte_Tq_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 118 DrvSte_Tq_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 118 EmgcyBrkLamp_D_Rq 1;
+BA_ "GenSigSendType" SG_ 118 EmgcyBrkLamp_D_Rq 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 118 EmgcyBrkLamp_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 118 EmgcyBrkLamp_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 118 StopLamp_B_RqBrk 1;
+BA_ "GenSigSendType" SG_ 118 StopLamp_B_RqBrk 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 118 StopLamp_B_RqBrk 1;
+BA_ "U_P702_MY2021_Tx" SG_ 118 StopLamp_B_RqBrk 1;
+BA_ "UsedOnPgmDBC" SG_ 73 immoSubTarget1Data_T1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 73 immoSubTarget1Data_T1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 73 immoSubTarget1Data_T1 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 73 immoSubTarget1Data_T1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 73 immoSubTarget1Data_T1 1;
+BA_ "UsedOnPgmDBC" SG_ 73 immoSubTarget1Cmd_T1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 73 immoSubTarget1Cmd_T1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 73 immoSubTarget1Cmd_T1 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 73 immoSubTarget1Cmd_T1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 73 immoSubTarget1Cmd_T1 1;
+BA_ "CrossOver_InfoCAN" SG_ 1034 VehicleGGCCData 1;
+BA_ "UsedOnPgmDBC" SG_ 1034 VehicleGGCCData 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1034 VehicleGGCCData 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1034 VehicleGGCCData 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1034 VehicleGGCCData 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1440 TCM_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_GWOnBoardTester 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_GWOnBoardTester 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1440 TCM_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_GWNMProxy 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_GWNMProxy 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_GWNMProxy 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved4 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved4 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved3 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved3 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved2 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved2 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved1 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved1 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMNodeId 160;
+BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMNodeId 160;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMNodeId 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMControl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMControl 1;
+BA_ "CrossOver_InfoCAN" SG_ 561 TrnMsgTxt2_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 561 TrnMsgTxt2_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 561 TrnMsgTxt2_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 561 TrnMsgTxt_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 561 TrnMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 561 TrnMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 561 TrnMsgTxt_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 330 TrnAout_W_ActlUnfilt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 330 TrnAout_W_ActlUnfilt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 330 TrnAout_W_ActlUnfilt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 330 TrnAout_W_ActlUnfilt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 330 TrnAout_W_ActlUnfilt 1;
+BA_ "ECGUsedRxSignal" SG_ 1090 Mtr2State_D_ActlMntr 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1090 Mtr2State_D_ActlMntr 1;
+BA_ "GenSigStartValueInteger" SG_ 1090 Inv1Ain_I_ActlMntr 32766;
+BA_ "GenSigStartValue" SG_ 1090 Inv1Ain_I_ActlMntr 32765;
+BA_ "ECGUsedRxSignal" SG_ 1090 Inv1Ain_I_ActlMntr 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1090 Inv1Ain_I_ActlMntr 1;
+BA_ "ECGUsedRxSignal" SG_ 1090 HybVehMde_D_ActlMntr 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1090 HybVehMde_D_ActlMntr 1;
+BA_ "ECGUsedRxSignal" SG_ 1090 ChrgStat_D_ActlMntr 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1090 ChrgStat_D_ActlMntr 1;
+BA_ "CrossOver_InfoCAN" SG_ 1090 VehElRnge_L_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1090 VehElRnge_L_Dsply 4095;
+BA_ "GenSigStartValue" SG_ 1090 VehElRnge_L_Dsply 4093;
+BA_ "U_P702_MY2021_Tx" SG_ 1090 VehElRnge_L_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1090 VehElRnge_L_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 870 EngMdeMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 870 EffRgenThres_Pc_Dsply 1;
+BA_ "GenSigStartValue" SG_ 870 EffRgenThres_Pc_Dsply 1023;
+BA_ "CrossOver_InfoCAN" SG_ 870 EffRgenThres_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 870 RngPerChrgInst_L_Dsply 4094;
+BA_ "GenSigStartValue" SG_ 870 RngPerChrgInst_L_Dsply 4093;
+BA_ "U_P702_MY2021_Tx" SG_ 870 RngPerChrgInst_L_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 PwrFlowTxt_D_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EngOnMsg2_D_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EngOnMsg1_D_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 FuelMaintMde_D_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 869 EffWhlLvl2_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 869 EffWhlLvl2_Pc_Dsply 511;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EffWhlLvl2_Pc_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 869 EffWhlThres_Pc_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EffWhlThres_Pc_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 869 EngPwLvl_Pc_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EngPwLvl_Pc_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 869 EngActv_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EngActv_B_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 869 EffWhlThresOn_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 869 EffWhlThresOn_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 606 ElVehLaterMde_D_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 606 ElVehLaterMde_D_Stat 1;
+BA_ "GenSigSendType" SG_ 606 ElVehNowMde_D_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 606 ElVehNowMde_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 374 GearEngag_D_Actl 1;
+BA_ "GenSigSendType" SG_ 374 GearEngag_D_Actl 3;
+BA_ "U_P702_MY2021_Tx" SG_ 374 GearEngag_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 374 TrnRng_D_Rq 14;
+BA_ "ContentDependant" SG_ 374 TrnRng_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 374 TrnRng_D_Rq 14;
+BA_ "GenSigSendType" SG_ 374 TrnRng_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 374 TrnRng_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 TrnRng_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 TrnRng_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 TrnRng_D_Rq 1;
+BA_ "ContentDependant" SG_ 374 TrnPrkSys_D_Actl 1;
+BA_ "GenSigSendType" SG_ 374 TrnPrkSys_D_Actl 3;
+BA_ "U_P702_MY2021_Rx" SG_ 374 TrnPrkSys_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 TrnPrkSys_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 TrnPrkSys_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 TrnPrkSys_D_Actl 1;
+BA_ "ContentDependant" SG_ 374 GearLvr_D_ActlDrv 1;
+BA_ "GenSigSendType" SG_ 374 GearLvr_D_ActlDrv 3;
+BA_ "U_P702_MY2021_Rx" SG_ 374 GearLvr_D_ActlDrv 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearLvr_D_ActlDrv 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 GearLvr_D_ActlDrv 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearLvr_D_ActlDrv 1;
+BA_ "ContentDependant" SG_ 374 GearPos_No_Cs 1;
+BA_ "MetaData" SG_ 374 GearPos_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 374 GearPos_D_Trg 1;
+BA_ "UsedOnPgmDBC" SG_ 374 GearPos_D_Trg 1;
+BA_ "GenSigStartValueInteger" SG_ 374 GearPos_D_Trg 15;
+BA_ "ContentDependant" SG_ 374 GearPos_D_Trg 1;
+BA_ "GenSigStartValue" SG_ 374 GearPos_D_Trg 15;
+BA_ "GenSigSendType" SG_ 374 GearPos_D_Trg 3;
+BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_D_Trg 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_D_Trg 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_D_Trg 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_D_Trg 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_D_Trg 1;
+BA_ "ContentDependant" SG_ 374 GearPos_No_Cnt 1;
+BA_ "MetaData" SG_ 374 GearPos_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 TrnIgnOffDly_T_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 TrnIgnOffDly_T_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 374 GearPos_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 374 GearPos_D_Actl 15;
+BA_ "ContentDependant" SG_ 374 GearPos_D_Actl 1;
+BA_ "GenSigStartValue" SG_ 374 GearPos_D_Actl 15;
+BA_ "GenSigSendType" SG_ 374 GearPos_D_Actl 3;
+BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 603 WhlDirAvgDrv_D_Actl 1;
+BA_ "ContentDependant" SG_ 603 WhlDirAvgDrv_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 603 WhlDirAvgDrv_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 603 PrplTqMnRgen_B_Actl 1;
+BA_ "ContentDependant" SG_ 603 PrplTqMnRgen_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 603 PrplTqMnRgen_B_Actl 1;
+BA_ "ContentDependant" SG_ 603 BattTracCnnct_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 603 BattTracCnnct_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 602 HtrnWarnLamp_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 602 HtrnWarnLamp_B_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 602 HtrnWarnLamp_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 602 HybPwLimOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 602 PwPckTqRdy_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 602 PwPckTqRdy_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 1152 BattTracDiagClr_B_Stat 3;
+BA_ "GenSigSendType" SG_ 1152 EngTeHi_B_Actl 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1152 EngTeHi_B_Actl 1;
+BA_ "GenSigSendType" SG_ 1152 DcdcOn_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1152 DcdcOn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1152 ULoBattSpprtSustn_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1152 ULoBattSpprtSustn_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1152 VehElEff_No_Avg 126;
+BA_ "GenSigStartValue" SG_ 1152 VehElEff_No_Avg 126;
+BA_ "U_P702_MY2021_Tx" SG_ 1152 VehElEff_No_Avg 1;
+BA_ "CrossOver_InfoCAN" SG_ 872 PlgActvArb_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 872 PlgActvArb_B_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 872 PlgActvArb_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 872 HybMdeStat_D_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 872 HybMdeStat_D_Dsply 1;
+BA_ "ContentDependant" SG_ 560 SelDrvMdeSwtch_D_Stat3 1;
+BA_ "U_P702_MY2021_Rx" SG_ 560 SelDrvMdeSwtch_D_Stat3 1;
+BA_ "U_P702_MY2021_Tx" SG_ 560 SelDrvMdeSwtch_D_Stat3 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 SelDrvMdeSwtch_D_Stat3 1;
+BA_ "CrossOver_InfoCAN" SG_ 560 TrnSrvcRqd_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 560 TrnSrvcRqd_B_Rq 1;
+BA_ "ContentDependant" SG_ 560 TrnSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 560 TrnSrvcRqd_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 TrnSrvcRqd_B_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 560 TrnSrvcRqd_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "ContentDependant" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 TrnShifActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 560 GearLvrPos_D_Actl 14;
+BA_ "GenSigStartValue" SG_ 560 GearLvrPos_D_Actl 14;
+BA_ "U_P702_MY2021_Rx" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 GearLvrPos_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 560 GboxOil_Te_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 560 GboxOil_Te_Actl 254;
+BA_ "ContentDependant" SG_ 560 GboxOil_Te_Actl 1;
+BA_ "GenSigStartValue" SG_ 560 GboxOil_Te_Actl 254;
+BA_ "U_P702_MY2021_Rx" SG_ 560 GboxOil_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 560 GboxOil_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 560 GboxOil_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 GboxOil_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyRng2_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 369 TrnIpcDsplyRng2_D_Actl 15;
+BA_ "GenSigStartValue" SG_ 369 TrnIpcDsplyRng2_D_Actl 15;
+BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyRng2_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyRng2_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyRng_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyRng_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyGear_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyGear_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 369 TrnIpcDsplyGear_D_Actl 15;
+BA_ "GenSigStartValue" SG_ 369 TrnIpcDsplyGear_D_Actl 15;
+BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyGear_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyGear_D_Actl 1;
+BA_ "WakeupSignal" SG_ 369 TrnIpcDsplyMde_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyMde_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyMde_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyMde_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyMde_D_Stat 1;
+BA_ "WakeupSignal" SG_ 369 TrnIpcDsplyMde_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyMde_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyMde_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyMde_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyGear_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyGear_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyGear_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyGear_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 92 TrnLvrV_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 92 TrnLvrV_D_Rq 1;
+BA_ "GenSigSendType" SG_ 92 TrnLvrV_D_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnLvrV_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnLvrV_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 92 TrnSbwSysHlth_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 92 TrnSbwSysHlth_D_Actl 1;
+BA_ "ContentDependant" SG_ 92 TrnSbwSysHlth_D_Actl 1;
+BA_ "GenSigStartValue" SG_ 92 TrnSbwSysHlth_D_Actl 1;
+BA_ "GenSigSendType" SG_ 92 TrnSbwSysHlth_D_Actl 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnSbwSysHlth_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnSbwSysHlth_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 92 TrnGearNtmAllow_B_Stat 1;
+BA_ "ContentDependant" SG_ 92 TrnGearNtmAllow_B_Stat 1;
+BA_ "GenSigSendType" SG_ 92 TrnGearNtmAllow_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearNtmAllow_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearNtmAllow_B_Stat 1;
+BA_ "WakeupSignal" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "ContentDependant" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "GenSigStartValue" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "GenSigSendType" SG_ 92 TrnDtpCmd_D_Actl 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnDtpCmd_D_Actl 1;
+BA_ "GenSigSendType" SG_ 92 GearSelLck_D_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 GearSelLck_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 GearSelLck_D_Rq 1;
+BA_ "ContentDependant" SG_ 92 TrnGearCmd_No_Cs 1;
+BA_ "MetaData" SG_ 92 TrnGearCmd_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearCmd_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearCmd_No_Cs 1;
+BA_ "ContentDependant" SG_ 92 TrnValidGear_D_Cnfm 1;
+BA_ "GenSigSendType" SG_ 92 TrnValidGear_D_Cnfm 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnValidGear_D_Cnfm 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnValidGear_D_Cnfm 1;
+BA_ "ContentDependant" SG_ 92 TrnNtrlTowCmd_D_Actl 1;
+BA_ "GenSigSendType" SG_ 92 TrnNtrlTowCmd_D_Actl 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 92 TrnNtrlTowCmd_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 92 TrnNtrlTowCmd_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnNtrlTowCmd_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnNtrlTowCmd_D_Actl 1;
+BA_ "ContentDependant" SG_ 92 TrnGearCmd_Pc_ActlPt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearCmd_Pc_ActlPt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearCmd_Pc_ActlPt 1;
+BA_ "ContentDependant" SG_ 92 TrnGear_D_RqPt 1;
+BA_ "GenSigSendType" SG_ 92 TrnGear_D_RqPt 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGear_D_RqPt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGear_D_RqPt 1;
+BA_ "ContentDependant" SG_ 92 TrnCmdState_B_Actl 1;
+BA_ "GenSigSendType" SG_ 92 TrnCmdState_B_Actl 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnCmdState_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnCmdState_B_Actl 1;
+BA_ "ContentDependant" SG_ 92 TrnCmdCnt_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnCmdCnt_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnCmdCnt_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "GenSigStartValueInteger" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "ContentDependant" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "GenSigStartValue" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "GenSigSendType" SG_ 92 PrkBrkActv_D_RqTrnGear 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "U_P702_MY2021_Rx" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "U_P702_MY2021_Tx" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 PrkBrkActv_D_RqTrnGear 1;
+BA_ "CrossOver_InfoCAN" SG_ 92 TrnGearMsgTxt_D_Rq 1;
+BA_ "ContentDependant" SG_ 92 TrnGearMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 92 TrnGearMsgTxt_D_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearMsgTxt_D_Rq 1;
+BA_ "ContentDependant" SG_ 92 TrnGearCmd_No_Cnt 1;
+BA_ "MetaData" SG_ 92 TrnGearCmd_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearCmd_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearCmd_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 2030 TesterPhysicalResSOBDMC 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 2030 TesterPhysicalResSOBDMC 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 BattRgenLoChrg_D_RqEng 1;
+BA_ "GenSigSendType" SG_ 1087 BattRgenLoChrg_D_RqEng 3;
+BA_ "GenSigSendType" SG_ 1087 AdasLcObtclAbrt_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 BattRgenLoDChrg_D_RqEng 1;
+BA_ "GenSigSendType" SG_ 1087 BattRgenLoDChrg_D_RqEng 3;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 AirDamPos_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 AirDamPos_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1087 AirDamPos_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcInhbt_B_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcInhbt_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcInhbt_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcStopHold_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1087 FapLcStopHold_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1087 FapLcStopHold_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcStopHold_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcStopHold_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcPrchgBrk_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1087 FapLcPrchgBrk_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1087 FapLcPrchgBrk_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcPrchgBrk_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcPrchgBrk_B_Rq 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcObstcl_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcObstcl_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcObstcl_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcMaxGrdInhbt_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcMaxGrdInhbt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcMaxGrdInhbt_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcMaxGrdAbrt_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcMaxGrdAbrt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcMaxGrdAbrt_B_Stat 1;
+BA_ "GenSigSendType" SG_ 1087 FapLcActv_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcActv_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcActv_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 332 UreaLvlQlty_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvlQlty_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvlQlty_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 332 UreaLvlTxtWarn_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvlTxtWarn_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvlTxtWarn_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 332 UreaQltySysWarn_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaQltySysWarn_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaQltySysWarn_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 DieslPrtcWarn_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 DieslPrtcWarn_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaQltyFlg_B_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaQltyFlg_B_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 332 UreaQltyFlg_B_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvl_Pc_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvl_Pc_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 332 UreaLvl_Pc_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 VehUreaRnge2_L_DsplyMx 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 VehUreaRnge2_L_DsplyMx 1;
+BA_ "ECGUsedRxSignal" SG_ 332 VehUreaRnge2_L_DsplyMx 1;
+BA_ "CrossOver_InfoCAN" SG_ 332 UreaQltySys_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaQltySys_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaQltySys_D_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 332 UreaQltySys_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 332 UreaLvlTxt_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvlTxt_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvlTxt_D_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 332 UreaLvlTxt_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 332 VehUreaWarn_V_DsplyMx 1;
+BA_ "U_P702_MY2021_Tx" SG_ 332 VehUreaWarn_V_DsplyMx 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 VehUreaWarn_V_DsplyMx 1;
+BA_ "ECGUsedRxSignal" SG_ 332 VehUreaWarn_V_DsplyMx 1;
+BA_ "UsedOnPgmDBC" SG_ 1896 TesterPhysicalResABS 1;
+BA_ "GenSigSendType" SG_ 1896 TesterPhysicalResABS 3;
+BA_ "U_CX727_MY2021_Tx" SG_ 1896 TesterPhysicalResABS 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1896 TesterPhysicalResABS 1;
+BA_ "GenSigSendType" SG_ 1889 TesterPhysicalReqTCCM 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1889 TesterPhysicalReqTCCM 1;
+BA_ "UsedOnPgmDBC" SG_ 1888 TesterPhysicalReqABS 1;
+BA_ "GenSigSendType" SG_ 1888 TesterPhysicalReqABS 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1888 TesterPhysicalReqABS 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1888 TesterPhysicalReqABS 1;
+BA_ "UsedOnPgmDBC" SG_ 1848 TesterPhysicalResPSCM 1;
+BA_ "U_CX727_MY2021_Tx" SG_ 1848 TesterPhysicalResPSCM 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1848 TesterPhysicalResPSCM 1;
+BA_ "UsedOnPgmDBC" SG_ 1840 TesterPhysicalReqPSCM 1;
+BA_ "GenSigSendType" SG_ 1840 TesterPhysicalReqPSCM 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 1840 TesterPhysicalReqPSCM 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1840 TesterPhysicalReqPSCM 1;
+BA_ "UsedOnPgmDBC" SG_ 1713 UUDTABSResponse2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1713 UUDTABSResponse2 1;
+BA_ "UsedOnPgmDBC" SG_ 1712 UUDTABSResponse1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1712 UUDTABSResponse1 1;
+BA_ "UsedOnPgmDBC" SG_ 2025 TesterPhysicalResTCM 1;
+BA_ "U_P702_MY2021_Tx" SG_ 2025 TesterPhysicalResTCM 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 2025 TesterPhysicalResTCM 1;
+BA_ "UsedOnPgmDBC" SG_ 2024 TesterPhysicalResPCM 1;
+BA_ "U_P702_MY2021_Tx" SG_ 2024 TesterPhysicalResPCM 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 2024 TesterPhysicalResPCM 1;
+BA_ "UsedOnPgmDBC" SG_ 2017 TesterPhysicalReqTCM 1;
+BA_ "GenSigSendType" SG_ 2017 TesterPhysicalReqTCM 3;
+BA_ "U_P702_MY2021_Rx" SG_ 2017 TesterPhysicalReqTCM 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2017 TesterPhysicalReqTCM 1;
+BA_ "UsedOnPgmDBC" SG_ 2016 TesterPhysicalReqPCM 1;
+BA_ "GenSigSendType" SG_ 2016 TesterPhysicalReqPCM 3;
+BA_ "U_P702_MY2021_Rx" SG_ 2016 TesterPhysicalReqPCM 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2016 TesterPhysicalReqPCM 1;
+BA_ "CrossOver_InfoCAN" SG_ 2015 TesterFunctionalReq 1;
+BA_ "UsedOnPgmDBC" SG_ 2015 TesterFunctionalReq 1;
+BA_ "GenSigSendType" SG_ 2015 TesterFunctionalReq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 2015 TesterFunctionalReq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 2015 TesterFunctionalReq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 2015 TesterFunctionalReq 1;
+BA_ "ECGUsedRxSignal" SG_ 2015 TesterFunctionalReq 1;
+BA_ "GenSigSendType" SG_ 1897 TesterPhysicalResTCCM 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1897 TesterPhysicalResTCCM 1;
+BA_ "GenSigSendType" SG_ 1814 TesterPhysicalReqGWM_F1 3;
+BA_ "ECGUsedRxSignal" SG_ 1814 TesterPhysicalReqGWM_F1 1;
+BA_ "UsedOnPgmDBC" SG_ 1701 UUDTTCMResponse2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1701 UUDTTCMResponse2 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1701 UUDTTCMResponse2 1;
+BA_ "UsedOnPgmDBC" SG_ 1700 UUDTTCMResponse1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1700 UUDTTCMResponse1 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1700 UUDTTCMResponse1 1;
+BA_ "UsedOnPgmDBC" SG_ 1697 UUDTPCMResponse2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1697 UUDTPCMResponse2 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1697 UUDTPCMResponse2 1;
+BA_ "UsedOnPgmDBC" SG_ 1696 UUDTPCMResponse1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1696 UUDTPCMResponse1 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1696 UUDTPCMResponse1 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1429 PCM_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_GWOnBoardTester 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_GWOnBoardTester 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_GWOnBoardTester 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_GWOnBoardTester 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1429 PCM_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_GWNMProxy 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_GWNMProxy 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_GWNMProxy 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_GWNMProxy 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_GWNMProxy 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved4 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved4 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved4 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved4 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved3 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved3 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved3 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved3 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved2 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved2 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved2 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved1 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved1 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMNodeId 149;
+BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMNodeId 149;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMNodeId 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMNodeId 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMNodeId 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMControl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMControl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMControl 1;
+BA_ "GenSigStartValueInteger" SG_ 1100 EngExhMdeQuiet_D2_Stat 0;
+BA_ "GenSigSendType" SG_ 1100 EngExhMdeQuiet_D2_Stat 3;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 HvacCmprLim_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 HvacCmprLim_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1100 WakeAlarm1_T_Rq 32767;
+BA_ "GenSigStartValue" SG_ 1100 WakeAlarm1_T_Rq 32767;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 WakeAlarm1_T_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 WakeAlarm1_T_Rq 1;
+BA_ "WakeupSignal" SG_ 1100 WakeAlarm1_B_Typ 1;
+BA_ "GenSigSendType" SG_ 1100 WakeAlarm1_B_Typ 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 WakeAlarm1_B_Typ 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 WakeAlarm1_B_Typ 1;
+BA_ "GenSigSendType" SG_ 1100 Veh_V_DsplyTrailCtlSet 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 Veh_V_DsplyTrailCtlSet 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 Veh_V_DsplyTrailCtlSet 1;
+BA_ "GenSigSendType" SG_ 1100 TrailCtlPt_B_Falt 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1100 TrailCtlPt_B_Falt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 TrailCtlPt_B_Falt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 TrailCtlPt_B_Falt 1;
+BA_ "GenSigSendType" SG_ 1100 AutoTowAllw_D_StatMnu 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 AutoTowAllw_D_StatMnu 1;
+BA_ "GenSigSendType" SG_ 1100 AutoTowActv_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 AutoTowActv_B_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1100 GrossTrainWeight_M_Est 254;
+BA_ "GenSigStartValue" SG_ 1100 GrossTrainWeight_M_Est 254;
+BA_ "U_P702_MY2021_Rx" SG_ 1100 GrossTrainWeight_M_Est 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1100 GrossTrainWeight_M_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1100 GrossTrainWeight_M_Est 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 GrossTrainWeight_M_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmVeh_V_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmVeh_V_Dsply 1;
+BA_ "GenSigSendType" SG_ 1098 EdmSailMdeOn_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmSailMdeOn_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmSailMdeOn_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmPrev_Fe_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmPrev_Fe_Dsply 1;
+BA_ "GenSigSendType" SG_ 1098 EdmMsgTxt_D_Rq 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 1098 EdmLamp_D_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmLamp_D_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmLamp_D_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmCurrent_Fe_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmCurrent_Fe_Dsply 1;
+BA_ "GenSigSendType" SG_ 1098 EdmCmplnc_B_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmCmplnc_B_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmCmplnc_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmCmplnc_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmCmplnc_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1086 EngMnfld_P_Actl 2068;
+BA_ "U_P702_MY2021_Tx" SG_ 1086 EngMnfld_P_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 EngMnfld_P_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1086 FuelPumpPwr_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 FuelPumpPwr_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1086 BattULoChrg_U_Cmd 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1086 BattULoChrg_U_Cmd 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 BattULoChrg_U_Cmd 1;
+BA_ "UsedOnPgmDBC" SG_ 1086 ElLoadCtl_D_Rq 1;
+BA_ "ContentDependant" SG_ 1086 ElLoadCtl_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1086 ElLoadCtl_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 ElLoadCtl_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1071 EngAout_N_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 EngAout_N_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 1071 CluPdl_PcRate_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1071 CluPdl_PcRate_Actl 1;
+BA_ "ContentDependant" SG_ 1071 CluPdl_PcRate_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1071 CluPdl_PcRate_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 CluPdl_PcRate_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "ContentDependant" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "MetaData" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 CluPdlPosPcMeas_D_Qf 1;
+BA_ "CrossOver_InfoCAN" SG_ 1071 CluPdlPos_Pc_Meas 1;
+BA_ "UsedOnPgmDBC" SG_ 1071 CluPdlPos_Pc_Meas 1;
+BA_ "ContentDependant" SG_ 1071 CluPdlPos_Pc_Meas 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1071 CluPdlPos_Pc_Meas 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1071 CluPdlPos_Pc_Meas 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 CluPdlPos_Pc_Meas 1;
+BA_ "CrossOver_InfoCAN" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "UsedOnPgmDBC" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "ContentDependant" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 EngAoutIdl_N_Ntrl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 SlMde_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 SlMde_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 SlMde_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 SlMde_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 IsaOffst_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 IsaOffst_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 GrllShtrPos_D_Cmd 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 GrllShtrPos_D_Cmd 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 GrllShtrPos_D_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 GrllShtrPos_B_Falt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 GrllShtrPos_B_Falt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 GrllShtrPos_B_Falt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 ObdWarmUp_B_Complt 1;
+BA_ "ContentDependant" SG_ 1069 ObdWarmUp_B_Complt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 ObdWarmUp_B_Complt 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 EngMsgTxt_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1069 EngMsgTxt_D_Rq 1;
+BA_ "ContentDependant" SG_ 1069 EngMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 EngMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 EngClnt_Te_ActlDiag 1;
+BA_ "ContentDependant" SG_ 1069 EngClnt_Te_ActlDiag 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1069 EngClnt_Te_ActlDiag 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 EngClnt_Te_ActlDiag 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 EngClnt_Te_ActlDiag 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngClnt_Te_ActlDiag 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 EngLoad_Pc_CalcDiag 1;
+BA_ "ContentDependant" SG_ 1069 EngLoad_Pc_CalcDiag 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1069 EngLoad_Pc_CalcDiag 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 EngLoad_Pc_CalcDiag 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 EngLoad_Pc_CalcDiag 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngLoad_Pc_CalcDiag 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 EngAirIn_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1069 EngAirIn_Te_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1069 EngAirIn_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 EngAirIn_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 EngAirIn_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngAirIn_Te_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1069 ApedPos_Pc_ActlDiag 1;
+BA_ "ContentDependant" SG_ 1069 ApedPos_Pc_ActlDiag 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1069 ApedPos_Pc_ActlDiag 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 ApedPos_Pc_ActlDiag 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1069 ApedPos_Pc_ActlDiag 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 ApedPos_Pc_ActlDiag 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 RearDiffOilTeWarn_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 RearDiffOilTeWarn_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1060 RearDiffOil_Te_Actl 77;
+BA_ "GenSigStartValue" SG_ 1060 RearDiffOil_Te_Actl 77;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 RearDiffOil_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 RearDiffOil_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 BpedDrvMsgTxt_B_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 BpedDrvMsgTxt_B_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1060 FuelLvl_Pc_DsplyEng 48;
+BA_ "GenSigStartValue" SG_ 1060 FuelLvl_Pc_DsplyEng 0;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 FuelLvl_Pc_DsplyEng 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 FuelLvl_Pc_DsplyEng 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 FuelLvlWarn_D_ActlEng 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 FuelLvlWarn_D_ActlEng 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 FuelRange_L_DsplyEng 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 FuelRange_L_DsplyEng 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1060 SelDrvMdePt_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1060 SelDrvMdePt_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 SelDrvMdePt_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 FohEng_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1057 FohEng_D_Rq 2;
+BA_ "ContentDependant" SG_ 1057 FohEng_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 1057 FohEng_D_Rq 2;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 FohEng_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 FohEng_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 EngIdlShutDwnTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 EngIdlShutDwnTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 EngIdlShutDown_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 EngIdlShutDown_D_Stat 1;
+BA_ "ContentDependant" SG_ 1057 EngIdlShutDown_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 EngIdlShutDown_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 EngIdlShutDown_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 1057 EngIdlShutDown_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 FUEL_ALCOHOL_PERCNT 1;
+BA_ "GenSigStartValueInteger" SG_ 1057 FUEL_ALCOHOL_PERCNT 255;
+BA_ "ContentDependant" SG_ 1057 FUEL_ALCOHOL_PERCNT 1;
+BA_ "GenSigStartValue" SG_ 1057 FUEL_ALCOHOL_PERCNT 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 FUEL_ALCOHOL_PERCNT 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 FUEL_ALCOHOL_PERCNT 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 TrnTotTq_Rt_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 TrnTotTq_Rt_Est 1;
+BA_ "ContentDependant" SG_ 1057 TrnTotTq_Rt_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 TrnTotTq_Rt_Est 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 TrnTotTq_Rt_Est 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 TrnTotLss_Tq_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 TrnTotLss_Tq_Est 1;
+BA_ "ContentDependant" SG_ 1057 TrnTotLss_Tq_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 TrnTotLss_Tq_Est 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 TrnTotLss_Tq_Est 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 ECMMILRequest 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 ECMMILRequest 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 ECMMILRequest 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 ECMMILRequest 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 AirCondFluidHi_P_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 AirCondFluidHi_P_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 AirCondFluidHi_P_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 AirCondFluidHi_P_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 OilPressureWarning 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 OilPressureWarning 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 OilPressureWarning 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 OilPressureWarning 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "ContentDependant" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 VehVLimStat_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "ContentDependant" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 VehVLimActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1057 CoolantFanStepAct 1;
+BA_ "UsedOnPgmDBC" SG_ 1057 CoolantFanStepAct 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1057 CoolantFanStepAct 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 CoolantFanStepAct 1;
+BA_ "CrossOver_InfoCAN" SG_ 1055 EcoCochInstNeg_B_Dsply 1;
+BA_ "UsedOnPgmDBC" SG_ 1055 EcoCochInstNeg_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochInstNeg_B_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochInstNeg_B_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochInstNeg_B_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochShif_Pc_Dsply 255;
+BA_ "GenSigStartValue" SG_ 1055 EcoCochShif_Pc_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochShif_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochShif_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochShif_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochInst_Pc_Dsply 1000;
+BA_ "GenSigStartValue" SG_ 1055 EcoCochInst_Pc_Dsply 100;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochInst_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochInst_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochInst_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 255;
+BA_ "GenSigStartValue" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochDecel_Pc_Dsply 255;
+BA_ "GenSigStartValue" SG_ 1055 EcoCochDecel_Pc_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochDecel_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochDecel_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochDecel_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochCrus_Pc_Dsply 255;
+BA_ "GenSigStartValue" SG_ 1055 EcoCochCrus_Pc_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochCrus_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochCrus_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochCrus_Pc_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochA_Pc_Dsply 255;
+BA_ "GenSigStartValue" SG_ 1055 EcoCochA_Pc_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochA_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochA_Pc_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochA_Pc_Dsply 1;
+BA_ "ContentDependant" SG_ 562 GearNtrl_No_Cs 1;
+BA_ "MetaData" SG_ 562 GearNtrl_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 562 GearNtrl_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 562 GearNtrl_No_Cs 1;
+BA_ "ContentDependant" SG_ 562 GearNtrl_No_Cnt 1;
+BA_ "MetaData" SG_ 562 GearNtrl_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 562 GearNtrl_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 562 GearNtrl_No_Cnt 1;
+BA_ "GenSigStartValueInteger" SG_ 562 GearNtrl_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 562 GearNtrl_D_Stat 2;
+BA_ "GenSigSendType" SG_ 562 GearNtrl_D_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 562 GearNtrl_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 562 GearNtrl_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 523 EngAirFiltMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 EngAirFiltMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 523 WaterInFuel_B_Falt 1;
+BA_ "UsedOnPgmDBC" SG_ 523 WaterInFuel_B_Falt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 523 WaterInFuel_B_Falt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 WaterInFuel_B_Falt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 523 UreaMnAdd_L2_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 UreaMnAdd_L2_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 523 VehUreaRnge3_L_DsplyMx 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 VehUreaRnge3_L_DsplyMx 1;
+BA_ "ECGUsedRxSignal" SG_ 523 VehUreaRnge3_L_DsplyMx 1;
+BA_ "GenSigStartValueInteger" SG_ 523 UreaMxAdd_L2_Actl 510;
+BA_ "GenSigStartValue" SG_ 523 UreaMxAdd_L2_Actl 510;
+BA_ "U_P702_MY2021_Tx" SG_ 523 UreaMxAdd_L2_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 UreaMxAdd_L2_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 517 FapLc_B_Err 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 517 FapLc_B_Err 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 517 BrkTot_Tq_RqFapLc 1;
+BA_ "U_P702_MY2021_Rx" SG_ 517 BrkTot_Tq_RqFapLc 1;
+BA_ "U_P702_MY2021_Tx" SG_ 517 BrkTot_Tq_RqFapLc 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 517 BrkTot_Tq_RqFapLc 1;
+BA_ "U_P702_MY2021_Tx" SG_ 517 TrnAin_Pc_RqDrv 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 517 TrnAin_Pc_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "UsedOnPgmDBC" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "GenSigStartValueInteger" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "MetaData" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "GenSigStartValue" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "U_P702_MY2021_Rx" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 EngAoutNActl_D_QF 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 EngAout3_N_Actl 1;
+BA_ "ContentDependant" SG_ 516 EngAout3_N_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 EngAout3_N_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 ApedPos_PcRate_ActlArb 1;
+BA_ "UsedOnPgmDBC" SG_ 516 ApedPos_PcRate_ActlArb 1;
+BA_ "U_P702_MY2021_Rx" SG_ 516 ApedPos_PcRate_ActlArb 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 ApedPos_PcRate_ActlArb 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPos_PcRate_ActlArb 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPos_PcRate_ActlArb 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "UsedOnPgmDBC" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "U_P702_MY2021_Rx" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "ECGUsedRxSignal" SG_ 516 ApedPos_Pc_ActlArb 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "MetaData" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPosPcActl_D_Qf 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 EngAout_N_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 516 EngAout_N_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 516 EngAout_N_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 EngAout_N_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 516 EngAout_N_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 EngAout_N_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 EngAout_N_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 516 EngAout_N_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 ApedPosPcActl_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 516 ApedPosPcActl_No_Cnt 1;
+BA_ "ContentDependant" SG_ 516 ApedPosPcActl_No_Cnt 1;
+BA_ "MetaData" SG_ 516 ApedPosPcActl_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPosPcActl_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPosPcActl_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 516 ApedPosPcActl_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 516 ApedPosPcActl_No_Cs 1;
+BA_ "ContentDependant" SG_ 516 ApedPosPcActl_No_Cs 1;
+BA_ "MetaData" SG_ 516 ApedPosPcActl_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPosPcActl_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPosPcActl_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 StrtrMtrDlyStrt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 StrtrMtrDlyStrt_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 VehVTrlrAid_B_Avail 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 VehVTrlrAid_B_Avail 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVTrlrAid_B_Avail 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "MetaData" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVActlEng_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "MetaData" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVActlEng_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "UsedOnPgmDBC" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 Veh_V_RqCcSet 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "MetaData" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVActlEng_D_Qf 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 Veh_V_ActlEng 1;
+BA_ "UsedOnPgmDBC" SG_ 514 Veh_V_ActlEng 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 Veh_V_ActlEng 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 514 Veh_V_ActlEng 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 514 Veh_V_ActlEng 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 Veh_V_ActlEng 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 Veh_V_ActlEng 1;
+BA_ "ECGUsedRxSignal" SG_ 514 Veh_V_ActlEng 1;
+BA_ "CrossOver_InfoCAN" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 514 GearRvrse_D_Actl 7;
+BA_ "GenSigStartValue" SG_ 514 GearRvrse_D_Actl 7;
+BA_ "U_CX727_MY2021_Rx" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 514 GearRvrse_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D2_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D2_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTotTqRq_No_Cs 1;
+BA_ "ContentDependant" SG_ 512 PrplWhlTotTqRq_No_Cs 1;
+BA_ "MetaData" SG_ 512 PrplWhlTotTqRq_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTotTqRq_No_Cs 1;
+BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTotTqRq_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTotTqRq_No_Cnt 1;
+BA_ "ContentDependant" SG_ 512 PrplWhlTotTqRq_No_Cnt 1;
+BA_ "MetaData" SG_ 512 PrplWhlTotTqRq_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTotTqRq_No_Cnt 1;
+BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTotTqRq_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTot_Tq_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTot_Tq_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 512 PrplWhlTot_Tq_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTot_Tq_LimMn 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_LimMn 1;
+BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_LimMn 1;
+BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTot_Tq_LimMn 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 512 PrplWhlTot_Tq_LimMn 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 512 PtDrvMde_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 512 PtDrvMde_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 381 EngOilLife_T_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 EngOilLife_T_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 381 EngOilSrvcMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 EngOilSrvcMsgTxt_D_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 381 EngOilSrvcMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 381 DistToNextOilChange 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 DistToNextOilChange 1;
+BA_ "U_P702_MY2021_Tx" SG_ 381 RunDryPrevent_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 RunDryPrevent_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 381 WaterInFuel 1;
+BA_ "UsedOnPgmDBC" SG_ 381 WaterInFuel 1;
+BA_ "U_P702_MY2021_Tx" SG_ 381 WaterInFuel 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 WaterInFuel 1;
+BA_ "ECGUsedRxSignal" SG_ 381 WaterInFuel 1;
+BA_ "CrossOver_InfoCAN" SG_ 381 GlowIndication 1;
+BA_ "UsedOnPgmDBC" SG_ 381 GlowIndication 1;
+BA_ "U_P702_MY2021_Tx" SG_ 381 GlowIndication 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 GlowIndication 1;
+BA_ "WakeupSignal" SG_ 380 EngOilLvlWarn_D_Rq1 1;
+BA_ "CrossOver_InfoCAN" SG_ 380 EngOilLvlWarn_D_Rq1 1;
+BA_ "U_P702_MY2021_Tx" SG_ 380 EngOilLvlWarn_D_Rq1 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngOilLvlWarn_D_Rq1 1;
+BA_ "CrossOver_InfoCAN" SG_ 380 EngExhBrkOnLamp_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 380 EngExhBrkOnLamp_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngExhBrkOnLamp_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 380 EngExhBrkAutoLamp_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 380 EngExhBrkAutoLamp_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngExhBrkAutoLamp_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 380 EngAout_N_MxAllw 1;
+BA_ "UsedOnPgmDBC" SG_ 380 EngAout_N_MxAllw 1;
+BA_ "U_P702_MY2021_Tx" SG_ 380 EngAout_N_MxAllw 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngAout_N_MxAllw 1;
+BA_ "CrossOver_InfoCAN" SG_ 380 EngExhBrkMde_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 380 EngExhBrkMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 380 EngExhBrkMde_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 380 EngExhBrkMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngExhBrkMde_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 377 HvacAirFullOut_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 HvacAirFullOut_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 FuelFlw_Vl_Dsply 1;
+BA_ "UsedOnPgmDBC" SG_ 377 FuelFlw_Vl_Dsply 1;
+BA_ "ContentDependant" SG_ 377 FuelFlw_Vl_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 FuelFlw_Vl_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 FuelFlw_Vl_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 377 FuelFlw_Vl_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 FuelFillInlet_B_Dsply 1;
+BA_ "UsedOnPgmDBC" SG_ 377 FuelFillInlet_B_Dsply 1;
+BA_ "ContentDependant" SG_ 377 FuelFillInlet_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 FuelFillInlet_B_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 FuelFillInlet_B_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 EngSrvcRqd_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 377 EngSrvcRqd_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 EngSrvcRqd_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 EngSrvcRqd_B_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 377 EngSrvcRqd_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 OdoCount 1;
+BA_ "UsedOnPgmDBC" SG_ 377 OdoCount 1;
+BA_ "ContentDependant" SG_ 377 OdoCount 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 OdoCount 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 OdoCount 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 EngOilLife_Pc_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 377 EngOilLife_Pc_Actl 1;
+BA_ "ContentDependant" SG_ 377 EngOilLife_Pc_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 EngOilLife_Pc_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 EngOilLife_Pc_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 377 EngOilLife_Pc_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 FuelFilterLamp_B_Dsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 FuelFilterLamp_B_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 FuelFilterLamp_B_Dsply 1;
+BA_ "ECGUsedRxSignal" SG_ 377 FuelFilterLamp_B_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 AirCondRec_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 377 AirCondRec_B_Rq 1;
+BA_ "ContentDependant" SG_ 377 AirCondRec_B_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 AirCondRec_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 AirCondRec_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 377 AirCondClutch_B_Stats 1;
+BA_ "UsedOnPgmDBC" SG_ 377 AirCondClutch_B_Stats 1;
+BA_ "ContentDependant" SG_ 377 AirCondClutch_B_Stats 1;
+BA_ "U_P702_MY2021_Tx" SG_ 377 AirCondClutch_B_Stats 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 AirCondClutch_B_Stats 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 GasPrtc_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 GasPrtc_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "ContentDependant" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 EngAout_Aa_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 376 DynoMde_B_Cmd 1;
+BA_ "U_P702_MY2021_Rx" SG_ 376 DynoMde_B_Cmd 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 376 DynoMde_B_Cmd 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 DynoMde_B_Cmd 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 DynoMde_B_Cmd 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 AslIconDsply_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AslIconDsply_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 AslChime_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AslChime_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 376 HvacHtrCore2_Te_Actl 200;
+BA_ "U_P702_MY2021_Tx" SG_ 376 HvacHtrCore2_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 EcssLamp_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 EcssLamp_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "MetaData" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmbTe_D_Qf 1;
+BA_ "CrossOver_InfoCAN" SG_ 376 AirAmb_Te_ActlFilt 1;
+BA_ "UsedOnPgmDBC" SG_ 376 AirAmb_Te_ActlFilt 1;
+BA_ "GenSigStartValueInteger" SG_ 376 AirAmb_Te_ActlFilt 512;
+BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmb_Te_ActlFilt 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmb_Te_ActlFilt 1;
+BA_ "ECGUsedRxSignal" SG_ 376 AirAmb_Te_ActlFilt 1;
+BA_ "CrossOver_InfoCAN" SG_ 376 AirAmb_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 376 AirAmb_Te_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 376 AirAmb_Te_Actl 512;
+BA_ "U_P702_MY2021_Rx" SG_ 376 AirAmb_Te_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 376 AirAmb_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmb_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmb_Te_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 376 AirAmb_P_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 376 AirAmb_P_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 376 AirAmb_P_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmb_P_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmb_P_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 373 DieslPrtc2_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 DieslPrtc2_D_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 373 DieslPrtc2_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 373 DieslPrtcRgen_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 373 DieslPrtcRgen_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 373 DieslPrtcRgen_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 373 DieslPrtcRgen_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 373 DieslPrtcRgen_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 DieslPrtcRgen_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 373 EngTeColdPrtct_D_Stats 1;
+BA_ "UsedOnPgmDBC" SG_ 373 EngTeColdPrtct_D_Stats 1;
+BA_ "U_P702_MY2021_Tx" SG_ 373 EngTeColdPrtct_D_Stats 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 EngTeColdPrtct_D_Stats 1;
+BA_ "CrossOver_InfoCAN" SG_ 373 EngExhOvrTe_B_RqDsply 1;
+BA_ "UsedOnPgmDBC" SG_ 373 EngExhOvrTe_B_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 373 EngExhOvrTe_B_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 EngExhOvrTe_B_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 373 EngExhOvrTe_B_RqDsply 1;
+BA_ "GenSigStartValueInteger" SG_ 359 PrplWhlRgenMn_Tq_Actl 4095;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 PrplWhlRgenMn_Tq_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 PrplWhlRgenMn_Tq_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 PrplWhlRgenMn_Tq_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 ElPw_D_StatStrtStop 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 ElPw_D_StatStrtStop 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 ElPw_D_StatStrtStop 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 ElPw_D_StatStrtStop 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "ContentDependant" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 TrnAin_Tq_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 359 PrplWhlTot2_Tq_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 359 PwPckTq_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 Eng_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 359 Eng_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 Eng_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 Eng_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 Eng_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 Eng_D_Stat 1;
+BA_ "ECGUsedRxSignal" SG_ 359 Eng_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 PlgActvArb_B_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 359 PlgActvArb_B_Actl 1;
+BA_ "ContentDependant" SG_ 359 PlgActvArb_B_Actl 1;
+BA_ "GenSigStartValue" SG_ 359 PlgActvArb_B_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 359 PlgActvArb_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 ElPw_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 359 ElPw_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 ElPw_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 359 ElPw_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 ElPw_D_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 ElPw_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 ElPw_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "ContentDependant" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "MetaData" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 TrnAinTq_D_Qf 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtStdby_D_Indic 1;
+BA_ "GenSigStartValueInteger" SG_ 358 StopStrtStdby_D_Indic 0;
+BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtStdby_D_Indic 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtStdby_D_Indic 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtIODTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtIODTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtIODTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtDrvMde_D_Indic 1;
+BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtDrvMde_D_Indic 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtDrvMde_D_Indic 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtMsgTxt_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 OdoTripVerify_L_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 358 OdoTripVerify_L_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 OdoTripVerify_L_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 HiElPwInhbt_B_Stat 1;
+BA_ "ContentDependant" SG_ 358 HiElPwInhbt_B_Stat 1;
+BA_ "U_P702_MY2021_Tx" SG_ 358 HiElPwInhbt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 HiElPwInhbt_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 358 AutoStopPtDelta_I_Est 1;
+BA_ "GenSigStartValueInteger" SG_ 358 AutoStopPtDelta_I_Est 127;
+BA_ "ContentDependant" SG_ 358 AutoStopPtDelta_I_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 358 AutoStopPtDelta_I_Est 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 AutoStopPtDelta_I_Est 1;
+BA_ "UsedOnPgmDBC" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "GenSigStartValueInteger" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "MetaData" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "GenSigStartValue" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "U_P702_MY2021_Rx" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 BPedDrvAppl_D_QF 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 CmbbDeny_B_ActlPrpl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CmbbDeny_B_ActlPrpl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 PrplTqMnSat_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 PrplTqMnSat_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "GenSigStartValue" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 357 BpedDrvAppl_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 CmbbEngTqMn_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CmbbEngTqMn_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 357 Veh_V_DsplyCcSet 1;
+BA_ "UsedOnPgmDBC" SG_ 357 Veh_V_DsplyCcSet 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 Veh_V_DsplyCcSet 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 Veh_V_DsplyCcSet 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 AccEngStat_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 AccEngStat_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 357 CcMde_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 357 CcMde_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 357 CcMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 CcMde_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 CcMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CcMde_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 357 CcStat_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 357 CcStat_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 357 CcStat_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 CcStat_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 357 CcStat_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 CcStat_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CcStat_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 EngAout_N_MnAllw 1;
+BA_ "CrossOver_InfoCAN" SG_ 357 CcOvrrdActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 357 CcOvrrdActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 CcOvrrdActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 357 CcOvrrdActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 CcOvrrdActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CcOvrrdActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 357 AccStopMde_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 357 AccStopMde_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 357 AccStopMde_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 357 AccStopMde_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 AccStopMde_D_Rq 1;
+BA_ "U_P702_MY2021_Tx" SG_ 355 AutoRgenTxt_B_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 AutoRgenTxt_B_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 355 AutoRgenTxt_B_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 355 AccFllwMdeActv_B_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 355 AccFllwMdeActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 AccFllwMdeActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 355 EngPtoMde_D_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 355 EngPtoMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 EngPtoMde_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 355 ManRgenTxt_D_RqDsply 1;
+BA_ "UsedOnPgmDBC" SG_ 355 ManRgenTxt_D_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 355 ManRgenTxt_D_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 ManRgenTxt_D_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 355 ManRgenTxt_D_RqDsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 355 ManRgenSoot_Pc_RqDsply 1;
+BA_ "UsedOnPgmDBC" SG_ 355 ManRgenSoot_Pc_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 355 ManRgenSoot_Pc_RqDsply 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 ManRgenSoot_Pc_RqDsply 1;
+BA_ "ECGUsedRxSignal" SG_ 355 ManRgenSoot_Pc_RqDsply 1;
+BA_ "U_P702_MY2021_Tx" SG_ 355 DieslMsgTxt_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 DieslMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 342 EngOvrhtMitgActv_D_Ind 1;
+BA_ "UsedOnPgmDBC" SG_ 342 EngOvrhtMitgActv_D_Ind 1;
+BA_ "ContentDependant" SG_ 342 EngOvrhtMitgActv_D_Ind 1;
+BA_ "U_P702_MY2021_Tx" SG_ 342 EngOvrhtMitgActv_D_Ind 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngOvrhtMitgActv_D_Ind 1;
+BA_ "CrossOver_InfoCAN" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "MetaData" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "U_P702_MY2021_Tx" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngClntTe_D_Qf 1;
+BA_ "CrossOver_InfoCAN" SG_ 342 EngGoutLss_Tq_Est 1;
+BA_ "ContentDependant" SG_ 342 EngGoutLss_Tq_Est 1;
+BA_ "U_P702_MY2021_Tx" SG_ 342 EngGoutLss_Tq_Est 1;
+BA_ "CrossOver_InfoCAN" SG_ 342 EngOil_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 342 EngOil_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngOil_Te_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 342 EngClnt_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 71 immoTarget1Status 1;
+BA_ "U_P702_MY2021_Rx" SG_ 71 immoTarget1Status 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 71 immoTarget1Status 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 71 immoTarget1Status 1;
+BA_ "U_P702_MY2021_Tx" SG_ 71 immoTarget1Status 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 71 immoTarget1Status 1;
+BA_ "UsedOnPgmDBC" SG_ 71 immoTarget1Data 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 71 immoTarget1Data 1;
+BA_ "U_P702_MY2021_Rx" SG_ 71 immoTarget1Data 1;
+BA_ "U_P702_MY2021_Tx" SG_ 71 immoTarget1Data 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 71 immoTarget1Data 1;
+BA_ "UsedOnPgmDBC" SG_ 71 immoTarget1Cmd 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 71 immoTarget1Cmd 1;
+BA_ "U_P702_MY2021_Rx" SG_ 71 immoTarget1Cmd 1;
+BA_ "U_P702_MY2021_Tx" SG_ 71 immoTarget1Cmd 1;
+BA_ "U_T6_MCA_MY2020_Tx" SG_ 71 immoTarget1Cmd 1;
+BA_ "GenSigSendType" SG_ 1822 TesterPhysicalResGWM_F1 3;
+BA_ "ECGUsedTxSignal" SG_ 1822 TesterPhysicalResGWM_F1 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1438 GWM_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_GWOnBoardTester 255;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1438 GWM_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_GWNMProxy 255;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_GWNMProxy 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved4 255;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved3 255;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved2 255;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved1 255;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMNodeId 158;
+BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMNodeId 158;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMControl 1;
+BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 954 GenericSwtch3_No_Actl 1;
+BA_ "ContentDependant" SG_ 954 GenericSwtch2_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 954 GenericSwtch2_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 954 GenericSwtch1_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1006 PersIndexIpmb_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1006 PersIndexIpmb_D_Actl 4;
+BA_ "GenSigStartValue" SG_ 1006 PersIndexIpmb_D_Actl 4;
+BA_ "GenSigSendType" SG_ 1006 PersIndexIpmb_D_Actl 3;
+BA_ "CrossOver_InfoCAN" SG_ 1006 FeatNoIpmbActl 1;
+BA_ "GenSigSendType" SG_ 1006 FeatNoIpmbActl 3;
+BA_ "CrossOver_InfoCAN" SG_ 1006 FeatConfigIpmbActl 1;
+BA_ "GenSigSendType" SG_ 1006 FeatConfigIpmbActl 3;
+BA_ "GenSigSendType" SG_ 820 AhbStatGfhbFdbk_D_Actl 3;
+BA_ "U_P702_MY2021_Tx" SG_ 820 AhbStatGfhbFdbk_D_Actl 1;
+BA_ "GenSigSendType" SG_ 820 HeadLghtDrvSide_B_Stat 3;
+BA_ "U_P702_MY2021_Tx" SG_ 820 HeadLghtDrvSide_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 820 HeadLghtHiOn_B_StatHcm 1;
+BA_ "GenSigSendType" SG_ 820 HeadLghtHiOn_B_StatHcm 3;
+BA_ "U_P702_MY2021_Tx" SG_ 820 HeadLghtHiOn_B_StatHcm 1;
+BA_ "CrossOver_InfoCAN" SG_ 820 Adaptive_Hdlmp_Fault 1;
+BA_ "GenSigSendType" SG_ 820 Adaptive_Hdlmp_Fault 3;
+BA_ "U_P702_MY2021_Tx" SG_ 820 Adaptive_Hdlmp_Fault 1;
+BA_ "GenSigStartValueInteger" SG_ 137 SteWhlOffstRq_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 137 SteWhlOffstRq_D_Stat 2;
+BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlOffstRq_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 137 SteWhlOffst_An_TotActl 32766;
+BA_ "GenSigStartValue" SG_ 137 SteWhlOffst_An_TotActl 32765;
+BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlOffst_An_TotActl 1;
+BA_ "GenSigStartValueInteger" SG_ 137 SteWhlBrkOffst_An_Actl 32766;
+BA_ "GenSigStartValue" SG_ 137 SteWhlBrkOffst_An_Actl 32765;
+BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlBrkOffst_An_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 137 SteWhlBrkAnActl_No_Cs 1;
+BA_ "MetaData" SG_ 137 SteWhlBrkAnActl_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlBrkAnActl_No_Cs 1;
+BA_ "CrossOver_InfoCAN" SG_ 137 SteWhlBrkAnActl_No_Cnt 1;
+BA_ "MetaData" SG_ 137 SteWhlBrkAnActl_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlBrkAnActl_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 129 SelDrvMdeSwtch_D_Stat4 1;
+BA_ "U_P702_MY2021_Rx" SG_ 129 SelDrvMdeSwtch_D_Stat4 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchView_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchSet_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchPhon_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchNav_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchMed_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchIod_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchHud_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchBack_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchMenu_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchUp_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchRght_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchOk_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchLeft_B_Stat 1;
+BA_ "WakeupSignal" SG_ 129 SteWhlSwtchDown_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 935 SodRight_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 935 SodRight_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 935 SodRight_D_Stat 2;
+BA_ "GenSigSendType" SG_ 935 SodRight_D_Stat 3;
+BA_ "GenSigSendType" SG_ 935 CtaAlrtRight2_D_Stat 3;
+BA_ "GenSigSendType" SG_ 935 BttRight_D_Stat 3;
+BA_ "GenSigSendType" SG_ 935 BttRight_D_RqDrv 3;
+BA_ "GenSigSendType" SG_ 935 CtaBrkRightMsgTxt_B_Rq 3;
+BA_ "GenSigSendType" SG_ 935 CtaRightBrkEnbl_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 935 CtaRightBrkEnbl_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 935 CtaRightBrkEnbl_B_Rq 1;
+BA_ "GenSigSendType" SG_ 935 CtaRightBrkDecel_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 935 CtaRightBrkDecel_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 935 CtaRightBrkDecel_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 935 Side_Detect_R_Illum 1;
+BA_ "GenSigStartValueInteger" SG_ 935 Side_Detect_R_Illum 100;
+BA_ "GenSigStartValue" SG_ 935 Side_Detect_R_Illum 100;
+BA_ "CrossOver_InfoCAN" SG_ 935 CtaSnsRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 935 CtaSnsRight_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 935 CtaAlrtRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 935 CtaAlrtRight_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 935 CtaRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 935 CtaRight_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 935 SodSnsRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 935 SodSnsRight_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 935 SodAlrtRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 935 SodAlrtRight_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 935 SodDetctRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 935 SodDetctRight_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 935 SodWarnRight_Prd_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 935 SodWarnRight_Prd_Rq 14;
+BA_ "GenSigStartValue" SG_ 935 SodWarnRight_Prd_Rq 14;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte8 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte8 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte8 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte7 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte7 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte7 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte6 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte6 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte6 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte5 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte5 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte5 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte4 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte4 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte4 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte3 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte3 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte3 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte2 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte2 1;
+BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte1 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte1 1;
+BA_ "GenSigStartValueInteger" SG_ 261 ChrgStatDsply_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 261 ChrgStatDsply_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1146 TrlrAidSwtch_D_RqDrv 1;
+BA_ "GenSigStartValueInteger" SG_ 1146 TrlrAidCtl_U_RqDrv 4094;
+BA_ "GenSigStartValue" SG_ 1146 TrlrAidCtl_U_RqDrv 4093;
+BA_ "U_P702_MY2021_Rx" SG_ 1146 TrlrAidCtl_U_RqDrv 1;
+BA_ "U_P702_MY2021_Rx" SG_ 533 TrlrAidMde_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTOn_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 533 OnbChrgGoTOn_D_Rq 2;
+BA_ "GenSigStartValue" SG_ 533 OnbChrgGoTOn_D_Rq 2;
+BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTMnte_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 533 OnbChrgGoTMnte_D_Rq 1;
+BA_ "MetaData" SG_ 533 OnbChrgGoTMnte_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 533 OnbChrgGoTHr_T_Rq 30;
+BA_ "GenSigStartValue" SG_ 533 OnbChrgGoTHr_T_Rq 30;
+BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTElement_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 533 OnbChrgGoTElement_D_Rq 1;
+BA_ "MetaData" SG_ 533 OnbChrgGoTElement_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTDelete_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgClearAll_B_Rq 1;
+BA_ "ECGUsedTxSignal" SG_ 533 OnbChrgClearAll_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTUpdate_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1041 ElCmpr_Pw_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAuxIsol_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 1067 BattULoAuxIsol_D_Rq 2;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_U_Rq 1;
+BA_ "GenSigStartValue" SG_ 1067 BattULoAux_U_Rq 3296;
+BA_ "GenSigStartValueInteger" SG_ 1067 BattULoAuxSoc_Pc_Actl 95;
+BA_ "GenSigStartValue" SG_ 1067 BattULoAuxSoc_Pc_Actl 95;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAuxSoc_Pc_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1067 BattULoAux_I_Actl 2048;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_I_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_D_Qlty 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoCrnkStrt_U_Pred 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoCrnkBelt_U_Pred 1;
+BA_ "GenSigStartValueInteger" SG_ 1067 BattULoAux_U_Actl 203;
+BA_ "GenSigStartValue" SG_ 1067 BattULoAux_U_Actl 203;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_U_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_B_Falt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1112 BattTracChrgSustn_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1112 BattTracCnnct_D_Cmd 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1112 BattTracHvilOpen_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1112 BattTracDcdcDis_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1112 BattTracDelta_Te_Actl 164;
+BA_ "GenSigStartValue" SG_ 1112 BattTracDelta_Te_Actl 120;
+BA_ "ContentDependant" SG_ 1112 BattTracClntPmp_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 139 AfsPw_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 139 AfsPw_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 139 ActvFrontSteLck_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 139 ActvFrontSteLck_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 139 SelDrvMdeAdptSte_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_No_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1121 SelDrvMdeCnt_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1121 SelDrvMdeCnt_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1120 DrvSlipCtlMde_B_Rq3 1;
+BA_ "UsedOnPgmDBC" SG_ 1120 DrvSlipCtlMde_B_Rq3 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1120 DrvSlipCtlMde_B_Rq3 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1120 HybMdeSwtch_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1120 RearDiffLck_D_RqDrv 2;
+BA_ "GenSigStartValue" SG_ 1120 RearDiffLck_D_RqDrv 2;
+BA_ "U_P702_MY2021_Rx" SG_ 1120 RearDiffLck_D_RqDrv 1;
+BA_ "GenSigStartValueInteger" SG_ 1120 AwdMde_D_RqDrv 5;
+BA_ "GenSigStartValue" SG_ 1120 AwdMde_D_RqDrv 5;
+BA_ "U_P702_MY2021_Rx" SG_ 1120 AwdMde_D_RqDrv 1;
+BA_ "UsedOnPgmDBC" SG_ 1120 HdcSwtchPos_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1120 HdcSwtchPos_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1050 Outside_Air_Temp_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1050 Outside_Air_Temp_Stat 254;
+BA_ "GenSigStartValue" SG_ 1050 Outside_Air_Temp_Stat 254;
+BA_ "U_P702_MY2021_Rx" SG_ 1050 Outside_Air_Temp_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1050 Outside_Air_Temp_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 1137 RngPerChrgAvg_L_Dsply 4094;
+BA_ "GenSigStartValue" SG_ 1137 RngPerChrgAvg_L_Dsply 4093;
+BA_ "U_P702_MY2021_Tx" SG_ 1137 RngPerChrgAvg_L_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev3X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev1X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1255 BalrRight4CurntX_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1254 BalrRight3Threat_D_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev3X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev1X_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1254 BalrRight3Fast_B_Stat 3;
+BA_ "GenSigSendType" SG_ 1254 BalrRight3Dsply_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1254 BalrRight3CurntX_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev3X_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1253 BalrRight2Threat_D_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev1X_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1253 BalrRight2Fast_B_Stat 3;
+BA_ "GenSigSendType" SG_ 1253 BalrRight2Dsply_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1253 BalrRight2CurntX_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev3X_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1252 BalrRight1Threat_D_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev1X_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1252 BalrRight1Fast_B_Stat 3;
+BA_ "GenSigSendType" SG_ 1252 BalrRight1Dsply_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1252 BalrRight1CurntX_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev3X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev1X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1251 BalrLeft4CurntX_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev3X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev1X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1250 BalrLeft3CurntX_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev3X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev1X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1249 BalrLeft2CurntX_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1248 BalrLeft1Threat_D_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev3Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev3Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev3X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev3X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev2Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev2Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev2X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev2X_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev1Y_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev1Y_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev1X_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev1X_L_Actl 0;
+BA_ "GenSigSendType" SG_ 1248 BalrLeft1Fast_B_Stat 3;
+BA_ "GenSigSendType" SG_ 1248 BalrLeft1Dsply_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1CurntY_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1CurntY_L_Actl 0;
+BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1CurntX_L_Actl 64;
+BA_ "GenSigStartValue" SG_ 1248 BalrLeft1CurntX_L_Actl 0;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrTrgtAcquire_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrRvrse_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAid_D2_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAidTrgtId_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1113 TrlrAid_An3_Actl 720;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAid_An3_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1113 TrlrAid_AnRate2_Actl 400;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAid_AnRate2_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1113 HitchToVehAxle_L_Calc 255;
+BA_ "GenSigStartValue" SG_ 1113 HitchToVehAxle_L_Calc 255;
+BA_ "U_P702_MY2021_Rx" SG_ 1113 HitchToVehAxle_L_Calc 1;
+BA_ "GenSigSendType" SG_ 1105 TrlrAidSwtchLamp_B_Rq 3;
+BA_ "GenSigSendType" SG_ 1105 TrlrHitchMsgTxt_D_Rq 3;
+BA_ "GenSigSendType" SG_ 1105 TrlrHitchIcon_D_Rq 3;
+BA_ "GenSigSendType" SG_ 1105 TrlrHitchChime_D_Rq 3;
+BA_ "GenSigSendType" SG_ 1105 TrlrAidEnbl_D_RqAdas 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1105 TrlrAidEnbl_D_RqAdas 1;
+BA_ "GenSigSendType" SG_ 1105 TrlrRvrseMsgTxt_D2_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1105 TrlrRvrseMsgTxt_D2_Rq 1;
+BA_ "GenSigSendType" SG_ 1105 TrlrRvrseEnbl_D2_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1105 TrlrRvrseEnbl_D2_Stat 1;
+BA_ "GenSigSendType" SG_ 1105 RbaMsg_D_Rq 3;
+BA_ "WakeupSignal" SG_ 1105 BrkDecel_B_RqRba 1;
+BA_ "CrossOver_InfoCAN" SG_ 1105 BrkDecel_B_RqRba 1;
+BA_ "UsedOnPgmDBC" SG_ 1105 BrkDecel_B_RqRba 1;
+BA_ "GenSigSendType" SG_ 1105 BrkDecel_B_RqRba 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1105 BrkDecel_B_RqRba 1;
+BA_ "WakeupSignal" SG_ 1105 BrkEnbl_B_RqRba 1;
+BA_ "CrossOver_InfoCAN" SG_ 1105 BrkEnbl_B_RqRba 1;
+BA_ "UsedOnPgmDBC" SG_ 1105 BrkEnbl_B_RqRba 1;
+BA_ "GenSigSendType" SG_ 1105 BrkEnbl_B_RqRba 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1105 BrkEnbl_B_RqRba 1;
+BA_ "GenSigStartValueInteger" SG_ 1105 Rba_D_Stat 1;
+BA_ "GenSigStartValue" SG_ 1105 Rba_D_Stat 1;
+BA_ "GenSigSendType" SG_ 1105 Rba_D_Stat 3;
+BA_ "GenSigSendType" SG_ 1105 RbaAlrt_D_Dsply 3;
+BA_ "GenSigSendType" SG_ 1105 RbaMnu_D_Rq 3;
+BA_ "GenSigSendType" SG_ 1105 CamraFrntStat_D_Stat 3;
+BA_ "GenSigSendType" SG_ 1105 TrlrHitchLamp_D_Rq2 3;
+BA_ "GenSigSendType" SG_ 938 SidePrkSnsR2_D_Stat 3;
+BA_ "GenSigSendType" SG_ 938 SidePrkSnsR1_D_Stat 3;
+BA_ "GenSigSendType" SG_ 938 SidePrkSnsL2_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 ApaMde_D_Stat 1;
+BA_ "GenSigSendType" SG_ 938 ApaMde_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 ApaActvSd_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 938 ApaActvSd_D_Actl 1;
+BA_ "GenSigStartValue" SG_ 938 ApaActvSd_D_Actl 1;
+BA_ "GenSigSendType" SG_ 938 ApaActvSd_D_Actl 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSwtch_B_Stat 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidSwtch_B_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 ApaMde_D_Avail 1;
+BA_ "GenSigSendType" SG_ 938 ApaMde_D_Avail 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFrCrnr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidSnsFrCrnr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFrCntr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidSnsFrCntr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFlCrnr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidSnsFlCrnr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFlCntr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidSnsFlCntr_D_Stat 3;
+BA_ "GenSigSendType" SG_ 938 PrkBrkEl_B_RqFap 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 938 PrkBrkEl_B_RqFap 1;
+BA_ "U_P702_MY2021_Rx" SG_ 938 PrkBrkEl_B_RqFap 1;
+BA_ "CrossOver_InfoCAN" SG_ 938 RpaChime_D_Rq 1;
+BA_ "GenSigSendType" SG_ 938 RpaChime_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 FpaChime_D_Rq 1;
+BA_ "GenSigSendType" SG_ 938 FpaChime_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidMsgTxt_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 938 PrkAidMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 938 SidePrkSnsL1_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidAudioMute_B_Rq 1;
+BA_ "GenSigSendType" SG_ 938 PrkAidAudioMute_B_Rq 3;
+BA_ "GenSigSendType" SG_ 939 ApaBrk_D_Rq 3;
+BA_ "GenSigSendType" SG_ 939 SidePrkSnsR4_D_Stat 3;
+BA_ "GenSigSendType" SG_ 939 SidePrkSnsR3_D_Stat 3;
+BA_ "GenSigSendType" SG_ 939 SidePrkSnsL4_D_Stat 3;
+BA_ "GenSigSendType" SG_ 939 SidePrkSnsL3_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidChime_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidChime_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRlCntr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidSnsRlCntr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRrCrnr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidSnsRrCrnr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRrCntr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidSnsRrCntr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRlCrnr_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidSnsRlCrnr_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidRear_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidRear_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidFront_D_Stat 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidFront_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 939 PrkAid_D_Falt 1;
+BA_ "GenSigSendType" SG_ 939 PrkAid_D_Falt 3;
+BA_ "GenSigSendType" SG_ 939 ApaLongCtrlEnbl_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 939 ApaLongCtrlEnbl_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 939 ApaLongCtrlEnbl_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 939 ApaLongCtrlEnbl_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 939 ApaBrk_A_Rq 255;
+BA_ "U_P702_MY2021_Rx" SG_ 939 ApaBrk_A_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 939 ApaBrk_A_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 939 ApaBrk_A_Rq 1;
+BA_ "GenSigSendType" SG_ 939 PrkAidLamp_D_Rq 3;
+BA_ "GenSigStartValueInteger" SG_ 937 Veh_V_RqFap 0;
+BA_ "U_P702_MY2021_Rx" SG_ 937 Veh_V_RqFap 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 Veh_V_RqFap 1;
+BA_ "MetaData" SG_ 937 TrnRngDRqFap_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 937 TrnRngDRqFap_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 TrnRngDRqFap_No_Cs 1;
+BA_ "MetaData" SG_ 937 TrnRngDRqFap_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 937 TrnRngDRqFap_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 TrnRngDRqFap_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 937 TrnRng_D_RqFap 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 TrnRng_D_RqFap 1;
+BA_ "GenSigStartValueInteger" SG_ 937 FapLcDistToObj_L_Actl 254;
+BA_ "GenSigStartValue" SG_ 937 FapLcDistToObj_L_Actl 254;
+BA_ "U_P702_MY2021_Rx" SG_ 937 FapLcDistToObj_L_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 FapLcDistToObj_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 936 ApaSys_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 936 ApaSys_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 936 EPASExtAngleStatReq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 936 EPASExtAngleStatReq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 936 ExtSteeringAngleReq2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 936 ExtSteeringAngleReq2 1;
+BA_ "GenSigStartValueInteger" SG_ 877 RngImpctDrv_L_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 877 RngImpctDrv_L_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 877 RngImpctClim_L_Dsply 255;
+BA_ "U_P702_MY2021_Tx" SG_ 877 RngImpctClim_L_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 877 VehElEffAvg_No_Dsply 126;
+BA_ "GenSigStartValue" SG_ 877 VehElEffAvg_No_Dsply 126;
+BA_ "U_P702_MY2021_Tx" SG_ 877 VehElEffAvg_No_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwFuelDrv_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 877 PwFlwFuelDrv_D_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwFuelDrv_D_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwFuelClimt_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 877 PwFlwFuelClimt_B_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwFuelClimt_B_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwFuelBatt_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 877 PwFlwFuelBatt_B_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwFuelBatt_B_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwBattClimt_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 877 PwFlwBattClimt_B_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwBattClimt_B_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwBatt_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 877 PwFlwBatt_D_Dsply 3;
+BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwBatt_D_Dsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_LimChrg 1;
+BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_LimDchrg 1;
+BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_DchrgInst 1;
+BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_ChrgInst 1;
+BA_ "GenSigStartValueInteger" SG_ 588 BattTracSoc2_Pc_Actl 16382;
+BA_ "GenSigStartValue" SG_ 588 BattTracSoc2_Pc_Actl 16382;
+BA_ "U_P702_MY2021_Rx" SG_ 588 BattTracSoc2_Pc_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 588 BattTrac_Te_Actl 150;
+BA_ "GenSigStartValue" SG_ 588 BattTrac_Te_Actl 150;
+BA_ "U_P702_MY2021_Rx" SG_ 588 BattTrac_Te_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 588 BattTracDiagClr_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 588 BattTracDiagClr_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 587 BattTracClnt_Te_Actl 164;
+BA_ "GenSigStartValue" SG_ 587 BattTracClnt_Te_Actl 164;
+BA_ "CrossOver_InfoCAN" SG_ 587 BattTracWarnLamp_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 587 BattTracSrvcRqd_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_MxPrtct 700;
+BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_MxPrtct 700;
+BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_MxPrtct 1;
+BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_MnPrtct 300;
+BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_MnPrtct 30;
+BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_MnPrtct 1;
+BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_LimLo 400;
+BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_LimLo 400;
+BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_LimLo 1;
+BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_LimHi 600;
+BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_LimHi 600;
+BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_LimHi 1;
+BA_ "CrossOver_InfoCAN" SG_ 389 HtrnOvrTeLamp_B_Dsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 389 HtrnAin_UHi_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 389 HtrnAin_UHi_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 389 HtrnSrvcRqd_B_Dsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 389 HtrnHvilOpen_B_Actl 1;
+BA_ "ECGUsedRxSignal" SG_ 389 HtrnHvilOpen_B_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 389 BattTrac_I_EstVsc 15000;
+BA_ "U_P702_MY2021_Rx" SG_ 1009 TrlrAidCancl_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1009 CenterStackRing_D_Actl 2;
+BA_ "GenSigStartValue" SG_ 1009 CenterStackRing_D_Actl 2;
+BA_ "CrossOver_InfoCAN" SG_ 1009 ValetMode_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 360 GsmSrvcRqd_B_Rq 1;
+BA_ "ContentDependant" SG_ 360 GsmSrvcRqd_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 360 TrnGearPwmFalt_B_Actl 1;
+BA_ "ContentDependant" SG_ 360 TrnGearPwmFalt_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 360 TrnGearPwmFalt_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 360 TrnGearPwmFalt_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 360 GearButtnStuck_B_Actl 1;
+BA_ "ContentDependant" SG_ 360 GearButtnStuck_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 360 GearButtnStuck_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 360 GearButtnStuck_B_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_U_LimLo 88;
+BA_ "GenSigStartValue" SG_ 122 BattTrac_U_LimLo 88;
+BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_U_LimLo 1;
+BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_U_LimHi 163;
+BA_ "GenSigStartValue" SG_ 122 BattTrac_U_LimHi 163;
+BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_U_LimHi 1;
+BA_ "CrossOver_InfoCAN" SG_ 122 VehStrtInhbt_B_RqBatt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 122 VehStrtInhbt_B_RqBatt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 122 BattTracOffFst_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 122 BattTracOff_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 122 BattTracOff_B_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_U_Actl 1022;
+BA_ "GenSigStartValue" SG_ 122 BattTrac_U_Actl 1022;
+BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_U_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_I_Actl 15000;
+BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_I_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 90 TrnGsmNtmState_D_Actl 1;
+BA_ "ContentDependant" SG_ 90 TrnGsmNtmState_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGsmNtmState_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGsmNtmState_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 90 TrnGsmNtmState_D_Actl 1;
+BA_ "ContentDependant" SG_ 90 DrQltyDrv_D_StatGsm 1;
+BA_ "GenSigStartValue" SG_ 90 DrQltyDrv_D_StatGsm 6;
+BA_ "U_P702_MY2021_Rx" SG_ 90 DrQltyDrv_D_StatGsm 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 DrQltyDrv_D_StatGsm 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 90 DrQltyDrv_D_StatGsm 1;
+BA_ "ContentDependant" SG_ 90 TrnBtsiOvrrd_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnBtsiOvrrd_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnBtsiOvrrd_B_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 90 TrnRng_D_RqGsm 14;
+BA_ "GenSigStartValue" SG_ 90 TrnRng_D_RqGsm 14;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnRng_D_RqGsm 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnRng_D_RqGsm 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 90 PrkBrkActv_D_RqGsmGear 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 PrkBrkActv_D_RqGsmGear 1;
+BA_ "ContentDependant" SG_ 90 TrnValidGearRq_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnValidGearRq_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnValidGearRq_D_Stat 1;
+BA_ "ContentDependant" SG_ 90 TrnGearRqCnt_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearRqCnt_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearRqCnt_B_Actl 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_U_Actl 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_U_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_U_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_U_Actl 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlR2 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlR2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlR2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlR2 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlR1 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlR1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlR1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlR1 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlR0 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlR0 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlR0 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlR0 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlP2 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlP2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlP2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlP2 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlP1 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlP1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlP1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlP1 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlP0 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlP0 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlP0 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlP0 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlN2 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlN2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlN2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlN2 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlN1 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlN1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlN1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlN1 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlN0 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlN0 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlN0 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlN0 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlM2 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlM2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlM2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlM2 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlM1 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlM1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlM1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlM1 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlM0 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlM0 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlM0 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlM0 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlD2 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlD2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlD2 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlD2 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlD1 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlD1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlD1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlD1 1;
+BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlD0 1;
+BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlD0 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlD0 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlD0 1;
+BA_ "ContentDependant" SG_ 90 TrnGear_No_Cs 1;
+BA_ "MetaData" SG_ 90 TrnGear_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGear_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGear_No_Cs 1;
+BA_ "ContentDependant" SG_ 90 TrnGear_No_Cnt 1;
+BA_ "MetaData" SG_ 90 TrnGear_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGear_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGear_No_Cnt 1;
+BA_ "WakeupSignal" SG_ 90 TrnGear_D_RqDrv 1;
+BA_ "ContentDependant" SG_ 90 TrnGear_D_RqDrv 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGear_D_RqDrv 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGear_D_RqDrv 1;
+BA_ "ContentDependant" SG_ 90 BrkSwtchPos_B_ActlGsm 1;
+BA_ "U_P702_MY2021_Rx" SG_ 90 BrkSwtchPos_B_ActlGsm 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 BrkSwtchPos_B_ActlGsm 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 ParkLampTrlrOut_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 TrlrLampCtl_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 TrlrBattChrg_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 StopLampTrlrOut_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 TurnLampTrlrRr_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 TurnLampTrlrRl_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1091 TrlrLampCnnct_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1091 TrlrLampCnnct_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1091 TrlrLampCnnct_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1091 TrlrLampCnnct_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1091 TrlrLampCnnct_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 138 SteWhlRelCalib_T_Actl 1;
+BA_ "ContentDependant" SG_ 138 SteWhlRelCalib_An_Sns 1;
+BA_ "U_P702_MY2021_Rx" SG_ 138 SteWhlRelCalib_An_Sns 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 138 SteWhlRelCalib_An_Sns 1;
+BA_ "WakeupSignal" SG_ 131 HeadLghtHiCtrl_D_RqAhb 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 HeadLghtHiCtrl_D_RqAhb 1;
+BA_ "GenSigStartValueInteger" SG_ 131 WiprFrontSwtch_D_Stat 9;
+BA_ "GenSigStartValue" SG_ 131 WiprFrontSwtch_D_Stat 9;
+BA_ "WakeupSignal" SG_ 131 HeadLghtHiOn_B_StatAhb 1;
+BA_ "CrossOver_InfoCAN" SG_ 131 HeadLghtHiOn_B_StatAhb 1;
+BA_ "WakeupSignal" SG_ 131 HeadLghtHiFlash_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 131 WiprFront_D_Stat 15;
+BA_ "GenSigStartValue" SG_ 131 WiprFront_D_Stat 15;
+BA_ "U_P702_MY2021_Rx" SG_ 131 WiprFront_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 WiprFront_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 131 WiprFront_D_Stat 1;
+BA_ "WakeupSignal" SG_ 131 TurnLghtSwtch_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 131 TurnLghtSwtch_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 131 TurnLghtSwtch_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 TurnLghtSwtch_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 131 LghtAmb_D_Sns 7;
+BA_ "GenSigStartValue" SG_ 131 LghtAmb_D_Sns 7;
+BA_ "U_P702_MY2021_Rx" SG_ 131 LghtAmb_D_Sns 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 AslButtnOnOffPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 AslButtnOnOffPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 AslButtnOnOffCnclPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 AslButtnOnOffCnclPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOnPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOnPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOnOffPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOnOffPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOnOffCnclPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOnOffCnclPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOffPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOffPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAsllButtnResPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAsllButtnResPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnSetIncPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnSetIncPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnSetDecPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnSetDecPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnResIncPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnResIncPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnOnPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnOnPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnIndxIncPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnIndxIncPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnIndxDecPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnIndxDecPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnDeny_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnDeny_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnCnclResPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnCnclResPress 1;
+BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnCnclPress 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnCnclPress 1;
+BA_ "WakeupSignal" SG_ 787 DrLckCnt_No_ActlTgate 1;
+BA_ "WakeupSignal" SG_ 787 DrTgateChime2_D_Rq 1;
+BA_ "WakeupSignal" SG_ 787 DrTGate_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 787 DrTGate_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 787 DrTGate_D_Rq 1;
+BA_ "WakeupSignal" SG_ 787 PwLftgtIntSw_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 787 Power_Liftgate_Mode_Stt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 953 BattRgenLoDChrg_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 953 BattRgenLoChrg_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm3_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 953 WakeAlarm3_D_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm2_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 953 WakeAlarm2_D_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm1_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 953 WakeAlarm1_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 953 WakeAlarm1_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 953 WakeAlarm1_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm0_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 953 WakeAlarm0_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 1093 TrlrBrkActCnnct_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1093 TrlrBrkActCnnct_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1093 TrlrBrkActCnnct_B_Actl 1;
+BA_ "ContentDependant" SG_ 1093 StopLamp_B_RqTrlrBrk 1;
+BA_ "U_P702_MY2021_Rx" SG_ 792 FuelRange_L_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 792 FuelRange_L_Dsply 1;
+BA_ "ContentDependant" SG_ 792 ElTrip_L_Dsply 1;
+BA_ "ContentDependant" SG_ 792 ElLongTerm_L_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 968 SlMde_D_Rq 2;
+BA_ "GenSigStartValue" SG_ 968 SlMde_D_Rq 2;
+BA_ "U_P702_MY2021_Rx" SG_ 968 SlMde_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 968 SlMde_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 968 IsaOffst_D_Rq 14;
+BA_ "GenSigStartValue" SG_ 968 IsaOffst_D_Rq 14;
+BA_ "U_P702_MY2021_Rx" SG_ 968 IsaOffst_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 968 IsaOffst_D_Rq 1;
+BA_ "WakeupSignal" SG_ 819 Memory_3_SwPsngr_Stat 1;
+BA_ "WakeupSignal" SG_ 819 Memory_2_SwPsngr_Stat 1;
+BA_ "WakeupSignal" SG_ 819 Memory_1_SwPsngr_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 819 WndwPsngrSide_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 819 WndwPsngrSide_D_Stat 1;
+BA_ "WakeupSignal" SG_ 819 Pasngr_Lock_Sw_Stat 1;
+BA_ "WakeupSignal" SG_ 819 Pasngr_Lock_Sw_Cnt 1;
+BA_ "MetaData" SG_ 819 Pasngr_Lock_Sw_Cnt 1;
+BA_ "WakeupSignal" SG_ 819 ChildLckFdbckRp_B_Stat 1;
+BA_ "WakeupSignal" SG_ 818 ChildLckPw_N_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 818 WndwDrvSide_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 818 WndwDrvSide_D_Stat 1;
+BA_ "WakeupSignal" SG_ 818 KeyCylSwDrvDr_D_Stat 1;
+BA_ "GenSigInactiveValue" SG_ 818 Driver_Lock_Sw_Stat 0;
+BA_ "WakeupSignal" SG_ 818 Driver_Lock_Sw_Stat 1;
+BA_ "WakeupSignal" SG_ 818 Driver_Lock_Sw_Cnt 1;
+BA_ "MetaData" SG_ 818 Driver_Lock_Sw_Cnt 1;
+BA_ "WakeupSignal" SG_ 818 ChildLckPw_D_Rq 1;
+BA_ "WakeupSignal" SG_ 818 ChildLckFdbckRd_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 818 RvrseMirrorChime_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 806 StopStrtDrvMde_B_RqBtn 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 StopStrtDrvMde_B_RqBtn 1;
+BA_ "GenSigStartValueInteger" SG_ 806 HvacHtrCore_Te_Rq 0;
+BA_ "U_P702_MY2021_Rx" SG_ 806 HvacHtrCore_Te_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacHtrCore_Te_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 806 ClimtHeat_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 ClimtHeat_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 806 ClimtCool_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 ClimtCool_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 806 HvacEvap_Te_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 806 HvacEvap_Te_Rq 400;
+BA_ "U_P702_MY2021_Rx" SG_ 806 HvacEvap_Te_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacEvap_Te_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 806 HvacEvap_Te_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 806 HvacEvap_Te_Actl 400;
+BA_ "U_P702_MY2021_Rx" SG_ 806 HvacEvap_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacEvap_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 806 HvacAirCond_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 806 HvacAirCond_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacAirCond_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 806 HvacEvap_Te_Offst 1;
+BA_ "GenSigStartValueInteger" SG_ 806 HvacEvap_Te_Offst 400;
+BA_ "U_P702_MY2021_Rx" SG_ 806 HvacEvap_Te_Offst 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacEvap_Te_Offst 1;
+BA_ "U_P702_MY2021_Rx" SG_ 806 ClimtPw_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 ClimtPw_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 765 EngExhMdeQuiet_D2_Rq 0;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 765 EdmSailMde_B_RqDrv 1;
+BA_ "WakeupSignal" SG_ 765 DrvInputRequired_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 765 AwdRnge_D_ActlIpc 1;
+BA_ "UsedOnPgmDBC" SG_ 765 AwdRnge_D_ActlIpc 1;
+BA_ "GenSigStartValueInteger" SG_ 765 AwdRnge_D_ActlIpc 7;
+BA_ "GenSigStartValue" SG_ 765 AwdRnge_D_ActlIpc 7;
+BA_ "U_P702_MY2021_Rx" SG_ 765 AwdRnge_D_ActlIpc 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 765 AwdRnge_D_ActlIpc 1;
+BA_ "GenSigStartValueInteger" SG_ 765 BalrSwtch_D_Stat 1;
+BA_ "GenSigStartValue" SG_ 765 BalrSwtch_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 765 BalrMde_D_Rq 0;
+BA_ "GenSigStartValueInteger" SG_ 765 WaitToStartLamp_D_Falt 1;
+BA_ "GenSigStartValue" SG_ 765 WaitToStartLamp_D_Falt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 765 WaitToStartLamp_D_Falt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 765 WaitToStartLamp_D_Falt 1;
+BA_ "GenSigStartValueInteger" SG_ 765 EsaOn_B_Rq 1;
+BA_ "GenSigStartValue" SG_ 765 EsaOn_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 765 EsaOn_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 765 Btt_L_Actl 126;
+BA_ "GenSigStartValue" SG_ 765 Btt_L_Actl 126;
+BA_ "U_P702_MY2021_Rx" SG_ 765 SelDrvMdeTxtReset_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 765 SelDrvMdeDsply_B_Avail 1;
+BA_ "CrossOver_InfoCAN" SG_ 765 Mc_VehUnitTempUsrSel_St 1;
+BA_ "CrossOver_InfoCAN" SG_ 559 EhData2_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 559 EhData2_No_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 559 EhData2_No_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 558 EhData1_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 558 EhData1_No_Actl 0;
+BA_ "U_P702_MY2021_Rx" SG_ 558 EhData1_No_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 558 EhData1_No_Actl 1;
+BA_ "GenSigSendType" SG_ 934 CtaAlrtLeft2_D_Stat 3;
+BA_ "GenSigSendType" SG_ 934 CtaBrkLeftMsgTxt_B_Rq 3;
+BA_ "GenSigSendType" SG_ 934 CtaLeftBrkDecel_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 934 CtaLeftBrkDecel_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 934 CtaLeftBrkDecel_B_Rq 1;
+BA_ "GenSigSendType" SG_ 934 CtaLeftBrkEnbl_B_Rq 3;
+BA_ "U_CX727_MY2021_Rx" SG_ 934 CtaLeftBrkEnbl_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 934 CtaLeftBrkEnbl_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 934 Side_Detect_L_Illum 1;
+BA_ "GenSigStartValueInteger" SG_ 934 Side_Detect_L_Illum 100;
+BA_ "GenSigStartValue" SG_ 934 Side_Detect_L_Illum 100;
+BA_ "GenSigSendType" SG_ 934 BttLeft_D_Stat 3;
+BA_ "GenSigSendType" SG_ 934 BttLeft_D_RqDrv 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 CtaSnsLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 934 CtaSnsLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 SodDetctLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 934 SodDetctLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 CtaLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 934 CtaLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 CtaAlrtLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 934 CtaAlrtLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 SodLeft_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 934 SodLeft_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 934 SodLeft_D_Stat 2;
+BA_ "GenSigSendType" SG_ 934 SodLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 SodSnsLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 934 SodSnsLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 SodAlrtLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 934 SodAlrtLeft_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 934 SodWarnLeft_Prd_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 934 SodWarnLeft_Prd_Rq 14;
+BA_ "GenSigStartValue" SG_ 934 SodWarnLeft_Prd_Rq 14;
+BA_ "CrossOver_InfoCAN" SG_ 1072 DrvSlipCtlMde_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1072 DrvSlipCtlMde_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 DrvSlipCtlMde_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 EngIdlShutDown_B_RqDrv 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 EngIdlShutDown_B_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 HsaMde_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1072 HsaMde_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 1072 HsaMde_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 NtrlTowMdeEnbl_B_RqDrv 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 NtrlTowMdeEnbl_B_RqDrv 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 NtrlTowMdeEnbl_B_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 BulbChkActv_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 ParkDetect_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1072 ParkDetect_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 ReducedGuard_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 TRLR_SWAY_CONFIG_CMD 1;
+BA_ "WakeupSignal" SG_ 1072 Power_Liftgate_Mode_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 Power_Liftgate_Mode_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 AccEnbl_B_RqDrv 1;
+BA_ "GenSigStartValueInteger" SG_ 1072 AccEnbl_B_RqDrv 1;
+BA_ "GenSigStartValue" SG_ 1072 AccEnbl_B_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 OdometerMasterValue 1;
+BA_ "UsedOnPgmDBC" SG_ 1072 OdometerMasterValue 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 OdometerMasterValue 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 OdometerMasterValue 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 1072 OdometerMasterValue 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 EngOilLife_B_RqReset 1;
+BA_ "UsedOnPgmDBC" SG_ 1072 EngOilLife_B_RqReset 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 EngOilLife_B_RqReset 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 EngOilLife_B_RqReset 1;
+BA_ "WakeupSignal" SG_ 1072 ePRNDL_MODE 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 ePRNDL_MODE 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 ePRNDL_MODE 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 ePRNDL_MODE 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 DrvSlipCtlMde_B_Rq2 1;
+BA_ "UsedOnPgmDBC" SG_ 1072 DrvSlipCtlMde_B_Rq2 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 DrvSlipCtlMde_B_Rq2 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 MetricActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1072 MetricActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 MetricActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 MetricActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 KeyTypeChngMykey_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 1072 ManRgen_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1072 ManRgen_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 ManRgen_D_Rq 1;
+BA_ "WakeupSignal" SG_ 909 IgnPsswrdDsply_B_Rq 1;
+BA_ "WakeupSignal" SG_ 909 ElPwPoint_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 SecurityMsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 909 HeadLghtHiPrmsn_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 909 HeadLghtHiPrmsn_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 909 HeadLghtHiPrmsn_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 SteWhlLckMsgTxt_D_Rq 1;
+BA_ "WakeupSignal" SG_ 909 immoMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 immoMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 PEBackupSlot_Stats 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 KeyMykeyTot_No_Cnt 1;
+BA_ "MetaData" SG_ 909 KeyMykeyTot_No_Cnt 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 Keycode_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 909 KeyAdmnTot_No_Cnt 1;
+BA_ "MetaData" SG_ 909 KeyAdmnTot_No_Cnt 1;
+BA_ "WakeupSignal" SG_ 963 ImpactEvntFdbck_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 ImpactEvntFdbck_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 963 ImpactEvntFdbck_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoOut_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 963 HeadLampLoOut_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 CrnrLghtRight_Pc_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 CrnrLghtRight_Pc_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 CrnrLghtLeft_Pc_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 CrnrLghtLeft_Pc_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLghtHiFdbck_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 TrnNotInPrkChime_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 963 TrnNotInPrkChime_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 PrkLightChime_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 963 PrkLightChime_B_Rq 1;
+BA_ "WakeupSignal" SG_ 963 KeyInIgnWarn_B_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 KeyInIgnWarn_B_Cmd 1;
+BA_ "UsedOnPgmDBC" SG_ 963 KeyInIgnWarn_B_Cmd 1;
+BA_ "WakeupSignal" SG_ 963 HomeSafeLtChime_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HomeSafeLtChime_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 963 HomeSafeLtChime_B_Rq 1;
+BA_ "WakeupSignal" SG_ 963 StopLghtOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 StopLghtOn_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 963 StopLghtOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 StopLghtOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 RvrseLghtOn_B_Stat 1;
+BA_ "WakeupSignal" SG_ 963 PrkLght_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 PrkLght_D_Stat 1;
+BA_ "WakeupSignal" SG_ 963 HeadLghtSwtch_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLghtSwtch_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 963 HeadLghtSwtch_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 963 HeadLghtSwtch_D_Stat 2;
+BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLghtSwtch_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoFrOn_B_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 963 HeadLampLoFrOn_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 963 HeadLampLoFrOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLampLoFrOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoFlOn_B_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 963 HeadLampLoFlOn_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 963 HeadLampLoFlOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLampLoFlOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoActv_B_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 963 HeadLampLoActv_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 963 HeadLampLoActv_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLampLoActv_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 963 HeadLampLoActv_B_Stat 1;
+BA_ "WakeupSignal" SG_ 963 Headlamp_On_Wrning_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 Headlamp_On_Wrning_Cmd 1;
+BA_ "UsedOnPgmDBC" SG_ 963 Headlamp_On_Wrning_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 Park_Brake_Chime_Rqst 1;
+BA_ "UsedOnPgmDBC" SG_ 963 Park_Brake_Chime_Rqst 1;
+BA_ "WakeupSignal" SG_ 963 HeadLghtHiOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 HeadLghtHiOn_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 963 HeadLghtHiOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLghtHiOn_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 963 HeadLghtHiOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 BrkWarnInd_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 963 BrkWarnInd_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 Brk_Fluid_Lvl_Low 1;
+BA_ "UsedOnPgmDBC" SG_ 963 Brk_Fluid_Lvl_Low 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 ReducedGuard_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 963 ReducedGuard_D_Stat 1;
+BA_ "WakeupSignal" SG_ 963 Perimeter_Alarm_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 Perimeter_Alarm_Status 1;
+BA_ "WakeupSignal" SG_ 963 Courtesy_BSave_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 Courtesy_BSave_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 963 Courtesy_BSave_Stat 1;
+BA_ "GenSigStartValue" SG_ 963 Courtesy_BSave_Stat 1;
+BA_ "WakeupSignal" SG_ 963 WndwGlbl_D_Cmd 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 WndwGlbl_D_Cmd 1;
+BA_ "WakeupSignal" SG_ 963 PudLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 PudLamp_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 DayRnngLampOn_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 963 DayRnngLampOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 963 DayRnngLampOn_B_Stat 1;
+BA_ "WakeupSignal" SG_ 963 PerimeterAlarmChimeRq 1;
+BA_ "CrossOver_InfoCAN" SG_ 963 PerimeterAlarmChimeRq 1;
+BA_ "UsedOnPgmDBC" SG_ 963 PerimeterAlarmChimeRq 1;
+BA_ "UsedOnPgmDBC" SG_ 145 VehYawWActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 145 VehYawWActl_D_Qf 1;
+BA_ "MetaData" SG_ 145 VehYawWActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 145 VehYawWActl_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 145 VehYawWActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 145 VehYawWActl_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 145 VehRolWActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 145 VehRolWActl_D_Qf 1;
+BA_ "MetaData" SG_ 145 VehRolWActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 145 VehRolWActl_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRolWActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 145 VehRolWActl_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 145 VehRollYawW_No_Cs 1;
+BA_ "MetaData" SG_ 145 VehRollYawW_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRollYawW_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 145 VehRollYawW_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 145 VehRollYaw_No_Cnt 1;
+BA_ "MetaData" SG_ 145 VehRollYaw_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRollYaw_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 145 VehRollYaw_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 145 VehYaw_W_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 145 VehYaw_W_Actl 65534;
+BA_ "GenSigStartValue" SG_ 145 VehYaw_W_Actl 65534;
+BA_ "U_CX727_MY2021_Rx" SG_ 145 VehYaw_W_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 145 VehYaw_W_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 145 VehRol_W_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 145 VehRol_W_Actl 65534;
+BA_ "GenSigStartValue" SG_ 145 VehRol_W_Actl 65534;
+BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRol_W_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 145 VehRol_W_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 76 FirstRowBuckleMid 1;
+BA_ "UsedOnPgmDBC" SG_ 76 FirstRowBuckleMid 1;
+BA_ "GenSigStartValueInteger" SG_ 76 FirstRowBuckleMid 3;
+BA_ "GenSigStartValue" SG_ 76 FirstRowBuckleMid 3;
+BA_ "CrossOver_InfoCAN" SG_ 76 SecondRowBucklePsngr 1;
+BA_ "GenSigStartValueInteger" SG_ 76 SecondRowBucklePsngr 3;
+BA_ "GenSigStartValue" SG_ 76 SecondRowBucklePsngr 3;
+BA_ "CrossOver_InfoCAN" SG_ 76 SecondRowBuckleMid 1;
+BA_ "GenSigStartValueInteger" SG_ 76 SecondRowBuckleMid 3;
+BA_ "GenSigStartValue" SG_ 76 SecondRowBuckleMid 3;
+BA_ "CrossOver_InfoCAN" SG_ 76 SecondRowBuckleDriver 1;
+BA_ "GenSigStartValueInteger" SG_ 76 SecondRowBuckleDriver 3;
+BA_ "GenSigStartValue" SG_ 76 SecondRowBuckleDriver 3;
+BA_ "CrossOver_InfoCAN" SG_ 76 FirstRowBuckleDriver 1;
+BA_ "UsedOnPgmDBC" SG_ 76 FirstRowBuckleDriver 1;
+BA_ "GenSigStartValueInteger" SG_ 76 FirstRowBuckleDriver 3;
+BA_ "GenSigStartValue" SG_ 76 FirstRowBuckleDriver 3;
+BA_ "U_P702_MY2021_Rx" SG_ 76 FirstRowBuckleDriver 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 76 FirstRowBuckleDriver 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 76 FirstRowBuckleDriver 1;
+BA_ "CrossOver_InfoCAN" SG_ 76 RILReq 1;
+BA_ "UsedOnPgmDBC" SG_ 76 RILReq 1;
+BA_ "CrossOver_InfoCAN" SG_ 76 FirstRowBucklePsngr 1;
+BA_ "UsedOnPgmDBC" SG_ 76 FirstRowBucklePsngr 1;
+BA_ "GenSigStartValueInteger" SG_ 76 FirstRowBucklePsngr 3;
+BA_ "GenSigStartValue" SG_ 76 FirstRowBucklePsngr 3;
+BA_ "WakeupSignal" SG_ 76 RstrnImpactEvntStatus 1;
+BA_ "CrossOver_InfoCAN" SG_ 76 RstrnImpactEvntStatus 1;
+BA_ "UsedOnPgmDBC" SG_ 76 RstrnImpactEvntStatus 1;
+BA_ "U_P702_MY2021_Rx" SG_ 76 RstrnImpactEvntStatus 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 76 RstrnImpactEvntStatus 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 76 RstrnImpactEvntStatus 1;
+BA_ "CrossOver_InfoCAN" SG_ 76 PsngrFrntDetct_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 76 PsngrFrntDetct_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 76 PsngrFrntDetct_D_Actl 3;
+BA_ "GenSigStartValue" SG_ 76 PsngrFrntDetct_D_Actl 3;
+BA_ "CrossOver_InfoCAN" SG_ 76 EDRTriggerEvntSync 1;
+BA_ "CrossOver_InfoCAN" SG_ 76 PassRstrnInd_Req 1;
+BA_ "GenSigStartValueInteger" SG_ 76 PassRstrnInd_Req 3;
+BA_ "GenSigStartValue" SG_ 76 PassRstrnInd_Req 3;
+BA_ "UsedOnPgmDBC" SG_ 65 immoControlData_T1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 65 immoControlData_T1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 65 immoControlData_T1 1;
+BA_ "UsedOnPgmDBC" SG_ 65 immoControlCmd_T1 1;
+BA_ "U_P702_MY2021_Rx" SG_ 65 immoControlCmd_T1 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 65 immoControlCmd_T1 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 HILL_DESC_SW 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 HILL_DESC_SW 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 HILL_DESC_SW 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 HILL_DESC_SW 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 AutoRgen_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 AutoRgen_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1076 W2S_LAMP_OK 1;
+BA_ "GenSigStartValue" SG_ 1076 W2S_LAMP_OK 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 OdoTripRx_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 OdoTripRx_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 OdoTripRx_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 Veh_V_CompLimMx 1;
+BA_ "GenSigStartValueInteger" SG_ 1076 Veh_V_CompLimMx 4095;
+BA_ "GenSigStartValue" SG_ 1076 Veh_V_CompLimMx 4093;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 Veh_V_CompLimMx 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 Veh_V_CompLimMx 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 DrvSlipCtlMde_B_RqMyKey 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 DrvSlipCtlMde_B_RqMyKey 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvlWarn_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 FuelSecndActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvlPssvSide_No_Raw 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 FuelLvlPssvSide_No_Raw 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 FuelLvlPssvSide_No_Raw 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FuelLvlPssvSide_No_Raw 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 FUEL_SENSOR_NUM 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 FUEL_SENSOR_NUM 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 FUEL_SENSOR_NUM 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FUEL_SENSOR_NUM 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvlActvSide_No_Raw 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 FuelLvlActvSide_No_Raw 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 FuelLvlActvSide_No_Raw 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FuelLvlActvSide_No_Raw 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvl_Pc_Dsply 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 FuelLvl_Pc_Dsply 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 FuelLvl_Pc_Dsply 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FuelLvl_Pc_Dsply 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 DISPLAY_SPEED_SCALING 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 DISPLAY_SPEED_SCALING 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 DISPLAY_SPEED_SCALING 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 DISPLAY_SPEED_SCALING 1;
+BA_ "CrossOver_InfoCAN" SG_ 1076 DISPLAY_SPEED_OFFSET 1;
+BA_ "UsedOnPgmDBC" SG_ 1076 DISPLAY_SPEED_OFFSET 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1076 DISPLAY_SPEED_OFFSET 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 DISPLAY_SPEED_OFFSET 1;
+BA_ "GenSigStartValueInteger" SG_ 862 AutoStpHvacDelta_I_Est 192;
+BA_ "U_P702_MY2021_Rx" SG_ 862 HvacBlwrFront_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 862 HvacBlwrFront_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 862 CabnAmb_Te_Actl 114;
+BA_ "GenSigStartValue" SG_ 862 CabnAmb_Te_Actl 0;
+BA_ "U_P702_MY2021_Rx" SG_ 862 CabnAmb_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 862 HvacRemoteStrt_N_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 862 HvacRemoteStrt_N_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 862 HvacRemoteStrt_N_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 862 ClimtThrmlLoad_No_Actl 255;
+BA_ "GenSigStartValue" SG_ 862 ClimtThrmlLoad_No_Actl 255;
+BA_ "U_P702_MY2021_Rx" SG_ 862 ClimtThrmlLoad_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 PtWakeReas_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 VehOnSrc_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 VehOnSrc_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 StrtrMtrCtlDStat_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 StrtrMtrCtlDStat_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 EngStrtActv_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 EngStrtActv_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 EngStrt_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 EngStrt_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 DrvInCtl_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 DrvInCtl_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 AdvStrt_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 AdvStrt_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 931 CrnkInhbt_No_Cs 1;
+BA_ "ContentDependant" SG_ 931 CrnkInhbt_No_Cs 1;
+BA_ "MetaData" SG_ 931 CrnkInhbt_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 CrnkInhbt_No_Cs 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 CrnkInhbt_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 931 CrnkInhbt_No_Cnt 1;
+BA_ "ContentDependant" SG_ 931 CrnkInhbt_No_Cnt 1;
+BA_ "MetaData" SG_ 931 CrnkInhbt_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 CrnkInhbt_No_Cnt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 CrnkInhbt_No_Cnt 1;
+BA_ "GenSigStartValueInteger" SG_ 931 CrnkInhbt_B_Stat 1;
+BA_ "GenSigStartValue" SG_ 931 CrnkInhbt_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 CrnkInhbt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 CrnkInhbt_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 931 IgnPreOffActv_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 IgnPreOffActv_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 PtLatchActv_B_RqBcm 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 PtLatchActv_B_RqBcm 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 immoSecureIdleMode 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 immoSecureIdleMode 1;
+BA_ "WakeupSignal" SG_ 578 ReFuelSwtchStat_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 FuelPumpPwr_D_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 FuelPumpPwr_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 578 BattULo_U_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 578 BattULo_U_Actl 255;
+BA_ "GenSigStartValue" SG_ 578 BattULo_U_Actl 255;
+BA_ "U_P702_MY2021_Rx" SG_ 578 BattULo_U_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 BattULo_U_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 578 BattULo_U_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 578 PrkLckCtl_B_Enbl 1;
+BA_ "WakeupSignal" SG_ 578 PrkLckCtlMsgTxt_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 578 PrkLckCtlMsgTxt_D_Rq 1;
+BA_ "WakeupSignal" SG_ 578 PrkLckCtlAvail_T_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 578 PrkLckCtlAvail_T_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 BrkTrnShifLck_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 BrkTrnShifLck_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 578 DriverCrankingReq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 DriverCrankingReq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 DriverCrankingReq 1;
+BA_ "UsedOnPgmDBC" SG_ 578 EngOff_T_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 EngOff_T_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 EngOff_T_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 578 EngOff_T_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 578 DcacElPw_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 578 DcacElPw_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 DcacElPw_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 578 BattULo_I_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 578 BattULo_I_Actl 16383;
+BA_ "GenSigStartValue" SG_ 578 BattULo_I_Actl 16383;
+BA_ "U_P702_MY2021_Rx" SG_ 578 BattULo_I_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 BattULo_I_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DimmingLvlEvnt_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatDrvErrCnt_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 DrStatDrvErrCnt_B_Stat 1;
+BA_ "WakeupSignal" SG_ 947 TurnLghtRight_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtRight_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 TurnLghtRight_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtRightOn_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 947 TurnLghtRightOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtLeftOn_B_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 947 TurnLghtLeftOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 FogLghtRearOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 FogLghtRearOn_B_Stat 1;
+BA_ "WakeupSignal" SG_ 947 Backlit_LED_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Backlit_LED_Status 1;
+BA_ "WakeupSignal" SG_ 947 TurnLghtLeft_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtLeft_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 TurnLghtLeft_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 FogLghtFrontOn_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 FogLghtFrontOn_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 IgnKeyType_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 947 IgnKeyType_D_Actl 14;
+BA_ "GenSigStartValue" SG_ 947 IgnKeyType_D_Actl 14;
+BA_ "U_P702_MY2021_Rx" SG_ 947 IgnKeyType_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 IgnKeyType_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 947 IgnKeyType_D_Actl 1;
+BA_ "WakeupSignal" SG_ 947 Parklamp_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Parklamp_Status 1;
+BA_ "UsedOnPgmDBC" SG_ 947 Parklamp_Status 1;
+BA_ "GenSigStartValueInteger" SG_ 947 Parklamp_Status 1;
+BA_ "GenSigStartValue" SG_ 947 Parklamp_Status 1;
+BA_ "WakeupSignal" SG_ 947 Litval 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Litval 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 Litval 1;
+BA_ "WakeupSignal" SG_ 947 Key_In_Ignition_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Key_In_Ignition_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 947 Key_In_Ignition_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 947 Key_In_Ignition_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 Key_In_Ignition_Stat 1;
+BA_ "WakeupSignal" SG_ 947 Ignition_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Ignition_Status 1;
+BA_ "UsedOnPgmDBC" SG_ 947 Ignition_Status 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 Ignition_Status 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 Ignition_Status 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 947 Ignition_Status 1;
+BA_ "WakeupSignal" SG_ 947 Dimming_Lvl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Dimming_Lvl 1;
+BA_ "GenSigStartValueInteger" SG_ 947 Dimming_Lvl 12;
+BA_ "GenSigStartValue" SG_ 947 Dimming_Lvl 12;
+BA_ "WakeupSignal" SG_ 947 Day_Night_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Day_Night_Status 1;
+BA_ "UsedOnPgmDBC" SG_ 947 Day_Night_Status 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 Day_Night_Status 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 Day_Night_Status 1;
+BA_ "WakeupSignal" SG_ 947 Remote_Start_Status 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Remote_Start_Status 1;
+BA_ "WakeupSignal" SG_ 947 DrStatTgate_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatTgate_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DrStatRr_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatRr_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatRr_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DrStatRl_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatRl_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatRl_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DrStatPsngr_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatPsngr_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatPsngr_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DrStatInnrTgate_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatInnrTgate_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DrStatHood_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatHood_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 DrStatDrv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 DrStatDrv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 947 DrStatDrv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatDrv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 DrStatDrv_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 947 DrStatDrv_B_Actl 1;
+BA_ "WakeupSignal" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "ContentDependant" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 947 PrkBrkActv_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 LifeCycMde_D_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 947 LifeCycMde_D_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 947 LifeCycMde_D_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 LifeCycMde_D_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 947 LifeCycMde_D_Actl 1;
+BA_ "WakeupSignal" SG_ 947 Delay_Accy 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 Delay_Accy 1;
+BA_ "WakeupSignal" SG_ 947 CrashEvnt_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 CrashEvnt_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 947 CrashEvnt_D_Stat 3;
+BA_ "GenSigStartValue" SG_ 947 CrashEvnt_D_Stat 3;
+BA_ "CrossOver_InfoCAN" SG_ 947 FuelPmpInhbt_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 947 BodySrvcRqd_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BattULoChrg_URate_RqMx 1;
+BA_ "GenSigStartValueInteger" SG_ 1084 BattULoChrg_URate_RqMx 5;
+BA_ "GenSigStartValue" SG_ 1084 BattULoChrg_URate_RqMx 5;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoChrg_URate_RqMx 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoChrg_URate_RqMx 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BattULoChrg_U_RqMx 1;
+BA_ "GenSigStartValueInteger" SG_ 1084 BattULoChrg_U_RqMx 34;
+BA_ "GenSigStartValue" SG_ 1084 BattULoChrg_U_RqMx 34;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoChrg_U_RqMx 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoChrg_U_RqMx 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BattULoChrg_U_RqMn 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoChrg_U_RqMn 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoChrg_U_RqMn 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BattULoState_D_Qlty 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoState_D_Qlty 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoState_D_Qlty 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BSFault 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BSFault 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSFault 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BattULo2_Te_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 1084 BattULo2_Te_Actl 127;
+BA_ "GenSigStartValue" SG_ 1084 BattULo2_Te_Actl 127;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULo2_Te_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULo2_Te_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BSBattSOC 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BSBattSOC 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSBattSOC 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BSBattQDeltaRideAh 1;
+BA_ "GenSigStartValueInteger" SG_ 1084 BSBattQDeltaRideAh 12800;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BSBattQDeltaRideAh 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSBattQDeltaRideAh 1;
+BA_ "UsedOnPgmDBC" SG_ 1084 BSBattQCapAh 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1084 BSBattQCapAh 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSBattQCapAh 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 EngStrtInhbt_B_RqBatt 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 EngStrtInhbt_B_RqBatt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 BattULoChrg_D_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 BattULoChrg_D_Rq 1;
+BA_ "WakeupSignal" SG_ 1068 PwSysULoFalt_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1068 PwSysULoFalt_D_Stat 1;
+BA_ "UsedOnPgmDBC" SG_ 1068 PwSysULoFalt_D_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1068 Shed_T_Eng_Off_B 1;
+BA_ "WakeupSignal" SG_ 1068 Shed_Feature_Group_ID 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 Shed_Feature_Group_ID 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 Shed_Feature_Group_ID 1;
+BA_ "CrossOver_InfoCAN" SG_ 1068 Shed_Drain_Eng_Off_B 1;
+BA_ "WakeupSignal" SG_ 1068 Shed_Level_Req 1;
+BA_ "CrossOver_InfoCAN" SG_ 1068 Shed_Level_Req 1;
+BA_ "UsedOnPgmDBC" SG_ 1068 Shed_Level_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 Shed_Level_Req 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 Shed_Level_Req 1;
+BA_ "UsedOnPgmDBC" SG_ 1068 ULoRgenTestMde_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 ULoRgenTestMde_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 ULoRgenTestMde_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 ChargeMode 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 ChargeMode 1;
+BA_ "CrossOver_InfoCAN" SG_ 1068 Batt_Lo_SoC_B 1;
+BA_ "UsedOnPgmDBC" SG_ 1068 PeriodicElLoad_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 1068 PeriodicElLoad_B_Stat 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 PeriodicElLoad_B_Stat 1;
+BA_ "CrossOver_InfoCAN" SG_ 1068 Batt_Crit_SoC_B 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehVert2_A_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 146 VehVert2_A_Actl 8190;
+BA_ "GenSigStartValue" SG_ 146 VehVert2_A_Actl 8190;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehVert2_A_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehVert2_A_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehVert2_A_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehLatLongVertA_No_Cs 1;
+BA_ "MetaData" SG_ 146 VehLatLongVertA_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLatLongVertA_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehLatLongVertA_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehLatLongVert_No_Cnt 1;
+BA_ "MetaData" SG_ 146 VehLatLongVert_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLatLongVert_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehLatLongVert_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehLong2_A_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 146 VehLong2_A_Actl 8190;
+BA_ "GenSigStartValue" SG_ 146 VehLong2_A_Actl 8190;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehLong2_A_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehLong2_A_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLong2_A_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehLat2_A_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 146 VehLat2_A_Actl 8190;
+BA_ "GenSigStartValue" SG_ 146 VehLat2_A_Actl 8190;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehLat2_A_Actl 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehLat2_A_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLat2_A_Actl 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehVertAActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 146 VehVertAActl_D_Qf 1;
+BA_ "MetaData" SG_ 146 VehVertAActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 146 VehVertAActl_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehVertAActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehVertAActl_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "MetaData" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLongAActl_D_Qf 1;
+BA_ "UsedOnPgmDBC" SG_ 146 VehLatAActl_D_Qf 1;
+BA_ "GenSigStartValueInteger" SG_ 146 VehLatAActl_D_Qf 1;
+BA_ "MetaData" SG_ 146 VehLatAActl_D_Qf 1;
+BA_ "GenSigStartValue" SG_ 146 VehLatAActl_D_Qf 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLatAActl_D_Qf 1;
+BA_ "U_P702_MY2021_Rx" SG_ 146 VehLatAActl_D_Qf 1;
+BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 3;
+BA_ "GenSigSendType" SG_ 1806 TesterPhysicalResIPMA 3;
+BA_ "CrossOver_InfoCAN" SG_ 997 PersIndexCcm_D_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 997 PersIndexCcm_D_Actl 4;
+BA_ "GenSigStartValue" SG_ 997 PersIndexCcm_D_Actl 4;
+BA_ "GenSigSendType" SG_ 997 PersIndexCcm_D_Actl 3;
+BA_ "CrossOver_InfoCAN" SG_ 997 FeatNoCcmActl 1;
+BA_ "GenSigSendType" SG_ 997 FeatNoCcmActl 3;
+BA_ "CrossOver_InfoCAN" SG_ 997 FeatConfigCcmActl 1;
+BA_ "GenSigSendType" SG_ 997 FeatConfigCcmActl 3;
+BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjRelLong_V_Actl 1022;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjRelLong_V_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjRelLong_V_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjRelLat_V_Actl 510;
+BA_ "GenSigStartValue" SG_ 983 CmbbObjRelLat_V_Actl 510;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjRelLat_V_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjRelLat_V_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjDistLong_L_Actl 1022;
+BA_ "GenSigStartValue" SG_ 983 CmbbObjDistLong_L_Actl 1022;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjDistLong_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjDistLong_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjDistLat_L_Actl 510;
+BA_ "GenSigStartValue" SG_ 983 CmbbObjDistLat_L_Actl 510;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjDistLat_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjDistLat_L_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjConfdnc_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjConfdnc_D_Stat 1;
+BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjColl_T_Actl 126;
+BA_ "GenSigStartValue" SG_ 983 CmbbObjColl_T_Actl 125;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjColl_T_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjColl_T_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjClass_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjClass_D_Stat 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 983 EsaEnbl_D2_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 983 EsaEnbl_D2_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1DistRigh_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1DistLeft_D_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbMde1_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbIntns1_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Up_An_Rq 510;
+BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Up_An_Rq 509;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Up_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Right_An_Rq 2046;
+BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Right_An_Rq 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Right_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Low_An_Rq 510;
+BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Low_An_Rq 509;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Low_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Left_An_Rq 2046;
+BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Left_An_Rq 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Left_An_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1CritRigh_T_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1CritLeft_T_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlRng_L_Max 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlRng_L_Max 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 HandsOffCnfm_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 HandsOffCnfm_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtl_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtl_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlRampType_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlRampType_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlPrecision_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlPrecision_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 979 LatCtlPathOffst_L_Actl 512;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlPathOffst_L_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlPathOffst_L_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 979 LatCtlPath_An_Actl 1000;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlPath_An_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlPath_An_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 979 LatCtlCurv_NoRate_Actl 4096;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlCurv_NoRate_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlCurv_NoRate_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 979 LatCtlCurv_No_Actl 1000;
+BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlCurv_No_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlCurv_No_Actl 1;
+BA_ "GenSigStartValueInteger" SG_ 976 SrpHghtRight_L_Actl 256;
+BA_ "GenSigStartValueInteger" SG_ 976 SrpHghtLeft_L_Actl 256;
+BA_ "GenSigSendType" SG_ 973 TsrVl2PrmntMsgTxt_D_Rq 3;
+BA_ "GenSigSendType" SG_ 973 TsrVl1PrmntMsgTxt_D_Rq 3;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrVl2RstrcMsgTxt2_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 973 TsrVl2RstrcMsgTxt2_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrVl2RstrcMsgTxt2_D_Rq 3;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrVl1RstrcMsgTxt2_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 973 TsrVl1RstrcMsgTxt2_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrVl1RstrcMsgTxt2_D_Rq 3;
+BA_ "GenSigSendType" SG_ 973 TsrOvtkMsgTxt2_D_Rq 3;
+BA_ "GenSigSendType" SG_ 973 WwaWarn_B_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVlUnitMsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrVlUnitMsgTxt_D_Rq 2;
+BA_ "GenSigStartValue" SG_ 973 TsrVlUnitMsgTxt_D_Rq 2;
+BA_ "GenSigSendType" SG_ 973 TsrVlUnitMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVLim2MsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrVLim2MsgTxt_D_Rq 255;
+BA_ "GenSigStartValue" SG_ 973 TsrVLim2MsgTxt_D_Rq 255;
+BA_ "GenSigSendType" SG_ 973 TsrVLim2MsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVLim1MsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrVLim1MsgTxt_D_Rq 255;
+BA_ "GenSigStartValue" SG_ 973 TsrVLim1MsgTxt_D_Rq 255;
+BA_ "GenSigSendType" SG_ 973 TsrVLim1MsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl2StatMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrVl2StatMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl2RstrcMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrVl2RstrcMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl1StatMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrVl1StatMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl1RstrcMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrVl1RstrcMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrStatMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrStatMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrOvtkStatMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrOvtkStatMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrOvtkMsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrOvtkMsgTxt_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 973 TsrOvtkMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrOvtkMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrOswWarnMsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrOswWarnMsgTxt_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 973 TsrOswWarnMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrOswWarnMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 973 TsrMsgTxt_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 973 TsrMsgTxt_D_Rq 1;
+BA_ "GenSigStartValue" SG_ 973 TsrMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 973 TsrMsgTxt_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LkaDrvOvrrd_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 970 LkaActvStats_D2_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LkaActvStats_D2_Req 1;
+BA_ "GenSigStartValueInteger" SG_ 970 LaRefAng_No_Req 2048;
+BA_ "U_CX727_MY2021_Rx" SG_ 970 LaRefAng_No_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LaRefAng_No_Req 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 970 LaRampType_B_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LaRampType_B_Req 1;
+BA_ "GenSigStartValueInteger" SG_ 970 LaCurvature_No_Calc 2048;
+BA_ "U_CX727_MY2021_Rx" SG_ 970 LaCurvature_No_Calc 1;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LaCurvature_No_Calc 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 970 LdwActvStats_D_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LdwActvStats_D_Req 1;
+BA_ "CrossOver_InfoCAN" SG_ 970 LdwActvIntns_D_Req 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 970 LdwActvIntns_D_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 970 LdwActvIntns_D_Req 1;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3DistRigh_D_Stat 1;
+BA_ "GenSigSendType" SG_ 962 AdbBrdr3DistRigh_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3DistLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 962 AdbBrdr3DistLeft_D_Stat 3;
+BA_ "GenSigSendType" SG_ 962 AdbMde3_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbMde3_D_Rq 1;
+BA_ "GenSigSendType" SG_ 962 AdbIntns3_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbIntns3_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Up_An_Rq 510;
+BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Up_An_Rq 509;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Up_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Right_An_Rq 2046;
+BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Right_An_Rq 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Right_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Low_An_Rq 510;
+BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Low_An_Rq 509;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Low_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Left_An_Rq 2046;
+BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Left_An_Rq 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Left_An_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3CritRigh_T_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3CritLeft_T_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2DistRigh_D_Stat 1;
+BA_ "GenSigSendType" SG_ 961 AdbBrdr2DistRigh_D_Stat 3;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2DistLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 961 AdbBrdr2DistLeft_D_Stat 3;
+BA_ "GenSigSendType" SG_ 961 AdbMde2_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbMde2_D_Rq 1;
+BA_ "GenSigSendType" SG_ 961 AdbIntns2_D_Rq 3;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbIntns2_D_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Up_An_Rq 510;
+BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Up_An_Rq 509;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Up_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Right_An_Rq 2046;
+BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Right_An_Rq 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Right_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Low_An_Rq 510;
+BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Low_An_Rq 509;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Low_An_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Left_An_Rq 2046;
+BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Left_An_Rq 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Left_An_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2CritRigh_T_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2CritLeft_T_Stat 1;
+BA_ "MetaData" SG_ 394 HaDsply_No_Cs 1;
+BA_ "ContentDependant" SG_ 394 HaDsply_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 394 HaDsply_No_Cs 1;
+BA_ "GenSigSendType" SG_ 394 HaDsply_No_Cs 3;
+BA_ "MetaData" SG_ 394 HaDsply_No_Cnt 1;
+BA_ "ContentDependant" SG_ 394 HaDsply_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 394 HaDsply_No_Cnt 1;
+BA_ "GenSigSendType" SG_ 394 HaDsply_No_Cnt 3;
+BA_ "GenSigSendType" SG_ 394 AccStopStat_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccTrgDist2_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 AccTrgDist2_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccStopRes_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 AccStopRes_B_Dsply 3;
+BA_ "GenSigSendType" SG_ 394 TjaWarn_D_Rq 3;
+BA_ "GenSigSendType" SG_ 394 Tja_D_Stat 3;
+BA_ "GenSigSendType" SG_ 394 TjaMsgTxt_D_Dsply 3;
+BA_ "GenSigSendType" SG_ 394 IaccLamp_D_Rq 3;
+BA_ "GenSigSendType" SG_ 394 AccMsgTxt_D2_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 FcwDeny_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 FcwDeny_B_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 FcwMemStat_B_Actl 1;
+BA_ "GenSigSendType" SG_ 394 FcwMemStat_B_Actl 3;
+BA_ "ECGUsedRxSignal" SG_ 394 FcwMemStat_B_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccTGap_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 AccTGap_B_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 CadsAlignIncplt_B_Actl 1;
+BA_ "GenSigSendType" SG_ 394 CadsAlignIncplt_B_Actl 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccFllwMde_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 AccFllwMde_B_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 CadsRadrBlck_B_Actl 1;
+BA_ "GenSigSendType" SG_ 394 CadsRadrBlck_B_Actl 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 CmbbPostEvnt_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 CmbbPostEvnt_B_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccStopMde_B_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 AccStopMde_B_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 FcwMemSens_D_Actl 1;
+BA_ "GenSigSendType" SG_ 394 FcwMemSens_D_Actl 3;
+BA_ "ECGUsedRxSignal" SG_ 394 FcwMemSens_D_Actl 1;
+BA_ "CrossOver_InfoCAN" SG_ 394 FcwMsgTxt_D_Rq 1;
+BA_ "GenSigSendType" SG_ 394 FcwMsgTxt_D_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccWarn_D_Dsply 1;
+BA_ "GenSigSendType" SG_ 394 AccWarn_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 FcwVisblWarn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 394 FcwVisblWarn_B_Rq 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 FcwAudioWarn_B_Rq 1;
+BA_ "GenSigSendType" SG_ 394 FcwAudioWarn_B_Rq 3;
+BA_ "ECGUsedRxSignal" SG_ 394 FcwAudioWarn_B_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccTGap_D_Dsply 1;
+BA_ "GenSigStartValueInteger" SG_ 394 AccTGap_D_Dsply 3;
+BA_ "GenSigStartValue" SG_ 394 AccTGap_D_Dsply 3;
+BA_ "GenSigSendType" SG_ 394 AccTGap_D_Dsply 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 AccMemEnbl_B_RqDrv 1;
+BA_ "GenSigStartValueInteger" SG_ 394 AccMemEnbl_B_RqDrv 1;
+BA_ "GenSigStartValue" SG_ 394 AccMemEnbl_B_RqDrv 1;
+BA_ "GenSigSendType" SG_ 394 AccMemEnbl_B_RqDrv 3;
+BA_ "CrossOver_InfoCAN" SG_ 394 FdaMem_B_Stat 1;
+BA_ "GenSigSendType" SG_ 394 FdaMem_B_Stat 3;
+BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_No_Cnt 1;
+BA_ "MetaData" SG_ 391 CmbbBrkDecel_No_Cnt 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cnt 1;
+BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cnt 1;
+BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_No_Cs 1;
+BA_ "MetaData" SG_ 391 CmbbBrkDecel_No_Cs 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cs 1;
+BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cs 1;
+BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_A_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 391 CmbbBrkDecel_A_Rq 5129;
+BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_A_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_A_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkPrchg_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkPrchg_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkPrchg_D_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 391 CmbbBrkPrchg_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_B_Rq 1;
+BA_ "ECGUsedRxSignal" SG_ 391 CmbbBrkDecel_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 391 CmbbBaSens_D_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBaSens_D_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBaSens_D_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 390 AccBrkTot_A_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 390 AccBrkTot_A_Rq 5129;
+BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkTot_A_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkTot_A_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccPrpl_A_Pred 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccPrpl_A_Pred 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccVeh_V_Trg 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccVeh_V_Trg 1;
+BA_ "UsedOnPgmDBC" SG_ 390 AccBrkPrkEl_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkPrkEl_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkPrkEl_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 390 CmbbDeny_B_Actl 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 390 CmbbDeny_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 CmbbDeny_B_Actl 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 CmbbEngTqMn_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 CmbbEngTqMn_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccPrpl_A_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccPrpl_A_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccDeny_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccDeny_B_Rq 1;
+BA_ "WakeupSignal" SG_ 390 AccResumEnbl_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccResumEnbl_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccResumEnbl_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 390 AccCancl_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccCancl_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccCancl_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 390 AccBrkPrchg_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkPrchg_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkPrchg_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 390 AccBrkDecel_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkDecel_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkDecel_B_Rq 1;
+BA_ "UsedOnPgmDBC" SG_ 390 AccStopStat_B_Rq 1;
+BA_ "U_CX727_MY2021_Rx" SG_ 390 AccStopStat_B_Rq 1;
+BA_ "U_P702_MY2021_Rx" SG_ 390 AccStopStat_B_Rq 1;
+BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccStopStat_B_Rq 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_GWOnBoardTester 255;
+BA_ "ContentDependant" SG_ 1441 TCCM_GWOnBoardTester 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_GWOnBoardTester 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_GWOnBoardTester 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_GWNMProxy 255;
+BA_ "ContentDependant" SG_ 1441 TCCM_GWNMProxy 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_GWNMProxy 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_GWNMProxy 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved4 255;
+BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved4 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved4 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved3 255;
+BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved3 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved3 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved2 255;
+BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved2 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved2 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved1 255;
+BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved1 255;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved1 1;
+BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMNodeId 161;
+BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMNodeId 1;
+BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMNodeId 161;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMNodeId 1;
+BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMControl 1;
+BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMControl 1;
+BA_ "GenSigSendType" SG_ 1787 TesterPhysicalResSODCMD 3;
+BA_ "GenSigSendType" SG_ 1779 TesterPhysicalReqSODCMD 3;
+BA_ "GenSigSendType" SG_ 1786 TesterPhysicalResSODCMC 3;
+BA_ "GenSigSendType" SG_ 1778 TesterPhysicalReqSODCMC 3;
+BA_ "CrossOver_InfoCAN" SG_ 1153 TerrMde_D_RqDrv 1;
+BA_ "UsedOnPgmDBC" SG_ 1153 TerrMde_D_RqDrv 1;
+BA_ "GenSigSendType" SG_ 942 PrkAidRdiusRight_L_Dsply 3;
+BA_ "GenSigSendType" SG_ 942 PrkAidRdiusLeft_L_Dsply 3;
+BA_ "GenSigSendType" SG_ 942 PrkAidDrvDir_D_Stat 3;
+BA_ "GenSigSendType" SG_ 942 PrkAidAcsyRear_D_Stat 3;
+BA_ "GenSigSendType" SG_ 942 PrkAidAcsyFront_D_Stat 3;
+BA_ "GenSigSendType" SG_ 930 BalrWndwRight_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 930 BalrSnsRight_D_Falt 0;
+BA_ "GenSigSendType" SG_ 930 BalrSnsRight_D_Falt 3;
+BA_ "GenSigStartValueInteger" SG_ 930 WndwPsngrRear_D_RqBalrr 0;
+BA_ "GenSigSendType" SG_ 930 WndwPsngrRear_D_RqBalrr 3;
+BA_ "GenSigStartValueInteger" SG_ 930 WndwPsngr_D_RqBalrr 0;
+BA_ "GenSigSendType" SG_ 930 WndwPsngr_D_RqBalrr 3;
+BA_ "GenSigStartValueInteger" SG_ 930 WndwDrvRear_D_RqBalrr 0;
+BA_ "GenSigSendType" SG_ 930 WndwDrvRear_D_RqBalrr 3;
+BA_ "GenSigStartValueInteger" SG_ 930 WndwDrv_D_RqBalrr 0;
+BA_ "GenSigSendType" SG_ 930 WndwDrv_D_RqBalrr 3;
+BA_ "GenSigStartValueInteger" SG_ 930 BalrRight_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 930 BalrRight_D_Stat 2;
+BA_ "GenSigSendType" SG_ 930 BalrRight_D_Stat 3;
+BA_ "GenSigSendType" SG_ 930 BalrMdeSelRight_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 930 BalrMdeRight_D_Stat 1;
+BA_ "GenSigStartValue" SG_ 930 BalrMdeRight_D_Stat 1;
+BA_ "GenSigSendType" SG_ 930 BalrMdeRight_D_Stat 3;
+BA_ "GenSigSendType" SG_ 930 BalrLckRight_B_Stat 3;
+BA_ "GenSigSendType" SG_ 930 BalrChimeRight_D_Rq 3;
+BA_ "GenSigSendType" SG_ 930 CamraRearOn_B_RqBalrr 3;
+BA_ "GenSigSendType" SG_ 930 DrLckCnt_No_ActlBalrr 3;
+BA_ "GenSigSendType" SG_ 930 DrLckActv_B_RqBalrr 3;
+BA_ "GenSigSendType" SG_ 929 BalrChimeLeft_D_Rq 3;
+BA_ "GenSigStartValueInteger" SG_ 929 BalrLeft_D_Stat 2;
+BA_ "GenSigStartValue" SG_ 929 BalrLeft_D_Stat 2;
+BA_ "GenSigSendType" SG_ 929 BalrLeft_D_Stat 3;
+BA_ "GenSigSendType" SG_ 929 BalrWndwLeft_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 929 WndwPsngrRear_D_RqBalrl 0;
+BA_ "GenSigSendType" SG_ 929 WndwPsngrRear_D_RqBalrl 3;
+BA_ "GenSigStartValueInteger" SG_ 929 WndwPsngr_D_RqBalrl 0;
+BA_ "GenSigSendType" SG_ 929 WndwPsngr_D_RqBalrl 3;
+BA_ "GenSigStartValueInteger" SG_ 929 WndwDrvRear_D_RqBalrl 0;
+BA_ "GenSigSendType" SG_ 929 WndwDrvRear_D_RqBalrl 3;
+BA_ "GenSigStartValueInteger" SG_ 929 WndwDrv_D_RqBalrl 0;
+BA_ "GenSigSendType" SG_ 929 WndwDrv_D_RqBalrl 3;
+BA_ "GenSigStartValueInteger" SG_ 929 BalrSnsLeft_D_Falt 0;
+BA_ "GenSigSendType" SG_ 929 BalrSnsLeft_D_Falt 3;
+BA_ "GenSigSendType" SG_ 929 BalrMdeSelLeft_B_Stat 3;
+BA_ "GenSigStartValueInteger" SG_ 929 BalrMdeLeft_D_Stat 1;
+BA_ "GenSigStartValue" SG_ 929 BalrMdeLeft_D_Stat 1;
+BA_ "GenSigSendType" SG_ 929 BalrMdeLeft_D_Stat 3;
+BA_ "GenSigSendType" SG_ 929 BalrLckLeft_B_Stat 3;
+BA_ "GenSigSendType" SG_ 929 CamraRearOn_B_RqBalrl 3;
+BA_ "GenSigSendType" SG_ 929 DrLckCnt_No_ActlBalrl 3;
+BA_ "GenSigSendType" SG_ 929 DrLckActv_B_RqBalrl 3;
+BA_ "CrossOver_InfoCAN" SG_ 402 ApaMdeStat_D_RqDrv 1;
+BA_ "CrossOver_InfoCAN" SG_ 402 CamraZoomMan_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 402 CamraOvrlStat_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 402 CamraOvrlDyn_D_Rq 1;
+BA_ "CrossOver_InfoCAN" SG_ 402 CamAutoTowbarZoom 1;
+BA_ "CrossOver_InfoCAN" SG_ 402 DistanceBarSetting 1;
+BA_ "GenSigStartValue" SG_ 924 DcacOut_Pw_Mx 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 924 DcacOut_Pw_Mx 1;
+BA_ "GenSigStartValue" SG_ 924 DcacOut2_Pw_Actl 8190;
+BA_ "U_P702_MY2021_Rx" SG_ 924 DcacOut2_Pw_Actl 1;
+BA_ "GenSigStartValue" SG_ 924 DcacOut1_Pw_Actl 8190;
+BA_ "U_P702_MY2021_Rx" SG_ 924 DcacOut1_Pw_Actl 1;
+BA_ "GenSigStartValue" SG_ 924 DcacIn_Pw_Mx 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 924 DcacIn_Pw_Mx 1;
+BA_ "GenSigStartValue" SG_ 923 DcacIn_U2_Actl 4094;
+BA_ "GenSigStartValue" SG_ 923 DcacIn_U_Actl 4094;
+BA_ "U_P702_MY2021_Rx" SG_ 923 DcacIn_U_Actl 1;
+BA_ "GenSigStartValue" SG_ 923 DcacIn_I_Actl 2046;
+BA_ "U_P702_MY2021_Rx" SG_ 923 DcacIn_I_Actl 1;
+BA_ "GenSigStartValue" SG_ 923 Dcac_Te_Actl 254;
+BA_ "U_P702_MY2021_Rx" SG_ 923 Dcac_Te_Actl 1;
+BA_ "GenSigSendType" SG_ 1998 TesterPhysicalResSODR 3;
+BA_ "GenSigSendType" SG_ 1996 TesterPhysicalResSODL 3;
+BA_ "GenSigSendType" SG_ 1988 TesterPhysicalReqSODL 3;
+BA_ "U_P702_MY2021_Rx" SG_ 922 DcacRdy_D_Stat 1;
+BA_ "GenSigStartValue" SG_ 922 DcacPlugPrsnt_B_Stat 1;
+BA_ "U_P702_MY2021_Rx" SG_ 922 DcacPlugPrsnt_B_Stat 1;
+VAL_ 823 DteAcceptNew_B_Rq 1 "Yes" 0 "No";
+VAL_ 824 DteCldTrlrOn_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldTrlrOff_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldTraffic_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldTerrain_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldRoute_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldPayload_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldExtTe_B_Stat 1 "Yes" 0 "No";
+VAL_ 824 DteCldDcac_B_Stat 1 "Yes" 0 "No";
+VAL_ 949 Tire_Press_RR_ORR_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown";
+VAL_ 949 Tire_Press_LR_OLR_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown";
+VAL_ 949 Tire_Press_LF_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown";
+VAL_ 949 Tire_Press_RF_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown";
+VAL_ 740 BattAuxCnnct_B_Cmd 1 "Close" 0 "Open";
+VAL_ 1160 DgtlCommPncReset_B_Req 1 "Yes" 0 "No";
+VAL_ 1160 DataMntrSustn_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 1160 PwSustnRdata_B_RqTelem 1 "Active" 0 "Inactive";
+VAL_ 776 ScChrgrPwMax_Pw_RqCld 4095 "Faulty";
+VAL_ 776 PrcondEdit_D_RqCld 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "High" 3 "Medium" 2 "Low" 1 "Off" 0 "Null";
+VAL_ 776 GoTEditMnte_T_RqCld 15 "Faulty" 14 "NoDataExists" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0";
+VAL_ 776 GoTEditHr_T_RqCld 31 "Faulty" 30 "NoDataExists";
+VAL_ 776 ChrgToPcEdit_Pc_RqCld 127 "Faulty" 126 "NoDataExists";
+VAL_ 776 ScFreshDataEnbl_B_Rq 1 "Yes" 0 "No";
+VAL_ 776 ScEnbl_D_RqCld 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 775 ScDayOfWeekId_D_RqCld 7 "Sunday" 6 "Saturday" 5 "Friday" 4 "Thursday" 3 "Wednesday" 2 "Tuesday" 1 "Monday" 0 "NotUsed";
+VAL_ 775 ScChrgDurSet_D_RqCld 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 775 ScChrgDur_T_RqCld 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 774 ScLocLongPostv_B_RqCld 1 "Yes" 0 "No";
+VAL_ 774 ScLocLattPostv_B_RqCld 1 "Yes" 0 "No";
+VAL_ 774 ScLocDelete_B_RqCld 1 "Request" 0 "NoRequest";
+VAL_ 811 DistToStopover_L_Actl 65535 "Faulty";
+VAL_ 811 ExtLghtDsply_D_Stat 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 811 ExtLghtRight_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 811 AutoLghtOvrrd_B_RqDrv 1 "Allowed" 0 "NotAllowed";
+VAL_ 811 ExtLghtRear_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 811 ExtLghtLeft_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 811 ExtLghtFront_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 811 GoTEditMnte_T_RqMnu 15 "Faulty" 14 "NoDataExists" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0";
+VAL_ 811 GoTEditHr_T_RqMnu 31 "Faulty" 30 "NoDataExists";
+VAL_ 850 VehElRngeNut_L_Dsply 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 850 NxtUsgSocEst_Pc_Dsply 255 "Faulty" 254 "NoDataExists";
+VAL_ 850 EstmChrgTimeLP_St 255 "Invalid";
+VAL_ 850 EstmChrgTimeHP_St 255 "Invalid";
+VAL_ 850 ChargeNowDuration_St 255 "Invalid";
+VAL_ 563 DrvBhavWarn_B_Rq 1 "On" 0 "Off";
+VAL_ 563 OfbChrgSetSync_D_Rq 3 "Fail" 2 "Success" 1 "InProgress" 0 "NoSyncInProgress";
+VAL_ 563 KeyOffPwMde_D_Stat 7 "NotUsed_6" 6 "NotUsed_5" 5 "NotUsed_4" 4 "NotUsed_3" 0 "Inactive" 1 "On" 2 "NotUsed_1" 3 "NotUsed_2";
+VAL_ 563 ModemReset_D_Stat 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "WifiHotSpotResetComplete" 4 "CcsResetComplete" 3 "OnlineTrafficResetComplete" 2 "PaakResetComplete" 1 "ResetNotComplete" 0 "Null";
+VAL_ 563 FactoryReset_St 3 "NotUsed_2" 2 "NotUsed_1" 1 "FactoryDefaultsRestored" 0 "Null";
+VAL_ 570 SuspClkSync_No_Rq 255 "Faulty" 254 "NoDataExists";
+VAL_ 570 SuspRearRight_L_Actl 511 "Faulty";
+VAL_ 570 SuspFrntRight_L_Actl 511 "Faulty";
+VAL_ 570 SuspRear_L_Prev 511 "Fault";
+VAL_ 570 SuspRear_L_Actl 511 "Fault";
+VAL_ 570 SuspFrnt_L_Prev 511 "Fault";
+VAL_ 570 SuspFrnt_L_Actl 511 "Fault";
+VAL_ 837 Ccd_B_Falt 1 "Yes" 0 "No";
+VAL_ 837 SelDrvMdeSusp_D_Stat 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable";
+VAL_ 837 AdptDrvMdePt_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Powertrain2Sport" 2 "Powertrain2Normal" 1 "Powertrain2Comfort" 0 "AdaptiveNotActive";
+VAL_ 837 AdptDrvMdeChassis_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Chassis2Sport" 2 "Chassis2Normal" 1 "Chassis2Comfort" 0 "AdaptiveNotActive";
+VAL_ 837 CcdMsgTxt_D_RqDsply 15 "Unused8" 14 "Unused7" 13 "Unused6" 12 "Unused5" 11 "Unused4" 10 "Unused3" 9 "Unused2" 8 "StationaryMode" 7 "Mode_Change_Unavailable" 6 "CCD_Temporarily_Off" 5 "CCD_Service_Required" 4 "Faulty" 3 "Sport" 2 "Normal" 1 "Comfort" 0 "No_Mode_Selected";
+VAL_ 885 BattULoChrg_D_RqOta 1 "Yes" 0 "No";
+VAL_ 885 VehStrtInhbt_T_Dsply 15 "NotUsed_12" 14 "NotUsed_11" 13 "NotUsed_10" 12 "NotUsed_9" 11 "NotUsed_8" 10 "NotUsed_7" 9 "NotUsed_6" 8 "NotUsed_5" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "PostOtaActivatePermFail" 2 "PostOtaActivateWarning" 1 "DuringOtaActivate" 0 "NoMessage";
+VAL_ 885 VehStrtInhbt_D_Dsply 15 "NotUsed_12" 14 "NotUsed_11" 13 "NotUsed_10" 12 "NotUsed_9" 11 "NotUsed_8" 10 "NotUsed_7" 9 "NotUsed_6" 8 "NotUsed_5" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "PostOtaActivatePermFail" 2 "PostOtaActivateWarning" 1 "DuringOtaActivate" 0 "NoMessage";
+VAL_ 885 VehOnRqstr_D_Stat 11 "NotUsed_8" 10 "NotUsed_7" 9 "NotUsed_6" 8 "NotUsed_5" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "FleetVehInhbt" 2 "StolenVehInhbt" 1 "OverTheAir" 0 "NoRequestor" 15 "NotUsed_12" 14 "NotUsed_11" 13 "NotUsed_10" 12 "NotUsed_9";
+VAL_ 885 VehStrtInhbt_D_RqCld 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 885 VehOn_D_RqCld 3 "NoControl" 2 "On" 1 "Off" 0 "Null";
+VAL_ 885 OtaActv_D_Stat 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "NonInterruptible_Pending" 4 "NonInterruptible_Config" 3 "NonInterruptible_ER" 2 "NonInterruptible_AB" 1 "Interruptible_AB" 0 "NoInVehicleOta";
+VAL_ 810 OBCCSerial_D_Rq 3 "PresentAndProvisioned" 2 "PresentAndProvAlertAck" 1 "PresentAndUnprovisioned" 0 "NotPresent";
+VAL_ 810 TlghtTest_D_RqArb 3 "TestEndAcknowledge" 2 "StartTest" 1 "StopTest" 0 "Null";
+VAL_ 810 ChrgrPncSustn_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 810 NtfyDrvTrgtDist_L_Rq 4095 "Trip_dist_alert_disabled" 0 "Inactive";
+VAL_ 810 NtfyDrvSocLvl1_Pc_Rq 127 "TargetSOCNotificationAlert" 0 "Inactive";
+VAL_ 810 PtRmtRprt_D_Stat 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "SettingUpdated" 10 "FastChargeComplete" 9 "ChargeNotOccurring" 8 "OneTimeSocReached" 7 "BatteryTemperatureRemind" 6 "ReducedPerformance" 5 "LimitedPerformance" 4 "ChargeFault" 3 "ChargeComplete" 2 "VehiclePreconditioned" 1 "TripDistanceAchieved" 0 "NoReportRequest";
+VAL_ 810 ChrgrPncEnbl_D_Rq 3 "NotUsed" 2 "Enable" 1 "Disable" 0 "Null";
+VAL_ 810 ExtLghtDsply_B_StatArb 1 "On" 0 "Off";
+VAL_ 810 ExtLghtRight_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 810 ExtLghtRear_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 810 ExtLghtLeft_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 810 ExtLghtFront_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset";
+VAL_ 550 PtWakeupActv1_B_Rq 1 "Wake_up_Powertrain_via_HW" 0 "Don_t_Wake_Up_Powertrain";
+VAL_ 639 OfbChrgPrflUpdate_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 639 OfbChrgClearAll_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 639 OfbChrgGoTTouch_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 639 OfbChrgGoTPrcond_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 639 OfbChrgGoTOn_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 639 OfbChrgGoTMnte_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0";
+VAL_ 639 OfbChrgGoTHr_T_Rq 31 "Faulty" 30 "NoDataExists";
+VAL_ 639 OfbChrgGoTExtHtr_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 639 OfbChrgGoTDelete_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 639 OfbChrgGoTUpdate_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 530 OfbChrgToPcWknd_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 530 OfbChrgToPcWkdy_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 530 OfbChrgSetNow_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 530 OfbChrgSetDelete_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 530 OfbChrgLocIdUns_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 1142 ConsTipV_No_Dsply 1023 "Faulty" 1022 "NoDataExists";
+VAL_ 817 ChildLckMde_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 817 VehLckInd_D_Rq 3 "NotUsed" 2 "On_Day" 1 "On_Night" 0 "Off";
+VAL_ 817 DrTgateOpen_B_Rq 1 "Open" 0 "Null";
+VAL_ 817 DrTgateExtSwMde_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 817 Remote_Device_Feedback 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "Shutdown" 3 "Running" 2 "Starting" 1 "Acknowledge" 0 "Null";
+VAL_ 817 Veh_Lock_Requestor 31 "Unused8" 30 "Unused7" 29 "Unused6" 28 "Rgtm_Shutlock_Switch" 27 "Boundary_Alert" 26 "Transit_Vehicle_Relock" 25 "Transit_Cargo_Relock" 24 "Transit_Ajar_Lock" 23 "Diagnostics" 22 "Console_Lock" 21 "Child_Lock" 20 "Double_Lock" 19 "Passive_Pasenger" 18 "Passive_Driver" 17 "Slam_Lock_Protect" 16 "SYNC" 15 "Passport" 14 "Passive_Smart_Unlock" 13 "Autorelock" 12 "RemoteStart" 0 "Null" 1 "Autolock" 11 "Smart_Unlock" 10 "Sliding_Door" 9 "Passive" 8 "Remote" 7 "Programming" 6 "Powerslide" 5 "Keypad" 4 "Key_Cylinder" 3 "Interior" 2 "Auto_Unlock";
+VAL_ 817 R_Pwr_Sliding_Dr_Rqst 1 "Active" 0 "Null";
+VAL_ 817 Power_Liftgate_Rqst 1 "Active" 0 "Null";
+VAL_ 817 Power_Decklid_Rqst 1 "Active" 0 "Null";
+VAL_ 817 L_Pwr_Sliding_Dr_Rqst 1 "Active" 0 "Null";
+VAL_ 817 Veh_Lock_Sub_Id 15 "Unused7" 14 "Unused6" 13 "Unused5" 12 "Unused4" 11 "Unused3" 10 "Unused2" 9 "Unused1" 8 "Customer_8" 7 "Customer_7" 6 "Customer_6" 5 "Customer_5" 4 "Customer_4" 3 "Customer_3" 2 "Customer_2" 1 "Customer_1" 0 "Null";
+VAL_ 817 Veh_Lock_Status 3 "UNLOCK_DRV" 2 "UNLOCK_ALL" 1 "LOCK_ALL" 0 "LOCK_DBL";
+VAL_ 817 ChildLck_D_Dsply 3 "NOT_SUPPORTED" 2 "ERROR" 1 "CHILD_UNLOCK" 0 "CHILD_LOCK";
+VAL_ 817 WindowLockout_B_Stat 1 "Locked" 0 "Unlock";
+VAL_ 817 Lockmsgtxt_D_Rq 7 "MSG7" 6 "MSG6" 5 "MSG5" 4 "MSG4" 3 "MSG3" 2 "MSG2" 1 "MSG1" 0 "NO_WARNING";
+VAL_ 817 FobComm_D_Stat 3 "NotUsed" 2 "RemEngStartOK" 1 "RemEngStartFail" 0 "Null";
+VAL_ 817 LockInhibit 1 "Inhibit" 0 "No_Inhibit";
+VAL_ 879 WndwRearHeat_I_Actl 2047 "Faulty";
+VAL_ 879 WndwRearHeat_D_Stat 7 "NotUsed" 6 "FetLiftLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad";
+VAL_ 878 DcacGfciTest_B_Rq 1 "Pressed" 0 "Not_Pressed";
+VAL_ 878 DcacOut_Pw_DsplyMx 1023 "Faulty";
+VAL_ 878 DcacOut1_Pw_Dsply 63 "Faulty";
+VAL_ 878 DcacOut2_Pw_Dsply 63 "Faulty";
+VAL_ 878 DcacHw_D_Confg 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Power_2300W" 3 "Power_7200W" 2 "Power_2400W" 1 "Power_2000W" 0 "NoDcacHardware";
+VAL_ 878 DcacFaltMsgTxt_D_Rq 15 "NotUsed" 14 "OvercurrentLP" 13 "EngineRun" 12 "Service" 11 "NotAvailable" 10 "PlugWarn" 9 "PlugWarnDrive" 8 "BreakerC" 7 "BreakerB" 6 "BreakerA" 5 "FuelLow" 4 "AcOnOutput" 3 "Temperature" 2 "Gfci" 1 "Overcurrent" 0 "Ok";
+VAL_ 878 DcacLoFuelMsgTxt_D_Rq 31 "Minute_31" 30 "Minute_30" 29 "Minute_29" 28 "Minute_28" 27 "Minute_27" 26 "Minute_26" 25 "Minute_25" 24 "Minute_24" 23 "Minute_23" 22 "Minute_22" 21 "Minute_21" 20 "Minute_20" 19 "Minute_19" 18 "Minute_18" 17 "Minute_17" 16 "Minute_16" 15 "Minute_15" 14 "Minute_14" 13 "Minute_13" 12 "Minute_12" 11 "Minute_11" 10 "Minute_10" 9 "Minute_9" 8 "Minute_8" 7 "Minute_7" 6 "Minute_6" 5 "Minute_5" 4 "Minute_4" 3 "Minute_3" 2 "Minute_2" 1 "Minute_1" 0 "Ok";
+VAL_ 878 DcacEngOnMsgTxt_D_Rq 3 "NotUsed" 2 "DisplayQuestion" 1 "DisplayWarning" 0 "Ok";
+VAL_ 878 DcacElPw_D_Stat 3 "NotUsed" 2 "High" 1 "Low" 0 "Off";
+VAL_ 878 PwBedPnlEnbl_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 878 DcacOn_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 878 DcacSys_B_Falt 1 "Yes" 0 "No";
+VAL_ 878 DcacLedCtl_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 395 SelDrvMdeCnfm_D_Stat 3 "NotUsed" 2 "Accepted" 1 "NotAccepted" 0 "Null";
+VAL_ 984 PersIndexIpma_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 984 AhbcRampingV_D_Rq 3 "Slow" 2 "Medium" 1 "Fast" 0 "Immediately";
+VAL_ 984 LaActvStats_D_Dsply 31 "Unused7" 30 "LA_Off" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 24 "InerveneLeft_InterveneRght" 23 "WarnLeft_InterveneRight" 22 "SuppressLeft_InterveneRght" 21 "AvailLeft_InterveneRhtt" 20 "NoLeft_InterveneRight" 19 "InterveneLeft_WarnRight" 18 "WarnLeft_WarnRight" 17 "SuppressLeft_WarnRight" 16 "AvailableLeft_WarnRight" 15 "NoLeft_WarnRight" 14 "InterveneLeft_SuppressRght" 13 "WarnLeft_SuppressRight" 12 "SuppressLeft_SuppressRight" 11 "AvailLeft_SuppressRight" 10 "NoLeft_SuppressRight" 9 "InterveneLeft_AvailRight" 8 "WarnLeft_AvailRight" 7 "SuppressLeft_AvailRight" 6 "AvailableLeft_AvailRight" 5 "NoLeft_AvailableRight" 4 "InterveneLeft_NoRight" 3 "WarnLeft_NoRight" 2 "SuppressLeft_NoRight" 1 "AvailableLeft_NoRight" 0 "NoLeft_NoRight";
+VAL_ 984 LaDenyStats_B_Dsply 1 "Unavailable" 0 "Available";
+VAL_ 984 LaHandsOff_D_Dsply 3 "Suppressed" 2 "Level2" 1 "Level1" 0 "HandsOn";
+VAL_ 984 CamraDefog_B_Req 1 "On" 0 "Off";
+VAL_ 984 CamraStats_D_Dsply 3 "FrtCam_TempUnavailOther" 2 "FrtCam_TempUnavailVisibile" 1 "Front_Camera_Service_Reqd" 0 "Front_Camera_OK";
+VAL_ 984 DasAlrtLvl_D_Dsply 5 "Alertness_Level_5" 4 "Alertness_Level_4" 3 "Alertness_Level_3" 2 "Alertness_Level_2" 1 "Alertness_Level_1" 0 "Undefined";
+VAL_ 984 DasStats_D_Dsply 3 "Available" 2 "Unavailable_Other" 1 "Feedback_due_to_Speed" 0 "Off";
+VAL_ 984 DasWarn_D_Dsply 3 "Undefined" 2 "Warning_Level_2" 1 "Warning_Level_1" 0 "No_Warning";
+VAL_ 984 AhbHiBeam_D_Rq 3 "NotUsed" 2 "HighBeamRecommended" 1 "LowBeamRecommended" 0 "DeactivatedUnavailable";
+VAL_ 985 LdwChime_B_Rq 1 "On" 0 "Off";
+VAL_ 985 TsrRegionTxt_D_Stat 31 "Faulty" 30 "NotUsed_8" 29 "NotUsed_7" 28 "NotUsed_6" 27 "NotUsed_5" 26 "NotUsed_4" 25 "NotUsed_3" 24 "NotUsed_2" 23 "NotUsed_1" 22 "Region_22" 21 "Region_21" 20 "Region_20" 19 "Region_19" 18 "Region_18" 17 "Region_17" 16 "Region_16" 15 "Region_15" 14 "Region_14" 13 "Region_13" 12 "Region_12" 11 "Region_11" 10 "Region_10" 9 "Region_09" 8 "Region_08" 7 "Region_07" 6 "Region_06" 5 "Region_05" 4 "Region_04" 3 "Region_03" 2 "Region_02" 1 "Region_01" 0 "NotDetermined";
+VAL_ 985 SblmPedCrossScnr_B_Stat 1 "Yes" 0 "No";
+VAL_ 985 LongCtrlEnbl_D_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "RemoteParking" 2 "Autohitch" 1 "AutomaticParking" 0 "None";
+VAL_ 985 SblmRndAbtScnr_B_Stat 1 "Yes" 0 "No";
+VAL_ 985 DasAlrtInfo_D_Dsply 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 985 IaccVLim_D_Rq 252 "NotUsed_2" 250 "LimitSpeed_250" 240 "LimitSpeed_240" 230 "LimitSpeed_230" 220 "LimitSpeed_220" 210 "LimitSpeed_210" 200 "LimitSpeed_200" 190 "LimitSpeed_190" 150 "LimitSpeed_150" 140 "LimitSpeed_140" 130 "LimitSpeed_130" 120 "LimitSpeed_120" 110 "LimitSpeed_110" 100 "LimitSpeed_100" 90 "LimitSpeed_90" 80 "LimitSpeed_80" 70 "LimitSpeed_70" 60 "LimitSpeed_60" 50 "LimitSpeed_50" 40 "LimitSpeed_40" 30 "LimitSpeed_30" 20 "LimtSpeed_20" 251 "NotUsed_1" 255 "Faulty" 254 "NoDataExists" 253 "NotUsed_3" 180 "LimitSpeed_180" 179 "LimitSpeed_179" 178 "LimitSpeed_178" 177 "LimitSpeed_177" 176 "LimitSpeed_176" 175 "LimitSpeed_175" 174 "LimitSpeed_174" 173 "LimitSpeed_173" 172 "LimitSpeed_172" 171 "LimitSpeed_171" 170 "LimitSpeed_170" 169 "LimitSpeed_169" 168 "LimitSpeed_168" 167 "LimitSpeed_167" 166 "LimitSpeed_166" 165 "LimitSpeed_165" 164 "LimitSpeed_164" 163 "LimitSpeed_163" 162 "LimitSpeed_162" 161 "LimitSpeed_161" 160 "LimitSpeed_160" 15 "LimitSpeed_15" 14 "LimitSpeed_14" 13 "LimitSpeed_13" 12 "LimitSpeed_12" 11 "LimitSpeed_11" 10 "LimitSpeed_10" 9 "LimitSpeed_9" 8 "LimitSpeed_8" 7 "LimitSpeed_7" 6 "LimitSpeed_6" 5 "LimitSpeed_5" 4 "LimitSpeed_4" 3 "LimitSpeed_3" 2 "LimitSpeed_2" 1 "LimitSpeed_1" 0 "LimitSpeed_0";
+VAL_ 985 IaccVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null";
+VAL_ 985 IsaVLim_D_Rq 252 "NotUsed_2" 250 "LimitSpeed_250" 240 "LimitSpeed_240" 230 "LimitSpeed_230" 220 "LimitSpeed_220" 210 "LimitSpeed_210" 200 "LimitSpeed_200" 190 "LimitSpeed_190" 150 "LimitSpeed_150" 140 "LimitSpeed_140" 130 "LimitSpeed_130" 120 "LimitSpeed_120" 110 "LimitSpeed_110" 100 "LimitSpeed_100" 90 "LimitSpeed_90" 80 "LimitSpeed_80" 70 "LimitSpeed_70" 60 "LimitSpeed_60" 50 "LimitSpeed_50" 40 "LimitSpeed_40" 30 "LimitSpeed_30" 20 "LimtSpeed_20" 251 "NotUsed_1" 255 "Faulty" 254 "NoDataExists" 253 "NotUsed_3" 180 "LimitSpeed_180" 179 "LimitSpeed_179" 178 "LimitSpeed_178" 177 "LimitSpeed_177" 176 "LimitSpeed_176" 175 "LimitSpeed_175" 174 "LimitSpeed_174" 173 "LimitSpeed_173" 172 "LimitSpeed_172" 171 "LimitSpeed_171" 170 "LimitSpeed_170" 169 "LimitSpeed_169" 168 "LimitSpeed_168" 167 "LimitSpeed_167" 166 "LimitSpeed_166" 165 "LimitSpeed_165" 164 "LimitSpeed_164" 163 "LimitSpeed_163" 162 "LimitSpeed_162" 161 "LimitSpeed_161" 160 "LimitSpeed_160" 15 "LimitSpeed_15" 14 "LimitSpeed_14" 13 "LimitSpeed_13" 12 "LimitSpeed_12" 11 "LimitSpeed_11" 10 "LimitSpeed_10" 9 "LimitSpeed_9" 8 "LimitSpeed_8" 7 "LimitSpeed_7" 6 "LimitSpeed_6" 5 "LimitSpeed_5" 4 "LimitSpeed_4" 3 "LimitSpeed_3" 2 "LimitSpeed_2" 1 "LimitSpeed_1" 0 "LimitSpeed_0";
+VAL_ 985 SblmStopScnr_B_Stat 1 "Yes" 0 "No";
+VAL_ 985 SblmYieldScnr_B_Stat 1 "Yes" 0 "No";
+VAL_ 985 IsaVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null";
+VAL_ 985 AdbDividedRoad_B_Stat 1 "Yes" 0 "No";
+VAL_ 985 LcwaMsgTxt_D_Stat 3 "SodXFaulty" 2 "SodXBlocked" 1 "TrailerConnected" 0 "NoMessage";
+VAL_ 985 AdbDrvSide_B_Stat 1 "Left_Hand_Traffic" 0 "Right_Hand_Traffic";
+VAL_ 992 MsgCntrDsplyOp_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Copy" 4 "Restore" 3 "Upload" 2 "Set" 1 "Query" 0 "Null";
+VAL_ 992 MsgCntrPersIndex_D_Rq 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 943 VehVActlAdas_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 943 AdasLcDistToObj_L_Actl 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 515 PtIgnSwtch_D_Stat 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off";
+VAL_ 1111 TrlrYawWActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 1111 TrlrYaw_W_Actl 65535 "Faulty" 65534 "NoDataExists";
+VAL_ 1111 TrlrHitYaw_AnRate_Actl 4095 "Fault" 4094 "NoDataExists";
+VAL_ 1111 TrlrHitchYaw_D_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "FaultyYrsuConnection" 9 "FaultyYrsu" 8 "HiConfdLrndAngle" 7 "LowConfdLrndAngle" 6 "HiConfdAngleMem" 5 "LowConfdAngleMem" 4 "InitNoTadAngle" 3 "InitInputs" 2 "TadTrlrDataOutOfRange" 1 "TadNotWithinSpecification" 0 "NoConnectionWithYrsu";
+VAL_ 1111 TrlrHitchYaw_An_Actl 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 1106 TrlrSnsId_No_Actl -1 "Faulty_FFFFFFFFFFFF" -2 "NoDataExists_FFFFFFFFFFFE";
+VAL_ 982 LatCtl_D2_Rq 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "SafeRampOut" 2 "PathFollowingExtendedMode" 1 "PathFollowingLimitedMode" 0 "NoLateralControl";
+VAL_ 982 HandsOffCnfm_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 982 LatCtlRampType_D_Rq 3 "Immediately" 2 "Fast" 1 "Medium" 0 "Slow";
+VAL_ 982 LatCtlPrecision_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "Precise" 0 "Comfortable";
+VAL_ 1104 DrvEngageLevel_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Disengaged" 3 "Distracted" 2 "Attentive" 1 "Invalid" 0 "NotDetermined";
+VAL_ 1104 DrvImpLvlConfid_D_Stat 7 "Faulty" 6 "NotUsed" 5 "High" 4 "MediumHigh" 3 "Medium" 2 "LowMedium" 1 "Low" 0 "NotDetermined";
+VAL_ 1104 DrvImpairLvl_D_Stat 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "Incapacitated" 8 "Asleep" 7 "Microsleep" 6 "MostDrowsy" 5 "Drowsy_4" 4 "Drowsy_3" 3 "Drowsy_2" 2 "LeastDrowsy" 1 "Alert" 0 "NotDetermined";
+VAL_ 1104 DrvEngLvlConfid_D_Stat 7 "Faulty" 6 "NotUsed" 5 "High" 4 "MediumHigh" 3 "Medium" 2 "LowMedium" 1 "Low" 0 "NotDetermined";
+VAL_ 1104 DrvCamPassIR_D_Stat 3 "Faulty" 2 "Blocked" 1 "Ok" 0 "TemporaryUnavailable";
+VAL_ 1104 DrvCamera_D_Stat 3 "Faulty" 2 "Blocked" 1 "Ok" 0 "TemporaryUnavailable";
+VAL_ 1104 DrvCamDrvIR_D_Stat 3 "Faulty" 2 "Blocked" 1 "Ok" 0 "TemporaryUnavailable";
+VAL_ 1104 DrvAttentZone_D_Stat 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "PassengerSideWindow" 8 "DriverSideWindow" 7 "DriverSideMirror" 6 "RearviewMirror" 5 "PassengerSideMirror" 4 "Infotainment" 3 "Cluster" 2 "FrontWindshield" 1 "Other" 0 "NotDetermined";
+VAL_ 1104 DrvAlertSt_D_Stat 3 "Faulty" 2 "EyesOffRoad" 1 "EyesOnRoad" 0 "NotDetermined";
+VAL_ 1114 TrailCtlSwtch_B_Stat2 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1114 TrlBrkInitOut_D_Rq 3 "Heavy" 2 "Medium" 1 "Light" 0 "Null";
+VAL_ 1116 TrlrAidSetup_D2_Rq 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "CompleteSetup" 5 "ReturnToSetup" 4 "StickerNotCircled" 3 "ConfirmSetup" 2 "EndSetup" 1 "BeginSetup" 0 "Inactive";
+VAL_ 1116 TrlrAidEnbl_D2_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Deactivate" 2 "ActivateTrg" 1 "ActivateTba" 0 "Inactive";
+VAL_ 1116 TrlrRvrseCancl_B_Rq 1 "Cancel" 0 "Null";
+VAL_ 1116 TrlrIdType_D_Stat 3 "Gooseneck" 2 "FifthWheel" 1 "Conventional" 0 "Null";
+VAL_ 1116 TrlrAnOffstDir_D_Mem 3 "NotUSed" 2 "Right" 1 "Left_or_Center" 0 "Null";
+VAL_ 1085 ULoRgenTestMde_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1085 PwSrcULoOvrTe_B_Actl 1 "Yes" 0 "No";
+VAL_ 1085 PwSrcULoFalt_D_Stat 3 "Fault_No_Output" 2 "Fault_Reduced_Output" 1 "Fault_NonSpecific" 0 "No_Fault";
+VAL_ 1085 PwSrcULoDcnnt_B_Stat 1 "Loose_or_Disconnected" 0 "Connected";
+VAL_ 1085 PwSrcULo_Pc_Mx 255 "Fault";
+VAL_ 1085 PwSrcULoComm_B_Falt 1 "Fault" 0 "No_Fault";
+VAL_ 1085 PwSrcULo_I_Mx 255 "Fault";
+VAL_ 1085 PwSrcULo_I_Actl 255 "Fault";
+VAL_ 981 AdbBrdrTop_An_Rq 255 "Faulty" 254 "NoDataExists";
+VAL_ 981 AdbBrdrRight_L_Stat 511 "Faulty" 510 "NoDataExists";
+VAL_ 981 AdbBrdrRight_An_Rq 1023 "Faulty" 1022 "NoDataExists";
+VAL_ 981 AdbBrdrLeft_L_Stat 511 "Faulty" 510 "NoDataExists";
+VAL_ 981 AdbBrdrLeft_An_Rq 1023 "Faulty" 1022 "NoDataExists";
+VAL_ 981 AdbBrdrBottom_An_Rq 63 "Faulty" 62 "NoDataExists";
+VAL_ 981 AdbBeam_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "FullHighBeam" 3 "Spot_BothSide" 2 "Spot_OnlyRightSide" 1 "Spot_OnlyLeftSide" 0 "NoHighBeam";
+VAL_ 791 EngAirFilt_B_RqReset 1 "Yes" 0 "No";
+VAL_ 791 GpsElMdeSel_B_Rq 1 "On" 0 "Off";
+VAL_ 791 LongTermReset_B_Rq 1 "On" 0 "Off";
+VAL_ 791 DrvEffLvl_No_Stat 63 "Fault" 62 "NoDataExists";
+VAL_ 868 BattRgenLoStat_D_Qlty 3 "OK" 2 "Not_Within_Spec" 1 "Eval_In_Progress" 0 "Faulty";
+VAL_ 868 BattRgenLoPrtct_B_Stat 1 "Yes" 0 "No";
+VAL_ 868 BattRgenLoDChrg_D_Stat 3 "StuckClosed" 2 "StuckOpen" 1 "Closed" 0 "Open";
+VAL_ 868 BattRgenLoDchrg_B_Rq 1 "Yes" 0 "No";
+VAL_ 868 BattRgenLoChrg_D_Stat 3 "StuckClosed" 2 "StuckOpen" 1 "Closed" 0 "Open";
+VAL_ 868 BattRgenLoChrg_B_Rq 1 "Yes" 0 "No";
+VAL_ 868 BattRgenLo_B_Falt 1 "Yes" 0 "No";
+VAL_ 867 BattRgenLoBalnc_B_Rq 1 "Yes" 0 "No";
+VAL_ 867 BattRgenLo_Te_Actl 255 "Fault";
+VAL_ 865 BattRgenLo_U_Actl 2047 "Faulty";
+VAL_ 865 BattRgenLo_I_Actl 65535 "Faulty";
+VAL_ 1144 WakeAlarm0_B_Typ 1 "CanAndEcuDriveCircuit" 0 "CanOnly";
+VAL_ 1144 PreCondBatt_B_Actl 1 "On" 0 "Off";
+VAL_ 1144 HtrnDcdcDis_B_Rq 1 "Yes" 0 "No";
+VAL_ 1144 ChrgNowEvnt_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1144 CabinDrvSustn_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 1144 BattChrgTrgtSoC_D_Rq 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 1144 CabnEvapSovFront_B_Rq 1 "On" 0 "Off";
+VAL_ 1144 HeatCoreSovRear_B_Rq 1 "On" 0 "Off";
+VAL_ 1144 BattChlrSov_B_Rq 1 "On" 0 "Off";
+VAL_ 1144 CabnEvapSovRear_B_Rq 1 "On" 0 "Off";
+VAL_ 1144 BrkAppl_D_RqPt 3 "BrakesSlowRelease" 2 "BrakesFastRelease" 1 "BrakesEngage" 0 "NotActive";
+VAL_ 1144 HtrnCnnctPwr_B_Stat 1 "Asserted" 0 "NotAsserted";
+VAL_ 1144 PtcHtr_D_Stat 3 "Faulty" 2 "NotUsed" 1 "On" 0 "Off";
+VAL_ 1144 HtrnClntFlw_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 1144 BattTracDrvSustn_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 1144 BattTracClntVlv_B_Rq 1 "On" 0 "Off";
+VAL_ 1141 OfbChrgSetSync_D_Stat 3 "Fail" 2 "Success" 1 "InProgress" 0 "NoSyncInProgress";
+VAL_ 1141 PtRmtRprt_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "PlugInToMaintain12vBattery" 11 "SettingUpdated" 10 "FastChargeComplete" 9 "ChargeNotOccurring" 8 "OneTimeSocReached" 7 "BatteryTemperatureReminder" 6 "ReducedPerformance" 5 "LimitedPerformance" 4 "ChargeFault" 3 "ChargeComplete" 2 "VehiclePreconditioned" 1 "TripDistanceAchieved" 0 "NoReportRequest";
+VAL_ 1141 NtfctnConflict1_D_Rq 7 "NotUsed5" 6 "NotUsed4" 5 "NotUsed3" 4 "NotUsed2" 3 "NotUsed1" 2 "Clonflict_Exists" 1 "No_Conflict" 0 "Invalid";
+VAL_ 1140 RgenEvntLvl_Pc_Dsply 1023 "Fault" 1022 "NoDataExists";
+VAL_ 1140 BrkEvntComplt_B_Dsply 1 "On" 0 "Off";
+VAL_ 1140 PreCondStat_D_Dsply 7 "Reserved3" 6 "Reserved2" 5 "Reserved1" 4 "Faulted" 3 "Complete" 2 "In_Progress" 1 "Scheduled" 0 "Not_Scheduled";
+VAL_ 1139 BattChrgTrgtLMax_T_Est 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 1139 ActChrgStrtYr_No_Actl 31 "Invalid";
+VAL_ 1139 ActChrgStrtMin_No_Actl 63 "Invalid" 62 "Unknown";
+VAL_ 1139 ActChrgStrtHr_No_Actl 31 "Invalid" 30 "Unknown";
+VAL_ 1139 ActChrgStrtDay_No_Actl 31 "Invalid";
+VAL_ 1139 ActChrgStrMnth_No_Actl 15 "Invalid";
+VAL_ 1138 BattChrgTrgtLMin_T_Est 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 1138 ActChrgEndYr_No_Actl 31 "Invalid";
+VAL_ 1138 ActChrgEndMnth_No_Actl 15 "Invalid";
+VAL_ 1138 ActChrgEndMin_No_Actl 63 "Invalid" 62 "Unknown";
+VAL_ 1138 ActChrgEndHr_No_Actl 31 "Invalid" 30 "Unknown";
+VAL_ 1138 ActChrgEndDay_No_Actl 31 "Invalid";
+VAL_ 1089 Mtr2Aout_W_ActlMntr 1023 "Faulty";
+VAL_ 1089 Inv1_Te_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 1089 MtrTrac2Coil_Te_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 1089 MtrTrac2Falt_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1089 MtrTrac2TeAlrm_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1089 Mtr2CntlTeAlrm_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1089 MtrTrac2Inv_Te_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 1089 MtrTrac2_I_Actl 65535 "Faulty";
+VAL_ 1088 ChrgTMatch_B_Stat 1 "True" 0 "False";
+VAL_ 1088 ChrgStat_D2_Dsply 15 "NotUsed_2" 14 "NotUsed_1" 13 "ChargeTargetReached" 12 "DriveConditioning" 11 "CabinPreconditioning" 10 "ChargingSystemMaintain" 9 "ChargingInductive" 8 "ChargingDCFastChange" 7 "ChargingAC" 6 "ChargeScheduled" 5 "EvsePaused" 4 "EvseNotDetected" 3 "EvseNotCompatible" 2 "FaultOutsideCar" 1 "FaultInsideCar" 0 "NotReady";
+VAL_ 1088 HvacPrecondRecirc_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "Recirc" 0 "Outside";
+VAL_ 1088 HvacPrecondMode2_D_Rq 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "Last_User_Settings" 10 "Auto" 9 "Max_Defrost" 8 "Windshield_Panel_Floor" 7 "Windshield_Panel" 6 "Windshield" 5 "Windshield_Floor" 4 "Floor" 3 "Panel_Floor" 2 "Panel" 1 "MAX_AC" 0 "Off";
+VAL_ 1088 HvacPrecondBlwr2_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Last_User_Setting" 8 "Auto" 7 "Speed7" 6 "Speed6" 5 "Speed5" 4 "Speed4" 3 "Speed3" 2 "Speed2" 1 "Speed1" 0 "Off";
+VAL_ 1088 HvacPrecondAC_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "On" 0 "Off";
+VAL_ 1088 BattChrgInhbt_D_Rq 3 "MaintainTargetSoc" 2 "NotUsed" 1 "InhibitChargingThermal" 0 "Enable_Charging";
+VAL_ 1040 ElCmprEnbl_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 1016 ChrgGoTElement_B_Dsply 1 "Yes" 0 "No";
+VAL_ 1016 ChrgGoTTouchEnbl_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 1016 ChrgGoTTouch_B_Stat 1 "On" 0 "Off";
+VAL_ 1016 ChrgGoTPrcond_D_Stat 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 1016 ChrgGoTMnte_D_Stat 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0";
+VAL_ 1016 ChrgGoTHr_T_Stat 31 "Faulty" 30 "NoDataExists";
+VAL_ 1016 ChrgGoTExtHtrEnbl_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 1016 ChrgGoTExtHtr_B_Stat 1 "On" 0 "Off";
+VAL_ 1016 ChrgGoTAllOn_B_Stat 1 "On" 0 "Off";
+VAL_ 1013 ChrgToPcWkndSav_D_Stat 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 1013 ChrgToPcWkdySav_D_Stat 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 1013 ChrgNowEnbl_B_Saved 1 "On" 0 "Off";
+VAL_ 1013 ChrgLocIdUnsAck_B_Stat 1 "Yes" 0 "No";
+VAL_ 1012 ChrgNowCurnt_B_Dsply 1 "On" 0 "Off";
+VAL_ 1012 ChrgLocSaved_B_Dsply 1 "Yes" 0 "No";
+VAL_ 1012 ChrgLocLongPostv_B_Sav 1 "Yes" 0 "No";
+VAL_ 1012 ChrgLocLattPostv_B_Sav 1 "Yes" 0 "No";
+VAL_ 1011 ChrgLocLongPostv_B_Uns 1 "Yes" 0 "No";
+VAL_ 1011 ChrgLocLattPostv_B_Uns 1 "Yes" 0 "No";
+VAL_ 871 BattElecPerf_D_Actl 7 "NotUsed" 6 "Hot_Batt_Severe_Lim_Perf" 5 "Hot_Batt_Reduced_Perf" 4 "Hot_Batt_Close_to_lim_Per" 3 "Cold_Batt_Severe_Lim_Perf" 2 "Cold_Batt_Reduced_Perf" 1 "Cold_Batt_Close_to_lim_Pe" 0 "Ok_no_message_displayed";
+VAL_ 871 BattChrgTrgtLPt_T_Est 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 871 BattChrgTrgSocPt_T_Est 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 871 BattChrgCmpltPt_T_Est 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 786 RgenTrip_L_Dsply 65535 "Fault" 65534 "NoDataExists";
+VAL_ 786 ChrgStat_D_Dsply 7 "NotUsed" 6 "Complete" 5 "Scheduled" 4 "In_Progress" 3 "Fault_Outside_Car" 2 "Fault_Inside_Car" 1 "Fault_Unknown_Location" 0 "Not_Ready";
+VAL_ 72 immoTarget2Status 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "DISABLED_RESET " 2 "ENABLED_NONMOTIVE_START" 1 "ENABLED_MOTIVE_START" 0 "DISABLED";
+VAL_ 72 immoTarget2Cmd 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "TARGET1_IDBLOCK2" 2 "TARGET1_IDBLOCK1" 1 "CHALLENGE" 0 "IDLE";
+VAL_ 912 CabnEvapSovFront_D_Stat 7 "NotUsed_1" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad";
+VAL_ 912 BattChlrSov_D_Stat 7 "NotUsed_1" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad";
+VAL_ 912 BattTracClntVlv_D_Stat 7 "NotUsed" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad";
+VAL_ 874 AirCondCluOpen_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 AirCondCluLife_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 AirCondCluGnd_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 AirCondClu_D_Stat 7 "NotUsed" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad";
+VAL_ 874 AirCondCluBatt_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattTracShrtGrnd_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattTracShrtBatt_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattTracOpnCirct_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattTracLifeLim_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattChlrShrtGrnd_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattChlrShrtBatt_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattChlrOpnCirct_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattChlrLifeLim_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 874 BattTracLow_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 651 TelematicsSrvc_D_St 7 "NotUsed" 6 "NotifyNotActivatedYet" 5 "NotActivatedYet" 4 "NotifyExpired" 3 "Expired" 2 "ExpiringSoon" 1 "Active" 0 "Null";
+VAL_ 651 EmgcyCallMute_D_Stat 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "ManualEmergencyCallMute" 2 "AutomaticEmergencyCallMute" 1 "EmergencyCallUnmute" 0 "Null";
+VAL_ 651 OfbChrgSetSync_D_Rq 3 "Fail" 2 "Success" 1 "InProgress" 0 "NoSyncInProgress";
+VAL_ 529 OnbChrgToPcWknd_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 529 OnbChrgToPcWkdy_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100";
+VAL_ 529 OnbChrgSetNow_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 529 OnbChrgSetDelete_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 529 OnbChrgPrflUpdate_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 529 OnbChrgLocIdUns_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 66 immoControlCmd_T2 0 "IDLE" 1 "MOTIVE_START_RQST" 2 "NONMOTIVE_START_RQST" 3 "RQST_TARGET2_IDBLOCK1" 4 "RQST_TARGET2_IDBLOCK2" 5 "Unused" 6 "ECHO_TARGET2_IDBLOCK2" 7 "SHUTDOWN";
+VAL_ 1124 GPS_Vdop 31 "Invalid" 30 "Unknown";
+VAL_ 1124 GPS_Speed 255 "Invalid" 254 "Unknown";
+VAL_ 1124 GPS_Sat_num_in_view 31 "Invalid" 30 "Unknown";
+VAL_ 1124 GPS_MSL_altitude 4095 "Fault" 4094 "Unknown";
+VAL_ 1124 GPS_Heading 65535 "Fault" 65534 "Unknown";
+VAL_ 1124 GPS_Hdop 31 "Invalid" 30 "Unknown";
+VAL_ 1124 GPS_dimension 2 "_3D" 1 "_2D" 0 "No_Fix";
+VAL_ 1119 CoolFanDcdc_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 1119 DcdcClntFlw_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 1123 GpsUtcYr_No_Actl 31 "Fault";
+VAL_ 1123 GpsUtcMnth_No_Actl 15 "Fault";
+VAL_ 1123 GPS_UTC_seconds 63 "Fault" 62 "Unknown";
+VAL_ 1123 GPS_UTC_minutes 63 "Fault" 62 "Unknown";
+VAL_ 1123 GPS_UTC_hours 31 "Invalid" 30 "Unknown";
+VAL_ 1123 GPS_Pdop 31 "Invalid" 30 "Unknown";
+VAL_ 1123 GPS_Compass_direction 7 "NorthWest" 6 "West" 5 "SouthWest" 4 "South" 3 "SouthEast" 2 "East" 1 "NorthEast" 0 "North";
+VAL_ 1123 GPS_Actual_vs_Infer_pos 1 "Inferred_Position" 0 "Actual_Postition";
+VAL_ 1123 Gps_B_Falt 1 "Yes" 0 "No";
+VAL_ 1122 GpsHsphLongEast_D_Actl 0 "Invalid" 1 "Eastern" 2 "Western" 3 "Fault";
+VAL_ 1122 GpsHsphLattSth_D_Actl 3 "Fault" 2 "Northern" 1 "Southern" 0 "Invalid";
+VAL_ 1122 GPS_Longitude_Minutes 63 "Fault" 62 "Unknown";
+VAL_ 1122 GPS_Longitude_Min_dec 16383 "Invalid" 16382 "Unknown";
+VAL_ 1122 GPS_Longitude_Degrees 511 "Fault" 510 "Unknown";
+VAL_ 1122 GPS_Latitude_Minutes 63 "Fault" 62 "Unknown";
+VAL_ 1122 GPS_Latitude_Min_dec 16383 "Invalid" 16382 "Unknown";
+VAL_ 1122 GPS_Latitude_Degrees 255 "Invalid" 254 "Unknown";
+VAL_ 1003 PersRecallSrc_D_Actl 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "MemorySwitch" 3 "RemoteStart" 2 "KeyFob" 1 "CenterStack" 0 "Null";
+VAL_ 1003 Pers4Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null";
+VAL_ 1003 Pers3Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null";
+VAL_ 1003 Pers2Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null";
+VAL_ 1003 Pers1Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null";
+VAL_ 1003 EmPrflNo_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null";
+VAL_ 1003 EmPrflKeyAssoc_D_Stat 7 "WrongDevice" 6 "KeyAssociateFailed" 5 "KeyAssociateSuccess" 4 "KeyAlreadyInUse" 3 "KeyDisassociated" 2 "KeyAssociationExited" 1 "KeyAssociationEntered" 0 "Null";
+VAL_ 1003 VehKeyActv_D_Stat 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Key8Active" 7 "Key7Active" 6 "Key6Active" 5 "Key5Active" 4 "Key4Active" 3 "Key3Active" 2 "Key2Active" 1 "Key1Active" 0 "NoKeyActive";
+VAL_ 1003 PersNoPos_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 1003 PersSetupRestr_D_Actl 3 "Non_Moveable_Person" 2 "Moveable_Person" 1 "Vehicle" 0 "Factory";
+VAL_ 1003 PersSetupAccessCtrl 1 "Limited" 0 "Full";
+VAL_ 1003 PersConflict_D_Actl 1 "Conflict" 0 "No_Conflict";
+VAL_ 1003 AssocConfirm_D_Actl 0 "None" 7 "Associate" 6 "Keycode_Rejected" 5 "Keycode_Accepted" 4 "In_Progress" 3 "Erase" 2 "Duplicate" 1 "Disassociate";
+VAL_ 1003 PersNo_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "NotDetermined" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 994 PersStore_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Vehicle" 4 "PERS_4" 3 "PERS_3" 2 "PERS_2" 1 "PERS_1" 0 "Null";
+VAL_ 994 Pers4OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN";
+VAL_ 994 Pers3OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN";
+VAL_ 994 Pers2OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN";
+VAL_ 994 Pers1OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN";
+VAL_ 994 CtrStkPersIndex_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 994 CtrStkDsplyOp_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Copy" 4 "Restore" 3 "Upload" 2 "Set" 1 "Query" 0 "Null";
+VAL_ 778 PrkAidFront_D_RqDrv 2 "Status" 3 "NotUsed" 1 "Enabled" 0 "Disabled";
+VAL_ 778 PrkAidAcsyRear_D_RqDrv 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 778 PrkAidAcsyFront_D_RqDrv 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 778 Cta_D_Rq 3 "Unused" 2 "NoDataExists" 1 "On" 0 "Off";
+VAL_ 778 PrkAidRear_D_RqDrv 2 "Status" 3 "NotUsed" 1 "Enabled" 0 "Disabled";
+VAL_ 778 SteEffort_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "SpecialMode_2" 3 "SpecialMode_1" 2 "Comfort" 1 "Sport" 0 "Normal";
+VAL_ 778 Sod_D_Rq 2 "BLIS_On_Second_Warning_ON" 1 "BLIS_On_Second_Warning_OFF" 0 "Off";
+VAL_ 549 IPC_MyKeyVolLimit_St 0 "Invalid" 1 "Off" 2 "On";
+VAL_ 549 HdcOn_B_Rq 1 "On" 0 "Off";
+VAL_ 549 IPC_Attn_Info_Audio 7 "Unknown" 6 "Attenuation_6" 5 "Attenuation_5" 4 "Attenuation_4" 3 "Attenuation_3" 2 "Attenuation_2" 1 "Attenuation_1" 0 "No_Attenuation_of_Audio";
+VAL_ 549 BeltminderAudioMute 2 "On" 1 "Off" 0 "Invalid";
+VAL_ 549 Power_Up_Chime_Modules 1 "Active" 0 "Inactive";
+VAL_ 549 Chime_Source 2 "Cluster" 1 "Infotainment_Sys" 0 "Invalid";
+VAL_ 549 IPC_New_Attn_Event 1 "Active" 0 "Inactive";
+VAL_ 551 PmCabnLvl_D_Stat 7 "NotUsed_1" 6 "Level_6_Worst" 5 "Level_5" 4 "Level_4" 3 "Level_3" 2 "Level_2" 1 "Level_1_Best" 0 "NotKnown";
+VAL_ 551 PmCabn_D_Stat 3 "FilteringComplete" 2 "FilteringOn" 1 "FilteringOff" 0 "NotKnown";
+VAL_ 551 Cntr_Plg_Mode_Cmd 1 "Enable" 0 "Disable";
+VAL_ 551 ChrgCrdLckEnbl_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 551 PwRnngBoardT_D_Rq 3 "NotUsed" 2 "Timer2" 1 "Timer1" 0 "Inactive";
+VAL_ 551 PwRnngBoardSwtch_D_Rq 3 "NotUsed" 2 "DeployUnlocked" 1 "AlwaysActive" 0 "Inactive";
+VAL_ 551 PwRnngBoardMde_D_Rq 0 "Inactive" 1 "Off" 2 "Out" 3 "Auto";
+VAL_ 551 Btt_L_Actl2 127 "Faulty" 126 "NoDataExists";
+VAL_ 551 Rba_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 551 EmPrflNo_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null";
+VAL_ 551 EmPrflButtnAssoc_D_Rq 3 "NotUsed" 2 "ExitButtonAssociation" 1 "EnterButtonAssociation" 0 "Null";
+VAL_ 551 EmPrflKeyAssoc_D_Rq 7 "NotUsed_3" 6 "DisassociatePhone" 5 "EnterPhoneAssociation" 4 "OverwriteKey" 3 "DisassociateKey" 2 "ExitKeyAssociation" 1 "EnterKeyAssociation" 0 "Null";
+VAL_ 551 Em_D_Stat 3 "NotSupported" 2 "ProfilesOff" 1 "ProfilesOn" 0 "Null";
+VAL_ 551 ChrgOvrdExitScrn_D_Rq 3 "NotUsed_1" 2 "Request_override" 1 "Do_not_request_override" 0 "Inactive";
+VAL_ 1010 MbdblActv_B_RqAdas 1 "Yes" 0 "No";
+VAL_ 1010 CbdblActv_B_RqAdas 1 "Yes" 0 "No";
+VAL_ 1010 AdbUrbanArea_B_Stat 1 "Yes" 0 "No";
+VAL_ 1070 BattULo24_D_Falt 3 "NotUsed" 2 "TemporaryFault" 1 "Fault" 0 "NoFault";
+VAL_ 1070 BattULo24_Te_Actl 127 "Fault";
+VAL_ 1070 BattULo24State_D_Qlty 3 "OK" 2 "Not_Within_Spec" 1 "Eval_In_Progress" 0 "Faulty";
+VAL_ 1070 BattULo24_I_Actl 16383 "Faulty";
+VAL_ 1070 BattULo24_B_Falt 1 "Yes" 0 "No";
+VAL_ 1186 SelDrvMdeAwd2_D_Stat 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode";
+VAL_ 1186 RearDiffLckMsg_D_Rq 7 "Locker_Disabled" 6 "Locker_Enabled" 5 "Locker_Accel_Pedal" 4 "Speed4" 3 "Speed3" 2 "Spee2" 1 "Speed1" 0 "Normal__No_Message ";
+VAL_ 1186 RearDiffLckLamp_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 1186 RearDiffLck_Tq_Actl 4095 "Fault" 4094 "Unknown";
+VAL_ 1186 RearDiffFalt_D_Stat 3 "Diff_Failed_Closed" 2 "Diff_Failed_Open" 1 "Fault_Non_Specific" 0 "No_Fault";
+VAL_ 1186 LsdSrvcRqd_B_Rq 1 "On" 0 "Off";
+VAL_ 611 AwdSys_D_Stat 3 "Faulty" 2 "NotUsed" 1 "_4x4_L_H_Active" 0 "_4x4_L_H_Inactive";
+VAL_ 611 AwdStat_D_RqDsply 31 "NotUsed9" 30 "NotUsed8" 29 "NotUsed7" 28 "To_Engage_4x4_Release_Aped" 27 "To_Engage_4x4_Slow_To_3MPH" 26 "Shift_To_Neutral" 25 "Lkr_Mode_Unavail_TMS" 24 " _4x4_Mode_Unavail_TMS" 23 "Out_of_4Low_Crawl" 22 "AWD_PTU_Oil_Changed" 21 "Change_AWD_PTU_Oil" 20 "Neutral_Tow_Disabled" 19 "Neutral_Tow_Enabled" 18 "AWD_OFF" 17 "_4x4_Off_Road_Speed" 16 "_4x4_Extreme_Off_Road_Mode" 15 "_4x4_Exiting_Off_Road" 14 "_4x4_Off_Road_Mode" 10 "_4x4_Locked_Temporarily" 9 "Shift_In_Progress" 13 "Blocked_Shift_Assist" 12 "_4x4_Auto_Restored" 11 "_4x4_Disabled_Temporarily" 7 "Out_of_4Low__Neutral" 6 "Out_of_4Low__Brake" 5 "Out_of_4Low__Speed" 4 "Into_4Low__Clutch" 3 "Into_4Low__Neutral" 2 "Into_4Low__Brake" 1 "Into_4Low__Speed" 0 "Normal__No_Message" 8 "Out_of_4Low__Clutch";
+VAL_ 611 AwdLck_D_Stat 9 "Undefined" 8 "Under_External_Torque_Ctrl" 7 "Torque_Limited_by_Cmd" 6 "Fully_Locked_by_Cmd" 5 "Disabled" 4 "Warning" 3 "Fault" 2 "Inactive" 1 "Completely_Opened_by_Cmd" 0 "OK";
+VAL_ 611 AwdSrvcRqd_B_Rq 1 "On" 0 "Off";
+VAL_ 611 NtrlTowAvail_B_Stat 1 "Available" 0 "NotAvailable";
+VAL_ 611 AwdLck_Tq_Rq 4095 "Fault" 4094 "Unknown";
+VAL_ 611 AwdOffRoadMode_D_Stats 3 "Invalid" 2 "Extreme_Off_Road" 1 "Off_Road" 0 "Normal_Mode";
+VAL_ 611 AwdLoLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 611 AwdHiLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 611 AwdAutoLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 611 Awd2wdLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 611 AwdRnge_D_Actl 7 "Unknown" 6 "High_Range_2wd" 5 "High_Range_Auto" 4 "High_Range_Locked" 3 "Neutral" 2 "Low_Range_2wd" 1 "Low_Range_Auto" 0 "Low_Range_Locked";
+VAL_ 1047 TrlrAidSetup_D2_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "SetupAcquisitionSuccess" 4 "TbaTadMonitor" 3 "SetupStartAcquisition" 2 "SetupPrepForAcquisition" 1 "TbaActive" 0 "Null";
+VAL_ 1047 TrlrAidEnbl_D2_Stat 7 "NotUsed_1" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive";
+VAL_ 1047 TrlrAidMsgTxt_D2_Rq 63 "Message63" 62 "Message62" 61 "Message61" 60 "Message60" 55 "Message55" 50 "Message50" 45 "Message45" 40 "Message40" 35 "Message35" 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1047 EsaOn_B_Stat 1 "On" 0 "Off";
+VAL_ 1047 SelDrvMdeSte_D_Stat 0 "NotAvailable" 1 "Available" 2 "TemporarilyNotAvailable" 3 "Faulty";
+VAL_ 972 LatCtlSte_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Denied" 3 "RampOut" 2 "ContLatControlInProgress" 1 "Available" 0 "Unavailable";
+VAL_ 972 LatCtlLim_D_Stat 3 "LimitWithDriverActive" 2 "LimitReached" 1 "LimitClose" 0 "LimitNotReached";
+VAL_ 972 LatCtlCpblty_D_Stat 3 "Faulty" 2 "ExtendedModeAvailable" 1 "LimitedModeAvailable" 0 "NoModeAvailable";
+VAL_ 972 LsmcBrkDecelEnbl_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "On" 0 "Off";
+VAL_ 972 TjaHandsOnCnfdnc_B_Est 1 "High_Confidence" 0 "Low_Confidence";
+VAL_ 972 LaHandsOff_B_Actl 1 "Hands_Off" 0 "Hands_On";
+VAL_ 972 LaActDeny_B_Actl 1 "LA_Denied" 0 "LA_Not_Denied";
+VAL_ 972 LaActAvail_D_Actl 3 "LKA_LCA_LDW_Avail" 2 "LCA_LKA_Avail_LDW_Suppress" 1 "LCA_LKA_Suppress_LDW_Avail" 0 "LCA_LKA_LDW_Suppress";
+VAL_ 130 TrlrHitchLamp_D_Rqst 1 "On" 0 "Off";
+VAL_ 130 VehVTrlrAid_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 130 DrvSteActv_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 130 DrvSte_Tq_Actl 255 "Invalid" 254 "Unknown";
+VAL_ 130 SteMdule_D_Stat 7 "NotUsed" 6 "EPAS_Failure3" 5 "EPAS_Failure2" 4 "System_Failure" 3 "EPAS_Shutdown" 2 "Normal_Op_Full_Assist" 1 "Normal_Op_Limited_Assist" 0 "EPAS_Initialization";
+VAL_ 130 SteMdule_U_Meas 255 "Invalid";
+VAL_ 130 SteMdule_I_Est 4095 "Invalid";
+VAL_ 130 EPAS_Failure 3 "SERVICE_POWER_STEERING_NOW" 2 "SERVICE_POWER_STEERING" 1 "POWER_STRG_ASSIST_FAULT" 0 "EPAS_OK_NO_MESSAGE";
+VAL_ 130 SteeringColumnTorque 255 "Invalid" 254 "Unknown";
+VAL_ 130 SAPPAngleControlStat6 1 "RequestedAngleNotReached" 0 "RequestedAngleCanBeReached";
+VAL_ 130 SAPPAngleControlStat5 1 "StrgColTorqueExceed_EAROn" 0 "ExternalSigContentOKforEAC";
+VAL_ 130 SAPPAngleControlStat4 1 "SpeedLimitExceededEAROn" 0 "ExternalSigContentOKforEAC";
+VAL_ 130 SAPPAngleControlStat3 1 "EARactiveNoReverseEngage" 0 "ExternalSigContentOKforEAC";
+VAL_ 130 SAPPAngleControlStat2 1 "Rel_ExtSteeringAngleReqx" 0 "NoRel_ExtSteeringAngleReqx";
+VAL_ 130 SAPPAngleControlStat1 3 "Fault" 2 "Active" 1 "Open" 0 "Closed";
+VAL_ 126 StePw_B_Rq 1 "Yes" 0 "No";
+VAL_ 126 StePinRelInit_An_Sns 65535 "Faulty" 65534 "NoDataExists";
+VAL_ 126 StePinCompAnEst_D_Qf 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 133 StePw_B_Rq 1 "Yes" 0 "No";
+VAL_ 133 StePinRelInit_An_Sns 65535 "Faulty" 65534 "NoDataExists";
+VAL_ 133 StePinCompAnEst_D_Qf 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 1200 BrkHold_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "HeldSecondary" 3 "HeldSecure" 2 "Held" 1 "Inactive" 0 "Off";
+VAL_ 1200 HsaTrnAout_Tq_Rq 65535 "Fault" 65534 "Unknown";
+VAL_ 1200 BrkBstrVac_P_Actl 127 "Invalid";
+VAL_ 1200 YawStabilityIndex 511 "Fault" 510 "NoDataExists";
+VAL_ 1200 BrkTot_Tq_RqDrv 8191 "Fault";
+VAL_ 1200 HsaStat_D_Dsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "NotAvailable" 3 "SlowReleaseWithChime" 2 "SlowReleaseWithoutChime" 1 "Active" 0 "Inactive";
+VAL_ 1102 SelDrvMdePos12_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos11_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos10_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos09_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos08_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos07_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos06_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos05_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos04_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos03_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos02_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1102 SelDrvMdePos01_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1056 AutoEpbMsgTxt_D_Rq 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1056 AutoEpbDsply_D_Stat 1 "Available" 0 "NotAvailable";
+VAL_ 1056 AutoEpbButtnOn_B_Stat 1 "On" 0 "Off";
+VAL_ 1056 SelDrvMdePos12_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos11_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos10_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos09_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos08_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos07_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos06_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos05_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos04_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos03_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos02_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 SelDrvMdePos01_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 1056 ActvDrvMde_D2_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1056 SelDrvMde_D2_Rq 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01";
+VAL_ 1056 SelDrvMdePt_D_Rq 31 "Faulty" 30 "NotUsed15" 29 "NotUsed14" 28 "NotUsed13" 27 "NotUsed12" 26 "NotUsed11" 25 "NotUsed10" 24 "NotUsed9" 23 "NotUsed8" 22 "NotUsed7" 21 "NotUsed6" 20 "NotUsed5" 19 "NotUsed4" 18 "EvLaterChargerMode" 17 "EvNowMode" 16 "DragMode" 15 "HighSpeedDesertMode_Baja" 14 "SportAdaptiveMode" 13 "NotAvailable_13" 12 "NotAvailable_12" 11 "NotAvailable_11" 10 "NotAvailable_10" 9 "RockCrawlMode" 8 "MudRutsMode" 7 "SandMode" 6 "EconomyMode" 5 "GrassGravelSnow" 4 "NotAvailable_04" 3 "TowHaulMode" 2 "NotAvailable_02" 1 "SportMode" 0 "NormalMode";
+VAL_ 1056 SelDrvMdeMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1056 SelDrvMde_D_Stat 3 "NotUsed" 2 "DriveModeChangeRequest" 1 "DriveModeChangeSelection" 0 "NoDriveModeChangeRequest";
+VAL_ 1056 AwdMde_D_RqBrk 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo";
+VAL_ 1054 AirDamUp_B_RqBrk 1 "Up" 0 "NoRequest";
+VAL_ 1054 RbaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed";
+VAL_ 1054 SelDrvMdeChassis2_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "RoughRoadMode" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode";
+VAL_ 1054 TrailCtl_D_Stat 7 "Faulty" 6 "DescentOnly" 5 "EnabledDeny" 4 "StandbyOverThreshold" 3 "StandbyOverride" 2 "Active" 1 "EnabledDescent" 0 "Off";
+VAL_ 1054 TrailCtlMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1054 BrkBstrVac_D_Stat 3 "NotUsed" 2 "BoosterVacEstimator" 1 "BoosterVacSensor" 0 "NoBoosterVacuumMonitor";
+VAL_ 1054 DrvSlipCtlOffLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 1054 DrvSlipCtlMdeMsg_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1054 AutoHoldMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1054 CtaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed";
+VAL_ 1054 SelDrvMdeAwd_D_Rq 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode";
+VAL_ 1054 AutoHoldSwMde_B_Ind 1 "On" 0 "Off";
+VAL_ 1054 AutoHoldMde_D_Ind 3 "Indication_3" 2 "Indication_2" 1 "Indication_1" 0 "Off";
+VAL_ 1054 SelDrvMdeChassis_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "NotUsed1" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode";
+VAL_ 1054 ApaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed";
+VAL_ 1046 HsaMde_D_Mem 3 "Undefined" 2 "Manual" 1 "Automatic" 0 "Off";
+VAL_ 1046 BrkBstrVac_B_Rq 1 "Yes" 0 "No";
+VAL_ 1046 HdcMde_D_Actl 7 "Fault" 6 "Temporarily_Unavailable" 5 "NotEnabled_WrongGearSel" 4 "NotEnabled_SpdLimitExceed" 3 "Active_Braking" 2 "Not_Active_Braking" 1 "Off" 0 "Undefined";
+VAL_ 1046 RearDiffLck_Tq2_RqMx 4095 "Faulty";
+VAL_ 1046 TRLR_SWAY_EVNT_IN_PROG 1 "Yes" 0 "No";
+VAL_ 1046 TRLR_SWAY_CONFIG_STAT 1 "On" 0 "Off";
+VAL_ 1046 TCMode 1 "Active" 0 "Inactive";
+VAL_ 1046 DrvSlipCtlLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 1046 Abs_B_Falt 1 "Yes" 0 "No";
+VAL_ 1046 DrvSlipCtlMde_D_Ind 3 "App_Specific_Off_Mode_3" 2 "App_Specific_Off_Mode_2" 1 "App_Specific_Off_Mode_1" 0 "Default_Mode";
+VAL_ 1046 DrvAntiLckLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 1046 StabCtlBrk_B_Avail 1 "Yes" 0 "No";
+VAL_ 1046 DrvHdcWarnInfo_D_Rq 3 "Undefined" 2 "Lamp_On_Continuously" 1 "Lamp_Flashing" 0 "Lamp_Off_Continuously";
+VAL_ 1046 DrvHdcMsg_D_Rq 7 "Undefined" 6 "Speed_too_High" 5 "Temporarily_Unavailable" 4 "System_Fault" 3 "Select_Gear" 2 "Off" 1 "On" 0 "No_Message";
+VAL_ 1046 DrvHdcLampInfo_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 1046 BpedMove_D_Actl 3 "Unknown" 2 "DriverApplyingBrakePedal" 1 "NoAutonomousBrkPdlMovement" 0 "AutonomousBrkPedalMove";
+VAL_ 1046 ChimeBrk_B_Rq 1 "Yes" 0 "No";
+VAL_ 1046 BrkLamp_B_Rq 1 "Yes" 0 "No";
+VAL_ 1046 HILL_DESC_MC 7 "Fault_Detected" 6 "Cooling_Down" 5 "Abort_Apply_Brakes" 4 "Active" 3 "Disabled" 2 "Enabled" 1 "Off_Road" 0 "Normal";
+VAL_ 1046 RearDiffElckrOpen_B_Rq 1 "Yes" 0 "No";
+VAL_ 1045 VehStab_D_Stat 15 "Faulty" 14 "No_Data_Exists" 13 "NotUsed6" 12 "NotUsed5" 11 "NotUsed4" 10 "NotUsed3" 9 "NotUsed2" 8 "NotUsed1" 7 "High_SSRA_no_OS" 6 "Straight" 5 "Post_Oversteer" 4 "Post_Transition" 3 "Countersteer" 2 "Understeer" 1 "Oversteer" 0 "Linear";
+VAL_ 1045 BrkFluidLvl_D_Stat 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK";
+VAL_ 1045 LsmcBrkDecel_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Denied" 3 "FaultDegraded" 2 "FaultExt" 1 "On" 0 "Off";
+VAL_ 1045 VehYawNonLin_W_Rq 4095 "Fault" 4094 "Unknown";
+VAL_ 1045 VehYawLin_W_Rq 4095 "Fault" 4094 "Unknown";
+VAL_ 1045 VehVActlBrk_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 1044 StePinOffst_An_Est 65535 "Faulty" 65534 "NoDataExists";
+VAL_ 1044 StePinOffst_D_Stat 3 "FineOffset" 2 "CoarseOffset" 1 "StoredOffset" 0 "OffsetNotCalculated";
+VAL_ 1042 VehRol_An_Dsply 127 "Faulty" 126 "NoDataExists";
+VAL_ 1042 VehPtch_An_Dsply 127 "Faulty" 126 "NoDataExists";
+VAL_ 535 WhlRr_W_Meas 32767 "Fault" 32766 "Unknown";
+VAL_ 535 WhlRl_W_Meas 32767 "Fault" 32766 "Unknown";
+VAL_ 535 WhlFr_W_Meas 32767 "Fault" 32766 "Unknown";
+VAL_ 535 WhlFl_W_Meas 32767 "Fault" 32766 "Unknown";
+VAL_ 534 WhlDirRr_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward";
+VAL_ 534 WhlDirRl_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward";
+VAL_ 534 WhlDirFr_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward";
+VAL_ 534 WhlDirFl_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward";
+VAL_ 532 RgenTqFalt_B_Actl 1 "Fault" 0 "No_Fault";
+VAL_ 532 RgenBrkDynoMde_B_Actl 1 "TwoWheelDyno" 0 "NormalOperation";
+VAL_ 531 VehStop_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Yes" 0 "No";
+VAL_ 531 TracCtlPtActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 531 LscmbbMntr_B_Err 1 "DisplayMessage" 0 "NoMessage";
+VAL_ 531 LscmbbBrkDis_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 LscmbbDeny_B_ActlBrk 1 "Yes" 0 "No";
+VAL_ 531 PrkBrkYwLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 531 PrkBrkRedLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off";
+VAL_ 531 LscmbbBrkDecel_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AbsActv_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 StabCtlBrkActv_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 CmbbBrkPrchg_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 CmbbBrkDecel_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 CmbbBaSensInc_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AccBrkWarm_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AccBrkTotTqMn_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AccBrkPrchgActv_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AccBrkDis_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AccBrkDeny_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 AccBrkActv_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 PrplDrgCtlActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 531 LscmbbBaSensInc_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 CmbbBrkDis_B_Actl 1 "Yes" 0 "No";
+VAL_ 531 CmbbDeny_B_ActlBrk 1 "Yes" 0 "No";
+VAL_ 531 CcDis_B_Cmd 1 "Yes" 0 "No";
+VAL_ 531 VehLongOvrGnd_A_Est 1023 "Fault" 1022 "Unknown";
+VAL_ 531 LscmbBrkPrchg_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 531 AccStopActv_B_ActlBrk 1 "Yes" 0 "No";
+VAL_ 531 AccDis_B_ActlEpb 1 "Yes" 0 "No";
+VAL_ 531 PrkBrkMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "No_Message";
+VAL_ 531 PrkBrkStatus 7 "GeneralFault_MaintenceMode" 6 "ECD_by_Brake_ECU_Active" 5 "EPB_Limphome_Active" 4 "Rear_Caliper_Open" 3 "RWU_By_EPB_Active" 2 "Rear_Caliper_Transition" 1 "Rear_Caliper_Closed" 0 "Not_Supported";
+VAL_ 136 SteWhlBrkOffst_An_Rq 32767 "Faulty" 32766 "NoDataExists";
+VAL_ 125 VehRolComp_W_Actl 4094 "NoDataExists" 4095 "Fault";
+VAL_ 125 VehVertComp_A_Actl 1022 "NoDataExists" 1023 "Fault";
+VAL_ 125 BrkTot_Tq_RqArb 8191 "Fault" 8190 "Unknown";
+VAL_ 125 BrkTot_Tq_Actl 8191 "Fault" 8190 "Unknown";
+VAL_ 125 HsaStat_D_Actl 7 "Faulty" 6 "FaultyWithDriverIndication" 5 "SlowRelease" 4 "FastRelease" 3 "ActiveBrakePedalReleased" 2 "ActiveBrakePedalPressed" 1 "FindingGradient" 0 "Inactive";
+VAL_ 119 VehTrvlDir_D_Stat 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "Reverse" 2 "LikelyReverse" 1 "Forward" 0 "LikelyForward";
+VAL_ 119 VehOverGnd_V_Est 65535 "Invalid" 65534 "Unknown";
+VAL_ 119 VehLongComp_A_Actl 1023 "Fault" 1022 "NoDataExists";
+VAL_ 119 VehLatComp_A_Actl 1023 "Fault" 1022 "NoDataExists";
+VAL_ 119 VehYawComp_W_Actl 4095 "Fault" 4094 "NoDataExists";
+VAL_ 118 BrkCtrFnd_B_Stat 1 "Yes" 0 "No";
+VAL_ 118 DrvSte_D_Stat 15 "NotUsed10" 14 "NotUsed9" 13 "NotUsed8" 12 "NotUsed7" 11 "NotUsed6" 10 "NotUsed5" 9 "NotUsed4" 8 "NotUsed3" 7 "NotUsed2" 6 "NotUsed1" 5 "Request_Active" 4 "Ignition_Off" 3 "DSR_in_Normal_Idle_Mode" 2 "EPAS_Comm_Disturbed" 1 "DSR_Request_Not_Applicable" 0 "DSR_Deactivated";
+VAL_ 118 DrvSte_Tq_Rq 255 "Invalid" 254 "Unknown";
+VAL_ 118 EmgcyBrkLamp_D_Rq 3 "NotUsed" 2 "Active_at_standstill" 1 "Active_at_speed" 0 "Inactive";
+VAL_ 118 StopLamp_B_RqBrk 1 "Active" 0 "Inactive";
+VAL_ 73 immoSubTarget1Cmd_T1 7 "Unused3" 6 "Unused2" 5 "ECHO_TARGET1_IDBLOCK2" 4 "Unused1" 3 "RQST_TARGET1_IDBLOCK2" 2 "RQST_TARGET1_IDBLOCK1" 1 "RESPONSE" 0 "IDLE";
+VAL_ 561 TrnMsgTxt2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "TransTooHot_LoudChime" 3 "PressBrake_LoudChime" 2 "PressBrake_SoftChime" 1 "PressBrake_NoChime" 0 "NoText_NoChime";
+VAL_ 561 TrnMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage";
+VAL_ 330 TrnAout_W_ActlUnfilt 32767 "Fault" 32766 "Unknown";
+VAL_ 1090 Mtr2State_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_1" 4 "ReadinessState" 3 "DeactivationState" 2 "PowerGeneration" 1 "PowerConsumption" 0 "Null";
+VAL_ 1090 Inv1Ain_I_ActlMntr 32767 "Faulty" 32766 "NoDataExists";
+VAL_ 1090 HybVehMde_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Fuel" 2 "HybridElectric" 1 "AllElectric" 0 "Null";
+VAL_ 1090 ChrgStat_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed" 4 "ChargingCompleted" 3 "NotCharging" 2 "ChargingInDrivingState" 1 "ChargingInParkingState" 0 "Null";
+VAL_ 1090 VehElRnge_L_Dsply 4094 "NoDataExists" 4095 "Fault";
+VAL_ 870 EngMdeMsgTxt_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Charge" 3 "GlowingCharge" 2 "Hybrid" 1 "Ev" 0 "NoMessage";
+VAL_ 870 RngPerChrgInst_L_Dsply 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 869 PwrFlowTxt_D_Dsply 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "Disply_Rgen_Chrg_Txt" 10 "Disp_Fast_Charge_Txt" 9 "Disp_Fast_Charge_Cmplt_Txt" 8 "Disp_Charge_Cmplt_Txt" 7 "Disp_Remote_Start_Txt" 6 "Disp_Eng_Drv_Txt" 5 "Disp_Elec_Drv_Txt" 4 "Disp_Idle_with_Chrg_Txt" 3 "Disp_Idle_Txt" 2 "Disp_Charg_HV_Batt_Txt" 1 "Disp_Hyb_Drive_Txt" 0 "No_Text";
+VAL_ 869 EngOnMsg2_D_Dsply 14 "_0xE_to_1F_NotUsed" 12 "Battery_Temperature" 11 "Hill_Decent_Control" 10 "Fuel_Maintenance" 9 "Oil_Maintenance" 8 "Normal_Operation" 7 "Low_Gear" 6 "Batt_Charging" 5 "Engine_Cold" 4 "Neutral_Gear" 3 "Heater_Setting" 2 "High_Speed" 1 "Acceleration" 0 "No_Display" 13 "Drive_Mode_Selection";
+VAL_ 869 EngOnMsg1_D_Dsply 14 "_0xE_to_1F_NotUsed" 12 "Battery_Temperature" 11 "Hill_Decent_Control" 10 "Fuel_Maintenance" 9 "Oil_Maintenance" 8 "Normal_Operation" 7 "Low_Gear" 6 "Batt_Charging" 5 "Engine_Cold" 4 "Neutral_Gear" 3 "Heater_Setting" 2 "High_Speed" 1 "Acceleration" 0 "No_Display" 13 "Drive_Mode_Selection";
+VAL_ 869 FuelMaintMde_D_Dsply 3 "Feature_Not_Present" 2 "In_Fuel_Maint_Mode" 1 "Close_to_Fuel_Maint" 0 "OK";
+VAL_ 869 EngActv_B_Dsply 1 "On" 0 "Off";
+VAL_ 869 EffWhlThresOn_B_Dsply 1 "On" 0 "Off";
+VAL_ 606 ElVehLaterMde_D_Stat 3 "NotUsed" 2 "Available" 1 "NotAvailable" 0 "Null";
+VAL_ 606 ElVehNowMde_D_Stat 3 "NotUsed" 2 "Available" 1 "NotAvailable" 0 "Null";
+VAL_ 374 GearEngag_D_Actl 7 "Undefined" 6 "Fwd_Clutch_Fully_Engaged" 5 "Neutral_Idle" 4 "Disengaged_to_Neutral_Idle" 3 "Disengaged_to_Neutral_Park" 2 "Engagement_in_Progress" 1 "InitializeFwdClutchEngagmt" 0 "Park_Neutral";
+VAL_ 374 TrnRng_D_Rq 15 "Fault" 14 "Unknown_Position" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Range6" 10 "Range5" 9 "Range4" 8 "Range3_M3_L3" 7 "Range2_M2_L2" 6 "Range1_M1_L1" 5 "Low" 4 "Sport_DriveSport_Mposition" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_ 374 TrnPrkSys_D_Actl 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "FrequencyError" 8 "OutOfRangeHigh" 7 "OutOfRangeLow" 6 "Override" 5 "OutOfPark" 4 "TransitionCloseToOutOfPark" 3 "AtNoSpring" 2 "TransitionCloseToPark" 1 "Park" 0 "NotKnown";
+VAL_ 374 GearLvr_D_ActlDrv 15 "Fault" 14 "Unknown_Position" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Range6" 10 "Range5" 9 "Range4" 8 "Range3_M3_L3" 7 "Range2_M2_L2" 6 "Range1_M1_L1" 5 "Low" 4 "Sport_DriveSport_Mposition" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_ 374 GearPos_D_Trg 15 "Unknown" 14 "Reverse" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Tenth" 9 "Ninth" 8 "Eighth" 7 "Seventh" 6 "Sixth" 5 "Fifth" 4 "Fourth" 3 "Third" 2 "Second" 1 "First" 0 "Neutral";
+VAL_ 374 GearPos_D_Actl 15 "Unknown" 14 "Reverse" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Tenth" 9 "Ninth" 8 "Eighth" 7 "Seventh" 6 "Sixth" 5 "Fifth" 4 "Fourth" 3 "Third" 2 "Second" 1 "First" 0 "Neutral";
+VAL_ 603 WhlDirAvgDrv_D_Actl 3 "Failed" 2 "Unknown" 1 "Backward" 0 "Forward";
+VAL_ 603 PrplTqMnRgen_B_Actl 1 "Yes" 0 "No";
+VAL_ 603 BattTracCnnct_D_Rq 3 "Undefined" 2 "Retain" 1 "Close" 0 "Open";
+VAL_ 602 HtrnWarnLamp_B_Dsply 1 "On" 0 "Off";
+VAL_ 602 HybPwLimOn_B_Stat 1 "Yes" 0 "No";
+VAL_ 602 PwPckTqRdy_B_Dsply 1 "On" 0 "Off";
+VAL_ 1152 BattTracDiagClr_B_Stat 1 "On" 0 "Off";
+VAL_ 1152 EngTeHi_B_Actl 1 "EngineTempHigh" 0 "Normal";
+VAL_ 1152 DcdcOn_B_Rq 1 "On" 0 "Off";
+VAL_ 1152 ULoBattSpprtSustn_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 1152 VehElEff_No_Avg 127 "Faulty" 126 "NoDataExists";
+VAL_ 872 PlgActvArb_B_Dsply 1 "On" 0 "Off";
+VAL_ 872 HybMdeStat_D_Dsply 7 "NotUsed2" 6 "EV_Charge" 5 "EV_Override" 4 "Forced_EV_Mode" 3 "Forced_Charge_Sustain_Mode" 2 "Auto_Charge_Sustain_Mode" 1 "Auto_Charge_Deplete_Mode" 0 "Null_State";
+VAL_ 560 SelDrvMdeSwtch_D_Stat3 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed";
+VAL_ 560 TrnSrvcRqd_B_Rq 1 "On" 0 "Off";
+VAL_ 560 TrnShifActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 560 GearLvrPos_D_Actl 15 "Fault" 14 "Unknown_Position" 13 "Undefined_Treat_as__Fault" 12 "Undefined_Treat_as_Fault" 11 "sixth" 10 "fifth" 9 "fourth" 8 "third" 7 "second" 6 "first" 5 "Low" 4 "Sport_DriveSport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_ 560 GboxOil_Te_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 369 SeatWorkSrfc_B_Falt 1 "Active" 0 "Inactive";
+VAL_ 369 TrnIpcDsplyRng2_D_Actl 15 "No_Range_Selected" 14 "Range_14" 13 "Range_13" 12 "Range_12" 11 "Range_11" 10 "Range_10" 9 "Range_9" 8 "Range_8" 7 "Range_7" 6 "Range_6" 5 "Range_5" 4 "Range_4" 3 "Range_3" 2 "Range_2" 1 "Range_1" 0 "NotUsed";
+VAL_ 369 TrnIpcDsplyRng_D_Stat 3 "NotUsed" 2 "Flash" 1 "On" 0 "Blank_No_Display";
+VAL_ 369 TrnIpcDsplyGear_D_Actl 15 "No_Gear_Selected" 14 "_14th_Gear" 13 "_13th_Gear" 12 "_12th_Gear" 11 "_11th_Gear" 10 "_10th_Gear" 9 "_9th_Gear" 8 "_8th_Gear" 7 "_7th_Gear" 6 "_6th_Gear" 5 "_5th_Gear" 4 "_4th_Gear" 3 "_3rd_Gear" 2 "_2nd_Gear" 1 "_1st_Gear" 0 "Neutral";
+VAL_ 369 TrnIpcDsplyMde_D_Stat 3 "Reserved_Blank_No_Display" 2 "Flash" 1 "On" 0 "Blank_No_Display";
+VAL_ 369 TrnIpcDsplyMde_D_Actl 7 "Manual_3" 6 "Manual_2" 5 "Manual_1_Low" 4 "Sport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_ 369 TrnIpcDsplyGear_D_Stat 3 "Reserved_Blank_No_Display" 2 "Flash" 1 "On" 0 "Blank_No_Display";
+VAL_ 92 TrnLvrV_D_Rq 3 "Full_Speed" 2 "Aggressive" 1 "Normal" 0 "Quiet";
+VAL_ 92 TrnSbwSysHlth_D_Actl 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 92 TrnGearNtmAllow_B_Stat 1 "Yes" 0 "No";
+VAL_ 92 TrnDtpCmd_D_Actl 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "Relatch" 3 "Deploy" 2 "Self_Test" 1 "No_Command" 0 "NotUsed1";
+VAL_ 92 GearSelLck_D_Rq 3 "PreventionBlocker" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_ 92 TrnValidGear_D_Cnfm 3 "Accept" 2 "Reject" 1 "Internal_Request" 0 "No_Command";
+VAL_ 92 TrnNtrlTowCmd_D_Actl 3 "NotUsed" 2 "Neutral_Tow_Entry" 1 "Car_Wash_Mode" 0 "Normal_Mode";
+VAL_ 92 TrnGearCmd_Pc_ActlPt 1023 "Fault";
+VAL_ 92 TrnGear_D_RqPt 7 "Fault" 6 "NotUsed" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "No_Gear";
+VAL_ 92 TrnCmdState_B_Actl 1 "Yes" 0 "No";
+VAL_ 92 PrkBrkActv_D_RqTrnGear 3 "NotUsed2" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "NotUsed1";
+VAL_ 92 TrnGearMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage";
+VAL_ 1087 BattRgenLoChrg_D_RqEng 3 "Disable" 2 "Retain" 1 "Closed" 0 "Open";
+VAL_ 1087 AdasLcObtclAbrt_B_Stat 1 "Yes" 0 "No";
+VAL_ 1087 BattRgenLoDChrg_D_RqEng 3 "Disable" 2 "Retain" 1 "Closed" 0 "Open";
+VAL_ 1087 AirDamPos_D_Stat 3 "Faulty" 2 "NotUsed" 1 "Down" 0 "Up";
+VAL_ 1087 FapLcInhbt_B_Rq 1 "Yes" 0 "No";
+VAL_ 1087 FapLcStopHold_B_Rq 1 "Yes" 0 "No";
+VAL_ 1087 FapLcPrchgBrk_B_Rq 1 "Yes" 0 "No";
+VAL_ 1087 FapLcObstcl_B_Stat 1 "Yes" 0 "No";
+VAL_ 1087 FapLcMaxGrdInhbt_B_Stat 1 "Yes" 0 "No";
+VAL_ 1087 FapLcMaxGrdAbrt_B_Stat 1 "Yes" 0 "No";
+VAL_ 1087 FapLcActv_B_Stat 1 "Yes" 0 "No";
+VAL_ 332 UreaLvlQlty_D_RqDsply 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "FlashChime" 1 "On" 0 "Off";
+VAL_ 332 UreaLvlTxtWarn_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "System_Error" 10 "Engine_Idled_See_Manual" 9 "Engine_Idled_Upon_Refuel" 8 "Speed_Limited_To_XX_mph" 7 "XXmph_Max_Upon_Restart" 6 "Speed_Limited_To_YY_mph" 5 "YYmph_Max_Upon_Restart" 4 "SpdLimtd_YYmph_In_XXmiles" 3 "ExFlRange_XXMiles_ScndWarn" 2 "Exh_Fluid_Range_XX_Miles" 1 "Exh_Fluid_Under_Half_Full" 0 "Exh_Fluid_Over_Half_Full";
+VAL_ 332 UreaQltySysWarn_D_Rq 7 "Undefined" 6 "ZZ_Overrides" 5 "EngineIdled" 4 "Engine_Idle_Upon_Refuel" 3 "SPEED_LIMITED_to_YY_mph" 2 "YY_MPH_MAX_UPON_Restart" 1 "CONTAMINATED_ExhFluid" 0 "NoQualityProblem";
+VAL_ 332 DieslPrtcWarn_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_OverLoaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_OverLimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_OverLoaded" 0 "DPF_Normal_Operation";
+VAL_ 332 UreaQltyFlg_B_RqDsply 1 "True" 0 "False";
+VAL_ 332 UreaQltySys_D_RqDsply 7 "Undefined" 6 "ZZ_Overrides" 5 "EngineIdled" 4 "Engine_Idle_Upon_Refuel" 3 "SPEED_LIMITED_to_YY_mph" 2 "YY_MPH_MAX_UPON_Restart" 1 "CONTAMINATED_ExhFluid" 0 "NoQualityProblem";
+VAL_ 332 UreaLvlTxt_D_RqDsply 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "System_Error" 10 "Engine_Idled_See_Manual" 9 "Engine_Idled_Upon_Refuel" 8 "Speed_Limited_To_XX_mph" 7 "XXmph_Max_Upon_Restart" 6 "Speed_Limited_To_YY_mph" 5 "YYmph_Max_Upon_Restart" 4 "SpdLimtd_YYmph_In_XXmiles" 3 "ExFlRange_XXMiles_ScndWarn" 2 "Exh_Fluid_Range_XX_Miles" 1 "Exh_Fluid_Under_Half_Full" 0 "Exh_Fluid_Over_Half_Full";
+VAL_ 1100 EngExhMdeQuiet_D2_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null";
+VAL_ 1100 HvacCmprLim_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "CompressorHeadPressure" 4 "AvailableTorque" 3 "PedalPosition" 2 "RPM" 1 "ECT" 0 "NoLimit";
+VAL_ 1100 WakeAlarm1_B_Typ 1 "CanAndEcuDriveCircuit" 0 "CanOnly";
+VAL_ 1100 Veh_V_DsplyTrailCtlSet 63 "Faulty";
+VAL_ 1100 TrailCtlPt_B_Falt 1 "Fault" 0 "No_Fault";
+VAL_ 1100 AutoTowAllw_D_StatMnu 3 "TowHaulCommandedOn" 2 "AutoTowHaulEnabled" 1 "AutoTowHaulDisabled" 0 "NoSelection";
+VAL_ 1100 AutoTowActv_B_Stat 1 "Yes" 0 "No";
+VAL_ 1100 GrossTrainWeight_M_Est 255 "Faulty" 254 "NoDataExists";
+VAL_ 1098 EdmSailMdeOn_B_Stat 1 "On" 0 "Off";
+VAL_ 1098 EdmMsgTxt_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OverallGoodScore" 10 "WorkOnCompliance" 9 "GoodCompliance" 8 "WorkOnGearShifting" 7 "GoodGearShifting" 6 "WorkOnEfficientSpeed" 5 "GoodEfficientSpeed" 4 "WorkOnDeceleration" 3 "GoodDeceleration" 2 "WorkOnAcceleration" 1 "GoodAcceleration" 0 "NoMessage";
+VAL_ 1098 EdmLamp_D_Dsply 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "NotUsed_1" 8 "CoastingEngineBrake" 7 "CoastingShiftToNeutral" 6 "FreewayJunction" 5 "Curve2" 4 "Curve1" 3 "SpeedLimit" 2 "Crossing" 1 "FreewayExit" 0 "NoRecommendation";
+VAL_ 1098 EdmCmplnc_B_Dsply 1 "Yes" 0 "No";
+VAL_ 1086 FuelPumpPwr_B_Rq 1 "On" 0 "Off";
+VAL_ 1086 ElLoadCtl_D_Rq 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "HoldAllDrvrInvisibleLoads" 3 "StdDriverInvisibleLoadsOn" 2 "AllDriverInvisibleLoadsOn" 1 "All_Possible_Loads_Off" 0 "No_Request";
+VAL_ 1071 CluPdlPosPcMeas_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 1069 SlMde_D_Stat 3 "IsaNotConfigured" 2 "Manual_Mode" 1 "Auto_Mode" 0 "Null";
+VAL_ 1069 SlMde_D_RqDsply 3 "NotUsed" 2 "ManualSpeed_LimiterSymbol" 1 "AutoSpeed_LimiterSymbol" 0 "NoSpeed_LimiterSymbol";
+VAL_ 1069 IsaOffst_D_Stat 15 "Faulty" 14 "Null" 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero";
+VAL_ 1069 GrllShtrPos_D_Cmd 15 "Fully_Open" 14 "Position14" 13 "Position13" 12 "Position12" 11 "Position11" 10 "Position10" 9 "Position9" 8 "Position8" 7 "Position7" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Fully_Closed";
+VAL_ 1069 GrllShtrPos_B_Falt 1 "Fault" 0 "No_Fault";
+VAL_ 1069 ObdWarmUp_B_Complt 1 "Yes" 0 "No";
+VAL_ 1069 EngMsgTxt_D_Rq 3 "Undefined_2" 2 "Undefined_1" 1 "Power_Reduced_to_LowerTemp" 0 "No_Message";
+VAL_ 1069 EngAirIn_Te_Actl 1023 "Fault" 1022 "Unknown";
+VAL_ 1060 RearDiffOilTeWarn_B_Rq 1 "On" 0 "Off";
+VAL_ 1060 RearDiffOil_Te_Actl 511 "Faulty";
+VAL_ 1060 BpedDrvMsgTxt_B_Dsply 1 "On" 0 "Off";
+VAL_ 1060 FuelLvlWarn_D_ActlEng 7 "DteLevel5Lowest" 6 "DteLevel4" 5 "DteLevel3" 4 "DteLevel2NonMyKey" 3 "DteLevel1MyKey" 2 "VeryLow" 1 "Low" 0 "OK";
+VAL_ 1060 SelDrvMdePt_D_Stat 0 "NotAvailable" 1 "Available" 2 "TemporarilyNotAvailable" 3 "Faulty";
+VAL_ 1057 FohEng_D_Rq 3 "AutoEnable_ParkEnable" 2 "AutoDisable_ParkEnable" 1 "AutoEnable_ParkDisable" 0 "Disable_Stop";
+VAL_ 1057 EngIdlShutDwnTxt_D_Rq 3 "NotUsed" 2 "EngineShutdownOnPrevDrive" 1 "FeatureDisabledDueToFault" 0 "NoMessage";
+VAL_ 1057 EngIdlShutDown_D_Stat 3 "Not_used" 2 "Engine_Shutdown" 1 "Initiated_Countdown" 0 "Normal_Operation";
+VAL_ 1057 FUEL_ALCOHOL_PERCNT 255 "Invalid";
+VAL_ 1057 TrnTotTq_Rt_Est 65535 "Fault" 65534 "Unknown";
+VAL_ 1057 TrnTotLss_Tq_Est 255 "Fault" 254 "Unknown";
+VAL_ 1057 ECMMILRequest 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 1057 AirCondFluidHi_P_Actl 255 "Fault" 254 "Unknown";
+VAL_ 1057 OilPressureWarning 1 "Low_Pressure_Lamp_On" 0 "Normal_Pressure_Lamp_Off";
+VAL_ 1057 VehVLimStat_D_Actl 7 "Undefined_3" 6 "Undefined_2" 5 "Undefined_1" 4 "ASL_Fault_Condition" 3 "Active_and_Limiting" 2 "Active_but_Not_Limiting" 1 "Standby" 0 "Off";
+VAL_ 1057 VehVLimActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 1057 CoolantFanStepAct 31 "Unused7" 30 "Unused6" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 23 "Step23" 22 "Step22" 21 "Step21" 20 "Step20" 19 "Step19" 18 "Step18" 17 "Step17" 16 "Step16" 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 24 "Max_Fan_Speed_Req" 0 "Fan_Cmd_Off";
+VAL_ 1055 EcoCochInstNeg_B_Dsply 1 "True" 0 "False";
+VAL_ 562 GearNtrl_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Yes" 0 "No";
+VAL_ 523 EngAirFiltMsgTxt_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "EngineAirFilterMonitorFalt" 4 "ResetComplete" 3 "Clogged" 2 "ReplaceNow" 1 "ReplaceSoon" 0 "NoMessage";
+VAL_ 523 WaterInFuel_B_Falt 1 "Fault" 0 "No_Fault";
+VAL_ 523 UreaMnAdd_L2_Actl 255 "Faulty";
+VAL_ 523 UreaMxAdd_L2_Actl 511 "Faulty";
+VAL_ 517 FapLc_B_Err 1 "Yes" 0 "No";
+VAL_ 516 EngAoutNActl_D_QF 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 516 EngAout3_N_Actl 65535 "Invalid";
+VAL_ 516 ApedPos_PcRate_ActlArb 255 "Fault" 254 "Unknown";
+VAL_ 516 ApedPosPcActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 514 StrtrMtrDlyStrt_B_Stat 1 "Yes" 0 "No";
+VAL_ 514 VehVTrlrAid_B_Avail 1 "Yes" 0 "No";
+VAL_ 514 StrtrMtrCtlMsgTxt_D_Rq 7 "Start_In_Gear_Allowed" 6 "Pending_Start_Cancelled" 5 "Start_Pending_Please_Wait" 4 "Cranking_Limit_Exceeded" 3 "Press_Brk_and_Shift_to_P_N" 2 "Press_Clutch_and_Brake" 1 "Press_Clutch_To_Start" 0 "No_Display";
+VAL_ 514 VehVActlEng_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 514 GearRvrse_D_Actl 7 "Fault" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Active_confirmed" 2 "Active_not_confirmed" 1 "Inactive_confirmed" 0 "Inactive_not_confirmed";
+VAL_ 514 StrtrMtrCtlMsgTxt_D2_Rq 3 "NoRequestPcmStartingMsgCtl" 2 "ShiftToNeutralToStart" 1 "ShiftToParkToStart" 0 "NoRequestBcmStartingMsgCtl";
+VAL_ 512 PtDrvMde_D_Stat 15 "Faulty" 14 "NotUsed11" 13 "NotUsed10" 12 "NotUsed9" 11 "NotUsed8" 10 "NotUsed7" 9 "NotUsed6" 8 "NotUsed5" 7 "Drag" 6 "Rock" 5 "Baja" 4 "Sand" 3 "TowHaulGradeAssist" 2 "SnowWet" 1 "Sport" 0 "Normal";
+VAL_ 381 EngOilSrvcMsgTxt_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "ResetComplete" 3 "ResetInProgress" 2 "ChangeOilNow" 1 "ChangeOilSoon" 0 "NoText";
+VAL_ 381 RunDryPrevent_B_Stat 1 "True" 0 "False";
+VAL_ 381 WaterInFuel 1 "On" 0 "Off";
+VAL_ 381 GlowIndication 1 "On" 0 "Off";
+VAL_ 380 EngOilLvlWarn_D_Rq1 7 "Undefined_3" 6 "Undefined_2" 5 "Engine_Oil_Monitor_Fault" 3 "Engine_Oil_High" 2 "Engine_Oil_Critical_Low" 1 "Engine_Oil_Low" 0 "No_Message" 4 "Engine_Oil_Critical_High";
+VAL_ 380 EngExhBrkOnLamp_B_Rq 1 "On" 0 "Off";
+VAL_ 380 EngExhBrkAutoLamp_B_Rq 1 "On" 0 "Off";
+VAL_ 380 EngExhBrkMde_D_Actl 6 "ExhBrkDisable_NoError" 5 "ExhBrkActive_AUTO" 4 "ExhBrkActive_ON" 3 "ExhBrkRequest_AUTO" 2 "ExhBrkRequest_ON" 1 "ExhBrkNoRequest_OFF" 0 "ExhBrkUnavailable_Error";
+VAL_ 377 HvacAirFullOut_B_Rq 1 "Yes" 0 "No";
+VAL_ 377 FuelFillInlet_B_Dsply 1 "Yes" 0 "No";
+VAL_ 377 EngSrvcRqd_B_Rq 1 "Engine_Service_Required" 0 "No_engine_service_required";
+VAL_ 377 OdoCount 255 "Invalid";
+VAL_ 377 FuelFilterLamp_B_Dsply 1 "On" 0 "Off";
+VAL_ 377 AirCondRec_B_Rq 1 "Yes" 0 "No";
+VAL_ 377 AirCondClutch_B_Stats 1 "Yes" 0 "No";
+VAL_ 376 GasPrtc_D_RqDsply 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "GpfOverLimit" 1 "GpfAtLimit" 0 "NormalOperation";
+VAL_ 376 DynoMde_B_Cmd 1 "Two_Wheel_Dyno" 0 "Normal_Operation";
+VAL_ 376 AslIconDsply_D_Rq 3 "On_Passive_Overridden" 2 "On_Active" 1 "On_Passive" 0 "Off";
+VAL_ 376 AslChime_B_Rq 1 "Yes" 0 "No";
+VAL_ 376 HvacHtrCore2_Te_Actl 1023 "Faulty";
+VAL_ 376 EcssLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 376 AirAmbTe_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 376 AirAmb_P_Actl 63 "Fault" 62 "NoDataExists";
+VAL_ 373 DieslPrtc2_D_RqDsply 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_Overloaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_Overlimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_Overloaded" 0 "DPF_Normal_Operation";
+VAL_ 373 DieslPrtcRgen_D_Actl 3 "Undefined" 2 "Regen_Level_2" 1 "Regen_Level_1" 0 "No_regen";
+VAL_ 373 EngTeColdPrtct_D_Stats 3 "Engine_Warm_RdcPwr" 2 "OK_to_Drive" 1 "Engine_Warm_PlsWait" 0 "Normal_Operation";
+VAL_ 373 EngExhOvrTe_B_RqDsply 1 "Active" 0 "Inactive";
+VAL_ 359 PrplWhlRgenMn_Tq_Actl 8191 "Faulty";
+VAL_ 359 ElPw_D_StatStrtStop 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Supported_Level_4" 8 "Supported_Level_3" 7 "Supported_Level_2" 6 "Supported_Level_1" 5 "Limited_Support" 4 "Fault_Limited" 3 "LV_Event_in_Progress" 2 "Not_Supported_Imminent" 1 "Supported_All" 0 "Not_Supported";
+VAL_ 359 PrplWhlTot2_Tq_Actl 65535 "Fault" 65534 "NoDataExists";
+VAL_ 359 PwPckTq_D_Stat 3 "PwPckOn_TqAvailable" 2 "StartInPrgrss_TqNotAvail" 1 "PwPckOn_TqNotAvailable" 0 "PwPckOff_TqNotAvailable";
+VAL_ 359 Eng_D_Stat 3 "NotUsed" 2 "EngAutoStopped" 1 "EngOn" 0 "EngOff";
+VAL_ 359 PlgActvArb_B_Actl 1 "On" 0 "Off";
+VAL_ 359 ElPw_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Fault_Limited" 3 "LV_Event_In_Progress" 2 "Not_Supported_Imminent" 1 "Supported" 0 "Not_Supported";
+VAL_ 359 TrnAinTq_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 358 StopStrtStdby_D_Indic 6 "NotUsed2" 5 "Telltale_Struck_Out" 4 "Telltale_Flashing_Amber" 3 "Telltale_On_Amber" 2 "Telltale_Flashing_Green" 1 "Telltale_On_Green" 0 "Telltale_Off" 7 "NotUsed3";
+VAL_ 358 StopStrtIODTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 358 StopStrtDrvMde_D_Indic 3 "NotUsed" 2 "StartStop_IndirectDeselect" 1 "StopStart_Deselected" 0 "StopStart_Selected";
+VAL_ 358 StopStrtMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage";
+VAL_ 358 OdoTripVerify_L_Actl 16777215 "Fault";
+VAL_ 358 HiElPwInhbt_B_Stat 1 "Inhibit" 0 "No_Inibit";
+VAL_ 358 AutoStopPtDelta_I_Est 255 "Fault";
+VAL_ 357 BPedDrvAppl_D_QF 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 357 CmbbDeny_B_ActlPrpl 1 "Yes" 0 "No";
+VAL_ 357 PrplTqMnSat_B_Actl 1 "Yes" 0 "No";
+VAL_ 357 BpedDrvAppl_D_Actl 3 "_Not_Allowed" 2 "Driver_Braking" 1 "Driver_Not_Braking" 0 "Not_Allowed";
+VAL_ 357 CmbbEngTqMn_B_Actl 1 "Yes" 0 "No";
+VAL_ 357 Veh_V_DsplyCcSet 255 "Fault" 254 "Unknown";
+VAL_ 357 AccEngStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "ACCSoonCancel_due_Low_Spd" 4 "Shift_Down_Recommendation" 3 "Shift_Up_Recommendation" 2 "ACCNotAllowedToBeActivated" 1 "ACCStandby_due_Auto_Cancel" 0 "Normal_Operation";
+VAL_ 357 CcMde_D_Actl 7 "TapDownWaiting" 6 "TapUpWaiting" 5 "Resuming_Low" 4 "Resuming_High" 3 "Decelerating" 2 "Accelerating" 1 "Keeping_Speed" 0 "Not_Active";
+VAL_ 357 CcStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "Active" 4 "Active_Que_Assist" 3 "Standby" 2 "Standby_Denied" 1 "Denied" 0 "Off";
+VAL_ 357 CcOvrrdActv_B_Actl 1 "Cruise_Overridden" 0 "Cruise_Req_Not_Overridden";
+VAL_ 357 AccStopMde_D_Rq 3 "Stop_Mode_Active" 2 "EPBApplyOrBrakeReleaseWarn" 1 "Limit_Rolling_Speed" 0 "Stop_Mode_Not_Active";
+VAL_ 355 AutoRgenTxt_B_RqDsply 1 "AutExhFilterCleanOFF" 0 "AutExhFilterCleanON";
+VAL_ 355 AccFllwMdeActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 355 EngPtoMde_D_Actl 7 "Undefined" 6 "Split_Shaft_Stationary" 5 "Not_Used_2" 4 "PTO_Mobile" 3 "Not_Used_1" 2 "PTO_Stationary" 1 "BCP" 0 "Off";
+VAL_ 355 ManRgenTxt_D_RqDsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Cleaning_Aborted_Stopped" 3 "Cleaning_Completed" 2 "Cleaning_In_Progress" 1 "Cleaning_Allowed" 0 "Cleaning_Not_Allowed";
+VAL_ 355 ManRgenSoot_Pc_RqDsply 127 "Fault";
+VAL_ 355 DieslMsgTxt_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "ReducedEnginePower" 0 "NoMessage";
+VAL_ 342 EngOvrhtMitgActv_D_Ind 3 "Undefined" 2 "Mode2" 1 "Mode1" 0 "Normal_Mode";
+VAL_ 342 EngClntTe_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 342 EngOil_Te_Actl 255 "Fault" 254 "Unknown";
+VAL_ 71 immoTarget1Status 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "DISABLED_RESET " 2 "ENABLED_NONMOTIVE_START" 1 "ENABLED_MOTIVE_START" 0 "DISABLED";
+VAL_ 71 immoTarget1Cmd 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "TARGET1_IDBLOCK2" 2 "TARGET1_IDBLOCK1" 1 "CHALLENGE" 0 "IDLE";
+VAL_ 1006 PersIndexIpmb_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 820 AhbStatGfhbFdbk_D_Actl 3 "GfhbHighBeamFullyOn" 2 "GfhbHighBeamPartlyOn" 1 "GfhbHighBeamOff" 0 "GfhbUnavailable";
+VAL_ 820 HeadLghtDrvSide_B_Stat 1 "Left_Hand_Traffic" 0 "Right_Hand_Traffic";
+VAL_ 820 HeadLghtHiOn_B_StatHcm 1 "On" 0 "Off";
+VAL_ 820 Adaptive_Hdlmp_Fault 1 "Yes" 0 "No";
+VAL_ 137 SteWhlOffstRq_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Allow_External_Angle_Req" 0 "Deny_External_Angle_Req";
+VAL_ 137 SteWhlOffst_An_TotActl 32767 "Faulty" 32766 "NoDataExists";
+VAL_ 137 SteWhlBrkOffst_An_Actl 32767 "Faulty" 32766 "NoDataExists";
+VAL_ 129 SelDrvMdeSwtch_D_Stat4 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed";
+VAL_ 129 SteWhlSwtchView_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchSet_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchPhon_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchNav_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchMed_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchIod_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchHud_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchBack_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchMenu_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteEffortInc_B_RqDrv 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SelDrvMdeInc_B_RqDrv 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SelDrvMdeDec_B_RqDrv 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SuspDampInc_B_RqDrv 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchUp_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchRght_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchOk_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchLeft_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchDown_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchHome_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 129 SteWhlSwtchInfo_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 935 SodRight_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off";
+VAL_ 935 CtaAlrtRight2_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "AlertZone4" 3 "AlertZone3" 2 "AlertZone2" 1 "AlertZone1" 0 "Off";
+VAL_ 935 BttRight_D_Stat 7 "NotUsed" 6 "Disabled" 5 "Off" 4 "OffTemp" 3 "NotConnected" 2 "Pending" 1 "Connected" 0 "NotDetermined";
+VAL_ 935 BttRight_D_RqDrv 3 "NotUsed" 2 "Request" 1 "NoRequest" 0 "Null";
+VAL_ 935 CtaBrkRightMsgTxt_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 935 CtaRightBrkEnbl_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 935 CtaRightBrkDecel_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 935 CtaSnsRight_D_Stat 3 "Invalid" 2 "System_Failure" 1 "Blocked" 0 "Clear";
+VAL_ 935 CtaAlrtRight_D_Stat 1 "On" 0 "Off";
+VAL_ 935 CtaRight_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off";
+VAL_ 935 SodSnsRight_D_Stat 3 "Second_Warning_Audio" 2 "System_Failure" 1 "Blocked" 0 "Clear";
+VAL_ 935 SodAlrtRight_D_Stat 3 "Bulb_Proveout" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 935 SodDetctRight_D_Stat 4 "Sensor_Blocked" 3 "Sensor_Fault" 2 "Flash_On" 1 "Alert_On" 0 "AlertOff_FlashOff_SensrClr";
+VAL_ 1108 RCMSerialNoByte8 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte7 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte6 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte5 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte4 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte3 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte2 255 "Invalid" 254 "Unknown";
+VAL_ 1108 RCMSerialNoByte1 255 "Invalid" 254 "Unknown";
+VAL_ 261 ChrgStatDsply_D_Rq 3 "NotUsed_2" 2 "NotUsed_1" 1 "On" 0 "Off";
+VAL_ 261 NextUsageTimeToggle_Rq 0 "Inactive" 2 "Disable" 1 "Enable";
+VAL_ 261 LongTermParking_Rq 0 "Inactive" 1 "On" 2 "Off" 3 "NotUsed";
+VAL_ 261 ModemReset_D_Rq 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "BrandConnectReset2" 5 "BrandConnectReset1" 4 "CcsReset" 3 "OnlineTrafficReset" 2 "PaakReset" 1 "WifiHotspotReset" 0 "Null";
+VAL_ 261 StopStrtDrvMde_B_RqBtn3 1 "Pressed" 0 "Not_Pressed";
+VAL_ 261 TCU_ESN_D_Rq 3 "NotUsed" 2 "TCU_ESN_Request" 1 "NoRequest" 0 "Inactive";
+VAL_ 261 FactoryReset_Rq 1 "ResetFactoryDefaults" 0 "Inactive";
+VAL_ 1146 TrlrAidSwtch_D_RqDrv 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1146 TrlrAidCtl_U_RqDrv 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 533 DcacGfciTestBttn_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 533 DcacPwResetButtn_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 533 DcacPwOffButtn_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 533 DcacPwLoButtn_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 533 DcacPwHiButtn_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 533 DcacPwButtn_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 533 TrlrHitch_D_RqMnu 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "GoToTraileringDomain" 4 "Confirm" 3 "TurnOnTba" 2 "TurnOnAutohitch" 1 "CancelAutohitch" 0 "NoRequest";
+VAL_ 533 AutoEpbZoomView_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 533 AutoEpbButtn_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 533 TrlrAidMde_D_Rq 3 "Mode_3" 2 "Mode_2" 1 "Mode_1" 0 "NoRequest";
+VAL_ 533 TCU_Init_Actvtn_St 3 "NotUsed" 2 "InitialActivateDeny" 1 "InitialActivateAccept" 0 "Invalid";
+VAL_ 533 TCU_Final_Actvtn_St 3 "NotUsed" 2 "FinalActivateDeny" 1 "FinalActivateAccept" 0 "Invalid";
+VAL_ 533 OtaTrg_D_Stat 3 "NotUsed_1" 2 "Accepted" 1 "NotAccepted" 0 "Null";
+VAL_ 533 OnbChrgGoTTouch_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 533 OnbChrgGoTPrcond_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 533 OnbChrgGoTOn_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 533 OnbChrgGoTMnte_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0";
+VAL_ 533 OnbChrgGoTHr_T_Rq 31 "Faulty" 30 "NoDataExists";
+VAL_ 533 OnbChrgGoTExtHtr_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 533 OnbChrgGoTDelete_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 533 OnbChrgClearAll_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 533 PaakMyKey_D_Rq 3 "NotUsed" 2 "ConfirmNewPaakMyKey" 1 "RequestNewPaakMyKey" 0 "None";
+VAL_ 533 OnbChrgGoTUpdate_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 1041 ElCmprUHi_D_Stat 3 "Overvoltage" 2 "Undervoltage" 1 "InRange" 0 "Undetermined";
+VAL_ 1041 ElCmprOverTe_D_Stat 3 "OverTempStop" 2 "OverTempWarning" 1 "Normal" 0 "Undefined";
+VAL_ 1041 ElCmpr_N_Actl 255 "Invalid";
+VAL_ 1041 ElCmpr_Pw_Actl 255 "Invalid";
+VAL_ 1041 ElCmpr_D_Stat 7 "Signal_Invalid" 6 "Comp_Off_ActlSpd_Abnormal" 5 "Comp_Off_TrgtSpd_OutRange" 4 "Comp_Shutdown" 3 "Comp_Stopped_Self_Protect" 2 "Comp_Degraded" 1 "Comp_On" 0 "Comp_Off";
+VAL_ 1041 ElCmprPerfErr_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprInnrErr_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprLostComm_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprOverLoad_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprOverTe_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprBattURng_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprBattSysU_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1041 ElCmprSysU_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet";
+VAL_ 1067 BattULoAuxIsol_D_Rq 3 "Undefined" 2 "Retain" 1 "Close" 0 "Open";
+VAL_ 1067 BattULoAux_U_Rq 4095 "Faulty";
+VAL_ 1067 BattULoAux_I_Actl 4095 "Faulty";
+VAL_ 1067 BattULoAux_D_Qlty 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Faulty";
+VAL_ 1067 BattULoAux_U_Actl 255 "Faulty";
+VAL_ 1067 BattULoAux_B_Falt 1 "Fault" 0 "No_Fault";
+VAL_ 1112 BattTracChrgSustn_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 1112 BattTracCnnct_D_Cmd 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "WeldCheck" 3 "OkToDischarge" 2 "Closed" 1 "Precharge" 0 "Open";
+VAL_ 1112 BattTracHvilOpen_B_Stat 1 "Open" 0 "Closed";
+VAL_ 1112 BattTracDcdcDis_B_Rq 1 "Yes" 0 "No";
+VAL_ 1112 HtrnClntPump_D_Stat 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off";
+VAL_ 1112 BattTracClntPmp_D_Stat 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off";
+VAL_ 139 AfsPw_B_Rq 1 "Yes" 0 "No";
+VAL_ 139 AccButtnGpTogglePress2 1 "Pressed" 0 "Not_Pressed";
+VAL_ 139 TjaButtnOnOffPress2 1 "Pressed" 0 "Not_Pressed";
+VAL_ 139 ActvFrontSteMsgTxt_D_Rq 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 139 ActvFrontSteLck_D_Stat 3 "Test_passed" 2 "Test_failed" 1 "Test_cannot_run" 0 "Test_incomplete";
+VAL_ 139 SelDrvMdeAdptSte_D_Stat 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable";
+VAL_ 139 AslButtnOnOffPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 AslButtnOnOffCnclPres2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcButtnOnPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcButtnOnOffPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcButtnOnOffCnclPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcButtnOffPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAsllButtnResPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnSetPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnSetIncPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnSetDecPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnResIncPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnResDecPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnOnPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnOnOffCncl2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnOffCnclPres2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnIndxIncPres2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnIndxDecPres2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnDeny_B_Actl2 1 "Yes" 0 "No";
+VAL_ 139 CcAslButtnCnclResPres2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 CcAslButtnCnclPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 AccButtnGapIncPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 139 AccButtnGapDecPress2 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 1121 SelDrvMdeSwtch_D_Stat 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed";
+VAL_ 1121 SelDrvMdeCnt_D_Stat 4 "FourCounts" 3 "ThreeCounts" 2 "TwoCounts" 1 "OneCount" 0 "ZeroCounts" 7 "SevenOrMoreCounts" 6 "SixCounts" 5 "FiveCounts";
+VAL_ 1120 DrvSlipCtlMde_B_Rq3 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1120 HybMdeSwtch_B_Rq 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1120 TrailCtlSwtch_B_Stat3 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1120 RearDiffLck_D_RqDrv 3 "Faulty" 2 "NoRequest" 1 "On" 0 "Off";
+VAL_ 1120 AwdMde_D_RqDrv 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo";
+VAL_ 1120 HdcSwtchPos_B_Actl 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1050 AutoHoldSwtch_D_Stat 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1050 LpdbPtc3_B_Rq 1 "On" 0 "Off";
+VAL_ 1050 LpdbPtc2_B_Rq 1 "On" 0 "Off";
+VAL_ 1050 LpdbPtc1_B_Rq 1 "On" 0 "Off";
+VAL_ 1050 LpdbHeatWiprPrk_B_Rq 1 "On" 0 "Off";
+VAL_ 1050 LpdbDfrstRearOn_B_Rq 1 "On" 0 "Off";
+VAL_ 1050 SteWhlHeat_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Reserved_3" 8 "Reserved_2" 7 "Reserved_1" 6 "Level_3_Heating" 5 "Level_3_Heating_LS" 4 "Level_2_Heating" 3 "Level_2_Heating_LS" 2 "Level_1_Heating" 1 "Level_1_Heating_LS" 0 "Off";
+VAL_ 1050 MirrorHeatOn_B_Rq 1 "True" 0 "False";
+VAL_ 1050 Remote_Start_QuietMode 1 "Quiet" 0 "Not_Quiet";
+VAL_ 1050 Outside_Air_Temp_Stat 255 "Invalid" 254 "Unknown";
+VAL_ 1137 RngPerChrgAvg_L_Dsply 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 1255 BalrRight4Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1255 BalrRight4Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1255 BalrRight4Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1254 BalrRight3Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1254 BalrRight3Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1254 BalrRight3Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1253 BalrRight2Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1253 BalrRight2Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1253 BalrRight2Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1252 BalrRight1Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1252 BalrRight1Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1252 BalrRight1Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1251 BalrLeft4Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1251 BalrLeft4Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1251 BalrLeft4Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1250 BalrLeft3Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1250 BalrLeft3Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1250 BalrLeft3Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1249 BalrLeft2Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1249 BalrLeft2Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1249 BalrLeft2Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1248 BalrLeft1Threat_D_Stat 1 "Yes" 0 "No";
+VAL_ 1248 BalrLeft1Fast_B_Stat 1 "Yes" 0 "No";
+VAL_ 1248 BalrLeft1Dsply_B_Stat 1 "Yes" 0 "No";
+VAL_ 1113 TrlrTrgtAcquire_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "RVCforTBA_Activated" 3 "Processing" 2 "TargetNotAcquired" 1 "TargetAcquired" 0 "Null";
+VAL_ 1113 TrlrAnOffstDir_D_Calc 3 "NotUSed" 2 "Right" 1 "Left_or_Center" 0 "Null";
+VAL_ 1113 TrlrAnCalib_B_Complt 1 "Yes" 0 "No";
+VAL_ 1113 TrlrRvrse_D_Stat 3 "Faulty" 2 "TrailerReverseGuidanceLite" 1 "On" 0 "Off";
+VAL_ 1113 TrlrAid_D2_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "DirtyCamera" 9 "IncorrectLighting" 8 "TrackingLost" 7 "TrackingUnknownConfidence" 6 "TrackingHighConfidence" 5 "TrackingMediumConfidence" 4 "TrackingLowConfidence" 3 "TurnRequested" 2 "DriveStraighRequested" 1 "Initializing" 0 "NotTracking";
+VAL_ 1113 TrlrAid_An3_Actl 2047 "Faulty";
+VAL_ 1113 TrlrAid_AnRate2_Actl 1023 "Faulty";
+VAL_ 1113 HitchToVehAxle_L_Calc 255 "Faulty";
+VAL_ 1105 TrlrAidSwtchLamp_B_Rq 1 "On" 0 "Off";
+VAL_ 1105 TrlrHitchMsgTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage" 63 "Message63" 47 "Message47";
+VAL_ 1105 TrlrHitchIcon_D_Rq 15 "Icon15" 14 "Icon14" 13 "Icon13" 12 "Icon12" 11 "Icon11" 10 "Icon10" 9 "Icon9" 8 "Icon8" 7 "Icon7" 6 "Icon6" 5 "Icon5" 4 "Icon4" 3 "Icon3" 2 "Icon2" 1 "Icon1" 0 "NoIcon";
+VAL_ 1105 TrlrHitchChime_D_Rq 7 "NotUsed_1" 6 "NotUsed_1" 5 "WarningChime" 4 "NonCriticalAlertChime" 3 "StopNowChime" 2 "ManeuveringReadyChime" 1 "TrailerFoundChime" 0 "NoChime";
+VAL_ 1105 TrlrAidEnbl_D_RqAdas 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Deactivate" 2 "NotAvailable" 1 "ActiveTba" 0 "Inactive";
+VAL_ 1105 TrlrRvrseMsgTxt_D2_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 1105 TrlrRvrseEnbl_D2_Stat 7 "NotUsed" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive";
+VAL_ 1105 RbaMsg_D_Rq 3 "Faulty" 2 "Unavailable" 1 "Off" 0 "Null";
+VAL_ 1105 BrkDecel_B_RqRba 1 "Enable" 0 "Disable";
+VAL_ 1105 BrkEnbl_B_RqRba 1 "Enable" 0 "Disable";
+VAL_ 1105 Rba_D_Stat 3 "NotUsed" 2 "Disabled" 1 "On" 0 "Off";
+VAL_ 1105 RbaAlrt_D_Dsply 3 "Both" 2 "Text" 1 "Graphic" 0 "Off";
+VAL_ 1105 RbaMnu_D_Rq 3 "NotUsed" 2 "Active" 1 "Inactive" 0 "None";
+VAL_ 1105 CamraFrntStat_D_Stat 3 "No_Data_Present" 2 "NotUsed" 1 "On" 0 "Off";
+VAL_ 1105 TrlrHitchLamp_D_Rq2 1 "On" 0 "Off";
+VAL_ 938 SidePrkSnsR2_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 938 SidePrkSnsR1_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 938 SidePrkSnsL2_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 938 ApaMde_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "POA" 3 "PPA" 2 "SAPP" 1 "Off" 0 "Null";
+VAL_ 938 ApaActvSd_D_Actl 3 "Dirver_Side" 2 "Passenger_Side" 1 "No_Side" 0 "Null";
+VAL_ 938 PrkAidSwtch_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 938 ApaMde_D_Avail 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "PPA_POA" 7 "SAPP_POA" 6 "POA" 5 "PPA" 4 "SAPP" 3 "SAPP_PPA_POA" 2 "SAPP_PPA" 1 "None" 0 "Null";
+VAL_ 938 PrkAidSnsFrCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 938 PrkAidSnsFrCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 938 PrkAidSnsFlCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 938 PrkAidSnsFlCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 938 PrkBrkEl_B_RqFap 1 "Yes" 0 "No";
+VAL_ 938 RpaChime_D_Rq 15 "Zone15_Chime" 14 "Zone14_Chime" 13 "Zone13_Chime" 12 "Zone12_Chime" 11 "Zone11_Chime" 10 "Zone10_Chime" 9 "Zone9_Chime" 8 "Zone8_Chime" 7 "Zone7_Chime" 6 "Zone6_Chime" 5 "Zone5_Chime" 4 "Zone4_Chime" 3 "Zone3_Chime" 2 "Zone2_Chime" 1 "Zone1_Chime" 0 "No_Chime";
+VAL_ 938 FpaChime_D_Rq 15 "Zone15_Chime" 14 "Zone14_Chime" 13 "Zone13_Chime" 12 "Zone12_Chime" 11 "Zone11_Chime" 10 "Zone10_Chime" 9 "Zone9_Chime" 8 "Zone8_Chime" 7 "Zone7_Chime" 6 "Zone6_Chime" 5 "Zone5_Chime" 4 "Zone4_Chime" 3 "Zone3_Chime" 2 "Zone2_Chime" 1 "Zone1_Chime" 0 "No_Chime";
+VAL_ 938 PrkAidMsgTxt_D_Rq 15 "All_Sns_Blk" 14 "R_Sns_ON_F_Sns_Blk" 13 "R_Sns_Blk_F_Sns_ON" 12 "R_Sns_Inactive_Trlr_atch" 11 "Not_Avail_Trlr_attchd" 10 "Fail_Mode_no_Chime" 9 "Fail_Mode_with_Chime" 8 "R_Sns_Trlr_F_Sns_Blk" 7 "NotUsed3" 6 "Park_Sys_Alternate_Mode" 5 "R_Snsrs_On_F_Snsrs_On" 4 "NotUsed2" 3 "Reset_Message_Warn" 2 "R_Snsrs_Off_F_Snsrs_On" 1 "R_Snsrs_On_F_Snsrs_Off" 0 "All_Park_Sensors_Off";
+VAL_ 938 SidePrkSnsL1_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 938 PrkAidAudioMute_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 939 ApaBrk_D_Rq 3 "NotUsed" 2 "LowDecel" 1 "HighDecel" 0 "NoRequest";
+VAL_ 939 SidePrkSnsR4_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 939 SidePrkSnsR3_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 939 SidePrkSnsL4_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 939 SidePrkSnsL3_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off";
+VAL_ 939 PrkAidChime_D_Stat 3 "Fault" 2 "No_Data_Exists" 1 "On" 0 "Off";
+VAL_ 939 PrkAidSnsRlCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 939 PrkAidSnsRrCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 939 PrkAidSnsRrCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 939 PrkAidSnsRlCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off";
+VAL_ 939 PrkAidRear_D_Stat 3 "Faulted" 2 "Unused" 1 "Enabled" 0 "Disabled";
+VAL_ 939 PrkAidFront_D_Stat 3 "Faulted" 2 "Unused" 1 "Enabled" 0 "Disabled";
+VAL_ 939 PrkAid_D_Falt 7 "NotUsed2" 6 "NotUsed1" 5 "Failure_Front_PSM_Sensors" 4 "No_Data_Exists" 3 "Failure_Rear_Sensors" 2 "Speaker_Fault" 1 "ECU_Fault" 0 "No_Fault";
+VAL_ 939 ApaLongCtrlEnbl_D_Rq 1 "Enable" 0 "Disable";
+VAL_ 939 PrkAidLamp_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 937 TrnRng_D_RqFap 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Backwards" 3 "Forwards" 2 "NoMotion" 1 "Immobilize" 0 "NoRequest";
+VAL_ 937 FapLcDistToObj_L_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 936 ApaButtnPrssd_B_Stat 1 "Pressed" 0 "Not_Pressed";
+VAL_ 936 ApaSys_D_Stat 7 "Faulty" 6 "Finished" 5 "NotAccessible" 4 "ApaCancelled" 3 "Overspeed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 936 ApaSteWhl_D_RqDrv 3 "TakeControl" 2 "RemoveHands" 1 "NoRequest" 0 "Null";
+VAL_ 936 ApaSteScanMde_D_Stat 3 "Steering" 2 "Scanning" 1 "NotScanning" 0 "Null";
+VAL_ 936 ApaSelSapp_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null";
+VAL_ 936 ApaSelPpa_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null";
+VAL_ 936 ApaSelPoa_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null";
+VAL_ 936 ApaScan_D_Stat 3 "ParkSlotReady" 2 "ParkSlotFound" 1 "NoParkSlot" 0 "Null";
+VAL_ 936 ApaLongCtl_D_RqDrv 7 "NotUsed3" 6 "NotUsed2" 5 "ReleaseBrake" 4 "DriveBackward" 3 "DriveForward" 2 "Stop" 1 "NoRequest" 0 "Null";
+VAL_ 936 ApaGearShif_D_RqDrv 7 "NotUSed2" 6 "NotUsed1" 5 "ShiftToP" 4 "ShiftToN" 3 "ShiftToD" 2 "ShiftToR" 1 "NoRequest" 0 "Null";
+VAL_ 936 ApaActvSide2_D_Stat 3 "NoSide" 2 "Right" 1 "Left" 0 "Null";
+VAL_ 936 ApaAcsy_D_RqDrv 7 "CloseDoor" 6 "SelectSideRight" 5 "SelectSideLeft" 4 "CheckForObject" 3 "PressApaButton" 2 "SelectSide" 1 "NoRequest" 0 "Null";
+VAL_ 936 ApaTrgtDist_D_Stat 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 0 "Off";
+VAL_ 936 ApaChime_D_Rq 7 "NotUsed2" 6 "NotUsed1" 5 "Warning_Chime" 4 "Finish_Chime" 3 "Stop_Now_Chime" 2 "Spot_Ready_Chime" 1 "Spot_Found_Chime" 0 "No_Chime";
+VAL_ 936 EPASExtAngleStatReq 1 "Request" 0 "NoRequest";
+VAL_ 936 ExtSteeringAngleReq2 32767 "Invalid" 32766 "Unknown";
+VAL_ 877 VehElEffAvg_No_Dsply 127 "Faulty" 126 "NoDataExists";
+VAL_ 877 PwFlwFuelDrv_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "FlwFromFuelToAllWhls" 2 "FlwFromFuelToFrontWhls" 1 "FlwFromFuelToRearWhls" 0 "NoFlow";
+VAL_ 877 PwFlwFuelClimt_B_Dsply 1 "On" 0 "Off";
+VAL_ 877 PwFlwFuelBatt_B_Dsply 1 "On" 0 "Off";
+VAL_ 877 PwFlwBattClimt_B_Dsply 1 "On" 0 "Off";
+VAL_ 877 PwFlwBatt_D_Dsply 15 "NotUsed_8" 14 "NotUsed_7" 13 "NotUsed_6" 12 "NotUsed_5" 11 "NotUsed_4" 10 "NotUsed_3" 9 "NotUsed_2" 8 "NotUsed_1" 7 "FlwFromWallToBatt" 6 "FlwFromAllWhlsToBatt" 5 "FlwFromBattToAllWhls" 4 "FlwFromFrontWhlsToBatt" 3 "FlwFromBattToFrontWhls" 2 "FlwFromRearWhlsToBatt" 1 "FlwFromBattToRearWhls" 0 "NoFlow";
+VAL_ 588 BattTracSoc2_Pc_Actl 16383 "Faulty" 16382 "NoDataExists";
+VAL_ 588 BattTrac_Te_Actl 1023 "Fault" 1022 "Unknown";
+VAL_ 588 BattTracDiagClr_B_Rq 1 "On" 0 "Off";
+VAL_ 587 BattTracWarnLamp_B_Rq 1 "On" 0 "Off";
+VAL_ 587 BattTracSrvcRqd_B_Rq 1 "On" 0 "Off";
+VAL_ 389 HtrnOvrTeLamp_B_Dsply 1 "On" 0 "Off";
+VAL_ 389 HtrnMil_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 389 HtrnAin_UHi_Actl 1023 "Fault" 1022 "Unknown";
+VAL_ 389 HtrnSrvcRqd_B_Dsply 1 "On" 0 "Off";
+VAL_ 389 HtrnHvilOpen_B_Actl 1 "HVIL_is_Open" 0 "Normal_Operation";
+VAL_ 389 PtWakeupDeltaT_T_Rq 2047 "Fault" 2046 "NoDataExists";
+VAL_ 389 PreCondActv_B_Actl 1 "On" 0 "Off";
+VAL_ 389 DrvCondTpRrDefrs_B_Rq 1 "On" 0 "Off";
+VAL_ 389 BattTrac_I_EstVsc 32767 "Fault" 32766 "NoDataExists";
+VAL_ 1009 ChrgCordUnlock_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 1009 AutoHoldSwtch_D_Stat3 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1009 TrlrTrgtAcquire_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "ActivateRVCforTBA" 4 "CancelAcquisition" 3 "RetryAcquisition" 2 "AcquisitionSuccessful" 1 "StartAcquisition" 0 "Inactive";
+VAL_ 1009 TrlrAidCancl_B_Rq 1 "Cancel" 0 "Null";
+VAL_ 1009 CenterStackRing_D_Actl 3 "LimitedOn" 2 "On" 1 "Off" 0 "Null";
+VAL_ 1009 ValetMode_D_Stat 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 1009 TrlrAidSetup_D_Stat 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "EnterParameters" 2 "EndSetup" 1 "BeginSetup" 0 "Null";
+VAL_ 360 GsmSrvcRqd_B_Rq 1 "Yes" 0 "No";
+VAL_ 360 TrnGearPwmFalt_B_Actl 1 "Yes" 0 "No";
+VAL_ 360 GearButtnStuck_B_Actl 1 "Yes" 0 "No";
+VAL_ 122 VehStrtInhbt_B_RqBatt 1 "Yes" 0 "No";
+VAL_ 122 BattTracOffFst_D_Actl 3 "Unexpected_Contactor_Open" 2 "Restraints_Impact_Event" 1 "Interlock_Open" 0 "Normal";
+VAL_ 122 BattTracOff_B_Actl 1 "Yes" 0 "No";
+VAL_ 122 BattTracMil_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 122 BattTrac_U_Actl 1023 "Fault" 1022 "Unknown";
+VAL_ 122 BattTrac_I_Actl 32767 "Fault" 32766 "Unknown";
+VAL_ 90 TrnGsmNtmState_D_Actl 3 "Faulty" 2 "Neutral_Tow_Mode" 1 "Car_Wash_Mode" 0 "None";
+VAL_ 90 DrQltyDrv_D_StatGsm 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "ClosedDegraded" 2 "OpenDegraded" 1 "ClosedOkay" 0 "OpenOkay";
+VAL_ 90 TrnBtsiOvrrd_B_Stat 1 "Override" 0 "Null";
+VAL_ 90 GsmGearMsgTxt_D_Rq 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 90 TrnRng_D_RqGsm 15 "Fault" 14 "UnknownPosition" 13 "Undefined_2" 12 "Undefined_1" 11 "_6" 10 "_5" 9 "_4" 8 "_3" 7 "_2" 6 "_1" 5 "Low" 4 "Sport_DriveSport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park";
+VAL_ 90 PrkBrkActv_D_RqGsmGear 3 "NotUsed" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "Null";
+VAL_ 90 TrnValidGearRq_D_Stat 3 "Valid_Request" 2 "Valid_Degraded_Request" 1 "Invalid_Request" 0 "No_Request";
+VAL_ 90 TrnGearButtn_U_Actl 255 "Fault";
+VAL_ 90 TrnGearButtn_B_ActlR2 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlR1 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlR0 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlP2 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlP1 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlP0 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlN2 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlN1 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlN0 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlM2 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlM1 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlM0 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlD2 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlD1 1 "Yes" 0 "No";
+VAL_ 90 TrnGearButtn_B_ActlD0 1 "Yes" 0 "No";
+VAL_ 90 TrnGear_D_RqDrv 31 "Fault" 30 "NotUsed_25" 29 "NotUsed_24" 28 "NotUsed_23" 27 "NotUsed_22" 26 "Return_to_Park" 25 "NotUsed_20" 24 "NotUsed_19" 23 "NotUsed_18" 22 "NotUsed_17" 21 "Return_To_Park" 20 "NotUsed_15" 19 "NotUsed_14" 18 "NotUsed_13" 17 "NotUsed_12" 16 "Manual" 15 "Not_Used11" 14 "Not_Used10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "Drive" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "Neutral" 3 "NotUsed_1" 2 "Reverse" 1 "Park" 0 "No_Gear";
+VAL_ 90 BrkSwtchPos_B_ActlGsm 1 "Yes" 0 "No";
+VAL_ 1091 ParkLampTrlrOut_B_Stat 1 "Out" 0 "Null";
+VAL_ 1091 TrlrLampCtl_D_Stat 3 "NotUsed" 2 "TrlrLampCnnctDrvFailure" 1 "TrlrLampNotCnnctDrvFailure" 0 "Null";
+VAL_ 1091 TrlrBattChrg_D_Stat 3 "Reverse" 2 "Normal" 1 "Low" 0 "Null";
+VAL_ 1091 StopLampTrlrOut_B_Stat 1 "Out" 0 "Null";
+VAL_ 1091 TurnLampTrlrRr_B_Stat 1 "Out" 0 "Null";
+VAL_ 1091 TurnLampTrlrRl_B_Stat 1 "Out" 0 "Null";
+VAL_ 1091 TrlrLampCnnct_B_Actl 1 "Yes" 0 "No";
+VAL_ 138 SteWhlRelCalib_An_Sns 32767 "Fault" 32766 "NoDataExists";
+VAL_ 131 AccButtnGapDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 HeadLghtHiCtrl_D_RqAhb 7 "NotUsed2" 6 "NotUsed1" 5 "Auto_HiBeam" 4 "Auto_LoBeam" 3 "Flash" 2 "Man_HiBeam" 1 "Man_LoBeam" 0 "Null";
+VAL_ 131 AhbStat_B_Dsply 1 "On" 0 "Off";
+VAL_ 131 WiprFrontSwtch_D_Stat 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "PositionNotDetermined" 8 "High" 7 "Low" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Off";
+VAL_ 131 HeadLghtHiOn_B_StatAhb 1 "On" 0 "Off";
+VAL_ 131 HeadLghtHiFlash_D_Actl 3 "NotUsed" 2 "High" 1 "Flash_to_Pass" 0 "Null";
+VAL_ 131 TjaButtnOnOffPress 1 "Pressed" 0 "Not_Pressed";
+VAL_ 131 AccButtnGapTogglePress 1 "Pressed" 0 "Not_Pressed";
+VAL_ 131 HeadLghtHiFlash_D_Stat 3 "NotUsed" 2 "High" 1 "Flash_to_Pass" 0 "Null";
+VAL_ 131 WiprFront_D_Stat 15 "NO_DATA_EXISTS" 14 "STALLED" 13 "RESERVED" 12 "AUTO_ADJUST" 11 "COURTESYWIPE" 10 "AUTO_HIGH" 9 "AUTO_LOW" 8 "WASH" 7 "MIST_FLICK" 6 "MAN_HIGH" 5 "MAN_LOW" 4 "MAN_INT_ON" 3 "MAN_INT_OFF" 2 "OFF_MOVING" 1 "AUTO_OFF" 0 "OFF";
+VAL_ 131 TurnLghtSwtch_D_Stat 3 "Unused_Treat_As_Off" 2 "Right" 1 "Left" 0 "Off";
+VAL_ 131 LghtAmb_D_Sns 7 "No_Data_Exists" 6 "Unused2" 5 "Unused1" 4 "Tunnel_Off" 3 "Tunnel_On" 2 "Twilight" 1 "Light" 0 "Dark";
+VAL_ 131 AccButtnGapIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 AslButtnOnOffPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 AslButtnOnOffCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcButtnOnPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcButtnOnOffPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcButtnOnOffCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcButtnOffPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAsllButtnResPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnSetPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnSetIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnSetDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnResIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnResDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnOnPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnOnOffCncl 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnOffCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnIndxIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnIndxDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnDeny_B_Actl 1 "Yes" 0 "No";
+VAL_ 131 CcAslButtnCnclResPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 CcAslButtnCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed";
+VAL_ 131 LaSwtchPos_D_Stat 3 "Fault" 2 "Unused" 1 "Pressed" 0 "Open";
+VAL_ 787 DrTgateChime2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Long_Repeated" 3 "Fast" 2 "Short" 1 "Long" 0 "Off";
+VAL_ 787 DrTGate_D_Rq 3 "NotUsed" 2 "Closing" 1 "Opening" 0 "Not_Moving";
+VAL_ 787 PwLftgtIntSw_B_Stat 1 "Pressed" 0 "Null";
+VAL_ 787 Power_Liftgate_Mode_Stt 2 "Unused" 3 "Not_Supported" 1 "Enabled" 0 "Disabled";
+VAL_ 953 BattRgenLoDChrg_D_Rq 3 "DoNotCare" 2 "Retain" 1 "Closed" 0 "Open";
+VAL_ 953 BattRgenLoChrg_D_Rq 3 "DoNotCare" 2 "Retain" 1 "Closed" 0 "Open";
+VAL_ 953 ChrgCordLck_B_Stat 1 "Unlock" 0 "Null";
+VAL_ 953 WakeAlarm3_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff";
+VAL_ 953 WakeAlarm2_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff";
+VAL_ 953 WakeAlarm1_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff";
+VAL_ 953 WakeAlarm0_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff";
+VAL_ 1093 TrlBrkInitOut_D_Stat 3 "Heavy" 2 "Medium" 1 "Light" 0 "Null";
+VAL_ 1093 TrlrBrkMde_D_Actl 1 "Electric_Over_Hydraulic" 0 "Electric";
+VAL_ 1093 TrlrBrkDsply_B_Rq 1 "Yes" 0 "No";
+VAL_ 1093 TrlrBrkDcnnt_B_Actl 1 "Yes" 0 "No";
+VAL_ 1093 TrlrBrkActCnnct_B_Actl 1 "Yes" 0 "No";
+VAL_ 1093 StopLamp_B_RqTrlrBrk 1 "Yes" 0 "No";
+VAL_ 1093 TrlrBrkCtl_B_Falt 1 "Yes" 0 "No";
+VAL_ 1093 TrlrBrkActCirct_B_Falt 1 "Yes" 0 "No";
+VAL_ 792 ElTrip_L_Dsply 65535 "Fault" 65534 "No_Data_Exists";
+VAL_ 792 ElLongTerm_L_Dsply 16777215 "Fault" 16777214 "No_Data_Exists";
+VAL_ 968 SlMde_D_Rq 3 "IsaNotConfigured" 2 "Manual_Mode" 1 "Auto_Mode" 0 "Null";
+VAL_ 968 IsaOffst_D_Rq 15 "Faulty" 14 "Null" 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero";
+VAL_ 819 Memory_3_SwPsngr_Stat 1 "Pressed" 0 "Null";
+VAL_ 819 Memory_2_SwPsngr_Stat 1 "Pressed" 0 "Null";
+VAL_ 819 Memory_1_SwPsngr_Stat 1 "Pressed" 0 "Null";
+VAL_ 819 BLISLEDStatPassSide 3 "Fault" 2 "Unused" 1 "On" 0 "Off";
+VAL_ 819 WndwPsngrSide_D_Stat 3 "BothWindow_Operating" 2 "RearWindow_Operating" 1 "FrontWindow_Operating" 0 "NoWindows_Operating";
+VAL_ 819 Pasngr_Lock_Sw_Stat 3 "Invalid" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_ 819 ChildLckFdbckRp_B_Stat 1 "Locked" 0 "Unlock";
+VAL_ 818 BLISLEDStatDriverSide 3 "Fault" 2 "Unused" 1 "On" 0 "Off";
+VAL_ 818 WndwDrvSide_D_Stat 3 "BothWindow_Operating" 2 "RearWindow_Operating" 1 "FrontWindow_Operating" 0 "NoWindows_Operating";
+VAL_ 818 KeyCylSwDrvDr_D_Stat 3 "NotUsed" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_ 818 Driver_Lock_Sw_Stat 3 "Invalid" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_ 818 ChildLckPw_D_Rq 1 "Active" 0 "Null";
+VAL_ 818 ChildLckFdbckRd_B_Stat 1 "Locked" 0 "Unlock";
+VAL_ 818 RvrseMirrorChime_B_Rq 1 "Yes" 0 "No";
+VAL_ 806 SnowPlowMde_B_Enbl 1 "Enable" 0 "Disable";
+VAL_ 806 StopStrtDrvMde_B_RqBtn 1 "Pressed" 0 "Not_Pressed";
+VAL_ 806 ClimtHeat_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "PtcHtrTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownHeatingReq" 1 "OpportunisticHeatingReq" 0 "NoHeatingRequest";
+VAL_ 806 ClimtCool_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "ElACTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownCoolReq" 1 "OpportunisticCoolingReq" 0 "NoCoolingRequest";
+VAL_ 806 HvacEvap_Te_Actl 1023 "Fault";
+VAL_ 806 HvacAirCond_B_Rq 1 "Yes" 0 "No";
+VAL_ 806 ClimtPw_B_Rq 1 "Yes" 0 "No";
+VAL_ 765 Mc_VehTimeFrmtUsrSel_St 2 "24h_mode" 1 "12h_mode" 0 "Invalid";
+VAL_ 765 Running_Board_Cmd 3 "Unused" 2 "Manually_Deployed" 1 "All_Enabled" 0 "All_Disabled";
+VAL_ 765 EngExhMdeQuiet_D2_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null";
+VAL_ 765 EdmSailMde_B_RqDrv 1 "On" 0 "Off";
+VAL_ 765 DrvInputRequired_B_Rq 1 "Yes" 0 "No";
+VAL_ 765 AwdRnge_D_ActlIpc 7 "Unknown" 6 "High_Range_2wd" 5 "High_Range_Auto" 4 "High_Range_Locked" 3 "Neutral" 2 "Low_Range_2wd" 1 "Low_Range_Auto" 0 "Low_Range_Locked";
+VAL_ 765 BalrSwtch_D_Stat 3 "NotUsed" 2 "Pressed" 1 "NotPressed" 0 "Null";
+VAL_ 765 BalrMde_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Null";
+VAL_ 765 WaitToStartLamp_D_Falt 3 "NotUsed" 2 "Wait_to_start_lamp_failed" 1 "Diagnosis_not_ready" 0 "Wait_to_start_lamp_OK";
+VAL_ 765 EsaOn_B_Rq 1 "On" 0 "Off";
+VAL_ 765 BttOn_B_Rq 1 "On" 0 "Off";
+VAL_ 765 Btt_L_Actl 127 "Faulty" 126 "NoDataExists";
+VAL_ 765 SelDrvMdeTxtReset_B_Rq 1 "Yes" 0 "No";
+VAL_ 765 SelDrvMdeDsply_B_Avail 1 "Available" 0 "NotAvailable";
+VAL_ 765 Mc_VehUntTrpCoUsrSel_St 0 "TripComputer_metric" 1 "TripComputer_imperial";
+VAL_ 765 Mc_VehUnitTempUsrSel_St 0 "Temperature_deg_c" 1 "Temperature_deg_f";
+VAL_ 765 Mc_VehLangUsrSel_St 30 "Slovak" 29 "Arabic" 28 "Cantonese" 27 "Mandarin_Chinese" 26 "Korean" 25 "Japanese_Kanji" 24 "Japanese_Katakana" 23 "Braz_Portuguese" 22 "EU_Portuguese" 21 "Finish" 20 "Norwegian" 19 "Danish" 18 "Swedish" 17 "Hungarian" 16 "Greek" 15 "Czech" 14 "Polish" 13 "Flemish" 12 "Dutch" 11 "Russian" 10 "Turkish" 9 "Mex_Spanish" 8 "EU_Spanish" 7 "Cana_French" 6 "EU_French" 5 "Italian" 4 "German" 3 "NA_English" 2 "UK_English" 1 "Unknown" 0 "Invalid";
+VAL_ 934 CtaAlrtLeft2_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "AlertZone4" 3 "AlertZone3" 2 "AlertZone2" 1 "AlertZone1" 0 "Off";
+VAL_ 934 CtaBrkLeftMsgTxt_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 934 CtaLeftBrkDecel_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 934 CtaLeftBrkEnbl_B_Rq 1 "Enable" 0 "Disable";
+VAL_ 934 BttLeft_D_Stat 7 "NotUsed" 6 "Disabled" 5 "Off" 4 "OffTemp" 3 "NotConnected" 2 "Pending" 1 "Connected" 0 "NotDetermined";
+VAL_ 934 BttLeft_D_RqDrv 3 "NotUsed" 2 "Request" 1 "NoRequest" 0 "Null";
+VAL_ 934 CtaSnsLeft_D_Stat 3 "Invalid" 2 "System_Failure" 1 "Blocked" 0 "Clear";
+VAL_ 934 SodDetctLeft_D_Stat 4 "Sensor_Blocked" 3 "Sensor_Fault" 2 "Flash_On" 1 "Alert_On" 0 "AlertOff_FlashOff_SensrClr";
+VAL_ 934 CtaLeft_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off";
+VAL_ 934 CtaAlrtLeft_D_Stat 1 "On" 0 "Off";
+VAL_ 934 SodLeft_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off";
+VAL_ 934 SodSnsLeft_D_Stat 3 "Second_Warning_Audio" 2 "System_Failure" 1 "Blocked" 0 "Clear";
+VAL_ 934 SodAlrtLeft_D_Stat 3 "Bulb_Proveout" 2 "Flash" 1 "On" 0 "Off";
+VAL_ 1072 LscmbbStat_B_Actl 1 "On" 0 "Off";
+VAL_ 1072 HaDsplyCpblty_B_Stat 1 "Available" 0 "NotAvailable";
+VAL_ 1072 AccDeny_B_RqIpc 1 "Yes" 0 "No";
+VAL_ 1072 DrvSlipCtlMde_D_Rq 3 "App_Specific_Off_Mode_3" 2 "App_Specific_Off_Mode_2" 1 "App_Specific_Off_Mode_1" 0 "Default_Mode";
+VAL_ 1072 EngIdlShutDown_B_RqDrv 1 "Inhibit" 0 "No_Inibit";
+VAL_ 1072 HsaMde_D_Rq 3 "Undefined" 2 "Manual" 1 "Automatic" 0 "Off";
+VAL_ 1072 NtrlTowMdeEnbl_B_RqDrv 1 "Yes" 0 "No";
+VAL_ 1072 BulbChkActv_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1072 ParkDetect_Stat 1 "Park" 0 "Not_Park";
+VAL_ 1072 ReducedGuard_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 1072 TrlrBrkMde_D_Rq 1 "ElectricOverHydraulic" 0 "Electric";
+VAL_ 1072 TRLR_SWAY_CONFIG_CMD 1 "On" 0 "Off";
+VAL_ 1072 TRAILER_BRAKE_CONFIG 1 "Yes" 0 "No";
+VAL_ 1072 Power_Liftgate_Mode_Cmd 1 "Enable" 0 "Disable";
+VAL_ 1072 AccEnbl_B_RqDrv 1 "Adaptive_Cruise" 0 "Normal_Cruise";
+VAL_ 1072 OdometerMasterValue 16777215 "Invalid";
+VAL_ 1072 EngOilLife_B_RqReset 1 "Yes" 0 "No";
+VAL_ 1072 ePRNDL_MODE 1 "On" 0 "Off";
+VAL_ 1072 DrvSlipCtlMde_B_Rq2 1 "Pressed" 0 "Not_Pressed";
+VAL_ 1072 MetricActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 1072 KeyTypeChngMykey_D_Rq 3 "Search_PE_BackupSlot" 2 "Clear_All_MyKeys" 1 "Request_New_MyKey" 0 "None";
+VAL_ 1072 ManRgen_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "CustInitManExhFilterClean" 0 "No_Customer_Request";
+VAL_ 909 IgnPsswrdDsply_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 909 ElPwPoint_D_Rq 3 "On" 2 "Off2" 1 "Off1" 0 "Null";
+VAL_ 909 PoliceIdlMde_D_Stat 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "PepsActive" 8 "Decommissioned" 7 "ActiveFault" 6 "ArmFault" 5 "PrearmedFault" 4 "OffFault" 3 "Active" 2 "Arm" 1 "Prearmed" 0 "Off";
+VAL_ 909 DrLatchMsgTxt_D_Rq 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 909 SecurityMsgTxt_D_Rq 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage";
+VAL_ 909 PrmtrAlrmEvnt_D_Stat 15 "Diag_Tamper" 14 "Trailer" 13 "Shock_Sensor" 12 "Post_Crash" 11 "Panic" 10 "Intrusion" 9 "Inclination" 8 "Ign_Tamper" 7 "LG_Door" 6 "Decklid" 5 "Hood" 4 "PR_Door" 3 "PF_Door" 2 "DR_Door" 1 "DF_Door" 0 "Null";
+VAL_ 909 HeadLghtHiPrmsn_D_Stat 3 "CancelAndSuppress" 2 "Cancel" 1 "Hold" 0 "AllowChange";
+VAL_ 909 SteWhlLckMsgTxt_D_Rq 3 "NotUsed" 2 "Message_2" 1 "Message_1" 0 "No_Message";
+VAL_ 909 immoMsgTxt_D_Rq 15 "Immo_Msg_15" 14 "Immo_Msg_14" 13 "Immo_Msg_13" 12 "Immo_Msg_12" 11 "Immo_Msg_11" 10 "Immo_Msg_10" 9 "Immo_Msg_9" 8 "Immo_Msg_8" 7 "Immo_Msg_7" 6 "Immo_Msg_6" 5 "Immo_Msg_5" 4 "Immo_Msg_4" 3 "Immo_Msg_3" 2 "Immo_Msg_2" 1 "Immo_Msg_1" 0 "Immo_Msg_0_Null";
+VAL_ 909 PrsnlDevcChrgEnbl_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 909 TracKeyMde_D_Stat 3 "NotUsed" 2 "NotActive" 1 "Active" 0 "ModeNotDetermined";
+VAL_ 909 PEBackupSlot_Stats 3 "No_Valid_FOB_In_Slot" 2 "MyKey_FOB_In_Slot" 1 "Standard_FOB_In_Slot" 0 "Null";
+VAL_ 909 KeyMykeyTot_No_Cnt 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero" 15 "Invalid" 14 "Unlimited";
+VAL_ 909 KeyAdmnTot_No_Cnt 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero" 15 "Invalid" 14 "Unlimited";
+VAL_ 963 Illuminated_Entry_Stat 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off";
+VAL_ 963 Dr_Courtesy_Light_Stat 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off";
+VAL_ 963 Courtesy_Delay_Status 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off";
+VAL_ 963 ImpactEvntFdbck_D_Stat 3 "NotUsed" 2 "EventComplete" 1 "EventInProgress" 0 "Normal";
+VAL_ 963 WrlssAcsyChrgInhbt_B_Rq 1 "Yes" 0 "No";
+VAL_ 963 PudLampPsngr_D_Rq 3 "Ramp_Down" 2 "Ramp_Up" 1 "On" 0 "Off";
+VAL_ 963 HeadLampLoOut_B_Stat 1 "Out" 0 "Null";
+VAL_ 963 HeadLghtHiFdbck_D_Stat 3 "NotUsed" 2 "Cancel" 1 "Hold" 0 "Allow_Change";
+VAL_ 963 PudLampDrv_D_Rq 3 "Ramp_Down" 2 "Ramp_Up" 1 "On" 0 "Off";
+VAL_ 963 TrnNotInPrkChime_B_Rq 1 "On" 0 "Off";
+VAL_ 963 PrkLightChime_B_Rq 1 "On" 0 "Off";
+VAL_ 963 KeyInIgnWarn_B_Cmd 1 "On" 0 "Off";
+VAL_ 963 HomeSafeLtChime_B_Rq 1 "On" 0 "Off";
+VAL_ 963 StopLghtOn_B_Stat 1 "On" 0 "Off";
+VAL_ 963 RvrseLghtOn_B_Stat 1 "On" 0 "Off";
+VAL_ 963 PrkLght_D_Stat 3 "Park_Both" 2 "Park_Right" 1 "Park_Left" 0 "Off";
+VAL_ 963 HeadLghtSwtch_D_Stat 3 "Autolamp" 2 "Headlamp" 1 "Parklamp" 0 "Off";
+VAL_ 963 HeadLampLoFrOn_B_Stat 1 "Low" 0 "Not_Low";
+VAL_ 963 HeadLampLoFlOn_B_Stat 1 "Low" 0 "Not_Low";
+VAL_ 963 HeadLampLoActv_B_Stat 1 "On" 0 "Off";
+VAL_ 963 Headlamp_On_Wrning_Cmd 1 "On" 0 "Off";
+VAL_ 963 Park_Brake_Chime_Rqst 1 "On" 0 "Off";
+VAL_ 963 HeadLghtHiOn_B_Stat 1 "On" 0 "Off";
+VAL_ 963 BrkWarnInd_B_Rq 1 "On" 0 "Off";
+VAL_ 963 Brk_Fluid_Lvl_Low 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK";
+VAL_ 963 ReducedGuard_D_Stat 3 "NotUsed" 2 "Alarm_On" 1 "Alarm_Off_Previously_On" 0 "Alarm_Off";
+VAL_ 963 Perimeter_Alarm_Status 3 "Activated" 2 "Armed" 1 "Prearmed" 0 "Disarmed";
+VAL_ 963 Courtesy_BSave_Stat 3 "Invalid" 2 "Unknown" 1 "No_Effect" 0 "Off";
+VAL_ 963 DrTgateLck_D_Stat 3 "NotUsed" 2 "Unlock" 1 "Lock" 0 "Null";
+VAL_ 963 WndwGlbl_D_Cmd 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "GLEARN" 3 "GCLOSE" 2 "GOPEN" 1 "GSTOP" 0 "Null";
+VAL_ 963 PudLamp_D_Rq 3 "RAMP_DOWN" 2 "RAMP_UP" 1 "ON" 0 "OFF";
+VAL_ 963 DayRnngLampOn_B_Stat 1 "On" 0 "Off";
+VAL_ 963 PerimeterAlarmChimeRq 1 "On" 0 "Off";
+VAL_ 145 VehYawWActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 145 VehRolWActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 145 VehYaw_W_Actl 65535 "Faulty" 65534 "NoDataExists";
+VAL_ 145 VehRol_W_Actl 65535 "Faulty" 65534 "NoDataExists";
+VAL_ 76 FirstRowBuckleMid 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_ 76 SecondRowBucklePsngr 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_ 76 SecondRowBuckleMid 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_ 76 SecondRowBuckleDriver 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_ 76 FirstRowBuckleDriver 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_ 76 RILReq 3 "Not_Used" 2 "Plant_Mode" 1 "On" 0 "Off";
+VAL_ 76 FirstRowBucklePsngr 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty";
+VAL_ 76 RstrnImpactEvntStatus 7 "Invalid" 6 "Not_Used_4" 5 "Threshold_2_Exceeded" 4 "Not_Used_3" 3 "Threshold_1_Exceeded" 2 "Not_Used_2" 1 "Not_Used_1" 0 "Normal";
+VAL_ 76 PsngrFrntDetct_D_Actl 3 "Unknown" 2 "Empty" 0 "Faulty" 1 "Occupied";
+VAL_ 76 EDRTriggerEvntSync 1 "Threshold_Exceeded" 0 "Normal";
+VAL_ 76 PassRstrnInd_Req 3 "ABOnNotIllum_OffNotIllum" 2 "AirbagOnNot_Illum_OffIllum" 1 "AirbagOn_Illum_OffNotIllum" 0 "AirbagOn_Illum_Off_Illum";
+VAL_ 65 immoControlCmd_T1 0 "IDLE" 1 "MOTIVE_START_RQST" 2 "NONMOTIVE_START_RQST" 3 "RQST_TARGET1_IDBLOCK1" 4 "RQST_TARGET1_IDBLOCK2" 5 "Unused" 6 "ECHO_TARGET1_IDBLOCK2" 7 "SHUTDOWN";
+VAL_ 1076 HILL_DESC_SW 1 "On" 0 "Off";
+VAL_ 1076 AutoRgen_D_Rq 3 "NotUsed" 2 "AutExhFilterCleanOFF" 1 "AutExhFilterCleanON" 0 "No_Mode_Selected";
+VAL_ 1076 W2S_LAMP_OK 1 "Yes" 0 "No";
+VAL_ 1076 OdoTripRx_B_Actl 1 "Yes" 0 "No";
+VAL_ 1076 DrvSlipCtlMde_B_RqMyKey 1 "On" 0 "Off";
+VAL_ 1076 FuelLvlWarn_D_Actl 3 "NotUsed" 2 "VeryLow" 1 "Low" 0 "OK";
+VAL_ 1076 FuelSecndActv_B_Actl 1 "Yes" 0 "No";
+VAL_ 1076 FUEL_SENSOR_NUM 1 "Dual_Sensors" 0 "Single_Sensor";
+VAL_ 862 AutoStpHvacDelta_I_Est 255 "Fault";
+VAL_ 862 HvacBlwrFront_D_Stat 31 "Not_Used" 20 "Full_On" 19 "95_Percent" 18 "90_Percent" 17 "85_Percent" 16 "80_Percent" 15 "75_Percent" 14 "70_Percent" 13 "65_Percent" 12 "60_Percent" 11 "55_Percent" 10 "50_Percent" 9 "45_Percent" 8 "40_Percent" 7 "35_Percent" 6 "30_Percent" 5 "25_Percent" 4 "20_Percent" 3 "15_Percent" 2 "10_Percent" 1 "5_Percent" 0 "Off";
+VAL_ 862 CabnAmb_Te_Actl 255 "Fault";
+VAL_ 862 ClimtThrmlLoad_No_Actl 255 "Fault";
+VAL_ 931 PtWakeReas_D_Stat 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "ElapsedTime" 5 "ThirdPartyWakeup" 4 "DoorAjar" 3 "EarlyWake" 2 "NonMotiveStart" 1 "MotiveStart" 0 "Null";
+VAL_ 931 VehOnSrc_D_Stat 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "OverTheAir" 3 "RemoteParkAssist" 2 "RemoteStart" 1 "Manual" 0 "Off";
+VAL_ 931 EngStrtActv_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 931 EngStrt_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 931 DrvInCtl_B_Stat 1 "Yes" 0 "No";
+VAL_ 931 AdvStrt_D_Stat 15 "NotUsed_15" 14 "NotUsed_14" 13 "NotUsed_13" 12 "NotUsed_12" 11 "NotUsed_11" 10 "NotUsed_10" 9 "NotUsed_9" 8 "NotUsed_8" 7 "NotUsed_7" 6 "NotUsed_6" 5 "NotUsed_5" 4 "NotUsed_4" 3 "NotUsed_3" 2 "NotUsed_2" 1 "NotUsed_1" 0 "NoAction";
+VAL_ 931 CrnkInhbt_B_Stat 1 "Inhibit" 0 "NoInhibit";
+VAL_ 931 IgnPreOffActv_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 578 PtLatchActv_B_RqBcm 1 "On" 0 "Off";
+VAL_ 578 immoSecureIdleMode 3 "NotUsed2" 2 "NotUsed1" 1 "Active" 0 "Inactive";
+VAL_ 578 ReFuelSwtchStat_D_Actl 3 "NotUsed2" 2 "NotUsed1" 1 "On" 0 "Off";
+VAL_ 578 FuelPumpPwr_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Power_Off_Default" 3 "Power_Off_Command" 2 "Power_Off_Service" 1 "Power_Off_Impact" 0 "Power_On";
+VAL_ 578 BattULo_U_Actl 255 "Fault";
+VAL_ 578 PrkLckCtl_B_Enbl 1 "Enable" 0 "Disable";
+VAL_ 578 PrkLckCtlMsgTxt_D_Rq 3 "BTSI_DI_3" 2 "BTSI_DI_2" 1 "BTSI_DI_1" 0 "Null_BTSI_DI";
+VAL_ 578 BrkTrnShifLck_B_Stat 1 "Shift" 0 "NoShift";
+VAL_ 578 PrkLckCtlUnlck_D_Stat 3 "Trans_And_Steer_Unlckd" 2 "Steering_Unlckd" 1 "Transmission_Unlckd" 0 "Null";
+VAL_ 578 PrkLckCtlTow_B_Enbl 1 "Enable" 0 "Disable";
+VAL_ 578 DriverCrankingReq 1 "Crank_Request" 0 "No_Crank_Request";
+VAL_ 578 EngOff_T_Actl 65535 "Invalid";
+VAL_ 578 DcacElPw_D_Rq 3 "NotUsed" 2 "AC_HighPower_Requested" 1 "AC_LowPower_Requested" 0 "AC_Power_NotRequested";
+VAL_ 578 BattULo_I_Actl 16383 "Fault";
+VAL_ 947 ValetMode_D_Mem 1 "On" 0 "Off";
+VAL_ 947 DrStatDrvErrCnt_B_Stat 1 "Yes" 0 "No";
+VAL_ 947 TurnLghtRight_D_Rq 3 "Seq" 2 "On" 1 "Off" 0 "Null";
+VAL_ 947 TurnLghtRightOn_B_Stat 1 "On" 0 "Off";
+VAL_ 947 TurnLghtLeftOn_B_Stat 1 "On" 0 "Off";
+VAL_ 947 FogLghtRearOn_B_Stat 1 "On" 0 "Off";
+VAL_ 947 Backlit_LED_Status 15 "Unused3" 14 "Unused2" 13 "Unused1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off";
+VAL_ 947 TurnLghtLeft_D_Rq 3 "Seq" 2 "On" 1 "Off" 0 "Null";
+VAL_ 947 FogLghtFrontOn_B_Stat 1 "On" 0 "Off";
+VAL_ 947 IgnKeyType_D_Actl 15 "Invalid" 14 "Unknown" 3 "Key_Not_Prgrm_Read_Failure" 2 "Key_In_Ign_My_Key" 1 "Key_In_Ign_Standard_Key" 0 "Key_Read_In_Progress";
+VAL_ 947 Parklamp_Status 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off";
+VAL_ 947 Litval 255 "Invalid" 254 "Unknown" 5 "Day" 4 "Twilight_4" 3 "Twilight_3" 2 "Twilight_2" 1 "Twilight_1" 0 "Night";
+VAL_ 947 Key_In_Ignition_Stat 1 "In" 0 "Out";
+VAL_ 947 Ignition_Status 0 "Unknown" 1 "Off" 15 "Invalid" 8 "Start" 4 "Run" 2 "Accessory";
+VAL_ 947 Dimming_Lvl 255 "Invalid" 254 "Unknown" 18 "Day_6" 17 "Day_5" 16 "Day_4" 15 "Day_3" 14 "Day_2" 13 "Day_1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off";
+VAL_ 947 Day_Night_Status 3 "NotUsed" 2 "Night" 1 "Day" 0 "Null";
+VAL_ 947 Remote_Start_Status 3 "Invalid" 2 "Unknown" 1 "Remote" 0 "Null";
+VAL_ 947 DrStatTgate_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 DrStatRr_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 DrStatRl_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 DrStatPsngr_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 DrStatInnrTgate_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 DrStatHood_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 DrStatDrv_B_Actl 1 "Ajar" 0 "Closed";
+VAL_ 947 PrkBrkActv_B_Actl 1 "Active" 0 "Inactive";
+VAL_ 947 LifeCycMde_D_Actl 3 "Transport" 2 "NotUsed" 1 "Factory" 0 "Normal";
+VAL_ 947 Delay_Accy 1 "On" 0 "Off";
+VAL_ 947 CrashEvnt_D_Stat 3 "Invalid" 2 "Fuel_Cutoff_Event" 1 "Deploy_Event" 0 "No_Event";
+VAL_ 947 FuelPmpInhbt_B_Stat 1 "Inhibit" 0 "No_Inibit";
+VAL_ 947 BodySrvcRqd_B_Rq 1 "Yes" 0 "No";
+VAL_ 1084 BattULoState_D_Qlty 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Fault";
+VAL_ 1084 BSFault 1 "Fault" 0 "No_Fault";
+VAL_ 1084 BattULo2_Te_Actl 127 "Fault";
+VAL_ 1068 EngStrtInhbt_B_RqBatt 1 "Start_Inhibit" 0 "Dont_Care";
+VAL_ 1068 BattULoChrg_D_Rq 3 "Low_Battery_Temperature" 2 "Charging_Requested" 1 "Chrg_Requested_HighCurrent" 0 "No_Request";
+VAL_ 1068 PwSysULoFalt_D_Stat 15 "Not_Used_6" 14 "LowBatterySOC" 13 "PSS_Shed2_Contin" 12 "Not_Used_4" 11 "Not_Used_3" 10 "Not_Used_2" 9 "BattMonitoringSensorFault" 8 "LowBattVoltDuringPwSrcOn" 7 "LowBatt2_PowerSaveMode" 6 "LowBatt1_Warning" 5 "Overvoltage" 4 "Fault_NoOutput" 3 "Fault_ReducedOutput" 2 "Fault_Nonspecific" 1 "Cluster_Proveout" 0 "No_Fault";
+VAL_ 1068 Shed_T_Eng_Off_B 1 "Active" 0 "Inactive";
+VAL_ 1068 Shed_Feature_Group_ID 16 "PtcHeater" 14 "HtdMirr" 13 "HvacRearBlwr_Third" 12 "HvacRearBlwr_Second" 11 "HvacRearBlwr_First" 31 "All LSHED1 Features" 10 "Htd_Windscrn" 9 "SpltHtdBcklight_HtdMirr" 8 "HtdBcklight_HtdMirr" 7 "HtdCoolSeat_FrtDriver" 6 "HtdCoolSeat_FrtPass" 5 "HtdCoolSeat_RearPass" 4 "HtdCoolSeat_RearDriver" 3 "SmartTrlrTowBattCharge" 2 "Htd_StrWhl" 1 "Htd_Washer_Fluid" 0 "No_LSHED1_Features" 15 "Engine_Coolant_Fan";
+VAL_ 1068 Shed_Drain_Eng_Off_B 1 "Active" 0 "Inactive";
+VAL_ 1068 Shed_Level_Req 7 "Unused_2" 6 "Loads_On" 5 "SHED_ENG_OFF" 4 "SOON_ENG_OFF" 3 "SHED2_CONTIN" 2 "SHED2_TRANS" 1 "SHED1" 0 "NO_SHED";
+VAL_ 1068 ULoRgenTestMde_B_Rq 1 "Request" 0 "NoRequest";
+VAL_ 1068 ChargeMode 7 "Undefined_2" 6 "Undefined_1" 5 "Battery_Identify" 4 "Battery_Refresh" 3 "SlowRegenAllowNoDischarge" 2 "Fast_Regen_Allowed" 1 "Slow_Regen_Allowed" 0 "Conventional_Charging";
+VAL_ 1068 IdleSpeedIncrease_El 1 "Yes" 0 "No";
+VAL_ 1068 Batt_Lo_SoC_B 1 "Active" 0 "Inactive";
+VAL_ 1068 PeriodicElLoad_B_Stat 1 "Active" 0 "Inactive";
+VAL_ 1068 Batt_Crit_SoC_B 1 "Active" 0 "Inactive";
+VAL_ 146 VehVert2_A_Actl 8191 "Faulty" 8190 "NoDataExists";
+VAL_ 146 VehLong2_A_Actl 8191 "Faulty" 8190 "NoDataExists";
+VAL_ 146 VehLat2_A_Actl 8191 "Faulty" 8190 "NoDataExists";
+VAL_ 146 VehVertAActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 146 VehLongAActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 146 VehLatAActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty";
+VAL_ 997 PersIndexCcm_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1";
+VAL_ 983 CmbbObjRelLong_V_Actl 1023 "Faulty" 1022 "NoDataExists";
+VAL_ 983 CmbbObjRelLat_V_Actl 511 "Faulty" 510 "NoDataExists";
+VAL_ 983 CmbbObjDistLong_L_Actl 1023 "Faulty" 1022 "NoDataExists";
+VAL_ 983 CmbbObjDistLat_L_Actl 511 "Faulty" 510 "NoDataExists";
+VAL_ 983 CmbbObjConfdnc_D_Stat 3 "High" 2 "Medium" 1 "Low" 0 "NotDetermined";
+VAL_ 983 CmbbObjColl_T_Actl 127 "Faulty" 126 "NoDataExists";
+VAL_ 983 CmbbObjClass_D_Stat 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "Unclassified_Vehicle" 5 "Bicycle" 4 "Pedestrian" 3 "Truck" 2 "Motorcycle" 1 "Vehicle" 0 "Undetermined";
+VAL_ 983 EsaEnbl_D2_Rq 3 "NotConfigured" 2 "Enabled" 1 "Pending" 0 "Disabled";
+VAL_ 980 AdbBrdr1DistRigh_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_ 980 AdbBrdr1DistLeft_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_ 980 AdbMde1_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None";
+VAL_ 980 AdbIntns1_D_Rq 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 980 AdbBrdr1Up_An_Rq 511 "Faulty" 510 "NoDataExists";
+VAL_ 980 AdbBrdr1Right_An_Rq 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 980 AdbBrdr1Low_An_Rq 511 "Faulty" 510 "NoDataExists";
+VAL_ 980 AdbBrdr1Left_An_Rq 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 979 HandsOffCnfm_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 979 LatCtl_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "InterventionRight" 2 "InterventionLeft" 1 "ContinuousPathFollowing" 0 "NoLateralControl";
+VAL_ 979 LatCtlRampType_D_Rq 3 "Immediately" 2 "Fast" 1 "Medium" 0 "Slow";
+VAL_ 979 LatCtlPrecision_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "Precise" 0 "Comfortable";
+VAL_ 976 SuspClkSync_No_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 976 SrpSigValid_B_Stat 1 "True" 0 "False";
+VAL_ 976 SrpHghtRight_L_Actl 511 "Faulty" 510 "NoDataExists";
+VAL_ 976 SrpHghtLeft_L_Actl 511 "Faulty" 510 "NoDataExists";
+VAL_ 976 SrpEventRight_D_Stat 3 "Faulty" 2 "Bump" 1 "Pothole" 0 "NoEvent";
+VAL_ 976 SrpEventLeft_D_Stat 3 "Faulty" 2 "Bump" 1 "Pothole" 0 "NoEvent";
+VAL_ 976 SrpDistRight_L_Actl 511 "Faulty" 510 "NoDataExists";
+VAL_ 976 SrpDistLeft_L_Actl 511 "Faulty" 510 "NoDataExists";
+VAL_ 973 TsrVl2PrmntMsgTxt_D_Rq 3 "NotUsed" 2 "ShowPermanentlyWithSupp" 1 "ShowPermanentlyWithoutSupp" 0 "DoNotShowSignPermanent";
+VAL_ 973 TsrVl1PrmntMsgTxt_D_Rq 3 "NotUsed" 2 "ShowPermanentlyWithSupp" 1 "ShowPermanentlyWithoutSupp" 0 "DoNotShowSignPermanent";
+VAL_ 973 TsrVl2RstrcMsgTxt2_D_Rq 7 "NotUsed" 6 "Time" 5 "Trailer" 4 "Snow" 3 "RainWet" 2 "NoRecognizableRestrictn" 1 "NoSpeedLimitRestrictn" 0 "Null";
+VAL_ 973 TsrVl1RstrcMsgTxt2_D_Rq 7 "NotUsed" 6 "Time" 5 "Trailer" 4 "Snow" 3 "RainWet" 2 "NoRecognizableRestrictn" 1 "NoSpeedLimitRestrictn" 0 "Null";
+VAL_ 973 TsrOvtkMsgTxt2_D_Rq 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "LimForTrucksCancelled" 9 "LimForTrucksWoQlfdRstrc" 8 "LimForTrucksWithoutRstrc" 7 "LimAllCancelled" 6 "LimAllWithRstrcTime" 5 "LimAllWithRstrcTrailer" 4 "LimAllWithRstrcSnow" 3 "LimAllWithRstrcRain" 2 "LimAllWithoutQlfdRstrc" 1 "LimAllWithoutRestriction" 0 "OvertakingAllowed";
+VAL_ 973 WwaWarn_B_Rq 1 "On" 0 "Off";
+VAL_ 973 TsrVlUnitMsgTxt_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null";
+VAL_ 973 TsrVLim2MsgTxt_D_Rq 255 "NoLimit" 254 "NotUsed2" 253 "NotUsed1" 252 "NotToBeDisplayed" 251 "LimitCancelled" 31 "1F_FA_Message31_250" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "Null";
+VAL_ 973 TsrVLim1MsgTxt_D_Rq 255 "NoLimit" 254 "NotUsed2" 253 "NotUsed1" 252 "NotToBeDisplayed" 251 "LimitCancelled" 31 "1F_FA_Message31_250" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "Null";
+VAL_ 973 TsrVl2StatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null";
+VAL_ 973 TsrVl2RstrcMsgTxt_D_Rq 3 "NotUsed" 2 "NoRecognizableRestriction" 1 "NoSpeedLimitRestriction" 0 "Null";
+VAL_ 973 TsrVl1StatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null";
+VAL_ 973 TsrVl1RstrcMsgTxt_D_Rq 3 "NotUsed" 2 "NoRecognizableRestriction" 1 "NoSpeedLimitRestriction" 0 "Null";
+VAL_ 973 TsrStatMsgTxt_D_Rq 7 "NotUsed" 6 "NoDataExists" 5 "TSR_Error" 4 "Available_NavigationOnly" 3 "Available_CameraOnly" 2 "Available_FusionMode" 1 "TSR_Off" 0 "Null";
+VAL_ 973 TsrOvtkStatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null";
+VAL_ 973 TsrOvtkMsgTxt_D_Rq 7 "LimForTrucksCancelled" 6 "LimForTrucksWoQlfdRstrc" 5 "LimForTrucksWithoutRstrc" 4 "LimAllCancelled" 3 "LimAllWithoutQlfdRstrc" 2 "LimAllWithoutRestriction" 1 "OvertakingAllowed" 0 "Null";
+VAL_ 973 TsrOswWarnMsgTxt_D_Rq 3 "NotUsed" 2 "True" 1 "False" 0 "Null";
+VAL_ 973 TsrMsgTxt_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "RecgnzdSignNotUsblForDsply" 8 "LimitedSystemPerformance" 7 "OffRoad" 6 "RegionNotSupported" 5 "CountryNotSupported" 4 "WrngNavDatIncompDatCarrier" 3 "NoNavDataAvailable" 2 "NoNavAvailableSwitchedOff" 1 "NoInformationAllOK" 0 "Null";
+VAL_ 970 LkaDrvOvrrd_D_Rq 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Level_0";
+VAL_ 970 LkaActvStats_D2_Req 7 "NotUsed" 6 "LkaIncrIntervRight" 5 "LkaSupprRight" 4 "LkaStandIntervRight" 3 "LkaSupprLeft" 2 "LkaStandIntervLeft" 1 "LkaIncrIntervLeft" 0 "LkaNoInterv";
+VAL_ 970 LaRefAng_No_Req 4095 "Fault";
+VAL_ 970 LaRampType_B_Req 1 "Quick" 0 "Smooth";
+VAL_ 970 LaCurvature_No_Calc 4095 "Fault";
+VAL_ 970 LdwActvStats_D_Req 7 "LDW_Suppress_Right_Left" 6 "Not_Used2" 5 "LDW_Suppress_Right" 4 "LDW_Warning_Right" 3 "LDW_Suppress_Left" 2 "LDW_Warning_Left" 1 "LDW_DemoVibration" 0 "LDW_Idle";
+VAL_ 970 LdwActvIntns_D_Req 3 "High" 2 "Medium" 1 "Low" 0 "None";
+VAL_ 962 AdbBrdr3DistRigh_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_ 962 AdbBrdr3DistLeft_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_ 962 AdbMde3_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None";
+VAL_ 962 AdbIntns3_D_Rq 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 962 AdbBrdr3Up_An_Rq 511 "Faulty" 510 "NoDataExists";
+VAL_ 962 AdbBrdr3Right_An_Rq 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 962 AdbBrdr3Low_An_Rq 511 "Faulty" 510 "NoDataExists";
+VAL_ 962 AdbBrdr3Left_An_Rq 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 961 AdbBrdr2DistRigh_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_ 961 AdbBrdr2DistLeft_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m";
+VAL_ 961 AdbMde2_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None";
+VAL_ 961 AdbIntns2_D_Rq 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 961 AdbBrdr2Up_An_Rq 511 "Faulty" 510 "NoDataExists";
+VAL_ 961 AdbBrdr2Right_An_Rq 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 961 AdbBrdr2Low_An_Rq 511 "Faulty" 510 "NoDataExists";
+VAL_ 961 AdbBrdr2Left_An_Rq 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 394 AccStopStat_D_Dsply 3 "PressResume" 2 "Stopped" 1 "ResumeReady" 0 "NoDisplay";
+VAL_ 394 AccTrgDist2_D_Dsply 15 "DIST_ACTIVE_13_Farthest" 14 "DIST_ACTIVE_12" 13 "DIST_ACTIVE_11" 12 "DIST_ACTIVE_10" 11 "DIST_ACTIVE_9" 10 "DIST_ACTIVE_8" 9 "DIST_ACTIVE_7" 8 "DIST_ACTIVE_6" 7 "DIST_ACTIVE_5" 6 "DIST_ACTIVE_4" 5 "DIST_ACTIVE_3" 4 "DIST_ACTIVE_2" 3 "DIST_ACTIVE_1_Closest" 2 "DIST_ACTIVE_No_Target" 1 "DIST_STANDBY" 0 "DIST_OFF";
+VAL_ 394 AccStopRes_B_Dsply 1 "Yes" 0 "No";
+VAL_ 394 TjaWarn_D_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "HardTakeOverLevel2" 2 "HardTakeOverLevel1" 1 "TrafficJamAssistCancel" 0 "NoWarning";
+VAL_ 394 Tja_D_Stat 7 "NotUsed_1" 6 "ActiveWarningRight" 5 "ActiveWarningLeft" 4 "ActiveInterventionRight" 3 "ActiveInterventionLeft" 2 "Active" 1 "Standby" 0 "Off";
+VAL_ 394 TjaMsgTxt_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "TurnOnAdaptCruiseControl" 2 "TrafficJamAssistSelected" 1 "TrafficJamAssistUnavailabl" 0 "NoMessage";
+VAL_ 394 IaccLamp_D_Rq 3 "NotUsed_2" 2 "NotUsed_1" 1 "DisplayIaccIcon" 0 "DoNotDisplayIaccIcon";
+VAL_ 394 AccMsgTxt_D2_Rq 15 "NotUsed_1" 14 "NCC_Enabled_Warning" 13 "IACC_TJA_Selected" 12 "ACC_TJA_Selected" 11 "IACC_Selected" 10 "Press_Brake_To_Hold" 9 "Only_Following_In_Low_Spd" 8 "TJA_Unavailable" 7 "Shift_Down" 6 "IACC_Unavailable" 5 "ACC_Selected" 4 "ACC_Overridden" 3 "Brake_Capacity_Warning" 2 "ACC_Cancelled" 1 "ACC_Unavailable" 0 "No_Text";
+VAL_ 394 FcwDeny_B_Dsply 1 "Yes" 0 "No";
+VAL_ 394 FcwMemStat_B_Actl 1 "On" 0 "Off";
+VAL_ 394 AccTGap_B_Dsply 1 "Yes" 0 "No";
+VAL_ 394 CadsAlignIncplt_B_Actl 1 "Yes" 0 "No";
+VAL_ 394 AccFllwMde_B_Dsply 1 "Yes" 0 "No";
+VAL_ 394 CadsRadrBlck_B_Actl 1 "Yes" 0 "No";
+VAL_ 394 CmbbPostEvnt_B_Dsply 1 "Yes" 0 "No";
+VAL_ 394 AccStopMde_B_Dsply 1 "Yes" 0 "No";
+VAL_ 394 FcwMemSens_D_Actl 3 "FCW_Sensitivity_3" 2 "FCW_Sensitivity_2" 1 "FCW_Sensitivity_1" 0 "Not_Used";
+VAL_ 394 FcwMsgTxt_D_Rq 7 "Undefined_3" 6 "Undefined_2" 5 "Low_Visibility" 4 "Unavailable_DueTo_LowSpeed" 3 "Available" 2 "Unavailable" 1 "Off" 0 "No_Text";
+VAL_ 394 AccWarn_D_Dsply 3 "BrakeReleaseWarn_In_StopMd" 2 "Brake_Capacity_Warning" 1 "Cancel_Warning" 0 "No_Warning";
+VAL_ 394 FcwVisblWarn_B_Rq 1 "On" 0 "Off";
+VAL_ 394 FcwAudioWarn_B_Rq 1 "On" 0 "Off";
+VAL_ 394 AccTGap_D_Dsply 7 "Undefined_2" 6 "Undefined_1" 5 "Time_Gap_5" 4 "Time_Gap_4" 3 "Time_Gap_3" 2 "Time_Gap_2" 1 "Time_Gap_1" 0 "Not_Used";
+VAL_ 394 AccMemEnbl_B_RqDrv 1 "Adaptive_Cruise" 0 "Normal_Cruise";
+VAL_ 394 FdaMem_B_Stat 1 "On" 0 "Off";
+VAL_ 391 HudBlk3_B_Rq 1 "Yes" 0 "No";
+VAL_ 391 HudBlk2_B_Rq 1 "Yes" 0 "No";
+VAL_ 391 HudBlk1_B_Rq 1 "Yes" 0 "No";
+VAL_ 391 HudFlashRate_D_Actl 3 "Unused" 2 "Flash_4Hz_50Prct_DutyCycle" 1 "On" 0 "Off";
+VAL_ 391 CmbbBrkPrchg_D_Rq 3 "Undefined" 2 "Level_2_PreCharge_Request" 1 "Level_1_PreCharge_Request" 0 "No_PreCharge_Request";
+VAL_ 391 CmbbBrkDecel_B_Rq 1 "Yes" 0 "No";
+VAL_ 391 CmbbBaSens_D_Rq 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Normal";
+VAL_ 390 AccBrkPulse_B_Rq 1 "True" 0 "False";
+VAL_ 390 AccAutoResum_D_Rq 3 "NotUsed" 2 "Active" 1 "Pending" 0 "Off";
+VAL_ 390 AccBrkPrkEl_B_Rq 1 "Yes" 0 "No";
+VAL_ 390 Cmbb_B_Enbl 1 "Yes" 0 "No";
+VAL_ 390 CmbbOvrrd_B_RqDrv 1 "Yes" 0 "No";
+VAL_ 390 CmbbDeny_B_Actl 1 "Yes" 0 "No";
+VAL_ 390 CmbbEngTqMn_B_Rq 1 "Yes" 0 "No";
+VAL_ 390 AccDeny_B_Rq 1 "Yes" 0 "No";
+VAL_ 390 AccResumEnbl_B_Rq 1 "Yes" 0 "No";
+VAL_ 390 AccCancl_B_Rq 1 "Yes" 0 "No";
+VAL_ 390 AccBrkPrchg_B_Rq 1 "Yes" 0 "No";
+VAL_ 390 AccBrkDecel_B_Rq 1 "Active" 0 "Inactive";
+VAL_ 390 AccStopStat_B_Rq 1 "Yes" 0 "No";
+VAL_ 1153 TerrMde_D_RqDrv 7 "Fail_Safe_Default" 6 "Dynamic_Mode" 5 "Rock_Crawl_Mode" 4 "Mud_Ruts_Mode" 3 "Sand_Mode" 2 "Undefined" 1 "Low_Mu_Mode" 0 "Special_Operating_Mode_Off";
+VAL_ 942 PrkAidDrvDir_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "BackwardNegative" 4 "ForwardNegative" 3 "BackwardPositive" 2 "ForwardPositive" 1 "NoMotion" 0 "DirectionNotKnown";
+VAL_ 942 PrkAidAcsyRear_D_Stat 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 942 PrkAidAcsyFront_D_Stat 3 "NotUsed" 2 "On" 1 "Off" 0 "Null";
+VAL_ 930 BalrWndwRight_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 930 BalrSnsRight_D_Falt 3 "Invalid" 2 "SystemFailure" 1 "Blocked" 0 "Clear";
+VAL_ 930 WndwPsngrRear_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 930 WndwPsngr_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 930 WndwDrvRear_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 930 WndwDrv_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 930 BalrRight_D_Stat 3 "Inhibited" 2 "Disabled" 1 "On" 0 "Off";
+VAL_ 930 BalrMdeSelRight_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 930 BalrMdeRight_D_Stat 3 "NotUsed" 2 "High" 1 "Medium" 0 "Low";
+VAL_ 930 BalrLckRight_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 930 BalrChimeRight_D_Rq 3 "NotUsed" 2 "Soft" 1 "Normal" 0 "Off";
+VAL_ 930 CamraRearOn_B_RqBalrr 1 "Active" 0 "Inactive";
+VAL_ 930 DrLckActv_B_RqBalrr 1 "Active" 0 "Null";
+VAL_ 929 BalrChimeLeft_D_Rq 3 "NotUsed" 2 "Soft" 1 "Normal" 0 "Off";
+VAL_ 929 BalrLeft_D_Stat 3 "Inhibited" 2 "Disabled" 1 "On" 0 "Off";
+VAL_ 929 BalrWndwLeft_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 929 WndwPsngrRear_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 929 WndwPsngr_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 929 WndwDrvRear_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 929 WndwDrv_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest";
+VAL_ 929 BalrSnsLeft_D_Falt 3 "Invalid" 2 "SystemFailure" 1 "Blocked" 0 "Clear";
+VAL_ 929 BalrMdeSelLeft_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 929 BalrMdeLeft_D_Stat 3 "NotUsed" 2 "High" 1 "Medium" 0 "Low";
+VAL_ 929 BalrLckLeft_B_Stat 1 "Enable" 0 "Disable";
+VAL_ 929 CamraRearOn_B_RqBalrl 1 "Active" 0 "Inactive";
+VAL_ 929 DrLckActv_B_RqBalrl 1 "Active" 0 "Null";
+VAL_ 402 PrkAidSwtch_D_RqMnu 1 "Pressed" 0 "Not_Pressed";
+VAL_ 402 ApaSwtch_D_RqMnu 3 "NotUsed2" 2 "NotUsed1" 1 "Pressed" 0 "Not_Pressed";
+VAL_ 402 ApaMdeStat_D_RqDrv 7 "Faulty" 6 "Off" 5 "NotUsed2" 4 "NotUsed1" 3 "POA" 2 "PPA" 1 "SAPP" 0 "Inactive";
+VAL_ 402 CamraViewSplit_B_Rq 1 "On" 0 "Off";
+VAL_ 402 CamraZoomMan_D_Rq 7 "Unknown" 6 "Invalid" 5 "Zoom_Level_V" 4 "Zoom_Level_IV" 3 "Zoom_Level_III" 2 "Zoom_Level_II" 1 "Zoom_Level_I" 0 "Off";
+VAL_ 402 CamraOvrlStat_D_Rq 1 "On" 0 "Off";
+VAL_ 402 CamraOvrlDyn_D_Rq 1 "On" 0 "Off";
+VAL_ 402 CamAutoTowbarZoom 1 "On" 0 "Off";
+VAL_ 402 DistanceBarSetting 1 "On" 0 "Off";
+VAL_ 924 DcacOut_Pw_Mx 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 924 DcacOut2_Pw_Actl 8191 "Faulty" 8190 "NoDataExists";
+VAL_ 924 DcacOut1_Pw_Actl 8191 "Faulty" 8190 "NoDataExists";
+VAL_ 924 DcacIn_Pw_Mx 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 923 DcacIn_U2_Actl 4095 "Faulty" 4094 "NoDataExists";
+VAL_ 923 DcacIn_U_Actl 4095 "Fault" 4094 "NoDataExists";
+VAL_ 923 DcacIn_I_Actl 2047 "Faulty" 2046 "NoDataExists";
+VAL_ 923 Dcac_Te_Actl 255 "Faulty" 254 "NoDataExists";
+VAL_ 922 DcacBp2BrkrOpn_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacBp1BrkrOpn_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacIpRcBrkrOpn_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacRdy_D2_Stat 3 "Faulted" 2 "RecoverableFault" 1 "Active" 0 "Idle";
+VAL_ 922 DcacOvrld_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacOverTe_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacGfci_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacErr_B_Stat 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacAcUDetct_B_Falt 1 "Faulted" 0 "NotFaulted";
+VAL_ 922 DcacRdy_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "Faulted" 4 "ProtectionTempearture" 3 "ProtectionOverload" 2 "ProtectionGfci" 1 "Active" 0 "Idle";
+VAL_ 922 DcacPlugPrsnt_B_Stat 1 "Yes" 0 "No";
+VAL_ 922 DcacClntFlw_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
+VAL_ 922 CoolFanDcac_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/.gitignore b/iqdbc_repo/iqdbc/dbc/generator/chrysler/.gitignore
new file mode 100644
index 000000000..46fc4e0d8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/.gitignore
@@ -0,0 +1 @@
+_*generated.dbc
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common.dbc b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common.dbc
new file mode 100644
index 000000000..8a200e532
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common.dbc
@@ -0,0 +1,187 @@
+BO_ 258 STEERING: 8 XXX
+ SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX
+ SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX
+ SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 264 ECM_1: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 280 ECM_TRQ: 8 XXX
+ SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+ SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+
+BO_ 284 ESP_8: 8 XXX
+ SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 288 ECM_2: 7 XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 320 ESP_1: 8 XXX
+ SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX
+ SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX
+ SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 268 ESP_2: 8 ESC
+ SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 344 ESP_6: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 368 Transmission_Status: 8 XXX
+ SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 464 ORC_1: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 500 DAS_3: 8 XXX
+ SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX
+ SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 501 DAS_4: 8 XXX
+ SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX
+ SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX
+ SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 544 EPS_2: 8 XXX
+ SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX
+ SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX
+ SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 559 ECM_5: 8 XXX
+ SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 571 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 625 DAS_5: 8 XXX
+ SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX
+ SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX
+ SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 669 EPB_1: 3 XXX
+ SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 678 DAS_6: 8 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 720 BSM_1: 6 XXX
+ SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 792 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 820 BCM_1: 8 XXX
+ SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE"
+VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ;
+VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ;
+
+CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision";
+CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque";
+CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram.py b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram.py
new file mode 100755
index 000000000..fa408f131
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+import os
+
+chrysler_to_ram = {
+ "_stellantis_common_ram_dt_generated.dbc": {
+ 258: 35,
+ 264: 37,
+ 268: 113,
+ 280: 181,
+ 284: 121,
+ 288: 123,
+ 320: 131,
+ 344: 139,
+ 368: 147,
+ 464: 464,
+ 500: 153,
+ 501: 232,
+ 544: 49,
+ 571: 177,
+ 559: 157,
+ 625: 163,
+ 669: 213,
+ 678: 250,
+ 720: 720,
+ 792: 792,
+ 820: 657,
+ },
+ "_stellantis_common_ram_hd_generated.dbc": {
+ 571: 570,
+ 678: 629,
+ },
+}
+
+if __name__ == "__main__":
+ src = '_stellantis_common.dbc'
+ chrysler_path = os.path.dirname(os.path.realpath(__file__))
+
+ for out, addr_lookup in chrysler_to_ram.items():
+ with open(os.path.join(chrysler_path, src), encoding='utf-8') as in_f, open(os.path.join(chrysler_path, out), 'w', encoding='utf-8') as out_f:
+ out_f.write(f'CM_ "Generated from {src}"\n\n')
+
+ wrote_addrs = set()
+ for line in in_f.readlines():
+ if line.startswith(('BO_', 'VAL_')):
+ sl = line.split(' ')
+ addr = int(sl[1])
+ wrote_addrs.add(addr)
+
+ sl[1] = str(addr_lookup.get(addr, addr))
+ line = ' '.join(sl)
+ out_f.write(line)
+
+ missing_addrs = set(addr_lookup.keys()) - wrote_addrs
+ assert len(missing_addrs) == 0, f"Missing addrs from {src}: {missing_addrs}"
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram_dt_generated.dbc b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram_dt_generated.dbc
new file mode 100644
index 000000000..d082a0344
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram_dt_generated.dbc
@@ -0,0 +1,189 @@
+CM_ "Generated from _stellantis_common.dbc"
+
+BO_ 35 STEERING: 8 XXX
+ SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX
+ SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX
+ SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 37 ECM_1: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 181 ECM_TRQ: 8 XXX
+ SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+ SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+
+BO_ 121 ESP_8: 8 XXX
+ SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 123 ECM_2: 7 XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 131 ESP_1: 8 XXX
+ SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX
+ SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX
+ SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 113 ESP_2: 8 ESC
+ SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 139 ESP_6: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 147 Transmission_Status: 8 XXX
+ SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 464 ORC_1: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 153 DAS_3: 8 XXX
+ SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX
+ SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 232 DAS_4: 8 XXX
+ SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX
+ SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX
+ SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 49 EPS_2: 8 XXX
+ SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX
+ SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX
+ SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 157 ECM_5: 8 XXX
+ SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 177 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 163 DAS_5: 8 XXX
+ SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX
+ SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX
+ SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 213 EPB_1: 3 XXX
+ SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 250 DAS_6: 8 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 720 BSM_1: 6 XXX
+ SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 792 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 657 BCM_1: 8 XXX
+ SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 131 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE"
+VAL_ 147 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ;
+VAL_ 213 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ;
+
+CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision";
+CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque";
+CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram_hd_generated.dbc b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram_hd_generated.dbc
new file mode 100644
index 000000000..da092f57e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/_stellantis_common_ram_hd_generated.dbc
@@ -0,0 +1,189 @@
+CM_ "Generated from _stellantis_common.dbc"
+
+BO_ 258 STEERING: 8 XXX
+ SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX
+ SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX
+ SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 264 ECM_1: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 280 ECM_TRQ: 8 XXX
+ SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+ SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX
+
+BO_ 284 ESP_8: 8 XXX
+ SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 288 ECM_2: 7 XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 320 ESP_1: 8 XXX
+ SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX
+ SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX
+ SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 268 ESP_2: 8 ESC
+ SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 344 ESP_6: 8 XXX
+ SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX
+ SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 368 Transmission_Status: 8 XXX
+ SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 464 ORC_1: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 500 DAS_3: 8 XXX
+ SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX
+ SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX
+ SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX
+ SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 501 DAS_4: 8 XXX
+ SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX
+ SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX
+ SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 544 EPS_2: 8 XXX
+ SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX
+ SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX
+ SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX
+ SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 559 ECM_5: 8 XXX
+ SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 570 CRUISE_BUTTONS: 3 XXX
+ SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 625 DAS_5: 8 XXX
+ SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX
+ SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX
+ SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX
+ SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 669 EPB_1: 3 XXX
+ SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 629 DAS_6: 8 XXX
+ SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 720 BSM_1: 6 XXX
+ SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 792 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 820 BCM_1: 8 XXX
+ SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE"
+VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ;
+VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ;
+
+CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision";
+CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque";
+CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc b/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc
new file mode 100644
index 000000000..961c58403
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc
@@ -0,0 +1,177 @@
+CM_ "IMPORT _stellantis_common.dbc";
+
+BO_ 514 SPEED_1: 8 XXX
+ SG_ SPEED_LEFT : 7|12@0+ (0.071028,0) [0|65535] "m/s" XXX
+ SG_ SPEED_RIGHT : 23|12@0+ (0.071028,0) [0|1023] "m/s" XXX
+
+BO_ 653 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|4] "" XXX
+
+BO_ 746 GEAR: 5 XXX
+ SG_ PRNDL : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ GEAR_CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 31|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 736 TRIP: 8 XXX
+ SG_ COUNTER : 7|16@0+ (1,0) [0|65535] "Meters" XXX
+ SG_ COUNTER_2 : 23|16@0+ (1,0) [0|65535] "Meters" XXX
+
+BO_ 658 LKAS_COMMAND: 6 XXX
+ SG_ COUNTER : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEERING_TORQUE : 2|11@0+ (1,-1024) [0|1] "" XXX
+ SG_ LKAS_CONTROL_BIT : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 705 AUTO_PARK_BUTTON: 8 XXX
+ SG_ AUTO_PARK_TOGGLE_2 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_TOGGLE_1 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ INCREASING_UNKNOWN : 38|7@0+ (1,0) [0|15] "" XXX
+
+BO_ 719 AUTO_PARK_SIGNALS_1: 8 XXX
+ SG_ AUTO_PARK_UNKNOWN_1 : 7|16@0+ (1,0) [0|31] "" XXX
+
+BO_ 671 AUTO_PARK_REQUEST: 8 XXX
+ SG_ AUTO_PARK_CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_PARK_STATUS : 7|5@0+ (1,0) [0|15] "" XXX
+ SG_ AUTO_PARK_COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ AUTO_PARK_MODE : 22|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_PARK_CMD : 2|11@0+ (1,-1024) [0|1] "NM" XXX
+
+BO_ 784 AUTO_PARK_LESS_INTERESTING: 8 XXX
+ SG_ INCREASING_UNKNOWN : 55|8@0+ (1,0) [0|7] "" XXX
+ SG_ AUTO_PARK_PERPENDICULAR_2 : 61|1@0+ (1,0) [0|255] "" XXX
+
+BO_ 826 AUTO_PARK_SIGNALS_3: 8 XXX
+ SG_ AUTO_PARK_HAS_CONTROL_3 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUMAN_HAS_CONTROL : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_PARK_GEAR_1 : 27|4@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_PARK_GEAR_2 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ AUTO_PARK_GEAR_3 : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 332 STEERING_2: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ ENERGY_RELATED : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ STEER_ANGLE_2 : 7|13@0+ (0.3187251,-1307.888) [-360|360] "deg" XXX
+
+BO_ 331 BRAKE_3: 8 XXX
+ SG_ BRAKE_RELATED_3 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 608 PARKSENSE_SIGNAL: 8 XXX
+ SG_ PARKSENSE_DISABLED : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ IN_REVERSE : 10|1@0+ (1,0) [0|255] "" XXX
+ SG_ AUTO_PARK_HAS_CONTROL_1 : 16|1@0+ (1,0) [0|255] "" XXX
+ SG_ HUMAN_HAS_CONTROL : 17|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 729 LKAS_HEARTBIT: 5 XXX
+ SG_ LKAS_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_1 : 7|24@0+ (1,0) [0|255] "" XXX
+ SG_ FORWARD_2 : 30|6@0+ (1,0) [0|127] "" XXX
+ SG_ FORWARD_3 : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 257 ACCEL_RELATED_101: 5 XXX
+ SG_ ENERGY_OR_RPM : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 825 AUDIBLE_BEEP_339: 2 XXX
+ SG_ BEEP_339 : 7|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 168 ACCEL_RELATED_a8: 8 XXX
+ SG_ ACCEL_RELATED : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 270 ACCEL_RELATED_10e: 8 XXX
+ SG_ ACCEL_OR_RPM : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ ELECTRIC_MOTOR : 23|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 291 ENERGY_RELATED_123: 8 XXX
+ SG_ ENERGY_GAIN_LOSS : 18|11@0- (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ ENERGY_SMOOTHER_CURVE : 35|12@0+ (1,0) [0|2047] "" XXX
+
+BO_ 294 ENERGY_RELATED_126: 8 XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_126_1 : 3|12@0+ (1,0) [0|4095] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ UNKNOWN_126_2 : 35|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ENERGY_GAIN_LOSS_NOISY : 19|12@0+ (1,0) [0|2047] "" XXX
+
+BO_ 308 ACCEL_GAS_134: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ ACCEL_134 : 46|7@0+ (1,0) [0|127] "" XXX
+
+BO_ 532 ENERGY_RELATED_214: 8 XXX
+ SG_ NOISY_SLOWLY_DECREASING : 19|12@0+ (1,0) [0|255] "" XXX
+ SG_ ENERGY_RELATED : 0|9@0+ (1,0) [0|255] "" XXX
+
+BO_ 655 CHARGING_MAYBE_28F: 8 XXX
+ SG_ CHARGING : 1|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 660 BRAKE_RELATED_294: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PERHAPS_294 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 764 ACCEL_RELATED_2FC: 8 XXX
+ SG_ ACCEL_2FC : 13|6@0+ (1,0) [0|255] "" XXX
+
+BO_ 816 TRACTION_BUTTON: 8 XXX
+ SG_ TRACTION_OFF : 19|1@0+ (1,0) [0|3] "" XXX
+ SG_ TOGGLE_PARKSENSE : 52|1@0+ (1,0) [0|3] "" XXX
+ SG_ TOGGLE_LKAS : 53|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 878 ACCEL_RELATED_36E: 8 XXX
+ SG_ ACCEL_OR_RPM_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ACCEL_OR_RPM_1 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 324 SPEED_2: 8 XXX
+ SG_ SPEED_2 : 31|16@0+ (0.01,0) [0|255] "m/s" XXX
+
+BO_ 832 UNKNOWN_340: 8 XXX
+ SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
+
+CM_ SG_ 653 BRAKE_PRESSURE "max seems to be 148";
+CM_ SG_ 746 PRNDL "5=L, 4=D, 3=N, 2=R, 1=P";
+CM_ SG_ 320 BRAKE_PRESSED_2 "Value is 5 when brake is pressed by human, 1 when ACC brake";
+CM_ SG_ 320 BRAKE_PRESSED_ACC "set when ACC brakes";
+CM_ SG_ 792 TURN_SIGNALS "1=Left, 2=Right";
+CM_ SG_ 264 ACCEL_PEDAL "not in ACC so seems to be actual pedal. Use for gasPressed";
+CM_ SG_ 544 LKAS_STATE "2 when autopark has control, 8 when is actuatable by lkas, 4 when there is a fault";
+CM_ SG_ 658 LKAS_STEERING_TORQUE "Most sent by stock system is 1024+-230. + is left. typically changes by 2 or 3 each 0.01s";
+CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null";
+CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null";
+CM_ SG_ 705 AUTO_PARK_TOGGLE_1 "set briefly when turning on or off self-parking";
+CM_ SG_ 671 AUTO_PARK_CMD "Request Appears to be in NM";
+CM_ SG_ 671 AUTO_PARK_STATUS "1 = IDLE / NO REQUEST 9 = START REQUEST 10 = REQUEST MODE 11 = REQUEST MODE";
+CM_ SG_ 826 AUTO_PARK_GEAR_1 "Reverse=0, Forward=f";
+CM_ SG_ 826 AUTO_PARK_GEAR_2 "Reverse=0, Forward=f";
+CM_ SG_ 826 AUTO_PARK_GEAR_3 "Reverse=0, Forward=f";
+CM_ SG_ 332 STEER_ANGLE_2 "slightly lags the other steer_angle signal. also more noisy.";
+CM_ SG_ 608 PARKSENSE_DISABLED "set if parksense is disabled";
+CM_ SG_ 729 LKAS_STATUS_OK "Set to 0x0820 when LKAS system is plugged in.";
+CM_ SG_ 825 BEEP_339 "sent every 0.5s. 0050 is no beep. To beep send 4355 or 4155. Used by ParkSense warning.";
+CM_ SG_ 270 ELECTRIC_MOTOR "0x7fff indicates electric motor not in use";
+CM_ SG_ 291 ENERGY_GAIN_LOSS "unsure what this actually is";
+CM_ SG_ 291 ENERGY_SMOOTHER_CURVE "unsure what it is, but smoother";
+CM_ SG_ 308 ACCEL_134 "only set when human presses accel pedal";
+CM_ SG_ 532 NOISY_SLOWLY_DECREASING "perhaps battery but do not know";
+CM_ SG_ 816 TRACTION_OFF "set when traction off button is enabled";
+CM_ SG_ 816 TOGGLE_PARKSENSE "sending 3000071ec0ff9000 enables or disables parksense";
+CM_ SG_ 324 SPEED_2 "signal is approx half other speeds";
+CM_ SG_ 501 ACC_SPEED_CONFIG_KPH "speed configured for ACC";
+CM_ SG_ 501 ACC_SPEED_CONFIG_MPH "speed configured for ACC";
+CM_ SG_ 501 CRUISE_STATE "may just be an icon, but seems to indicate different cruise modes: ACC and Non-ACC and engaged state for both.";
+CM_ SG_ 625 SPEED "zero on non-acc drives";
+
+VAL_ 501 CRUISE_STATE 0 "Off" 1 "CC On" 2 "CC Engaged" 3 "ACC On" 4 "ACC Engaged";
+VAL_ 746 PRNDL 5 "L" 4 "D" 3 "N" 2 "R" 1 "P";
+VAL_ 792 TURN_SIGNALS 2 "Right" 1 "Left";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_ram_dt.dbc b/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_ram_dt.dbc
new file mode 100644
index 000000000..c9be635e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_ram_dt.dbc
@@ -0,0 +1,57 @@
+CM_ "IMPORT _stellantis_common_ram_dt_generated.dbc";
+
+BO_ 53 PCM_2: 8 XXX
+ SG_ ENG_TORQUE_REQ : 3|12@0+ (1,0) [0|7] "" XXX
+ SG_ ENG_TORQUE_OUT : 19|12@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 133 TCM_1: 8 XXX
+ SG_ SHIFT_PENDING : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACTUAL_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DESIRED_GEAR : 15|4@0+ (1,0) [0|1] "" XXX
+ SG_ TC_LOCKED : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ OUTPUT_SPEED : 31|16@0+ (1,0) [0|65534] "rpm" XXX
+ SG_ INPUT_SPEED : 47|16@0+ (1,0) [0|65534] "rpm" XXX
+ SG_ OUTPUT_SPEED_SIGN : 57|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 135 ABS_2: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_BRAKE : 15|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 137 ESP_4: 8 XXX
+ SG_ Yaw_Rate : 7|16@0+ (0.01,-327.68) [-327.68|327.66] "deg/s" XXX
+ SG_ Acceleration : 32|8@1+ (0.08,-10.24) [-10.24|10.08] "m/s2" XXX
+
+BO_ 164 EPS_3: 8 XXX
+ SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 166 LKAS_COMMAND: 8 XXX
+ SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX
+ SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX
+ SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 221 Center_Stack_1: 8 XXX
+ SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 650 Center_Stack_2: 8 XXX
+ SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX
+
+
+CM_ SG_ 133 ACTUAL_GEAR "0xd = P, 0x1-8 = D (actual gear), 0xb = R or N?? TODO find R vs N";
+CM_ SG_ 153 ACC_Engaged "SENT BY FORWARD CAMERA 1 = ACTIVE, 3 = ENGAGED, 0 = DISENGAGED/OFF";
+CM_ SG_ 166 LKAS_CONTROL_BIT "0=IDLE, 1=HAS 2=LKAS 3=ABSD, 4=TJA, 7=SNA";
+CM_ SG_ 250 Auto_High_Beam "1 = HIGH BEAMS OK 0 = HIGH BEAMS OFF ";
+CM_ SG_ 250 LKAS_LANE_LINES "9 = LEFT CAUTION, 11 = VERY LEFT CAUTION 10 = RIGHT CAUTION, 14 = VERY RIGHT, 4 = NO LINES DETECTED, 3 = LINES DETECTED, SYSTEM ACTIVE";
+CM_ SG_ 464 Driver_Seatbelt_Status "1 unbuckled 0 buckled";
+CM_ SG_ 792 High_Beam_Lever_Status "1 is high beam, 0 reg";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_ram_hd.dbc b/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_ram_hd.dbc
new file mode 100644
index 000000000..5f5feee65
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/chrysler/chrysler_ram_hd.dbc
@@ -0,0 +1,23 @@
+CM_ "IMPORT _stellantis_common_ram_hd_generated.dbc";
+
+BO_ 545 EPS_3: 8 XXX
+ SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 630 LKAS_COMMAND: 8 XXX
+ SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX
+ SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX
+ SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 816 Center_Stack_1: 8 XXX
+ SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 650 Center_Stack_2: 8 XXX
+ SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/generator/ford/FORD_CADS_64.sh b/iqdbc_repo/iqdbc/dbc/generator/ford/FORD_CADS_64.sh
new file mode 100755
index 000000000..4732a854e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/ford/FORD_CADS_64.sh
@@ -0,0 +1,2845 @@
+#!/bin/bash
+
+OUT_FILENAME="../../FORD_CADS_64.dbc"
+
+
+build_bo(){
+id=$1
+# bo=$(($id + 287))
+bo=$(expr $id + 287)
+
+len=64
+if [ "$id" = "22" ]; then
+ len=24
+fi
+
+cat <> ${OUT_FILENAME}
+BO_ ${bo} MRR_Detection_0${id}: ${len} MRR
+EOF
+
+build_bo_segment $id "01"
+build_bo_segment $id "02"
+build_bo_segment $id "03"
+if [ "$id" != "22" ]; then
+ build_bo_segment $id "04"
+ build_bo_segment $id "05"
+ build_bo_segment $id "06"
+fi
+echo "" >> ${OUT_FILENAME}
+
+}
+
+build_bo_segment(){
+ id=$1
+ seg=$2
+ base=$((($2 - 1)*72))
+cat <> ${OUT_FILENAME}
+ SG_ CAN_DET_CONFID_AZIMUTH_${id}_${seg} : $(expr $base + 33)|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_${id}_${seg} : $(expr $base + 56)|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_${id}_${seg} : $(expr $base + 48)|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_${id}_${seg} : $(expr $base + 49)|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_${id}_${seg} : $(expr $base + 0)|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_${id}_${seg} : $(expr $base + 47)|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_${id}_${seg} : $(expr $base + 31)|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_${id}_${seg} : $(expr $base + 15)|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_${id}_${seg} : $(expr $base + 7)|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_${id}_${seg} : $(expr $base + 17)|2@0+ (1,0) [0|3] "" IFV_VFP
+EOF
+}
+
+
+build_ba(){
+id=$1
+# bo=$(($id + 287))
+ba=$(expr $id + 287)
+
+len=64
+if [ "$id" = "22" ]; then
+ len=24
+fi
+
+cat <> ${OUT_FILENAME}
+BA_ "GenMsgSendType" BO_ ${ba} 1;
+BA_ "GenMsgILSupport" BO_ ${ba} 1;
+BA_ "GenMsgNrOfRepetition" BO_ ${ba} 0;
+BA_ "GenMsgCycleTime" BO_ ${ba} 0;
+BA_ "NetworkInitialization" BO_ ${ba} 0;
+BA_ "GenMsgDelayTime" BO_ ${ba} 0;
+EOF
+
+build_ba_segment $ba $id "01"
+build_ba_segment $ba $id "02"
+build_ba_segment $ba $id "03"
+if [ "$id" != "22" ]; then
+ build_ba_segment $ba $id "04"
+ build_ba_segment $ba $id "05"
+ build_ba_segment $ba $id "06"
+fi
+
+}
+
+build_ba_segment(){
+ ba=$1
+ id=$2
+ seg=$3
+
+cat <> ${OUT_FILENAME}
+BA_ "GenSigVtEn" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} "CAN_DET_CONFID_AZIMUTH_${id}_${seg}";
+BA_ "GenSigVtName" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} "CAN_DET_CONFID_AZIMUTH_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} "CAN_DET_CONFID_AZIMUTH_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_SUPER_RES_TARGET_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_SUPER_RES_TARGET_${id}_${seg} "CAN_DET_SUPER_RES_TARGET_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_ND_TARGET_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_ND_TARGET_${id}_${seg} "CAN_DET_ND_TARGET_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_HOST_VEH_CLUTTER_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_HOST_VEH_CLUTTER_${id}_${seg} "CAN_DET_HOST_VEH_CLUTTER_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_VALID_LEVEL_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_VALID_LEVEL_${id}_${seg} "CAN_DET_VALID_LEVEL_${id}_${seg}";
+BA_ "GenSigStartValue" SG_ ${ba} CAN_DET_AZIMUTH_${id}_${seg} 0;
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_AZIMUTH_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_AZIMUTH_${id}_${seg} "CAN_DET_AZIMUTH_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_RANGE_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_RANGE_${id}_${seg} "CAN_DET_RANGE_${id}_${seg}";
+BA_ "GenSigStartValue" SG_ ${ba} CAN_DET_RANGE_RATE_${id}_${seg} 0;
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_RANGE_RATE_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_RANGE_RATE_${id}_${seg} "CAN_DET_RANGE_RATE_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_DET_AMPLITUDE_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_DET_AMPLITUDE_${id}_${seg} "CAN_DET_AMPLITUDE_${id}_${seg}";
+BA_ "GenSigSendType" SG_ ${ba} CAN_SCAN_INDEX_2LSB_${id}_${seg} 0;
+BA_ "GenSigCmt" SG_ ${ba} CAN_SCAN_INDEX_2LSB_${id}_${seg} "CAN_SCAN_INDEX_2LSB_${id}_${seg}";
+EOF
+}
+
+build_val(){
+id=$1
+# bo=$(($id + 287))
+val=$(expr $id + 287)
+
+cat <> ${OUT_FILENAME}
+VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+EOF
+if [ "$id" != "22" ]; then
+cat <> ${OUT_FILENAME}
+VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+EOF
+fi
+
+}
+
+
+cat < ${OUT_FILENAME}
+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_: MRR
+BO_ 1073741824 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX
+ SG_ New_Signal_943 : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAN_SENSOR_VANGLE_OFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_SENSOR_FOV_VER : 0|8@0+ (1,0) [0|255] "deg" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE_QF : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE_REF : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_AUTO_ALIGN_VANGLE : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_MMIC_Temp4 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_MMIC_Temp3 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_MMIC_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_Processor_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX
+ SG_ CAN_CHECKSUM : 0|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ CAN_COUNTER : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_VEHICLE_MODE : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ CAN_USC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_USC_CAL_VER_MINOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_SMC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX
+ SG_ CAN_HW_VERSION : 0|32@0+ (1,0) [0|4.29497e+09] "" Vector__XXX
+ SG_ CAN_FAC_TGT_MTG_SPACE_VER : 0|8@0+ (1,-128) [-128|127] "cm" Vector__XXX
+ SG_ CAN_ANGLE_MISALIGNMENT_VER : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX
+ SG_ CAN_ANGLE_MOUNTING_VOFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX
+ SG_ CAN_LATCH_FAULTS : 0|64@0+ (1,0) [0|100] "" Vector__XXX
+ SG_ CAN_ACTIVE_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX
+ SG_ CAN_HISTORY_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX
+ SG_ CAN_SERV_ALIGN_ENABLE : 0|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ CAN_LONG_MOUNTING_OFFSET : 0|8@0+ (0.015625,-2) [-2|1.98438] "" Vector__XXX
+ SG_ CAN_BEAMWIDTH_VERT : 0|7@0+ (0.125,0) [0|15.875] "deg" Vector__XXX
+ SG_ CAN_VEHICLE_SPEED_CALC_QF : 0|2@0+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 34 Active_Fault_Latched_2: 8 MRR
+ SG_ IPMA_PCAN_DataRangeCheck : 4|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ IPMA_PCAN_MissingMsg : 3|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ VINSignalCompareFailure : 2|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ModuleNotConfiguredError : 1|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ CarCfgNotConfiguredError : 0|1@1+ (1,0) [0|1] "" External_Tool
+
+BO_ 33 Active_Fault_Latched_1: 8 MRR
+ SG_ Active_Flt_Latched_byte7_bit7 : 63|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit6 : 62|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit5 : 61|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte7_bit4 : 60|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ARMtoDSPChksumFault : 59|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ DSPtoArmChksumFault : 58|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ HostToArmChksumFault : 57|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ARMtoHostChksumFault : 56|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ LoopBWOutOfRange : 55|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ DSPOverrunFault : 54|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte6_bit5 : 53|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TuningSensitivityFault : 52|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ SaturatedTuningFreqFault : 51|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ LocalOscPowerFault : 50|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterPowerFault : 49|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte6_bit0 : 48|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit7 : 47|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit6 : 46|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ XCVRDeviceSPIFault : 45|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ FreqSynthesizerSPIFault : 44|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ AnalogConverterDevicSPIFault : 43|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ SidelobeBlockage : 42|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte5_bit1 : 41|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ MNRBlocked : 40|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ECUTempHighFault : 39|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterTempHighFault : 38|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ AlignmentRoutineFailedFault : 37|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ UnreasonableRadarData : 36|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ MicroprocessorTempHighFault : 35|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ VerticalAlignmentOutOfRange : 34|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ HorizontalAlignmentOutOfRange : 33|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ FactoryAlignmentMode : 32|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ BatteryLowFault : 31|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ BatteryHighFault : 30|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_1p25SupplyOutOfRange : 29|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte3_bit4 : 28|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ThermistorOutOfRange : 27|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_3p3DACSupplyOutOfRange : 26|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_3p3RAWSupplyOutOfRange : 25|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ v_5_SupplyOutOfRange : 24|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ TransmitterIDFault : 23|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit6 : 22|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit5 : 21|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit4 : 20|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit3 : 19|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte2_bit2 : 18|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PCANMissingMsgFault : 17|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PCANBusOff : 16|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit7 : 15|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit6 : 14|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ InstructionSetCheckFault : 13|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ StackOverflowFault : 12|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ WatchdogFault : 11|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ PLLLockFault : 10|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte1_bit1 : 9|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ RAMMemoryTestFault : 8|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ USCValidationFault : 7|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit6 : 6|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit5 : 5|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit4 : 4|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ Active_Flt_Latched_byte0_bit3 : 3|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ KeepAliveChecksumFault : 2|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ProgramCalibrationFlashChecksum : 1|1@1+ (1,0) [0|1] "" External_Tool
+ SG_ ApplicationFlashChecksumFault : 0|1@1+ (1,0) [0|1] "" External_Tool
+
+BO_ 500 XCP_MRR_DAQ_RESP: 8 MRR
+ SG_ MRR_xcp_daq_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_daq_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 499 XCP_MRR_DTO_RESP: 8 MRR
+ SG_ MRR_xcp_dto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_dto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 497 XCP_MRR_CTO_RESP: 8 MRR
+ SG_ MRR_xcp_cto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ MRR_xcp_cto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 1900 Ford_Diag_Resp_Phys: 8 MRR
+ SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467e+19] "" IFV_Host
+
+BO_ 261 MRR_Status_SerialNumber: 8 MRR
+ SG_ CAN_SEQUENCE_NUMBER : 55|16@0+ (1,0) [0|65535] "" External_Tool
+ SG_ CAN_SERIAL_NUMBER : 7|40@0+ (1,0) [0|1.09951e+12] "" External_Tool
+
+BO_ 264 MRR_Status_SwVersion: 8 MRR
+ SG_ CAN_PBL_Field_Revision : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_PBL_Promote_Revision : 39|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Field_Revision : 23|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Promote_Revision : 15|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_SW_Release_Revision : 7|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_PBL_Release_Revision : 31|8@0+ (1,0) [0|255] "" External_Tool
+
+BO_ 373 MRR_Header_SensorPosition: 8 MRR
+ SG_ CAN_SENSOR_POLARITY : 55|1@0+ (1,0) [0|1] "" External_Tool
+ SG_ CAN_SENSOR_LAT_OFFSET : 39|16@0+ (0.01,0) [0|655.35] "cm" External_Tool
+ SG_ CAN_SENSOR_LONG_OFFSET : 23|16@0+ (0.01,0) [0|655.35] "cm" External_Tool
+ SG_ CAN_SENSOR_HANGLE_OFFSET : 7|8@0+ (0.0625,-8) [-8|7.9375] "deg" External_Tool
+
+BO_ 372 MRR_Header_SensorCoverage: 8 MRR
+ SG_ CAN_SENSOR_FOV_HOR : 39|8@0+ (1,0) [0|255] "deg" IFV_VFP
+ SG_ CAN_DOPPLER_COVERAGE : 23|8@0+ (1,-128) [-128|127] "m/s" IFV_VFP
+ SG_ CAN_RANGE_COVERAGE : 7|8@0+ (1,0) [0|255] "m" IFV_VFP
+
+BO_ 371 MRR_Header_AlignmentState: 8 MRR
+ SG_ CAN_AUTO_ALIGN_HANGLE_QF : 13|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_ALIGNMENT_STATUS : 51|4@0+ (1,0) [0|11] "" IFV_VFP
+ SG_ CAN_ALIGNMENT_STATE : 55|3@0+ (1,0) [0|7] "" IFV_VFP
+ SG_ CAN_AUTO_ALIGN_HANGLE_REF : 11|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP
+ SG_ CAN_AUTO_ALIGN_HANGLE : 7|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP
+
+BO_ 369 MRR_Header_Timestamps: 8 MRR
+ SG_ CAN_DET_TIME_SINCE_MEAS : 39|11@0+ (0.1,0) [0|204.7] "ms" IFV_Host
+ SG_ CAN_SENSOR_TIME_STAMP : 7|32@0+ (0.1,0) [0|4.29497e+08] "ms" IFV_VFP
+
+BO_ 368 MRR_Header_InformationDetections: 8 MRR
+ SG_ CAN_ALIGN_UPDATES_DONE : 55|16@0+ (1,0) [0|65535] "" IFV_VFP
+ SG_ CAN_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" IFV_VFP
+ SG_ CAN_NUMBER_OF_DET : 47|8@0+ (1,0) [0|255] "" External_Tool
+ SG_ CAN_LOOK_ID : 23|2@0+ (1,0) [0|3] "" External_Tool
+ SG_ CAN_LOOK_INDEX : 7|16@0+ (1,0) [0|65535] "" External_Tool
+
+BO_ 265 MRR_Status_Temp_Volt: 8 MRR
+ SG_ CAN_BATT_VOLTS : 63|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_1_25_V : 55|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_5_V : 47|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_3_3_V_RAW : 31|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_3_3_V_DAC : 15|8@0+ (0.08,0) [0|20.4] "V" External_Tool
+ SG_ CAN_MMIC_Temp1 : 39|8@0+ (1,-50) [-50|205] "C" External_Tool
+ SG_ CAN_Processor_Thermistor : 23|8@0+ (1,-50) [-50|205] "C" External_Tool
+ SG_ CAN_Processor_Temp1 : 7|8@0+ (1,-50) [-50|205] "C" External_Tool
+
+EOF
+
+build_bo "04"
+
+cat <> ${OUT_FILENAME}
+BO_ 351 MRR_Detection_064: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_64 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_64 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_64 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_64 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_64 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_64 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_64 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_64 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_64 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_64 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 350 MRR_Detection_063: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_63 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_63 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_63 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_63 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_63 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_63 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_63 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_63 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_63 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_63 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 349 MRR_Detection_062: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_62 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_62 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_62 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_62 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_62 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_62 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_62 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_62 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_62 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_62 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 348 MRR_Detection_061: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_61 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_61 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_61 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_61 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_61 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_61 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_61 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_61 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_61 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_61 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 347 MRR_Detection_060: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_60 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_60 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_60 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_60 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_60 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_60 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_60 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_60 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_60 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_60 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 346 MRR_Detection_059: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_59 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_59 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_59 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_59 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_59 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_59 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_59 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_59 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_59 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_59 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 345 MRR_Detection_058: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_58 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_58 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_58 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_58 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_58 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_58 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_58 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_58 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_58 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_58 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 344 MRR_Detection_057: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_57 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_57 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_57 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_57 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_57 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_57 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_57 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_57 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_57 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_57 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 343 MRR_Detection_056: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_56 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_56 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_56 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_56 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_56 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_56 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_56 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_56 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_56 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_56 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 342 MRR_Detection_055: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_55 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_55 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_55 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_55 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_55 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_55 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_55 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_55 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_55 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_55 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 335 MRR_Detection_048: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_48 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_48 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_48 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_48 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_48 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_48 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_48 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_48 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_48 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_48 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 334 MRR_Detection_047: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_47 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_47 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_47 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_47 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_47 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_47 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_47 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_47 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_47 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_47 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 333 MRR_Detection_046: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_46 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_46 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_46 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_46 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_46 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_46 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_46 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_46 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_46 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_46 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 332 MRR_Detection_045: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_45 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_45 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_45 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_45 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_45 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_45 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_45 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_45 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_45 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_45 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 331 MRR_Detection_044: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_44 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_44 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_44 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_44 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_44 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_44 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_44 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_44 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_44 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_44 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 330 MRR_Detection_043: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_43 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_43 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_43 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_43 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_43 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_43 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_43 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_43 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_43 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_43 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 329 MRR_Detection_042: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_42 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_42 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_42 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_42 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_42 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_42 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_42 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_42 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_42 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_42 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 328 MRR_Detection_041: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_41 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_41 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_41 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_41 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_41 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_41 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_41 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_41 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_41 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_41 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 327 MRR_Detection_040: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_40 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_40 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_40 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_40 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_40 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_40 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_40 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_40 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_40 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_40 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 325 MRR_Detection_038: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_38 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_38 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_38 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_38 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_38 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_38 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_38 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_38 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_38 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_38 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 324 MRR_Detection_037: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_37 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_37 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_37 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_37 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_37 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_37 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_37 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_37 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_37 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_37 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 323 MRR_Detection_036: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_36 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_36 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_36 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_36 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_36 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_36 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_36 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_36 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_36 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_36 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 322 MRR_Detection_035: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_35 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_35 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_35 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_35 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_35 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_35 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_35 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_35 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_35 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_35 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 321 MRR_Detection_034: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_34 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_34 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_34 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_34 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_34 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_34 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_34 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_34 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_34 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_34 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 320 MRR_Detection_033: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_33 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_33 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_33 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_33 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_33 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_33 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_33 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_33 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_33 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_33 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 319 MRR_Detection_032: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_32 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_32 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_32 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_32 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_32 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_32 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_32 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_32 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_32 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_32 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 318 MRR_Detection_031: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_31 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_31 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_31 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_31 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_31 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_31 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_31 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_31 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_31 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_31 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 317 MRR_Detection_030: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_30 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_30 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_30 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_30 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_30 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_30 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_30 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_30 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_30 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_30 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 316 MRR_Detection_029: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_29 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_29 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_29 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_29 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_29 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_29 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_29 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_29 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_29 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_29 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 314 MRR_Detection_027: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_27 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_27 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_27 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_27 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_27 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_27 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_27 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_27 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_27 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_27 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 313 MRR_Detection_026: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_26 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_26 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_26 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_26 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_26 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_26 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_26 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_26 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_26 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_26 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 312 MRR_Detection_025: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_25 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_25 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_25 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_25 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_25 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_25 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_25 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_25 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_25 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_25 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 311 MRR_Detection_024: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_24 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_24 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_24 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_24 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_24 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_24 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_24 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_24 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_24 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_24 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 310 MRR_Detection_023: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_23 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_23 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_23 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_23 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_23 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_23 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_23 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_23 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_23 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_23 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+EOF
+
+build_bo "22"
+build_bo "21"
+build_bo "20"
+build_bo "19"
+build_bo "18"
+
+cat <> ${OUT_FILENAME}
+BO_ 341 MRR_Detection_054: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_54 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_54 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_54 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_54 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_54 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_54 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_54 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_54 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_54 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_54 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 340 MRR_Detection_053: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_53 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_53 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_53 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_53 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_53 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_53 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_53 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_53 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_53 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_53 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 339 MRR_Detection_052: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_52 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_52 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_52 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_52 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_52 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_52 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_52 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_52 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_52 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_52 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 338 MRR_Detection_051: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_51 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_51 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_51 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_51 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_51 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_51 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_51 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_51 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_51 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_51 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 337 MRR_Detection_050: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_50 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_50 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_50 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_50 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_50 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_50 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_50 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_50 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_50 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_50 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 336 MRR_Detection_049: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_49 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_49 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_49 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_49 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_49 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_49 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_49 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_49 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_49 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_49 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 326 MRR_Detection_039: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_39 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_39 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_39 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_39 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_39 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_39 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_39 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_39 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_39 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_39 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+BO_ 315 MRR_Detection_028: 8 MRR
+ SG_ CAN_DET_CONFID_AZIMUTH_28 : 33|2@0+ (1,0) [0|3] "" IFV_VFP
+ SG_ CAN_DET_SUPER_RES_TARGET_28 : 56|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_ND_TARGET_28 : 48|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_HOST_VEH_CLUTTER_28 : 49|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_VALID_LEVEL_28 : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_DET_AZIMUTH_28 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP
+ SG_ CAN_DET_RANGE_28 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP
+ SG_ CAN_DET_RANGE_RATE_28 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP
+ SG_ CAN_DET_AMPLITUDE_28 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP
+ SG_ CAN_SCAN_INDEX_2LSB_28 : 17|2@0+ (1,0) [0|3] "" IFV_VFP
+
+EOF
+
+build_bo "17"
+build_bo "16"
+build_bo "15"
+build_bo "14"
+build_bo "13"
+build_bo "12"
+build_bo "11"
+build_bo "10"
+build_bo "09"
+build_bo "08"
+build_bo "07"
+build_bo "06"
+build_bo "05"
+build_bo "03"
+build_bo "02"
+
+cat <> ${OUT_FILENAME}
+BO_ 256 MRR_Status_CANVersion: 8 MRR
+ SG_ CAN_USC_SECTION_COMPATIBILITY : 23|16@0+ (1,0) [0|65535] "" External_Tool
+ SG_ CAN_PCAN_MINOR_MRR : 7|8@0+ (1,0) [0|255] "" IFV_VFP
+ SG_ CAN_PCAN_MAJOR_MRR : 15|8@0+ (1,0) [0|255] "" IFV_VFP
+
+BO_ 257 MRR_Status_Radar: 8 MRR
+ SG_ CAN_INTERFERENCE_TYPE : 11|2@0+ (1,0) [0|3] "" IFV_Host
+ SG_ CAN_RECOMMEND_UNCONVERGE : 9|1@0+ (1,0) [0|1] "" IFV_Host
+ SG_ CAN_BLOCKAGE_SIDELOBE_FILTER_VAL : 15|4@0+ (1,0) [0|15] "" IFV_Host
+ SG_ CAN_RADAR_ALIGN_INCOMPLETE : 8|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_BLOCKAGE_SIDELOBE : 4|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_BLOCKAGE_MNR : 5|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_EXT_COND_NOK : 1|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_ALIGN_OUT_RANGE : 2|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_ALIGN_NOT_START : 0|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_OVERHEAT_ERROR : 3|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_RADAR_NOT_OP : 6|1@0+ (1,0) [0|1] "" IFV_VFP
+ SG_ CAN_XCVR_OPERATIONAL : 7|1@0+ (1,0) [0|1] "" IFV_VFP
+
+EOF
+
+build_bo "01"
+
+cat <> ${OUT_FILENAME}
+BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes";
+BA_DEF_ SG_ "CrossOver_LIN" ENUM "No","Yes","No","Yes";
+BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes","No","Yes","No","Yes";
+BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ SG_ "GenSigTimeoutTime_RCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_OCS" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_CCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_IPMA" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_SCCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000;
+BA_DEF_ SG_ "GenSigTimeoutTime_Generic_BCM" INT 0 100000;
+BA_DEF_ BO_ "NmMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "TpTxIndex" INT 0 255;
+BA_DEF_ BO_ "DiagState" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "TpApplType" STRING ;
+BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "Mulitplexer" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "EventRateOfChange" INT 10 10000;
+BA_DEF_ BO_ "GenMsgHandlingTypeDoc" STRING ;
+BA_DEF_ BO_ "GenMsgHandlingTypeCode" STRING ;
+BA_DEF_ BO_ "GenMsgMarked" STRING ;
+BA_DEF_ SG_ "GenSigMarked" STRING ;
+BA_DEF_ SG_ "GenSigVtIndex" STRING ;
+BA_DEF_ SG_ "GenSigVtName" STRING ;
+BA_DEF_ SG_ "GenSigVtEn" STRING ;
+BA_DEF_ SG_ "GenSigSNA" STRING ;
+BA_DEF_ SG_ "GenSigCmt" STRING ;
+BA_DEF_ BO_ "GenMsgCmt" STRING ;
+BA_DEF_ SG_ "GenSigSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType";
+BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000;
+BA_DEF_ SG_ "GenSigMissingSourceValue" INT 0 1e+09;
+BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes";
+BA_DEF_ SG_ "GenSigStartValue" INT 0 1e+09;
+BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes";
+BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BO_ "GenMsgSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType";
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000;
+BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000;
+BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100;
+BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000;
+BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes";
+BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes";
+BA_DEF_ BU_ "ILUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes";
+BA_DEF_ BU_ "PowerType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes","Switched","Latched","Sleep","vector_leerstring","vector_leerstring";
+BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000;
+BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000;
+BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ;
+BA_DEF_ BO_ "GenMsgForegroundColor" STRING ;
+BA_ "GenMsgCycleTime" BO_ 34 1000;
+BA_ "GenMsgSendType" BO_ 34 0;
+BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck";
+BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck";
+BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg";
+BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg";
+BA_ "GenSigVtEn" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure";
+BA_ "GenSigVtName" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure";
+BA_ "GenSigVtEn" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError";
+BA_ "GenSigVtName" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError";
+BA_ "GenSigVtEn" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError";
+BA_ "GenSigVtName" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError";
+BA_ "GenMsgCycleTime" BO_ 33 1000;
+BA_ "GenMsgSendType" BO_ 33 0;
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4";
+BA_ "GenSigVtEn" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault";
+BA_ "GenSigVtName" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault";
+BA_ "GenSigVtEn" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault";
+BA_ "GenSigVtName" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault";
+BA_ "GenSigVtEn" SG_ 33 HostToArmChksumFault "HostToArmChksumFault";
+BA_ "GenSigVtName" SG_ 33 HostToArmChksumFault "HostToArmChksumFault";
+BA_ "GenSigVtEn" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault";
+BA_ "GenSigVtName" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault";
+BA_ "GenSigVtEn" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange";
+BA_ "GenSigVtName" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 DSPOverrunFault "DSPOverrunFault";
+BA_ "GenSigVtName" SG_ 33 DSPOverrunFault "DSPOverrunFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5";
+BA_ "GenSigVtEn" SG_ 33 TuningSensitivityFault "TuningSensitivityFault";
+BA_ "GenSigVtName" SG_ 33 TuningSensitivityFault "TuningSensitivityFault";
+BA_ "GenSigVtEn" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault";
+BA_ "GenSigVtName" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault";
+BA_ "GenSigVtEn" SG_ 33 LocalOscPowerFault "LocalOscPowerFault";
+BA_ "GenSigVtName" SG_ 33 LocalOscPowerFault "LocalOscPowerFault";
+BA_ "GenSigVtEn" SG_ 33 TransmitterPowerFault "TransmitterPowerFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterPowerFault "TransmitterPowerFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6";
+BA_ "GenSigVtEn" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault";
+BA_ "GenSigVtName" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault";
+BA_ "GenSigVtEn" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault";
+BA_ "GenSigVtName" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault";
+BA_ "GenSigVtEn" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault";
+BA_ "GenSigVtName" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault";
+BA_ "GenSigVtEn" SG_ 33 SidelobeBlockage "SidelobeBlockage";
+BA_ "GenSigVtName" SG_ 33 SidelobeBlockage "SidelobeBlockage";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1";
+BA_ "GenSigVtEn" SG_ 33 MNRBlocked "MNRBlocked";
+BA_ "GenSigVtName" SG_ 33 MNRBlocked "MNRBlocked";
+BA_ "GenSigVtEn" SG_ 33 ECUTempHighFault "ECUTempHighFault";
+BA_ "GenSigVtName" SG_ 33 ECUTempHighFault "ECUTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault";
+BA_ "GenSigVtName" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault";
+BA_ "GenSigVtEn" SG_ 33 UnreasonableRadarData "UnreasonableRadarData";
+BA_ "GenSigVtName" SG_ 33 UnreasonableRadarData "UnreasonableRadarData";
+BA_ "GenSigVtEn" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault";
+BA_ "GenSigVtName" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault";
+BA_ "GenSigVtEn" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange";
+BA_ "GenSigVtName" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange";
+BA_ "GenSigVtName" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode";
+BA_ "GenSigVtName" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode";
+BA_ "GenSigVtEn" SG_ 33 BatteryLowFault "BatteryLowFault";
+BA_ "GenSigVtName" SG_ 33 BatteryLowFault "BatteryLowFault";
+BA_ "GenSigVtEn" SG_ 33 BatteryHighFault "BatteryHighFault";
+BA_ "GenSigVtName" SG_ 33 BatteryHighFault "BatteryHighFault";
+BA_ "GenSigVtEn" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4";
+BA_ "GenSigVtEn" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange";
+BA_ "GenSigVtName" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange";
+BA_ "GenSigVtName" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange";
+BA_ "GenSigVtEn" SG_ 33 TransmitterIDFault "TransmitterIDFault";
+BA_ "GenSigVtName" SG_ 33 TransmitterIDFault "TransmitterIDFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2";
+BA_ "GenSigVtEn" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault";
+BA_ "GenSigVtName" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault";
+BA_ "GenSigVtEn" SG_ 33 PCANBusOff "PCANBusOff";
+BA_ "GenSigVtName" SG_ 33 PCANBusOff "PCANBusOff";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6";
+BA_ "GenSigVtEn" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault";
+BA_ "GenSigVtName" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault";
+BA_ "GenSigVtEn" SG_ 33 StackOverflowFault "StackOverflowFault";
+BA_ "GenSigVtName" SG_ 33 StackOverflowFault "StackOverflowFault";
+BA_ "GenSigVtEn" SG_ 33 WatchdogFault "WatchdogFault";
+BA_ "GenSigVtName" SG_ 33 WatchdogFault "WatchdogFault";
+BA_ "GenSigVtEn" SG_ 33 PLLLockFault "PLLLockFault";
+BA_ "GenSigVtName" SG_ 33 PLLLockFault "PLLLockFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1";
+BA_ "GenSigVtEn" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault";
+BA_ "GenSigVtName" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault";
+BA_ "GenSigVtName" SG_ 33 USCValidationFault "USCValidationFault";
+BA_ "GenSigVtEn" SG_ 33 USCValidationFault "USCValidationFault";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4";
+BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3";
+BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3";
+BA_ "GenSigVtEn" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault";
+BA_ "GenSigVtName" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault";
+BA_ "GenSigVtEn" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum";
+BA_ "GenSigVtName" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum";
+BA_ "GenSigVtEn" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault";
+BA_ "GenSigVtName" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault";
+BA_ "GenMsgNrOfRepetition" BO_ 500 0;
+BA_ "GenMsgSendType" BO_ 500 1;
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte7 "MRR_xcp_daq_resp_byte7";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte6 "MRR_xcp_daq_resp_byte6";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte5 "MRR_xcp_daq_resp_byte5";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte4 "MRR_xcp_daq_resp_byte4";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte3 "MRR_xcp_daq_resp_byte3";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte2 "MRR_xcp_daq_resp_byte2";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte1 "MRR_xcp_daq_resp_byte1";
+BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte0 "MRR_xcp_daq_resp_byte0";
+BA_ "GenMsgNrOfRepetition" BO_ 499 0;
+BA_ "GenMsgSendType" BO_ 499 1;
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte7 "MRR_xcp_dto_resp_byte7";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte6 "MRR_xcp_dto_resp_byte6";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte5 "MRR_xcp_dto_resp_byte5";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte4 "MRR_xcp_dto_resp_byte4";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte3 "MRR_xcp_dto_resp_byte3";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte2 "MRR_xcp_dto_resp_byte2";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte1 "MRR_xcp_dto_resp_byte1";
+BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte0 "MRR_xcp_dto_resp_byte0";
+BA_ "GenMsgNrOfRepetition" BO_ 497 0;
+BA_ "GenMsgSendType" BO_ 497 1;
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte7 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte7 "MRR_xcp_cto_resp_byte7";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte6 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte6 "MRR_xcp_cto_resp_byte6";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte5 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte5 "MRR_xcp_cto_resp_byte5";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte4 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte4 "MRR_xcp_cto_resp_byte4";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte3 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte3 "MRR_xcp_cto_resp_byte3";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte2 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte2 "MRR_xcp_cto_resp_byte2";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte1 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte1 "MRR_xcp_cto_resp_byte1";
+BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte0 0;
+BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte0 "MRR_xcp_cto_resp_byte0";
+BA_ "GenMsgSendType" BO_ 1900 1;
+BA_ "GenMsgNrOfRepetition" BO_ 1900 0;
+BA_ "DiagResponse" BO_ 1900 1;
+BA_ "GenSigCmt" SG_ 1900 TesterPhysicalResCCM "TesterPhysicalResCCM";
+BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 0;
+BA_ "GenMsgSendType" BO_ 261 0;
+BA_ "GenMsgCycleTime" BO_ 261 1000;
+BA_ "GenMsgNrOfRepetition" BO_ 261 0;
+BA_ "GenSigCmt" SG_ 261 CAN_SEQUENCE_NUMBER "CAN_SEQUENCE_NUMBER";
+BA_ "GenSigCmt" SG_ 261 CAN_SERIAL_NUMBER "CAN_SERIAL_NUMBER";
+BA_ "GenSigSendType" SG_ 261 CAN_SERIAL_NUMBER 0;
+BA_ "GenMsgSendType" BO_ 264 1;
+BA_ "GenMsgNrOfRepetition" BO_ 264 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Field_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Promote_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Field_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Promote_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_SW_Release_Revision 0;
+BA_ "GenSigSendType" SG_ 264 CAN_PBL_Release_Revision 0;
+BA_ "GenMsgSendType" BO_ 373 1;
+BA_ "NetworkInitialization" BO_ 373 0;
+BA_ "GenMsgNrOfRepetition" BO_ 373 0;
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_POLARITY 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_POLARITY "CAN_SENSOR_POLARITY";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LAT_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LAT_OFFSET "CAN_SENSOR_LAT_OFFSET";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LONG_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LONG_OFFSET "CAN_SENSOR_LONG_OFFSET";
+BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0;
+BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_HANGLE_OFFSET "CAN_SENSOR_HANGLE_OFFSET";
+BA_ "GenSigStartValue" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0;
+BA_ "GenMsgSendType" BO_ 372 1;
+BA_ "NetworkInitialization" BO_ 372 0;
+BA_ "GenMsgNrOfRepetition" BO_ 372 0;
+BA_ "GenSigSendType" SG_ 372 CAN_SENSOR_FOV_HOR 0;
+BA_ "GenSigCmt" SG_ 372 CAN_SENSOR_FOV_HOR "CAN_SENSOR_FOV_HOR";
+BA_ "GenSigStartValue" SG_ 372 CAN_SENSOR_FOV_HOR 0;
+BA_ "GenSigSendType" SG_ 372 CAN_DOPPLER_COVERAGE 0;
+BA_ "GenSigCmt" SG_ 372 CAN_DOPPLER_COVERAGE "CAN_DOPPLER_COVERAGE";
+BA_ "GenSigStartValue" SG_ 372 CAN_DOPPLER_COVERAGE 0;
+BA_ "GenSigSendType" SG_ 372 CAN_RANGE_COVERAGE 0;
+BA_ "GenSigCmt" SG_ 372 CAN_RANGE_COVERAGE "CAN_RANGE_COVERAGE";
+BA_ "GenMsgSendType" BO_ 371 1;
+BA_ "NetworkInitialization" BO_ 371 0;
+BA_ "GenMsgNrOfRepetition" BO_ 371 0;
+BA_ "GenSigVtEn" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigVtName" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF";
+BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATUS 0;
+BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS";
+BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATE 0;
+BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE";
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0;
+BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF "CAN_AUTO_ALIGN_HANGLE_REF";
+BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0;
+BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0;
+BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE "CAN_AUTO_ALIGN_HANGLE";
+BA_ "GenMsgSendType" BO_ 369 1;
+BA_ "NetworkInitialization" BO_ 369 0;
+BA_ "GenMsgNrOfRepetition" BO_ 369 0;
+BA_ "GenSigCmt" SG_ 369 CAN_DET_TIME_SINCE_MEAS "CAN_DET_TIME_SINCE_MEAS";
+BA_ "GenSigSendType" SG_ 369 CAN_DET_TIME_SINCE_MEAS 0;
+BA_ "GenSigSendType" SG_ 369 CAN_SENSOR_TIME_STAMP 0;
+BA_ "GenSigCmt" SG_ 369 CAN_SENSOR_TIME_STAMP "CAN_SENSOR_TIME_STAMP";
+BA_ "GenMsgSendType" BO_ 368 1;
+BA_ "NetworkInitialization" BO_ 368 0;
+BA_ "GenMsgNrOfRepetition" BO_ 368 0;
+BA_ "GenSigSendType" SG_ 368 CAN_ALIGN_UPDATES_DONE 0;
+BA_ "GenSigCmt" SG_ 368 CAN_ALIGN_UPDATES_DONE "CAN_ALIGN_UPDATES_DONE";
+BA_ "GenSigSendType" SG_ 368 CAN_SCAN_INDEX 0;
+BA_ "GenSigCmt" SG_ 368 CAN_SCAN_INDEX "CAN_SCAN_INDEX";
+BA_ "GenSigSendType" SG_ 368 CAN_NUMBER_OF_DET 0;
+BA_ "GenSigCmt" SG_ 368 CAN_NUMBER_OF_DET "CAN_NUMBER_OF_DET";
+BA_ "GenSigSendType" SG_ 368 CAN_LOOK_ID 0;
+BA_ "GenSigCmt" SG_ 368 CAN_LOOK_ID "CAN_LOOK_ID";
+BA_ "GenSigSendType" SG_ 368 CAN_LOOK_INDEX 0;
+BA_ "GenSigCmt" SG_ 368 CAN_LOOK_INDEX "CAN_LOOK_INDEX";
+BA_ "GenMsgSendType" BO_ 265 1;
+BA_ "NetworkInitialization" BO_ 265 0;
+BA_ "GenMsgNrOfRepetition" BO_ 265 0;
+BA_ "GenSigCmt" SG_ 265 CAN_BATT_VOLTS "CAN_BATT_VOLTS";
+BA_ "GenSigCmt" SG_ 265 CAN_1_25_V "CAN_1_25_V";
+BA_ "GenSigCmt" SG_ 265 CAN_5_V "CAN_5_V";
+BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_RAW "CAN_3_3_V_RAW";
+BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_DAC "CAN_3_3_V_DAC";
+BA_ "GenSigSendType" SG_ 265 CAN_MMIC_Temp1 0;
+BA_ "GenSigCmt" SG_ 265 CAN_MMIC_Temp1 "CAN_MMIC_Temp1";
+BA_ "GenSigStartValue" SG_ 265 CAN_MMIC_Temp1 0;
+BA_ "GenSigSendType" SG_ 265 CAN_Processor_Thermistor 0;
+BA_ "GenSigCmt" SG_ 265 CAN_Processor_Thermistor "CAN_Processor_Thermistor";
+BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Thermistor 0;
+BA_ "GenSigSendType" SG_ 265 CAN_Processor_Temp1 0;
+BA_ "GenSigCmt" SG_ 265 CAN_Processor_Temp1 "CAN_Processor_Temp1";
+BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Temp1 0;
+EOF
+
+build_ba "04"
+
+cat <> ${OUT_FILENAME}
+BA_ "GenMsgSendType" BO_ 351 1;
+BA_ "GenMsgILSupport" BO_ 351 1;
+BA_ "GenMsgNrOfRepetition" BO_ 351 0;
+BA_ "GenMsgCycleTime" BO_ 351 0;
+BA_ "NetworkInitialization" BO_ 351 0;
+BA_ "GenMsgDelayTime" BO_ 351 0;
+BA_ "GenSigVtEn" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigVtName" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 "CAN_DET_SUPER_RES_TARGET_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_ND_TARGET_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_ND_TARGET_64 "CAN_DET_ND_TARGET_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 "CAN_DET_HOST_VEH_CLUTTER_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_VALID_LEVEL_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_VALID_LEVEL_64 "CAN_DET_VALID_LEVEL_64";
+BA_ "GenSigStartValue" SG_ 351 CAN_DET_AZIMUTH_64 0;
+BA_ "GenSigSendType" SG_ 351 CAN_DET_AZIMUTH_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_AZIMUTH_64 "CAN_DET_AZIMUTH_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_64 "CAN_DET_RANGE_64";
+BA_ "GenSigStartValue" SG_ 351 CAN_DET_RANGE_RATE_64 0;
+BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_RATE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_RATE_64 "CAN_DET_RANGE_RATE_64";
+BA_ "GenSigSendType" SG_ 351 CAN_DET_AMPLITUDE_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_DET_AMPLITUDE_64 "CAN_DET_AMPLITUDE_64";
+BA_ "GenSigSendType" SG_ 351 CAN_SCAN_INDEX_2LSB_64 0;
+BA_ "GenSigCmt" SG_ 351 CAN_SCAN_INDEX_2LSB_64 "CAN_SCAN_INDEX_2LSB_64";
+BA_ "GenMsgSendType" BO_ 350 1;
+BA_ "GenMsgILSupport" BO_ 350 1;
+BA_ "GenMsgNrOfRepetition" BO_ 350 0;
+BA_ "GenMsgCycleTime" BO_ 350 0;
+BA_ "NetworkInitialization" BO_ 350 0;
+BA_ "GenMsgDelayTime" BO_ 350 0;
+BA_ "GenSigVtEn" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigVtName" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 "CAN_DET_SUPER_RES_TARGET_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_ND_TARGET_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_ND_TARGET_63 "CAN_DET_ND_TARGET_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 "CAN_DET_HOST_VEH_CLUTTER_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_VALID_LEVEL_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_VALID_LEVEL_63 "CAN_DET_VALID_LEVEL_63";
+BA_ "GenSigStartValue" SG_ 350 CAN_DET_AZIMUTH_63 0;
+BA_ "GenSigSendType" SG_ 350 CAN_DET_AZIMUTH_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_AZIMUTH_63 "CAN_DET_AZIMUTH_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_63 "CAN_DET_RANGE_63";
+BA_ "GenSigStartValue" SG_ 350 CAN_DET_RANGE_RATE_63 0;
+BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_RATE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_RATE_63 "CAN_DET_RANGE_RATE_63";
+BA_ "GenSigSendType" SG_ 350 CAN_DET_AMPLITUDE_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_DET_AMPLITUDE_63 "CAN_DET_AMPLITUDE_63";
+BA_ "GenSigSendType" SG_ 350 CAN_SCAN_INDEX_2LSB_63 0;
+BA_ "GenSigCmt" SG_ 350 CAN_SCAN_INDEX_2LSB_63 "CAN_SCAN_INDEX_2LSB_63";
+BA_ "GenMsgSendType" BO_ 349 1;
+BA_ "GenMsgILSupport" BO_ 349 1;
+BA_ "GenMsgNrOfRepetition" BO_ 349 0;
+BA_ "GenMsgCycleTime" BO_ 349 0;
+BA_ "NetworkInitialization" BO_ 349 0;
+BA_ "GenMsgDelayTime" BO_ 349 0;
+BA_ "GenSigVtEn" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigVtName" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 "CAN_DET_SUPER_RES_TARGET_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_ND_TARGET_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_ND_TARGET_62 "CAN_DET_ND_TARGET_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 "CAN_DET_HOST_VEH_CLUTTER_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_VALID_LEVEL_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_VALID_LEVEL_62 "CAN_DET_VALID_LEVEL_62";
+BA_ "GenSigStartValue" SG_ 349 CAN_DET_AZIMUTH_62 0;
+BA_ "GenSigSendType" SG_ 349 CAN_DET_AZIMUTH_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_AZIMUTH_62 "CAN_DET_AZIMUTH_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_62 "CAN_DET_RANGE_62";
+BA_ "GenSigStartValue" SG_ 349 CAN_DET_RANGE_RATE_62 0;
+BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_RATE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_RATE_62 "CAN_DET_RANGE_RATE_62";
+BA_ "GenSigSendType" SG_ 349 CAN_DET_AMPLITUDE_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_DET_AMPLITUDE_62 "CAN_DET_AMPLITUDE_62";
+BA_ "GenSigSendType" SG_ 349 CAN_SCAN_INDEX_2LSB_62 0;
+BA_ "GenSigCmt" SG_ 349 CAN_SCAN_INDEX_2LSB_62 "CAN_SCAN_INDEX_2LSB_62";
+BA_ "GenMsgSendType" BO_ 348 1;
+BA_ "GenMsgILSupport" BO_ 348 1;
+BA_ "GenMsgNrOfRepetition" BO_ 348 0;
+BA_ "GenMsgCycleTime" BO_ 348 0;
+BA_ "NetworkInitialization" BO_ 348 0;
+BA_ "GenMsgDelayTime" BO_ 348 0;
+BA_ "GenSigVtEn" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigVtName" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 "CAN_DET_SUPER_RES_TARGET_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_ND_TARGET_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_ND_TARGET_61 "CAN_DET_ND_TARGET_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 "CAN_DET_HOST_VEH_CLUTTER_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_VALID_LEVEL_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_VALID_LEVEL_61 "CAN_DET_VALID_LEVEL_61";
+BA_ "GenSigStartValue" SG_ 348 CAN_DET_AZIMUTH_61 0;
+BA_ "GenSigSendType" SG_ 348 CAN_DET_AZIMUTH_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_AZIMUTH_61 "CAN_DET_AZIMUTH_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_61 "CAN_DET_RANGE_61";
+BA_ "GenSigStartValue" SG_ 348 CAN_DET_RANGE_RATE_61 0;
+BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_RATE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_RATE_61 "CAN_DET_RANGE_RATE_61";
+BA_ "GenSigSendType" SG_ 348 CAN_DET_AMPLITUDE_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_DET_AMPLITUDE_61 "CAN_DET_AMPLITUDE_61";
+BA_ "GenSigSendType" SG_ 348 CAN_SCAN_INDEX_2LSB_61 0;
+BA_ "GenSigCmt" SG_ 348 CAN_SCAN_INDEX_2LSB_61 "CAN_SCAN_INDEX_2LSB_61";
+BA_ "GenMsgSendType" BO_ 347 1;
+BA_ "GenMsgILSupport" BO_ 347 1;
+BA_ "GenMsgNrOfRepetition" BO_ 347 0;
+BA_ "GenMsgCycleTime" BO_ 347 0;
+BA_ "NetworkInitialization" BO_ 347 0;
+BA_ "GenMsgDelayTime" BO_ 347 0;
+BA_ "GenSigVtEn" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigVtName" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 "CAN_DET_SUPER_RES_TARGET_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_ND_TARGET_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_ND_TARGET_60 "CAN_DET_ND_TARGET_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 "CAN_DET_HOST_VEH_CLUTTER_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_VALID_LEVEL_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_VALID_LEVEL_60 "CAN_DET_VALID_LEVEL_60";
+BA_ "GenSigStartValue" SG_ 347 CAN_DET_AZIMUTH_60 0;
+BA_ "GenSigSendType" SG_ 347 CAN_DET_AZIMUTH_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_AZIMUTH_60 "CAN_DET_AZIMUTH_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_60 "CAN_DET_RANGE_60";
+BA_ "GenSigStartValue" SG_ 347 CAN_DET_RANGE_RATE_60 0;
+BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_RATE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_RATE_60 "CAN_DET_RANGE_RATE_60";
+BA_ "GenSigSendType" SG_ 347 CAN_DET_AMPLITUDE_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_DET_AMPLITUDE_60 "CAN_DET_AMPLITUDE_60";
+BA_ "GenSigSendType" SG_ 347 CAN_SCAN_INDEX_2LSB_60 0;
+BA_ "GenSigCmt" SG_ 347 CAN_SCAN_INDEX_2LSB_60 "CAN_SCAN_INDEX_2LSB_60";
+BA_ "GenMsgSendType" BO_ 346 1;
+BA_ "GenMsgILSupport" BO_ 346 1;
+BA_ "GenMsgNrOfRepetition" BO_ 346 0;
+BA_ "GenMsgCycleTime" BO_ 346 0;
+BA_ "NetworkInitialization" BO_ 346 0;
+BA_ "GenMsgDelayTime" BO_ 346 0;
+BA_ "GenSigVtEn" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigVtName" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 "CAN_DET_SUPER_RES_TARGET_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_ND_TARGET_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_ND_TARGET_59 "CAN_DET_ND_TARGET_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 "CAN_DET_HOST_VEH_CLUTTER_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_VALID_LEVEL_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_VALID_LEVEL_59 "CAN_DET_VALID_LEVEL_59";
+BA_ "GenSigStartValue" SG_ 346 CAN_DET_AZIMUTH_59 0;
+BA_ "GenSigSendType" SG_ 346 CAN_DET_AZIMUTH_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_AZIMUTH_59 "CAN_DET_AZIMUTH_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_59 "CAN_DET_RANGE_59";
+BA_ "GenSigStartValue" SG_ 346 CAN_DET_RANGE_RATE_59 0;
+BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_RATE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_RATE_59 "CAN_DET_RANGE_RATE_59";
+BA_ "GenSigSendType" SG_ 346 CAN_DET_AMPLITUDE_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_DET_AMPLITUDE_59 "CAN_DET_AMPLITUDE_59";
+BA_ "GenSigSendType" SG_ 346 CAN_SCAN_INDEX_2LSB_59 0;
+BA_ "GenSigCmt" SG_ 346 CAN_SCAN_INDEX_2LSB_59 "CAN_SCAN_INDEX_2LSB_59";
+BA_ "GenMsgSendType" BO_ 345 1;
+BA_ "GenMsgILSupport" BO_ 345 1;
+BA_ "GenMsgNrOfRepetition" BO_ 345 0;
+BA_ "GenMsgCycleTime" BO_ 345 0;
+BA_ "NetworkInitialization" BO_ 345 0;
+BA_ "GenMsgDelayTime" BO_ 345 0;
+BA_ "GenSigVtEn" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigVtName" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 "CAN_DET_SUPER_RES_TARGET_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_ND_TARGET_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_ND_TARGET_58 "CAN_DET_ND_TARGET_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 "CAN_DET_HOST_VEH_CLUTTER_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_VALID_LEVEL_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_VALID_LEVEL_58 "CAN_DET_VALID_LEVEL_58";
+BA_ "GenSigStartValue" SG_ 345 CAN_DET_AZIMUTH_58 0;
+BA_ "GenSigSendType" SG_ 345 CAN_DET_AZIMUTH_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_AZIMUTH_58 "CAN_DET_AZIMUTH_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_58 "CAN_DET_RANGE_58";
+BA_ "GenSigStartValue" SG_ 345 CAN_DET_RANGE_RATE_58 0;
+BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_RATE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_RATE_58 "CAN_DET_RANGE_RATE_58";
+BA_ "GenSigSendType" SG_ 345 CAN_DET_AMPLITUDE_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_DET_AMPLITUDE_58 "CAN_DET_AMPLITUDE_58";
+BA_ "GenSigSendType" SG_ 345 CAN_SCAN_INDEX_2LSB_58 0;
+BA_ "GenSigCmt" SG_ 345 CAN_SCAN_INDEX_2LSB_58 "CAN_SCAN_INDEX_2LSB_58";
+BA_ "GenMsgSendType" BO_ 344 1;
+BA_ "GenMsgILSupport" BO_ 344 1;
+BA_ "GenMsgNrOfRepetition" BO_ 344 0;
+BA_ "GenMsgCycleTime" BO_ 344 0;
+BA_ "NetworkInitialization" BO_ 344 0;
+BA_ "GenMsgDelayTime" BO_ 344 0;
+BA_ "GenSigVtEn" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigVtName" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 "CAN_DET_SUPER_RES_TARGET_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_ND_TARGET_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_ND_TARGET_57 "CAN_DET_ND_TARGET_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 "CAN_DET_HOST_VEH_CLUTTER_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_VALID_LEVEL_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_VALID_LEVEL_57 "CAN_DET_VALID_LEVEL_57";
+BA_ "GenSigStartValue" SG_ 344 CAN_DET_AZIMUTH_57 0;
+BA_ "GenSigSendType" SG_ 344 CAN_DET_AZIMUTH_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_AZIMUTH_57 "CAN_DET_AZIMUTH_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_57 "CAN_DET_RANGE_57";
+BA_ "GenSigStartValue" SG_ 344 CAN_DET_RANGE_RATE_57 0;
+BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_RATE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_RATE_57 "CAN_DET_RANGE_RATE_57";
+BA_ "GenSigSendType" SG_ 344 CAN_DET_AMPLITUDE_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_DET_AMPLITUDE_57 "CAN_DET_AMPLITUDE_57";
+BA_ "GenSigSendType" SG_ 344 CAN_SCAN_INDEX_2LSB_57 0;
+BA_ "GenSigCmt" SG_ 344 CAN_SCAN_INDEX_2LSB_57 "CAN_SCAN_INDEX_2LSB_57";
+BA_ "GenMsgSendType" BO_ 343 1;
+BA_ "GenMsgILSupport" BO_ 343 1;
+BA_ "GenMsgNrOfRepetition" BO_ 343 0;
+BA_ "GenMsgCycleTime" BO_ 343 0;
+BA_ "NetworkInitialization" BO_ 343 0;
+BA_ "GenMsgDelayTime" BO_ 343 0;
+BA_ "GenSigVtEn" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigVtName" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 "CAN_DET_SUPER_RES_TARGET_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_ND_TARGET_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_ND_TARGET_56 "CAN_DET_ND_TARGET_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 "CAN_DET_HOST_VEH_CLUTTER_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_VALID_LEVEL_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_VALID_LEVEL_56 "CAN_DET_VALID_LEVEL_56";
+BA_ "GenSigStartValue" SG_ 343 CAN_DET_AZIMUTH_56 0;
+BA_ "GenSigSendType" SG_ 343 CAN_DET_AZIMUTH_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_AZIMUTH_56 "CAN_DET_AZIMUTH_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_56 "CAN_DET_RANGE_56";
+BA_ "GenSigStartValue" SG_ 343 CAN_DET_RANGE_RATE_56 0;
+BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_RATE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_RATE_56 "CAN_DET_RANGE_RATE_56";
+BA_ "GenSigSendType" SG_ 343 CAN_DET_AMPLITUDE_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_DET_AMPLITUDE_56 "CAN_DET_AMPLITUDE_56";
+BA_ "GenSigSendType" SG_ 343 CAN_SCAN_INDEX_2LSB_56 0;
+BA_ "GenSigCmt" SG_ 343 CAN_SCAN_INDEX_2LSB_56 "CAN_SCAN_INDEX_2LSB_56";
+BA_ "GenMsgSendType" BO_ 342 1;
+BA_ "GenMsgILSupport" BO_ 342 1;
+BA_ "GenMsgNrOfRepetition" BO_ 342 0;
+BA_ "GenMsgCycleTime" BO_ 342 0;
+BA_ "NetworkInitialization" BO_ 342 0;
+BA_ "GenMsgDelayTime" BO_ 342 0;
+BA_ "GenSigVtEn" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigVtName" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 "CAN_DET_SUPER_RES_TARGET_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_ND_TARGET_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_ND_TARGET_55 "CAN_DET_ND_TARGET_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 "CAN_DET_HOST_VEH_CLUTTER_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_VALID_LEVEL_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_VALID_LEVEL_55 "CAN_DET_VALID_LEVEL_55";
+BA_ "GenSigStartValue" SG_ 342 CAN_DET_AZIMUTH_55 0;
+BA_ "GenSigSendType" SG_ 342 CAN_DET_AZIMUTH_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_AZIMUTH_55 "CAN_DET_AZIMUTH_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_55 "CAN_DET_RANGE_55";
+BA_ "GenSigStartValue" SG_ 342 CAN_DET_RANGE_RATE_55 0;
+BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_RATE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_RATE_55 "CAN_DET_RANGE_RATE_55";
+BA_ "GenSigSendType" SG_ 342 CAN_DET_AMPLITUDE_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_DET_AMPLITUDE_55 "CAN_DET_AMPLITUDE_55";
+BA_ "GenSigSendType" SG_ 342 CAN_SCAN_INDEX_2LSB_55 0;
+BA_ "GenSigCmt" SG_ 342 CAN_SCAN_INDEX_2LSB_55 "CAN_SCAN_INDEX_2LSB_55";
+BA_ "GenMsgSendType" BO_ 335 1;
+BA_ "GenMsgILSupport" BO_ 335 1;
+BA_ "GenMsgNrOfRepetition" BO_ 335 0;
+BA_ "GenMsgCycleTime" BO_ 335 0;
+BA_ "NetworkInitialization" BO_ 335 0;
+BA_ "GenMsgDelayTime" BO_ 335 0;
+BA_ "GenSigVtEn" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigVtName" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 "CAN_DET_SUPER_RES_TARGET_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_ND_TARGET_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_ND_TARGET_48 "CAN_DET_ND_TARGET_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 "CAN_DET_HOST_VEH_CLUTTER_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_VALID_LEVEL_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_VALID_LEVEL_48 "CAN_DET_VALID_LEVEL_48";
+BA_ "GenSigStartValue" SG_ 335 CAN_DET_AZIMUTH_48 0;
+BA_ "GenSigSendType" SG_ 335 CAN_DET_AZIMUTH_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_AZIMUTH_48 "CAN_DET_AZIMUTH_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_48 "CAN_DET_RANGE_48";
+BA_ "GenSigStartValue" SG_ 335 CAN_DET_RANGE_RATE_48 0;
+BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_RATE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_RATE_48 "CAN_DET_RANGE_RATE_48";
+BA_ "GenSigSendType" SG_ 335 CAN_DET_AMPLITUDE_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_DET_AMPLITUDE_48 "CAN_DET_AMPLITUDE_48";
+BA_ "GenSigSendType" SG_ 335 CAN_SCAN_INDEX_2LSB_48 0;
+BA_ "GenSigCmt" SG_ 335 CAN_SCAN_INDEX_2LSB_48 "CAN_SCAN_INDEX_2LSB_48";
+BA_ "GenMsgSendType" BO_ 334 1;
+BA_ "GenMsgILSupport" BO_ 334 1;
+BA_ "GenMsgNrOfRepetition" BO_ 334 0;
+BA_ "GenMsgCycleTime" BO_ 334 0;
+BA_ "NetworkInitialization" BO_ 334 0;
+BA_ "GenMsgDelayTime" BO_ 334 0;
+BA_ "GenSigVtEn" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigVtName" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 "CAN_DET_SUPER_RES_TARGET_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_ND_TARGET_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_ND_TARGET_47 "CAN_DET_ND_TARGET_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 "CAN_DET_HOST_VEH_CLUTTER_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_VALID_LEVEL_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_VALID_LEVEL_47 "CAN_DET_VALID_LEVEL_47";
+BA_ "GenSigStartValue" SG_ 334 CAN_DET_AZIMUTH_47 0;
+BA_ "GenSigSendType" SG_ 334 CAN_DET_AZIMUTH_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_AZIMUTH_47 "CAN_DET_AZIMUTH_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_47 "CAN_DET_RANGE_47";
+BA_ "GenSigStartValue" SG_ 334 CAN_DET_RANGE_RATE_47 0;
+BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_RATE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_RATE_47 "CAN_DET_RANGE_RATE_47";
+BA_ "GenSigSendType" SG_ 334 CAN_DET_AMPLITUDE_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_DET_AMPLITUDE_47 "CAN_DET_AMPLITUDE_47";
+BA_ "GenSigSendType" SG_ 334 CAN_SCAN_INDEX_2LSB_47 0;
+BA_ "GenSigCmt" SG_ 334 CAN_SCAN_INDEX_2LSB_47 "CAN_SCAN_INDEX_2LSB_47";
+BA_ "GenMsgSendType" BO_ 333 1;
+BA_ "GenMsgILSupport" BO_ 333 1;
+BA_ "GenMsgNrOfRepetition" BO_ 333 0;
+BA_ "GenMsgCycleTime" BO_ 333 0;
+BA_ "NetworkInitialization" BO_ 333 0;
+BA_ "GenMsgDelayTime" BO_ 333 0;
+BA_ "GenSigVtEn" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigVtName" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 "CAN_DET_SUPER_RES_TARGET_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_ND_TARGET_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_ND_TARGET_46 "CAN_DET_ND_TARGET_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 "CAN_DET_HOST_VEH_CLUTTER_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_VALID_LEVEL_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_VALID_LEVEL_46 "CAN_DET_VALID_LEVEL_46";
+BA_ "GenSigStartValue" SG_ 333 CAN_DET_AZIMUTH_46 0;
+BA_ "GenSigSendType" SG_ 333 CAN_DET_AZIMUTH_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_AZIMUTH_46 "CAN_DET_AZIMUTH_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_46 "CAN_DET_RANGE_46";
+BA_ "GenSigStartValue" SG_ 333 CAN_DET_RANGE_RATE_46 0;
+BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_RATE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_RATE_46 "CAN_DET_RANGE_RATE_46";
+BA_ "GenSigSendType" SG_ 333 CAN_DET_AMPLITUDE_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_DET_AMPLITUDE_46 "CAN_DET_AMPLITUDE_46";
+BA_ "GenSigSendType" SG_ 333 CAN_SCAN_INDEX_2LSB_46 0;
+BA_ "GenSigCmt" SG_ 333 CAN_SCAN_INDEX_2LSB_46 "CAN_SCAN_INDEX_2LSB_46";
+BA_ "GenMsgSendType" BO_ 332 1;
+BA_ "GenMsgILSupport" BO_ 332 1;
+BA_ "GenMsgNrOfRepetition" BO_ 332 0;
+BA_ "GenMsgCycleTime" BO_ 332 0;
+BA_ "NetworkInitialization" BO_ 332 0;
+BA_ "GenMsgDelayTime" BO_ 332 0;
+BA_ "GenSigVtEn" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigVtName" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 "CAN_DET_SUPER_RES_TARGET_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_ND_TARGET_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_ND_TARGET_45 "CAN_DET_ND_TARGET_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 "CAN_DET_HOST_VEH_CLUTTER_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_VALID_LEVEL_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_VALID_LEVEL_45 "CAN_DET_VALID_LEVEL_45";
+BA_ "GenSigStartValue" SG_ 332 CAN_DET_AZIMUTH_45 0;
+BA_ "GenSigSendType" SG_ 332 CAN_DET_AZIMUTH_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_AZIMUTH_45 "CAN_DET_AZIMUTH_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_45 "CAN_DET_RANGE_45";
+BA_ "GenSigStartValue" SG_ 332 CAN_DET_RANGE_RATE_45 0;
+BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_RATE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_RATE_45 "CAN_DET_RANGE_RATE_45";
+BA_ "GenSigSendType" SG_ 332 CAN_DET_AMPLITUDE_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_DET_AMPLITUDE_45 "CAN_DET_AMPLITUDE_45";
+BA_ "GenSigSendType" SG_ 332 CAN_SCAN_INDEX_2LSB_45 0;
+BA_ "GenSigCmt" SG_ 332 CAN_SCAN_INDEX_2LSB_45 "CAN_SCAN_INDEX_2LSB_45";
+BA_ "GenMsgSendType" BO_ 331 1;
+BA_ "GenMsgILSupport" BO_ 331 1;
+BA_ "GenMsgNrOfRepetition" BO_ 331 0;
+BA_ "GenMsgCycleTime" BO_ 331 0;
+BA_ "NetworkInitialization" BO_ 331 0;
+BA_ "GenMsgDelayTime" BO_ 331 0;
+BA_ "GenSigVtEn" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigVtName" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 "CAN_DET_SUPER_RES_TARGET_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_ND_TARGET_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_ND_TARGET_44 "CAN_DET_ND_TARGET_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 "CAN_DET_HOST_VEH_CLUTTER_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_VALID_LEVEL_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_VALID_LEVEL_44 "CAN_DET_VALID_LEVEL_44";
+BA_ "GenSigStartValue" SG_ 331 CAN_DET_AZIMUTH_44 0;
+BA_ "GenSigSendType" SG_ 331 CAN_DET_AZIMUTH_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_AZIMUTH_44 "CAN_DET_AZIMUTH_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_44 "CAN_DET_RANGE_44";
+BA_ "GenSigStartValue" SG_ 331 CAN_DET_RANGE_RATE_44 0;
+BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_RATE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_RATE_44 "CAN_DET_RANGE_RATE_44";
+BA_ "GenSigSendType" SG_ 331 CAN_DET_AMPLITUDE_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_DET_AMPLITUDE_44 "CAN_DET_AMPLITUDE_44";
+BA_ "GenSigSendType" SG_ 331 CAN_SCAN_INDEX_2LSB_44 0;
+BA_ "GenSigCmt" SG_ 331 CAN_SCAN_INDEX_2LSB_44 "CAN_SCAN_INDEX_2LSB_44";
+BA_ "GenMsgSendType" BO_ 330 1;
+BA_ "GenMsgILSupport" BO_ 330 1;
+BA_ "GenMsgNrOfRepetition" BO_ 330 0;
+BA_ "GenMsgCycleTime" BO_ 330 0;
+BA_ "NetworkInitialization" BO_ 330 0;
+BA_ "GenMsgDelayTime" BO_ 330 0;
+BA_ "GenSigVtEn" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigVtName" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 "CAN_DET_SUPER_RES_TARGET_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_ND_TARGET_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_ND_TARGET_43 "CAN_DET_ND_TARGET_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 "CAN_DET_HOST_VEH_CLUTTER_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_VALID_LEVEL_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_VALID_LEVEL_43 "CAN_DET_VALID_LEVEL_43";
+BA_ "GenSigStartValue" SG_ 330 CAN_DET_AZIMUTH_43 0;
+BA_ "GenSigSendType" SG_ 330 CAN_DET_AZIMUTH_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_AZIMUTH_43 "CAN_DET_AZIMUTH_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_43 "CAN_DET_RANGE_43";
+BA_ "GenSigStartValue" SG_ 330 CAN_DET_RANGE_RATE_43 0;
+BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_RATE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_RATE_43 "CAN_DET_RANGE_RATE_43";
+BA_ "GenSigSendType" SG_ 330 CAN_DET_AMPLITUDE_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_DET_AMPLITUDE_43 "CAN_DET_AMPLITUDE_43";
+BA_ "GenSigSendType" SG_ 330 CAN_SCAN_INDEX_2LSB_43 0;
+BA_ "GenSigCmt" SG_ 330 CAN_SCAN_INDEX_2LSB_43 "CAN_SCAN_INDEX_2LSB_43";
+BA_ "GenMsgSendType" BO_ 329 1;
+BA_ "GenMsgILSupport" BO_ 329 1;
+BA_ "GenMsgNrOfRepetition" BO_ 329 0;
+BA_ "GenMsgCycleTime" BO_ 329 0;
+BA_ "NetworkInitialization" BO_ 329 0;
+BA_ "GenMsgDelayTime" BO_ 329 0;
+BA_ "GenSigVtEn" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigVtName" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 "CAN_DET_SUPER_RES_TARGET_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_ND_TARGET_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_ND_TARGET_42 "CAN_DET_ND_TARGET_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 "CAN_DET_HOST_VEH_CLUTTER_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_VALID_LEVEL_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_VALID_LEVEL_42 "CAN_DET_VALID_LEVEL_42";
+BA_ "GenSigStartValue" SG_ 329 CAN_DET_AZIMUTH_42 0;
+BA_ "GenSigSendType" SG_ 329 CAN_DET_AZIMUTH_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_AZIMUTH_42 "CAN_DET_AZIMUTH_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_42 "CAN_DET_RANGE_42";
+BA_ "GenSigStartValue" SG_ 329 CAN_DET_RANGE_RATE_42 0;
+BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_RATE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_RATE_42 "CAN_DET_RANGE_RATE_42";
+BA_ "GenSigSendType" SG_ 329 CAN_DET_AMPLITUDE_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_DET_AMPLITUDE_42 "CAN_DET_AMPLITUDE_42";
+BA_ "GenSigSendType" SG_ 329 CAN_SCAN_INDEX_2LSB_42 0;
+BA_ "GenSigCmt" SG_ 329 CAN_SCAN_INDEX_2LSB_42 "CAN_SCAN_INDEX_2LSB_42";
+BA_ "GenMsgSendType" BO_ 328 1;
+BA_ "GenMsgILSupport" BO_ 328 1;
+BA_ "GenMsgNrOfRepetition" BO_ 328 0;
+BA_ "GenMsgCycleTime" BO_ 328 0;
+BA_ "NetworkInitialization" BO_ 328 0;
+BA_ "GenMsgDelayTime" BO_ 328 0;
+BA_ "GenSigVtEn" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigVtName" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 "CAN_DET_SUPER_RES_TARGET_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_ND_TARGET_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_ND_TARGET_41 "CAN_DET_ND_TARGET_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 "CAN_DET_HOST_VEH_CLUTTER_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_VALID_LEVEL_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_VALID_LEVEL_41 "CAN_DET_VALID_LEVEL_41";
+BA_ "GenSigStartValue" SG_ 328 CAN_DET_AZIMUTH_41 0;
+BA_ "GenSigSendType" SG_ 328 CAN_DET_AZIMUTH_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_AZIMUTH_41 "CAN_DET_AZIMUTH_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_41 "CAN_DET_RANGE_41";
+BA_ "GenSigStartValue" SG_ 328 CAN_DET_RANGE_RATE_41 0;
+BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_RATE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_RATE_41 "CAN_DET_RANGE_RATE_41";
+BA_ "GenSigSendType" SG_ 328 CAN_DET_AMPLITUDE_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_DET_AMPLITUDE_41 "CAN_DET_AMPLITUDE_41";
+BA_ "GenSigSendType" SG_ 328 CAN_SCAN_INDEX_2LSB_41 0;
+BA_ "GenSigCmt" SG_ 328 CAN_SCAN_INDEX_2LSB_41 "CAN_SCAN_INDEX_2LSB_41";
+BA_ "GenMsgSendType" BO_ 327 1;
+BA_ "GenMsgILSupport" BO_ 327 1;
+BA_ "GenMsgNrOfRepetition" BO_ 327 0;
+BA_ "GenMsgCycleTime" BO_ 327 0;
+BA_ "NetworkInitialization" BO_ 327 0;
+BA_ "GenMsgDelayTime" BO_ 327 0;
+BA_ "GenSigVtEn" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigVtName" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 "CAN_DET_SUPER_RES_TARGET_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_ND_TARGET_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_ND_TARGET_40 "CAN_DET_ND_TARGET_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 "CAN_DET_HOST_VEH_CLUTTER_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_VALID_LEVEL_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_VALID_LEVEL_40 "CAN_DET_VALID_LEVEL_40";
+BA_ "GenSigStartValue" SG_ 327 CAN_DET_AZIMUTH_40 0;
+BA_ "GenSigSendType" SG_ 327 CAN_DET_AZIMUTH_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_AZIMUTH_40 "CAN_DET_AZIMUTH_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_40 "CAN_DET_RANGE_40";
+BA_ "GenSigStartValue" SG_ 327 CAN_DET_RANGE_RATE_40 0;
+BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_RATE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_RATE_40 "CAN_DET_RANGE_RATE_40";
+BA_ "GenSigSendType" SG_ 327 CAN_DET_AMPLITUDE_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_DET_AMPLITUDE_40 "CAN_DET_AMPLITUDE_40";
+BA_ "GenSigSendType" SG_ 327 CAN_SCAN_INDEX_2LSB_40 0;
+BA_ "GenSigCmt" SG_ 327 CAN_SCAN_INDEX_2LSB_40 "CAN_SCAN_INDEX_2LSB_40";
+BA_ "GenMsgSendType" BO_ 325 1;
+BA_ "GenMsgILSupport" BO_ 325 1;
+BA_ "GenMsgNrOfRepetition" BO_ 325 0;
+BA_ "GenMsgCycleTime" BO_ 325 0;
+BA_ "NetworkInitialization" BO_ 325 0;
+BA_ "GenMsgDelayTime" BO_ 325 0;
+BA_ "GenSigVtEn" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigVtName" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 "CAN_DET_SUPER_RES_TARGET_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_ND_TARGET_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_ND_TARGET_38 "CAN_DET_ND_TARGET_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 "CAN_DET_HOST_VEH_CLUTTER_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_VALID_LEVEL_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_VALID_LEVEL_38 "CAN_DET_VALID_LEVEL_38";
+BA_ "GenSigStartValue" SG_ 325 CAN_DET_AZIMUTH_38 0;
+BA_ "GenSigSendType" SG_ 325 CAN_DET_AZIMUTH_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_AZIMUTH_38 "CAN_DET_AZIMUTH_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_38 "CAN_DET_RANGE_38";
+BA_ "GenSigStartValue" SG_ 325 CAN_DET_RANGE_RATE_38 0;
+BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_RATE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_RATE_38 "CAN_DET_RANGE_RATE_38";
+BA_ "GenSigSendType" SG_ 325 CAN_DET_AMPLITUDE_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_DET_AMPLITUDE_38 "CAN_DET_AMPLITUDE_38";
+BA_ "GenSigSendType" SG_ 325 CAN_SCAN_INDEX_2LSB_38 0;
+BA_ "GenSigCmt" SG_ 325 CAN_SCAN_INDEX_2LSB_38 "CAN_SCAN_INDEX_2LSB_38";
+BA_ "GenMsgSendType" BO_ 324 1;
+BA_ "GenMsgILSupport" BO_ 324 1;
+BA_ "GenMsgNrOfRepetition" BO_ 324 0;
+BA_ "GenMsgCycleTime" BO_ 324 0;
+BA_ "NetworkInitialization" BO_ 324 0;
+BA_ "GenMsgDelayTime" BO_ 324 0;
+BA_ "GenSigVtEn" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigVtName" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 "CAN_DET_SUPER_RES_TARGET_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_ND_TARGET_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_ND_TARGET_37 "CAN_DET_ND_TARGET_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 "CAN_DET_HOST_VEH_CLUTTER_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_VALID_LEVEL_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_VALID_LEVEL_37 "CAN_DET_VALID_LEVEL_37";
+BA_ "GenSigStartValue" SG_ 324 CAN_DET_AZIMUTH_37 0;
+BA_ "GenSigSendType" SG_ 324 CAN_DET_AZIMUTH_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_AZIMUTH_37 "CAN_DET_AZIMUTH_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_37 "CAN_DET_RANGE_37";
+BA_ "GenSigStartValue" SG_ 324 CAN_DET_RANGE_RATE_37 0;
+BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_RATE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_RATE_37 "CAN_DET_RANGE_RATE_37";
+BA_ "GenSigSendType" SG_ 324 CAN_DET_AMPLITUDE_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_DET_AMPLITUDE_37 "CAN_DET_AMPLITUDE_37";
+BA_ "GenSigSendType" SG_ 324 CAN_SCAN_INDEX_2LSB_37 0;
+BA_ "GenSigCmt" SG_ 324 CAN_SCAN_INDEX_2LSB_37 "CAN_SCAN_INDEX_2LSB_37";
+BA_ "GenMsgSendType" BO_ 323 1;
+BA_ "GenMsgILSupport" BO_ 323 1;
+BA_ "GenMsgNrOfRepetition" BO_ 323 0;
+BA_ "GenMsgCycleTime" BO_ 323 0;
+BA_ "NetworkInitialization" BO_ 323 0;
+BA_ "GenMsgDelayTime" BO_ 323 0;
+BA_ "GenSigVtEn" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigVtName" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 "CAN_DET_SUPER_RES_TARGET_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_ND_TARGET_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_ND_TARGET_36 "CAN_DET_ND_TARGET_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 "CAN_DET_HOST_VEH_CLUTTER_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_VALID_LEVEL_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_VALID_LEVEL_36 "CAN_DET_VALID_LEVEL_36";
+BA_ "GenSigStartValue" SG_ 323 CAN_DET_AZIMUTH_36 0;
+BA_ "GenSigSendType" SG_ 323 CAN_DET_AZIMUTH_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_AZIMUTH_36 "CAN_DET_AZIMUTH_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_36 "CAN_DET_RANGE_36";
+BA_ "GenSigStartValue" SG_ 323 CAN_DET_RANGE_RATE_36 0;
+BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_RATE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_RATE_36 "CAN_DET_RANGE_RATE_36";
+BA_ "GenSigSendType" SG_ 323 CAN_DET_AMPLITUDE_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_DET_AMPLITUDE_36 "CAN_DET_AMPLITUDE_36";
+BA_ "GenSigSendType" SG_ 323 CAN_SCAN_INDEX_2LSB_36 0;
+BA_ "GenSigCmt" SG_ 323 CAN_SCAN_INDEX_2LSB_36 "CAN_SCAN_INDEX_2LSB_36";
+BA_ "GenMsgSendType" BO_ 322 1;
+BA_ "GenMsgILSupport" BO_ 322 1;
+BA_ "GenMsgNrOfRepetition" BO_ 322 0;
+BA_ "GenMsgCycleTime" BO_ 322 0;
+BA_ "NetworkInitialization" BO_ 322 0;
+BA_ "GenMsgDelayTime" BO_ 322 0;
+BA_ "GenSigVtEn" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigVtName" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 "CAN_DET_SUPER_RES_TARGET_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_ND_TARGET_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_ND_TARGET_35 "CAN_DET_ND_TARGET_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 "CAN_DET_HOST_VEH_CLUTTER_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_VALID_LEVEL_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_VALID_LEVEL_35 "CAN_DET_VALID_LEVEL_35";
+BA_ "GenSigStartValue" SG_ 322 CAN_DET_AZIMUTH_35 0;
+BA_ "GenSigSendType" SG_ 322 CAN_DET_AZIMUTH_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_AZIMUTH_35 "CAN_DET_AZIMUTH_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_35 "CAN_DET_RANGE_35";
+BA_ "GenSigStartValue" SG_ 322 CAN_DET_RANGE_RATE_35 0;
+BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_RATE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_RATE_35 "CAN_DET_RANGE_RATE_35";
+BA_ "GenSigSendType" SG_ 322 CAN_DET_AMPLITUDE_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_DET_AMPLITUDE_35 "CAN_DET_AMPLITUDE_35";
+BA_ "GenSigSendType" SG_ 322 CAN_SCAN_INDEX_2LSB_35 0;
+BA_ "GenSigCmt" SG_ 322 CAN_SCAN_INDEX_2LSB_35 "CAN_SCAN_INDEX_2LSB_35";
+BA_ "GenMsgSendType" BO_ 321 1;
+BA_ "GenMsgILSupport" BO_ 321 1;
+BA_ "GenMsgNrOfRepetition" BO_ 321 0;
+BA_ "GenMsgCycleTime" BO_ 321 0;
+BA_ "NetworkInitialization" BO_ 321 0;
+BA_ "GenMsgDelayTime" BO_ 321 0;
+BA_ "GenSigVtEn" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigVtName" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 "CAN_DET_SUPER_RES_TARGET_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_ND_TARGET_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_ND_TARGET_34 "CAN_DET_ND_TARGET_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 "CAN_DET_HOST_VEH_CLUTTER_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_VALID_LEVEL_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_VALID_LEVEL_34 "CAN_DET_VALID_LEVEL_34";
+BA_ "GenSigStartValue" SG_ 321 CAN_DET_AZIMUTH_34 0;
+BA_ "GenSigSendType" SG_ 321 CAN_DET_AZIMUTH_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_AZIMUTH_34 "CAN_DET_AZIMUTH_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_34 "CAN_DET_RANGE_34";
+BA_ "GenSigStartValue" SG_ 321 CAN_DET_RANGE_RATE_34 0;
+BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_RATE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_RATE_34 "CAN_DET_RANGE_RATE_34";
+BA_ "GenSigSendType" SG_ 321 CAN_DET_AMPLITUDE_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_DET_AMPLITUDE_34 "CAN_DET_AMPLITUDE_34";
+BA_ "GenSigSendType" SG_ 321 CAN_SCAN_INDEX_2LSB_34 0;
+BA_ "GenSigCmt" SG_ 321 CAN_SCAN_INDEX_2LSB_34 "CAN_SCAN_INDEX_2LSB_34";
+BA_ "GenMsgSendType" BO_ 320 1;
+BA_ "GenMsgILSupport" BO_ 320 1;
+BA_ "GenMsgNrOfRepetition" BO_ 320 0;
+BA_ "GenMsgCycleTime" BO_ 320 0;
+BA_ "NetworkInitialization" BO_ 320 0;
+BA_ "GenMsgDelayTime" BO_ 320 0;
+BA_ "GenSigVtEn" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigVtName" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 "CAN_DET_SUPER_RES_TARGET_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_ND_TARGET_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_ND_TARGET_33 "CAN_DET_ND_TARGET_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 "CAN_DET_HOST_VEH_CLUTTER_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_VALID_LEVEL_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_VALID_LEVEL_33 "CAN_DET_VALID_LEVEL_33";
+BA_ "GenSigStartValue" SG_ 320 CAN_DET_AZIMUTH_33 0;
+BA_ "GenSigSendType" SG_ 320 CAN_DET_AZIMUTH_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_AZIMUTH_33 "CAN_DET_AZIMUTH_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_33 "CAN_DET_RANGE_33";
+BA_ "GenSigStartValue" SG_ 320 CAN_DET_RANGE_RATE_33 0;
+BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_RATE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_RATE_33 "CAN_DET_RANGE_RATE_33";
+BA_ "GenSigSendType" SG_ 320 CAN_DET_AMPLITUDE_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_DET_AMPLITUDE_33 "CAN_DET_AMPLITUDE_33";
+BA_ "GenSigSendType" SG_ 320 CAN_SCAN_INDEX_2LSB_33 0;
+BA_ "GenSigCmt" SG_ 320 CAN_SCAN_INDEX_2LSB_33 "CAN_SCAN_INDEX_2LSB_33";
+BA_ "GenMsgSendType" BO_ 319 1;
+BA_ "GenMsgILSupport" BO_ 319 1;
+BA_ "GenMsgNrOfRepetition" BO_ 319 0;
+BA_ "GenMsgCycleTime" BO_ 319 0;
+BA_ "NetworkInitialization" BO_ 319 0;
+BA_ "GenMsgDelayTime" BO_ 319 0;
+BA_ "GenSigVtEn" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigVtName" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 "CAN_DET_SUPER_RES_TARGET_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_ND_TARGET_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_ND_TARGET_32 "CAN_DET_ND_TARGET_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 "CAN_DET_HOST_VEH_CLUTTER_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_VALID_LEVEL_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_VALID_LEVEL_32 "CAN_DET_VALID_LEVEL_32";
+BA_ "GenSigStartValue" SG_ 319 CAN_DET_AZIMUTH_32 0;
+BA_ "GenSigSendType" SG_ 319 CAN_DET_AZIMUTH_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_AZIMUTH_32 "CAN_DET_AZIMUTH_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_32 "CAN_DET_RANGE_32";
+BA_ "GenSigStartValue" SG_ 319 CAN_DET_RANGE_RATE_32 0;
+BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_RATE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_RATE_32 "CAN_DET_RANGE_RATE_32";
+BA_ "GenSigSendType" SG_ 319 CAN_DET_AMPLITUDE_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_DET_AMPLITUDE_32 "CAN_DET_AMPLITUDE_32";
+BA_ "GenSigSendType" SG_ 319 CAN_SCAN_INDEX_2LSB_32 0;
+BA_ "GenSigCmt" SG_ 319 CAN_SCAN_INDEX_2LSB_32 "CAN_SCAN_INDEX_2LSB_32";
+BA_ "GenMsgSendType" BO_ 318 1;
+BA_ "GenMsgILSupport" BO_ 318 1;
+BA_ "GenMsgNrOfRepetition" BO_ 318 0;
+BA_ "GenMsgCycleTime" BO_ 318 0;
+BA_ "NetworkInitialization" BO_ 318 0;
+BA_ "GenMsgDelayTime" BO_ 318 0;
+BA_ "GenSigVtEn" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigVtName" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 "CAN_DET_SUPER_RES_TARGET_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_ND_TARGET_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_ND_TARGET_31 "CAN_DET_ND_TARGET_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 "CAN_DET_HOST_VEH_CLUTTER_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_VALID_LEVEL_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_VALID_LEVEL_31 "CAN_DET_VALID_LEVEL_31";
+BA_ "GenSigStartValue" SG_ 318 CAN_DET_AZIMUTH_31 0;
+BA_ "GenSigSendType" SG_ 318 CAN_DET_AZIMUTH_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_AZIMUTH_31 "CAN_DET_AZIMUTH_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_31 "CAN_DET_RANGE_31";
+BA_ "GenSigStartValue" SG_ 318 CAN_DET_RANGE_RATE_31 0;
+BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_RATE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_RATE_31 "CAN_DET_RANGE_RATE_31";
+BA_ "GenSigSendType" SG_ 318 CAN_DET_AMPLITUDE_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_DET_AMPLITUDE_31 "CAN_DET_AMPLITUDE_31";
+BA_ "GenSigSendType" SG_ 318 CAN_SCAN_INDEX_2LSB_31 0;
+BA_ "GenSigCmt" SG_ 318 CAN_SCAN_INDEX_2LSB_31 "CAN_SCAN_INDEX_2LSB_31";
+BA_ "GenMsgSendType" BO_ 317 1;
+BA_ "GenMsgILSupport" BO_ 317 1;
+BA_ "GenMsgNrOfRepetition" BO_ 317 0;
+BA_ "GenMsgCycleTime" BO_ 317 0;
+BA_ "NetworkInitialization" BO_ 317 0;
+BA_ "GenMsgDelayTime" BO_ 317 0;
+BA_ "GenSigVtEn" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigVtName" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 "CAN_DET_SUPER_RES_TARGET_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_ND_TARGET_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_ND_TARGET_30 "CAN_DET_ND_TARGET_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 "CAN_DET_HOST_VEH_CLUTTER_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_VALID_LEVEL_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_VALID_LEVEL_30 "CAN_DET_VALID_LEVEL_30";
+BA_ "GenSigStartValue" SG_ 317 CAN_DET_AZIMUTH_30 0;
+BA_ "GenSigSendType" SG_ 317 CAN_DET_AZIMUTH_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_AZIMUTH_30 "CAN_DET_AZIMUTH_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_30 "CAN_DET_RANGE_30";
+BA_ "GenSigStartValue" SG_ 317 CAN_DET_RANGE_RATE_30 0;
+BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_RATE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_RATE_30 "CAN_DET_RANGE_RATE_30";
+BA_ "GenSigSendType" SG_ 317 CAN_DET_AMPLITUDE_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_DET_AMPLITUDE_30 "CAN_DET_AMPLITUDE_30";
+BA_ "GenSigSendType" SG_ 317 CAN_SCAN_INDEX_2LSB_30 0;
+BA_ "GenSigCmt" SG_ 317 CAN_SCAN_INDEX_2LSB_30 "CAN_SCAN_INDEX_2LSB_30";
+BA_ "GenMsgSendType" BO_ 316 1;
+BA_ "GenMsgILSupport" BO_ 316 1;
+BA_ "GenMsgNrOfRepetition" BO_ 316 0;
+BA_ "GenMsgCycleTime" BO_ 316 0;
+BA_ "NetworkInitialization" BO_ 316 0;
+BA_ "GenMsgDelayTime" BO_ 316 0;
+BA_ "GenSigVtEn" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigVtName" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 "CAN_DET_SUPER_RES_TARGET_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_ND_TARGET_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_ND_TARGET_29 "CAN_DET_ND_TARGET_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 "CAN_DET_HOST_VEH_CLUTTER_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_VALID_LEVEL_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_VALID_LEVEL_29 "CAN_DET_VALID_LEVEL_29";
+BA_ "GenSigStartValue" SG_ 316 CAN_DET_AZIMUTH_29 0;
+BA_ "GenSigSendType" SG_ 316 CAN_DET_AZIMUTH_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_AZIMUTH_29 "CAN_DET_AZIMUTH_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_29 "CAN_DET_RANGE_29";
+BA_ "GenSigStartValue" SG_ 316 CAN_DET_RANGE_RATE_29 0;
+BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_RATE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_RATE_29 "CAN_DET_RANGE_RATE_29";
+BA_ "GenSigSendType" SG_ 316 CAN_DET_AMPLITUDE_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_DET_AMPLITUDE_29 "CAN_DET_AMPLITUDE_29";
+BA_ "GenSigSendType" SG_ 316 CAN_SCAN_INDEX_2LSB_29 0;
+BA_ "GenSigCmt" SG_ 316 CAN_SCAN_INDEX_2LSB_29 "CAN_SCAN_INDEX_2LSB_29";
+BA_ "GenMsgSendType" BO_ 314 1;
+BA_ "GenMsgILSupport" BO_ 314 1;
+BA_ "GenMsgNrOfRepetition" BO_ 314 0;
+BA_ "GenMsgCycleTime" BO_ 314 0;
+BA_ "NetworkInitialization" BO_ 314 0;
+BA_ "GenMsgDelayTime" BO_ 314 0;
+BA_ "GenSigVtEn" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigVtName" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 "CAN_DET_SUPER_RES_TARGET_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_ND_TARGET_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_ND_TARGET_27 "CAN_DET_ND_TARGET_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 "CAN_DET_HOST_VEH_CLUTTER_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_VALID_LEVEL_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_VALID_LEVEL_27 "CAN_DET_VALID_LEVEL_27";
+BA_ "GenSigStartValue" SG_ 314 CAN_DET_AZIMUTH_27 0;
+BA_ "GenSigSendType" SG_ 314 CAN_DET_AZIMUTH_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_AZIMUTH_27 "CAN_DET_AZIMUTH_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_27 "CAN_DET_RANGE_27";
+BA_ "GenSigStartValue" SG_ 314 CAN_DET_RANGE_RATE_27 0;
+BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_RATE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_RATE_27 "CAN_DET_RANGE_RATE_27";
+BA_ "GenSigSendType" SG_ 314 CAN_DET_AMPLITUDE_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_DET_AMPLITUDE_27 "CAN_DET_AMPLITUDE_27";
+BA_ "GenSigSendType" SG_ 314 CAN_SCAN_INDEX_2LSB_27 0;
+BA_ "GenSigCmt" SG_ 314 CAN_SCAN_INDEX_2LSB_27 "CAN_SCAN_INDEX_2LSB_27";
+BA_ "GenMsgSendType" BO_ 313 1;
+BA_ "GenMsgILSupport" BO_ 313 1;
+BA_ "GenMsgNrOfRepetition" BO_ 313 0;
+BA_ "GenMsgCycleTime" BO_ 313 0;
+BA_ "NetworkInitialization" BO_ 313 0;
+BA_ "GenMsgDelayTime" BO_ 313 0;
+BA_ "GenSigVtEn" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigVtName" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 "CAN_DET_SUPER_RES_TARGET_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_ND_TARGET_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_ND_TARGET_26 "CAN_DET_ND_TARGET_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 "CAN_DET_HOST_VEH_CLUTTER_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_VALID_LEVEL_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_VALID_LEVEL_26 "CAN_DET_VALID_LEVEL_26";
+BA_ "GenSigStartValue" SG_ 313 CAN_DET_AZIMUTH_26 0;
+BA_ "GenSigSendType" SG_ 313 CAN_DET_AZIMUTH_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_AZIMUTH_26 "CAN_DET_AZIMUTH_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_26 "CAN_DET_RANGE_26";
+BA_ "GenSigStartValue" SG_ 313 CAN_DET_RANGE_RATE_26 0;
+BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_RATE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_RATE_26 "CAN_DET_RANGE_RATE_26";
+BA_ "GenSigSendType" SG_ 313 CAN_DET_AMPLITUDE_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_DET_AMPLITUDE_26 "CAN_DET_AMPLITUDE_26";
+BA_ "GenSigSendType" SG_ 313 CAN_SCAN_INDEX_2LSB_26 0;
+BA_ "GenSigCmt" SG_ 313 CAN_SCAN_INDEX_2LSB_26 "CAN_SCAN_INDEX_2LSB_26";
+BA_ "GenMsgSendType" BO_ 312 1;
+BA_ "GenMsgILSupport" BO_ 312 1;
+BA_ "GenMsgNrOfRepetition" BO_ 312 0;
+BA_ "GenMsgCycleTime" BO_ 312 0;
+BA_ "NetworkInitialization" BO_ 312 0;
+BA_ "GenMsgDelayTime" BO_ 312 0;
+BA_ "GenSigVtEn" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigVtName" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 "CAN_DET_SUPER_RES_TARGET_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_ND_TARGET_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_ND_TARGET_25 "CAN_DET_ND_TARGET_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 "CAN_DET_HOST_VEH_CLUTTER_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_VALID_LEVEL_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_VALID_LEVEL_25 "CAN_DET_VALID_LEVEL_25";
+BA_ "GenSigStartValue" SG_ 312 CAN_DET_AZIMUTH_25 0;
+BA_ "GenSigSendType" SG_ 312 CAN_DET_AZIMUTH_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_AZIMUTH_25 "CAN_DET_AZIMUTH_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_25 "CAN_DET_RANGE_25";
+BA_ "GenSigStartValue" SG_ 312 CAN_DET_RANGE_RATE_25 0;
+BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_RATE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_RATE_25 "CAN_DET_RANGE_RATE_25";
+BA_ "GenSigSendType" SG_ 312 CAN_DET_AMPLITUDE_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_DET_AMPLITUDE_25 "CAN_DET_AMPLITUDE_25";
+BA_ "GenSigSendType" SG_ 312 CAN_SCAN_INDEX_2LSB_25 0;
+BA_ "GenSigCmt" SG_ 312 CAN_SCAN_INDEX_2LSB_25 "CAN_SCAN_INDEX_2LSB_25";
+BA_ "GenMsgSendType" BO_ 311 1;
+BA_ "GenMsgILSupport" BO_ 311 1;
+BA_ "GenMsgNrOfRepetition" BO_ 311 0;
+BA_ "GenMsgCycleTime" BO_ 311 0;
+BA_ "NetworkInitialization" BO_ 311 0;
+BA_ "GenMsgDelayTime" BO_ 311 0;
+BA_ "GenSigVtEn" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigVtName" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 "CAN_DET_SUPER_RES_TARGET_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_ND_TARGET_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_ND_TARGET_24 "CAN_DET_ND_TARGET_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 "CAN_DET_HOST_VEH_CLUTTER_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_VALID_LEVEL_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_VALID_LEVEL_24 "CAN_DET_VALID_LEVEL_24";
+BA_ "GenSigStartValue" SG_ 311 CAN_DET_AZIMUTH_24 0;
+BA_ "GenSigSendType" SG_ 311 CAN_DET_AZIMUTH_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_AZIMUTH_24 "CAN_DET_AZIMUTH_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_24 "CAN_DET_RANGE_24";
+BA_ "GenSigStartValue" SG_ 311 CAN_DET_RANGE_RATE_24 0;
+BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_RATE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_RATE_24 "CAN_DET_RANGE_RATE_24";
+BA_ "GenSigSendType" SG_ 311 CAN_DET_AMPLITUDE_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_DET_AMPLITUDE_24 "CAN_DET_AMPLITUDE_24";
+BA_ "GenSigSendType" SG_ 311 CAN_SCAN_INDEX_2LSB_24 0;
+BA_ "GenSigCmt" SG_ 311 CAN_SCAN_INDEX_2LSB_24 "CAN_SCAN_INDEX_2LSB_24";
+BA_ "GenMsgSendType" BO_ 310 1;
+BA_ "GenMsgILSupport" BO_ 310 1;
+BA_ "GenMsgNrOfRepetition" BO_ 310 0;
+BA_ "GenMsgCycleTime" BO_ 310 0;
+BA_ "NetworkInitialization" BO_ 310 0;
+BA_ "GenMsgDelayTime" BO_ 310 0;
+BA_ "GenSigVtEn" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigVtName" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 "CAN_DET_SUPER_RES_TARGET_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_ND_TARGET_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_ND_TARGET_23 "CAN_DET_ND_TARGET_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 "CAN_DET_HOST_VEH_CLUTTER_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_VALID_LEVEL_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_VALID_LEVEL_23 "CAN_DET_VALID_LEVEL_23";
+BA_ "GenSigStartValue" SG_ 310 CAN_DET_AZIMUTH_23 0;
+BA_ "GenSigSendType" SG_ 310 CAN_DET_AZIMUTH_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_AZIMUTH_23 "CAN_DET_AZIMUTH_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_23 "CAN_DET_RANGE_23";
+BA_ "GenSigStartValue" SG_ 310 CAN_DET_RANGE_RATE_23 0;
+BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_RATE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_RATE_23 "CAN_DET_RANGE_RATE_23";
+BA_ "GenSigSendType" SG_ 310 CAN_DET_AMPLITUDE_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_DET_AMPLITUDE_23 "CAN_DET_AMPLITUDE_23";
+BA_ "GenSigSendType" SG_ 310 CAN_SCAN_INDEX_2LSB_23 0;
+BA_ "GenSigCmt" SG_ 310 CAN_SCAN_INDEX_2LSB_23 "CAN_SCAN_INDEX_2LSB_23";
+EOF
+
+build_ba "22"
+build_ba "21"
+build_ba "20"
+build_ba "19"
+build_ba "18"
+
+cat <> ${OUT_FILENAME}
+BA_ "GenMsgSendType" BO_ 341 1;
+BA_ "GenMsgILSupport" BO_ 341 1;
+BA_ "GenMsgNrOfRepetition" BO_ 341 0;
+BA_ "GenMsgCycleTime" BO_ 341 0;
+BA_ "NetworkInitialization" BO_ 341 0;
+BA_ "GenMsgDelayTime" BO_ 341 0;
+BA_ "GenSigVtEn" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigVtName" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 "CAN_DET_SUPER_RES_TARGET_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_ND_TARGET_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_ND_TARGET_54 "CAN_DET_ND_TARGET_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 "CAN_DET_HOST_VEH_CLUTTER_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_VALID_LEVEL_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_VALID_LEVEL_54 "CAN_DET_VALID_LEVEL_54";
+BA_ "GenSigStartValue" SG_ 341 CAN_DET_AZIMUTH_54 0;
+BA_ "GenSigSendType" SG_ 341 CAN_DET_AZIMUTH_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_AZIMUTH_54 "CAN_DET_AZIMUTH_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_54 "CAN_DET_RANGE_54";
+BA_ "GenSigStartValue" SG_ 341 CAN_DET_RANGE_RATE_54 0;
+BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_RATE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_RATE_54 "CAN_DET_RANGE_RATE_54";
+BA_ "GenSigSendType" SG_ 341 CAN_DET_AMPLITUDE_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_DET_AMPLITUDE_54 "CAN_DET_AMPLITUDE_54";
+BA_ "GenSigSendType" SG_ 341 CAN_SCAN_INDEX_2LSB_54 0;
+BA_ "GenSigCmt" SG_ 341 CAN_SCAN_INDEX_2LSB_54 "CAN_SCAN_INDEX_2LSB_54";
+BA_ "GenMsgSendType" BO_ 340 1;
+BA_ "GenMsgILSupport" BO_ 340 1;
+BA_ "GenMsgNrOfRepetition" BO_ 340 0;
+BA_ "GenMsgCycleTime" BO_ 340 0;
+BA_ "NetworkInitialization" BO_ 340 0;
+BA_ "GenMsgDelayTime" BO_ 340 0;
+BA_ "GenSigVtEn" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigVtName" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 "CAN_DET_SUPER_RES_TARGET_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_ND_TARGET_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_ND_TARGET_53 "CAN_DET_ND_TARGET_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 "CAN_DET_HOST_VEH_CLUTTER_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_VALID_LEVEL_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_VALID_LEVEL_53 "CAN_DET_VALID_LEVEL_53";
+BA_ "GenSigStartValue" SG_ 340 CAN_DET_AZIMUTH_53 0;
+BA_ "GenSigSendType" SG_ 340 CAN_DET_AZIMUTH_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_AZIMUTH_53 "CAN_DET_AZIMUTH_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_53 "CAN_DET_RANGE_53";
+BA_ "GenSigStartValue" SG_ 340 CAN_DET_RANGE_RATE_53 0;
+BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_RATE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_RATE_53 "CAN_DET_RANGE_RATE_53";
+BA_ "GenSigSendType" SG_ 340 CAN_DET_AMPLITUDE_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_DET_AMPLITUDE_53 "CAN_DET_AMPLITUDE_53";
+BA_ "GenSigSendType" SG_ 340 CAN_SCAN_INDEX_2LSB_53 0;
+BA_ "GenSigCmt" SG_ 340 CAN_SCAN_INDEX_2LSB_53 "CAN_SCAN_INDEX_2LSB_53";
+BA_ "GenMsgSendType" BO_ 339 1;
+BA_ "GenMsgILSupport" BO_ 339 1;
+BA_ "GenMsgNrOfRepetition" BO_ 339 0;
+BA_ "GenMsgCycleTime" BO_ 339 0;
+BA_ "NetworkInitialization" BO_ 339 0;
+BA_ "GenMsgDelayTime" BO_ 339 0;
+BA_ "GenSigVtEn" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigVtName" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 "CAN_DET_SUPER_RES_TARGET_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_ND_TARGET_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_ND_TARGET_52 "CAN_DET_ND_TARGET_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 "CAN_DET_HOST_VEH_CLUTTER_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_VALID_LEVEL_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_VALID_LEVEL_52 "CAN_DET_VALID_LEVEL_52";
+BA_ "GenSigStartValue" SG_ 339 CAN_DET_AZIMUTH_52 0;
+BA_ "GenSigSendType" SG_ 339 CAN_DET_AZIMUTH_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_AZIMUTH_52 "CAN_DET_AZIMUTH_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_52 "CAN_DET_RANGE_52";
+BA_ "GenSigStartValue" SG_ 339 CAN_DET_RANGE_RATE_52 0;
+BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_RATE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_RATE_52 "CAN_DET_RANGE_RATE_52";
+BA_ "GenSigSendType" SG_ 339 CAN_DET_AMPLITUDE_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_DET_AMPLITUDE_52 "CAN_DET_AMPLITUDE_52";
+BA_ "GenSigSendType" SG_ 339 CAN_SCAN_INDEX_2LSB_52 0;
+BA_ "GenSigCmt" SG_ 339 CAN_SCAN_INDEX_2LSB_52 "CAN_SCAN_INDEX_2LSB_52";
+BA_ "GenMsgSendType" BO_ 338 1;
+BA_ "GenMsgILSupport" BO_ 338 1;
+BA_ "GenMsgNrOfRepetition" BO_ 338 0;
+BA_ "GenMsgCycleTime" BO_ 338 0;
+BA_ "NetworkInitialization" BO_ 338 0;
+BA_ "GenMsgDelayTime" BO_ 338 0;
+BA_ "GenSigVtEn" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigVtName" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 "CAN_DET_SUPER_RES_TARGET_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_ND_TARGET_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_ND_TARGET_51 "CAN_DET_ND_TARGET_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 "CAN_DET_HOST_VEH_CLUTTER_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_VALID_LEVEL_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_VALID_LEVEL_51 "CAN_DET_VALID_LEVEL_51";
+BA_ "GenSigStartValue" SG_ 338 CAN_DET_AZIMUTH_51 0;
+BA_ "GenSigSendType" SG_ 338 CAN_DET_AZIMUTH_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_AZIMUTH_51 "CAN_DET_AZIMUTH_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_51 "CAN_DET_RANGE_51";
+BA_ "GenSigStartValue" SG_ 338 CAN_DET_RANGE_RATE_51 0;
+BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_RATE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_RATE_51 "CAN_DET_RANGE_RATE_51";
+BA_ "GenSigSendType" SG_ 338 CAN_DET_AMPLITUDE_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_DET_AMPLITUDE_51 "CAN_DET_AMPLITUDE_51";
+BA_ "GenSigSendType" SG_ 338 CAN_SCAN_INDEX_2LSB_51 0;
+BA_ "GenSigCmt" SG_ 338 CAN_SCAN_INDEX_2LSB_51 "CAN_SCAN_INDEX_2LSB_51";
+BA_ "GenMsgSendType" BO_ 337 1;
+BA_ "GenMsgILSupport" BO_ 337 1;
+BA_ "GenMsgNrOfRepetition" BO_ 337 0;
+BA_ "GenMsgCycleTime" BO_ 337 0;
+BA_ "NetworkInitialization" BO_ 337 0;
+BA_ "GenMsgDelayTime" BO_ 337 0;
+BA_ "GenSigVtEn" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigVtName" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 "CAN_DET_SUPER_RES_TARGET_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_ND_TARGET_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_ND_TARGET_50 "CAN_DET_ND_TARGET_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 "CAN_DET_HOST_VEH_CLUTTER_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_VALID_LEVEL_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_VALID_LEVEL_50 "CAN_DET_VALID_LEVEL_50";
+BA_ "GenSigStartValue" SG_ 337 CAN_DET_AZIMUTH_50 0;
+BA_ "GenSigSendType" SG_ 337 CAN_DET_AZIMUTH_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_AZIMUTH_50 "CAN_DET_AZIMUTH_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_50 "CAN_DET_RANGE_50";
+BA_ "GenSigStartValue" SG_ 337 CAN_DET_RANGE_RATE_50 0;
+BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_RATE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_RATE_50 "CAN_DET_RANGE_RATE_50";
+BA_ "GenSigSendType" SG_ 337 CAN_DET_AMPLITUDE_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_DET_AMPLITUDE_50 "CAN_DET_AMPLITUDE_50";
+BA_ "GenSigSendType" SG_ 337 CAN_SCAN_INDEX_2LSB_50 0;
+BA_ "GenSigCmt" SG_ 337 CAN_SCAN_INDEX_2LSB_50 "CAN_SCAN_INDEX_2LSB_50";
+BA_ "GenMsgSendType" BO_ 336 1;
+BA_ "GenMsgILSupport" BO_ 336 1;
+BA_ "GenMsgNrOfRepetition" BO_ 336 0;
+BA_ "GenMsgCycleTime" BO_ 336 0;
+BA_ "NetworkInitialization" BO_ 336 0;
+BA_ "GenMsgDelayTime" BO_ 336 0;
+BA_ "GenSigVtEn" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigVtName" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 "CAN_DET_SUPER_RES_TARGET_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_ND_TARGET_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_ND_TARGET_49 "CAN_DET_ND_TARGET_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 "CAN_DET_HOST_VEH_CLUTTER_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_VALID_LEVEL_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_VALID_LEVEL_49 "CAN_DET_VALID_LEVEL_49";
+BA_ "GenSigStartValue" SG_ 336 CAN_DET_AZIMUTH_49 0;
+BA_ "GenSigSendType" SG_ 336 CAN_DET_AZIMUTH_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_AZIMUTH_49 "CAN_DET_AZIMUTH_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_49 "CAN_DET_RANGE_49";
+BA_ "GenSigStartValue" SG_ 336 CAN_DET_RANGE_RATE_49 0;
+BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_RATE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_RATE_49 "CAN_DET_RANGE_RATE_49";
+BA_ "GenSigSendType" SG_ 336 CAN_DET_AMPLITUDE_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_DET_AMPLITUDE_49 "CAN_DET_AMPLITUDE_49";
+BA_ "GenSigSendType" SG_ 336 CAN_SCAN_INDEX_2LSB_49 0;
+BA_ "GenSigCmt" SG_ 336 CAN_SCAN_INDEX_2LSB_49 "CAN_SCAN_INDEX_2LSB_49";
+BA_ "GenMsgSendType" BO_ 326 1;
+BA_ "GenMsgILSupport" BO_ 326 1;
+BA_ "GenMsgNrOfRepetition" BO_ 326 0;
+BA_ "GenMsgCycleTime" BO_ 326 0;
+BA_ "NetworkInitialization" BO_ 326 0;
+BA_ "GenMsgDelayTime" BO_ 326 0;
+BA_ "GenSigVtEn" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigVtName" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 "CAN_DET_SUPER_RES_TARGET_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_ND_TARGET_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_ND_TARGET_39 "CAN_DET_ND_TARGET_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 "CAN_DET_HOST_VEH_CLUTTER_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_VALID_LEVEL_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_VALID_LEVEL_39 "CAN_DET_VALID_LEVEL_39";
+BA_ "GenSigStartValue" SG_ 326 CAN_DET_AZIMUTH_39 0;
+BA_ "GenSigSendType" SG_ 326 CAN_DET_AZIMUTH_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_AZIMUTH_39 "CAN_DET_AZIMUTH_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_39 "CAN_DET_RANGE_39";
+BA_ "GenSigStartValue" SG_ 326 CAN_DET_RANGE_RATE_39 0;
+BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_RATE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_RATE_39 "CAN_DET_RANGE_RATE_39";
+BA_ "GenSigSendType" SG_ 326 CAN_DET_AMPLITUDE_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_DET_AMPLITUDE_39 "CAN_DET_AMPLITUDE_39";
+BA_ "GenSigSendType" SG_ 326 CAN_SCAN_INDEX_2LSB_39 0;
+BA_ "GenSigCmt" SG_ 326 CAN_SCAN_INDEX_2LSB_39 "CAN_SCAN_INDEX_2LSB_39";
+BA_ "GenMsgSendType" BO_ 315 1;
+BA_ "GenMsgILSupport" BO_ 315 1;
+BA_ "GenMsgNrOfRepetition" BO_ 315 0;
+BA_ "GenMsgCycleTime" BO_ 315 0;
+BA_ "NetworkInitialization" BO_ 315 0;
+BA_ "GenMsgDelayTime" BO_ 315 0;
+BA_ "GenSigVtEn" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigVtName" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 "CAN_DET_SUPER_RES_TARGET_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_ND_TARGET_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_ND_TARGET_28 "CAN_DET_ND_TARGET_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 "CAN_DET_HOST_VEH_CLUTTER_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_VALID_LEVEL_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_VALID_LEVEL_28 "CAN_DET_VALID_LEVEL_28";
+BA_ "GenSigStartValue" SG_ 315 CAN_DET_AZIMUTH_28 0;
+BA_ "GenSigSendType" SG_ 315 CAN_DET_AZIMUTH_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_AZIMUTH_28 "CAN_DET_AZIMUTH_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_28 "CAN_DET_RANGE_28";
+BA_ "GenSigStartValue" SG_ 315 CAN_DET_RANGE_RATE_28 0;
+BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_RATE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_RATE_28 "CAN_DET_RANGE_RATE_28";
+BA_ "GenSigSendType" SG_ 315 CAN_DET_AMPLITUDE_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_DET_AMPLITUDE_28 "CAN_DET_AMPLITUDE_28";
+BA_ "GenSigSendType" SG_ 315 CAN_SCAN_INDEX_2LSB_28 0;
+BA_ "GenSigCmt" SG_ 315 CAN_SCAN_INDEX_2LSB_28 "CAN_SCAN_INDEX_2LSB_28";
+EOF
+
+build_ba "17"
+build_ba "16"
+build_ba "15"
+build_ba "14"
+build_ba "13"
+build_ba "12"
+build_ba "11"
+build_ba "10"
+build_ba "09"
+build_ba "08"
+build_ba "07"
+build_ba "06"
+build_ba "05"
+build_ba "03"
+build_ba "02"
+
+cat <> ${OUT_FILENAME}
+BA_ "GenMsgSendType" BO_ 256 1;
+BA_ "GenMsgILSupport" BO_ 256 1;
+BA_ "GenMsgNrOfRepetition" BO_ 256 0;
+BA_ "NetworkInitialization" BO_ 256 0;
+BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MINOR_MRR "CAN_PCAN_MINOR_MRR";
+BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MINOR_MRR 0;
+BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MAJOR_MRR "CAN_PCAN_MAJOR_MRR";
+BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MAJOR_MRR 0;
+BA_ "GenMsgCycleTime" BO_ 257 30;
+BA_ "GenMsgSendType" BO_ 257 0;
+BA_ "GenMsgILSupport" BO_ 257 1;
+BA_ "GenMsgNrOfRepetition" BO_ 257 0;
+BA_ "NetworkInitialization" BO_ 257 0;
+BA_ "GenSigCmt" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtEn" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtName" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE";
+BA_ "GenSigVtName" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigCmt" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE";
+BA_ "GenSigStartValue" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0;
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0;
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL";
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE";
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE";
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE 0;
+BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR";
+BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_MNR 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_EXT_COND_NOK 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_NOT_START 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_OVERHEAT_ERROR 0;
+BA_ "GenSigCmt" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigVtName" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP";
+BA_ "GenSigSendType" SG_ 257 CAN_RADAR_NOT_OP 0;
+BA_ "GenSigCmt" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigVtEn" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigVtName" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL";
+BA_ "GenSigSendType" SG_ 257 CAN_XCVR_OPERATIONAL 0;
+EOF
+
+build_ba "01"
+
+cat <> ${OUT_FILENAME}
+BA_DEF_DEF_ "CrossOver_InfoCAN" "No";
+BA_DEF_DEF_ "CrossOver_LIN" "No";
+BA_DEF_DEF_ "UsedOnPgmDBC" "Yes";
+BA_DEF_DEF_ "ContentDependant" "No";
+BA_DEF_DEF_ "GenSigTimeoutTime_RCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_OCS" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_CCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_IPMA" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_SCCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0;
+BA_DEF_DEF_ "GenSigTimeoutTime_Generic_BCM" 0;
+BA_DEF_DEF_ "NmMessage" "No";
+BA_DEF_DEF_ "DiagResponse" "No";
+BA_DEF_DEF_ "DiagRequest" "No";
+BA_DEF_DEF_ "TpTxIndex" 0;
+BA_DEF_DEF_ "DiagState" "No";
+BA_DEF_DEF_ "TpApplType" "";
+BA_DEF_DEF_ "NmAsrMessage" "No";
+BA_DEF_DEF_ "Mulitplexer" "No";
+BA_DEF_DEF_ "ConfiguredTransmitter" "No";
+BA_DEF_DEF_ "EventRateOfChange" 10000;
+BA_DEF_DEF_ "GenMsgHandlingTypeDoc" "";
+BA_DEF_DEF_ "GenMsgHandlingTypeCode" "";
+BA_DEF_DEF_ "GenMsgMarked" "";
+BA_DEF_DEF_ "GenSigMarked" "";
+BA_DEF_DEF_ "GenSigVtIndex" "";
+BA_DEF_DEF_ "GenSigVtName" "";
+BA_DEF_DEF_ "GenSigVtEn" "";
+BA_DEF_DEF_ "GenSigSNA" "";
+BA_DEF_DEF_ "GenSigCmt" "";
+BA_DEF_DEF_ "GenMsgCmt" "";
+BA_DEF_DEF_ "GenSigSendType" "NoSigSendType";
+BA_DEF_DEF_ "GenSigInactiveValue" 0;
+BA_DEF_DEF_ "GenSigMissingSourceValue" 0;
+BA_DEF_DEF_ "WakeupSignal" "No";
+BA_DEF_DEF_ "GenSigStartValue" 0;
+BA_DEF_DEF_ "GenMsgILSupport" "Yes";
+BA_DEF_DEF_ "NetworkInitializationCommand" "No";
+BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+BA_DEF_DEF_ "GenMsgCycleTimeFast" 0;
+BA_DEF_DEF_ "GenMsgDelayTime" 0;
+BA_DEF_DEF_ "GenMsgNrOfRepetition" 0;
+BA_DEF_DEF_ "GenMsgStartDelayTime" 0;
+BA_DEF_DEF_ "NetworkInitialization" "No";
+BA_DEF_DEF_ "MessageGateway" "No";
+BA_DEF_DEF_ "ILUsed" "Yes";
+BA_DEF_DEF_ "NetworkInitializationUsed" "No";
+BA_DEF_DEF_ "PowerType" "Switched";
+BA_DEF_DEF_ "NodeStartUpTime" 250;
+BA_DEF_DEF_ "NodeWakeUpTime" 10;
+BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff";
+BA_DEF_DEF_ "GenMsgForegroundColor" "#000000";
+VAL_ 34 IPMA_PCAN_DataRangeCheck 1 "Fault Present" 0 "No Fault";
+VAL_ 34 IPMA_PCAN_MissingMsg 1 "Fault Present" 0 "No Fault ";
+VAL_ 34 VINSignalCompareFailure 1 "Fault Present" 0 "No Fault";
+VAL_ 34 ModuleNotConfiguredError 1 "Fault Present" 0 "No Fault";
+VAL_ 34 CarCfgNotConfiguredError 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte7_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ARMtoDSPChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 DSPtoArmChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 HostToArmChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ARMtoHostChksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 LoopBWOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 DSPOverrunFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte6_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TuningSensitivityFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 SaturatedTuningFreqFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 LocalOscPowerFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterPowerFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte6_bit0 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 XCVRDeviceSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 FreqSynthesizerSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 AnalogConverterDevicSPIFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 SidelobeBlockage 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte5_bit1 1 "Fault Present" 0 "No Fault";
+VAL_ 33 MNRBlocked 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ECUTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 AlignmentRoutineFailedFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 UnreasonableRadarData 1 "Fault Present" 0 "No Fault";
+VAL_ 33 MicroprocessorTempHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 VerticalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 HorizontalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 FactoryAlignmentMode 1 "Fault Present" 0 "No Fault";
+VAL_ 33 BatteryLowFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 BatteryHighFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_1p25SupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte3_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ThermistorOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_3p3DACSupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_3p3RAWSupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 v_5_SupplyOutOfRange 1 "Fault Present" 0 "No Fault";
+VAL_ 33 TransmitterIDFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit3 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte2_bit2 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PCANMissingMsgFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PCANBusOff 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit7 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 InstructionSetCheckFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 StackOverflowFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 WatchdogFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 PLLLockFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte1_bit1 1 "Fault Present" 0 "No Fault";
+VAL_ 33 RAMMemoryTestFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 USCValidationFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit6 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit5 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit4 1 "Fault Present" 0 "No Fault";
+VAL_ 33 Active_Flt_Latched_byte0_bit3 1 "Fault Present" 0 "No Fault";
+VAL_ 33 KeepAliveChecksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ProgramCalibrationFlashChecksum 1 "Fault Present" 0 "No Fault";
+VAL_ 33 ApplicationFlashChecksumFault 1 "Fault Present" 0 "No Fault";
+VAL_ 371 CAN_AUTO_ALIGN_HANGLE_QF 3 "Accurate" 2 "Inaccurate" 1 "Temporarily undefined" 0 "Undefined";
+VAL_ 371 CAN_ALIGNMENT_STATUS 15 "Undefined_2" 14 "Undefined_1" 13 "Low Amplitude (Flat-plate only)" 12 "No Peak (Flat-plate only)" 11 "Fail Ver and Hor OutOfRange" 10 "Fail Vertical Align OutOfRange" 9 "Fail Horizontal Align OutOfRange" 8 "Fail Time Out" 7 "Fail Only Right Target Found" 6 "Fail Only Left Target Found" 5 "Fail Variance Too Large" 4 "Fail Deviation Too Large" 3 "Fail No Target" 2 "Success" 1 "Busy" 0 "Off";
+VAL_ 371 CAN_ALIGNMENT_STATE 6 "Static alignment flat-plate" 5 "Static alignment 2-target" 4 "Static alignment 1-target" 3 "Service alignment" 2 "Short track alignment" 1 "Auto alignment" 0 "Off";
+EOF
+
+build_val "04"
+
+cat <> ${OUT_FILENAME}
+VAL_ 351 CAN_DET_CONFID_AZIMUTH_64 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 350 CAN_DET_CONFID_AZIMUTH_63 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 349 CAN_DET_CONFID_AZIMUTH_62 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 348 CAN_DET_CONFID_AZIMUTH_61 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 347 CAN_DET_CONFID_AZIMUTH_60 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 346 CAN_DET_CONFID_AZIMUTH_59 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 345 CAN_DET_CONFID_AZIMUTH_58 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 344 CAN_DET_CONFID_AZIMUTH_57 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 343 CAN_DET_CONFID_AZIMUTH_56 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 342 CAN_DET_CONFID_AZIMUTH_55 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 335 CAN_DET_CONFID_AZIMUTH_48 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 334 CAN_DET_CONFID_AZIMUTH_47 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 333 CAN_DET_CONFID_AZIMUTH_46 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 332 CAN_DET_CONFID_AZIMUTH_45 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 331 CAN_DET_CONFID_AZIMUTH_44 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 330 CAN_DET_CONFID_AZIMUTH_43 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 329 CAN_DET_CONFID_AZIMUTH_42 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 328 CAN_DET_CONFID_AZIMUTH_41 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 327 CAN_DET_CONFID_AZIMUTH_40 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 325 CAN_DET_CONFID_AZIMUTH_38 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 324 CAN_DET_CONFID_AZIMUTH_37 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 323 CAN_DET_CONFID_AZIMUTH_36 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 322 CAN_DET_CONFID_AZIMUTH_35 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 321 CAN_DET_CONFID_AZIMUTH_34 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 320 CAN_DET_CONFID_AZIMUTH_33 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 319 CAN_DET_CONFID_AZIMUTH_32 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 318 CAN_DET_CONFID_AZIMUTH_31 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 317 CAN_DET_CONFID_AZIMUTH_30 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 316 CAN_DET_CONFID_AZIMUTH_29 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 314 CAN_DET_CONFID_AZIMUTH_27 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 313 CAN_DET_CONFID_AZIMUTH_26 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 312 CAN_DET_CONFID_AZIMUTH_25 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 311 CAN_DET_CONFID_AZIMUTH_24 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 310 CAN_DET_CONFID_AZIMUTH_23 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+EOF
+
+build_val "22"
+build_val "21"
+build_val "20"
+build_val "19"
+build_val "18"
+
+cat <> ${OUT_FILENAME}
+VAL_ 341 CAN_DET_CONFID_AZIMUTH_54 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 340 CAN_DET_CONFID_AZIMUTH_53 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 339 CAN_DET_CONFID_AZIMUTH_52 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 338 CAN_DET_CONFID_AZIMUTH_51 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 337 CAN_DET_CONFID_AZIMUTH_50 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 336 CAN_DET_CONFID_AZIMUTH_49 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 326 CAN_DET_CONFID_AZIMUTH_39 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+VAL_ 315 CAN_DET_CONFID_AZIMUTH_28 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High";
+EOF
+
+build_val "17"
+build_val "16"
+build_val "15"
+build_val "14"
+build_val "13"
+build_val "12"
+build_val "11"
+build_val "10"
+build_val "09"
+build_val "08"
+build_val "07"
+build_val "06"
+build_val "05"
+build_val "03"
+build_val "02"
+
+cat <> ${OUT_FILENAME}
+VAL_ 257 CAN_INTERFERENCE_TYPE 2 "Star PD-Like" 1 "Slow FMCW" 0 "No Interference";
+VAL_ 257 CAN_RECOMMEND_UNCONVERGE 1 "Recommended" 0 "Not Recommended";
+VAL_ 257 CAN_RADAR_ALIGN_INCOMPLETE 1 "Alignment Incomplete" 0 "Alignment Completed";
+VAL_ 257 CAN_BLOCKAGE_SIDELOBE 1 "Radar Blockage" 0 "No Radar Blockage";
+VAL_ 257 CAN_BLOCKAGE_MNR 1 "Radar Blockage" 0 "No Radar Blockage";
+VAL_ 257 CAN_RADAR_EXT_COND_NOK 1 "Too high temp or insufficient pw" 0 "External conditions OK";
+VAL_ 257 CAN_RADAR_ALIGN_OUT_RANGE 1 "Radar out of range" 0 "Radar within range";
+VAL_ 257 CAN_RADAR_ALIGN_NOT_START 1 "Radar align not started" 0 "Radar align started";
+VAL_ 257 CAN_RADAR_OVERHEAT_ERROR 1 "Radar overheat condition" 0 "No Overheat";
+VAL_ 257 CAN_RADAR_NOT_OP 1 "Radar not operational" 0 "Radar operational";
+VAL_ 257 CAN_XCVR_OPERATIONAL 1 "On" 0 "Off ";
+EOF
+
+build_val "01"
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/generator.py b/iqdbc_repo/iqdbc/dbc/generator/generator.py
new file mode 100755
index 000000000..af05f0049
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/generator.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+import os
+import re
+import glob
+import subprocess
+
+generator_path = os.path.dirname(os.path.realpath(__file__))
+iqdbc_root = os.path.join(generator_path, '../')
+include_pattern = re.compile(r'CM_ "IMPORT (.*?)";\n')
+generated_suffix = '_generated.dbc'
+
+
+def read_dbc(src_dir: str, filename: str) -> str:
+ with open(os.path.join(src_dir, filename), encoding='utf-8') as file_in:
+ return file_in.read()
+
+
+def create_dbc(src_dir: str, filename: str, output_path: str):
+ dbc_file_in = read_dbc(src_dir, filename)
+
+ includes = include_pattern.findall(dbc_file_in)
+
+ output_filename = filename.replace('.dbc', generated_suffix)
+ output_file_location = os.path.join(output_path, output_filename)
+
+ with open(output_file_location, 'w', encoding='utf-8') as dbc_file_out:
+ dbc_file_out.write('CM_ "AUTOGENERATED FILE, DO NOT EDIT";\n')
+
+ for include_filename in includes:
+ include_file_header = f'\n\nCM_ "Imported file {include_filename} starts here";\n'
+ dbc_file_out.write(include_file_header)
+
+ include_file = read_dbc(src_dir, include_filename)
+ dbc_file_out.write(include_file)
+
+ dbc_file_out.write(f'\nCM_ "{filename} starts here";\n')
+
+ core_dbc = include_pattern.sub('', dbc_file_in)
+ dbc_file_out.write(core_dbc)
+
+
+def create_all(output_path: str):
+ # clear out old DBCs
+ for f in glob.glob(f"{output_path}/*{generated_suffix}"):
+ os.remove(f)
+
+ # run python generator scripts first
+ for f in glob.glob(f"{generator_path}/*/*.py"):
+ subprocess.check_call(f)
+
+ for src_dir, _, filenames in os.walk(generator_path):
+ if src_dir == generator_path:
+ continue
+
+ #print(src_dir)
+ for filename in filenames:
+ if filename.startswith('_') or not filename.endswith('.dbc'):
+ continue
+
+ #print(filename)
+ create_dbc(src_dir, filename, output_path)
+
+
+if __name__ == "__main__":
+ create_all(iqdbc_root)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/gm/_community.dbc b/iqdbc_repo/iqdbc/dbc/generator/gm/_community.dbc
new file mode 100644
index 000000000..f9544e261
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/gm/_community.dbc
@@ -0,0 +1,15 @@
+BO_ 512 GAS_COMMAND: 6 NEO
+ SG_ GAS_COMMAND : 7|16@0+ (0.125677,-75.909) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.251976,-76.601) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (0.125677,-75.909) [0|1] "" NEO
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.251976,-76.601) [0|1] "" NEO
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" NEO
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" NEO
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" NEO
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/gm/gm_global_a_powertrain.dbc b/iqdbc_repo/iqdbc/dbc/generator/gm/gm_global_a_powertrain.dbc
new file mode 100644
index 000000000..5b1ae6a1e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/gm/gm_global_a_powertrain.dbc
@@ -0,0 +1,353 @@
+CM_ "IMPORT _community.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_: K16_BECM K73_TCIC K9_BCM K43_PSCM K17_EBCM K20_ECM K114B_HPCM NEO K124_ASCM EPB
+VAL_TABLE_ TurnSignals 2 "Right Turn" 1 "Left Turn" 0 "None" ;
+VAL_TABLE_ Intellibeam 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HighBeamsActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HighBeamsTemporary 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCLeadCar 1 "Present" 0 "Not Present" ;
+VAL_TABLE_ ACCCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ BrakePedalPressed 1 "Pressed" 0 "Depressed" ;
+VAL_TABLE_ DistanceButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ LKAButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_TABLE_ DriveModeButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ;
+VAL_TABLE_ ESPButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ DoorStatus 1 "Opened" 0 "Closed" ;
+VAL_TABLE_ SeatBeltStatus 1 "Latched" 0 "Unlatched" ;
+VAL_TABLE_ LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ;
+VAL_TABLE_ GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ;
+VAL_TABLE_ GasRegenCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HandsOffSWDetectionStatus 1 "Hands On" 0 "Hands Off" ;
+VAL_TABLE_ HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ;
+
+
+BO_ 189 EBCMRegenPaddle: 7 K17_EBCM
+ SG_ RegenPaddle : 7|4@0+ (1,0) [0|0] "" NEO
+
+BO_ 190 ECMAcceleratorPos: 6 K20_ECM
+ SG_ BrakePedalPos : 15|8@0+ (1,0) [0|0] "sticky" NEO
+ SG_ GasPedalAndAcc : 23|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 201 ECMEngineStatus: 8 K20_ECM
+ SG_ EngineTPS : 39|8@0+ (0.392156863,0) [0|100.000000065] "%" NEO
+ SG_ EngineRPM : 15|16@0+ (0.25,0) [0|0] "RPM" NEO
+ SG_ CruiseMainOn : 29|1@0+ (1,0) [0|1] "" NEO
+ SG_ BrakePressed : 40|1@0+ (1,0) [0|1] "" NEO
+ SG_ Standstill : 2|1@0+ (1,0) [0|1] "" NEO
+ SG_ CruiseActive : 31|2@0+ (1,0) [0|3] "" NEO
+
+BO_ 209 EBCMBrakePedalSensors: 7 K17_EBCM
+ SG_ Counter1 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ Counter2 : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ BrakePedalPosition1 : 5|14@0+ (1,0) [0|16383] "" XXX
+ SG_ BrakePedalPosition2 : 21|14@0- (-1,0) [0|16383] "" XXX
+ SG_ BrakeNormalized1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BrakeNormalized2 : 47|8@0- (-1,0) [0|255] "" XXX
+
+BO_ 241 EBCMBrakePedalPosition: 6 K17_EBCM
+ SG_ BrakePressed : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrakePedalPosition : 15|8@0+ (1,0) [0|255] "" NEO
+
+BO_ 298 BCMDoorBeltStatus: 8 K9_BCM
+ SG_ RearLeftDoor : 8|1@0+ (1,0) [0|0] "" NEO
+ SG_ FrontLeftDoor : 9|1@0+ (1,0) [0|0] "" NEO
+ SG_ FrontRightDoor : 10|1@0+ (1,0) [0|0] "" NEO
+ SG_ RearRightDoor : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ LeftSeatBelt : 12|1@0+ (1,0) [0|0] "" NEO
+ SG_ RightSeatBelt : 53|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 309 ECMPRDNL: 8 K20_ECM
+ SG_ PRNDL : 2|3@0+ (1,0) [0|0] "" NEO
+ SG_ ESPButton : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 320 BCMTurnSignals: 3 K9_BCM
+ SG_ TurnSignals : 19|2@0+ (1,0) [0|0] "" NEO
+ SG_ Intellibeam : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ HighBeamsActive : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ HighBeamsTemporary : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 322 BCMBlindSpotMonitor: 7 K9_BCM
+ SG_ LeftBSM : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RightBSM : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 328 PSCM_148: 1 K43_PSCM
+
+BO_ 381 ESPStatus: 6 K20_ECM
+ SG_ TractionControlOn : 5|1@0+ (1,0) [0|0] "" NEO
+ SG_ MSG17D_AccPower : 35|12@0- (1,0) [0|0] "" NEO
+
+BO_ 384 ASCMLKASteeringCmd: 4 NEO
+ SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdChecksum : 19|12@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdActive : 3|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmd : 2|11@0- (1,0) [0|0] "" NEO
+
+BO_ 388 PSCMStatus: 8 K43_PSCM
+ SG_ HandsOffSWDetectionMode : 20|2@0+ (1,0) [0|3] "" NEO
+ SG_ HandsOffSWlDetectionStatus : 21|1@0+ (1,0) [0|1] "" NEO
+ SG_ LKATorqueDeliveredStatus : 5|3@0+ (1,0) [0|7] "" NEO
+ SG_ LKADriverAppldTrq : 50|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO
+ SG_ LKATorqueDelivered : 18|11@0- (0.01,0) [0|1] "" NEO
+ SG_ LKATotalTorqueDelivered : 2|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO
+ SG_ RollingCounter : 38|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSCMStatusChecksum : 33|10@0+ (1,0) [0|1023] "" XXX
+
+BO_ 417 AcceleratorPedal: 7 XXX
+ SG_ AcceleratorPedal : 55|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 451 GasAndAcc: 8 XXX
+ SG_ GasPedalAndAcc2 : 55|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 452 AcceleratorPedal2: 8 XXX
+ SG_ CruiseState : 15|3@0+ (1,0) [0|7] "" NEO
+ SG_ AcceleratorPedal2 : 47|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 481 ASCMSteeringButton: 7 K124_ASCM
+ SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ ACCAlwaysOne : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO
+ SG_ DriveModeButton : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ RollingCounter : 33|2@0+ (1,0) [0|3] "" NEO
+ SG_ SteeringButtonChecksum : 43|12@0+ (1,0) [0|255] "" NEO
+
+BO_ 485 PSCMSteeringAngle: 8 K43_PSCM
+ SG_ SteeringWheelAngle : 15|16@0- (0.0625,0) [-2047|2047] "deg" NEO
+ SG_ SteeringWheelRate : 27|12@0- (1,0) [-2047|2047] "deg/s" NEO
+
+BO_ 489 EBCMVehicleDynamic: 8 K17_EBCM
+ SG_ BrakePedalPressed : 6|1@0+ (1,0) [0|0] "" NEO
+ SG_ LateralAcceleration : 3|10@0- (0.161,0) [-2047|2047] "m/s2" NEO
+ SG_ YawRate : 35|12@0- (0.625,0) [0|1] "" NEO
+ SG_ YawRate2 : 51|12@0- (0.0625,0) [-2047|2047] "grad/s" NEO
+
+BO_ 352 BCMImmobilizer: 5 K9_BCM
+ SG_ ImmobilizerInfo : 7|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 497 BCMGeneralPlatformStatus: 8 K9_BCM
+ SG_ SystemPowerMode : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ SystemBackUpPowerMode : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ParkBrakeSwActive : 36|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 500 SportMode: 6 XXX
+ SG_ SnowIceMode : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SportMode : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 501 ECMPRDNL2: 8 K20_ECM
+ SG_ TransmissionState : 48|4@1+ (1,0) [0|7] "" NEO
+ SG_ PRNDL2 : 27|4@0+ (1,0) [0|255] "" NEO
+ SG_ ManualMode : 41|1@0+ (1,0) [0|1] "" NEO
+
+BO_ 532 BRAKE_RELATED: 6 XXX
+ SG_ UserBrakePressure : 0|9@0+ (1,0) [0|511] "" XXX
+
+BO_ 560 EPBStatus: 8 EPB
+ SG_ EPBClosed : 12|1@0+ (1,0) [0|1] "" NEO
+
+BO_ 562 EBCMFrictionBrakeStatus: 8 K17_EBCM
+ SG_ FrictionBrakeUnavailable : 46|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 608 SPEED_RELATED: 8 XXX
+ SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ ClusterSpeed : 31|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM
+ SG_ HVBatteryVoltage : 31|12@0+ (0.125,0) [0|511.875] "V" NEO
+ SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO
+
+BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM
+ SG_ GasRegenAccType : 15|2@0+ (1,0) [0|3] "" NEO
+ SG_ GasRegenChecksum : 32|25@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenCmd : 10|19@0+ (0.125,-22534) [-22534|43001.875] "Nm" NEO
+
+BO_ 717 ASCM_2CD: 5 K124_ASCM
+
+BO_ 761 BRAKE_RELATED_2: 7 XXX
+ SG_ UserBrakePressure2 : 47|9@0+ (1,0) [0|511] "" XXX
+
+BO_ 789 EBCMFrictionBrakeCmd: 5 K124_ASCM
+ SG_ RollingCounter : 33|2@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO
+
+BO_ 800 AEBCmd: 6 K124_ASCM
+ SG_ RollingCounter : 5|2@0+ (1,0) [0|3] "" NEO
+ SG_ AEBChecksum : 27|20@0+ (1,0) [0|0] "" NEO
+ SG_ AEBCmdActive : 3|1@1+ (1,0) [0|1] "" NEO
+ SG_ AEBCmd : 2|11@0+ (1,0) [0|0] "" NEO
+ SG_ AEBCmd2 : 23|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 810 TCICOnStarGPSPosition: 8 K73_TCIC
+ SG_ GPSLongitude : 39|32@0+ (1,-2147483648) [0|0] "milliarcsecond" NEO
+ SG_ GPSLatitude : 7|32@0+ (1,0) [0|0] "milliarcsecond" NEO
+
+BO_ 840 EBCMWheelSpdFront: 5 K17_EBCM
+ SG_ FLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ FRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO
+
+BO_ 842 EBCMWheelSpdRear: 5 K17_EBCM
+ SG_ RLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ RRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ RRWheelDir : 34|3@0+ (1,0) [0|7] "" NEO
+ SG_ RLWheelDir : 37|3@0+ (1,0) [0|7] "" NEO
+
+BO_ 869 ASCM_365: 4 K124_ASCM
+
+BO_ 880 ASCMActiveCruiseControlStatus: 6 K124_ASCM
+ SG_ ACCCruiseState : 8|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACCLeadCar : 44|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCAlwaysOne2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCAlwaysOne : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCSpeedSetpoint : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" NEO
+ SG_ ACCGapLevel : 21|2@0+ (1,0) [0|0] "" NEO
+ SG_ ACCResumeButton : 1|1@0+ (1,0) [0|0] "" NEO
+ SG_ ACCCmdActive : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ FCWAlert : 41|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 967 EVDriveMode: 4 XXX
+ SG_ SinglePedalModeActive : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SinglePedalModeRisingEdge : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SinglePedalModeFallingEdge : 22|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 977 ECMCruiseControl: 8 K20_ECM
+ SG_ CruiseActive : 39|1@0+ (1,0) [0|3] "" NEO
+ SG_ CruiseSetSpeed : 19|12@0+ (0.0625,0) [0|0] "km/h" NEO
+
+BO_ 1001 ECMVehicleSpeed: 8 K20_ECM
+ SG_ VehicleSpeed : 7|16@0+ (0.01,0) [0|0] "mph" NEO
+ SG_ VehicleSpeedLeft : 39|16@0+ (0.01,0) [0|0] "mph" NEO
+
+BO_ 1033 ASCMKeepAlive: 7 NEO
+ SG_ ASCMKeepAliveAllZero : 7|56@0+ (1,0) [0|0] "" NEO
+
+BO_ 1034 ASCM_40A: 7 K124_ASCM
+
+BO_ 1217 ECMEngineCoolantTemp: 8 K20_ECM
+ SG_ EngineCoolantTemp : 23|8@0+ (1,-40) [0|0] "C" NEO
+
+BO_ 1249 VIN_Part2: 8 K20_ECM
+ SG_ VINPart2 : 7|64@0+ (1,0) [0|0] "" NEO
+
+BO_ 1296 ASCM_510: 4 K124_ASCM
+
+BO_ 1300 VIN_Part1: 8 K20_ECM
+ SG_ VINPart1 : 7|64@0+ (1,0) [0|0] "" NEO
+
+BO_ 1912 PSCM_778: 8 K43_PSCM
+
+BO_ 1930 ASCM_78A: 7 K124_ASCM
+
+BO_TX_BU_ 384 : K124_ASCM,NEO;
+BO_TX_BU_ 880 : NEO,K124_ASCM;
+BO_TX_BU_ 1033 : K124_ASCM,NEO;
+BO_TX_BU_ 715 : NEO,K124_ASCM;
+BO_TX_BU_ 789 : NEO,K124_ASCM;
+BO_TX_BU_ 800 : NEO,K124_ASCM;
+
+
+CM_ BU_ K16_BECM "Battery Energy Control Module";
+CM_ BU_ K73_TCIC "Telematics Communication Control Module";
+CM_ BU_ K9_BCM "Body Control Module";
+CM_ BU_ K43_PSCM "Power Steering Control Module";
+CM_ BU_ K17_EBCM "Electronic Brake Control Module";
+CM_ BU_ K20_ECM "Engine Control Module";
+CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module";
+CM_ BU_ NEO "Comma NEO";
+CM_ BU_ K124_ASCM "Active Safety Control Module";
+CM_ SG_ 381 MSG17D_AccPower "Need to investigate";
+CM_ BO_ 190 "Length varies from 6 to 8 bytes by car";
+CM_ SG_ 190 GasPedalAndAcc "ACC baseline is 62";
+CM_ SG_ 322 LeftBSM "For some cars, this can only be when the blinker is also active";
+CM_ SG_ 322 RightBSM "For some cars, this can only be when the blinker is also active";
+CM_ SG_ 352 ImmobilizerInfo "Non-zero when ignition or accessory mode";
+CM_ SG_ 451 GasPedalAndAcc2 "ACC baseline is 62";
+CM_ SG_ 481 ACCAlwaysOne "Usually 1 if the car is equipped with ACC";
+CM_ SG_ 562 FrictionBrakeUnavailable "1 when ACC brake control is unavailable. Stays high if brake command messages are blocked for a period of time";
+CM_ SG_ 497 SystemPowerMode "Describes ignition";
+CM_ SG_ 497 SystemBackUpPowerMode "Describes ignition + preconditioning mode, noisy";
+CM_ SG_ 501 PRNDL2 "When ManualMode is Active, Value is 13=L1 12=L2 11=L3 ... 5=Full 70kW Paddle Regen Unlocked for Gen2 Bolts 4=L10";
+CM_ SG_ 532 UserBrakePressure "can be lower than other brake position signals when the brakes are pre-filled from ACC braking and the user presses on the brakes. user-only pressure?";
+CM_ SG_ 608 ClusterSpeed "Cluster speed signal seems to match dash on newer cars, but is a lower rate and can be noisier.";
+CM_ SG_ 761 UserBrakePressure2 "Similar to BRAKE_RELATED->UserBrakePressure";
+CM_ SG_ 1001 VehicleSpeed "Spinouts show here on 2wd. Speed derived from right front wheel (drive tire)";
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+BA_ "UseGMParameterIDs" 0;
+VAL_ 497 SystemPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off";
+VAL_ 497 SystemBackUpPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off";
+VAL_ 481 DistanceButton 1 "Active" 0 "Inactive" ;
+VAL_ 481 LKAButton 1 "Active" 0 "Inactive" ;
+VAL_ 481 ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_ 481 DriveModeButton 1 "Active" 0 "Inactive" ;
+VAL_ 452 CruiseState 4 "Standstill" 3 "Faulted" 1 "Active" 0 "Off" ;
+VAL_ 309 PRNDL 3 "R" 2 "D" 1 "N" 0 "P" ;
+VAL_ 309 ESPButton 1 "Active" 0 "Inactive" ;
+VAL_ 384 LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 842 RRWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault";
+VAL_ 842 RLWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault";
+VAL_ 880 ACCCruiseState 2 "Adaptive" 3 "Adaptive" 4 "Non-adaptive" 5 "Non-adaptive" ;
+VAL_ 880 ACCLeadCar 1 "Present" 0 "Not Present" ;
+VAL_ 880 ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ;
+VAL_ 880 ACCResumeButton 1 "Pressed" 0 "Depressed" ;
+VAL_ 880 ACCCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 388 HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ;
+VAL_ 388 HandsOffSWlDetectionStatus 1 "Hands On" 0 "Hands Off" ;
+VAL_ 388 LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ;
+VAL_ 489 BrakePedalPressed 1 "Pressed" 0 "Depressed" ;
+VAL_ 715 GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ;
+VAL_ 715 GasRegenCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 320 Intellibeam 1 "Active" 0 "Inactive" ;
+VAL_ 320 HighBeamsActive 1 "Active" 0 "Inactive" ;
+VAL_ 320 HighBeamsTemporary 1 "Active" 0 "Inactive" ;
+VAL_ 501 PRNDL2 7 "L3" 6 "L" 5 "L2" 4 "D" 3 "N" 2 "R" 1 "P" 0 "Shifting";
+VAL_ 501 TransmissionState 11 "Shifting" 10 "Reverse" 9 "Forward" 8 "Disengaged";
+VAL_ 501 ManualMode 1 "Active" 0 "Inactive"
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_2018.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_2018.dbc
new file mode 100644
index 000000000..d5171fdef
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_2018.dbc
@@ -0,0 +1,220 @@
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX
+ SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 232 BRAKE_HOLD: 7 XXX
+ SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX
+ SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+BO_ 446 BRAKE_MODULE: 3 VSA
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS
+ SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 545 ECON_STATUS: 6 SCM
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY
+
+BO_ 576 LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 577 LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 579 RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 580 RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 927 RADAR_HUD: 8 RADAR
+ SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
+ SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
+ SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
+ SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 13274 LKAS_HUD_A: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+BO_ 13275 LKAS_HUD_B: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+
+CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1";
+CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded";
+CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded";
+CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded";
+CM_ SG_ 577 LINE_DASHED "1 = line is dashed";
+CM_ SG_ 577 LINE_SOLID "1 = line is solid";
+
+VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active";
+VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal";
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ;
+VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN";
+VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_radar_acc.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_radar_acc.dbc
new file mode 100644
index 000000000..0a7f75f79
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_radar_acc.dbc
@@ -0,0 +1,30 @@
+BO_ 479 ACC_CONTROL: 8 EON
+ SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX
+ SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX
+ SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX
+ SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 495 ACC_CONTROL_ON: 8 XXX
+ SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX
+ SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled";
+CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event";
+CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event";
+CM_ SG_ 479 AEB_PREPARE "set 1s before AEB";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_standstill.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_standstill.dbc
new file mode 100644
index 000000000..298009793
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_bosch_standstill.dbc
@@ -0,0 +1,7 @@
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_community.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_community.dbc
new file mode 100644
index 000000000..49a3742b5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_community.dbc
@@ -0,0 +1,15 @@
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_gearbox_common.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_gearbox_common.dbc
new file mode 100644
index 000000000..6cd9ccb62
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_gearbox_common.dbc
@@ -0,0 +1,41 @@
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_honda_common.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_honda_common.dbc
new file mode 100644
index 000000000..fdf86ec7d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_honda_common.dbc
@@ -0,0 +1,221 @@
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_lkas_hud_5byte.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_lkas_hud_5byte.dbc
new file mode 100644
index 000000000..12c3a48c9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_lkas_hud_5byte.dbc
@@ -0,0 +1,28 @@
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_lkas_hud_8byte.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_lkas_hud_8byte.dbc
new file mode 100644
index 000000000..d2dbed64d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_lkas_hud_8byte.dbc
@@ -0,0 +1,29 @@
+BO_ 829 LKAS_HUD: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+VAL_ 829 LANE_LINES 7 "both_lines_green" 6 "both_lines_white" 2 "left_line_white" 0 "no_lines";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_common.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_common.dbc
new file mode 100644
index 000000000..12896d8f6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_common.dbc
@@ -0,0 +1,64 @@
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_scm_group_a.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_scm_group_a.dbc
new file mode 100644
index 000000000..7b25e2406
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_scm_group_a.dbc
@@ -0,0 +1,20 @@
+BO_ 660 SCM_FEEDBACK: 8 SCM
+ SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 422 SCM_BUTTONS: 8 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON
+ SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON
+
+VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
+VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_scm_group_b.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_scm_group_b.dbc
new file mode 100644
index 000000000..ce8d2c482
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_nidec_scm_group_b.dbc
@@ -0,0 +1,20 @@
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_a.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_a.dbc
new file mode 100644
index 000000000..87bd96948
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_a.dbc
@@ -0,0 +1,18 @@
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_b.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_b.dbc
new file mode 100644
index 000000000..0b39c15eb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_b.dbc
@@ -0,0 +1,17 @@
+BO_ 404 STEERING_CONTROL: 4 EON
+ SG_ STEER_TORQUE : 7|12@0- (1,0) [-768|768] "" EPS
+ SG_ SET_ME_X00 : 11|4@0+ (1,0) [0|15] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00_2 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS
+
+BO_ 399 STEER_STATUS: 6 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|12@0- (-1,0) [-2047.5|2047.5] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_CONTROL_ACTIVE : 36|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_STATUS : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_c.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_c.dbc
new file mode 100644
index 000000000..6dc4b6dcb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_c.dbc
@@ -0,0 +1,17 @@
+BO_ 404 STEERING_CONTROL: 4 EON
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_TORQUE : 7|16@0- (-1,0) [-32767|32767] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-2985|2985] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_d_ext.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_d_ext.dbc
new file mode 100644
index 000000000..855a00e04
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_control_d_ext.dbc
@@ -0,0 +1,19 @@
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 400 STEER_STATUS: 5 EPS
+ SG_ STEER_TORQUE_SENSOR : 0|9@1- (1,0) [-256|256] "" XXX
+ SG_ LIN_INTERFACE_FATAL_ERROR : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ LATE_MESSAGE : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_STATUS : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ALLOWED : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_APPLIED : 23|16@0- (1,0) [0|511] "" XXX
+
+VAL_ 400 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_a.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_a.dbc
new file mode 100644
index 000000000..52805d622
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_a.dbc
@@ -0,0 +1,9 @@
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_b.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_b.dbc
new file mode 100644
index 000000000..35e9b2752
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_b.dbc
@@ -0,0 +1,5 @@
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_c.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_c.dbc
new file mode 100644
index 000000000..8d70ac936
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/_steering_sensors_c.dbc
@@ -0,0 +1,7 @@
+CM_ "steer_angle_rate is negative vs _steering_sensors_b.dbc";
+
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/acura_ilx_2016_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/acura_ilx_2016_can.dbc
new file mode 100644
index 000000000..d39ac8f72
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/acura_ilx_2016_can.dbc
@@ -0,0 +1,8 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_a.dbc";
+CM_ "IMPORT _steering_sensors_b.dbc";
+CM_ "IMPORT _steering_control_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/acura_rdx_2018_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/acura_rdx_2018_can.dbc
new file mode 100644
index 000000000..aff97788c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/acura_rdx_2018_can.dbc
@@ -0,0 +1,16 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_a.dbc";
+CM_ "IMPORT _steering_sensors_b.dbc";
+CM_ "IMPORT _steering_control_b.dbc";
+
+BO_ 392 GEARBOX_AUTO: 6 XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON
+
+VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ;
+VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/acura_rdx_2020_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/acura_rdx_2020_can.dbc
new file mode 100644
index 000000000..9c469e3e6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/acura_rdx_2020_can.dbc
@@ -0,0 +1,7 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _bosch_2018.dbc";
+CM_ "IMPORT _bosch_radar_acc.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _bosch_standstill.dbc";
+CM_ "IMPORT _steering_sensors_b.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc
new file mode 100644
index 000000000..ee3490877
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc
@@ -0,0 +1,34 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_a.dbc";
+CM_ "IMPORT _steering_sensors_b.dbc";
+CM_ "IMPORT _steering_control_d_ext.dbc";
+
+BO_ 392 GEARBOX_AUTO: 6 XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON
+
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ;
+VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_bosch_radarless.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_bosch_radarless.dbc
new file mode 100644
index 000000000..f57265f58
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_bosch_radarless.dbc
@@ -0,0 +1,51 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _bosch_2018.dbc";
+CM_ "IMPORT _lkas_hud_8byte.dbc";
+CM_ "IMPORT _bosch_standstill.dbc";
+CM_ "IMPORT _steering_sensors_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
+
+BO_ 456 ACC_CONTROL: 8 XXX
+ SG_ ACCEL_COMMAND : 7|12@0- (0.01,0) [0|0] "m/s^2" XXX
+ SG_ BRAKE_REQUEST : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ BOH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@1+ (1,0) [0|7] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_1 : 24|1@1+ (1,0) [0|3] "" XXX
+ SG_ FCW_2 : 54|1@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 467 CRUISE_FAULT_STATUS: 8 XXX
+ SG_ CRUISE_FAULT : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 477 GEARBOX_ALT_2: 8 XXX
+ SG_ GEAR_MT : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 495 SPEED_LIMIT_DASH_DISPLAY: 8 ADAS
+ SG_ SPEED_LIMIT : 47|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 254913108 LKAS_HUD_2: 8 ADAS
+ SG_ COUNTER_2 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_BOH_1 : 15|6@0+ (1,0) [0|63] "" XXX
+ SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_BOH_2 : 30|5@0+ (1,0) [0|31] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+CM_ SG_ 456 IDLESTOP_ALLOW "allows car to turn off engine at a standstill";
+CM_ SG_ 456 STANDSTILL "set to 1 when camera requests -4.0 m/s^2";
+CM_ SG_ 495 SPEED_LIMIT "Defaults to 0xFF if no speed limit found";
+
+VAL_ 477 GEAR_MT 14 "reverse" 6 "6th" 5 "5th" 4 "4th" 3 "3rd" 2 "2nd" 1 "1st" 0 "Clutch";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc
new file mode 100644
index 000000000..b6be281bb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc
@@ -0,0 +1,7 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _bosch_2018.dbc";
+CM_ "IMPORT _bosch_radar_acc.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _bosch_standstill.dbc";
+CM_ "IMPORT _steering_sensors_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc
new file mode 100644
index 000000000..f79f42f66
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc
@@ -0,0 +1,19 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_b.dbc";
+CM_ "IMPORT _steering_sensors_a.dbc";
+CM_ "IMPORT _steering_control_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
+
+BO_ 493 HUD_SETTING: 5 XXX
+ SG_ IMPERIAL_UNIT : 5|1@0+ (1,0) [0|1] "" EON
+
+BO_ 545 ECON_STATUS: 6 XXX
+ SG_ ECON_ON_2 : 37|2@0+ (1,0) [0|3] "" EON
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+
+VAL_ 545 ECON_ON_2 0 "off" 3 "on" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc
new file mode 100644
index 000000000..c65fa1f7b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc
@@ -0,0 +1,24 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_b.dbc";
+CM_ "IMPORT _steering_sensors_a.dbc";
+CM_ "IMPORT _steering_control_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
+
+BO_ 768 VEHICLE_STATE: 8 ADAS
+ SG_ SET_ME_XF9 : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ VEHICLE_SPEED : 15|8@0+ (1,0) [0|255] "kph" Vector__XXX
+ SG_ SET_ME_X8A : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_XD0 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SALTED_WITH_IDX : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 769 VEHICLE_STATE2: 8 ADAS
+ SG_ SET_ME_X5D : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X02 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X5F : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_common_canfd.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_common_canfd.dbc
new file mode 100644
index 000000000..cd7efe7be
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_common_canfd.dbc
@@ -0,0 +1,7 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _bosch_2018.dbc";
+CM_ "IMPORT _bosch_radar_acc.dbc";
+CM_ "IMPORT _lkas_hud_8byte.dbc";
+CM_ "IMPORT _bosch_standstill.dbc";
+CM_ "IMPORT _steering_sensors_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc
new file mode 100644
index 000000000..363b59581
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc
@@ -0,0 +1,10 @@
+BO_ 318291879 BSM_STATUS_RIGHT: 8 XXX
+ SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 318291615 BSM_STATUS_LEFT: 8 XXX
+ SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX
+
+VAL_ 318291879 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off";
+VAL_ 318291615 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc
new file mode 100644
index 000000000..0ecc665e9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc
@@ -0,0 +1,8 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_a.dbc";
+CM_ "IMPORT _steering_sensors_b.dbc";
+CM_ "IMPORT _steering_control_b.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc
new file mode 100644
index 000000000..4da20adea
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc
@@ -0,0 +1,14 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _bosch_2018.dbc";
+CM_ "IMPORT _bosch_radar_acc.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _steering_sensors_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
+
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ BRAKE_ERROR_1 : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+CM_ BO_ 432 "Slightly conflicting definition with common Bosch standstill message, this one could be broken";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc
new file mode 100644
index 000000000..377c6650e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc
@@ -0,0 +1,8 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_b.dbc";
+CM_ "IMPORT _steering_sensors_b.dbc";
+CM_ "IMPORT _steering_control_a.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc
new file mode 100644
index 000000000..4dc4ea5ca
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc
@@ -0,0 +1,7 @@
+CM_ "IMPORT _honda_common.dbc";
+CM_ "IMPORT _nidec_common.dbc";
+CM_ "IMPORT _lkas_hud_5byte.dbc";
+CM_ "IMPORT _nidec_scm_group_a.dbc";
+CM_ "IMPORT _steering_sensors_c.dbc";
+CM_ "IMPORT _steering_control_c.dbc";
+CM_ "IMPORT _gearbox_common.dbc";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/.gitignore b/iqdbc_repo/iqdbc/dbc/generator/hyundai/.gitignore
new file mode 100644
index 000000000..9f93c9250
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/.gitignore
@@ -0,0 +1,3 @@
+hyundai_kia_mando_front_radar.dbc
+hyundai_kia_denso_front_radar.dbc
+hyundai_kia_mando_corner_radar.dbc
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/_hyundai_common.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/_hyundai_common.dbc
new file mode 100644
index 000000000..52a06931f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/_hyundai_common.dbc
@@ -0,0 +1,235 @@
+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_ACTIVE : 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_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ VALUE104 : 104|8@1+ (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/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd.dbc
new file mode 100644
index 000000000..26aa743d4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd.dbc
@@ -0,0 +1,1107 @@
+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
+
+BO_ 64 GEAR_ALT: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ GEAR_STEP : 67|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 76|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 69 GEAR: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ RIGHT_PADDLE : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_PADDLE : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_STEP : 146|5@1+ (1,0) [0|31] "" XXX
+ SG_ GEAR_STEP1 : 154|5@1+ (1,0) [0|31] "" XXX
+
+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_ACTIVE : 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_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ DampingGain : 104|8@1+ (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_ 96 ESP_STATUS: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ TRACTION_AND_STABILITY_CONTROL : 42|3@1+ (1,0) [0|63] "" XXX
+ SG_ BRAKE_PRESSURE : 128|11@1+ (1,0) [0|2047] "" XXX
+ SG_ BRAKE_PRESSED : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ AUTO_HOLD : 192|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 101 BRAKE: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_LIGHT : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_POSITION : 40|16@1- (1,0) [0|65535] "" XXX
+ SG_ BRAKE_PRESSED : 57|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 112 GEAR_ALT_2: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 60|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 160 WHEEL_SPEEDS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ MOVING_FORWARD : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVING_BACKWARD : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVING_FORWARD2 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVING_BACKWARD2 : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ 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_ 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|3] "" 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
+
+BO_ 234 MDPS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKA_ACTIVE : 48|1@0+ (1,0) [0|16777215] "" XXX
+ SG_ LKA_FAULT : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_OUT_TORQUE : 64|12@1+ (0.1,-204.8) [0|65535] "" XXX
+ SG_ STEERING_COL_TORQUE : 80|13@1+ (1,-4095) [0|4095] "" XXX
+ SG_ STEERING_ANGLE : 96|16@1- (-0.1,0) [0|255] "deg" XXX
+ SG_ STEERING_ANGLE_2 : 128|16@1- (-0.1,0) [0|65535] "deg" XXX
+ SG_ LFA2_ACTIVE : 145|2@0+ (1,0) [0|3] "" XXX
+ SG_ LFA2_FAULT : 149|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 159|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 167|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 175|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 256 ACCELERATOR_BRAKE_ALT: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACCELERATOR_PEDAL_PRESSED : 176|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 261 ACCELERATOR_ALT: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ ACCELERATOR_PEDAL : 103|10@1+ (0.25,0) [0|1022] "" XXX
+
+BO_ 267 CRUISE_BUTTONS_ALT2: 16 XXX
+ SG_ CRUISE_BUTTONS : 83|4@0+ (1,0) [0|15] "" XXX
+ SG_ LFA_BTN : 87|1@0+ (1,0) [0|1] "" 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_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" 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|1] "" XXX
+ SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX
+ SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" 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
+
+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_ LKA_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" 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|1] "" XXX
+ SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX
+ SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 304 GEAR_SHIFTER: 16 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ PARK_BUTTON : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX
+ SG_ GEAR : 64|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 1079 TRAILER_STATUS: 8 XXX
+ SG_ TRAILER_CONNECTED : 0|1@1+ (1,0) [0|1] "" 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_ NEW_SIGNAL_1 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|8@0+ (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
+ SG_ NEW_SIGNAL_3 : 95|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 102|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 353 ADRV_0x161: 32 ADRV
+ 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_ FCA_IMAGE : 42|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_ 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|15] "" XXX
+ SG_ LANELINE_CURVATURE : 100|4@1+ (1,0) [0|31] "" XXX
+ SG_ LANELINE_CURVATURE_DIRECTION : 104|1@0+ (1,0) [0|1] "" 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|31] "" XXX
+ SG_ ALERTS_3 : 139|5@1+ (1,0) [0|31] "" XXX
+ SG_ ALERTS_4 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ ALERTS_5 : 152|5@1+ (1,0) [0|31] "" 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_ SETSPEED_HUD : 181|3@1+ (1,0) [0|7] "" 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_ vSetDis : 200|8@1+ (1,0) [0|255] "" XXX
+ SG_ SETSPEED : 208|4@1+ (1,0) [0|7] "" XXX
+ SG_ HDA_ICON : 212|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX
+ SG_ NAV_ICON : 220|3@1+ (1,0) [0|7] "" XXX
+ SG_ LFA_ICON : 224|3@1+ (1,0) [0|7] "" XXX
+ SG_ LCA_LEFT_ICON : 228|3@1+ (1,0) [0|7] "" XXX
+ SG_ LCA_RIGHT_ICON : 232|3@1+ (1,0) [0|7] "" 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
+
+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|1@0+ (1,0) [0|1] "" XXX
+ SG_ FF_DETECT : 64|5@1+ (1,0) [0|31] "" XXX
+ SG_ FF_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ FF_LATERAL : 80|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ FF_DETECT_ALT : 88|5@1+ (1,0) [0|31] "" XXX
+ SG_ FF_DISTANCE_ALT : 93|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ FF_LATERAL_ALT : 104|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ LF_DETECT : 112|5@1+ (1,0) [0|31] "" XXX
+ SG_ LF_DETECT_DISTANCE : 117|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LF_DETECT_LATERAL : 128|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ RF_DETECT : 136|5@1+ (1,0) [0|31] "" XXX
+ SG_ RF_DETECT_DISTANCE : 141|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ RF_DETECT_LATERAL : 152|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ LR_DETECT : 163|5@1+ (1,0) [0|31] "" XXX
+ SG_ LR_DETECT_DISTANCE : 175|8@0+ (0.1,0) [0|255] "" XXX
+ SG_ LR_DETECT_LATERAL : 176|7@1+ (0.1,0) [0|127] "" XXX
+ SG_ RR_DETECT : 192|5@1+ (1,0) [0|31] "" XXX
+ SG_ RR_DETECT_DISTANCE : 197|8@1+ (0.1,0) [0|255] "" XXX
+ SG_ RR_DETECT_LATERAL : 205|7@1+ (0.1,0) [0|127] "" 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
+
+BO_ 357 SPAS1: 24 APRK
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX
+ SG_ NEW_SIGNAL_1 : 96|16@1- (0.1,0) [0|0] "" XXX
+
+BO_ 362 SPAS2: 32 APRK
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ BLINKER_CONTROL : 133|3@1+ (1,0) [0|0] "" XXX
+
+BO_ 373 TCS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 24|7@1+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_9 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ aBasis : 32|11@1+ (0.01,-10.23) [0|7] "m/s^2" XXX
+ SG_ NEW_SIGNAL_1 : 47|5@0+ (1,0) [0|31] "" XXX
+ SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_2 : 63|5@0+ (1,0) [0|31] "" XXX
+ SG_ SCC_OptTyp : 64|2@1+ (1,0) [0|0] "" AWD,EMS,FR_CMR,HCU,H_U_MM,TCU,VCU,vBDM
+ SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 69|1@0+ (1,0) [0|1] "" XXX
+ SG_ SCC_ReqLimSta : 70|2@1+ (1,0) [0|0] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM
+ SG_ ESC_StdStillVal : 72|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM
+ SG_ BrakeLight : 74|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESC_DclEnblReq : 76|2@1+ (1,0) [0|3] "" AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM
+ SG_ NEW_SIGNAL_5 : 79|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 80|1@0+ (1,0) [0|1] "" XXX
+ SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_20 : 82|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_11 : 83|1@0+ (1,0) [0|1] "" XXX
+ SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_10 : 85|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESC_PrkBrkActvSta : 86|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,RR_C_RDR,TCU,vBDM
+ SG_ NEW_SIGNAL_12 : 95|8@0+ (1,0) [0|255] "" XXX
+ SG_ FCA_EquipSta : 96|2@1+ (1,0) [0|3] "" ADAS_DRV,FR_CMR,H_U_MM,vBDM
+ SG_ FCA_AvlblSta : 98|2@1+ (1,0) [0|3] "" ADAS_DRV,AFCU_DRV,CLU,Dummy,FR_CMR,H_U_MM,vBDM
+ SG_ NEW_SIGNAL_13 : 103|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 111|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 119|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_16 : 127|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 128|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" 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_ NEW_SIGNAL_18 : 143|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_19 : 151|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 183|16@0+ (1,0) [0|65535] "" 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_ 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|12@1+ (0.1,-170) [-16.4|34.7] "m/s" XXX
+ SG_ ACC_ObjLatPos : 47|9@1- (0.1,-20) [0|511] "" XXX
+ SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SysFailState : 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_ TakeOverReq : 73|2@0+ (1,0) [0|3] "" XXX
+ SG_ InfoDisplay : 74|3@1+ (1,0) [0|7] "" XXX
+ SG_ DriverAlert : 77|2@1+ (1,0) [0|3] "" XXX
+ SG_ ObjDistLevel : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ DISTANCE_SETTING : 88|4@1+ (1,0) [0|15] "" XXX
+ SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX
+ SG_ NSCCOper : 104|2@1+ (1,0) [0|3] "" XXX
+ SG_ NSCCOnOff : 106|2@1+ (1,0) [0|3] "" XXX
+ SG_ HUD_LEAD_INFO : 108|3@1+ (1,0) [0|7] "" XXX
+ SG_ DriveMode : 112|3@1+ (1,0) [0|7] "" XXX
+ SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
+ SG_ aReqRaw : 140|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
+ SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX
+ SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX
+ SG_ AccelLimitBandUpper : 173|6@0+ (0.02,0) [0|63] "" XXX
+ SG_ AccelLimitBandLower : 181|6@0+ (0.02,0) [0|63] "" XXX
+ SG_ StopReq : 185|2@0+ (1,0) [0|3] "" XXX
+ SG_ CRUSE_INFO_SET_2 : 189|2@0+ (1,0) [0|3] "" XXX
+ SG_ TARGET_DISTANCE : 192|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX
+ SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX
+
+BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_ME_1 : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ DISTANCE_UNIT : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|3@1+ (1,0) [0|7] "" XXX
+ SG_ ADAPTIVE_CRUISE_MAIN_BTN : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_BUTTONS : 36|3@1+ (1,0) [0|4] "" XXX
+ SG_ LFA_BTN : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ NORMAL_CRUISE_MAIN_BTN : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 42|2@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_2 : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ CLU_SPEED : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 437 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_QUAL : 24|3@1+ (1,0) [0|7] "" XXX
+ SG_ LEFT_LDW : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ LEFT_POSITION : 29|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX
+ SG_ LEFT_HEADING : 43|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX
+ SG_ LEFT_CURVATURE : 64|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX
+ SG_ LEFT_CURVATURE_DERIVATIVE : 80|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX
+ SG_ RIGHT_QUAL : 96|3@1+ (1,0) [0|7] "" XXX
+ SG_ RIGHT_LDW : 99|2@1+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_POSITION : 101|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX
+ SG_ RIGHT_HEADING : 115|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX
+ SG_ RIGHT_CURVATURE : 128|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX
+ SG_ RIGHT_CURVATURE_DERIVATIVE : 144|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX
+ SG_ LEAD : 192|7@1+ (1,0) [0|127] "" XXX
+ SG_ LEAD_SPEED : 200|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ LEAD_DISTANCE : 212|12@1+ (0.05,0) [0|204.75] "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_ 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_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_LEFT_TWO : 30|1@0+ (1,0) [0|3] "" XXX
+ SG_ INDICATOR_RIGHT_TWO : 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_ INDICATOR_LEFT_THREE : 128|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_RIGHT_THREE : 130|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_LEFT_FOUR : 138|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_RIGHT_FOUR : 141|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 463 CRUISE_BUTTONS: 8 XXX
+ SG_ _CHECKSUM : 0|8@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX
+ SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX
+ SG_ ADAPTIVE_CRUISE_MAIN_BTN : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ NORMAL_CRUISE_MAIN_BTN : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ LFA_BTN : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_PADDLE : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_PADDLE : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_1_ : 40|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 474 ADRV_0x1da: 32 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_22 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_41 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 480 LFAHDA_CLUSTER: 16 FR_CMR
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HDA_OptUsmSta : 24|3@1+ (1,0) [0|0] "" CGW
+ SG_ LFA_OptUsmSta : 27|3@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_CntrlModSta : 30|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_InfoPUDis : 32|3@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_AutoSetSpdSta : 35|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_AutoSetSpdUpdtSta : 37|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_AutoSetSpdVal : 39|8@1+ (1,0) [0|0] "km/h" CGW
+ SG_ HDA_LFA_SymSta : 47|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_LFA_WrnSnd : 49|2@1+ (1,0) [0|0] "" Dummy
+ SG_ HDA_InfoPUDis1 : 51|3@1+ (1,0) [0|7] "" CLU,CGW
+ SG_ HDA_TDMRMDclReq : 54|2@1+ (1,0) [0|3] "" Dummy
+
+BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 490 ADRV_0x1ea: 32 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINK_HOLD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINK_HOLD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ HDA_MODE2 : 32|3@1+ (1,0) [0|3] "" XXX
+ SG_ LANE_LEFT : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_6 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_RIGHT : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ LANE_CHANGING : 45|3@0+ (1,0) [0|1] "" XXX
+ SG_ LF_DETECT_DISTANCE : 46|11@1+ (0.1,0) [0|2047] "" XXX
+ SG_ LF_DETECT_LATERAL : 70|7@0+ (0.1,0) [0|127] "" XXX
+ SG_ LF_DETECT : 74|3@0+ (1,0) [0|7] "" XXX
+ SG_ RF_DETECT_DISTANCE : 75|11@1+ (0.1,0) [0|2047] "" XXX
+ SG_ RF_DETECT_LATERAL : 94|7@0+ (0.1,0) [0|127] "" XXX
+ SG_ RF_DETECT : 98|3@0+ (1,0) [0|7] "" XXX
+ SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ LR_DETECT_DISTANCE : 139|8@1+ (0.1,0) [0|511] "m" XXX
+ SG_ LR_DETECT_LATERAL : 152|6@1+ (0.1,0) [0|63] "" XXX
+ SG_ LR_DETECT : 162|3@0+ (1,0) [0|1] "" XXX
+ SG_ RR_DETECT_DISTANCE : 163|8@1+ (0.1,0) [0|511] "m" XXX
+ SG_ RR_DETECT_LATERAL : 172|6@1+ (0.1,0) [0|63] "" XXX
+ SG_ RR_DETECT : 186|3@0+ (1,0) [0|1] "" XXX
+ SG_ AUTOLANECHANGE_MSG : 207|4@0+ (1,0) [0|3] "" XXX
+ SG_ LANELINE_CURVATURE : 208|4@1+ (1,0) [0|31] "" XXX
+ SG_ LANELINE_CURVATURE_DIRECTION : 212|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANELINE_LEFT_POSITION : 239|8@0+ (1,0) [0|255] "" XXX
+ SG_ LANELINE_RIGHT_POSITION : 247|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 248|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 506 CLUSTER_SPEED_LIMIT: 32 CAM
+ 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_ NEW_SIGNAL_2 : 122|3@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_ NEW_SIGNAL_4 : 143|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 146|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_1 : 147|7@1+ (1,0) [0|127] "" XXX
+ SG_ SCHOOL_ZONE : 155|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPEED_LIMIT_4 : 215|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 223|8@0+ (1,0) [0|255] "" 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
+
+BO_ 512 ADRV_0x200: 8 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_E1 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ TauGapSet : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_2 : 35|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_1 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ TauGapSet_ : 42|3@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|5@0+ (1,0) [0|31] "" 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_ 560 HCU_STATUS_230: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HYBRID_POWER_FLOW_MODE : 170|4@1+ (1,0) [0|15] "" XXX
+
+CM_ BO_ 560 "Hyundai/Kia CAN-FD hybrid power-flow status observed on ECAN at 10 Hz; ACAN 0x230/DLC16 is an unrelated radar frame.";
+CM_ SG_ 560 HYBRID_POWER_FLOW_MODE "Reverse-engineered enum; observed values 1, 2, and 6 correspond to the OEM EV indicator being on.";
+
+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_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 687 STEER_TOUCH_2AF: 8 XXX
+ SG_ CHECKSUM_ : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER_ : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ TOUCH_DETECT : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ TOUCH1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ TOUCH2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 63|8@0+ (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
+ SG_ MSLA_STATUS : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 837 ADRV_0x345: 8 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_15 : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 866 CAM_0x362: 32 CAMERA
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" 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
+ SG_ RIGHT_BSD : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BSD : 28|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 928 TPMS: 16 XXX
+ SG_ PRESSURE_FL : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ PRESSURE_FR : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ PRESSURE_RL : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ PRESSURE_RR : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ STATUS_TPMS : 66|3@0+ (1,0) [0|3] "" XXX
+ SG_ UNIT : 68|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 961 BLINKER_STALKS: 8 XXX
+ SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAM_FORWARD : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ HIGHBEAM_BACKWARD : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 32|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 995 BLINKERS_ALT: 16 XXX
+ SG_ LEFT_BLINKER : 74|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 76|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LAMP_ALT : 89|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LAMP : 90|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP_ALT : 91|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP : 92|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 95|1@0+ (1,0) [0|1] "" XXX
+ SG_ BLINKER_ACTIVE : 97|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1041 DOORS_SEATBELTS: 8 XXX
+ SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ DRIVER_DOOR : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ PASSENGER_DOOR : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_REAR_DOOR : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ PASSENGER_REAR_DOOR : 56|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 BLINKERS: 8 XXX
+ SG_ LEFT_STALK : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_STALK : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ LEFT_LAMP : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LAMP_ALT : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP_ALT : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ USE_ALT_LAMP : 62|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1052 LIGHT_SENSOR: 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_ IS_DARK : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ LIGHT_LEVEL : 24|10@1+ (1,0) [0|1023] "" XXX
+
+BO_ 1144 DRIVE_MODE: 8 XXX
+ SG_ DRIVE_MODE : 0|16@1+ (1,-61611) [0|61611] "" XXX
+ SG_ DRIVE_MODE2 : 28|3@1+ (1,0) [1|3] "" XXX
+
+BO_ 1151 HVAC_TOUCH_BUTTONS: 8 XXX
+ SG_ AUTO_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ SYNC_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FR_DEFROST_BUTTON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RR_DEFROST_BUTTON : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ FAN_SPEED_UP_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ FAN_SPEED_DOWN_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ AIR_DIRECTION_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ AC_BUTTON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_ONLY_BUTTON : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ RECIRC_BUTTON : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEAT_BUTTON : 52|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1187 HDA_INFO_4A3: 8 XXX
+ SG_ LinkClass : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ Frwinfo : 3|3@1+ (1,0) [0|7] "" XXX
+ SG_ SpeedUnit : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ SPEED_LIMIT : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ CountryCode : 16|10@1+ (1,0) [0|1023] "" XXX
+ SG_ MapSource : 27|3@1+ (1,0) [0|7] "" XXX
+ SG_ TollExist : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ TunnelExist : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|24@0+ (1,0) [0|16777215] "" XXX
+
+BO_ 1204 NEW_MSG_4B4: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_7 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1209 NEW_MSG_4B9: 8 XXX
+ SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1214 NEW_MSG_4BE: 8 XXX
+ SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1240 CLUSTER_INFO: 8 XXX
+ SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1259 LOCAL_TIME2: 8 XXX
+ SG_ HOURS : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
+ SG_ SECONDS : 24|6@1+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1264 LOCAL_TIME: 8 XXX
+ SG_ HOURS : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
+ SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX
+ SG_ MONTH : 37|4@0+ (1,0) [0|15] "" XXX
+ SG_ YEAR : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ DATE : 48|5@1+ (1,0) [0|31] "" XXX
+
+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_ SG_ 272 LKAS_ANGLE_CMD "tracks MDPS->STEERING_ANGLE when not engaged, not STEERING_SENSORS->STEERING_ANGLE";
+CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings";
+CM_ SG_ 373 ACCEnable "Likely a copy of CAN's TCS13->ACCEnable";
+CM_ SG_ 373 DriverBraking "Likely derived from BRAKE->BRAKE_POSITION";
+CM_ SG_ 373 DriverBrakingLowSens "Higher threshold version of DriverBraking";
+CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?";
+CM_ SG_ 416 VSetDis "set speed in display units";
+CM_ SG_ 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_ 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_ 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" 4 "T";
+VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R";
+VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off";
+VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green";
+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_ 267 CRUISE_BUTTONS 8 "CRUISE_MAIN" 4 "CANCEL" 1 "RES" 2 "SET" 3 "GAP";
+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 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_ 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 0 "HIDDEN" 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";
+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";
+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 FF_DETECT 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 FF_DETECT_ALT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "DIM CONE" 4 "ORANGE CONE";
+VAL_ 354 LF_DETECT 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 RF_DETECT 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 LR_DETECT 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 RR_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE";
+VAL_ 354 FAULT_FSS 0 "HIDDEN" 1 "CHECK_FORWARD_SAFETY_SYSTEM" 2 "FORWARD_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED";
+VAL_ 354 FAULT_FCA 0 "HIDDEN" 1 "CHECK_FORWARD_SIDE_SAFETY_SYSTEM" 2 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED";
+VAL_ 354 FAULT_LSS 0 "HIDDEN" 1 "CHECK_LANE_SAFETY_SYSTEM" 2 "LANE_SAFETY_SYSTEM_DISABLED_CAMERA_OBSCURED";
+VAL_ 354 FAULT_SLA 0 "HIDDEN" 1 "CHECK_SPEED_LIMIT_SYSTEM" 2 "SPEED_LIMIT_SYSTEM_DISABLED_CAMERA_OBSCURED";
+VAL_ 354 FAULT_DAW 0 "HIDDEN" 1 "CHECK_INATTENTIVE_DRIVING_WARNING_SYSTEM" 2 "INATTENTIVE_DRIVING_WARNING_SYSTEM_DISABLED_CAMERA_OBSCURED";
+VAL_ 354 FAULT_HBA 0 "HIDDEN" 1 "CHECK_HIGH_BEAM_ASSIST_SYSTEM";
+VAL_ 354 FAULT_SCC 0 "HIDDEN" 1 "CHECK_SMART_CRUISE_CONTROL_SYSTEM" 2 "SMART_CRUISE_CONTROL_DISABLED_RADAR_BLOCKED";
+VAL_ 354 FAULT_LFA 0 "HIDDEN" 1 "CHECK_LANE_FOLLOWING_SYSTEM_ASSIST_SYSTEM";
+VAL_ 354 FAULT_HDA 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_ASSIST_SYSTEM";
+VAL_ 354 FAULT_LCA 0 "HIDDEN" 1 "CHECK_LANE_CHANGE_ASSIST_FUNCTION" 2 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_RADAR_BLOCKED";
+VAL_ 354 FAULT_HDP 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 2 "HIGHWAY_DRIVING_PILOT_DISABLED_CAMERA_OBSCURED" 3 "HIGHWAY_DRIVING_PILOT_DISABLED_RADAR_BLOCKED" 4 "HIGHWAY_DRIVING_PILOT_DISABLED_LIDAR_BLOCKED";
+VAL_ 354 FAULT_DAS 0 "HIDDEN" 1 "CHECK_DRIVER_ASSISTANCE_SYSTEM" 2 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_RADAR_BLOCKED" 4 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED_AND_RADAR_BLOCKED";
+VAL_ 354 FAULT_ESS 0 "HIDDEN" 1 "CHECK_EMERGENCY_STOPPING_FUNCTION" 2 "EMERGENCY_STOPPING_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "EMERGENCY_STOPPING_FUNCTION_DISABLED_RADAR_BLOCKED";
+VAL_ 362 BLINKER_CONTROL 1 "hazards" 2 "hazards button backlight" 3 "left blinkers" 4 "right blinkers";
+VAL_ 373 SCC_OptTyp 0 "SCC is not equipped" 1 "SCC is equipped" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue";
+VAL_ 373 SCC_ReqLimSta 0 "No request" 1 "Limited No Limitation" 2 "Acceleration Limited" 3 "Deceleration Limited";
+VAL_ 373 ESC_StdStillVal 0 "No stand still detected" 1 "stand still detected" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 ESC_DclEnblReq 0 "Disable deceleration control" 1 "Enable deceleration control" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 ESC_PrkBrkActvSta 0 "Parking brake is not activated" 1 "Parking brake is activated" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 FCA_EquipSta 0 "FCA is not equipped" 1 "FCA is equipped" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 FCA_AvlblSta 0 "Available" 1 "Temporarily not available" 2 "Permanently not available" 3 "FCA Communication Error";
+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_ 480 HDA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)";
+VAL_ 480 LFA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)";
+VAL_ 480 HDA_CntrlModSta 0 "System Deactive (Default)" 1 "System Ready" 2 "System Active" 3 "Reserved";
+VAL_ 480 HDA_InfoPUDis 0 "No pop-up" 1 "system start pop-up" 2 "system auto disengaged pop-up by highway off" 3 "system auto disengaged pop-up" 4 "system Fail pop-up" 5 "Hands-off pop up" 6 "Hands-off pop up w/ sound" 7 "System Automatic off";
+VAL_ 480 HDA_AutoSetSpdSta 0 "Auto Set Speed Off" 1 "Auto Set Speed On" 2 "Reserved" 3 "Error indicator";
+VAL_ 480 HDA_AutoSetSpdUpdtSta 0 "Auto Set Speed Update Off" 1 "Auto Set Speed Update On" 2 "Reserved" 3 "Error indicator";
+VAL_ 480 HDA_LFA_SymSta 0 "Off" 1 "Gray" 2 "Green" 3 "Green blink";
+VAL_ 480 HDA_LFA_WrnSnd 0 "Off" 1 "Additional Warning Sound" 2 "Reserved" 3 "Error indicator";
+VAL_ 480 HDA_InfoPUDis1 0 "No Pop-up" 1 "System Automatic off (LFA)" 2 "System Automatic off (HDA)" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Not Used" 7 "Error Indicator";
+VAL_ 480 HDA_TDMRMDclReq 0 "Not automatically deactivated state of LFA (default)" 1 "Automatically deactivated state of LFA" 2 "Reserved" 3 "Reserved";
+VAL_ 490 HDA_MODE2 1 "Lane change icon gray" 2 "lane green + lane change icon green" 3 "lane green + lane change icon green (both blinking)" 4 "lane white + lane change icon white (both blinking rapidly)" 5 "Lane Change Assist system check warning";
+VAL_ 490 LANE_LEFT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET";
+VAL_ 490 LANE_RIGHT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET";
+VAL_ 490 LANE_CHANGING 0 "IDLE" 1 "LEFT_CHECK" 3 "LEFT_CHANGING" 2 "RIGHT_CHECK" 4 "RIGHT_CHANGING";
+VAL_ 490 LF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 RF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 LR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 RR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 AUTOLANECHANGE_MSG 1 "Check surrounding conditions" 2 "Operating conditions not met" 3 "Analyzing driving lane" 4 "Sharp curve ahead" 5 "Current lane is too narrow" 6 "Not an operational section" 7 "Hazard lights are on" 8 "Vehicle speed is too low" 9 "Please hold the steering wheel" 10 "Not an operable lane" 11 "Steering input detected" 12 "Press the OK button to activate lane change assist";
+VAL_ 490 LANELINE_CURVATURE_DIRECTION 0 "LEFT" 1 "RIGHT";
+VAL_ 676 LEFT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+VAL_ 676 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+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_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+VAL_ 866 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+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_ 1079 TRAILER_CONNECTED 1 "CONNECTED" 0 "DISCONNECTED";
+
+VAL_ 1144 DRIVE_MODE2 3 "Set Sport" 1 "Set Normal" 2 "Set Eco";
+VAL_ 1240 DISTANCE_UNIT 1 "Miles" 0 "Kilometers";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.dbc
new file mode 100644
index 000000000..a78803a8c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.dbc
@@ -0,0 +1,140 @@
+VERSION ""
+
+
+NS_ :
+ NS_DESC_
+ CM_
+ BA_DEF_
+ BA_
+ VAL_
+ CAT_DEF_
+ CAT_
+ FILTER
+ BA_DEF_DEF_
+ EV_DATA_
+ ENVVAR_DATA_
+ ENVVAR_TYPE_
+ 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 RADAR
+
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BO_ 384 CORNER_RADAR_180_OBJECTS_180: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 384 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 384 30;
+
+BO_ 385 CORNER_RADAR_180_OBJECTS_181: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 385 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 385 30;
+
+BO_ 386 CORNER_RADAR_180_OBJECTS_182: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 386 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 386 30;
+
+BO_ 387 CORNER_RADAR_180_OBJECTS_183: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 387 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 387 30;
+
+BO_ 388 CORNER_RADAR_180_OBJECTS_184: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 388 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 388 30;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.py
new file mode 100755
index 000000000..d7bf6505c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+import os
+
+
+HEADER = """VERSION ""
+
+
+NS_ :
+ NS_DESC_
+ CM_
+ BA_DEF_
+ BA_
+ VAL_
+ CAT_DEF_
+ CAT_
+ FILTER
+ BA_DEF_DEF_
+ EV_DATA_
+ ENVVAR_DATA_
+ ENVVAR_TYPE_
+ 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 RADAR
+
+"""
+
+
+def write_object_msg(f, addr):
+ name = f"CORNER_RADAR_180_OBJECTS_{addr:x}"
+ f.write(f"""
+BO_ {addr} {name}: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+""")
+
+ f.write(f"""CM_ BO_ {addr} "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ {addr} 30;
+""")
+
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), dbc_name)
+ with open(out_path, "w", encoding="ascii") as f:
+ f.write(HEADER)
+ f.write('BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;\n')
+ f.write('BA_DEF_DEF_ "GenMsgCycleTime" 0;\n')
+ for addr in range(0x180, 0x185):
+ write_object_msg(f, addr)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.dbc
new file mode 100644
index 000000000..f622a7644
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.dbc
@@ -0,0 +1,278 @@
+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_
+ 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 RADAR
+
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BO_ 565 CORNER_RADAR_235_OBJECTS_235: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 565 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 565 30;
+
+BO_ 566 CORNER_RADAR_235_OBJECTS_236: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 566 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 566 30;
+
+BO_ 567 CORNER_RADAR_235_OBJECTS_237: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 567 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 567 30;
+
+BO_ 568 CORNER_RADAR_235_OBJECTS_238: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 568 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 568 30;
+
+BO_ 569 CORNER_RADAR_235_OBJECTS_239: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 569 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 569 30;
+
+BO_ 570 CORNER_RADAR_235_OBJECTS_23a: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 570 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 570 30;
+
+BO_ 571 CORNER_RADAR_235_OBJECTS_23b: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 571 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 571 30;
+
+BO_ 572 CORNER_RADAR_235_OBJECTS_23c: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 572 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 572 30;
+
+BO_ 573 CORNER_RADAR_235_OBJECTS_23d: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 573 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 573 30;
+
+BO_ 574 CORNER_RADAR_235_OBJECTS_23e: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 574 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 574 30;
+
+BO_ 575 CORNER_RADAR_235_OBJECTS_23f: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 575 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 575 30;
+
+BO_ 576 CORNER_RADAR_235_OBJECTS_240: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 576 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 576 30;
+
+BO_ 577 CORNER_RADAR_235_OBJECTS_241: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 577 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 577 30;
+
+BO_ 578 CORNER_RADAR_235_OBJECTS_242: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 578 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 578 30;
+
+BO_ 579 CORNER_RADAR_235_OBJECTS_243: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 579 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 579 30;
+
+BO_ 580 CORNER_RADAR_235_OBJECTS_244: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 580 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 580 30;
+
+BO_ 581 CORNER_RADAR_235_OBJECTS_245: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 581 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 581 30;
+
+BO_ 582 CORNER_RADAR_235_OBJECTS_246: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 582 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 582 30;
+
+BO_ 583 CORNER_RADAR_235_OBJECTS_247: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 583 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 583 30;
+
+BO_ 584 CORNER_RADAR_235_OBJECTS_248: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 584 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 584 30;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.py
new file mode 100755
index 000000000..6092d0d44
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+import os
+
+
+HEADER = """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_
+ 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 RADAR
+
+"""
+
+
+def write_object_msg(f, addr):
+ name = f"CORNER_RADAR_235_OBJECTS_{addr:x}"
+ f.write(f"""
+BO_ {addr} {name}: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+""")
+
+ f.write(f"""CM_ BO_ {addr} "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ {addr} 30;
+""")
+
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), dbc_name)
+ with open(out_path, "w", encoding="ascii") as f:
+ f.write(HEADER)
+ f.write('BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;\n')
+ f.write('BA_DEF_DEF_ "GenMsgCycleTime" 0;\n')
+ for addr in range(0x235, 0x249):
+ write_object_msg(f, addr)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.dbc
new file mode 100644
index 000000000..528b741d8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.dbc
@@ -0,0 +1,614 @@
+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_
+ 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 RADAR
+
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BO_ 1072 CORNER_RADAR_430_OBJECTS_430: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1072 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1072 30;
+
+BO_ 1073 CORNER_RADAR_430_OBJECTS_431: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1073 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1073 30;
+
+BO_ 1074 CORNER_RADAR_430_OBJECTS_432: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1074 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1074 30;
+
+BO_ 1075 CORNER_RADAR_430_OBJECTS_433: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1075 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1075 30;
+
+BO_ 1076 CORNER_RADAR_430_OBJECTS_434: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1076 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1076 30;
+
+BO_ 1077 CORNER_RADAR_430_OBJECTS_435: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1077 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1077 30;
+
+BO_ 1078 CORNER_RADAR_430_OBJECTS_436: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1078 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1078 30;
+
+BO_ 1079 CORNER_RADAR_430_OBJECTS_437: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1079 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1079 30;
+
+BO_ 1088 CORNER_RADAR_430_OBJECTS_440: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1088 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1088 30;
+
+BO_ 1089 CORNER_RADAR_430_OBJECTS_441: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1089 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1089 30;
+
+BO_ 1090 CORNER_RADAR_430_OBJECTS_442: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1090 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1090 30;
+
+BO_ 1091 CORNER_RADAR_430_OBJECTS_443: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1091 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1091 30;
+
+BO_ 1092 CORNER_RADAR_430_OBJECTS_444: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1092 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1092 30;
+
+BO_ 1093 CORNER_RADAR_430_OBJECTS_445: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1093 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1093 30;
+
+BO_ 1094 CORNER_RADAR_430_OBJECTS_446: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1094 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1094 30;
+
+BO_ 1095 CORNER_RADAR_430_OBJECTS_447: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1095 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1095 30;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.py
new file mode 100755
index 000000000..d663db747
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+import os
+
+
+HEADER = """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_
+ 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 RADAR
+
+"""
+
+
+def write_object_msg(f, addr):
+ name = f"CORNER_RADAR_430_OBJECTS_{addr:x}"
+ f.write(f"""
+BO_ {addr} {name}: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+""")
+ for slot in range(7):
+ bit = 32 + slot * 32
+ prefix = f"SLOT{slot + 1}"
+ f.write(f""" SG_ {prefix}_DISTANCE_RAW : {bit}|13@1+ (1,0) [0|8191] "" XXX
+ SG_ {prefix}_META_13_15 : {bit + 13}|3@1+ (1,0) [0|7] "" XXX
+ SG_ {prefix}_META_BYTE_2 : {bit + 16}|8@1+ (1,0) [0|255] "" XXX
+ SG_ {prefix}_META_BYTE_3 : {bit + 24}|8@1+ (1,0) [0|255] "" XXX
+""")
+ f.write(f"""CM_ BO_ {addr} "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ {addr} 30;
+""")
+
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), dbc_name)
+ with open(out_path, "w", encoding="ascii") as f:
+ f.write(HEADER)
+ f.write('BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;\n')
+ f.write('BA_DEF_DEF_ "GenMsgCycleTime" 0;\n')
+ for addr in range(0x430, 0x438):
+ write_object_msg(f, addr)
+ for addr in range(0x440, 0x448):
+ write_object_msg(f, addr)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.dbc
new file mode 100644
index 000000000..46c3032c2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.dbc
@@ -0,0 +1,1178 @@
+
+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
+
+BO_ 528 RADAR_TRACK_210: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 529 RADAR_TRACK_211: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 530 RADAR_TRACK_212: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 531 RADAR_TRACK_213: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 532 RADAR_TRACK_214: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 533 RADAR_TRACK_215: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 534 RADAR_TRACK_216: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 535 RADAR_TRACK_217: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 536 RADAR_TRACK_218: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 537 RADAR_TRACK_219: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 538 RADAR_TRACK_21a: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 539 RADAR_TRACK_21b: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 540 RADAR_TRACK_21c: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 541 RADAR_TRACK_21d: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 542 RADAR_TRACK_21e: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 543 RADAR_TRACK_21f: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 933 RADAR_TRACK_3a5: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 934 RADAR_TRACK_3a6: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 935 RADAR_TRACK_3a7: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 936 RADAR_TRACK_3a8: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 937 RADAR_TRACK_3a9: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 938 RADAR_TRACK_3aa: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 939 RADAR_TRACK_3ab: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 940 RADAR_TRACK_3ac: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 941 RADAR_TRACK_3ad: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 942 RADAR_TRACK_3ae: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 943 RADAR_TRACK_3af: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 944 RADAR_TRACK_3b0: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 945 RADAR_TRACK_3b1: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 946 RADAR_TRACK_3b2: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 947 RADAR_TRACK_3b3: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 948 RADAR_TRACK_3b4: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 949 RADAR_TRACK_3b5: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 950 RADAR_TRACK_3b6: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 951 RADAR_TRACK_3b7: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 952 RADAR_TRACK_3b8: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 953 RADAR_TRACK_3b9: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 954 RADAR_TRACK_3ba: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 955 RADAR_TRACK_3bb: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 956 RADAR_TRACK_3bc: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 957 RADAR_TRACK_3bd: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 958 RADAR_TRACK_3be: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 959 RADAR_TRACK_3bf: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 960 RADAR_TRACK_3c0: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 961 RADAR_TRACK_3c1: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 962 RADAR_TRACK_3c2: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 963 RADAR_TRACK_3c3: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 964 RADAR_TRACK_3c4: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 1024 RADAR_TRACK_400: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1025 RADAR_TRACK_401: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1026 RADAR_TRACK_402: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1027 RADAR_TRACK_403: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1028 RADAR_TRACK_404: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1029 RADAR_TRACK_405: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1030 RADAR_TRACK_406: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1031 RADAR_TRACK_407: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1032 RADAR_TRACK_408: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1033 RADAR_TRACK_409: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1034 RADAR_TRACK_40a: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1035 RADAR_TRACK_40b: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1036 RADAR_TRACK_40c: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1037 RADAR_TRACK_40d: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1038 RADAR_TRACK_40e: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1039 RADAR_TRACK_40f: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1040 RADAR_TRACK_410: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1041 RADAR_TRACK_411: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1042 RADAR_TRACK_412: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1043 RADAR_TRACK_413: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1044 RADAR_TRACK_414: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1045 RADAR_TRACK_415: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1046 RADAR_TRACK_416: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1047 RADAR_TRACK_417: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1048 RADAR_TRACK_418: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1049 RADAR_TRACK_419: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1050 RADAR_TRACK_41a: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1051 RADAR_TRACK_41b: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1052 RADAR_TRACK_41c: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1053 RADAR_TRACK_41d: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.py
new file mode 100755
index 000000000..f3abf2eac
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python3
+import os
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ hyundai_path = os.path.dirname(os.path.realpath(__file__))
+ with open(os.path.join(hyundai_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
+ """)
+
+ for a in range(0x210, 0x210 + 16):
+ f.write(f"""
+BO_ {a} RADAR_TRACK_{a:x}: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+ """)
+ for a in range(0x3a5, 0x3a5 + 32):
+ f.write(f"""
+BO_ {a} RADAR_TRACK_{a:x}: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+ """)
+
+ # Group 3 radar object list:
+ # 30 one-object messages at 20 Hz, with an empty distance sentinel of 0x7ff.
+ for a in range(0x400, 0x400 + 30):
+ f.write(f"""
+BO_ {a} RADAR_TRACK_{a:x}: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+ """)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.dbc
new file mode 100644
index 000000000..cc78c4d20
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.dbc
@@ -0,0 +1,117 @@
+
+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
+
+BO_ 1280 RADAR_TRACK_500: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1281 RADAR_TRACK_501: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1282 RADAR_TRACK_502: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1283 RADAR_TRACK_503: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1284 RADAR_TRACK_504: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1285 RADAR_TRACK_505: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1286 RADAR_TRACK_506: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1287 RADAR_TRACK_507: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.py
new file mode 100755
index 000000000..d00e5d355
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+import os
+
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ hyundai_path = os.path.dirname(os.path.realpath(__file__))
+ with open(os.path.join(hyundai_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
+""")
+
+ # EN: The Denso DNMWR006 radar in the 2018-2019 Kia Sorento UM publishes
+ # eight stable tracked objects at 20 Hz from 0x500 through 0x507.
+ # Do not decode 0x508+ distance-sorted raw detections as stable tracks.
+ # KO: 2018-2019 Kia Sorento UM의 Denso DNMWR006 레이더는 0x500~0x507에서
+ # 안정적인 추적 객체 8개를 20Hz로 전송함. 0x508 이후의 거리순 raw
+ # detection은 안정적인 트랙으로 디코딩하지 않음.
+ for address in range(0x500, 0x508):
+ f.write(f"""
+BO_ {address} RADAR_TRACK_{address:x}: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+""")
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.dbc
new file mode 100644
index 000000000..2283a041e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.dbc
@@ -0,0 +1,371 @@
+
+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
+
+BO_ 256 RADAR_POINTS_METADATA_0x100: 64 RADAR
+ SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX
+ SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX
+ SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX
+ SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX
+ SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX
+ SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX
+ SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX
+ SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX
+ SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX
+ SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX
+ SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX
+ SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX
+ SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX
+ SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX
+ SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX
+ SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 512 RADAR_POINTS_METADATA_0x200: 64 RADAR
+ SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX
+ SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX
+ SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX
+ SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX
+ SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX
+ SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX
+ SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX
+ SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX
+ SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX
+ SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX
+ SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX
+ SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX
+ SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX
+ SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX
+ SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX
+ SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 257 RADAR_POINTS_0x101: 64 RADAR
+ SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX
+ SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_DISTANCE : 7|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_1_SIGNAL_2 : 21|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_3 : 23|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_REL_VELOCITY : 31|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_1_SIGNAL_5 : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_6 : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_AZIMUTH : 48|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_1_SIGNAL_8 : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_9 : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_10 : 63|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_1_SIGNAL_11 : 70|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_12 : 71|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_13 : 77|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_14 : 79|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_SIGNAL_15 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_16 : 88|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_17 : 90|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_1_SIGNAL_18 : 93|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_19 : 99|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_1_SIGNAL_20 : 107|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_DISTANCE : 108|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_2_SIGNAL_2 : 122|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_3 : 124|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_REL_VELOCITY : 132|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_2_SIGNAL_5 : 145|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_6 : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_AZIMUTH : 149|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_2_SIGNAL_8 : 161|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_9 : 163|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_10 : 164|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_2_SIGNAL_11 : 171|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_12 : 172|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_13 : 178|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_14 : 180|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_SIGNAL_15 : 188|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_16 : 189|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_17 : 191|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_2_SIGNAL_18 : 194|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_19 : 200|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_2_SIGNAL_20 : 208|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_DISTANCE : 209|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_3_SIGNAL_2 : 223|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_3 : 225|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_REL_VELOCITY : 233|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_3_SIGNAL_5 : 246|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_6 : 248|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_AZIMUTH : 250|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_3_SIGNAL_8 : 262|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_9 : 264|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_10 : 265|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_3_SIGNAL_11 : 272|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_12 : 273|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_13 : 279|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_14 : 281|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_SIGNAL_15 : 289|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_16 : 290|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_17 : 292|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_3_SIGNAL_18 : 295|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_19 : 301|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_3_SIGNAL_20 : 309|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_DISTANCE : 310|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_4_SIGNAL_2 : 324|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_3 : 326|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_REL_VELOCITY : 334|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_4_SIGNAL_5 : 347|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_6 : 349|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_AZIMUTH : 351|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_4_SIGNAL_8 : 363|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_9 : 365|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_10 : 366|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_4_SIGNAL_11 : 373|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_12 : 374|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_13 : 380|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_14 : 382|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_SIGNAL_15 : 390|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_16 : 391|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_17 : 393|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_4_SIGNAL_18 : 396|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_19 : 402|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_4_SIGNAL_20 : 410|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_DISTANCE : 411|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_5_SIGNAL_2 : 425|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_3 : 427|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_REL_VELOCITY : 435|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_5_SIGNAL_5 : 448|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_6 : 450|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_AZIMUTH : 452|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_5_SIGNAL_8 : 464|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_9 : 466|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_10 : 467|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_5_SIGNAL_11 : 474|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_12 : 475|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_13 : 481|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_14 : 483|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_SIGNAL_15 : 491|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_16 : 492|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_17 : 494|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_5_SIGNAL_18 : 497|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_19 : 503|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_5_SIGNAL_20 : 511|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 513 RADAR_POINTS_0x201: 64 RADAR
+ SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX
+ SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_DISTANCE : 7|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_1_SIGNAL_2 : 21|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_3 : 23|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_REL_VELOCITY : 31|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_1_SIGNAL_5 : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_6 : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_AZIMUTH : 48|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_1_SIGNAL_8 : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_9 : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_10 : 63|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_1_SIGNAL_11 : 70|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_12 : 71|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_13 : 77|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_14 : 79|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_SIGNAL_15 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_16 : 88|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_17 : 90|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_1_SIGNAL_18 : 93|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_19 : 99|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_1_SIGNAL_20 : 107|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_DISTANCE : 108|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_2_SIGNAL_2 : 122|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_3 : 124|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_REL_VELOCITY : 132|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_2_SIGNAL_5 : 145|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_6 : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_AZIMUTH : 149|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_2_SIGNAL_8 : 161|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_9 : 163|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_10 : 164|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_2_SIGNAL_11 : 171|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_12 : 172|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_13 : 178|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_14 : 180|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_SIGNAL_15 : 188|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_16 : 189|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_17 : 191|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_2_SIGNAL_18 : 194|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_19 : 200|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_2_SIGNAL_20 : 208|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_DISTANCE : 209|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_3_SIGNAL_2 : 223|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_3 : 225|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_REL_VELOCITY : 233|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_3_SIGNAL_5 : 246|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_6 : 248|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_AZIMUTH : 250|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_3_SIGNAL_8 : 262|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_9 : 264|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_10 : 265|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_3_SIGNAL_11 : 272|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_12 : 273|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_13 : 279|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_14 : 281|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_SIGNAL_15 : 289|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_16 : 290|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_17 : 292|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_3_SIGNAL_18 : 295|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_19 : 301|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_3_SIGNAL_20 : 309|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_DISTANCE : 310|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_4_SIGNAL_2 : 324|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_3 : 326|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_REL_VELOCITY : 334|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_4_SIGNAL_5 : 347|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_6 : 349|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_AZIMUTH : 351|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_4_SIGNAL_8 : 363|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_9 : 365|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_10 : 366|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_4_SIGNAL_11 : 373|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_12 : 374|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_13 : 380|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_14 : 382|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_SIGNAL_15 : 390|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_16 : 391|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_17 : 393|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_4_SIGNAL_18 : 396|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_19 : 402|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_4_SIGNAL_20 : 410|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_DISTANCE : 411|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_5_SIGNAL_2 : 425|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_3 : 427|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_REL_VELOCITY : 435|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_5_SIGNAL_5 : 448|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_6 : 450|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_AZIMUTH : 452|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_5_SIGNAL_8 : 464|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_9 : 466|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_10 : 467|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_5_SIGNAL_11 : 474|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_12 : 475|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_13 : 481|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_14 : 483|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_SIGNAL_15 : 491|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_16 : 492|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_17 : 494|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_5_SIGNAL_18 : 497|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_19 : 503|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_5_SIGNAL_20 : 511|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 260 RADAR_POINTS_CHECKSUM_0x104: 3 RADAR
+ SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 516 RADAR_POINTS_CHECKSUM_0x204: 3 RADAR
+ SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py
new file mode 100755
index 000000000..aad417e32
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py
@@ -0,0 +1,170 @@
+#!/usr/bin/env python3
+from collections import namedtuple
+import os
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ hyundai_path = os.path.dirname(os.path.realpath(__file__))
+ with open(os.path.join(hyundai_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
+""")
+
+ for a in [0x100, 0x200]:
+ f.write(f"""
+BO_ {a} RADAR_POINTS_METADATA_0x{a:x}: 64 RADAR
+ SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX
+ SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX
+ SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX
+ SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX
+ SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX
+ SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX
+ SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX
+ SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX
+ SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX
+ SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX
+ SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX
+ SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX
+ SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX
+ SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX
+ SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX
+ SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX
+""")
+
+ # radar points are sent at 20 Hz in groups of 1 to 13 messages
+ # each message has 5 radar points for a total of 65 points max
+ # each radar point is 101 bits so the alignment is not consistent
+ RadarPointSignal = namedtuple("RadarPointSignal", ["name", "start", "length", "scale", "offset"])
+ radar_point_signals = (
+ RadarPointSignal("DISTANCE", 7, 14, 1/64, 0),
+ RadarPointSignal("", 21, 2, 1, 0),
+ RadarPointSignal("", 23, 8, 1/512, -127/512),
+ RadarPointSignal("REL_VELOCITY", 31, 13, 1/32, -66),
+ RadarPointSignal("", 44, 2, 1, 0),
+ RadarPointSignal("", 46, 2, 1, 0),
+ RadarPointSignal("AZIMUTH", 48, 12, 1/512, -2047/512),
+ RadarPointSignal("", 60, 2, 1, 0),
+ RadarPointSignal("", 62, 1, 1, 0),
+ RadarPointSignal("", 63, 7, 1, 0),
+ RadarPointSignal("", 70, 1, 1, 0),
+ RadarPointSignal("", 71, 6, 1, 0),
+ RadarPointSignal("", 77, 2, 1, 0),
+ RadarPointSignal("", 79, 8, 1/512, -127/512),
+ RadarPointSignal("", 87, 1, 1, 0),
+ RadarPointSignal("", 88, 2, 1, 0),
+ RadarPointSignal("", 90, 3, 1, 0),
+ # last 15 bits are controlled by LAYOUT_ID (seems to always zero, so below is layout 0)
+ RadarPointSignal("", 93, 6, 1, 0),
+ RadarPointSignal("", 99, 8, 1, 0),
+ RadarPointSignal("", 107, 1, 1, 0),
+ )
+ radar_point_bit_count = sum([s.length for s in radar_point_signals])
+
+ for a in [0x101, 0x201]:
+ f.write(f"""
+BO_ {a} RADAR_POINTS_0x{a:x}: 64 RADAR
+ SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX
+ SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX
+""")
+ bit_idx = radar_point_signals[0].start
+ for i in range(5):
+ signal_idx = 1
+ for sig in radar_point_signals:
+ if sig.name:
+ sig_name = f"POINT_{i+1}_{sig.name}"
+ else:
+ sig_name = f"POINT_{i+1}_SIGNAL_{signal_idx}"
+ signal_idx += 1
+
+ sig_start_idx = i * radar_point_bit_count + sig.start
+ assert bit_idx == sig_start_idx, f"signal overlap or gap!!! {bit_idx} != {sig_start_idx}"
+ min_val = round(sig.offset, 10)
+ max_val = round((2**sig.length - 1) * sig.scale + sig.offset, 10)
+
+ f.write(f" SG_ {sig_name} : {sig_start_idx}|{sig.length}@1+ ({sig.scale},{sig.offset}) [{min_val}|{max_val}] \"\" XXX\n")
+ bit_idx += sig.length
+
+ # checksum is across a group of 0x100/200 and 0x101/201 messages (no checksums inside the other messages)
+ # ccitt_crc16 = mkCrcFun(0x11021, initCrc=0xffff, xorOut=0x0000, rev=False)
+ for a in [0x104, 0x204]:
+ f.write(f"""
+BO_ {a} RADAR_POINTS_CHECKSUM_0x{a:x}: 3 RADAR
+ SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX
+""")
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.dbc
new file mode 100644
index 000000000..f27b73275
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.dbc
@@ -0,0 +1,422 @@
+
+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
+
+BO_ 1280 RADAR_TRACK_500: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1281 RADAR_TRACK_501: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1282 RADAR_TRACK_502: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1283 RADAR_TRACK_503: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1284 RADAR_TRACK_504: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1285 RADAR_TRACK_505: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1286 RADAR_TRACK_506: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1287 RADAR_TRACK_507: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1288 RADAR_TRACK_508: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1289 RADAR_TRACK_509: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1290 RADAR_TRACK_50a: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1291 RADAR_TRACK_50b: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1292 RADAR_TRACK_50c: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1293 RADAR_TRACK_50d: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1294 RADAR_TRACK_50e: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1295 RADAR_TRACK_50f: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1296 RADAR_TRACK_510: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1297 RADAR_TRACK_511: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1298 RADAR_TRACK_512: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1299 RADAR_TRACK_513: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1300 RADAR_TRACK_514: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1301 RADAR_TRACK_515: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1302 RADAR_TRACK_516: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1303 RADAR_TRACK_517: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1304 RADAR_TRACK_518: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1305 RADAR_TRACK_519: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1306 RADAR_TRACK_51a: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1307 RADAR_TRACK_51b: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1308 RADAR_TRACK_51c: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1309 RADAR_TRACK_51d: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1310 RADAR_TRACK_51e: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1311 RADAR_TRACK_51f: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py
new file mode 100755
index 000000000..ee8dde64d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+import os
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ hyundai_path = os.path.dirname(os.path.realpath(__file__))
+ with open(os.path.join(hyundai_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_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+ """)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc
new file mode 100644
index 000000000..b8ecca766
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc
@@ -0,0 +1,865 @@
+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/iqdbc_repo/iqdbc/dbc/generator/nissan/_nissan_common.dbc b/iqdbc_repo/iqdbc/dbc/generator/nissan/_nissan_common.dbc
new file mode 100644
index 000000000..46a65a7b7
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/nissan/_nissan_common.dbc
@@ -0,0 +1,117 @@
+BO_ 2 STEER_ANGLE_SENSOR: 5 XXX
+ SG_ STEER_ANGLE_RATE : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X07 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 0|16@1- (-0.1,0) [0|65535] "" XXX
+ SG_ COUNTER : 32|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 361 LKAS: 8 XXX
+ SG_ MAX_TORQUE : 39|8@0+ (0.01,0) [0|255] "Nm" XXX
+ SG_ SET_0x80 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX
+ SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 389 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX
+ SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|127] "" XXX
+
+BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX
+ SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 689 PROPILOT_HUD: 8 XXX
+ SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING2 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_YELLOW_FLASH : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_YELLOW_FLASH : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_CAR : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_CAR_ERROR : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_ERROR : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_ERROR_FLASHING : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_GREEN : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_GREEN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING3 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ERROR_FLASHING : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ SAFETY_SHIELD_ACTIVE : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ LARGE_STEERING_WHEEL_ICON : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LANE_GREEN_FLASH : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_GREEN_FLASH : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUDIBLE_TONE : 47|3@0+ (1,0) [0|8] "" XXX
+ SG_ SPEED_SET_ICON : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ SMALL_STEERING_WHEEL_ICON : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ SET_SPEED : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ unknown02 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown05 : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown08 : 8|7@0+ (1,0) [0|63] "" XXX
+ SG_ unknown26 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown28 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown31 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown43 : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown55 : 55|8@0+ (1,0) [0|63] "" XXX
+ SG_ unknown59 : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 451 PROPILOT_BRAKE: 8 XXX
+ SG_ BRAKE_PRESSURE : 5|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_ACTIVE : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 783 CRUISE_STATE: 3 XXX
+ SG_ CRUISE_ENABLED : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX
+ SG_ NA_HIGH_ACCEL_TEMP : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_NA_HIGH_CABIN_TEMP : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_MALFUNCTION : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_MALFUNCTION : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_MALFUNCTION : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_NA_CLEAN_REAR_CAMERA : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ NA_POOR_ROAD_CONDITIONS : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ CURRENTLY_UNAVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ SAFETY_SHIELD_OFF : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_NA_RADAR_OBSTRUCTION : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_DO_NOT_ENTER : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_SYSTEM_OFF : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_MALFUNCTION : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_COLLISION_MALFUNCTION : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_MALFUNCTION2 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_MALFUNCTION2 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_MALFUNCTION2 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_MSGS : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ BOTTOM_MSG : 45|3@0+ (1,0) [0|7] "" XXX
+ SG_ HANDS_ON_WHEEL_WARNING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_STEP_ON_BRAKE_NOW : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_HIGH_CABIN_TEMP : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_PROPILOT_MALFUNCTION : 54|1@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_UNAVAILABLE_HIGH_CABIN_TEMP : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_NA_FRONT_CAMERA_IMPARED : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown07 : 7|7@0+ (1,0) [0|127] "" XXX
+ SG_ unknown10 : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown15 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown23 : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ unknown19 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown31 : 31|6@0+ (1,0) [0|63] "" XXX
+ SG_ unknown32 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown46 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown50 : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ unknown55 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown61 : 61|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 1227 LKAS_SETTINGS: 8 XXX
+ SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ;
+VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ;
+VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ;
+VAL_ 689 AUDIBLE_TONE 0 "NO_TONE" 1 "CONT" 2 "FAST_BEEP_CONT" 3 "TRIPLE_FAST_BEEP_CONT" 4 "SLOW_BEEP_CONT" 5 "QUAD_SLOW_BEEP_CONT" 6 "SINGLE_BEEP_ONCE" 7 "DOUBLE_BEEP_ONCE" ;
+VAL_ 689 SMALL_STEERING_WHEEL_ICON 0 "NO_ICON" 1 "GRAY_ICON" 2 "GRAY_ICON_FLASHING" 3 "GREEN_ICON" 4 "GREEN_ICON_FLASHING" 5 "RED_ICON" 6 "RED_ICON_FLASHING" 7 "YELLOW_ICON" ;
+VAL_ 689 LARGE_STEERING_WHEEL_ICON 0 "NO_STEERINGWHEEL" 1 "GRAY_STEERINGWHEEL" 2 "GREEN_STEERINGWHEEL" 3 "GREEN_STEERINGWHEEL_FLASHING" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/nissan/nissan_leaf_2018.dbc b/iqdbc_repo/iqdbc/dbc/generator/nissan/nissan_leaf_2018.dbc
new file mode 100644
index 000000000..3376c3784
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/nissan/nissan_leaf_2018.dbc
@@ -0,0 +1,62 @@
+CM_ "IMPORT _nissan_common.dbc";
+
+BO_ 42 SEATBELT: 8 XXX
+ SG_ SEATBELT_DRIVER_LATCHED : 27|1@1+ (1,0) [0|3] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown2 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ unknown3 : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ unknown1 : 7|24@0+ (1,0) [0|16777215] "" XXX
+ SG_ unknown4 : 39|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 460 BRAKE_PEDAL: 8 XXX
+ SG_ BRAKE_PEDAL : 7|8@0+ (1,0) [0|256] "" XXX
+
+BO_ 569 CRUISE_THROTTLE: 8 XXX
+ SG_ GAS_PEDAL_INVERTED : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ GAS_PEDAL : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ CRUISE_AVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ unsure1 : 23|6@0+ (1,0) [0|63] "" XXX
+ SG_ unsure2 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ unsure3 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ NO_BUTTON_PRESSED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_BUTTON : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ CANCEL_BUTTON : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ USER_BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ unsure5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ unsure6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ unsure7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 640 CANCEL_MSG: 8 XXX
+ SG_ CANCEL_SEATBELT : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|56@0+ (1,0) [0|72057594037927940] "" XXX
+
+BO_ 644 WHEEL_SPEEDS_FRONT: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 852 ESP: 8 XXX
+ SG_ ESP_DISABLED : 38|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 853 HUD_SETTINGS: 8 XXX
+ SG_ SPEED_MPH : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 856 LIGHTS: 8 XXX
+ SG_ LEFT_BLINKER : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 18|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1057 GEARBOX: 3 XXX
+ SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX
+
+BO_ 1549 DOORS_LIGHTS: 8 XXX
+ SG_ DOOR_OPEN_FL : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 6|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1057 GEAR_SHIFTER 7 "B" 4 "D" 3 "N" 2 "R" 1 "P" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/nissan/nissan_x_trail_2017.dbc b/iqdbc_repo/iqdbc/dbc/generator/nissan/nissan_x_trail_2017.dbc
new file mode 100644
index 000000000..46e6f9c99
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/nissan/nissan_x_trail_2017.dbc
@@ -0,0 +1,69 @@
+CM_ "IMPORT _nissan_common.dbc";
+
+BO_ 348 GAS_PEDAL: 8 XXX
+ SG_ GAS_PEDAL_RAW : 26|11@0+ (1,0) [0|2047] "" XXX
+ SG_ GAS_PEDAL : 47|10@0+ (1,0) [0|1023] "" XXX
+
+BO_ 438 PRO_PILOT: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X03 : 33|2@0+ (1,0) [0|15] "" XXX
+ SG_ CRUISE_ACTIVATED : 38|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_ON : 36|1@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_STATUS : 51|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 523 CRUISE_THROTTLE: 6 XXX
+ SG_ PROPILOT_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ CANCEL_BUTTON : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_INVERTED : 37|10@0+ (1,0) [0|1023] "" XXX
+ SG_ SET_BUTTON : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE_BUTTON : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ NO_BUTTON_PRESSED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL : 31|10@0+ (1,0) [0|255] "" XXX
+ SG_ USER_BRAKE_PRESSED : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ USER_BRAKE_PRESSED_INVERTED : 22|1@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PRESSED_INVERTED : 20|1@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ unsure1 : 7|10@0+ (1,0) [0|1023] "" XXX
+ SG_ unsure2 : 43|4@0+ (1,0) [0|1] "" XXX
+ SG_ unsure3 : 19|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 665 ESP: 8 XXX
+ SG_ ESP_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 666 WHEEL_SPEEDS_FRONT: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 768 STEER_TORQUE_SENSOR2: 2 XXX
+ SG_ STEERING_TORQUE : 6|7@0+ (1,0) [0|127] "" XXX
+ SG_ STEERING_PRESSED : 15|1@0+ (-1,1) [0|7] "" XXX
+
+BO_ 1055 GEARBOX: 2 XXX
+ SG_ SPORTS_MODE : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX
+
+BO_ 1107 LIGHTS: 8 XXX
+ SG_ RIGHT_BLINKER : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHTS : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1108 DOORS_LIGHTS: 8 XXX
+ SG_ DOOR_CLOSED_RR : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_FL : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_FR : 46|1@0+ (1,0) [0|3] "" XXX
+ SG_ DOOR_OPEN_FR : 47|1@0+ (1,0) [0|3] "" XXX
+ SG_ BOOT_OPEN : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHT : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ USER_BRAKE_PRESSED : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1273 HUD: 7 XXX
+ SG_ SEATBELT_DRIVER_LATCHED : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPEED_MPH : 5|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1055 GEAR_SHIFTER 6 "L" 4 "D" 3 "N" 2 "R" 1 "P" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/rivian/.gitignore b/iqdbc_repo/iqdbc/dbc/generator/rivian/.gitignore
new file mode 100644
index 000000000..c6687b3e5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/rivian/.gitignore
@@ -0,0 +1 @@
+rivian_mando_front_radar.dbc
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.dbc b/iqdbc_repo/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.dbc
new file mode 100644
index 000000000..9412be047
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.dbc
@@ -0,0 +1,454 @@
+
+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
+
+BO_ 1280 RADAR_TRACK_500: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1281 RADAR_TRACK_501: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1282 RADAR_TRACK_502: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1283 RADAR_TRACK_503: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1284 RADAR_TRACK_504: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1285 RADAR_TRACK_505: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1286 RADAR_TRACK_506: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1287 RADAR_TRACK_507: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1288 RADAR_TRACK_508: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1289 RADAR_TRACK_509: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1290 RADAR_TRACK_50a: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1291 RADAR_TRACK_50b: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1292 RADAR_TRACK_50c: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1293 RADAR_TRACK_50d: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1294 RADAR_TRACK_50e: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1295 RADAR_TRACK_50f: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1296 RADAR_TRACK_510: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1297 RADAR_TRACK_511: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1298 RADAR_TRACK_512: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1299 RADAR_TRACK_513: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1300 RADAR_TRACK_514: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1301 RADAR_TRACK_515: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1302 RADAR_TRACK_516: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1303 RADAR_TRACK_517: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1304 RADAR_TRACK_518: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1305 RADAR_TRACK_519: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1306 RADAR_TRACK_51a: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1307 RADAR_TRACK_51b: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1308 RADAR_TRACK_51c: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1309 RADAR_TRACK_51d: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1310 RADAR_TRACK_51e: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1311 RADAR_TRACK_51f: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+VAL_ 1280 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1280 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1281 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1281 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1282 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1282 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1283 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1283 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1284 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1284 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1285 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1285 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1286 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1286 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1287 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1287 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1288 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1288 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1289 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1289 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1290 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1290 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1291 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1291 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1292 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1292 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1293 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1293 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1294 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1294 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1295 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1295 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1296 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1296 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1297 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1297 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1298 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1298 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1299 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1299 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1300 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1300 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1301 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1301 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1302 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1302 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1303 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1303 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1304 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1304 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1305 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1305 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1306 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1306 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1307 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1307 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1308 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1308 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1309 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1309 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1310 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1310 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1311 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1311 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.py b/iqdbc_repo/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.py
new file mode 100755
index 000000000..d9a89752f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.py
@@ -0,0 +1,64 @@
+#!/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
+ """)
+
+ 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+ """)
+
+ for a in range(0x500, 0x500 + 32):
+ f.write(f"""
+VAL_ {a} STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ {a} MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+ """)
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/_subaru_global.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/_subaru_global.dbc
new file mode 100644
index 000000000..67f63216a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/_subaru_global.dbc
@@ -0,0 +1,305 @@
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [0|65535] "" XXX
+ SG_ COUNTER : 25|3@1+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 64 Throttle: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Engine_RPM : 16|13@1+ (1,0) [0|8191] "" XXX
+ SG_ Neutral : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal3 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ Off_Accel : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 316 Brake_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX
+ SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX
+ SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 326 Cruise_Buttons: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX
+ SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Set : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX
+
+BO_ 315 G_Sensor: 8 XXX
+ SG_ Lateral : 48|8@1- (-0.1,0) [0|255] "m/s2" XXX
+ SG_ Longitudinal : 56|8@1- (-0.1,0) [0|255] "m/s2" XXX
+
+BO_ 314 Wheel_Speeds: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ FR : 12|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ RR : 25|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ FL : 51|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ RL : 38|13@1+ (0.057,0) [0|255] "kph" XXX
+
+BO_ 280 Steering_Torque_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steer_Torque_Output : 13|11@1- (-10,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|511] "" XXX
+ SG_ Steer_Torque_Sensor : 45|11@1- (-1,0) [0|255] "" XXX
+ SG_ Steering_Active : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ Steering_Disabled : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 281 Steering_Torque: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steer_Error_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 16|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_2 : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Warning : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steering_Angle : 32|16@1- (-0.0217,0) [-600|600] "" X
+ SG_ Steer_Torque_Output : 48|11@1- (-10,0) [-1000|1000] "" XXX
+
+BO_ 282 Steering_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX
+ SG_ Steering_Angle : 24|17@1- (-0.01,0) [0|1] "" XXX
+
+BO_ 312 Brake_Pressure_L_R: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steering_Angle : 16|16@1- (-0.1,0) [-3276.8|3276.7] "" XXX
+ SG_ Brake_1 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_2 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 313 Brake_Pedal: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Speed : 16|12@1+ (0.05625,0) [0|255] "kph" XXX
+ SG_ Signal2 : 28|6@1+ (1,0) [0|63] "" XXX
+ SG_ Brake_Lights : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal : 36|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal4 : 48|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 372 Engine_Stop_Start: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ STOP_START_STATE : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 290 ES_LKAS: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Output : 16|13@1- (-1,0) [-8191|8191] "" XXX
+ SG_ LKAS_Request : 29|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 292 ES_LKAS_ANGLE: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Request : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Output : 40|17@1- (-0.01,0) [0|1] "deg" XXX
+ SG_ SET_3 : 60|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 544 ES_Brake: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Pressure : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ AEB_Status : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ Cruise_Brake_Lights : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Fault : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 40|24@1+ (1,0) [0|16777215] "" XXX
+
+BO_ 577 Cruise_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Clutch_Depressed : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 51|12@0+ (1,0) [0|120] "" XXX
+ SG_ Cruise_On : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 55|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 552 BSD_RCTA: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ R_ADJACENT : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 59|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 912 Dashlights: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ UNITS : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ICY_ROAD : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ SEATBELT_FL : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ STOP_START : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 940 BodyInfo: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ DOOR_OPEN_FL : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ DASH_BTN_LIGHTS : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOWBEAM : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ HIGHBEAM : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ FOG_LIGHTS : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ WIPERS : 62|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 801 ES_DashStatus: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ PCB_Off : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_Off : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_State_Msg : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_State_Msg : 20|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal2 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Soft_Disable : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Status_Msg : 25|2@1+ (1,0) [0|3] "" XXX
+ SG_ Signal3 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal4 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Conventional_Cruise : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 33|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_Disengaged_Dash : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal6 : 37|3@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Display_Own_Car : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Lights : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Car_Follow : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal7 : 53|3@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX
+ SG_ Cruise_State : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 802 ES_LKAS_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_Alert_Msg : 12|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal1 : 15|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Dash_State : 18|2@1+ (1,0) [0|2] "" XXX
+ SG_ Signal2 : 20|3@1+ (1,0) [0|7] "" XXX
+ SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Enable : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Light_Blink : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Right_Line_Enable : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Right_Line_Light_Blink : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Visible : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_Right_Line_Visible : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_Alert : 32|5@1+ (1,0) [0|31] "" XXX
+ SG_ Signal3 : 37|27@1+ (1,0) [0|1] "" XXX
+
+BO_ 803 ES_Infotainment: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_Blue_Lines : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKAS_State_Infotainment : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ Signal2 : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 722 AC_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ AC_Mode : 37|3@1+ (1,0) [0|1] "" XXX
+ SG_ AC_ON : 24|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 1677 Dash_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Units : 29|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 554 ES_HighBeamAssist: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ HBA_Available : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 805 ES_STATIC_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_3 : 23|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 289 ES_STATIC_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_3 : 15|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_Fault : 18|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 64 Throttle_Combo "Throttle Cruise + Pedal";
+CM_ SG_ 313 Brake_Lights "Driver or Cruise Brake on";
+CM_ SG_ 544 Cruise_Brake_Lights "1 = switch on brake lights";
+CM_ SG_ 544 Brake_Pressure "Winds down after cruise disabled. Also can be non-zero when likely preparing for AEB";
+CM_ SG_ 544 Signal3 "Usually goes to 2 if AEB_Status is 4";
+CM_ SG_ 544 AEB_Status "Occasionally is 4 instead of 8 while Brake_Pressure is non-zero, unsure why";
+CM_ SG_ 801 Cruise_Activated_Dash "Falls during user gas or standstill. This is likely only a UI signal to the dash to show if ACC is actually actuating";
+CM_ SG_ 801 PCB_Off "Pre-Collision Braking off";
+CM_ SG_ 801 Brake_Lights "Driver or Cruise brake on";
+CM_ SG_ 801 Cruise_State "0 = Normal, 1 = Hold+User Brake, 2 = Ready, 3 = Hold";
+CM_ SG_ 801 Far_Distance "1=0-5m, 2=5-10m, 3=10-15m, 4=15-20m, 5=20-25m, 6=25-30m, 7=30-35m, 8=35-40m, 9=40-45m, 10=45-50m, 11=50-55m, 12=55-60m, 13=60-65m, 14=65-70m, 15=75m+";
+CM_ SG_ 801 LKAS_State_Msg "1 = LKAS_Off_Sharp_Curve, 2 = Keep_Hands_On_Steering_wheel_disabled, 3 = LKAS_Off, 4 = LKAS_Off_Too_Slow, 5 = LKAS_Off_Too_Fast";
+CM_ SG_ 801 Cruise_State_Msg "1 = Cruise_Off_Steep_Slope, 2 = Cruise_lvl1_eco, 3 = Cruise_lvl2_comfort, 4 = Cruise_off_empty_reason, 5 = Cruise_off, 6 = Cruise_Unable_to_set, 7 = Cruise_Unable_to_set_brakes_applied, 8 = Eyesight_not_ready, 9 = Cruise_lvl3_standard, 10 = Cruise_lvl4_dynamic, 11 = Cruise_Unable_to_set_steep_slope";
+CM_ SG_ 801 Cruise_Soft_Disable "Eyesight soft disable (eg direct sunlight)";
+CM_ SG_ 801 Cruise_Status_Msg "1 = Disabled_Bad_Visibility, 2 = Disabled_Check_Manual";
+CM_ SG_ 802 LKAS_ACTIVE "Turns on the full LKAS dash display";
+CM_ SG_ 802 LKAS_Alert_Msg "1 = Keep_Hands_On_Wheel, 6 = Pre_Collision_Braking, 7 = Keep_Hands_On_Wheel_Off";
+CM_ SG_ 802 LKAS_Alert "1 = FCW_Cont_Beep, 2 = FCW_Repeated_Beep, 3 = Throttle_Management_Activated_Warning, 4 = Throttle_Management_Activated_Alert, 5 = Pre_Collision_Activated_Alert, 8 = Traffic_Light_Ahead, 9 = Apply_Brake_to_Hold Position, 11 = LDW_Right, 12 = LDW_Left, 13 = Stay_Alert, 14 = Lead_Vehicle_Start_Alert, 18 = Keep_Hands_On_Steering_Alert, 24 = Audio_Beep, 25 = Audio_Lead_Car_Change, 26 = Audio_ACC_Disengaged, 27 = Audio_LKAS_disabled, 28 = Audio_Ding_Ding, 30 = Audio_Repeated_Beep";
+CM_ SG_ 802 LKAS_Left_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange";
+CM_ SG_ 802 LKAS_Dash_State "0 = Off, 1 = Ready, 2 = Active";
+CM_ SG_ 802 LKAS_Right_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange";
+CM_ SG_ 912 UNITS "0 = Metric, 1 = Imperial";
+CM_ SG_ 912 ICY_ROAD "1 = DASHLIGHT ON, 2 = WARNING, 3 = OFF";
+VAL_ 544 AEB_Status 12 "AEB related" 8 "AEB actuation" 4 "AEB related" 0 "No AEB actuation";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc
new file mode 100644
index 000000000..cbeff8096
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc
@@ -0,0 +1,246 @@
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX
+ SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 208 G_Sensor: 8 XXX
+ SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX
+ SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX
+ SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX
+
+BO_ 209 Brake_Pedal: 4 XXX
+ SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX
+ SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 210 Brake_2: 8 XXX
+ SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 211 Brake_Type: 8 XXX
+ SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 212 Wheel_Speeds: 8 XXX
+ SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX
+
+BO_ 320 Throttle: 8 XXX
+ SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX
+ SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX
+ SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 321 Engine: 8 XXX
+ SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX
+ SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX
+
+BO_ 324 CruiseControl: 8 XXX
+ SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 328 Transmission: 8 XXX
+ SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX
+ SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 329 CVT_Ratio: 8 XXX
+
+BO_ 336 Brake_Pressure: 8 XXX
+ SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 338 Stalk: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 352 ES_Brake: 8 XXX
+ SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 353 ES_Distance: 8 XXX
+ SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX
+ SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX
+ SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 354 ES_Status: 8 XXX
+ SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 356 ES_LKAS: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX
+ SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 359 ES_LDW: 8 XXX
+ SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 604 BSD_RCTA: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ State : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 642 Dashlights: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 880 Steering_Torque_2: 8 XXX
+ SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 884 BodyInfo: 8 XXX
+ SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 864 Engine_Temp: 8 XXX
+ SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 866 Fuel: 8 XXX
+
+BO_ 977 Dash_State2: 8 XXX
+ SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1745 Dash_State: 8 XXX
+ SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 320 Off_Throttle_2 "Less sensitive";
+CM_ SG_ 320 Throttle_Body "Throttle related";
+CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep";
+CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission";
+CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage";
+CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering";
+CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert ";
+CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart";
+CM_ SG_ 359 Sig1All_Depart "Left and right depart";
+CM_ SG_ 359 Sig2All_Depart "Left and right depart";
+CM_ SG_ 359 All_depart_2015 "always 1 on 2017";
+CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane";
+CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane";
+CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 642 COUNTER "Affected by signals";
+CM_ SG_ 642 SEATBELT_FL "Driver seatbelt";
+CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371";
+CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial";
+
+VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_forester_2017.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_forester_2017.dbc
new file mode 100644
index 000000000..34dc730a5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_forester_2017.dbc
@@ -0,0 +1,18 @@
+CM_ "IMPORT _subaru_preglobal_2015.dbc";
+
+BO_ 355 ES_DashStatus: 8 XXX
+ SG_ Not_Ready_Startup : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 40|3@1+ (1,0) [0|7] "" XXX
+ SG_ Brake : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ Car_Follow : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX
+
+BO_ 881 Steering_Torque: 8 XXX
+ SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX
+ SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_global_2017.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_global_2017.dbc
new file mode 100644
index 000000000..83a36ff8f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_global_2017.dbc
@@ -0,0 +1,65 @@
+CM_ "IMPORT _subaru_global.dbc";
+
+BO_ 72 Transmission: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Gear : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ RPM : 40|15@1+ (1,0) [0|65535] "" XXX
+
+BO_ 73 CVT: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ CVT_Gear : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 545 ES_Distance: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Throttle : 16|13@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal2 : 29|3@1+ (1,0) [0|15] "" XXX
+ SG_ Car_Follow : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Low_Speed_Follow : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Soft_Disable : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal7 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Distance_Swap : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_EPB : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal4 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ Close_Distance : 40|8@1+ (0.019607,0) [0|5] "m" XXX
+ SG_ Signal5 : 48|8@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Cancel : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Resume : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal6 : 59|5@1+ (1,0) [0|1] "" XXX
+
+BO_ 546 ES_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|3@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_RPM : 16|13@1+ (1,0) [0|4095] "" XXX
+ SG_ Cruise_Activated : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ Brake_Lights : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Hold : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 32|32@1+ (1,0) [0|1] "" XXX
+
+BO_ 576 CruiseControl: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|28@1+ (1,0) [0|268435455] "" XXX
+ SG_ Cruise_On : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 42|22@1+ (1,0) [0|4194303] "" XXX
+
+CM_ SG_ 545 Cruise_Throttle "RPM-like output signal";
+CM_ SG_ 545 Cruise_EPB "1 = Electric Parking Brake set";
+CM_ SG_ 545 Distance_Swap "Switch from Close to Far distance";
+CM_ SG_ 545 Cruise_Soft_Disable "Eyesight Temporary disable, sets CruiseControl Activated = 0";
+CM_ SG_ 546 Cruise_RPM "ES RPM output for ECM and TCM";
+CM_ SG_ 546 Signal3 "0 when cruise_activated = 1";
+CM_ SG_ 803 Signal1 "Seems to be static, set only on some cars";
+CM_ SG_ 803 Signal2 "Seems to be static, set only on some cars";
+VAL_ 803 LKAS_Blue_Lines 0 "no modifier" 2 "changes lines to blue";
+VAL_ 803 LKAS_State_Infotainment 0 "none" 2 "Obstacle Detected" 3 "Keep Hands On Wheel" 4 "Keep Hands On Wheel Off";
+VAL_ 72 Gear 2 "N" 3 "R" 4 "P" 121 "D" 137 "1" 145 "2" 153 "3" 161 "4" 169 "5" 177 "6";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc
new file mode 100644
index 000000000..a4dbe9c37
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc
@@ -0,0 +1,18 @@
+CM_ "IMPORT _subaru_global.dbc";
+
+BO_ 39 Cruise_Status_2: 8 XXX
+ SG_ Cruise_Activated : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 295 Transmission: 8 XXX
+ SG_ Gear : 44|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 360 Throttle_Hybrid: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 550 Brake_Hybrid: 8 XXX
+ SG_ Brake_Pedal : 24|8@1+ (1,0) [0|1] "" XXX
+ SG_ Brake : 37|1@1+ (1,0) [0|1] "" XXX
+
+VAL_ 295 Gear 0 "P" 1 "R" 3 "D";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_outback_2015.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_outback_2015.dbc
new file mode 100644
index 000000000..8134dd420
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_outback_2015.dbc
@@ -0,0 +1,30 @@
+CM_ "IMPORT _subaru_preglobal_2015.dbc";
+
+BO_ 358 ES_DashStatus: 8 XXX
+ SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX
+ SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX
+ SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX
+
+BO_ 881 Steering_Torque: 8 XXX
+ SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX
+ SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (1,0) [-1000|1000] "" XXX
+ SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX
+
+CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage";
+CM_ SG_ 358 Cruise_Fault "No engagement until restart";
+CM_ SG_ 358 Car_Follow "lead car detected";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_outback_2019.dbc b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_outback_2019.dbc
new file mode 100644
index 000000000..b04142fbc
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/subaru/subaru_outback_2019.dbc
@@ -0,0 +1,30 @@
+CM_ "IMPORT _subaru_preglobal_2015.dbc";
+
+BO_ 358 ES_DashStatus: 8 XXX
+ SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX
+ SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX
+ SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX
+
+BO_ 881 Steering_Torque: 8 XXX
+ SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX
+ SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX
+
+CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage";
+CM_ SG_ 358 Cruise_Fault "No engagement until restart";
+CM_ SG_ 358 Car_Follow "lead car detected";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/tesla/.gitignore b/iqdbc_repo/iqdbc/dbc/generator/tesla/.gitignore
new file mode 100644
index 000000000..554aeeaf2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/tesla/.gitignore
@@ -0,0 +1 @@
+*.dbc
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/tesla/_radar_common.py b/iqdbc_repo/iqdbc/dbc/generator/tesla/_radar_common.py
new file mode 100755
index 000000000..c25f57d3e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/tesla/_radar_common.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+def get_radar_point_definition(base_id, base_name):
+ return f"""
+BO_ {base_id} {base_name}_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ {base_id+1} {base_name}_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+"""
+
+
+def get_val_definition(base_id):
+ return f"""
+VAL_ {base_id+1} MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ {base_id+1} Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 \
+"RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;"""
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_bosch.dbc b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_bosch.dbc
new file mode 100644
index 000000000..d6f7ce1d2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_bosch.dbc
@@ -0,0 +1,1370 @@
+
+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_: Autopilot Radar Diag
+
+
+BO_ 769 TeslaRadarSguInfo: 8 Radar
+ SG_ RADC_VerticalMisalignment : 0|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_SCUTemperature : 8|8@1+ (1,-128) [-128|127] "" Autopilot
+ SG_ RADC_VMA_Plaus : 16|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_SGU_ITC : 24|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_HorizontMisalignment : 32|12@1+ (1,0) [0|4096] "" Autopilot
+ SG_ RADC_SensorDirty : 44|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_HWFail : 45|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_SGUFail : 46|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_SGUInfoConsistBit : 47|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 770 TeslaRadarTguInfo: 8 Radar
+ SG_ RADC_ACCTargObj1_sguIndex : 0|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj2_sguIndex : 6|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj3_sguIndex : 12|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj4_sguIndex : 18|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj5_sguIndex : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ unused30 : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_TGUInfoConsistBit : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_ACCTargObj1_dBPower : 32|16@1+ (1,0) [0|65535] "" Autopilot
+ SG_ RADC_ACCTargObj5_dBPower : 48|16@1+ (1,0) [0|65535] "" Autopilot
+
+BO_ 1281 TeslaRadarAlertMatrix: 8 Radar
+ SG_ RADC_a001_ecuInternalPerf : 0|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a002_flashPerformance : 1|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a003_vBatHigh : 2|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a004_adjustmentNotDone : 3|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a005_adjustmentReq : 4|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a006_adjustmentNotOk : 5|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a007_sensorBlinded : 6|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a008_plantModeActive : 7|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a009_configMismatch : 8|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a010_canBusOff : 9|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a011_bdyMIA : 10|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a012_espMIA : 11|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a013_gtwMIA : 12|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a014_sccmMIA : 13|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a015_adasMIA : 14|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a016_bdyInvalidCount : 15|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a017_adasInvalidCount : 16|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a018_espInvalidCount : 17|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a019_sccmInvalidCount : 18|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a020_bdyInvalidChkSm : 19|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a021_espInvalidChkSm : 20|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a022_sccmInvalidChkSm : 21|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a023_sccmInvalidChkSm : 22|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a024_absValidity : 23|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a025_ambTValidity : 24|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a026_brakeValidity : 25|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a027_CntryCdValidity : 26|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a028_espValidity : 27|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a029_longAccOffValidity : 28|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a030_longAccValidity : 29|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a031_odoValidity : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a032_gearValidity : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a033_steerAngValidity : 32|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a034_steerAngSpdValidity : 33|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a035_indctrValidity : 34|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a036_vehStandStillValidity : 35|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a037_vinValidity : 36|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a038_whlRotValidity : 37|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a039_whlSpdValidity : 38|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a040_whlStandStillValidity : 39|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a041_wiperValidity : 40|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a042_xwdValidity : 41|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a043_yawOffValidity : 42|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a044_yawValidity : 43|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a045_bsdSanity : 44|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a046_rctaSanity : 45|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a047_lcwSanity : 46|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a048_steerAngOffSanity : 47|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a049_tireSizeSanity : 48|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a050_velocitySanity : 49|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a051_yawSanity : 50|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a052_radomeHtrInop : 51|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a053_espmodValidity : 52|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a054_gtwmodValidity : 53|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a055_stwmodValidity : 54|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a056_bcmodValidity : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a057_dimodValidity : 56|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a058_opmodValidity : 57|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a059_drmiInvalidChkSm : 58|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a060_drmiInvalidCount : 59|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a061_radPositionMismatch : 60|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a062_strRackMismatch : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ unused62 : 62|2@1+ (1,0) [0|3] "" Autopilot
+
+BO_ 784 RadarPoint0_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 785 RadarPoint0_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 787 RadarPoint1_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 788 RadarPoint1_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 790 RadarPoint2_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 791 RadarPoint2_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 793 RadarPoint3_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 794 RadarPoint3_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 796 RadarPoint4_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 797 RadarPoint4_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 799 RadarPoint5_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 800 RadarPoint5_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 802 RadarPoint6_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 803 RadarPoint6_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 805 RadarPoint7_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 806 RadarPoint7_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 808 RadarPoint8_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 809 RadarPoint8_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 811 RadarPoint9_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 812 RadarPoint9_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 814 RadarPoint10_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 815 RadarPoint10_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 817 RadarPoint11_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 818 RadarPoint11_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 820 RadarPoint12_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 821 RadarPoint12_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 823 RadarPoint13_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 824 RadarPoint13_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 826 RadarPoint14_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 827 RadarPoint14_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 829 RadarPoint15_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 830 RadarPoint15_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 832 RadarPoint16_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 833 RadarPoint16_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 835 RadarPoint17_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 836 RadarPoint17_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 838 RadarPoint18_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 839 RadarPoint18_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 841 RadarPoint19_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 842 RadarPoint19_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 844 RadarPoint20_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 845 RadarPoint20_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 847 RadarPoint21_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 848 RadarPoint21_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 850 RadarPoint22_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 851 RadarPoint22_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 853 RadarPoint23_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 854 RadarPoint23_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 856 RadarPoint24_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 857 RadarPoint24_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 859 RadarPoint25_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 860 RadarPoint25_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 862 RadarPoint26_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 863 RadarPoint26_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 865 RadarPoint27_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 866 RadarPoint27_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 868 RadarPoint28_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 869 RadarPoint28_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 871 RadarPoint29_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 872 RadarPoint29_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 874 RadarPoint30_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 875 RadarPoint30_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 877 RadarPoint31_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 878 RadarPoint31_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 881 ProcessedRadarPoint1_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 882 ProcessedRadarPoint1_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 884 ProcessedRadarPoint2_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 885 ProcessedRadarPoint2_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 887 ProcessedRadarPoint3_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 888 ProcessedRadarPoint3_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 890 ProcessedRadarPoint4_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 891 ProcessedRadarPoint4_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 893 ProcessedRadarPoint5_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 894 ProcessedRadarPoint5_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 697 VIN_VIP_405HS: 8 Autopilot
+ SG_ VIN_MuxID M : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ VIN_Part1 m16 : 47|24@0+ (1,0) [0|16777215] "" Radar
+ SG_ VIN_Part2 m17 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar
+ SG_ VIN_Part3 m18 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar
+
+BO_ 681 Msg2A9_GTW_carConfig: 8 Autopilot
+ SG_ Msg2A9_Always0x02 : 48|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x10 : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x16 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x41 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Value1_0x02 : 0|3@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_FourWheelDrive : 3|2@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Value2_0x02 : 5|3@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x43 : 16|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 409 Msg199_STW_ANGLHP_STAT: 8 Autopilot
+ SG_ Msg199Always0x04 : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x20 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x2F : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x67 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0xFF : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 361 Msg169_ESP_wheelSpeeds: 8 Autopilot
+ SG_ ESP_wheelSpeedFrL_HS : 0|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedFrR_HS : 13|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedReL_HS : 26|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedReR_HS : 39|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ Msg169Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg169Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 345 Msg159_ESP_C: 8 Autopilot
+ SG_ Msg159Always0x3A : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xA5 : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xCF : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xF4 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Counter : 44|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Checksum : 24|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 329 Msg149_ESP_145h: 8 Autopilot
+ SG_ Msg149Always0x02 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x04 : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x26 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x6A : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0xAA : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0xF : 48|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 297 Msg129_ESP_115h: 6 Autopilot
+ SG_ Msg129Always0x20 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg129Checksum : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg129Counter : 36|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 281 Msg119_DI_torque2: 6 Autopilot
+ SG_ Msg119Always0x11 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0x1F : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0x8 : 36|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0xF4 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0xFF : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Checksum : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Counter : 32|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 265 Msg109_DI_torque1: 8 Autopilot
+ SG_ Msg109Always0x80 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg109Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg109Counter : 13|3@1+ (1,0) [0|0] "" Radar
+
+BO_ 521 Msg209_GTW_odo: 8 Autopilot
+ SG_ Msg209Always0x61 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x94 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x52 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x13 : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x03 : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x80 : 48|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 537 Msg219_STW_ACTN_RQ: 8 Autopilot
+ SG_ Msg219Counter : 52|4@1+ (1,0) [0|15] "" Radar
+ SG_ Msg219CRC : 56|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 425 Msg1A9_DI_espControl: 5 Autopilot
+ SG_ Msg1A9Always0x0C : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg1A9Counter : 28|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg1A9Checksum : 32|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 729 Msg2D9_BC_status : 8 Autopilot
+ SG_ Msg2D9Always0x80 : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2D9Always0x40 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2D9Always0x83 : 16|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 1601 UDS_radarRequest: 8 Diag
+ SG_ UDS_radarRequestData : 7|64@0+ (1,0) [0|0] "" Radar
+
+BO_ 1617 Radar_udsResponse: 8 Radar
+ SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|0] "" Diag
+
+CM_ BO_ 697 "Start with MuxID 0x12, then 0x11 and finally 0x10 (VIN is then transmitted in the reverse order)";
+CM_ BO_ 681 "Message sent every 1000 ms. All fixed bytes, no checksum, the byte for RWD or AWD needs to match VIN config";
+CM_ BO_ 409 "Message sent every 10ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo";
+CM_ BO_ 361 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x76";
+CM_ BO_ 345 "Message sent every 20ms. Checksum : Sum of all first bytes + 0xc; place checksum in 4th octet";
+CM_ BO_ 329 "Message sent every 20ms. Checksum : Sum of all first 7 bytes + 0x46";
+CM_ BO_ 297 "Message sent every 20ms. Checksum : Sum of all first 5 bytes + 0x16";
+CM_ BO_ 281 "Message sent every 10ms. Checksum : Sum of all first 5 bytes + 0x17";
+CM_ BO_ 265 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x7";
+CM_ BO_ 521 "Message sent every 100ms. All fixed bytes, no checksum.";
+CM_ BO_ 537 "Message sent every 100ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo";
+CM_ BO_ 425 "Message sent every 20ms. Checksum : Sum of all first 4 bytes + 0x38";
+CM_ BO_ 729 "Message sent every 1000ms. All fixed bytes, no checksum.";
+
+BA_DEF_ "BusType" STRING ;
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
+BA_DEF_ SG_ "FieldType" STRING ;
+
+BA_DEF_DEF_ "BusType" "CAN";
+BA_DEF_DEF_ "FieldType" "";
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BA_ "GenMsgCycleTime" BO_ 697 250;
+BA_ "GenMsgCycleTime" BO_ 681 1000;
+BA_ "GenMsgCycleTime" BO_ 409 10;
+BA_ "GenMsgCycleTime" BO_ 361 10;
+BA_ "GenMsgCycleTime" BO_ 345 20;
+BA_ "GenMsgCycleTime" BO_ 329 20;
+BA_ "GenMsgCycleTime" BO_ 297 20;
+BA_ "GenMsgCycleTime" BO_ 281 10;
+BA_ "GenMsgCycleTime" BO_ 265 10;
+BA_ "GenMsgCycleTime" BO_ 521 100;
+BA_ "GenMsgCycleTime" BO_ 537 100;
+BA_ "GenMsgCycleTime" BO_ 425 20;
+BA_ "GenMsgCycleTime" BO_ 729 1000;
+
+VAL_ 681 Msg2A9_FourWheelDrive 3 "SNA" 2 "UNUSED" 1 "4WD" 0 "2WD" ;
+VAL_ 785 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 785 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 788 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 788 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 791 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 791 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 794 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 794 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 797 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 797 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 800 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 800 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 803 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 803 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 806 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 806 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 809 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 809 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 812 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 812 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 815 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 815 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 818 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 818 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 821 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 821 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 824 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 824 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 827 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 827 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 830 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 830 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 833 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 833 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 836 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 836 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 839 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 839 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 842 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 842 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 845 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 845 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 848 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 848 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 851 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 851 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 854 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 854 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 857 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 857 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 860 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 860 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 863 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 863 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 866 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 866 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 869 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 869 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 872 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 872 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 875 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 875 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 878 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 878 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 882 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 882 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 885 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 885 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 888 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 888 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 891 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 891 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 894 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 894 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_bosch.py b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_bosch.py
new file mode 100755
index 000000000..adfd2d84f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_bosch.py
@@ -0,0 +1,282 @@
+#!/usr/bin/env python3
+
+import os
+from iqdbc.dbc.generator.tesla._radar_common import get_radar_point_definition, get_val_definition
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ tesla_path = os.path.dirname(os.path.realpath(__file__))
+ with open(os.path.join(tesla_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_: Autopilot Radar Diag
+
+
+BO_ 769 TeslaRadarSguInfo: 8 Radar
+ SG_ RADC_VerticalMisalignment : 0|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_SCUTemperature : 8|8@1+ (1,-128) [-128|127] "" Autopilot
+ SG_ RADC_VMA_Plaus : 16|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_SGU_ITC : 24|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_HorizontMisalignment : 32|12@1+ (1,0) [0|4096] "" Autopilot
+ SG_ RADC_SensorDirty : 44|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_HWFail : 45|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_SGUFail : 46|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_SGUInfoConsistBit : 47|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 770 TeslaRadarTguInfo: 8 Radar
+ SG_ RADC_ACCTargObj1_sguIndex : 0|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj2_sguIndex : 6|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj3_sguIndex : 12|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj4_sguIndex : 18|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj5_sguIndex : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ unused30 : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_TGUInfoConsistBit : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_ACCTargObj1_dBPower : 32|16@1+ (1,0) [0|65535] "" Autopilot
+ SG_ RADC_ACCTargObj5_dBPower : 48|16@1+ (1,0) [0|65535] "" Autopilot
+
+BO_ 1281 TeslaRadarAlertMatrix: 8 Radar
+ SG_ RADC_a001_ecuInternalPerf : 0|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a002_flashPerformance : 1|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a003_vBatHigh : 2|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a004_adjustmentNotDone : 3|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a005_adjustmentReq : 4|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a006_adjustmentNotOk : 5|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a007_sensorBlinded : 6|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a008_plantModeActive : 7|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a009_configMismatch : 8|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a010_canBusOff : 9|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a011_bdyMIA : 10|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a012_espMIA : 11|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a013_gtwMIA : 12|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a014_sccmMIA : 13|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a015_adasMIA : 14|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a016_bdyInvalidCount : 15|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a017_adasInvalidCount : 16|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a018_espInvalidCount : 17|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a019_sccmInvalidCount : 18|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a020_bdyInvalidChkSm : 19|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a021_espInvalidChkSm : 20|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a022_sccmInvalidChkSm : 21|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a023_sccmInvalidChkSm : 22|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a024_absValidity : 23|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a025_ambTValidity : 24|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a026_brakeValidity : 25|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a027_CntryCdValidity : 26|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a028_espValidity : 27|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a029_longAccOffValidity : 28|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a030_longAccValidity : 29|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a031_odoValidity : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a032_gearValidity : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a033_steerAngValidity : 32|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a034_steerAngSpdValidity : 33|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a035_indctrValidity : 34|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a036_vehStandStillValidity : 35|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a037_vinValidity : 36|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a038_whlRotValidity : 37|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a039_whlSpdValidity : 38|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a040_whlStandStillValidity : 39|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a041_wiperValidity : 40|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a042_xwdValidity : 41|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a043_yawOffValidity : 42|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a044_yawValidity : 43|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a045_bsdSanity : 44|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a046_rctaSanity : 45|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a047_lcwSanity : 46|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a048_steerAngOffSanity : 47|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a049_tireSizeSanity : 48|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a050_velocitySanity : 49|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a051_yawSanity : 50|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a052_radomeHtrInop : 51|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a053_espmodValidity : 52|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a054_gtwmodValidity : 53|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a055_stwmodValidity : 54|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a056_bcmodValidity : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a057_dimodValidity : 56|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a058_opmodValidity : 57|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a059_drmiInvalidChkSm : 58|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a060_drmiInvalidCount : 59|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a061_radPositionMismatch : 60|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a062_strRackMismatch : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ unused62 : 62|2@1+ (1,0) [0|3] "" Autopilot
+""")
+
+ M_RANGE = range(0x310, 0x36D + 1, 3)
+ for i, base_id in enumerate(M_RANGE):
+ f.write(get_radar_point_definition(base_id, f"RadarPoint{i}"))
+
+ L_RANGE = range(0x371, 0x37D + 1, 3)
+ for i, base_id in enumerate(L_RANGE):
+ f.write(get_radar_point_definition(base_id, f"ProcessedRadarPoint{i+1}"))
+
+ f.write("""
+BO_ 697 VIN_VIP_405HS: 8 Autopilot
+ SG_ VIN_MuxID M : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ VIN_Part1 m16 : 47|24@0+ (1,0) [0|16777215] "" Radar
+ SG_ VIN_Part2 m17 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar
+ SG_ VIN_Part3 m18 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar
+
+BO_ 681 Msg2A9_GTW_carConfig: 8 Autopilot
+ SG_ Msg2A9_Always0x02 : 48|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x10 : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x16 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x41 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Value1_0x02 : 0|3@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_FourWheelDrive : 3|2@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Value2_0x02 : 5|3@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x43 : 16|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 409 Msg199_STW_ANGLHP_STAT: 8 Autopilot
+ SG_ Msg199Always0x04 : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x20 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x2F : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x67 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0xFF : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 361 Msg169_ESP_wheelSpeeds: 8 Autopilot
+ SG_ ESP_wheelSpeedFrL_HS : 0|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedFrR_HS : 13|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedReL_HS : 26|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedReR_HS : 39|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ Msg169Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg169Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 345 Msg159_ESP_C: 8 Autopilot
+ SG_ Msg159Always0x3A : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xA5 : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xCF : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xF4 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Counter : 44|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Checksum : 24|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 329 Msg149_ESP_145h: 8 Autopilot
+ SG_ Msg149Always0x02 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x04 : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x26 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x6A : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0xAA : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0xF : 48|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 297 Msg129_ESP_115h: 6 Autopilot
+ SG_ Msg129Always0x20 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg129Checksum : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg129Counter : 36|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 281 Msg119_DI_torque2: 6 Autopilot
+ SG_ Msg119Always0x11 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0x1F : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0x8 : 36|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0xF4 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0xFF : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Checksum : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Counter : 32|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 265 Msg109_DI_torque1: 8 Autopilot
+ SG_ Msg109Always0x80 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg109Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg109Counter : 13|3@1+ (1,0) [0|0] "" Radar
+
+BO_ 521 Msg209_GTW_odo: 8 Autopilot
+ SG_ Msg209Always0x61 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x94 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x52 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x13 : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x03 : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x80 : 48|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 537 Msg219_STW_ACTN_RQ: 8 Autopilot
+ SG_ Msg219Counter : 52|4@1+ (1,0) [0|15] "" Radar
+ SG_ Msg219CRC : 56|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 425 Msg1A9_DI_espControl: 5 Autopilot
+ SG_ Msg1A9Always0x0C : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg1A9Counter : 28|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg1A9Checksum : 32|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 729 Msg2D9_BC_status : 8 Autopilot
+ SG_ Msg2D9Always0x80 : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2D9Always0x40 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2D9Always0x83 : 16|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 1601 UDS_radarRequest: 8 Diag
+ SG_ UDS_radarRequestData : 7|64@0+ (1,0) [0|0] "" Radar
+
+BO_ 1617 Radar_udsResponse: 8 Radar
+ SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|0] "" Diag
+
+CM_ BO_ 697 "Start with MuxID 0x12, then 0x11 and finally 0x10 (VIN is then transmitted in the reverse order)";
+CM_ BO_ 681 "Message sent every 1000 ms. All fixed bytes, no checksum, the byte for RWD or AWD needs to match VIN config";
+CM_ BO_ 409 "Message sent every 10ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo";
+CM_ BO_ 361 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x76";
+CM_ BO_ 345 "Message sent every 20ms. Checksum : Sum of all first bytes + 0xc; place checksum in 4th octet";
+CM_ BO_ 329 "Message sent every 20ms. Checksum : Sum of all first 7 bytes + 0x46";
+CM_ BO_ 297 "Message sent every 20ms. Checksum : Sum of all first 5 bytes + 0x16";
+CM_ BO_ 281 "Message sent every 10ms. Checksum : Sum of all first 5 bytes + 0x17";
+CM_ BO_ 265 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x7";
+CM_ BO_ 521 "Message sent every 100ms. All fixed bytes, no checksum.";
+CM_ BO_ 537 "Message sent every 100ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo";
+CM_ BO_ 425 "Message sent every 20ms. Checksum : Sum of all first 4 bytes + 0x38";
+CM_ BO_ 729 "Message sent every 1000ms. All fixed bytes, no checksum.";
+
+BA_DEF_ "BusType" STRING ;
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
+BA_DEF_ SG_ "FieldType" STRING ;
+
+BA_DEF_DEF_ "BusType" "CAN";
+BA_DEF_DEF_ "FieldType" "";
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BA_ "GenMsgCycleTime" BO_ 697 250;
+BA_ "GenMsgCycleTime" BO_ 681 1000;
+BA_ "GenMsgCycleTime" BO_ 409 10;
+BA_ "GenMsgCycleTime" BO_ 361 10;
+BA_ "GenMsgCycleTime" BO_ 345 20;
+BA_ "GenMsgCycleTime" BO_ 329 20;
+BA_ "GenMsgCycleTime" BO_ 297 20;
+BA_ "GenMsgCycleTime" BO_ 281 10;
+BA_ "GenMsgCycleTime" BO_ 265 10;
+BA_ "GenMsgCycleTime" BO_ 521 100;
+BA_ "GenMsgCycleTime" BO_ 537 100;
+BA_ "GenMsgCycleTime" BO_ 425 20;
+BA_ "GenMsgCycleTime" BO_ 729 1000;
+
+VAL_ 681 Msg2A9_FourWheelDrive 3 "SNA" 2 "UNUSED" 1 "4WD" 0 "2WD" ;""")
+
+ for base_id in list(M_RANGE) + list(L_RANGE):
+ f.write(get_val_definition(base_id))
diff --git a/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_continental.dbc b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_continental.dbc
new file mode 100644
index 000000000..ae9acb484
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_continental.dbc
@@ -0,0 +1,1259 @@
+
+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_: Autopilot Radar Diag
+
+BO_ 1025 RadarStatus: 8 Radar
+ SG_ carparkDetected : 29|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ decreaseBlockage : 25|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ horizontMisalignment : 8|12@1+ (0.00012207,-0.25) [-0.25|0.249878] "rad" Autopilot
+ SG_ increaseBlockage : 24|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ lowPowerMode : 20|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ powerOnSelfTest : 22|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorBlocked : 26|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorInfoConsistBit : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorReplace : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ shortTermUnavailable : 23|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ tunnelDetected : 28|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ vehDynamicsError : 27|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ verticalMisalignment : 0|8@1+ (0.00195313,-0.25) [-0.25|0.248047] "rad" Autopilot
+
+BO_ 1617 Radar_udsResponse: 8 Radar
+ SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|1.84467e+19] "" Diag
+
+BO_ 1601 UDS_radcRequest: 8 Diag
+ SG_ UDS_radcRequestData : 7|64@0+ (1,0) [0|1.84467e+19] "" Radar
+
+BO_ 1040 RadarPoint0_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1041 RadarPoint0_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1042 RadarPoint1_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1043 RadarPoint1_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1044 RadarPoint2_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1045 RadarPoint2_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1046 RadarPoint3_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1047 RadarPoint3_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1048 RadarPoint4_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1049 RadarPoint4_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1050 RadarPoint5_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1051 RadarPoint5_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1052 RadarPoint6_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1053 RadarPoint6_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1054 RadarPoint7_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1055 RadarPoint7_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1056 RadarPoint8_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1057 RadarPoint8_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1058 RadarPoint9_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1059 RadarPoint9_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1060 RadarPoint10_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1061 RadarPoint10_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1062 RadarPoint11_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1063 RadarPoint11_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1064 RadarPoint12_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1065 RadarPoint12_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1066 RadarPoint13_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1067 RadarPoint13_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1068 RadarPoint14_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1069 RadarPoint14_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1070 RadarPoint15_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1071 RadarPoint15_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1072 RadarPoint16_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1073 RadarPoint16_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1074 RadarPoint17_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1075 RadarPoint17_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1076 RadarPoint18_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1077 RadarPoint18_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1078 RadarPoint19_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1079 RadarPoint19_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1080 RadarPoint20_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1081 RadarPoint20_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1082 RadarPoint21_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1083 RadarPoint21_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1084 RadarPoint22_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1085 RadarPoint22_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1086 RadarPoint23_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1087 RadarPoint23_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1088 RadarPoint24_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1089 RadarPoint24_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1090 RadarPoint25_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1091 RadarPoint25_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1092 RadarPoint26_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1093 RadarPoint26_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1094 RadarPoint27_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1095 RadarPoint27_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1096 RadarPoint28_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1097 RadarPoint28_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1098 RadarPoint29_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1099 RadarPoint29_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1100 RadarPoint30_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1101 RadarPoint30_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1102 RadarPoint31_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1103 RadarPoint31_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1104 RadarPoint32_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1105 RadarPoint32_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1106 RadarPoint33_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1107 RadarPoint33_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1108 RadarPoint34_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1109 RadarPoint34_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1110 RadarPoint35_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1111 RadarPoint35_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1112 RadarPoint36_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1113 RadarPoint36_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1114 RadarPoint37_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1115 RadarPoint37_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1116 RadarPoint38_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1117 RadarPoint38_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1118 RadarPoint39_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1119 RadarPoint39_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+VAL_ 1025 lowPowerMode 1 "COMMANDED_LOW_POWER" 0 "DEFAULT_LOW_POWER" 2 "NORMAL_POWER" 3 "SNA";
+VAL_ 1041 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1041 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1043 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1043 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1045 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1045 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1047 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1047 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1049 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1049 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1051 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1051 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1053 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1053 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1055 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1055 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1057 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1057 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1059 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1059 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1061 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1061 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1063 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1063 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1065 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1065 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1067 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1067 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1069 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1069 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1071 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1071 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1073 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1073 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1075 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1075 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1077 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1077 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1079 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1079 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1081 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1081 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1083 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1083 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1085 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1085 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1087 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1087 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1089 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1089 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1091 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1091 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1093 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1093 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1095 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1095 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1097 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1097 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1099 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1099 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1101 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1101 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1103 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1103 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1105 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1105 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1107 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1107 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1109 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1109 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1111 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1111 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1113 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1113 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1115 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1115 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1117 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1117 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1119 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1119 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_continental.py b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_continental.py
new file mode 100755
index 000000000..c3e325c26
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/tesla/tesla_radar_continental.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+
+import os
+from iqdbc.dbc.generator.tesla._radar_common import get_radar_point_definition, get_val_definition
+
+if __name__ == "__main__":
+ dbc_name = os.path.basename(__file__).replace(".py", ".dbc")
+ tesla_path = os.path.dirname(os.path.realpath(__file__))
+ with open(os.path.join(tesla_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_: Autopilot Radar Diag
+
+BO_ 1025 RadarStatus: 8 Radar
+ SG_ carparkDetected : 29|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ decreaseBlockage : 25|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ horizontMisalignment : 8|12@1+ (0.00012207,-0.25) [-0.25|0.249878] "rad" Autopilot
+ SG_ increaseBlockage : 24|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ lowPowerMode : 20|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ powerOnSelfTest : 22|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorBlocked : 26|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorInfoConsistBit : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorReplace : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ shortTermUnavailable : 23|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ tunnelDetected : 28|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ vehDynamicsError : 27|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ verticalMisalignment : 0|8@1+ (0.00195313,-0.25) [-0.25|0.248047] "rad" Autopilot
+
+BO_ 1617 Radar_udsResponse: 8 Radar
+ SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|1.84467e+19] "" Diag
+
+BO_ 1601 UDS_radcRequest: 8 Diag
+ SG_ UDS_radcRequestData : 7|64@0+ (1,0) [0|1.84467e+19] "" Radar
+""")
+
+ POINT_RANGE = range(0x410, 0x45E + 1, 2)
+ for i, base_id in enumerate(POINT_RANGE):
+ f.write(get_radar_point_definition(base_id, f"RadarPoint{i}"))
+
+ f.write("""
+VAL_ 1025 lowPowerMode 1 "COMMANDED_LOW_POWER" 0 "DEFAULT_LOW_POWER" 2 "NORMAL_POWER" 3 "SNA";""")
+
+ for base_id in list(POINT_RANGE):
+ f.write(get_val_definition(base_id))
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/_community.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/_community.dbc
new file mode 100644
index 000000000..61ab55534
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/_community.dbc
@@ -0,0 +1,41 @@
+BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
+
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX
+ SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX
+
+CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss";
+
+BO_ 767 SDSU: 8 XXX
+ SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX
+
+CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu";
+CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
+
+VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/_toyota_2017.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/_toyota_2017.dbc
new file mode 100644
index 000000000..4524b1ea6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/_toyota_2017.dbc
@@ -0,0 +1,560 @@
+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 DSU HCU EPS IPAS CGW BGM
+
+BO_ 36 KINEMATICS: 8 XXX
+ SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+ SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX
+ SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+
+BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
+ SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
+ SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
+ SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
+
+BO_ 119 ENG2F41: 6 CGW
+ SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX
+ SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 120 ENG2F42: 4 CGW
+ SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X
+ SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 166 BRAKE: 8 XXX
+ SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
+
+BO_ 170 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+
+BO_ 180 SPEED: 8 XXX
+ SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 295 GEAR_PACKET_HYBRID: 8 XXX
+ SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX
+ SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 353 DSU_SPEED: 7 XXX
+ SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
+
+BO_ 452 ENGINE_RPM: 8 CGW
+ SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
+ SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 467 PCM_CRUISE_2: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 552 VSC1S29: 4 CGW
+ SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1
+ SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1
+
+BO_ 560 BRAKE_2: 7 XXX
+ SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 581 GAS_PEDAL_HYBRID: 8 XXX
+ SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
+
+BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 614 STEERING_IPAS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 742 LEAD_INFO: 8 DSU
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
+ SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
+ SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
+
+BO_ 800 VSC1S07: 8 CGW
+ SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1
+ SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1
+ SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1
+ SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1
+ SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1
+ SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1
+ SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 835 ACC_CONTROL: 8 DSU
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX
+ SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
+ SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
+ SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
+ SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
+ SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
+ SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 865 CLUTCH: 8 XXX
+ SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX
+
+BO_ 869 DSU_CRUISE : 7 DSU
+ SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
+
+BO_ 898 AIR_CONDITIONER: 8 XXX
+ SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX
+ SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 921 PCM_CRUISE_SM: 8 XXX
+ SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 944 AIR_CONDITIONER_2: 8 XXX
+ SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 951 ESP_CONTROL: 8 ESP
+ SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 956 GEAR_PACKET: 8 XXX
+ SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM
+ SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX
+
+BO_ 1009 PCM_CRUISE_ALT: 8 XXX
+ SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+
+BO_ 1020 SOLAR_SENSOR: 8 XXX
+ SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX
+
+BO_ 1041 PCS_HUD: 8 DSU
+ SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 LKAS_HUD: 8 DSU
+ SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX
+ SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 TIME : 8 CGW
+ SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
+ SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
+ SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
+ SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
+ SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
+ SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
+ SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
+ SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1044 AUTO_HIGH_BEAM: 8 FCM
+ SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+ SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1056 VSC1S08: 8 CGW
+ SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 1083 AUTOPARK_STATUS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1161 RSA1: 8 FCM
+ SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1162 RSA2: 8 FCM
+ SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1163 RSA3: 8 FCM
+ SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
+ SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1408 VIN_PART_1: 8 CGW
+ SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1409 VIN_PART_2: 8 CGW
+ SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1410 VIN_PART_3: 8 CGW
+ SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX
+ SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX
+ SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX
+
+BO_ 1553 UI_SETTING: 8 XXX
+ SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX
+
+BO_ 1556 BLINKERS_STATE: 8 XXX
+ SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1568 BODY_CONTROL_STATE: 8 XXX
+ SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1570 LIGHT_STALK: 8 SCM
+ SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1571 CERTIFICATION_ECU: 8 CGW
+ SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1592 DOOR_LOCKS: 8 XXX
+ SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX
+ SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM
+ SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 36 YAW_RATE "verify";
+CM_ SG_ 36 ACCEL_X "x-axis accel";
+CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
+CM_ SG_ 37 STEER_RATE "factor is tbd";
+CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking";
+CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command";
+CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking";
+CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
+CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect";
+CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
+CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
+CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered";
+CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
+CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
+CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
+CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok";
+CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD";
+CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
+CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
+CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
+CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
+CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
+CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
+CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
+CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
+CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
+CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
+CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force";
+CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
+CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs";
+CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
+CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
+CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
+CM_ SG_ 956 GEAR "on 6MT, only R shows.";
+CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to";
+CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator";
+CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity";
+CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual";
+CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor";
+CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature";
+CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual";
+CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM";
+CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle";
+CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0";
+CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity";
+CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message";
+CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning";
+CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1";
+CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages";
+CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1";
+CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning";
+CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch";
+CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered";
+CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled";
+CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS";
+CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations";
+CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations";
+CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero";
+CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
+CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1161 SPDVAL2 "conditional speed value 70";
+CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
+CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1163 TSREQPD "always 1";
+CM_ SG_ 1163 TSRMSW "always 1";
+CM_ SG_ 1163 OTSGNNTM "always 3";
+CM_ SG_ 1163 NTLVLSPD "always 3";
+CM_ SG_ 1163 OVSPNTM "always 3";
+CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
+CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
+CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
+CM_ SG_ 1163 TSRSPU "always 1";
+CM_ SG_ 1552 UI_SPEED "Does not appear to match dash";
+CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting";
+CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
+CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking";
+CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal.";
+CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch";
+
+VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B";
+VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
+VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 614 STATE 3 "enabled" 1 "disabled";
+VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
+VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
+VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok";
+VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear";
+VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press";
+VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released";
+VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF";
+VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF";
+VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
+VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far";
+VAL_ 956 SPORT_ON 0 "off" 1 "on";
+VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
+VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on";
+VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6";
+VAL_ 956 ECON_ON 0 "off" 1 "on";
+VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on";
+VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on";
+VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines";
+VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled";
+VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off";
+VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
+VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none";
+VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LKAS_STATUS 1 "on" 0 "off";
+VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear";
+VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on";
+VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined";
+VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok";
+VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok";
+VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok";
+VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok";
+VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok";
+VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
+VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
+VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
+VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on";
+VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed";
+VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)";
+VAL_ 1553 UNITS 1 "km" 2 "miles";
+VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
+VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed";
+VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights";
+VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/_toyota_adas_standard.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/_toyota_adas_standard.dbc
new file mode 100644
index 000000000..20680225a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/_toyota_adas_standard.dbc
@@ -0,0 +1,56 @@
+BO_ 466 PCM_CRUISE: 8 XXX
+ SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX
+ SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX
+ SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 7 DSU
+ SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
+ SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
+ SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 705 GAS_PEDAL: 8 XXX
+ SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX
+ SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS
+ SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX
+ SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 740 STEERING_LKA: 5 XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 836 PRE_COLLISION_2: 8 DSU
+ SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
+ SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
+ SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
+ SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input";
+CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command";
+CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground";
+CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
+CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
+
+VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
+VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_new_mc_pt.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_new_mc_pt.dbc
new file mode 100644
index 000000000..4ff3f2e21
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_new_mc_pt.dbc
@@ -0,0 +1,22 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _toyota_2017.dbc";
+CM_ "IMPORT _toyota_adas_standard.dbc";
+
+BO_ 548 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 43|12@0+ (1,0) [0|4047] "" XXX
+ SG_ BRAKE_PRESSED : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 610 EPS_STATUS: 5 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1178 BRAKE_RELATED: 8 XXX
+ SG_ BRAKE_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_nodsu_pt.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_nodsu_pt.dbc
new file mode 100644
index 000000000..109e85498
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_nodsu_pt.dbc
@@ -0,0 +1,79 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _toyota_2017.dbc";
+CM_ "IMPORT _toyota_adas_standard.dbc";
+
+BO_ 401 STEERING_LTA: 8 XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX
+ SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX
+ SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 550 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 610 EPS_STATUS: 8 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 881 LTA_RELATED: 8 FCM
+ SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX
+ SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1014 BSM: 8 XXX
+ SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP";
+CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override";
+CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera";
+CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out";
+CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel";
+CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA";
+CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist";
+CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)";
+CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far";
+CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE";
+CM_ SG_ 881 TURN_SIGNALS "flipped on some cars";
+CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars";
+CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST";
+CM_ SG_ 881 UNKNOWN "related to steering wheel angle";
+CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal";
+CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility";
+CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility";
+
+VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX";
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby";
+VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_secoc_pt.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_secoc_pt.dbc
new file mode 100644
index 000000000..eefe99066
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_secoc_pt.dbc
@@ -0,0 +1,156 @@
+CM_ "IMPORT _toyota_2017.dbc";
+
+BO_ 15 SECOC_SYNCHRONIZATION: 8 XXX
+ SG_ TRIP_CNT : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ RESET_CNT : 23|20@0+ (1,0) [0|65535] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+
+BO_ 257 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PRESSURE_1 : 31|8@0+ (1,0) [0|15] "" XXX
+ SG_ BRAKE_PRESSURE_2 : 61|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 278 GAS_PEDAL: 8 XXX
+ SG_ GAS_PEDAL_ACC : 7|8@0+ (0.005,0) [0|255] "" XXX
+ SG_ GAS_PEDAL_USER : 15|8@0+ (0.005,0) [0|255] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 305 STEERING_LTA_2: 8 XXX
+ SG_ STEER_REQUEST_2 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_REQUEST : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ STEER_ANGLE_CMD : 23|16@0- (0.0573,0) [0|65535] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 374 PCM_CRUISE: 8 XXX
+ SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_STATE : 31|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 375 PCM_CRUISE_3: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0- (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_RELEASED : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 387 ACC_CONTROL_2: 8 XXX
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 401 STEERING_LTA: 8 XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX
+ SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX
+ SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 418 CRUISE_RELATED: 8 XXX
+ SG_ CRUISE_ACTIVE : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 589 PCM_CRUISE_4: 8 PCM
+ SG_ DISTANCE : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ CANCEL : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DECREASE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENABLE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ INCREASE : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 610 EPS_STATUS: 8 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 8 DSU
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 740 STEERING_LKA: 8 XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 836 PRE_COLLISION_2: 8 DSU
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 881 LTA_RELATED: 8 FCM
+ SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX
+ SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1014 BSM: 8 XXX
+ SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 305 STEER_ANGLE_CMD "Used in place of STEERING_LTA.STEER_ANGLE_CMD on SecOC cars";
+CM_ SG_ 387 ACCEL_CMD "Used in place of ACC_CONTROL.ACCEL_CMD on SecOC cars";
+CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist";
+CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out";
+CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA";
+CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)";
+CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel";
+CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP";
+CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override";
+CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far";
+CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE";
+CM_ SG_ 881 TURN_SIGNALS "flipped on some cars";
+CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars";
+CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST";
+CM_ SG_ 881 UNKNOWN "related to steering wheel angle";
+CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal";
+CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility";
+CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility";
+
+VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX";
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc
new file mode 100644
index 000000000..d0ce72699
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc
@@ -0,0 +1,21 @@
+CM_ "IMPORT _community.dbc";
+CM_ "IMPORT _toyota_2017.dbc";
+CM_ "IMPORT _toyota_adas_standard.dbc";
+
+BO_ 550 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 610 EPS_STATUS: 5 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_chassis.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_chassis.dbc
new file mode 100644
index 000000000..e1fc1ccbf
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_chassis.dbc
@@ -0,0 +1,75 @@
+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_: K182_PACM K43_PSCM K17_EBCM NEO K124_ASCM
+
+
+
+BO_ 823 PACMParkAssitCmd: 7 NEO
+ SG_ RollingCounter : 35|2@0+ (1,0) [0|0] "" NEO
+ SG_ SteeringWheelChecksum : 47|16@0+ (1,0) [0|0] "" NEO
+ SG_ SteeringWheelCmd : 23|16@0+ (1,0) [0|0] "" NEO
+
+BO_ 560 EBCMRegen: 6 K17_EBCM
+ SG_ Regen : 1|10@0+ (1,0) [0|0] "" NEO
+
+BO_ 368 EBCMFrictionBrakeStatus: 8 K17_EBCM
+ SG_ FrictionBrakePressure : 23|16@0+ (1,0) [0|0] "" NEO
+
+BO_ 789 EBCMFrictionBrakeCmd: 5 K17_EBCM
+ SG_ RollingCounter : 33|2@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO
+
+BO_TX_BU_ 823 : K43_PSCM,NEO;
+BO_TX_BU_ 789 : NEO,K17_EBCM;
+
+
+CM_ BU_ K182_PACM "Parking Assist Control Module";
+CM_ BU_ K43_PSCM "Power Steering Control Module";
+CM_ BU_ K17_EBCM "Electronic Brake Control Module";
+CM_ BU_ NEO "Comma NEO";
+CM_ BU_ K124_ASCM "Active Safety Control Module";
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "UseGMParameterIDs" 0;
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_high_voltage_management.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_high_voltage_management.dbc
new file mode 100644
index 000000000..60729e569
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_high_voltage_management.dbc
@@ -0,0 +1,196 @@
+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_: K16_BECM K114B_HPCM T18_BatteryCharger
+BO_ 512 Battery_Module_1: 8 K16_BECM
+ SG_ Voltage_1_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_1_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Cell_Bank_Number_1 M : 55|3@0+ (1,0) [0|0] "" K16_BECM
+
+BO_ 514 Battery_Module_2: 8 K16_BECM
+ SG_ Voltage_2_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_2_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Cell_Bank_Number_2 M : 55|3@0+ (1,0) [0|0] "" K16_BECM
+
+BO_ 516 Battery_Module_3: 8 K16_BECM
+ SG_ Voltage_3_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_3_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Cell_Bank_Number_3 M : 55|3@0+ (1,0) [0|0] "" K16_BECM
+
+BO_ 518 Battery_Module_4: 8 K16_BECM
+ SG_ Voltage_4_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Voltage_4_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM
+ SG_ Cell_Bank_Number_4 M : 55|3@0+ (1,0) [0|0] "" K16_BECM
+
+BO_ 528 Pack_Stats: 8 K16_BECM
+ SG_ Pack_Voltage : 7|12@0+ (0.125,0) [0|0] "V" K16_BECM
+ SG_ Pack_Current : 23|8@0- (0.1,-0.1) [0|0] "A" K16_BECM
+
+BO_ 530 Charger_stats: 6 T18_BatteryCharger
+ SG_ Charger_HV_Current : 7|13@0+ (0.05,0) [0|0] "A" K16_BECM
+ SG_ HV_Voltage : 10|10@0+ (0.5,0) [0|0] "V" K16_BECM
+ SG_ LV_Current : 16|8@0+ (0.2,0) [0|0] "A" K16_BECM
+ SG_ LV_Voltage : 24|8@0+ (0.1,0) [0|0] "V" K16_BECM
+
+BO_ 770 Battery_temp: 8 K16_BECM
+ SG_ Temp_A m0 : 8|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_B m0 : 16|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_C m0 : 24|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_D m0 : 32|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_E m0 : 40|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_F m0 : 48|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_G m1 : 8|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_H m1 : 16|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Temp_I m1 : 24|8@1+ (0.5,-40) [0|0] "C" K16_BECM
+ SG_ Switch M : 2|1@1+ (1,0) [0|0] "" K16_BECM
+
+BO_ 782 Charger_Command: 1 T18_BatteryCharger
+ SG_ Command : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 772 Charger_parameters: 4 T18_BatteryCharger
+ SG_ Unknown : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ Current : 8|8@1+ (0.05,0) [0|0] "A" Vector__XXX
+ SG_ Voltage : 23|16@0+ (0.5,0) [0|0] "V" Vector__XXX
+
+BO_ 1120 Coolant_Temp: 4 K16_BECM
+ SG_ Inlet_Coolant_Temp : 1|10@0+ (0.125,-40) [0|0] "" Vector__XXX
+ SG_ Outlet_Coolant_Temp : 17|10@0+ (0.125,-40) [0|0] "" Vector__XXX
+
+BO_ 778 AC_Stats: 7 T18_BatteryCharger
+ SG_ Mains_Voltage : 10|2@0+ (1,0) [0|0] "V" Vector__XXX
+ SG_ Total_Charge : 19|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 776 Charger_status: 5 T18_BatteryCharger
+ SG_ Status : 20|3@1+ (1,0) [0|0] "" Vector__XXX
+
+BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ;
+BA_DEF_ BO_ "GenMsgForegroundColor" STRING ;
+BA_DEF_ BO_ "isj1939dbc" INT 0 0;
+BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff";
+BA_DEF_DEF_ "GenMsgForegroundColor" "#000000";
+BA_DEF_DEF_ "isj1939dbc" 0;
+CM_ BU_ K16_BECM "Battery Energy Control Module";
+CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module";
+CM_ BU_ T18_BatteryCharger "Battery Charger";
+VAL_ 782 Command 1 "12V_Only" 2 "HV_Only" 3 "12V_and_HV";
+VAL_ 778 Mains_Voltage 0 "Unplugged" 1 "110V" 3 "220V";
+VAL_ 776 Status 0 "Off" 5 "LV_Only" 7 "HV_and_LV" 3 "HV_Only";
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_lowspeed.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_lowspeed.dbc
new file mode 100644
index 000000000..524eeed8b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_lowspeed.dbc
@@ -0,0 +1,118 @@
+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_: GMLAN NEO
+VAL_TABLE_ GearShifter 3 "Park" 0 "Drive/Low" ;
+VAL_TABLE_ DriverDoorStatus 1 "Opened" 0 "Closed" ;
+VAL_TABLE_ LKAGapButton 2 "???" 1 "??" 0 "None" ;
+VAL_TABLE_ CruiseButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_TABLE_ CruiseControlActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ BlinkerStatus 1 "Active" 0 "Inactive" ;
+
+
+BO_ 274923520 DriverDoorStatus: 1 GMLAN
+ SG_ DriverDoorOpened : 0|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 272629760 Chime: 5 NEO
+ SG_ ChimeType : 7|8@0+ (1,0) [0|0] "" GMLAN
+ SG_ ChimeRepeat : 23|8@0+ (1,0) [0|0] "" GMLAN
+ SG_ ChimeDuration : 15|8@0+ (1,0) [0|0] "" GMLAN
+ SG_ ChimeByte5 : 39|8@0+ (1,0) [0|0] "" GMLAN
+ SG_ ChimeByte4 : 31|8@0+ (1,0) [0|0] "" GMLAN
+
+BO_ 270581760 BlinkerStatus: 5 GMLAN
+ SG_ RightBlinker : 6|1@0+ (1,0) [0|0] "" NEO
+ SG_ LeftBlinker : 7|1@0+ (1,0) [0|0] "" NEO
+ SG_ BlinkerLight : 25|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 270794752 SteeringWheelAngle: 8 GMLAN
+ SG_ SteeringWheelAngle : 39|16@0- (0.0625,0) [-540|540] "deg" NEO
+
+BO_ 271368192 GearShifter: 8 GMLAN
+ SG_ GearShifter : 17|2@0+ (1,0) [0|3] "" NEO
+
+BO_ 271360000 GasPedalRegenCruise: 8 GMLAN
+ SG_ CruiseControlActive : 56|1@0+ (1,0) [0|0] "" GMLAN
+ SG_ MaxRegen : 12|1@0+ (1,0) [0|1] "" GMLAN,NEO
+ SG_ GasPedal : 47|8@0+ (1,0) [0|254] "" GMLAN,NEO
+ SG_ GearShifter2NotUsed : 55|8@0+ (1,0) [0|255] "" GMLAN,NEO
+
+BO_ 270860288 BrakePedal: 2 GMLAN
+ SG_ BrakeLevel : 2|2@0+ (1,0) [0|3] "" NEO
+ SG_ BrakeSensor : 15|8@0+ (1,0) [0|255] "" NEO
+
+BO_ 275480576 WheelSpeed: 8 GMLAN
+ SG_ WheelSpeedFL : 7|16@0+ (0.01,0) [0|70] "yd/s" NEO
+ SG_ WheelSpeedFR : 39|16@0+ (0.01,0) [0|70] "yd/s" NEO
+ SG_ WheelSpeedRL : 23|16@0+ (0.01,0) [0|70] "yd/s" NEO
+ SG_ WheelSpeedRR : 55|16@0+ (0.01,0) [0|70] "yd/s" NEO
+
+BO_ 270598144 VehicleSpeed: 8 GMLAN
+ SG_ VehicleSpeed1 : 7|16@0+ (0.01,0) [0|100] "mph" NEO
+ SG_ VehicleSpeed2 : 39|16@0+ (0.01,0) [0|100] "mph" NEO
+
+BO_ 276135936 CruiseButtons: 3 GMLAN
+ SG_ CruiseButtons : 3|3@0+ (1,0) [0|12] "" NEO
+
+BO_ 276127744 CruiseButtons2: 1 GMLAN
+ SG_ LKAGapButton : 1|2@0+ (1,0) [0|2] "" NEO
+
+BO_ 275955897 LeftRadar: 2 GMLAN
+ SG_ BSM_Indicator_Light : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 275980379 RightRadar: 2 GMLAN
+ SG_ BSM_Indicator_Light : 0|1@0+ (1,0) [0|1] "" XXX
+
+
+
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+VAL_ 274923520 DriverDoorOpened 1 "Opened" 0 "Closed" ;
+VAL_ 270581760 RightBlinker 1 "Active" 0 "Inactive" ;
+VAL_ 270581760 LeftBlinker 1 "Active" 0 "Inactive" ;
+VAL_ 270581760 BlinkerLight 1 "Active" 0 "Inactive" ;
+VAL_ 271368192 GearShifter 3 "Park" 0 "Drive/Low" ;
+VAL_ 271360000 CruiseControlActive 1 "Active" 0 "Inactive" ;
+VAL_ 276135936 CruiseButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_ 276127744 LKAGapButton 2 "???" 1 "??" 0 "None" ;
+VAL_ 275955897 BSM_Indicator_Light 0 "Disabled" 1 "Enabled";
+VAL_ 275980379 BSM_Indicator_Right 0 "Disabled" 1 "Enabled";
+
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_lowspeed_1818125.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_lowspeed_1818125.dbc
new file mode 100644
index 000000000..3f5b15e6f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_lowspeed_1818125.dbc
@@ -0,0 +1,3993 @@
+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
+
+
+BO_ 2152177664 OTA_Electric_Pwr_Readiness_LS: 1 XXX
+ SG_ RmtRflshElecPwrRdness : 7|8@0+ (0.025,0) [0|6.375] "AmpHour" XXX
+
+BO_ 2152013824 Smart_High_Beam_Cust_LS: 1 XXX
+ SG_ SmrtHgBmAstCstSetAvail : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SmrtHgBmAstCstCurrSetVal : 7|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2159255552 ODI_CenterStack_2_BCM_LS: 8 XXX
+ SG_ ODI_CntrStck2BCM : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159247360 ODI_BCM_2_CenterStack_LS: 8 XXX
+ SG_ ODI_BCM2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2152046592 Remote_Climate_Control_Req_LS: 5 XXX
+ SG_ RmClmCtrlHMIActIndReq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmClmCtrlRcrcSetReq : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ RmClmCtrlACSetReq : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ RmClmCtrlFrntFanStReq : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ RmClmCtrlFLAirDtStReq : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ RmClmCtrlClmModSetReq : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ RmClmCtrlLtSTempStReq : 29|6@0+ (1,0) [0|63] "" XXX
+ SG_ RmClmCtrlRrDfgSetReq : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ RmClmCtrlRtSTempStReq : 37|6@0+ (1,0) [0|63] "" XXX
+ SG_ RmClmCtrlSyncSetReq : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152030208 Tuner_Frequency_Request_LS: 8 XXX
+ SG_ TnrFrqBndReq : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ TnrFrqChnlReq : 15|56@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150531072 Regen_Power_Ind_LS: 4 XXX
+ SG_ RegPwrLmtdDspPrcnt : 0|9@0- (0.392157,0) [-100.392192|100.000035] "%" XXX
+ SG_ RegPwrLmtdDspPrcntVs : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RegPwrLmtdIO : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151833600 Heated_Wndshild_CstmrIhbt_Req_LS: 1 XXX
+ SG_ HtdFrntWSCustRqIhbt : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HtdFrntWSDispReq : 7|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2151817216 Heated_Wndshild_Cstmr_Req_LS: 1 XXX
+ SG_ HtdFrntWSCustRq : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151849984 Seat_Level_Setting_Request_LS: 2 XXX
+ SG_ AutoThrmlStPasLvlStRq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutoThrmlStDrvLvStRq : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutoThrmlStPassMdStRq : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ AutoThrmlStDrvMdStRq : 15|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2153897984 ARB_OpMode_Customization_LS: 1 XXX
+ SG_ RunBrdExtdFtrAvail : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ RunBrdOpMdCstCurrStVal : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ RunBrdOpMdCstStAvail : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151702528 Lane_Keeping_Assist_LS: 2 XXX
+ SG_ LnKpngAstRecfblIndRq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ LnMrkngIndLft : 4|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnKepAsstStIndLft : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ LnMrkngIndRgt : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnKepAsstStIndRgt : 15|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2156986368 PassPhrase_3_AMM_LS: 8 XXX
+ SG_ WiFiPssPhrsDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156978176 PassPhrase_2_AMM_LS: 8 XXX
+ SG_ WiFiPssPhrsDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156969984 PassPhrase_1_AMM_LS: 8 XXX
+ SG_ WiFiPssPhrsDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2150236160 Unlock_Key_Store_Crypt_2_LS: 8 XXX
+ SG_ UlckKyStrCrptoDt2Group : 4|61@0+ (1,0) [0|0] "" XXX
+ SG_ UlckKyStrCrptoDt2 : 3|60@0+ (1,0) [0|1.15292150460685E+018] "" XXX
+ SG_ UlckKyStrCrptoDt2M : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150170624 Unlock_Key_Store_Crypt_1_LS: 8 XXX
+ SG_ UlckKyStrCrptoDt1Group : 4|61@0+ (1,0) [0|0] "" XXX
+ SG_ UlckKyStrCrptoDt1 : 3|60@0+ (1,0) [0|1.15292150460685E+018] "" XXX
+ SG_ UlckKyStrCrptoDt1M : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155126784 Drvr_Seat_Rearward_Movmnt_LS: 1 XXX
+ SG_ DrvrSetRrwrdMvmnt : 7|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2154725376 Auxiliary_Heater_LS: 1 XXX
+ SG_ AuxHtrAtv378 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ AuxHtrRq : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2157051904 WiFi_Station_AMM_LS: 5 XXX
+ SG_ WiFiStatnMpReq : 1|34@0+ (1,0) [0|0] "" XXX
+ SG_ WSMR_WiFiAssnReq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ WSMR_WiFiStnMpMACAddr : 15|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2156994560 WiFi_AP_Data_AMM_LS: 2 XXX
+ SG_ WiFiAccsPntData_Mp : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ WAPDM_WiFiEnStat : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ WAPDM_EncrptnType : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ WAPDM_SecurityType : 15|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2158133248 Hill_Top_Customization_LS: 6 XXX
+ SG_ HTRCsStAvail : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCsAvail : 7|7@0+ (1,0) [0|0] "" XXX
+ SG_ HTRCA_Res3Avail : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCA_Res2Avail : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCA_Res1Avail : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCA_OnAwAvail : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCA_OnHmAvail : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCA_OnAvail : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCA_OffAvail : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRCsCrStVal : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVDpltnMdMxCnfdcRgExt : 21|14@0+ (0.1,0) [0|1638.3] "km" XXX
+ SG_ HVDpltnMdMiCnfdcRgExt : 37|14@0+ (0.1,0) [0|1638.3] "km" XXX
+
+BO_ 2154651648 Telematics_Audio_Control_LS: 1 XXX
+ SG_ TeleAudCtl : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TAC_AudConctOutcm : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ TAC_AudChConctStat : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2154635264 Telematics_Audio_Request_LS: 1 XXX
+ SG_ TeleAudReq : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TAR_AudSrcStat : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ TAR_AudConctReq : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2152529920 LVM_Audio_Video_Command_LS: 2 XXX
+ SG_ LowVolModAudVidCmd : 5|14@0+ (1,0) [0|0] "" XXX
+ SG_ LVMAVC_StreoAudRsp : 0|2@0+ (1,0) [0|3] "" XXX
+ SG_ LVMAVC_PrmtAudRsp : 2|2@0+ (1,0) [0|3] "" XXX
+ SG_ LVMAVC_RemtEnbl : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ LVMAVC_SpchRcgnAval : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LVMAVC_RemSpchRcgnActn : 11|2@0+ (1,0) [0|3] "" XXX
+ SG_ LVMAVC_RemSpchRcgnID : 14|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2152513536 LVM_Audio_Video_Req_LS: 2 XXX
+ SG_ LowVolModAudVidReq : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ LVMAVR_DispReq : 0|3@0+ (1,0) [0|7] "" XXX
+ SG_ LVMAVR_SpchRcgnAct : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LVMAVR_PrmtAudReq : 11|2@0+ (1,0) [0|3] "" XXX
+ SG_ LVMAVR_StreoAudReq : 13|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154889216 Cluster_HMI_Animation_Req_LS: 1 XXX
+ SG_ ClstrHMIAnmReq : 7|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2154872832 Infotainment_Activation_Req_LS: 1 XXX
+ SG_ RmRflshUpdtAvail : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ InfoActvnReq : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2156961792 SSID_AMM_3_LS: 8 XXX
+ SG_ WiFiSSIDDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2154569728 Infotainment_System_State_LS: 1 XXX
+ SG_ InfotnmntSysSt : 7|5@0+ (1,0) [0|31] "" XXX
+
+BO_ 2151931904 Custom_Launch_Ctrl_LS: 8 XXX
+ SG_ LnchCtrlMdStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ LnchCtrlWhlSlpStat : 7|5@0+ (1,0) [0|31] "" XXX
+ SG_ PTExPrtclFltWrng3IO : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ AWDRecmndIO : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnchCtrlEngRPMStat : 15|6@0+ (1,0) [0|63] "" XXX
+ SG_ ACCSysSltdMd : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ VehSpdCntlSystmType : 20|3@0+ (1,0) [0|7] "" XXX
+ SG_ PTExPartFltManRegStat : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ TCSTempDsblReqIO : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehStbCmptvMdCstAvl : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehStbEnmntCstAvl : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ TCSysCstAvl : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehStbCmptvMdCurSt : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElctShfPriLtdPerfMdIO : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ RegVltCtlEngyRcvryAct : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCSysSltdMdDispIO : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnchCtrlTmrVal : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ VehStbEnhmntCurSt : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ TCSysCurSt : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ TracAndStbScrnCnfg : 39|2@0+ (1,0) [0|3] "" XXX
+ SG_ BiFuelRflGaslinIndReq : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutoShtdwnIO : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnchCtrlBrkPresVal : 47|4@0+ (10,0) [0|150] "%" XXX
+ SG_ AutoShtdwnTmr : 55|8@0+ (1,0) [0|255] "min" XXX
+ SG_ FuelMdTrnstnIndReq : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2150244352 HMI_EngyConsmpHistGrph_1_LS: 8 XXX
+ SG_ EngyCnsHsGrphDspDtVal : 7|55@0+ (1,0) [0|0] "" XXX
+ SG_ ECHGDDV_Col1 : 2|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_EngyConsAvg : 7|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col3 : 8|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col2 : 13|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col4 : 19|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col6 : 25|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col5 : 30|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col7 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col9 : 42|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col8 : 47|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHGDDV_Col10 : 53|5@0+ (1,0) [0|31] "" XXX
+
+BO_ 2156953600 SSID_AMM_2_LS: 8 XXX
+ SG_ WiFiSSIDDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2151686144 SD_Card_LS: 2 XXX
+ SG_ SDCrdFullIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SDCrdErrIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NoSDCrdPrIO : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155028480 Lane_Change_Threat_LS: 2 XXX
+ SG_ RgtLnChgThrt : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtLnChngThrtAprchSpd : 15|8@0- (1,0) [-128|127] "km/h" XXX
+
+BO_ 2151915520 HMI_Display_LS: 8 XXX
+ SG_ AHDisbldDrOpnIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ AHDisbldStbltIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ AHAppBrkPedlIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ AHServcIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ShfToPrkBfExtngIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ AHEnbld : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ AHAct : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPDrvrIlkShfAtdIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPTransMalfIO : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPRngInvldReqIO : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPPrkInvldReqIO : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPHldShfLvrToEngRgIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPDrvrPrkIlkSftAtdIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngIntkArBstPrExtRngGroup : 14|15@0+ (1,0) [0|0] "" XXX
+ SG_ EngIntkArBstPrExtRng : 8|9@0+ (1,-110) [-110|401] "kPa" XXX
+ SG_ EngIntkArBstPrExtRngV : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElcTransRngSlctVDA : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElecShfRngDispRCExtd : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ ElecShfRngDisp : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ DrvEffInd : 39|8@0- (0.78125,0) [-100|99.21875] "%" XXX
+ SG_ ESPShfToDrvTryAgnIO : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPTrnVehOffFrPrkIO : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPTrnsCtlrMalfIO : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElcShfPriTwoGrsSlInRq : 47|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152153088 Right_Rear_Seat_Display_Stats_LS: 6 XXX
+ SG_ RRStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX
+ SG_ RRSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_HdrstFdRrUDn : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152136704 Right_Rear_Seat_Massage_LS: 8 XXX
+ SG_ RRStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ RRSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2152120320 Right_Rear_Seat_Actuator_LS: 8 XXX
+ SG_ RRStActPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ RRSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ RRSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2152103936 Left_Rear_Seat_Display_Status_LS: 6 XXX
+ SG_ LRStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX
+ SG_ LRSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_HdrstFdRrUDn : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LRSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ LRSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152087552 Left_Rear_Seat_Massage_LS: 8 XXX
+ SG_ LRStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ LRSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ LRSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2152071168 Left_Rear_Seat_Actuator_LS: 8 XXX
+ SG_ LRStActPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ LRSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ LRSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2153947136 Remote_Reflash_Stat_LS: 1 XXX
+ SG_ RmtRflshMdAct : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2152628224 OnBoard_Tester_Response_LS: 2 XXX
+ SG_ OBTCResp : 2|11@0+ (1,0) [0|0] "" XXX
+ SG_ OBTCR_Stat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBTCR_ReqstrID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ OBTCMstrStat : 5|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2152112128 Performanc_Mode_Vis_Scrn_Stat_LS: 5 XXX
+ SG_ PerfMdVislztnScrnStat : 0|33@0+ (1,0) [0|0] "" XXX
+ SG_ PMVSS_Snd : 0|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Trans : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Eng : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Drvln : 17|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Susp : 20|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Strng : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_PsngrSeat : 24|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_DrvrSeat : 27|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_AdptCrsCnt : 30|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Disps : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ PMVSS_Exhst : 37|3@0+ (1,0) [0|7] "" XXX
+ SG_ PerfMdMainMenuType : 3|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2152775680 Front_360_Camera_On_LS: 3 XXX
+ SG_ DispFrt360CamOn : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrPedDetCstStAvl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrPedDetCstStVal : 4|3@0+ (1,0) [0|7] "" XXX
+ SG_ RrPdDetHptcStVbRqSeqN : 6|2@0+ (1,0) [0|3] "" XXX
+ SG_ TrgdVidRecFetrPrsnt : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrPdDetHptcStVbRq : 13|6@0+ (1,0) [0|63] "Pulse" XXX
+ SG_ DispTrgdVidOn : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ a_360DegVidFetrPrsnt : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ DispSmrtTwVidOn : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrPedDetCstAvail : 23|7@0+ (1,0) [0|0] "" XXX
+ SG_ RPDCA_Resrv3Avail : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RPDCA_Resrv2Avail : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ RPDCA_Resrv1Avail : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ RPDCA_AlrtBrkAvail : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RPDCA_AlrtAvail : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ RPDCA_OnAvail : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ RPDCA_OfAvail : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2153857024 Teen_Driver_Event_Report_2_LS: 8 XXX
+ SG_ TnDrvRptCrdAvlDspDat : 6|13@0+ (1,0) [0|0] "" XXX
+ SG_ TDRCADD_FCHdwyAlrt : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_ABSAtvEvt : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_StCtrlEvnts : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_TrCtrlEvnts : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_OvSpdEvnt : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_DistDrvn : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_MaxSpd : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_LDWEvnts : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_WOTEvnts : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_DrwDrvAlrt : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_FCMBrEvts : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_RCMBrEvts : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDRCADD_FCImntAlrts : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TeenDrvWOTEvntsRpt : 9|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TnDrvABSAtvEvntsRpt : 31|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TnDrvStblCtrlEvntsRpt : 37|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TnDrvDrowDrvAlrtsRpt : 43|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TnDrvTrCtrlEvntsRpt : 49|10@0+ (1,0) [0|1023] "counts" XXX
+
+BO_ 2153865216 Teen_Driver_Customization_Req_LS: 4 XXX
+ SG_ TeenDrvReq : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ TDOvSpdWrnCstStReq : 12|5@0+ (1,0) [0|0] "" XXX
+ SG_ TDOWCSR_DecSwAct : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDOWCSR_IncSwAct : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDOWCSR_StatReq : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ TnDrvSpdLmtCstStReq : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ TeenDrvPinCd : 23|16@0+ (1,0) [0|39321] "" XXX
+
+BO_ 2153840640 Teen_Driver_Event_Report_1_LS: 8 XXX
+ SG_ TDFwdClnHdwyAlrtsRpt : 5|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TnDrvDRLOffUnbIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvALCOffUnbIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDFwdClnImntAlrtsRpt : 11|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TDFwdClnMtgnBrEvRpt : 17|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TDRevClnMtgnBrEvRpt : 39|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TeenDrvMaxSpdRpt : 45|12@0+ (0.0625,0) [0|255.9375] "km/h" XXX
+ SG_ TeenDrvLDWEvntsRpt : 49|10@0+ (1,0) [0|1023] "counts" XXX
+
+BO_ 2153824256 Teen_Driver_Control_Info_LS: 8 XXX
+ SG_ TnDrvSpdLmtCstCrStVl : 2|11@0+ (1,0) [0|0] "" XXX
+ SG_ TDSLCCSV_SpLmtStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ TDSLCCSV_SpLmDisVl : 15|8@0+ (2,0) [0|510] "km/h" XXX
+ SG_ TnDrvSpdLmtCstStAvl : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvOvrSpdIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvGapAdjUnbIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ TeenDrvPINStrd : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ TeenDrvFtrAvl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ TDOvSpdWrnCstCrStVl : 22|15@0+ (1,0) [0|0] "" XXX
+ SG_ TDOWCCSV_CrStVl : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" XXX
+ SG_ TDOWCCSV_CrStat : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ TDOvSpdWrnCstStAvl : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvOvSpdEvntsRpt : 33|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ TeenDrvRsp : 37|4@0+ (1,0) [0|15] "" XXX
+ SG_ TeenDrvAct : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ TeenDrvAccelLimIO : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ TeenDrvDistDrvnRpt : 55|16@0+ (1,0) [0|65535] "km" XXX
+
+BO_ 2155151360 Psngr_Seat_Massage_Priority_LS: 8 XXX
+ SG_ PsngrStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ PSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX
+ SG_ PSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2155134976 Psngr_Seat_Control_Disp_Stat_LS: 6 XXX
+ SG_ PsngrStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX
+ SG_ PSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ PSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_HdrstUDnFdRr : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ PSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX
+ SG_ PSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ PSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ PSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ PSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX
+ SG_ PsngrSetRrwdMvmnt : 6|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155118592 Psngr_Seat_Actuator_Priority_LS: 8 XXX
+ SG_ PsngrStActPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ PSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2155102208 Driver_Seat_Massage_Priority_LS: 8 XXX
+ SG_ DrvStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ DSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX
+ SG_ DSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2155085824 Driver_Seat_Control_Disp_Stat_LS: 8 XXX
+ SG_ DrvStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX
+ SG_ DSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ DSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_HdrstUDnFdRr : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ DSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX
+ SG_ DSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ DSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ DSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX
+ SG_ CPMAPINFO4 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrgColCommsFlt : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ StrgColInOutPos : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ StrgColUpDwnPos : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2155069440 Driver_Seat_Actuator_Priority_LS: 8 XXX
+ SG_ DrvStActPrty : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ DSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ DSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2156937216 PassPhrase_Digits_17_to_24_LS: 8 XXX
+ SG_ WiFiPssPhrsDgts17to24 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156929024 PassPhrase_Digits_9_to_16_LS: 8 XXX
+ SG_ WiFiPssPhrsDgts9to16 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156920832 PassPhrase_Digits_1_to_8_LS: 8 XXX
+ SG_ WiFiPssPhrsDgts1to8 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156871680 SSID_Digits_17_to_24_LS: 8 XXX
+ SG_ WiFiSSIDDgts17to24 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156863488 SSID_Digits_9_to_16_LS: 8 XXX
+ SG_ WiFiSSIDDgts9to16 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156855296 SSID_Digits_1_to_8_LS: 8 XXX
+ SG_ WiFiSSIDDgts1to8 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2152480768 Perfr_Data_Recorder_Lap_Info_LS: 6 XXX
+ SG_ PerfDatRecBstLpInfo : 2|19@0+ (1,0) [0|0] "" XXX
+ SG_ PDRBLI_BstLpTmMins : 2|6@0+ (1,0) [0|63] "min" XXX
+ SG_ PDRBLI_BstLpTmSecs : 12|6@0+ (1,0) [0|63] "sec" XXX
+ SG_ PDRBLI_BstLpTm100s : 22|7@0+ (0.01,0) [0|1.27] "sec" XXX
+ SG_ PerfDatRecLstLpInfo : 26|19@0+ (1,0) [0|0] "" XXX
+ SG_ PDRLLI_LstLpTmMins : 26|6@0+ (1,0) [0|63] "min" XXX
+ SG_ PDRLLI_LstLpTmSecs : 36|6@0+ (1,0) [0|63] "sec" XXX
+ SG_ PDRLLI_LstLpTm100s : 46|7@0+ (0.01,0) [0|1.27] "sec" XXX
+
+BO_ 2152497152 Perf_Data_Recroder_RT_Info_LS: 4 XXX
+ SG_ PerfDatRecRltmInfo : 1|26@0+ (1,0) [0|0] "" XXX
+ SG_ PDRRI_CrLpTmMins : 1|6@0+ (1,0) [0|63] "min" XXX
+ SG_ PDRRI_CrLpTmSecs : 11|6@0+ (1,0) [0|63] "" XXX
+ SG_ PDRRI_LpDiffTmSecs : 17|6@0+ (1,0) [0|63] "sec" XXX
+ SG_ PDRRI_CrLpTm10sSec : 21|4@0+ (0.1,0) [0|1.5] "sec" XXX
+ SG_ PDRRI_LpDiffTm10s : 27|4@0+ (0.1,0) [0|1.5] "sec" XXX
+
+BO_ 2153791488 ARB_State_LS: 1 XXX
+ SG_ ArtcldRngBrdSt : 2|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2149883904 BluetoothTetheringPairingRsp_LS: 7 XXX
+ SG_ BTTethrngPrngRsp : 4|53@0+ (1,0) [0|0] "" XXX
+ SG_ BTPR_RspInfoAvail : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ BTPR_RspStat : 4|4@0+ (1,0) [0|15] "" XXX
+ SG_ BTPR_RspVal : 15|48@0+ (1,0) [0|281474976710655] "" XXX
+
+BO_ 2150252544 HMI_EngyConsmpHistGrph_LS: 8 XXX
+ SG_ EngyConsmpHistGrph : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ECHG_EngyCnsmdAvg : 4|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_MeasUnit : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECHG_Column02 : 10|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column01 : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column04 : 16|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column03 : 21|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column05 : 27|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column07 : 33|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column06 : 38|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column08 : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column10 : 50|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_Column09 : 55|5@0+ (1,0) [0|31] "" XXX
+ SG_ ECHG_YAxisMaxVal : 58|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECHG_XAxisTkMrkIntvl : 61|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2150391808 HMI_Hourmeter_Data_LS: 6 XXX
+ SG_ EngIdlAtvTm : 7|24@0+ (1,0) [0|16777215] "min" XXX
+ SG_ EngRunAtvTm : 31|24@0+ (1,0) [0|16777215] "min" XXX
+
+BO_ 2155913216 Diesel_Information_2_LS: 7 XXX
+ SG_ DslExhFldRmngDstHRsGroup : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ DslExhFldRmngDstHRs : 6|15@0+ (2,0) [0|65534] "km" XXX
+ SG_ DslExhFldRmngDstHRsV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ DslExhFluidLvlPrcntGroup : 16|9@0+ (1,0) [0|0] "" XXX
+ SG_ DslExhFluidLvlPrcntV : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ DslExhFluidLvlPrcnt : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DslEmnsOBDMrkt : 18|2@0+ (1,0) [0|3] "" XXX
+ SG_ PedFrndlyAlrtCsCrStVal : 21|3@0+ (1,0) [0|7] "" XXX
+ SG_ PedFrndlyAlrtCsSetAvl : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PedFrndlyAlrtStat : 39|24@0+ (1,0) [0|0] "" XXX
+ SG_ PFAS_PFACrsOvrSpd : 34|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ PFAS_PFARevSnd : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ PFAS_PFAFwdSnd : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ PFAS_PFASndGenEn : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ PFAS_PFASndVolCtrl : 42|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ PFAS_SrvPedAlrtIO : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ PFAS_PFASysStat : 50|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2034 CCP_Data_Transmission_Object_LS: 8 XXX
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2032 CCP_Command_Receive_Object_LS: 8 XXX
+ SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2152095744 HSGMLAN_Customization_Setings_LS: 5 XXX
+ SG_ DrvlnPerfMdCustAvl : 5|6@0+ (1,0) [0|0] "" XXX
+ SG_ DPMCA_DrvlPrfMd6Avl : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DrvlPrfMd5Avl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DrvlPrfMd4Avl : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DrvlPrfMd3Avl : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DrvlPrfMd2Avl : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DrvlPrfMd1Avl : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ DispPerfCustMdAvl : 13|6@0+ (1,0) [0|0] "" XXX
+ SG_ DPMCA_DispPrfMd6Avl : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DispPrfMd5Avl : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DispPrfMd4Avl : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DispPrfMd3Avl : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DispPrfMd2Avl : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ DPMCA_DispPrfMd1Avl : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndPerfMdCustAvl : 21|6@0+ (1,0) [0|0] "" XXX
+ SG_ SPMCA_SndPrfMd6Avl : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SndPrfMd5Avl : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SndPrfMd4Avl : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SndPrfMd3Avl : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SndPrfMd2Avl : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SndPrfMd1Avl : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrPerfMdCustAvl : 29|6@0+ (1,0) [0|0] "" XXX
+ SG_ SPMCA_StrPrfMd6Avl : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_StrPrfMd5Avl : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_StrPrfMd4Avl : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_StrPrfMd3Avl : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_StrPrfMd2Avl : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_StrPrfMd1Avl : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ SusPerfMdCustAvl : 37|6@0+ (1,0) [0|0] "" XXX
+ SG_ SPMCA_SusPrfMd6Avl : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SusPrfMd5Avl : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SusPrfMd4Avl : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SusPrfMd3Avl : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SusPrfMd2Avl : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPMCA_SusPrfMd1Avl : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2156945408 SSID_AMM_1_LS: 8 XXX
+ SG_ WiFiSSIDDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2152611840 OnBoard_Tester_Request_LS: 2 XXX
+ SG_ OBTCReq : 4|5@0+ (1,0) [0|0] "" XXX
+ SG_ OBTCR_Prty : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ OBTCR_Actv : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ OBTCReqstrStat : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBTCReqstrID : 15|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2153308160 Hyb_Redundant_Batt_Data2_LS: 4 XXX
+ SG_ RdHVltBatPckCrntGroup : 6|15@0+ (1,0) [0|0] "" XXX
+ SG_ RdHVltBatPckCrnt : 4|13@0- (0.15,0) [-614.4|614.25] "A" XXX
+ SG_ RdHVltBatPckCrntV : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ RdHVltBatPckCrntM : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RdHVltBatPckVltGroup : 21|14@0+ (1,0) [0|0] "" XXX
+ SG_ RdHVltBatPckVlt : 19|12@0+ (0.125,0) [0|511.875] "V" XXX
+ SG_ RdHVltBatPckVltV : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RdHVltBatPckVltM : 21|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155970560 HVAC_PowerManager_Status_LS: 1 XXX
+ SG_ ClmCntLdShdLvlRq : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ ClmCntBatSaverIO : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151178240 Lighting_Customization_Rqst_1_LS: 4 XXX
+ SG_ LtRtHnTrGPSCstStRq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ LtRtHnTrCstStReq : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutHgBmAsSnCsStRq : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutHgBmAstCstStRq : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ AdpHgBmAsSnCsStRq : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ AdpHgBmAstCstStRq : 21|3@0+ (1,0) [0|7] "" XXX
+ SG_ AFLGPSCstStReq : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ AFLCstStReq : 29|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2154790912 Lighting_Customization_Info_2_LS: 2 XXX
+ SG_ AutHgBmAsCsCrStVal : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutHgBmAsSnCsCrStVa : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutHgBmAsCsStAvl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ AutHgBmAsSnCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ AdpHgBmAsCsCrStVal : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ AdpHgBmAsSnCsCrStVal : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ AdpHgBmAsCsStAvl : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ AdpHgBmAsSnCsStAvl : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151292928 V2V_Customization_Menu_LS: 5 XXX
+ SG_ TrfRdsdInfCsStAvail : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CntdVehBrkAltCsStAvl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntrStopAlrtCsSetAvl : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntrStAlrtCsCrSetVal : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ TrfRdsdInfCsCrStVal : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ CntdVehBrAltCsCrStVal : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ IntrStAlrtCsAvail : 22|7@0+ (1,0) [0|0] "" XXX
+ SG_ ISACA_Resrv4Avail : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ ISACA_Resrv3Avail : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ ISACA_Resrv2Avail : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ ISACA_Resrv1Avail : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ ISACA_AlrtBrkAvail : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ISACA_AlrtAvail : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ISACA_OfAvail : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ CntdVehBrkAlrtCsAvail : 30|7@0+ (1,0) [0|0] "" XXX
+ SG_ CVBACA_Resrv5Avail : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVBACA_Resrv4Avail : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVBACA_Resrv3Avail : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVBACA_Resrv2Avail : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVBACA_Resrv1Avail : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVBACA_OnAvail : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVBACA_OfAvail : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrfRdsdInfCsAvail : 38|7@0+ (1,0) [0|0] "" XXX
+ SG_ TRICA_Resrv5Avail : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRICA_Resrv4Avail : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRICA_Resrv3Avail : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRICA_Resrv2Avail : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRICA_Resrv1Avail : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRICA_OnAvail : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRICA_OfAvail : 38|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151464960 V2V_Warnings_LS: 5 XXX
+ SG_ V2VWrngIndReq : 4|5@0+ (1,0) [0|31] "" XXX
+ SG_ V2VWrngDirctn : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ V2VWrngDistRemng : 9|10@0+ (1,0) [0|1023] "" XXX
+ SG_ V2VTrfLghtInfo : 28|13@0+ (1,0) [0|0] "" XXX
+ SG_ V2VTLI_TrfLghtTmPhsSw : 28|6@0+ (1,0) [0|63] "" XXX
+ SG_ V2VTLI_TrfLghtMntngDirctn : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ V2VTLI_TrfLghtValDirctn : 34|2@0+ (1,0) [0|3] "" XXX
+ SG_ V2VTLI_TrfLghtPhsArivl : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ V2VTLI_TrfLghtActlPhs : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ V2VSrvIndReq : 30|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2151448576 V2V_Seat_Vib_Request_LS: 3 XXX
+ SG_ V2VSysHptcStVibReq : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ V2VSysHptStVibRqSN : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ V2VSyLftHptStVbRq : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ V2VSyLftHptStVbRqSN : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ V2VSyRghtHptStVbRq : 21|6@0+ (1,0) [0|63] "" XXX
+ SG_ V2VSyRghtHptStVbRqSN : 23|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2153930752 Lane_Centering_Convenience_LS: 3 XXX
+ SG_ LCWrnIndReq : 4|5@0+ (1,0) [0|31] "" XXX
+ SG_ LCCDrvrAwrnsIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnCntrVhlStpd : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnCntrNonRspDrvrCnd : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ LCConvMsgIndreq : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ LCCIndReq : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LnCntrEsclnStat : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnCntrSpchPrmtReq : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnCntrngCtlIcnLoctn : 23|4@0- (1,0) [-8|7] "" XXX
+
+BO_ 2153889792 Lane_Centering_Arrow_LS: 5 XXX
+ SG_ LCArrwBlk1Act : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ LCArrwBlk2Act : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ LCArrwBlk3Act : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ LCArrwBlk4Act : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ LCArrwBlk5Act : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ LCArrwBlk2Offst : 15|8@0- (1,0) [-128|127] "" XXX
+ SG_ LCArrwBlk3Offst : 23|8@0- (1,0) [-128|127] "" XXX
+ SG_ LCArrwBlk4Offst : 31|8@0- (1,0) [-128|127] "" XXX
+ SG_ LCArrwBlk5Offst : 39|8@0- (1,0) [-128|127] "" XXX
+
+BO_ 2153914368 Energy_Usage_LS: 7 XXX
+ SG_ EngyUsgScrScal : 7|56@0+ (1,0) [0|0] "" XXX
+ SG_ EUSS_OTEgUgScrMxScVal : 0|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_OTEgUgScrMnScVal : 7|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_ITEgUgScrMnScVal : 9|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_ITEgUgScrMxScVal : 18|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_TcEgUgScrMnScVal : 27|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_TcEgUgScrMxScVal : 36|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_TrEgUgScrMnScVal : 45|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUSS_TrEgUgScrMxScVal : 54|7@0- (0.1,0) [-5|5] "" XXX
+
+BO_ 2151882752 PTO_Customization_Request_LS: 3 XXX
+ SG_ PTOTpStpSpdCsStReq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ PTOEngRnTmrCsStRq : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ PTOStdbySpdCsStReq : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ PTOSet1SpdCsStReq : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ PTOSet2SpdCsStReq : 23|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151899136 PTO_Status_LS: 5 XXX
+ SG_ PTORelBrkPedIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTORelAccPedIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTORedEngSpdIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOPrsRelCltPedIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOPrsRelBrkPedIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOEngmntStatInd : 6|2@0+ (1,0) [0|3] "" XXX
+ SG_ PTODisengCrsCntlIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOSet1SpdCsStAvl : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOSet2SpdCsStAvl : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOTpStpSpdCsStAvl : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOEngRnTmrCsStAvl : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOStdbySpdCsStAvl : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOTransInGearIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOSetPrkBrkIO : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTORelCltPedIO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOStdbSpdCsCrStVal : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ PTOGroup : 20|2@0+ (1,0) [0|0] "" XXX
+ SG_ PTOVDA : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOVDM : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOManTransInGrIO : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOAccelUpnBrkRelIO : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOEngUpnBrkRelIO : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOTpStSpdCsCrStVal : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ PTOEnRnTmCsCrStVal : 30|4@0+ (1,0) [0|15] "" XXX
+ SG_ PTOServIndOn : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOSet1SpdCsCrStVal : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ PTOSet2SpdCsCrStVal : 39|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2150580224 HMI_UtlChrgIntrfr_Indication_LS: 5 XXX
+ SG_ CstmrNonUsblSOCGroup : 1|10@0+ (1,0) [0|0] "" XXX
+ SG_ CstmrNonUsblSOCV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ CstmrNonUsblSOC : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ CstNonUsbSOCDspLvl : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ PrpDspTtlPwrLvlPct : 24|9@0- (0.392157,0) [-100.392192|100.000035] "%" XXX
+
+BO_ 2151735296 Rear_Cross_Traffic_Alert_Ind_LS: 1 XXX
+ SG_ RrCrsTrfcAlrtOffIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnChgAlrtOffIndOn : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtRrCrsTrfcAlrtEnbld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtSBZAlrtEnbld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtLnChgAlrtEnbld : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtSdDetSysTmpDsbld : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtSdDetSysServDsbld : 6|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151792640 Rear_Cross_Traffic_Alert_Rght_LS: 5 XXX
+ SG_ RrCTfcRHptcStRqSqN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RrCTfcRHptcStReq : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ RrCrsTrfAltRgtIndCtrl : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCTARIC_IndReq : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ RCTARIC_Indctr1Act : 34|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149826560 FCA_VisionBased_Info_2_LS: 4 XXX
+ SG_ FCAGpStng : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCAHdwyStngIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCACrusCtrlCnclReqd : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCABrkPrflReq : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ FwdClnAlrtOffIO11E : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ FwdClnAlrtPr11E : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtVsnFsdSpdGroup : 15|15@0+ (1,0) [0|0] "" XXX
+ SG_ SpdLmtVsnFsdSpd : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SpdLmtVsnFsdSpdM : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ FwdObjAlrtInd11E : 16|9@0+ (1,0) [0|0] "" XXX
+ SG_ FOAI_AlrtChmIhbRq11E : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOAI_VehAhdIndRq11E : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ FOAI_AlrtWrnIndRq11E : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ SpdLmtVnFsSpdNwDet : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtVsnFsdSpdUnt : 19|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149957632 Park_Assist_ESSprocess_Info_LS: 1 XXX
+ SG_ ClsnMtgtnInhbtd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstInhbtReq : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstRrObjSnsngRqAct : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstOprtrDsrdStat : 4|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2149941248 Park_Assist_ESSbased_Info_LS: 5 XXX
+ SG_ PrkAstRrExtdDstUnfltd : 3|12@0+ (0.01,0) [0|40.95] "m" XXX
+ SG_ PrkAstRrSysStatUnfltd : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ PrkAstFntnSnsDstrbdIO : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstFntnSnrsBlkd : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstFntnFld : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstFntnDsbldIO : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstFntnClnPrkAstIO : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClsnMtgtnInhbtReqtd : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstRrObjSnsngAct : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARrRgn3ObjStatUnfltd : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARrRgn4ObjStatUnfltd : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARrRgn1ObjStatUnfltd : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARrRgn2ObjStatUnfltd : 39|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2156314624 High_Volt_Time_Based_Chrg_LS: 8 XXX
+ SG_ TODCNxtPlnndDprtrTm : 5|14@0+ (1,0) [0|0] "" XXX
+ SG_ TODCNPDT_Hr : 2|5@0+ (1,0) [0|31] "Hour" XXX
+ SG_ TODCNPDT_DyOfWk : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ TODCNPDT_Min : 13|6@0+ (1,0) [0|63] "Minute" XXX
+ SG_ OffBrdCSFltDtctd : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ OBVhCsACChgRqBnVs : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVChgSyChgLvlPrfDt : 16|25@0+ (1,0) [0|0] "" XXX
+ SG_ HVCSCLPD_UsrIntTyp : 16|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVCSCLPD_NrmChrgC : 27|5@0+ (1,0) [0|31] "A" XXX
+ SG_ HVCSCLPD_ChgLvlPfS : 30|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVCSCLPD_RdCrntLv2 : 33|5@0+ (1,0) [0|31] "A" XXX
+ SG_ HVCSCLPD_RdCrntLv1 : 38|5@0+ (1,0) [0|31] "A" XXX
+ SG_ HVCSCLPD_RdCrntLv3 : 44|5@0+ (1,0) [0|31] "A" XXX
+ SG_ HVChrgAbrtRsn : 19|3@0+ (1,0) [0|7] "" XXX
+ SG_ TODCOpMd : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVChrgSysSplyFltIO : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ TODCDspMnPgTmpOr : 52|5@0+ (1,0) [0|0] "" XXX
+ SG_ TODCDMPTO_TpOvR : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ TODCDMPTO_CmPgR : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVChrgSysStNot : 55|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBatBlkSOC : 63|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2150449152 Engine_Information_5_LS: 4 XXX
+ SG_ SrvcFlSysPrkInOpnArIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvTrCtrlOffUnbIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvStblCtrlOffUnbIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ InActFuelMdFuelLvlIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FuelSysNEmsRltMalfAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngInltSpcfcHmdtyGroup : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ EngInltSpcfcHmdtyM : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngInltSpcfcHmdtyV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngInltSpcfcHmdty : 15|8@0+ (0.0196078,0) [0|4.999989] "% water" XXX
+ SG_ AutoStpInhbtRsnInd : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ ASIRI_Indication08 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication07 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication06 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication05 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication04 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication03 : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication02 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASIRI_Indication01 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtrSttngTypAct : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ ManTransIndReq : 28|3@0+ (1,0) [0|7] "" XXX
+ SG_ ESPDrvrExtIO : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPDrvrDrStIndtrmntIO : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESPAutoPrkIO : 31|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149810176 FCA_VisionBased_Info_1_LS: 1 XXX
+ SG_ FCAHptcStVbnRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCAHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 2149793792 FCA_VisionBased_Info_LS: 6 XXX
+ SG_ FwdClnAlrtCustCrntSetngVal : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ FCACustStngAvlbl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ VhlAhdDstIndReq : 26|19@0+ (1,0) [0|0] "" XXX
+ SG_ VADIR_IndLvl : 26|4@0+ (1,0) [0|15] "" XXX
+ SG_ VADIR_FlwTme : 38|7@0+ (0.1,0) [0|12.7] "s" XXX
+ SG_ VADIR_FlwDst : 47|8@0+ (1,0) [0|255] "m" XXX
+
+BO_ 2150080512 Aux_Coolant_Heater_Status_LS: 8 XXX
+ SG_ EngAstHtDfrdHtMdAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCsCrStVal : 2|2@0+ (1,0) [0|3] "" XXX
+ SG_ AuxClntHtrVlvStat : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ LBCChrgLvlPrfExpIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCstmrDaRstResp : 12|5@0+ (1,0) [0|0] "" XXX
+ SG_ LBCCDRR_PosNumbr : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ LBCCDRR_ClrStrdPosResp : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LBCPosStgStat : 20|5@0+ (1,0) [0|0] "" XXX
+ SG_ LBCPSS_PosUpdtLct : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ LBCPSS_PosUpdtStat : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ LBCVehLctStat : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ LBCVLS_VehGPSLct : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ LBCVLS_VehGPSLctV : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCstmrFdbk : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ LBCCF_Lct4PosStrdIO : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCF_Lct3PosStrdIO : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCF_Lct2PosStrdIO : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCCF_Lct1PosStrdIO : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ ChrgCyclElecEngyEcnEq : 35|12@0+ (0.1,0) [0|409.5] "km/l" XXX
+ SG_ ChrgCyclOvrlEngyEcnEq : 51|12@0+ (0.1,0) [0|409.5] "km/l" XXX
+
+BO_ 2153873408 Heated_Steering_Whl_Rqsted_LS: 1 XXX
+ SG_ MnlHtdStWhlRqstd : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2152128512 Performance_Mode_Cust_Setings_LS: 4 XXX
+ SG_ ACCPerfMdCustAvl : 5|6@0+ (1,0) [0|0] "" XXX
+ SG_ ACCPMCA_ACCPrfMd6Avl : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCPMCA_ACCPrfMd5Avl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCPMCA_ACCPrfMd4Avl : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCPMCA_ACCPrfMd3Avl : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCPMCA_ACCPrfMd2Avl : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCPMCA_ACCPrfMd1Avl : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvrStPerfMdCustAvl : 13|6@0+ (1,0) [0|0] "" XXX
+ SG_ DSPMCA_DrvrStPrfMd6Avl : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvrStPrfMd5Avl : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvrStPrfMd4Avl : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvrStPrfMd3Avl : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvrStPrfMd2Avl : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvrStPrfMd1Avl : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsngStPerfMdCustAvl : 21|6@0+ (1,0) [0|0] "" XXX
+ SG_ PSPMCA_PsngStPrfMd6Avl : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSPMCA_PsngStPrfMd5Avl : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSPMCA_PsngStPrfMd4Avl : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSPMCA_PsngStPrfMd3Avl : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSPMCA_PsngStPrfMd2Avl : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ PSPMCA_PsngStPrfMd1Avl : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvStyPerfMdCustAvl : 30|7@0+ (1,0) [0|0] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd7Avl : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd6Avl : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd5Avl : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd4Avl : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd3Avl : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd2Avl : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSPMCA_DrvStyPrfMd1Avl : 30|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151997440 Driver_Drowsiness_Dtctn_Stat_LS: 5 XXX
+ SG_ DrvDrowSysIndRq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvDrwDetCsCrStVal : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvDrowDetCstStAvl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvDrsnHptcStRqSeqN : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ DrDrwSysHptcStVbnRq : 15|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 2156331008 High_Voltage_EnergyMgmt_Ctrl_LS: 7 XXX
+ SG_ LwRngLVLdShdRq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVDpltnMdMxCnfdcRg : 11|12@0+ (0.1,0) [0|409.5] "km" XXX
+ SG_ HVDpltnMdMiCnfdcRg : 27|12@0+ (0.1,0) [0|409.5] "km" XXX
+ SG_ HVDpltnMdMxGugRg : 43|12@0+ (0.1,0) [0|409.5] "km" XXX
+
+BO_ 2151776256 Rear_Cross_Traffic_Alert_Left_LS: 5 XXX
+ SG_ RrCTfcLHptcStRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RrCTfcLHptcStReq : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ RrCrsTrfAltLftIndCtrl : 34|3@0+ (1,0) [0|0] "" XXX
+ SG_ RCTALIC_IndReq : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ RCTALIC_Indctr1Act : 34|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154774528 Lighting_Customization_Info_1_LS: 1 XXX
+ SG_ LtRtHnTrCstStVal : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ LtRtHnTrGPCsCrStVal : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ LtRtHnTrCstStAvail : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ LtRtHnTrGPSCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150375424 Eng_Maintenance_Mode_Strt_Req_LS: 3 XXX
+ SG_ MntnceMdStEngRq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngAstHtCstStRq : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ EngAstHtPlgInCstStRq : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ DsplTrnsShftLvrLckRqd : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngyCnsHistGrphRstRq : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ USBProgInPrgrs : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBCPosMdfcReq : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ LBCCsStReq : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ LBCCstmrDaRstReq : 20|5@0+ (1,0) [0|0] "" XXX
+ SG_ LBCCDRR_PosNum : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ LBCCDRR_ClrStrdPosReq : 20|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2150383616 Engine_Maintenance_Mode_Req_LS: 8 XXX
+ SG_ MntnceMdDsplyRq : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ EngMntnceMdAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngMntncePrcntCpl : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ EngPrpDspPwrLvlPct : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ EstElecPrpCap : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ PrpCapDspOpPs : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ PrpDspTtlPwr : 45|13@0+ (0.5,-326.6) [-326.6|3768.9] "kW" XXX
+ SG_ BatPrpDspPwrLvlPct : 48|9@0- (0.392157,0) [-100.392192|100.000035] "%" XXX
+
+BO_ 2151981056 Drive_Cycle_Efficiency_LS: 8 XXX
+ SG_ DstTrvldDt : 7|51@0+ (1,0) [0|0] "" XXX
+ SG_ DTD_BattPrpDstTrvld : 7|17@0+ (0.015625,0) [0|2047.984375] "km" XXX
+ SG_ DTD_FuelPrpDstTrvld : 22|17@0+ (0.015625,0) [0|2047.984375] "km" XXX
+ SG_ DTD_DrvCyclDstTrvld : 37|17@0+ (0.015625,0) [0|2047.984375] "km" XXX
+ SG_ DrvCyclBatPropRat : 50|11@0+ (0.048852,0) [0|100.000044] "%" XXX
+
+BO_ 2151964672 Drive_Cycle_Energy_Efficiency_LS: 8 XXX
+ SG_ DrvCyclBatCondEnrgEfncy : 7|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DrvCyclCbnCondEnrgEfncy : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DrvCyclDrvStEnrgEfncy : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DrvCyclTtlEnrgEfncy : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DrvCyclFuelEnmy : 47|12@0+ (0.1,0) [0|409.5] "km/liters" XXX
+ SG_ DrvCyclFuelUsd : 51|12@0+ (0.125,0) [0|511.875] "liters" XXX
+
+BO_ 2156298240 High_Volt_Batt_Time_Pwr_Chrg_LS: 8 XXX
+ SG_ HVBatCmpltTmHghPwrChrg : 7|14@0+ (1,0) [0|0] "" XXX
+ SG_ HVBCTHPC_HrOfDy : 4|5@0+ (1,0) [0|31] "Hour" XXX
+ SG_ HVBCTHPC_DyOfWk : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBCTHPC_MntOfHr : 15|6@0+ (1,0) [0|63] "Minute" XXX
+ SG_ HVBatCmpltTmLwPwrChrg : 9|14@0+ (1,0) [0|0] "" XXX
+ SG_ HVBCTLPC_DyOfWk : 9|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBCTLPC_MntOfHr : 17|6@0+ (1,0) [0|63] "Minute" XXX
+ SG_ HVBCTLPC_HrOfDy : 22|5@0+ (1,0) [0|31] "Hour" XXX
+ SG_ HVBatStrTmHghPwrChrg : 27|14@0+ (1,0) [0|0] "" XXX
+ SG_ HVBSTHPC_HrOfDy : 24|5@0+ (1,0) [0|31] "Hour" XXX
+ SG_ HVBSTHPC_DyOfWk : 27|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBSTHPC_MntOfHr : 35|6@0+ (1,0) [0|63] "Minute" XXX
+ SG_ HVBatStrTmLwPwrChrg : 45|14@0+ (1,0) [0|0] "" XXX
+ SG_ HVBSTLPC_HrOfDy : 42|5@0+ (1,0) [0|31] "Hour" XXX
+ SG_ HVBSTLPC_DyOfWk : 45|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBSTLPC_MntOfHr : 53|6@0+ (1,0) [0|63] "Minute" XXX
+ SG_ HVChrgSysDpTmExdSt : 58|3@0+ (1,0) [0|0] "" XXX
+ SG_ HVCSDTES_NPDTIO : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVCSDTES_HiPwrCIO : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVCSDTES_LoPwrCIO : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ HTRActvIndOn : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ InsfcntTmTFlChrgIO : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ InvldHMIEtrIO : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVBatChrgCrdAlrtReq : 63|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2149924864 Drv_Pref_Mode_Switch_Status_LS: 8 XXX
+ SG_ DrvSelMd1Stat : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd1ReqDnd : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd2Stat : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd2ReqDnd : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd3Stat : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd3ReqDnd : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HilRlbkCtrlActIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ FwdClnMtgnBrkReqAct : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMdSelnStat : 8|17@0+ (1,0) [0|0] "" XXX
+ SG_ DSMSS_DrvSelMd1Un : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd1Pn : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd8Un : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd7Un : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd6Un : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd5Un : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd4Un : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd3Un : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd2Un : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd0Pn : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd8Pn : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd7Pn : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd6Pn : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd5Pn : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd4Pn : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd3Pn : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ DSMSS_DrvSelMd2Pn : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd4Stat : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd4ReqDnd : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd5Stat : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd5ReqDnd : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd6Stat : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd6ReqDnd : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTOMobModTrnsInGrIO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ECODrvAsstDsplyStat : 34|11@0+ (1,0) [0|0] "" XXX
+ SG_ EDADS_ShftIndStat : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ EDADS_EcoDrvShftIO : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ EDADS_RcmndtFwdGr : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ EDADS_CrntFwdMsdG : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ DrvSelMd7Stat : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd7ReqDnd : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd8Stat : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvSelMd8ReqDnd : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ FstIdlMdAct : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ DsplyPerfMdRq : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ TireLFLowTracIO : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireLRLowTracIO : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireRFLowTracIO : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireRRLowTracIO : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ a_12VBatSysUnstab : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ ColPrepSysCustAvail : 62|7@0+ (1,0) [0|0] "" XXX
+ SG_ CPSCA_Resrv3Avail : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSCA_Resrv2Avail : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSCA_Resrv1Avail : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSCA_AlrtBrkStrAvail : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSCA_AlrtBrkAvail : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSCA_AlrtAvail : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSCA_OffAvail : 62|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2152054784 HMI_Disp_Hyb_Animation_Status_LS: 1 XXX
+ SG_ AnmStrtReq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ IntPnlClstrAnmtStat : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ FuelEconMetDispUnts : 6|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150301696 HMI_Animation_Initiator_LS: 1 XXX
+ SG_ WlcAnmReq : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150563840 HMI_AnimationHybridRadio_LS: 3 XXX
+ SG_ RadAnmtStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ RadAudQueStat : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrStStatDispAct : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsStStatDispAct : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154758144 Auxiliary_Heater_Active_LS: 1 XXX
+ SG_ ChldLckOtSwAct : 1|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154577920 Amp_Sink_Stat_LS: 2 XXX
+ SG_ AmpSnkStat : 4|13@0+ (1,0) [0|0] "" XXX
+ SG_ ASS_SurndAvail : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPAvail : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_VehNoisCmpnAvail : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_PhLckdLpLckd : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_MtxSnkMutStat : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd7Prsnt : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd6Prsnt : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd5Prsnt : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd4Prsnt : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd3Prsnt : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd2Prsnt : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd1Prsnt : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASS_DSPMd0Prsnt : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154594304 Amp_Settings_Tone_Ctrl_LS: 5 XXX
+ SG_ AmpSetTonCtrl : 1|34@0+ (1,0) [0|0] "" XXX
+ SG_ ASTC_ChimSnkLvl : 1|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX
+ SG_ ASTC_ChimSnkSpkrPos : 9|4@0+ (1,0) [0|15] "" XXX
+ SG_ ASTC_SurndLvl : 21|6@0- (1,0) [-32|31] "" XXX
+ SG_ ASTC_MtxSnkMutRmpTm : 25|8@0+ (5,0) [0|1275] "ms" XXX
+ SG_ ASTC_MtxSnkMut : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASTC_DSPMd : 30|4@0+ (1,0) [0|15] "" XXX
+ SG_ ASTC_VehNoisCmpnAct : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASTC_GblAudSnkMut : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASTC_AmpLwPwrSt : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ InfotnBkltngConfigSt : 3|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154586112 Amp_Settings_Sink_Lvl_Ctrl_LS: 8 XXX
+ SG_ AmpSetSnkLvlCtrl : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ASSLC_MtxSnkLvl : 7|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX
+ SG_ ASSLC_MxPrmtSnkLvl : 15|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX
+ SG_ ASSLC_AudFdbkSnkLvl : 23|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX
+ SG_ ASSLC_FvSnkLvl : 31|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX
+ SG_ ASSLC_MtxSnkFd : 33|6@0- (1,0) [-32|31] "" XXX
+ SG_ ASSLC_MtxSnkBal : 39|6@0- (1,0) [-32|31] "" XXX
+ SG_ ASSLC_MtxSnkBass : 43|6@0- (1,0) [-32|31] "" XXX
+ SG_ ASSLC_MtxSnkMdrng : 53|6@0- (1,0) [-32|31] "" XXX
+ SG_ ASSLC_AutoLdnsCmpnAct : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASSLC_VcSrcActOnMtx : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASSLC_MtxSnkTrbl : 63|6@0- (1,0) [-32|31] "" XXX
+
+BO_ 2152857600 ACC_TrafficJam_RouteSpd_Stat_LS: 3 XXX
+ SG_ ACCRteSpdDrvIntvReq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACCTrfcJamAstActStat : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ ACCRteSpdAdaptStat : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACCGrnMdStat : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACCTrfcJamAstRmnTm : 23|8@0+ (1,0) [0|255] "sec" XXX
+
+BO_ 2158149632 High_Volt_Bat_Time_Bsd_Rsp_1_LS: 7 XXX
+ SG_ HVBatTmBsSsnChRsp : 0|14@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBSCR_SsnStat : 0|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBTBSCR_SsnMthStat : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBSCR_SsnSlctStat : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBTBSCR_SsnDyStat : 23|5@0+ (1,0) [0|31] "day" XXX
+ SG_ HVBatTmBsChrgStRsp : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBatCrgDspStat : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBatTmBsChrgRtRsp : 17|10@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBCRS_ChRtEnblStat : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBTBCRS_ChRtSlctStat : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBCRS_ChRtDStat : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ EngyCnsHsGrphCnfgDt : 36|13@0+ (1,0) [0|0] "" XXX
+ SG_ ECHGCD_YAxMaxVal : 32|6@0+ (4,0) [0|252] "" XXX
+ SG_ ECHGCD_MeasUt : 36|4@0+ (1,0) [0|15] "" XXX
+ SG_ ECHGCD_XAxTkMrkInterv : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ EgyCnsHstGphInsEgyCns : 55|5@0+ (1,0) [0|31] "" XXX
+
+BO_ 2158116864 High_Volt_Bat_Time_Bsd_Rsp_LS: 8 XXX
+ SG_ OBHVBCMinsRmng : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ OBHVBCCompTmDispFrmt : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBatTmBsDelChrgRsp : 12|21@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBDCRS_DlChHRsp : 12|5@0+ (1,0) [0|31] "hr" XXX
+ SG_ HVBTBDCRS_DlChSlctStat : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBDCRS_DlChDStat : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBDCRS_DlChMHRsp : 29|6@0+ (1,0) [0|63] "min" XXX
+ SG_ HVBTBDCRS_DlChSsnStat : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBatTmBsRtChrgRsp : 34|27@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBRCR_RtChMHRsp : 32|6@0+ (1,0) [0|63] "min" XXX
+ SG_ HVBTBRCR_RtChSsnStat : 34|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBTBRCR_RtChSlctStat : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBTBRCR_RtChDStat : 50|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBRCR_RtChHRsp : 55|5@0+ (1,0) [0|31] "hr" XXX
+ SG_ HVBTBRCR_RtCHSlctTblRwStat : 58|3@0+ (1,0) [0|7] "rows" XXX
+ SG_ HVBTBRCR_RtChSlRtStat : 62|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2156281856 High_Volt_Bat_Time_Bsd_Req_1_LS: 7 XXX
+ SG_ HVBatTmBsSsnChStReq : 0|14@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBSCSR_SsnStReq : 0|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBTBSCSR_SsnMthStReq : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBSCSR_SsnSlStReq : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBTBSCSR_SsnDayStReq : 23|5@0+ (1,0) [0|31] "day" XXX
+ SG_ HVBatTmBsChrgMdReq : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVChgSyChgLvlPrfSt : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ StTODChrgTmpOvrd : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVBatTmBsChrgRtStReq : 17|10@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBCRSR_ChRtEnblStReq : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBTBCRSR_ChRtSlStReq : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBCRSR_ChRtDStReq : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ TmpOvdNxtPlnDptTmRq : 32|17@0+ (1,0) [0|0] "" XXX
+ SG_ TONPDTR_StTmpOvrAtv : 32|2@0+ (1,0) [0|3] "" XXX
+ SG_ TONPDTR_HrOfDy : 42|5@0+ (1,0) [0|31] "Hour" XXX
+ SG_ TONPDTR_DyOfWk : 46|4@0+ (1,0) [0|15] "" XXX
+ SG_ TONPDTR_MntOfHr : 53|6@0+ (1,0) [0|63] "Minute" XXX
+ SG_ RtBsChrgCmplnTmPrfReq : 34|2@0+ (1,0) [0|3] "" XXX
+ SG_ HTRCsStReq : 37|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2156265472 High_Volt_Bat_Time_Bsd_Req_LS: 8 XXX
+ SG_ ChgCdTfAlCzStRq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ ChgPwLsAlCzStRq : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ PrtyChrgRq : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBatTmBsDlChStReq : 12|21@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBDCSRQ_DlChHStReq : 12|5@0+ (1,0) [0|31] "hr" XXX
+ SG_ HVBTBDCSRQ_DlChSlStReq : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBDCSRQ_DlChDStReq : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBDCSRQ_DlChMHStReq : 29|6@0+ (1,0) [0|63] "min" XXX
+ SG_ HVBTBDCSRQ_DlChSsnStReq : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ ChgSysAudInCsStReq : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBatTmBsRtChrgStReq : 34|27@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBRCSR_RtChDStReq : 34|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBRCSR_RtChSlStReq : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVBTBRCSR_RtChSlRtStReq : 46|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBRCSR_RtChMHStReq : 48|6@0+ (1,0) [0|63] "min" XXX
+ SG_ HVBTBRCSR_RtChSsnStReq : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBTBRCSR_RtChHStReq : 55|5@0+ (1,0) [0|31] "hr" XXX
+ SG_ HVBTBRCSR_RtChSlTbRwReq : 58|3@0+ (1,0) [0|7] "rows" XXX
+ SG_ OffBrdHVCVehCsChRq : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngyUsgScrnMeasUtStat : 39|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2150113280 Energy_Storage_System_LS: 8 XXX
+ SG_ EngyStgSysActCoolEnb : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvCycElEnrgUsd : 21|14@0+ (0.36,0) [0|5897.88] "MJ" XXX
+ SG_ DrvCyclElecEngyEcon : 32|9@0+ (0.1,0) [0|51.1] "" XXX
+ SG_ HVChrgInhbRsn : 36|4@0+ (1,0) [0|15] "" XXX
+ SG_ DrvCyclTrpDstTrvld : 54|15@0+ (0.1,0) [0|3276.7] "km" XXX
+
+BO_ 2150055936 Climate_Control_Status_LS: 5 XXX
+ SG_ ClmtCtrlUpprPwrLmt : 7|8@0+ (0.1,0) [0|25.5] "kW" XXX
+ SG_ ClmtCtrlLwrPwrLmt : 15|8@0+ (0.1,0) [0|25.5] "kW" XXX
+ SG_ ClimCtrlHVDvcShtdwnCmd : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmCntCmpPwrUsdClc : 39|8@0+ (0.04,0) [0|10.2] "kW" XXX
+
+BO_ 2150039552 Thrml_Ref_Compressor_Status_LS: 5 XXX
+ SG_ ThrmlRefCompStat : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ EvpCorOtltAirTmpCalcdGroup : 4|13@0+ (1,0) [0|0] "" XXX
+ SG_ EvpCorOtltAirTmpCalcdV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ EvpCorOtltAirTmpCalcd : 15|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+ SG_ ThrmlRefCompSpdGroup : 22|15@0+ (1,0) [0|0] "" XXX
+ SG_ ThrmlRefCompSpd : 21|14@0+ (1,0) [0|16383] "rpm" XXX
+ SG_ ThrmlRefCompSpdV : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ThrmlRfCmpOvTmpFltPr : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154856448 Humidity_Sensor_Status_LS: 5 XXX
+ SG_ HmdtySnsrGlssTemp : 1|10@0+ (0.146628,-50) [-50|100.000444] "deg C" XXX
+ SG_ HmdtySnsrTemp : 17|10@0+ (0.146628,-50) [-50|100.000444] "deg C" XXX
+ SG_ HmdtySnsrRltvHmdty : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2151342080 Park_Assistant_Right_Status_LS: 2 XXX
+ SG_ PARtRgn1ObjStat : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ PrkAstRtSysStat : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ PARtRgn3ObjStat : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARtRgn2ObjStat : 15|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151325696 Park_Assistant_Left_Status_LS: 2 XXX
+ SG_ PALtRgn1ObjStat : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ PrkAstLtSysStat : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ PALtRgn3ObjStat : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ PALtRgn2ObjStat : 15|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151809024 Drv_Cycl_Elec_Enrgy_Consumd_LS: 8 XXX
+ SG_ DrvCycElecEngySt5 : 5|14@0+ (0.36,0) [0|5897.88] "MJ" XXX
+ SG_ DrvCycElecEngyCnsmd : 23|32@0+ (1,0) [0|0] "" XXX
+ SG_ DCEEC_EngyPct1 : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DCEEC_EngyPct2 : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DCEEC_EngyPct3 : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ DCEEC_EngyPct4 : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ ElecEngyEconAvg : 48|9@0+ (0.1,0) [0|51.1] "" XXX
+
+BO_ 2151858176 Drv_Cycl_Elec_Enrgy_States_LS: 8 XXX
+ SG_ DrvCycElecEngySt1 : 5|14@0+ (0.36,0) [0|5897.88] "MJ" XXX
+ SG_ DrvCycElecEngySt2 : 21|14@0+ (0.36,0) [0|5897.88] "MJ" XXX
+ SG_ DrvCycElecEngySt3 : 37|14@0+ (0.36,0) [0|5897.88] "MJ" XXX
+ SG_ DrvCycElecEngySt4 : 53|14@0+ (0.36,0) [0|5897.88] "MJ" XXX
+
+BO_ 2150547456 HMI_Hybrid_Vehicle_Status_LS: 8 XXX
+ SG_ HVDpltnMdRng : 0|16@0+ (0.015625,0) [0|1023.984375] "km" XXX
+ SG_ VehChrgMdSt : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ GrnAudQueReq : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SvcHybChrgSysIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVBatChrgCrdConnIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CntrsOpnUndrTmpIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ OffBrdHVCVehCplrLkd : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVBatLimDTmpInd : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ OffBrdHVCVehPwrDrtd : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVChrgrSysStat : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ HVChrgrCplrStat : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ ChgrSysAdblIndReq : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBatOutOfEnrgyInd : 36|3@0+ (1,0) [0|7] "" XXX
+ SG_ OffBrdHVBlkChrgCmp : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElecPrplsnMtrOvrSpdIO : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVBatCntctrsOpnIO : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVDpltnMdCnfdcTrndg : 47|8@0- (0.787402,0) [-100.787456|100.000054] "%" XXX
+ SG_ OffBrdHVBlkChgCpltTm : 53|14@0+ (1,0) [0|0] "" XXX
+ SG_ OBHVBCCT_HrofDay : 50|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBHVBCCT_DayofWk : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBHVBCCT_MinofHr : 61|6@0+ (1,0) [0|63] "" XXX
+ SG_ OffBrdHVCVehPwrLvl : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2151489536 CSV_EOCM_R_Indications_LS: 1 XXX
+ SG_ RVBShtToPrkBfExtngVehIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RVBAutoBrkRlsIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NVSysStat : 4|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2149761024 Chassis_Information_2_LS: 6 XXX
+ SG_ PerfTrcCrnExStngVal : 4|5@0+ (1,0) [0|31] "" XXX
+ SG_ ActVehAccelGroup : 5|22@0+ (1,0) [0|0] "" XXX
+ SG_ ActVehAccelV : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ActVehAccel : 11|12@0- (0.01,0) [-20.48|20.47] "m/s^2" XXX
+ SG_ TrlrStabAstActIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElvtdIdlCstStAvl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElvtdIdlCstCrStVal : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ TrnsCltchThrmlProtIndR : 27|20@0+ (1,0) [0|0] "" XXX
+ SG_ TCTPIR_DrvNotfn : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ TCTPIR_TnsEsClTmpD : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ TCTPIR_TnsEsClCDwT : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ PsngStPerfMdCsCrStVal : 30|3@0+ (1,0) [0|7] "" XXX
+ SG_ PsngStPerfMdCsStAvl : 31|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155012096 SBZA_Right_Status_LS: 1 XXX
+ SG_ SODTmpUnavlbleIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SODSnsClnRqdIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SODRtIndCntl : 6|5@0+ (1,0) [0|0] "" XXX
+ SG_ SODRIC_Ind3 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SODRIC_Ind2 : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ SODRIC_Ind1 : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SODRIC_IndReq : 6|2@0+ (1,0) [0|3] "" XXX
+ SG_ SrvSODSysIO : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150514688 Power_Slidining_Door_Status_LS: 1 XXX
+ SG_ SldngDrRgtStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ SldngDrLftStat : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ PwrSldngDrUnavlblIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ SdClsrObstclDtctdStat : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2158067712 Video_Master_Info_2_LS: 5 XXX
+ SG_ TchScnDsplUsrActnExt : 1|34@0+ (1,0) [0|0] "" XXX
+ SG_ TSDUAE_RotBtnPsh : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TSDUAE_ScrnPrsdRq : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TSDUAE_GrphStrkInfRq : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ TSDUAE_XCoOdntRq : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ TSDUAE_YCoOdntRq : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ TSDUAE_RotEnc : 39|8@0- (1,0) [-128|127] "Detentions" XXX
+
+BO_ 2158051328 Video_Master_Info_1_LS: 5 XXX
+ SG_ RemRcvrSrcInpCmd : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ VidMstrDsplyMd : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ VidSrcUICntrlStat : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmtRcvrTunCmnd : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ VidMstrArbCmd : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ RmtRcvrTunVal : 23|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ VidMstrSrcType : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ TVDspCmd : 39|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2158034944 TV_Tuner_Info_LS: 6 XXX
+ SG_ VidSrcCompFormatER : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ CurntTVStnServc : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ CurntTVStnQual : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmtRcvrCmndStat : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ RmtRecvtDataTyp : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ RmtRcvrTunStat : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ TVTunerPres : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmtRcvrPrgrmServID : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ VidSrcStatCode : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ RemRcvrSrcInpStat : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ VidSrcType : 44|5@0+ (1,0) [0|31] "" XXX
+
+BO_ 2158018560 TV_Station_Name_LS: 8 XXX
+ SG_ TVStatNmeChar1_8 : 7|64@0+ (1,0) [0|0] "" XXX
+
+BO_ 2156838912 WiFi_Station_LS: 7 XXX
+ SG_ WiFiStationResp : 3|52@0+ (1,0) [0|0] "" XXX
+ SG_ WSR_WiFiAssnStat : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ WSR_WiFiStnMACAddr : 15|48@0+ (1,0) [0|281474976710655] "" XXX
+
+BO_ 2156822528 WiFi_AP_Data_LS: 2 XXX
+ SG_ WiFiAccsPntData : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ WAPD_IHUWiFiEnStat : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ WAPD_EncrptnType : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ WAPD_SecurityType : 15|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151948288 Driver_Drow_Det_Cst_Rqst_LS: 1 XXX
+ SG_ DrvDrowDetCstStRq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ RunBrdOpMdCstStReq : 7|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2158002176 XM_Radio_Service_LS: 1 XXX
+ SG_ CurntStnServc : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ SrvcPrvdr : 5|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2149728256 Charging_Sys_Trans_Shift_Lock_LS: 5 XXX
+ SG_ ChrgSysTrnsShftLckRq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ChrgPrtDrStat : 2|2@0+ (1,0) [0|3] "" XXX
+ SG_ PrtyChrgActIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrtyChrgAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ HghVltgPropState : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ ChgCdTfAlCzCrStVal : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ ChgCdTfAlCzStAvbl : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ChgPwLsAlCzCrStVal : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ ChgPwLsAlCzStAvbl : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ChgSyAudInCsCrStVa : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ ChgSysAudInCsStAvl : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVChrgPwrLvl : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ EngAstHtCsCrStVal : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ EngAstHtCsStAvl : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngAstHtPlgInCsCrStVl : 30|3@0+ (1,0) [0|7] "" XXX
+ SG_ EngAstHtPlgInCsStAvl : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrtyChrgStPnt : 38|7@0+ (1,0) [0|127] "" XXX
+
+BO_ 2150023168 Hybrid_Information_LS: 5 XXX
+ SG_ HybChrgMdStat : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVInvRatVltGroup : 2|19@0+ (1,0) [0|0] "" XXX
+ SG_ HVInvRatVltV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVInvRatVlt : 8|9@0+ (1,0) [0|511] "volts" XXX
+ SG_ OffBrdVehImmbNot : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ ElecPrplsnMtrTach : 28|13@0+ (1,0) [0|8191] "rpm" XXX
+
+BO_ 2153988096 Power_Elec_Info_LS: 7 XXX
+ SG_ PwrElecCoolLpTempGroup : 1|10@0+ (1,0) [0|0] "" XXX
+ SG_ PwrElecCoolLpTempV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ PwrElecCoolLpTempM : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PwrElecCoolLpTemp : 15|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ EngyUsgScr : 20|37@0+ (1,0) [0|0] "" XXX
+ SG_ EUS_TcEngyUsgScrAvVal : 20|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUS_TrEngyUsgScrAvVal : 29|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUS_OTEngyUsgScrAvVal : 38|7@0- (0.1,0) [-5|5] "" XXX
+ SG_ EUS_TtEngyUsgScrAvVal : 40|9@0- (0.1,0) [-20|20] "" XXX
+ SG_ EUS_ITEngyUsgScrAvVal : 47|7@0- (0.1,0) [-5|5] "" XXX
+
+BO_ 2155945984 Jump_Start_Req_LS: 1 XXX
+ SG_ JmpStrtReq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TCSysCurStReq : 2|2@0+ (1,0) [0|3] "" XXX
+ SG_ VehStbEnhmntCurStRq : 4|2@0+ (1,0) [0|3] "" XXX
+ SG_ VehStbCmptvMdCurStRq : 6|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2155585536 MSB_Customization_Setting_Req_LS: 1 XXX
+ SG_ StBltTgtCSRq : 2|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155569152 CPS_Customization_Setting_Req_LS: 3 XXX
+ SG_ ColPrSysCustReq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ ExtHlStrAssCsStRq : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ IntDimSeldClrTypStReq : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ HLOCCstSetReq : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ IntDimSeldAnmTypStReq : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ SmPhRmFunCstStReq : 22|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155233280 VICM_Info_LS: 8 XXX
+ SG_ VehRefuelSt : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ FlDrOpenIndOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ UtlChrgPopUpAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ UtlChrgIntrfrIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ShftPrkIO_3B2 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ NtrlCstdwnCrtMdActvIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtBsChrgCmplnTmPrfRsp : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ EngRnngDutoVehSpdIO : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ NtrlGrWrngIO : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftmFuelEcon : 19|12@0+ (0.1,0) [0|409.5] "kilometers/liter" XXX
+ SG_ LiftimeFuelEcnEquiv : 35|12@0+ (0.1,0) [0|409.5] "km/l" XXX
+ SG_ ChrgCyclFuelEcn : 51|12@0+ (0.1,0) [0|409.5] "km/l" XXX
+
+BO_ 2152169472 Coolant_Heater_Status_LS: 3 XXX
+ SG_ ClntHtrSt : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ClntHtrPCBOvTmpFlt : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntHtrHtSnkOvTmpFlt : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntHtrElecPwrGroup : 4|13@0+ (1,0) [0|0] "" XXX
+ SG_ ClntHtrElecPwrV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntHtrElecPwr : 15|8@0+ (0.04,0) [0|10.2] "kW" XXX
+ SG_ ClntHtrFlt : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ ClntHtrInltClntTmp : 23|8@0+ (1,-40) [-40|215] "deg C" XXX
+
+BO_ 2152759296 SITM_Front_Sensor_IO_LS: 1 XXX
+ SG_ FrtCmrBlckdIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrtEOCMMdlFldIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrtCmrFldIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrtRdrFldIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PedWrnIndReq : 5|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152742912 SITM_Rear_Sensor_IO_LS: 1 XXX
+ SG_ RrEOCMMdlFldIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrRdrBlckdIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrRdrFldIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ShrtRngRdrOffIO : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150891520 Go_Notifier_Req_LS: 5 XXX
+ SG_ DgtlMapSpdCat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ FwdClnAlrtCustStngReq : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ GNCustStngReq : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ DgtlMapDrvngSd : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ DgtlMapPsgRstrctn : 11|3@0+ (1,0) [0|7] "" XXX
+ SG_ RrStRmndrCstSetReq : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ DgtlMapEffSpdLmt : 20|5@0+ (1,0) [0|31] "" XXX
+ SG_ DgtlMapEffSpdLmtTyp : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ DgtlMapVerYr : 29|6@0+ (1,0) [0|63] "" XXX
+ SG_ DgtlMapVerQtr : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ DgtlMapCndlSpdLmt : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ DgtlMapCndlSpdLmtTyp : 39|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2151751680 Haptic_Seat_Status_LS: 3 XXX
+ SG_ CrshAlrtDrvrSlctdType : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrshAlrtStPrsnt : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HptcStVbnStat : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ HptcStFldIO : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155536384 Rear_Virtual_Bmper_Indication_LS: 1 XXX
+ SG_ RVBDsbldIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RVBEnbldIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RVBFldIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RVBUnblIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvRIMOffUnbIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RevClnMtgnBrkReqAct : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151481344 CSV_FSRACC_Indications_LS: 1 XXX
+ SG_ AutoBrkRlsIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ShtToPrkBfExtngVehIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HdUpDsplyUnblIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ FSRACCFrstRsmPrssIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrtRdrBlckdIO : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151432192 ACC_Drv_Seat_Vib_Req_IO_LS: 1 XXX
+ SG_ ACCHptcStVbnRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACCHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 2151415808 Ln_Dep_Wrn_Drv_Seat_Vib_Req_LS: 5 XXX
+ SG_ LDWLftHptcStRqSN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDWLftHptcStRq : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ LDWRghtHptcStRqSN : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDWRghtHptcStRq : 15|6@0+ (1,0) [0|63] "" XXX
+ SG_ LftLnChgThrtHptStRqSN : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ LftLnChgThrtHptStRq : 23|6@0+ (1,0) [0|63] "Pulse" XXX
+ SG_ RgtLnChgThrtHptStRqSN : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ RgtLnChgThrtHptStRq : 31|6@0+ (1,0) [0|63] "Pulse" XXX
+ SG_ FrPedDetCsStAvl : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrPedDetCsCrStVal : 35|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2151350272 Frnt_Prk_Ast_Drv_Seat_Vib_Req_LS: 3 XXX
+ SG_ FPAHptcStVbnRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ FPAHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ APAIconDispRq : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ APAIconFilPctRq : 22|7@0+ (1,0) [0|127] "" XXX
+
+BO_ 2151333888 Rear_Prk_Ast_Drv_Seat_Vib_Req_LS: 1 XXX
+ SG_ RPAHptcStVbRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RPAHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 2151522304 Reset_FuelLife_Request_LS: 1 XXX
+ SG_ FuelFltLfRstRqd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElEngyEconAvgRstRq : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TCSTmpDsblReqConf : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnchCtrlRelLnLockReqd : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150629376 CV_System_Failure_LS: 1 XXX
+ SG_ CVSysFlrIO : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155929600 Diesel_Information_LS: 8 XXX
+ SG_ DslExFldTpWrngIndRq : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ DslExhFldDiagWrnIdRq : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ DslExhFldQlyWrngIReq : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DslExhFldWrngIdRqER : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ DslExhFluidDistTIndcmt : 22|15@0+ (2,0) [0|65534] "km" XXX
+ SG_ DslExNxEmWrngIndRq : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ DslExFldCnWrngIndRq : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ DslExFldWrngVSpdLmt : 47|24@0+ (1,0) [0|0] "" XXX
+ SG_ DEFWVSL_S1SpdLmt : 47|8@0+ (1,0) [0|255] "km / h" XXX
+ SG_ DEFWVSL_S2SpdLmt : 55|8@0+ (1,0) [0|255] "km / h" XXX
+ SG_ DEFWVSL_S3SpdLmt : 63|8@0+ (1,0) [0|255] "km / h" XXX
+
+BO_ 2154741760 RSA_Status_LS: 1 XXX
+ SG_ RSAPrsnt : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154807296 Lighting_Customization_Info_3_LS: 4 XXX
+ SG_ AFLGPSCstCrStVal : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ AFLCstCrStVal : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ AFLGPSCstStAvl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ AFLCstStAvl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ AFLGPSMnu2CstStAvl : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ AFLMnu2CstStAvl : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ AFLMnu3CstStAvl : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngAutoStpNotProb : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESCMHiEleclLdReqAct : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngAutoStrtStpInfo : 17|10@0+ (1,0) [0|0] "" XXX
+ SG_ EASSI_StrtStpSt : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ EASSI_UnsdRsrvd2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ EASSI_TorqDetdIndet : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ EASSI_StlDetd : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ EASSI_TrqDetd : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ EASSI_FuelReqOn : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ EASSI_StrtTyp : 31|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2151079936 PDIM_Status_LS: 1 XXX
+ SG_ PDIMPrsnt : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155364352 Hybrid_Information_SuperSlow_LS: 5 XXX
+ SG_ SvcHybridSysIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ JmpStrtStat : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ HybMdDisp : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ CstmrUsblSOCGroup : 15|15@0+ (1,0) [0|0] "" XXX
+ SG_ CstmrUsblSOC : 15|8@0+ (0.39216,0) [0|100.0008] "%" XXX
+ SG_ CstmrUsblSOCV : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ BattCntrlPrcssrVDA : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ InstDrvEff : 31|8@0- (0.78125,0) [-100|99.21875] "%" XXX
+ SG_ ClntCrcFlwRtEst : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2154979328 Front_Seat_Heat_Cool_Req_LS: 1 XXX
+ SG_ FrntStVoltBstModReq : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155282432 RearSeat_HeatVent_Cool_LS: 1 XXX
+ SG_ RrStVoltBstModReq : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151505920 VehInfoTripComputer_LS: 7 XXX
+ SG_ SpdCurvAdvSysEnbld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrBrkDsplyAct : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCSettingType : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ AutoMdSpdLmtCnfrmd : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTExPrtclFltManRgnRqd : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ Trp2OdomtrGroup : 6|55@0+ (1,0) [0|0] "" XXX
+ SG_ Trp2OdomtrV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ Trp2Odomtr : 38|23@0+ (0.015625,0) [0|131071.984375] "km" XXX
+ SG_ Trp1OdomtrGroup : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ Trp1OdomtrV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ Trp1Odomtr : 14|23@0+ (0.015625,0) [0|131071.984375] "km" XXX
+
+BO_ 2155896832 Alternative_Fuel_Information_LS: 5 XXX
+ SG_ FuelMdStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ AltFuelMdReqDndIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FlLvlTank2PctGroup : 4|13@0+ (1,0) [0|0] "" XXX
+ SG_ FlLvlTank2PctV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ FlLvlTank2Pct : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ AltFuelAccWrnngAct : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ AltFuelLvlLo : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ AltFuelPHeatAct : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ FuelTotCapTnk2 : 19|12@0+ (0.125,0) [0|511.875] "liters" XXX
+ SG_ FuelAlchlCompAdptnPrg : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ FuelAlcoholCompGroup : 21|22@0+ (1,0) [0|0] "" XXX
+ SG_ FuelAlcoholCompV : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ FuelAlcoholComp : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2155552768 Exterior_Lock_Switch_Req_LS: 1 XXX
+ SG_ PsvEntCmftWndRq : 1|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154496000 Rear_Closure_Soft_Top_Info_LS: 1 XXX
+ SG_ CmpSftTopMotBfrOpTrnkIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TargaTopStateGroup : 2|2@0+ (1,0) [0|0] "" XXX
+ SG_ TargaTopState : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TargaTopStateV : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155208704 Power_Conv_Top_Info_LS: 3 XXX
+ SG_ SftTpAbvWrngSpdIndOn : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpFlrIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpLtcIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpMnlLtchIndOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpMchnOvhtIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpRmCrgCrrIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpStrIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpTmpLwIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpTneuCvrIO : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpVehOvSpdIndOn : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpVltLwIO : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ CkSoftTpIO : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClsTrnkLidIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FTUpdWndPsLmtEnbld : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ VltSwAtvIndOn : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpTrnLmpsRqd : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ FldngTpSt : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ FldngTpWndCmftRq : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ SftTpPlsDnSrtdIndOn : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftTpPlsDnWrngIndOn : 22|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2153390080 Manual_Liftgate_Control_LS: 1 XXX
+ SG_ RrClosOpenSwAct_2D1Group : 3|3@0+ (1,0) [0|0] "" XXX
+ SG_ RrClosOpenSwAct_2D1 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClosOpenSwAct_2D1V : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155175936 CruiseControlGapSwitch_LS: 1 XXX
+ SG_ AdptCrsGapSwAct : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ AdptCrsLKALDWSwAct : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2156806144 Cellular_Network_Date_and_Time: 6 XXX
+ SG_ CldrDayCmpstdVal : 4|5@0+ (1,0) [0|31] "days" XXX
+ SG_ HrsCmpstdValGroup : 5|30@0+ (1,0) [0|0] "" XXX
+ SG_ HrsCmpstdValV : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HrsCmpstdVal : 28|5@0+ (1,0) [0|31] "h" XXX
+ SG_ MinsCmpstdValGroup : 6|39@0+ (1,0) [0|0] "" XXX
+ SG_ MinsCmpstdValV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ MinsCmpstdVal : 37|6@0+ (1,0) [0|63] "min" XXX
+ SG_ SecCmpstdValGroup : 7|48@0+ (1,0) [0|0] "" XXX
+ SG_ SecCmpstdValV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SecCmpstdVal : 45|6@0+ (1,0) [0|63] "secs" XXX
+ SG_ CldrMthCmpstdVal : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ CellNtwrkDtTmAvl : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ CldrYrCmpstdVal : 23|8@0+ (1,2000) [2000|2255] "year" XXX
+
+BO_ 2154078208 Window_Position_Status_LS: 2 XXX
+ SG_ DrvWndPosStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ LRWndPosStat : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ PsWndPosStat : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ RRWndPosStat : 13|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2159058944 ODIEvent_IPC_LS: 3 XXX
+ SG_ ODIEvntPkt_IPC : 5|22@0+ (1,0) [0|0] "" XXX
+ SG_ ODIEI_EvID : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIEI_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIEI_MultiFrRetCh : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2159042560 ODI_DynData_IPC_LS: 8 XXX
+ SG_ ODIDynData_IPC : 14|55@0+ (1,0) [0|0] "" XXX
+ SG_ ODDI_InvldData : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDI_DataType : 14|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODDI_FUCID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDI_DataId : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDI_DataVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2150006784 System_Power_Mode_Pushbutton_LS: 1 XXX
+ SG_ SysPwrMdPshbtnActGroup : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ SysPwrMdPshbtnAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SysPwrMdPshbtnActV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PEPSRunCrnkRlyDctd : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155216896 Road_Type_Information_LS: 6 XXX
+ SG_ MpDataAvlbl : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ BldUpArDet : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SprtLnRd : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ CntrldAccRd : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ CurvAdvInd : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ SpdLmtPstdSpdGroup : 6|23@0+ (1,0) [0|0] "" XXX
+ SG_ SpdLmtPstdSpdM : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtPstdSpd : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ DgtlMapPstdSpdLimAsrd : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ FncRdClass : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ RdSpdCatType : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnCat : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ SpdLmtUnits : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtRecmndSpd : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ IntlStdAlph2CddCntryCd : 33|10@0+ (1,0) [0|0] "" XXX
+ SG_ ISA2CCC_FrstCdChr : 33|5@0+ (1,0) [0|31] "" XXX
+ SG_ ISA2CCC_ScndCdChr : 44|5@0+ (1,0) [0|31] "" XXX
+
+BO_ 2156216320 TTY_Status_LS: 1 XXX
+ SG_ TxtTelephoneDevPr : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2158813184 ODIIndication_IPC_LS: 8 XXX
+ SG_ ODIInd_IPC : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODIIIPC_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIIIPC_ODIInd8 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd7 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd6 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd5 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd4 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd3 : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd2 : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd1 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd16 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd15 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd14 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd13 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd12 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd11 : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd10 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd9 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd24 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd23 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd22 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd21 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd20 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd19 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd18 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd17 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd32 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd31 : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd30 : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd29 : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd28 : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd27 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd26 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd25 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd40 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd39 : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd38 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd37 : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd36 : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd35 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd34 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd33 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd48 : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd47 : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd46 : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd45 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd44 : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd43 : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd42 : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd41 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd56 : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd55 : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd54 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd53 : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd52 : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd51 : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd50 : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIIPC_ODIInd49 : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150277120 GPS_Geographical_Position_LS: 8 XXX
+ SG_ PsngSysLatGroup : 6|31@0+ (1,0) [0|0] "" XXX
+ SG_ PsngSysLat : 5|30@0- (1,0) [-536870912|536870911] "mas" XXX
+ SG_ PsngSysLatV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsngSysLongGroup : 39|32@0+ (1,0) [0|0] "" XXX
+ SG_ PsngSysLong : 38|31@0- (1,0) [-1073741824|1073741823] "mas" XXX
+ SG_ PsngSysLongV : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150285312 GPS_Elevation_and_Heading_LS: 8 XXX
+ SG_ PsngSysHdingGroup : 3|37@0+ (1,0) [0|0] "" XXX
+ SG_ PsngSysHding : 3|12@0+ (0.1,0) [0|409.5] "deg" XXX
+ SG_ PsngSysHdingV : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsngSysDilPrcsGroup : 4|29@0+ (1,0) [0|0] "" XXX
+ SG_ PsngSysDilPrcsV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsngSysDilPrcs : 17|10@0+ (0.1,0) [0|102.3] "" XXX
+ SG_ PsngSysCalcSpdGroup : 39|10@0+ (1,0) [0|0] "" XXX
+ SG_ PsngSysCalcSpd : 39|8@0+ (1,0) [0|255] "km / h" XXX
+ SG_ PsngSysCalcSpdV : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsngSysElvtnGroup : 45|22@0+ (1,0) [0|0] "" XXX
+ SG_ PsngSysElvtn : 44|21@0+ (1,-100000) [-100000|1997151] "cm" XXX
+ SG_ PsngSysElvtnV : 45|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151890944 Telematics_Indication_Request_LS: 4 XXX
+ SG_ TlmtcsIndCntrlReq : 15|24@0+ (1,0) [0|0] "" XXX
+ SG_ TICR_Ind1Cnt : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ TICR_Ind1 : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ TICR_Ind1Req : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ TICR_Ind1FlshRtOff : 23|8@0+ (10,0) [0|2550] "ms" XXX
+ SG_ TICR_Ind1FlshRtOn : 31|8@0+ (10,0) [0|2550] "ms" XXX
+
+BO_ 2151251968 Telematics_Indication_Control_LS: 4 XXX
+ SG_ TlmtcsIndCntrlStat : 12|21@0+ (1,0) [0|0] "" XXX
+ SG_ TICS_Ind1V : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ TICS_Ind1 : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ TICS_Ind1Stat : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ TICS_Ind1FlshRtOffSt : 23|8@0+ (10,0) [0|2550] "ms" XXX
+ SG_ TICS_Ind1FlshRtOnSt : 31|8@0+ (10,0) [0|2550] "ms" XXX
+
+BO_ 2155495424 Remote_Start_Seat_Request_LS: 1 XXX
+ SG_ RmStrCldStEnReq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmStrHtdStEnRq : 1|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149990400 HS_Indications_Fast_LS: 8 XXX
+ SG_ ABSIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ StpOnBrkToRelPBIndOn : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrBrkngVDA : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvThrtlOvrdIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TreInfMonSysRstPrfmd : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCHdwayStngIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCDrvrSeltdSpdIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrWiringFltIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ AdvHlmpsVDA : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SADmpVDA : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ScndryAxleVDA : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvTrlrBrkngSysIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrBrkngGainSetIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrCnctdIO : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ChkTrlrIO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrBrkngFrcOtpt : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ TrlrBrkngGainSet : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ TrlrHtchSwAtv_ITBC : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ TransNtrlCntrlMdStat : 34|2@0+ (1,0) [0|3] "" XXX
+ SG_ MotStBltFldIO : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ MotStBltUnblIO : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsfrCsRngShfSpdLmt : 47|8@0+ (1,0) [0|255] "km / h" XXX
+ SG_ InstFuelConsmpRate : 51|12@0+ (0.025,0) [0|102.375] "liters/hr" XXX
+ SG_ SecAxlOperMod : 55|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2155380736 HS_Indications_SuperSlow_LS: 6 XXX
+ SG_ VehOvrLdIndOn : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvLevSysIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HdLtLvlFlrIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrLevVDA : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ AirCndOffIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilHotIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTExPrtclFltrWrnIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ DslGlwPlgIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngHotFuelEnrchmntIO : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilChngIO : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilLvlLwIO : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilPrsLwIO : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngWtrInFlIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ RdcdPwrIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ CkFlFilrCapIO : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngHt_StpEngIO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrAsstRdcdLvl2IO : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ PwrStrIO : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTExPrtclFltrWrn2IO : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ AdvFrntLghtSysIndRq : 21|3@0+ (1,0) [0|7] "" XXX
+ SG_ StrngAsstRdcdIO : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrAsstRdcdLvl3IO : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ PwrPckAirInTempFlt : 31|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ PwrPkFnSpd : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ ARSFlrIO : 40|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150498304 Analog_Values_Slow_LS: 8 XXX
+ SG_ EngCltTmpGroup : 0|57@0+ (1,0) [0|0] "" XXX
+ SG_ EngCltTmpV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngCltTmp : 63|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ EngIntAirTmpGroup : 1|50@0+ (1,0) [0|0] "" XXX
+ SG_ EngIntAirTmpV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngIntAirTmp : 55|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ EngOilTmpGroup : 2|43@0+ (1,0) [0|0] "" XXX
+ SG_ EngOilTmpV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilTmp : 47|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ OAT_PT_EstGroup : 4|37@0+ (1,0) [0|0] "" XXX
+ SG_ OAT_PT_EstV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ OAT_PT_EstM : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ OAT_PT_Est : 39|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+ SG_ TrnOilTmpGroup : 5|30@0+ (1,0) [0|0] "" XXX
+ SG_ TrnOilTmpV : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnOilTmp : 31|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ BarPrsAbsGroup : 6|23@0+ (1,0) [0|0] "" XXX
+ SG_ BarPrsAbsV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ BarPrsAbs : 23|8@0+ (0.5,0) [0|127.5] "kPa" XXX
+ SG_ EngOilPrsGroup : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ EngOilPrsV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilPrs : 15|8@0+ (4,0) [0|1020] "kPa" XXX
+
+BO_ 2151047168 HUD_Status_LS: 1 XXX
+ SG_ HUDActv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ HdUpDspAnmtStat : 3|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155331584 Wheel_Pulses_LS: 4 XXX
+ SG_ WhlPlsPerRevDrvn : 6|7@0+ (1,0) [0|127] "" XXX
+ SG_ WhlPlsPerRevNonDrvn : 14|7@0+ (1,0) [0|127] "" XXX
+ SG_ WhlRotStatTmstmpRes : 18|11@0+ (0.002,0) [0|4.094] "uSec" XXX
+
+BO_ 2154225664 Door_Handle_Switch_Status_LS: 1 XXX
+ SG_ DrvDrHndleSwAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ PasDrHndleSwAtv : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RCHndleSwAtv : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRDrHndleSwAtv : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLDrHndleSwAtv : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149900288 Telematics_Contol_LS: 3 XXX
+ SG_ EnhSrvRClsRlsRq : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ EnhSrvVisAlRq : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ EnhSrvAudAlRq : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ EnhSrvRmStrtRq : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ EnhSrvLckRq : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ BTTethrngPrngReq : 14|4@0+ (1,0) [0|15] "" XXX
+ SG_ EnhSvVehTopSpdLim : 23|8@0+ (2,0) [0|510] "km / h" XXX
+
+BO_ 2159001600 ODIEnumDynamicData_IPC_LS: 8 XXX
+ SG_ ODIEnmDynData_IPC : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIEDDIPC_Data2Value : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data1Value : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data5Value : 9|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data4Value : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data3Value : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data8Value : 16|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data7Value : 19|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data6Value : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data10Value : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data9Value : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data13Value : 33|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data12Value : 36|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data11Value : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data16Value : 40|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data15Value : 43|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data14Value : 46|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data18Value : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_Data17Value : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDIPC_FUCID : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2158993408 ODIEnumDynamicData_CntrStack_LS: 8 XXX
+ SG_ ODIEnmDynData_CenterStack : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIEDDCS_Data2Value : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data1Value : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data5Value : 9|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data4Value : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data3Value : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data8Value : 16|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data7Value : 19|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data6Value : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data10Value : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data9Value : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data13Value : 33|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data12Value : 36|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data11Value : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data16Value : 40|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data15Value : 43|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data14Value : 46|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data18Value : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_Data17Value : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDDCS_FUCID : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2154708992 Audio_Master_Source_Status_LS: 2 XXX
+ SG_ AudSrcStat2 : 3|12@0+ (1,0) [0|0] "" XXX
+ SG_ ASS2AudSrcType : 3|5@0+ (1,0) [0|31] "" XXX
+ SG_ ASS2AudSrcStatCode : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ ASS2AudSrcChType : 14|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2158985216 ODIDynDataMultiReq_OTIM_LS: 8 XXX
+ SG_ ODIDynDataMltRq_OTIM : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODDMO_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMO_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMO_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMO_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMO_ReqType : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODDMO_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMO_DispMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMO_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMO_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMO_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMO_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMO_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2154471424 Rear_Closure_Ajar_Switch_Status: 1 XXX
+ SG_ RrClosAjarSwAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClsrSnwLdIO : 1|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2159149056 ODI_TEL_2_CenterStack_LS: 8 XXX
+ SG_ ODI_TEL2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159116288 ODI_TEL_2_AuxIP_LS: 8 XXX
+ SG_ ODI_TEL2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2158796800 ODIIndication_LS: 8 XXX
+ SG_ ODIInd : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODII_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODII_ODIInd8 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd7 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd6 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd5 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd4 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd3 : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd2 : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd1 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd16 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd15 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd14 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd13 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd12 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd11 : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd10 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd9 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd24 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd23 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd22 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd21 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd20 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd19 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd18 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd17 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd32 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd31 : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd30 : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd29 : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd28 : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd27 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd26 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd25 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd40 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd39 : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd38 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd37 : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd36 : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd35 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd34 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd33 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd48 : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd47 : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd46 : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd45 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd44 : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd43 : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd42 : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd41 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd56 : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd55 : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd54 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd53 : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd52 : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd51 : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd50 : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODII_ODIInd49 : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2158755840 ODIEvent_LS: 4 XXX
+ SG_ ODIEvntPkt : 13|22@0+ (1,0) [0|0] "" XXX
+ SG_ ODIE_EvID : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIE_FUCID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIE_MultiFrRetCh : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2159157248 ODI_CenterStack_2_TEL_LS: 8 XXX
+ SG_ ODI_CntrStck2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2153955328 Infrastructure_Timer_Status_LS: 5 XXX
+ SG_ EngOffTmExtRngGroup : 0|33@0+ (1,0) [0|0] "" XXX
+ SG_ EngOffTmExtRngV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOffTmExtRng : 39|8@0+ (4,0) [0|1020] "min" XXX
+ SG_ ElpsdTimeCntRstOcc : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ElpsdTimeCnt : 15|24@0+ (1,0) [0|16777215] "min" XXX
+
+BO_ 2151063552 Infotainment_Operation_LS: 7 XXX
+ SG_ InftnOprAlwd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ValetMdAct : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ Frnt360CamSwAct : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ CamVideoICSDispAct : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ LRStStatDispAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRStStatDispAct : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrgdVidRecSwAct : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrPedDetCstStReq : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ IntrStopAlrtCsSetReq : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ ICSTchStat : 17|34@0+ (1,0) [0|0] "" XXX
+ SG_ ICSTS_TchPrxmty : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ ICSTS_X1TchCrdnt : 31|16@0+ (0.001526,0) [0|100] "" XXX
+ SG_ ICSTS_Y1TchCrdnt : 47|16@0+ (0.001526,0) [0|100] "" XXX
+ SG_ TrfRdsdInfCsStReq : 20|3@0+ (1,0) [0|7] "" XXX
+ SG_ CntdVehBrAltCsStReq : 23|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2157985792 Fob_Programming_Request_LS: 1 XXX
+ SG_ FobProgEvntRqd : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151284736 Park_Assistant_General_Status: 1 XXX
+ SG_ PrkAsstClnPrkAstIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAsstDisablIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstFld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstSnrsBlk : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstSnsDistrbdIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvPrkAstOffUnbIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAstOprtrDsrdStat_1D0 : 7|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2159099904 ODI_DAB_2_AuxIP_LS: 8 XXX
+ SG_ ODI_DAB2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159067136 ODI_DAB_2_IPC_LS: 8 XXX
+ SG_ ODI_DAB2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159206400 ODI_AuxIP_2_IPC_LS: 8 XXX
+ SG_ ODI_AxIP2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159198208 ODI_IPC_2_AuxIP_LS: 8 XXX
+ SG_ ODI_IPC2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159190016 ODI_AuxIP_2_CenterStack_LS: 8 XXX
+ SG_ ODI_AxIP2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159181824 ODI_CenterStack_2_AuxIP_LS: 8 XXX
+ SG_ ODI_CntrStck2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159173632 ODI_IPC_2_CenterStack_LS: 8 XXX
+ SG_ ODI_IPC2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159165440 ODI_CenterStack_2_IPC_LS: 8 XXX
+ SG_ ODI_CntrStck2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159108096 ODI_AuxIP_2_DAB_LS: 8 XXX
+ SG_ ODI_AxIP2DAB : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159075328 ODI_IPC_2_DAB_LS: 8 XXX
+ SG_ ODI_IPC2DAB : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2151718912 Chime_Active: 1 XXX
+ SG_ ChmAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ChmVolSt : 2|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2155479040 Customization_Setting_Request_LS: 5 XXX
+ SG_ DrvlnCustStngReq : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ RstrCustFctrDef : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PedFrndlyAlrtCsStReq : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ SusCustStngReq : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ StrCustStngReq : 13|3@0+ (1,0) [0|7] "" XXX
+ SG_ ElvtdIdlCstStReq : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ SndPerfMdCsStRq : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ DispPerfMdCsStRq : 21|3@0+ (1,0) [0|7] "" XXX
+ SG_ ACCPerfMdCsStReq : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvrStPerfMdCsStReq : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ PsngStPerfMdCsStReq : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvStyPerfMdCsStReq : 37|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2151383040 Reset_TP_request_LS: 1 XXX
+ SG_ TreInfMonSysRstReq : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155421696 Passive_Entry_Challenge_LS: 5 XXX
+ SG_ PsvEntChlng : 7|32@0+ (1,0) [0|4294967295] "passwrd" XXX
+ SG_ ServKylsStSysIO : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsvEntApprchDtcd : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsvEntAprchDrctn : 36|3@0+ (1,0) [0|7] "" XXX
+ SG_ PsvEntApprchCnfgReq : 39|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155413504 Drv_Dr_Key_Cyl_Status_LS: 3 XXX
+ SG_ DrvrDrKeyCylUlkSwActGroup : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrvrDrKeyCylUlkSwAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvrDrKeyCylUlkSwActV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsvLckngReqd : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsvApprchVehId : 15|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 2159026176 ODIDynamicData_LS: 8 XXX
+ SG_ ODIDynData : 14|55@0+ (1,0) [0|0] "" XXX
+ SG_ ODD_InvldData : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODD_DataType : 14|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODD_FUCID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODD_DataId : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODD_DataVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2158936064 ODIEnumDynamicData_LS: 8 XXX
+ SG_ ODIEnmDynData : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIEDD_Data2Value : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data1Value : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data5Value : 9|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data4Value : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data3Value : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data8Value : 16|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data7Value : 19|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data6Value : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data10Value : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data9Value : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data13Value : 33|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data12Value : 36|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data11Value : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data16Value : 40|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data15Value : 43|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data14Value : 46|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data18Value : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_Data17Value : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ ODIEDD_FUCID : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2158845952 ODIAction_CntrStack_LS: 8 XXX
+ SG_ ODIActn_CntrStck : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIAC_DaTy : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIAC_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAC_ActnID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAC_DspMID : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAC_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2158886912 ODIDynDataListRequest_IPC_LS: 8 XXX
+ SG_ ODIDynDataLstRq_IPC : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODDLI_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLI_DataId : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLI_DspMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLI_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLI_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ ODDLI_Idx : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ODDLI_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ODDLI_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLI_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLI_ReqType : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2151366656 Man_Prk_Brk_LS: 1 XXX
+ SG_ RrAxlLckIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrntAxlLckIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkBrkSwAtv : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ AxlLcksServIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ AxlLckUnavailIndReq : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ AxlLcksVDA : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149842944 Vehicle_Stability_LS: 8 XXX
+ SG_ IMUProtLonAccGroup : 2|11@0+ (1,0) [0|0] "" XXX
+ SG_ IMUProtLonAcc : 1|10@0- (0.03,0) [-15.36|15.33] "m/s^2" XXX
+ SG_ IMUProtLonAccV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ TCSysAtv : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkSysAutBrkFld : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ VSEAct : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrWhAngGroup : 6|47@0+ (1,0) [0|0] "" XXX
+ SG_ StrWhAngV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrWhAng : 39|16@0- (0.0625,0) [-2048|2047.9375] "deg" XXX
+ SG_ StWhAnVDA : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehStabEnhmntStat : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ VehStabEnhmntMd : 21|3@0+ (1,0) [0|7] "" XXX
+ SG_ StrWhlAngSenCalStat : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ TCSysOpMd : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ TCSysOpStat : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ VSELatAccGroup : 52|13@0+ (1,0) [0|0] "" XXX
+ SG_ VSELatAcc : 51|12@0- (0.015625,0) [-32|31.984375] "m/s^2" XXX
+ SG_ VSELatAccV : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AdptDrvrSeatStng : 55|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2159132672 ODIAction_RearSeat_LS: 8 XXX
+ SG_ ODIActn_RSD : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIAR_DaTy : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIAR_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAR_ActnID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAR_DspMID : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAR_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2158968832 ODI_RearSeat_2_Centerstack_LS: 8 XXX
+ SG_ ODI_RSD2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2158960640 ODIIndication_Centerstack_LS: 8 XXX
+ SG_ ODIInd_CntrStck : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODIIC_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIIC_ODIInd8 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd7 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd6 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd5 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd4 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd3 : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd2 : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd1 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd16 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd15 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd14 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd13 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd12 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd11 : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd10 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd9 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd24 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd23 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd22 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd21 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd20 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd19 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd18 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd17 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd32 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd31 : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd30 : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd29 : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd28 : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd27 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd26 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd25 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd40 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd39 : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd38 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd37 : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd36 : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd35 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd34 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd33 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd48 : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd47 : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd46 : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd45 : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd44 : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd43 : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd42 : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd41 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd56 : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd55 : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd54 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd53 : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd52 : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd51 : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd50 : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODIIC_ODIInd49 : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2158977024 ODIEvent_Centerstack_LS: 4 XXX
+ SG_ ODIEvntPkt_CntrStck : 13|22@0+ (1,0) [0|0] "" XXX
+ SG_ ODIEC_EvID : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIEC_FUCID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIEC_MultiFrRetCh : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2158952448 ODIDynDataMultiReq_RearSeat_LS: 8 XXX
+ SG_ ODIDynDataMltRq_RSD : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODDMR_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMR_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMR_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMR_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMR_ReqType : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODDMR_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMR_DispMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMR_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMR_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMR_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMR_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMR_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2158944256 ODIDynDataListReq_RearSeat_LS: 8 XXX
+ SG_ ODIDynDataLstRq_RSD : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODDLR_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLR_DataId : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLR_DspMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLR_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLR_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ ODDLR_Idx : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ODDLR_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ODDLR_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLR_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLR_ReqType : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2158927872 ODI_DynData_CenterStack_LS: 8 XXX
+ SG_ ODIDynData_CntrStck : 14|55@0+ (1,0) [0|0] "" XXX
+ SG_ ODDC_InvldData : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDC_DataType : 14|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODDC_FUCID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDC_DataId : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDC_DataVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2158895104 ODI_CenterStack_2_RearSeat_LS: 8 XXX
+ SG_ ODI_CntrStck2RSD : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2152038400 Infomatics_Response_Payload_LS: 8 XXX
+ SG_ InfMdRspPld : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2152022016 Infomatics_Metadata_Response_LS: 7 XXX
+ SG_ InfMdRspCmplt : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ InfMdRspInf : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ InfMdStRsp : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ AudSelctdSrcReq : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ AudSysVolSetCtrl : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ ASVSC_ReqEnbld : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ ASVSC_VolReq : 55|7@0+ (0.787402,0) [0|100.000054] "" XXX
+
+BO_ 2152005632 Infomatics_Request_Payload_LS: 8 XXX
+ SG_ InfMdRqstPld : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2151989248 Infomatics_Metadata_Request_LS: 5 XXX
+ SG_ InfMdRqstCmplt : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ InfMdRqstInt : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ InfMdStReq : 35|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151972864 Fuel_Level_Status_LS: 4 XXX
+ SG_ FuelLvlLwIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnchCtrlMdReq : 2|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnchCtrlWhlSlpReq : 7|5@0+ (1,0) [0|31] "" XXX
+ SG_ VehFuelRngCalcGroup : 9|18@0+ (1,0) [0|0] "" XXX
+ SG_ VehFuelRngCalc : 8|17@0+ (0.015625,0) [0|2047.984375] "km" XXX
+ SG_ VehFuelRngCalcV : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnchCtrlEngRPMReq : 15|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 2154528768 Wheel_Grnd_Velocity_LS: 8 XXX
+ SG_ WhlGrndVlctyLftDrvnGroup : 6|15@0+ (1,0) [0|0] "" XXX
+ SG_ WhlGrndVlctyLftDrvn : 5|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX
+ SG_ WhlGrndVlctyLftDrvnV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ WhlGrndVlctyLftNnDrvnGroup : 22|15@0+ (1,0) [0|0] "" XXX
+ SG_ WhlGrndVlctyLftNnDrvn : 21|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX
+ SG_ WhlGrndVlctyLftNnDrvnV : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ WhlGrndVlctyRtDrvnGroup : 38|15@0+ (1,0) [0|0] "" XXX
+ SG_ WhlGrndVlctyRtDrvn : 37|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX
+ SG_ WhlGrndVlctyRtDrvnV : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WhlGrndVlctyRtNnDrvnGroup : 54|15@0+ (1,0) [0|0] "" XXX
+ SG_ WhlGrndVlctyRtNnDrvn : 53|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX
+ SG_ WhlGrndVlctyRtNnDrvnV : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150916096 Park_Heater_Info_LS: 4 XXX
+ SG_ PrkHtrAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntCircPmpAct : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkHtrCoolntTempGroup : 2|11@0+ (1,0) [0|0] "" XXX
+ SG_ PrkHtrCoolntTempV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkHtrCoolntTemp : 15|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ PrkHtrFlCsmdRlCntRsOc : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkHtrFlCnsmdRolCntGroup : 4|29@0+ (1,0) [0|0] "" XXX
+ SG_ PrkHtrFlCnsmdRolCntV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkHtrFlCnsmdRolCnt : 23|16@0+ (3.05176E-006,0) [0|0.1999970916] "liters" XXX
+ SG_ PrkHtrPrhtAch : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150367232 Immobilizer_Identifier_LS: 5 XXX
+ SG_ ImoId : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ LrnEnvId : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ LrnEnvIdSt : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ImoIdSt : 33|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150621184 Keyless_Start_Auth_LS: 1 XXX
+ SG_ KylsStrAuthRslt : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ KSARUID8 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID7 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID6 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID5 : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID4 : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID3 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID2 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ KSARUID1 : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151309312 Inflatable_Restraints_Key_Id_LS: 2 XXX
+ SG_ InflRestId : 7|16@0+ (1,0) [0|39321] "" XXX
+
+BO_ 2154061824 Window_Normalized_Indication_LS: 1 XXX
+ SG_ PsWndNtNrmIndOn : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrWndNtNrmIndOn : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLWndNtNrmIndOn : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRWndNtNrmIndOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmtWndMvmntAtv : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ WndOprAlwd : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrDrUnlckIO : 6|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154512384 Rear_Closure_Rel_Sw_Sta_LS: 1 XXX
+ SG_ RrClosRelSwActGroup : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ RrClosRelSwAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClosRelSwActV : 1|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155347968 HS_Indications_Slow_LS: 8 XXX
+ SG_ ActVbnCtrlMlfIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ PedtrnProtSysDpl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TirePrsLowIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCUnavlbleDTWthrIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilStrvtnIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ SecAxlNonEmMalfIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkFldLvlLwGroup : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ BrkFldLvlLwV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkFldLvlLw : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCSnsClnRqdIO : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCTmpUnavlbleIO : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngRecmndUpshftIO : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ServAdpCrsCtrlIndOn : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvSuspSysIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkPadWrnIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkSysMalFuncIndOn : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngEmsRelMalfIndReq : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ RrAxlMalfIO : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrShftCntrlReqDndIO : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ CompOvrhtIndOn : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsSkpShftIO : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrAxlTmpInhIO : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ SecAxlTmpInhIO : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSAlrtOnlIO : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPBSysStatIndReq : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ EPBSysWrnIndReq : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ CPSFldIO : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSOffIO : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ CPSUnblIO : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvPedtrnProtSysIO : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ PedtrnProtSysDisbld : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PedtrnProtVDA : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ AppCltchAutSrtIO : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ StBltTgtSetAvl : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ FourWhlDrvIndReq : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ EngRecDwnshftIO : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ StBltTgtCrtSetVal : 46|3@0+ (1,0) [0|7] "" XXX
+ SG_ HillDesCtrlRedVehSpIO : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehRollAngleGroup : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VehRollAngle : 54|7@0+ (0.703125,-45) [-45|44.296875] "deg" XXX
+ SG_ VehRollAngleV : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCPerfMdCsCrStVal : 58|3@0+ (1,0) [0|7] "" XXX
+ SG_ ACCPerfMdCsStAvl : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvrStPerfMdCsCrStVal : 62|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvrStPerfMdCsStAvl : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149777408 Non_Drvn_Whl_Rot_Status_LS: 8 XXX
+ SG_ WhlRotStatLftNDrvn : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ WRSLNDWhlDistPCntr : 1|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ WRSLNDWhlDistVal : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSLNDWhlRotStRst : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSLNDSeqNum : 5|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSLNDWhlDisTpRC : 7|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSLNDWhlDistTstm : 23|16@0+ (1,0) [0|65535] "counts" XXX
+ SG_ WhlRotStatRghtNDrvn : 39|32@0+ (1,0) [0|0] "" XXX
+ SG_ WRSRNDWhlDistPCntr : 33|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ WRSRNDWhlDistVal : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSRNDWhlRotStRst : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSRNDSeqNum : 37|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSRNDWhlDisTpRC : 39|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSRNDWhlDistTstm : 55|16@0+ (1,0) [0|65535] "counts" XXX
+
+BO_ 2149769216 Driven_Whl_Rotational_Stat_LS: 8 XXX
+ SG_ WhlRotatStatLftDrvn : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ WRSLDWhlDistPlsCntr : 1|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ WRSLDWhlDistVal : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSLDWhlRotStatRst : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSLDSeqNum : 5|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSLDWhlDisTpRC : 7|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSLDWhlDistTmstm : 23|16@0+ (1,0) [0|65535] "counts" XXX
+ SG_ WhlRotatStatRtDrvn : 39|32@0+ (1,0) [0|0] "" XXX
+ SG_ WRSRDWhlDistPlsCntr : 33|10@0+ (1,0) [0|1023] "counts" XXX
+ SG_ WRSRDWhlDistVal : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSRDWhlRotStatRst : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ WRSRDSeqNum : 37|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSRDWhlDisTpRC : 39|2@0+ (1,0) [0|3] "counts" XXX
+ SG_ WRSRDWhlDistTmstm : 55|16@0+ (1,0) [0|65535] "counts" XXX
+
+BO_ 2156789760 Time_of_Day_LS: 6 XXX
+ SG_ CldrYr : 7|8@0+ (1,2000) [2000|2255] "year" XXX
+ SG_ CldrMth : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ FrPedDetCsStReq : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ CldrDay : 20|5@0+ (1,0) [0|31] "days" XXX
+ SG_ SmrtHgBmAstCstSetReq : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ TmofDay : 24|17@0+ (1,0) [0|0] "" XXX
+ SG_ TOD_HrofDay : 24|5@0+ (1,0) [0|31] "hr" XXX
+ SG_ TOD_MinofHr : 35|6@0+ (1,0) [0|63] "min" XXX
+ SG_ TOD_SecofMin : 45|6@0+ (1,0) [0|63] "s" XXX
+ SG_ TimeDispFormat : 25|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155020288 Language_Selection_LS: 1 XXX
+ SG_ LngSelExt : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ChVolRq2 : 7|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2150432768 Engine_Information_4_LS: 8 XXX
+ SG_ TransOilTempSensPres : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ GenFldDutCycGroup : 1|42@0+ (1,0) [0|0] "" XXX
+ SG_ GenFldDutCycV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ GenFldDutCyc : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ FuelFltLifRstPerf : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnEmsMlfAtv : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ GrdBrkgAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsNEmsRltMalfActv : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngShtdwnPndgIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngManfldAirTempCrtdGroup : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ EngManfldAirTempCrtdV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngManfldAirTempCrtd : 15|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ FuelTotCap : 19|12@0+ (0.125,0) [0|511.875] "liters" XXX
+ SG_ TrnsThrmlMngmntStat : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ PTHiElecLdReqd : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngOilRmnLf : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ FuelFltRmnLf : 63|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2155298816 Tire_Pressure_Sensor_Prog_Req_LS: 1 XXX
+ SG_ TrPrsSnsProgEvntRqd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrPrsMntrTrLdRstRqstd : 2|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2158878720 ODIDynDataListReq_CntrStack_LS: 8 XXX
+ SG_ ODIDynDataLstRq_CntrStck : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODDLC_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLC_DataId : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLC_DspMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLC_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLC_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ ODDLC_Idx : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ODDLC_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ODDLC_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLC_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLC_ReqType : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2158870528 ODIDynDataListRequest_AuxIP_LS: 8 XXX
+ SG_ ODIDynDataLstRq_AxIP : 7|64@0+ (1,0) [0|0] "" XXX
+ SG_ ODDLA_FUCID : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLA_DataId : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLA_DspMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDLA_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLA_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ ODDLA_Idx : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ODDLA_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ODDLA_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLA_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDLA_ReqType : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154692608 Audio_Source_Status_LS: 2 XXX
+ SG_ AudSrcStat : 3|12@0+ (1,0) [0|0] "" XXX
+ SG_ ASSAudSrcType : 3|5@0+ (1,0) [0|31] "" XXX
+ SG_ ASSAudSrcStatCode : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ ASSAudSrcChType : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ LgclAVChnl : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2154627072 Audio_Master_Arbitration_Command: 2 XXX
+ SG_ AudMstrArbCom : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LgclAVChnl_368 : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ AudMstrSrcTyp : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ AudMstrChnnlTyp : 15|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2151112704 Occupant_Sensning_Status_LS: 2 XXX
+ SG_ FrntPassClass : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ FrPsSeatOccSnsOpMd : 5|3@0+ (1,0) [0|7] "N/A" XXX
+ SG_ FrPasSeatResCtrlOccStGroup : 7|14@0+ (1,0) [0|0] "" XXX
+ SG_ FrPasSeatResCtrlOccSt : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ FrPasSeatResCtrlOccStV : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrPsSeatOccFltSt : 9|2@0+ (1,0) [0|3] "N/A" XXX
+ SG_ FrPasSeatbltRemOccSt : 11|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2153938944 Remote_Reflash_Req_LS: 1 XXX
+ SG_ RmtRflshMdReqtd : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2159239168 ODI_TEL_2_OTIM_LS: 8 XXX
+ SG_ ODI_TEL2OTIM : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159230976 ODI_OTIM_2_TEL_LS: 8 XXX
+ SG_ ODI_OTIM2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159222784 ODI_PDIM_2_CenterStack_LS: 8 XXX
+ SG_ ODI_PDIM2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2159214592 ODI_CenterStack_2_PDIM_LS: 8 XXX
+ SG_ ODI_CntrStck2PDIM : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2158862336 ODIAction_OTIM_LS: 8 XXX
+ SG_ ODIActn_OTIM : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIAOT_DaTy : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIAOT_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAOT_ActnID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAOT_DspMID : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAOT_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2150662144 Environment_Id_Resp_3_LS: 3 XXX
+ SG_ EnvIdRsp3 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ EnvIdRspSt3 : 17|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2150653952 Environment_Id_Resp_2_LS: 3 XXX
+ SG_ EnvIdRsp2 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ EnvIdRspSt2 : 17|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2150850560 Seatbelt_Information_LS: 1 XXX
+ SG_ DrSbltAtcGroup : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrSbltAtc : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrSbltAtcV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsSbltAtcGroup : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ PsSbltAtc : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsSbltAtcV : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154659840 Column_Lock_Status_2: 2 XXX
+ SG_ UnlckRtryRotIndOn : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ UnlockRtryPshIndOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrgClmnLckVisNot : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmnLckStatGroup : 5|6@0+ (1,0) [0|0] "" XXX
+ SG_ ClmnLckStat : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ClmnLckStatV : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmSysFlrIndOn : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrngClmnLckTT : 9|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154938368 Fob_Programming_Mode_Status_LS: 1 XXX
+ SG_ FobProgMdStat : 1|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2155266048 Rear_Seat_Heat_Cool_Switches_LS: 1 XXX
+ SG_ RLHCSeatSw1Act : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSeatSw2Act : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSeatSw3Act : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSeatSw1Act : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSeatSw2Act : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSeatSw3Act : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155249664 Rear_Seat_Heat_Cool_Control_LS: 4 XXX
+ SG_ RLHCSModeIndCtrl : 4|5@0+ (1,0) [0|0] "" XXX
+ SG_ RLHCSMInd3 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSMInd2 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSMInd1 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSMIndReq : 4|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRHCSModeIndCtrl : 12|5@0+ (1,0) [0|0] "" XXX
+ SG_ RRHCSMInd3 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSMInd2 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSMInd1 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSMIndReq : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ RLHCSeatLevIndCtrl : 22|7@0+ (1,0) [0|0] "" XXX
+ SG_ RLHCSLSeatLev5 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSLSeatLev4 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSLSeatLev3 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSLSeatLev2 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSLSeatLev1 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLHCSLIndReq : 22|2@0+ (1,0) [0|3] "" XXX
+ SG_ RRHCSeatLevIndCtrl : 30|7@0+ (1,0) [0|0] "" XXX
+ SG_ RRHCSLSeatLev5 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSLSeatLev4 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSLSeatLev3 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSLSeatLev2 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSLSeatLev1 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRHCSLIndReq : 30|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2155184128 CruiseControl_LS: 3 XXX
+ SG_ CrsCntAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsSpdLmtrSwStat : 4|4@0+ (1,0) [0|15] "" XXX
+ SG_ TrnsShftLvrLckStat : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrStRmndrIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrStRmndrCstSetAvail : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntrlSwStat : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ CrsCntrlSwStSwDataIntgty : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ CrsCntrlSwStSpDcSwAct : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntrlSwStSpdInSwAct : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntrlSwStSetSwAct : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntrlSwStResSwAct : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntrlSwStOnSwAct : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntrlSwStCanSwAct : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SmPhRmFunCstCurStVal : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ SmPhRmFunCstStAval : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ IdlRecmndToClEngIO : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrStRmndrCstCurrSetVal : 23|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155167744 Power_Mode_Info_LS: 3 XXX
+ SG_ ShftPrkIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ShftToNtrlIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ Ky_IdDevPr : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SecPwrMdPshBtnAtv : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TransModActIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TransModInactIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ KylsStrtUseTxPckIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrStLgMdAtv : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehMovState : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ AutoShtdwnDsblIO : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ AppPrkBrkIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ NRmtDtdPsCluRstIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ ApplyBrkPdlIO : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ ApplyCltPdlIO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ NoReDetInOn : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ NRmtDtdPsBrkRstIO : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrsBtnAgnTTrnEngOffIO : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ TSLgMdPwrCtOWAtv : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ NRmtDtctdRstrtAllwd : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrsStrtAgnIO : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrsCltchPrsStrtAgnIO : 22|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154921984 Fob_Status_LS: 2 XXX
+ SG_ RFAFnc : 1|10@0+ (1,0) [0|0] "" XXX
+ SG_ RFRmtCntFobNm : 1|3@0+ (1,0) [0|7] "" XXX
+ SG_ RFRmtCntFobBatLw : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RFRmtCntrlFobFnc : 14|6@0+ (1,0) [0|63] "" XXX
+ SG_ FobPogLimRchdIndOn : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151317504 Park_Assistant_Rear_Status: 4 XXX
+ SG_ PrkAsstRrExtdDist : 3|12@0+ (0.01,0) [0|40.95] "m" XXX
+ SG_ PrkAstRrSysStat : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ PARrRgn1ObjStat : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARrRgn2ObjStat : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARrRgn3ObjStat : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ PARrRgn4ObjStat : 31|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151301120 Park_Assistant_Front_Status: 4 XXX
+ SG_ PrkAsstFrtExtdDist : 3|12@0+ (0.01,0) [0|40.95] "m" XXX
+ SG_ PrkAstFrSysStat : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ PrkAstAdvSysAct : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkAsstRrOffIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ PAFrtRgn1ObjStat : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ PAFrtRgn2ObjStat : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ PAFrtRgn3ObjStat : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ PAFrtRgn4ObjStat : 31|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2159083520 ODI_TEL_2_IPC_LS: 8 XXX
+ SG_ ODI_TEL2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2153922560 Climate_Control_Voltage_LS: 3 XXX
+ SG_ ClimCtrlVoltBstModReq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmtCtrlHtrEngRunRq : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HtrVlvRqstdPstn : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ ClntHtrElecPwrRatGroup : 4|13@0+ (1,0) [0|0] "" XXX
+ SG_ ClntHtrElecPwrRatV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntHtrElecPwrRat : 15|8@0+ (0.04,0) [0|10.2] "kW" XXX
+ SG_ ClmCtrHiVltPwrRqtd : 23|8@0+ (0.1,0) [0|25.5] "kW" XXX
+
+BO_ 2153807872 Door_Open_Switch_Status_LS: 1 XXX
+ SG_ DrDoorOpenSwActGroup : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ DrDoorOpenSwAct : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrDoorOpenSwActV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsDoorOpenSwActGroup : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ PsDoorOpenSwAct : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsDoorOpenSwActV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmSysAuxFlrIndOn : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PsvStrtStrngClmnLckTT : 6|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2150703104 Audio_Amplifier_Status: 1 XXX
+ SG_ AudSysDigSigProcPres : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ AudSysSurSndSysPres : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ AudSysVNoisCompPres : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151399424 Wash_Level_LS: 1 XXX
+ SG_ WshFldLw : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151956480 Driver_Workload_LS: 2 XXX
+ SG_ DrvWrkldLvl : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ ClstrHMIAnmSt : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ ClstrHMIRdy : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrWhlThbwhlCnts : 13|6@0- (1,0) [-32|31] "counts" XXX
+
+BO_ 2151940096 Alarm_2_Request_LS: 7 XXX
+ SG_ Alrm2ExtRngReq : 1|26@0+ (1,0) [0|0] "" XXX
+ SG_ A2ERRAlrmReq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ A2ERRAlrmTime : 15|24@0+ (1,0) [0|16777215] "min" XXX
+ SG_ EstBulkIntAirTmpGroup : 2|35@0+ (1,0) [0|0] "" XXX
+ SG_ EstBulkIntAirTmpV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ EstBulkIntAirTmp : 39|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+ SG_ EstIntRfSrfcTmpGroup : 3|44@0+ (1,0) [0|0] "" XXX
+ SG_ EstIntRfSrfcTmpV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EstIntRfSrfcTmp : 47|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+ SG_ EstIntHorzDshSrfTmpGroup : 4|53@0+ (1,0) [0|0] "" XXX
+ SG_ EstIntHorzDshSrfTmpM : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ EstIntHorzDshSrfTmp : 55|8@0+ (1,-40) [-40|215] "deg C" XXX
+
+BO_ 2151923712 Alarm_1_Request_LS: 5 XXX
+ SG_ Alrm1ExtRngReq : 1|26@0+ (1,0) [0|0] "" XXX
+ SG_ A1ERRAlrmReq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ A1ERRAlrmTime : 15|24@0+ (1,0) [0|16777215] "min" XXX
+ SG_ HLOCCstCurrSetVal : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ HLOCCstSetAvail : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCstAvail : 39|7@0+ (1,0) [0|0] "" XXX
+ SG_ HLOCCA_Res4Avail : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCA_Res3Avail : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCA_Res2Avail : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCA_Res1Avail : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCA_OnOpnOnlyAvail : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCA_OnAvail : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ HLOCCA_OffAvail : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150645760 Environment_Id_Resp_1_LS: 3 XXX
+ SG_ EnvIdRsp1 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ EnvIdRspSt1 : 17|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152464384 Lane_Departure_Warning_LS: 3 XXX
+ SG_ LaneDepWrnDisbldIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ LnKpAstDisbldIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvcLaneDepWrnSysIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvcLnKpAstSysIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ HndsOffStrWhlDtIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TnDrvLDWOffUnbIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftLnDepWrnSt : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LaneDepWrnIndCntrl : 13|6@0+ (1,0) [0|0] "" XXX
+ SG_ LDWIC_LnDepWAWLn : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDWIC_Ind2 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDWIC_Ind1 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDWIC_IndReq : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ RtLnDepWrnSt : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ LnKpAstIndCntrl : 21|6@0+ (1,0) [0|0] "" XXX
+ SG_ LKAIC_AdbWngLn : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAIC_Ind2 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAIC_Ind1 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAIC_IndReq : 21|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154971136 Front_Seat_Heat_Cool_Switches_LS: 1 XXX
+ SG_ DrvHCSeatSw1Act : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSeatSw2Act : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSeatSw3Act : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSeatSw1Act : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSeatSw2Act : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSeatSw3Act : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154962944 Front_Seat_Heat_Cool_Control_LS: 4 XXX
+ SG_ DrvHCSModeIndCtrl : 4|5@0+ (1,0) [0|0] "" XXX
+ SG_ DrvHCSMInd3 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSMInd2 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSMInd1 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSMIndReq : 4|2@0+ (1,0) [0|3] "" XXX
+ SG_ PassHCSModeIndCtrl : 12|5@0+ (1,0) [0|0] "" XXX
+ SG_ PassHCSMInd3 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSMInd2 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSMInd1 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSMIndReq : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ DrvHCSLevIndCtrl : 22|7@0+ (1,0) [0|0] "" XXX
+ SG_ DrvHCSLSeatLev5 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSLSeatLev4 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSLSeatLev3 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSLSeatLev2 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSLSeatLev1 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvHCSLIndReq : 22|2@0+ (1,0) [0|3] "" XXX
+ SG_ PassHCSeatLevIndCtrl : 30|7@0+ (1,0) [0|0] "" XXX
+ SG_ PassHCSLSeatLev5 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSLSeatLev4 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSLSeatLev3 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSLSeatLev2 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSLSeatLev1 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassHCSLIndReq : 30|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2156232704 Alarm_Clock_Status_LS: 4 XXX
+ SG_ AlrmClkStat : 7|32@0+ (1,0) [0|0] "" XXX
+ SG_ ACSAlarm3 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm2 : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm1 : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm0 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm7 : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm6 : 11|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm5 : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm4 : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm11 : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm10 : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm9 : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm8 : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm15 : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm14 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm13 : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACSAlarm12 : 31|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2154987520 Hood_Status_LS: 1 XXX
+ SG_ HdStGroup : 2|3@0+ (1,0) [0|0] "" XXX
+ SG_ HdSt : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ HdStV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ WrlsChrgSysChrgStat : 5|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2154840064 Compass_Status_LS: 4 XXX
+ SG_ CmpsOctHdingDataSrc : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsModFltPrs : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsModManCalInPrc : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsZnNvrSet : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsDecZone : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ CmpsOctHding : 14|3@0+ (1,0) [0|7] "" XXX
+ SG_ CmpsSatrtd : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsCrHding : 23|16@0+ (0.0054932,0) [0|359.996862] "deg" XXX
+
+BO_ 2154676224 Compass_Request_LS: 1 XXX
+ SG_ CmpsDecZonCmndVal : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ CmpsDecZonSetReq : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsModManCalReq : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ CmpsModSlfTstReq : 6|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154643456 Auxiliary_Heater_Status_LS: 3 XXX
+ SG_ AuxHtrAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ HtrCoreInltClntTmpCalcGroup : 4|21@0+ (1,0) [0|0] "" XXX
+ SG_ HtrCoreInltClntTmpCalcV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ HtrCoreInltClntTmpCalc : 23|8@0+ (1,-40) [-40|215] "deg C" XXX
+ SG_ CCClntCrcFlwRtReq : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2154905600 Driver_Identifier_LS: 1 XXX
+ SG_ DrId : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvSeatPrsMemID : 5|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2154954752 High_Volt_Climate_Pwr_Status_LS: 5 XXX
+ SG_ ClmtHtPwrRqd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ HtdStWhlCmd : 2|2@0+ (1,0) [0|3] "" XXX
+ SG_ HtdStWhlInd : 4|2@0+ (1,0) [0|3] "" XXX
+ SG_ HtdStWhlCtrlSrc : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntHtrElecPwrReq : 15|8@0+ (0.04,0) [0|10.2] "kW" XXX
+ SG_ EstACCompPwrRchCbnCmf : 23|8@0+ (0.04,0) [0|10.2] "kw" XXX
+ SG_ EstACCompPwrMtnCbnCmf : 31|8@0+ (0.04,0) [0|10.2] "kW" XXX
+
+BO_ 2153381888 Control_Power_Liftgate_LS: 4 XXX
+ SG_ FnshRrClsrMtnBfrDrvIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClsrObstclDtctd : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClsrInMtn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClosOpenSwActGroup : 4|3@0+ (1,0) [0|0] "" XXX
+ SG_ RrClosOpenSwAct : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClosOpenSwActV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrWprInhbRq : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ GrgPrgMdCmpl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ PwrLftgtInclAngGroup : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ PwrLftgtInclAngV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ PwrLftgtInclAng : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ VehIncAngEst : 23|8@0+ (1,0) [0|255] "deg" XXX
+ SG_ PwrLftgtMotStat : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ VltActRrAccUnavlIO : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149752832 Chassis_Information_LS: 8 XXX
+ SG_ VehHghtStatGroup : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ VehHghtStatV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehHghtStat : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ IntBrkAssPreFilReq : 1|1@0+ (1,0) [0|1] "N/A" XXX
+ SG_ BksOvht : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ HalfSysFail : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkSysRedBrkTlltlReq : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ABSAtv : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvlnCustStngAvlbl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ StrCustStngAvlbl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkBrkVDA : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ PowStVDA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrDrCntVDA : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkSysVDA : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SprTireSt : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ EPBSysAudWarnReq : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ EPBSysDspMsgReq : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvlnCustCurrStngVal : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ StrCustCurrStngVal : 29|3@0+ (1,0) [0|7] "" XXX
+ SG_ SusCustStngAvlbl : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ EBDFailed : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ SusCustCurrStngVal : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ HillDscntCntlSysStat : 37|3@0+ (1,0) [0|7] "" XXX
+ SG_ ElecPrkBrkStat : 39|2@0+ (1,0) [0|3] "" XXX
+ SG_ HlStrAssActIO : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ ColPrSysStngAvl : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ GNCustSetngAvlbl : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ GNCustCrntStngVal : 47|3@0+ (1,0) [0|7] "" XXX
+ SG_ CPSInfotmntMtReq : 49|2@0+ (1,0) [0|3] "" XXX
+ SG_ ColPrSysCrntStng : 52|3@0+ (1,0) [0|7] "" XXX
+ SG_ SndEnhcmtPerfMdRq : 55|3@0+ (1,0) [0|7] "" XXX
+ SG_ DispPerfMdCsCrStVal : 58|3@0+ (1,0) [0|7] "" XXX
+ SG_ DispPerfMdCsStAvl : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndPerfMdCsCrStVal : 62|3@0+ (1,0) [0|7] "" XXX
+ SG_ SndPerfMdCsStAvl : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151514112 Reset_OilLife_Request_LS: 1 XXX
+ SG_ EngOilLfRstRq : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2158903296 ODIDynDataMultiRequest_AuxIP_LS: 8 XXX
+ SG_ ODIDynDataMltRq_AuxIP : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODDMA_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMA_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMA_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMA_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMA_ReqType : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODDMA_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMA_DispMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMA_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMA_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMA_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMA_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMA_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2158911488 ODIDynDataMultiReq_CntrStack_LS: 8 XXX
+ SG_ ODIDynDataMltRq_CntrStck : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODDMC_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMC_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMC_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMC_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMC_ReqType : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODDMC_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMC_DispMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMC_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMC_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMC_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMC_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMC_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2158919680 ODIDynDataMultiRequest_IPC_LS: 8 XXX
+ SG_ ODIDynDataMltRq_IPC : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODDMI_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMI_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMI_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMI_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODDMI_ReqType : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODDMI_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMI_DispMID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMI_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMI_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMI_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMI_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODDMI_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2151825408 Outside_Air_Temperature_LS: 3 XXX
+ SG_ OtsAirTmpCrValGroup : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ OtsAirTmpCrValV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ OtsAirTmpCrVal : 15|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+ SG_ OtsAirTmpGroup : 1|18@0+ (1,0) [0|0] "" XXX
+ SG_ OtsAirTmpV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ OtsAirTmp : 23|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+ SG_ OtsAirTmpCrValMsk : 2|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151153664 Rear_Window_Defog_Status_LS: 1 XXX
+ SG_ RrWndDfgOn : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151170048 Trailer_Status_LS: 2 XXX
+ SG_ TrlrHtchSwAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrBrkLtFld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrFgLtFld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrRvsLtFld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrTlLtFld : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrFgLtPrs : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlrRtTrInLtFld : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrlLfTrInLtFld : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftSecTrnIndFld : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtSecTrnIndFld : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ DisRrPrmryLmps : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLftPrkLmpFld : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRPrkLmpFld : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrEndCrrStat : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151841792 Wipe_Wash_Status_LS: 1 XXX
+ SG_ TurnWprIntIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RnSnsActIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RnSnsOffIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ WSWprAct : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ HtdFrntWSSt : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154995712 Air_Conditioning_Comp_Type_LS: 1 XXX
+ SG_ HVHtrOvrTmpIndOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVHtrFldIO : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154094592 Adjustable_Pedal_Motion_Inh_LS: 8 XXX
+ SG_ AdjPdlMotInhbtd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntDimSeldAnmTypStVal : 4|4@0+ (1,0) [0|15] "" XXX
+ SG_ IntDimSeldClrTypStVal : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ IntDimAnmTypAvl : 22|15@0+ (1,0) [0|0] "" XXX
+ SG_ IDATA_AnmTyp6Avl : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp5Avl : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp4Avl : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp3Avl : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp2Avl : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp1Avl : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_OffAvl : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp14Avl : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp13Avl : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp12Avl : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp11Avl : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp10Avl : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp9Avl : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp8Avl : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDATA_AnmTyp7Avl : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntDimClrTypAvl : 38|31@0+ (1,0) [0|0] "" XXX
+ SG_ IDCTA_ClrTyp6Avl : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp5Avl : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp4Avl : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp3Avl : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp2Avl : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp1Avl : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_OffAvl : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp14Avl : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp13Avl : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp12Avl : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp11Avl : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp10Avl : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp9Avl : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp8Avl : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp7Avl : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp22Avl : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp21Avl : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp20Avl : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp19Avl : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp18Avl : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp17Avl : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp16Avl : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp15Avl : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp30Avl : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp29Avl : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp28Avl : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp27Avl : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp26Avl : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp25Avl : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp24Avl : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ IDCTA_ClrTyp23Avl : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149711872 ACC_YawRate_Information_LS: 8 XXX
+ SG_ ACCDrvrSeltdSpd : 3|12@0+ (0.0625,0) [0|255.9375] "km / h" XXX
+ SG_ AdapCrsCntVDA : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCAct370 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsCntlDrSelSpdAct : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CrsSpdLmtrDrvSelSpd : 19|12@0+ (0.0625,0) [0|255.9375] "km / h" XXX
+ SG_ ACCHdwyStg : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ FwdClnAlrtPr : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehDynYawRateGroup : 36|13@0+ (1,0) [0|0] "" XXX
+ SG_ VehDynYawRate : 35|12@0- (0.0625,0) [-128|127.9375] "deg/sec" XXX
+ SG_ VehDynYawRateV : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtrSpdWrngEnbld : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpdLmtrSpdWrngAct : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ FwdClnAlrtOffIO : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ FwdObjAlrtInd : 48|9@0+ (1,0) [0|0] "" XXX
+ SG_ FOAI_AlrtChmIhbRq : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOAI_AlrtWrnIndRq : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ FOAI_VehAhdIndRq : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ AutoMdSpdLmtStat : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACCAutoSetSpdStat : 52|2@0+ (1,0) [0|3] "" XXX
+ SG_ SetSpdLmtRchd : 54|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2153979904 BulbOutage_LS: 2 XXX
+ SG_ CHMSLFld : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ FLTrnIndLtFld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRTrnIndLtFld : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftBrkLtFld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftLwBmFld : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftPrkLtFld : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LicPltLtFld : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RLTrnIndLtFld : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ RRTrnIndLtFld : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtBrkLtFld : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtLwBmFld : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtPrkLtFld : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RFgLtFld : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ RvsLtFld : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftDytmRunLmpFld : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtDytmRunLmpFld : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150154240 Passive_Entry_Reply_LS: 8 XXX
+ SG_ PsvEntVehIdExt : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ PsvEntChlngRply : 39|32@0+ (1,0) [0|4294967295] "passwrd" XXX
+
+BO_ 2155003904 Side_Blind_Zone_Alert_Status: 2 XXX
+ SG_ SBZASysClnIndOn : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SBZASysOffIndOn : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SBZASysSrvIndOn : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SBZATmpUnvIndOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftLnChgThrt : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ LfLnChngThrtAprchSpd : 15|8@0- (1,0) [-128|127] "km/h" XXX
+
+BO_ 2150817792 Airbag_Impact_Data_5: 3 XXX
+ SG_ ImpMaxLateralDeltaVel : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ ImpMaxLongDeltaVel : 15|8@0- (1,0) [-128|127] "" XXX
+ SG_ ImpTimeToMaxDeltaVel : 23|8@0+ (10,0) [0|2550] "ms" XXX
+
+BO_ 2150227968 Phone_Speech_Rec_Status_LS: 1 XXX
+ SG_ PhnSpRcgnApSt : 1|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2162982912 VIN_Digits_10_to_17: 8 XXX
+ SG_ VehIdNmDig10_17 : 7|64@0+ (1,0) [0|1] "" XXX
+
+BO_ 2162966528 VIN_Digits_2_to_9: 8 XXX
+ SG_ VehIdNmDig2_9 : 7|64@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151497728 Tire_Pressure_Sensors_LS: 6 XXX
+ SG_ TireLFPrsGroup : 0|17@0+ (1,0) [0|0] "" XXX
+ SG_ TireLFPrsV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireLFPrs : 23|8@0+ (4,0) [0|1020] "kPaG" XXX
+ SG_ TireRFPrsGroup : 1|34@0+ (1,0) [0|0] "" XXX
+ SG_ TireRFPrsV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireRFPrs : 39|8@0+ (4,0) [0|1020] "kPaG" XXX
+ SG_ TireLFPrsStat : 4|3@0+ (1,0) [0|7] "" XXX
+ SG_ TireRFPrsStat : 7|3@0+ (1,0) [0|7] "" XXX
+ SG_ TireLRPrsGroup : 8|17@0+ (1,0) [0|0] "" XXX
+ SG_ TireLRPrsV : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireLRPrs : 31|8@0+ (4,0) [0|1020] "kPaG" XXX
+ SG_ TireRRPrsGroup : 9|34@0+ (1,0) [0|0] "" XXX
+ SG_ TireRRPrsV : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireRRPrs : 47|8@0+ (4,0) [0|1020] "kPaG" XXX
+ SG_ TireLRPrsStat : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ TireRRPrsStat : 15|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2151219200 Remote_Start_Status: 1 XXX
+ SG_ RemStrtSt : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RmVehStrRq : 1|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2153775104 DTC_Triggered: 7 XXX
+ SG_ DTCInfo : 7|56@0+ (1,0) [0|0] "" XXX
+ SG_ DTCI_DTCTriggered : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused1 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused2 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused3 : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused4 : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused5 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused6 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCIUnused7 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_DTCSource : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ DTCI_DTCNumber : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ DTCI_DTCFailType : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ DTCI_CodeSupported : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_CurrentStatus : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_TstNPsdCdClrdSt : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_TstFldCdClrdStat : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_HistStat : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_TstNPsdPwrUpSt : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_TstFldPwrUpSt : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_WrnIndRqdSt : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ DTCI_DTCFaultType : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2151235584 Vehicle_Theft_Notification_Stat: 5 XXX
+ SG_ DrIdDevLrnd : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSecSysFldIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ VTDTmprDetected : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ EhnSrvEngImmStat : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ IllDrIdDevDtctd : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlcKyIIncmIndOn : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSecStrgColLckPwdGroup : 6|31@0+ (1,0) [0|0] "" XXX
+ SG_ VehSecStrgColLckPwdV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSecStrgColLckPwd : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ VehSecAuthnSesComp : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ VhSecNImmoIndRq : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ StrgColLckCmd : 11|2@0+ (1,0) [0|3] "" XXX
+ SG_ NmofPrgKFbExtd : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ VehStatStAtv : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ EhnSrvImmbComRst : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmSysBkupFlrIndOn : 34|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150809600 Airbag_Impact_Data_4: 8 XXX
+ SG_ ImpDltVlcSamp12 : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS12_Axis1 : 7|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS12_Axis2 : 15|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp13 : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS13_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS13_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp14 : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS14_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS14_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp15 : 55|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS15_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS15_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX
+
+BO_ 2150793216 Airbag_Impact_Data_2: 8 XXX
+ SG_ ImpDltVlcSamp4 : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS4_Axis1 : 7|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS4_Axis2 : 15|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp5 : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS5_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS5_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp6 : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS6_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS6_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp7 : 55|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS7_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS7_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX
+
+BO_ 2150801408 Airbag_Impact_Data_3: 8 XXX
+ SG_ ImpDltVlcSamp8 : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS8_Axis1 : 7|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS8_Axis2 : 15|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp9 : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS9_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS9_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp10 : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS10_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS10_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp11 : 55|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS11_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS11_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX
+
+BO_ 2150785024 Airbag_Impact_Data_1: 8 XXX
+ SG_ ImpDltVlcScal : 7|8@0+ (0.00245,0.706) [0.706|1.33075] "kph/cnt" XXX
+ SG_ AirbgAccelOrien : 10|3@0+ (45,0) [0|315] "deg" XXX
+ SG_ ImpDltVlcSamp1 : 23|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS1_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS1_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp2 : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS2_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS2_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ ImpDltVlcSamp3 : 55|16@0+ (1,0) [0|0] "" XXX
+ SG_ IDVS3_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX
+ SG_ IDVS3_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX
+
+BO_ 2151202816 Rear_Window_Defog_Inhibit: 5 XXX
+ SG_ RrWndDfgInhRq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrWndDfgSwAtv : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ILSSCommErr : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPSnsrRwSolrIntFltd : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPSnsrSolrAnglFltd : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPSnsrTpCvrTempFltd : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ AuxHtrAlwd : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPSnsrRwSolrInt : 15|8@0+ (3,0) [0|765] "W/m2" XXX
+ SG_ IPSnsrSolrAzmthAngl : 23|8@0+ (2,-180) [-180|330] "deg" XXX
+ SG_ IPSnsrSolrElvtnAngl : 31|8@0+ (1,0) [0|255] "deg" XXX
+ SG_ IPSnsrTpCvrTemp : 39|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX
+
+BO_ 2150825984 Airbag_Indications: 6 XXX
+ SG_ FsnDrvStbltIC : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ FDSIC_IndPer : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ FDSIC_IndDC : 6|3@0+ (12.5,12.5) [12.5|100] "%" XXX
+ SG_ FDSIC_IO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ FsnPsngStbltIC : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ FPSIC_IndPer : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ FPSIC_IndDtCyc : 14|3@0+ (12.5,12.5) [12.5|100] "%" XXX
+ SG_ FPSIC_IO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ AirbgIC : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ AirbgICIndPer : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ AirbgICDutCyc : 22|3@0+ (12.5,12.5) [12.5|100] "%" XXX
+ SG_ AirbgICIO : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ FstnSndRwLtPsStbtInR : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ FstnSndRwCtPsStbtInR : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ FstnSndRwRtPsStbtInR : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ FsnDrStbAuxIR : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ FsnPsStbAuxIR : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ AirbgFldIO : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndRwStbltRdIndMd : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ FstnThrdRwCtPsStbtInR : 39|2@0+ (1,0) [0|3] "" XXX
+ SG_ FstnThrdRwRtPsStbtInR : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ FstnThrdRwLtPsStbtInR : 43|2@0+ (1,0) [0|3] "" XXX
+ SG_ SrvIntdPdstProtSysIO : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ PdstIntdProtSysDsbld : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ PdstIntdProtSysDplyd : 46|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151759872 Door_Lock_Command: 4 XXX
+ SG_ CntrlLckRqwExtActFun : 9|18@0+ (1,0) [0|0] "" XXX
+ SG_ CLRAF_Unl_Lk : 9|3@0+ (1,0) [0|7] "" XXX
+ SG_ CLRAF_FuelD : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_RrCls : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_Hd : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_RLD : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_RRD : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_PD : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_DD : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_ActFunc : 28|5@0+ (1,0) [0|31] "" XXX
+ SG_ CLRAF_UnandRsv3 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_UnandRsv2 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLRAF_UnandRsv1 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrClsRelRq : 10|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149974016 Content_Theft_Sensor_Status: 3 XXX
+ SG_ SrvAlrmSysIO : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntrSnsDisbld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgDrvDr : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgPsngDr : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgRrRtDr : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgRrLftDr : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrigTonn : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgTrnk : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgTltSns : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgIntMvmntSns : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrggrdBattRcnctd : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgGlsBrkSns : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgNonOffPM : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrigMidClsr : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmTrgdIO : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ AlrmStat : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ AlrmTrgHd : 21|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2151907328 Steering_Wheel_Control_Switches: 1 XXX
+ SG_ StrgWhlUnit1SwStat : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ StrgWhlUnit2SwStat : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2150219776 Voice_Recognition_Status: 1 XXX
+ SG_ PhnSpRcgnRq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ VcRecVcFdbckSt : 3|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2152685568 Radiomarks_Response: 8 XXX
+ SG_ RadBrdcstSrc : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ RadConInfReqSrc : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ RadConInfCmd : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ RadConInfID : 31|40@0+ (1,0) [0|1099511627775] "" XXX
+
+BO_ 2151874560 Vehicle_Theft_Notify_Reset_Req: 8 XXX
+ SG_ EhnSrvEngImmbCom : 0|57@0+ (1,0) [0|0] "" XXX
+ SG_ ESEIC_EngImmbRq : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESEIC_EngImRqPsw : 15|56@0+ (1,0) [0|1] "" XXX
+ SG_ RstVTDTmprDtctd : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RstIllDrIdDevDtctd : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ RstDrIdDevLrnd : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150268928 GPS_Date_and_Time_LS: 6 XXX
+ SG_ CldrYr_154 : 7|8@0+ (1,2000) [2000|2255] "year" XXX
+ SG_ CldrMth_154 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ CldrDay_154 : 20|5@0+ (1,0) [0|31] "days" XXX
+ SG_ HrsGroup : 29|6@0+ (1,0) [0|0] "" XXX
+ SG_ Hrs : 28|5@0+ (1,0) [0|31] "h" XXX
+ SG_ HrsV : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MinsGroup : 38|7@0+ (1,0) [0|0] "" XXX
+ SG_ Mins : 37|6@0+ (1,0) [0|63] "min" XXX
+ SG_ MinsV : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ SecGroup : 46|7@0+ (1,0) [0|0] "" XXX
+ SG_ Sec : 45|6@0+ (1,0) [0|63] "s" XXX
+ SG_ SecV : 46|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150137856 RFA_Status_LS: 3 XXX
+ SG_ FobPrevLrndIndOn : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ Ky_IdDevNotPrIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ FbProgCustActRqd : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ KeyInWrnIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSecAtoLrnAtv : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ Ky_IdDevPrgmAuthReq : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LMTTCPrsnOffStat : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSecAtoLrnDlyTmr : 12|5@0+ (1,0) [0|31] "min" XXX
+ SG_ FldTpMotReq : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ RemCtrlFobNumForProgER : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 2151677952 Chime_Command: 5 XXX
+ SG_ SndChrs : 3|28@0+ (1,0) [0|0] "" XXX
+ SG_ SC_SndTne : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ SC_SndCdnPrd : 15|8@0+ (10,0) [0|2550] "ms" XXX
+ SG_ SC_NmofRp : 23|8@0+ (1,0) [0|255] "reps" XXX
+ SG_ SC_SndDutCyc : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ SndLoc : 7|4@0+ (1,0) [0|0] "" XXX
+ SG_ SndLocRtRr : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndLocLftRr : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndLocPasFr : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndLocDrFr : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SndPriority : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2150776832 Airbag_Status: 6 XXX
+ SG_ ShfUlkBrToShftIndCtrl : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ShftLkdBuStbltIndCtrl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SbItlkTrnsShftLvLkRd : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ MmryRclImpctDisRq : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EvntEnbld : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SftyMuteRd : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HybVehHiVltInvDisRqd : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ HybImpSnsDsbld : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIREvntSychCntr : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ FrPsngrStOccSnsngPriDat : 39|16@0+ (1,0) [0|39321] "" XXX
+
+BO_ 2150760448 Airbag_Impact_Data: 8 XXX
+ SG_ SIRDpl : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NotPsSeatStat : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotDrvSeatStat : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotSecRowRtSeaOccStat : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotSndRwMdlSeatStat : 11|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotSndRwRtSeatStat : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotSndRwLtSeatStat : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotEventStat : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotSecRowLeSeaOccStat : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotSecRowCtSeaOccStat : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ NotiFrntPasSeatOccSta : 34|3@0+ (1,0) [0|7] "" XXX
+ SG_ NoEvDeLoSt : 46|7@0+ (1,0) [0|0] "" XXX
+ SG_ NEDLSSdCrtnArbgDpld : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEDLSRtSdArbgDld : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEDLSLtSdArbgDld : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEDLSPaFrSt2De : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEDLSPaFrSt1De : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEDLSDrFrSt2De : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEDLSDrFrSt1De : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ NoEvSevSt : 54|7@0+ (1,0) [0|0] "" XXX
+ SG_ NESSRoSevSt : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ NESSRiSiSevSt : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ NESSReImpSevSt : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ NESSLeSiSevSt : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ NESSFrImpSt2SevSt : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ NESSFrImpSt1SevSt : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ NESSFrImpPreSevSt : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ NotiEventCount : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2155872256 Fuel_Information: 6 XXX
+ SG_ FlLvlPctGroup : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ FlLvlPctV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ FlLvlPct : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ FlInjRlCtRstOcc : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ FuelFltChgNwIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DrvStyPerfMdCsCrStVal : 5|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvStyPerfMdCsStAvl : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RdWhlAngGroup : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ RdWhlAng : 22|7@0+ (0.703125,-45) [-45|44.296875] "deg" XXX
+ SG_ RdWhlAngV : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehPitchAngleGroup : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VehPitchAngle : 30|7@0+ (0.703125,-45) [-45|44.296875] "deg" XXX
+ SG_ VehPitchAngleV : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ FlInjRlCt : 39|16@0+ (3.05176E-005,0) [0|1.999970916] "liters" XXX
+
+BO_ 2156175360 Display_Measurement_System_LS: 1 XXX
+ SG_ DispMeasSysExt : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ DispMeasSys : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ NtVsnSysEnbld : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149859328 System_Power_Mode_Backup_LS: 1 XXX
+ SG_ SysBkupPwrMdEn : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SysBkUpPwrMdGroup : 3|4@0+ (1,0) [0|0] "" XXX
+ SG_ SysBkUpPwrMd : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ SysBkUpPwrMdV : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2158854144 ODIAction_IPC_LS: 8 XXX
+ SG_ ODIActn_IPC : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIAI_DaTy : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIAI_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAI_ActnID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAI_DspMID : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAI_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2158837760 ODIAction_AuxIP_LS: 8 XXX
+ SG_ ODIActn_AxIP : 5|62@0+ (1,0) [0|0] "" XXX
+ SG_ ODIAA_DaTy : 5|6@0+ (1,0) [0|63] "" XXX
+ SG_ ODIAA_FUCID : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAA_ActnID : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAA_DspMID : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODIAA_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2159091712 ODI_IPC_2_TEL_LS: 8 XXX
+ SG_ ODI_IPC2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2154561536 Vehicle_Odo_LS: 5 XXX
+ SG_ VehOdoGroup : 7|40@0+ (1,0) [0|0] "" XXX
+ SG_ VehOdo : 7|32@0+ (0.015625,0) [0|67108863.984375] "km" XXX
+ SG_ VehOdoV : 32|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149908480 Brake_Pedal_Status_LS: 2 XXX
+ SG_ BrkPedInitTrvlAchvdStat : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ BrkPedTrvlAchvdV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkPedTrvlAchvd : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkPdlModTrvlGroup : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ BrkPdlModTrvl : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkPdlModTrvlV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkPdlPos : 15|8@0+ (0.392157,0) [0|100.000035] "% full" XXX
+
+BO_ 2151268352 Column_Lock_Status: 1 XXX
+ SG_ ClmnLckTT : 1|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2150604800 Right_Rear_Door_Status: 1 XXX
+ SG_ RRDoorAjarSwAct : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150588416 Passenger_Door_Status_LS: 1 XXX
+ SG_ PDAjrSwAtv : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150596608 Left_Rear_Door_Status: 1 XXX
+ SG_ RLDoorAjarSwAct : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2155036672 Climate_Control_General_Status: 6 XXX
+ SG_ ACCompNormLdGroup : 0|9@0+ (1,0) [0|0] "" XXX
+ SG_ ACCompNormLdV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCompNormLd : 15|8@0+ (0.1,0) [0|25.5] "l/min" XXX
+ SG_ ACCmEngRunReq : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCmpsrFldOn : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCompModReq : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ClmtCtrlTrgtTemp : 17|10@0+ (0.1,-10) [-10|92.3] "deg C" XXX
+
+BO_ 2150424576 Engine_Information_3_LS: 8 XXX
+ SG_ TrnsEngdStateGroup : 2|3@0+ (1,0) [0|0] "" XXX
+ SG_ TrnsEngdState : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ TrnsEngdStateV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACRfHiSdFldPrsGroup : 3|20@0+ (1,0) [0|0] "" XXX
+ SG_ ACRfHiSdFldPrsV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACRfHiSdFldPrs : 23|8@0+ (14,0) [0|3570] "kPaG" XXX
+ SG_ ACCompCmnd : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrAxlELSDCplLwResGroup : 5|46@0+ (1,0) [0|0] "" XXX
+ SG_ RrAxlELSDCplLwResV : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrAxlELSDCplLwRes : 47|8@0+ (10,0) [0|2550] "Nm" XXX
+ SG_ EngAirIntBstPrGroup : 6|39@0+ (1,0) [0|0] "" XXX
+ SG_ EngAirIntBstPrV : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngAirIntBstPr : 39|8@0- (1,0) [-128|127] "kPaG" XXX
+ SG_ ExtHlStrAssCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsRngInhbtStat : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ DrvtShftCntrlTrgtGear : 14|4@0+ (1,0) [0|15] "" XXX
+ SG_ ACCmpNrmLdGrdAld : 31|8@0+ (0.1,0) [0|25.5] "dm3/m/s" XXX
+ SG_ EngTrqDrRqdExtRngGroup : 52|13@0+ (1,0) [0|0] "" XXX
+ SG_ EngTrqDrRqdExtRng : 51|12@0+ (0.5,-848) [-848|1199.5] "Nm" XXX
+ SG_ EngTrqDrRqdExtRngV : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ ExtHlStrAssCsCrStVal : 55|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2150416384 Engine_Information_2_LS: 8 XXX
+ SG_ EngBstPrsIndGroup : 0|33@0+ (1,0) [0|0] "" XXX
+ SG_ EngBstPrsIndV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngBstPrsInd : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ VaccBoostFailure : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GenFld : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngSpdLmtnMdAct : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ PTWrmgWtToShftIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngNEmsnsRelMalfAct : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngCstFlCutAct : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngRunAtv : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngIdlAtv : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehTopSpdLmtMdAct : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngCylDeactMd : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ TransEstGearGroup : 20|5@0+ (1,0) [0|0] "" XXX
+ SG_ TransEstGear : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ TransEstGearV : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngTrqActExtRngGroup : 21|46@0+ (1,0) [0|0] "" XXX
+ SG_ EngTrqActExtRngV : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngTrqActExtRng : 51|12@0+ (0.5,-848) [-848|1199.5] "Nm" XXX
+ SG_ EngVDA : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsVDA : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngCoolFanSpd : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ VehTopSpdLmtArbVal : 47|8@0+ (2,0) [0|510] "km / h" XXX
+ SG_ EngSpdStat : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ RmVhStrtEngRng : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnCrpMdAtv : 55|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2150408192 Engine_Information_1_LS: 8 XXX
+ SG_ TrnsSftMdStat : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ ThrPosGroup : 3|36@0+ (1,0) [0|0] "" XXX
+ SG_ ThrPosV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ThrPos : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ AccActPosGroup : 4|45@0+ (1,0) [0|0] "" XXX
+ SG_ AccActPosV : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ AccActPos : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ ElcRngSelDrvAct : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ TmpDrvrShftCtlAct : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ AccPdlOvrrdAtv : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnShftPtrnActStat : 10|3@0+ (1,0) [0|7] "" XXX
+ SG_ TransTUDMdStat : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ Eng12vStrtrMtrCmmdOn : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngRunng : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsShftLvrPosGroup : 15|48@0+ (1,0) [0|0] "" XXX
+ SG_ TrnsShftLvrPosV : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnsShftLvrPos : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ EngSpd : 23|16@0+ (0.25,0) [0|16383.75] "rpm" XXX
+ SG_ AutoTransComndGear : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CrsCntEnbld : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ CltStartSwAtvGroup : 58|2@0+ (1,0) [0|0] "" XXX
+ SG_ CltStartSwAtv : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ CltStartSwAtvV : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ TopTrvlCltchSwActGroup : 60|2@0+ (1,0) [0|0] "" XXX
+ SG_ TopTrvlCltchSwAct : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ TopTrvlCltchSwActV : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ AdptPsngrSeatStng : 63|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 2155954176 Climate_Control_Basic_Status_LS: 4 XXX
+ SG_ ACHtIdleBstLevReq : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ ClimCtrlAftBlowModActv : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ AirCndActIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmCntlExtDefActIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClntCircPmpRq : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ ClmCntFrBlwFnSp : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ AirCndCmptLdEst : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ ClmCntRrBlwFnSp : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2153971712 Driver_Door_Status: 1 XXX
+ SG_ LftglsAjrSwAct : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ LftglsRelSwAct : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DDAjrSwAtvGroup : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ DDAjrSwAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DDAjrSwAtvM : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149875712 Battery_Voltage: 7 XXX
+ SG_ BatVltGroup : 0|17@0+ (1,0) [0|0] "" XXX
+ SG_ BatVltV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ BatVlt : 23|8@0+ (0.1,3) [3|28.5] "volts" XXX
+ SG_ BatSaverIO : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvBattChrgSysIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ BatSOCGroup : 3|28@0+ (1,0) [0|0] "" XXX
+ SG_ BatSOCV : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ BatSOC : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ BattStOfChrgCrtyLow : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntlgntBattSnsFldIO : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ BattStOfChrgLowIO : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ DCCnvStblznErrIO : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ EnrgMgtLdShdRq : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ BattVltIRq : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ PwrMdOffBattSOC : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ BattCrntFltrd : 47|8@0- (0.5,0) [-64|63.5] "A" XXX
+ SG_ BatSvrMdSevLvl : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 2151186432 Auto_High_Beam_Status: 1 XXX
+ SG_ AutoBmSlctStat : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ CtLghtDet : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ AutoHgBmCtrlInOn : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2149629952 Lighting_Status_LS: 5 XXX
+ SG_ OtsdAmbtLtLvlStatGroup : 0|23@0+ (1,0) [0|0] "" XXX
+ SG_ OtsdAmbtLtLvlStatV : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ OtsdAmbtLtLvlStat : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ DRLAct : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ HazSwAtv : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkLtLeftIO : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkLtRightIO : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrnSwAct : 6|2@0+ (1,0) [0|3] "" XXX
+ SG_ FrFogLmpsAct : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkLtLeftOn : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ FrFgLtIO : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ AutoLtsInactIO : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ AutoLtsActIO : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrFgLtIO : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ HiBmIO : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkLtIO : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrkLtsAtv : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ FlToPsSwAtv : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ RevLmpAtv : 17|1@0+ (1,0) [0|1] "N/A" XXX
+ SG_ PrkngLtsAct : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ RrFogLmpsAct : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HiBmReqd : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AutoBmSlctAllwd : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ PrkLtRightOn : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ SrvlnceMdAct : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RtTrnLmpAtv : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ LftTrnLmpAtv : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ MainLghtSw : 31|2@0+ (1,0) [0|3] "N/A" XXX
+ SG_ HdlmpBmSelectStat : 33|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 2149646336 Vehicle_Speed_Information: 8 XXX
+ SG_ VehSpdAvgDrvnGroup : 7|16@0+ (1,0) [0|0] "" XXX
+ SG_ VehSpdAvgDrvn : 6|15@0+ (0.015625,0) [0|511.984375] "km / h" XXX
+ SG_ VehSpdAvgDrvnV : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ DstRolCntAvgDrnRstOc : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DistRollCntAvgDrvnGroup : 22|15@0+ (1,0) [0|0] "" XXX
+ SG_ DistRollCntAvgDrvn : 20|13@0+ (0.125,0) [0|1023.875] "m" XXX
+ SG_ DistRollCntAvgDrvnV : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSpdAvgDrvnSrc : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ VehSpdAvgNDrvnGroup : 38|17@0+ (1,0) [0|0] "" XXX
+ SG_ VehSpdAvgNDrvn : 38|15@0+ (0.015625,0) [0|511.984375] "km / h" XXX
+ SG_ VehSpdAvgNDrvnV : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ DstRolCntAvgNonDrvnGroup : 39|32@0+ (1,0) [0|0] "" XXX
+ SG_ DstRolCntAvgNonDrvnV : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ DstRolCntAvgNonDrvn : 52|13@0+ (0.125,0) [0|1023.875] "m" XXX
+ SG_ DstRolCntAvNDrRstOc : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ DistRollCntAvgDrvnSrc : 55|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2154053632 Dimming_Information_LS: 3 XXX
+ SG_ IntDimNtPnlAtv : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DispNtSchmAtv : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ CargoLmpActIO : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ IntDimLvl : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+ SG_ IntDimDspLvl : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX
+
+BO_ 2149851136 System_Power_Mode_LS: 1 XXX
+ SG_ SysPwrMdGroup : 2|3@0+ (1,0) [0|0] "" XXX
+ SG_ SysPwrMd : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ SysPwrMdV : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ KylsStrtAuthRq : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 2159124480 ODI_AuxIP_2_TEL_LS: 8 XXX
+ SG_ ODI_AxIP2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX
+
+BO_ 2151530496 TPM_Display_Commands: 6 XXX
+ SG_ TPMTrLrnMdCmplt : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrPrsMntrAtLocFld : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrPrsMntrTrLdStat : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ TireTrdTmpStat : 6|3@0+ (1,0) [0|7] "" XXX
+ SG_ TrFrntAxlPresStat : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ TrRrAxlPresStat : 11|2@0+ (1,0) [0|3] "" XXX
+ SG_ WintTrRecIndOn : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ TrPrsMntrFld : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ TireLocatnWarnEn : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVChgSyChgLvPfStRmt1 : 18|3@0+ (1,0) [0|7] "" XXX
+ SG_ StTODChrgTmpOvrdRmt1 : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ PrtyChrgRqRmt1 : 22|2@0+ (1,0) [0|3] "" XXX
+ SG_ OfBrdHVCVhCsChRqRmt1 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ HVBatTmBsDlChStRqRmt1 : 28|21@0+ (1,0) [0|0] "" XXX
+ SG_ HVBTBDCSRR1_DChHStRq : 28|5@0+ (1,0) [0|31] "hr" XXX
+ SG_ HVBTBDCSRR1_DChSlSRq : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBDCSRR1_DChDStRq : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ HVBTBDCSRR1_DChMHSRq : 45|6@0+ (1,0) [0|63] "min" XXX
+ SG_ HVBTBDCSRR1_DChSnSRq : 47|2@0+ (1,0) [0|3] "" XXX
+ SG_ HVBatTmBsChgMdRqRmt1 : 31|3@0+ (1,0) [0|7] "" XXX
+
+
+
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "ProtocolType" "GMLAN";
+BA_ "BusType" "CAN";
+
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_object.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_object.dbc
new file mode 100644
index 000000000..4643a640a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_object.dbc
@@ -0,0 +1,724 @@
+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_: K109_FCM B233B_LRR NEO VIS_FO VIS2_FO K124_ASCM Vector__XXX EOCM_F_FO EOCM2A_IMX6_FO EOCM2A_K2_FO EOCM2A_K1_FO EOCM2B_IMX6_FO EOCM2B_K2_FO EOCM2B_K1_FO
+VAL_TABLE_ RangeMode 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ TrkConf 3 "Confident" 2 "Speculative" 1 "Highly speculative" 0 "Invalid" ;
+VAL_TABLE_ TrkMeasStatus 3 "Measured current cycle" 2 "Latent track not detected" 1 "New object" 0 "No object" ;
+VAL_TABLE_ TrkDynProp 4 "Moving in opposite direction" 3 "Moving in same direction" 2 "Has moved but currently stopped" 1 "Has never moved," 0 "Unknown" ;
+VAL_TABLE_ FrntVsnInPthVehBrkNwSt 10 "Active" 5 "Inactive" ;
+VAL_TABLE_ FrntVsnClostPedBrkNwSt 10 "Active" 5 "Inactive" ;
+VAL_TABLE_ LaneSnsLLnPosValid 1 "Invalid" 0 "Valid" ;
+VAL_TABLE_ LnSnsRLnPosValid 1 "Invalid" 0 "Valid" ;
+VAL_TABLE_ ObjectType 7 "no object present" 6 "fixed roadside object" 5 "fixed overhead object" 4 "pedestrian" 3 "motocycle / bicycle" 2 "Large vehicle (semi)" 1 "4 Wheel Vehicle (car, small trk)" 0 "Unknown" ;
+VAL_TABLE_ FwVsnCinCoutPotT9Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT8Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT7Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT6Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT5Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT4Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT3Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT2Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT1Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT12Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT11Rev 2 "Right" 1 "Left" 0 "None" ;
+VAL_TABLE_ FwVsnCinCoutPotT10Rev 2 "Right" 1 "Left" 0 "None" ;
+
+
+BO_ 3221225472 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX
+ SG_ Always12 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TimeStatusChecksum : 0|12@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 161 ASCMTimeStatus: 7 NEO
+ SG_ TimeStatus : 7|28@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ RollingCounter : 27|2@0+ (1,0) [0|0] "" B233B_LRR
+
+BO_ 774 ASCMSteeringStatus: 8 NEO
+ SG_ ASCMSterringStatusChecksum : 55|16@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ AlwaysF0 : 15|8@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ Always20 : 23|8@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" B233B_LRR
+
+BO_ 784 ASCMHeadlight: 2 NEO
+ SG_ Always42 : 7|8@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ Always4 : 15|8@0+ (1,0) [0|0] "" B233B_LRR
+
+BO_ 776 ASCMAccSpeedStatus: 7 NEO
+ SG_ AccSpeedChecksum : 42|11@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ RollingCounter : 46|2@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ NearRangeMode : 43|1@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ FarRangeMode : 44|1@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ VehicleAcceleration : 19|12@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ VehicleSpeed : 15|12@0+ (1,0) [0|0] "" B233B_LRR
+ SG_ AlwaysOne : 3|1@0+ (1,0) [0|0] "" B233B_LRR
+
+BO_ 1120 F_LRR_Obj_Header: 8 LRR_FO
+ SG_ FLRRRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FLRRModeCmdFdbk : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRNumValidTargets : 20|5@0+ (1,0) [0|31] "" EOCM_F_FO
+ SG_ FLRRTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRTimeStamp : 2|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ FLRRRoadTypeInfo : 5|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FLRRBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+ SG_ FLRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRLonVelPlsblityFlt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRYawRtPlsblityFlt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRTunlDtctd : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FLRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1134 LRRObject14: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1132 LRRObject12: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1131 LRRObject11: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1130 LRRObject10: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1129 LRRObject09: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1128 LRRObject08: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1127 LRRObject07: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1126 LRRObject06: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1125 LRRObject05: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1124 LRRObject04: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1123 LRRObject03: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1140 LRRObject20: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1139 LRRObject19: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1138 LRRObject18: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1137 LRRObject17: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1136 LRRObject16: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1135 LRRObject15: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1133 LRRObject13: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1122 LRRObject02: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+BO_ 1121 LRRObject01: 8 B233B_LRR
+ SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO
+ SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO
+ SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO
+ SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO
+ SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO
+ SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO
+
+ BO_ 1094 F_Vision_Obj_Track_12: 8 VIS2_FO
+ SG_ FwdVsnObjTypTr12Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk12Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk12Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FVisionWidthTrk12 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FVisionMeasStatTrk12 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk12 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisionRelLaneTrk12 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk12 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO
+ SG_ FVisionConfTrk12 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ ObjDirTrk12 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk12 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk12 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1093 F_Vision_Obj_Track_11: 8 VIS2_FO
+ SG_ FwdVsnObjTypTr11Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk11Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk11Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FVisionWidthTrk11 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FVisionMeasStatTrk11 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk11 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisionRelLaneTrk11 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk11 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO
+ SG_ FVisionConfTrk11 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ ObjDirTrk11 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk11 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk11 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+
+BO_ 1100 F_Vision_Obj_Track_12_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT12Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk12 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk12 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk12 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk12 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr12 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk12 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo12 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1099 F_Vision_Obj_Track_11_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT11Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk11 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk11 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk11 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk11 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr11 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk11 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo11 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1098 F_Vision_Obj_Track_10_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT10Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk10 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk10 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk10 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk10 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr10 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk10 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo10 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1097 F_Vision_Obj_Track_9_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT9Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk9 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk9 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk9 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk9 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr9 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk9 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo9 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1096 F_Vision_Obj_Track_8_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT8Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk8 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk8 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk8 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk8 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr8 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk8 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo8 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1095 F_Vision_Obj_Track_7_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT7Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk7 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk7 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk7 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk7 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr7 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk7 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo7 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1068 F_Vision_Obj_Track_6_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT6Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk6 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk6 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk6 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk6 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr6 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk6 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo6 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1067 F_Vision_Obj_Track_5_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT5Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk5 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk5 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk5 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk5 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr5 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk5 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo5 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1066 F_Vision_Obj_Track_4_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT4Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk4 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk4 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk4 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk4 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr4 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk4 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo4 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1065 F_Vision_Obj_Track_3_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT3Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk3 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk3 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk3 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk3 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr3 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk3 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo3 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1064 F_Vision_Obj_Track_2_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT2Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk2 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk2 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk2 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk2 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr2 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk2 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo2 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1063 F_Vision_Obj_Track_1_B: 8 VIS2_FO
+ SG_ FwVsnCinCoutPotT1Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnObjSclChgTrk1 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO
+ SG_ FwdVsnObjAgeTrk1 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO
+ SG_ FwdVsnLongVlctyTrk1 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO
+ SG_ FwdVsnLatOfstTrk1 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO
+ SG_ FwdVsnBrkLtStatTrk1 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FwdVsnTrnSigStatTr1 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FrtVsnBrstIDAddInfo1 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1088 F_Vision_Obj_Header_2: 8 VIS2_FO
+ SG_ FrntVsnInPthVehBrkNwSt : 35|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FrntVsnClostPedBrkNwSt : 39|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FrntVsnClostPedObjID : 29|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FrntVsnClostPedAlrtNwFlg : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrntVsnClostPedNotftnFlg : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrntVsnInPthVehAlrtNwFlg : 2|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnVldTgtNum2 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FrtVsnTmStmp2V : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnTmStmp2 : 10|11@0+ (1,0) [0|2047] "" EOCM_F_FO
+ SG_ FrtVsnRollCnt2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FrtVsnBrstChksum2 : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+
+BO_ 854 F_Vision_Environment_7: 3 VIS2_FO
+ SG_ FwdVsnCnstrctAreaDst : 13|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnCnstrctZnDet : 15|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnEgoVehLnPos : 17|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnRdTypDet : 9|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnTunnlDetd : 23|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ FwdVsnTunnlDst : 21|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBrstID5 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 853 F_Vision_Environment_6: 8 VIS2_FO
+ SG_ LnMrkg4LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvtGrad : 47|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnSnsLnCrvt : 31|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBrstID4 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 852 F_Vision_Environment_5: 8 VIS2_FO
+ SG_ LnMrkg3LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvtGrad : 47|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnSnsLnCrvt : 31|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBrstID3 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 309 LHT_CameraObjConfirmation_FO: 1 VIS_FO
+ SG_ HiBmRecmnd : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ CtLghtDet : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 848 F_Vision_Environment: 8 VIS_FO
+ SG_ FwdVsnEnvIllum : 37|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnRtV : 1|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnRt : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnChngStatus : 39|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseSystemOK : 4|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSnsLLnPosValid : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSenseDistToLLnEdge : 14|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsRLnPosValid : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsDistToRLnEdge : 22|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseTimeStampV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseTimeStamp : 34|11@0+ (1,0) [0|2047] "ms" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LaneSenseSystemOKV : 3|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 849 F_Vision_Environment_2: 8 VIS_FO
+ SG_ LnSnsLatVRelToRgtMrkg : 23|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO
+ SG_ LnSnsRtLnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntRtV : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnMrkgWdthRt : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsRtAnchrLn : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtAnchrLn : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrRghtV : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrRght : 47|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntRt : 31|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstID : 2|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLatVRelToLftMrkg : 15|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+BO_ 1056 F_Vision_Obj_Header: 6 VIS_FO
+ SG_ FVsnSnsrBlckd : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ ClstInPathVehObjID : 30|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FrtVsnFld : 6|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnIniDiagSuccCmpt : 5|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnSrvAlgnInPrcs : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FrtVsnUnvlbl : 7|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVISModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO
+ SG_ FVisionNumValidTrgts : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FVisionTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO
+ SG_ VISBurstChecksum : 39|16@0+ (1,0) [0|65535] "" EOCM_F_FO
+
+BO_ 1057 F_Vision_Obj_Track_1: 8 VIS_FO
+ SG_ FwdVsnRngTrk1Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk1Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr1Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk1 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisBurstIDTrk1 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk1 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk1 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk1 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk1 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ ObjDirTrk1 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1058 F_Vision_Obj_Track_2: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk2 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk2Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk2Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ ObjDirTrk2 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FwdVsnObjTypTr2Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk2 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk2 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk2 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk2 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1059 F_Vision_Obj_Track_3: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk3 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk3Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk3Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr3Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk3 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk3 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk3 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk3 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk3 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk3 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1060 F_Vision_Obj_Track_4: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk4 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FVisionMeasStatTrk4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk4 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FwdVsnRngTrk4Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk4Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr4Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk4 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk4 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ ObjDirTrk4 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionConfTrk4 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk4 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+
+BO_ 1061 F_Vision_Obj_Track_5: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk5 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk5Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk5Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr5Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk5 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk5 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk5 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk5 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk5 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk5 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1062 F_Vision_Obj_Track_6: 8 VIS_FO
+ SG_ FwdVsnVertPosTrk6 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk6Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk6Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr6Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk6 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk6 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk6 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk6 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk6 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk6 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1089 F_Vision_Obj_Track_7: 8 VIS2_FO
+ SG_ FVisBurstIDTrk7 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk7 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk7 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk7 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk7 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+ SG_ FwdVsnRngTrk7Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnObjTypTr7Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk7Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk7 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ ObjDirTrk7 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+
+BO_ 1090 F_Vision_Obj_Track_8: 8 VIS2_FO
+ SG_ FVisBurstIDTrk8 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk8 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk8Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk8 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk8Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnObjTypTr8Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk8 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisionConfTrk8 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk8 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk8 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1091 F_Vision_Obj_Track_9: 8 VIS2_FO
+ SG_ FwdVsnVertPosTrk9 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ FwdVsnRngTrk9Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk9Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr9Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ ObjDirTrk9 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk9 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk9 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk9 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk9 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk9 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 1092 F_Vision_Obj_Track_10: 8 VIS2_FO
+ SG_ FwdVsnRngTrk10Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO
+ SG_ FwdVsnAzmthTrk10Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO
+ SG_ FwdVsnObjTypTr10Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO
+ SG_ FwdVsnVertPosTrk10 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO
+ SG_ ObjDirTrk10 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO
+ SG_ FVisBurstIDTrk10 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionObjectIDTrk10 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO
+ SG_ FVisionConfTrk10 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionAzRateTrk10 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO
+ SG_ FVisionRelLaneTrk10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionMeasStatTrk10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO
+ SG_ FVisionWidthTrk10 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO
+
+BO_ 851 F_Vision_Environment_4: 8 VIS_FO
+ SG_ LnMrkg3LnPrvwDst : 45|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTtlNmLnMrkgDetRt : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsRtLinCrsTm : 25|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsNumPrlLnsDetRt : 33|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsNumPrlLnsDetLt : 36|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntLftV : 31|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtLinCrsTm : 30|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnPrvwDst : 50|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMrkgTypChgDst : 40|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMrkgWdth : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4LnMarkrElvtd : 51|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg4AnchrLnLin : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMrkgWdth : 41|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3LnMarkrElvtd : 46|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkg3AnchrLnLin : 52|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstID2 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsCrvtGrdntLft : 15|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+ BO_ 850 F_Vision_Environment_3: 8 VIS_FO
+ SG_ LnSnsTtlNmLnMrkgDetLt : 58|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtLnMrkgWdth : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLtLnMrkgTypChgDst : 62|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnLftV : 23|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsTngtOfHdngLnLft : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrLftV : 15|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsLnCrvtrLft : 39|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrTypRght : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrTypLft : 53|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrElvtdRght : 54|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnMrkrElvtdLft : 55|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnSnsBurstID1 : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnQltyCnfdncLvlRght : 22|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnQltyCnfdncLvlLft : 14|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnPrvwDstncRght : 2|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+ SG_ LnPrvwDstncLft : 5|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO
+
+
+BO_TX_BU_ 161 : K124_ASCM,NEO;
+BO_TX_BU_ 774 : K124_ASCM,NEO;
+BO_TX_BU_ 784 : K124_ASCM,NEO;
+BO_TX_BU_ 776 : K124_ASCM,NEO;
+
+
+CM_ BU_ K109_FCM "Frontview Camera Module";
+CM_ BU_ B233B_LRR "Radar Sensor Module Long Range";
+CM_ BU_ NEO "Comma NEO";
+CM_ BU_ VIS_FO "Front Camera Data";
+CM_ BU_ VIS2_FO "Front Camera Data2";
+CM_ BU_ K124_ASCM "Active Safety Control Module";
+CM_ BO_ 3221225472 "This is a message for not used signals, created by Vector CANdb++ DBC OLE DB Provider.";
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+BA_ "UseGMParameterIDs" 0;
+VAL_ 776 NearRangeMode 1 "Active" 0 "Inactive";
+VAL_ 776 FarRangeMode 1 "Active" 0 "Inactive";
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_powertrain_expansion.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_powertrain_expansion.dbc
new file mode 100644
index 000000000..b18ac6974
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_powertrain_expansion.dbc
@@ -0,0 +1,56 @@
+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_: K1_APM
+BO_ 470 APM_Stats: 7 K1_APM
+ SG_ APM_Low_Voltage_Sensed : 16|8@1+ (0.0787402,0) [0|0] "V" Vector__XXX
+ SG_ APM_Temperature_1 : 24|8@1+ (1,-40) [0|0] "C" Vector__XXX
+ SG_ APM_Temperature_2 : 32|8@1+ (1,-40) [0|0] "C" Vector__XXX
+ SG_ APM_Low_Voltage_Current_Output : 40|8@1- (1,0) [0|0] "A" Vector__XXX
+ SG_ APM_Status : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ APM_High_Voltage_Input_Current : 8|8@1- (0.15,-7) [0|0] "A" Vector__XXX
+ SG_ APM_Counter : 48|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 468 APM_Command: 2 K1_APM
+ SG_ APM_Status : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ APM_Voltage_Requested : 8|8@1+ (0.0787402,0) [0|0] "V" Vector__XXX
+
+BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ;
+BA_DEF_ BO_ "GenMsgForegroundColor" STRING ;
+BA_DEF_ BO_ "isj1939dbc" INT 0 0;
+BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff";
+BA_DEF_DEF_ "GenMsgForegroundColor" "#000000";
+BA_DEF_DEF_ "isj1939dbc" 0;
+CM_ BU_ K1_APM "14V Power Module";
+VAL_ 468 APM_Status 0 "Off" 160 "On";
diff --git a/iqdbc_repo/iqdbc/dbc/gm_global_a_powertrain_generated.dbc b/iqdbc_repo/iqdbc/dbc/gm_global_a_powertrain_generated.dbc
new file mode 100644
index 000000000..de0550134
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gm_global_a_powertrain_generated.dbc
@@ -0,0 +1,373 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 NEO
+ SG_ GAS_COMMAND : 7|16@0+ (0.125677,-75.909) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.251976,-76.601) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (0.125677,-75.909) [0|1] "" NEO
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.251976,-76.601) [0|1] "" NEO
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" NEO
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" NEO
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" NEO
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+CM_ "gm_global_a_powertrain.dbc starts here";
+
+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_: K16_BECM K73_TCIC K9_BCM K43_PSCM K17_EBCM K20_ECM K114B_HPCM NEO K124_ASCM EPB
+VAL_TABLE_ TurnSignals 2 "Right Turn" 1 "Left Turn" 0 "None" ;
+VAL_TABLE_ Intellibeam 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HighBeamsActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HighBeamsTemporary 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCLeadCar 1 "Present" 0 "Not Present" ;
+VAL_TABLE_ ACCCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ BrakePedalPressed 1 "Pressed" 0 "Depressed" ;
+VAL_TABLE_ DistanceButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ LKAButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_TABLE_ DriveModeButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ;
+VAL_TABLE_ ESPButton 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ DoorStatus 1 "Opened" 0 "Closed" ;
+VAL_TABLE_ SeatBeltStatus 1 "Latched" 0 "Unlatched" ;
+VAL_TABLE_ LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ;
+VAL_TABLE_ GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ;
+VAL_TABLE_ GasRegenCmdActive 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ;
+VAL_TABLE_ HandsOffSWDetectionStatus 1 "Hands On" 0 "Hands Off" ;
+VAL_TABLE_ HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ;
+
+
+BO_ 189 EBCMRegenPaddle: 7 K17_EBCM
+ SG_ RegenPaddle : 7|4@0+ (1,0) [0|0] "" NEO
+
+BO_ 190 ECMAcceleratorPos: 6 K20_ECM
+ SG_ BrakePedalPos : 15|8@0+ (1,0) [0|0] "sticky" NEO
+ SG_ GasPedalAndAcc : 23|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 201 ECMEngineStatus: 8 K20_ECM
+ SG_ EngineTPS : 39|8@0+ (0.392156863,0) [0|100.000000065] "%" NEO
+ SG_ EngineRPM : 15|16@0+ (0.25,0) [0|0] "RPM" NEO
+ SG_ CruiseMainOn : 29|1@0+ (1,0) [0|1] "" NEO
+ SG_ BrakePressed : 40|1@0+ (1,0) [0|1] "" NEO
+ SG_ Standstill : 2|1@0+ (1,0) [0|1] "" NEO
+ SG_ CruiseActive : 31|2@0+ (1,0) [0|3] "" NEO
+
+BO_ 209 EBCMBrakePedalSensors: 7 K17_EBCM
+ SG_ Counter1 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ Counter2 : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ BrakePedalPosition1 : 5|14@0+ (1,0) [0|16383] "" XXX
+ SG_ BrakePedalPosition2 : 21|14@0- (-1,0) [0|16383] "" XXX
+ SG_ BrakeNormalized1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BrakeNormalized2 : 47|8@0- (-1,0) [0|255] "" XXX
+
+BO_ 241 EBCMBrakePedalPosition: 6 K17_EBCM
+ SG_ BrakePressed : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrakePedalPosition : 15|8@0+ (1,0) [0|255] "" NEO
+
+BO_ 298 BCMDoorBeltStatus: 8 K9_BCM
+ SG_ RearLeftDoor : 8|1@0+ (1,0) [0|0] "" NEO
+ SG_ FrontLeftDoor : 9|1@0+ (1,0) [0|0] "" NEO
+ SG_ FrontRightDoor : 10|1@0+ (1,0) [0|0] "" NEO
+ SG_ RearRightDoor : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ LeftSeatBelt : 12|1@0+ (1,0) [0|0] "" NEO
+ SG_ RightSeatBelt : 53|1@0+ (1,0) [0|0] "" NEO
+
+BO_ 309 ECMPRDNL: 8 K20_ECM
+ SG_ PRNDL : 2|3@0+ (1,0) [0|0] "" NEO
+ SG_ ESPButton : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 320 BCMTurnSignals: 3 K9_BCM
+ SG_ TurnSignals : 19|2@0+ (1,0) [0|0] "" NEO
+ SG_ Intellibeam : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ HighBeamsActive : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ HighBeamsTemporary : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 322 BCMBlindSpotMonitor: 7 K9_BCM
+ SG_ LeftBSM : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ RightBSM : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 328 PSCM_148: 1 K43_PSCM
+
+BO_ 381 ESPStatus: 6 K20_ECM
+ SG_ TractionControlOn : 5|1@0+ (1,0) [0|0] "" NEO
+ SG_ MSG17D_AccPower : 35|12@0- (1,0) [0|0] "" NEO
+
+BO_ 384 ASCMLKASteeringCmd: 4 NEO
+ SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdChecksum : 19|12@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmdActive : 3|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKASteeringCmd : 2|11@0- (1,0) [0|0] "" NEO
+
+BO_ 388 PSCMStatus: 8 K43_PSCM
+ SG_ HandsOffSWDetectionMode : 20|2@0+ (1,0) [0|3] "" NEO
+ SG_ HandsOffSWlDetectionStatus : 21|1@0+ (1,0) [0|1] "" NEO
+ SG_ LKATorqueDeliveredStatus : 5|3@0+ (1,0) [0|7] "" NEO
+ SG_ LKADriverAppldTrq : 50|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO
+ SG_ LKATorqueDelivered : 18|11@0- (0.01,0) [0|1] "" NEO
+ SG_ LKATotalTorqueDelivered : 2|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO
+ SG_ RollingCounter : 38|4@0+ (1,0) [0|15] "" XXX
+ SG_ PSCMStatusChecksum : 33|10@0+ (1,0) [0|1023] "" XXX
+
+BO_ 417 AcceleratorPedal: 7 XXX
+ SG_ AcceleratorPedal : 55|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 451 GasAndAcc: 8 XXX
+ SG_ GasPedalAndAcc2 : 55|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 452 AcceleratorPedal2: 8 XXX
+ SG_ CruiseState : 15|3@0+ (1,0) [0|7] "" NEO
+ SG_ AcceleratorPedal2 : 47|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 481 ASCMSteeringButton: 7 K124_ASCM
+ SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO
+ SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ ACCAlwaysOne : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO
+ SG_ DriveModeButton : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ RollingCounter : 33|2@0+ (1,0) [0|3] "" NEO
+ SG_ SteeringButtonChecksum : 43|12@0+ (1,0) [0|255] "" NEO
+
+BO_ 485 PSCMSteeringAngle: 8 K43_PSCM
+ SG_ SteeringWheelAngle : 15|16@0- (0.0625,0) [-2047|2047] "deg" NEO
+ SG_ SteeringWheelRate : 27|12@0- (1,0) [-2047|2047] "deg/s" NEO
+
+BO_ 489 EBCMVehicleDynamic: 8 K17_EBCM
+ SG_ BrakePedalPressed : 6|1@0+ (1,0) [0|0] "" NEO
+ SG_ LateralAcceleration : 3|10@0- (0.161,0) [-2047|2047] "m/s2" NEO
+ SG_ YawRate : 35|12@0- (0.625,0) [0|1] "" NEO
+ SG_ YawRate2 : 51|12@0- (0.0625,0) [-2047|2047] "grad/s" NEO
+
+BO_ 352 BCMImmobilizer: 5 K9_BCM
+ SG_ ImmobilizerInfo : 7|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 497 BCMGeneralPlatformStatus: 8 K9_BCM
+ SG_ SystemPowerMode : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ SystemBackUpPowerMode : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ ParkBrakeSwActive : 36|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 500 SportMode: 6 XXX
+ SG_ SnowIceMode : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SportMode : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 501 ECMPRDNL2: 8 K20_ECM
+ SG_ TransmissionState : 48|4@1+ (1,0) [0|7] "" NEO
+ SG_ PRNDL2 : 27|4@0+ (1,0) [0|255] "" NEO
+ SG_ ManualMode : 41|1@0+ (1,0) [0|1] "" NEO
+
+BO_ 532 BRAKE_RELATED: 6 XXX
+ SG_ UserBrakePressure : 0|9@0+ (1,0) [0|511] "" XXX
+
+BO_ 560 EPBStatus: 8 EPB
+ SG_ EPBClosed : 12|1@0+ (1,0) [0|1] "" NEO
+
+BO_ 562 EBCMFrictionBrakeStatus: 8 K17_EBCM
+ SG_ FrictionBrakeUnavailable : 46|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 608 SPEED_RELATED: 8 XXX
+ SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ ClusterSpeed : 31|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM
+ SG_ HVBatteryVoltage : 31|12@0+ (0.125,0) [0|511.875] "V" NEO
+ SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO
+
+BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM
+ SG_ GasRegenAccType : 15|2@0+ (1,0) [0|3] "" NEO
+ SG_ GasRegenChecksum : 32|25@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO
+ SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO
+ SG_ GasRegenCmd : 10|19@0+ (0.125,-22534) [-22534|43001.875] "Nm" NEO
+
+BO_ 717 ASCM_2CD: 5 K124_ASCM
+
+BO_ 761 BRAKE_RELATED_2: 7 XXX
+ SG_ UserBrakePressure2 : 47|9@0+ (1,0) [0|511] "" XXX
+
+BO_ 789 EBCMFrictionBrakeCmd: 5 K124_ASCM
+ SG_ RollingCounter : 33|2@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO
+ SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO
+
+BO_ 800 AEBCmd: 6 K124_ASCM
+ SG_ RollingCounter : 5|2@0+ (1,0) [0|3] "" NEO
+ SG_ AEBChecksum : 27|20@0+ (1,0) [0|0] "" NEO
+ SG_ AEBCmdActive : 3|1@1+ (1,0) [0|1] "" NEO
+ SG_ AEBCmd : 2|11@0+ (1,0) [0|0] "" NEO
+ SG_ AEBCmd2 : 23|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 810 TCICOnStarGPSPosition: 8 K73_TCIC
+ SG_ GPSLongitude : 39|32@0+ (1,-2147483648) [0|0] "milliarcsecond" NEO
+ SG_ GPSLatitude : 7|32@0+ (1,0) [0|0] "milliarcsecond" NEO
+
+BO_ 840 EBCMWheelSpdFront: 5 K17_EBCM
+ SG_ FLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ FRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO
+
+BO_ 842 EBCMWheelSpdRear: 5 K17_EBCM
+ SG_ RLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ RRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO
+ SG_ RRWheelDir : 34|3@0+ (1,0) [0|7] "" NEO
+ SG_ RLWheelDir : 37|3@0+ (1,0) [0|7] "" NEO
+
+BO_ 869 ASCM_365: 4 K124_ASCM
+
+BO_ 880 ASCMActiveCruiseControlStatus: 6 K124_ASCM
+ SG_ ACCCruiseState : 8|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACCLeadCar : 44|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCAlwaysOne2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCAlwaysOne : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCSpeedSetpoint : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" NEO
+ SG_ ACCGapLevel : 21|2@0+ (1,0) [0|0] "" NEO
+ SG_ ACCResumeButton : 1|1@0+ (1,0) [0|0] "" NEO
+ SG_ ACCCmdActive : 23|1@0+ (1,0) [0|0] "" NEO
+ SG_ FCWAlert : 41|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 967 EVDriveMode: 4 XXX
+ SG_ SinglePedalModeActive : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ SinglePedalModeRisingEdge : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SinglePedalModeFallingEdge : 22|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 977 ECMCruiseControl: 8 K20_ECM
+ SG_ CruiseActive : 39|1@0+ (1,0) [0|3] "" NEO
+ SG_ CruiseSetSpeed : 19|12@0+ (0.0625,0) [0|0] "km/h" NEO
+
+BO_ 1001 ECMVehicleSpeed: 8 K20_ECM
+ SG_ VehicleSpeed : 7|16@0+ (0.01,0) [0|0] "mph" NEO
+ SG_ VehicleSpeedLeft : 39|16@0+ (0.01,0) [0|0] "mph" NEO
+
+BO_ 1033 ASCMKeepAlive: 7 NEO
+ SG_ ASCMKeepAliveAllZero : 7|56@0+ (1,0) [0|0] "" NEO
+
+BO_ 1034 ASCM_40A: 7 K124_ASCM
+
+BO_ 1217 ECMEngineCoolantTemp: 8 K20_ECM
+ SG_ EngineCoolantTemp : 23|8@0+ (1,-40) [0|0] "C" NEO
+
+BO_ 1249 VIN_Part2: 8 K20_ECM
+ SG_ VINPart2 : 7|64@0+ (1,0) [0|0] "" NEO
+
+BO_ 1296 ASCM_510: 4 K124_ASCM
+
+BO_ 1300 VIN_Part1: 8 K20_ECM
+ SG_ VINPart1 : 7|64@0+ (1,0) [0|0] "" NEO
+
+BO_ 1912 PSCM_778: 8 K43_PSCM
+
+BO_ 1930 ASCM_78A: 7 K124_ASCM
+
+BO_TX_BU_ 384 : K124_ASCM,NEO;
+BO_TX_BU_ 880 : NEO,K124_ASCM;
+BO_TX_BU_ 1033 : K124_ASCM,NEO;
+BO_TX_BU_ 715 : NEO,K124_ASCM;
+BO_TX_BU_ 789 : NEO,K124_ASCM;
+BO_TX_BU_ 800 : NEO,K124_ASCM;
+
+
+CM_ BU_ K16_BECM "Battery Energy Control Module";
+CM_ BU_ K73_TCIC "Telematics Communication Control Module";
+CM_ BU_ K9_BCM "Body Control Module";
+CM_ BU_ K43_PSCM "Power Steering Control Module";
+CM_ BU_ K17_EBCM "Electronic Brake Control Module";
+CM_ BU_ K20_ECM "Engine Control Module";
+CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module";
+CM_ BU_ NEO "Comma NEO";
+CM_ BU_ K124_ASCM "Active Safety Control Module";
+CM_ SG_ 381 MSG17D_AccPower "Need to investigate";
+CM_ BO_ 190 "Length varies from 6 to 8 bytes by car";
+CM_ SG_ 190 GasPedalAndAcc "ACC baseline is 62";
+CM_ SG_ 322 LeftBSM "For some cars, this can only be when the blinker is also active";
+CM_ SG_ 322 RightBSM "For some cars, this can only be when the blinker is also active";
+CM_ SG_ 352 ImmobilizerInfo "Non-zero when ignition or accessory mode";
+CM_ SG_ 451 GasPedalAndAcc2 "ACC baseline is 62";
+CM_ SG_ 481 ACCAlwaysOne "Usually 1 if the car is equipped with ACC";
+CM_ SG_ 562 FrictionBrakeUnavailable "1 when ACC brake control is unavailable. Stays high if brake command messages are blocked for a period of time";
+CM_ SG_ 497 SystemPowerMode "Describes ignition";
+CM_ SG_ 497 SystemBackUpPowerMode "Describes ignition + preconditioning mode, noisy";
+CM_ SG_ 501 PRNDL2 "When ManualMode is Active, Value is 13=L1 12=L2 11=L3 ... 5=Full 70kW Paddle Regen Unlocked for Gen2 Bolts 4=L10";
+CM_ SG_ 532 UserBrakePressure "can be lower than other brake position signals when the brakes are pre-filled from ACC braking and the user presses on the brakes. user-only pressure?";
+CM_ SG_ 608 ClusterSpeed "Cluster speed signal seems to match dash on newer cars, but is a lower rate and can be noisier.";
+CM_ SG_ 761 UserBrakePressure2 "Similar to BRAKE_RELATED->UserBrakePressure";
+CM_ SG_ 1001 VehicleSpeed "Spinouts show here on 2wd. Speed derived from right front wheel (drive tire)";
+BA_DEF_ "UseGMParameterIDs" INT 0 0;
+BA_DEF_ "ProtocolType" STRING ;
+BA_DEF_ "BusType" STRING ;
+BA_DEF_DEF_ "UseGMParameterIDs" 1;
+BA_DEF_DEF_ "ProtocolType" "GMLAN";
+BA_DEF_DEF_ "BusType" "";
+BA_ "BusType" "CAN";
+BA_ "ProtocolType" "GMLAN";
+BA_ "UseGMParameterIDs" 0;
+VAL_ 497 SystemPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off";
+VAL_ 497 SystemBackUpPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off";
+VAL_ 481 DistanceButton 1 "Active" 0 "Inactive" ;
+VAL_ 481 LKAButton 1 "Active" 0 "Inactive" ;
+VAL_ 481 ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ;
+VAL_ 481 DriveModeButton 1 "Active" 0 "Inactive" ;
+VAL_ 452 CruiseState 4 "Standstill" 3 "Faulted" 1 "Active" 0 "Off" ;
+VAL_ 309 PRNDL 3 "R" 2 "D" 1 "N" 0 "P" ;
+VAL_ 309 ESPButton 1 "Active" 0 "Inactive" ;
+VAL_ 384 LKASteeringCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 842 RRWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault";
+VAL_ 842 RLWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault";
+VAL_ 880 ACCCruiseState 2 "Adaptive" 3 "Adaptive" 4 "Non-adaptive" 5 "Non-adaptive" ;
+VAL_ 880 ACCLeadCar 1 "Present" 0 "Not Present" ;
+VAL_ 880 ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ;
+VAL_ 880 ACCResumeButton 1 "Pressed" 0 "Depressed" ;
+VAL_ 880 ACCCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 388 HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ;
+VAL_ 388 HandsOffSWlDetectionStatus 1 "Hands On" 0 "Hands Off" ;
+VAL_ 388 LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ;
+VAL_ 489 BrakePedalPressed 1 "Pressed" 0 "Depressed" ;
+VAL_ 715 GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ;
+VAL_ 715 GasRegenCmdActive 1 "Active" 0 "Inactive" ;
+VAL_ 320 Intellibeam 1 "Active" 0 "Inactive" ;
+VAL_ 320 HighBeamsActive 1 "Active" 0 "Inactive" ;
+VAL_ 320 HighBeamsTemporary 1 "Active" 0 "Inactive" ;
+VAL_ 501 PRNDL2 7 "L3" 6 "L" 5 "L2" 4 "D" 3 "N" 2 "R" 1 "P" 0 "Shifting";
+VAL_ 501 TransmissionState 11 "Shifting" 10 "Reverse" 9 "Forward" 8 "Disengaged";
+VAL_ 501 ManualMode 1 "Active" 0 "Inactive"
diff --git a/iqdbc_repo/iqdbc/dbc/gwm_haval_h6_phev_2024.dbc b/iqdbc_repo/iqdbc/dbc/gwm_haval_h6_phev_2024.dbc
new file mode 100644
index 000000000..b9f85d7a5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/gwm_haval_h6_phev_2024.dbc
@@ -0,0 +1,252 @@
+BO_ 96 CAR_OVERALL_SIGNALS2: 64 XXX
+ SG_ CRC1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER1 : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC2 : 71|8@0+ (1,0) [0|255] "" XXX
+ SG_ GAS_POSITION : 79|8@0+ (0.393700787,0) [0|255] "%" XXX
+ SG_ BRAKE_SIGNAL : 86|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GAS_POSITION : 103|8@0+ (0.393700787,0) [0|255] "%" XXX
+ SG_ COUNTER2 : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC3 : 135|8@0+ (1,0) [0|255] "" XXX
+ SG_ REQ_REVIEW_UND_SIGNAL : 143|10@0+ (1,0) [0|255] "" XXX
+ SG_ REQ_REVIEW_POWER_CONSUMPTION : 144|9@0+ (1,-175) [0|511] "" XXX
+ SG_ REQ_REVIEW_POWER_CONSUMPTION2 : 180|9@0+ (1,-176) [0|511] "" XXX
+ SG_ COUNTER3 : 187|4@0+ (1,0) [0|15] "" XXX
+ SG_ REQ_REVIEW_POWER_STATE_SIGNAL : 302|4@0+ (1,0) [0|15] "" XXX
+ SG_ REQ_REVIEW_POWER_STATE_SIGNAL2 : 370|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 147 IMPRECISE_SPEED_INFORMATION: 8 XXX
+ SG_ IMPRECISE_SPEED : 15|8@0+ (3.5,0) [0|255] "kph" XXX
+ SG_ REQ_REVIEW_SPEED : 31|8@0+ (0.430107526,0) [0|255] "Kph" XXX
+ SG_ REQ_REVIEW_SPEED2 : 39|8@0+ (0.430107526,0) [0|255] "Kph" XXX
+ SG_ REQ_REVIEW_POWER_CONSUMPTION : 52|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 161 STEER_AND_AP_STALK: 8 XXX
+ SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEERING_ANGLE : 13|13@0+ (0.05,0) [0|65535] "degs" XXX
+ SG_ STEERING_DIRECTION : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_TORQUE : 29|14@0+ (1,0) [0|65535] "??" XXX
+ SG_ AP_REDUCE_DISTANCE_COMMAND : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ AP_INCREASE_DISTANCE_COMMAND : 45|1@0+ (1,0) [0|1] "AUTOPILOT_STALK" XXX
+ SG_ AP_CANCEL_COMMAND : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ AP_ENABLE_COMMAND : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AP_DECREASE_SPEED_COMMAND : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ AP_INCREASE_SPEED_COMMAND : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 59|4@0+ (1,0) [0|255] "" XXX
+
+BO_ 259 SPEED: 64 XXX
+ SG_ CRC : 199|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNDEFINED_ACCUMULATOR : 207|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNDEFINED_COUNTER : 215|8@0+ (1,0) [0|255] "" XXX
+ SG_ ODD_GAS_POSITION : 231|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 239|8@0+ (1,0) [0|255] "Khp" XXX
+ SG_ COUNTER2 : 251|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 273 UNDEFINED_2: 8 XXX
+ SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNDEFINED_SIGNAL_RELATED_ACC : 46|13@0+ (1,0) [0|8191] "" XXX
+ SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 288 BRAKE2: 64 XXX
+ SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REVIEW_REQ_BRAKE_SIGNAL1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ REQ_REVIEW_MOVING : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ODD_BRAKE_PRESSURE : 39|8@0+ (1,-27) [0|255] "" XXX
+ SG_ REVIEW_REQ_BRAKE_SIGNAL2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 299 AUTOPILOT: 64 XXX
+ SG_ REQ_REVIEW_CRC : 71|8@0+ (1,0) [0|255] "" XXX
+ SG_ AP_UNDEFINED_SIGNAL2 : 73|2@0+ (1,0) [0|3] "" XXX
+ SG_ REQ_REVIEW_COUNTER : 78|5@0+ (1,0) [0|31] "" XXX
+ SG_ AP_UNDEFINED_SIGNAL : 87|6@0+ (1,0) [0|63] "" XXX
+ SG_ AP_STEERING_UNDEFINED_SIGNAL1 : 102|10@0- (1,0) [0|2047] "" XXX
+ SG_ AP_UNDEFINED_SIGNAL3 : 103|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ AP_STATE : 125|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRC : 135|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 303 CAR_OVERALL_SIGNALS: 64 XXX
+ SG_ CRC1 : 71|8@0+ (1,0) [0|255] "" XXX
+ SG_ DRIVE_MODE_SIGNAL : 73|1@0+ (1,0) [0|1] "" XXX
+ SG_ REQ_REVIEW_POWER_STATE : 80|1@0+ (1,0) [0|1] "" XXX
+ SG_ REQ_REVIEW_POWER_STATE2 : 83|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_SIGNAL : 86|1@0+ (1,0) [0|1] "" XXX
+ SG_ REQ_REVIEW_POWER_STATE3 : 113|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX
+ SG_ DRIVER_MODE_SIGNAL2 : 161|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE_P : 162|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE_D : 163|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE_SIGNAL3 : 165|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 166|2@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_SIGNAL : 176|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER2 : 187|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 311 BRAKE: 64 XXX
+ SG_ CRC1 : 71|8@0+ (1,0) [0|255] "" XXX
+ SG_ REQ_REVIEW_DRIVE_MODE : 77|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX
+ SG_ REQ_REVIEW_HANDBRAKE_ENABLED : 143|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_SIGNAL1 : 152|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVIEW_REQ_HANDBRAKE_RELEASED : 153|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVIEW_REQ_HANDBRAKE_ENABLED : 154|1@0+ (1,0) [0|1] "DURING POWER BRAKE IS FALSE" XXX
+ SG_ BRAKE_SIGNAL2 : 155|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER2 : 187|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC3 : 199|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSURE : 207|13@0+ (1,0) [0|8191] "" XXX
+ SG_ REQ_REVIEW_BRAKE_PRESSURE : 207|14@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER3 : 251|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC4 : 263|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 315 WHEEL_SPEEDS: 64 XXX
+ SG_ FRONT_CRC : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ FRONT_LEFT_WHEEL_SPEED : 12|13@0+ (0.05924739,0) [0|8191] "Kph" XXX
+ SG_ FRONT_RIGHT_WHEEL_SPEED : 28|13@0+ (0.05924739,0) [0|8191] "Kph" XXX
+ SG_ FRONT_DISTANCE_ACCUMULATOR : 47|16@0+ (1,0) [0|65535] "??" XXX
+ SG_ FRONT_COUNTER : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ REAR_CRC : 327|8@0+ (1,0) [0|255] "" XXX
+ SG_ REAR_LEFT_WHEEL_SPEED : 332|13@0+ (0.05924739,0) [0|8191] "Kph" XXX
+ SG_ REAR_RIGHT_WHEEL_SPEED : 348|13@0+ (0.05924739,0) [0|8191] "Kph" XXX
+ SG_ REAR_DISTANCE_ACCUMULATOR : 367|16@0+ (1,0) [0|65535] "" XXX
+ SG_ REAR_COUNTER : 379|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 323 SPEED2: 64 XXX
+ SG_ NEW_SIGNAL_1 : 71|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED_REAL : 119|8@0+ (1,0) [0|255] "Kph" XXX
+ SG_ COUNTER : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 327 NEW_MSG_147: 64 XXX
+
+BO_ 347 NEW_MSG_15B: 64 XXX
+
+BO_ 357 NEW_MSG_165: 8 XXX
+
+BO_ 367 NEW_MSG_16F: 64 XXX
+
+BO_ 412 LIGHTS: 16 XXX
+ SG_ BRAKE_LIGHTS : 24|3@0+ (1,0) [0|7] "" XXX
+ SG_ RIGHT_TURN_SIGNAL : 30|1@0+ (1,0) [0|1] "ON/OFF ACCORDINGLY LIGHT" XXX
+ SG_ LEFT_TURN_SIGNAL : 31|1@0+ (1,0) [0|1] "ON/OFF ACCORDINGLY LIGHT" XXX
+
+BO_ 415 NEW_MSG_19F: 64 XXX
+
+BO_ 573 UNDEFINED_RELATIONSHIP_WITH_CAR_RUNNING: 64 XXX
+ SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER2 : 187|12@0+ (1,0) [0|4095] "" XXX
+ SG_ COUNTER3 : 251|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC3 : 263|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 581 NEW_MSG_245: 8 XXX
+
+BO_ 639 NEW_MSG_27F: 16 XXX
+ SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REQ_REVIEW_ODOMETER : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 649 DRIVE_MODE: 64 XXX
+ SG_ DRIVE_MODE_ENABLED : 382|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE_DISABLED : 383|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 683 ACC: 64 XXX
+ SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX
+ SG_ CRC1 : 135|8@0+ (1,0) [0|255] "" XXX
+ SG_ CAR_DISTANCE_SELECTION : 170|3@0+ (1,0) [0|7] "" XXX
+ SG_ ACC_SPEED_SELECTION : 183|8@0+ (1,0) [0|255] "Kph" XXX
+ SG_ COUNTER2 : 187|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 696 UNDEFINED_INTERESTING_SIGNALS: 64 XXX
+ SG_ UNDEFINED_SIGNAL2 : 20|9@0+ (1,0) [0|511] "" XXX
+ SG_ UNDEFINED_SIGNAL1 : 27|12@0+ (1,0) [0|4095] "" XXX
+ SG_ UNDEFINED_ACCUMULATOR : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ UNDEFINED_ACCUMULATOR2 : 47|12@0+ (1,0) [0|15] "" XXX
+ SG_ UNDEFINED_SIGNAL3 : 51|12@0+ (1,0) [0|4095] "" XXX
+ SG_ UNDEFINED_SIGNAL4 : 265|10@0+ (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_1 : 354|7@0+ (1,0) [0|127] "" XXX
+
+BO_ 714 BUTTONS: 8 XXX
+ SG_ LOCK_DOORS_BUTTON : 16|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 793 DOOR_DRIVER: 16 XXX
+ SG_ REQ_REVIEW_CAR_STATE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_REAR_RIGHT_OPEN : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_FRONT_RIGHT_OPEN : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_REAR_LEFT_OPEN : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_DRIVER_OPEN : 22|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 837 DOOR_LOCK_STATES: 16 XXX
+ SG_ DOOR_LOCK_STATE : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_LOCK_STATE2 : 34|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 849 SEATBELT: 16 XXX
+ SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SEAT_BELT_DRIVER_STATE : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEAT_BELT_DRIVER_STATE2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX
+
+CM_ SG_ 96 GAS_POSITION "0 - 100%";
+CM_ SG_ 96 BRAKE_SIGNAL "1 = BRAKE PRESSED";
+CM_ SG_ 96 ACC_GAS_POSITION "0 - 100% | WHEN ACC REMAINS INFORMATION";
+CM_ SG_ 96 REQ_REVIEW_POWER_CONSUMPTION2 "REQ FACTOR CONVERTER";
+CM_ SG_ 96 REQ_REVIEW_POWER_STATE_SIGNAL "1 = OFF | 12 WARM-UP | 5 = ON";
+CM_ SG_ 96 REQ_REVIEW_POWER_STATE_SIGNAL2 "1 = OFF | 0 = ON";
+CM_ SG_ 147 IMPRECISE_SPEED "lower precision, reverse is positive as well";
+CM_ SG_ 147 REQ_REVIEW_SPEED "INITIALLY ADJUSTED TO KPH BUT ITS NOT";
+CM_ SG_ 147 REQ_REVIEW_SPEED2 "INITIALLY ADJUSTED TO KPH BUT ITS NOT";
+CM_ SG_ 161 STEERING_ANGLE "0 CENTER, NO LEFT / RIGHT SIGNAL";
+CM_ SG_ 161 STEERING_TORQUE "Peak identified 3680, 0 = stopped";
+CM_ SG_ 161 AP_REDUCE_DISTANCE_COMMAND "AUTOPILOT STALK";
+CM_ SG_ 161 AP_CANCEL_COMMAND "AUTOPILOT STALK - FRONT MOVEMENT = CANCEL COMMAND";
+CM_ SG_ 161 AP_ENABLE_COMMAND "AUTOPILOT STALK - REAR MOVEMENT = ENABLE COMMAND";
+CM_ SG_ 161 AP_DECREASE_SPEED_COMMAND "AUTOPILOT STALK - MOVEMENT";
+CM_ SG_ 161 AP_INCREASE_SPEED_COMMAND "AUTOPILOT STALK - DOWN MOVEMENT]";
+CM_ SG_ 259 UNDEFINED_ACCUMULATOR "WHEN ELETRIC MODE = 0, PERHAPS COMBUSTION ENGINE";
+CM_ SG_ 259 UNDEFINED_COUNTER "0 WHEN ELECTRIC, PERHAPS COMBUSTION ENGINE";
+CM_ SG_ 259 ODD_GAS_POSITION "17 = 0, 253 = FULL, SOMETIMES 4";
+CM_ SG_ 259 SPEED "PRECISE, KPH, DASHBOARD SPEED, BIT LOWER THAN GPS SPEED";
+CM_ SG_ 288 REVIEW_REQ_BRAKE_SIGNAL1 "0 | 128 SIMILAR TO BRAKE SIGNAL BUT ADDITIONAL DELAY";
+CM_ SG_ 288 REQ_REVIEW_MOVING "1 = CAR IS MOVING";
+CM_ SG_ 288 ODD_BRAKE_PRESSURE "ODD BRAKE PRESSURE, NEGATIVE/OFFSET";
+CM_ SG_ 288 REVIEW_REQ_BRAKE_SIGNAL2 "0 | 128 BRAKE PRESSED";
+CM_ SG_ 299 REQ_REVIEW_COUNTER "COUNTER NOT STABLE";
+CM_ SG_ 299 AP_UNDEFINED_SIGNAL3 "PERHAPS HANDS ON SENSOR";
+CM_ SG_ 299 AP_STATE "1 = ON | 0 = OFF";
+CM_ SG_ 303 DRIVE_MODE_SIGNAL "D/R = 0 | N/P = 1";
+CM_ SG_ 303 REQ_REVIEW_POWER_STATE "1 = ON | 0 = IDLE";
+CM_ SG_ 303 REQ_REVIEW_POWER_STATE2 "1 = ON | 0 = IDLE";
+CM_ SG_ 303 GAS_SIGNAL "1 = GAS PRESSED";
+CM_ SG_ 303 REQ_REVIEW_POWER_STATE3 "0 = OFF / 1 = ON";
+CM_ SG_ 303 DRIVER_MODE_SIGNAL2 "D/R = 1 | N/P=0";
+CM_ SG_ 303 DRIVE_MODE_SIGNAL3 "P/R = 1 | P/N = 0";
+CM_ SG_ 303 DRIVE_MODE "0 = P | 1 = D | 2 = N | 3 = R (GOOD SIGNAL)";
+CM_ SG_ 303 BRAKE_SIGNAL "1 BRAKE PRESSED";
+CM_ SG_ 311 REQ_REVIEW_DRIVE_MODE "1 = P | 0 = D";
+CM_ SG_ 311 BRAKE_SIGNAL1 "0 = NO | 1 = BRAKE PRESSED";
+CM_ SG_ 311 REVIEW_REQ_HANDBRAKE_RELEASED "DURING POWER BRAKE IS TRUE";
+CM_ SG_ 311 BRAKE_SIGNAL2 "0 NO | 1 = BRAKE PRESSED";
+CM_ SG_ 311 BRAKE_PRESSURE "MAX PRESSURE IDENTIFIED = 4184 | 0 = NO PRESSURE";
+CM_ SG_ 311 REQ_REVIEW_BRAKE_PRESSURE "ADDITIONAL BIT";
+CM_ SG_ 315 FRONT_LEFT_WHEEL_SPEED "Based on the car's dashboard speed";
+CM_ SG_ 315 FRONT_RIGHT_WHEEL_SPEED "Based on the car's dashboard speed";
+CM_ SG_ 315 FRONT_DISTANCE_ACCUMULATOR "?? doubts";
+CM_ SG_ 315 REAR_LEFT_WHEEL_SPEED "Based on the car's dashboard speed";
+CM_ SG_ 315 REAR_RIGHT_WHEEL_SPEED "Based on the car's dashboard speed";
+CM_ SG_ 315 REAR_DISTANCE_ACCUMULATOR "PULSES";
+CM_ SG_ 323 SPEED_REAL "PRECISE, EQUAL GPS SPEED";
+CM_ SG_ 412 BRAKE_LIGHTS "POSSIBLE 3 DIFFERENT LIGHTS";
+CM_ SG_ 412 LEFT_TURN_SIGNAL "ON/OFF ACCORDINGLY LIGHT";
+CM_ BO_ 573 "APPEARS TO HAVE GOOD MOVING INFORMATION";
+CM_ BO_ 649 "FRONT";
+CM_ SG_ 649 DRIVE_MODE_ENABLED "DRIVE = 1 | OTHER MODES = 0";
+CM_ SG_ 649 DRIVE_MODE_DISABLED "D = 0 | OTHER MODES = 0";
+CM_ SG_ 683 CAR_DISTANCE_SELECTION "AUTOPILOT CAR DISTANCE SELECTED BY DRIVER, OPTIONS 1, 2, 3, 4";
+CM_ BO_ 696 "POSSIBLE RELATED TO ACC OR ENGINE";
+CM_ SG_ 714 LOCK_DOORS_BUTTON "1 = PRESSED";
+CM_ SG_ 793 REQ_REVIEW_CAR_STATE "1 = STOPPED | 0 = MOVING";
+CM_ SG_ 837 DOOR_LOCK_STATE "0 = LOCKED / 1 = UNLOCKED";
+CM_ SG_ 837 DOOR_LOCK_STATE2 "0 = LOCKED / 1 = UNLOCKED";
+CM_ SG_ 849 SEAT_BELT_DRIVER_STATE "0 = Fastened / 1 = Released";
+CM_ SG_ 849 SEAT_BELT_DRIVER_STATE2 "0 = Fastened / 1 = Released";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_accord_2017_can_ext_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_accord_2017_can_ext_generated.dbc
new file mode 100644
index 000000000..09972fbc9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_accord_2017_can_ext_generated.dbc
@@ -0,0 +1,406 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_a.dbc starts here";
+BO_ 660 SCM_FEEDBACK: 8 SCM
+ SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 422 SCM_BUTTONS: 8 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON
+ SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON
+
+VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
+VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+
+
+CM_ "Imported file _steering_sensors_b.dbc starts here";
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_d_ext.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 400 STEER_STATUS: 5 EPS
+ SG_ STEER_TORQUE_SENSOR : 0|9@1- (1,0) [-256|256] "" XXX
+ SG_ LIN_INTERFACE_FATAL_ERROR : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ LATE_MESSAGE : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_STATUS : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ALLOWED : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_APPLIED : 23|16@0- (1,0) [0|511] "" XXX
+
+VAL_ 400 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+CM_ "honda_accord_2017_can_ext.dbc starts here";
+
+BO_ 392 GEARBOX_AUTO: 6 XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON
+
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ;
+VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_bosch_radarless_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_bosch_radarless_generated.dbc
new file mode 100644
index 000000000..2e3a7e938
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_bosch_radarless_generated.dbc
@@ -0,0 +1,593 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _bosch_2018.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX
+ SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 232 BRAKE_HOLD: 7 XXX
+ SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX
+ SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+BO_ 446 BRAKE_MODULE: 3 VSA
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS
+ SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 545 ECON_STATUS: 6 SCM
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY
+
+BO_ 576 LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 577 LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 579 RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 580 RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 927 RADAR_HUD: 8 RADAR
+ SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
+ SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
+ SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
+ SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 13274 LKAS_HUD_A: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+BO_ 13275 LKAS_HUD_B: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+
+CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1";
+CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded";
+CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded";
+CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded";
+CM_ SG_ 577 LINE_DASHED "1 = line is dashed";
+CM_ SG_ 577 LINE_SOLID "1 = line is solid";
+
+VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active";
+VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal";
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ;
+VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN";
+VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN";
+
+
+CM_ "Imported file _lkas_hud_8byte.dbc starts here";
+BO_ 829 LKAS_HUD: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+VAL_ 829 LANE_LINES 7 "both_lines_green" 6 "both_lines_white" 2 "left_line_white" 0 "no_lines";
+
+
+CM_ "Imported file _bosch_standstill.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+
+CM_ "Imported file _steering_sensors_a.dbc starts here";
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_bosch_radarless.dbc starts here";
+
+BO_ 456 ACC_CONTROL: 8 XXX
+ SG_ ACCEL_COMMAND : 7|12@0- (0.01,0) [0|0] "m/s^2" XXX
+ SG_ BRAKE_REQUEST : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ BOH : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@1+ (1,0) [0|7] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCW_1 : 24|1@1+ (1,0) [0|3] "" XXX
+ SG_ FCW_2 : 54|1@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 467 CRUISE_FAULT_STATUS: 8 XXX
+ SG_ CRUISE_FAULT : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 477 GEARBOX_ALT_2: 8 XXX
+ SG_ GEAR_MT : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 495 SPEED_LIMIT_DASH_DISPLAY: 8 ADAS
+ SG_ SPEED_LIMIT : 47|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 254913108 LKAS_HUD_2: 8 ADAS
+ SG_ COUNTER_2 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_BOH_1 : 15|6@0+ (1,0) [0|63] "" XXX
+ SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_BOH_2 : 30|5@0+ (1,0) [0|31] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+CM_ SG_ 456 IDLESTOP_ALLOW "allows car to turn off engine at a standstill";
+CM_ SG_ 456 STANDSTILL "set to 1 when camera requests -4.0 m/s^2";
+CM_ SG_ 495 SPEED_LIMIT "Defaults to 0xFF if no speed limit found";
+
+VAL_ 477 GEAR_MT 14 "reverse" 6 "6th" 5 "5th" 4 "4th" 3 "3rd" 2 "2nd" 1 "1st" 0 "Clutch";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_civic_hatchback_ex_2017_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_civic_hatchback_ex_2017_can_generated.dbc
new file mode 100644
index 000000000..412bb89d9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_civic_hatchback_ex_2017_can_generated.dbc
@@ -0,0 +1,580 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _bosch_2018.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX
+ SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 232 BRAKE_HOLD: 7 XXX
+ SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX
+ SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+BO_ 446 BRAKE_MODULE: 3 VSA
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS
+ SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 545 ECON_STATUS: 6 SCM
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY
+
+BO_ 576 LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 577 LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 579 RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 580 RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 927 RADAR_HUD: 8 RADAR
+ SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
+ SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
+ SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
+ SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 13274 LKAS_HUD_A: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+BO_ 13275 LKAS_HUD_B: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+
+CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1";
+CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded";
+CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded";
+CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded";
+CM_ SG_ 577 LINE_DASHED "1 = line is dashed";
+CM_ SG_ 577 LINE_SOLID "1 = line is solid";
+
+VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active";
+VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal";
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ;
+VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN";
+VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN";
+
+
+CM_ "Imported file _bosch_radar_acc.dbc starts here";
+BO_ 479 ACC_CONTROL: 8 EON
+ SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX
+ SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX
+ SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX
+ SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 495 ACC_CONTROL_ON: 8 XXX
+ SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX
+ SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled";
+CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event";
+CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event";
+CM_ SG_ 479 AEB_PREPARE "set 1s before AEB";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _bosch_standstill.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+
+CM_ "Imported file _steering_sensors_a.dbc starts here";
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_civic_hatchback_ex_2017_can.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_civic_touring_2016_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_civic_touring_2016_can_generated.dbc
new file mode 100644
index 000000000..019ede054
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_civic_touring_2016_can_generated.dbc
@@ -0,0 +1,454 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_b.dbc starts here";
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ;
+
+
+CM_ "Imported file _steering_sensors_a.dbc starts here";
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_a.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_civic_touring_2016_can.dbc starts here";
+
+BO_ 493 HUD_SETTING: 5 XXX
+ SG_ IMPERIAL_UNIT : 5|1@0+ (1,0) [0|1] "" EON
+
+BO_ 545 ECON_STATUS: 6 XXX
+ SG_ ECON_ON_2 : 37|2@0+ (1,0) [0|3] "" EON
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+
+VAL_ 545 ECON_ON_2 0 "off" 3 "on" ;
diff --git a/iqdbc_repo/iqdbc/dbc/honda_clarity_hybrid_2018_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_clarity_hybrid_2018_can_generated.dbc
new file mode 100644
index 000000000..421ce4718
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_clarity_hybrid_2018_can_generated.dbc
@@ -0,0 +1,459 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_b.dbc starts here";
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ;
+
+
+CM_ "Imported file _steering_sensors_a.dbc starts here";
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_a.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_clarity_hybrid_2018_can.dbc starts here";
+
+BO_ 768 VEHICLE_STATE: 8 ADAS
+ SG_ SET_ME_XF9 : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+ SG_ VEHICLE_SPEED : 15|8@0+ (1,0) [0|255] "kph" Vector__XXX
+ SG_ SET_ME_X8A : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_XD0 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SALTED_WITH_IDX : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 769 VEHICLE_STATE2: 8 ADAS
+ SG_ SET_ME_X5D : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X02 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X5F : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/honda_common_canfd_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_common_canfd_generated.dbc
new file mode 100644
index 000000000..fba251094
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_common_canfd_generated.dbc
@@ -0,0 +1,581 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _bosch_2018.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX
+ SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 232 BRAKE_HOLD: 7 XXX
+ SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX
+ SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+BO_ 446 BRAKE_MODULE: 3 VSA
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS
+ SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 545 ECON_STATUS: 6 SCM
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY
+
+BO_ 576 LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 577 LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 579 RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 580 RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 927 RADAR_HUD: 8 RADAR
+ SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
+ SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
+ SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
+ SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 13274 LKAS_HUD_A: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+BO_ 13275 LKAS_HUD_B: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+
+CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1";
+CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded";
+CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded";
+CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded";
+CM_ SG_ 577 LINE_DASHED "1 = line is dashed";
+CM_ SG_ 577 LINE_SOLID "1 = line is solid";
+
+VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active";
+VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal";
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ;
+VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN";
+VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN";
+
+
+CM_ "Imported file _bosch_radar_acc.dbc starts here";
+BO_ 479 ACC_CONTROL: 8 EON
+ SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX
+ SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX
+ SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX
+ SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 495 ACC_CONTROL_ON: 8 XXX
+ SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX
+ SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled";
+CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event";
+CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event";
+CM_ SG_ 479 AEB_PREPARE "set 1s before AEB";
+
+
+CM_ "Imported file _lkas_hud_8byte.dbc starts here";
+BO_ 829 LKAS_HUD: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+VAL_ 829 LANE_LINES 7 "both_lines_green" 6 "both_lines_white" 2 "left_line_white" 0 "no_lines";
+
+
+CM_ "Imported file _bosch_standstill.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+
+CM_ "Imported file _steering_sensors_a.dbc starts here";
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_common_canfd.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_crv_ex_2017_body_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_crv_ex_2017_body_generated.dbc
new file mode 100644
index 000000000..4d154e53f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_crv_ex_2017_body_generated.dbc
@@ -0,0 +1,13 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "honda_crv_ex_2017_body.dbc starts here";
+BO_ 318291879 BSM_STATUS_RIGHT: 8 XXX
+ SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 318291615 BSM_STATUS_LEFT: 8 XXX
+ SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX
+
+VAL_ 318291879 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off";
+VAL_ 318291615 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_crv_touring_2016_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_crv_touring_2016_can_generated.dbc
new file mode 100644
index 000000000..9599556dd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_crv_touring_2016_can_generated.dbc
@@ -0,0 +1,438 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_a.dbc starts here";
+BO_ 660 SCM_FEEDBACK: 8 SCM
+ SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 422 SCM_BUTTONS: 8 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON
+ SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON
+
+VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
+VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+
+
+CM_ "Imported file _steering_sensors_b.dbc starts here";
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_b.dbc starts here";
+BO_ 404 STEERING_CONTROL: 4 EON
+ SG_ STEER_TORQUE : 7|12@0- (1,0) [-768|768] "" EPS
+ SG_ SET_ME_X00 : 11|4@0+ (1,0) [0|15] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00_2 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS
+
+BO_ 399 STEER_STATUS: 6 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|12@0- (-1,0) [-2047.5|2047.5] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_CONTROL_ACTIVE : 36|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_STATUS : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_crv_touring_2016_can.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_insight_ex_2019_can_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_insight_ex_2019_can_generated.dbc
new file mode 100644
index 000000000..f29065d79
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_insight_ex_2019_can_generated.dbc
@@ -0,0 +1,578 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _bosch_2018.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 EON
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
+ SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
+ SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX
+ SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 232 BRAKE_HOLD: 7 XXX
+ SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX
+ SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX
+ SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+BO_ 446 BRAKE_MODULE: 3 VSA
+ SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS
+ SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 545 ECON_STATUS: 6 SCM
+ SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY
+
+BO_ 576 LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 577 LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 579 RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 580 RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM
+ SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX
+ SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX
+ SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX
+ SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM
+ SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX
+ SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX
+ SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX
+ SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 927 RADAR_HUD: 8 RADAR
+ SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
+ SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
+ SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
+ SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 13274 LKAS_HUD_A: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+BO_ 13275 LKAS_HUD_B: 8 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+
+CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1";
+CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded";
+CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded";
+CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded";
+CM_ SG_ 577 LINE_DASHED "1 = line is dashed";
+CM_ SG_ 577 LINE_SOLID "1 = line is solid";
+
+VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active";
+VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal";
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ;
+VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN";
+VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN";
+
+
+CM_ "Imported file _bosch_radar_acc.dbc starts here";
+BO_ 479 ACC_CONTROL: 8 EON
+ SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX
+ SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX
+ SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX
+ SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX
+ SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 495 ACC_CONTROL_ON: 8 XXX
+ SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX
+ SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled";
+CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event";
+CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event";
+CM_ SG_ 479 AEB_PREPARE "set 1s before AEB";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _steering_sensors_a.dbc starts here";
+BO_ 330 STEERING_SENSORS: 8 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_insight_ex_2019_can.dbc starts here";
+
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ BRAKE_ERROR_1 : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+
+CM_ BO_ 432 "Slightly conflicting definition with common Bosch standstill message, this one could be broken";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_odyssey_exl_2018_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_odyssey_exl_2018_generated.dbc
new file mode 100644
index 000000000..0d7e297b8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_odyssey_exl_2018_generated.dbc
@@ -0,0 +1,439 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_b.dbc starts here";
+BO_ 662 SCM_BUTTONS: 4 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 806 SCM_FEEDBACK: 8 SCM
+ SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON
+ SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON
+ SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON
+ SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ;
+
+
+CM_ "Imported file _steering_sensors_b.dbc starts here";
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_a.dbc starts here";
+BO_ 228 STEERING_CONTROL: 5 ADAS
+ SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_odyssey_exl_2018.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/honda_odyssey_twn_2018_generated.dbc b/iqdbc_repo/iqdbc/dbc/honda_odyssey_twn_2018_generated.dbc
new file mode 100644
index 000000000..8953fe629
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/honda_odyssey_twn_2018_generated.dbc
@@ -0,0 +1,421 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _honda_common.dbc starts here";
+BO_ 145 KINEMATICS_ALT: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 148 KINEMATICS: 8 XXX
+ SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 304 GAS_PEDAL_2: 8 PCM
+ SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 316 GAS_PEDAL: 8 PCM
+ SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 344 ENGINE_DATA: 8 PCM
+ SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON
+ SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 380 POWERTRAIN_DATA: 8 PCM
+ SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON
+ SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON
+ SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON
+ SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX
+ SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 420 VSA_STATUS: 8 VSA
+ SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON
+ SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON
+ SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 427 STEER_MOTOR_TORQUE: 3 EPS
+ SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON
+ SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON
+
+BO_ 450 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 464 WHEEL_SPEEDS: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 490 VEHICLE_DYNAMICS: 8 VSA
+ SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX
+ SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA
+ SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON
+ SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON
+ SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON
+ SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 773 SEATBELT_STATUS: 7 BDY
+ SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON
+ SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 777 CAR_SPEED: 8 PCM
+ SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX
+ SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 780 ACC_HUD: 8 ADAS
+ SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY
+ 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_ 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
+ SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY
+ SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY
+ SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY
+ SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY
+ SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY
+ SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY
+ SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY
+ SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY
+ SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY
+ SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY
+ SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY
+ SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY
+ SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY
+
+BO_ 804 CRUISE: 8 PCM
+ SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON
+ SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON
+ SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON
+ SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON
+ SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 862 CAMERA_MESSAGES: 8 CAM
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 884 STALK_STATUS: 8 XXX
+ SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON
+ SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON
+ SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 891 STALK_STATUS_2: 8 XXX
+ SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON
+ SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1029 DOORS_STATUS: 8 BDY
+ SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON
+ SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON
+ SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 1302 ODOMETER: 8 XXX
+ SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+
+CM_ SG_ 304 "Seems to be platform-agnostic";
+CM_ SG_ 316 "Should exist on Nidec";
+CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged";
+CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
+CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
+CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
+CM_ SG_ 780 CRUISE_SPEED "255 = no speed";
+CM_ SG_ 780 PCM_SPEED "Used by Nidec";
+CM_ SG_ 780 PCM_GAS "Used by Nidec";
+CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed";
+
+VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
+VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped";
+VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car";
+VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open";
+VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off";
+
+
+CM_ "Imported file _nidec_common.dbc starts here";
+BO_ 432 STANDSTILL: 7 VSA
+ SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON
+ SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON
+ SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON
+
+BO_ 487 BRAKE_PRESSURE: 4 VSA
+ SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON
+
+BO_ 506 BRAKE_COMMAND: 8 ADAS
+ SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM
+ SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM
+ SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM
+ SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM
+ SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM
+ SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM
+ SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM
+ SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM
+ SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM
+ SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM
+
+BO_ 892 CRUISE_PARAMS: 8 PCM
+ SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 927 RADAR_HUD: 8 ADAS
+ SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY
+ SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY
+ SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY
+ SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY
+ SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY
+ SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY
+ SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY
+
+CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event";
+CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec";
+CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec";
+
+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_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
+VAL_ 927 LEAD_DISTANCE 254 "no lead";
+VAL_ 927 LEAD_SPEED 510 "no lead";
+
+
+CM_ "Imported file _lkas_hud_5byte.dbc starts here";
+BO_ 829 LKAS_HUD: 5 ADAS
+ SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY
+ SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" 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_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY
+ SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY
+ SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY
+ SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY
+ SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY
+ SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY
+
+
+CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings 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_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep";
+
+
+CM_ "Imported file _nidec_scm_group_a.dbc starts here";
+BO_ 660 SCM_FEEDBACK: 8 SCM
+ SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON
+ SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON
+ SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+
+BO_ 422 SCM_BUTTONS: 8 SCM
+ SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON
+ SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON
+ SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON
+ SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON
+ SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON
+
+VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
+VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
+VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
+
+
+CM_ "Imported file _steering_sensors_c.dbc starts here";
+CM_ "steer_angle_rate is negative vs _steering_sensors_b.dbc";
+
+BO_ 342 STEERING_SENSORS: 6 EPS
+ SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (1,0) [-3000|3000] "deg/s" EON
+ SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
+
+
+CM_ "Imported file _steering_control_c.dbc starts here";
+BO_ 404 STEERING_CONTROL: 4 EON
+ SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
+ SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
+ SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS
+ SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS
+ SG_ STEER_TORQUE : 7|16@0- (-1,0) [-32767|32767] "" EPS
+
+BO_ 399 STEER_STATUS: 7 EPS
+ SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-2985|2985] "tbd" EON
+ SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
+ SG_ STEER_STATUS : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
+ SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
+ SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
+
+VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
+
+CM_ "Imported file _gearbox_common.dbc starts here";
+BO_ 401 GEARBOX_CVT: 8 PCM
+ SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX
+ SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+
+BO_ 419 GEARBOX_AUTO: 8 PCM
+ SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON
+ SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX
+ SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
+ SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
+ SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio";
+CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio";
+CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup";
+CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold";
+CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
+CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
+
+VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
+VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
+VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
+VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
+
+CM_ "honda_odyssey_twn_2018.dbc starts here";
diff --git a/iqdbc_repo/iqdbc/dbc/hongqi_hs5.dbc b/iqdbc_repo/iqdbc/dbc/hongqi_hs5.dbc
new file mode 100644
index 000000000..76b41d873
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hongqi_hs5.dbc
@@ -0,0 +1,160 @@
+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
+
+
+BO_ 146 ECM_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ THROTTLE_1 : 8|12@1+ (1,0) [0|255] "" XXX
+ SG_ THROTTLE_2 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ THROTTLE_3 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ DRIVER_THROTTLE : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 192 ABS_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ FRONT_LEFT : 8|16@1+ (0.01,0) [0|65535] "km/h" XXX
+ SG_ FRONT_RIGHT : 24|16@1+ (0.01,0) [0|65535] "km/h" XXX
+ SG_ VEHICLE_SPEED : 40|16@1+ (0.01,0) [0|65535] "km/h" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 194 ABS_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ REAR_LEFT : 8|16@1+ (0.01,0) [0|65535] "km/h" XXX
+ SG_ REAR_RIGHT : 24|16@1+ (0.01,0) [0|65535] "km/h" XXX
+ SG_ BRAKE_PRESSURE : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 208 EPS_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ STEER_ANGLE : 8|15@1+ (0.0225,0) [0|65535] "" XXX
+ SG_ STEER_ANGLE_DIRECTION : 23|1@1+ (1,0) [0|1] "direction" XXX
+ SG_ STEER_RATE : 24|15@1+ (0.0225,0) [0|65535] "" XXX
+ SG_ STEER_RATE_DIRECTION : 39|1@1+ (1,0) [0|1] "direction" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 336 EPS_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ EPS_TORQUE : 8|10@1- (1,0) [0|255] "" XXX
+ SG_ EPS_TORQUE_DIRECTION : 18|1@1+ (1,0) [0|1] "direction" XXX
+ SG_ UNKNOWN : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_STATUS : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ DRIVER_INPUT_TORQUE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ LKAS_TORQUE : 40|10@1+ (1,0) [0|1023] "" XXX
+ SG_ LKAS_TORQUE_DIRECTION : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 272 ACC: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_1 : 8|12@1+ (1,0) [0|4095] "" XXX
+ SG_ UNKNOWN_2 : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACCELERATION : 24|12@1+ (1,-300) [0|255] "" XXX
+ SG_ STATUS : 36|4@1+ (1,0) [0|31] "x" XXX
+ SG_ UNKNOWN_3 : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 274 LKAS: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ LKAS_TORQUE : 8|10@1+ (1,0) [0|2047] "x" XXX
+ SG_ LKAS_TORQUE_DIRECTION : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_TORQUE_ACTIVE : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN_ACTIVE_STATE : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ MAYBE_HUD_LANE_STATES : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ACTIVE : 32|1@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 148 MAYBE_ABS: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ UNKNOWN_1 : 8|16@1+ (1,0) [0|15] "x" XXX
+ SG_ UNKNOWN_2 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED : 35|1@1+ (1,0) [0|1] "x" XXX
+ SG_ UNKNOWN_3 : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 304 ABS_3: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 15|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 47|8@1+ (1,0) [0|255] "" XXX
+ SG_ DRIVER_BRAKE_PRESSURE : 48|12@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 144 MAYBE_ENGINE: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 8|12@1+ (1,0) [0|255] "" XXX
+ SG_ MAYBE_RPM : 20|12@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 46|14@1+ (1,0) [0|4095] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 422 MAYBE_ACC_BUTTONS: 8 XXX
+ SG_ NEW_SIGNAL_1 : 18|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 560 TURN_SIGNALS: 8 XXX
+ SG_ RIGHT_TURN_SIGNALING : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_TURN_SIGNALING : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_TURN_BULB_3 : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_TURN_BULB_3 : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_TURN_BULB_2 : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_TURN_BULB_2 : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_TURN_BULB_1 : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_TURN_BULB_1 : 17|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 586 DOOR_FL: 8 XXX
+ SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 588 DOOR_FR: 8 XXX
+ SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 590 DOOR_RL: 8 XXX
+ SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 591 DOOR_RR: 8 XXX
+ SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX
+
+
+
+
+CM_ SG_ 274 UNKNOWN_ACTIVE_STATE "Triggers changes from 8 to 9 in EPS_2.LKAS_STATUS";
+CM_ SG_ 560 RIGHT_TURN_SIGNALING "Includes 2.5 second convenience lane change interval";
+CM_ SG_ 560 LEFT_TURN_SIGNALING "Includes 2.5 second convenience lane change interval";
+VAL_ 336 LKAS_STATUS 1 "INITIALIZING" 5 "READY" 8 "ACTIVE_1" 9 "ACTIVE_2" 13 "FAULT" ;
+VAL_ 586 OPEN 0 "CLOSED" 1 "OPEN" ;
+VAL_ 588 OPEN 0 "CLOSED" 1 "OPEN" ;
+VAL_ 590 OPEN 0 "CLOSED" 1 "OPEN" ;
+VAL_ 591 OPEN 0 "CLOSED" 1 "OPEN" ;
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_2015_ccan.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_2015_ccan.dbc
new file mode 100644
index 000000000..fc1e17390
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_2015_ccan.dbc
@@ -0,0 +1,1416 @@
+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_: IAP ODS _4WD BCM HUD DATC MDPS AAF_Tester AEMC SMK _4WD EPB CUBIS MTS TMU EVP CGW TPMS LPI DI_BOX SPAS EMS LCA TCU IBOX FATC AFLS FPCM SCC AHLS AVM ABS SNV OPI PGS SAS AAF Dummy LDWS_LKAS LVR ESC PSB CLU ECS ACU REA
+
+BO_ 1532 ODS13: 5 ODS
+ SG_ CR_Ods_ID : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_Chksum_H : 8|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+ SG_ CR_Ods_Chksum_L : 16|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+ SG_ CR_Ods_RomID_H : 24|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+ SG_ CR_Ods_RomID_L : 32|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+
+BO_ 1531 ODS12: 8 ODS
+ SG_ CR_Ods_SerNum0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum3 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum4 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum5 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum6 : 48|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum7 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+
+BO_ 1530 ODS11: 8 ODS
+ SG_ CF_Ods_PrcCmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy
+ SG_ CF_Ods_BtsFail : 3|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy
+ SG_ CF_Ods_AcuRcvSN : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_EolCal : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_PsFail : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_EcuFail : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_WgtStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_OccStat : 16|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CR_Wcs_ErrStat : 32|8@1+ (1.0,0.0) [0.0|63.0] "" ACU
+ SG_ CR_Wcs_ClassStat : 40|8@1+ (1.0,0.0) [0.0|4.0] "" ACU,BCM
+
+BO_ 1017 ECS12: 4 ECS
+ SG_ Height_FL : 0|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+ SG_ Height_FR : 8|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+ SG_ Height_RL : 16|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+ SG_ Height_RR : 24|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+
+BO_ 1268 SPAS12: 8 SPAS
+ SG_ CF_Spas_HMI_Stat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_Spas_Disp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS
+ SG_ CF_Spas_FIL_Ind : 10|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FIR_Ind : 13|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FOL_Ind : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FOR_Ind : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_VolDown : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_RIL_Ind : 24|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_RIR_Ind : 27|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FLS_Alarm : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_ROL_Ind : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_ROR_Ind : 35|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FCS_Alarm : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_FI_Ind : 40|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_RI_Ind : 43|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FRS_Alarm : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_FR_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Spas_RR_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Spas_BEEP_Alarm : 52|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Spas_StatAlarm : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Spas_RLS_Alarm : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_RCS_Alarm : 59|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_RRS_Alarm : 61|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1265 CLU11: 4 CLU
+ SG_ CF_Clu_CruiseSwState : 0|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,LDWS_LKAS,SCC
+ SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,LDWS_LKAS,SCC
+ SG_ CF_Clu_SldMainSW : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Clu_ParityBit1 : 5|1@1+ (1.0,0.0) [0.0|1.0] "pulse count" EMS
+ SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0.0) [0.0|0.375] "" EMS
+ SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0.0) [0.0|255.5] "km/h or MPH" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ CF_Clu_DetentOut : 18|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,BCM,LCA,PGS,SPAS
+ SG_ CF_Clu_RheostatLevel : 19|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,BCM,LCA,PGS,SPAS
+ SG_ CF_Clu_CluInfo : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_AmpInfo : 25|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1.0,0.0) [0.0|15.0] "" AHLS,EMS,EPB,LDWS_LKAS,MDPS,SCC
+
+BO_ 1492 TMU_GW_PE_01: 8 CLU
+ SG_ TMU_IVRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ TMU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+
+BO_ 1491 HU_DATC_PE_00: 8 CLU
+ SG_ HU_VRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ HU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ BlowerNoiseControl : 4|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+
+BO_ 1490 HU_DATC_E_02: 8 CLU
+ SG_ HU_DATC_RearOnOffSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ HU_DATC_ADSOnOffSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+
+BO_ 1479 EMS21: 8 EMS
+ SG_ SCR_LEVEL_WARN_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ SCR_LEVEL_WARN : 1|3@1+ (1.0,0.0) [0.0|4.0] "" CLU
+ SG_ SCR_SYS_ERROR_WARN : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ SCR_SYSTEM_WARN_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ SCR_INDUCEMENT_EXIT_COND : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ SCR_UREA_LEVEL : 16|8@1+ (0.5,0.0) [0.0|100.0] "%" CLU
+ SG_ SCR_NO_REMAINING_RESTARTS : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ SCR_REMAINING_DISTANCE : 32|16@1+ (1.0,0.0) [0.0|25000.0] "km" CLU
+
+BO_ 1472 GW_Warning_PE: 8 BCM
+ SG_ Audio_VolumeDown : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Flh_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Fcnt_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Frh_Alarm : 52|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Rlh_Alarm : 56|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS
+ SG_ Pas_Spkr_Rcnt_Alarm : 58|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Rrh_Alarm : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS
+
+BO_ 1984 CAL_SAS11: 2 ESC
+ SG_ CCW : 0|4@1+ (1.0,0.0) [0.0|15.0] "" SAS
+ SG_ SAS_CID : 4|11@1+ (1.0,0.0) [0.0|2047.0] "" SAS
+
+BO_ 1456 CLU12: 4 CLU
+ SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0.0) [0.0|1677721.4] "km" _4WD,AAF,BCM,CUBIS,EMS,EPB,IBOX,LDWS_LKAS,SCC,TPMS
+
+BO_ 688 SAS11: 5 MDPS
+ SG_ SAS_Angle : 0|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" _4WD,ACU,AFLS,AVM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU,_4WD,ACU,AFLS,AVM,BCM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU
+ SG_ SAS_Speed : 16|8@1+ (4.0,0.0) [0.0|1016.0] "" AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU,AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU
+ SG_ SAS_Stat : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ MsgCount : 32|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS
+ SG_ CheckSum : 36|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS
+
+BO_ 1441 ACU12: 8 ACU
+ SG_ CR_Acu_SN : 0|64@1+ (1.0,0.0) [0.0|0.0] "" ODS
+
+BO_ 1440 ACU11: 8 ACU
+ SG_ CF_Ods_SNRcv : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Ods_IDRcv : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Ods_RZReq : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Abg_DepInhEnt : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Abg_DepEnt : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_PasBkl_FltStat : 28|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB
+ SG_ CF_DriBkl_FltStat : 29|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB
+ SG_ CF_PasBkl_Stat : 30|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,ODS,PSB,TMU
+ SG_ CF_DriBkl_Stat : 31|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB
+ SG_ CF_SWL_Ind : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX
+ SG_ CF_Acu_FltStat : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX
+ SG_ CF_Acu_ExtOfSab : 36|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,CUBIS,IBOX
+ SG_ CF_Acu_Dtc : 40|16@1+ (1.0,0.0) [0.0|65535.0] "" CUBIS,IBOX
+ SG_ CF_Acu_NumOfFlt : 56|8@1+ (1.0,0.0) [0.0|255.0] "" CUBIS,IBOX
+
+BO_ 1437 AHLS11: 8 AHLS
+ SG_ CF_Ahls_WarnLamp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Ahls_WarnMsg : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1434 PSB11: 2 PSB
+ SG_ PSB_LH_FAIL : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ PSB_LH_TGL : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ PSB_LH_ACT : 3|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy
+ SG_ PSB_RH_FAIL : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ PSB_RH_TGL : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ PSB_RH_ACT : 11|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy
+
+BO_ 916 TCS13: 8 ESC
+ SG_ aBasis : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC
+ SG_ BrakeLight : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,SCC
+ SG_ DCEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ AliveCounterTCS : 13|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,SCC
+ SG_ ACCReqLim : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC
+ SG_ TQI_ACC : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS
+ SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC
+ SG_ ACCEnable : 43|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC
+ SG_ DriverOverride : 45|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC
+ SG_ StandStill : 47|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ CheckSum_TCS3 : 48|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,SCC
+ SG_ ACC_EQUIP : 52|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ PBRAKE_ACT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ ACC_REQ : 54|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ DriverBraking : 55|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ CF_VSM_Coded : 56|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+ SG_ CF_VSM_Avail : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,SCC
+ SG_ CF_VSM_Handshake : 59|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+ SG_ CF_DriBkeStat : 60|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+ SG_ CF_VSM_ConfSwi : 61|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ AEB_EQUIP : 63|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+
+BO_ 1427 TPMS11: 6 BCM
+ SG_ TPMS_W_LAMP : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX
+ SG_ TREAD_W_LAMP : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX
+ SG_ POS_FL_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ POS_FR_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ POS_RL_W_LAMP : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ POS_RR_W_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ STATUS_TPMS : 8|3@1+ (1.0,0.0) [0.0|0.0] "" CLU
+ SG_ UNIT : 11|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ PRESSURE_FL : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ PRESSURE_FR : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ PRESSURE_RL : 32|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ PRESSURE_RR : 40|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+
+BO_ 915 TCS12: 4 ESC
+ SG_ SA_COUNT : 0|16@1+ (2.0,-32768.0) [-32768.0|98302.0] "" _4WD,ACU,MDPS
+ SG_ SA_Z_COUNT : 16|15@1+ (2.0,-32768.0) [-32768.0|32766.0] "" _4WD,ACU,MDPS
+ SG_ SA_Z_FLAG : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,MDPS
+
+BO_ 1170 EMS19: 8 EMS
+ SG_ CF_Ems_BrkReq : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,TCU
+ SG_ CF_Ems_DnShftReq : 1|4@1+ (1.0,0.0) [0.0|14.0] "" IBOX,TCU
+ SG_ CF_Ems_RepModChk : 5|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX
+ SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,IBOX
+ SG_ CF_Ems_DecelReq : 8|12@1+ (0.0010,-4.094) [-4.094|0.0] "m/s^2" ESC,IBOX,TCU
+ SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0.0) [0.0|4094.0] "hPa" CLU,IBOX
+ SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40.0) [0.0|254.0] "deg" CLU,IBOX
+ SG_ DPF_LAMP_STAT : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX
+ SG_ BAT_LAMP_STAT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41.0) [-41.0|85.5] "deg" AAF,IBOX
+ SG_ CF_Ems_OPSFail : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU
+ SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU
+
+BO_ 1425 AFLS11: 2 AFLS
+ SG_ AFLS_STAT : 1|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Afls_TrfChgStat : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Afls_LedHLStat : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 912 SPAS11: 7 SPAS
+ SG_ CF_Spas_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,MDPS
+ SG_ CF_Spas_TestMode : 4|2@1+ (1.0,0.0) [0.0|3.0] "" MDPS
+ SG_ CR_Spas_StrAngCmd : 8|16@1- (0.1,0.0) [-3276.8|3276.7] "" MDPS
+ SG_ CF_Spas_BeepAlarm : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Spas_Mode_Seq : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_AliveCnt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
+ SG_ CF_Spas_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
+ SG_ CF_Spas_PasVol : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CGW,CLU
+
+BO_ 1168 EPB11: 7 EPB
+ SG_ EPB_I_LAMP : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU,CUBIS,ESC,IBOX
+ SG_ EPB_F_LAMP : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,ESC,IBOX
+ SG_ EPB_ALARM : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC
+ SG_ EPB_CLU : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC
+ SG_ EPB_SWITCH : 16|2@1+ (1.0,0.0) [0.0|3.0] "" ESC,SCC
+ SG_ EPB_RBL : 18|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,ESC
+ SG_ EPB_STATUS : 19|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC,SCC,TCU
+ SG_ EPB_FRC_ERR : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,SCC,TCU
+ SG_ EPB_DBF_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ ESP_ACK : 25|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ EPB_DBF_REQ : 26|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ EPB_FAIL : 29|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,SCC
+ SG_ EPB_FORCE : 32|12@1+ (1.0,-1000.0) [-1000.0|3000.0] "" ESC
+ SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0.0) [0.0|2.54] "g" ESC
+
+BO_ 399 EMS_H12: 8 EMS
+ SG_ R_TqAcnApvC : 0|8@1+ (0.2,0.0) [0.0|51.0] "Nm" DATC,IBOX
+ SG_ R_PAcnC : 8|8@1+ (125.0,0.0) [0.0|31875.0] "hPa" DATC,IBOX
+ SG_ TQI_B : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ABS,ESC,IBOX
+ SG_ SLD_VS : 24|8@1+ (1.0,0.0) [0.0|255.0] "km/h" CLU,IBOX
+ SG_ CF_CdaStat : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AEMC,IBOX,TCU
+ SG_ CF_Ems_IsgStat : 35|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,MDPS,SMK,TCU
+ SG_ CF_Ems_OilChg : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_EtcLimpMod : 39|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ R_NEngIdlTgC : 40|8@1+ (10.0,0.0) [0.0|2550.0] "rpm" DATC,IBOX,TCU
+ SG_ CF_Ems_UpTarGr : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_DownTarGr : 49|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_DesCurGr : 50|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX
+ SG_ CF_Ems_SldAct : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_SldPosAct : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_HPresStat : 56|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ CF_Ems_IsgBuz : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_IdlStpFCO : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_FCopen : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_ActEcoAct : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU
+ SG_ CF_Ems_EngRunNorm : 61|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,IBOX,TCU
+ SG_ CF_Ems_IsgStat2 : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX,TCU
+
+BO_ 1419 LCA11: 8 LCA
+ SG_ CF_Lca_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Rcta_Stat : 4|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Lca_IndLeft : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Rcw_Stat : 10|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_RCW_Warning : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Lca_IndRight : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Lca_SndWan_Stat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_FR_SndWan : 20|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_FL_SndWan : 21|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_RR_SndWan : 22|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_RL_SndWan : 23|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_Lca_IndBriLeft : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_Lca_IndBriRight : 32|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_RCTA_IndBriLeft : 40|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_RCTA_IndBriRight : 48|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_RCTA_IndLeft : 56|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_RCTA_IndRight : 58|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_SndWarnForClu : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 906 ABS11: 8 ABS
+ SG_ ABS_DEF : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EMS,SPAS,TCU
+ SG_ EBD_DEF : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,SPAS,TCU
+ SG_ ABS_ACT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EPB,SPAS,TCU
+ SG_ ABS_W_LAMP : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,MTS,TMU
+ SG_ EBD_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ ABS_DIAG : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ ESS_STAT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS
+
+BO_ 903 WHL_PUL11: 6 ABS
+ SG_ WHL_PUL_FL : 0|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_PUL_FR : 8|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_PUL_RL : 16|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_PUL_RR : 24|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_DIR_FL : 32|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_DIR_FR : 34|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_DIR_RL : 36|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_DIR_RR : 38|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_PUL_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,SPAS,TPMS,EPB,LCA,LDWS_LKAS,SPAS,TPMS
+
+BO_ 1415 TMU11: 8 IBOX
+ SG_ CF_Tmu_VehSld : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Tmu_VehImmo : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Tmu_ReqRepCnd : 2|2@1+ (1.0,0.0) [0.0|3.0] "" EMS
+ SG_ CF_Tmu_AirconCtr : 4|1@1+ (1.0,0.0) [0.0|1.0] "" DATC
+ SG_ CF_Tmu_TempMd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" DATC
+ SG_ CF_Tmu_TempSet : 6|16@1+ (1.0,0.0) [0.0|20.0] "" DATC
+ SG_ CF_Tmu_DefrostCtr : 22|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,FATC
+ SG_ CF_Tmu_AliveCnt1 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" EMS
+
+BO_ 902 WHL_SPD11: 8 ABS
+ SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,ACU,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,BCM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,BCM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+
+BO_ 1414 EVP11: 3 EVP
+ SG_ CF_Evp_Stat : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 1412 AAF11: 8 AAF
+ SG_ CF_Aaf_ActFlapStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester
+ SG_ CF_Aaf_ModeStatus : 2|3@1+ (1.0,0.0) [0.0|7.0] "" AAF_Tester
+ SG_ CF_Aaf_WrnLamp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Aaf_ErrStatus : 6|10@1+ (1.0,0.0) [0.0|1023.0] "" AAF_Tester,EMS
+ SG_ CF_Aaf_OpenRqSysAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester
+ SG_ CF_Aaf_PStatus : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" AAF_Tester
+ SG_ CF_Aaf_OpenRqSysSol : 32|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester
+ SG_ CF_Aaf_SolFlapStatus : 40|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester
+ SG_ CF_Aaf_MilOnReq : 42|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 900 EMS17: 8 EMS
+ SG_ CF_Ems_PkpCurMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_HolCurMSV : 8|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_InjVBnkAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_InjVActSet : 24|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_DiagFulHDEV : 32|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CF_Ems_SwiOffIC1 : 33|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CF_Ems_SwiOffIC2 : 34|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CF_Ems_DiagReqHDEV : 38|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CR_Ems_DutyCycMSV : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" DI_BOX
+ SG_ CR_Ems_BatVolRly : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" DI_BOX
+
+BO_ 387 REA11: 8 REA
+ SG_ CF_EndBst_PwmDuH : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PwmDuL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PwmFqOutRng : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_HbriOverCur : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_HbriOverTemp : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PosSnsKOR : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PosSnsOSOR : 7|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_EepFlt : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_RomFlt : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_RamFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_CanFlt : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_AgH : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_AgL : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_ORVol : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CR_EndBst_ActPos : 16|16@1+ (0.117,0.0) [1.989|118.053] "" EMS
+ SG_ CR_EndBst_DemPos : 32|16@1+ (0.117,0.0) [0.0|119.691] "" EMS
+ SG_ CR_EndBst_HbriPwr : 48|16@1+ (0.045,0.0) [0.0|99.99] "%" EMS
+
+BO_ 1411 CUBIS11: 8 CUBIS
+ SG_ CF_Cubis_HUDisp : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+
+BO_ 899 FATC11: 8 DATC
+ SG_ CR_Fatc_TqAcnOut : 0|8@1+ (0.2,0.0) [0.0|50.8] "Nm" EMS,IBOX
+ SG_ CF_Fatc_AcnRqSwi : 8|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,EMS,IBOX
+ SG_ CF_Fatc_AcnCltEnRq : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_EcvFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_BlwrOn : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_FATC_Iden : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Fatc_BlwrMax : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX
+ SG_ CF_Fatc_EngStartReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_IsgStopReq : 16|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_CtrInf : 17|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX
+ SG_ CF_Fatc_MsgCnt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX
+ SG_ CR_Fatc_OutTemp : 24|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU,EMS,IBOX,SPAS,TCU,TPMS
+ SG_ CR_Fatc_OutTempSns : 32|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" AAF,AHLS,CLU,EMS,IBOX,SPAS,TCU
+ SG_ CF_Fatc_Compload : 40|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX
+ SG_ CF_Fatc_ActiveEco : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Fatc_AutoActivation : 44|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX
+ SG_ CF_Fatc_DefSw : 45|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,IBOX
+ SG_ CF_Fatc_PtcRlyStat : 46|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_ChkSum : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,IBOX,SPAS
+
+BO_ 129 EMS_DCT12: 8 EMS
+ SG_ CR_Ems_SoakTimeExt : 0|6@1+ (5.0,0.0) [0.0|315.0] "Min" TCU
+ SG_ BRAKE_ACT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" TCU
+ SG_ CF_Ems_EngOperStat : 8|8@1+ (1.0,0.0) [0.0|255.0] "" TCU
+ SG_ CR_Ems_IndAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" TCU
+ SG_ CF_Ems_Alive2 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Ems_ChkSum2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+
+BO_ 897 MDPS11: 8 MDPS
+ SG_ CF_Mdps_WLmp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,EMS,IBOX,SPAS
+ SG_ CF_Mdps_Flex : 2|3@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS
+ SG_ CF_Mdps_FlexDisp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Mdps_Stat : 7|4@1+ (1.0,0.0) [0.0|15.0] "" SPAS
+ SG_ CR_Mdps_DrvTq : 11|12@1+ (0.01,-20.48) [-20.48|20.46] "" SPAS
+ SG_ CF_Mdps_ALTRequest : 23|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" SPAS
+ SG_ CF_Mdps_AliveCnt : 40|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS
+ SG_ CF_Mdps_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS
+ SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1.0,0.0) [0.0|1.0] "flag" SPAS
+ SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1.0,0.0) [0.0|1.0] "flag" LDWS_LKAS
+ SG_ CF_Mdps_CurrMode : 59|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Mdps_Type : 61|2@1+ (1.0,0.0) [0.0|2.0] "" LDWS_LKAS,SPAS
+
+BO_ 896 DI_BOX13: 8 DI_BOX
+ SG_ CF_DiBox_HPreInjVConfStat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVStat1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVStat2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVPkp : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVBpt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_ErrRegFrtMSV : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_ErrRegSedMSV : 48|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SPIErrSedMSV : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_SPIErrFrtMSV : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_IDErrSedMSV : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_IDErrFrtMSV : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_IniStatMSV : 60|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 640 EMS13: 8 EMS
+ SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,LPI,SMK
+ SG_ LV_BFS_CFIRM : 1|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_CRASH : 2|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_VB_OFF_ACT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_GSL_MAP M : 4|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_ENG_TURN : 5|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ ERR_FUEL : 8|8@1+ (1.0,0.0) [0.0|255.0] "" LPI
+ SG_ EOS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" LPI
+ SG_ TCO : 24|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI
+ SG_ N_32 : 32|8@1+ (32.0,0.0) [0.0|8160.0] "rpm" LPI
+ SG_ MAF : 40|8@1+ (5.447,0.0) [0.0|1388.985] "mg/TDC" LPI
+ SG_ TIA : 48|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI
+ SG_ MAP m1 : 56|8@1+ (0.47058,0.0) [0.0|119.9979] "kPa" LPI
+ SG_ AMP m0 : 56|8@1+ (21.22,0.0) [0.0|5411.1] "hPa" LPI
+
+BO_ 128 EMS_DCT11: 8 EMS
+ SG_ PV_AV_CAN : 0|8@1+ (0.3906,0.0) [0.0|99.603] "%" TCU
+ SG_ TQ_STND : 8|6@1+ (10.0,0.0) [0.0|630.0] "Nm" TCU
+ SG_ F_N_ENG : 14|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ F_SUB_TQI : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" TCU
+ SG_ TQI_ACOR : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" IBOX,TCU
+ SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" TCU
+ SG_ TQI : 48|8@1+ (0.390625,0.0) [0.0|99.609375] "%" TCU
+ SG_ CF_Ems_Alive : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Ems_ChkSum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+
+BO_ 1407 HU_MON_PE_01: 8 CLU
+ SG_ HU_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" AVM,PGS
+
+BO_ 127 CGW5: 8 BCM
+ SG_ C_StopLampLhOpenSts : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_StopLampRhOpenSts : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HMSLOpenSts : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampLowLhOpenSts : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampLowRhOpenSts : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampHighLhOpenSts : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampHighRhOpenSts : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_DRLLampLhOpenSts : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_DRLLampRhOpenSts : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearFOGLhOpenSts : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearFOGRhOpenSts : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_SBendingLhOpenSts : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_SBendingRhOpenSts : 22|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 1151 ESP11: 6 ESC
+ SG_ AVH_STAT : 0|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,TCU
+ SG_ LDM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EPB,TCU
+ SG_ REQ_EPB_ACT : 3|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,TCU
+ SG_ REQ_EPB_STAT : 5|1@1+ (1.0,0.0) [0.0|1.0] "" EPB
+ SG_ ECD_ACT : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EPB
+ SG_ _4WD_LIM_REQ : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS
+ SG_ ROL_CNT_ESP : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,TCU
+ SG_ _4WD_TQC_LIM : 16|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" _4WD,EMS
+ SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" _4WD,EMS
+ SG_ _4WD_OPEN : 40|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS
+ SG_ _4WD_LIM_MODE : 42|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD
+
+BO_ 1397 HU_AVM_E_00: 8 CLU
+ SG_ HU_AVM_Cal_Cmd : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_Cal_Method : 4|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+ SG_ HU_AVM_Save_Controlpoint : 6|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+ SG_ HU_AVM_PT_X : 8|12@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_RearViewPointOpt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_PT_Y : 24|12@1+ (1.0,0.0) [0.0|4095.0] "" AVM,PGS
+ SG_ HU_AVM_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_SelectedMenu : 40|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS
+ SG_ HU_AVM_CameraOff : 45|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+ SG_ HU_AVM_Option : 48|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_CrossLineMove_Cmd : 52|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_RearView_Option : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_FrontView_Option : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+
+BO_ 1395 HU_AVM_E_01: 8 CLU
+ SG_ HU_PGSSelectedMenu : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_PGSOption : 8|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS
+ SG_ HU_AVM_ParkingAssistMenu : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_ParkingAssistSB : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+
+BO_ 1393 OPI11: 5 OPI
+ SG_ CR_Opi_Spd_Rpm : 0|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" TCU
+ SG_ CF_Opi_Over_Temp : 8|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Opi_Over_Cur : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU
+ SG_ CF_Opi_Over_Vol : 10|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Opi_Hall_Fail : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU
+ SG_ CF_Opi_Flt : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU
+ SG_ CF_Opi_Motor_Dir : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Opi_Romver : 16|8@1+ (1.0,0.0) [0.0|255.0] "" TCU
+ SG_ CF_Opi_PWM_Rate : 24|12@1+ (1.0,0.0) [0.0|100.0] "%" TCU
+
+BO_ 625 LPI11: 8 LPI
+ SG_ FUP_LPG_MMV : 0|8@1+ (128.0,0.0) [0.0|32640.0] "hPa" EMS
+ SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_GAS_OK : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_FUP_ENA_THD : 11|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,EMS,SMK
+ SG_ LPI_OBD : 12|4@1+ (1.0,0.0) [0.0|15.0] "" EMS
+ SG_ ERR_GAS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05E-5,0.0) [0.0|1.9988175] "" EMS
+ SG_ FTL_AFU : 40|8@1+ (0.392,0.0) [0.0|99.96] "%" EMS
+ SG_ BFS_CYL : 48|8@1+ (1.0,0.0) [0.0|6.0] "Cyl Nr." EMS
+ SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 356 VSM11: 4 ESC
+ SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" MDPS
+ SG_ CF_Esc_Act : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,MDPS
+ SG_ CF_Esc_CtrMode : 13|3@1+ (1.0,0.0) [0.0|7.0] "" MDPS
+ SG_ CF_Esc_Def : 16|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Esc_AliveCnt : 17|4@1+ (1.0,0.0) [0.0|15.0] "" LDWS_LKAS,MDPS
+ SG_ CF_Esc_Chksum : 24|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,MDPS
+
+BO_ 1379 PGS_HU_PE_01: 8 PGS
+ SG_ PGS_State : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ PGS_ParkGuideState : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ PGS_Option : 16|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ PGS_Version : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU
+
+BO_ 354 TCU_DCT13: 3 TCU
+ SG_ Clutch_Driving_Tq : 0|10@1+ (1.0,-512.0) [0.0|0.0] "Nm" ESC
+ SG_ Cluster_Engine_RPM : 10|13@1+ (0.9766,0.0) [0.0|0.0] "" CLU
+ SG_ Cluster_Engine_RPM_Flag : 23|1@1+ (1.0,0.0) [0.0|0.0] "" CLU
+
+BO_ 1378 HUD11: 4 HUD
+ SG_ CF_Hud_HeightStaus : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ CF_Hud_PBackStatus : 6|2@1+ (1.0,0.0) [0.0|0.0] "" BCM,CLU
+ SG_ CF_Hud_Brightness : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+
+BO_ 608 EMS16: 8 EMS
+ SG_ TQI_MIN : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU
+ SG_ TQI : 8|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU
+ SG_ TQI_TARGET : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EPB,ESC,IBOX,TCU
+ SG_ GLOW_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,IBOX,SMK
+ SG_ CRUISE_LAMP_M : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU
+ SG_ CRUISE_LAMP_S : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU
+ SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ ENG_STAT : 28|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,AHLS,AVM,BCM,CLU,EPB,ESC,EVP,FPCM,IBOX,LCA,LDWS_LKAS,MDPS,SCC,SMK,TCU
+ SG_ SOAK_TIME_ERROR : 31|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EPB,IBOX,TCU
+ SG_ SOAK_TIME : 32|8@1+ (1.0,0.0) [0.0|255.0] "Min" _4WD,DATC,EPB,IBOX,TCU
+ SG_ TQI_MAX : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU
+ SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [-35.625|60.0] "" IBOX,TCU
+ SG_ Checksum : 56|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ AliveCounter : 60|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ CF_Ems_AclAct : 62|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,SCC
+
+BO_ 1371 AVM_HU_PE_00: 8 AVM
+ SG_ AVM_View : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ AVM_Display_Message : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ AVM_Popup_Msg : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_Ready : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_ParkingAssist_Step : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_FrontBtn_Type : 28|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_Option : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_HU_RearView_Option : 40|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_HU_FrontView_Option : 44|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_Version : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU
+
+BO_ 1370 HU_AVM_PE_00: 8 CLU
+ SG_ HU_AVM_Status : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+
+BO_ 1369 CGW4: 8 BCM
+ SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD
+ SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_RLWdwState : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_RRWdwState : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_AstWdwStat : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_MemoryEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBACKStop : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD
+ SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 1367 EngFrzFrm12: 8 EMS
+ SG_ PID_06h : 0|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_07h : 8|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_08h : 16|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_09h : 24|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_0Bh : 32|8@1+ (1.0,0.0) [0.0|255.0] "kPa" AAF,IBOX,TCU
+ SG_ PID_23h : 40|16@1+ (10.0,0.0) [0.0|655350.0] "kPa" AAF,IBOX,TCU
+
+BO_ 1366 EngFrzFrm11: 8 EMS
+ SG_ PID_04h : 0|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU
+ SG_ PID_05h : 8|8@1+ (1.0,-40.0) [-40.0|215.0] "deg" AAF,TCU
+ SG_ PID_0Ch : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" AAF,TCU
+ SG_ PID_0Dh : 32|8@1+ (1.0,0.0) [0.0|255.0] "km/h" AAF,TCU
+ SG_ PID_11h : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU
+ SG_ PID_03h : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" AAF,TCU
+
+BO_ 1365 FPCM11: 8 FPCM
+ SG_ CR_Fpcm_LPActPre : 0|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" EMS
+ SG_ CF_Fpcm_LPPumpOverCur : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrHi : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrDisc : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrShort : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_LPPumpDiscShort : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_LP_System_Error : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrSigErr : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_LPCtrCirFlt : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 852 LVR11: 7 LVR
+ SG_ CF_Lvr_GearInf : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU
+ SG_ CF_Lvr_PRelStat : 4|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,SMK,TCU
+ SG_ CF_Lvr_BkeAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Lvr_NFnStat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Lvr_PosInf : 8|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_PosCpl : 12|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_UlkButStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" TCU
+ SG_ CF_Lvr_PNStat : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1.0,0.0) [0.0|8191.0] "" CLU,TCU
+ SG_ CF_Lvr_AC : 48|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_CS : 52|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+
+BO_ 1363 CGW2: 8 BCM
+ SG_ CF_Gway_GwayDiagState : 0|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_DDMDiagState : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SCMDiagState : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_PSMDiagState : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SJBDiagState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_IPMDiagState : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_LDMFail : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS,LDWS_LKAS
+ SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1.0,0.0) [0.0|63.0] "" CLU,Dummy
+ SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_CLUSwMode : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_AutoLightValue : 16|1@1+ (1.0,0.0) [0.0|1.0] "" LCA,LCA
+ SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_AvTail : 20|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,SNV,SNV
+ SG_ CF_Gway_RearFogAct : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ExtTailAct : 22|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,CLU,LCA,PGS,SPAS,AVM,LCA,PGS,SPAS
+ SG_ CF_Gway_RRDrSw : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_RLDrSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_IntTailAct : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_CountryCfg : 26|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,Dummy
+ SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,EMS,LDWS_LKAS,AFLS,EMS,LDWS_LKAS
+ SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV
+ SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV
+ SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_IDoutWarn : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ImmoLp : 40|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_BCMRKEID : 41|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+ SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SSBWarn : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SMKFobID : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+ SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+ SG_ CF_Gway_AutoLightOption : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_KeyoutLp : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,Dummy
+ SG_ CF_Gway_WngBuz : 61|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+
+BO_ 339 TCS11: 8 ESC
+ SG_ TCS_REQ : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,TCU
+ SG_ MSR_C_REQ : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,SCC,TCU
+ SG_ TCS_PAS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,SCC,SPAS,TCU
+ SG_ TCS_GSC : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,TCU
+ SG_ CF_Esc_LimoInfo : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,SCC
+ SG_ ABS_DIAG : 6|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB
+ SG_ ABS_DEF : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,SCC,SPAS,TCU
+ SG_ TCS_DEF : 8|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU
+ SG_ TCS_CTL : 9|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU
+ SG_ ABS_ACT : 10|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU
+ SG_ EBD_DEF : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SPAS,TCU
+ SG_ ESP_PAS : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU,EMS,EPB,LDWS_LKAS,SCC,TCU
+ SG_ ESP_DEF : 13|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,TCU
+ SG_ ESP_CTL : 14|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU
+ SG_ TCS_MFRN : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,TCU
+ SG_ DBC_CTL : 16|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB
+ SG_ DBC_PAS : 17|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB
+ SG_ DBC_DEF : 18|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB
+ SG_ HAC_CTL : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU
+ SG_ HAC_PAS : 20|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU
+ SG_ HAC_DEF : 21|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU
+ SG_ ESS_STAT : 22|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS,EPB
+ SG_ TQI_TCS : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU
+ SG_ TQI_MSR : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU
+ SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU
+ SG_ CF_Esc_BrkCtl : 48|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ BLA_CTL : 49|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CGW,CLU
+ SG_ AliveCounter_TCS1 : 52|4@1+ (1.0,0.0) [0.0|14.0] "" EMS,EPB,LDWS_LKAS
+ SG_ CheckSum_TCS1 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,EPB,LDWS_LKAS
+
+BO_ 1362 SNV11: 4 SNV
+ SG_ CF_SNV_DisplayControl : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD
+ SG_ CF_Snv_BeepWarning : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD
+ SG_ CF_Snv_WarningMessage : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,HUD
+ SG_ CF_Snv_DetectionEnable : 7|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,HUD
+ SG_ CF_Snv_PedestrianDetect : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD
+ SG_ CF_Snv_IRLampControl : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD
+
+BO_ 593 MDPS12: 8 MDPS
+ SG_ CR_Mdps_StrColTq : 0|11@1+ (0.0078125,-8.0) [-8.0|7.9921875] "Nm" LDWS_LKAS
+ SG_ CF_Mdps_Def : 11|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_ToiActive : 13|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_ToiFlt : 14|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_FailStat : 15|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS
+ SG_ CF_Mdps_Chksum2 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS
+ SG_ CF_Mdps_SErr : 37|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" ESC
+ SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [-204.8|204.7] "" ESC,LDWS_LKAS
+
+BO_ 1360 IAP11: 3 IAP
+ SG_ CF_Iap_EcoPmodSwi : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Iap_EcoPmodAct : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Iap_ReqWarn : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1356 TCU_DCT14: 8 TCU
+ SG_ Vehicle_Stop_Time : 0|5@1+ (1.0,0.0) [0.0|0.0] "" CLU
+ SG_ HILL_HOLD_WARNING : 5|1@1+ (1.0,0.0) [0.0|0.0] "" CLU
+
+BO_ 1353 BAT11: 8 EMS
+ SG_ BAT_SNSR_I : 0|16@1+ (0.01,-327.0) [-327.0|328.0] "A" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SOC : 16|8@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_V : 24|14@1+ (0.0010,6.0) [6.0|18.0] "V" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_Temp : 38|9@1- (0.5,-40.0) [-40.0|125.0] "deg" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_State : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SOH : 48|7@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_Invalid : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SOF : 56|7@1+ (0.1,0.0) [0.0|12.0] "V" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_Error : 63|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU
+
+BO_ 1351 EMS15: 8 EMS
+ SG_ ECGPOvrd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,SCC
+ SG_ QECACC : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ ECFail : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ SwitchOffCondExt : 3|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ BLECFail : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ CF_Ems_IsaAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ FA_PV_CAN : 8|8@1+ (0.3906,0.0) [0.0|99.2] "%" IBOX,LDWS_LKAS,TCU
+ SG_ IntAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,ECS,EPB,IBOX,TCU
+ SG_ STATE_DC_OBD : 24|7@1+ (1.0,0.0) [0.0|127.0] "" IBOX,TCU
+ SG_ INH_DC_OBD : 31|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ CTR_IG_CYC_OBD : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" ACU,IBOX,TCU
+ SG_ CTR_CDN_OBD : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" IBOX,TCU
+
+BO_ 1350 DI_BOX12: 8 DI_BOX
+ SG_ CF_DiBox_FrtInjVDiagReg0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_FrtInjVDiagReg1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_FrtInjVDiagReg2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SedInjVDiagReg0 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SedInjVDiagReg1 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SedInjVDiagReg2 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CR_DiBox_BatVol : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" EMS
+ SG_ CF_DiBox_SedInjVChg : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_FrtInjVChg : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_SedInjVErrSPI : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_FrtInjVErrSPI : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 1349 EMS14: 8 EMS
+ SG_ IMMO_LAMP_STAT : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ L_MIL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX
+ SG_ IM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ AMP_CAN : 3|5@1+ (10.731613,458.98) [458.98|791.660003] "mmHg" CLU,IBOX,TCU,TPMS
+ SG_ BAT_Alt_FR_Duty : 8|8@1+ (0.4,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU
+ SG_ VB : 24|8@1+ (0.1015625,0.0) [0.0|25.8984375] "V" CLU,CUBIS,DATC,EPB,FPCM,IBOX
+ SG_ EMS_VS : 32|12@1+ (0.0625,0.0) [0.0|255.875] "km/h" CLU
+ SG_ TEMP_FUEL : 56|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" FPCM
+
+BO_ 68 DATC11: 8 DATC
+ SG_ CF_Datc_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_Datc_VerMaj : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_Datc_VerMin : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CR_Datc_OutTempC : 24|8@1+ (0.5,-41.0) [-41.0|86.5] "deg" CLU,FPCM
+ SG_ CR_Datc_OutTempF : 32|8@1+ (1.0,-42.0) [-42.0|213.0] "deg" CLU
+ SG_ CF_Datc_IncarTemp : 40|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU
+
+BO_ 67 DATC13: 8 DATC
+ SG_ CF_Datc_TempDispUnit : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX
+ SG_ CF_Datc_ModDisp : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_IonClean : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_IntakeDisp : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_AutoDisp : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_FrDefLed : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX
+ SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_AqsDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_AcDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_OpSts : 25|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_DualDisp : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_PwrInf : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_RearManual : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Datc_RearOffDisp : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearModDisp : 48|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_PSModDisp : 56|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX
+
+BO_ 66 DATC12: 8 DATC
+ SG_ CR_Datc_DrTempDispC : 0|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX
+ SG_ CR_Datc_DrTempDispF : 8|8@1+ (1.0,56.0) [58.0|90.0] "" CLU,IBOX
+ SG_ CR_Datc_PsTempDispC : 16|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX
+ SG_ CR_Datc_PsTempDispF : 24|8@1+ (1.0,56.0) [58.0|90.0] "" CLU,IBOX
+ SG_ CR_Datc_RearDrTempDispC : 40|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU
+ SG_ CR_Datc_RearDrTempDispF : 48|8@1+ (1.0,58.0) [58.0|90.0] "" CLU
+ SG_ CF_Datc_CO2_Warning : 56|8@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1345 CGW1: 8 BCM
+ SG_ CF_Gway_IGNSw : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC
+ SG_ CF_Gway_RKECmd : 3|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX
+ SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX
+ SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX
+ SG_ CF_Gway_DrvDrSw : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU
+ SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,PSB,TCU,EMS,EPB,ESC,IBOX,PSB,TCU
+ SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,ECS,EMS,EPB,ESC,IBOX
+ SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,PSB,IBOX,PSB
+ SG_ CF_Gway_SMKOption : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,EMS,IBOX,SMK
+ SG_ CF_Gway_HoodSw : 17|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,EPB,ESC,IBOX,EMS,EPB,ESC,IBOX
+ SG_ CF_Gway_TurnSigLh : 19|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC
+ SG_ CF_Gway_WiperIntT : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperIntSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperLowSw : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperHighSw : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_RainSnsState : 28|3@1+ (1.0,0.0) [0.0|7.0] "" AFLS,EMS,IBOX,LDWS_LKAS,AFLS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HeadLampLow : 31|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,SNV,AFLS,EMS,IBOX,LDWS_LKAS,SNV
+ SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,AFLS,EMS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HazardSw : 33|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS,ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS
+ SG_ CF_Gway_AstDrSw : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,IBOX
+ SG_ CF_Gway_DefoggerRly : 36|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX
+ SG_ CF_Gway_ALightStat : 37|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_LightSwState : 38|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_TSigRHSw : 41|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_TSigLHSw : 42|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_StarterRlyState : 44|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX,SMK
+ SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK
+ SG_ CF_Gway_WiperMistSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK
+ SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX
+ SG_ CF_Gway_PassingSW : 51|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HBAControlMode : 52|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HLpHighSw : 53|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_InhibitRMT : 54|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,MDPS,PGS,SCC,SPAS,TPMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,PGS,SCC,SPAS,TPMS
+ SG_ CF_Gway_RainSnsOption : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_SunRoofOpenState : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX,DATC,IBOX
+ SG_ CF_Gway_Ign1 : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_Ign2 : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IBOX,SCC,ESC,IBOX,SCC
+ SG_ CF_Gway_TurnSigRh : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC
+
+BO_ 64 DATC14: 8 DATC
+ SG_ CF_Datc_AqsLevelOut : 0|4@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_DiagMode : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CR_Datc_SelfDiagCode : 8|8@1+ (1.0,-1.0) [0.0|254.0] "" CLU
+ SG_ DATC_SyncDisp : 16|4@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_OffDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_SmartVentDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_SmartVentOnOffStatus : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_AutoDefogSysOff_Disp : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_ADSDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 832 LKAS11: 8 LDWS_LKAS
+ SG_ CF_Lkas_LdwsSysState : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX,PSB
+ SG_ CF_Lkas_SysWarning : 6|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Lkas_LdwsLHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB
+ SG_ CF_Lkas_LdwsRHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB
+ SG_ CF_Lkas_HbaLamp : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Lkas_FcwBasReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC
+ SG_ CR_Lkas_StrToqReq : 16|11@1+ (0.0078125,-8.0) [-8.0|8.0] "Nm" MDPS
+ SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Lkas_HbaSysState : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM,CLU
+ SG_ CF_Lkas_FcwOpt : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lkas_HbaOpt : 34|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CGW
+ SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS
+ SG_ CF_Lkas_FcwSysState : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Lkas_FcwCollisionWarning : 43|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lkas_FusionState : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Lkas_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
+ SG_ CF_Lkas_FcwOpt_USM : 56|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Lkas_LdwsOpt_USM : 59|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,MDPS
+
+BO_ 1342 LKAS12: 6 LDWS_LKAS
+ SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_LkasTsrStatus : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1338 TMU_GW_E_01: 8 CLU
+ SG_ CF_Gway_TeleReqDrLock : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqDrUnlock : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqHazard : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqHorn : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqEngineOperate : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 1078 PAS11: 4 BCM
+ SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM
+ SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM
+ SG_ CF_Gway_PASRsound : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM
+ SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM
+ SG_ CF_Gway_PASFsound : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM
+ SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM
+ SG_ CF_Gway_PASCheckSound : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASSystemOn : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASOption : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PASDistance : 28|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 48 EMS18: 6 EMS
+ SG_ CF_Ems_DC1NumPerMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_DC2NumPerMSV : 8|16@1+ (1.0,0.0) [0.0|65535.0] "" DI_BOX
+ SG_ CR_Ems_DutyCyc1MSV : 24|8@1+ (0.1953,0.0) [0.0|49.8] "%" DI_BOX
+ SG_ CR_Ems_DutyCyc2MSV : 32|8@1+ (0.13725,0.0) [0.0|35.0] "%" DI_BOX
+ SG_ CR_Ems_DutyCyc3MSV : 40|8@1+ (0.392,0.0) [0.0|100.0] "%" DI_BOX
+
+BO_ 1322 CLU15: 8 CLU
+ SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1.0,0.0) [0.0|255.0] "" BCM
+ SG_ CF_Clu_InhibitP : 9|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_InhibitR : 10|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_InhibitN : 11|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_InhibitD : 12|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_HudInfoSet : 13|7@1+ (1.0,0.0) [0.0|127.0] "" HUD
+ SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudSet : 30|1@1+ (1.0,0.0) [0.0|1.0] "" HUD
+ SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_LanguageInfo : 33|5@1+ (1.0,0.0) [0.0|31.0] "" BCM,PGS
+ SG_ CF_Clu_ClusterSound : 38|1@1- (1.0,0.0) [0.0|0.0] "" BCM,CGW,FATC
+
+BO_ 1066 _4WD13: 6 _4WD
+ SG_ _4WD_CURRENT : 0|8@1+ (0.390625,0.0) [-50.0|50.0] "A" TCU
+ SG_ _4WD_POSITION : 8|16@1+ (0.015625,0.0) [-180.0|180.0] "Deg" TCU
+ SG_ _4WD_CLU_THERM_STR : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" TCU
+ SG_ _4WD_STATUS : 32|8@1+ (1.0,0.0) [0.0|15.0] "" ESC,TCU
+
+BO_ 1065 _4WD12: 8 _4WD
+ SG_ Ster_Pos : 0|16@1+ (1.0,-600.0) [-600.0|600.0] "Deg" ESC
+ SG_ FRSS : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ FLSS : 24|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ RRSS : 32|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ RLSS : 40|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ CLU_PRES : 48|16@1+ (0.0625,-50.0) [-50.0|50.0] "Bar" ESC
+
+BO_ 809 EMS12: 8 EMS
+ SG_ CONF_TCU m1 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LCA,SMK
+ SG_ CAN_VERS m0 : 0|6@1+ (1.0,0.0) [0.0|7.7] "" _4WD,ABS,ESC,IBOX
+ SG_ TQ_STND m3 : 0|6@1+ (10.0,0.0) [0.0|630.0] "Nm" _4WD,DATC,ECS,EPB,ESC,FATC,IBOX
+ SG_ OBD_FRF_ACK m2 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ESC,IBOX
+ SG_ MUL_CODE M : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,BCM,CLU,DATC,ECS,EPB,ESC,IBOX,LCA,SMK,TCU
+ SG_ TEMP_ENG : 8|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,BCM,CLU,DATC,EPB,ESC,IBOX,SMK,TCU
+ SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0.0) [0.0|1.99155] "" IBOX,TCU
+ SG_ VB_OFF_ACT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ ACK_ES : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,IBOX
+ SG_ CONF_MIL_FMY : 26|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,IBOX,TCU
+ SG_ OD_OFF_REQ : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ ACC_ACT : 30|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,CLU,ESC,IAP,IBOX,SCC,TCU
+ SG_ CLU_ACK : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EPB,ESC,IBOX
+ SG_ BRAKE_ACT : 32|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,AFLS,CLU,DATC,ECS,EPB,ESC,IBOX,LDWS_LKAS,TCU
+ SG_ ENG_CHR : 34|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,ABS,ACU,CLU,DATC,EPB,ESC,FATC,IBOX,SCC,SMK,TCU
+ SG_ GP_CTL : 38|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX
+ SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [-15.0234742|104.6948357] "%" _4WD,ABS,ACU,CLU,DATC,ECS,EPB,ESC,IBOX,TCU
+ SG_ PV_AV_CAN : 48|8@1+ (0.3906,0.0) [0.0|99.603] "%" _4WD,AAF,ABS,ACU,AFLS,CLU,DATC,EPB,ESC,IAP,IBOX,LDWS_LKAS,SCC,TCU
+ SG_ ENG_VOL : 56|8@1+ (0.1,0.0) [0.0|25.5] "liter" _4WD,ABS,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,SCC,SMK
+
+BO_ 1064 _4WD11: 8 _4WD
+ SG_ _4WD_TYPE : 0|2@1+ (1.0,0.0) [0.0|3.0] "" ACU,ESC,TPMS
+ SG_ _4WD_SUPPORT : 2|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,ESC,TPMS
+ SG_ _4WD_ERR : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC
+ SG_ CLU_DUTY : 16|8@1+ (1.0,0.0) [0.0|64.0] "%" ABS,ESC
+ SG_ R_TIRE : 24|8@1+ (1.0,200.0) [200.0|455.0] "mm" ABS,ESC,TPMS
+ SG_ _4WD_SW : 32|8@1+ (1.0,0.0) [0.0|9.9] "" ESC
+ SG_ _2H_ACT : 40|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC
+ SG_ _4H_ACT : 41|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS
+ SG_ LOW_ACT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TCU,TPMS
+ SG_ AUTO_ACT : 43|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TPMS
+ SG_ LOCK_ACT : 44|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS
+ SG_ _4WD_TQC_CUR : 48|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" ABS,ESC
+
+BO_ 1319 HU_GW_E_01: 8 CLU
+ SG_ C_ADrLNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ C_ADrUNValueSet : 4|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ C_TwUnNValueSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_ABuzzerNValueSet : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_ArmWKeyNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_PSMNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_SCMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_HLEscortNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_WELNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_TriTurnLNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_SNVWarnNValueSet : 24|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_LkasWarnNValueSet : 26|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 1318 HU_GW_E_00: 8 CLU
+ SG_ C_ADrLURValueReq : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_TwUnRValueReq : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_AlarmRValueReq : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_IMSRValueReq : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_HLEscortRValueReq : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_WELRValueReq : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_TriTurnLRValueReq : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_SNVWarnRValueReq : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_LkasWarnRValueReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 1317 GW_HU_E_01: 8 BCM
+ SG_ C_ADrLRValue : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_ADrURValue : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_TwUnRValue : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ABuzzerRValue : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ArmWKeyRValue : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_PSMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SCMRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_HLEscortRValue : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_WELRValue : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TriTurnLRValue : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1316 GW_HU_E_00: 8 BCM
+ SG_ C_ADrLUNValueConf : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TwUnNValueConf : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_AlarmNValueConf : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_PSMNValueConf : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SCMNValueConf : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_HLEscortNValueConf : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_WELNValueConf : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TriTurnLNValueConf : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1315 GW_SWRC_PE: 8 BCM
+ SG_ C_ModeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_MuteSW : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SeekDnSW : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SeekUpSW : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_BTPhoneCallSW : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_BTPhoneHangUpSW : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_DISCDownSW : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_DISCUpSW : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SdsSW : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_MTSSW : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_VolDnSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_VolUpSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1314 GW_IPM_PE_1: 8 BCM
+ SG_ C_AV_Tail : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ParkingBrakeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_RKECMD : 4|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ C_BAState : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_IGNSW : 12|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_CountryCfg : 16|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_TailLampActivity : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ RearSW_RSELockOnOff : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SMKTeleCrankingState : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SMKTeleCrankingFailRes : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1057 SCC12: 8 SCC
+ SG_ CF_VSM_Prefill : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ CF_VSM_DecCmdAct : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ CF_VSM_HBACmd : 2|2@1+ (1.0,0.0) [0.0|3.0] "" ESC
+ SG_ CF_VSM_Warn : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IAP
+ SG_ CF_VSM_Stat : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,PSB
+ SG_ CF_VSM_BeltCmd : 8|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,PSB
+ SG_ ACCFailInfo : 11|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,ESC,IBOX
+ SG_ ACCMode : 13|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IBOX,TCU
+ SG_ StopReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EPB,ESC
+ SG_ CR_VSM_DecCmd : 16|8@1+ (0.01,0.0) [0.0|2.55] "g" ESC
+ SG_ aReqMax : 24|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,ESC,TCU
+ SG_ TakeOverReq : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,ESC,TCU
+ SG_ PreFill : 36|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,TCU
+ SG_ aReqMin : 37|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,ESC,TCU
+ SG_ CF_VSM_ConfMode : 48|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC
+ SG_ AEB_Failinfo : 50|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC
+ SG_ AEB_Status : 52|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC
+ SG_ AEB_CmdAct : 54|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ AEB_StopReq : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,ESC
+ SG_ CR_VSM_Alive : 56|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,PSB
+ SG_ CR_VSM_ChkSum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,PSB
+
+BO_ 1313 GW_DDM_PE: 8 BCM
+ SG_ C_DRVDoorStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ASTDoorStatus : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_RLDoorStatus : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_RRDoorStatus : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TrunkStatus : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_OSMirrorStatus : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1056 SCC11: 8 SCC
+ SG_ MainMode_ACC : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,ESC
+ SG_ SCCInfoDisplay : 1|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ESC
+ SG_ AliveCounterACC : 4|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,EMS,ESC,TCU
+ SG_ VSetDis : 8|8@1+ (1.0,0.0) [0.0|255.0] "km/h or MPH" CLU,ESC,TCU
+ SG_ ObjValid : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,ESC,TCU
+ SG_ DriverAlertDisplay : 17|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC
+ SG_ TauGapSet : 19|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ESC,TCU
+ SG_ ACC_ObjStatus : 22|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,ESC
+ SG_ ACC_ObjLatPos : 24|9@1+ (0.1,-20.0) [-20.0|31.1] "m" ABS,ESC
+ SG_ ACC_ObjDist : 33|11@1+ (0.1,0.0) [0.0|204.7] "m" ABS,ESC
+ SG_ ACC_ObjRelSpd : 44|12@1+ (0.1,-170.0) [-170.0|239.5] "m/s" ABS,ESC
+ SG_ Navi_SCC_Curve_Status : 56|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Navi_SCC_Curve_Act : 58|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Navi_SCC_Camera_Act : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Navi_SCC_Camera_Status : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1312 CGW3: 8 BCM
+ SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC
+ SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC
+ SG_ CF_Hoodsw_memory : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EMS
+ SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [-40.0|60.0] "deg" AAF,CLU,DATC,EMS,SPAS,AAF,DATC,EMS,SPAS
+
+BO_ 544 ESP12: 8 ESC
+ SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,TCU
+ SG_ LAT_ACCEL_STAT : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU
+ SG_ LAT_ACCEL_DIAG : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU
+ SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ LONG_ACCEL_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ LONG_ACCEL_DIAG : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ CYL_PRES : 26|12@1+ (0.1,0.0) [0.0|409.5] "Bar" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU
+ SG_ CYL_PRES_STAT : 38|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU
+ SG_ CYL_PRESS_DIAG : 39|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,PSB,SCC,TCU
+ SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [-40.95|40.96] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU
+ SG_ YAW_RATE_STAT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU
+ SG_ YAW_RATE_DIAG : 54|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU
+ SG_ ESP12_AliveCounter : 56|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ ESP12_Checksum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+
+BO_ 1307 CLU16: 8 CLU
+ SG_ CF_Clu_TirePressUnitNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" TPMS
+ SG_ CF_Clu_SlifNValueSet : 3|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Clu_RearWiperNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 790 EMS11: 8 EMS
+ SG_ SWI_IGK : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,ACU,AHLS,CUBIS,DI_BOX,ECS,EPB,ESC,IBOX,LDWS_LKAS,MDPS,REA,SAS,SCC,TCU
+ SG_ F_N_ENG : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,IBOX,MDPS,SCC,TCU
+ SG_ ACK_TCS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ PUC_STAT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,DATC,IBOX,TCU
+ SG_ TQ_COR_STAT : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ESC,IBOX,TCU
+ SG_ RLY_AC : 6|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,IBOX,TCU
+ SG_ F_SUB_TQI : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EPB,ESC,IBOX,TCU
+ SG_ TQI_ACOR : 8|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU
+ SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,FPCM,IBOX,MDPS,SCC,TCU
+ SG_ TQI : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,ECS,EPB,ESC,IBOX,TCU
+ SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU
+ SG_ VS : 48|8@1+ (1.0,0.0) [0.0|254.0] "km/h" _4WD,AAF,ACU,AHLS,BCM,CLU,DATC,ECS,EPB,IBOX,LCA,LDWS_LKAS,LVR,MDPS,ODS,SCC,SMK,SPAS,TCU,TPMS
+ SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0.0) [0.0|2.0] "" _4WD,IBOX,TCU
+
+BO_ 1301 CLU14: 8 CLU
+ SG_ CF_Clu_ADrUNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_ADrLNValueSet : 3|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_EscortHLNValueSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_DoorLSNValueSet : 8|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_PSMNValueSet : 11|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_TTUnlockNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_PTGMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_SCMNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_WlightNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_TempUnitNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,DATC
+ SG_ CF_Clu_MoodLpNValueSet : 24|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_TrfChgSet : 27|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS
+ SG_ CF_Clu_OTTurnNValueSet : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_LcaNValueSet : 32|2@1+ (1.0,0.0) [0.0|3.0] "" LCA
+ SG_ CF_Clu_RctaNValueSet : 34|2@1+ (1.0,0.0) [0.0|3.0] "" LCA
+ SG_ CF_Clu_RcwNValueSet : 36|2@1+ (1.0,0.0) [0.0|3.0] "" LCA
+ SG_ CF_Clu_EscOffNValueSet : 38|3@1+ (1.0,0.0) [0.0|7.0] "" ESC
+ SG_ CF_Clu_SccNaviCrvNValueSet : 41|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Clu_SccNaviCamNValueSet : 43|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Clu_SccAebNValueSet : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Clu_LkasModeNValueSet : 47|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Clu_FcwNValueSet : 51|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Clu_PasSpkrLvNValueSet : 53|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_SccDrvModeNValueSet : 56|3@1+ (1.0,0.0) [0.0|7.0] "" SCC
+ SG_ CF_Clu_HAnBNValueSet : 59|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_HfreeTrunkTgNValueSet : 61|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+
+BO_ 275 TCU13: 8 TCU
+ SG_ N_TGT_LUP : 0|8@1+ (10.0,500.0) [500.0|3040.0] "rpm" EMS,IBOX
+ SG_ SLOPE_TCU : 8|6@1+ (0.5,-16.0) [-16.0|15.5] "%" CLU,CUBIS,EMS,IBOX
+ SG_ CF_Tcu_InhCda : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_IsgInhib : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_BkeOnReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_NCStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_TarGr : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,DATC,EMS,EPB,ESC,IBOX,SCC
+ SG_ CF_Tcu_ShfPatt : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,CUBIS,EMS,IBOX
+ SG_ CF_Tcu_InhVis : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_PRelReq : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LVR
+ SG_ CF_Tcu_ITPhase : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_ActEcoRdy : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_TqGrdLim : 32|8@1+ (10.0,0.0) [0.0|2540.0] "Nm/s" EMS,IBOX
+ SG_ CR_Tcu_IsgTgtRPM : 40|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" EMS,IBOX
+ SG_ CF_Tcu_SptRdy : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Tcu_SbwPInfo : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_Alive3 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_ChkSum3 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX
+
+BO_ 274 TCU12: 8 TCU
+ SG_ ETL_TCU : 0|8@1+ (2.0,0.0) [0.0|508.0] "Nm" EMS,IBOX
+ SG_ CUR_GR : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,ESC,IBOX,SCC,TPMS
+ SG_ CF_Tcu_Alive : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC
+ SG_ CF_Tcu_ChkSum : 14|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC
+ SG_ VS_TCU : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" BCM,CLU,DATC,EMS,IBOX,LCA,LVR,PGS,SMK,SNV
+ SG_ FUEL_CUT_TCU : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ INH_FUEL_CUT : 29|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ IDLE_UP_TCU : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ N_INC_TCU : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15.0|15.0] "" EMS,IBOX
+ SG_ N_TC_RAW : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" EMS,IBOX
+ SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0.0) [0.0|0.9921875] "km/h" CLU,EMS,IBOX,LCA
+
+BO_ 273 TCU11: 8 TCU
+ SG_ TQI_TCU_INC : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX
+ SG_ G_SEL_DISP : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,AFLS,AVM,BCM,CGW,CLU,CUBIS,ECS,EMS,EPB,ESC,IAP,IBOX,LCA,LDWS_LKAS,LVR,MDPS,PGS,SCC,SMK,SNV,SPAS,TPMS
+ SG_ F_TCU : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX
+ SG_ TCU_TYPE : 14|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS,ESC,IBOX
+ SG_ TCU_OBD : 16|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,ESC,IBOX
+ SG_ SWI_GS : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,ESC,IBOX,SCC
+ SG_ GEAR_TYPE : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,EMS,ESC,IBOX,SCC
+ SG_ TQI_TCU : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX
+ SG_ TEMP_AT : 32|8@1+ (1.0,-40.0) [-40.0|214.0] "deg" AAF,CLU,CUBIS,EMS,ESC,IBOX
+ SG_ N_TC : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" _4WD,EMS,EPB,ESC,IBOX
+ SG_ SWI_CC : 56|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU,EMS,ESC,IBOX
+ SG_ CF_Tcu_Alive1 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_ChkSum1 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX
+
+BO_ 16 ACU13: 8 ACU
+ SG_ CF_Acu_CshAct : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CUBIS,IBOX,ODS
+
+BO_ 1040 CGW_USM1: 8 BCM
+ SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PTGMRValue : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_ADrLRValue : 8|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_ADrURValue : 11|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_SCMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_WlightRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PSMRValue : 18|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_HAnBRValue : 27|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+
+BO_ 1292 CLU13: 8 CLU
+ SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,FPCM,IBOX
+ SG_ CF_Clu_RefDetMod : 2|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX
+ SG_ CF_Clu_AvgFCU : 3|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX
+ SG_ CF_Clu_AvsmCur : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,SCC
+ SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0.0) [0.0|102.2] "" IBOX
+ SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1.0,0.0) [0.0|3.0] "" DATC,ECS,EMS,ESC,IAP,MDPS,TCU
+ SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1.0,0.0) [0.0|31.0] "" CGW,IBOX
+ SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Clu_DTE : 24|10@1+ (1.0,0.0) [0.0|1023.0] "" DATC
+ SG_ CF_Clu_TripUnit : 34|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ CF_Clu_SWL_Stat : 36|3@1+ (1.0,0.0) [0.0|7.0] "" ACU,EMS
+ SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EMS,TCU
+ SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CUBIS,EMS,IAP,IBOX
+ SG_ CF_Clu_IsaMainSW : 43|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Clu_AltLStatus : 59|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,DATC,EMS
+ SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,LDWS_LKAS
+
+BO_ 1290 SCC13: 8 SCC
+ SG_ SCCDrvModeRValue : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ SCC_Equip : 3|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ AebDrvSetStatus : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ESC
+
+BO_ 1287 TCS15: 4 ESC
+ SG_ ABS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,IBOX
+ SG_ TCS_OFF_LAMP : 1|2@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU
+ SG_ TCS_LAMP : 3|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ACU,CLU,CUBIS,IBOX,SCC
+ SG_ DBC_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ DBC_F_LAMP : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU
+ SG_ ESC_Off_Step : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ AVH_CLU : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,EPB
+ SG_ AVH_I_LAMP : 24|2@1+ (1.0,0.0) [0.0|3.0] "" EPB
+ SG_ EBD_W_LAMP : 26|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ AVH_ALARM : 27|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ AVH_LAMP : 29|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EPB,SPAS
+
+BO_ 1282 TCU14: 4 TCU
+ SG_ CF_TCU_WarnMsg : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_TCU_WarnImg : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_TCU_WarnSnd : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Tcu_GSel_BlinkReq : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,LVR
+ SG_ CF_Tcu_StRelStat : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,ESC
+ SG_ CF_Tcu_DriWarn1 : 13|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC
+ SG_ CF_Tcu_DriWarn2 : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,ESC
+
+BO_ 1281 ECS11: 3 ECS
+ SG_ ECS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX
+ SG_ SYS_NA : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ ECS_DEF : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ ECS_DIAG : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ L_CHG_NA : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Leveling_Off : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ LC_overheat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Lifting : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Lowering : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Damping_Mode : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ REQ_Damping : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ REQ_Height : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ REQ_level : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ ACT_Height : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+
+BO_ 1024 CLU_CFG11: 2 CLU
+ SG_ Vehicle_Type : 0|16@1+ (1.0,0.0) [0.0|65536.0] "" _4WD
+
+BO_ 1280 ACU14: 1 ACU
+ SG_ CF_SWL_Ind : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_TTL_Ind : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_SBR_Ind : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+
+BO_ 512 EMS20: 6 EMS
+ SG_ FCO : 0|16@1+ (0.128,0.0) [0.0|8388.48] "ul" CLU,CUBIS,FPCM,IBOX
+ SG_ CF_Ems_PumpTPres : 16|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" FPCM,IBOX
+ SG_ Split_Stat : 32|1@1+ (1.0,0.0) [0.0|1.0] "" FPCM
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_2015_mcan.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_2015_mcan.dbc
new file mode 100644
index 000000000..6bcd771e5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_2015_mcan.dbc
@@ -0,0 +1,1564 @@
+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_: CLOCK HUD H_U DATC CCP KMA_TMU CUBIS TMU IPM RSE_R RRC CGW RSE_L AMP EDT SWRC IBOX CLU FHCU ASD MON AVM KBD
+
+
+BO_ 3221225472 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX
+ SG_ C_WHEEL_FL : 0|12@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_WHEEL_FR : 0|12@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_WHEEL_RL : 0|12@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_WHEEL_RR : 0|12@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 2046 TP_EDT_AMP: 8 EDT
+ SG_ Byte0_TCP_7FE : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte1_Data_7FE : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte2_Data_7FE : 23|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte3_Data_7FE : 31|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte4_Data_7FE : 39|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte5_Data_7FE : 47|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte6_Data_7FE : 55|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte7_Data_7FE : 63|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 251 HU_TMU_E_02: 8 H_U
+ SG_ HU_GPS_Year : 7|8@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ HU_GPS_Month : 15|8@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ HU_GPS_Day : 23|8@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ HU_GPS_Hour : 31|8@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ HU_GPS_Minute : 39|8@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ HU_GPS_Second : 47|8@0+ (1,0) [0|0] "" CUBIS,TMU
+
+BO_ 250 HU_TMU_E_01: 8 H_U
+ SG_ HU_VoiceRecCom : 2|3@0+ (1,0) [0|0] "" TMU
+ SG_ HU_LangChgCom : 5|3@0+ (1,0) [0|0] "" TMU
+ SG_ HU_CallEndCmd : 9|2@0+ (1,0) [0|0] "" TMU
+ SG_ HU_ServiceReqtID : 13|4@0+ (1,0) [0|0] "" TMU
+ SG_ HU_MicReqCmd : 15|2@0+ (1,0) [0|0] "" TMU
+ SG_ HU_SeviceAction : 18|3@0+ (1,0) [0|0] "" TMU
+ SG_ HU_eCallStatus : 20|2@0+ (1,0) [0|0] "" TMU
+
+BO_ 1269 TP_CLU_ANDAUTO_HU: 8 CLU
+ SG_ Byte0_TCP_4F5 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4F5 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4F5 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4F5 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4F5 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4F5 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4F5 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4F5 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1268 TP_HU_ANDAUTO_CLU: 8 H_U
+ SG_ Byte0_TCP_4F4 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4F4 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4F4 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4F4 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4F4 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4F4 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4F4 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4F4 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1267 TP_CLU_CARPLAY_HU: 8 CLU
+ SG_ Byte0_TCP_4F3 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4F3 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4F3 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4F3 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4F3 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4F3 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4F3 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4F3 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1266 TP_HU_CARPLAY_CLU: 8 H_U
+ SG_ Byte0_TCP_4F2 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4F2 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4F2 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4F2 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4F2 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4F2 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4F2 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4F2 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1263 TP_CLU_IBOX_HU: 8 CLU
+ SG_ Byte0_TCP_4EF : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4EF : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4EF : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4EF : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4EF : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4EF : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4EF : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4EF : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1262 TP_HU_IBOX_CLU: 8 H_U
+ SG_ Byte0_TCP_4EE : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4EE : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4EE : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4EE : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4EE : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4EE : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4EE : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4EE : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1261 TP_CLU_DLNA_HU: 8 CLU
+ SG_ Byte0_TCP_4ED : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4ED : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4ED : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4ED : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4ED : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4ED : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4ED : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4ED : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1260 TP_HU_DLNA_CLU: 8 H_U
+ SG_ Byte0_TCP_4EC : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4EC : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4EC : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4EC : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4EC : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4EC : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4EC : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4EC : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 491 GW_DDM_PE: 8 CLU
+ SG_ C_DRVDoorStatus : 1|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ C_ASTDoorStatus : 3|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ C_RLDoorStatus : 5|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ C_RRDoorStatus : 7|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ C_TrunkStatus : 9|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ C_OSMirrorStatus : 11|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+
+BO_ 1259 TP_CLU_MP_HU: 8 CLU
+ SG_ Byte0_TCP_4EB : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4EB : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4EB : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4EB : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4EB : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4EB : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4EB : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4EB : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1258 TP_HU_MP_CLU: 8 H_U
+ SG_ Byte0_TCP_4EA : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4EA : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4EA : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4EA : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4EA : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4EA : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4EA : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4EA : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1257 TP_CLU_FM_HU: 8 CLU
+ SG_ Byte0_TCP_4E9 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4E9 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4E9 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4E9 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4E9 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4E9 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4E9 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4E9 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1256 TP_HU_FM_CLU: 8 H_U
+ SG_ Byte0_TCP_4E8 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4E8 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4E8 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4E8 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4E8 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4E8 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4E8 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4E8 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1255 TP_CLU_MLT_HU: 8 CLU
+ SG_ Byte0_TCP_4E7 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4E7 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4E7 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4E7 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4E7 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4E7 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4E7 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4E7 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 487 HU_CLU_PE_13: 8 H_U
+ SG_ Navi_DistToPoint1_F : 11|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint1_I : 7|12@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint1_U : 23|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint2_I : 19|12@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint2_F : 35|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint2_U : 39|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint3_F : 51|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint3_I : 47|12@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToPoint3_U : 63|4@0+ (1,0) [0|0] "" CLU,HUD
+
+BO_ 1254 TP_HU_MLT_CLU: 8 H_U
+ SG_ Byte0_TCP_4E6 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4E6 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4E6 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4E6 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4E6 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4E6 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4E6 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4E6 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 486 HU_CLU_PE_12: 8 H_U
+ SG_ Navi_DistToDest_I : 7|16@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToDest_F : 19|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_DistToDest_U : 23|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_EstimHour : 31|8@0+ (1,0) [0|254] "hh" CLU,HUD
+ SG_ Navi_EstimMin : 37|6@0+ (1,0) [0|59] "mm" CLU,HUD
+ SG_ Navi_EstimTimeType : 39|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_Compass : 45|6@0+ (7.5,-7.5) [0|352.5] "Degree" CLU,HUD
+
+BO_ 229 HU_SYS_E_00: 8 H_U
+ SG_ SYS_SW_Ver_Req : 1|2@0+ (1,0) [0|0] "" AMP,CCP,CGW,CLOCK,CLU,HUD,IBOX,RRC,RSE_L
+ SG_ SYS_CAN_Ver_Req : 3|2@0+ (1,0) [0|0] "" AMP,CCP,CGW,CLOCK,CLU,HUD,IBOX,RRC,RSE_L
+ SG_ SYS_HW_Ver_Req : 5|2@0+ (1,0) [0|0] "" AMP,CCP,CGW,CLOCK,CLU,IBOX,RRC
+ SG_ SYS_RBD_Req : 9|2@0+ (1,0) [0|0] "" AMP,IBOX
+ SG_ SYS_MOSTErrorDiag_Req : 11|2@0+ (1,0) [0|0] "" AMP,IBOX
+ SG_ SYS_Reset_Req : 17|2@0+ (1,0) [0|0] "" AMP,IBOX
+
+BO_ 1253 TP_CLU_VCDC_HU: 8 CLU
+ SG_ Byte0_TCP_4E5 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4E5 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4E5 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4E5 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4E5 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4E5 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4E5 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4E5 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 485 HU_CLU_PE_11: 8 H_U
+ SG_ Navi_FixedSpdTrap : 3|4@0+ (10,0) [10|110] "Km/h" CLU,HUD
+ SG_ Navi_MobileSpdTrap : 7|4@0+ (10,0) [10|110] "Km/h" CLU,HUD
+ SG_ Navi_OverSpdAlarm : 11|2@0+ (1,0) [0|0] "" CGW,CLU,HUD
+ SG_ Navi_SpdRedlightTrap : 15|4@0+ (10,0) [10|110] "Km/h" CLU,HUD
+ SG_ Navi_NonSpdTrap : 20|5@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_WarningZone : 27|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_MergeWarning : 33|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_CurveWarning : 39|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_BusSpdTrap : 43|4@0+ (10,0) [10|110] "Km/h" CLU,HUD
+ SG_ Navi_SpdLimit_Type : 49|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_SpdLimit_Unit : 51|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_SpdInfo_Type : 55|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ Navi_SpdLimit : 63|8@0+ (1,0) [1|254] "" CLU,HUD
+
+BO_ 1252 TP_HU_VCDC_CLU: 8 H_U
+ SG_ Byte0_TCP_4E4 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4E4 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4E4 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4E4 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4E4 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4E4 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4E4 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4E4 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1251 TP_CLU_JB_HU: 8 CLU
+ SG_ Byte0_TCP_4E3 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4E3 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4E3 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4E3 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4E3 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4E3 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4E3 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4E3 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1250 TP_HU_JB_CLU: 8 H_U
+ SG_ Byte0_TCP_4E2 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4E2 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4E2 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4E2 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4E2 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4E2 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4E2 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4E2 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1248 TP_TMU_HU: 8 TMU
+ SG_ Byte0_TCP_4E0 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4E0 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4E0 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4E0 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4E0 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4E0 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4E0 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4E0 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 479 CLU_HU_PE_01: 8 CLU
+ SG_ CLU_Type : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ CLU_Region : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ CLU_VersionMinor : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ CLU_VersionMajor : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ CLU_CurrentDispState : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ C_DRVDRSW : 41|2@0+ (1,0) [0|0] "" H_U
+ SG_ CF_Clu_LowfuelWarning : 44|2@0+ (1,0) [0|0] "" H_U
+ SG_ CLU_PowerInfo : 46|2@0+ (1,0) [0|0] "" H_U
+ SG_ C_DrivingModeState : 50|3@0+ (1,0) [0|0] "" H_U
+ SG_ Clu_RheostatLvl : 55|5@0+ (1,0) [0|0] "" H_U,MON,SWRC
+ SG_ C_Clu_ActiveEcoSW : 57|2@0+ (1,0) [0|0] "" H_U
+ SG_ C_Detent : 59|2@0+ (1,0) [0|0] "" CCP,CLOCK,H_U,KBD,MON,RRC,RSE_L,RSE_R
+ SG_ C_DrivingModeOn : 61|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 2015 TP_EDT_All_Req: 8 EDT
+ SG_ Byte0_TCP_7DF : 7|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte1_Data_7DF : 15|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte2_Data_7DF : 23|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte3_Data_7DF : 31|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte4_Data_7DF : 39|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte5_Data_7DF : 47|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte6_Data_7DF : 55|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+ SG_ Byte7_Data_7DF : 63|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+
+BO_ 474 CLU_HU_PE_02: 8 CLU
+ SG_ CF_Clu_AvgFCU : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ CF_Clu_AvgFCL : 9|10@0+ (1,0) [0|0] "" H_U
+ SG_ CF_Clu_TermAvgSync : 25|2@0+ (1,0) [0|0] "" H_U
+ SG_ CF_Clu_EcoDriveInf : 36|3@0+ (1,0) [0|0] "" H_U
+ SG_ CR_Clu_TermAvgFCI : 33|10@0+ (1,0) [0|0] "" H_U
+ SG_ CF_CLU_EcoScore : 55|16@0+ (1,0) [0|0] "" H_U
+
+BO_ 1495 CLU_HU_P_05: 8 CLU
+ SG_ Clu_TripUnit : 9|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ Clu_DTEWarn : 11|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ Clu_DTE : 7|12@0+ (1,0) [0|1500] "km" H_U,IBOX
+ SG_ Clu_AFC : 23|10@0+ (0.1,0) [0|99.9] "" H_U,IBOX
+ SG_ Clu_IFC : 29|10@0+ (0.1,0) [0|99.9] "" H_U,IBOX
+ SG_ Clu_Odometer : 47|24@0+ (1,0) [0|999999] "" H_U,IBOX
+
+BO_ 1494 CLU_HU_P_01: 8 CLU
+ SG_ CF_TripUnit : 13|2@0+ (1,0) [0|0] "" H_U
+ SG_ CF_DTE : 7|10@0+ (1,0) [0|0] "" H_U
+
+BO_ 214 AMP_HU_E_SYS: 8 AMP
+ SG_ AMP_SWVerMajor : 7|8@0+ (1,0) [0|254] "" H_U,IBOX
+ SG_ AMP_SWVerMinor : 15|8@0+ (1,0) [0|254] "" H_U,IBOX
+ SG_ AMP_CANVerMajor : 23|8@0+ (1,0) [0|254] "" H_U,IBOX
+ SG_ AMP_CANVerMinor : 31|8@0+ (1,0) [0|254] "" H_U,IBOX
+ SG_ AMP_RBDResult : 34|3@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MOSTErrorDiagResult : 38|3@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_HWVerMajor : 55|8@0+ (1,0) [0|254] "" H_U,IBOX
+ SG_ AMP_HWVerMinor : 63|8@0+ (1,0) [0|254] "" H_U,IBOX
+
+BO_ 1492 CLU_HU_P_04: 8 CLU
+ SG_ MM_CR_Fatc_AcnComCst_W : 7|10@0+ (10,0) [0|8000] "W" H_U
+ SG_ MM_CR_Ldc_PwrMon_W : 12|8@0+ (10,0) [0|2550] "W" H_U
+ SG_ MM_CR_Fatc_PTCPwrCon_W : 17|10@0+ (10,0) [0|10000] "W" H_U
+ SG_ MM_CR_BmsChgExp_T_Fast : 39|16@0+ (1,0) [0|0] "minute" H_U
+ SG_ MM_CR_BmsChgExp_T_Slow : 55|16@0+ (1,0) [0|0] "minute" H_U
+
+BO_ 1491 CLU_HU_P_03: 8 CLU
+ SG_ MM_CF_Vcu_EvMod : 3|4@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CF_Vcu_GarSelDisp : 7|4@0+ (999,0) [0|0] "" H_U
+ SG_ MM_CF_Vcu_ThiBatTir : 8|1@0+ (1,0) [0|0] "" H_U
+ SG_ CR_Mcu_MotEstTqPc : 23|10@0+ (0.2,-100) [-100|99.8] "%" H_U
+ SG_ CR_Mcu_MotActRotSpd_rpm : 39|16@0+ (1,-32768) [-32768|32767] "rpm" H_U
+
+BO_ 1490 CLU_HU_P_02: 8 CLU
+ SG_ MM_CR_Vcu_EcoSco : 3|4@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CF_Vcu_PgmRun5 : 5|2@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CR_Clu_Odometer_kph : 15|24@0+ (0.1,0) [0|0] "km" H_U
+
+BO_ 1489 DATC_P_B_01: 8 CLU
+ SG_ C_InhibitR_DATC : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_InhibitP_DATC : 50|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_InhibitN_DATC : 49|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_InhibitD_DATC : 48|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 465 CLU_HU_PE_03: 8 CLU
+ SG_ CF_Clu_EVDTEDisp : 0|9@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ CF_Clu_GasDTEDisp : 17|10@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ MM_CR_Clu_TotalDTEDisp : 34|11@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ CF_Clu_TripUnit : 49|2@0+ (1,0) [0|0] "" H_U,IBOX
+
+BO_ 1232 TP_HU_TMU: 8 H_U
+ SG_ Byte0_TCP_4D0 : 7|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte1_Data_4D0 : 15|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte2_Data_4D0 : 23|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte3_Data_4D0 : 31|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte4_Data_4D0 : 39|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte5_Data_4D0 : 47|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte6_Data_4D0 : 55|8@0+ (1,0) [0|0] "" TMU
+ SG_ Byte7_Data_4D0 : 63|8@0+ (1,0) [0|0] "" TMU
+
+BO_ 1488 CLU_HU_P_00: 8 CLU
+ SG_ MM_CR_Mcu_VehSpd_Kph : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CR_Mcu_VehSpdDec_Kph : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CR_Bms_Soc_Pc : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CR_Vcu_TqMotClu_Pc : 31|8@0+ (1,-127) [0|0] "" H_U
+ SG_ MM_CR_Bms_DrvEnaDist : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ MM_CR_Clu_Soc_Seg : 44|5@0+ (1,0) [0|0] "" H_U,IBOX
+
+BO_ 208 CLU_HU_E_SYS: 8 CLU
+ SG_ CLU_SWVerMajor : 7|8@0+ (1,0) [0|254] "" H_U
+ SG_ CLU_SWVerMinor : 15|8@0+ (1,0) [0|254] "" H_U
+ SG_ CLU_CANVerMajor : 23|8@0+ (1,0) [0|254] "" H_U
+ SG_ CLU_CANVerMinor : 31|8@0+ (1,0) [0|254] "" H_U
+ SG_ CLU_HWVerMajor : 55|8@0+ (1,0) [0|254] "" H_U
+ SG_ CLU_HWVerMinor : 63|8@0+ (1,0) [0|254] "" H_U
+
+BO_ 448 HU_DATC_PE_00: 8 H_U
+ SG_ DATC_AqsLevelChg : 3|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ RSELockOnOff : 7|2@0+ (1,0) [0|0] "" CGW,DATC,IPM,RRC
+ SG_ DATC_AqsMode : 9|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_Graphreset_Info : 17|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_VRActivity : 33|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_PhoneActivity : 35|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ BlowerNoiseControl : 37|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+
+BO_ 1211 TP_HU_TBT_CLU: 8 H_U
+ SG_ Byte0_TCP_4BB : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4BB : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4BB : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4BB : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4BB : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4BB : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4BB : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4BB : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1207 TP_HU_DAB_CLU: 8 H_U
+ SG_ Byte0_TCP_4B7 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4B7 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4B7 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4B7 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4B7 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4B7 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4B7 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4B7 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1206 TP_HU_XM_CLU: 8 H_U
+ SG_ Byte0_TCP_4B6 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4B6 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4B6 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4B6 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4B6 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4B6 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4B6 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4B6 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1204 TP_HU_DMB_CLU: 8 H_U
+ SG_ Byte0_TCP_4B4 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_4B4 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_4B4 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_4B4 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_4B4 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_4B4 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_4B4 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_4B4 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 432 TMU_GW_PE_01: 8 TMU
+ SG_ C_DATCOnOffReq : 1|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM
+ SG_ C_DATCTempUnit : 3|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM
+ SG_ C_DATCTempSet : 15|8@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM
+ SG_ TMU_IVRActivity : 33|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM
+ SG_ TMU_PhoneActivity : 35|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM
+
+BO_ 1195 TP_CLU_TBT_HU: 8 CLU
+ SG_ Byte0_TCP_4AB : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4AB : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4AB : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4AB : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4AB : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4AB : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4AB : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4AB : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1191 TP_CLU_DAB_HU: 8 CLU
+ SG_ Byte0_TCP_4A7 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4A7 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4A7 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4A7 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4A7 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4A7 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4A7 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4A7 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1190 TP_CLU_XM_HU: 8 CLU
+ SG_ Byte0_TCP_4A6 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4A6 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4A6 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4A6 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4A6 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4A6 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4A6 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4A6 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1188 TP_CLU_DMB_HU: 8 CLU
+ SG_ Byte0_TCP_4A4 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_4A4 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_4A4 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_4A4 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_4A4 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_4A4 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_4A4 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_4A4 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1179 TP_HU_NAVI_CLU: 8 H_U
+ SG_ Byte0_TCP_49B : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_49B : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_49B : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_49B : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_49B : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_49B : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_49B : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_49B : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1178 TP_CLU_Ipod_HU: 8 CLU
+ SG_ Byte0_TCP_49A : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_49A : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_49A : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_49A : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_49A : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_49A : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_49A : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_49A : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 410 HU_CLU_PE_08: 8 H_U
+ SG_ VCDC_SelDiscNo : 11|4@0+ (1,0) [0|0] "" CLU
+ SG_ VCDC_TrackChapterNo : 7|10@0+ (1,0) [0|0] "" CLU
+ SG_ VCDC_PlayTime : 23|24@0+ (1,0) [0|0] "" CLU
+ SG_ MLT_PlayTime : 47|24@0+ (1,0) [0|0] "" CLU
+
+BO_ 1176 TP_CLU_DVD_HU: 8 CLU
+ SG_ Byte0_TCP_498 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_498 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_498 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_498 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_498 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_498 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_498 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_498 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1175 TP_CLU_USB_HU: 8 CLU
+ SG_ Byte0_TCP_497 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_497 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_497 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_497 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_497 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_497 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_497 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_497 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 407 HU_CLU_PE_05: 8 H_U
+ SG_ HU_LanguageInfo : 7|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ HU_MuteStatus : 9|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ HU_VolumeStatus : 15|6@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ HU_NaviDisp : 17|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ HU_NaviStatus : 19|2@0+ (1,0) [0|0] "" CGW,CLU,HUD,IPM
+ SG_ HU_DistanceUnit : 21|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ HU_Navigation_On_Off : 23|2@0+ (1,0) [0|0] "" AVM,CGW,CLU,DATC,HUD,IPM
+
+BO_ 1942 TP_AMP_HU_DiagRes: 8 AMP
+ SG_ Byte0_TCP_796 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_796 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_796 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_796 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_796 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_796 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_796 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_796 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 406 HU_CLU_PE_04: 8 H_U
+ SG_ C_SDARS_ChannelNo : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ C_NaviRouteGuidance : 11|2@0+ (1,0) [0|0] "" CLU
+ SG_ HD_SPS_ChannelNo : 15|4@0+ (1,0) [0|0] "" CLU
+ SG_ C_SDARS_PresetNo : 19|4@0+ (1,0) [0|0] "" CLU
+ SG_ DAB_ServiceFollowing : 21|2@0+ (1,0) [0|0] "" CLU
+ SG_ SXM_ChannelNo : 25|10@0+ (1,0) [0|999] "" AMP,CLU,HUD
+
+BO_ 1941 TP_HU_AMP_DiagReq: 8 H_U
+ SG_ Byte0_TCP_795 : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte1_Data_795 : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte2_Data_795 : 23|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte3_Data_795 : 31|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte4_Data_795 : 39|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte5_Data_795 : 47|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte6_Data_795 : 55|8@0+ (1,0) [0|0] "" AMP
+ SG_ Byte7_Data_795 : 63|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 1173 TP_CLU_CD_HU: 8 CLU
+ SG_ Byte0_TCP_495 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_495 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_495 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_495 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_495 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_495 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_495 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_495 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 405 HU_CLU_PE_03: 8 H_U
+ SG_ HU_IntegPresetNum : 7|8@0+ (1,0) [0|0] "" AMP,CLU,HUD
+ SG_ Radio_Area : 10|8@0+ (1,0) [0|0] "" CLU
+ SG_ DMB_PresetNo : 29|5@0+ (1,0) [0|0] "" CLU
+ SG_ RADIO_PresetNo : 18|5@0+ (1,0) [0|0] "" CLU
+ SG_ HU_Opstate_DIS2 : 38|7@0+ (1,0) [0|0] "" AMP,CLU,HUD
+
+BO_ 1168 TP_HU_USB_CLU: 8 H_U
+ SG_ Byte0_TCP_490 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_490 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_490 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_490 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_490 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_490 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_490 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_490 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1936 TP_HU_All_Req: 8 H_U
+ SG_ Byte0_TCP_790 : 7|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte1_Data_790 : 15|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte2_Data_790 : 23|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte3_Data_790 : 31|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte4_Data_790 : 39|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte5_Data_790 : 47|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte6_Data_790 : 55|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+ SG_ Byte7_Data_790 : 63|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU
+
+BO_ 1167 TP_HU_Ipod_CLU: 8 H_U
+ SG_ Byte0_TCP_48F : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_48F : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_48F : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_48F : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_48F : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_48F : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_48F : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_48F : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1166 TP_HU_DVD_CLU: 8 H_U
+ SG_ Byte0_TCP_48E : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_48E : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_48E : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_48E : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_48E : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_48E : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_48E : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_48E : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1165 TP_HU_CD_CLU: 8 H_U
+ SG_ Byte0_TCP_48D : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_48D : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_48D : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_48D : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_48D : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_48D : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_48D : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_48D : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 1164 TP_CLU_NAVI_HU: 8 CLU
+ SG_ Byte0_TCP_48C : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_48C : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_48C : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_48C : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_48C : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_48C : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_48C : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_48C : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 139 AMP_HU_E_12: 8 AMP
+ SG_ AMP_Beep2VolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep2FrequencyState : 15|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep2OutputMaskState : 31|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep2DOnState : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep2DOffState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep2NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 138 AMP_HU_E_11: 8 AMP
+ SG_ AMP_Beep1VolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep1FrequencyState : 15|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep1OutputMaskState : 31|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep1DOnState : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep1DOffState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep1NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 137 AMP_HU_E_10: 8 AMP
+ SG_ AMP_MTSOutputMaskSupport : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MTSMuteMaskSupport : 5|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_HFOutputMaskSupport : 9|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_HFMuteMaskSupport : 13|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_NaviOutputMaskSupport : 17|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_NaviMuteMaskSupport : 21|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 1928 TP_HU_PhyRes: 8 H_U
+ SG_ Byte0_TCP_788 : 7|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte1_Data_788 : 15|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte2_Data_788 : 23|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte3_Data_788 : 31|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte4_Data_788 : 39|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte5_Data_788 : 47|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte6_Data_788 : 55|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte7_Data_788 : 63|8@0+ (1,0) [0|0] "" EDT
+
+BO_ 136 AMP_HU_E_09: 8 AMP
+ SG_ AMP_MaxBeep2VolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep2Freq_State : 15|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep2OutputMaskSup : 33|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep2DOnState : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep2DOffState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep2NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 135 AMP_HU_E_08: 8 AMP
+ SG_ AMP_MaxBeep1VolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep1Freq_State : 15|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_Beep1OutputMaskSup : 33|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep1DOnState : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep1DOffState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBeep1NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 134 AMP_HU_E_07: 8 AMP
+ SG_ ASD_SetValue : 2|3@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ ASD_Version : 15|8@0+ (1,0) [0|0] "" H_U,IBOX
+
+BO_ 1157 TP_HU_CLU_HF: 8 H_U
+ SG_ Byte0_TCP_485 : 7|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte1_Data_485 : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte2_Data_485 : 23|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte3_Data_485 : 31|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte4_Data_485 : 39|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte5_Data_485 : 47|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte6_Data_485 : 55|8@0+ (1,0) [0|0] "" CLU
+ SG_ Byte7_Data_485 : 63|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 133 AMP_HU_E_06: 8 AMP
+ SG_ AMP_MaxVolumeStep : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBalanceStep : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxFadeStep : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxBassStep : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxMidStep : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxTrebleStep : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_ASDMajorVer : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_ASDMinorVer : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 389 AMP_HU_PE_05: 8 AMP
+ SG_ AMP_EngOrderC2Setting : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_EngOrderC4Setting : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_EngOrderC6Setting : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_APSBand0Setting : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_APSBand1Setting : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_APSBand2Setting : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_APSBand3Setting : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_APSBand4Setting : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 132 AMP_HU_E_05: 8 AMP
+ SG_ AMP_HFVolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_HFAudioCutState : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_HFOutputMaskState : 23|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_HFMuteMaskState : 39|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxHFVolumeState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxHFAudioCutState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 388 AMP_HU_PE_04: 8 AMP
+ SG_ AMP_PESSModeState : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_PESSDesignSetting : 4|3@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_PESSAPSSetting : 7|3@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_PESSVolumeSetting : 15|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 1156 TP_CLU_HF_HU: 8 CLU
+ SG_ Byte0_TCP_484 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_484 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_484 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_484 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_484 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_484 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_484 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_484 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 131 AMP_HU_E_04: 8 AMP
+ SG_ AMP_MTSVolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MTSAudioCutState : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MTSOutputMaskState : 23|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MTSMuteMaskState : 39|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxMTSVolumeState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxMTSAudioCutState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 387 AMP_HU_PE_03: 8 AMP
+ SG_ AMP_MainVolumeSetting : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_BalanceSetting : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_FadeSetting : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_BassSetting : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MidSetting : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_TrebleSetting : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_VehicleSpeedamp : 55|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 130 AMP_HU_E_03: 8 AMP
+ SG_ AMP_NaviVolumeState : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_NaviAudioCutState : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_NaviOutputMaskState : 23|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_NaviMuteMaskState : 39|16@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxNaviVolumeState : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MaxNaviAudioCutState : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 129 AMP_HU_E_02: 8 AMP
+ SG_ AMP_DriveState : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_ConvertibleTopState : 5|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 385 AMP_HU_PE_02: 8 AMP
+ SG_ AMP_MuteState : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_RearSpMuteState : 3|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SurroundModeState : 9|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_EQState : 13|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SPDIFMuteSt : 17|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_BeatsModeState : 21|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_DefaultBeep1St : 25|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_DefaultBeep2St : 29|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_AudioSource : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_VIPModeState : 41|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_QLSModeState : 43|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 128 AMP_HU_E_01: 8 AMP
+ SG_ AMP_CurrentVehicleID : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SPDIFModeState : 11|4@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MajorVer : 23|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ AMP_MinorVer : 31|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ AMP_UpdateStartResp : 33|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_UpdateEndResp : 41|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_TuningMajorVer : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_TuningMinorVer : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 384 AMP_HU_PE_01: 8 AMP
+ SG_ AMP_HFModeState : 1|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ HU_InitInfo : 3|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_ASDModeState : 6|3@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_NaviModeState : 9|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_SPDIFInfo : 12|3@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_MTSModeState : 17|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_VSCModeState : 25|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_SDVCStepState : 29|3@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_Beep1ModeState : 33|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_Beep2ModeState : 41|2@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_DistrInfoState : 55|8@0+ (1,0) [0|0] "" CLU,H_U
+ SG_ AMP_INFORM_TO_IPM : 57|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM
+ SG_ AMP_SignalDoctorState : 59|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_AutoVolumeState : 61|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 1408 AMP_HU_P_01: 8 AMP
+ SG_ AMP_SupportMute : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportHFMode : 3|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportCfgBeep1 : 5|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportCfgBeep2 : 7|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportSpeedAdjust : 9|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportSurroundMode : 11|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportNaviMode : 13|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportMTSMode : 15|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportTopState : 17|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportBothLHDandRHD : 19|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportEQState : 21|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportVehicleID : 23|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportAudioSource : 25|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportSPDIFModeState : 27|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportRearSpMute : 29|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportVEQMode : 31|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_MakerID : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportASDMode : 41|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportBeatsMode : 43|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportVIPMode : 45|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportQLS : 47|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportSignalDoctor : 49|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportAutoVolume : 51|2@0+ (1,0) [0|0] "" H_U
+ SG_ AMP_SupportPESSMode : 53|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 1920 TP_HU_PhyReq: 8 EDT
+ SG_ Byte0_TCP_780 : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte1_Data_780 : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte2_Data_780 : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte3_Data_780 : 31|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte4_Data_780 : 39|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte5_Data_780 : 47|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte6_Data_780 : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ Byte7_Data_780 : 63|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 371 HU_TMU_PE_01: 8 H_U
+ SG_ HU_AliveStatus : 1|2@0+ (1,0) [0|0] "" CLU,CGW,TMU
+ SG_ HU_DeviceType : 5|4@0+ (1,0) [0|0] "" TMU
+ SG_ HU_DistanceUnit : 7|2@0+ (1,0) [0|0] "" TMU
+ SG_ HU_AudAllocStatus : 9|2@0+ (1,0) [0|0] "" TMU
+ SG_ HU_PowerStatus : 12|3@0+ (1,0) [0|0] "" TMU
+ SG_ HU_BTCallStatus : 15|3@0+ (1,0) [0|0] "" TMU
+ SG_ HU_VoiceRecStatus : 17|2@0+ (1,0) [0|0] "" TMU
+ SG_ HU_LangStatus : 20|3@0+ (1,0) [0|0] "" TMU
+
+BO_ 369 HU_Car_PE_01: 8 H_U
+ SG_ HU_VehiclePwr : 3|4@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CLOCK,CLU,CUBIS,DATC,FHCU,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU
+
+BO_ 1392 HU_TMU_P_01: 8 H_U
+ SG_ HU_GPS_Signal : 7|64@0+ (1,0) [0|0] "" TMU
+
+BO_ 112 HU_AMP_E_09: 8 H_U
+ SG_ AMP_Beep1VolumeStep : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep1Frequency : 15|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep1Ch_OutputMask : 31|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep1DurationOn : 47|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep1DurationOff : 55|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep1NumberOfCycles : 63|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 1390 GW_CLU_P: 8 CLU
+ SG_ C_VehicleSpeed : 7|8@0+ (1,0) [0|254] "" H_U,IBOX
+ SG_ C_Odometer : 15|24@0+ (1,0) [0|999999] "" H_U,IBOX
+
+BO_ 363 GW_IPM_PE_2: 8 CLU
+ SG_ C_DRVUnlockState : 1|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_ASTUnlockState : 3|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_RLUnlockstate : 5|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_RRUnlockState : 7|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_VehicleInfoTMU : 9|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_Engine_Status : 11|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_TMULockFeedBack : 23|2@0+ (1,0) [0|0] "" CUBIS,TMU
+
+BO_ 362 GW_IPM_PE_1: 8 CLU
+ SG_ C_AV_Tail : 1|2@0+ (1,0) [0|0] "" AMP,CCP,CLOCK,CLU,HUD,H_U,IBOX,RRC,RSE_L
+ SG_ C_ParkingBrakeSW : 3|2@0+ (1,0) [0|0] "" H_U
+ SG_ C_RKECMD : 7|4@0+ (1,0) [0|0] "" H_U
+ SG_ C_BAState : 9|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_IGNSW : 14|3@0+ (1,0) [0|0] "" AMP,AVM,CUBIS,EDT,H_U,MON,RRC,SWRC
+ SG_ C_CountryCfg : 18|3@0+ (1,0) [0|0] "" AVM,H_U
+ SG_ C_AltL : 25|2@0+ (1,0) [0|0] "" H_U
+ SG_ C_TailLampActivity : 27|2@0+ (1,0) [0|0] "" AMP,CCP,CLOCK,HUD,H_U,IBOX,RRC,RSE_L,SWRC
+ SG_ RearSW_RSELockOnOff : 29|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_TMULockFeedBack : 31|2@0+ (1,0) [0|0] "" CUBIS,TMU
+ SG_ C_SMKTeleCrankingState : 33|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_SMKTeleCrankingFailRes : 35|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_RKECMD_GEN2 : 39|3@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_Acu_CshAct : 41|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_IntTailAct : 43|2@0+ (1,0) [0|0] "" AMP,CCP,CLOCK,CLU,HUD,H_U,IBOX,RRC,RSE_L
+ SG_ C_PassiveAccessUnlock : 47|3@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ Lca_IndLeft : 49|2@0+ (1,0) [0|0] "" H_U
+ SG_ FL_SndWarn : 51|2@0+ (1,0) [0|0] "" AMP
+ SG_ FR_SndWarn : 53|2@0+ (1,0) [0|0] "" AMP
+ SG_ Lca_IndRight : 55|2@0+ (1,0) [0|0] "" H_U
+ SG_ RCTA_IndLeft : 57|2@0+ (1,0) [0|0] "" H_U
+ SG_ RL_SndWarn : 59|2@0+ (1,0) [0|0] "" AMP
+ SG_ RR_SndWarn : 61|2@0+ (1,0) [0|0] "" AMP
+ SG_ RCTA_IndRight : 63|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 361 GW_CHASSIS_PE_1: 8 CLU
+ SG_ C_Inhibit_State : 3|4@0+ (1,0) [0|0] "" AVM,H_U
+ SG_ C_P_BrakeStatus : 5|2@0+ (1,0) [0|0] "" AVM,H_U
+ SG_ C_Clu_AltLStatus : 7|2@0+ (1,0) [0|0] "" AVM,H_U
+
+BO_ 359 GW_WARNING_PE_01: 8 CLU
+ SG_ Spas_BEEP_Alarm : 3|4@0+ (1,0) [0|0] "" AMP
+ SG_ Spas_Audio_VolumeDown : 5|2@0+ (1,0) [0|0] "" AMP
+ SG_ Spas_Spkr_Flh_Alarm : 9|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Spas_Spkr_Fcnt_Alarm : 11|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Spas_Spkr_Frh_Alarm : 13|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Spas_Spkr_Rlh_Alarm : 17|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Spas_Spkr_Rcnt_Alarm : 19|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Spas_Spkr_Rrh_Alarm : 21|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Lkas_SysStatus : 27|4@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Lkas_LH_Warning : 29|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Lkas_RH_Warning : 31|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Spas_Spkr_Level : 35|3@0+ (1,0) [0|0] "" AMP
+ SG_ Lkas_Audio_VolumeDown : 37|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Audio_VolumeDown : 39|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_BEEP_Alarm : 43|4@0+ (1,0) [0|0] "" AMP
+ SG_ Pas_Audio_VolumeDown : 45|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_Spkr_Level : 32|3@0+ (1,0) [0|0] "" AMP
+ SG_ Pas_Spkr_Flh_Alarm : 49|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_Spkr_Fcnt_Alarm : 51|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_Spkr_Frh_Alarm : 53|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_Spkr_Rlh_Alarm : 57|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_Spkr_Rcnt_Alarm : 59|2@0+ (1,0) [0|0] "" AMP,H_U
+ SG_ Pas_Spkr_Rrh_Alarm : 61|2@0+ (1,0) [0|0] "" AMP,H_U
+
+BO_ 1376 HU_TMU_P_02: 8 H_U
+ SG_ HU_GPS_Signal2 : 7|8@0+ (2,0) [0|0] "Degree" TMU
+ SG_ HU_GPS_Signal3 : 9|2@0+ (1,0) [0|0] "" TMU
+ SG_ HU_GPS_Signal4 : 12|3@0+ (1,0) [0|0] "" TMU
+
+BO_ 93 DATC_HU_E_SYS: 8 CLU
+ SG_ DATC_SWVerMajor : 7|8@0+ (1,0) [0|254] "" H_U
+ SG_ DATC_SWVerMinor : 15|8@0+ (1,0) [0|254] "" H_U
+ SG_ DATC_CANVerMajor : 23|8@0+ (1,0) [0|254] "" H_U
+ SG_ DATC_CANVerMinor : 31|8@0+ (1,0) [0|254] "" H_U
+
+BO_ 344 GW_CLU_PE: 8 CLU
+ SG_ C_InhibitP : 1|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_InhibitR : 3|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_InhibitN : 5|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_InhibitD : 7|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_P_BrakeStatus : 9|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_Clu_AltLStatus : 11|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ CF_Clu_LowfuelWarning : 13|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ C_InhibitRMT : 15|2@0+ (1,0) [0|0] "" H_U
+ SG_ CF_SMKRKECmd : 18|3@0+ (1,0) [0|0] "" H_U
+
+BO_ 87 HU_E_02: 8 H_U
+ SG_ NaviValidity : 1|2@0+ (1,0) [0|0] "" CGW,CLU
+
+BO_ 343 GW_WARNING_PE_02: 8 CLU
+ SG_ CF_Lkas_TsrSlifOpt : 1|2@0+ (1,0) [0|3] "" H_U
+ SG_ CF_Lkas_TsrStatus : 3|2@0+ (1,0) [0|3] "" H_U
+ SG_ CF_Lkas_TsrAddinfo_Disp : 7|2@0+ (1,0) [0|3] "" H_U
+ SG_ CF_Lkas_TsrSpeed_Display : 15|8@0+ (1,0) [0|255] "" H_U
+
+BO_ 75 HU_AMP_E_12: 8 H_U
+ SG_ AMP_EngOrderC2GainSet : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_EngOrderC4GainSet : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_EngOrderC6GainSet : 23|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_APSBand0GainSet : 31|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_APSBand1GainSet : 39|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_APSBand2GainSet : 47|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_APSBand3GainSet : 55|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_APSBand4GainSet : 63|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 74 HU_AMP_E_11: 8 H_U
+ SG_ AMP_PESSMode : 1|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_PESSDesignSet : 4|3@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_PESSAPSSet : 7|3@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_PESSVolumeSet : 15|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 1864 TP_AMP_EDT: 8 AMP
+ SG_ Byte0_TCP_748 : 7|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte1_Data_748 : 15|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte2_Data_748 : 23|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte3_Data_748 : 31|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte4_Data_748 : 39|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte5_Data_748 : 47|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte6_Data_748 : 55|8@0+ (1,0) [0|0] "" EDT
+ SG_ Byte7_Data_748 : 63|8@0+ (1,0) [0|0] "" EDT
+
+BO_ 327 TMU_HU_PE_03: 8 TMU
+ SG_ TMU_TbT_TurnIcon : 7|8@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_CountDownBar : 11|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_Distance_Unit : 13|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_DestDistance_Unit : 15|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_DistanceLo : 27|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_DistanceHi : 23|12@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_DestDistanceLo : 43|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_DestDistanceHi : 39|12@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_ExpectRemainHour : 55|8@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TbT_ExpectRemainMin : 61|6@0+ (1,0) [0|0] "" H_U
+
+BO_ 326 TMU_HU_PE_02: 8 TMU
+ SG_ TMU_CallStatus : 3|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_CallType : 6|3@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_CDMA_Streng : 11|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_PacketStatus : 13|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TalkTimeHour : 20|5@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TalkTimeMinute : 29|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TalkTimeSecond : 37|6@0+ (1,0) [0|0] "" H_U
+
+BO_ 325 TMU_HU_PE_01: 8 TMU
+ SG_ TMU_AliveStatus : 2|3@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_AudioStatus : 4|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_UpdateStatus : 7|3@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_LangStatus : 10|3@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_VoiceRecStatus : 12|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_MicStatus : 14|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_ServCommuStatus : 19|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_PowerStatus : 21|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_EngineStatus : 23|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_DownProgress : 31|8@0+ (1,0) [0|0] "" H_U
+
+BO_ 69 TMU_HU_E_04: 8 TMU
+ SG_ TMU_eCall : 1|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 67 TMU_GW_E_01: 8 TMU
+ SG_ C_ReqDrLock : 1|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ C_ReqDrUnlock : 3|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ C_ReqHazard : 5|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ C_ReqHorn : 7|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ C_ReqEngineOperate : 9|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+
+BO_ 66 TMU_HU_E_03: 8 TMU
+ SG_ CDMA_SelfDiag : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ CDMA_Antena_SelfDiag : 3|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 1345 TMU_HU_P_02: 8 TMU
+ SG_ TMU_SupVoiceTextService : 1|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_SupEcoCoachService : 3|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_SupSongTagService : 5|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_SupContentService : 7|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_MajorVersion : 15|8@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_MinorVersion : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_DistributeInfo : 27|4@0+ (1,0) [0|0] "" H_U
+
+BO_ 65 TMU_HU_E_02: 8 TMU
+ SG_ TMU_BarLevel1 : 7|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel2 : 1|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel4 : 21|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel3 : 11|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel5 : 31|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel6 : 25|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel8 : 45|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel7 : 35|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel9 : 55|6@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BarLevel10 : 63|6@0+ (1,0) [0|0] "" H_U
+
+BO_ 1344 TMU_HU_P_01: 8 TMU
+ SG_ TMU_Arrow : 3|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_ReFill_Info : 5|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_AverageMPG : 1|10@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_TotalMPG : 23|10@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_RewardStar : 37|14@0+ (1,0) [0|0] "" H_U
+
+BO_ 64 TMU_HU_E_01: 8 TMU
+ SG_ TMU_DisMode : 3|4@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_AudSrcType : 7|4@0+ (1,0) [0|0] "" CLU,DATC,H_U
+ SG_ TMU_AudReqCmd : 9|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_LangCmd : 12|3@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_ServReq : 15|3@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_ErrorEvent : 23|8@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_BeepCmd : 25|2@0+ (1,0) [0|0] "" H_U
+ SG_ TMU_eCall : 28|3@0+ (1,0) [0|0] "" H_U
+
+BO_ 62 HU_Navi_E_00: 8 H_U
+ SG_ Navi_SLIF_SpdUnit : 1|2@0+ (1,0) [0|0] "" CGW,CLU,HUD
+ SG_ Navi_SLIF_Frwinfo : 4|3@0+ (1,0) [0|0] "" CGW,CLU,HUD
+ SG_ Navi_SLIF_LinkClass : 7|3@0+ (1,0) [0|0] "" CGW,CLU,HUD
+ SG_ Navi_SLIF_SpdLimit : 15|8@0+ (1,0) [1|254] "" CGW,CLU,HUD
+ SG_ Navi_SLIFMapSource : 29|4@0+ (1,0) [0|8] "" CGW,CLU,HUD
+ SG_ Navi_SLIF_CountryCode : 23|10@0+ (1,0) [0|0] "" CGW,CLU,HUD
+
+BO_ 52 HU_DATC_E_02: 8 H_U
+ SG_ HU_DATC_DrTempUpDn : 1|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_PsTempUpDn : 3|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_RlTempUpDn : 5|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_RrTempUpDn : 7|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_MainBlower : 11|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_SubBlower : 15|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_RearBlower : 19|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATCRearPsModeSet : 23|4@0+ (1,0) [0|0] "" CGW,CLU
+ SG_ HU_DATC_FrontModeSet : 27|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_RearModeSet : 31|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_AutoSet : 33|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_OffReq : 35|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_IntakeSet : 37|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_RearOnOffSet : 39|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_AcSet : 41|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_AqsSet : 43|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_FrontDefog : 45|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_RearDefog : 47|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_ZoneControl : 49|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ HU_DATC_CO2Set : 51|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ DATC_SmartVentOnOffSet : 53|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM
+ SG_ DATC_ADSOnOffSet : 55|2@0+ (1,0) [0|0] "" CGW,CLU
+ SG_ HU_DATC_RearAutoDisp : 57|2@0+ (1,0) [0|0] "" CGW,CLU
+ SG_ HU_DATC_RearOffDisp : 59|2@0+ (1,0) [0|0] "" CGW,CLU
+
+BO_ 308 DATC_PE_05: 8 CLU
+ SG_ DATC_PwrInfo : 3|4@0+ (1,0) [0|0] "" AMP,AVM,CUBIS,H_U,MON
+ SG_ DATC_AltL : 5|2@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_CarInfo : 7|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_ParkingBrake : 9|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_LowFuelWarn : 11|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_Rear_Off_Disp : 13|2@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_Rear_AutoDisp : 15|2@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_Rear_BlowerDisp : 19|4@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_DrSeatWarmerDisp : 22|3@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_SyncDisp : 27|4@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_RearDispCtrl : 31|4@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_RearDrModeDisp : 35|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_PsSeatWarmerDisp : 38|3@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_DrVentSeatDisp : 42|3@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_PSVentSeatDisp : 46|3@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_RrDefLed : 49|2@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_SmartVentOnOffStatus : 51|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_ADSOnOffStatus : 53|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_AcDisp_OSD : 55|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_PsModeDisp_OSD : 59|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_ModeDisp_OSD : 63|4@0+ (1,0) [0|0] "" H_U
+
+BO_ 307 DATC_PE_04: 8 CLU
+ SG_ DATC_DiagMode : 1|2@0+ (1,0) [0|0] "" H_U,IBOX,MON
+ SG_ DATC_Rear_ChangeReqDisp : 3|2@0+ (1,0) [0|0] "" H_U,IBOX,MON
+ SG_ DATC_Rear_ClimateScnDisp : 5|2@0+ (1,0) [0|0] "" H_U,IBOX,MON
+ SG_ DATC_CO2OnOffStatus : 7|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_SelfDiagDisp : 15|8@0+ (1,0) [0|0] "" H_U,IBOX,MON
+ SG_ DATC_RearBlwDisp_OSD : 19|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_AqsLevelOut : 23|4@0+ (1,0) [0|0] "" H_U,IBOX,MON
+ SG_ DATC_RearModeDisp : 27|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_RearPsModeDisp : 31|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_FrontBlwDisp_Ps : 35|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_AutoDisp_Ps : 39|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_RearModeDisp_OSD : 43|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_RearPSModeDisp_OSD : 47|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_FrontBlwDisp_OSD : 51|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_FrontBlwDispPs_OSD : 55|4@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_Variant : 63|8@0+ (1,0) [0|0] "" H_U,IBOX,MON
+
+BO_ 306 DATC_PE_03: 8 CLU
+ SG_ DATC_ModeDisp : 3|4@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_TempUnit : 5|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_AutoDisp : 9|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_IntakeDisp : 11|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_ChangeReqDisp : 13|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_AcDisp : 17|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_AqsDisp : 19|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_ClimateScnDisp : 21|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_DualDisp : 25|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_OffDisp : 27|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_OpSts : 30|3@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_RearManual : 33|2@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_FrDefLed : 37|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_SmartVentDisp : 39|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_AutoDefogBlink : 41|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_ADSDisp : 43|2@0+ (1,0) [0|0] "" H_U
+ SG_ DATC_IonClean : 45|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_CO2Warning : 47|2@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_SubBlowerDisp : 51|4@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_BeepReq : 55|4@0+ (1,0) [0|0] "" H_U,KBD,MON
+ SG_ DATC_MainBlowerDisp : 59|4@0+ (1,0) [0|0] "" H_U,IBOX
+ SG_ DATC_PsModeDisp : 63|4@0+ (1,0) [0|0] "" H_U,IBOX
+
+BO_ 1329 DATC_P_02: 8 CLU
+ SG_ DATC_AmbientTemp_C : 7|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_AmbientTemp_F : 23|8@0+ (1,0) [0|0] "" H_U,MON
+
+BO_ 305 DATC_PE_02: 8 CLU
+ SG_ DATC_DrTempDispC : 7|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON
+ SG_ DATC_Rear_DrTempDispC : 15|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON
+ SG_ DATC_DrTempDispF : 23|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON
+ SG_ DATC_Rear_DrTempDispF : 31|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON
+ SG_ DATC_PsTempDispC : 39|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON
+ SG_ Datc_RearPsTempDispC : 47|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON
+ SG_ DATC_PsTempDispF : 55|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON
+ SG_ DATC_RearPsTempDispF : 63|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON
+
+BO_ 304 DATC_PE_01: 8 CLU
+ SG_ DATC_Type : 7|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_VerMMMajor : 15|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_VerMMMinor : 23|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_VerBDFMajor : 31|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_VerBDMinor : 39|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_VerCSMajor : 47|8@0+ (1,0) [0|0] "" H_U,MON
+ SG_ DATC_VerCSMinor : 55|8@0+ (1,0) [0|0] "" H_U,MON
+
+BO_ 291 HU_CLU_PE_07: 8 H_U
+ SG_ NV_DS_Curve : 3|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_Merge : 7|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_RailCross : 9|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_FallingRocks : 11|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_SchoolZone : 13|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_AccidentBlack : 15|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_SpeedBump : 17|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_RoadKill : 19|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_Downhill : 21|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DS_Fog : 23|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_Display_TG : 31|2@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_Charge : 39|16@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_Charge_Unit : 55|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ TBT_BarGraph100Level : 63|8@0+ (1,0) [0|100] "%" CLU,HUD
+
+BO_ 290 HU_CLU_PE_06: 8 H_U
+ SG_ NV_SD_SpdLimit2 : 3|4@0+ (10,0) [0|0] "km/h" CLU
+ SG_ NV_SD_SpdLimit1 : 7|4@0+ (10,0) [0|0] "km/h" CLU
+ SG_ NV_SD_EtcCam : 11|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_SpdLimit3 : 15|4@0+ (10,0) [0|0] "km/h" CLU
+ SG_ NV_SD_SignCam : 17|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_SignOverCam : 19|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_MobileCam : 21|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_FixedCam : 23|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_OverLoadCam : 25|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_ParkCam : 27|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_CutInCam : 29|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_BusOnlyCam : 31|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_ShoulderCam : 35|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_TrafficCam : 37|2@0+ (1,0) [0|0] "" CLU
+ SG_ NV_SD_PlateRcgCam : 39|2@0+ (1,0) [0|0] "" CLU
+
+BO_ 286 HU_CLU_PE_10: 8 H_U
+ SG_ Navi_TBTInfo : 63|8@0+ (1,0) [0|0] "" CGW,CLU
+
+BO_ 29 CLU_HU_E_00: 8 CLU
+ SG_ SYS_CLUVer : 7|16@0+ (1,0) [0|0] "" CUBIS,H_U
+ SG_ CLU_ClockInfoReq : 17|2@0+ (1,0) [0|0] "" H_U
+ SG_ CLU_DateInfoReq : 19|2@0+ (1,0) [0|0] "" H_U
+
+BO_ 27 AMP_HU_E_00: 8 AMP
+ SG_ SYS_AMPVer : 7|16@0+ (1,0) [0|0] "" H_U
+
+BO_ 23 HU_IPM_E_00: 8 H_U
+ SG_ C_ADrLNValueSet : 2|3@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ADrUNValueSet : 5|3@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ SYS_Ver_Req : 7|2@0+ (1,0) [0|0] "" AMP,AVM,CLU,CUBIS,DATC,IPM
+ SG_ C_IMSRValueReq : 9|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_PSMNValueSet : 11|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_SCMNValueSet : 13|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ADrLURValueReq : 15|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ABuzzerNValueSet : 17|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_AlarmRValueReq : 19|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ArmWKeyNValueSet : 21|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_TwUnRValueReq : 23|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_TwUnNValueSet : 25|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_AutoMRFoldRValueReq : 27|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_AutoMRFoldNValueSet : 29|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ADrLRValueReq : 31|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ArmWKeyRValueReq : 33|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ABuzzerRValueReq : 35|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_ADrURValueReq : 37|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_PSMRValueReq : 39|2@0+ (1,0) [0|0] "" DATC,IPM
+ SG_ C_SCMRValueReq : 47|2@0+ (1,0) [0|0] "" DATC,IPM
+
+BO_ 277 HU_CLU_PE_02: 8 H_U
+ SG_ TBT_Display_Type : 7|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ TBT_Side_Street : 15|16@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ TBT_Direction : 31|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ TBT_Distance_Turn_Point : 39|16@0+ (1,0) [0|0] "m" CLU,HUD
+ SG_ TBT_Combined_Side_Street : 51|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ TBT_Scale : 55|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ TBT_DistancetoTurnPoint : 59|4@0+ (1,0) [0|0] "times" CLU,HUD
+ SG_ TBT_Bar_Graph_Level : 63|4@0+ (10,0) [0|100] "" CLU,HUD
+
+BO_ 276 HU_CLU_PE_01: 8 H_U
+ SG_ HU_OpState : 6|7@0+ (1,0) [0|0] "" AMP,CLU
+ SG_ HU_Navi_On_Off : 7|1@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ HU_Preset_Number : 12|5@0+ (1,1) [1|30] "" AMP,CLU
+ SG_ HU_Tuner_Area : 15|3@0+ (1,0) [0|0] "" AMP,CLU
+ SG_ HU_Track_Number : 23|16@0+ (1,0) [0|0] "" CLU
+ SG_ HU_Play_time_Sec : 39|6@0+ (1,0) [0|0] "" CLU
+ SG_ HU_Play_time_Min : 33|7@0+ (1,0) [0|0] "" CLU
+ SG_ HU_Play_time_Hour : 42|6@0+ (1,0) [0|0] "" CLU
+ SG_ HU_Disc_select_No : 59|4@0+ (1,0) [0|0] "" CLU
+ SG_ HU_Frequency : 52|9@0+ (1,0) [0|0] "" AMP,CLU
+
+BO_ 17 HU_AMP_E_10: 8 H_U
+ SG_ AMP_Beep2VolumeStep : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep2Frequency : 15|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep2Ch_OutputMask : 31|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep2DurationOn : 47|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep2DurationOff : 55|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep2NumberOfCycles : 63|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 15 HU_AMP_E_08: 8 H_U
+ SG_ AMP_MainVolumeSet : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_BalanceSet : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_FadeSet : 23|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_BassSet : 31|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_MidSet : 39|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_TrebleSet : 47|8@0+ (1,0) [0|0] "" AMP
+
+BO_ 14 HU_AMP_E_07: 8 H_U
+ SG_ AMP_HFVolumeStep : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_HFMainAudioCut : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_HFChannelOutputMask : 23|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_HFChannelMuteMask : 39|16@0+ (1,0) [0|0] "" AMP
+
+BO_ 13 HU_AMP_E_06: 8 H_U
+ SG_ AMP_MTSVolumeStep : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_MTSMainAudioCut : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_MTSChannelOutputMask : 23|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_MTSChannelMuteMask : 39|16@0+ (1,0) [0|0] "" AMP
+
+BO_ 12 HU_AMP_E_05: 8 H_U
+ SG_ AMP_NaviVolumeStep : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_NaviMainAudioCut : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_NaviChannelOutputMask : 23|16@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_NaviChannelMuteMask : 39|16@0+ (1,0) [0|0] "" AMP
+
+BO_ 11 HU_AMP_E_04: 8 H_U
+ SG_ AMP_Drive : 1|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_ConvertibleTop : 5|2@0+ (1,0) [0|0] "" AMP
+
+BO_ 10 HU_AMP_E_03: 8 H_U
+ SG_ AMP_CrtVehicleID : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_SPDIFMode : 11|4@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_VersionReq : 17|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_UpdateStart : 25|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_UpdateEnd : 33|2@0+ (1,0) [0|0] "" AMP
+
+BO_ 9 HU_AMP_E_02: 8 H_U
+ SG_ AMP_Mute : 1|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_RearSpMute : 3|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_SurroundMode : 5|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_VEQMode : 7|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_AudioMode : 15|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_EQ : 17|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Reset : 19|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_SPDIFMute : 21|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_DefaultBeep1 : 25|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_DefaultBeep2 : 29|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_BeatsMode : 33|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_VIPMode : 35|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_QLSMode : 37|2@0+ (1,0) [0|0] "" AMP
+
+BO_ 1288 HU_CLU_P_02: 8 H_U
+ SG_ NV_TIME_TYPE : 3|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_Hour : 15|8@0+ (1,0) [0|0] "" CLU
+ SG_ NV_Min : 23|8@0+ (1,0) [0|0] "" CLU
+
+BO_ 8 HU_AMP_E_01: 8 H_U
+ SG_ AMP_HFMode : 1|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_NaviMode : 3|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_MTSMode : 5|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_VSCMode : 7|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep1Mode : 9|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_Beep2Mode : 11|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_SDVCStep : 14|3@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_ASDMode : 18|3@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_SignalDoctor : 20|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_AutoVolume : 22|2@0+ (1,0) [0|0] "" AMP
+
+BO_ 1287 HU_CLU_P_01: 8 H_U
+ SG_ NV_DistToTurn_F1 : 3|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DistToTurn_Unit : 7|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DistToTurn_F3 : 11|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DistToTurn_F2 : 15|4@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DistToTurn_I1 : 23|16@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DistToTurn_I2 : 39|16@0+ (1,0) [0|0] "" CLU
+ SG_ NV_DistToTurn_I3 : 55|16@0+ (1,0) [0|0] "" CLU
+
+BO_ 1286 HU_CLU_P_00: 8 H_U
+ SG_ NV_EstDist_F : 3|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_EstDist_Unit : 7|4@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_EstHour : 15|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_EstMin : 23|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_Azimuth : 31|8@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_EstDist_I : 39|16@0+ (1,0) [0|0] "" CLU,HUD
+ SG_ NV_EstimTimeType : 49|2@0+ (1,0) [0|0] "" CGW,CLU,HUD
+ SG_ NV_EstimTimeFormat : 51|2@0+ (1,0) [0|0] "" CGW,CLU,HUD
+
+BO_ 1284 HU_AMP_P_01: 8 H_U
+ SG_ HU_VehicleSpeed : 7|8@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_SetMaxMainVolStep : 9|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_LKASWarningOn : 21|2@0+ (1,0) [0|0] "" AMP
+ SG_ AMP_BSDWarningOn : 23|2@0+ (1,0) [0|0] "" AMP
+
+BO_ 256 HU_MON_PE_01: 8 H_U
+ SG_ HU_Type : 7|8@0+ (1,0) [0|0] "" AMP,CGW,CLU,HUD,KMA_TMU
+ SG_ HU_VerMajor : 15|8@0+ (1,0) [0|0] "" AMP,CLU,KMA_TMU,MON
+ SG_ HU_VerMinor : 23|8@0+ (1,0) [0|0] "" AMP,CLU,KMA_TMU,MON
+ SG_ HU_DistributeInfo : 31|8@0+ (1,0) [0|0] "" AMP,CGW,CLU,KMA_TMU,MON,RRC
+ SG_ HU_SubVerMajor : 39|8@0+ (1,0) [0|0] "" AMP,MON
+ SG_ HU_SubVerMinor : 47|8@0+ (1,0) [0|0] "" AMP,MON
+ SG_ HU_SDARSVersion : 55|8@0+ (1,0) [0|0] "" AMP,MON
+ SG_ HU_AdasSupport : 58|3@0+ (1,0) [0|0] "" CGW,CLU
+
+BO_ 1092 NM_CLOCK: 8 CLOCK
+ SG_ Destination_CLOCK : 7|8@0+ (1,0) [0|0] "" HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_CLOCK : 13|2@0+ (1,0) [0|0] "" HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_CLOCK : 10|3@0+ (1,0) [0|0] "" HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1108 NM_HUD: 8 HUD
+ SG_ Destination_HUD : 7|8@0+ (1,0) [0|0] "" CLOCK,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_HUD : 13|2@0+ (1,0) [0|0] "" CLOCK,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_HUD : 10|3@0+ (1,0) [0|0] "" CLOCK,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1088 NM_H_U: 8 H_U
+ SG_ Destination_H_U : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_H_U : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_H_U : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1091 NM_DATC: 8 DATC
+ SG_ Destination_DATC : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_DATC : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_DATC : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1105 NM_CCP: 8 CCP
+ SG_ Destination_CCP : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_CCP : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_CCP : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1100 NM_KMA_TMU: 8 KMA_TMU
+ SG_ Destination_KMA_TMU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_KMA_TMU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_KMA_TMU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1098 NM_CUBIS: 8 CUBIS
+ SG_ Destination_CUBIS : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_CUBIS : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_CUBIS : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1099 NM_TMU: 8 TMU
+ SG_ Destination_TMU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_TMU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_TMU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1095 NM_IPM: 8 IPM
+ SG_ Destination_IPM : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_IPM : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_IPM : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1107 NM_RSE_R: 8 RSE_R
+ SG_ Destination_RSE_R : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_RSE_R : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_RSE_R : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1093 NM_RRC: 8 RRC
+ SG_ Destination_RRC : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_RRC : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_RRC : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1109 NM_CGW: 8 CGW
+ SG_ Destination_CGW : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_CGW : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_CGW : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1106 NM_RSE_L: 8 RSE_L
+ SG_ Destination_RSE_L : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_RSE_L : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_RSE_L : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1096 NM_AMP: 8 AMP
+ SG_ Destination_AMP : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_AMP : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_AMP : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1103 NM_EDT: 8 EDT
+ SG_ Destination_EDT : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_EDT : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_EDT : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1110 NM_SWRC: 8 SWRC
+ SG_ Destination_SWRC : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_SWRC : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_SWRC : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,IBOX,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1102 NM_IBOX: 8 IBOX
+ SG_ Destination_IBOX : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_IBOX : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,CLU,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_IBOX : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,CLU,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1101 NM_CLU: 8 CLU
+ SG_ Destination_CLU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,FHCU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_CLU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,FHCU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_CLU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,FHCU,ASD,MON,AVM,KBD
+
+BO_ 1097 NM_FHCU: 8 FHCU
+ SG_ Destination_FHCU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,ASD,MON,AVM,KBD
+ SG_ NMSleepFlag_FHCU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,ASD,MON,AVM,KBD
+ SG_ NMCommandCode_FHCU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,ASD,MON,AVM,KBD
+
+BO_ 1094 NM_ASD: 8 ASD
+ SG_ Destination_ASD : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,MON,AVM,KBD
+ SG_ NMSleepFlag_ASD : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,MON,AVM,KBD
+ SG_ NMCommandCode_ASD : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,MON,AVM,KBD
+
+BO_ 1089 NM_MON: 8 MON
+ SG_ Destination_MON : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,AVM,KBD
+ SG_ NMSleepFlag_MON : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,AVM,KBD
+ SG_ NMCommandCode_MON : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,AVM,KBD
+
+BO_ 1104 NM_AVM: 8 AVM
+ SG_ Destination_AVM : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,KBD
+ SG_ NMSleepFlag_AVM : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,KBD
+ SG_ NMCommandCode_AVM : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,KBD
+
+BO_ 1090 NM_KBD: 8 KBD
+ SG_ Destination_KBD : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM
+ SG_ NMSleepFlag_KBD : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM
+ SG_ NMCommandCode_KBD : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM
+
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_180_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_180_generated.dbc
new file mode 100644
index 000000000..ab1d24719
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_180_generated.dbc
@@ -0,0 +1,143 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_canfd_corner_radar_180.dbc starts here";
+VERSION ""
+
+
+NS_ :
+ NS_DESC_
+ CM_
+ BA_DEF_
+ BA_
+ VAL_
+ CAT_DEF_
+ CAT_
+ FILTER
+ BA_DEF_DEF_
+ EV_DATA_
+ ENVVAR_DATA_
+ ENVVAR_TYPE_
+ 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 RADAR
+
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BO_ 384 CORNER_RADAR_180_OBJECTS_180: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 384 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 384 30;
+
+BO_ 385 CORNER_RADAR_180_OBJECTS_181: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 385 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 385 30;
+
+BO_ 386 CORNER_RADAR_180_OBJECTS_182: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 386 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 386 30;
+
+BO_ 387 CORNER_RADAR_180_OBJECTS_183: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 387 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 387 30;
+
+BO_ 388 CORNER_RADAR_180_OBJECTS_184: 32 RADAR
+ SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+ SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX
+ SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX
+ SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 388 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 388 30;
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_235_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_235_generated.dbc
new file mode 100644
index 000000000..91eb79bdd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_235_generated.dbc
@@ -0,0 +1,281 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_canfd_corner_radar_235.dbc starts here";
+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_
+ 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 RADAR
+
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BO_ 565 CORNER_RADAR_235_OBJECTS_235: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 565 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 565 30;
+
+BO_ 566 CORNER_RADAR_235_OBJECTS_236: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 566 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 566 30;
+
+BO_ 567 CORNER_RADAR_235_OBJECTS_237: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 567 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 567 30;
+
+BO_ 568 CORNER_RADAR_235_OBJECTS_238: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 568 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 568 30;
+
+BO_ 569 CORNER_RADAR_235_OBJECTS_239: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 569 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 569 30;
+
+BO_ 570 CORNER_RADAR_235_OBJECTS_23a: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 570 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 570 30;
+
+BO_ 571 CORNER_RADAR_235_OBJECTS_23b: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 571 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 571 30;
+
+BO_ 572 CORNER_RADAR_235_OBJECTS_23c: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 572 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 572 30;
+
+BO_ 573 CORNER_RADAR_235_OBJECTS_23d: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 573 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 573 30;
+
+BO_ 574 CORNER_RADAR_235_OBJECTS_23e: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 574 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 574 30;
+
+BO_ 575 CORNER_RADAR_235_OBJECTS_23f: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 575 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 575 30;
+
+BO_ 576 CORNER_RADAR_235_OBJECTS_240: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 576 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 576 30;
+
+BO_ 577 CORNER_RADAR_235_OBJECTS_241: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 577 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 577 30;
+
+BO_ 578 CORNER_RADAR_235_OBJECTS_242: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 578 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 578 30;
+
+BO_ 579 CORNER_RADAR_235_OBJECTS_243: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 579 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 579 30;
+
+BO_ 580 CORNER_RADAR_235_OBJECTS_244: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 580 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 580 30;
+
+BO_ 581 CORNER_RADAR_235_OBJECTS_245: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 581 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 581 30;
+
+BO_ 582 CORNER_RADAR_235_OBJECTS_246: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 582 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 582 30;
+
+BO_ 583 CORNER_RADAR_235_OBJECTS_247: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 583 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 583 30;
+
+BO_ 584 CORNER_RADAR_235_OBJECTS_248: 32 RADAR
+ SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX
+ SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX
+ SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX
+ SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX
+ SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX
+CM_ BO_ 584 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined.";
+BA_ "GenMsgCycleTime" BO_ 584 30;
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_430_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_430_generated.dbc
new file mode 100644
index 000000000..e704037c0
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_corner_radar_430_generated.dbc
@@ -0,0 +1,617 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_canfd_corner_radar_430.dbc starts here";
+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_
+ 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 RADAR
+
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BO_ 1072 CORNER_RADAR_430_OBJECTS_430: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1072 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1072 30;
+
+BO_ 1073 CORNER_RADAR_430_OBJECTS_431: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1073 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1073 30;
+
+BO_ 1074 CORNER_RADAR_430_OBJECTS_432: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1074 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1074 30;
+
+BO_ 1075 CORNER_RADAR_430_OBJECTS_433: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1075 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1075 30;
+
+BO_ 1076 CORNER_RADAR_430_OBJECTS_434: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1076 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1076 30;
+
+BO_ 1077 CORNER_RADAR_430_OBJECTS_435: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1077 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1077 30;
+
+BO_ 1078 CORNER_RADAR_430_OBJECTS_436: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1078 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1078 30;
+
+BO_ 1079 CORNER_RADAR_430_OBJECTS_437: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1079 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1079 30;
+
+BO_ 1088 CORNER_RADAR_430_OBJECTS_440: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1088 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1088 30;
+
+BO_ 1089 CORNER_RADAR_430_OBJECTS_441: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1089 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1089 30;
+
+BO_ 1090 CORNER_RADAR_430_OBJECTS_442: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1090 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1090 30;
+
+BO_ 1091 CORNER_RADAR_430_OBJECTS_443: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1091 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1091 30;
+
+BO_ 1092 CORNER_RADAR_430_OBJECTS_444: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1092 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1092 30;
+
+BO_ 1093 CORNER_RADAR_430_OBJECTS_445: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1093 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1093 30;
+
+BO_ 1094 CORNER_RADAR_430_OBJECTS_446: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1094 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1094 30;
+
+BO_ 1095 CORNER_RADAR_430_OBJECTS_447: 32 RADAR
+ SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX
+ SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX
+CM_ BO_ 1095 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated.";
+BA_ "GenMsgCycleTime" BO_ 1095 30;
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_canfd_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_generated.dbc
new file mode 100644
index 000000000..0a3fdc117
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_generated.dbc
@@ -0,0 +1,1110 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_canfd.dbc starts here";
+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
+
+BO_ 64 GEAR_ALT: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ GEAR_STEP : 67|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 76|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 69 GEAR: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ RIGHT_PADDLE : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_PADDLE : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_STEP : 146|5@1+ (1,0) [0|31] "" XXX
+ SG_ GEAR_STEP1 : 154|5@1+ (1,0) [0|31] "" XXX
+
+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_ACTIVE : 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_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ DampingGain : 104|8@1+ (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_ 96 ESP_STATUS: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ TRACTION_AND_STABILITY_CONTROL : 42|3@1+ (1,0) [0|63] "" XXX
+ SG_ BRAKE_PRESSURE : 128|11@1+ (1,0) [0|2047] "" XXX
+ SG_ BRAKE_PRESSED : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ AUTO_HOLD : 192|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 101 BRAKE: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_LIGHT : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_POSITION : 40|16@1- (1,0) [0|65535] "" XXX
+ SG_ BRAKE_PRESSED : 57|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 112 GEAR_ALT_2: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 60|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 160 WHEEL_SPEEDS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ MOVING_FORWARD : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVING_BACKWARD : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVING_FORWARD2 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVING_BACKWARD2 : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ 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_ 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|3] "" 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
+
+BO_ 234 MDPS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKA_ACTIVE : 48|1@0+ (1,0) [0|16777215] "" XXX
+ SG_ LKA_FAULT : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_OUT_TORQUE : 64|12@1+ (0.1,-204.8) [0|65535] "" XXX
+ SG_ STEERING_COL_TORQUE : 80|13@1+ (1,-4095) [0|4095] "" XXX
+ SG_ STEERING_ANGLE : 96|16@1- (-0.1,0) [0|255] "deg" XXX
+ SG_ STEERING_ANGLE_2 : 128|16@1- (-0.1,0) [0|65535] "deg" XXX
+ SG_ LFA2_ACTIVE : 145|2@0+ (1,0) [0|3] "" XXX
+ SG_ LFA2_FAULT : 149|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 159|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 167|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 175|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 256 ACCELERATOR_BRAKE_ALT: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSED : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACCELERATOR_PEDAL_PRESSED : 176|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 261 ACCELERATOR_ALT: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ ACCELERATOR_PEDAL : 103|10@1+ (0.25,0) [0|1022] "" XXX
+
+BO_ 267 CRUISE_BUTTONS_ALT2: 16 XXX
+ SG_ CRUISE_BUTTONS : 83|4@0+ (1,0) [0|15] "" XXX
+ SG_ LFA_BTN : 87|1@0+ (1,0) [0|1] "" 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_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" 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|1] "" XXX
+ SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX
+ SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" 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
+
+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_ LKA_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" 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|1] "" XXX
+ SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX
+ SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX
+ SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 304 GEAR_SHIFTER: 16 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ PARK_BUTTON : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX
+ SG_ GEAR : 64|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 1079 TRAILER_STATUS: 8 XXX
+ SG_ TRAILER_CONNECTED : 0|1@1+ (1,0) [0|1] "" 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_ NEW_SIGNAL_1 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|8@0+ (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
+ SG_ NEW_SIGNAL_3 : 95|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 102|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 353 ADRV_0x161: 32 ADRV
+ 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_ FCA_IMAGE : 42|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_ 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|15] "" XXX
+ SG_ LANELINE_CURVATURE : 100|4@1+ (1,0) [0|31] "" XXX
+ SG_ LANELINE_CURVATURE_DIRECTION : 104|1@0+ (1,0) [0|1] "" 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|31] "" XXX
+ SG_ ALERTS_3 : 139|5@1+ (1,0) [0|31] "" XXX
+ SG_ ALERTS_4 : 144|8@1+ (1,0) [0|255] "" XXX
+ SG_ ALERTS_5 : 152|5@1+ (1,0) [0|31] "" 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_ SETSPEED_HUD : 181|3@1+ (1,0) [0|7] "" 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_ vSetDis : 200|8@1+ (1,0) [0|255] "" XXX
+ SG_ SETSPEED : 208|4@1+ (1,0) [0|7] "" XXX
+ SG_ HDA_ICON : 212|3@1+ (1,0) [0|7] "" XXX
+ SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX
+ SG_ NAV_ICON : 220|3@1+ (1,0) [0|7] "" XXX
+ SG_ LFA_ICON : 224|3@1+ (1,0) [0|7] "" XXX
+ SG_ LCA_LEFT_ICON : 228|3@1+ (1,0) [0|7] "" XXX
+ SG_ LCA_RIGHT_ICON : 232|3@1+ (1,0) [0|7] "" 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
+
+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|1@0+ (1,0) [0|1] "" XXX
+ SG_ FF_DETECT : 64|5@1+ (1,0) [0|31] "" XXX
+ SG_ FF_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ FF_LATERAL : 80|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ FF_DETECT_ALT : 88|5@1+ (1,0) [0|31] "" XXX
+ SG_ FF_DISTANCE_ALT : 93|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ FF_LATERAL_ALT : 104|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ LF_DETECT : 112|5@1+ (1,0) [0|31] "" XXX
+ SG_ LF_DETECT_DISTANCE : 117|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LF_DETECT_LATERAL : 128|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ RF_DETECT : 136|5@1+ (1,0) [0|31] "" XXX
+ SG_ RF_DETECT_DISTANCE : 141|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ RF_DETECT_LATERAL : 152|7@1+ (0.1,0) [0|127] "m" XXX
+ SG_ LR_DETECT : 163|5@1+ (1,0) [0|31] "" XXX
+ SG_ LR_DETECT_DISTANCE : 175|8@0+ (0.1,0) [0|255] "" XXX
+ SG_ LR_DETECT_LATERAL : 176|7@1+ (0.1,0) [0|127] "" XXX
+ SG_ RR_DETECT : 192|5@1+ (1,0) [0|31] "" XXX
+ SG_ RR_DETECT_DISTANCE : 197|8@1+ (0.1,0) [0|255] "" XXX
+ SG_ RR_DETECT_LATERAL : 205|7@1+ (0.1,0) [0|127] "" 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
+
+BO_ 357 SPAS1: 24 APRK
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX
+ SG_ NEW_SIGNAL_1 : 96|16@1- (0.1,0) [0|0] "" XXX
+
+BO_ 362 SPAS2: 32 APRK
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ BLINKER_CONTROL : 133|3@1+ (1,0) [0|0] "" XXX
+
+BO_ 373 TCS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 24|7@1+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_9 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ aBasis : 32|11@1+ (0.01,-10.23) [0|7] "m/s^2" XXX
+ SG_ NEW_SIGNAL_1 : 47|5@0+ (1,0) [0|31] "" XXX
+ SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_2 : 63|5@0+ (1,0) [0|31] "" XXX
+ SG_ SCC_OptTyp : 64|2@1+ (1,0) [0|0] "" AWD,EMS,FR_CMR,HCU,H_U_MM,TCU,VCU,vBDM
+ SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 69|1@0+ (1,0) [0|1] "" XXX
+ SG_ SCC_ReqLimSta : 70|2@1+ (1,0) [0|0] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM
+ SG_ ESC_StdStillVal : 72|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM
+ SG_ BrakeLight : 74|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESC_DclEnblReq : 76|2@1+ (1,0) [0|3] "" AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM
+ SG_ NEW_SIGNAL_5 : 79|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 80|1@0+ (1,0) [0|1] "" XXX
+ SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_20 : 82|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_11 : 83|1@0+ (1,0) [0|1] "" XXX
+ SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_10 : 85|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESC_PrkBrkActvSta : 86|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,RR_C_RDR,TCU,vBDM
+ SG_ NEW_SIGNAL_12 : 95|8@0+ (1,0) [0|255] "" XXX
+ SG_ FCA_EquipSta : 96|2@1+ (1,0) [0|3] "" ADAS_DRV,FR_CMR,H_U_MM,vBDM
+ SG_ FCA_AvlblSta : 98|2@1+ (1,0) [0|3] "" ADAS_DRV,AFCU_DRV,CLU,Dummy,FR_CMR,H_U_MM,vBDM
+ SG_ NEW_SIGNAL_13 : 103|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 111|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 119|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_16 : 127|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 128|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" 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_ NEW_SIGNAL_18 : 143|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_19 : 151|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 183|16@0+ (1,0) [0|65535] "" 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_ 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|12@1+ (0.1,-170) [-16.4|34.7] "m/s" XXX
+ SG_ ACC_ObjLatPos : 47|9@1- (0.1,-20) [0|511] "" XXX
+ SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SysFailState : 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_ TakeOverReq : 73|2@0+ (1,0) [0|3] "" XXX
+ SG_ InfoDisplay : 74|3@1+ (1,0) [0|7] "" XXX
+ SG_ DriverAlert : 77|2@1+ (1,0) [0|3] "" XXX
+ SG_ ObjDistLevel : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ DISTANCE_SETTING : 88|4@1+ (1,0) [0|15] "" XXX
+ SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX
+ SG_ NSCCOper : 104|2@1+ (1,0) [0|3] "" XXX
+ SG_ NSCCOnOff : 106|2@1+ (1,0) [0|3] "" XXX
+ SG_ HUD_LEAD_INFO : 108|3@1+ (1,0) [0|7] "" XXX
+ SG_ DriveMode : 112|3@1+ (1,0) [0|7] "" XXX
+ SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
+ SG_ aReqRaw : 140|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
+ SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX
+ SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX
+ SG_ AccelLimitBandUpper : 173|6@0+ (0.02,0) [0|63] "" XXX
+ SG_ AccelLimitBandLower : 181|6@0+ (0.02,0) [0|63] "" XXX
+ SG_ StopReq : 185|2@0+ (1,0) [0|3] "" XXX
+ SG_ CRUSE_INFO_SET_2 : 189|2@0+ (1,0) [0|3] "" XXX
+ SG_ TARGET_DISTANCE : 192|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX
+ SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX
+
+BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_ME_1 : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ DISTANCE_UNIT : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|3@1+ (1,0) [0|7] "" XXX
+ SG_ ADAPTIVE_CRUISE_MAIN_BTN : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_BUTTONS : 36|3@1+ (1,0) [0|4] "" XXX
+ SG_ LFA_BTN : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ NORMAL_CRUISE_MAIN_BTN : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 42|2@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_2 : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ CLU_SPEED : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX
+ SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 437 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_QUAL : 24|3@1+ (1,0) [0|7] "" XXX
+ SG_ LEFT_LDW : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ LEFT_POSITION : 29|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX
+ SG_ LEFT_HEADING : 43|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX
+ SG_ LEFT_CURVATURE : 64|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX
+ SG_ LEFT_CURVATURE_DERIVATIVE : 80|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX
+ SG_ RIGHT_QUAL : 96|3@1+ (1,0) [0|7] "" XXX
+ SG_ RIGHT_LDW : 99|2@1+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_POSITION : 101|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX
+ SG_ RIGHT_HEADING : 115|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX
+ SG_ RIGHT_CURVATURE : 128|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX
+ SG_ RIGHT_CURVATURE_DERIVATIVE : 144|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX
+ SG_ LEAD : 192|7@1+ (1,0) [0|127] "" XXX
+ SG_ LEAD_SPEED : 200|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX
+ SG_ LEAD_DISTANCE : 212|12@1+ (0.05,0) [0|204.75] "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_ 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_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_LEFT_TWO : 30|1@0+ (1,0) [0|3] "" XXX
+ SG_ INDICATOR_RIGHT_TWO : 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_ INDICATOR_LEFT_THREE : 128|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_RIGHT_THREE : 130|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_LEFT_FOUR : 138|1@0+ (1,0) [0|1] "" XXX
+ SG_ INDICATOR_RIGHT_FOUR : 141|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 463 CRUISE_BUTTONS: 8 XXX
+ SG_ _CHECKSUM : 0|8@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX
+ SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX
+ SG_ ADAPTIVE_CRUISE_MAIN_BTN : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ NORMAL_CRUISE_MAIN_BTN : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ LFA_BTN : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_PADDLE : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_PADDLE : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_1_ : 40|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 474 ADRV_0x1da: 32 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_22 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_41 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 480 LFAHDA_CLUSTER: 16 FR_CMR
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HDA_OptUsmSta : 24|3@1+ (1,0) [0|0] "" CGW
+ SG_ LFA_OptUsmSta : 27|3@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_CntrlModSta : 30|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_InfoPUDis : 32|3@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_AutoSetSpdSta : 35|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_AutoSetSpdUpdtSta : 37|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_AutoSetSpdVal : 39|8@1+ (1,0) [0|0] "km/h" CGW
+ SG_ HDA_LFA_SymSta : 47|2@1+ (1,0) [0|0] "" CGW
+ SG_ HDA_LFA_WrnSnd : 49|2@1+ (1,0) [0|0] "" Dummy
+ SG_ HDA_InfoPUDis1 : 51|3@1+ (1,0) [0|7] "" CLU,CGW
+ SG_ HDA_TDMRMDclReq : 54|2@1+ (1,0) [0|3] "" Dummy
+
+BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 490 ADRV_0x1ea: 32 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINK_HOLD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINK_HOLD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ HDA_MODE2 : 32|3@1+ (1,0) [0|3] "" XXX
+ SG_ LANE_LEFT : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_6 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_RIGHT : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ LANE_CHANGING : 45|3@0+ (1,0) [0|1] "" XXX
+ SG_ LF_DETECT_DISTANCE : 46|11@1+ (0.1,0) [0|2047] "" XXX
+ SG_ LF_DETECT_LATERAL : 70|7@0+ (0.1,0) [0|127] "" XXX
+ SG_ LF_DETECT : 74|3@0+ (1,0) [0|7] "" XXX
+ SG_ RF_DETECT_DISTANCE : 75|11@1+ (0.1,0) [0|2047] "" XXX
+ SG_ RF_DETECT_LATERAL : 94|7@0+ (0.1,0) [0|127] "" XXX
+ SG_ RF_DETECT : 98|3@0+ (1,0) [0|7] "" XXX
+ SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX
+ SG_ LR_DETECT_DISTANCE : 139|8@1+ (0.1,0) [0|511] "m" XXX
+ SG_ LR_DETECT_LATERAL : 152|6@1+ (0.1,0) [0|63] "" XXX
+ SG_ LR_DETECT : 162|3@0+ (1,0) [0|1] "" XXX
+ SG_ RR_DETECT_DISTANCE : 163|8@1+ (0.1,0) [0|511] "m" XXX
+ SG_ RR_DETECT_LATERAL : 172|6@1+ (0.1,0) [0|63] "" XXX
+ SG_ RR_DETECT : 186|3@0+ (1,0) [0|1] "" XXX
+ SG_ AUTOLANECHANGE_MSG : 207|4@0+ (1,0) [0|3] "" XXX
+ SG_ LANELINE_CURVATURE : 208|4@1+ (1,0) [0|31] "" XXX
+ SG_ LANELINE_CURVATURE_DIRECTION : 212|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANELINE_LEFT_POSITION : 239|8@0+ (1,0) [0|255] "" XXX
+ SG_ LANELINE_RIGHT_POSITION : 247|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 248|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 506 CLUSTER_SPEED_LIMIT: 32 CAM
+ 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_ NEW_SIGNAL_2 : 122|3@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_ NEW_SIGNAL_4 : 143|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 146|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_1 : 147|7@1+ (1,0) [0|127] "" XXX
+ SG_ SCHOOL_ZONE : 155|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPEED_LIMIT_4 : 215|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 223|8@0+ (1,0) [0|255] "" 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
+
+BO_ 512 ADRV_0x200: 8 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_E1 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ TauGapSet : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_2 : 35|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_1 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ TauGapSet_ : 42|3@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|5@0+ (1,0) [0|31] "" 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_ 560 HCU_STATUS_230: 32 XXX
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ HYBRID_POWER_FLOW_MODE : 170|4@1+ (1,0) [0|15] "" XXX
+
+CM_ BO_ 560 "Hyundai/Kia CAN-FD hybrid power-flow status observed on ECAN at 10 Hz; ACAN 0x230/DLC16 is an unrelated radar frame.";
+CM_ SG_ 560 HYBRID_POWER_FLOW_MODE "Reverse-engineered enum; observed values 1, 2, and 6 correspond to the OEM EV indicator being on.";
+
+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_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 687 STEER_TOUCH_2AF: 8 XXX
+ SG_ CHECKSUM_ : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER_ : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ TOUCH_DETECT : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ TOUCH1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ TOUCH2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 63|8@0+ (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
+ SG_ MSLA_STATUS : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 837 ADRV_0x345: 8 ADRV
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_15 : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 866 CAM_0x362: 32 CAMERA
+ SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" 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
+ SG_ RIGHT_BSD : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BSD : 28|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 928 TPMS: 16 XXX
+ SG_ PRESSURE_FL : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ PRESSURE_FR : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ PRESSURE_RL : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ PRESSURE_RR : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ STATUS_TPMS : 66|3@0+ (1,0) [0|3] "" XXX
+ SG_ UNIT : 68|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 961 BLINKER_STALKS: 8 XXX
+ SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ HIGHBEAM_FORWARD : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ HIGHBEAM_BACKWARD : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 32|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 995 BLINKERS_ALT: 16 XXX
+ SG_ LEFT_BLINKER : 74|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 76|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LAMP_ALT : 89|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LAMP : 90|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP_ALT : 91|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP : 92|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 95|1@0+ (1,0) [0|1] "" XXX
+ SG_ BLINKER_ACTIVE : 97|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1041 DOORS_SEATBELTS: 8 XXX
+ SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|65535] "" XXX
+ SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ DRIVER_DOOR : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ PASSENGER_DOOR : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_REAR_DOOR : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ PASSENGER_REAR_DOOR : 56|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 BLINKERS: 8 XXX
+ SG_ LEFT_STALK : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_STALK : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ LEFT_LAMP : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LAMP_ALT : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LAMP_ALT : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ USE_ALT_LAMP : 62|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1052 LIGHT_SENSOR: 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_ IS_DARK : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ LIGHT_LEVEL : 24|10@1+ (1,0) [0|1023] "" XXX
+
+BO_ 1144 DRIVE_MODE: 8 XXX
+ SG_ DRIVE_MODE : 0|16@1+ (1,-61611) [0|61611] "" XXX
+ SG_ DRIVE_MODE2 : 28|3@1+ (1,0) [1|3] "" XXX
+
+BO_ 1151 HVAC_TOUCH_BUTTONS: 8 XXX
+ SG_ AUTO_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ SYNC_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FR_DEFROST_BUTTON : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ RR_DEFROST_BUTTON : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ FAN_SPEED_UP_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ FAN_SPEED_DOWN_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ AIR_DIRECTION_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ AC_BUTTON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_ONLY_BUTTON : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ RECIRC_BUTTON : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEAT_BUTTON : 52|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1187 HDA_INFO_4A3: 8 XXX
+ SG_ LinkClass : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ Frwinfo : 3|3@1+ (1,0) [0|7] "" XXX
+ SG_ SpeedUnit : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ SPEED_LIMIT : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ CountryCode : 16|10@1+ (1,0) [0|1023] "" XXX
+ SG_ MapSource : 27|3@1+ (1,0) [0|7] "" XXX
+ SG_ TollExist : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ TunnelExist : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|24@0+ (1,0) [0|16777215] "" XXX
+
+BO_ 1204 NEW_MSG_4B4: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_7 : 35|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1209 NEW_MSG_4B9: 8 XXX
+ SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1214 NEW_MSG_4BE: 8 XXX
+ SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1240 CLUSTER_INFO: 8 XXX
+ SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1259 LOCAL_TIME2: 8 XXX
+ SG_ HOURS : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
+ SG_ SECONDS : 24|6@1+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1264 LOCAL_TIME: 8 XXX
+ SG_ HOURS : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
+ SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX
+ SG_ MONTH : 37|4@0+ (1,0) [0|15] "" XXX
+ SG_ YEAR : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ DATE : 48|5@1+ (1,0) [0|31] "" XXX
+
+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_ SG_ 272 LKAS_ANGLE_CMD "tracks MDPS->STEERING_ANGLE when not engaged, not STEERING_SENSORS->STEERING_ANGLE";
+CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings";
+CM_ SG_ 373 ACCEnable "Likely a copy of CAN's TCS13->ACCEnable";
+CM_ SG_ 373 DriverBraking "Likely derived from BRAKE->BRAKE_POSITION";
+CM_ SG_ 373 DriverBrakingLowSens "Higher threshold version of DriverBraking";
+CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?";
+CM_ SG_ 416 VSetDis "set speed in display units";
+CM_ SG_ 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_ 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_ 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" 4 "T";
+VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R";
+VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off";
+VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green";
+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_ 267 CRUISE_BUTTONS 8 "CRUISE_MAIN" 4 "CANCEL" 1 "RES" 2 "SET" 3 "GAP";
+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 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_ 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 0 "HIDDEN" 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";
+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";
+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 FF_DETECT 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 FF_DETECT_ALT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "DIM CONE" 4 "ORANGE CONE";
+VAL_ 354 LF_DETECT 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 RF_DETECT 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 LR_DETECT 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 RR_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE";
+VAL_ 354 FAULT_FSS 0 "HIDDEN" 1 "CHECK_FORWARD_SAFETY_SYSTEM" 2 "FORWARD_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED";
+VAL_ 354 FAULT_FCA 0 "HIDDEN" 1 "CHECK_FORWARD_SIDE_SAFETY_SYSTEM" 2 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED";
+VAL_ 354 FAULT_LSS 0 "HIDDEN" 1 "CHECK_LANE_SAFETY_SYSTEM" 2 "LANE_SAFETY_SYSTEM_DISABLED_CAMERA_OBSCURED";
+VAL_ 354 FAULT_SLA 0 "HIDDEN" 1 "CHECK_SPEED_LIMIT_SYSTEM" 2 "SPEED_LIMIT_SYSTEM_DISABLED_CAMERA_OBSCURED";
+VAL_ 354 FAULT_DAW 0 "HIDDEN" 1 "CHECK_INATTENTIVE_DRIVING_WARNING_SYSTEM" 2 "INATTENTIVE_DRIVING_WARNING_SYSTEM_DISABLED_CAMERA_OBSCURED";
+VAL_ 354 FAULT_HBA 0 "HIDDEN" 1 "CHECK_HIGH_BEAM_ASSIST_SYSTEM";
+VAL_ 354 FAULT_SCC 0 "HIDDEN" 1 "CHECK_SMART_CRUISE_CONTROL_SYSTEM" 2 "SMART_CRUISE_CONTROL_DISABLED_RADAR_BLOCKED";
+VAL_ 354 FAULT_LFA 0 "HIDDEN" 1 "CHECK_LANE_FOLLOWING_SYSTEM_ASSIST_SYSTEM";
+VAL_ 354 FAULT_HDA 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_ASSIST_SYSTEM";
+VAL_ 354 FAULT_LCA 0 "HIDDEN" 1 "CHECK_LANE_CHANGE_ASSIST_FUNCTION" 2 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_RADAR_BLOCKED";
+VAL_ 354 FAULT_HDP 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 2 "HIGHWAY_DRIVING_PILOT_DISABLED_CAMERA_OBSCURED" 3 "HIGHWAY_DRIVING_PILOT_DISABLED_RADAR_BLOCKED" 4 "HIGHWAY_DRIVING_PILOT_DISABLED_LIDAR_BLOCKED";
+VAL_ 354 FAULT_DAS 0 "HIDDEN" 1 "CHECK_DRIVER_ASSISTANCE_SYSTEM" 2 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_RADAR_BLOCKED" 4 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED_AND_RADAR_BLOCKED";
+VAL_ 354 FAULT_ESS 0 "HIDDEN" 1 "CHECK_EMERGENCY_STOPPING_FUNCTION" 2 "EMERGENCY_STOPPING_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "EMERGENCY_STOPPING_FUNCTION_DISABLED_RADAR_BLOCKED";
+VAL_ 362 BLINKER_CONTROL 1 "hazards" 2 "hazards button backlight" 3 "left blinkers" 4 "right blinkers";
+VAL_ 373 SCC_OptTyp 0 "SCC is not equipped" 1 "SCC is equipped" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue";
+VAL_ 373 SCC_ReqLimSta 0 "No request" 1 "Limited No Limitation" 2 "Acceleration Limited" 3 "Deceleration Limited";
+VAL_ 373 ESC_StdStillVal 0 "No stand still detected" 1 "stand still detected" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 ESC_DclEnblReq 0 "Disable deceleration control" 1 "Enable deceleration control" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 ESC_PrkBrkActvSta 0 "Parking brake is not activated" 1 "Parking brake is activated" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 FCA_EquipSta 0 "FCA is not equipped" 1 "FCA is equipped" 2 "Not used" 3 "Error Indicator";
+VAL_ 373 FCA_AvlblSta 0 "Available" 1 "Temporarily not available" 2 "Permanently not available" 3 "FCA Communication Error";
+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_ 480 HDA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)";
+VAL_ 480 LFA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)";
+VAL_ 480 HDA_CntrlModSta 0 "System Deactive (Default)" 1 "System Ready" 2 "System Active" 3 "Reserved";
+VAL_ 480 HDA_InfoPUDis 0 "No pop-up" 1 "system start pop-up" 2 "system auto disengaged pop-up by highway off" 3 "system auto disengaged pop-up" 4 "system Fail pop-up" 5 "Hands-off pop up" 6 "Hands-off pop up w/ sound" 7 "System Automatic off";
+VAL_ 480 HDA_AutoSetSpdSta 0 "Auto Set Speed Off" 1 "Auto Set Speed On" 2 "Reserved" 3 "Error indicator";
+VAL_ 480 HDA_AutoSetSpdUpdtSta 0 "Auto Set Speed Update Off" 1 "Auto Set Speed Update On" 2 "Reserved" 3 "Error indicator";
+VAL_ 480 HDA_LFA_SymSta 0 "Off" 1 "Gray" 2 "Green" 3 "Green blink";
+VAL_ 480 HDA_LFA_WrnSnd 0 "Off" 1 "Additional Warning Sound" 2 "Reserved" 3 "Error indicator";
+VAL_ 480 HDA_InfoPUDis1 0 "No Pop-up" 1 "System Automatic off (LFA)" 2 "System Automatic off (HDA)" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Not Used" 7 "Error Indicator";
+VAL_ 480 HDA_TDMRMDclReq 0 "Not automatically deactivated state of LFA (default)" 1 "Automatically deactivated state of LFA" 2 "Reserved" 3 "Reserved";
+VAL_ 490 HDA_MODE2 1 "Lane change icon gray" 2 "lane green + lane change icon green" 3 "lane green + lane change icon green (both blinking)" 4 "lane white + lane change icon white (both blinking rapidly)" 5 "Lane Change Assist system check warning";
+VAL_ 490 LANE_LEFT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET";
+VAL_ 490 LANE_RIGHT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET";
+VAL_ 490 LANE_CHANGING 0 "IDLE" 1 "LEFT_CHECK" 3 "LEFT_CHANGING" 2 "RIGHT_CHECK" 4 "RIGHT_CHANGING";
+VAL_ 490 LF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 RF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 LR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 RR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide";
+VAL_ 490 AUTOLANECHANGE_MSG 1 "Check surrounding conditions" 2 "Operating conditions not met" 3 "Analyzing driving lane" 4 "Sharp curve ahead" 5 "Current lane is too narrow" 6 "Not an operational section" 7 "Hazard lights are on" 8 "Vehicle speed is too low" 9 "Please hold the steering wheel" 10 "Not an operable lane" 11 "Steering input detected" 12 "Press the OK button to activate lane change assist";
+VAL_ 490 LANELINE_CURVATURE_DIRECTION 0 "LEFT" 1 "RIGHT";
+VAL_ 676 LEFT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+VAL_ 676 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+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_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+VAL_ 866 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue";
+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_ 1079 TRAILER_CONNECTED 1 "CONNECTED" 0 "DISCONNECTED";
+
+VAL_ 1144 DRIVE_MODE2 3 "Set Sport" 1 "Set Normal" 2 "Set Eco";
+VAL_ 1240 DISTANCE_UNIT 1 "Miles" 0 "Kilometers";
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_canfd_radar_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_radar_generated.dbc
new file mode 100644
index 000000000..c80080b43
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_canfd_radar_generated.dbc
@@ -0,0 +1,1181 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_canfd_radar.dbc starts here";
+
+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
+
+BO_ 528 RADAR_TRACK_210: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 529 RADAR_TRACK_211: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 530 RADAR_TRACK_212: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 531 RADAR_TRACK_213: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 532 RADAR_TRACK_214: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 533 RADAR_TRACK_215: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 534 RADAR_TRACK_216: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 535 RADAR_TRACK_217: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 536 RADAR_TRACK_218: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 537 RADAR_TRACK_219: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 538 RADAR_TRACK_21a: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 539 RADAR_TRACK_21b: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 540 RADAR_TRACK_21c: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 541 RADAR_TRACK_21d: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 542 RADAR_TRACK_21e: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 543 RADAR_TRACK_21f: 32 RADAR
+ SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX
+ SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX
+ SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX
+ SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX
+ SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 933 RADAR_TRACK_3a5: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 934 RADAR_TRACK_3a6: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 935 RADAR_TRACK_3a7: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 936 RADAR_TRACK_3a8: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 937 RADAR_TRACK_3a9: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 938 RADAR_TRACK_3aa: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 939 RADAR_TRACK_3ab: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 940 RADAR_TRACK_3ac: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 941 RADAR_TRACK_3ad: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 942 RADAR_TRACK_3ae: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 943 RADAR_TRACK_3af: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 944 RADAR_TRACK_3b0: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 945 RADAR_TRACK_3b1: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 946 RADAR_TRACK_3b2: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 947 RADAR_TRACK_3b3: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 948 RADAR_TRACK_3b4: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 949 RADAR_TRACK_3b5: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 950 RADAR_TRACK_3b6: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 951 RADAR_TRACK_3b7: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 952 RADAR_TRACK_3b8: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 953 RADAR_TRACK_3b9: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 954 RADAR_TRACK_3ba: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 955 RADAR_TRACK_3bb: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 956 RADAR_TRACK_3bc: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 957 RADAR_TRACK_3bd: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 958 RADAR_TRACK_3be: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 959 RADAR_TRACK_3bf: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 960 RADAR_TRACK_3c0: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 961 RADAR_TRACK_3c1: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 962 RADAR_TRACK_3c2: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 963 RADAR_TRACK_3c3: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 964 RADAR_TRACK_3c4: 24 RADAR
+ SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX
+ SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX
+ SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX
+ SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX
+ SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
+ SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
+ SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX
+ SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX
+ SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX
+
+BO_ 1024 RADAR_TRACK_400: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1025 RADAR_TRACK_401: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1026 RADAR_TRACK_402: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1027 RADAR_TRACK_403: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1028 RADAR_TRACK_404: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1029 RADAR_TRACK_405: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1030 RADAR_TRACK_406: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1031 RADAR_TRACK_407: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1032 RADAR_TRACK_408: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1033 RADAR_TRACK_409: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1034 RADAR_TRACK_40a: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1035 RADAR_TRACK_40b: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1036 RADAR_TRACK_40c: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1037 RADAR_TRACK_40d: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1038 RADAR_TRACK_40e: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1039 RADAR_TRACK_40f: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1040 RADAR_TRACK_410: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1041 RADAR_TRACK_411: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1042 RADAR_TRACK_412: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1043 RADAR_TRACK_413: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1044 RADAR_TRACK_414: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1045 RADAR_TRACK_415: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1046 RADAR_TRACK_416: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1047 RADAR_TRACK_417: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1048 RADAR_TRACK_418: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1049 RADAR_TRACK_419: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1050 RADAR_TRACK_41a: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1051 RADAR_TRACK_41b: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1052 RADAR_TRACK_41c: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
+BO_ 1053 RADAR_TRACK_41d: 24 RADAR
+ SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX
+ SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX
+ SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX
+ SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX
+
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_i30_2014.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_i30_2014.dbc
new file mode 100644
index 000000000..3524f9b21
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_i30_2014.dbc
@@ -0,0 +1,549 @@
+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
+
+
+BO_ 128 EMS_DCT1: 8 XXX
+ SG_ PV_AV_CAN : 0|8@1+ (0.3906,0) [0|99.603] "%" XXX
+ SG_ TQ_STND : 8|6@1+ (10,0) [0|630] "Nm" XXX
+ SG_ F_N_ENG : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ F_SUB_TQI : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ N : 16|16@1+ (0.25,0) [0|16383.8] "rpm" XXX
+ SG_ TQI_ACOR : 32|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQFR : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQI : 48|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ CF_Ems_Alive : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Ems_ChkSum : 60|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 129 EMS_DCT2: 8 XXX
+ SG_ CR_Ems_SoakTimeExt : 0|6@1+ (5,0) [0|315] "Min" XXX
+ SG_ BRAKE_ACT : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Ems_EngOperStat : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ CR_Ems_IndAirTemp : 16|8@1+ (0.75,-48) [-48|143.25] "" XXX
+ SG_ CF_Ems_Alive2 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Ems_ChkSum2 : 60|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 160 EngFrzFrm1: 8 XXX
+ SG_ PID_04h : 0|8@1+ (0.392157,0) [0|100] "%" XXX
+ SG_ PID_05h : 8|8@1+ (1,-40) [-40|215] "" XXX
+ SG_ PID_0Ch : 16|16@1+ (0.25,0) [0|16383.8] "rpm" XXX
+ SG_ PID_0Dh : 32|8@1+ (1,0) [0|255] "km/h" XXX
+ SG_ PID_11h : 40|8@1+ (0.392157,0) [0|100] "%" XXX
+ SG_ PID_03h : 48|16@1+ (1,0) [0|65535] "" XXX
+
+
+BO_ 161 EngFrzFrm2: 8 XXX
+ SG_ PID_06h : 0|8@1+ (0.78125,-100) [-100|99.22] "%" XXX
+ SG_ PID_07h : 8|8@1+ (0.78125,-100) [-100|99.22] "%" XXX
+ SG_ PID_08h : 16|8@1+ (0.78125,-100) [-100|99.22] "%" XXX
+ SG_ PID_09h : 24|8@1+ (0.78125,-100) [-100|99.22] "%" XXX
+ SG_ PID_0Bh : 32|8@1+ (1,0) [0|255] "kPa" XXX
+ SG_ PID_23h : 40|16@1+ (10,0) [0|655350] "kPa" XXX
+
+
+BO_ 304 YRS1: 8 XXX
+ SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [-163.84|163.83] "" XXX
+ SG_ CF_Yrs_SnsStat1 : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Yrs_YrStat : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Yrs_LatAc : 32|16@1+ (0.000127465,-4.17677) [-4.17677|4.17652] "g" XXX
+ SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Yrs_LatAcStat1 : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 305 YRS3: 8 XXX
+ SG_ CR_Yrs_YawAcc : 0|16@1+ (0.125,-4096) [-4096|4095.75] "" XXX
+ SG_ CF_Yrs_YawAccStat : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Yrs_Ax : 32|16@1+ (0.000127465,-4.17677) [-4.17677|4.17652] "g" XXX
+ SG_ CR_Yrs_MsgCnt3 : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Yrs_AxStat : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Yrs_Crc3 : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 320 YRS2: 8 XXX
+ SG_ CF_Yrs_McuStat : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ CF_Yrs_SnsStat2 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ CF_Yrs_ExtSysStat : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ CR_Yrs_Diag : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Yrs_Type : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 339 TCS1: 8 XXX
+ SG_ TCS_REQ : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ MSR_C_REQ : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_PAS : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_GSC : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Esc_LimoInfo : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ ABS_DIAG : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ ABS_DEF : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_DEF : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_CTL : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ ABS_ACT : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ EBD_DEF : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_PAS : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_DEF : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_CTL : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_MFRN : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ DBC_CTL : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ DBC_PAS : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ DBC_DEF : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ HAC_CTL : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ HAC_PAS : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ HAC_DEF : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESS_STAT : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ TQI_TCS : 24|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQI_MSR : 32|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ CF_Esc_BrkCtl : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESC_OFF_STEP : 49|2@1+ (1,0) [0|3] "" XXX
+ SG_ _4WD_Status : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ AliveCounter_TCS1 : 52|4@1+ (1,0) [0|1] "" XXX
+ SG_ CheckSum_TCS1 : 56|8@1+ (1,0) [0|1] "" XXX
+
+
+BO_ 356 VSM1: 8 XXX
+ SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" XXX
+ SG_ CF_Esc_Act : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Esc_CtrMode : 13|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Esc_Def : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Esc_AliveCnt : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Esc_Chksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 357 VSM2: 8 XXX
+ SG_ CR_Mdps_StrTq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" XXX
+ SG_ CR_Mdps_OutTq : 12|12@1+ (0.1,-204.8) [-204.8|204.7] "" XXX
+ SG_ CF_Mdps_Def : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Mdps_SErr : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Mdps_AliveCnt : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Mdps_Chksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 399 EMS_H2: 8 XXX
+ SG_ R_TqAcnApvC : 0|8@1+ (0.2,0) [0|51] "Nm" XXX
+ SG_ R_PAcnC : 8|8@1+ (125,0) [0|31875] "hPa" XXX
+ SG_ TQI_B : 16|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ SLD_VS : 24|8@1+ (1,0) [0|255] "km/h" XXX
+ SG_ CF_CdaStat : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Ems_IsgStat : 35|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Ems_OilChg : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_EtcLimpMod : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_NEngIdlTgC : 40|8@1+ (10,0) [0|2550] "rpm" XXX
+ SG_ CF_Ems_UpTarGr : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_DownTarGr : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_DesCurGr : 50|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Ems_SldAct : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_SldPosAct : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_HPresStat : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_IsgBuz : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_IdlStpFCO : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_FCopen : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_ActEcoAct : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_EngRunNorm : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_IsgStat2 : 62|2@1+ (2,0) [0|3] "" XXX
+
+
+BO_ 497 TCS5: 8 XXX
+ SG_ ABS_W_LAMP : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ EBD_W_LAMP : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_OFF_LAMP : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ TCS_LAMP : 3|2@1+ (1,0) [0|3] "" XXX
+ SG_ DBC_W_LAMP : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ DBC_F_LAMP : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ ODOMETER_LEFT : 8|4@1+ (1,0) [0|15] "m" XXX
+ SG_ ODOMETER_RIGHT : 12|4@1+ (1,0) [0|15] "m" XXX
+ SG_ WHEEL_FL : 16|12@1+ (0.125,0) [0|511.875] "km/h" XXX
+ SG_ WHEEL_FR : 28|12@1+ (0.125,0) [0|511.875] "km/h" XXX
+ SG_ WHEEL_RL : 40|12@1+ (0.125,0) [0|511.875] "km/h" XXX
+ SG_ WHEEL_RR : 52|12@1+ (0.125,0) [0|511.875] "km/h" XXX
+
+
+BO_ 544 ESP2: 8 XXX
+ SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
+ SG_ ESP2_AliveCounter_LSB : 11|3@1+ (1,0) [0|7] "" XXX
+ SG_ LAT_ACCEL_STAT : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ LAT_ACCEL_DIAG : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ LONG_ACCEL : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
+ SG_ ESP2_AliveCounter_MSB : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP2_Checksum_LSB : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ LONG_ACCEL_STAT : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ LONG_ACCEL_DIAG : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ CYL_PRES : 32|12@1+ (0.1,0) [0|409.5] "Bar" XXX
+ SG_ ESP12_Checksum_MSB : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ CYL_PRES_STAT : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ CYL_PRESS_DIAG : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ YAW_RATE : 48|13@1+ (0.01,-40.95) [-40.95|40.96] "" XXX
+ SG_ CYL_PRES_FLAG : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ YAW_RATE_STAT : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ YAW_RATE_DIAG : 63|1@1+ (1,0) [0|1] "" XXX
+
+
+BO_ 608 EMS6: 8 XXX
+ SG_ TQI_MIN : 0|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQI : 8|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQI_TARGET : 16|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ GLOW_STAT : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_LAMP_M : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_LAMP_S : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ ENG_STAT : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ SOAK_TIME_ERROR : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ SOAK_TIME : 32|8@1+ (1,0) [0|255] "Min" XXX
+ SG_ TQI_MAX : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [-35.625|60] "" XXX
+ SG_ Checksum : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ AliveCounter : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Ems_AclAct : 62|2@1+ (1,0) [0|3] "" XXX
+
+
+BO_ 672 EMS5: 8 XXX
+ SG_ ECGPOvrd : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ QECACC : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ ECFail : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ SwitchOffCondExt : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ BLECFail : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ AliveCounter : 5|2@1+ (1,0) [0|3] "" XXX
+ SG_ Byte0Parity : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ FA_PV_CAN : 8|8@1+ (0.3906,0) [0|99.2] "%" XXX
+ SG_ IntAirTemp : 16|8@1+ (0.75,-48) [-48|143.25] "" XXX
+ SG_ STATE_DC_OBD : 24|7@1+ (1,0) [0|127] "" XXX
+ SG_ INH_DC_OBD : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ CTR_IG_CYC_OBD : 32|16@1+ (1,0) [0|65535] "" XXX
+ SG_ CTR_CDN_OBD : 48|16@1+ (1,0) [0|65535] "" XXX
+
+
+BO_ 688 SAS1: 8 XXX
+ SG_ SAS_Angle : 0|16@1+ (0.1,0) [-3276.8|3276.7] "Deg" XXX
+ SG_ SAS_Speed : 16|8@1+ (4,0) [0|1016] "" XXX
+ SG_ SAS_Stat : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ MsgCount : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ CheckSum : 36|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 790 EMS1: 8 XXX
+ SG_ SWI_IGK : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ F_N_ENG : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACK_TCS : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ PUC_STAT : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ TQ_COR_STAT : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ RLY_AC : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ F_SUB_TQI : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ TQI_ACOR : 8|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ N : 16|16@1+ (0.25,0) [0|16383.8] "rpm" XXX
+ SG_ TQI : 32|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ TQFR : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ VS : 48|8@1+ (1,0) [0|254] "km/h" XXX
+ SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0) [0|2] "" XXX
+
+
+BO_ 809 EMS2: 8 XXX
+ SG_ TQ_STND : 0|6@1+ (10,0) [0|630] "Nm" XXX
+ SG_ CAN_VERS : 0|6@1+ (1,0) [0|7.7] "" XXX
+ SG_ CONF_TCU : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ OBD_FRF_ACK : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ MUL_CODE : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ TEMP_ENG : 8|8@1+ (0.75,-48) [-48|143.25] "" XXX
+ SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0) [0|1.99155] "" XXX
+ SG_ VB_OFF_ACT : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACK_ES : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ CONF_MIL_FMY : 26|3@1+ (1,0) [0|7] "" XXX
+ SG_ OD_OFF_REQ : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACT : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ CLU_ACK : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_ACT : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ ENG_CHR : 34|4@1+ (1,0) [0|15] "" XXX
+ SG_ GP_CTL : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ TPS : 40|8@1+ (0.469484,-15.0235) [-15.0235|104.695] "%" XXX
+ SG_ PV_AV_CAN : 48|8@1+ (0.3906,0) [0|99.603] "%" XXX
+ SG_ ENG_VOL : 56|8@1+ (0.1,0) [0|25.5] "liter" XXX
+
+
+BO_ 848 FATC: 8 XXX
+ SG_ CR_Fatc_TqAcnOut : 0|8@1+ (0.2,0) [0|50.8] "Nm" XXX
+ SG_ CF_Fatc_AcnRqSwi : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_AcnCltEnRq : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_EcvFlt : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_BlwrOn : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_FATC_Iden : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Fatc_BlwrMax : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_EngStartReq : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_IsgStopReq : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_CtrInf : 17|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Fatc_MsgCnt : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Fatc_OutTemp : 24|8@1+ (0.5,-40) [-40|60] "" XXX
+ SG_ CR_Fatc_OutTempSns : 32|8@1+ (0.5,-40) [-40|60] "" XXX
+ SG_ CF_Fatc_Compload : 40|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Fatc_ActiveEco : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_AutoActivation : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_DefSw : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_PtcRlyStat : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Fatc_ChkSum : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 880 TCU3: 8 XXX
+ SG_ N_TGT_LUP : 0|8@1+ (10,500) [500|3040] "rpm" XXX
+ SG_ SLOPE_TCU : 8|6@1+ (0.5,-16) [-16|15.5] "%" XXX
+ SG_ CF_Tcu_InhCda : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_IsgInhib : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_BkeOnReq : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_NCStat : 18|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_TarGr : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Tcu_ShfPatt : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Tcu_InhVis : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_PRelReq : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_ITPhase : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_ActEcoRdy : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_TqGrdLim : 32|8@1+ (10,0) [0|2540] "Nm/s" XXX
+ SG_ CR_Tcu_IsgTgtRPM : 40|8@1+ (20,0) [0|3500] "rpm" XXX
+ SG_ TQI_TCU_INC : 48|8@1+ (0.390625,0) [0|99.6094] "%" XXX
+ SG_ CF_Tcu_SbwPInfo : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_SptRdy : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_Alive3 : 58|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_ChkSum3 : 60|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 898 EMS9: 8 XXX
+ SG_ CF_Ems_BrkReq : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_DnShftReq : 1|4@1+ (1,0) [0|14] "" XXX
+ SG_ CF_Ems_RepModChk : 5|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_DecelReq : 8|12@1+ (0.001,-4.094) [-4.094|0] "m/s^2" XXX
+ SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0) [0|4094] "hPa" XXX
+ SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40) [0|254] "" XXX
+ SG_ CF_Ems_PumpTPres : 40|8@1+ (3.13725,0) [0|800] "kPa" XXX
+ SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41) [-40|60] "" XXX
+ SG_ CF_Ems_OPSFail : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_ECTTRQLIM : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 1075 EPB1: 8 XXX
+ SG_ EPB_I_LAMP : 0|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPB_F_LAMP : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ EPB_ALARM : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ EPB_CLU : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ EPB_SWITCH : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ EPB_RBL : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ EPB_STATUS : 19|3@1+ (1,0) [0|7] "" XXX
+ SG_ EPB_FRC_ERR : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ EPB_DBF_STAT : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_ACK : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ EPB_DBF_REQ : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ EPB_FAIL : 29|3@1+ (1,0) [0|7] "" XXX
+ SG_ EPB_FORCE : 32|12@1+ (1,-1000) [-1000|3000] "" XXX
+ SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0) [0|2.54] "g" XXX
+
+
+BO_ 1087 TCU1: 8 XXX
+ SG_ ETL_TCU : 0|8@1+ (2,0) [0|508] "Nm" XXX
+ SG_ CUR_GR : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Tcu_Alive : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_ChkSum : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ VS_TCU : 16|8@1+ (1,0) [0|254] "km/h" XXX
+ SG_ FAN_CTRL_TCU : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_ACT_TCU : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ FUEL_CUT_TCU : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ INH_FUEL_CUT : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ IDLE_UP_TCU : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ N_INC_TCU : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15|15] "" XXX
+ SG_ N_TC_RAW : 40|16@1+ (0.25,0) [0|16383.5] "rpm" XXX
+ SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0) [0|0.992188] "km/h" XXX
+
+
+BO_ 1088 TCU2: 8 XXX
+ SG_ ETL_TCU : 0|8@1+ (2,0) [0|508] "Nm" XXX
+ SG_ CUR_GR : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Tcu_Alive : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_ChkSum : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ VS_TCU : 16|8@1+ (1,0) [0|254] "km/h" XXX
+ SG_ FAN_CTRL_TCU : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_ACT_TCU : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ FUEL_CUT_TCU : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ INH_FUEL_CUT : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ IDLE_UP_TCU : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ N_INC_TCU : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15|15] "" XXX
+ SG_ N_TC_RAW : 40|16@1+ (0.25,0) [0|16383.5] "rpm" XXX
+ SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0) [0|0.992188] "km/h" XXX
+
+
+BO_ 1200 WHL_SPD: 8 XXX
+ SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0) [0|511.969] "km/h" XXX
+ SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0) [0|511.969] "km/h" XXX
+ SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0) [0|511.969] "km/h" XXX
+ SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0) [0|511.969] "km/h" XXX
+
+
+BO_ 1201 WHL_PUL: 8 XXX
+ SG_ WHL_PUL_FL : 0|8@1+ (0.5,0) [0|127.5] "pulse count" XXX
+ SG_ WHL_PUL_FR : 8|8@1+ (0.5,0) [0|127.5] "pulse count" XXX
+ SG_ WHL_PUL_RL : 16|8@1+ (0.5,0) [0|127.5] "pulse count" XXX
+ SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|127.5] "pulse count" XXX
+ SG_ WHL_DIR_FL : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ WHL_DIR_FR : 34|2@1+ (1,0) [0|3] "" XXX
+ SG_ WHL_DIR_RL : 36|2@1+ (1,0) [0|3] "" XXX
+ SG_ WHL_DIR_RR : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ WHL_PUL_Chksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+
+BO_ 1264 CLU1: 8 XXX
+ SG_ CF_Clu_CruiseSwState : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Blr_MaxStat : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_SldMainSW : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_ParityBit1 : 5|1@1+ (1,0) [0|1] "pulse count" XXX
+ SG_ CF_Clu_SPEED_UNIT : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_ParkBrakeSw : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0) [0|255.5] "km/h or MPH" XXX
+ SG_ CF_Clu_AliveCounter : 17|7@1+ (1,0) [0|127] "" XXX
+ SG_ CF_Clu_CruiseSwMain : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_VanzDecimal : 25|2@1+ (1,0) [0|0.375] "" XXX
+ SG_ VEHICLE_INFO : 27|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_StrRlyState : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_SMKOption : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_TqAcnOutC : 32|8@1+ (1,0) [0|51] "Nm" XXX
+ SG_ CF_Clu_Odometer : 40|24@1+ (0.1,0) [0|1.67772e+006] "km" XXX
+
+
+BO_ 1265 CLU3: 8 XXX
+ SG_ CF_Clu_AcnRqSwi : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_AcnCltEnRq : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_RefDetMod : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_DefoggerRly : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_LowfuelWarn : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_SportsModeSwi : 18|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_ALightStat : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_FrtFog : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_DetentOut : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HeadLampTail : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_TrailerMode : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_DTE : 25|10@1+ (1,0) [0|1023] "" XXX
+ SG_ CF_Clu_TripUnit : 35|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_IsaMainSW : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_FlexSteerSW : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_AvsmCur : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HudSpeedset : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HudTbtSet : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HudSccSet : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HudLdwsSet : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HudDisSet : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HudFontSizeSet : 47|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_HudFontColorSet : 49|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_HudBrightSet : 51|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_HudHeightSet : 53|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_CluInfo : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_RheostatLevel : 56|5@1+ (1,0) [0|31] "" XXX
+ SG_ CF_Clu_DrivinglampStat : 61|3@1+ (1,0) [0|7] "" XXX
+
+
+BO_ 1349 EMS4: 8 XXX
+ SG_ IMMO_LAMP_STAT : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_MIL : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ IM_STAT : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ AMP_CAN : 3|5@1+ (10.7316,458.98) [458.98|791.66] "mmHg" XXX
+ SG_ FCO : 8|16@1+ (0.128,0) [0|8388.48] "ul" XXX
+ SG_ VB : 24|8@1+ (0.101563,0) [0|25.8984] "V" XXX
+ SG_ TEMP_FUEL : 48|8@1+ (0.75,-48) [-48|143.25] "" XXX
+ SG_ Split_Stat : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Ems_IsaAct : 57|1@1+ (1,0) [0|1] "" XXX
+
+
+BO_ 1435 TCU4: 8 XXX
+ SG_ CF_TCU_WarnMsg : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_TCU_WarnImg : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_TCU_WarnSnd : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_EolStat : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ CR_Tcu_GearSelDisp2 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Tcu_StRelStat : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_DriWarn1 : 13|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Tcu_DriWarn2 : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_DrivingModeReq : 18|4@1+ (1,0) [0|0] "" XXX
+ SG_ CF_Tcu_DrivingModeDisp : 22|4@1+ (1,0) [0|0] "" XXX
+ SG_ CF_Tcu_SiCluster : 26|5@1+ (1,0) [0|0] "" XXX
+ SG_ CF_Tcu_DSmode_Inf : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Tcu_Alive4 : 58|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Tcu_ChkSum4 : 60|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 1508 MDPS1: 8 XXX
+ SG_ CF_Mdps_WLmp : 1|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Mdps_ALTRequest : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Mdps_Flex : 8|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Mdps_FlexDisp : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Mdps_CurrMode : 12|2@1+ (1,0) [0|3] "" XXX
+
+
+BO_ 1680 CLU2: 8 XXX
+ SG_ CF_Clu_IGNSw : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ RKE_CMD : 3|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_DrvDrSw : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_DrvKeyLockSw : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_DrvKeyUnlockSw : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ PIC_Lock : 10|3@1+ (1,0) [0|7] "" XXX
+ SG_ PIC_Unlock : 13|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_DrvSeatBeltSw : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_TrunkTgSw : 18|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_AstSeatBeltSw : 20|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_HoodSw : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_TurnSigLh : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_TurnSigRh : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_LdwsLkasSW : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_WiperIntT : 27|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_WiperIntSW : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_WiperLow : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_WiperHigh : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_WiperAuto : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_RainSnsStat : 34|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_HeadLampLow : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HeadLampHigh : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_AltLStatus : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_SwiGearR : 43|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_SWL_Stat : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Clu_ActiveEcoSW : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_HazardSW : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ CF_Clu_AliveCnt2 : 50|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_Clu_AstDrSw : 54|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_LkasDispMode : 56|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_AutoLightLevel : 58|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Clu_SunRoofOpenState : 60|1@1+ (1,0) [0|1] "" XXX
+
+
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_kia_denso_front_radar_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_kia_denso_front_radar_generated.dbc
new file mode 100644
index 000000000..e491c89e8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_kia_denso_front_radar_generated.dbc
@@ -0,0 +1,120 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_kia_denso_front_radar.dbc starts here";
+
+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
+
+BO_ 1280 RADAR_TRACK_500: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1281 RADAR_TRACK_501: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1282 RADAR_TRACK_502: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1283 RADAR_TRACK_503: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1284 RADAR_TRACK_504: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1285 RADAR_TRACK_505: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1286 RADAR_TRACK_506: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1287 RADAR_TRACK_507: 8 RADAR
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX
+ SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX
+ SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX
+ SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX
+ SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_kia_generic.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_kia_generic.dbc
new file mode 100644
index 000000000..b3bde5fd6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_kia_generic.dbc
@@ -0,0 +1,1703 @@
+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_: IAP ODS _4WD BCM HUD DATC MDPS AAF_Tester AEMC SMK _4WD EPB CUBIS MTS TMU EVP CGW TPMS LPI DI_BOX SPAS EMS LCA TCU IBOX FATC AFLS FPCM SCC AHLS AVM ABS SNV OPI PGS SAS AAF Dummy LDWS_LKAS LVR ESC PSB CLU ECS ACU REA
+
+BO_ 1532 ODS13: 5 ODS
+ SG_ CR_Ods_ID : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_Chksum_H : 8|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+ SG_ CR_Ods_Chksum_L : 16|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+ SG_ CR_Ods_RomID_H : 24|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+ SG_ CR_Ods_RomID_L : 32|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy
+
+BO_ 1531 ODS12: 8 ODS
+ SG_ CR_Ods_SerNum0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum3 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum4 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum5 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum6 : 48|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+ SG_ CR_Ods_SerNum7 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" ACU
+
+BO_ 1530 ODS11: 8 ODS
+ SG_ CF_Ods_PrcCmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy
+ SG_ CF_Ods_BtsFail : 3|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy
+ SG_ CF_Ods_AcuRcvSN : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_EolCal : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_PsFail : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_EcuFail : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_WgtStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CF_Ods_OccStat : 16|1@1+ (1.0,0.0) [0.0|1.0] "" ACU
+ SG_ CR_Wcs_ErrStat : 32|8@1+ (1.0,0.0) [0.0|63.0] "" ACU
+ SG_ CR_Wcs_ClassStat : 40|8@1+ (1.0,0.0) [0.0|4.0] "" ACU,BCM
+
+BO_ 1017 ECS12: 4 ECS
+ SG_ Height_FL : 0|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+ SG_ Height_FR : 8|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+ SG_ Height_RL : 16|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+ SG_ Height_RR : 24|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS
+
+BO_ 1268 SPAS12: 8 SPAS
+ SG_ CF_Spas_HMI_Stat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_Spas_Disp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS
+ SG_ CF_Spas_FIL_Ind : 10|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FIR_Ind : 13|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FOL_Ind : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FOR_Ind : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_VolDown : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_RIL_Ind : 24|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_RIR_Ind : 27|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FLS_Alarm : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_ROL_Ind : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_ROR_Ind : 35|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FCS_Alarm : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_FI_Ind : 40|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_RI_Ind : 43|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU
+ SG_ CF_Spas_FRS_Alarm : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_FR_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Spas_RR_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Spas_BEEP_Alarm : 52|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Spas_StatAlarm : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Spas_RLS_Alarm : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_RCS_Alarm : 59|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_RRS_Alarm : 61|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1265 CLU11: 4 CLU
+ SG_ CF_Clu_CruiseSwState : 0|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,LDWS_LKAS,SCC
+ SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,LDWS_LKAS,SCC
+ SG_ CF_Clu_SldMainSW : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Clu_ParityBit1 : 5|1@1+ (1.0,0.0) [0.0|1.0] "pulse count" EMS
+ SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0.0) [0.0|0.375] "" EMS
+ SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0.0) [0.0|255.5] "km/h or MPH" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ CF_Clu_DetentOut : 18|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,BCM,LCA,PGS,SPAS
+ SG_ CF_Clu_RheostatLevel : 19|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,BCM,LCA,PGS,SPAS
+ SG_ CF_Clu_CluInfo : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_AmpInfo : 25|1@1+ (1.0,0.0) [0.0|1.0] "" BCM
+ SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1.0,0.0) [0.0|15.0] "" AHLS,EMS,EPB,LDWS_LKAS,MDPS,SCC
+
+BO_ 1260 Sign_Detection: 8 XXX
+ SG_ SpeedLim_Nav_Cam : 40|8@1+ (1,0) [0|255] "km/h / mph" XXX
+ SG_ SpeedLim_Nav_Cam2 : 48|8@1+ (1,0) [0|255] "km/h / mph" XXX
+
+BO_ 1492 TMU_GW_PE_01: 8 CLU
+ SG_ TMU_IVRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ TMU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+
+BO_ 1491 HU_DATC_PE_00: 8 CLU
+ SG_ HU_VRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ HU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ BlowerNoiseControl : 4|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+
+BO_ 1490 HU_DATC_E_02: 8 CLU
+ SG_ HU_DATC_RearOnOffSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ HU_DATC_ADSOnOffSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+
+BO_ 1479 EMS21: 8 EMS
+ SG_ SCR_LEVEL_WARN_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ SCR_LEVEL_WARN : 1|3@1+ (1.0,0.0) [0.0|4.0] "" CLU
+ SG_ SCR_SYS_ERROR_WARN : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ SCR_SYSTEM_WARN_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ SCR_INDUCEMENT_EXIT_COND : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ SCR_UREA_LEVEL : 16|8@1+ (0.5,0.0) [0.0|100.0] "%" CLU
+ SG_ SCR_NO_REMAINING_RESTARTS : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ SCR_REMAINING_DISTANCE : 32|16@1+ (1.0,0.0) [0.0|25000.0] "km" CLU
+
+BO_ 1472 GW_Warning_PE: 8 BCM
+ SG_ Audio_VolumeDown : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Flh_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Fcnt_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Frh_Alarm : 52|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Rlh_Alarm : 56|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS
+ SG_ Pas_Spkr_Rcnt_Alarm : 58|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ Pas_Spkr_Rrh_Alarm : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS
+
+BO_ 1984 CAL_SAS11: 2 ESC
+ SG_ CCW : 0|4@1+ (1.0,0.0) [0.0|15.0] "" SAS
+ SG_ SAS_CID : 4|11@1+ (1.0,0.0) [0.0|2047.0] "" SAS
+
+BO_ 1456 CLU12: 4 CLU
+ SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0.0) [0.0|1677721.4] "km" _4WD,AAF,BCM,CUBIS,EMS,EPB,IBOX,LDWS_LKAS,SCC,TPMS
+
+BO_ 688 SAS11: 5 MDPS
+ SG_ SAS_Angle : 0|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" _4WD,ACU,AFLS,AVM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU,_4WD,ACU,AFLS,AVM,BCM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU
+ SG_ SAS_Speed : 16|8@1+ (4.0,0.0) [0.0|1016.0] "" AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU,AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU
+ SG_ SAS_Stat : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ MsgCount : 32|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS
+ SG_ CheckSum : 36|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS
+
+BO_ 1441 ACU12: 8 ACU
+ SG_ CR_Acu_SN : 0|64@1+ (1.0,0.0) [0.0|0.0] "" ODS
+
+BO_ 1440 ACU11: 8 ACU
+ SG_ CF_Ods_SNRcv : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Ods_IDRcv : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Ods_RZReq : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Abg_DepInhEnt : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_Abg_DepEnt : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ODS
+ SG_ CF_PasBkl_FltStat : 28|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB
+ SG_ CF_DriBkl_FltStat : 29|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB
+ SG_ CF_PasBkl_Stat : 30|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,ODS,PSB,TMU
+ SG_ CF_DriBkl_Stat : 31|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB
+ SG_ CF_SWL_Ind : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX
+ SG_ CF_Acu_FltStat : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX
+ SG_ CF_Acu_ExtOfSab : 36|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,CUBIS,IBOX
+ SG_ CF_Acu_Dtc : 40|16@1+ (1.0,0.0) [0.0|65535.0] "" CUBIS,IBOX
+ SG_ CF_Acu_NumOfFlt : 56|8@1+ (1.0,0.0) [0.0|255.0] "" CUBIS,IBOX
+
+BO_ 1437 AHLS11: 8 AHLS
+ SG_ CF_Ahls_WarnLamp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Ahls_WarnMsg : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1434 PSB11: 2 PSB
+ SG_ PSB_LH_FAIL : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ PSB_LH_TGL : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ PSB_LH_ACT : 3|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy
+ SG_ PSB_RH_FAIL : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ PSB_RH_TGL : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ PSB_RH_ACT : 11|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy
+
+BO_ 916 TCS13: 8 ESC
+ SG_ aBasis : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC
+ SG_ BrakeLight : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,SCC
+ SG_ DCEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ AliveCounterTCS : 13|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,SCC
+ SG_ Pre_TCS_CTL : 16|1@1+ (1.0,0.0) [0.0|1.0] "" Vector__XXX
+ SG_ EBA_ACK : 17|1@1+ (1.0,0.0) [0.0|1.0] "" Vector__XXX
+ SG_ FCA_ACK : 18|1@1+ (1.0,0.0) [0.0|1.0] "" Vector__XXX
+ SG_ DF_BF_STAT : 19|2@1+ (1.0,0.0) [0.0|3.0] "" BCW
+ SG_ SCCReqLim : 22|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ TQI_SCC : 24|8@1+ (0.390625,0.0) [0.0|199.609375] "%" Vector__XXX
+ SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC
+ SG_ ACCEnable : 43|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC
+ SG_ DriverOverride : 45|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC
+ SG_ StandStill : 47|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ CheckSum_TCS3 : 48|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,SCC
+ SG_ ACC_EQUIP : 52|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ PBRAKE_ACT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ ACC_REQ : 54|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ DriverBraking : 55|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC
+ SG_ CF_VSM_Coded : 56|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+ SG_ CF_VSM_Avail : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,SCC
+ SG_ CF_VSM_Handshake : 59|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+ SG_ CF_DriBkeStat : 60|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+ SG_ CF_VSM_ConfSwi : 61|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ AEB_EQUIP : 63|1@1+ (1.0,0.0) [0.0|1.0] "" SCC
+
+BO_ 1427 TPMS11: 6 BCM
+ SG_ TPMS_W_LAMP : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX
+ SG_ TREAD_W_LAMP : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX
+ SG_ POS_FL_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ POS_FR_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ POS_RL_W_LAMP : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ POS_RR_W_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX
+ SG_ STATUS_TPMS : 8|3@1+ (1.0,0.0) [0.0|0.0] "" CLU
+ SG_ UNIT : 11|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ PRESSURE_FL : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ PRESSURE_FR : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ PRESSURE_RL : 32|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ PRESSURE_RR : 40|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+
+BO_ 915 TCS12: 4 ESC
+ SG_ SA_COUNT : 0|16@1+ (2.0,-32768.0) [-32768.0|98302.0] "" _4WD,ACU,MDPS
+ SG_ SA_Z_COUNT : 16|15@1+ (2.0,-32768.0) [-32768.0|32766.0] "" _4WD,ACU,MDPS
+ SG_ SA_Z_FLAG : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,MDPS
+
+BO_ 1170 EMS19: 8 EMS
+ SG_ CF_Ems_BrkReq : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,TCU
+ SG_ CF_Ems_DnShftReq : 1|4@1+ (1.0,0.0) [0.0|14.0] "" IBOX,TCU
+ SG_ CF_Ems_RepModChk : 5|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX
+ SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,IBOX
+ SG_ CF_Ems_DecelReq : 8|12@1+ (0.0010,-4.094) [-4.094|0.0] "m/s^2" ESC,IBOX,TCU
+ SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0.0) [0.0|4094.0] "hPa" CLU,IBOX
+ SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40.0) [0.0|254.0] "deg" CLU,IBOX
+ SG_ DPF_LAMP_STAT : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX
+ SG_ BAT_LAMP_STAT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41.0) [-41.0|85.5] "deg" AAF,IBOX
+ SG_ CF_Ems_OPSFail : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU
+ SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU
+
+BO_ 1425 AFLS11: 2 AFLS
+ SG_ AFLS_STAT : 1|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Afls_TrfChgStat : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Afls_LedHLStat : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 912 SPAS11: 7 SPAS
+ SG_ CF_Spas_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,MDPS
+ SG_ CF_Spas_TestMode : 4|2@1+ (1.0,0.0) [0.0|3.0] "" MDPS
+ SG_ CR_Spas_StrAngCmd : 8|16@1- (0.1,0.0) [-3276.8|3276.7] "" MDPS
+ SG_ CF_Spas_BeepAlarm : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Spas_Mode_Seq : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Spas_AliveCnt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
+ SG_ CF_Spas_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
+ SG_ CF_Spas_PasVol : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CGW,CLU
+
+BO_ 1168 EPB11: 7 EPB
+ SG_ EPB_I_LAMP : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU,CUBIS,ESC,IBOX
+ SG_ EPB_F_LAMP : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,ESC,IBOX
+ SG_ EPB_ALARM : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC
+ SG_ EPB_CLU : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC
+ SG_ EPB_SWITCH : 16|2@1+ (1.0,0.0) [0.0|3.0] "" ESC,SCC
+ SG_ EPB_RBL : 18|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,ESC
+ SG_ EPB_STATUS : 19|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC,SCC,TCU
+ SG_ EPB_FRC_ERR : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,SCC,TCU
+ SG_ EPB_DBF_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ ESP_ACK : 25|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ EPB_DBF_REQ : 26|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ EPB_FAIL : 29|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,SCC
+ SG_ EPB_FORCE : 32|12@1+ (1.0,-1000.0) [-1000.0|3000.0] "" ESC
+ SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0.0) [0.0|2.54] "g" ESC
+
+BO_ 399 EMS_H12: 8 EMS
+ SG_ R_TqAcnApvC : 0|8@1+ (0.2,0.0) [0.0|51.0] "Nm" DATC,IBOX
+ SG_ R_PAcnC : 8|8@1+ (125.0,0.0) [0.0|31875.0] "hPa" DATC,IBOX
+ SG_ TQI_B : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ABS,ESC,IBOX
+ SG_ SLD_VS : 24|8@1+ (1.0,0.0) [0.0|255.0] "km/h" CLU,IBOX
+ SG_ CF_CdaStat : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AEMC,IBOX,TCU
+ SG_ CF_Ems_IsgStat : 35|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,MDPS,SMK,TCU
+ SG_ CF_Ems_OilChg : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_EtcLimpMod : 39|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ R_NEngIdlTgC : 40|8@1+ (10.0,0.0) [0.0|2550.0] "rpm" DATC,IBOX,TCU
+ SG_ CF_Ems_UpTarGr : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_DownTarGr : 49|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_DesCurGr : 50|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX
+ SG_ CF_Ems_SldAct : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_SldPosAct : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_HPresStat : 56|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ CF_Ems_IsgBuz : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_IdlStpFCO : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_FCopen : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Ems_ActEcoAct : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU
+ SG_ CF_Ems_EngRunNorm : 61|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,IBOX,TCU
+ SG_ CF_Ems_IsgStat2 : 62|2@1+ (2.0,0.0) [0.0|3.0] "" CLU,IBOX,TCU
+
+BO_ 1419 LCA11: 8 LCA
+ SG_ CF_Lca_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Rcta_Stat : 4|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Lca_IndLeft : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Rcw_Stat : 10|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_RCW_Warning : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Lca_IndRight : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_Lca_SndWan_Stat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_FR_SndWan : 20|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_FL_SndWan : 21|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_RR_SndWan : 22|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_RL_SndWan : 23|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU
+ SG_ CF_Lca_IndBriLeft : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_Lca_IndBriRight : 32|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_RCTA_IndBriLeft : 40|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_RCTA_IndBriRight : 48|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_RCTA_IndLeft : 56|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_RCTA_IndRight : 58|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+ SG_ CF_SndWarnForClu : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 906 ABS11: 8 ABS
+ SG_ ABS_DEF : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EMS,SPAS,TCU
+ SG_ EBD_DEF : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,SPAS,TCU
+ SG_ ABS_ACT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EPB,SPAS,TCU
+ SG_ ABS_W_LAMP : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,MTS,TMU
+ SG_ EBD_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ ABS_DIAG : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ ESS_STAT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS
+
+BO_ 903 WHL_PUL11: 6 ABS
+ SG_ WHL_PUL_FL : 0|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_PUL_FR : 8|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_PUL_RL : 16|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_PUL_RR : 24|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS
+ SG_ WHL_DIR_FL : 32|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_DIR_FR : 34|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_DIR_RL : 36|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_DIR_RR : 38|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS
+ SG_ WHL_PUL_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,SPAS,TPMS,EPB,LCA,LDWS_LKAS,SPAS,TPMS
+
+BO_ 1415 TMU11: 8 IBOX
+ SG_ CF_Tmu_VehSld : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Tmu_VehImmo : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Tmu_ReqRepCnd : 2|2@1+ (1.0,0.0) [0.0|3.0] "" EMS
+ SG_ CF_Tmu_AirconCtr : 4|1@1+ (1.0,0.0) [0.0|1.0] "" DATC
+ SG_ CF_Tmu_TempMd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" DATC
+ SG_ CF_Tmu_TempSet : 6|16@1+ (1.0,0.0) [0.0|20.0] "" DATC
+ SG_ CF_Tmu_DefrostCtr : 22|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,FATC
+ SG_ CF_Tmu_AliveCnt1 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" EMS
+
+BO_ 902 WHL_SPD11: 8 ABS
+ SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,ACU,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,BCM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,BCM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS
+ SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+
+BO_ 1414 EVP11: 3 EVP
+ SG_ CF_Evp_Stat : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 1412 AAF11: 8 AAF
+ SG_ CF_Aaf_ActFlapStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester
+ SG_ CF_Aaf_ModeStatus : 2|3@1+ (1.0,0.0) [0.0|7.0] "" AAF_Tester
+ SG_ CF_Aaf_WrnLamp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Aaf_ErrStatus : 6|10@1+ (1.0,0.0) [0.0|1023.0] "" AAF_Tester,EMS
+ SG_ CF_Aaf_OpenRqSysAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester
+ SG_ CF_Aaf_PStatus : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" AAF_Tester
+ SG_ CF_Aaf_OpenRqSysSol : 32|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester
+ SG_ CF_Aaf_SolFlapStatus : 40|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester
+ SG_ CF_Aaf_MilOnReq : 42|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 900 EMS17: 8 EMS
+ SG_ CF_Ems_PkpCurMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_HolCurMSV : 8|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_InjVBnkAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_InjVActSet : 24|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_DiagFulHDEV : 32|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CF_Ems_SwiOffIC1 : 33|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CF_Ems_SwiOffIC2 : 34|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CF_Ems_DiagReqHDEV : 38|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX
+ SG_ CR_Ems_DutyCycMSV : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" DI_BOX
+ SG_ CR_Ems_BatVolRly : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" DI_BOX
+
+BO_ 387 REA11: 8 REA
+ SG_ CF_EndBst_PwmDuH : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PwmDuL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PwmFqOutRng : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_HbriOverCur : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_HbriOverTemp : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PosSnsKOR : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_PosSnsOSOR : 7|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_EepFlt : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_RomFlt : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_RamFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_CanFlt : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_AgH : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_AgL : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_EndBst_ORVol : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CR_EndBst_ActPos : 16|16@1+ (0.117,0.0) [1.989|118.053] "" EMS
+ SG_ CR_EndBst_DemPos : 32|16@1+ (0.117,0.0) [0.0|119.691] "" EMS
+ SG_ CR_EndBst_HbriPwr : 48|16@1+ (0.045,0.0) [0.0|99.99] "%" EMS
+
+BO_ 1411 CUBIS11: 8 CUBIS
+ SG_ CF_Cubis_HUDisp : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+
+BO_ 899 FATC11: 8 DATC
+ SG_ CR_Fatc_TqAcnOut : 0|8@1+ (0.2,0.0) [0.0|50.8] "Nm" EMS,IBOX
+ SG_ CF_Fatc_AcnRqSwi : 8|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,EMS,IBOX
+ SG_ CF_Fatc_AcnCltEnRq : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_EcvFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_BlwrOn : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_FATC_Iden : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Fatc_BlwrMax : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX
+ SG_ CF_Fatc_EngStartReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_IsgStopReq : 16|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_CtrInf : 17|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX
+ SG_ CF_Fatc_MsgCnt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX
+ SG_ CR_Fatc_OutTemp : 24|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU,EMS,IBOX,SPAS,TCU,TPMS
+ SG_ CR_Fatc_OutTempSns : 32|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" AAF,AHLS,CLU,EMS,IBOX,SPAS,TCU
+ SG_ CF_Fatc_Compload : 40|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX
+ SG_ CF_Fatc_ActiveEco : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Fatc_AutoActivation : 44|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX
+ SG_ CF_Fatc_DefSw : 45|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,IBOX
+ SG_ CF_Fatc_PtcRlyStat : 46|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Fatc_ChkSum : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,IBOX,SPAS
+
+BO_ 129 EMS_DCT12: 8 EMS
+ SG_ CR_Ems_SoakTimeExt : 0|6@1+ (5.0,0.0) [0.0|315.0] "Min" TCU
+ SG_ BRAKE_ACT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" TCU
+ SG_ CF_Ems_EngOperStat : 8|8@1+ (1.0,0.0) [0.0|255.0] "" TCU
+ SG_ CR_Ems_IndAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" TCU
+ SG_ CF_Ems_Alive2 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Ems_ChkSum2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+
+BO_ 145 FCEV_ACCELERATOR: 8 XXX
+ SG_ ACCELERATOR_PEDAL : 48|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 897 MDPS11: 8 MDPS
+ SG_ CF_Mdps_WLmp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,EMS,IBOX,SPAS
+ SG_ CF_Mdps_Flex : 2|3@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS
+ SG_ CF_Mdps_FlexDisp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Mdps_Stat : 7|4@1+ (1.0,0.0) [0.0|15.0] "" SPAS
+ SG_ CR_Mdps_DrvTq : 11|12@1+ (1.0,-2048.0) [-2048.0|2046.0] "" SPAS
+ SG_ CF_Mdps_ALTRequest : 23|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" SPAS
+ SG_ CF_Mdps_AliveCnt : 40|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS
+ SG_ CF_Mdps_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS
+ SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1.0,0.0) [0.0|1.0] "flag" SPAS
+ SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1.0,0.0) [0.0|1.0] "flag" LDWS_LKAS
+ SG_ CF_Mdps_CurrMode : 59|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Mdps_Type : 61|2@1+ (1.0,0.0) [0.0|2.0] "" LDWS_LKAS,SPAS
+ SG_ CF_MDPS_VSM_FUNC : 56|1@0+ (1.0,0.0) [0.0|1.0] "" XXX
+
+BO_ 896 DI_BOX13: 8 DI_BOX
+ SG_ CF_DiBox_HPreInjVConfStat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVStat1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVStat2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVPkp : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_HPreInjVBpt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_ErrRegFrtMSV : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_ErrRegSedMSV : 48|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SPIErrSedMSV : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_SPIErrFrtMSV : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_IDErrSedMSV : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_IDErrFrtMSV : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_IniStatMSV : 60|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 640 EMS13: 8 EMS
+ SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,LPI,SMK
+ SG_ LV_BFS_CFIRM : 1|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_CRASH : 2|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_VB_OFF_ACT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_GSL_MAP M : 4|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ LV_ENG_TURN : 5|1@1+ (1.0,0.0) [0.0|1.0] "" LPI
+ SG_ ERR_FUEL : 8|8@1+ (1.0,0.0) [0.0|255.0] "" LPI
+ SG_ EOS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" LPI
+ SG_ TCO : 24|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI
+ SG_ N_32 : 32|8@1+ (32.0,0.0) [0.0|8160.0] "rpm" LPI
+ SG_ MAF : 40|8@1+ (5.447,0.0) [0.0|1388.985] "mg/TDC" LPI
+ SG_ TIA : 48|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI
+ SG_ MAP m1 : 56|8@1+ (0.47058,0.0) [0.0|119.9979] "kPa" LPI
+ SG_ AMP m0 : 56|8@1+ (21.22,0.0) [0.0|5411.1] "hPa" LPI
+
+BO_ 128 EMS_DCT11: 8 EMS
+ SG_ PV_AV_CAN : 0|8@1+ (0.3906,0.0) [0.0|99.603] "%" TCU
+ SG_ TQ_STND : 8|6@1+ (10.0,0.0) [0.0|630.0] "Nm" TCU
+ SG_ F_N_ENG : 14|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ F_SUB_TQI : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" TCU
+ SG_ TQI_ACOR : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" IBOX,TCU
+ SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" TCU
+ SG_ TQI : 48|8@1+ (0.390625,0.0) [0.0|99.609375] "%" TCU
+ SG_ CF_Ems_Alive : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Ems_ChkSum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+
+BO_ 1407 HU_MON_PE_01: 8 CLU
+ SG_ HU_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" AVM,PGS
+
+BO_ 127 CGW5: 8 BCM
+ SG_ C_StopLampLhOpenSts : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_StopLampRhOpenSts : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HMSLOpenSts : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampLowLhOpenSts : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampLowRhOpenSts : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampHighLhOpenSts : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_HLampHighRhOpenSts : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_DRLLampLhOpenSts : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_DRLLampRhOpenSts : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearFOGLhOpenSts : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearFOGRhOpenSts : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_SBendingLhOpenSts : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_SBendingRhOpenSts : 22|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 1151 ESP11: 6 ESC
+ SG_ AVH_STAT : 0|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,TCU
+ SG_ LDM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EPB,TCU
+ SG_ REQ_EPB_ACT : 3|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,TCU
+ SG_ REQ_EPB_STAT : 5|1@1+ (1.0,0.0) [0.0|1.0] "" EPB
+ SG_ ECD_ACT : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EPB
+ SG_ _4WD_LIM_REQ : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS
+ SG_ ROL_CNT_ESP : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,TCU
+ SG_ _4WD_TQC_LIM : 16|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" _4WD,EMS
+ SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" _4WD,EMS
+ SG_ _4WD_OPEN : 40|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS
+ SG_ _4WD_LIM_MODE : 42|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD
+
+BO_ 1397 HU_AVM_E_00: 8 CLU
+ SG_ HU_AVM_Cal_Cmd : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_Cal_Method : 4|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+ SG_ HU_AVM_Save_Controlpoint : 6|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+ SG_ HU_AVM_PT_X : 8|12@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_RearViewPointOpt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_PT_Y : 24|12@1+ (1.0,0.0) [0.0|4095.0] "" AVM,PGS
+ SG_ HU_AVM_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_SelectedMenu : 40|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS
+ SG_ HU_AVM_CameraOff : 45|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+ SG_ HU_AVM_Option : 48|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_CrossLineMove_Cmd : 52|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_RearView_Option : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_FrontView_Option : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+
+BO_ 1395 HU_AVM_E_01: 8 CLU
+ SG_ HU_PGSSelectedMenu : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_PGSOption : 8|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS
+ SG_ HU_AVM_ParkingAssistMenu : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+ SG_ HU_AVM_ParkingAssistSB : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS
+
+BO_ 1393 OPI11: 5 OPI
+ SG_ CR_Opi_Spd_Rpm : 0|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" TCU
+ SG_ CF_Opi_Over_Temp : 8|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Opi_Over_Cur : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU
+ SG_ CF_Opi_Over_Vol : 10|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Opi_Hall_Fail : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU
+ SG_ CF_Opi_Flt : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU
+ SG_ CF_Opi_Motor_Dir : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Opi_Romver : 16|8@1+ (1.0,0.0) [0.0|255.0] "" TCU
+ SG_ CF_Opi_PWM_Rate : 24|12@1+ (1.0,0.0) [0.0|100.0] "%" TCU
+
+BO_ 625 LPI11: 8 LPI
+ SG_ FUP_LPG_MMV : 0|8@1+ (128.0,0.0) [0.0|32640.0] "hPa" EMS
+ SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_GAS_OK : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_FUP_ENA_THD : 11|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,EMS,SMK
+ SG_ LPI_OBD : 12|4@1+ (1.0,0.0) [0.0|15.0] "" EMS
+ SG_ ERR_GAS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05E-5,0.0) [0.0|1.9988175] "" EMS
+ SG_ FTL_AFU : 40|8@1+ (0.392,0.0) [0.0|99.96] "%" EMS
+ SG_ BFS_CYL : 48|8@1+ (1.0,0.0) [0.0|6.0] "Cyl Nr." EMS
+ SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 356 VSM11: 4 ESC
+ SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" MDPS
+ SG_ CF_Esc_Act : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,MDPS
+ SG_ CF_Esc_CtrMode : 13|3@1+ (1.0,0.0) [0.0|7.0] "" MDPS
+ SG_ CF_Esc_Def : 16|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Esc_AliveCnt : 17|4@1+ (1.0,0.0) [0.0|15.0] "" LDWS_LKAS,MDPS
+ SG_ CF_Esc_Chksum : 24|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,MDPS
+
+BO_ 1379 PGS_HU_PE_01: 8 PGS
+ SG_ PGS_State : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ PGS_ParkGuideState : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ PGS_Option : 16|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ PGS_Version : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU
+
+BO_ 354 TCU_DCT13: 3 TCU
+ SG_ Clutch_Driving_Tq : 0|10@1+ (1.0,-512.0) [0.0|0.0] "Nm" ESC
+ SG_ Cluster_Engine_RPM : 10|13@1+ (0.9766,0.0) [0.0|0.0] "" CLU
+ SG_ Cluster_Engine_RPM_Flag : 23|1@1+ (1.0,0.0) [0.0|0.0] "" CLU
+
+BO_ 1378 HUD11: 4 HUD
+ SG_ CF_Hud_HeightStaus : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ CF_Hud_PBackStatus : 6|2@1+ (1.0,0.0) [0.0|0.0] "" BCM,CLU
+ SG_ CF_Hud_Brightness : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+
+BO_ 608 EMS16: 8 EMS
+ SG_ TQI_MIN : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU
+ SG_ TQI : 8|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU
+ SG_ TQI_TARGET : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EPB,ESC,IBOX,TCU
+ SG_ GLOW_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,IBOX,SMK
+ SG_ CRUISE_LAMP_M : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU
+ SG_ CRUISE_LAMP_S : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU
+ SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ ENG_STAT : 28|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,AHLS,AVM,BCM,CLU,EPB,ESC,EVP,FPCM,IBOX,LCA,LDWS_LKAS,MDPS,SCC,SMK,TCU
+ SG_ SOAK_TIME_ERROR : 31|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EPB,IBOX,TCU
+ SG_ SOAK_TIME : 32|8@1+ (1.0,0.0) [0.0|255.0] "Min" _4WD,DATC,EPB,IBOX,TCU
+ SG_ TQI_MAX : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU
+ SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [-35.625|60.0] "" IBOX,TCU
+ SG_ Checksum : 56|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ AliveCounter : 60|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,LDWS_LKAS,MDPS,SCC
+ SG_ CF_Ems_AclAct : 62|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,SCC
+
+BO_ 1371 AVM_HU_PE_00: 8 AVM
+ SG_ AVM_View : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU
+ SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ AVM_Display_Message : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ AVM_Popup_Msg : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_Ready : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_ParkingAssist_Step : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_FrontBtn_Type : 28|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_Option : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_HU_RearView_Option : 40|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_HU_FrontView_Option : 44|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ AVM_Version : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU
+
+BO_ 1370 HU_AVM_PE_00: 8 CLU
+ SG_ HU_AVM_Status : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS
+
+BO_ 1369 CGW4: 8 BCM
+ SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD
+ SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_RLWdwState : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_RRWdwState : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_AstWdwStat : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_MemoryEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_PBACKStop : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD
+ SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 1367 EngFrzFrm12: 8 EMS
+ SG_ PID_06h : 0|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_07h : 8|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_08h : 16|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_09h : 24|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU
+ SG_ PID_0Bh : 32|8@1+ (1.0,0.0) [0.0|255.0] "kPa" AAF,IBOX,TCU
+ SG_ PID_23h : 40|16@1+ (10.0,0.0) [0.0|655350.0] "kPa" AAF,IBOX,TCU
+
+BO_ 1366 EngFrzFrm11: 8 EMS
+ SG_ PID_04h : 0|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU
+ SG_ PID_05h : 8|8@1+ (1.0,-40.0) [-40.0|215.0] "deg" AAF,TCU
+ SG_ PID_0Ch : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" AAF,TCU
+ SG_ PID_0Dh : 32|8@1+ (1.0,0.0) [0.0|255.0] "km/h" AAF,TCU
+ SG_ PID_11h : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU
+ SG_ PID_03h : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" AAF,TCU
+
+BO_ 1365 FPCM11: 8 FPCM
+ SG_ CR_Fpcm_LPActPre : 0|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" EMS
+ SG_ CF_Fpcm_LPPumpOverCur : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrHi : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrDisc : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrShort : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_LPPumpDiscShort : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_LP_System_Error : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_PreSnrSigErr : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Fpcm_LPCtrCirFlt : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 871 LVR12: 8 LVR
+ SG_ CF_Lvr_CruiseSet : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,TCU
+ SG_ CF_Lvr_IsgState : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,TCU
+ SG_ CF_Lvr_Gear : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU
+
+BO_ 872 LVR11: 8 LVR
+ SG_ CF_Lvr_GearInf : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU
+ SG_ CF_Lvr_PRelStat : 4|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,SMK,TCU
+ SG_ CF_Lvr_BkeAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" TCU
+ SG_ CF_Lvr_NFnStat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Lvr_PosInf : 8|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_PosCpl : 12|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_UlkButStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" TCU
+ SG_ CF_Lvr_PNStat : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1.0,0.0) [0.0|8191.0] "" CLU,TCU
+ SG_ CF_Lvr_AC : 48|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+ SG_ CF_Lvr_CS : 52|4@1+ (1.0,0.0) [0.0|15.0] "" TCU
+
+BO_ 1363 CGW2: 8 BCM
+ SG_ CF_Gway_GwayDiagState : 0|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_DDMDiagState : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SCMDiagState : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_PSMDiagState : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SJBDiagState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_IPMDiagState : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_LDMFail : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS,LDWS_LKAS
+ SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1.0,0.0) [0.0|63.0] "" CLU,Dummy
+ SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_CLUSwMode : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_AutoLightValue : 16|1@1+ (1.0,0.0) [0.0|1.0] "" LCA,LCA
+ SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_AvTail : 20|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,SNV,SNV
+ SG_ CF_Gway_RearFogAct : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ExtTailAct : 22|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,CLU,LCA,PGS,SPAS,AVM,LCA,PGS,SPAS
+ SG_ CF_Gway_RRDrSw : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_RLDrSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_IntTailAct : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_CountryCfg : 26|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,Dummy
+ SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,EMS,LDWS_LKAS,AFLS,EMS,LDWS_LKAS
+ SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV
+ SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV
+ SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_IDoutWarn : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_ImmoLp : 40|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_BCMRKEID : 41|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+ SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SSBWarn : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SMKFobID : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+ SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+ SG_ CF_Gway_AutoLightOption : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_KeyoutLp : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy
+ SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,Dummy
+ SG_ CF_Gway_WngBuz : 61|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy
+
+BO_ 339 TCS11: 8 ESC
+ SG_ TCS_REQ : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,TCU
+ SG_ MSR_C_REQ : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,SCC,TCU
+ SG_ TCS_PAS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,SCC,SPAS,TCU
+ SG_ TCS_GSC : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,TCU
+ SG_ CF_Esc_LimoInfo : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,SCC
+ SG_ ABS_DIAG : 6|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB
+ SG_ ABS_DEF : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,SCC,SPAS,TCU
+ SG_ TCS_DEF : 8|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU
+ SG_ TCS_CTL : 9|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU
+ SG_ ABS_ACT : 10|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU
+ SG_ EBD_DEF : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SPAS,TCU
+ SG_ ESP_PAS : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU,EMS,EPB,LDWS_LKAS,SCC,TCU
+ SG_ ESP_DEF : 13|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,TCU
+ SG_ ESP_CTL : 14|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU
+ SG_ TCS_MFRN : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,TCU
+ SG_ DBC_CTL : 16|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB
+ SG_ DBC_PAS : 17|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB
+ SG_ DBC_DEF : 18|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB
+ SG_ HAC_CTL : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU
+ SG_ HAC_PAS : 20|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU
+ SG_ HAC_DEF : 21|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU
+ SG_ ESS_STAT : 22|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS,EPB
+ SG_ TQI_TCS : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU
+ SG_ TQI_MSR : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU
+ SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU
+ SG_ CF_Esc_BrkCtl : 48|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ BLA_CTL : 49|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CGW,CLU
+ SG_ AliveCounter_TCS1 : 52|4@1+ (1.0,0.0) [0.0|14.0] "" EMS,EPB,LDWS_LKAS
+ SG_ CheckSum_TCS1 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,EPB,LDWS_LKAS
+
+BO_ 1362 SNV11: 4 SNV
+ SG_ CF_SNV_DisplayControl : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD
+ SG_ CF_Snv_BeepWarning : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD
+ SG_ CF_Snv_WarningMessage : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,HUD
+ SG_ CF_Snv_DetectionEnable : 7|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,HUD
+ SG_ CF_Snv_PedestrianDetect : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD
+ SG_ CF_Snv_IRLampControl : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD
+
+BO_ 593 MDPS12: 8 MDPS
+ SG_ CR_Mdps_StrColTq : 0|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" LDWS_LKAS
+ SG_ CF_Mdps_Def : 11|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_ToiActive : 13|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_ToiFlt : 14|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_FailStat : 15|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS
+ SG_ CF_Mdps_Chksum2 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS
+ SG_ CF_Mdps_SErr : 37|1@1+ (1.0,0.0) [0.0|1.0] "" ESC
+ SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" ESC
+ SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [-204.8|204.7] "" ESC,LDWS_LKAS
+
+BO_ 1360 IAP11: 3 IAP
+ SG_ CF_Iap_EcoPmodSwi : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Iap_EcoPmodAct : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Iap_ReqWarn : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1356 TCU_DCT14: 8 TCU
+ SG_ Vehicle_Stop_Time : 0|5@1+ (1.0,0.0) [0.0|0.0] "" CLU
+ SG_ HILL_HOLD_WARNING : 5|1@1+ (1.0,0.0) [0.0|0.0] "" CLU
+
+BO_ 1353 BAT11: 8 EMS
+ SG_ BAT_SNSR_I : 0|16@1+ (0.01,-327.0) [-327.0|328.0] "A" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SOC : 16|8@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_V : 24|14@1+ (0.0010,6.0) [6.0|18.0] "V" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_Temp : 38|9@1- (0.5,-40.0) [-40.0|125.0] "deg" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_State : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SOH : 48|7@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_Invalid : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SOF : 56|7@1+ (0.1,0.0) [0.0|12.0] "V" CGW,CUBIS,IBOX,TMU
+ SG_ BAT_SNSR_Error : 63|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU
+
+BO_ 1351 EMS15: 8 EMS
+ SG_ ECGPOvrd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,SCC
+ SG_ QECACC : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ ECFail : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ SwitchOffCondExt : 3|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ BLECFail : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ CF_Ems_IsaAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ FA_PV_CAN : 8|8@1+ (0.3906,0.0) [0.0|99.2] "%" IBOX,LDWS_LKAS,TCU
+ SG_ IntAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,ECS,EPB,IBOX,TCU
+ SG_ STATE_DC_OBD : 24|7@1+ (1.0,0.0) [0.0|127.0] "" IBOX,TCU
+ SG_ INH_DC_OBD : 31|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ CTR_IG_CYC_OBD : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" ACU,IBOX,TCU
+ SG_ CTR_CDN_OBD : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" IBOX,TCU
+
+BO_ 1350 DI_BOX12: 8 DI_BOX
+ SG_ CF_DiBox_FrtInjVDiagReg0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_FrtInjVDiagReg1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_FrtInjVDiagReg2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SedInjVDiagReg0 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SedInjVDiagReg1 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CF_DiBox_SedInjVDiagReg2 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS
+ SG_ CR_DiBox_BatVol : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" EMS
+ SG_ CF_DiBox_SedInjVChg : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_FrtInjVChg : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_SedInjVErrSPI : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_DiBox_FrtInjVErrSPI : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+
+BO_ 1349 EMS14: 8 EMS
+ SG_ IMMO_LAMP_STAT : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ L_MIL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX
+ SG_ IM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ AMP_CAN : 3|5@1+ (10.731613,458.98) [458.98|791.660003] "mmHg" CLU,IBOX,TCU,TPMS
+ SG_ BAT_Alt_FR_Duty : 8|8@1+ (0.4,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU
+ SG_ VB : 24|8@1+ (0.1015625,0.0) [0.0|25.8984375] "V" CLU,CUBIS,DATC,EPB,FPCM,IBOX
+ SG_ EMS_VS : 32|12@1+ (0.0625,0.0) [0.0|255.875] "km/h" CLU
+ SG_ TEMP_FUEL : 56|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" FPCM
+
+BO_ 68 DATC11: 8 DATC
+ SG_ CF_Datc_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_Datc_VerMaj : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_Datc_VerMin : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CR_Datc_OutTempC : 24|8@1+ (0.5,-41.0) [-41.0|86.5] "deg" CLU,FPCM
+ SG_ CR_Datc_OutTempF : 32|8@1+ (1.0,-42.0) [-42.0|213.0] "deg" CLU
+ SG_ CF_Datc_IncarTemp : 40|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU
+
+BO_ 67 DATC13: 8 DATC
+ SG_ CF_Datc_TempDispUnit : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX
+ SG_ CF_Datc_ModDisp : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_IonClean : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_IntakeDisp : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_AutoDisp : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_FrDefLed : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX
+ SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_AqsDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_AcDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_OpSts : 25|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_DualDisp : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_PwrInf : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_RearManual : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Datc_RearOffDisp : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_RearModDisp : 48|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_PSModDisp : 56|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX
+
+BO_ 66 DATC12: 8 DATC
+ SG_ CR_Datc_DrTempDispC : 0|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX
+ SG_ CR_Datc_DrTempDispF : 8|8@1+ (1.0,56.0) [58.0|90.0] "deg" CLU,IBOX
+ SG_ CR_Datc_PsTempDispC : 16|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX
+ SG_ CR_Datc_PsTempDispF : 24|8@1+ (1.0,56.0) [58.0|90.0] "deg" CLU,IBOX
+ SG_ CR_Datc_RearDrTempDispC : 40|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU
+ SG_ CR_Datc_RearDrTempDispF : 48|8@1+ (1.0,58.0) [58.0|90.0] "deg" CLU
+ SG_ CF_Datc_CO2_Warning : 56|8@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1345 CGW1: 8 BCM
+ SG_ CF_Gway_IGNSw : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC
+ SG_ CF_Gway_RKECmd : 3|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX
+ SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX
+ SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX
+ SG_ CF_Gway_DrvDrSw : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU
+ SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,PSB,TCU,EMS,EPB,ESC,IBOX,PSB,TCU
+ SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,ECS,EMS,EPB,ESC,IBOX
+ SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,PSB,IBOX,PSB
+ SG_ CF_Gway_SMKOption : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,EMS,IBOX,SMK
+ SG_ CF_Gway_HoodSw : 17|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,EPB,ESC,IBOX,EMS,EPB,ESC,IBOX
+ SG_ CF_Gway_TurnSigLh : 19|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC
+ SG_ CF_Gway_WiperIntT : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperIntSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperLowSw : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperHighSw : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_RainSnsState : 28|3@1+ (1.0,0.0) [0.0|7.0] "" AFLS,EMS,IBOX,LDWS_LKAS,AFLS,EMS,ESC,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HeadLampLow : 31|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,SNV,AFLS,EMS,IBOX,LDWS_LKAS,SNV
+ SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,AFLS,EMS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HazardSw : 33|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS,ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS
+ SG_ CF_Gway_AstDrSw : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,IBOX
+ SG_ CF_Gway_DefoggerRly : 36|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX
+ SG_ CF_Gway_ALightStat : 37|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_LightSwState : 38|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_TSigRHSw : 41|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_TSigLHSw : 42|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_StarterRlyState : 44|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX,SMK
+ SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK
+ SG_ CF_Gway_WiperMistSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK
+ SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX
+ SG_ CF_Gway_PassingSW : 51|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HBAControlMode : 52|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_HLpHighSw : 53|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS
+ SG_ CF_Gway_InhibitRMT : 54|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,MDPS,PGS,SCC,SPAS,TPMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,PGS,SCC,SPAS,TPMS
+ SG_ CF_Gway_RainSnsOption : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ C_SunRoofOpenState : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX,DATC,IBOX
+ SG_ CF_Gway_Ign1 : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_Ign2 : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IBOX,SCC,ESC,IBOX,SCC
+ SG_ CF_Gway_TurnSigRh : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC
+
+BO_ 64 DATC14: 8 DATC
+ SG_ CF_Datc_AqsLevelOut : 0|4@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Datc_DiagMode : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CR_Datc_SelfDiagCode : 8|8@1+ (1.0,-1.0) [0.0|254.0] "" CLU
+ SG_ DATC_SyncDisp : 16|4@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_OffDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_SmartVentDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_SmartVentOnOffStatus : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_AutoDefogSysOff_Disp : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ DATC_ADSDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 832 LKAS11: 8 LDWS_LKAS
+ SG_ CF_Lkas_LdwsActivemode : 0|2@1+ (1,0) [0|3] "" CLU,IBOX,PSB
+ SG_ CF_Lkas_LdwsSysState : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX,PSB
+ SG_ CF_Lkas_SysWarning : 6|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU
+ SG_ CF_Lkas_LdwsLHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB
+ SG_ CF_Lkas_LdwsRHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB
+ SG_ CF_Lkas_HbaLamp : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Lkas_FcwBasReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC
+ SG_ CR_Lkas_StrToqReq : 16|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" MDPS
+ SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Lkas_HbaSysState : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM,CLU
+ SG_ CF_Lkas_FcwOpt : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lkas_HbaOpt : 34|2@1+ (1.0,0.0) [0.0|1.0] "" BCM,CGW
+ SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS
+ SG_ CF_Lkas_FcwSysState : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Lkas_FcwCollisionWarning : 43|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lkas_FusionState : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Lkas_Unknown1 : 47|1@1+ (1.0,0.0) [0.0|1.0] "" XXX
+ SG_ CF_Lkas_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
+ SG_ CF_Lkas_FcwOpt_USM : 56|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Lkas_LdwsOpt_USM : 59|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,MDPS
+ SG_ CF_Lkas_Unknown2 : 62|2@1+ (1.0,0.0) [0.0|1.0] "" XXX
+
+BO_ 1342 LKAS12: 6 LDWS_LKAS
+ SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_LkasTsrStatus : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU
+ SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
+ SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|7] "" CLU
+ SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|7] "" CLU
+
+BO_ 1338 TMU_GW_E_01: 8 CLU
+ SG_ CF_Gway_TeleReqDrLock : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqDrUnlock : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqHazard : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqHorn : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Gway_TeleReqEngineOperate : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 1078 PAS11: 4 BCM
+ SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM
+ SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM
+ SG_ CF_Gway_PASRsound : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM
+ SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM
+ SG_ CF_Gway_PASFsound : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM
+ SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM
+ SG_ CF_Gway_PASCheckSound : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASSystemOn : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy
+ SG_ CF_Gway_PASOption : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PASDistance : 28|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+
+BO_ 48 EMS18: 6 EMS
+ SG_ CF_Ems_DC1NumPerMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX
+ SG_ CF_Ems_DC2NumPerMSV : 8|16@1+ (1.0,0.0) [0.0|65535.0] "" DI_BOX
+ SG_ CR_Ems_DutyCyc1MSV : 24|8@1+ (0.1953,0.0) [0.0|49.8] "%" DI_BOX
+ SG_ CR_Ems_DutyCyc2MSV : 32|8@1+ (0.13725,0.0) [0.0|35.0] "%" DI_BOX
+ SG_ CR_Ems_DutyCyc3MSV : 40|8@1+ (0.392,0.0) [0.0|100.0] "%" DI_BOX
+
+BO_ 1322 CLU15: 8 CLU
+ SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1.0,0.0) [0.0|255.0] "" BCM
+ SG_ CF_Clu_Gear : 9|4@1+ (1,0) [0|15] "" BCM
+ SG_ CF_Clu_HudInfoSet : 13|7@1+ (1.0,0.0) [0.0|127.0] "" HUD
+ SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_HudSet : 30|1@1+ (1.0,0.0) [0.0|1.0] "" HUD
+ SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1.0,0.0) [0.0|3.0] "" HUD
+ SG_ CF_Clu_LanguageInfo : 33|5@1+ (1.0,0.0) [0.0|31.0] "" BCM,PGS
+ SG_ CF_Clu_ClusterSound : 38|1@1- (1.0,0.0) [0.0|0.0] "" BCM,CGW,FATC
+ SG_ CF_Clu_VehicleSpeed2 : 48|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 1066 _4WD13: 6 _4WD
+ SG_ _4WD_CURRENT : 0|8@1+ (0.390625,0.0) [-50.0|50.0] "A" TCU
+ SG_ _4WD_POSITION : 8|16@1+ (0.015625,0.0) [-180.0|180.0] "Deg" TCU
+ SG_ _4WD_CLU_THERM_STR : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" TCU
+ SG_ _4WD_STATUS : 32|8@1+ (1.0,0.0) [0.0|15.0] "" ESC,TCU
+
+BO_ 1065 _4WD12: 8 _4WD
+ SG_ Ster_Pos : 0|16@1+ (1.0,-600.0) [-600.0|600.0] "Deg" ESC
+ SG_ FRSS : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ FLSS : 24|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ RRSS : 32|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ RLSS : 40|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC
+ SG_ CLU_PRES : 48|16@1+ (0.0625,-50.0) [-50.0|50.0] "Bar" ESC
+
+BO_ 809 EMS12: 8 EMS
+ SG_ CONF_TCU m1 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LCA,SMK
+ SG_ CAN_VERS m0 : 0|6@1+ (1.0,0.0) [0.0|7.7] "" _4WD,ABS,ESC,IBOX
+ SG_ TQ_STND m3 : 0|6@1+ (10.0,0.0) [0.0|630.0] "Nm" _4WD,DATC,ECS,EPB,ESC,FATC,IBOX
+ SG_ OBD_FRF_ACK m2 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ESC,IBOX
+ SG_ MUL_CODE M : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,BCM,CLU,DATC,ECS,EPB,ESC,IBOX,LCA,SMK,TCU
+ SG_ TEMP_ENG : 8|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,BCM,CLU,DATC,EPB,ESC,IBOX,SMK,TCU
+ SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0.0) [0.0|1.99155] "" IBOX,TCU
+ SG_ VB_OFF_ACT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ ACK_ES : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,IBOX
+ SG_ CONF_MIL_FMY : 26|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,IBOX,TCU
+ SG_ OD_OFF_REQ : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU
+ SG_ ACC_ACT : 30|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,CLU,ESC,IAP,IBOX,SCC,TCU
+ SG_ CLU_ACK : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EPB,ESC,IBOX
+ SG_ BRAKE_ACT : 32|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,AFLS,CLU,DATC,ECS,EPB,ESC,IBOX,LDWS_LKAS,TCU
+ SG_ ENG_CHR : 34|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,ABS,ACU,CLU,DATC,EPB,ESC,FATC,IBOX,SCC,SMK,TCU
+ SG_ GP_CTL : 38|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX
+ SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [-15.0234742|104.6948357] "%" _4WD,ABS,ACU,CLU,DATC,ECS,EPB,ESC,IBOX,TCU
+ SG_ PV_AV_CAN : 48|8@1+ (0.3906,0.0) [0.0|99.603] "%" _4WD,AAF,ABS,ACU,AFLS,CLU,DATC,EPB,ESC,IAP,IBOX,LDWS_LKAS,SCC,TCU
+ SG_ ENG_VOL : 56|8@1+ (0.1,0.0) [0.0|25.5] "liter" _4WD,ABS,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,SCC,SMK
+
+BO_ 1064 _4WD11: 8 _4WD
+ SG_ _4WD_TYPE : 0|2@1+ (1.0,0.0) [0.0|3.0] "" ACU,ESC,TPMS
+ SG_ _4WD_SUPPORT : 2|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,ESC,TPMS
+ SG_ _4WD_ERR : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC
+ SG_ CLU_DUTY : 16|8@1+ (1.0,0.0) [0.0|64.0] "%" ABS,ESC
+ SG_ R_TIRE : 24|8@1+ (1.0,200.0) [200.0|455.0] "mm" ABS,ESC,TPMS
+ SG_ _4WD_SW : 32|8@1+ (1.0,0.0) [0.0|9.9] "" ESC
+ SG_ _2H_ACT : 40|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC
+ SG_ _4H_ACT : 41|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS
+ SG_ LOW_ACT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TCU,TPMS
+ SG_ AUTO_ACT : 43|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TPMS
+ SG_ LOCK_ACT : 44|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS
+ SG_ _4WD_TQC_CUR : 48|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" ABS,ESC
+
+BO_ 1319 HU_GW_E_01: 8 CLU
+ SG_ C_ADrLNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ C_ADrUNValueSet : 4|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ C_TwUnNValueSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_ABuzzerNValueSet : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_ArmWKeyNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_PSMNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_SCMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_HLEscortNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_WELNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_TriTurnLNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_SNVWarnNValueSet : 24|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_LkasWarnNValueSet : 26|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 1318 HU_GW_E_00: 8 CLU
+ SG_ C_ADrLURValueReq : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_TwUnRValueReq : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_AlarmRValueReq : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_IMSRValueReq : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_HLEscortRValueReq : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_WELRValueReq : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_TriTurnLRValueReq : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_SNVWarnRValueReq : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ C_LkasWarnRValueReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 1317 GW_HU_E_01: 8 BCM
+ SG_ C_ADrLRValue : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_ADrURValue : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_TwUnRValue : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ABuzzerRValue : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ArmWKeyRValue : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_PSMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SCMRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_HLEscortRValue : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_WELRValue : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TriTurnLRValue : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1316 GW_HU_E_00: 8 BCM
+ SG_ C_ADrLUNValueConf : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TwUnNValueConf : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_AlarmNValueConf : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_PSMNValueConf : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SCMNValueConf : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_HLEscortNValueConf : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_WELNValueConf : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TriTurnLNValueConf : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1315 GW_SWRC_PE: 8 BCM
+ SG_ C_ModeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_MuteSW : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SeekDnSW : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SeekUpSW : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_BTPhoneCallSW : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_BTPhoneHangUpSW : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_DISCDownSW : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_DISCUpSW : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SdsSW : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_MTSSW : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_VolDnSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_VolUpSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1314 GW_IPM_PE_1: 8 BCM
+ SG_ C_AV_Tail : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ParkingBrakeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_RKECMD : 4|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ C_BAState : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_IGNSW : 12|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_CountryCfg : 16|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ C_TailLampActivity : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ RearSW_RSELockOnOff : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SMKTeleCrankingState : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_SMKTeleCrankingFailRes : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1057 SCC12: 8 SCC
+ SG_ CF_VSM_Prefill : 0|1@1+ (1,0) [0|1] "" ESC
+ SG_ CF_VSM_DecCmdAct : 1|1@1+ (1,0) [0|1] "" ESC
+ SG_ CF_VSM_HBACmd : 2|2@1+ (1,0) [0|3] "" ESC
+ SG_ CF_VSM_Warn : 4|2@1+ (1,0) [0|3] "" CLU,ESC,IAP
+ SG_ CF_VSM_Stat : 6|2@1+ (1,0) [0|3] "" CLU,ESC,PSB
+ SG_ CF_VSM_BeltCmd : 8|3@1+ (1,0) [0|7] "" ESC,PSB
+ SG_ ACCFailInfo : 11|2@1+ (1,0) [0|3] "" CLU,CUBIS,ESC,IBOX
+ SG_ ACCMode : 13|2@1+ (1,0) [0|3] "" CLU,ESC,IBOX,TCU
+ SG_ StopReq : 15|1@1+ (1,0) [0|1] "" EPB,ESC
+ SG_ CR_VSM_DecCmd : 16|8@1+ (0.01,0) [0|2.55] "g" ESC
+ SG_ TakeOverReq : 35|1@1+ (1,0) [0|1] "" CLU,ESC,TCU
+ SG_ PreFill : 36|1@1+ (1,0) [0|1] "" ESC,TCU
+ SG_ CF_VSM_ConfMode : 48|2@1+ (1,0) [0|3] "" CLU,ESC
+ SG_ AEB_Failinfo : 50|2@1+ (1,0) [0|3] "" CLU,ESC
+ SG_ AEB_Status : 52|2@1+ (1,0) [0|3] "" CLU,ESC
+ SG_ AEB_CmdAct : 54|1@1+ (1,0) [0|1] "" ESC
+ SG_ AEB_StopReq : 55|1@1+ (1,0) [0|1] "" CLU,ESC
+ SG_ CR_VSM_Alive : 56|4@1+ (1,0) [0|15] "" ESC,PSB
+ SG_ CR_VSM_ChkSum : 60|4@1+ (1,0) [0|15] "" ESC,PSB
+ SG_ aReqValue : 37|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX
+ SG_ aReqRaw : 24|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX
+
+BO_ 1313 GW_DDM_PE: 8 BCM
+ SG_ C_DRVDoorStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_ASTDoorStatus : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_RLDoorStatus : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_RRDoorStatus : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_TrunkStatus : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ C_OSMirrorStatus : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+
+BO_ 1056 SCC11: 8 SCC
+ SG_ MainMode_ACC : 0|1@1+ (1,0) [0|1] "" CLU,EMS,ESC
+ SG_ SCCInfoDisplay : 1|3@1+ (1,0) [0|7] "" CLU,ESC
+ SG_ AliveCounterACC : 4|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU
+ SG_ VSetDis : 8|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU
+ SG_ ObjValid : 16|1@1+ (1,0) [0|1] "" CLU,ESC,TCU
+ SG_ DriverAlertDisplay : 17|2@1+ (1,0) [0|3] "" CLU,ESC
+ SG_ TauGapSet : 19|3@1+ (1,0) [0|7] "" CLU,ESC,TCU
+ SG_ Navi_SCC_Curve_Status : 56|2@1+ (1,0) [0|3] "" CLU
+ SG_ Navi_SCC_Curve_Act : 58|2@1+ (1,0) [0|3] "" CLU
+ SG_ Navi_SCC_Camera_Act : 60|2@1+ (1,0) [0|3] "" CLU
+ SG_ Navi_SCC_Camera_Status : 62|2@1+ (1,0) [0|3] "" CLU
+ SG_ ACC_ObjStatus : 22|2@1+ (1,0) [0|3] "" ABS,ESC
+ SG_ ACC_ObjLatPos : 24|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC
+ SG_ ACC_ObjRelSpd : 44|12@1+ (0.1,-170) [-170|239.5] "m/s" ABS,ESC
+ SG_ ACC_ObjDist : 33|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC
+
+BO_ 1312 CGW3: 8 BCM
+ SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC
+ SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC
+ SG_ CF_Hoodsw_memory : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EMS
+ SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [-40.0|60.0] "deg" AAF,CLU,DATC,EMS,SPAS,AAF,DATC,EMS,SPAS
+
+BO_ 544 ESP12: 8 ESC
+ SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,TCU
+ SG_ LAT_ACCEL_STAT : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU
+ SG_ LAT_ACCEL_DIAG : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU
+ SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ LONG_ACCEL_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ LONG_ACCEL_DIAG : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU
+ SG_ CYL_PRES : 26|12@1+ (0.1,0.0) [0.0|409.5] "Bar" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU
+ SG_ CYL_PRES_STAT : 38|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU
+ SG_ CYL_PRESS_DIAG : 39|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,PSB,SCC,TCU
+ SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [-40.95|40.96] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU
+ SG_ YAW_RATE_STAT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU
+ SG_ YAW_RATE_DIAG : 54|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU
+ SG_ ESP12_Checksum : 56|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+ SG_ ESP12_AliveCounter : 60|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU
+
+BO_ 1307 CLU16: 8 CLU
+ SG_ CF_Clu_TirePressUnitNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" TPMS
+ SG_ CF_Clu_SlifNValueSet : 3|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Clu_RearWiperNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+
+BO_ 790 EMS11: 8 EMS
+ SG_ SWI_IGK : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,ACU,AHLS,CUBIS,DI_BOX,ECS,EPB,ESC,IBOX,LDWS_LKAS,MDPS,REA,SAS,SCC,TCU
+ SG_ F_N_ENG : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,IBOX,MDPS,SCC,TCU
+ SG_ ACK_TCS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX
+ SG_ PUC_STAT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,DATC,IBOX,TCU
+ SG_ TQ_COR_STAT : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ESC,IBOX,TCU
+ SG_ RLY_AC : 6|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,IBOX,TCU
+ SG_ F_SUB_TQI : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EPB,ESC,IBOX,TCU
+ SG_ TQI_ACOR : 8|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU
+ SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,FPCM,IBOX,MDPS,SCC,TCU
+ SG_ TQI : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,ECS,EPB,ESC,IBOX,TCU
+ SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU
+ SG_ VS : 48|8@1+ (1.0,0.0) [0.0|254.0] "km/h" _4WD,AAF,ACU,AHLS,BCM,CLU,DATC,ECS,EPB,IBOX,LCA,LDWS_LKAS,LVR,MDPS,ODS,SCC,SMK,SPAS,TCU,TPMS
+ SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0.0) [0.0|2.0] "" _4WD,IBOX,TCU
+
+BO_ 1301 CLU14: 8 CLU
+ SG_ CF_Clu_ADrUNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_ADrLNValueSet : 3|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_EscortHLNValueSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_DoorLSNValueSet : 8|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_PSMNValueSet : 11|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_TTUnlockNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_PTGMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_SCMNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_WlightNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_TempUnitNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,DATC
+ SG_ CF_Clu_MoodLpNValueSet : 24|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_TrfChgSet : 27|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS
+ SG_ CF_Clu_OTTurnNValueSet : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_LcaNValueSet : 32|2@1+ (1.0,0.0) [0.0|3.0] "" LCA
+ SG_ CF_Clu_RctaNValueSet : 34|2@1+ (1.0,0.0) [0.0|3.0] "" LCA
+ SG_ CF_Clu_RcwNValueSet : 36|2@1+ (1.0,0.0) [0.0|3.0] "" LCA
+ SG_ CF_Clu_EscOffNValueSet : 38|3@1+ (1.0,0.0) [0.0|7.0] "" ESC
+ SG_ CF_Clu_SccNaviCrvNValueSet : 41|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Clu_SccNaviCamNValueSet : 43|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Clu_SccAebNValueSet : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC
+ SG_ CF_Clu_LkasModeNValueSet : 47|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Clu_FcwNValueSet : 51|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS
+ SG_ CF_Clu_PasSpkrLvNValueSet : 53|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+ SG_ CF_Clu_SccDrvModeNValueSet : 56|3@1+ (1.0,0.0) [0.0|7.0] "" SCC
+ SG_ CF_Clu_HAnBNValueSet : 59|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
+ SG_ CF_Clu_HfreeTrunkTgNValueSet : 61|3@1+ (1.0,0.0) [0.0|7.0] "" BCM
+
+BO_ 275 TCU13: 8 TCU
+ SG_ N_TGT_LUP : 0|8@1+ (10.0,500.0) [500.0|3040.0] "rpm" EMS,IBOX
+ SG_ SLOPE_TCU : 8|6@1+ (0.5,-16.0) [-16.0|15.5] "%" CLU,CUBIS,EMS,IBOX
+ SG_ CF_Tcu_InhCda : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_IsgInhib : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_BkeOnReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_NCStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_TarGr : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,DATC,EMS,EPB,ESC,IBOX,SCC
+ SG_ CF_Tcu_ShfPatt : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,CUBIS,EMS,IBOX
+ SG_ CF_Tcu_InhVis : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_PRelReq : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LVR
+ SG_ CF_Tcu_ITPhase : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_ActEcoRdy : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_TqGrdLim : 32|8@1+ (10.0,0.0) [0.0|2540.0] "Nm/s" EMS,IBOX
+ SG_ CR_Tcu_IsgTgtRPM : 40|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" EMS,IBOX
+ SG_ CF_Tcu_SptRdy : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX
+ SG_ CF_Tcu_SbwPInfo : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ CF_Tcu_Alive3 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_ChkSum3 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX
+
+BO_ 274 TCU12: 8 TCU
+ SG_ ETL_TCU : 0|8@1+ (2.0,0.0) [0.0|508.0] "Nm" EMS,IBOX
+ SG_ CUR_GR : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,ESC,IBOX,SCC,TPMS
+ SG_ CF_Tcu_Alive : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC
+ SG_ CF_Tcu_ChkSum : 14|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC
+ SG_ VS_TCU : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" BCM,CLU,DATC,EMS,IBOX,LCA,LVR,PGS,SMK,SNV
+ SG_ FUEL_CUT_TCU : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ INH_FUEL_CUT : 29|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ IDLE_UP_TCU : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ N_INC_TCU : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX
+ SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15.0|15.0] "" EMS,IBOX
+ SG_ N_TC_RAW : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" EMS,IBOX
+ SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0.0) [0.0|0.9921875] "km/h" CLU,EMS,IBOX,LCA
+
+BO_ 273 TCU11: 8 TCU
+ SG_ TQI_TCU_INC : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX
+ SG_ G_SEL_DISP : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,AFLS,AVM,BCM,CGW,CLU,CUBIS,ECS,EMS,EPB,ESC,IAP,IBOX,LCA,LDWS_LKAS,LVR,MDPS,PGS,SCC,SMK,SNV,SPAS,TPMS
+ SG_ F_TCU : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX
+ SG_ TCU_TYPE : 14|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS,ESC,IBOX
+ SG_ TCU_OBD : 16|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,ESC,IBOX
+ SG_ SWI_GS : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,ESC,IBOX,SCC
+ SG_ GEAR_TYPE : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,EMS,ESC,IBOX,SCC
+ SG_ TQI_TCU : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX
+ SG_ TEMP_AT : 32|8@1+ (1.0,-40.0) [-40.0|214.0] "deg" AAF,CLU,CUBIS,EMS,ESC,IBOX
+ SG_ N_TC : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" _4WD,EMS,EPB,ESC,IBOX
+ SG_ SWI_CC : 56|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU,EMS,ESC,IBOX
+ SG_ CF_Tcu_Alive1 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX
+ SG_ CF_Tcu_ChkSum1 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX
+
+BO_ 16 ACU13: 8 ACU
+ SG_ CF_Acu_CshAct : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CUBIS,IBOX,ODS
+
+BO_ 1007 CRUISE_BUTTON_ALT: 8 XXX
+ SG_ SET_ME_1 : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseSwMain : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseSwState : 60|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 1046 CRUISE_BUTTON_LFA: 8 XXX
+ SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ CruiseSwLfa : 58|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1040 CGW_USM1: 8 BCM
+ SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PTGMRValue : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_ADrLRValue : 8|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_ADrURValue : 11|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_SCMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_WlightRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PSMRValue : 18|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_HAnBRValue : 27|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+
+BO_ 1292 CLU13: 8 CLU
+ SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,FPCM,IBOX
+ SG_ CF_Clu_RefDetMod : 2|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX
+ SG_ CF_Clu_AvgFCU : 3|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX
+ SG_ CF_Clu_AvsmCur : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,SCC
+ SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0.0) [0.0|102.2] "" IBOX
+ SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1.0,0.0) [0.0|3.0] "" DATC,ECS,EMS,ESC,IAP,MDPS,TCU
+ SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1.0,0.0) [0.0|31.0] "" CGW,IBOX
+ SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS
+ SG_ CF_Clu_DTE : 24|10@1+ (1.0,0.0) [0.0|1023.0] "" DATC
+ SG_ CF_Clu_TripUnit : 34|2@1+ (1.0,0.0) [0.0|3.0] "" DATC
+ SG_ CF_Clu_SWL_Stat : 36|3@1+ (1.0,0.0) [0.0|7.0] "" ACU,EMS
+ SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EMS,TCU
+ SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CUBIS,EMS,IAP,IBOX
+ SG_ CF_Clu_IsaMainSW : 43|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
+ SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS
+ SG_ CF_Clu_AltLStatus : 59|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,DATC,EMS
+ SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,LDWS_LKAS
+
+BO_ 1290 SCC13: 8 SCC
+ SG_ SCCDrvModeRValue : 0|3@1+ (1,0) [0|7] "" CLU
+ SG_ SCC_Equip : 3|1@1+ (1,0) [0|1] "" ESC
+ SG_ AebDrvSetStatus : 4|3@1+ (1,0) [0|7] "" CLU,ESC
+ SG_ Lead_Veh_Dep_Alert_USM : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1287 TCS15: 4 ESC
+ SG_ ABS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,IBOX
+ SG_ TCS_OFF_LAMP : 1|2@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU
+ SG_ TCS_LAMP : 3|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ACU,CLU,CUBIS,IBOX,SCC
+ SG_ DBC_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ DBC_F_LAMP : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU
+ SG_ ESC_Off_Step : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ AVH_CLU : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,EPB
+ SG_ AVH_I_LAMP : 24|2@1+ (1.0,0.0) [0.0|3.0] "" EPB
+ SG_ EBD_W_LAMP : 26|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU
+ SG_ AVH_ALARM : 27|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ AVH_LAMP : 29|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EPB,SPAS
+
+BO_ 1282 TCU14: 4 TCU
+ SG_ CF_TCU_WarnMsg : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
+ SG_ CF_TCU_WarnImg : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_TCU_WarnSnd : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ CF_Tcu_GSel_BlinkReq : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,LVR
+ SG_ CF_Tcu_StRelStat : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,ESC
+ SG_ CF_Tcu_DriWarn1 : 13|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC
+ SG_ CF_Tcu_DriWarn2 : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,ESC
+
+BO_ 1281 ECS11: 3 ECS
+ SG_ ECS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX
+ SG_ SYS_NA : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ ECS_DEF : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ ECS_DIAG : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ L_CHG_NA : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Leveling_Off : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ LC_overheat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Lifting : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Lowering : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU
+ SG_ Damping_Mode : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ REQ_Damping : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ REQ_Height : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ REQ_level : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+ SG_ ACT_Height : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU
+
+BO_ 1024 CLU_CFG11: 2 CLU
+ SG_ Vehicle_Type : 0|16@1+ (1.0,0.0) [0.0|65536.0] "" _4WD
+
+BO_ 1280 ACU14: 1 ACU
+ SG_ CF_SWL_Ind : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_TTL_Ind : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
+ SG_ CF_SBR_Ind : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU
+
+BO_ 512 EMS20: 6 EMS
+ SG_ HYDROGEN_GEAR_SHIFTER : 11|3@1+ (1,0) [0|7] "" XXX
+ SG_ CF_Ems_PumpTPres : 16|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" FPCM,IBOX
+ SG_ Split_Stat : 32|1@1+ (1.0,0.0) [0.0|1.0] "" FPCM
+
+BO_ 909 FCA11: 8 FCA
+ SG_ CF_VSM_Prefill : 0|1@1+ (1,0) [0|1] "" ESC
+ SG_ CF_VSM_HBACmd : 1|2@1+ (1,0) [0|3] "" ESC
+ SG_ CF_VSM_Warn : 3|2@1+ (1,0) [0|3] "" ACU,CLU,ESC
+ SG_ CF_VSM_BeltCmd : 5|3@1+ (1,0) [0|7] "" ESC
+ SG_ CR_VSM_DecCmd : 8|8@1+ (0.01,0) [0|2.55] "g" ESC
+ SG_ FCA_Status : 18|2@1+ (1,0) [0|3] "" ACU,CLU,ESC
+ SG_ FCA_CmdAct : 20|1@1+ (1,0) [0|1] "" ESC
+ SG_ FCA_StopReq : 21|1@1+ (1,0) [0|1] "" CLU,ESC
+ SG_ FCA_DrvSetStatus : 22|3@1+ (1,0) [0|7] "" CLU,ESC
+ SG_ CF_VSM_DecCmdAct : 31|1@1+ (1,0) [0|1] "" ESC
+ SG_ FCA_Failinfo : 32|3@1+ (1,0) [0|7] "" ACU,CLU,ESC
+ SG_ CR_FCA_Alive : 35|4@1+ (1,0) [0|15] "" ESC
+ SG_ FCA_RelativeVelocity : 39|9@1+ (0.1,-25.5) [-25.5|25.5] "m/s" iBAU
+ SG_ FCA_TimetoCollision : 48|8@1+ (10,0) [0|2540] "ms" iBAU
+ SG_ CR_FCA_ChkSum : 56|8@1+ (1,0) [0|255] "" ESC
+ SG_ PAINT1_Status : 16|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 1156 HDA11_MFC: 8 XXX
+ SG_ Counter : 5|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 1|2@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_5 : 18|14@1+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_6 : 33|2@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 34|14@1+ (1,0) [0|16383] "" XXX
+ SG_ NEW_SIGNAL_8 : 49|2@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_9 : 50|14@1- (1,-4095) [0|16383] "" XXX
+
+BO_ 1155 FCA12: 8 FCA
+ SG_ FCA_USM : 0|3@1+ (1,0) [0|7] "" CGW,CLU,ESC
+ SG_ FCA_DrvSetState : 3|3@1+ (1,0) [0|7] "" CGW
+
+BO_ 1186 FRT_RADAR11: 2 FCA
+ SG_ CF_FCA_Equip_Front_Radar : 0|3@1+ (1,0) [0|7] "" LDWS_LKAS,LDW_LKA,ESC
+
+BO_ 905 SCC14: 8 SCC
+ SG_ ComfortBandUpper : 0|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC
+ SG_ ComfortBandLower : 6|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC
+ SG_ JerkUpperLimit : 12|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC
+ SG_ JerkLowerLimit : 19|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC
+ SG_ NEW_SIGNAL_1 : 26|6@1+ (1,0) [0|63] "" XXX
+ SG_ ACCMode : 32|3@1+ (1,0) [0|7] "" CLU,HUD,LDWS_LKAS,ESC
+ SG_ ObjDistStat : 42|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ObjGap : 56|8@1+ (1,0) [0|255] "" CLU,HUD,ESC
+
+BO_ 1157 LFAHDA_MFC: 8 XXX
+ SG_ HDA_USM : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ HDA_Active : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ HDA_Icon_State : 3|2@1+ (1,0) [0|3] "" XXX
+ SG_ HDA_Chime : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ HDA_VSetReq : 8|8@1+ (1,0) [0|255] "km/h" XXX
+ SG_ LFA_SysWarning : 16|3@1+ (1,0) [0|7] "" XXX
+ SG_ HDA_Icon_Wheel : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ HDA_LdwSysState : 21|2@1+ (1,0) [0|3] "" XXX
+ SG_ LFA_Icon_State : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ LFA_USM : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ HDA_SysWarning : 29|2@1+ (1,0) [0|3] "" 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_ 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
+
+BO_ 910 WHL_SPD12_FS: 5 iBAU
+ SG_ CRC : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ WHL_SPD12_AliveCounter : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ WHL_SPD_FL : 12|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX
+ SG_ WHL_SPD_FR : 26|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX
+
+BO_ 911 WHL_SPD13_FS: 5 iBAU
+ SG_ CRC : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ WHL_SPD13_AliveCounter : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ WHL_SPD_RL : 12|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX
+ SG_ WHL_SPD_RR : 26|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX
+
+BO_ 865 ADAS_PRK_11: 8 ADAS_PRK
+ SG_ CF_PCA_BrkReq : 24|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ CF_PCA_DclTrgtVal : 28|4@1+ (0.04,0) [0|0] "g" Vector__XXX
+ SG_ PCA_ALIVE_CNT : 40|4@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCA_CHECK_SUM : 48|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 882 ELECT_GEAR: 8 XXX
+ SG_ Elect_Gear_Shifter : 16|4@1+ (1,0) [0|7] "" CLU
+ SG_ Elect_Gear_Shifter_NEXO : 16|16@1+ (1,0) [0|65535] "" CLU
+ SG_ Elect_Gear_Step : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ Elect_Motor_Speed : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ SLC_ON : 31|1@0+ (1,0) [0|1] "" CLU
+ SG_ SLC_SET_SPEED : 32|8@1+ (1,0) [0|255] "" CLU
+
+BO_ 881 E_EMS11: 8 XXX
+ SG_ Brake_Pedal_Pos : 0|8@1+ (1,0) [0|127] "" XXX
+ SG_ IG_Reactive_Stat : 8|3@1+ (1,0) [0|3] "" XXX
+ SG_ Gear_Change : 12|1@0+ (1,0) [0|31] "" XXX
+ SG_ Cruise_Limit_Status : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Limit_Target : 23|8@1+ (1,0) [0|15] "" XXX
+ SG_ Accel_Pedal_Pos : 31|8@1+ (1,0) [0|254] "" XXX
+ SG_ CR_Vcu_AccPedDep_Pos : 56|8@1+ (1,0) [0|254] "" XXX
+ SG_ Engine_Run : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ N : 18|13@1+ (1,0) [0|15] "" XXX
+
+BO_ 1355 EV_PC6: 8 CGW
+ SG_ CF_Vcu_SbwWarnMsg : 16|3@1+ (1,0) [0|7] "" Vector__XXX
+
+BO_ 1430 EV_PC2: 8 CGW
+ SG_ CR_Ldc_ActVol_LS_V : 32|8@1+ (0.1,0) [0|0] "V" Vector__XXX
+
+BO_ 1535 EV_PC10: 8 CGW
+ SG_ CF_Vcu_EpbRequest : 37|1@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 908 RSPA11: 8 RSPA
+ SG_ CF_RSPA_State : 0|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_RSPA_Act : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_RSPA_DecCmd : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_RSPA_Trgt_Spd : 8|10@1+ (0.01,0) [0|10.23] "km/h" XXX
+ SG_ CF_RSPA_StopReq : 18|1@1+ (1,0) [0|2] "" XXX
+ SG_ CR_RSPA_EPB_Req : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ CF_RSPA_ACC_ACT : 50|1@1+ (1,0) [0|2] "" XXX
+ SG_ CF_RSPA_AliveCounter : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ CF_RSPA_CRC : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 914 S_MDPS11: 8 XXX
+ SG_ CF_Mdps_Stat : 0|4@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Mdps_DrvTq : 8|12@1+ (1,0) [0|15] "" XXX
+ SG_ CR_Mdps_StrAng : 24|16@1- (1,0) [0|65535] "" XXX
+ SG_ CF_Mdps_AliveCnt : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ CF_Mdps_Chksum : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 357 S_MDPS12: 8 XXX
+ SG_ NEW_SIGNAL_1 : 0|12@1+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_2 : 12|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Counter : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ Checksum : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 352 AHB1: 8 iBAU
+ SG_ CF_Ahb_SLmp : 0|2@1+ (1,0) [0|3] "" CLU
+ SG_ CF_Ahb_Def : 2|2@1+ (1,0) [0|3] "" CGW
+ SG_ CF_Ahb_Act : 4|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ CF_Ahb_Diag : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ CF_Ahb_WLmp : 7|1@1+ (1,0) [0|1] "" CLU
+ SG_ CR_Ahb_StDep_mm : 8|16@1- (0.1,0) [-3276.8|3276.7] "mm" Vector__XXX
+ SG_ CF_Ahb_SnsFail : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ CF_Ahb_PedalCalStat : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ CF_Ahb_Bzzr : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ CF_Ahb_ChkSum : 56|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1191 MFC_4a7: 2 XXX
+ SG_ PAINT1 : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1162 BCA11: 8 BCW
+ SG_ CF_BCA_State : 16|3@1+ (1,0) [0|7] "" CLU,iBAU
+ SG_ CF_BCA_Warning : 19|2@1+ (1,0) [0|3] "" CLU,iBAU
+ SG_ AliveCounter : 21|4@1+ (1,0) [0|15] "" CLU,iBAU
+ SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|1] "" iBAU
+ SG_ Check_Sum : 56|8@1+ (1,0) [0|16] "" iBAU
+
+BO_ 1136 P_STS: 8 CGW
+ SG_ HCU1_STS : 6|2@1+ (1,0) [0|3] "" BCW,EPB,FCA,MDPS,SCC,iBAU
+ SG_ HCU5_STS : 8|2@1+ (1,0) [0|3] "" EPB,FCA,MDPS,iBAU
+ SG_ Counter : 58|4@1+ (1,0) [0|15] "" MDPS
+ SG_ Checksum : 62|2@1+ (1,0) [0|3] "" MDPS
+
+BO_ 304 YRS11: 8 ACU
+ SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [-163.84|163.83] "deg/s" CGW,iBAU
+ SG_ CR_Yrs_LatAc : 16|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.17651819] "g" iBAU
+ SG_ CF_Yrs_YrStat : 32|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CF_Yrs_LatAcStat : 36|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CF_Yrs_MCUStat : 40|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|255] "" iBAU
+
+BO_ 320 YRS12: 8 ACU
+ SG_ CF_Yrs_LongAcStat : 16|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CF_IMU_ResetStat : 20|4@1+ (1,0) [0|15] "" iBAU
+ SG_ YRS_Temp : 24|8@1+ (1,-68) [-68|187] "" iBAU
+ SG_ YRS_TempStat : 32|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CF_Yrs_Type : 36|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|15] "" iBAU
+ SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|255] "" iBAU
+ SG_ CR_Yrs_LongAc : 0|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.17651819] "g" CGW,iBAU
+
+BO_ 1173 YRS13: 8 ACU
+ SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|281474976710655] "" iBAU
+
+BO_ 870 EMS_366: 8 EMS
+ SG_ TQI_1 : 0|8@1+ (0.390625,0) [0|99.6094] "%" MDPS
+ SG_ N : 8|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" MDPS
+ SG_ TQI_2 : 24|8@1+ (0.390625,0) [0|99.6094] "%" MDPS
+ SG_ VS : 40|8@1+ (1,0) [0|255] "km/h" MDPS
+ SG_ SWI_IGK : 48|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 854 M_356: 8 XXX
+ SG_ PAINT1 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ PAINT2 : 34|2@0+ (1,0) [0|1] "" XXX
+ SG_ PAINT3 : 36|2@0+ (1,0) [0|3] "" XXX
+ SG_ PAINT4 : 38|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 ICM_412h: 8 ICM
+ SG_ T_Outside_input : 0|9@0+ (0.01,0) [0|5] "V" Vector__XXX
+ SG_ WarningSoundOutput_1Group : 5|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ WarningSoundOutput_2Group : 6|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ TRIP_A_DT_Display_clock : 22|7@0+ (1,0) [0|99] "clock" Vector__XXX
+ SG_ TRIP_A_DT_Display_minute : 29|6@0+ (1,0) [0|59] "minute" Vector__XXX
+ SG_ TRIP_B_DT_Display_clock : 38|7@0+ (1,0) [0|99] "clock" Vector__XXX
+ SG_ TRIP_B_DT_Display_minute : 45|6@0+ (1,0) [0|59] "minute" Vector__XXX
+ SG_ PopupMessageOutput_1Level : 48|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_2Level : 49|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_3Level : 50|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_4Level : 51|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_5Level : 52|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_6Level : 53|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_7Level : 54|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1348 Navi_HU: 8 XXX
+ SG_ SpeedLim_Nav_Clu : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SpeedLim_Nav_General : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ SpeedLim_Nav_Cam : 30|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1291 EV_Info: 8 XXX
+ SG_ OPKR_EV_Charge_Level : 17|7@1+ (1,0) [0|100] "%" XXX
+CM_ "BO_ E_EMS11: All (plug-in) hybrids use this gas signal: CR_Vcu_AccPedDep_Pos, and all EVs use the Accel_Pedal_Pos signal. See hyundai/values.py for a specific car list";
+CM_ 145 "Contains signal with accelerator pedal press. Used by fuel cell hydrogen-powered (FCEV) cars such as the 2021 Hyundai Nexo.";
+CM_ 512 "Contains signal with gear shifter. Used by fuel cell hydrogen-powered (FCEV) cars such as the 2021 Hyundai Nexo.";
+CM_ SG_ 871 CF_Lvr_IsgState "Idle Stop and Go";
+CM_ SG_ 1056 SCCInfoDisplay "Goes to 1 for a second while transitioning from Cruise Control to No Message";
+CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD";
+CM_ SG_ 1348 SpeedLim_Nav_Cam "Speed limit if speed cam exist";
+VAL_ 882 Elect_Gear_Shifter_NEXO 1546 "D" 2314 "N" 2566 "R" 2569 "P";
+
+VAL_ 274 CUR_GR 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 7 "D" 8 "D" 14 "R" 0 "P";
+VAL_ 512 HYDROGEN_GEAR_SHIFTER 5 "D" 8 "S" 6 "N" 7 "R" 0 "P";
+VAL_ 871 CF_Lvr_IsgState 0 "enabled" 1 "activated" 2 "unknown" 3 "disabled";
+VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P";
+VAL_ 882 Elect_Gear_Shifter 4 "S" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P" 12 "T";
+VAL_ 905 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled";
+VAL_ 905 ObjDistStat 0 "no_object" 1 "receding" 2 "approaching";
+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_ 1056 SCCInfoDisplay 0 "No Message" 2 "Cruise Control" 3 "Lost Lead" 4 "Standstill";
+VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault";
+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/iqdbc_repo/iqdbc/dbc/hyundai_kia_mando_corner_radar_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_kia_mando_corner_radar_generated.dbc
new file mode 100644
index 000000000..80627f9ae
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_kia_mando_corner_radar_generated.dbc
@@ -0,0 +1,374 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_kia_mando_corner_radar.dbc starts here";
+
+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
+
+BO_ 256 RADAR_POINTS_METADATA_0x100: 64 RADAR
+ SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX
+ SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX
+ SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX
+ SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX
+ SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX
+ SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX
+ SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX
+ SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX
+ SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX
+ SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX
+ SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX
+ SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX
+ SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX
+ SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX
+ SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX
+ SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 512 RADAR_POINTS_METADATA_0x200: 64 RADAR
+ SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX
+ SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX
+ SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX
+ SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX
+ SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX
+ SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX
+ SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX
+ SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX
+ SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX
+ SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX
+ SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX
+ SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX
+ SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX
+ SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX
+ SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX
+ SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX
+ SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX
+ SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX
+ SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX
+ SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX
+ SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX
+ SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX
+ SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX
+ SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX
+ SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 257 RADAR_POINTS_0x101: 64 RADAR
+ SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX
+ SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_DISTANCE : 7|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_1_SIGNAL_2 : 21|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_3 : 23|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_REL_VELOCITY : 31|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_1_SIGNAL_5 : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_6 : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_AZIMUTH : 48|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_1_SIGNAL_8 : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_9 : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_10 : 63|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_1_SIGNAL_11 : 70|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_12 : 71|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_13 : 77|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_14 : 79|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_SIGNAL_15 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_16 : 88|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_17 : 90|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_1_SIGNAL_18 : 93|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_19 : 99|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_1_SIGNAL_20 : 107|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_DISTANCE : 108|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_2_SIGNAL_2 : 122|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_3 : 124|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_REL_VELOCITY : 132|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_2_SIGNAL_5 : 145|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_6 : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_AZIMUTH : 149|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_2_SIGNAL_8 : 161|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_9 : 163|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_10 : 164|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_2_SIGNAL_11 : 171|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_12 : 172|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_13 : 178|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_14 : 180|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_SIGNAL_15 : 188|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_16 : 189|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_17 : 191|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_2_SIGNAL_18 : 194|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_19 : 200|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_2_SIGNAL_20 : 208|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_DISTANCE : 209|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_3_SIGNAL_2 : 223|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_3 : 225|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_REL_VELOCITY : 233|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_3_SIGNAL_5 : 246|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_6 : 248|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_AZIMUTH : 250|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_3_SIGNAL_8 : 262|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_9 : 264|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_10 : 265|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_3_SIGNAL_11 : 272|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_12 : 273|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_13 : 279|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_14 : 281|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_SIGNAL_15 : 289|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_16 : 290|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_17 : 292|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_3_SIGNAL_18 : 295|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_19 : 301|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_3_SIGNAL_20 : 309|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_DISTANCE : 310|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_4_SIGNAL_2 : 324|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_3 : 326|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_REL_VELOCITY : 334|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_4_SIGNAL_5 : 347|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_6 : 349|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_AZIMUTH : 351|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_4_SIGNAL_8 : 363|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_9 : 365|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_10 : 366|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_4_SIGNAL_11 : 373|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_12 : 374|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_13 : 380|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_14 : 382|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_SIGNAL_15 : 390|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_16 : 391|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_17 : 393|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_4_SIGNAL_18 : 396|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_19 : 402|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_4_SIGNAL_20 : 410|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_DISTANCE : 411|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_5_SIGNAL_2 : 425|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_3 : 427|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_REL_VELOCITY : 435|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_5_SIGNAL_5 : 448|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_6 : 450|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_AZIMUTH : 452|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_5_SIGNAL_8 : 464|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_9 : 466|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_10 : 467|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_5_SIGNAL_11 : 474|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_12 : 475|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_13 : 481|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_14 : 483|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_SIGNAL_15 : 491|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_16 : 492|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_17 : 494|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_5_SIGNAL_18 : 497|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_19 : 503|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_5_SIGNAL_20 : 511|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 513 RADAR_POINTS_0x201: 64 RADAR
+ SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX
+ SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_DISTANCE : 7|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_1_SIGNAL_2 : 21|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_3 : 23|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_REL_VELOCITY : 31|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_1_SIGNAL_5 : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_6 : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_AZIMUTH : 48|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_1_SIGNAL_8 : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_9 : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_10 : 63|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_1_SIGNAL_11 : 70|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_12 : 71|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_13 : 77|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_14 : 79|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_1_SIGNAL_15 : 87|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_1_SIGNAL_16 : 88|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_1_SIGNAL_17 : 90|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_1_SIGNAL_18 : 93|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_1_SIGNAL_19 : 99|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_1_SIGNAL_20 : 107|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_DISTANCE : 108|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_2_SIGNAL_2 : 122|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_3 : 124|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_REL_VELOCITY : 132|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_2_SIGNAL_5 : 145|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_6 : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_AZIMUTH : 149|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_2_SIGNAL_8 : 161|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_9 : 163|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_10 : 164|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_2_SIGNAL_11 : 171|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_12 : 172|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_13 : 178|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_14 : 180|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_2_SIGNAL_15 : 188|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_2_SIGNAL_16 : 189|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_2_SIGNAL_17 : 191|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_2_SIGNAL_18 : 194|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_2_SIGNAL_19 : 200|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_2_SIGNAL_20 : 208|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_DISTANCE : 209|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_3_SIGNAL_2 : 223|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_3 : 225|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_REL_VELOCITY : 233|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_3_SIGNAL_5 : 246|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_6 : 248|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_AZIMUTH : 250|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_3_SIGNAL_8 : 262|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_9 : 264|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_10 : 265|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_3_SIGNAL_11 : 272|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_12 : 273|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_13 : 279|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_14 : 281|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_3_SIGNAL_15 : 289|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_3_SIGNAL_16 : 290|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_3_SIGNAL_17 : 292|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_3_SIGNAL_18 : 295|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_3_SIGNAL_19 : 301|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_3_SIGNAL_20 : 309|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_DISTANCE : 310|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_4_SIGNAL_2 : 324|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_3 : 326|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_REL_VELOCITY : 334|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_4_SIGNAL_5 : 347|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_6 : 349|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_AZIMUTH : 351|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_4_SIGNAL_8 : 363|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_9 : 365|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_10 : 366|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_4_SIGNAL_11 : 373|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_12 : 374|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_13 : 380|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_14 : 382|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_4_SIGNAL_15 : 390|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_4_SIGNAL_16 : 391|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_4_SIGNAL_17 : 393|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_4_SIGNAL_18 : 396|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_4_SIGNAL_19 : 402|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_4_SIGNAL_20 : 410|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_DISTANCE : 411|14@1+ (0.015625,0) [0|255.984375] "" XXX
+ SG_ POINT_5_SIGNAL_2 : 425|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_3 : 427|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_REL_VELOCITY : 435|13@1+ (0.03125,-66) [-66|189.96875] "" XXX
+ SG_ POINT_5_SIGNAL_5 : 448|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_6 : 450|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_AZIMUTH : 452|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX
+ SG_ POINT_5_SIGNAL_8 : 464|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_9 : 466|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_10 : 467|7@1+ (1,0) [0|127] "" XXX
+ SG_ POINT_5_SIGNAL_11 : 474|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_12 : 475|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_13 : 481|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_14 : 483|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX
+ SG_ POINT_5_SIGNAL_15 : 491|1@1+ (1,0) [0|1] "" XXX
+ SG_ POINT_5_SIGNAL_16 : 492|2@1+ (1,0) [0|3] "" XXX
+ SG_ POINT_5_SIGNAL_17 : 494|3@1+ (1,0) [0|7] "" XXX
+ SG_ POINT_5_SIGNAL_18 : 497|6@1+ (1,0) [0|63] "" XXX
+ SG_ POINT_5_SIGNAL_19 : 503|8@1+ (1,0) [0|255] "" XXX
+ SG_ POINT_5_SIGNAL_20 : 511|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 260 RADAR_POINTS_CHECKSUM_0x104: 3 RADAR
+ SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 516 RADAR_POINTS_CHECKSUM_0x204: 3 RADAR
+ SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_kia_mando_front_radar_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_kia_mando_front_radar_generated.dbc
new file mode 100644
index 000000000..4abd25331
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_kia_mando_front_radar_generated.dbc
@@ -0,0 +1,425 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "hyundai_kia_mando_front_radar.dbc starts here";
+
+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
+
+BO_ 1280 RADAR_TRACK_500: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1281 RADAR_TRACK_501: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1282 RADAR_TRACK_502: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1283 RADAR_TRACK_503: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1284 RADAR_TRACK_504: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1285 RADAR_TRACK_505: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1286 RADAR_TRACK_506: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1287 RADAR_TRACK_507: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1288 RADAR_TRACK_508: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1289 RADAR_TRACK_509: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1290 RADAR_TRACK_50a: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1291 RADAR_TRACK_50b: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1292 RADAR_TRACK_50c: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1293 RADAR_TRACK_50d: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1294 RADAR_TRACK_50e: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1295 RADAR_TRACK_50f: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1296 RADAR_TRACK_510: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1297 RADAR_TRACK_511: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1298 RADAR_TRACK_512: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1299 RADAR_TRACK_513: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1300 RADAR_TRACK_514: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1301 RADAR_TRACK_515: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1302 RADAR_TRACK_516: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1303 RADAR_TRACK_517: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1304 RADAR_TRACK_518: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1305 RADAR_TRACK_519: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1306 RADAR_TRACK_51a: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1307 RADAR_TRACK_51b: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1308 RADAR_TRACK_51c: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1309 RADAR_TRACK_51d: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1310 RADAR_TRACK_51e: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1311 RADAR_TRACK_51f: 8 RADAR
+ SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX
+ SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX
+ SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX
+ SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX
+ SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
+ SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX
+
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/hyundai_palisade_2023_generated.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_palisade_2023_generated.dbc
new file mode 100644
index 000000000..b930b5e03
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_palisade_2023_generated.dbc
@@ -0,0 +1,1105 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _hyundai_common.dbc starts here";
+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_ACTIVE : 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_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" 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_ VALUE104 : 104|8@1+ (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";
+
+CM_ "hyundai_palisade_2023.dbc starts here";
+
+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/iqdbc_repo/iqdbc/dbc/hyundai_santafe_2007.dbc b/iqdbc_repo/iqdbc/dbc/hyundai_santafe_2007.dbc
new file mode 100644
index 000000000..c0f4f7e18
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/hyundai_santafe_2007.dbc
@@ -0,0 +1,118 @@
+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_: AWD ECU TCU ESP SAS ABS
+
+
+BO_ 339 ESP_Flags: 8 ESP
+ SG_ ABD_Active : 3|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU
+ SG_ TCS_Active : 9|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU
+ SG_ ABS_Active : 10|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU
+ SG_ ESP_Off : 12|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU
+ SG_ ESP_Active : 14|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU
+ SG_ VehicleSpeed : 16|8@1+ (1,0) [0|254] "km/h" AWD,ECU,TCU
+ SG_ TorqueRequestFast : 24|8@1+ (0.390625,0) [0|99.609375] "%" ECU,TCU
+ SG_ TorqueRequestSlow : 40|8@1+ (0.390625,0) [0|99.609375] "%" ECU,TCU
+
+BO_ 497 ESP_WheelSpeed: 8 ESP
+ SG_ FrontRightWheelSpeed : 16|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+ SG_ FrontLeftWheelSpeed : 28|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+ SG_ RearRightWheelSpeed : 40|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+ SG_ RearLeftWheelSpeed : 52|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+
+BO_ 608 ECU_Data1: 8 ECU
+ SG_ TorqueMin : 0|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU
+ SG_ Torque : 8|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU
+ SG_ TorqueTarget : 16|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU
+ SG_ CruiseEnabled : 25|1@1+ (1,0) [0|1] "yes/no" TCU
+ SG_ CruiseActive : 26|1@1+ (1,0) [0|1] "yes/no" TCU
+ SG_ TorqueMax : 40|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU
+
+BO_ 640 ECU_Data2: 8 ECU
+ SG_ RPM : 32|8@1+ (32,0) [0|8160] "rpm" TCU
+ SG_ MAF : 40|8@1+ (5.447,0) [0|1388.985] "mg/TDC" TCU
+ SG_ IAT : 48|8@1- (0.75,-48) [-48|143.25] "C" TCU
+ SG_ MAP : 56|8@1+ (0.47058,0) [0|119.9979] "KPa" TCU
+
+BO_ 688 SAS_Data: 5 SAS
+ SG_ SAS_Angle : 0|16@1- (0.1,0) [-3276.8|3276.7] "deg" AWD,ECU,ESP,TCU
+ SG_ SAS_Speed : 16|8@1+ (4,0) [0|1016] "deg/s" ESP,TCU
+ SG_ SAS_Status : 24|8@1+ (1,0) [0|255] "" ESP,TCU
+ SG_ Msg_Count : 32|4@1+ (1,0) [0|15] "" ESP
+ SG_ Check_Sum : 36|4@1+ (1,0) [0|15] "" ECU,ESP
+
+BO_ 809 ECU_Data5: 8 ECU
+ SG_ ECT : 8|8@1- (0.75,-48) [-48|143.25] "C" AWD,ABS,ESP,TCU
+ SG_ BrakeActive : 32|2@1+ (1,0) [0|3] "yes/no" AWD,ABS,ESP,TCU
+ SG_ TPS : 40|8@1+ (0.47265625,-15) [-15|105.52734375] "%" AWD,ABS,ESP,TCU
+
+BO_ 1064 AWD_Data1: 8 AWD
+ SG_ ClutchDuty : 16|8@1+ (1,0) [0|100] "%" ABS,ESP
+ SG_ ClutchLocked : 44|1@1+ (1,0) [0|1] "yes/no" ABS,ESP
+
+BO_ 1065 AWD_Data2: 8 AWD
+ SG_ SteeringWheelPosition : 0|16@1+ (1,-600) [-600|600] "deg" ABS
+ SG_ FrontRightWheelSpeed : 16|8@1+ (1,0) [0|254] "km/h" ABS
+ SG_ FrontLeftWheelSpeed : 24|8@1+ (1,0) [0|254] "km/h" ABS
+ SG_ RearRightWheelSpeed : 32|8@1+ (1,0) [0|254] "km/h" ABS
+ SG_ RearLeftWheelSpeed : 40|8@1+ (1,0) [0|254] "km/h" ABS
+
+BO_ 1087 TCU_Data: 8 TCU
+ SG_ CurrentGear : 0|3@1+ (1,0) [0|7] "" ECU
+ SG_ GearSwitch : 3|1@1+ (1,0) [0|1] "yes/no" ECU
+ SG_ SelectorPosition : 8|4@1+ (1,0) [0|15] "" ECU
+ SG_ InputShaftSpeed : 40|16@1+ (0.25,0) [0|16383.5] "rpm" ECU
+
+BO_ 1349 ECU_Data6: 8 ECU
+ SG_ BatteryVoltage : 24|8@1+ (0.1015625,0) [0|25.8984375] "V" ABS,ESP
+
+BO_ 1408 ABS_WheelSpeed: 8 ABS
+ SG_ FrontRightWheelSpeed : 16|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+ SG_ FrontLeftWheelSpeed : 28|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+ SG_ RearRightWheelSpeed : 40|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+ SG_ RearLeftWheelSpeed : 52|12@1+ (0.125,0) [0|511.875] "km/h" AWD
+
+BO_ 1695 ECU_Data7: 8 ECU
+ SG_ ECU_Temperature : 8|8@1- (1,-28) [-28|227] "C" TCU
+
+BO_ 1984 SAS_Calibration: 2 ESP
+ SG_ CCW : 0|4@1+ (1,0) [0|15] "" SAS
+ SG_ CID : 4|11@1+ (1,0) [0|2047] "" SAS
+
+
+
+VAL_ 1087 CurrentGear 7 "R" 0 "N" 1 "1" 2 "2" 3 "3" 4 "4" ;
+VAL_ 1087 SelectorPosition 7 "R" 6 "N" 5 "D" 8 "M" 15 "P" ;
+
diff --git a/iqdbc_repo/iqdbc/dbc/luxgen_s5_2015.dbc b/iqdbc_repo/iqdbc/dbc/luxgen_s5_2015.dbc
new file mode 100644
index 000000000..34fe6b646
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/luxgen_s5_2015.dbc
@@ -0,0 +1,153 @@
+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
+
+
+BO_ 928 EPB_STATUS: 8 XXX
+ SG_ EPB_BRAKE : 16|1@1+ (1,0) [0|3] "" XXX
+
+BO_ 1104 SEATBELT_STATUS: 8 XXX
+ SG_ DRIVER_SEAT_BELT_ONOFF : 21|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 1056 BODY_ECU_STATUS: 8 XXX
+ SG_ DOOR_RL_STATUS : 18|1@0+ (1,0) [0|255] "" XXX
+ SG_ DOOR_FL_STATUS : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_FR_STATUS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_RR_STATUS : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_BACK_DOOR_STATUS : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_SIGNAL_STATUS : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_SIGNAL_STATUS : 9|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 832 GEAR_RPM_SPEED_STATUS: 8 XXX
+ SG_ TRANS_MODE : 7|5@1+ (1,0) [0|0] "" XXX
+ SG_ TRANS_GEAR_POS : 2|3@0+ (1,0) [0|1] "" XXX
+ SG_ ENGINE_RPM1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ENGINE_TEMP : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 821 THROTTLE_STATUS: 8 XXX
+ SG_ CRUSE_ONOFF : 2|1@0+ (1,0) [0|1] "on/off" XXX
+ SG_ CRUSE_ENABLED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ THROTTLE_PEDAL_POS : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ THROTTLE_POS : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ RPM : 48|8@1- (1,0) [0|65535] "" XXX
+
+BO_ 922 STEERING_ANGLE_STATUS: 8 XXX
+ SG_ STEER_ANGLE_9000 : 7|16@0- (1,0) [0|65535] "" XXX
+
+BO_ 906 WHEEL_SPEEDS: 8 XXX
+ SG_ SPEED_FR : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ ABS_UNDEF1 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ SPEED_FL : 0|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 848 ABS_WHEELS_STATUS: 8 XXX
+ SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 15|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1402 DASH_STATUS: 8 XXX
+ SG_ CAR_SPEED : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ DASH_INFO2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ DASH_INFO0 : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ DASH_INFO_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ DASH_INFO_3 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1306 _SPEEDX: 8 XXX
+ SG_ DASH_CAR_SPEED : 7|9@0+ (1,0) [0|255] "" XXX
+
+BO_ 1296 undefined: 8 XXX
+
+BO_ 790 ENGINE_DATA: 8 XXX
+ SG_ _X2 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1313 undefined_2: 8 XXX
+
+BO_ 1312 __trigger_every_range: 8 XXX
+ SG_ __SIGNAL_every_interval : 4|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 896 undefined_3: 8 XXX
+ SG_ NEW_SIGNAL_1 : 32|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 809 undefined_4: 8 XXX
+
+BO_ 864 BREAK_TCS_STATUS: 8 XXX
+ SG_ SPEED3 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ TCS_ON_FF : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ XXXX1 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRSSED : 42|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 842 undefined_5: 8 XXX
+
+BO_ 880 WHEEL_RPM_STATUS: 8 XXX
+ SG_ WHEEL_RL_SPEED : 23|16@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_FR_SPEED : 39|16@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_FL_SPEED : 55|16@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_RR_SPEED : 7|16@0- (1,0) [0|255] "" XXX
+
+BO_ 1040 CONSOLE_STATUS: 8 XXX
+ SG_ LEFT_SIGNAL_SWITCH : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_SIGNAL_SWITCH : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEAD_LIGHT_HANDLE_SWITCH : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ HID_LIGHT_SWITCH : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ YELLOW_WARN_TEMP_TRIGGER : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ HID_LIGHT_HANDLE_SWITCH : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ MIX_MODE : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ slider_rain_bar : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ temp_slider_rain_bar : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ temp_water_push : 11|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1120 HAVC_STATUS: 8 XXX
+ SG_ HAVC_TEMP : 32|8@1+ (1,0) [0|255] "" XXX
+
+
+CM_ SG_ 1104 DRIVER_SEAT_BELT_ONOFF "0 - on , 1 = off";
+CM_ SG_ 1056 DOOR_RL_STATUS "04 - RL - open";
+CM_ SG_ 1056 DOOR_FL_STATUS "28 - FL open , 38 - FR";
+CM_ SG_ 1056 RIGHT_SIGNAL_STATUS "R,L shows at same time means hazard";
+CM_ SG_ 832 TRANS_MODE "AT - 85 / MT - 8D";
+CM_ SG_ 832 TRANS_GEAR_POS "R-7 , 0 - N";
+CM_ SG_ 821 CRUSE_ONOFF "Cruse Switch";
+CM_ SG_ 821 CRUSE_ENABLED "Cruse enabled";
+CM_ SG_ 821 THROTTLE_PEDAL_POS "Real Pedal Pos";
+CM_ SG_ 821 THROTTLE_POS "Throttle Pos for Cruse Mode";
+CM_ SG_ 906 ABS_UNDEF1 "ABS force";
+CM_ SG_ 906 SPEED_FL "used for car speed in dash board";
+CM_ SG_ 864 TCS_ON_FF "ON = 1, OFF =0";
diff --git a/iqdbc_repo/iqdbc/dbc/mazda_2017.dbc b/iqdbc_repo/iqdbc/dbc/mazda_2017.dbc
new file mode 100644
index 000000000..d2bb77b35
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/mazda_2017.dbc
@@ -0,0 +1,791 @@
+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
+
+
+BO_ 117 STEER_RELATED: 8 XXX
+ SG_ CTR : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 54|4@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|1@0+ (1,0) [0|63] "" XXX
+ SG_ STEER_ANGLE_2 : 39|16@0+ (0.1,-1800) [0|131071] "" XXX
+ SG_ STEER_TORQUE : 19|12@0+ (1,-2000) [0|255] "" XXX
+
+BO_ 118 RPM_RELATED: 8 XXX
+ SG_ CTR : 7|8@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_2 : 19|12@0+ (1,0) [0|4095] "" XXX
+
+BO_ 514 ENGINE_DATA: 8 XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|127] "" XXX
+ SG_ RPM : 7|16@0+ (0.25,0) [0|8500] "rpm" XXX
+ SG_ SPEED : 23|16@0+ (0.01,0) [0|32767] "kph" XXX
+ SG_ PEDAL_GAS : 39|12@0+ (1,0) [0|255] "%" XXX
+
+BO_ 357 PEDALS: 8 XXX
+ SG_ NEW_SIGNAL_6 : 31|4@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 8|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_OFF : 2|1@1+ (1,0) [0|15] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX
+ SG_ STANDSTILL : 26|1@0+ (1,0) [0|16777215] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ NO_BRAKE : 6|1@0+ (1,0) [0|7] "" XXX
+ SG_ BRAKE_ON_2 : 7|1@1+ (1,0) [0|255] "" XXX
+ SG_ NO_BRAKE_2 : 15|1@0+ (1,0) [0|7] "" XXX
+ SG_ GEAR : 48|5@1+ (1,0) [0|255] "" XXX
+
+BO_ 533 WHEEL_SPEEDS: 8 XXX
+ SG_ FL : 7|16@0+ (0.01,-100) [0|16383] "kph" XXX
+ SG_ FR : 23|16@0+ (0.01,-100) [0|65535] "kph" XXX
+ SG_ RL : 39|16@0+ (0.01,-100) [0|15] "kph" XXX
+ SG_ RR : 55|16@0+ (0.01,-100) [0|65535] "kph" XXX
+
+BO_ 134 STEER2: 8 XXX
+ SG_ CTR : 22|4@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_4 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ CTR_2 : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ STEER_ANGLE_ROUGH : 26|11@0+ (1,-1000) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 18|3@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_ANGLE : 7|16@0+ (0.1,-1600) [-500|500] "deg" XXX
+ SG_ NEW_SIGNAL_1 : 63|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|7] "" XXX
+
+BO_ 576 STEER_TORQUE: 8 XXX
+ SG_ NEW_SIGNAL_1 : 23|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ SENSOR1 : 39|8@0+ (1,-128) [0|127] "" XXX
+ SG_ STEER_TORQUE_MOTOR : 46|15@0- (0.1,0) [-3000|3000] "tbd" XXX
+ SG_ NEW_SIGNAL_2 : 62|4@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_4 : 15|8@0+ (1,0) [0|127] "" XXX
+ SG_ STEER_TORQUE_SENSOR : 7|8@0+ (1,-127) [-85|85] "" XXX
+
+BO_ 577 STEER_RATE: 8 XXX
+ SG_ STEER_ANGLE_RATE : 23|16@0+ (0.25,-8192) [0|1] "deg/s" XXX
+ SG_ CTR : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKAS_REQUEST : 3|12@0+ (1,-2048) [0|15] "" XXX
+ SG_ LKAS_EFFECTIVE : 39|12@0+ (1,-2048) [0|255] "" XXX
+ SG_ HANDS_OFF_5_SECONDS : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_BLOCK : 50|1@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_TRACK_STATE : 52|1@0+ (1,0) [0|3] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 582 CAM_LANEMAYBE: 8 XXX
+ SG_ NEW_SIGNAL_4 : 40|8@1+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_1 : 31|16@0- (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|16@0+ (1,0) [0|65535] "" XXX
+ SG_ CTR : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 541 CAM_EMPTY: 8 XXX
+
+BO_ 605 CAM_PEDESTRIAN: 8 XXX
+ SG_ CTR : 17|4@0+ (1,0) [0|255] "" XXX
+ SG_ AEB_NOT_ENGAGED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ PED_WARNING : 9|1@0+ (1,0) [0|255] "" XXX
+ SG_ PED_BRAKE : 3|3@0+ (1,0) [0|7] "" XXX
+ SG_ RST_CTR : 23|6@0+ (1,0) [0|63] "" XXX
+ SG_ S1 : 29|4@0+ (1,0) [0|31] "" XXX
+ SG_ BRAKE_WARNING : 25|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 578 CAM_LANETRACK: 8 XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ ZERO : 53|6@0+ (1,0) [0|63] "" XXX
+ SG_ CTR : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ LINE2 : 9|10@0+ (1,-686) [0|255] "" XXX
+ SG_ LANE_CURVE : 31|8@0+ (1,-127) [0|255] "" XXX
+ SG_ SIG1 : 39|8@0+ (1,-128) [0|255] "" XXX
+ SG_ SIG2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SIG3 : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ LINE1 : 3|10@0+ (1,-686) [0|1] "" XXX
+
+BO_ 579 CAM_LKAS: 8 XXX
+ SG_ CTR : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ERR_BIT_1 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX
+ SG_ LINE_NOT_VISIBLE : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ BIT_1 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDW : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_REQUEST : 3|12@0+ (1,-2048) [0|2048] "" XXX
+ SG_ ERR_BIT_2 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ ANGLE_ENABLED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_ANGLE : 33|12@0+ (1,-2048) [-2048|2047] "" XXX
+
+BO_ 580 CAM_DISTANCE: 8 XXX
+ SG_ S1 : 0|8@1+ (1,0) [0|127] "" XXX
+ SG_ S2 : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ S3 : 16|8@1+ (1,0) [0|3] "" XXX
+ SG_ S4 : 24|8@1+ (1,0) [0|31] "" XXX
+ SG_ S5 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ DISTANCE : 47|8@0+ (1,0) [0|65535] "" XXX
+ SG_ S6 : 55|16@0+ (1,0) [0|255] "" XXX
+
+BO_ 581 CAM_IDK3: 8 XXX
+ SG_ S1 : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ S2 : 8|6@1+ (1,0) [0|255] "" XXX
+ SG_ S3 : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ S4 : 16|8@1+ (1,0) [0|15] "" XXX
+ SG_ S5 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ S6 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ S7 : 40|8@1+ (1,0) [0|3] "" XXX
+ SG_ S8 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ S9 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 863 CAM_TRAFFIC_SIGNS: 8 XXX
+ SG_ NEW_SIGNAL_3 : 55|1@0+ (1,0) [0|127] "" XXX
+ SG_ FORWARD_COLLISION : 40|8@1+ (1,0) [0|7] "" XXX
+ SG_ SPEED_SIGN : 4|7@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 52|5@0+ (1,0) [0|31] "" XXX
+ SG_ SPEED_SIGN_CAM : 32|1@0+ (1,0) [0|32767] "" XXX
+ SG_ SPEED_SIGN_ON : 12|1@0+ (1,0) [0|3] "" XXX
+ SG_ STOP_SIGN : 31|4@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 33|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1157 CAM_SETTINGS: 8 XXX
+ SG_ SBS_WARNING_DISTANCE : 25|2@0+ (1,0) [0|127] "" XXX
+ SG_ SBS_SCBC : 28|2@0+ (1,0) [0|7] "" XXX
+ SG_ LKAS_ASSIT_TIMING : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_SENSETIVITY : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ILKAS_NTERVENTION_ON2 : 17|1@0+ (1,0) [0|255] "" XXX
+ SG_ LANEE_DEPARTURE_ALERT : 16|2@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_INERVENTION_ON1 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ BIT1 : 12|1@0+ (1,0) [0|7] "" XXX
+ SG_ BIT2 : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ BIT3 : 18|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1160 CAM_Empty3: 8 XXX
+ SG_ NEW_SIGNAL_1 : 47|24@0+ (1,0) [0|16777215] "" XXX
+
+BO_ 1088 CAM_LANEINFO: 8 XXX
+ SG_ BIT3 : 62|1@0+ (1,0) [0|3] "" XXX
+ SG_ HANDS_ON_STEER_WARN_2 : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ HANDS_ON_STEER_WARN : 56|1@0+ (1,0) [0|3] "" XXX
+ SG_ S1_HBEAM : 54|1@0+ (1,0) [0|31] "" XXX
+ SG_ S1 : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ HANDS_WARN_3_BITS : 51|3@0+ (1,0) [0|7] "" XXX
+ SG_ ERR_BIT : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ NO_ERR_BIT : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ BIT2 : 13|1@0+ (1,0) [0|15] "" XXX
+ SG_ LANE_LINES : 10|3@0+ (1,0) [0|3] "" XXX
+ SG_ BIT1 : 6|1@0+ (1,0) [0|65535] "" XXX
+ SG_ LINE_NOT_VISIBLE : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ LINE_VISIBLE : 0|1@0+ (1,0) [0|3] "" XXX
+ SG_ LDW_WARN_RL : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDW_WARN_LL : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ TJA : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ TJA_TRANSITION : 27|2@0+ (1,0) [0|63] "" XXX
+
+BO_ 1479 NEW_MSG_470: 8 XXX
+
+BO_ 1456 NEW_MSG_300: 8 XXX
+
+BO_ 1446 NEW_MSG_a600: 8 XXX
+
+BO_ 1416 MSG_18: 8 XXX
+
+BO_ 1086 DOORS: 8 XXX
+ SG_ LEFTGATE : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 53|1@0+ (1,0) [0|255] "" XXX
+ SG_ KEYFOB_HORN : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ KEYFOB_LOCK : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ KEYFOB_UNLOCK : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CTR1 : 8|4@1+ (1,0) [0|3] "" XXX
+ SG_ CTR2 : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ BL : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ FR : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ FL : 37|1@0+ (1,0) [0|255] "" XXX
+ SG_ DOORS_UNLOCKED : 30|1@0+ (1,0) [0|255] "" XXX
+
+BO_ 977 TWO_STATES: 8 XXX
+ SG_ NEW_SIGNAL_1 : 50|1@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_2 : 56|4@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_3 : 28|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 24|4@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_5 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 47|8@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_8 : 51|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1085 MSG_12: 8 XXX
+ SG_ NEW_SIGNAL_3 : 36|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 16|8@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 48|8@1+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 31|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 24|1@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_6 : 40|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 159 MSG_11: 8 XXX
+ SG_ NEW_SIGNAL_1 : 50|4@1+ (1,0) [0|15] "" XXX
+ SG_ INCREASEING : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1278 NEW_MSG_3: 8 XXX
+ SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ MILAGE_MAYBE : 7|16@0+ (1,0) [0|255] "" XXX
+
+BO_ 1277 NEW_MSG_10: 8 XXX
+ SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ counter : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1275 2017_5: 8 XXX
+ SG_ counter : 4|5@0+ (1,0) [0|255] "" XXX
+
+BO_ 1274 NEW_MSG_12: 8 XXX
+ SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ CTR : 55|4@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 35|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 32|3@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_4 : 48|4@1+ (1,0) [0|7] "" XXX
+
+BO_ 1180 last_byte_roughRPM: 8 XXX
+ SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1078 HVAC: 8 XXX
+ SG_ NEW_SIGNAL_1 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 8|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|1@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 56|5@0+ (1,0) [0|255] "" XXX
+
+BO_ 1056 CHECK_AND_TEMP: 8 XXX
+ SG_ NEW_SIGNAL_1 : 29|6@0+ (1,0) [0|255] "" XXX
+ SG_ counter_or_GEAR : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ STANDSTILL : 32|1@0+ (1,0) [0|255] "" XXX
+ SG_ COOLANT_TEMP : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LOW_ENGINE_OIL_PRESSURE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECK_FUEL_CAP : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHARGING_SYSTEM_MALFUNCTION : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ OUTDOOR_TEMP : 63|8@0+ (0.25,-63) [0|255] "cel" XXX
+
+BO_ 1045 TRACTION: 8 XXX
+ SG_ NEW_SIGNAL_2 : 20|1@0+ (1,0) [0|3] "" XXX
+ SG_ CTR2 : 19|4@0+ (1,0) [0|31] "" XXX
+ SG_ CTR3 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ IS_MOVING : 12|1@0+ (1,0) [0|3] "" XXX
+ SG_ CTR1 : 53|6@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_WARNING : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ABS_MALFUNCTION : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ DSC_OFF : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ TCS_DCS_MALFUNCTION : 6|2@0+ (1,0) [0|3] "" XXX
+ SG_ LOUD_BEEP : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ TPMS_WARNING_DOUBLE_BLINK : 31|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1034 MSG_07: 8 XXX
+ SG_ NEW_SIGNAL_1 : 6|3@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 0|4@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_9 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 870 RADAR_366_STATIC: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 867 RADAR_363: 8 XXX
+ SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ STATIC_4 : 43|16@0+ (1,0) [0|255] "" XXX
+ SG_ FLIPPY_1 : 31|3@0+ (1,0) [0|7] "" XXX
+ SG_ FLIPPY_2 : 47|1@0+ (1,0) [0|15] "" XXX
+ SG_ FLIPPY_4 : 44|1@0+ (1,0) [0|3] "" XXX
+ SG_ FLIPPY_3 : 46|1@0+ (1,0) [0|3] "" XXX
+ SG_ CURVE_1 : 7|12@0+ (1,0) [0|255] "" XXX
+ SG_ CURVE_2 : 11|12@0+ (1,0) [0|255] "" XXX
+ SG_ CURVE_3 : 28|13@0+ (1,0) [0|255] "" XXX
+
+BO_ 130 STEER: 8 XXX
+ SG_ NEW_SIGNAL_5 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 47|4@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 23|16@0+ (0.05,-1600) [500|-500] "deg" XXX
+ SG_ CHKSUM_MAYBE : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 120 BRAKE: 8 XXX
+ SG_ CTR : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PRESSURE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ VEHICLE_ACC_X : 5|13@0+ (0.01,-40) [-40|40] "m/s^2" XXX
+ SG_ VEHICLE_ACC_Y : 8|13@0+ (0.001,-4.096) [-4.096|4.096] "m/s^2" XXX
+
+BO_ 304 GEAR_RELATED: 8 XXX
+ SG_ NEW_SIGNAL_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 865 RADAR_DISTANCE: 8 XXX
+ SG_ CTR : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ STATIC : 36|3@0+ (1,0) [0|31] "" XXX
+ SG_ DISTANCE_RELATED : 33|4@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_INVERSE : 43|12@0- (-0.225,0) [0|255] "kph" XXX
+ SG_ DISTANCE_LEAD : 7|24@0+ (1,0) [0|31] "" XXX
+ SG_ RELATIVE_VEL_LEAD : 31|11@0- (1,0) [0|255] "" XXX
+
+BO_ 836 NEW_MSG_19: 8 XXX
+ SG_ CTR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CTR2 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 832 SEATBELT: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ PASSENGER_SEATBELT : 26|1@1+ (1,0) [0|7] "" XXX
+ SG_ CTR1 : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ CTR2 : 23|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 8|4@1+ (1,0) [0|3] "" XXX
+ SG_ DRIVER_SEATBELT : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 866 RADAR_TURN: 8 XXX
+ SG_ CTR : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ STEER_ANGLE : 43|12@0+ (-1,2048) [0|7] "" XXX
+ SG_ STATIC_2 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ CURVE_1 : 7|12@0+ (1,0) [0|131071] "" XXX
+ SG_ CURVE_2 : 11|12@0- (1,0) [0|127] "" XXX
+ SG_ FLIPPY_1 : 44|1@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 34|3@1+ (1,0) [0|3] "" XXX
+ SG_ CURVE_3 : 31|11@0- (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_1 : 33|4@0+ (1,0) [0|3] "" XXX
+
+BO_ 158 MSG_05: 8 XXX
+ SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 157 CRZ_BTNS: 8 XXX
+ SG_ BIT1 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ BIT2 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ BIT3 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_P_INV : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAN_OFF_INV : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAN_OFF : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_M_INV : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_M : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_P : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ RES_INV : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ RES : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE_LESS : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE_LESS_INV : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE_MORE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE_MORE_INV : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ MODE_Y : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ MODE_X : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ MODE_Y_INV : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ MODE_X_INV : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ CTR : 29|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 154 BLINK_INFO: 8 XXX
+ SG_ LEFT_BLINK : 18|1@1+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_BLINK : 19|1@0+ (1,0) [0|255] "" XXX
+ SG_ REAR_WIPER_ON : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ WIPER_LO : 33|1@1+ (1,0) [0|31] "" XXX
+ SG_ WIPER_HI : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_BEAMS : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ HIGH_BEAMS : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LBEAM1 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBEAM2 : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ LBEAM3 : 60|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 145 TURN_SWITCH: 8 XXX
+ SG_ HAZARD : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_RIGHT_SWITCH : 12|1@0+ (1,0) [0|3] "" XXX
+ SG_ TURN_LEFT_SWITCH : 13|1@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 27|4@0+ (1,0) [0|255] "" XXX
+ SG_ CHKSUM : 39|8@0+ (1,0) [0|15] "" XXX
+
+BO_ 80 MSG_04: 8 XXX
+ SG_ NEW_SIGNAL_1 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIGNAL : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 978 MSG_03: 8 XXX
+ SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 1|2@0+ (1,0) [0|255] "" XXX
+
+BO_ 607 NEW_MSG_25: 8 XXX
+
+BO_ 1115 MSG_02: 8 XXX
+ SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 47|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 2|3@0+ (1,0) [0|255] "" XXX
+
+BO_ 1067 NEW_MSG_27: 8 XXX
+ SG_ NEW_SIGNAL_2 : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 11|1@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_7 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_8 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_9 : 8|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 358 NEW_MSG_28: 8 XXX
+
+BO_ 608 NEW_MSG_29: 8 XXX
+ SG_ NEW_SIGNAL_1 : 8|5@1+ (1,0) [0|7] "" XXX
+
+BO_ 606 SPEED_TBD: 8 XXX
+ SG_ SPEED_TBD : 7|12@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 23|12@0- (1,0) [0|65535] "" XXX
+
+BO_ 552 GEAR: 8 XXX
+ SG_ NEW_SIGNAL_3 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 26|3@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 31|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_7 : 39|1@0+ (1,0) [0|255] "" XXX
+ SG_ MORE_GEAR : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ GEAR : 2|3@0+ (1,0) [0|7] "" XXX
+ SG_ GEAR_BOX : 36|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 543 CRZ_EVENTS: 8 XXX
+ SG_ CTR : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_21 : 23|1@0+ (1,0) [0|15] "" XXX
+ SG_ GAS_MAYBE : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_CMD : 46|8@0- (1,0) [0|15] "" XXX
+ SG_ CRUISE_ACTIVE_CAR_MOVING : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ PLUS_ONE_CRZ : 17|1@0+ (1,0) [0|255] "" XXX
+ SG_ CRZ_STARTED : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX
+ SG_ PLUS_ONE_CRZ_2 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_CMD_LOW_RES : 29|8@0- (1,0) [0|255] "" XXX
+ SG_ CRZ_SPEED : 7|16@0+ (0.005,-0.5) [0|328] "kph" XXX
+
+BO_ 542 NEW_MSG_33: 8 XXX
+ SG_ CTR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CTR2 : 56|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 868 RADAR_364: 8 XXX
+ SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 7|12@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 11|12@0- (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 27|12@0- (1,0) [0|255] "" XXX
+ SG_ FLIPPERS_1 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 44|1@1+ (1,0) [0|3] "" XXX
+ SG_ FLIPPY_1 : 46|1@0+ (1,0) [0|3] "" XXX
+ SG_ STATIC_1 : 47|1@0+ (1,0) [0|15] "" XXX
+ SG_ STATIC_2 : 43|16@0+ (1,0) [0|7] "" XXX
+
+BO_ 869 RADAR_365: 8 XXX
+ SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_1 : 7|14@0+ (1,0) [0|65535] "" XXX
+ SG_ RELATED_1 : 9|18@0+ (1,0) [0|3] "" XXX
+ SG_ RELATED_2 : 33|18@0+ (1,0) [0|15] "" XXX
+ SG_ STATIC : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 63|2@0+ (1,0) [0|15] "" XXX
+
+BO_ 1114 NEW_MSG_4: 8 XXX
+
+BO_ 535 CURVE_CTRS: 8 XXX
+ SG_ CTR_A_1 : 4|3@0+ (1,0) [0|31] "" XXX
+ SG_ CTR_A_2 : 7|3@0+ (1,0) [0|255] "" XXX
+ SG_ CTR_B_1 : 12|3@0+ (1,0) [0|7] "" XXX
+ SG_ CTR_B_2 : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ CTR_C_1 : 20|3@0+ (1,0) [0|7] "" XXX
+ SG_ CTR_C_2 : 23|3@0+ (1,0) [0|255] "" XXX
+ SG_ CTR_D_2 : 31|3@0+ (1,0) [0|7] "" XXX
+ SG_ CTR_D_1 : 28|3@0+ (1,0) [0|7] "" XXX
+ SG_ SPEED : 39|16@0+ (0.01,0) [0|7] "kph" XXX
+ SG_ CTR : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHK_MAYBE : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_8 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_MAYBE : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ NO_SEATBELT_MAYBE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 9|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 540 CRZ_CTRL: 8 XXX
+ SG_ NEW_SIGNAL_6 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_9 : 31|1@0+ (1,0) [0|255] "" XXX
+ SG_ ACC_GAS_MAYBE2 : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ HANDS_OFF_STEERING : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ HANDS_ON_STEER_WARN : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ CRZ_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRZ_AVAILABLE : 17|1@0+ (1,0) [0|255] "" XXX
+ SG_ DISTANCE_SETTING : 20|3@0+ (1,0) [0|7] "" XXX
+ SG_ MSG_1_INV : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ MSG_1_COPY : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_GAS_MAYBE : 23|1@0+ (1,0) [0|31] "" XXX
+ SG_ ACC_ACTIVE_2 : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_10 : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ MSG_1 : 0|1@0+ (1,0) [0|3] "" XXX
+ SG_ 5_SEC_DISABLE_TIMER : 45|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_3 : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_1_INV_COPY : 8|1@0+ (1,0) [0|7] "" XXX
+ SG_ RADAR_HAS_LEAD : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ RADAR_LEAD_RELATIVE_DISTANCE : 31|3@0+ (1,0) [0|5] "" XXX
+
+BO_ 539 CRZ_INFO: 8 XXX
+ SG_ CTR1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ ACC_ACTIVE : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 47|1@0+ (1,0) [0|255] "" XXX
+ SG_ ACC_SET_ALLOWED : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRZ_ENDED : 36|1@0+ (1,0) [0|255] "" XXX
+ SG_ ACCEL_CMD : 17|13@0+ (1,-4096) [0|1] "" XXX
+ SG_ STATIC_1 : 15|11@0+ (1,0) [0|16383] "" XXX
+ SG_ STATIC_2 : 18|3@1+ (1,0) [0|3] "" XXX
+ SG_ ERROR_STATUS : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 121 EPB: 8 XXX
+ SG_ NEW_SIGNAL_1 : 4|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 25|2@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 41|2@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_9 : 47|1@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_10 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_11 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ EPB_ACTIVE : 29|1@0+ (1,0) [0|15] "" XXX
+
+BO_ 1070 2017_1: 8 XXX
+
+BO_ 1183 2017_2: 8 XXX
+
+BO_ 1243 2017_3: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX
+
+BO_ 1269 MSG_2017_4: 8 XXX
+ SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|18446744073709552000] "" XXX
+
+BO_ 1178 2017_6: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX
+
+BO_ 1179 2017_7: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX
+
+BO_ 1435 2017_8: 8 XXX
+
+BO_ 253 GAS: 8 XXX
+ SG_ NEW_SIGNAL_1 : 16|1@0+ (1,0) [0|65535] "" XXX
+ SG_ CTR : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 41|1@0+ (1,0) [0|255] "" XXX
+ SG_ CRZ_NOT_ACTIVE : 61|1@0+ (1,0) [0|255] "" XXX
+ SG_ GAS_CMD : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 359 MORE_GAS: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 31|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 36|5@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 38|1@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_5 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 47|4@0+ (1,0) [0|255] "" XXX
+
+BO_ 512 NEW_MSG_30: 8 XXX
+ SG_ NEW_SIGNAL_1 : 6|7@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 23|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 22|7@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_6 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_8 : 38|7@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_9 : 40|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_10 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ CTR : 51|3@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_11 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 515 MSG_01: 8 XXX
+ SG_ CTR : 39|4@0+ (1,0) [0|65535] "" XXX
+ SG_ CHKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ START1 : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ START2 : 28|5@0+ (1,0) [0|255] "" XXX
+
+BO_ 529 NEW_MSG_36: 8 XXX
+ SG_ NEW_SIGNAL_1 : 22|5@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 32|4@1+ (1,0) [0|3] "" XXX
+ SG_ CTR : 39|4@0+ (1,0) [0|255] "" XXX
+ SG_ CTR_2 : 47|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 40|4@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_5 : 53|1@0+ (1,0) [0|255] "" XXX
+
+BO_ 1242 NEW_MSG_37: 8 XXX
+
+BO_ 1266 MSG_09: 8 XXX
+ SG_ NEW_SIGNAL_1 : 20|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 19|4@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|1@0+ (1,0) [0|255] "" XXX
+
+BO_ 976 MSG_15: 8 XXX
+ SG_ NEW_SIGNAL_1 : 55|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 61|6@0+ (1,0) [0|1] "" XXX
+
+BO_ 155 MSG_14: 8 XXX
+
+BO_ 1267 MSG_10: 8 XXX
+ SG_ NEW_SIGNAL_1 : 40|1@0+ (1,0) [0|16777215] "" XXX
+ SG_ NEW_SIGNAL_2 : 42|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 305 NEW_MSG_6: 8 XXX
+ SG_ NEW_SIGNAL_1 : 8|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 10|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1238 TEMPERATURE: 8 XXX
+ SG_ TEMPERATURE_MAYBE : 47|8@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1087 NEW_MSG_1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1143 BSM: 8 XXX
+ SG_ BSM_OFF : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BS_3 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ STANDSTILL : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BS_STATUS : 13|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_BS_STATUS : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_BS3 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BS4 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BS_SIDE : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ IS_MOVING : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BS_BEHIND : 46|2@1+ (1,0) [0|16777215] "" XXX
+ SG_ RIGHT_BS_DISTANCE : 35|3@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ REAR_CT_ALERT : 23|5@0+ (1,0) [0|63] "" XXX
+
+BO_ 480 ACCEL_TEST: 8 XXX
+ SG_ ACCEL_COMMAND : 7|32@0- (1,0) [-2147483647|2147483647] "" XXX
+ SG_ ENABLED : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ STARTING : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ STOPPING : 48|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1361 KEY_POSITION: 8 XXX
+
+BO_ 1283 KEY_POSITION2: 8 XXX
+
+BO_ 628 MSG_06: 8 XXX
+
+BO_ 1154 MSG_08: 8 XXX
+
+BO_ 1139 MSG_13: 8 XXX
+
+BO_ 1270 MSG_16: 8 XXX
+
+BO_ 1272 MSG_17: 8 XXX
+
+BO_ 1425 MSG_19: 8 XXX
+
+BO_ 70 MOB1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 1|3@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 14|6@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 30|6@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 38|6@0+ (1,0) [0|7] "" XXX
+
+BO_ 64 MOB2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|2@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 10|3@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 16|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 24|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 35|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_7 : 13|3@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_8 : 15|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_9 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_10 : 31|6@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_11 : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1171 MOB3: 8 XXX
+
+BO_ 1248 MOB4: 8 XXX
+
+BO_ 1177 RADAR_499_STATIC: 8 XXX
+
+
+
+
+CM_ SG_ 357 GEAR "13P, 26R, 13N, 24D";
+CM_ SG_ 605 PED_BRAKE "3: no brake, 4: brake";
+CM_ SG_ 605 BRAKE_WARNING "Flashing brake warning and audible alert for potential forward collision";
+CM_ SG_ 579 STEERING_ANGLE "steering angle aligns with 0.022 factor and -45.06 offset";
+CM_ SG_ 863 SPEED_SIGN "speed limit in MPH";
+CM_ SG_ 863 SPEED_SIGN_CAM "1: The speed limit is recognized by the camera. 0: speed limit is map based or is not available";
+CM_ SG_ 863 STOP_SIGN "value 9 when stop sign is active";
+CM_ SG_ 1157 SBS_WARNING_DISTANCE "1 far, 2 mid, 3 near";
+CM_ SG_ 1157 SBS_SCBC "1 off, 2 on";
+CM_ SG_ 1157 LKAS_ASSIT_TIMING "1 at, 0 before";
+CM_ SG_ 1157 LKAS_SENSETIVITY "0 low, 1 high";
+CM_ SG_ 1157 LANEE_DEPARTURE_ALERT "1 off, 2 on";
+CM_ SG_ 1157 WARNING "1 Rare, 0 often";
+CM_ SG_ 1088 LANE_LINES "0 LKAS disabled, 1 no lines, 2 two lines, 3 left line, 4 right line";
+CM_ SG_ 1088 TJA "2: crz not active, 3: TJA not allowed, 4: TJA allowed";
+CM_ SG_ 1088 TJA_TRANSITION "3: if TJA signal is 3, otherwise set to 0";
+CM_ SG_ 1045 ABS_MALFUNCTION "off: 0, solid: 1, slow blink: 2, fast blink: 3";
+CM_ SG_ 120 VEHICLE_ACC_X "Vehicle acceleration of X-axis wrt. NED frame.";
+CM_ SG_ 120 VEHICLE_ACC_Y "Vehicle acceleration of Y-axis wrt. NED frame.";
+CM_ SG_ 157 CAN_OFF "Disengage Cruise if enabled, if already disabled TURN it OFF ";
+CM_ SG_ 552 MORE_GEAR "";
+CM_ SG_ 552 GEAR "0 Shifting, 1 P, 2 R, 3 N, 4 D";
+CM_ SG_ 552 GEAR_BOX "0 P, 14 R, 1 though 6 D for speeds, 15 Shift";
+CM_ SG_ 540 HANDS_ON_STEER_WARN "0 no warning, b warning";
+CM_ SG_ 540 DISTANCE_SETTING "Radar distance 0: disabled, 1: 4 bars, 2: 3 bars, 3: 2 bars, 4: 1 bar";
+CM_ SG_ 1143 REAR_CT_ALERT "Rear Cross Traffic Alert";
+VAL_ 552 GEAR 1 "P" 2 "R" 3 "N" 4 "D" ;
+VAL_ 540 RADAR_HAS_LEAD 0 "NO LEAD" 1 "HAS LEAD" ;
+VAL_ 540 RADAR_LEAD_RELATIVE_DISTANCE 0 "NO LEAD" 1 "FARTHEST" 2 "4" 3 "3" 4 "2" 5 "NEAREST" ;
+VAL_ 1143 LEFT_BS_STATUS 0 "No object detected" 1 "Object detected in left blindspot" 2 "Object detected in left blindspot with blinker - warning"
+VAL_ 1143 RIGHT_BS_STATUS 0 "No object detected" 1 "Object detected in right blindspot" 2 "Object detected in right blindspot with blinker - warning"
diff --git a/iqdbc_repo/iqdbc/dbc/mazda_3_2019.dbc b/iqdbc_repo/iqdbc/dbc/mazda_3_2019.dbc
new file mode 100644
index 000000000..b23e7196b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/mazda_3_2019.dbc
@@ -0,0 +1,408 @@
+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
+
+
+BO_ 256 CAM_Start: 8 XXX
+ SG_ NEW_SIGNAL_7 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_8 : 61|2@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_10 : 44|12@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 63|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_5 : 24|12@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 2|2@0+ (1,0) [0|1] "" XXX
+ SG_ ACTIVE_TARGET : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 20|12@0+ (1,0) [0|7] "" XXX
+ SG_ DISTANCE_LEAD_CAR : 0|12@0+ (1,0) [0|255] "" XXX
+
+BO_ 358 CAM_End: 8 XXX
+ SG_ NEW_SIGNAL_2 : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_3 : 59|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1216 CAM_69: 8 XXX
+ SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_5 : 55|12@0+ (1,0) [0|7] "" XXX
+
+BO_ 1120 CAM_KEEP_ALIVE_2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 1436 CAM_71: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 18 STEER: 8 XXX
+ SG_ NEW_SIGNAL_3 : 55|2@0+ (1,0) [0|15] "" XXX
+ SG_ CTR : 41|2@0+ (1,0) [0|3] "" XXX
+ SG_ STEER_LEFT_BIT : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_ANGLE : 25|14@0- (1,375) [0|65536] "" XXX
+ SG_ ENGINE_OFF : 43|2@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 53|6@0+ (1,0) [0|15] "" XXX
+
+BO_ 257 LKAS: 8 XXX
+ SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ CTR_ACT : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_0 : 48|1@1+ (1,0) [0|3] "" XXX
+ SG_ SET_0_1 : 63|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_19 : 2|2@0+ (1,0) [0|255] "" XXX
+ SG_ LEAD_DIST : 0|12@0+ (1,0) [0|255] "" XXX
+ SG_ ANGLE_TARGET : 20|12@0+ (1,0) [0|4095] "" XXX
+ SG_ UNKNOWN : 24|12@0+ (1,0) [0|4095] "" XXX
+ SG_ MAX_TORQUE__ : 44|12@0- (1,0) [0|4095] "" XXX
+
+BO_ 258 NEW_MSG_3: 8 XXX
+ SG_ NEW_SIGNAL_3 : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 44|10@0- (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 1|2@1+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|10@0- (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 13|10@0- (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 18|10@0- (1,0) [0|255] "" XXX
+
+BO_ 28 WHEEL_SPEEDS: 8 XXX
+ SG_ RR : 55|16@0+ (0.01,-100) [0|65535] "" XXX
+ SG_ RL : 39|16@0+ (0.01,-102) [0|65535] "" XXX
+ SG_ FL : 7|16@0+ (0.01,-100) [0|65535] "" XXX
+ SG_ FR : 23|16@0+ (0.01,-100) [0|65535] "" XXX
+
+BO_ 259 NEW_MSG_5: 8 XXX
+ SG_ NEW_SIGNAL_3 : 39|10@0- (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 44|10@0- (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 0|12@0- (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 19|11@0- (1,0) [0|10000000] "" XXX
+
+BO_ 260 NEW_MSG_6: 8 XXX
+ SG_ NEW_SIGNAL_1 : 0|12@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 24|12@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 20|12@0- (1,0) [0|1] "" XXX
+
+BO_ 261 NEW_MSG_7: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 262 NEW_MSG_8: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|8@0- (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 263 NEW_MSG_9: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 310 NEW_MSG_10: 8 XXX
+ SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 308 ACC_POSSIBLY: 8 XXX
+ SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 4|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 54|7@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 0|7@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_7 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 18|7@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 36|7@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_8 : 55|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 304 CAM_LANES: 8 XXX
+ SG_ NEW_SIGNAL_3 : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LANE_DETECTED : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_DETECTED : 4|1@0+ (1,0) [0|255] "" XXX
+ SG_ DISTANCE_TO_LEFT_LANE_LOW_RES : 29|8@0+ (1,0) [0|4095] "" XXX
+ SG_ DISTANCE_TO_RIGHT_LANE_LOW_RES : 37|8@0+ (1,0) [0|15] "" XXX
+ SG_ DISTANCE_TO_RIGHT_LANE : 23|10@0- (1,0) [0|2047] "" XXX
+ SG_ DISTANCE_TO_LEFT_LANE : 1|10@0- (1,0) [0|1] "" XXX
+
+BO_ 305 CAM_LANES_2_MAYBE: 8 XXX
+ SG_ NEW_SIGNAL_1 : 1|10@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 37|8@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_6 : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_4 : 29|8@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_8 : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|10@0+ (1,0) [0|4095] "" XXX
+
+BO_ 352 NEW_MSG_14: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 355 NEW_MSG_15: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|127] "" XXX
+
+BO_ 356 NEW_MSG_16: 8 XXX
+ SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 61|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 357 NEW_MSG_17: 8 XXX
+ SG_ NEW_SIGNAL_1 : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ NEW_SIGNAL_3 : 56|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 59 STEER_RATE: 8 XXX
+ SG_ NEW_SIGNAL_2 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ STEER_ANGLE_RATE : 55|8@0+ (0.05,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_1 : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ STEER_ANGLE : 23|16@0+ (0.05,-1600) [-500|500] "" XXX
+ SG_ CHKSUM : 39|8@0+ (1,0) [0|15] "" XXX
+
+BO_ 24 BRAKE_PEDAL: 8 XXX
+ SG_ BRAKE_PEDAL_PRESSED_AND_ENGINE_ON : 0|1@0+ (1,0) [0|3] "" XXX
+ SG_ NOT_BRAKE_PEDAL_PRESSED : 6|1@0+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_PEDAL_PRESSED : 7|1@0+ (1,0) [0|65535] "" XXX
+ SG_ NOT_BRAKE_PEDAL_PRESSED_AND_ENGINE_ON : 15|1@0+ (1,0) [0|7] "" XXX
+
+BO_ 26 ENGINE_DATA: 8 XXX
+ SG_ PEDAL_GAS : 39|10@0+ (1,0) [0|15] "" XXX
+ SG_ CHKSUM : 63|8@0- (1,0) [0|15] "" XXX
+ SG_ RPM : 7|13@0+ (1,0) [0|15] "" XXX
+ SG_ ENGINE_ON : 52|1@0+ (1,0) [0|15] "" XXX
+
+BO_ 145 BLINK_INFO: 8 XXX
+ SG_ RIGHT_BLINK : 12|1@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_BLINK : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ Speed : 27|12@0+ (1,0) [0|255] "" XXX
+ SG_ CTR : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX
+
+BO_ 16 STEER_TORQUE: 8 XXX
+ SG_ NEW_SIGNAL_12 : 7|2@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 43|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ STEER_TORQUE_SENSOR : 5|13@0+ (1,-4000) [0|15] "" XXX
+ SG_ CHKSUM : 63|8@0- (1,0) [0|15] "" XXX
+ SG_ STEER_TORQUE_MOTOR : 8|13@0+ (0.05,-205) [0|15] "" XXX
+ SG_ BRAKE_PREASURE : 27|12@0+ (1,0) [0|15] "" XXX
+
+BO_ 17 STEER_TORQUE_2: 8 XXX
+ SG_ CTR : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_TORQUE_MOTOR : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 27|14@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 45|6@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|12@0+ (1,0) [0|255] "" XXX
+
+BO_ 29 WHEEL: 8 XXX
+ SG_ STANDSTILL : 52|1@0+ (1,0) [0|15] "" XXX
+ SG_ SPEED : 39|16@0+ (1,0) [0|127] "" XXX
+ SG_ ENCODER_1 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ENCODER_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_6 : 55|3@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 51|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 31 GEAR: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX
+ SG_ GEAR : 36|4@0+ (1,0) [0|65535] "" XXX
+
+BO_ 96 STEER2: 8 XXX
+ SG_ NEW_SIGNAL_5 : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ CTR : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ TURN_ON : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_OFF : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENGINE_ON : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ CAR_MOVING_FORWARD : 21|1@0+ (1,0) [0|15] "" XXX
+ SG_ CAR_REVERSING : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENGINE_OFF : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 45|1@0+ (1,0) [0|15] "" XXX
+ SG_ SPEED : 18|16@0- (0.00621371,-62.1371) [-65635|65635] "MPH" XXX
+ SG_ STEER__ : 7|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 1209 KEEP_ALIVE_1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_6 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_7 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 4|5@0+ (1,0) [0|127] "" XXX
+
+BO_ 37 BLANK_1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 44 BLANK_2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|16777215] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 39|16@0+ (1,0) [0|16777215] "" XXX
+
+BO_ 128 RADARS: 8 XXX
+ SG_ NEW_SIGNAL_1 : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 15|1@0+ (1,0) [0|255] "" XXX
+ SG_ FRONT_LEFT : 19|1@0+ (1,0) [0|255] "" XXX
+ SG_ FRONT : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RIGHT : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ REAR_RIGHT : 20|1@0+ (1,0) [0|15] "" XXX
+ SG_ REAR_LEFT : 17|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 129 NEW_MSG_19: 8 XXX
+ SG_ NEW_SIGNAL_2 : 15|1@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 47|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_5 : 56|8@1+ (1,0) [0|15] "" XXX
+
+BO_ 1034 KEEP_ALIVE_2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 55|16@0+ (1,0) [0|255] "" XXX
+
+BO_ 1200 KEEP_ALIVE_3: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 55|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 354 CAM_KEEP_ALIVE_1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|30@0+ (1,0) [0|65535] "" XXX
+
+BO_ 336 NEW_MSG_20: 8 XXX
+ SG_ NEW_SIGNAL_2 : 7|8@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_1 : 11|12@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 342 NEW_MSG_21: 8 XXX
+ SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 63|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_5 : 39|16@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_3 : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_7 : 7|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_8 : 23|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_6 : 40|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 264 NEW_MSG_2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 56|8@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 49|3@1+ (1,0) [0|7] "" XXX
+ SG_ CRZ_CTRL_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 22 CRZ_CTRL_BTNS: 8 XXX
+ SG_ CRZ_CTRL_BTN_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 51|3@0+ (1,0) [0|7] "" XXX
+ SG_ SIGNAL : 45|1@0+ (1,0) [0|15] "" XXX
+ SG_ NOT_SIGNAL : 46|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 306 CAM_LANE_3_MAYBE: 8 XXX
+ SG_ NEW_SIGNAL_1 : 19|10@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 13|10@0+ (1,0) [0|255] "" XXX
+ SG_ LANE_DETECTED_1 : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_DETECTED_2 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 25|10@0+ (1,0) [0|1] "" XXX
+ SG_ STEER : 7|10@0+ (1,0) [0|1] "" XXX
+
+BO_ 307 NEW_MSG_1: 8 XXX
+ SG_ NEW_SIGNAL_2 : 13|10@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 61|6@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 25|10@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 7|10@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 19|10@0+ (1,0) [0|1] "" XXX
+
+BO_ 320 NEW_MSG_4: 8 XXX
+ SG_ NEW_SIGNAL_4 : 16|1@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 43|6@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 36|9@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 27|7@0+ (1,0) [0|1] "" XXX
+
+BO_ 321 NEW_MSG_11: 8 XXX
+ SG_ NEW_SIGNAL_1 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 32|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 293 NEW_MSG_12: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 39|16@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 19|4@0+ (1,0) [0|1] "" XXX
+
+BO_ 294 NEW_MSG_13: 8 XXX
+ SG_ NEW_SIGNAL_1 : 59|4@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 61|2@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 7|16@0+ (1,0) [0|1] "" XXX
+
+BO_ 292 NEW_MSG_18: 8 XXX
+ SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 291 NEW_MSG_22: 8 XXX
+ SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 290 NEW_MSG_23: 8 XXX
+ SG_ NEW_SIGNAL_1 : 31|5@0+ (1,0) [0|255] "" XXX
+
+BO_ 277 NEW_MSG_24: 8 XXX
+ SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 278 NEW_MSG_25: 8 XXX
+
+BO_ 273 NEW_MSG_26: 8 XXX
+ SG_ NEW_SIGNAL_1 : 23|4@0+ (1,0) [0|3] "" XXX
+
+BO_ 274 NEW_MSG_27: 8 XXX
+ SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 289 NEW_MSG_28: 8 XXX
+ SG_ NEW_SIGNAL_1 : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 20 NEW_MSG_29: 8 XXX
+ SG_ RIGHT_BLINK_CLOCK : 23|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 288 NEW_MSG_30: 8 XXX
+
+
+
+
+CM_ SG_ 31 GEAR "13-P, 12-R, 11-N, 1-6-D";
+CM_ SG_ 96 SPEED "";
+VAL_ 31 GEAR 13 "P" 12 "R" 11 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D";
diff --git a/iqdbc_repo/iqdbc/dbc/mazda_radar.dbc b/iqdbc_repo/iqdbc/dbc/mazda_radar.dbc
new file mode 100644
index 000000000..a4fe3b4b9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/mazda_radar.dbc
@@ -0,0 +1,73 @@
+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
+
+
+BO_ 540 CRZ_CTRL: 8 XXX
+
+BO_ 539 CRZ_INFO: 8 XXX
+
+BO_ 865 RADAR_TRACK_361: 8 XXX
+ SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX
+ SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX
+
+BO_ 866 RADAR_TRACK_362: 8 XXX
+ SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX
+ SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX
+
+BO_ 867 RADAR_TRACK_363: 8 XXX
+ SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX
+ SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX
+
+BO_ 868 RADAR_TRACK_364: 8 XXX
+ SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX
+ SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX
+
+BO_ 869 RADAR_TRACK_365: 8 XXX
+ SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX
+ SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX
+
+BO_ 870 RADAR_TRACK_366: 8 XXX
+ SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX
+ SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX
+ SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX
+
+BO_ 1177 RADAR_499: 8 XXX
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/mazda_rx8.dbc b/iqdbc_repo/iqdbc/dbc/mazda_rx8.dbc
new file mode 100644
index 000000000..b81e7c1d9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/mazda_rx8.dbc
@@ -0,0 +1,77 @@
+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_: PowertrainControlModule InstrumentCluster ElectricPowerSteering AntilockBrakeSystem
+
+
+BO_ 129 steering: 8 ElectricPowerSteering
+ SG_ SteeringAngle : 23|16@0- (1,0) [0|0] "deg" Vector__XXX
+
+BO_ 513 speed: 8 PowertrainControlModule
+ SG_ EngineRPM : 7|16@0+ (0.25,0) [0|0] "rpm" Vector__XXX
+ SG_ VehicleSpeed : 39|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX
+ SG_ AcceleratorPos : 55|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+
+BO_ 592 throttle_body: 8 PowertrainControlModule
+ SG_ IntakeAirTemperature : 31|8@0+ (1,-40) [0|0] "Cel" Vector__XXX
+ SG_ AcceleratorPedalSensorRaw : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AcceleratorPedalSensorFiltered : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 658 brake_controls: 8 PowertrainControlModule
+ SG_ BrakePedalSwitch : 43|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ ParkingBrakeSwitch : 38|1@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1056 coolant: 8 PowertrainControlModule
+ SG_ CoolantTemperature : 7|8@0+ (1,-40) [0|0] "Cel" Vector__XXX
+
+BO_ 1072 instrument_cluster: 8 InstrumentCluster
+ SG_ FuelLevel : 7|8@0+ (0.392156,0) [0|0] "%" Vector__XXX
+ SG_ FuelTankSensorLeft : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FuelTankSensorRight : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1200 wheel_speed: 8 AntilockBrakeSystem
+ SG_ WheelSpeedFL : 7|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX
+ SG_ WheelSpeedFR : 23|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX
+ SG_ WheelSpeedRL : 39|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX
+ SG_ WheelSpeedRR : 55|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX
+
+CM_ SG_ 129 SteeringAngle "Steering wheel angle: positive is right and negative is left";
+CM_ SG_ 513 AcceleratorPos "processed interpretation of AcceleratorPedalSensor values";
+CM_ SG_ 1072 FuelTankSensorLeft "lower sensor values indicate a more full tank";
+CM_ SG_ 1072 FuelTankSensorRight "lower sensor values indicate a more full tank";
+
+
+
+
diff --git a/iqdbc_repo/iqdbc/dbc/mercedes_benz_e350_2010.dbc b/iqdbc_repo/iqdbc/dbc/mercedes_benz_e350_2010.dbc
new file mode 100644
index 000000000..da6ae4c15
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/mercedes_benz_e350_2010.dbc
@@ -0,0 +1,176 @@
+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
+
+
+BO_ 3 STEER_SENSOR: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_RATE : 19|12@0- (0.5,0) [0|255] "" XXX
+ SG_ STEER_DIRECTION : 4|1@0+ (1,2) [0|1] "" XXX
+ SG_ STEER_ANGLE : 3|12@0- (-0.5,0) [-500|500] "degrees" XXX
+
+BO_ 5 BRAKE_MODULE: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_HOLD : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_POSITION : 17|10@0+ (1,0) [0|65535] "" XXX
+ SG_ DRIVER_BRAKE : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ COMPUTER_BRAKE : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PRESSED : 0|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 69 DRIVER_CONTROLS: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ STEERING_WHEEL_BUTTONS : 32|16@1+ (1,0) [0|255] "4 directional, 2 volume control & 2 phone buttons" XXX
+ SG_ LEFT_BLINKER : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGHBEAM_TOGGLE : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGHBEAM_MOMENTARY : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_CANCEL : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_RESUME : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_ACCEL_HIGH : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_DECEL_HIGH : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_ACCEL_LOW : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_DECEL_LOW : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_XFF : 15|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 513 WHEEL_ENCODERS: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ WHEEL_ENCODER_2 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_ENCODER_3 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_ENCODER_4 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ WHEEL_ENCODER_1 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 261 GAS_PEDAL: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ ENGINE_RPM : 4|5@0+ (1,0) [0|255] "" XXX
+ SG_ GAS_PEDAL : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ COMBINED_GAS : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 DOOR_SENSORS: 8 XXX
+ SG_ BRAKE_PRESSED : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 3|1@1+ (1,0) [0|3] "" XXX
+ SG_ DOOR_OPEN_RL : 5|1@0+ (1,0) [0|3] "" XXX
+ SG_ DOOR_OPEN_RR : 7|1@0+ (1,0) [0|3] "" XXX
+ SG_ DOOR_OPEN_FL : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_FL : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_FR : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_RL : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_RR : 6|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 885 SEATBELT_SENSORS: 8 XXX
+ SG_ SEATBELT_DRIVER_LATCHED : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_PASSENGER_LATCHED : 18|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 257 CRUISE_CONTROL: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 6|1@0+ (1,0) [0|255] "" XXX
+ SG_ CRUISE_DISABLED : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X002 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X003 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_1 : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_ACCELERATING : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ LONGITUDINAL_ACCEL_REQUEST : 15|8@0- (1,0) [0|127] "" XXX
+
+BO_ 260 CRUISE_CONTROL2: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_XFF : 31|8@0+ (1,0) [0|65535] "" XXX
+ SG_ SET_ME_X02 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_XFF2 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 7|4@0+ (1,0) [0|255] "" XXX
+
+BO_ 14 STEER_TORQUE: 8 XXX
+ SG_ STEER_TORQUE : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 888 CRUISE_CONTROL3: 8 XXX
+ SG_ NEW_SIGNAL_2 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_DISABLED : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_ENABLED : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X003 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X004 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X002 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ CRUISE_SET_SPEED : 15|8@0+ (1,0) [0|63] "mph" XXX
+ SG_ CRUISE_SPEED_CHANGE : 55|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 307 POWER_SEATS: 8 XXX
+ SG_ DRIVER_FORWARD : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_BACK : 1|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 109 GEAR_LEVER: 8 XXX
+ SG_ PARK_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEUTRAL_UP : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEUTRAL_DOWN : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ REVERSE : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 23|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 115 GEAR_PACKET: 8 XXX
+ SG_ GEAR : 0|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 581 IGNITION: 8 XXX
+
+BO_ 515 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_MOVING_FR : 22|1@1+ (1,0) [0|15] "" XXX
+ SG_ WHEEL_MOVING_RL : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_MOVING_FL : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_MOVING_RR : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ WHEEL_SPEED_FL : 2|11@0+ (0.0375,0) [0|255] "mph" XXX
+ SG_ WHEEL_SPEED_FR : 18|11@0+ (0.0375,0) [0|255] "mph" XXX
+ SG_ WHEEL_SPEED_RL : 34|11@0+ (0.0375,0) [0|255] "mph" XXX
+ SG_ WHEEL_SPEED_RR : 50|11@0+ (0.0375,0) [0|255] "mph" XXX
+
+
+
+
+CM_ SG_ 3 STEER_DIRECTION "0 = left, 1 = right";
+CM_ SG_ 5 BRAKE_POSITION "computer and driver";
+CM_ SG_ 5 BRAKE_PRESSED "computer and driver";
+CM_ SG_ 261 GAS_PEDAL "user gas input";
+CM_ SG_ 261 COMBINED_GAS "computer and driver gas";
+CM_ SG_ 257 CRUISE_ACCELERATING "";
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/nissan_leaf_2018_generated.dbc b/iqdbc_repo/iqdbc/dbc/nissan_leaf_2018_generated.dbc
new file mode 100644
index 000000000..c714d2f24
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/nissan_leaf_2018_generated.dbc
@@ -0,0 +1,184 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _nissan_common.dbc starts here";
+BO_ 2 STEER_ANGLE_SENSOR: 5 XXX
+ SG_ STEER_ANGLE_RATE : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X07 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 0|16@1- (-0.1,0) [0|65535] "" XXX
+ SG_ COUNTER : 32|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 361 LKAS: 8 XXX
+ SG_ MAX_TORQUE : 39|8@0+ (0.01,0) [0|255] "Nm" XXX
+ SG_ SET_0x80 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX
+ SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 389 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX
+ SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|127] "" XXX
+
+BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX
+ SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 689 PROPILOT_HUD: 8 XXX
+ SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING2 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_YELLOW_FLASH : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_YELLOW_FLASH : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_CAR : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_CAR_ERROR : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_ERROR : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_ERROR_FLASHING : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_GREEN : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_GREEN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING3 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ERROR_FLASHING : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ SAFETY_SHIELD_ACTIVE : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ LARGE_STEERING_WHEEL_ICON : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LANE_GREEN_FLASH : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_GREEN_FLASH : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUDIBLE_TONE : 47|3@0+ (1,0) [0|8] "" XXX
+ SG_ SPEED_SET_ICON : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ SMALL_STEERING_WHEEL_ICON : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ SET_SPEED : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ unknown02 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown05 : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown08 : 8|7@0+ (1,0) [0|63] "" XXX
+ SG_ unknown26 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown28 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown31 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown43 : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown55 : 55|8@0+ (1,0) [0|63] "" XXX
+ SG_ unknown59 : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 451 PROPILOT_BRAKE: 8 XXX
+ SG_ BRAKE_PRESSURE : 5|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_ACTIVE : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 783 CRUISE_STATE: 3 XXX
+ SG_ CRUISE_ENABLED : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX
+ SG_ NA_HIGH_ACCEL_TEMP : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_NA_HIGH_CABIN_TEMP : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_MALFUNCTION : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_MALFUNCTION : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_MALFUNCTION : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_NA_CLEAN_REAR_CAMERA : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ NA_POOR_ROAD_CONDITIONS : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ CURRENTLY_UNAVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ SAFETY_SHIELD_OFF : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_NA_RADAR_OBSTRUCTION : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_DO_NOT_ENTER : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_SYSTEM_OFF : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_MALFUNCTION : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_COLLISION_MALFUNCTION : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_MALFUNCTION2 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_MALFUNCTION2 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_MALFUNCTION2 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_MSGS : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ BOTTOM_MSG : 45|3@0+ (1,0) [0|7] "" XXX
+ SG_ HANDS_ON_WHEEL_WARNING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_STEP_ON_BRAKE_NOW : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_HIGH_CABIN_TEMP : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_PROPILOT_MALFUNCTION : 54|1@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_UNAVAILABLE_HIGH_CABIN_TEMP : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_NA_FRONT_CAMERA_IMPARED : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown07 : 7|7@0+ (1,0) [0|127] "" XXX
+ SG_ unknown10 : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown15 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown23 : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ unknown19 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown31 : 31|6@0+ (1,0) [0|63] "" XXX
+ SG_ unknown32 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown46 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown50 : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ unknown55 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown61 : 61|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 1227 LKAS_SETTINGS: 8 XXX
+ SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ;
+VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ;
+VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ;
+VAL_ 689 AUDIBLE_TONE 0 "NO_TONE" 1 "CONT" 2 "FAST_BEEP_CONT" 3 "TRIPLE_FAST_BEEP_CONT" 4 "SLOW_BEEP_CONT" 5 "QUAD_SLOW_BEEP_CONT" 6 "SINGLE_BEEP_ONCE" 7 "DOUBLE_BEEP_ONCE" ;
+VAL_ 689 SMALL_STEERING_WHEEL_ICON 0 "NO_ICON" 1 "GRAY_ICON" 2 "GRAY_ICON_FLASHING" 3 "GREEN_ICON" 4 "GREEN_ICON_FLASHING" 5 "RED_ICON" 6 "RED_ICON_FLASHING" 7 "YELLOW_ICON" ;
+VAL_ 689 LARGE_STEERING_WHEEL_ICON 0 "NO_STEERINGWHEEL" 1 "GRAY_STEERINGWHEEL" 2 "GREEN_STEERINGWHEEL" 3 "GREEN_STEERINGWHEEL_FLASHING" ;
+
+CM_ "nissan_leaf_2018.dbc starts here";
+
+BO_ 42 SEATBELT: 8 XXX
+ SG_ SEATBELT_DRIVER_LATCHED : 27|1@1+ (1,0) [0|3] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown2 : 31|4@0+ (1,0) [0|15] "" XXX
+ SG_ unknown3 : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ unknown1 : 7|24@0+ (1,0) [0|16777215] "" XXX
+ SG_ unknown4 : 39|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 460 BRAKE_PEDAL: 8 XXX
+ SG_ BRAKE_PEDAL : 7|8@0+ (1,0) [0|256] "" XXX
+
+BO_ 569 CRUISE_THROTTLE: 8 XXX
+ SG_ GAS_PEDAL_INVERTED : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ GAS_PEDAL : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ CRUISE_AVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ unsure1 : 23|6@0+ (1,0) [0|63] "" XXX
+ SG_ unsure2 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ unsure3 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ NO_BUTTON_PRESSED : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_BUTTON : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ CANCEL_BUTTON : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ USER_BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ unsure5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ unsure6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ unsure7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 640 CANCEL_MSG: 8 XXX
+ SG_ CANCEL_SEATBELT : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 7|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 15|56@0+ (1,0) [0|72057594037927940] "" XXX
+
+BO_ 644 WHEEL_SPEEDS_FRONT: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 852 ESP: 8 XXX
+ SG_ ESP_DISABLED : 38|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 853 HUD_SETTINGS: 8 XXX
+ SG_ SPEED_MPH : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 856 LIGHTS: 8 XXX
+ SG_ LEFT_BLINKER : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 18|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1057 GEARBOX: 3 XXX
+ SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX
+
+BO_ 1549 DOORS_LIGHTS: 8 XXX
+ SG_ DOOR_OPEN_FL : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 6|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1057 GEAR_SHIFTER 7 "B" 4 "D" 3 "N" 2 "R" 1 "P" ;
diff --git a/iqdbc_repo/iqdbc/dbc/nissan_x_trail_2017_generated.dbc b/iqdbc_repo/iqdbc/dbc/nissan_x_trail_2017_generated.dbc
new file mode 100644
index 000000000..f64dfc266
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/nissan_x_trail_2017_generated.dbc
@@ -0,0 +1,191 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _nissan_common.dbc starts here";
+BO_ 2 STEER_ANGLE_SENSOR: 5 XXX
+ SG_ STEER_ANGLE_RATE : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X07 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 0|16@1- (-0.1,0) [0|65535] "" XXX
+ SG_ COUNTER : 32|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 361 LKAS: 8 XXX
+ SG_ MAX_TORQUE : 39|8@0+ (0.01,0) [0|255] "Nm" XXX
+ SG_ SET_0x80 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX
+ SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 389 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX
+ SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX
+ SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|127] "" XXX
+
+BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX
+ SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 689 PROPILOT_HUD: 8 XXX
+ SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING2 : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_YELLOW_FLASH : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_YELLOW_FLASH : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_CAR : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_CAR_ERROR : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_ERROR : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_ERROR_FLASHING : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_LANE_GREEN : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_GREEN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_ERROR_FLASHING3 : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_ERROR_FLASHING : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ SAFETY_SHIELD_ACTIVE : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ LARGE_STEERING_WHEEL_ICON : 61|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LANE_GREEN_FLASH : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_LANE_GREEN_FLASH : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ AUDIBLE_TONE : 47|3@0+ (1,0) [0|8] "" XXX
+ SG_ SPEED_SET_ICON : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ SMALL_STEERING_WHEEL_ICON : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ SET_SPEED : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ unknown02 : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown05 : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown08 : 8|7@0+ (1,0) [0|63] "" XXX
+ SG_ unknown26 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown28 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown31 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown43 : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown55 : 55|8@0+ (1,0) [0|63] "" XXX
+ SG_ unknown59 : 59|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 451 PROPILOT_BRAKE: 8 XXX
+ SG_ BRAKE_PRESSURE : 5|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_ACTIVE : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 783 CRUISE_STATE: 3 XXX
+ SG_ CRUISE_ENABLED : 3|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX
+ SG_ NA_HIGH_ACCEL_TEMP : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_NA_HIGH_CABIN_TEMP : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_MALFUNCTION : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_MALFUNCTION : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_MALFUNCTION : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_NA_CLEAN_REAR_CAMERA : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ NA_POOR_ROAD_CONDITIONS : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ CURRENTLY_UNAVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ SAFETY_SHIELD_OFF : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_NA_RADAR_OBSTRUCTION : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_DO_NOT_ENTER : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_SYSTEM_OFF : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_IMPACT_MALFUNCTION : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_COLLISION_MALFUNCTION : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ SIDE_RADAR_MALFUNCTION2 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_MALFUNCTION2 : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ FRONT_RADAR_MALFUNCTION2 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_MSGS : 42|3@0+ (1,0) [0|7] "" XXX
+ SG_ BOTTOM_MSG : 45|3@0+ (1,0) [0|7] "" XXX
+ SG_ HANDS_ON_WHEEL_WARNING : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_STEP_ON_BRAKE_NOW : 51|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED : 52|1@0+ (1,0) [0|1] "" XXX
+ SG_ PROPILOT_NA_HIGH_CABIN_TEMP : 53|1@0+ (1,0) [0|1] "" XXX
+ SG_ WARNING_PROPILOT_MALFUNCTION : 54|1@0+ (1,0) [0|3] "" XXX
+ SG_ ACC_UNAVAILABLE_HIGH_CABIN_TEMP : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_NA_FRONT_CAMERA_IMPARED : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown07 : 7|7@0+ (1,0) [0|127] "" XXX
+ SG_ unknown10 : 10|2@0+ (1,0) [0|3] "" XXX
+ SG_ unknown15 : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown23 : 23|3@0+ (1,0) [0|7] "" XXX
+ SG_ unknown19 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown31 : 31|6@0+ (1,0) [0|63] "" XXX
+ SG_ unknown32 : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown46 : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown50 : 50|3@0+ (1,0) [0|7] "" XXX
+ SG_ unknown55 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ unknown61 : 61|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 1227 LKAS_SETTINGS: 8 XXX
+ SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ;
+VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ;
+VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ;
+VAL_ 689 AUDIBLE_TONE 0 "NO_TONE" 1 "CONT" 2 "FAST_BEEP_CONT" 3 "TRIPLE_FAST_BEEP_CONT" 4 "SLOW_BEEP_CONT" 5 "QUAD_SLOW_BEEP_CONT" 6 "SINGLE_BEEP_ONCE" 7 "DOUBLE_BEEP_ONCE" ;
+VAL_ 689 SMALL_STEERING_WHEEL_ICON 0 "NO_ICON" 1 "GRAY_ICON" 2 "GRAY_ICON_FLASHING" 3 "GREEN_ICON" 4 "GREEN_ICON_FLASHING" 5 "RED_ICON" 6 "RED_ICON_FLASHING" 7 "YELLOW_ICON" ;
+VAL_ 689 LARGE_STEERING_WHEEL_ICON 0 "NO_STEERINGWHEEL" 1 "GRAY_STEERINGWHEEL" 2 "GREEN_STEERINGWHEEL" 3 "GREEN_STEERINGWHEEL_FLASHING" ;
+
+CM_ "nissan_x_trail_2017.dbc starts here";
+
+BO_ 348 GAS_PEDAL: 8 XXX
+ SG_ GAS_PEDAL_RAW : 26|11@0+ (1,0) [0|2047] "" XXX
+ SG_ GAS_PEDAL : 47|10@0+ (1,0) [0|1023] "" XXX
+
+BO_ 438 PRO_PILOT: 8 XXX
+ SG_ COUNTER : 55|4@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X03 : 33|2@0+ (1,0) [0|15] "" XXX
+ SG_ CRUISE_ACTIVATED : 38|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_ON : 36|1@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_STATUS : 51|1@0+ (1,0) [0|3] "" XXX
+
+BO_ 523 CRUISE_THROTTLE: 6 XXX
+ SG_ PROPILOT_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ CANCEL_BUTTON : 9|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_INVERTED : 37|10@0+ (1,0) [0|1023] "" XXX
+ SG_ SET_BUTTON : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ FOLLOW_DISTANCE_BUTTON : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ NO_BUTTON_PRESSED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL : 31|10@0+ (1,0) [0|255] "" XXX
+ SG_ USER_BRAKE_PRESSED : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ USER_BRAKE_PRESSED_INVERTED : 22|1@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PRESSED_INVERTED : 20|1@0+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 17|2@0+ (1,0) [0|3] "" XXX
+ SG_ unsure1 : 7|10@0+ (1,0) [0|1023] "" XXX
+ SG_ unsure2 : 43|4@0+ (1,0) [0|1] "" XXX
+ SG_ unsure3 : 19|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 665 ESP: 8 XXX
+ SG_ ESP_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 666 WHEEL_SPEEDS_FRONT: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
+
+BO_ 768 STEER_TORQUE_SENSOR2: 2 XXX
+ SG_ STEERING_TORQUE : 6|7@0+ (1,0) [0|127] "" XXX
+ SG_ STEERING_PRESSED : 15|1@0+ (-1,1) [0|7] "" XXX
+
+BO_ 1055 GEARBOX: 2 XXX
+ SG_ SPORTS_MODE : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX
+
+BO_ 1107 LIGHTS: 8 XXX
+ SG_ RIGHT_BLINKER : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHTS : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1108 DOORS_LIGHTS: 8 XXX
+ SG_ DOOR_CLOSED_RR : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_FL : 44|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_CLOSED_FR : 46|1@0+ (1,0) [0|3] "" XXX
+ SG_ DOOR_OPEN_FR : 47|1@0+ (1,0) [0|3] "" XXX
+ SG_ BOOT_OPEN : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHT : 54|1@0+ (1,0) [0|1] "" XXX
+ SG_ USER_BRAKE_PRESSED : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1273 HUD: 7 XXX
+ SG_ SEATBELT_DRIVER_LATCHED : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPEED_MPH : 5|1@0+ (1,0) [0|1] "" XXX
+
+VAL_ 1055 GEAR_SHIFTER 6 "L" 4 "D" 3 "N" 2 "R" 1 "P" ;
diff --git a/iqdbc_repo/iqdbc/dbc/nissan_xterra_2011.dbc b/iqdbc_repo/iqdbc/dbc/nissan_xterra_2011.dbc
new file mode 100644
index 000000000..1e7bd4c4a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/nissan_xterra_2011.dbc
@@ -0,0 +1,96 @@
+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
+
+BO_ 2 STEERING: 5 XXX
+ SG_ COUNTER : 35|4@0+ (1,0) [0|255] "" XXX
+ SG_ STEERING_ANGLE : 0|16@1- (0.1,0) [0|65535] "deg" XXX
+ SG_ POWER_STEER_RATE : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 505 ENGINE_1: 8 XXX
+ SG_ RPM : 16|16@1+ (0.125,0) [0|45000] "R/min" XXX
+ SG_ FAN_REQ : 6|2@1+ (1,0) [0|3] "" XXX
+ SG_ AC_REQ : 3|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 561 ENGINE_2: 8 XXX
+ SG_ Pedal_position : 16|8@1+ (0.5,0) [0|200] "%" XXX
+
+BO_ 563 ENGINE_7: 8 XXX
+ SG_ CLT : 0|8@1+ (0.366666,0) [0|255] "C" XXX
+ SG_ RPMlow : 32|8@1+ (3.15,0) [0|45000] "R/min" XXX
+ SG_ RPMhi : 56|8@1+ (3.15,0) [0|45000] "R/min" XXX
+
+BO_ 573 ENGINE_3: 8 XXX
+ SG_ Pedal_position : 8|8@1+ (0.392,0) [0|255] "%" XXX
+ SG_ Throttle_position_capped : 16|8@1+ (0.392,0) [0|255] "%" XXX
+ SG_ RPM : 24|16@1+ (3.15,0) [0|45000] "R/min" XXX
+ SG_ CLT : 56|8@1+ (0.366666,0) [0|255] "C" XXX
+
+BO_ 574 ENGINE_4: 8 XXX
+ SG_ Throttle_position_inverted : 16|8@1+ (0.392,0) [0|255] "%" XXX
+ SG_ EstimatedTorque : 24|16@1+ (0.1,0) [0|45000] "nM" XXX
+ SG_ Throttle_position : 48|8@1+ (0.392,0) [0|255] "%" XXX
+
+BO_ 595 TCU_1: 8 XXX
+ SG_ SHAFT_1_SPEED : 32|16@1+ (1,0) [0|45000] "r/min" XXX
+ SG_ SHAFT_2_SPEED : 48|16@1+ (1,0) [0|45000] "r/min" XXX
+
+BO_ 640 SPEED: 8 XXX
+ SG_ SPEED : 32|16@1+ (0.01,0) [0|45000] "km/h" XXX
+
+BO_ 644 ABS_1: 8 XXX
+ SG_ WHEEL_1 : 0|16@1+ (0.01,0) [0|45000] "km/h" XXX
+ SG_ WHEEL_2 : 15|16@1+ (0.01,0) [0|45000] "km/h" XXX
+
+BO_ 645 ABS_2: 8 XXX
+ SG_ WHEEL_3 : 0|16@1+ (0.01,0) [0|45000] "km/h" XXX
+ SG_ WHEEL_4 : 15|16@1+ (0.01,0) [0|45000] "km/h" XXX
+
+BO_ 852 SPEED_BREAK: 8 XXX
+ SG_ BREAK_LIGHT : 52|1@0+ (1,0) [0|3] "" XXX
+ SG_ SPEED_MPH : 7|16@0+ (0.0066,0) [0|65535] "mph" XXX
+ SG_ TCS_OFF : 38|1@0+ (1,0) [0|255] "" XXX
+
+BO_ 861 BCM: 8 XXX
+
+BO_ 1361 ENGINE_5: 8 XXX
+ SG_ CLT : 0|8@1+ (1,-45) [-45|150] "" XXX
+
+BO_ 1408 ENGINE_6: 8 XXX
+ SG_ RPM : 7|16@0+ (1.5,0) [0|65535] "" XXX
+ SG_ OIL_TEMP : 32|8@1+ (1,-40) [-40|150] "" XXX
+
+BO_ 1477 MILEAGE: 8 XXX
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/opel_omega_2001.dbc b/iqdbc_repo/iqdbc/dbc/opel_omega_2001.dbc
new file mode 100644
index 000000000..8f8e0cfde
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/opel_omega_2001.dbc
@@ -0,0 +1,104 @@
+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_: ABS ESP ECU TCU SAS
+
+
+BO_ 272 TCU_Data1: 8 TCU
+ SG_ TorqueRequest1 : 15|8@0+ (1,0) [0|255] "" ABS,ESP,ECU
+ SG_ TorqueRequest2 : 31|8@0+ (1,0) [0|255] "" ABS,ESP,ECU
+ SG_ OutputShaftSpeed : 55|16@0+ (1,0) [0|65535] "rpm" ABS,ESP,ECU
+
+BO_ 288 ESP_Data1: 8 ESP
+ SG_ ABD_Active : 4|1@0+ (1,0) [0|1] "yes/no" ECU,TCU
+ SG_ TorqueRequestFast : 15|8@0+ (1,0) [0|255] "" ECU,TCU
+ SG_ TorqueRequestSlow : 31|8@0+ (1,0) [0|255] "" ECU,TCU
+
+BO_ 384 SAS_Data: 8 SAS
+ SG_ SteeringAngle : 0|16@1- (0.1,0) [-3276.8|3276.7] "yes/no" ECU,TCU
+ SG_ SteeringSpeed : 16|8@1+ (1,0) [0|255] "" ECU,TCU
+
+BO_ 416 ECU_Data1: 8 ECU
+ SG_ RPM : 15|16@0+ (1,0) [0|65535] "rpm" ABS,ESP,TCU
+ SG_ TorqueResponse : 31|8@0+ (1,0) [0|255] "" ABS,ESP,TCU
+ SG_ TorqueLost : 39|8@0+ (1,0) [0|255] "" ABS,ESP,TCU
+ SG_ APP : 47|8@0+ (1,0) [0|102] "" ABS,ESP,TCU
+ SG_ TorqueRequest : 63|8@0+ (1,0) [0|255] "" ABS,ESP,TCU
+
+BO_ 448 ECU_Data2: 8 ECU
+ SG_ TPS : 23|8@0+ (1,0) [0|100] "" ABS,ESP,TCU
+
+BO_ 640 ECU_Data3: 8 ECU
+ SG_ BrakeActive : 18|1@0+ (1,0) [0|1] "yes/no" ABS,ESP,TCU
+ SG_ KickdownActive : 20|1@0+ (1,0) [0|1] "yes/no" ABS,ESP,TCU
+ SG_ CruiseActive : 22|1@0+ (1,0) [0|1] "yes/no" ABS,ESP,TCU
+
+BO_ 736 TCU_Data2: 8 TCU
+ SG_ TOT : 31|8@0- (1,-40) [-40|215] "" ECU
+ SG_ InputShaftSpeed : 47|16@0+ (1,0) [0|65535] "rpm" ECU
+
+BO_ 768 ABS_WheelSpeed: 8 ABS
+ SG_ FrontLeftWheelSpeed : 5|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU
+ SG_ FrontLeftWheelErrorFlag : 7|1@0+ (1,0) [0|1] "" ECU,TCU
+ SG_ FrontRightWheelSpeed : 21|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU
+ SG_ FrontRightWheelErrorFlag : 23|1@0+ (1,0) [0|1] "" ECU,TCU
+ SG_ RearLeftWheelSpeed : 37|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU
+ SG_ RearLeftWheelErrorFlag : 39|1@0+ (1,0) [0|1] "" ECU,TCU
+ SG_ RearRightWheelSpeed : 53|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU
+ SG_ RearRightWheelErrorFlag : 55|1@0+ (1,0) [0|1] "" ECU,TCU
+
+BO_ 792 ESP_Data2: 8 ESP
+ SG_ ABS_Active : 12|1@0+ (1,0) [0|1] "yes/no" ECU,TCU
+ SG_ ESP_Off : 20|1@0+ (1,0) [0|1] "yes/no" ECU,TCU
+ SG_ ESP_Active : 21|1@0+ (1,0) [0|1] "yes/no" ECU,TCU
+
+BO_ 992 TCU_Data3: 8 TCU
+ SG_ CurrentGear : 11|4@0+ (1,0) [0|15] "" ECU
+ SG_ SelectorPosition : 18|3@0+ (1,0) [0|7] "" ECU
+ SG_ AutoNeutralActive : 26|1@0+ (1,0) [0|1] "yes/no" ECU
+ SG_ WinterModeActive : 29|1@0+ (1,0) [0|1] "yes/no" ECU
+ SG_ SportModeActive : 30|1@0+ (1,0) [0|1] "yes/no" ECU
+ SG_ TCC_State : 37|2@0+ (1,0) [0|2] "" ECU
+
+BO_ 1472 ECU_Data4: 8 ECU
+ SG_ ECT : 15|8@0- (1,-40) [-40|215] "" TCU
+ SG_ IAT : 47|8@0- (1,-40) [-40|215] "" TCU
+
+
+
+VAL_ 992 CurrentGear 5 "1" 6 "2" 7 "3" 8 "4" ;
+VAL_ 992 SelectorPosition 1 "P" 2 "R" 3 "N" 4 "D" 7 "3" 6 "2" 5 "1" ;
+VAL_ 992 TCC_State 0 "Off" 1 "Partially Locked" 2 "Locked" ;
+
diff --git a/iqdbc_repo/iqdbc/dbc/psa_aee2010_r3.dbc b/iqdbc_repo/iqdbc/dbc/psa_aee2010_r3.dbc
new file mode 100644
index 000000000..8f76dede8
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/psa_aee2010_r3.dbc
@@ -0,0 +1,1041 @@
+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_: UTIL__Traminator CMM___Motor_SG CDS___Fahrdynamikregelung BVA___Automatikgetriebe BSI___Kombiinstrument AR2S_StartStop ABS___Antiblockiersystem
+
+
+BO_ 114 RQD_CMM: 5 CMM___Motor_SG
+ SG_ ADC2_Req_Status : 0|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ ADC2_Seed_Byte3 : 8|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ ADC2_Seed_Byte2 : 16|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ ADC2_Seed_Byte1 : 24|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ ADC2_Seed_Byte0 : 32|8@1+ (1,0) [0|255] "-" BSI___Kombiinstrument
+
+BO_ 146 Elec_Int: 1 BSI___Kombiinstrument
+ SG_ P__Elec_Int_Cntrl_Word : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 168 CFD_BSI: 5 BSI___Kombiinstrument
+ SG_ ADC2_Key_Status : 0|8@1+ (1,0) [0|0] "-" Vector__XXX
+ SG_ ADC2_Key_Byte3 : 8|8@1+ (1,0) [0|255] "-" CMM___Motor_SG
+ SG_ ADC2_Key_Byte2 : 16|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ ADC2_Key_Byte1 : 24|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ ADC2_Key_Byte0 : 32|8@1+ (1,0) [0|255] "-" Vector__XXX
+
+BO_ 264 Vers_CMM: 8 CMM___Motor_SG
+ SG_ P076_System : 0|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P077_Day : 8|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P078_Month : 16|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P079_Year : 24|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P080_Application : 32|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P081_Version : 40|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P082_Edition : 48|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P083_Calibration : 56|8@1+ (1,0) [0|255] "-" Vector__XXX
+
+BO_ 461 ESP: 3 XXX
+ SG_ COUNTER : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ UNCLEAR : 14|10@0+ (1,0) [0|1023] "" XXX
+ SG_ ESP_STATUS : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESP_STATUS_INV : 20|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 488 DAT3_CMM: 3 Vector__XXX
+ SG_ Reserved_3 : 5|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P413_Com_stRstrtStSpPrgs : 7|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ P426_Com_ctRstrtStSp : 15|16@0+ (1,0) [0|3276750] "" Vector__XXX
+
+BO_ 520 Dyn_CMM: 8 CMM___Motor_SG
+ SG_ P000_Com_nEng : 7|16@0+ (0.125,0) [0|8191.75] "1/min" Vector__XXX
+ SG_ P003_Com_trqActOut : 16|8@1+ (3,-150) [-150|615] "Nm" Vector__XXX
+ SG_ P002_Com_rAPP : 24|8@1+ (0.5,0) [0|100] "%" Vector__XXX
+ SG_ P027_ACCtl_stLogicOut : 32|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P014_Brk_stRed : 33|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P037_VehV_stXVV : 34|2@1+ (1,0) [0|2] "-" Vector__XXX
+ SG_ P153_Com_bTrqInacc : 36|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P042_Inm_bCanMon : 38|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P127_EGT_st_Bit30 : 39|1@1+ (1,0) [0|0] "-" Vector__XXX
+ SG_ P198_ActMod_trqClthTraIntv : 56|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX
+
+BO_ 552 Dyn5_CMM: 5 CMM___Motor_SG
+ SG_ P320_EasyMvTrqInfo : 0|8@1+ (3,-150) [-150|615] "Nm" Vector__XXX
+ SG_ P411_Com_stTrqAvlStSp : 12|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P410_Com_stEngTrqStSp : 13|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P321_StatusOfEasyMvTrq : 14|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P334_ACCPed_Position : 16|8@1+ (0.5,0) [0|100] "%" Vector__XXX
+ SG_ P336_Com_xDyn5CMMChkSum : 24|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P335_Com_ctDyn5CMMCntr : 28|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P388_Com_rClthPedPos : 39|8@0+ (0.5,0) [0|100] "" Vector__XXX
+
+BO_ 694 HS2_DYN1_MDD_ETAT_2B6: 8 ARTIV
+ SG_ MDD_DESIRED_DECELERATION : 7|8@0+ (0.05,-10.65) [-10.65|2] "m/s2" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ POTENTIAL_WHEEL_TORQUE_REQUEST : 9|2@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ MIN_TIME_FOR_DESIRED_GEAR : 15|6@0+ (0.1,0) [0|6.2] "s" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ GMP_POTENTIAL_WHEEL_TORQUE : 23|12@0+ (4,-4000) [-4000|11000] "N.m" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ ACC_STATUS : 27|4@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ GMP_WHEEL_TORQUE : 39|14@0+ (1,-4000) [-4000|11000] "N.m" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ WHEEL_TORQUE_REQUEST : 41|2@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ AUTO_BRAKING_STATUS : 50|3@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ MDD_DECEL_TYPE : 52|2@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ MDD_DECEL_CONTROL_REQ : 53|1@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ GEAR_TYPE : 54|1@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ PREFILL_REQUEST : 55|1@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ DYN_ACC_CHECKSUM : 59|4@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+ SG_ DYN_ACC_PROCESS_COUNTER : 63|4@0+ (1,0) [0|15] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF
+
+BO_ 717 HS2_DYN_UCF_2CD: 3 UC_FREIN
+ SG_ AUTO_BRAKING_PRESSURE : 7|8@0+ (0.2,0) [0|50.6] "bar" BV,BVN
+ SG_ VITESSE_LACET : 15|16@0- (0.1,0) [-100|100] "Degré/s" BV,BVN
+
+BO_ 728 NEW_MSG_2D8: 7 XXX
+ SG_ ACC_RELATED : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESP_STATUS_RELATED : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESP_STATUS_RELATED_INV : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVATION_RELATED : 43|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 757 STEERING: 7 XXX
+ SG_ COUNTER : 3|4@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ DRIVER_TORQUE : 15|8@0- (1,0) [0|255] "" XXX
+ SG_ ANGLE : 31|16@0- (0.1,0) [-3276.8|3276.7] "degrees" XXX
+ SG_ RATE : 47|12@0- (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_1 : 48|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 758 HS2_DYN_MDD_ETAT_2F6: 8 ARTIV
+ SG_ TARGET_DETECTED : 0|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ REQUEST_TAKEOVER : 2|2@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ BLIND_SENSOR : 4|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ REQ_VISUAL_COLL_ALERT_ARC : 5|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ REQ_AUDIO_COLL_ALERT_ARC : 6|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ REQ_HAPTIC_COLL_ALERT_ARC : 7|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ INTER_VEHICLE_DISTANCE : 15|10@0+ (0.25,0) [0|255.5] "m" BSI,CMM,UC_FREIN,CMF
+ SG_ ARC_STATUS : 19|4@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ AUTO_BRAKING_IN_PROGRESS : 20|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ AEB_ENABLED : 21|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ DRIVE_AWAY_REQUEST : 33|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ DISPLAY_INTERVEHICLE_TIME : 39|6@0+ (0.1,0) [0|6.1] "s" BSI,CMM,UC_FREIN,CMF
+ SG_ MDD_DECEL_CONTROL_REQ : 42|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ AUTO_BRAKING_STATUS : 47|3@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ CHECKSUM_TRANSM_DYN_ACC2 : 51|4@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+ SG_ PROCESS_COUNTER_4B_ACC2 : 55|4@0+ (1,0) [0|15] "" BSI,CMM,UC_FREIN,CMF
+ SG_ TARGET_POSITION : 63|3@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF
+
+BO_ 760 NEW_MSG_2F8: 7 XXX
+ SG_ ESP_STATUS_RELATED : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ESP_STATUS_RELATED_INV : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_ACTIVATION_RELATED : 35|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 770 NEW_MSG_302: 7 XXX
+ SG_ ACC_RELATED : 46|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 773 STEERING_ALT: 7 XXX
+ SG_ ANGLE : 7|16@0- (0.1,0) [-3276.8|3276.7] "degrees" XXX
+ SG_ RATE : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ RATE_SIGN : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ 0_COUNTER : 35|4@0+ (1,0) [0|255] "" XXX
+ SG_ 0_CHECKSUM : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ RATE_ALT : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 781 Dyn4_FRE: 8 CDS___Fahrdynamikregelung
+ SG_ P263_VehV_VPsvValWhlFrtL : 7|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX
+ SG_ P264_VehV_VPsvValWhlFrtR : 23|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX
+ SG_ P265_VehV_VPsvValWhlBckL : 39|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX
+ SG_ P266_VehV_VPsvValWhlBckR : 55|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX
+
+BO_ 792 NEW_MSG_318: 5 XXX
+ SG_ ACC_RELATED : 14|13@0+ (1,0) [0|8191] "" XXX
+ SG_ ACC_RELATED_2 : 30|13@0+ (1,0) [0|8191] "" XXX
+ SG_ ACC_GO_RELATED : 32|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 809 Dyn_STT_BV: 4 BVA___Automatikgetriebe
+ SG_ P230_Com_ctGbxCnt3 : 3|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ P340_Com_xChkSum3 : 7|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P441_Com_bGbxAuthRstrtRaw : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P444_Com_bGbxSysFaultRaw : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P443_Com_bGbxRstrtReq : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P442_Com_bGbxAuthStopRaw : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 813 HS2_DYN_UCF_MDD_32D: 8 UC_FREIN
+ SG_ ACCEL_LONGI_CALIB : 7|12@0+ (0.02,-40.96) [-40.96|40.92] "m/s2" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ VAL_INFO_VIT_LACET : 8|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ EFFORT_FREIN : 9|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ FA_ETAT_DECEL : 11|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ APPUI_FREIN_RECONSTRUIT : 17|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ PREFILL_EN_COURS : 18|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ ACC_ETAT_DECEL_OR_ESP_STATUS : 20|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ VEHICLE_STANDSTILL : 21|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ FREINAGE_DYN_EN_COURS : 22|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ BRAKE_RELEASED_FAILSAFE : 23|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ EFFORT_FREIN_ERRONE : 28|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ ARRET_VHL_ADAS : 30|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ DEFAUT_ACC_FREIN : 31|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ VITESSE_LACET_BRUTE : 39|12@0+ (0.08,-163.84) [-163.84|163.68] "Degré/s" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ CHKSUM_TRME_DYN_UCF_ACC : 59|4@0+ (1,0) [0|15] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+ SG_ CPT_PROCESS_4B_UC_FREIN : 63|4@0+ (1,0) [0|15] "" CMM,BSI,PASS_HCU2,CMF,ARTIV
+
+BO_ 840 Dyn2_CMM: 8 CMM___Motor_SG
+ SG_ P165_FlFCD_stWtLvlSensDebVal : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P152_Gearbx_stGear : 4|4@1+ (1,0) [0|15] "-" Vector__XXX
+ SG_ P019_Com_trqPrp : 8|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX
+ SG_ P211_AirC_pClnt : 16|8@1+ (1,110) [110|2904] "kpa" Vector__XXX
+ SG_ P017_Com_trqFrc : 24|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX
+ SG_ P026_Com_bESPAck : 32|1@1+ (1,0) [0|0] "-" Vector__XXX
+ SG_ P025_Com_stESPErr : 33|2@1+ (1,0) [0|0] "-" Vector__XXX
+ SG_ P091_ConvCD_stDebVal : 35|2@1+ (1,0) [0|3] "-" Vector__XXX
+ SG_ P212_Comp_load_shed : 37|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ P134_Com_stEng : 40|4@1+ (1,0) [0|0] "-" Vector__XXX
+ SG_ P343_Com_bOBDErr : 49|1@1- (1,0) [0|0] "" Vector__XXX
+ SG_ P344_Com_bMILOn : 50|1@1- (1,0) [0|0] "" Vector__XXX
+ SG_ P345_Com_bMILBln : 51|1@1- (1,0) [0|0] "" Vector__XXX
+ SG_ P370_Com_bWUC : 52|1@1- (1,0) [0|0] "" Vector__XXX
+ SG_ P371_Com_bDrivingCycl : 53|1@1- (1,0) [0|0] "" Vector__XXX
+ SG_ P372_T15_st : 54|1@1- (1,0) [0|0] "" Vector__XXX
+ SG_ P207_Fan_rAct : 56|6@1+ (2,0) [0|100] "" Vector__XXX
+ SG_ P269_StSys_stStrtBVMPAuth : 62|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 841 Dyn_V2_BVMP: 8 BVA___Automatikgetriebe
+ SG_ P030_Gbx_stDrvTrnEgd : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P360_Com_stIntvTyp : 2|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ P440_Com_bUCAPSWkUpReqRaw : 5|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ P057_Com_xTrqTIIDes : 8|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P009_Com_bGearShftActv : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P362_Com_bGearShftExpt : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P333_Com_stGbxTrqIntv : 18|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P085_Com_bGbxACCmprShOff : 20|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P167_Com_stEngSpdCtl : 21|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P287_Com_stGearRat : 24|4@1+ (1,0) [0|15] "-" Vector__XXX
+ SG_ P283_Com_stGearTrgtPos : 28|4@1+ (1,0) [0|15] "-" Vector__XXX
+ SG_ P230_Com_ctTSCCntr : 51|4@0+ (1,0) [0|15] "-" Vector__XXX
+ SG_ P340_Com_xTSCChkSum : 55|4@0+ (1,0) [0|15] "-" Vector__XXX
+ SG_ P166_Com_nEngTSC : 56|8@1+ (25,750) [750|7075] "RPM" Vector__XXX
+
+BO_ 845 Dyn_CDS: 8 CDS___Fahrdynamikregelung
+ SG_ P047_Com_stESPIntv : 0|3@1+ (1,0) [0|7] "-" CMM___Motor_SG
+ SG_ P088_CutOffForbidden_OR_ESP_STATUS_INV : 3|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P147_Com_bESPIntvActv : 6|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P043_Com_xTCSStatRaw : 16|8@1+ (3,-150) [-150|612] "Nm" Vector__XXX
+ SG_ P044_Com_trqTCSRaw : 24|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX
+ SG_ P045_Com_trqDCSRaw : 32|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX
+ SG_ P157_Com_ctESP : 40|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P352_StbIntv_bTCSIntvActv : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P353_StbIntv_bESPExclvIntvActv : 52|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 904 Dyn_Veh: 7 CMM___Motor_SG
+ SG_ P060_vECU : 7|16@0+ (0.01,0) [0|655.34] "km/h" Vector__XXX
+ SG_ P062_sECU : 23|16@0+ (0.1,0) [0|6553.5] "m" Vector__XXX
+ SG_ P066_aECU : 32|8@1+ (0.08,-14) [-14|6.32] "m/s**2" Vector__XXX
+
+BO_ 909 HS2_DYN_ABR_38D: 8 UC_FREIN
+ SG_ VITESSE_VEHICULE_ROUES : 7|16@0+ (0.01,0) [0|655.34] "km/h" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ DISTANCE_ROUES : 23|16@0+ (0.1,0) [0|6553.5] "m" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ P052_Com_aLng : 32|8@1+ (0.08,-14) [-14|6.32] "m/s**2" Vector__XXX
+ SG_ ACCEL_LONGI_ROUES : 39|8@0+ (0.08,-14) [-14|6.32] "m/s2" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|7] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ VHL_MVT : 49|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ VVH_INDISP : 51|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ SENS_ROULAGE : 53|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ AUTOR_ARRET_HILL_STT : 54|1@0+ (1,0) [0|1] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ REQ_LAMPE_WARNING : 55|1@0+ (1,0) [0|1] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ HADC_FAULTY : 58|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ HADC_STATUS : 60|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ HADC_SPEED_CONDITION : 61|1@0+ (1,0) [0|1] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+ SG_ HADC_CLUTCH_CONDITION : 63|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS
+
+BO_ 941 Dyn_EasyMove: 8 CDS___Fahrdynamikregelung
+ SG_ P299_Com_bCrCtlInhib : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P337_Com_stPrkBrk : 24|3@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 968 Dyn_STT_CMM: 2 Vector__XXX
+ SG_ P412_Com_stDeadPnt : 2|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P428_Com_stCDTReq : 6|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 969 Dyn2_V2_BV: 6 BVA___Automatikgetriebe
+ SG_ P291_Com_trqMaxConv : 7|8@0+ (3,-150) [-150|615] "" Vector__XXX
+ SG_ P__Rapport_cible : 23|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P230_Com_ctGbxCnt2 : 27|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P340_Com_xChkSum2 : 31|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ P293_Com_stGbxEngShOff : 38|2@0+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 973 Dyn2_FRE: 8 ABS___Antiblockiersystem
+ SG_ P226_Com_stBrkActv : 0|2@1+ (1,0) [0|4] "" Vector__XXX
+ SG_ P225_Com_stBrkRaw_0 : 37|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P224_Com_stBrkRaw_1 : 38|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRAKE_PRESSURE : 47|12@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P319_FrmMng_rClthPos : 56|8@1+ (0.5,0) [0|255] "%" Vector__XXX
+
+BO_ 1010 LANE_KEEP_ASSIST: 8 XXX
+ SG_ DRIVE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ unknown2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ TORQUE : 31|11@0- (1,0) [0|2047] "" XXX
+ SG_ LANE_DEPARTURE : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ STATUS : 36|3@0+ (1,0) [0|3] "" XXX
+ SG_ LXA_ACTIVATION : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ TORQUE_FACTOR : 47|7@0+ (1,0) [0|127] "" XXX
+ SG_ SET_ANGLE : 55|14@0- (0.1,0) [-90|90] "" XXX
+ SG_ unknown4 : 57|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 Dat_BSI: 8 BSI___Kombiinstrument
+ SG_ P040_MainBrakeFault : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P103_Com_bRevGear : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ PARKING_BRAKE : 3|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ P013_MainBrake : 5|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P277_Com_bOilLvlDem : 10|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P298_Req_RTE_Ena : 11|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P012_Com_bFlMin : 24|1@1+ (1,0) [0|0] "-" Vector__XXX
+ SG_ P086_Com_stFlLvlDia : 25|2@1+ (1,0) [0|3] "-" Vector__XXX
+ SG_ P328_Com_stEHRPmp : 27|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P104_Dspl_stAOHt : 30|2@1+ (1,0) [0|3] "-" CMM___Motor_SG
+ SG_ DRIVER_DOOR : 51|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ PASSENGER_DOOR : 52|1@0+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1069 NEW_MSG_42D: 4 XXX
+ SG_ COUNTER : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_RELATED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1074 Dat_BSI1: 8 BSI___Kombiinstrument
+ SG_ P249_Com_stEngStopReq : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P216_Com_bSiaWkUp : 4|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P214_Com_stMnWkUp : 6|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P402_Com_stStaDemActv : 12|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P253_Com_bEngPrepReq : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P267_Exh_volRefl : 24|8@1+ (0.5,0) [0|255] "l" Vector__XXX
+ SG_ P276_Com_bOilWkUp : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P274_Exh_ctRefl : 40|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ P403_Com_stStaReq : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P439_Com_bUCAPSWkUpReqRaw : 45|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P350_Com_bPstVtln : 46|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P368_Com_stMnSEVRaw : 48|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P367_Com_stCtxJDDRaw : 50|6@1+ (1,0) [0|63] "" Vector__XXX
+ SG_ P369_Com_stElecNetRaw : 60|4@1+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 1101 Vroues_ABR: 8 CDS___Fahrdynamikregelung
+ SG_ P330_VehV_vWhlRrL : 23|16@0+ (0.01,0) [0|655.34] "km/h" Vector__XXX
+ SG_ P331_VehV_vWhlRrR : 39|16@0+ (0.01,0) [0|655.34] "km/h" Vector__XXX
+ SG_ P354_VehV_nWhlAvrg : 55|16@0+ (0.04,0) [0|0] "rpm" Vector__XXX
+
+BO_ 1106 HS2_DAT_MDD_CMD_452: 6 BSI
+ SG_ LONGITUDINAL_REGULATION_TYPE : 1|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ TURN_SIGNAL_STATUS : 5|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ FRONT_WIPER_STATUS : 7|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ SPEED_SETPOINT : 15|8@0+ (1,0) [0|255] "km/h" CMF,ARTIV,CMM,UC_FREIN
+ SG_ CHECKSUM_CONS_RVV_LVV2 : 17|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ BRAKE_ONLY_CMD_BSI : 18|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ LVV_ACTIVATION_REQ : 22|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ RVV_ACC_ACTIVATION_REQ : 23|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ ARC_HABIT_SENSITIVITY : 26|3@0+ (1,0) [0|7] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ ARC_HABIT_ACTIVATION_REQ : 27|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ COUNTER : 31|4@0+ (1,0) [0|15] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ FRONT_WASH_STATUS : 32|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ FORCE_ACTIVATION_HAB_CMD : 33|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ INTER_VEHICLE_TIME_SETPOINT : 39|6@0+ (0.1,0) [0|6.1] "s" CMF,ARTIV,CMM,UC_FREIN
+ SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ COCKPIT_GO_ACC_REQUEST : 45|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN
+ SG_ ACC_PROGRAM_MODE : 47|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN
+
+BO_ 1128 Dyn3_CMM: 6 CMM___Motor_SG
+ SG_ P247_Com_stStaFunc : 3|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P246_Com_bStaPrt : 5|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P245_Com_stRedBrkPlaus : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P244_Com_bSta : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P400_Com_stDrvTrnTx : 8|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P401_Com_stStrtAuth : 10|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P234_Com_stAcvWarn : 13|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P347_Alt_uSetPoint : 25|6@0+ (1,0) [0|63] "" Vector__XXX
+ SG_ P346_Alt_enumPwrProd : 26|3@1+ (1,0) [0|7] "-" Vector__XXX
+ SG_ P408_Com_bRly3CtlReq : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1160 Dat_CMM: 8 CMM___Motor_SG
+ SG_ P005_CEngDst_tSens : 0|8@1+ (1,-40) [-40|214] "°C" Vector__XXX
+ SG_ P021_Com_volFlCons : 8|8@1+ (80,0) [0|20400] "mm^3" Vector__XXX
+ SG_ P022_Com_nSetPLo : 16|8@1+ (8,0) [0|2032] "1/min" Vector__XXX
+ SG_ P032_Com_bEngStrt : 24|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P031_GlwLmp_st : 25|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P105_Com_bTtLmp : 27|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P108_Fid_ComAddPmpLvl : 28|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P296_AOHt_stPmp : 29|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P063_vehV_bXVVErr : 30|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P233_Fid_PFltDef_mp : 31|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P053_ACCtl_stHys : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P051_ACCD_stPres : 33|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P154_PFlt_bPFltClnReq : 38|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P011_Oil_tSwmp : 40|8@1+ (1,-40) [-40|213] "" Vector__XXX
+ SG_ P056_ACCD_p : 48|8@1+ (25,0) [100|3100] "kPa" Vector__XXX
+ SG_ P158_Air_tAFS : 56|8@1+ (1,-40) [-40|214] "°C" Vector__XXX
+
+BO_ 1161 Dat_V2_BV: 8 BVA___Automatikgetriebe
+ SG_ P374_Com_bOBDRdy : 8|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ P029_Com_stPrg : 11|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P282_Com_stGbxErr : 12|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P375_Com_bMILDem : 16|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ P376_Com_bMILcntResDemRaw : 18|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ P285_Com_bPNDia : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P218_Com_stDrvIdx : 48|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1173 IS_DAT_DIRA: 4 PSCM
+ SG_ EPS_TORQUE : 7|8@0- (0.25,0) [-32|31.5] "Nm" Tester
+ SG_ ETAT_DA_2004 : 9|2@0+ (1,0) [0|3] "" Tester
+ SG_ ETAT_DA_DYN : 13|2@0+ (1,0) [0|3] "" Tester
+ SG_ ETAT_DA_2010 : 15|2@0+ (1,0) [0|3] "" Tester
+ SG_ TRQ_LIMIT_STATE : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STEERWHL_HOLD_BY_DRV : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EPS_STATE_LKA : 20|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AUTOR_ARRET_MOT_DA : 21|1@0+ (1,0) [0|1] "" Tester
+ SG_ STEERING_REBOOT_REQUEST : 23|1@0+ (1,0) [0|1] "" Tester
+ SG_ Reserved : 31|8@0+ (1,0) [0|255] "" Tester
+
+BO_ 1224 Etat_Crash: 3 BSI___Kombiinstrument
+ SG_ Reserved_1 : 7|8@0+ (1,0) [0|0] "-" Vector__XXX
+ SG_ P223_CrashInfo : 8|1@0+ (1,0) [0|0] "-" Vector__XXX
+ SG_ Reserved_2 : 23|8@0+ (1,0) [0|0] "-" Vector__XXX
+
+BO_ 1266 Dat3_BSI: 8 Vector__XXX
+ SG_ P434_Com_rBattChHiRes : 7|10@0+ (0.1,0) [0|100] "" Vector__XXX
+ SG_ P429_Com_stSOCInfoInvldRaw : 8|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P435_Com_stUCAPRechCrntRaw : 10|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P438_Com_uBattIntRstnRaw : 23|10@0+ (0.01,0) [0|10.23] "" Vector__XXX
+ SG_ P437_Com_uBattOpnCir : 24|9@0+ (0.01,0) [0|14] "" Vector__XXX
+ SG_ P493_Com_stPrioVoltMin : 41|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P490_Com_uVoltCtlProdMin : 47|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P494_Com_stPrioVoltMax : 49|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P491_Com_uVoltCtlProdMax : 55|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P492_Com_uVarProdMax : 63|7@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1270 HS2_DAT_ARTIV_V2_4F6: 5 ARTIV
+ SG_ TIME_GAP : 7|8@0+ (0.1,0) [0|25.4] "s" RITCS,BSI,CMF
+ SG_ DISTANCE_GAP : 15|8@0+ (1,0) [0|253] "m" RITCS,BSI,CMF
+ SG_ RELATIVE_SPEED : 20|13@0+ (0.02,-70) [-70|70] "m/s" RITCS,BSI,CMF
+ SG_ ARTIV_SENSOR_STATE : 23|3@0+ (1,0) [0|0] "" RITCS,BSI,CMF
+ SG_ TARGET_DETECTED : 36|1@0+ (1,0) [0|0] "" RITCS,BSI,CMF
+ SG_ ARTIV_TARGET_CHANGE_INFO : 37|1@0+ (1,0) [0|0] "" RITCS,BSI,CMF
+ SG_ TRAFFIC_DIRECTION : 39|2@0+ (1,0) [0|0] "" RITCS,BSI,CMF
+
+BO_ 1293 Dat_ABR: 7 ABS___Antiblockiersystem
+ SG_ P351_Com_bABSIntvActv : 5|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P415_Com_stABSSTTReqRaw : 52|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 1294 Dat_CLIM: 8 BSI___Kombiinstrument
+ SG_ P050_Com_stAC : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P209_Com_stACRaw : 1|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P433_Com_bCmptEngStopReqRaw : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P232_Com_stXVVChkSum : 4|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P046_Com_rFanClgDes : 8|6@1+ (2,0) [0|110] "%" Vector__XXX
+ SG_ P164_Com_stPFltFan : 14|2@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P144_Com_bPFltGlw : 17|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P189_Com_stEEMIdlDem : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P432_Com_bCmptEngRstrtReqRaw : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P417_Com_stDrvPrsRaw : 25|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P210_Com_pwrACDem : 32|8@1+ (25,0) [0|6350] "W" Vector__XXX
+ SG_ P208_Com_nACIdlDem : 40|8@1+ (8,0) [0|2032] "" Vector__XXX
+ SG_ P219_Com_xPrpReqRaw : 48|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P231_Com_ctBSIFrm : 56|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P222_Typ_PrpCtl_Req : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P221_Speed_setPoint_Typ : 61|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P220_Com_stPrpMsgRaw : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1362 DAT4_BSI_AEE2010: 8 Vector__XXX
+ SG_ P325_Com_tiEngOff : 7|32@0+ (1,0) [0|1000] "" Vector__XXX
+ SG_ P015_Com_lTotDst : 39|24@0+ (1,0) [0|16777215] "km" Vector__XXX
+ SG_ P326_Com_ctTmrRst : 63|8@0+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1375 ACQ_NEW_JDD: 1 Vector__XXX
+ SG_ P__JDD_Com_stFaultAck : 7|8@0+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1390 DRIVER: 6 XXX
+ SG_ NEW_SIGNAL_3 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRIGHTNESS_SETTING : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL : 31|8@0+ (0.5,0) [0|99.5] "%" XXX
+
+BO_ 1394 RESTRAINTS: 8 XXX
+ SG_ PASSENGER_SEATBELT : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ DRIVER_SEATBELT : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_1 : 23|11@0+ (1,0) [0|1] "" XXX
+ SG_ IGNITION : 32|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1416 Dat2_CMM: 8 CMM___Motor_SG
+ SG_ P275_EngOilLvl : 7|8@0- (3,0) [0|0] "" Vector__XXX
+ SG_ P268_AdPmp_volAddInjStp : 8|8@1+ (5,0) [0|255] "mm3" Vector__XXX
+ SG_ P278_Oil_stPSwmp : 16|1@1- (1,0) [0|1] "" Vector__XXX
+ SG_ P424_Com_bMMIClthReq : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P423_Com_bMMIStSpAvl : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P316_FlSys_volFlConsVirt : 24|8@1+ (80,0) [0|20400] "mm^3" Vector__XXX
+ SG_ P373_CoETS_rTrq : 32|8@1+ (0.39215686275,0) [0|100] "%" Vector__XXX
+ SG_ P414_Com_stSTTFunc : 40|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P338_EnvP_p : 42|5@1+ (15,685) [0|1120] "" Vector__XXX
+ SG_ P288_Com_bSVSLmp : 47|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P366_CoEom_stEngOpm : 48|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P446_Com_bAuthAdPmp : 52|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P425_Com_stVltgSysLd : 53|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P422_Com_bSyncDlyStSp : 54|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P359_SITUATION_VIE : 58|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ P358_SENS_CHGMT_RAP : 60|2@0+ (1,0) [0|3] "" Vector__XXX
+ SG_ P357_RAP_CIBLE_TRANSMIS : 63|3@0+ (1,0) [0|7] "" Vector__XXX
+
+BO_ 1423 Rep_Diag_OBC_DCDC: 7 XXX
+
+BO_ 1424 Req_Diag_OBC_DCDC: 3 XXX
+
+BO_ 1426 Dat6_BSI: 8 CMM___Motor_SG
+ SG_ P272_Com_rBattCh : 0|8@1+ (1,0) [0|100] "%" Vector__XXX
+ SG_ P273_Com_tBatt : 8|8@1+ (0.5,-30) [-30|97.5] "deg C" Vector__XXX
+ SG_ P418_Com_uBattRaw : 28|11@0+ (0.01,5) [5|25.47] "" Vector__XXX
+ SG_ P349_EEM_stAltCtlType : 29|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ P420_Com_stBattCrntMeasRaw : 40|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P419_Com_stSTTActvRaw : 44|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P421_Com_xBattCrnt : 55|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1458 Contexte1_5B2: 8 Vector__XXX
+ SG_ P146_Com_tEnvT : 16|8@1+ (0.5,-40) [-40|87] "°C" Vector__XXX
+ SG_ P100_Com_stAddPmpDef : 24|8@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P__Com_stEOBD : 39|8@0+ (1,0) [0|255] "-" Vector__XXX
+
+BO_ 1475 NEW_MSG_5C3: 8 XXX
+ SG_ ESP_STATUS_RELATED_1 : 27|2@0+ (1,0) [0|3] "" XXX
+ SG_ ESP_STATUS_RELATED_2 : 28|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1544 EOBD_CMM: 8 CMM___Motor_SG
+ SG_ P__LID_No : 0|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data1_PID : 8|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data2_PID : 16|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data3_PID : 24|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data4_PID : 32|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data5_PID : 40|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data6_PID : 48|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P__Data7_PID : 56|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1554 HS2_DAT7_BSI_612: 8 BSI
+ SG_ INH_ECLAIRAGE_VIRAGE_DYN : 5|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ INH_ECLAIRAGE_AUTOROUTE : 6|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ INH_DIURNE_ECLRGE : 7|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ ETAT_FEUX_CROIST : 9|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ ETAT_FEUX_ROUTE : 10|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ MODE_CONF_VEH : 13|2@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ CDE_CLG_ET_HDC : 15|2@0+ (1,0) [0|3] "" CMM,BV,BVN
+ SG_ MODE_ECO : 17|2@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ MODE_ASR_PLUS_SELECT : 19|2@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ DEF_FEU_ROUTE_G : 20|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ DEF_FEU_ROUTE_D : 21|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ DEF_FEU_CROISMNT_G : 22|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ DEF_FEU_CROISMNT_D : 23|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ INFO_NIV_CARB : 31|8@0+ (0.5,0) [0|127] "L" CMM,BV,BVN
+ SG_ U_PRED_DEMARRAGE : 34|11@0+ (0.01,0) [0|13] "V" CMM,BV,BVN
+ SG_ POS_DEFLEC_MOBILE : 38|3@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ INFO_REQ_OLVI_REAR_ACT : 39|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ UB_D_LIGNE_REL_RX : 49|1@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ D_LIGNE_REL_R2 : 52|3@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ D_LIGNE_REL_R1 : 55|3@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ CONFIG_VHL : 60|3@0+ (1,0) [0|0] "" CMM,BV,BVN
+ SG_ D_LIGNE_REL_R3 : 63|3@0+ (1,0) [0|0] "" CMM,BV,BVN
+
+BO_ 1610 Rep_Diag_CVM: 7 XXX
+
+BO_ 1666 Rep_Diag_VCU: 7 XXX
+
+BO_ 1670 Rep_Diag_HCU2: 7 XXX
+
+BO_ 1672 Rep_Diag_On_CAN_688: 8 Vector__XXX
+
+BO_ 1677 Rep_Diag_ABRASR: 7 XXX
+
+BO_ 1684 Rep_Diag_MSB: 7 XXX
+
+BO_ 1685 Rep_Diag_DIRECTN: 7 XXX
+
+BO_ 1686 Rep_Diag_ARTIV: 7 XXX
+
+BO_ 1697 Req_Diag_SCR: 3 XXX
+
+BO_ 1698 Req_Diag_VCU: 3 XXX
+
+BO_ 1702 Req_Diag_HCU2: 3 XXX
+
+BO_ 1704 Req_Diag_On_CAN_6A8: 8 Vector__XXX
+
+BO_ 1705 Req_Diag_BOITEVIT: 3 XXX
+
+BO_ 1709 Req_Diag_ABRASR: 3 XXX
+
+BO_ 1716 Req_Diag_MSB: 3 XXX
+
+BO_ 1717 Req_Diag_DIRECTN: 3 XXX
+
+BO_ 1718 Req_Diag_ARTIV: 3 XXX
+
+BO_ 1719 Req_Diag_CORPRO: 3 XXX
+
+BO_ 1722 Req_Diag_CONV_PUIS: 3 XXX
+
+BO_ 1792 Req_Diag_BMF_UDS_CQCA: 8 XXX
+
+BO_ 1793 Req_Diag_COMBINE_UDS_CQCA: 8 XXX
+
+BO_ 1810 Rep_Diag_BAAST: 8 XXX
+
+BO_ 1815 Rep_Diag_CTPA: 8 XXX
+
+BO_ 1824 Req_Diag_BSP: 8 XXX
+
+BO_ 1840 Req_Diag_CPL_MOTED_SUSPVAR: 8 XXX
+
+BO_ 1842 Req_Diag_BAAST_BAASL_FEU_AR_C_CCE: 8 XXX
+
+BO_ 1847 Req_Diag_CTPA: 4 XXX
+
+BO_ 1856 Req_Diag_IDB: 8 XXX
+
+BO_ 1858 Req_Diag_HDC: 8 XXX
+
+BO_ 1859 Req_Diag_AFFICHEUR_LVDS_BD: 8 XXX
+
+BO_ 1860 Req_Diag_AIRBAG: 8 XXX
+
+BO_ 1862 Req_Diag_RHF: 8 XXX
+
+BO_ 1866 Req_Diag_CVM_CPL: 3 XXX
+
+BO_ 1871 Req_Diag_AVM_AVE: 8 XXX
+
+BO_ 1872 Req_Diag_PDSP_DCU_FD_AUTDEM_BML_ES_CSP: 8 XXX
+
+BO_ 1875 Req_Diag_RETRO_INT: 8 XXX
+
+BO_ 1879 Req_Diag_BDMAR_DCU_RL: 8 XXX
+
+BO_ 1888 Req_Diag_AUTORADIO: 8 XXX
+
+BO_ 1889 Req_Diag_BMU_IVC_D: 8 XXX
+
+BO_ 1892 Req_Diag_TELEMAT: 8 XXX
+
+BO_ 1896 BSI_FaultLog: 8 CMM___Motor_SG
+ SG_ P__BSI_FaultLog_Header : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_DTC1 : 8|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_DTC2 : 16|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_Env1 : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_Env2 : 32|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_Env3 : 40|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_Env4 : 48|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ P__BSI_FaultLog_Env5 : 56|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1906 FaultLog_Ack: 1 BSI___Kombiinstrument
+ SG_ P__FaultLog_Ack : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1922 Req_Diag_CMB: 8 XXX
+
+BO_ 1927 Req_Diag_TRANSMISSION: 8 XXX
+
+BO_ 1928 Supv_CMM: 8 CMM___Motor_SG
+ SG_ P073_SupervisionFaultCodes : 7|8@0+ (1,0) [0|255] "-" Vector__XXX
+ SG_ P071_ConfirmedAbsentFlags : 15|32@0+ (1,0) [0|4294967295] "-" Vector__XXX
+ SG_ P284_T15CD_stPart : 43|12@0+ (1,0) [0|4095] "" Vector__XXX
+ SG_ P242_T15CD_stElec : 44|4@1+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 1942 HS2_SUPV_ARTIV_796: 8 ARTIV
+ SG_ FAULT_CODE : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STATUS_NO_CONFIG : 15|32@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STATUS_PARTIAL_WAKEUP_GMP : 43|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ UCE_ELECTR_STATE : 47|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1953 Rep_Diag_BMF_CAN_MMC_2: 8 XXX
+
+BO_ 1968 Req_Diag_BMF_CAN_FIAT_CONBINE_CAN_FIAT_SUSPVAR: 8 XXX
+
+BO_ 2015 Req_EOBD_On_Can_7DF: 8 Vector__XXX
+
+BO_ 2016 Req_Diag_INJ_T: 8 Vector__XXX
+
+BO_ 2024 Rep_Diag_INJ_T: 8 Vector__XXX
+
+BO_ 3221225472 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX
+ SG_ Code : 0|5@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ConfIdCde : 0|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ConfIdStatus : 0|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data0 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data1 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data2 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data3 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data4 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data5 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data6 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Data7 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Diagnostic_On_Can : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ Edge : 0|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GetConfIdCde : 0|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GetConfIdStatus : 0|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ IdPert : 0|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Input1 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Input2 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Input3 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Input4 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Local_ID : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ Mask0 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask1 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask2 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask3 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask4 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask5 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask6 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Mask7 : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MaskIdPert : 0|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NumScenario : 0|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Output0 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Output1 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Output2 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Output3 : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OutputNumber : 0|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P004_ActualTorqueNoGearbox : 0|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX
+ SG_ P013_Com_stBrk1 : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P028_Gbx_stEOBDFault : 0|4@1+ (1,0) [0|15] "-" Vector__XXX
+ SG_ P033_sABS : 0|16@0+ (0.1,0) [0|6553.5] "m" Vector__XXX
+ SG_ P040_Com_stBrkRaw1 : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P041_Cde_RVV : 0|2@1+ (1,0) [0|3] "-" Vector__XXX
+ SG_ P049_Com_bMIL : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P051_ACCD_stPres : 0|2@1+ (1,0) [0|3] "-" Vector__XXX
+ SG_ P053_ACCtl_stHys : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P055_Com_trqTCSAbs : 0|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX
+ SG_ P069_Act_RVV : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P084_CoDT_trqGearbxDes : 0|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX
+ SG_ P087_Com_stClth : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P093_Temp_aval_FAP : 0|8@1+ (4,-40) [0|255] "°C" Vector__XXX
+ SG_ P095_EngPrt_stOvrSpd : 0|2@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P101_Com_mAddPmpTot : 0|16@0+ (0.05,0) [0|3276.5] "g" Vector__XXX
+ SG_ P107_Com_stAddPmpLvl : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P128_Forcage_Encl_GMV : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P133_StSys_stEngSTT2Rls : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P135_StSys_stAR2s : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P145_Saturation_Active : 0|1@1+ (1,0) [0|1] "-" Vector__XXX
+ SG_ P227_Pwr_Gen_Support_state : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P229_Com_xTCChkSum : 0|4@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P243_FrmMng_stFlCnsmp_mp : 0|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ P248_StarterStopReq : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P250_MajorStartRequest : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P251_Com_stScndStrtReq : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P252_ImpluseStart : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P255_Com_tiSec : 0|20@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P256_Com_tiDay : 0|12@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P257_Com_tiYr : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ P261_PCH_WakeUP : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P268_AddPmpCD_volAddInjStp : 0|8@1+ (10,0) [0|255] "" Vector__XXX
+ SG_ P284_T15CD_stPart_byte6 : 0|4@0+ (1,0) [0|15] "" Vector__XXX
+ SG_ P284_T15CD_stPart_byte8 : 0|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P290_StSys_stGlwAuth : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P292_FrmMng_stGearTrqReq : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P296_Fans_bEHRPmpReq : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P297_RTE_Fun_StErr : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P298_Com_stEHRCtl : 0|1@1- (1,0) [0|1] "" Vector__XXX
+ SG_ P308_EOBD_Rediness : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P314_VehDa_stTrqMax : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P315_VehDa_stEngSpdMax : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P317_FrmMng_dtBVMPChkSum : 0|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P318_FrmMng_ctBVMPCntr : 0|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ P325_Com_tiEngOffLSB : 0|16@1+ (1,0) [0|65535] "" Vector__XXX
+ SG_ P325_Com_tiEngOffMSB : 0|16@1+ (1,0) [0|65535] "" Vector__XXX
+ SG_ P348_Alt_bFault : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P361_Com_stTscEngDemTyp : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P363_Com_trqRelCrSConv : 0|8@1- (3,-150) [0|0] "Nm" Vector__XXX
+ SG_ P364_Gbx_nGbxIPSpeedFlt : 0|12@0+ (2,0) [0|0] "rpm" Vector__XXX
+ SG_ P399_Com_stProd : 0|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ P405_Com_stRly1DiagRaw : 0|3@1- (1,0) [0|7] "" Vector__XXX
+ SG_ P407_Com_stRly2DiagRaw : 0|3@1- (1,0) [-4|3] "" Vector__XXX
+ SG_ P416_Com_bStSpCabReqRaw : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ P427_Com_stBattTypEstRaw : 0|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ P436_Com_uPrdcVltgStrtRaw : 0|11@0+ (0.01,0) [0|13] "" Vector__XXX
+ SG_ Rate : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Reserved_1 : 0|16@1+ (1,0) [0|255] "-" Vector__XXX
+ SG_ VersionActel : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionBaudRate : 0|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionDate : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionInput : 0|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionMajor : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionMinor : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionMode : 0|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionMonth : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VersionYear : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ code : 0|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ commande : 0|5@0+ (1,0) [0|0] "" Vector__XXX
+
+CM_ BO_ 114 "ID 072: Unlock Request Frame or LockingStatus (Event triggered)";
+CM_ SG_ 114 ADC2_Req_Status "Unlock request";
+CM_ SG_ 114 ADC2_Seed_Byte3 "SEED1 of RQD_CMM (highest byte)";
+CM_ SG_ 114 ADC2_Seed_Byte2 "SEED2 of RQD_CMM (high byte)";
+CM_ SG_ 114 ADC2_Seed_Byte1 "SEED3 of RQD_CMM (low byte)";
+CM_ SG_ 114 ADC2_Seed_Byte0 "SEED4 of RQD_CMM (lowest byte)";
+CM_ BO_ 146 "Trame BSI émise toutes les 100 ms pendant 1 seconde.";
+CM_ BO_ 168 "ID A8: Unlock Permission Frame Code (Period time 10 ms)";
+CM_ SG_ 168 ADC2_Key_Status "Unlock permission";
+CM_ SG_ 168 ADC2_Key_Byte3 "KEY1 of CFD_BSI (highest byte)";
+CM_ SG_ 168 ADC2_Key_Byte2 "KEY2 of CFD_BSI (high byte)";
+CM_ SG_ 168 ADC2_Key_Byte1 "KEY3 of CFD_BSI (low byte)";
+CM_ SG_ 168 ADC2_Key_Byte0 "KEY4 of CFD_BSI (lowest byte)";
+CM_ BO_ 264 "ID 108: ECM Version Frame - Vers_CMM (Period: Single shot)
+
+Le contenu de la trame est une recopie d'un sous-ensemble de la zone d'identification de la Flash Eprom définie dans le document Application flash EPROM 2000 ref. 96.285.582.9.";
+CM_ SG_ 264 P076_System "P076 system version";
+CM_ SG_ 264 P077_Day "P077 Date: day of the version";
+CM_ SG_ 264 P078_Month "P078 Date: month of the version";
+CM_ SG_ 264 P079_Year "P079 Date: year of the version";
+CM_ SG_ 264 P080_Application "P080 supplier application";
+CM_ SG_ 264 P081_Version "P081 Software version";
+CM_ SG_ 264 P082_Edition "P082 Software issue";
+CM_ SG_ 264 P083_Calibration "P083 Calibration issue";
+CM_ BO_ 520 "ID 208: Engine Dynamic Frame (Period time 10 ms)";
+CM_ SG_ 520 P000_Com_nEng "P000 Motordrehzahl";
+CM_ SG_ 520 P003_Com_trqActOut "P003 Actual torque";
+CM_ SG_ 520 P002_Com_rAPP "P002 rueckgerechnete PWG-Stellung";
+CM_ SG_ 520 P027_ACCtl_stLogicOut "P027 Klimakompressor Status ein/aus";
+CM_ SG_ 520 P014_Brk_stRed "P014 Redundanter Bremskontakt";
+CM_ SG_ 520 P037_VehV_stXVV "P037 Zustand des FGR (Ein/Aus,Ueberdruecken)";
+CM_ SG_ 520 P153_Com_bTrqInacc "P153: Indicates to the torque consumers that the accuracy of the
+torque data output is not guaranteed by the CMM.";
+CM_ SG_ 520 P042_Inm_bCanMon "P042 CAN-Fehlerbehandlung im Startfall mit Hilfe der
+ Startendekennung unterdrücken";
+CM_ SG_ 520 P127_EGT_st_Bit30 "P127: Regeneration aid by electric consumers (engine load increase).";
+CM_ SG_ 520 P198_ActMod_trqClthTraIntv "P084 Vorweggenommenes Drehmoment";
+CM_ SG_ 694 ACC_STATUS "Indicates the operational state of the ACC system.";
+CM_ SG_ 694 DYN_ACC_CHECKSUM "CHK_INI = 0x3";
+CM_ SG_ 694 DYN_ACC_PROCESS_COUNTER "This counter increments from 0 to 15 at each activation of the calculation process.";
+CM_ SG_ 757 ANGLE "asymmetric, could be init";
+CM_ SG_ 758 CHECKSUM_TRANSM_DYN_ACC2 "CHK_INI = 0x7";
+CM_ SG_ 758 PROCESS_COUNTER_4B_ACC2 "This counter increments from 0 to 15 at each activation of the calculation process.";
+CM_ SG_ 773 ANGLE "-565 to 560, seems like estimate and not init";
+CM_ SG_ 773 RATE_SIGN "1=moving clockwise, 0=moving anticlockwise";
+CM_ SG_ 773 0_CHECKSUM "TODO: find checksum";
+CM_ BO_ 840 "ID 348: Engine Dynamic Frame 2 (Period time 20 ms)";
+CM_ SG_ 840 P165_FlFCD_stWtLvlSensDebVal "P165: Water in fuel indication (1 = water in fuel detected / 0 = no water in fuel)";
+CM_ SG_ 840 P152_Gearbx_stGear "P152: Gear detected by ratio vehicule speed to engine speed";
+CM_ SG_ 840 P019_Com_trqPrp "P019 Requested torque before processing.";
+CM_ SG_ 840 P211_AirC_pClnt "P084 Vorweggenommenes Drehmoment";
+CM_ SG_ 840 P017_Com_trqFrc "P017 Torque lost by AC, friction, high pressure pump and acsessories.";
+CM_ SG_ 840 P026_Com_bESPAck "P026 TCS/DCS (ASR/MSR) acknowledgement by engine ECU
+(1 = communication correct)";
+CM_ SG_ 840 P025_Com_stESPErr "P025 TCS/DCS (ASR/MSR) request state";
+CM_ SG_ 840 P091_ConvCD_stDebVal "P091 clutch pedal switch and status";
+CM_ SG_ 840 P212_Comp_load_shed "Compressor load shedding command";
+CM_ SG_ 840 P134_Com_stEng "Engine status";
+CM_ BO_ 841 "ID 349: Gearbox Synchronisation Frame (Period time 20 ms)";
+CM_ SG_ 841 P009_Com_bGearShftActv "P057 Gearbox torque request";
+CM_ SG_ 841 P085_Com_bGbxACCmprShOff "P085 AC compressor inhibit";
+CM_ SG_ 841 P167_Com_stEngSpdCtl "P009 shift in progress";
+CM_ SG_ 841 P287_Com_stGearRat "P008 transmission range engaged";
+CM_ SG_ 841 P283_Com_stGearTrgtPos "P087 gearbox converter state";
+CM_ SG_ 841 P230_Com_ctTSCCntr "P048 fan request for gearbox";
+CM_ SG_ 841 P340_Com_xTSCChkSum "P097 request to increase the idle speed";
+CM_ SG_ 841 P166_Com_nEngTSC "P055 torque limitation for gearbox";
+CM_ BO_ 845 "ID 34D: ESP Synchronisation frame (Period time 20 ms)";
+CM_ SG_ 845 P047_Com_stESPIntv "P047 ESP torque request status";
+CM_ SG_ 845 P088_CutOffForbidden_OR_ESP_STATUS_INV "P088 Cut off of injection is forbidden.";
+CM_ SG_ 845 P147_Com_bESPIntvActv "P147 ESP-TCS (ASR) in regulation";
+CM_ SG_ 845 P043_Com_xTCSStatRaw "P043 TCS (ASR) static torque request = max. threshold";
+CM_ SG_ 845 P044_Com_trqTCSRaw "P044 TCS (ASR) dynamic torque request";
+CM_ SG_ 845 P045_Com_trqDCSRaw "P045 DCS (MSR) torque request = min. threshold";
+CM_ SG_ 845 P157_Com_ctESP "P157 Check counter";
+CM_ BO_ 904 "ID 388: Engine Dynamic Frame 3 (Period time 40ms)";
+CM_ SG_ 904 P060_vECU "P060 velocity by engine ECU";
+CM_ SG_ 904 P062_sECU "P062 odometer by engine ECU";
+CM_ SG_ 904 P066_aECU "P066 longitudinal acceleration by engine ECU";
+CM_ BO_ 909 "ID 38D: ABS Vehicle Dynamic Frame (Period time 40 ms)";
+CM_ SG_ 909 P052_Com_aLng "P052 longitudinal acceleration (FrmMng_a)";
+CM_ BO_ 969 "Pour application MCP SSTG";
+CM_ SG_ 1010 TORQUE "Set to ~2043 when active";
+CM_ SG_ 1010 LANE_DEPARTURE "UNUSED in HDA";
+CM_ SG_ 1010 STATUS "0=LKA OFF (button in console)";
+CM_ SG_ 1010 LXA_ACTIVATION "Set = 0, no activity seen in routes";
+CM_ BO_ 1042 "ID 412: Body Car Data Frame (Period time 50 ms)";
+CM_ SG_ 1042 P040_MainBrakeFault "P040 Main brake switch is defect.";
+CM_ SG_ 1042 P103_Com_bRevGear "P013 main brake signal";
+CM_ SG_ 1042 P013_MainBrake "P013 main brake signal";
+CM_ SG_ 1042 P012_Com_bFlMin "P012 Minimum fuel level detected. If fuel level < 15 % signal P012 will be set to one.";
+CM_ SG_ 1042 P086_Com_stFlLvlDia "P086 Minimum fuel level diagnosis status. (00 Minimum fuel is valid / 01 Minimum fuel is not valid / others are not defined)";
+CM_ SG_ 1042 P104_Dspl_stAOHt "P104 Ansteuerung Zusatzheizer";
+CM_ SG_ 1074 P249_Com_stEngStopReq "Engine stop request";
+CM_ SG_ 1074 P216_Com_bSiaWkUp "Immobilizer anticipation with wake up";
+CM_ SG_ 1074 P214_Com_stMnWkUp "Main wake-up (RCD )";
+CM_ SG_ 1074 P253_Com_bEngPrepReq "Engine preparation request";
+CM_ BO_ 1101 "ID 44D: Rear unfiltered wheel speeds, used for EasyMove";
+CM_ SG_ 1101 P330_VehV_vWhlRrL "P010 vehicle speed of ABS. This signal is loaded into VSSCD_v";
+CM_ SG_ 1101 P331_VehV_vWhlRrR "P010 vehicle speed of ABS. This signal is loaded into VSSCD_v";
+CM_ SG_ 1106 LONGITUDINAL_REGULATION_TYPE "Defines if the system is in RVV (Vehicle Speed Governor) or LVV (Vehicle Speed Limiter) or ACC (Adaptive Cruise Control) or without regulation.";
+CM_ SG_ 1106 FRONT_WIPER_STATUS "Emitted when the rain sensor is active.";
+CM_ SG_ 1106 SPEED_SETPOINT "Setpoint or limit: based on the value of the 'requested speed type' bit.";
+CM_ SG_ 1106 CHECKSUM_CONS_RVV_LVV2 "Used to secure the RVV or LVV setpoint sent via the CAN network (signal SPEED_SETPOINT).";
+CM_ SG_ 1106 CHECKSUM "CHK_INI = 0xB";
+CM_ SG_ 1128 P247_Com_stStaFunc "CMM DAMP function state";
+CM_ SG_ 1128 P246_Com_bStaPrt "Starter protection";
+CM_ SG_ 1128 P245_Com_stRedBrkPlaus "Uncertain redendant brake contact";
+CM_ SG_ 1128 P244_Com_bSta "Starter state";
+CM_ BO_ 1160 "ID 488: Engine Data Frame (Period time 100 ms)";
+CM_ SG_ 1160 P005_CEngDst_tSens "P005 Wassertemperatur";
+CM_ SG_ 1160 P021_Com_volFlCons "P021 Kraftstoffverbrauch";
+CM_ SG_ 1160 P032_Com_bEngStrt "P032 Zustand Motor";
+CM_ SG_ 1160 P031_GlwLmp_st "P031 Ansteuerung Gluehanzeige";
+CM_ SG_ 1160 P105_Com_bTtLmp "P105 Temperaturwarnlampe: ein/aus";
+CM_ SG_ 1160 P108_Fid_ComAddPmpLvl "P106 Temperaturwarnlampe : blinken";
+CM_ SG_ 1160 P063_vehV_bXVVErr "P063 FGR-Fehler";
+CM_ SG_ 1160 P154_PFlt_bPFltClnReq "P154: Tell-tale lamp for \"risk of clogged filter\"";
+CM_ SG_ 1160 P056_ACCD_p "P056 Kältemitteldruck";
+CM_ SG_ 1160 P158_Air_tAFS "P158: Intake air temperature.";
+CM_ BO_ 1224 "ID 4C8: Crash status by Airbag Control (Event triggered / Period time 50 ms)";
+CM_ SG_ 1224 P223_CrashInfo "Crash Information";
+CM_ BO_ 1294 "ID 50E: Body Car & Air Conditioning Data Frame (Period time 100 ms)";
+CM_ SG_ 1294 P050_Com_stAC "P050 Fahrerwunsch Klimakompressor ein/aus ermitteln";
+CM_ SG_ 1294 P164_Com_stPFltFan "P164: Fan speed setpoint increase";
+CM_ BO_ 1362 "Trame utilisable uniquement sur véhicules en archi EE 2010
+
+cette trame est émise toutes les 100ms pendant 1seconde puis toutes les secondes";
+CM_ SG_ 1362 P015_Com_lTotDst "P015: covered distance from dashboard";
+CM_ BO_ 1375 "trame utilisable uniquement pour le JDD en archi EE 2010";
+CM_ SG_ 1390 GAS_PEDAL "Max 99.5%";
+CM_ SG_ 1394 IGNITION "doesn't turn off straight away";
+CM_ BO_ 1458 "trame utilisable uniquement sur véhicules en archi EE 2010";
+CM_ SG_ 1458 P146_Com_tEnvT "P146: Environment air temperature";
+CM_ SG_ 1458 P100_Com_stAddPmpDef "P100: Status of additive for FAP";
+CM_ SG_ 1458 P__Com_stEOBD "Pxxx: EOBD relevant errors in the network";
+CM_ BO_ 1554 "trame consommée uniquement sur véhicules en archi EE 2010";
+CM_ BO_ 1610 "CVM_3, CVM_2, CVM";
+CM_ BO_ 1666 "VCU_EMS8000, E_VCU";
+CM_ BO_ 1670 "HCU2";
+CM_ BO_ 1677 "ABS81, ESP81, ABS8_BOSCH, ESP8_BOSCH, ESP90, ABSMK100, ESPMK100, ESP_KP1, ABS_KP1, ASC, ABS, ESP, ABS80, ESP80, ASR80, ABS90_D, ESP90_D, ESP90_F, ESPMK100_UDS, ESP_EBC_440_CAN, ESP_EBC_440_K, ESP_EBC_440, ABSMK70_1, ESPMK60_O, ABSMK100_UDS, ABS90_T, ABS_8_0_C1, ESP_8_0_C1, ABS_4x4, ESP_4x4, ABS81_BOSCH, ESP81_BOSCH, ABS90_F, RBV";
+CM_ BO_ 1684 "TBMU, TBMU_PHEV, BMU_CTE1";
+CM_ BO_ 1685 "GEP, DAE_BVH2, DAE, DAE_A515, DAE_UDS, EPS, SSCU, DAE_D, GEP_UDS, EPS_T";
+CM_ BO_ 1686 "ARTIV, RADAR_AV_4, LIDAR, ARTIV_UDS";
+CM_ BO_ 1704 "Le mécanisme d'émission utilisé est événementiel de l'outil vers le calculateur via la BSI
+Trame question pour le téléchargement et le Diag On CAN.";
+CM_ BO_ 1810 "BAAST";
+CM_ BO_ 1815 "CTPA";
+CM_ BO_ 1906 "Le mécanisme d'émission utilisé est événementiel de la BSI vers le CMM.
+
+Trame d'acquittement du Journal Des Défauts BSI.";
+CM_ BO_ 1928 "ID 788: CMM Supervision Frame (Period time 1000 ms)";
+CM_ SG_ 1928 P073_SupervisionFaultCodes "P073 Supervision fault codes";
+CM_ SG_ 1928 P071_ConfirmedAbsentFlags "P071 confirmed absent status flags of the ECU";
+CM_ SG_ 1928 P284_T15CD_stPart "ECU electronic state";
+CM_ SG_ 1928 P242_T15CD_stElec "ECU electronic state";
+CM_ BO_ 1953 "BSI";
+CM_ BO_ 2015 "Le mécanisme d'émission utilisé est événementiel de l'outil branché sur le réseau Can vers les calculateurs.
+
+Trame question EOBD On Can adresse a tous les calculateurs";
+CM_ BO_ 2016 "Le mécanisme d'émission utilisé est événementiel de l'outil branché sur le réseau Can vers le CMM
+
+Trame question EOBD On Can adresse au CMM
+ECU Family: INT_J";
+CM_ BO_ 2024 "Le mécanisme d'émission utilisé est événementiel du CMM vers l'outil branché sur le réseau Can
+
+Trame réponse EOBD On Can du CMM
+
+ECU Family: INJ_T";
+CM_ BO_ 3221225472 "This is a message for not used signals, created by Vector CANdb++ DBC OLE DB Provider.";
+CM_ SG_ 3221225472 P004_ActualTorqueNoGearbox "P004 Actual torque before torque intervention by automatic gearbox";
+CM_ SG_ 3221225472 P028_Gbx_stEOBDFault "P028 MIL request gearbox";
+CM_ SG_ 3221225472 P033_sABS "P033 odometer";
+CM_ SG_ 3221225472 P041_Cde_RVV "P041 FGR-Bedienteilinfo";
+CM_ SG_ 3221225472 P049_Com_bMIL "P049 Ansteuerung DIA-Lampe";
+CM_ SG_ 3221225472 P051_ACCD_stPres "P051 Abschaltung Klimakompressor wegen Ueber- oder
+Unterdruck im Kaeltemittelkreislauf";
+CM_ SG_ 3221225472 P053_ACCtl_stHys "P053 Abschaltung Klimakompressor aus Sicherheitsgruenden
+oder wegen Komfortfunktionen";
+CM_ SG_ 3221225472 P069_Act_RVV "P069 FGR-Hauptschalter";
+CM_ SG_ 3221225472 P084_CoDT_trqGearbxDes "P084 Vorweggenommenes Drehmoment";
+CM_ SG_ 3221225472 P087_Com_stClth "Clutch signal for AM6";
+CM_ SG_ 3221225472 P093_Temp_aval_FAP "P093 FAP-Temperatur";
+CM_ SG_ 3221225472 P101_Com_mAddPmpTot "P101: absolute Menge des eingespritztem Additivs (Cerium)";
+CM_ SG_ 3221225472 P107_Com_stAddPmpLvl "P107 Minimum of FAP additive exeeded";
+CM_ SG_ 3221225472 P227_Pwr_Gen_Support_state "P165: Water in fuel indication (1 = water in fueel detected / 0 = no water in fuel)";
+CM_ SG_ 3221225472 P243_FrmMng_stFlCnsmp_mp "P155: Preparation of glow activation.";
+CM_ SG_ 3221225472 P248_StarterStopReq "starter stop request";
+CM_ SG_ 3221225472 P250_MajorStartRequest "Main latch starting request";
+CM_ SG_ 3221225472 P251_Com_stScndStrtReq "Secondary latched starting request";
+CM_ SG_ 3221225472 P252_ImpluseStart "Momentary starting request";
+CM_ SG_ 3221225472 P284_T15CD_stPart_byte6 "ECU electronic state";
+CM_ SG_ 3221225472 P284_T15CD_stPart_byte8 "ECU electronic state";
+CM_ SG_ 3221225472 Reserved_1 "P074 Number of BusOff in driving cycle";
+VAL_ 461 ESP_STATUS 0 "DISABLED" 1 "ENABLED";
+VAL_ 461 ESP_STATUS_INV 0 "ENABLED" 1 "DISABLED";
+VAL_ 694 POTENTIAL_WHEEL_TORQUE_REQUEST 0 "Not requested" 1 "Requested in GMP mode" 2 "Requested in Brake mode" 3 "Not used";
+VAL_ 694 ACC_STATUS 0 "Initialization" 1 "OFF" 2 "Inhibited" 3 "Waiting" 4 "Active" 5 "Suspended" 6 "Brake only" 7 "Wait ramp" 8 "Reserved" 9 "Reserved" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "Reserved" 15 "Fault";
+VAL_ 694 WHEEL_TORQUE_REQUEST 0 "Not requested" 1 "High range requested" 2 "Low range requested" 3 "Not used";
+VAL_ 694 AUTO_BRAKING_STATUS 0 "Unavailable" 1 "Initialization" 2 "Not used" 3 "Inhibited" 4 "Not used" 5 "Waiting" 6 "Active" 7 "Fault";
+VAL_ 694 MDD_DECEL_TYPE 0 "No braking" 1 "ACC" 2 "FA_HV (high-speed automatic braking) / AFUi braking" 3 "FA_BV (low-speed automatic braking) / FARC2 braking";
+VAL_ 694 MDD_DECEL_CONTROL_REQ 0 "No UCF control request" 1 "UCF control request";
+VAL_ 694 GEAR_TYPE 0 "Downshift" 1 "Upshift";
+VAL_ 694 PREFILL_REQUEST 0 "No prefill request" 1 "Prefill request";
+VAL_ 728 ESP_STATUS_RELATED 0 "DISABLED" 1 "ENABLED";
+VAL_ 728 ESP_STATUS_RELATED_INV 0 "ENABLED" 1 "DISABLED";
+VAL_ 758 TARGET_DETECTED 0 "initialization or no target detected" 1 "target detected";
+VAL_ 758 REQUEST_TAKEOVER 0 "No request" 1 "Non-critical request" 2 "Critical request" 3 "Invalid";
+VAL_ 758 BLIND_SENSOR 0 "False" 1 "True";
+VAL_ 758 REQ_VISUAL_COLL_ALERT_ARC 0 "no visual alert request" 1 "visual alert request";
+VAL_ 758 REQ_AUDIO_COLL_ALERT_ARC 0 "no audio alert request" 1 "audio alert request";
+VAL_ 758 REQ_HAPTIC_COLL_ALERT_ARC 0 "no haptic alert request" 1 "haptic alert request";
+VAL_ 758 ARC_STATUS 0 "unavailable" 1 "not used" 2 "not used" 3 "initialization" 4 "not used" 5 "not used" 6 "inhibited" 7 "not used" 8 "not used" 9 "not used" 10 "waiting" 11 "not used" 12 "active" 13 "not used" 14 "not used" 15 "fault";
+VAL_ 758 AUTO_BRAKING_IN_PROGRESS 0 "no braking in progress" 1 "braking in progress";
+VAL_ 758 AEB_ENABLED 0 "FALSE" 1 "TRUE";
+VAL_ 758 DRIVE_AWAY_REQUEST 0 "No drive away required" 1 "Drive away required";
+VAL_ 758 MDD_DECEL_CONTROL_REQ 0 "no UCF control request" 1 "UCF control request";
+VAL_ 758 AUTO_BRAKING_STATUS 0 "unavailable" 1 "initialization" 2 "not used" 3 "inhibited" 4 "not used" 5 "waiting" 6 "active" 7 "fault";
+VAL_ 758 TARGET_POSITION 0 "POS1" 1 "POS2" 2 "POS3" 3 "POS4" 4 "POS5" 5 "POS6" 6 "POS7" 7 "Invalid";
+VAL_ 760 ESP_STATUS_RELATED 0 "DISABLED" 1 "ENABLED";
+VAL_ 760 ESP_STATUS_RELATED_INV 0 "ENABLED" 1 "DISABLED";
+VAL_ 840 P134_Com_stEng 7 "RESERVED" 6 "DegradedGO" 5 "GO" 4 "Stopped" 3 "Running" 2 "Starting" 1 "Cut" 0 "Locked";
+VAL_ 909 VITESSE_VEHICULE_ROUES 65535 "Invalid";
+VAL_ 1010 LANE_DEPARTURE 0 "NOT_DEPARTED" 1 "DEPARTED_RIGHT" 2 "DEPARTED_LEFT";
+VAL_ 1010 STATUS 0 "UNAVAILABLE" 1 "UNSELECTED" 2 "SELECTED" 3 "AUTHORIZED" 4 "ACTIVE" 5 "DEFECT" 6 "COLLISION" 7 "RESERVED";
+VAL_ 1106 LONGITUDINAL_REGULATION_TYPE 0 "None" 1 "RVV: Vehicle Speed Governor" 2 "LVV: Vehicle Speed Limiter" 3 "ACC: Adaptive Cruise Control";
+VAL_ 1106 TURN_SIGNAL_STATUS 0 "Turn signal inactive" 1 "Right turn signal active" 2 "Left turn signal active" 3 "Both turn signals active";
+VAL_ 1106 FRONT_WIPER_STATUS 0 "Off" 1 "Front wiper confirmed" 2 "Low speed" 3 "High speed";
+VAL_ 1106 CHECKSUM_CONS_RVV_LVV2 0 "Most significant nibble of SPEED_SETPOINT is even AND least significant nibble of SPEED_SETPOINT is even" 1 "Most significant nibble of SPEED_SETPOINT is even AND least significant nibble of SPEED_SETPOINT is odd" 2 "Most significant nibble of SPEED_SETPOINT is odd AND least significant nibble of SPEED_SETPOINT is even" 3 "Most significant nibble of SPEED_SETPOINT is odd AND least significant nibble of SPEED_SETPOINT is odd";
+VAL_ 1106 BRAKE_ONLY_CMD_BSI 0 "No brake-only command requested by BSI" 1 "Brake-only command requested by BSI";
+VAL_ 1106 LVV_ACTIVATION_REQ 0 "No LVV activation request" 1 "LVV activation requested";
+VAL_ 1106 RVV_ACC_ACTIVATION_REQ 0 "No RVV/ACC activation request" 1 "RVV/ACC activation requested";
+VAL_ 1106 ARC_HABIT_SENSITIVITY 0 "Unused value" 1 "1" 2 "2" 3 "3" 4 "Unused value" 5 "Unused value" 6 "Unused value" 7 "Unused value";
+VAL_ 1106 ARC_HABIT_ACTIVATION_REQ 0 "ARC deactivation" 1 "ARC activation";
+VAL_ 1106 FRONT_WASH_STATUS 0 "Off" 1 "Wash";
+VAL_ 1106 FORCE_ACTIVATION_HAB_CMD 0 "Deactivation" 1 "Activation";
+VAL_ 1106 COCKPIT_GO_ACC_REQUEST 0 "VALUE_1" 1 "VALUE_2";
+VAL_ 1106 ACC_PROGRAM_MODE 0 "Comfort" 1 "Sport" 2 "Eco" 3 "Reserved";
+VAL_ 1173 EPS_TORQUE 127 "Invalid";
+VAL_ 1173 ETAT_DA_2004 3 "Reserved" 2 "Orange LED" 1 "Red LED" 0 "No Demand";
+VAL_ 1173 ETAT_DA_DYN 3 "Invalid" 2 "Adjustable Mode" 1 "Dynamic Mode" 0 "Normal Mode";
+VAL_ 1173 ETAT_DA_2010 3 "Reserved" 2 "Orange LED" 1 "Red LED" 0 "No Demand";
+VAL_ 1173 TRQ_LIMIT_STATE 1 "Saturation Effective" 0 "No Saturation";
+VAL_ 1173 STEERWHL_HOLD_BY_DRV 1 "Steer Activity From Drv Trq" 0 "No Steer Activity From Drv Trq";
+VAL_ 1173 EPS_STATE_LKA 4 "Defect" 3 "Active" 2 "Available" 1 "Authorised" 0 "Unauthorised";
+VAL_ 1173 AUTOR_ARRET_MOT_DA 1 "Permission to Stop" 0 "No Permission to Stop";
+VAL_ 1173 STEERING_REBOOT_REQUEST 1 "Request Reboot" 0 "No Reboot Required";
+VAL_ 1270 ARTIV_SENSOR_STATE 0 "Initialization" 1 "Inactive" 2 "Active" 3 "Reduced visibility" 4 "Simulation" 5 "Learning" 6 "Free" 7 "Fault";
+VAL_ 1270 TARGET_DETECTED 0 "initialization or no target detected" 1 "target detected";
+VAL_ 1270 ARTIV_TARGET_CHANGE_INFO 0 "VALUE_1" 1 "VALUE_2";
+VAL_ 1270 TRAFFIC_DIRECTION 0 "right" 1 "left" 2 "reserved" 3 "undetermined";
diff --git a/iqdbc_repo/iqdbc/dbc/rivian_mando_front_radar_generated.dbc b/iqdbc_repo/iqdbc/dbc/rivian_mando_front_radar_generated.dbc
new file mode 100644
index 000000000..6f7304ec2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/rivian_mando_front_radar_generated.dbc
@@ -0,0 +1,457 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "rivian_mando_front_radar.dbc starts here";
+
+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
+
+BO_ 1280 RADAR_TRACK_500: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1281 RADAR_TRACK_501: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1282 RADAR_TRACK_502: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1283 RADAR_TRACK_503: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1284 RADAR_TRACK_504: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1285 RADAR_TRACK_505: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1286 RADAR_TRACK_506: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1287 RADAR_TRACK_507: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1288 RADAR_TRACK_508: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1289 RADAR_TRACK_509: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1290 RADAR_TRACK_50a: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1291 RADAR_TRACK_50b: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1292 RADAR_TRACK_50c: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1293 RADAR_TRACK_50d: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1294 RADAR_TRACK_50e: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1295 RADAR_TRACK_50f: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1296 RADAR_TRACK_510: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1297 RADAR_TRACK_511: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1298 RADAR_TRACK_512: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1299 RADAR_TRACK_513: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1300 RADAR_TRACK_514: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1301 RADAR_TRACK_515: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1302 RADAR_TRACK_516: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1303 RADAR_TRACK_517: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1304 RADAR_TRACK_518: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1305 RADAR_TRACK_519: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1306 RADAR_TRACK_51a: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1307 RADAR_TRACK_51b: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1308 RADAR_TRACK_51c: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1309 RADAR_TRACK_51d: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1310 RADAR_TRACK_51e: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+BO_ 1311 RADAR_TRACK_51f: 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) [-51.2|51.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_ MODE : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX
+
+VAL_ 1280 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1280 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1281 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1281 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1282 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1282 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1283 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1283 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1284 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1284 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1285 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1285 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1286 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1286 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1287 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1287 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1288 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1288 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1289 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1289 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1290 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1290 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1291 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1291 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1292 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1292 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1293 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1293 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1294 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1294 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1295 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1295 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1296 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1296 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1297 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1297 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1298 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1298 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1299 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1299 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1300 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1300 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1301 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1301 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1302 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1302 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1303 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1303 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1304 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1304 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1305 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1305 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1306 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1306 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1307 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1307 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1308 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1308 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1309 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1309 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1310 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1310 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
+VAL_ 1311 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ;
+VAL_ 1311 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ;
+
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/rivian_park_assist_can.dbc b/iqdbc_repo/iqdbc/dbc/rivian_park_assist_can.dbc
new file mode 100644
index 000000000..b18f0a53d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/rivian_park_assist_can.dbc
@@ -0,0 +1,55 @@
+VERSION "ParkAssistCAN"
+
+
+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_: ACM CGM EPAS_P ESP IBM OCS RCM SAS TestTool VDM Vector_XXX
+
+BO_ 794 WheelButtons: 7 XXX
+ SG_ LeftButton_ScrollClick : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ LeftButton_RightClick : 21|2@0+ (1,0) [0|3] "" XXX
+ SG_ LeftButton_LeftClick : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ LeftButton_Scroll : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ RightButton_ScrollClick : 35|2@0+ (1,0) [0|3] "" XXX
+ SG_ RightButton_RightClick : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ RightButton_LeftClick : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ RightButton_Scroll : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 848 BSM_BlindSpotIndicator: 4 XXX
+ SG_ BSM_BlindSpotIndicator_Checksum : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ BSM_BlindSpotIndicator_Counter : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ BSM_BlindSpotIndicator_Left : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ BSM_BlindSpotIndicator_Right : 30|2@1+ (1,0) [0|3] "" XXX
+
+VAL_ 848 BSM_BlindSpotIndicator_Left 0 "OFF" 1 "OBJECT_DETECTED" 2 "ACTIVE_WARNING" ;
+VAL_ 848 BSM_BlindSpotIndicator_Right 0 "OFF" 1 "OBJECT_DETECTED" 2 "ACTIVE_WARNING" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/rivian_primary_actuator.dbc b/iqdbc_repo/iqdbc/dbc/rivian_primary_actuator.dbc
new file mode 100644
index 000000000..2be328901
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/rivian_primary_actuator.dbc
@@ -0,0 +1,1022 @@
+VERSION "PrimaryActuatorCAN"
+
+
+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_: ACM CGM EPAS_P ESP IBM OCS RCM SAS TestTool VDM Vector_XXX
+
+
+BO_ 64 SAS_Status: 8 SAS
+ SG_ SAS_Status_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM,EPAS_P,ESP,RCM,VDM
+ SG_ SAS_Status_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM,EPAS_P,ESP,RCM,VDM
+ SG_ SAS_Status_AngleSafe : 23|15@0- (0.0009765625,0) [-14.5|14.5] "rad" ACM,EPAS_P,ESP,RCM,VDM
+ SG_ SAS_Status_Calibrated : 24|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,RCM,VDM
+ SG_ SAS_Status_AngleSpeedSafe : 39|14@0- (0.0078125,0) [-50|50] "rad/s" ACM,EPAS_P,ESP,RCM,VDM
+ SG_ SAS_StatusQ : 41|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,RCM,VDM
+
+BO_ 256 ACM_Status: 8 ACM
+ SG_ ACM_Status_Checksum : 7|8@0+ (1,0) [0|255] "-" EPAS_P,VDM
+ SG_ ACM_Status_Counter : 11|4@0+ (1,0) [0|15] "-" EPAS_P,VDM
+ SG_ ACM_Unkown1 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACM_FeatureStatus : 23|3@0+ (1,0) [0|7] "" EPAS_P,VDM
+ SG_ ACM_FaultStatus : 26|3@0+ (1,0) [0|7] "" EPAS_P,VDM
+ SG_ ACM_FaultSupervisorState : 42|3@0+ (1,0) [0|7] "" ACMB
+
+BO_ 257 ACM_AebRequest: 8 ACM
+ SG_ ACM_AebRequest_Checksum : 7|8@0+ (1,0) [0|255] "" ESP,VDM
+ SG_ ACM_AebRequest_Counter : 11|4@0+ (1,0) [0|15] "" ESP,VDM
+ SG_ ACM_StopRequest : 17|1@0+ (1,0) [0|1] "" ESP,VDM
+ SG_ ACM_FailInfo : 19|2@0+ (1,0) [0|3] "" ESP,VDM
+ SG_ ACM_DbsLevel : 21|2@0+ (1,0) [0|3] "" ESP,VDM
+ SG_ ACM_OnOffStatus : 23|2@0+ (1,0) [0|3] "" ESP,VDM
+ SG_ ACM_DecelRequest : 27|12@0+ (0.004885,0) [0|15.998375] "m/s^2" ESP,VDM
+ SG_ ACM_WarnLevel : 44|2@0+ (1,0) [0|3] "" ESP,VDM
+ SG_ ACM_PrefillEnableRequest : 46|1@0+ (1,0) [0|1] "" ESP,VDM
+ SG_ ACM_EnableRequest : 47|1@0+ (1,0) [0|1] "" ESP,VDM
+
+BO_ 258 ESP_AebFb: 8 ESP
+ SG_ ESP_AebFeedback_Checksum : 7|8@0+ (1,0) [0|255] "" ACM
+ SG_ ESP_AebFeedback_Counter : 11|4@0+ (1,0) [0|15] "" ACM
+ SG_ iB_BrakePedalApplied_Q : 14|2@0+ (1,0) [0|3] "" ACM
+ SG_ iB_BrakePedalApplied : 15|1@0+ (1,0) [0|1] "" ACM
+ SG_ ESP_DecelFeedback : 23|12@0+ (0.004885,-16) [-16|3.99919] "m/s^2" ACM
+ SG_ ESP_AebActive : 24|1@0+ (1,0) [0|1] "" ACM
+ SG_ ESP_AebAvailable : 25|1@0+ (1,0) [0|1] "" ACM
+ SG_ ESP_DbsActive : 26|1@0+ (1,0) [0|1] "" ACM
+ SG_ ESP_PrefillActiveFeedback : 27|1@0+ (1,0) [0|1] "" ACM
+ SG_ ESP_PrefillAvailable : 32|1@0+ (1,0) [0|1] "" ACM
+ SG_ ESP_DbsAvailable : 33|1@0+ (1,0) [0|1] "" ACM
+
+BO_ 272 ACM_SteeringControl: 8 ACM
+ SG_ ACM_SteeringControl_Checksum : 7|8@0+ (1,0) [0|0] "" EPAS_P
+ SG_ ACM_SteeringControl_Counter : 11|4@0+ (1,0) [0|0] "" EPAS_P
+ SG_ ACM_EacEnabled : 13|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_HapticRequired : 15|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_SteeringAngleRequest : 23|15@0+ (0.1,-1638.4) [-1638.4|1638.3] "deg" EPAS_P
+
+BO_ 288 ACM_lkaHbaCmd: 8 ACM
+ SG_ ACM_lkaHbaCmd_Checksum : 7|8@0+ (1,0) [0|255] "" EPAS_P
+ SG_ ACM_lkaHbaCmd_Counter : 11|4@0+ (1,0) [0|15] "" EPAS_P
+ SG_ ACM_lkaElkRequest : 14|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_HapticRequest : 15|1@0+ (1,0) [0|1] "" EPAS_P
+ SG_ ACM_lkaStrToqReq : 23|11@0+ (1,-1024) [-1024|1024] "" EPAS_P
+ SG_ ACM_lkaSymbolState : 26|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_lkaToiFlt : 27|1@0+ (1,0) [0|1] "" EPAS_P
+ SG_ ACM_lkaActToi : 28|1@0+ (1,0) [0|1] "" EPAS_P
+ SG_ ACM_hbaSysState : 34|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_hbaLamp : 35|1@0+ (1,0) [0|1] "" EPAS_P
+ SG_ ACM_slifOnOffState : 37|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_elkOnOffState : 39|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_ldwLHWarning : 43|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_lkaLaneRecogState : 45|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_hbaOnOffState : 47|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_ldwlkaOnOffState : 48|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_ldwWarnTimingState : 51|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_lkaHandsoffSoundWarning : 53|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_lkaHandsoffDisplayWarning : 55|2@0+ (1,0) [0|3] "" EPAS_P
+ SG_ ACM_ldwRHWarning : 58|3@0+ (1,0) [0|7] "" EPAS_P
+ SG_ ACM_ldwWarnTypeState : 61|3@0+ (1,0) [0|7] "" EPAS_P
+
+BO_ 304 RCM_IMU_LatAccYaw: 8 RCM
+ SG_ RCM_LateralAccelYaw_Checksum : 7|8@0+ (1,0) [0|25] "" ACM,ESP,VDM
+ SG_ RCM_LateralAccelYaw_Counter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LatAcc_Stat_SensAvail : 12|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LatAcc_Stat_Fail : 13|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LatAcc_Stat_Init : 14|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LatAcc_Stat_Startup : 15|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_Yaw_Stat_SensAvail : 16|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_Yaw_Stat_Fail : 17|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_Yaw_Stat_Init : 18|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_Yaw_Stat_Startup : 19|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LatAcc : 39|16@0+ (0.004998293,-163.784065024) [-40.961|40.961] "m/s2" ACM,ESP,VDM
+ SG_ RCM_IMU_Yaw : 55|16@0+ (0.0125,-409.6) [-163.85|163.85] "deg/sec" ACM,ESP,VDM
+
+BO_ 309 RCM_IMU_HeaveRoll: 8 RCM
+ SG_ RCM_HeaveRoll_Checksum : 7|8@0+ (1,0) [0|25] "" VDM
+ SG_ RCM_HeaveRoll_Counter : 11|4@0+ (1,0) [0|15] "" VDM
+ SG_ RCM_IMU_Heave : 23|16@0+ (0.004998293,-163.784065024) [-34.32328|34.32328] "m/s2" VDM
+ SG_ RCM_IMU_Roll : 39|16@0+ (0.0125,-409.6) [-100.0125|100.0125] "deg/sec" VDM
+ SG_ RCM_IMU_Roll_Stat_SensAvail : 48|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Roll_Stat_Fail : 49|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Roll_Stat_Init : 50|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Roll_Stat_Startup : 51|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Heave_Stat_SensAvail : 52|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Heave_Stat_Fail : 53|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Heave_Stat_Init : 54|1@0+ (1,0) [0|1] "" VDM
+ SG_ RCM_IMU_Heave_Stat_Startup : 55|1@0+ (1,0) [0|1] "" VDM
+
+BO_ 320 RCM_IMU_LongAcc: 8 RCM
+ SG_ RCM_LongAcc_Checksum : 7|8@0+ (1,0) [0|25] "" ACM,ESP,VDM
+ SG_ RCM_LongAcc_Counter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LongAcc_Sig : 39|16@0+ (0.004998293,-163.784065024) [-40.961|40.961] "m/s2" ACM,ESP,VDM
+ SG_ RCM_IMU_LongAcc_Stat_SensAvail : 48|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LongAcc_Stat_Fail : 49|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LongAcc_Stat_Init : 50|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LongAcc_Stat_Startup : 51|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+
+BO_ 336 VDM_PropStatus: 7 VDM
+ SG_ VDM_PropStatus_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_PropStatus_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_PropsnActv : 13|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_VehicleSpeedQ : 15|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_Prndl_Status : 19|4@0+ (1,0) [0|15] "" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_Prndl_Request : 23|4@0+ (1,0) [0|15] "" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_AcceleratorPedalPosition : 31|10@0+ (0.1,0) [0|102.3] "" ACM,EPAS_P,ESP,RCM
+ SG_ VDM_VehicleSpeed : 47|16@0+ (0.01,0) [0|400] "Kph" ACM,EPAS_P,ESP,RCM
+
+BO_ 338 VDM_OutputSignals: 8 VDM
+ SG_ VDM_OutputSigs_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_OutputSigs_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_LfcRequestType : 13|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_LfcActiveRequest : 14|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_BrakeLightRequest : 15|1@0+ (1,0) [0|0] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_Lfc_BrakeTorqueRequest : 23|15@0+ (2,-65534) [-65534|0] "Nm" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_StcTorqueRequest : 39|11@0+ (0.0078125,-8) [-8|7.9921875] "Nm" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_StcFault : 43|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_StcActiveRequest : 44|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_EpbRequest : 49|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_ABSOffRoadModeRequest : 50|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_HhcActiveRequest : 51|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_EspPartialModeRequest : 53|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_SteeringModeRequest : 59|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM
+ SG_ VDM_EpasPowerMode : 61|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM
+
+BO_ 352 ACM_longitudinalRequest: 5 ACM
+ SG_ ACM_longitudinalRequest_Checksum : 7|8@0+ (1,0) [0|255] "-" VDM
+ SG_ ACM_longitudinalRequest_Counter : 11|4@0+ (1,0) [0|15] "-" VDM
+ SG_ ACM_AccelerationRequest : 23|11@0+ (0.01,-10.24) [-10.24|10.23] "m/s^2" VDM
+ SG_ ACM_PrndRequest : 27|4@0+ (1,0) [0|7] "" VDM
+ SG_ ACM_longInterfaceEnable : 37|2@0+ (1,0) [0|3] "" VDM
+ SG_ ACM_VehicleHoldRequest : 39|2@0+ (1,0) [0|3] "" VDM
+
+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_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
+ SG_ VDM_AdasUnkown1 : 50|8@0+ (1,0) [0|255] "" XXX
+ SG_ VDM_AdasInterfaceStatus : 52|2@0+ (1,0) [0|3] "" ACM
+ SG_ VDM_AdasVehicleHoldStatus : 55|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_UserAdasRequest : 58|3@0+ (1,0) [0|7] "" ACM
+
+BO_ 357 VDM_AdasStalk: 4 VDM
+ SG_ VDM_AdasStalk_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM
+ SG_ VDM_AdasStalk_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM
+ SG_ VDM_AdasStalkGapAdjust : 17|2@0+ (1,0) [0|3] "" ACM
+ SG_ VDM_AdasStalkAccCancelRes : 19|2@0+ (1,0) [0|3] "" ACM
+ SG_ VDM_AdasStalkAutonomyButton : 20|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AdasStalkAccEnableAdj : 23|3@0+ (1,0) [0|7] "" ACM
+
+BO_ 384 VDM_CGM_GW: 8 CGM
+ SG_ VDM_CGM_GW_Checksum : 7|8@0+ (1,0) [0|0] "" ESP,IBM
+ SG_ VDM_CGM_GW_Counter : 11|4@0+ (1,0) [0|0] "" ESP,IBM
+ SG_ CGM_TrailerPresent : 13|2@0+ (1,0) [0|3] "" ESP,IBM
+ SG_ CGM_DriverPresent : 15|2@0+ (1,0) [0|3] "" ESP,IBM
+ SG_ CGM_TimeSinceLastIgnitionOn : 23|16@0+ (1,0) [0|65535] "s" ESP,IBM
+ SG_ CGM_IgnSwtState : 35|4@0+ (1,0) [0|15] "" ESP,IBM
+
+BO_ 432 ESP_TorqueLimit_Front: 8 ESP
+ SG_ ESP_Torque_Front_Checksum : 7|8@0+ (1,0) [0|255] "" VDM
+ SG_ ESP_Torque_Front_Counter : 11|4@0+ (1,0) [0|15] "" VDM
+ SG_ ESP_Torque_Front_MinQ : 14|1@0+ (1,0) [0|1] "" VDM
+ SG_ ESP_Torque_Front_MaxQ : 15|1@0+ (1,0) [0|1] "" VDM
+ SG_ ESP_Torque_Front_Max : 23|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM
+ SG_ ESP_Torque_Front_Min : 39|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM
+
+BO_ 448 ESP_TorqueLimit_Rear: 8 ESP
+ SG_ ESP_Torque_Rear_Checksum : 7|8@0+ (1,0) [0|255] "" VDM
+ SG_ ESP_Torque_Rear_Counter : 11|4@0+ (1,0) [0|15] "" VDM
+ SG_ ESP_Torque_Rear_MinQ : 14|1@0+ (1,0) [0|1] "" VDM
+ SG_ ESP_Torque_Rear_MaxQ : 15|1@0+ (1,0) [0|1] "" VDM
+ 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_ 516 RCM_ALR_Status: 8 RCM
+ SG_ RCM_ALR_Status_Signal : 0|2@1+ (1,0) [0|3] "" OCS
+
+BO_ 520 ESP_Status: 8 ESP
+ SG_ ESP_Status_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Status_Counter : 11|4@0+ (1,0) [0|15] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_BrakeLightActive_Q : 12|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_BrakeLightActive : 13|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Hhc_Active : 14|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Hhc_Available : 15|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Abs_OffRoad_Mode : 16|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Tsm_Active : 17|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_FaultLamp_EBD : 18|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_FaultLamp_VDC : 19|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_FaultLamp_ABS : 20|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Esp_Active : 21|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Abs_Active : 23|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Partial_Mode : 25|2@0+ (1,0) [0|3] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Dtc_Active : 26|1@0+ (1,0) [0|1] "Enum" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Vehicle_Speed_Q : 28|2@0+ (1,0) [0|3] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Lfc_Available : 30|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Hba_Active : 31|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_BrkTrq : 38|15@0+ (2,-65534) [-65534|0] "Nm" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Lfc_Active : 39|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM
+ SG_ ESP_Vehicle_Speed : 55|16@0+ (0.01,0) [0|400] "kph" ACM,CGM,EPAS_P,RCM,VDM
+
+BO_ 521 ESP_WSpeed_Front: 8 ESP
+ SG_ ESP_WSpeed_Front_CRC : 7|8@0+ (1,0) [0|255] "" ACM,VDM
+ SG_ ESP_WSpeed_Front_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ ESP_Wheel_Speed_Left_Front_Q : 13|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Speed_Right_Front_Q : 15|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Speed_Left_Front : 23|16@0+ (0.01,0) [0|400] "kph" ACM,VDM
+ SG_ ESP_Wheel_Speed_Right_Front : 39|16@0+ (0.01,0) [0|400] "kph" ACM,VDM
+ SG_ ESP_Wheel_Dir_Right_Front : 53|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Dir_Left_Front : 55|2@0+ (1,0) [0|3] "" ACM,VDM
+
+BO_ 522 ESP_WSpeed_Rear: 8 ESP
+ SG_ ESP_WSpeed_Rear_CRC : 7|8@0+ (1,0) [0|255] "" ACM,VDM
+ SG_ ESP_WSpeed_Rear_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ ESP_Wheel_Speed_Left_Rear_Q : 13|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Speed_Right_Rear_Q : 15|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Speed_Left_Rear : 23|16@0+ (0.01,0) [0|400] "kph" ACM,VDM
+ SG_ ESP_Wheel_Speed_Right_Rear : 39|16@0+ (0.01,0) [0|400] "kph" ACM,VDM
+ SG_ ESP_Wheel_Dir_Right_Rear : 53|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Dir_Left_Rear : 55|2@0+ (1,0) [0|3] "" ACM,VDM
+
+BO_ 523 ESP_Wheel_Pulse_Veh: 8 ESP
+ SG_ ESP_Wheel_Pulse_CRC : 7|8@0+ (1,0) [0|255] "" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Left_Front : 23|8@0+ (1,0) [0|255] "Pulse" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Left_Rear : 31|8@0+ (1,0) [0|255] "Pulse" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Right_Front : 39|8@0+ (1,0) [0|255] "Pulse" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Right_Rear : 47|8@0+ (1,0) [0|255] "Pulse" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Right_Front_Q : 49|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Right_Rear_Q : 51|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Left_Rear_Q : 53|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_Wheel_Pulse_Left_Front_Q : 55|2@0+ (1,0) [0|3] "" ACM,VDM
+
+BO_ 524 ESP_Brake_Pressure: 8 ESP
+ SG_ ESP_BrakeP_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,RCM,VDM
+ SG_ ESP_BrakeP_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_RF_Q : 13|2@0+ (1,0) [0|3] "" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_LF_Q : 15|2@0+ (1,0) [0|3] "" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_LF : 23|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_LR : 31|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_RF : 39|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_RR : 47|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM
+ SG_ ESP_MasterCyl_Pressure : 55|10@0+ (0.25,0) [0|255] "bar" ACM,RCM,VDM
+ SG_ ESP_MasterCyl_Pressure_Q : 57|2@0+ (1,0) [0|3] "" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_RR_Q : 59|2@0+ (1,0) [0|3] "" ACM,RCM,VDM
+ SG_ ESP_BrakePressure_LR_Q : 61|2@0+ (1,0) [0|3] "" ACM,RCM,VDM
+
+BO_ 529 VDM_Torque_Front: 8 VDM
+ SG_ VDM_Torque_Front_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ESP
+ SG_ VDM_Torque_Front_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ESP
+ SG_ VDM_Torque_Front_Max : 23|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_Torque_Front_Min : 26|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_Torque_Front_MaxQ : 28|1@0+ (1,0) [0|1] "" ESP
+ SG_ VDM_OutputTorqueFront : 47|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_DriverIntendedTorqueFront : 50|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_OutputTorqueFrontQ : 51|1@0+ (1,0) [0|1] "" ESP
+ SG_ VDM_Torque_Front_MinQ : 52|1@0+ (1,0) [0|1] "" ESP
+
+BO_ 530 VDM_Torque_Rear: 8 VDM
+ SG_ VDM_Torque_Rear_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ESP
+ SG_ VDM_Torque_Rear_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ESP
+ SG_ VDM_Torque_Rear_Max : 23|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_Torque_Rear_Min : 26|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_Torque_Rear_MaxQ : 28|1@0+ (1,0) [0|1] "" ESP
+ SG_ VDM_OutputTorqueRear : 47|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_DriverIntendedTorque_Rear : 50|11@0+ (1,-1023) [-1023|1024] "Nm" ESP
+ SG_ VDM_OutputTorqueRearQ : 51|1@0+ (1,0) [0|1] "" ESP
+ SG_ VDM_Torque_Rear_MinQ : 52|1@0+ (1,0) [0|1] "" ESP
+
+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_ IgnitionOn : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ TurnLightRight : 54|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 592 VDM_EcasStatus: 8 VDM
+ SG_ VDM_EcasHeightFL : 7|8@0- (1,0) [-128|127] "mm" ACM
+ SG_ VDM_EcasHeightFR : 15|8@0- (1,0) [-128|127] "mm" ACM
+ 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_ 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
+ SG_ ESP_EpbAvailable : 12|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ ESP_EpbServiceMode : 13|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ ESP_EpbWarningLamp : 15|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ ESP_EpbMessageDisplayRequest : 20|5@0+ (1,0) [0|30] "" ACM,VDM
+ SG_ ESP_EpbStatus : 23|3@0+ (1,0) [0|7] "" ACM,VDM
+ SG_ ESP_EpbClampForce : 31|16@0+ (1,0) [0|65534] "N" ACM,VDM
+ SG_ ESP_EpbFunctionLamp : 47|2@0+ (1,0) [0|3] "" ACM,VDM
+
+BO_ 826 RCM_Status: 8 RCM
+ SG_ RCM_IMU_LongAcc_Checksum : 7|8@0+ (1,0) [0|25] "" ACM,ESP,VDM
+ SG_ RCM_IMU_LongAcc_MSG_Counter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM
+ SG_ RCM_Status_DETECT_CRUSH : 21|3@0+ (1,0) [0|7] "" ACM,ESP,VDM
+ SG_ RCM_Status_IND_WARN_RCM : 23|2@0+ (1,0) [0|3] "" ACM,ESP,VDM
+ SG_ RCM_Status_IND_ACT_RCM_PASS : 25|2@0+ (1,0) [0|3] "" ACM,ESP,VDM
+ SG_ RCM_Status_IND_WARN_BELT_DRIVER : 27|2@0+ (1,0) [0|3] "" ACM,ESP,VDM
+ SG_ RCM_Status_IND_WARN_BELT_PASS : 31|2@0+ (1,0) [0|3] "" ACM,ESP,VDM
+
+BO_ 848 EPASP_Status: 4 EPAS_P
+ SG_ EPAS_Ecu1Status_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,VDM
+ SG_ EPAS_Ecu1Status_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ EPAS_Ecu1EacSts : 14|3@0+ (1,0) [0|7] "" ACM,VDM
+ SG_ EPAS_Ecu1PowerMode : 18|3@0+ (1,0) [0|7] "" ACM,VDM
+ SG_ EPAS_Ecu1Role : 20|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ EPAS_Ecu1State : 31|4@0+ (1,0) [0|15] "" ACM,VDM
+
+BO_ 864 EPASS_Status: 4 VDM
+ SG_ EPASS_Ecu2Status_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,EPAS_P
+ SG_ EPASS_Ecu2Status_Counter : 11|4@0+ (1,0) [0|15] "" ACM,EPAS_P
+ SG_ EPAS_Ecu2EacSts : 14|3@0+ (1,0) [0|7] "" ACM,EPAS_P
+ SG_ EPAS_Ecu2PowerMode : 18|3@0+ (1,0) [0|7] "" ACM,EPAS_P
+ SG_ EPASS_Ecu2Role : 20|2@0+ (1,0) [0|3] "" ACM,EPAS_P
+ SG_ EPASS_Ecu2State : 31|4@0+ (1,0) [0|15] "" ACM,EPAS_P
+
+BO_ 880 ACM_tsrCmd: 8 ACM
+ SG_ ACM_tsrCmd_Checksum : 7|8@0+ (1,0) [0|0] "" Vector_XXX
+ SG_ ACM_tsrCmd_Counter : 11|4@0+ (1,0) [0|15] "" Vector_XXX
+ SG_ ACM_tsrConInfoStaCon2 : 19|4@0+ (1,0) [0|15] "" Vector_XXX
+ SG_ ACM_tsrConInfoStaCon1 : 23|4@0+ (1,0) [0|15] "" Vector_XXX
+ SG_ ACM_tsrSpdDisClsMain : 31|8@0+ (1,0) [0|255] "" Vector_XXX
+ SG_ ACM_tsrSpdDisCluCon1 : 39|8@0+ (1,0) [0|255] "" Vector_XXX
+ SG_ ACM_tsrSpdDisCluCon2 : 47|8@0+ (1,0) [0|255] "" Vector_XXX
+ SG_ ACM_tsrSpdDisCluConM : 55|8@0+ (1,0) [0|255] "" Vector_XXX
+ SG_ ACM_tsrAddInfoDisplay : 59|2@0+ (1,0) [0|3] "" Vector_XXX
+ SG_ ACM_tsrOvrlapSignDis : 61|2@0+ (1,0) [0|3] "" Vector_XXX
+ SG_ ACM_tsrStatus : 63|2@0+ (1,0) [0|3] "" Vector_XXX
+
+BO_ 896 EPAS_SystemStatus: 5 EPAS_P
+ SG_ EPAS_SytemStatus_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,VDM
+ SG_ EPAS_SystemStatus_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ EPAS_SteeringReduced : 12|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ EPAS_SteeringFault : 13|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ EPAS_SteeringMode : 15|2@0+ (1,0) [0|3] "" ACM,VDM
+ SG_ EPAS_TorsionBarTorque : 23|12@0+ (0.01,-20.5) [-20.49|20.43] "" ACM,VDM
+ SG_ EPAS_StcFault : 32|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ EPAS_StcActive : 33|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ EPAS_StcUnavailable : 34|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ H_CAN_EPSS_ToiFlt : 35|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ H_CAN_EPSS_ToiActive : 36|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ H_CAN_EPS_ToiUnavailable : 37|1@0+ (1,0) [0|1] "" ACM,VDM
+ SG_ EPAS_HandsOnLevel : 39|2@0+ (1,0) [0|3] "" ACM,VDM
+
+BO_ 907 ESPiB1: 6 ESP
+ SG_ ESPiB1_Checksum : 7|8@0+ (1,0) [0|255] "" IBM
+ SG_ ESPiB1_AliveCounter : 11|4@0+ (1,0) [0|15] "" IBM
+ SG_ ESPiB1_IgnitionOn : 12|1@0+ (1,0) [0|1] "" IBM
+ SG_ ESPiB1_VehicleSpeed_Q : 15|2@0+ (1,0) [0|3] "" IBM
+ SG_ ESPiB1_VehicleSpeed : 23|8@0+ (0.4,0) [0|100] "m/s" IBM
+
+BO_ 908 ESPiB2: 4 ESP
+ SG_ ESPiB2_Checksum : 7|8@0+ (1,0) [0|255] "" IBM
+ SG_ ESPiB2_Alive_Counter : 11|4@0+ (1,0) [0|15] "" IBM
+ SG_ ESPiB2_qTargetExternal_Q : 15|2@0+ (1,0) [0|3] "" IBM
+ SG_ ESPiB2_qTargetExternal : 23|16@0+ (0.0078125,-252) [-252|252] "ml/s" IBM
+
+BO_ 909 ESPiB3: 7 ESP
+ SG_ ESPiB3_Checksum : 7|8@0+ (1,0) [0|255] "" IBM
+ SG_ ESPiB3_AliveCounter : 11|4@0+ (1,0) [0|15] "" IBM
+ SG_ ESPiB3_ABSActive : 12|1@0+ (1,0) [0|1] "" IBM
+ SG_ ESPiB3_ForceBlendingActive : 15|2@0+ (1,0) [0|3] "" IBM
+ SG_ ESPiB3_pMcVirtual : 23|10@0+ (0.25,0) [0|250] "bar" IBM
+ SG_ ESPiB3_pMcVirtual_Q : 29|2@0+ (1,0) [0|3] "" IBM
+ SG_ ESPiB3_pForceBlendingMC : 39|10@0+ (0.25,0) [0|250] "" IBM
+ SG_ ESPiB3_pMC1 : 43|10@0+ (0.3,-30) [-30|276.6] "bar" IBM
+ SG_ ESPiB3_pForceBlendingMC_Q : 45|2@0+ (1,0) [0|3] "" IBM
+ SG_ ESPiB3_pMC1_Q : 49|2@0+ (1,0) [0|3] "" IBM
+
+BO_ 910 iBESP1: 7 IBM
+ SG_ iBESP1_Checksum : 7|8@0+ (1,0) [0|255] "" ESP,VDM
+ SG_ iBESP1_AliveCounter : 11|4@0+ (1,0) [0|15] "" ESP,VDM
+ SG_ iBESP1_ExtReqPrio : 12|1@0+ (1,0) [0|1] "" ESP,VDM
+ SG_ iBESP1_ExtReqStatus : 15|3@0+ (1,0) [0|7] "" ESP,VDM
+ SG_ iBESP1_sOutputRodDriver : 23|12@0+ (0.015625,-5) [-5|47] "mm" ESP,VDM
+ SG_ iBESP1_sOutputRodDriver_Q : 27|2@0+ (1,0) [0|3] "" ESP,VDM
+ SG_ iBESP1_sOutputRodAct : 39|12@0+ (0.015625,-5) [-5|47] "mm" ESP,VDM
+ SG_ iBESP1_sOutputRodAct_Q : 43|2@0+ (1,0) [0|3] "" ESP,VDM
+
+BO_ 911 iBESP2: 6 IBM
+ SG_ iBESP2_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,ESP,VDM
+ SG_ iBESP2_AliveCounter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM
+ SG_ iBESP2_CompatibilityIndex : 15|4@0+ (1,0) [0|15] "" ACM,ESP,VDM
+ SG_ iBESP2_pRunout_Q : 17|2@0+ (1,0) [0|3] "" ACM,ESP,VDM
+ SG_ iBESP2_iBDiagActive : 19|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ iBESP2_HbcRequest : 20|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ iBESP2_BrakePedalApplied_Q : 22|2@0+ (1,0) [0|3] "" ACM,ESP,VDM
+ SG_ iBESP2_BrakePedalApplied : 23|1@0+ (1,0) [0|1] "" ACM,ESP,VDM
+ SG_ iBESP2_pRunout : 31|8@0+ (1,0) [0|250] "bar" ACM,ESP,VDM
+ SG_ iBESP2_RprMode : 39|3@0+ (1,0) [0|7] "" ACM,ESP,VDM
+
+BO_ 912 EPAS_AdasStatus: 7 EPAS_P
+ SG_ EPAS_AdasStatus_Checksum : 7|8@0+ (1,0) [0|0] "" ACM,VDM
+ SG_ EPAS_AdasStatus_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ EPAS_SteeringAngleSpeed : 23|14@0+ (0.1,-819) [-819|819.3] "deg/s" ACM,VDM
+ SG_ EPAS_EacStatus : 35|3@0+ (1,0) [0|7] "" ACM,VDM
+ SG_ EPAS_EacErrorCode : 39|4@0+ (1,0) [0|15] "" ACM,VDM
+ SG_ EPAS_InternalSas : 47|14@0+ (0.1,-819.2) [-819.2|819] "deg" ACM,VDM
+ SG_ EPAS_InternalSasQ : 49|1@0+ (1,0) [0|1] "" ACM,VDM
+
+BO_ 929 VDM_ModSw_DrvModPosSts_GW: 8 VDM
+ SG_ VDM_AchDriveModeRequestConfirm : 0|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AchDriveModeRequestPullRearw : 1|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AchDriveModeRequestPushDown : 2|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AchDriveModeRequestPushForwa : 3|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AchDriveModeRequestPushUp : 4|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AchDriveModeRequestRest : 5|1@0+ (1,0) [0|1] "" ACM
+ SG_ VDM_AchDriveMode4x4 : 20|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveMode : 23|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeAirSuspension : 28|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeAbs : 31|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeDrivability : 36|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeDamping : 39|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeRollControl : 44|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeEsp : 47|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeEpas : 52|3@0+ (1,0) [0|7] "" ACM
+ SG_ VDM_AchDriveModeTcs : 55|3@0+ (1,0) [0|7] "" ACM
+
+BO_ 1024 VehicleConfig: 7 CGM
+ SG_ VCM_VehicleType : 7|8@0+ (1,0) [0|255] "" ACM,ESP
+ SG_ VCM_HandOfDrive : 9|1@0+ (1,0) [0|1] "" ACM,ESP
+ SG_ VCM_BatterySize : 15|6@0+ (1,0) [0|63] "" ACM,ESP
+ SG_ VCM_Market : 23|8@0+ (1,0) [0|255] "" ACM,ESP
+
+BO_ 1265 Cluster: 6 XXX
+ SG_ Cluster_Unit : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cluster_VehicleSpeed : 15|8@0+ (1,0) [0|255] "mph" XXX
+ SG_ Cluster_Odometer : 23|32@0+ (0.1,0) [0|429496729.5] "" XXX
+
+BO_ 1280 RCM_Dtc: 8 RCM
+ SG_ RCM_Dtc_Checksum : 7|8@0+ (1,0) [0|25] "" VDM
+ SG_ RCM_Dtc_Counter : 11|4@0+ (1,0) [0|15] "" VDM
+ SG_ RCM_Dtc_HighByte : 23|8@0+ (1,0) [0|255] "" VDM
+ SG_ RCM_Dtc_MidByte : 31|8@0+ (1,0) [0|255] "" VDM
+ SG_ RCM_Dtc_LowByte : 39|8@0+ (1,0) [0|255] "" VDM
+ SG_ RCM_Dtc_Stat_Bit : 47|8@0+ (1,0) [0|255] "" VDM
+ SG_ RCM_Dtc_Number : 55|8@0+ (1,0) [0|255] "" VDM
+
+BO_ 1281 RCM_SerialIdentifier: 8 RCM
+ SG_ RCM_SerialNumber : 7|64@0+ (1,0) [0|1.84467440737096e+19] "" ESP,VDM
+
+BO_ 1328 Dummy_ACM_PrimaryActuatorCAN: 8 ACM
+ SG_ Dummy_ACM_PrimaryActuatorCAN : 7|8@0+ (1,0) [0|255] "" TestTool
+
+BO_ 1329 Dummy_CGM_PrimaryActuatorCAN: 1 CGM
+ SG_ Dummy_CGM_PrimaryActuatorCAN : 7|8@0+ (1,0) [0|255] "" TestTool
+
+BO_ 1330 Dummy_VDM_PrimaryActuatorCAN: 1 VDM
+ SG_ Dummy_VDM_PrimaryActuatorCAN : 7|8@0+ (1,0) [0|255] "" TestTool
+
+BO_ 1535 DoorStatus: 8 XXX
+ SG_ DoorOpen : 8|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1545 XCP_Cmd_VDM: 8 TestTool
+
+BO_ 1609 XCP_Resp_VDM: 8 VDM
+
+BO_ 1635 XCP_Cmd_EPAS_P: 8 TestTool
+
+BO_ 1636 XCP_Daq_EPAS_P: 8 EPAS_P
+
+BO_ 1637 XCP_Resp_EPAS_P: 8 EPAS_P
+
+BO_ 1640 OCS_PassSeatInfo: 8 OCS
+ SG_ OCS_Checksum : 0|8@1+ (1,0) [0|255] "-" RCM
+ SG_ OCS_Counter : 8|4@1+ (1,0) [0|15] "-" RCM
+ SG_ OCS_FrontPassClass : 16|4@1+ (1,0) [0|15] "" RCM
+ SG_ OCS_FrontPassClassValid : 20|1@1+ (1,0) [0|1] "" RCM
+ SG_ OCS_FrontPassFaultStatus : 21|2@1+ (1,0) [0|3] "" RCM
+ SG_ OCS_Reserved_1 : 23|1@1+ (1,0) [0|1] "" RCM
+ SG_ OCS_FrontPassSBRStatus : 24|4@1+ (1,0) [0|15] "" RCM
+ SG_ OCS_OperatingMode : 28|4@1+ (1,0) [0|15] "" RCM
+ SG_ OCS_Reserved_2 : 56|8@1+ (1,0) [0|255] "" RCM
+
+BO_ 1705 XCP_Daq_VDM: 8 VDM
+
+BO_ 1800 Diag_PhysReq_ACM_PrimaryActuator: 8 TestTool
+
+BO_ 1843 Diag_PhysReq_EPAS_P_PrimaryActua: 8 TestTool
+
+BO_ 1844 Diag_PhysReq_RCM_PrimaryActuator: 8 TestTool
+
+BO_ 1845 Diag_PhysReq_ESP_PrimaryActuator: 8 TestTool
+
+BO_ 1846 Diag_PhysReq_IBM_PrimaryActuator: 8 TestTool
+
+BO_ 1864 Diag_PhysResp_ACM_PrimaryActuato: 8 ACM
+
+BO_ 1907 Diag_PhysResp_EPAS_P_PrimaryActu: 8 EPAS_P
+
+BO_ 1908 Diag_PhysResp_RCM_PrimaryActuato: 8 RCM
+
+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";
+CM_ SG_ 64 SAS_Status_AngleSpeedSafe "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. Steering angle speed with steering wheel rotation direction. Turning the steering wheel left (counterclockwise) is represented by positive values and";
+CM_ SG_ 64 SAS_StatusQ "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. Qf for steering wheel sensor information";
+CM_ SG_ 256 ACM_Status_Checksum "Checksum signal for frame";
+CM_ SG_ 256 ACM_Status_Counter "Message counter signal for frame";
+CM_ SG_ 256 ACM_FeatureStatus "Current active ADAS feature";
+CM_ SG_ 256 ACM_FaultStatus "Reason for ACM fault";
+CM_ SG_ 257 ACM_AebRequest_Checksum "J1850";
+CM_ SG_ 257 ACM_AebRequest_Counter "Message Counter";
+CM_ SG_ 257 ACM_StopRequest "AEB Stop Request subsequent to AEB event";
+CM_ SG_ 257 ACM_FailInfo "AEB System Failure flags";
+CM_ SG_ 257 ACM_DbsLevel "Dynamic Braking Support (DBS) Level";
+CM_ SG_ 257 ACM_OnOffStatus "AEB System On/Off Status";
+CM_ SG_ 257 ACM_DecelRequest "AEB Target Deceleration command";
+CM_ SG_ 257 ACM_WarnLevel "AEB Warning Level";
+CM_ SG_ 257 ACM_PrefillEnableRequest "AEB Pre-fill Enable Request";
+CM_ SG_ 257 ACM_EnableRequest "AEB Enable Request";
+CM_ SG_ 258 ESP_AebFeedback_Checksum "J1850 Checksum";
+CM_ SG_ 258 ESP_AebFeedback_Counter "Message Counter";
+CM_ SG_ 258 iB_BrakePedalApplied_Q "Description: Qualifier for iBESP2_BrakePedalApplied signal";
+CM_ SG_ 258 iB_BrakePedalApplied "Description: Indicates whether the driver operates the brake pedal. Only active when the driver brakes, not when an external brake command implemented on iB
+
+Note:
+1.Needed for HBB and HBC
+
+2. Monitoring for pMC (BSM)";
+CM_ SG_ 258 ESP_DecelFeedback "AEB Decel Feedback";
+CM_ SG_ 258 ESP_AebActive "AEB Active";
+CM_ SG_ 258 ESP_AebAvailable "AEB Available";
+CM_ SG_ 258 ESP_DbsActive "DBS Active";
+CM_ SG_ 258 ESP_PrefillActiveFeedback "Prefill Active Feedback";
+CM_ BO_ 272 "External steering angle control message for EPAS.";
+CM_ SG_ 272 ACM_SteeringControl_Checksum "Checksum for DAS_steeringControl message. Refer to AUTOSAR E2E library Profile 1.";
+CM_ SG_ 272 ACM_SteeringControl_Counter "Message counter for DAS_steeringControl message. It counts from 0 to 14 and rolls back to 0 after reaching14. Refer to AUTOSAR E2E library Profile 1.";
+CM_ SG_ 272 ACM_EacEnabled "External angle control type for EPAS.";
+CM_ SG_ 272 ACM_HapticRequired "External angle control type for EPAS.";
+CM_ SG_ 272 ACM_SteeringAngleRequest "External angle control request for EPAS";
+CM_ SG_ 304 RCM_IMU_LatAcc "Inertial Measurement Unit Lateral Acceleration Primary";
+CM_ SG_ 320 RCM_IMU_LongAcc_Sig "Inertial Measurement Unit Longitudinal Accleration Primary";
+CM_ SG_ 338 VDM_EpbRequest "Apply and release request (EVIC, Shift to From Park/Stalk Switch Input)";
+CM_ SG_ 338 VDM_EpasPowerMode "EPAS power mode request.";
+CM_ SG_ 352 ACM_longitudinalRequest_Checksum "Checksum signal for frame";
+CM_ SG_ 352 ACM_longitudinalRequest_Counter "Message counter signal for frame";
+CM_ SG_ 352 ACM_AccelerationRequest "Acceleration Request command from the ACM";
+CM_ SG_ 352 ACM_VehicleHoldRequired "Vehicle hold request flag";
+CM_ SG_ 352 ACM_PrndRequest "Gear state Request command from the ACM";
+CM_ SG_ 352 ACM_longInterfaceEnable "Acceleration Interface Enable Request from the ACM";
+CM_ SG_ 352 ACM_VehicleHoldRequest "Vehicle hold request from ACM";
+CM_ SG_ 354 VDM_AdasStatus_Checksum "VDM_AdasSts message j1850 checksum.";
+CM_ SG_ 354 VDM_AdasStatus_Counter "VDM_AdasSts message counter.";
+CM_ SG_ 354 VDM_AdasFaultStatus "Fault status of ADAS requests from VDM.";
+CM_ SG_ 354 VDM_AdasDriverModeStatus "Signal which describes who is commanding the torque - Human or ADAS";
+CM_ SG_ 432 ESP_Torque_Front_MinQ "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 432 ESP_Torque_Front_MaxQ "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 432 ESP_Torque_Front_Max "ESP intervention, ESP tractive torque limit per axle.";
+CM_ SG_ 432 ESP_Torque_Front_Min "ESP intervention, ESP regen torque limit per axle.";
+CM_ SG_ 448 ESP_Torque_Rear_Checksum "J1850 Checksum";
+CM_ SG_ 448 ESP_Torque_Rear_Counter "Message Counter";
+CM_ SG_ 448 ESP_Torque_Rear_MinQ "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 448 ESP_Torque_Rear_MaxQ "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 448 ESP_Torque_Rear_Max "ESP intervention, ESP tractive torque limit per axle.";
+CM_ SG_ 448 ESP_Torque_Rear_Min "ESP intervention, ESP regen torque limit per axle.";
+CM_ SG_ 520 ESP_Status_Checksum "J1850 Checksum";
+CM_ SG_ 520 ESP_Status_Counter "Message Counter";
+CM_ SG_ 520 ESP_BrakeLightActive_Q "Indication of whether ESP_BrakeLightActive signal is valid";
+CM_ SG_ 520 ESP_BrakeLightActive "ESP Request to Activate Rear Brake Lamps";
+CM_ SG_ 520 ESP_Hhc_Active "HHC Active";
+CM_ SG_ 520 ESP_Hhc_Available "HHC Available";
+CM_ SG_ 520 ESP_Tsm_Active "Trailer Sway Mitigation Active Flag";
+CM_ SG_ 520 ESP_FaultLamp_EBD "ESP request to display ABS-TC Fault Lamp";
+CM_ SG_ 520 ESP_FaultLamp_VDC "ESP request to display ABS/ESP Fault Lamp";
+CM_ SG_ 520 ESP_FaultLamp_ABS "ESP request to display ABS Fault Lamp";
+CM_ SG_ 520 ESP_Esp_Active "Vehicle Stability Control is actively managing a stability event";
+CM_ SG_ 520 ESP_Abs_Active "Anti-Lock Brakes is actively working to prevent the brakes from locking up";
+CM_ SG_ 520 ESP_Partial_Mode "ESP current PATA mode";
+CM_ SG_ 520 ESP_Dtc_Active "Drag Torque Control is actively requesting torque.";
+CM_ SG_ 520 ESP_Vehicle_Speed_Q "Indication of whether ESP_VehicleSpeed signal is valid";
+CM_ SG_ 520 ESP_Lfc_Available "LFC Available";
+CM_ SG_ 520 ESP_Hba_Active "HBA Active";
+CM_ SG_ 520 ESP_BrkTrq "ESP Brake Torque";
+CM_ SG_ 520 ESP_Lfc_Active "LFC Active";
+CM_ SG_ 520 ESP_Vehicle_Speed "ESP calculated vehicle speed. Average of front wheels on rear wheel drive vehicles. Average of all four wheels on dual motor vehicles.";
+CM_ SG_ 521 ESP_WSpeed_Front_CRC "J1850 Checksum";
+CM_ SG_ 521 ESP_WSpeed_Front_Message_Counter "Message Counter";
+CM_ SG_ 521 ESP_Wheel_Speed_Left_Front_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 521 ESP_Wheel_Speed_Right_Front_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 521 ESP_Wheel_Speed_Left_Front "Wheel Speed Left Front";
+CM_ SG_ 521 ESP_Wheel_Speed_Right_Front "Wheel Speed Right Front";
+CM_ SG_ 521 ESP_Wheel_Dir_Right_Front "Wheel Rotation Direction Right Front";
+CM_ SG_ 521 ESP_Wheel_Dir_Left_Front "Wheel Rotation Direction Left Front";
+CM_ SG_ 522 ESP_WSpeed_Rear_CRC "J1850 Checksum";
+CM_ SG_ 522 ESP_WSpeed_Rear_Message_Counter "Message Counter";
+CM_ SG_ 522 ESP_Wheel_Speed_Left_Rear_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 522 ESP_Wheel_Speed_Right_Rear_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 522 ESP_Wheel_Speed_Left_Rear "Wheel Speed Left Rear";
+CM_ SG_ 522 ESP_Wheel_Speed_Right_Rear "Wheel Speed Right Rear";
+CM_ SG_ 522 ESP_Wheel_Dir_Right_Rear "Wheel Rotation Direction Right Rear";
+CM_ SG_ 522 ESP_Wheel_Dir_Left_Rear "Wheel Rotation Direction Left Rear";
+CM_ SG_ 523 ESP_Wheel_Pulse_CRC "J1850 Checksum";
+CM_ SG_ 523 ESP_Wheel_Pulse_Message_Counter "Message Counter";
+CM_ SG_ 523 ESP_Wheel_Pulse_Left_Front "Wheel Pulse Left Front";
+CM_ SG_ 523 ESP_Wheel_Pulse_Left_Rear "Wheel Pule Left Rear";
+CM_ SG_ 523 ESP_Wheel_Pulse_Right_Front "Wheel Pulse Right Front";
+CM_ SG_ 523 ESP_Wheel_Pulse_Right_Rear "Wheel Pulse Right Rear";
+CM_ SG_ 523 ESP_Wheel_Pulse_Right_Front_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 523 ESP_Wheel_Pulse_Right_Rear_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 523 ESP_Wheel_Pulse_Left_Rear_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 523 ESP_Wheel_Pulse_Left_Front_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 524 ESP_BrakeP_Checksum "J1850 Checksum";
+CM_ SG_ 524 ESP_BrakeP_Message_Counter "Message Counter";
+CM_ SG_ 524 ESP_BrakePressure_RF_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 524 ESP_BrakePressure_LF_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 524 ESP_BrakePressure_LF "Brake Pressure Left Front";
+CM_ SG_ 524 ESP_BrakePressure_LR "Brake Pressure Left Rear";
+CM_ SG_ 524 ESP_BrakePressure_RF "Brake Pressure Right Front";
+CM_ SG_ 524 ESP_BrakePressure_RR "Brake Pressure Right Rear";
+CM_ SG_ 524 ESP_MasterCyl_Pressure "Master Cylinder Brake Pressure";
+CM_ SG_ 524 ESP_MasterCyl_Pressure_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 524 ESP_BrakePressure_RR_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 524 ESP_BrakePressure_LR_Q "Indication of whether signal with corresponding name is valid";
+CM_ SG_ 529 VDM_OutputTorqueFront "Output torque which is currently provided by the electric machine";
+CM_ SG_ 529 VDM_DriverIntendedTorqueFront "Driver Requested Torque pre ESP limits being applied";
+CM_ SG_ 530 VDM_OutputTorqueRear "Output torque which is currently provided by the electric machine";
+CM_ SG_ 530 VDM_DriverIntendedTorque_Rear "Driver Requested Torque pre ESP limits being applied";
+CM_ SG_ 592 VDM_EcasHeightFL "Change in ride height, with zero referenced to normal/design ride height";
+CM_ SG_ 592 VDM_EcasHeightFR "Change in ride height, with zero referenced to normal/design ride height";
+CM_ SG_ 592 VDM_EcasHeightRL "Change in ride height, with zero referenced to normal/design ride height";
+CM_ SG_ 592 VDM_EcasHeightRR "Change in ride height, with zero referenced to normal/design ride height";
+CM_ SG_ 811 ESP_EpbStatus_Checksum "J1850 Checksum";
+CM_ SG_ 811 ESP_EpbStatus_Counter "Message Counter";
+CM_ SG_ 811 ESP_EpbAvailable "EPB Availability. Shows the availability of the EPB function.";
+CM_ SG_ 811 ESP_EpbServiceMode "Indication whether EPB is in service mode.";
+CM_ SG_ 811 ESP_EpbWarningLamp "Failure Driver Lamp indication for EPB.";
+CM_ SG_ 811 ESP_EpbMessageDisplayRequest "EPB text message";
+CM_ SG_ 811 ESP_EpbStatus "Current EPB actuator state.";
+CM_ SG_ 811 ESP_EpbClampForce "Currently applied clamp force of EPB.";
+CM_ SG_ 811 ESP_EpbFunctionLamp "Driver Lamp indication for EPB (LED on button).";
+CM_ BO_ 848 "Forwarded Message from EPAS Primary to Secondary ECU via Public CAN.";
+CM_ BO_ 864 "Forwarded Message from EPAS Secondary to Primary ECU via Public CAN .";
+CM_ BO_ 896 "EPAS status info.";
+CM_ SG_ 896 EPAS_SytemStatus_Checksum "Checksum for EPAS_sysStatus message. Refer to AUTOSAR E2E library Profile 1.";
+CM_ SG_ 896 EPAS_SystemStatus_Counter "Message counter for EPAS_sysStatus message. It counts from 0 to 14 and rolls back to 0 after reaching14. Refer to AUTOSAR E2E library Profile 1.";
+CM_ SG_ 896 EPAS_SteeringReduced "Power steering is functional, but reduced.";
+CM_ SG_ 896 EPAS_SteeringFault "Power steering is not-available.";
+CM_ SG_ 896 EPAS_SteeringMode "ESP current PATA mode";
+CM_ BO_ 907 "Basic communication ESP iBooster";
+CM_ SG_ 907 ESPiB1_Checksum "J1850 Checksum";
+CM_ SG_ 907 ESPiB1_AliveCounter "Message Counter";
+CM_ SG_ 907 ESPiB1_IgnitionOn "Description: Indicates whether the key is turned or not in the car
+
+Note: Used in PostRun calculation in iBooster";
+CM_ SG_ 907 ESPiB1_VehicleSpeed_Q "Description: Qualifier of the signal : ESPiB1_VehicleSpeed_Q
+
+Note: Robert Bosch Standard qualifier";
+CM_ SG_ 907 ESPiB1_VehicleSpeed "Description: Averaged wheel speed (signal in m/s on CAN but monitored in km/h in dbc)
+
+Note:
+for standstill detection in iBooster
+
+1. For HEV function in iBoosterhev
+
+2. For EBR
+3. Logic for Pressure Reduction";
+CM_ SG_ 908 ESPiB2_Checksum "J1850 Checksum";
+CM_ SG_ 908 ESPiB2_Alive_Counter "Message Counter";
+CM_ SG_ 908 ESPiB2_qTargetExternal_Q "Description: Qualifier for the volume flow interface
+
+Note: Qualifier for the volume flow interface";
+CM_ SG_ 908 ESPiB2_qTargetExternal "Description: Target flow of the brake system to be applied by iBooster for EBR.
+
+Note: For EBR through iBooster, interface needs to be operated together with ESPiB_pTargetExternal.";
+CM_ BO_ 909 "Extended communication ESP iBooster";
+CM_ SG_ 909 ESPiB3_Checksum "J1850 Checksum";
+CM_ SG_ 909 ESPiB3_AliveCounter "Message Counter";
+CM_ SG_ 909 ESPiB3_ABSActive "Description: Indicates that at least one wheel ABS is in control
+
+Note:
+1. For ABS pressure limitation
+
+2. For HEV function";
+CM_ SG_ 909 ESPiB3_ForceBlendingActive "Description: Control state of force-blending interface
+
+Note: Used by PFC in iB";
+CM_ SG_ 909 ESPiB3_pMcVirtual "Description: Virtual master cylinder pressure determined in ESP from boost body position of iBooster.
+
+note:
+1. to control the force-blending of recuperation in ESPhev.
+2. For JumpIn/Gain Adjustment in iBooster";
+CM_ SG_ 909 ESPiB3_pMcVirtual_Q "Description: Qualifier for the ESPiB3_pMcVirtual_Q signal";
+CM_ SG_ 909 ESPiB3_pForceBlendingMC "Description : Master Cylinder pressure used by force blending function. Can differ from real master cylinder pressure, to avoid short peaks and disturbances which should not be compensated by force-blending
+
+Note: Used by PFC in iB";
+CM_ SG_ 909 ESPiB3_pMC1 "Description: Current pressure of the master cylinder pressure sensor in the ESP. Raw value without offset compensation.
+
+
+Note:
+1. For pressure reduction logic
+
+2. For HEV Function
+
+3. For EBR
+
+4. For runout definition";
+CM_ SG_ 909 ESPiB3_pForceBlendingMC_Q "Description: Qualifier for the ESPiB3_pForceBlendingMC";
+CM_ SG_ 909 ESPiB3_pMC1_Q "Description: Qualifier for ESPiB3_pMC1_Q signal";
+CM_ SG_ 910 iBESP1_ExtReqPrio "To determine driver's braking request for EBR together with sPushRod, eg for CDD";
+CM_ SG_ 910 iBESP1_ExtReqStatus "Status of external brake request (EBR) function";
+CM_ SG_ 910 iBESP1_sOutputRodDriver "Information of driver brake request.
+Calculation of:
+- target value for output rod in iBooster
+Also shows pedal travel with active pressure increase via iBooster";
+CM_ SG_ 910 iBESP1_sOutputRodDriver_Q "Information about the signal quality of sOutputRodDriver";
+CM_ SG_ 910 iBESP1_sOutputRodAct "Current value for output rod in iBooster indicates the shifted volume in master cylinder. Gives information, if the compensation port is closed.";
+CM_ SG_ 910 iBESP1_sOutputRodAct_Q "Information about the signal quality of sOutputRodAct";
+CM_ SG_ 911 iBESP2_CompatibilityIndex "Description: iB is sending an static number which which must fit to the same number monitored in ESP to ensure the compatibility of the two ECU.";
+CM_ SG_ 911 iBESP2_pRunout_Q "Description: Qualifier for the iBESP2_pRunout signal";
+CM_ SG_ 911 iBESP2_iBDiagActive "iB is in extended Diag Session (iB_ActiveMode = Diagnosis)";
+CM_ SG_ 911 iBESP2_HbcRequest "request HBC if amplification of iB is not possible";
+CM_ SG_ 911 iBESP2_BrakePedalApplied_Q "Description: Qualifier for iBESP2_BrakePedalApplied signal";
+CM_ SG_ 911 iBESP2_BrakePedalApplied "Description: Indicates whether the driver operates the brake pedal. Only active when the driver brakes, not when an external brake command implemented on iB
+
+Note:
+1.Needed for HBB and HBC
+
+2. Monitoring for pMC (BSM)";
+CM_ SG_ 911 iBESP2_pRunout "Description: In driver braking: maximum achievable master cylinder pressure with boost (runout.)
+With an active pressure increase: maximum achievable brake master cylinder pressure.
+
+Note:
+1. Required for HBB
+
+2. For LDM demand on iB (EBR)";
+CM_ SG_ 912 EPAS_EacStatus "Status of the EAC function of EPAS, to indicate what mode is active.";
+CM_ SG_ 912 EPAS_EacErrorCode "EPAS external angle control error code.";
+CM_ SG_ 912 EPAS_InternalSas "Steering wheel angle measured by EPAS";
+CM_ SG_ 912 EPAS_InternalSasQ "Steering angle sensor validity status";
+CM_ SG_ 1640 OCS_Checksum "Checksum signal for frame";
+VAL_ 64 SAS_Status_Calibrated 0 "SAS_Status_Calibrated_Not_Calibrated" 1 "SAS_Status_Calibrated_Calibrated";
+VAL_ 64 SAS_StatusQ 0 "SAS_Status_UndefinedDataACCur" 1 "SAS_Status_TmpUnDefinedData" 2 "SAS_Status_DataACCurrentNotWithinSpecification" 3 "SAS_Status_ACCurrentData";
+VAL_ 256 ACM_FeatureStatus 0 "ACM_FeatureStatus_Standby" 1 "ACM_FeatureStatus_Acc" 2 "ACM_FeatureStatus_Hwp" 3 "ACM_FeatureStatus_Uf" 4 "ACM_FeatureStatus_Faulted";
+VAL_ 256 ACM_FaultStatus 0 "ACM_FaultStatus_NoFault" 1 "ACM_FaultStatus_Faulted" 7 "ACM_FaultStatus_Sna";
+VAL_ 256 ACM_FaultSupervisorState 0 "Nominal_Operation" 1 "SS_1" 2 "SS_2" 3 "SS_3" 4 "SS_4" 5 "SS_5" 6 "SS_6" 7 "Reserved";
+VAL_ 257 ACM_StopRequest 0 "ACM_StopRequest_No_Request" 1 "ACM_StopRequest_Request";
+VAL_ 257 ACM_FailInfo 0 "ACM_FailInfo_Normal" 1 "ACM_FailInfo_Temp_Unav_By_Camera" 2 "ACM_FailInfo_Temp_Unav_By_Radar" 3 "ACM_FailInfo_Service_Required";
+VAL_ 257 ACM_DbsLevel 0 "ACM_DbsLevel_No_Activation" 1 "ACM_DbsLevel_Level_1" 2 "ACM_DbsLevel_Level_2" 3 "ACM_DbsLevel_Level_3";
+VAL_ 257 ACM_OnOffStatus 0 "ACM_OnOffStatus_Off" 1 "ACM_OnOffStatus_On_Fcw" 2 "ACM_OnOffStatus_On_Aeb" 3 "ACM_OnOffStatus_Invalid";
+VAL_ 257 ACM_WarnLevel 0 "ACM_WarnLevel_No_Warning" 1 "ACM_WarnLevel_Warning_Level_1" 2 "ACM_WarnLevel_Warning_Level_2" 3 "ACM_WarnLevel_Warning_Level_3";
+VAL_ 257 ACM_PrefillEnableRequest 0 "ACM_PrefillEnableRequest_Disable" 1 "ACM_PrefillEnableRequest_Enable";
+VAL_ 257 ACM_EnableRequest 0 "ACM_EnableRequest_Disable" 1 "ACM_EnableRequest_Enable";
+VAL_ 258 iB_BrakePedalApplied_Q 0 "iB_BrakePedalApplied_Q_No_Init_Or_Off" 1 "iB_BrakePedalApplied_Q_Applied_Normal" 2 "iB_BrakePedalApplied_Q_Applied_Faulty";
+VAL_ 258 iB_BrakePedalApplied 0 "iB_BrakePedalApplied_NotApplied" 1 "iB_BrakePedalApplied_Applied";
+VAL_ 258 ESP_AebActive 0 "ESP_AebActive_Inactive" 1 "ESP_AebActive_Active";
+VAL_ 258 ESP_AebAvailable 0 "ESP_AebAvailable_Not_Available" 1 "ESP_AebAvailable_Available";
+VAL_ 258 ESP_DbsActive 0 "ESP_DbsActive_Dbs_Inactive" 1 "ESP_DbsActive_Dbs_Active";
+VAL_ 258 ESP_PrefillActiveFeedback 0 "ESP_PrefillActiveFeedback_Inactive" 1 "ESP_PrefillActiveFeedback_Active";
+VAL_ 258 ESP_PrefillAvailable 0 "ESP_PrefillAvailible_NotAvailable" 1 "ESP_PrefillAvailible_Available";
+VAL_ 258 ESP_DbsAvailable 0 "ESP_DbsAvailable_NotAvailable" 1 "ESP_DbsAvailable_Available";
+VAL_ 272 ACM_EacEnabled 0 "ACM_EacEnable_None" 1 "ACM_EacEnable_Enabled" 2 "ACM_EacEnable_Reserved";
+VAL_ 272 ACM_HapticRequired 0 "ACM_HapticRequired_Inactive" 1 "ACM_HapticRequired_Active";
+VAL_ 288 ACM_HapticRequest 0 "ACM_HapticRequest_No_Request" 1 "ACM_HapticRequest_Haptic_Request";
+VAL_ 288 ACM_lkaSymbolState 0 "ACM_LKASYMBOLSTATE_OFF" 1 "ACM_LKASYMBOLSTATE_WHITE_ON_LDW_STANDBY" 2 "ACM_LKASYMBOLSTATE_GREEN_ON_LDW_LKA_STANDBY" 3 "ACM_LKASYMBOLSTATE_GREEN_BLNK_LDW_WARN_OR_LKA_CNTRL" 4 "ACM_LKASYMBOLSTATE_ORANGE_ON_FAIL" 5 "ACM_LKASYMBOLSTATE_ORANGE_BLINK_NOT_CALIBRATED" 6 "ACM_LKASYMBOLSTATE_ORANGE_ON_REGULATION" 7 "ACM_LKASYMBOLSTATE_WHITE_BLINK";
+VAL_ 288 ACM_lkaToiFlt 0 "ACM_LKATOIFLT_NO_FAULT" 1 "ACM_LKATOIFLT_FAULT_PRESENT";
+VAL_ 288 ACM_lkaActToi 0 "ACM_LKAACTTOI_DE_ACTIVATE_TOI" 1 "ACM_LKAACTTOI_ACTIVATE_TOI";
+VAL_ 288 ACM_hbaSysState 0 "ACM_HBASYSSTATE_DEFAULT_DISABLE" 1 "ACM_HBASYSSTATE_HBA_ENABLE_HIGH_BEAM_OFF" 2 "ACM_HBASYSSTATE_HBA_ENABLE_HIGH_BEAM_ON" 7 "ACM_HBASYSSTATE_SYSTEM_FAIL";
+VAL_ 288 ACM_ldwRHWarning 0 "ACM_LKARHWARNING_NO_WARNING" 1 "ACM_LKARHWARNING_HAPTIC_WARNING_AND_DISPLAY" 2 "ACM_LKARHWARNING_ACOUSTIC_WARNING_AND_DISPLAY" 3 "ACM_LKARHWARNING_HAPTIC_ACOUSTIC_AND_DISPLAY";
+VAL_ 288 ACM_ldwLHWarning 0 "ACM_LKALHWARNING_NO_WARNING" 1 "ACM_LKALHWARNING_HAPTIC_WARNING_AND_DISPLAY" 2 "ACM_LKALHWARNING_ACOUSTIC_WARNING_AND_DISPLAY" 3 "ACM_LKALHWARNING_HAPTIC_ACOUSTIC_AND_DISPLAY";
+VAL_ 288 ACM_lkaLaneRecogState 0 "ACM_LKALANERECOGSTATE_NOT_RECOGNITION" 1 "ACM_LKALANERECOGSTATE_LEFT_LANE_RECOGNITION" 2 "ACM_LKALANERECOGSTATE_RIGHT_LANE_RECOGNITION" 3 "ACM_LKALANERECOGSTATE_FULL_LANE_RECOGNITION";
+VAL_ 288 ACM_hbaLamp 0 "ACM_HBALAMP_HBA_INDICATOR_LAMP_OFF" 1 "ACM_HBALAMP_HBA_INDICATOR_LAMP_ON";
+VAL_ 288 ACM_lkaHandsoffSoundWarning 0 "ACM_LKAHANDSOFFSOUNDWARNING_NO_INFO" 1 "ACM_LKAHANDSOFFSOUNDWARNING_WARNING" 2 "ACM_LKAHANDSOFFSOUNDWARNING_RESERVED_2" 3 "ACM_LKAHANDSOFFSOUNDWARNING_RESERVED_3";
+VAL_ 288 ACM_lkaHandsoffDisplayWarning 0 "ACM_LKAHANDSOFFDISPLAYWARNING_NO_INFO" 1 "ACM_LKAHANDSOFFDISPLAYWARNING_WARNING" 2 "ACM_LKAHANDSOFFDISPLAYWARNING_RESERVED_2" 3 "ACM_LKAHANDSOFFDISPLAYWARNING_RESERVED_3";
+VAL_ 288 ACM_lkaElkRequest 0 "off" 1 "applying torque right for left departure" 2 "applying torque left for right departure";
+VAL_ 288 ACM_ldwlkaOnOffState 1 "LDW on" 2 "LKAS+LDW on" 3 "all off";
+VAL_ 288 ACM_elkOnOffState 1 "LKAS toggled on" 2 "LKAS toggled off";
+VAL_ 304 RCM_IMU_LatAcc_Stat_SensAvail 0 "RCM_IMU_LatAcc_Stat_SensAvail_InSpec" 1 "RCM_IMU_LatAcc_Stat_SensAvail_NotInSpec";
+VAL_ 304 RCM_IMU_LatAcc_Stat_Fail 0 "RCM_IMU_LatAcc_Stat_Fail_NotFailed" 1 "RCM_IMU_LatAcc_Stat_Fail_Failed";
+VAL_ 304 RCM_IMU_LatAcc_Stat_Init 0 "RCM_IMU_LatAcc_Stat_Init_Finished" 1 "RCM_IMU_LatAcc_Stat_Init_Running";
+VAL_ 304 RCM_IMU_LatAcc_Stat_Startup 0 "RCM_IMU_LatAcc_Stat_Startup_Finished" 1 "RCM_IMU_LatAcc_Stat_Startup_Running";
+VAL_ 304 RCM_IMU_Yaw_Stat_SensAvail 0 "RCM_IMU_Yaw_Stat_SensAvail_InSpec" 1 "RCM_IMU_Yaw_Stat_SensAvail_NotInSpec";
+VAL_ 304 RCM_IMU_Yaw_Stat_Fail 0 "RCM_IMU_Yaw_Stat_Fail_NotFailed" 1 "RCM_IMU_Yaw_Stat_Fail_Failed";
+VAL_ 304 RCM_IMU_Yaw_Stat_Init 0 "RCM_IMU_Yaw_Stat_Init_Finish" 1 "RCM_IMU_Yaw_Stat_Init_Running";
+VAL_ 304 RCM_IMU_Yaw_Stat_Startup 0 "RCM_IMU_Yaw_Stat_Startup_Finished" 1 "RCM_IMU_Yaw_Stat_Startup_Running";
+VAL_ 309 RCM_IMU_Roll_Stat_SensAvail 0 "RCM_IMU_Roll_Stat_SensAvail_InSpec" 1 "RCM_IMU_Roll_Stat_SensAvail_NotInSpec";
+VAL_ 309 RCM_IMU_Roll_Stat_Fail 0 "RCM_IMU_Roll_Stat_Fail_NotFailed" 1 "RCM_IMU_Roll_Stat_Fail_Failed";
+VAL_ 309 RCM_IMU_Roll_Stat_Init 0 "RCM_IMU_Roll_Stat_Init_Finished" 1 "RCM_IMU_Roll_Stat_Init_Running";
+VAL_ 309 RCM_IMU_Roll_Stat_Startup 0 "RCM_IMU_Roll_Stat_Startup_Finished" 1 "RCM_IMU_Roll_Stat_Startup_Running";
+VAL_ 309 RCM_IMU_Heave_Stat_SensAvail 0 "RCM_IMU_Heave_Stat_SensAvail_InSpec" 1 "RCM_IMU_Heave_Stat_SensAvail_NotInSpec";
+VAL_ 309 RCM_IMU_Heave_Stat_Fail 0 "RCM_IMU_Heave_Stat_Fail_NotFailed" 1 "RCM_IMU_Heave_Stat_Fail_Failed";
+VAL_ 309 RCM_IMU_Heave_Stat_Init 0 "RCM_IMU_Heave_Stat_Init_Finished" 1 "RCM_IMU_Heave_Stat_Init_Running";
+VAL_ 309 RCM_IMU_Heave_Stat_Startup 0 "RCM_IMU_Heave_Stat_Startup_Finished" 1 "RCM_IMU_Heave_Stat_Startup_Running";
+VAL_ 320 RCM_IMU_LongAcc_Stat_SensAvail 0 "RCM_IMU_LongAcc_Stat_SensAvail_InSpec" 1 "RCM_IMU_LongAcc_Stat_SensAvail_NotInSpec";
+VAL_ 320 RCM_IMU_LongAcc_Stat_Fail 0 "RCM_IMU_LongAcc_Stat_Fail_NotFailed" 1 "RCM_IMU_LongAcc_Stat_Fail_Failed";
+VAL_ 320 RCM_IMU_LongAcc_Stat_Init 0 "RCM_IMU_LongAcc_Stat_Init_Finished" 1 "RCM_IMU_LongAcc_Stat_Init_Running";
+VAL_ 320 RCM_IMU_LongAcc_Stat_Startup 0 "RCM_IMU_LongAcc_Stat_Startup_Finished" 1 "RCM_IMU_LongAcc_Stat_Startup_Running";
+VAL_ 336 VDM_PropsnActv 0 "VDM_PropsnActv_Not_Defined" 1 "VDM_PropsnActv_Active" 2 "VDM_PropsnActv_Inactive";
+VAL_ 336 VDM_VehicleSpeedQ 0 "VDM_VehSpdQ_Inactive" 1 "VDM_VehSpdQ_Active";
+VAL_ 336 VDM_Prndl_Status 0 "VDM_Prndl_Status_Not_Defined" 1 "VDM_Prndl_Status_Park" 2 "VDM_Prndl_Status_Reverse" 3 "VDM_Prndl_Status_Neutral" 4 "VDM_Prndl_Status_Drive";
+VAL_ 336 VDM_Prndl_Request 0 "VDM_Prndl_Request_No_Req" 1 "VDM_Prndl_Request_Park" 2 "VDM_Prndl_Request_Reverse" 3 "VDM_Prndl_Request_Neutral" 4 "VDM_Prndl_Request_Drive";
+VAL_ 338 VDM_LfcRequestType 0 "LFC_Request_Type_No_Request" 1 "LFC_Request_Type_Brake_Torque_Request_Fx" 2 "LFC_Request_Type_Standstill_Hold_Request_Ssm" 3 "LFC_Request_Type_Release_Ssm";
+VAL_ 338 VDM_LfcActiveRequest 0 "VDM_LfcActiveRequest_Inactive" 1 "VDM_LfcActiveRequest_Active";
+VAL_ 338 VDM_StcFault 0 "Stc_NoFault" 1 "Stc_Fault";
+VAL_ 338 VDM_StcActiveRequest 0 "Stc_NotActive" 1 "Stc_Active";
+VAL_ 338 VDM_EpbRequest 0 "VDM_EpbRequest_No_Request" 1 "VDM_EpbRequest_Release_Req" 2 "VDM_EpbRequest_Apply_Req" 3 "VDM_EpbRequest_Sna";
+VAL_ 338 VDM_ABSOffRoadModeRequest 0 "VDM_ABSOffRoadModeRequest_Inactive" 1 "VDM_ABSOffRoadModeRequest_Active";
+VAL_ 338 VDM_HhcActiveRequest 0 "VDM_HhcActiveRequest_Inactive" 1 "VDM_HhcActiveRequest_Active";
+VAL_ 338 VDM_EspPartialModeRequest 0 "VDM_EspPartialModeRequest_Normal" 1 "VDM_EspPartialModeRequest_Sport" 2 "VDM_EspPartialModeRequest_Esc_Off" 3 "VDM_EspPartialModeRequest_Reserved";
+VAL_ 338 VDM_SteeringModeRequest 0 "VDM_SteeringModeRequest_Default" 1 "VDM_SteeringModeRequest_Normal" 2 "VDM_SteeringModeRequest_Sport" 3 "VDM_SteeringModeRequest_Comfort";
+VAL_ 338 VDM_EpasPowerMode 0 "VDM_EpasPowerMode_Drive_Off" 1 "VDM_EpasPowerMode_Drive_On" 2 "VDM_EpasPowerMode_Shutdown";
+VAL_ 352 ACM_VehicleHoldRequired 0 "ACM_VEHICLEHOLDREQ_NO_REQUEST" 1 "ACM_VEHICLEHOLDREQ_VEHICLE_HOLD_REQUEST";
+VAL_ 352 ACM_PrndRequest 0 "ACM_PRNDREQ_NO_REQUEST" 1 "ACM_PRNDREQ_PARK" 2 "ACM_PRNDREQ_REVERSE" 3 "ACM_PRNDREQ_NEUTRAL" 4 "ACM_PRNDREQ_DRIVE";
+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_VehicleHoldRequest 0 "NO_REQUEST" 1 "HOLD_REQUEST";
+VAL_ 354 VDM_AdasDriverAccelPriorityStatus 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";
+VAL_ 354 VDM_AdasVehicleHoldStatus 0 "VDM_AdasVehicleHoldStatus_NotHold" 1 "VDM_AdasVehicleHoldStatus_Hold";
+VAL_ 354 VDM_UserAdasRequest 0 "IDLE" 1 "UP_1" 2 "UP_2" 3 "DOWN_1" 4 "DOWN_2";
+VAL_ 357 VDM_AdasStalkGapAdjust 0 "VDM_AdasStalkGapAdjust_No_Required" 1 "VDM_AdasStalkGapAdjust_GapDecrement" 2 "VDM_AdasStalkGapAdjust_GapIncrement";
+VAL_ 357 VDM_AdasStalkAccCancelRes 0 "VDM_AdasStalkAccCancelRes_NoRequired" 1 "VDM_AdasStalkAccCancelRes_Cancel" 2 "VDM_AdasStalkAccCancelRes_Resume";
+VAL_ 357 VDM_AdasStalkAutonomyButton 0 "VDM_AdasStalkAutonomyButton_No_Required" 1 "VDM_AdasStalkAutonomyButton_Pressed";
+VAL_ 357 VDM_AdasStalkAccEnableAdj 0 "VDM_AdasStalkAccEnableAdj_No_Required" 1 "VDM_AdasStalkAccEnableAdj_UpDetent1" 2 "VDM_AdasStalkAccEnableAdj_UpDetent2" 3 "VDM_AdasStalkAccEnableAdj_DownDetent1" 4 "VDM_AdasStalkAccEnableAdj_DownDetent2";
+VAL_ 384 CGM_TrailerPresent 0 "CGM_TrailerPresent_Trailer_Not_Present" 1 "CGM_TrailerPresent_Trailer_Present" 3 "CGM_TrailerPresent_Invalid";
+VAL_ 384 CGM_DriverPresent 0 "CGM_DriverPresent_Driver_Not_Present" 1 "CGM_DriverPresent_Driver_Present" 3 "CGM_DriverPresent_Invalid";
+VAL_ 384 CGM_IgnSwtState 0 "IGNSWTSTATE_OFF" 1 "IGNSWTSTATE_STANDBY" 2 "IGNSWTSTATE_ACCESSORY" 3 "IGNSWTSTATE_RUN" 4 "IGNSWTSTATE_CRANK";
+VAL_ 432 ESP_Torque_Front_MinQ 0 "ESP_TorqueFront_MinQ_Invalid" 1 "ESP_TorqueFront_MinQ_Valid";
+VAL_ 432 ESP_Torque_Front_MaxQ 0 "ESP_TorqueFront_MaxQ_Invalid" 1 "ESP_TorqueFront_MaxQ_Valid";
+VAL_ 448 ESP_Torque_Rear_MinQ 0 "ESP_TorqueLimitRear_MinQ_Invalid" 1 "ESP_TorqueLimitRear_MinQ_Valid";
+VAL_ 448 ESP_Torque_Rear_MaxQ 0 "ESP_TorqueLimitRear_MaxQ_Invalid" 1 "ESP_TorqueLimitRear_MaxQ_Valid";
+VAL_ 516 RCM_ALR_Status_Signal 0 "ALR_Unknown" 1 "ALR_Not_Engaged" 2 "ALR_Engaged" 3 "ALR_Invalid";
+VAL_ 520 ESP_BrakeLightActive_Q 0 "ESP_BRAKELIGHTACTIVE_Q_INVALID" 1 "ESP_BRAKELIGHTACTIVE_Q_VALID";
+VAL_ 520 ESP_BrakeLightActive 0 "ESP_BRAKELIGHTACTIVE_INACTIVE" 1 "ESP_BRAKELIGHTACTIVE_ACTIVE";
+VAL_ 520 ESP_Hhc_Active 0 "ESP_HHCACTV_INACTIVE" 1 "ESP_HHCACTV_ACTIVE";
+VAL_ 520 ESP_Hhc_Available 0 "ESP_HHCAVL_NOT_INITIALIZED" 1 "ESP_HHCAVL_ACTIVE";
+VAL_ 520 ESP_Abs_OffRoad_Mode 0 "ABS_OFFROAD_NORMAL" 1 "ABS_OFFROAD_OFFROAD";
+VAL_ 520 ESP_Tsm_Active 0 "TSM_ACTIVE_INACTIVE" 1 "TSM_ACTIVE_ACTIVE";
+VAL_ 520 ESP_FaultLamp_EBD 0 "ESP_FAULTLAMP_EBD_OFF" 1 "ESP_FAULTLAMP_EBD_ON";
+VAL_ 520 ESP_FaultLamp_VDC 0 "ESP_FAULTLAMP_VDC_OFF" 1 "ESP_FAULTLAMP_VDC_ON";
+VAL_ 520 ESP_FaultLamp_ABS 0 "ESP_FAULTLAMP_ABS_OFF" 1 "ESP_FAULTLAMP_ABS_ON";
+VAL_ 520 ESP_Esp_Active 0 "ESP_ACTIVE_INACTIVE" 1 "ESP_ACTIVE_ACTIVE";
+VAL_ 520 ESP_Abs_Active 0 "ABS_ACTIVE_INACTIVE" 1 "ABS_ACTIVE_ACTIVE";
+VAL_ 520 ESP_Partial_Mode 0 "ESP_PATA_MODE_NORMAL" 1 "ESP_PATA_MODE_SPORT" 2 "ESP_PATA_MODE_ESC_OFF" 3 "ESP_PATA_MODE_RESERVED";
+VAL_ 520 ESP_Vehicle_Speed_Q 0 "ESP_VEHICLE_SPEED_Q_NOT_INITIALIZED" 1 "ESP_VEHICLE_SPEED_Q_NORMAL" 2 "ESP_VEHICLE_SPEED_Q_FAULT";
+VAL_ 520 ESP_Lfc_Available 0 "LFC_AVAILABLE_NOT_AVAILABLE" 1 "LFC_AVAILABLE_AVAILABLE";
+VAL_ 520 ESP_Hba_Active 0 "ESP_HBAACTV_INACTIVE" 1 "ESP_HBAACTV_ACTIVE";
+VAL_ 520 ESP_Lfc_Active 0 "LFC_ACTIVE_INACTIVE" 1 "LFC_ACTIVE_ACTIVE";
+VAL_ 521 ESP_Wheel_Speed_Left_Front_Q 0 "ESP_WHEEL_SPEED_LEFT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_LEFT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_SPEED_LEFT_FRONT_Q_FAULT";
+VAL_ 521 ESP_Wheel_Speed_Right_Front_Q 0 "ESP_WHEEL_SPEED_RIGHT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_RIGHT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_SPEED_RIGHT_FRONT_Q_FAULT";
+VAL_ 521 ESP_Wheel_Dir_Right_Front 0 "ESP_WHEEL_DIR_RIGHT_FRONT_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_RIGHT_FRONT_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_RIGHT_FRONT_STANDSTILL" 3 "ESP_WHEEL_DIR_RIGHT_FRONT_NOTDEFINABLE";
+VAL_ 521 ESP_Wheel_Dir_Left_Front 0 "ESP_WHEEL_DIR_LEFT_FRONT_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_LEFT_FRONT_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_LEFT_FRONT_STANDSTILL" 3 "ESP_WHEEL_DIR_LEFT_FRONT_NOTDEFINABLE";
+VAL_ 522 ESP_Wheel_Speed_Left_Rear_Q 0 "ESP_WHEEL_SPEED_LEFT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_LEFT_REAR_Q_NORMAL" 2 "ESP_WHEEL_SPEED_LEFT_REAR_Q_FAULT";
+VAL_ 522 ESP_Wheel_Speed_Right_Rear_Q 0 "ESP_WHEEL_SPEED_RIGHT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_RIGHT_REAR_Q_NORMAL" 2 "ESP_WHEEL_SPEED_RIGHT_REAR_Q_FAULT";
+VAL_ 522 ESP_Wheel_Dir_Right_Rear 0 "ESP_WHEEL_DIR_RIGHT_REAR_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_RIGHT_REAR_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_RIGHT_REAR_STANDSTILL" 3 "ESP_WHEEL_DIR_RIGHT_REAR_NOTDEFINABLE";
+VAL_ 522 ESP_Wheel_Dir_Left_Rear 0 "ESP_WHEEL_DIR_LEFT_REAR_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_LEFT_REAR_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_LEFT_REAR_STANDSTILL" 3 "ESP_WHEEL_DIR_LEFT_REAR_NOTDEFINABLE";
+VAL_ 523 ESP_Wheel_Pulse_Right_Front_Q 0 "ESP_WHEEL_PULSE_RIGHT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_RIGHT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_PULSE_RIGHT_FRONT_Q_FAULT";
+VAL_ 523 ESP_Wheel_Pulse_Right_Rear_Q 0 "ESP_WHEEL_PULSE_RIGHT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_RIGHT_REAR_Q_NORMAL" 2 "ESP_WHEEL_PULSE_RIGHT_REAR_Q_FAULT";
+VAL_ 523 ESP_Wheel_Pulse_Left_Rear_Q 0 "ESP_WHEEL_PULSE_LEFT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_LEFT_REAR_Q_NORMAL" 2 "ESP_WHEEL_PULSE_LEFT_REAR_Q_FAULT";
+VAL_ 523 ESP_Wheel_Pulse_Left_Front_Q 0 "ESP_WHEEL_PULSE_LEFT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_LEFT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_PULSE_LEFT_FRONT_Q_FAULT";
+VAL_ 524 ESP_BrakePressure_RF_Q 0 "ESP_BRAKEPRESSURE_RF_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_RF_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_RF_Q_FAULT";
+VAL_ 524 ESP_BrakePressure_LF_Q 0 "ESP_BRAKEPRESSURE_LF_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_LF_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_LF_Q_FAULT";
+VAL_ 524 ESP_MasterCyl_Pressure_Q 0 "ESP_MASTERCYL_PRESSURE_Q_NOT_INITIALIZED" 1 "ESP_MASTERCYL_PRESSURE_Q_NORMAL" 2 "ESP_MASTERCYL_PRESSURE_Q_FAULT";
+VAL_ 524 ESP_BrakePressure_RR_Q 0 "ESP_BRAKEPRESSURE_RR_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_RR_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_RR_Q_FAULT";
+VAL_ 524 ESP_BrakePressure_LR_Q 0 "ESP_BRAKEPRESSURE_LR_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_LR_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_LR_Q_FAULT";
+VAL_ 529 VDM_Torque_Front_MaxQ 0 "VDM_Torque_Front_MaxQ_Invalid" 1 "VDM_Torque_Front_MaxQ_Valid";
+VAL_ 529 VDM_OutputTorqueFrontQ 0 "VDM_OutputTorqueFrontQ_Invalid" 1 "VDM_OutputTorqueFrontQ_Valid";
+VAL_ 529 VDM_Torque_Front_MinQ 0 "VDM_Torque_Front_MinQ_Invalid" 1 "VDM_Torque_FrontinQ_Valid";
+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";
+VAL_ 811 ESP_EpbStatus 0 "ESP_EpbStatus_Released" 1 "ESP_EpbStatus_Applied" 2 "ESP_EpbStatus_Releasing" 3 "ESP_EpbStatus_Applying" 4 "ESP_EpbStatus_Dynamic_Control" 5 "ESP_EpbStatus_Unknown" 7 "ESP_EpbStatus_Sna";
+VAL_ 811 ESP_EpbFunctionLamp 0 "ESP_EpbFunction_Lamp_Off" 1 "ESP_EpbFunctionLamp_Continous" 2 "ESP_EpbFunctionLamp_Blink" 3 "ESP_EpbFunctionLamp_Sna";
+VAL_ 826 RCM_Status_DETECT_CRUSH 0 "DETECT_CRUSH_Normal_Condition" 1 "DETECT_CRUSH_Collision_Detection";
+VAL_ 826 RCM_Status_IND_WARN_RCM 0 "IND_WARN_RCM_Off" 1 "IND_WARN_RCM_Lighting";
+VAL_ 826 RCM_Status_IND_ACT_RCM_PASS 0 "IWBP_On_Ind_onOFF_Ind_on" 1 "IWBP_On_Ind_offOFF_Ind_on" 2 "IWBP_On_Ind_onOFF_Ind_off" 3 "IWBP_On_Ind_offOFF_Ind_off";
+VAL_ 826 RCM_Status_IND_WARN_BELT_DRIVER 0 "IWBP_Equipped" 1 "IWBP_Not_Equipped" 2 "IWBP_Undetermined" 3 "IWBP_SW_Failure";
+VAL_ 826 RCM_Status_IND_WARN_BELT_PASS 0 "IWBP_Equipped" 1 "IWBP_Not_Equipped" 2 "IWBP_Undetermined" 3 "IWBP_SW_Failure";
+VAL_ 848 EPAS_Ecu1EacSts 0 "EPAS_Ecu1EacSts_Eac_Inhibited" 1 "EPAS_Ecu1EacSts_Eac_Available" 2 "EPAS_Ecu1EacSts_Eac_Active" 3 "EPAS_Ecu1EacSts_Eac_Fault" 7 "EPAS_Ecu1EacSts_Sna";
+VAL_ 848 EPAS_Ecu1PowerMode 0 "EPASP_powerMode_Drive_Off" 1 "EPASP_powerMode_Drive_On" 2 "EPASP_powerMode_Shutdown" 3 "EPASP_powerMode_Sna";
+VAL_ 848 EPAS_Ecu1Role 0 "EPASP_ROLE_MASTER" 1 "EPASP_ROLE_SLAVE" 2 "EPASP_ROLE_RESERVED";
+VAL_ 848 EPAS_Ecu1State 0 "EPAS_Ecu1State_Initialisation_Arbitration" 1 "EPAS_Ecu1State_Reserved" 2 "EPAS_Ecu1State_Reserved1" 3 "EPAS_Ecu1State_Initialisation_Complete" 4 "EPAS_Ecu1State_Passive" 5 "EPAS_Ecu1State_Passive_Faulted" 6 "EPAS_Ecu1State_Assist_Active" 7 "EPAS_Ecu1State_Assist_Standby" 8 "EPAS_Ecu1State_Eac_Active" 9 "EPAS_Ecu1State_Eac_Standby" 15 "EPAS_Ecu1State_Invalid";
+VAL_ 864 EPAS_Ecu2EacSts 0 "EPAS_Ecu2EacSts_Eac_Inhibited" 1 "EPAS_Ecu2EacSts_Eac_Available" 2 "EPAS_Ecu2EacSts_Eac_Active" 3 "EPAS_Ecu2EacSts_Eac_Fault" 7 "EPAS_Ecu2EacSts_Sna";
+VAL_ 864 EPAS_Ecu2PowerMode 0 "EPASS_powerMode_Drive_Off" 1 "EPASS_powerMode_Drive_On" 2 "EPASS_powerMode_Shutdown" 3 "EPASS_powerMode_Sna";
+VAL_ 864 EPASS_Ecu2Role 0 "EPASS_Ecu2Role_Master" 1 "EPASS_Ecu2Role_Slave" 2 "EPASS_Ecu2Role_Reserved";
+VAL_ 864 EPASS_Ecu2State 0 "EPASS_Ecu2State_Initialisation_Arbitration" 1 "EPASS_Ecu2State_Reserved" 2 "EPASS_Ecu2State_Reserved1" 3 "EPASS_Ecu2State_Initialisation_Complete" 4 "EPASS_Ecu2State_Passive" 5 "EPASS_Ecu2State_Passive_Faulted" 6 "EPASS_Ecu2State_Assist_Active" 7 "EPASS_Ecu2State_Assist_Standby" 8 "EPASS_Ecu2State_Eac_Active" 9 "EPASS_Ecu2State_Eac_Standby" 15 "EPASS_Ecu2State_Invalid";
+VAL_ 880 ACM_tsrConInfoStaCon2 0 "ACM_TSRCONINFOSTACON2_NONE_DEFAULT" 1 "ACM_TSRCONINFOSTACON2_RAIN" 2 "ACM_TSRCONINFOSTACON2_SNOW" 3 "ACM_TSRCONINFOSTACON2_SNOW_RAIN" 4 "ACM_TSRCONINFOSTACON2_TARILER" 5 "ACM_TSRCONINFOSTACON2_DISTANCE" 6 "ACM_TSRCONINFOSTACON2_TIME" 7 "ACM_TSRCONINFOSTACON2_FOG" 8 "ACM_TSRCONINFOSTACON2_RESERVED_8" 9 "ACM_TSRCONINFOSTACON2_RESERVED_9" 10 "ACM_TSRCONINFOSTACON2_RESERVED_10" 11 "ACM_TSRCONINFOSTACON2_RESERVED_11" 12 "ACM_TSRCONINFOSTACON2_RESERVED_12" 14 "ACM_TSRCONINFOSTACON2_GENERIC" 15 "ACM_TSRCONINFOSTACON2_RESERVED_15";
+VAL_ 880 ACM_tsrConInfoStaCon1 0 "ACM_TSRCONINFOSTACON1_NONE_DEFAULT" 1 "ACM_TSRCONINFOSTACON1_RAIN" 2 "ACM_TSRCONINFOSTACON1_SNOW" 3 "ACM_TSRCONINFOSTACON1_SNOW_RAIN" 4 "ACM_TSRCONINFOSTACON1_TARILER" 5 "ACM_TSRCONINFOSTACON1_DISTANCE" 6 "ACM_TSRCONINFOSTACON1_TIME" 7 "ACM_TSRCONINFOSTACON1_FOG" 8 "ACM_TSRCONINFOSTACON1_RESERVED_8" 9 "ACM_TSRCONINFOSTACON1_RESERVED_9" 10 "ACM_TSRCONINFOSTACON1_RESERVED_10" 11 "ACM_TSRCONINFOSTACON1_RESERVED_11" 12 "ACM_TSRCONINFOSTACON1_RESERVED_12" 14 "ACM_TSRCONINFOSTACON1_GENERIC" 15 "ACM_TSRCONINFOSTACON1_RESERVED_15";
+VAL_ 880 ACM_tsrSpdDisClsMain 0 "TSR_Speed_No_Recognition_Default" 253 "TSR_Speed_Unlimited_Speed" 254 "TSR_Speed_Reserved" 255 "TSR_Speed_Invalid";
+VAL_ 880 ACM_tsrSpdDisCluCon1 0 "ACM_TSRSPDDISCLUCON1_NO_RECOGNITION_DEFAULT" 1 "ACM_TSRSPDDISCLUCON1_A1_252_PH_1XHEX_KPHORMPH" 253 "ACM_TSRSPDDISCLUCON1_LHD_CONDITIONAL_NO_PASSING_ZONE" 254 "ACM_TSRSPDDISCLUCON1_RHD_CONDITIONAL_NO_PASSING_ZONE" 255 "ACM_TSRSPDDISCLUCON1_INVALID";
+VAL_ 880 ACM_tsrSpdDisCluCon2 0 "ACM_TSRSPDDISCLUCON2_NO_RECOGNITION_DEFAULT" 1 "ACM_TSRSPDDISCLUCON2_A1_252_PH_1XHEX_KPHORMPH" 253 "ACM_TSRSPDDISCLUCON2_LHD_CONDITIONAL_NO_PASSING_ZONE" 254 "ACM_TSRSPDDISCLUCON2_RHD_CONDITIONAL_NO_PASSING_ZONE" 255 "ACM_TSRSPDDISCLUCON2_INVALID";
+VAL_ 880 ACM_tsrSpdDisCluConM 0 "ACM_TSRSPDDISCLUCONM_NO_RECOGNITION_DEFAULT" 253 "ACM_TSRSPDDISCLUCONM_UNLIMITED_SPEED" 254 "ACM_TSRSPDDISCLUCONM_RESERVED" 255 "ACM_TSRSPDDISCLUCONM_INVALID";
+VAL_ 880 ACM_tsrAddInfoDisplay 0 "ACM_TSRADDINFODISPLAY_NONE_DISPLAY_DEFAULT" 1 "ACM_TSRADDINFODISPLAY_LHD_NO_PASSING_ZONE_DISPLAY" 2 "ACM_TSRADDINFODISPLAY_RHD_NO_PASSING_ZONE_DISPLAY" 3 "ACM_TSRADDINFODISPLAY_INVALID";
+VAL_ 880 ACM_tsrOvrlapSignDis 0 "ACM_TSROVRLAPSIGNDIS_NONE_DEFAULT" 1 "ACM_TSROVRLAPSIGNDIS_OVERLAP_SIGN" 2 "ACM_TSROVRLAPSIGNDIS_RESERVED";
+VAL_ 880 ACM_tsrStatus 0 "ACM_TSRSTATUS_TSR_INFORMATION_VALID_DEFAULT" 1 "ACM_TSRSTATUS_TSR_INFORMATION_INVALID_FAILURE" 2 "ACM_TSRSTATUS_TSR_INFORMATION_TEMPORARY_UNAVAILABLE";
+VAL_ 896 EPAS_SteeringReduced 0 "EPAS_EPAS_SteeringReduced_Normal_Assist" 1 "EPAS_EPAS_SteeringReduced_Reduced_Assist";
+VAL_ 896 EPAS_SteeringFault 0 "EPAS_SteeringFault_No_Fault" 1 "EPAS_SteeringFault_Fault";
+VAL_ 896 EPAS_SteeringMode 0 "EPASP_SteeringMode_Default" 1 "EPASP_SteeringMode_Normal" 2 "EPASP_SteeringMode_Sport" 3 "EPASP_SteeringMode_Comfort";
+VAL_ 896 EPAS_StcFault 0 "Stc_NoFault" 1 "Stc_Fault";
+VAL_ 896 EPAS_StcActive 0 "Stc_NotActive" 1 "Stc_Active";
+VAL_ 896 EPAS_StcUnavailable 0 "Stc_Available" 1 "Stc_Unavailable";
+VAL_ 896 H_CAN_EPSS_ToiFlt 0 "H_CAN_EPS_ToiFault_No_Fault" 1 "H_CAN_EPS_ToiFault_Fault";
+VAL_ 896 H_CAN_EPSS_ToiActive 0 "H_CAN_EPS_ToiActive_Deactivated" 1 "H_CAN_EPS_ToiActive_Activated";
+VAL_ 896 H_CAN_EPS_ToiUnavailable 0 "H_CAN_EPS_ToiUnavailable_Available" 1 "H_CAN_EPS_ToiUnavailable_Unavailable";
+VAL_ 896 EPAS_HandsOnLevel 0 "EPAS_HandsOnLevel_Level_0" 1 "EPAS_HandsOnLevel_Level_1" 2 "EPAS_HandsOnLevel_Level_2" 3 "EPAS_HandsOnLevel_Level_3";
+VAL_ 907 ESPiB1_IgnitionOn 0 "ESPIB1_IgnitionOn_Not_Initilized" 1 "ESPIB1_IgnitionOn_Normal";
+VAL_ 907 ESPiB1_VehicleSpeed_Q 0 "ESPiB1_VehicleSpeed_Q_VehicleSpeedQualifier_NotInit" 1 "ESPiB1_VehicleSpeed_Q_VehicleSpeedQualifier_Normal" 2 "ESPiB1_VehicleSpeed_Q_VehicleSpeedQualifier_Faulty";
+VAL_ 908 ESPiB2_qTargetExternal_Q 0 "ESPiB2_qTargetExternal_Q_QTarget_Off" 1 "ESPiB2_qTargetExternal_Q_QTarget_EBR" 2 "ESPiB2_qTargetExternal_Q_QTarget_EBRmaxPerformance";
+VAL_ 909 ESPiB3_ABSActive 0 "ESPIB3_ABSACTIVE_ABS_IS_INACTIVE" 1 "ESPIB3_ABSACTIVE_ABS_IS_ACTIVE";
+VAL_ 909 ESPiB3_ForceBlendingActive 0 "ESPIB3_FORCEBLENDINGACTIVE_PFC_INACTIVE" 1 "ESPIB3_FORCEBLENDINGACTIVE_PFC_HOLD" 2 "ESPIB3_FORCEBLENDINGACTIVE_PFC_ACTIVE";
+VAL_ 909 ESPiB3_pMcVirtual_Q 0 "ESPIB3_PMCVIRTUAL_Q_PMCVIRTUAL_NOTINITIALIZED" 1 "ESPIB3_PMCVIRTUAL_Q_PMCVIRTUAL_NORMAL" 2 "ESPIB3_PMCVIRTUAL_Q_PMCVIRTUAL_FAULTY";
+VAL_ 909 ESPiB3_pForceBlendingMC_Q 0 "ESPIB3_PFORCEBLENDINGMC_Q_PFORCEBLENDINGMC_NOTINITIALIZED" 1 "ESPIB3_PFORCEBLENDINGMC_Q_PFORCEBLENDINGMC_NORMAL" 2 "ESPIB3_PFORCEBLENDINGMC_Q_PFORCEBLENDINGMC_FAULTY";
+VAL_ 909 ESPiB3_pMC1_Q 0 "ESPIB3_PMC1_Q_MCPRESSUREQUALIFIER_NOTINIT" 1 "ESPIB3_PMC1_Q_MCPRESSUREQUALIFIER_NORMAL" 2 "ESPIB3_PMC1_Q_MCPRESSUREQUALIFIER_FAULTY";
+VAL_ 910 iBESP1_ExtReqStatus 0 "iBESP1_ExtReqStatus_NotInitialized" 1 "iBESP1_ExtReqStatus_EBR_NotAvailable" 2 "iBESP1_ExtReqStatus_EBR_Available";
+VAL_ 910 iBESP1_sOutputRodDriver_Q 0 "IBESP1_SOUTPUTRODDRIVER_Q_SOUTPUTRODDRIVER_NOTINITIALIZED" 1 "IBESP1_SOUTPUTRODDRIVER_Q_SOUTPUTRODDRIVER_NORMAL" 2 "IBESP1_SOUTPUTRODDRIVER_Q_SOUTPUTRODDRIVER_FAULTY";
+VAL_ 910 iBESP1_sOutputRodAct_Q 0 "IBESP1_SOUTPUTRODACT_Q_SOUTPUTRODACT_NOTINITIALIZED" 1 "IBESP1_SOUTPUTRODACT_Q_SOUTPUTRODACT_NORMAL" 2 "IBESP1_SOUTPUTRODACT_Q_SOUTPUTRODACT_FAULTY";
+VAL_ 911 iBESP2_pRunout_Q 0 "IBESP2_PRUNOUT_Q_P_RUNOUT_NOT_INITIALIZED" 1 "IBESP2_PRUNOUT_Q_P_RUNOUT_NORMAL" 2 "IBESP2_PRUNOUT_Q_P_RUNOUT_FAULTY";
+VAL_ 911 iBESP2_BrakePedalApplied_Q 0 "IBESP2_BRAKEPEDALAPPLIED_Q_BRAKE_PEDAL_APPLIED_NO_INIT_OR_OFF" 1 "IBESP2_BRAKEPEDALAPPLIED_Q_BRAKE_PEDAL_APPLIED_NORMAL" 2 "IBESP2_BRAKEPEDALAPPLIED_Q_BRAKE_PEDAL_APPLIED_FAULTY";
+VAL_ 911 iBESP2_BrakePedalApplied 0 "iBESP2_BrakePedalApplied_NotApplied" 1 "iBESP2_BrakePedalApplied_Applied";
+VAL_ 911 iBESP2_RprMode 0 "IBESP2_RPRMODE_RPR_PASSIVE" 1 "IBESP2_RPRMODE_RPR_PRELOAD" 2 "IBESP2_RPRMODE_RPR_HOLD" 3 "IBESP2_RPRMODE_RPR_SUCTION" 4 "IBESP2_RPRMODE_RPR_HOLDLOWPRESSURE" 5 "IBESP2_RPRMODE_RPR_ABORT";
+VAL_ 912 EPAS_EacStatus 0 "EPAS_EacStatus_Eac_Inhibited" 1 "EPAS_EacStatus_Eac_Available" 2 "EPAS_EacStatus_Eac_Active" 3 "EPAS_EacStatus_Eac_Standby" 4 "EPAS_EacStatus_Eac_Fault" 5 "EPAS_EacStatus_Sna";
+VAL_ 912 EPAS_EacErrorCode 0 "EPAS_No_Err" 1 "EPAS_High_Angle_Cmd_Err" 2 "EPAS_High_Actual_Angle_Err" 3 "EPAS_High_Actual_Angle_Rate_Err" 4 "EPAS_Feature_Fault_Err" 5 "EPAS_Feature_Status_Invalid_Err" 6 "EPAS_Feature_Angle_Thd_Err" 7 "EPAS_Angle_Control_Cntr_Err" 8 "EPAS_Angle_Control_Mia_Err" 9 "EPAS_Angle_Control_Crc_Err" 10 "EPAS_Vehspd_Corrln_Failr_Err" 11 "EPAS_Vehspd_Max_Thd_Err" 12 "EPAS_Hands_On_Detn_Err" 13 "EPAS_Ext_Angle_Plausibility_Err" 14 "EPAS_High_Delta_Angle_Err" 15 "EPAS_Max_Steady_State_Err";
+VAL_ 912 EPAS_InternalSasQ 0 "EPAS_INTERNALSASQF_VALID" 1 "EPAS_INTERNALSASQF_INVALID";
+VAL_ 929 VDM_AchDriveModeRequestConfirm 0 "VDM_AchDriveModeRequestConfirm_NoRequest" 1 "VDM_AchDriveModeRequestConfirm_Request";
+VAL_ 929 VDM_AchDriveModeRequestPullRearw 0 "VDM_AchDriveModeRequestPullRearward_NoRequired" 1 "VDM_AchDriveModeRequestPullRearward_Required";
+VAL_ 929 VDM_AchDriveModeRequestPushDown 0 "VDM_AchDriveModeRequestPushDown_NoRequired" 1 "VDM_AchDriveModeRequestPushDown_Required";
+VAL_ 929 VDM_AchDriveModeRequestPushForwa 0 "VDM_AchDriveModeRequestPushForward_NoRequired" 1 "VDM_AchDriveModeRequestPushForward_Required";
+VAL_ 929 VDM_AchDriveModeRequestPushUp 0 "VDM_AchDriveModeRequestPushUp_NoRequired" 1 "VDM_AchDriveModeRequestPushUp_Required";
+VAL_ 929 VDM_AchDriveModeRequestRest 0 "VDM_AchDriveModeRequestRest_NoRequired" 1 "VDM_AchDriveModeRequestRest_Required";
+VAL_ 929 VDM_AchDriveMode4x4 0 "VDM_AchDriveMode4x4_A4x4Auto" 1 "VDM_AchDriveMode4x4_P4x4Permenant" 6 "VDM_AchDriveMode4x4_I_Transition" 7 "VDM_AchDriveMode4x4_Fault";
+VAL_ 929 VDM_AchDriveMode 0 "VDM_AchDriveMode_Eco" 1 "VDM_AchDriveMode_OnRoadComford" 2 "VDM_AchDriveMode_OnRoadSport" 3 "VDM_AchDriveMode_OffRoad" 4 "VDM_AchDriveMode_OffRoadSport" 5 "VDM_AchDriveMode_Autonomy";
+VAL_ 929 VDM_AchDriveModeAirSuspension 0 "VDM_AchDriveModeAirSuspension_Kneel" 1 "VDM_AchDriveModeAirSuspension_Aero" 2 "VDM_AchDriveModeAirSuspension_Design" 3 "VDM_AchDriveModeAirSuspension_High" 4 "VDM_AchDriveModeAirSuspension_Max" 7 "VDM_AchDriveModeAirSuspension_Null";
+VAL_ 929 VDM_AchDriveModeAbs 0 "VDM_AchDriveModeAbs_OnRoad" 1 "VDM_AchDriveModeAbs_OffRoad" 6 "VDM_AchDriveModeAbs_InTransition" 7 "VDM_AchDriveModeAbs_Fault";
+VAL_ 929 VDM_AchDriveModeDrivability 0 "VDM_AchDriveModeDrivability_Eco" 1 "VDM_AchDriveModeDrivability_Sport" 2 "VDM_AchDriveModeDrivability_OffRoad" 6 "VDM_AchDriveModeDrivability_InTransition" 7 "VDM_AchDriveModeDrivability_Null";
+VAL_ 929 VDM_AchDriveModeDamping 0 "VDM_AchDriveModeDamping_Kneel" 1 "VDM_AchDriveModeDamping_Aero" 2 "VDM_AchDriveModeDamping_Design" 3 "VDM_AchDriveModeDamping_High" 4 "VDM_AchDriveModeDamping_AirSuspensionMax" 6 "VDM_AchDriveModeDamping_InTransition" 7 "VDM_AchDriveModeDamping_Fault";
+VAL_ 929 VDM_AchDriveModeRollControl 0 "VDM_AchDriveModeRollControl_Low" 1 "VDM_AchDriveModeRollControl_Middle" 2 "VDM_AchDriveModeRollControl_High" 6 "VDM_AchDriveModeRollControl_InTransition" 7 "VDM_AchDriveModeRollControl_Null";
+VAL_ 929 VDM_AchDriveModeEsp 0 "VDM_AchDriveModeEsp_EspOn" 1 "VDM_AchDriveModeEsp_EspReduced" 2 "VDM_AchDriveModeEsp_EspOff" 6 "VDM_AchDriveModeEsp_InTransition" 7 "VDM_AchDriveModeEsp_Null";
+VAL_ 929 VDM_AchDriveModeEpas 0 "VDM_AchDriveModeEpas_TcsStable" 1 "VDM_AchDriveModeEpas_TcsSportRoad" 2 "VDM_AchDriveModeEpas_TcsSportOffRoad" 3 "VDM_AchDriveModeEpas_TcsOff" 7 "VDM_AchDriveModeEpas_Null";
+VAL_ 929 VDM_AchDriveModeTcs 0 "VDM_AchDriveModeTcs_Stable" 1 "VDM_AchDriveModeTcs_SportRoad" 2 "VDM_AchDriveModeTcs_SportOffRoad" 3 "VDM_AchDriveModeTcs_Off" 7 "VDM_AchDriveModeTcs_Null";
+VAL_ 1024 VCM_VehicleType 0 "VCM_VehicleType_Sna" 1 "VCM_VehicleType_R1T" 2 "VCM_VehicleType_R1S" 3 "VCM_VehicleType_Reserved_AProj" 4 "VCM_VehicleType_Reserved_BProj" 5 "VCM_VehicleType_Reserved_CProj" 6 "VCM_VehicleType_Reserved_DProj" 7 "VCM_VehicleType_Reserved_EProj";
+VAL_ 1024 VCM_HandOfDrive 0 "VCM_HandOfDrive_Lhd" 1 "VCM_HandOfDrive_Rhd";
+VAL_ 1024 VCM_BatterySize 0 "VCM_BatterySize_Sna" 1 "VCM_BatterySize_A105kW" 2 "VCM_BatterySize_A130kW" 3 "VCM_BatterySize_A180kW" 4 "VCM_BatterySize_BxxxkW" 5 "VCM_BatterySize_CxxxkW" 6 "VCM_BatterySize_DxxxkW" 7 "VCM_BatterySize_ExxxkW";
+VAL_ 1024 VCM_Market 0 "VCM_Market_Sna" 1 "VCM_Market_RegionB" 2 "VCM_Market_RegionC" 3 "VCM_Market_RegionD" 4 "VCM_Market_RegionE" 5 "VCM_Market_RegionF" 6 "VCM_Market_RegionG" 7 "VCM_Market_RegionH";
+VAL_ 1265 Cluster_Unit 0 "KPH" 1 "MPH";
+VAL_ 1640 OCS_FrontPassClass 0 "OCS_FrontPassClass_Classification_Unknown" 1 "OCS_FrontPassClass_Reserved_1" 2 "OCS_FrontPassClass_One_YO_CRS" 3 "OCS_FrontPassClass_Reserved_2" 4 "OCS_FrontPassClass_Reserved_3" 5 "OCS_FrontPassClass_Reserved_4" 6 "OCS_FrontPassClass_Small_Adult" 7 "OCS_FrontPassClass_Medium_Adult" 8 "OCS_FrontPassClass_Reserved_5" 9 "OCS_FrontPassClass_Reserved_6" 10 "OCS_FrontPassClass_Reserved_7" 11 "OCS_FrontPassClass_Reserved_8" 12 "OCS_FrontPassClass_Reserved_9" 13 "OCS_FrontPassClass_Reserved_10" 14 "OCS_FrontPassClass_Reserved_11" 15 "OCS_FrontPassClass_Reserved_12";
+VAL_ 1640 OCS_FrontPassClassValid 0 "Not_Valid" 1 "Valid";
+VAL_ 1640 OCS_FrontPassFaultStatus 0 "No_Fault_Present" 1 "Fault_Status" 2 "Reserved_1" 3 "Reserved_2";
+VAL_ 1640 OCS_Reserved_1 0 "OCS_Reserved_Reserved";
+VAL_ 1640 OCS_FrontPassSBRStatus 0 "Unknown" 1 "Empty" 2 "Occupied";
+VAL_ 1640 OCS_OperatingMode 0 "OCS_OperatingMode_Initialisation" 1 "OCS_OperatingMode_Normal_Mode" 2 "OCS_OperatingMode_Empty_Seat_Calibration_Active" 3 "OCS_OperatingMode_Barrier_Airbag_Test_Mode" 4 "OCS_OperatingMode_Voltage_Out_Of_Range" 5 "OCS_OperatingMode_Falut_Active" 6 "OCS_OperatingMode_Reserved_1" 7 "OCS_OperatingMode_Reserved_2" 8 "OCS_OperatingMode_Reserved_3" 9 "OCS_OperatingMode_Reserved_4" 10 "OCS_OperatingMode_Reserved_5" 11 "OCS_OperatingMode_Reserved_6" 12 "OCS_OperatingMode_Reserved_7" 13 "OCS_OperatingMode_Reserved_8" 14 "OCS_OperatingMode_Reserved_9" 15 "OCS_OperatingMode_Reserved_10";
+VAL_ 1640 OCS_Reserved_2 0 "OCS_Reserved_2_Reserved";
diff --git a/iqdbc_repo/iqdbc/dbc/subaru_forester_2017_generated.dbc b/iqdbc_repo/iqdbc/dbc/subaru_forester_2017_generated.dbc
new file mode 100644
index 000000000..16acdc4d9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/subaru_forester_2017_generated.dbc
@@ -0,0 +1,269 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _subaru_preglobal_2015.dbc starts here";
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX
+ SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 208 G_Sensor: 8 XXX
+ SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX
+ SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX
+ SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX
+
+BO_ 209 Brake_Pedal: 4 XXX
+ SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX
+ SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 210 Brake_2: 8 XXX
+ SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 211 Brake_Type: 8 XXX
+ SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 212 Wheel_Speeds: 8 XXX
+ SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX
+
+BO_ 320 Throttle: 8 XXX
+ SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX
+ SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX
+ SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 321 Engine: 8 XXX
+ SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX
+ SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX
+
+BO_ 324 CruiseControl: 8 XXX
+ SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 328 Transmission: 8 XXX
+ SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX
+ SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 329 CVT_Ratio: 8 XXX
+
+BO_ 336 Brake_Pressure: 8 XXX
+ SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 338 Stalk: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 352 ES_Brake: 8 XXX
+ SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 353 ES_Distance: 8 XXX
+ SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX
+ SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX
+ SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 354 ES_Status: 8 XXX
+ SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 356 ES_LKAS: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX
+ SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 359 ES_LDW: 8 XXX
+ SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 604 BSD_RCTA: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ State : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 642 Dashlights: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 880 Steering_Torque_2: 8 XXX
+ SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 884 BodyInfo: 8 XXX
+ SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 864 Engine_Temp: 8 XXX
+ SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 866 Fuel: 8 XXX
+
+BO_ 977 Dash_State2: 8 XXX
+ SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1745 Dash_State: 8 XXX
+ SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 320 Off_Throttle_2 "Less sensitive";
+CM_ SG_ 320 Throttle_Body "Throttle related";
+CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep";
+CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission";
+CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage";
+CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering";
+CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert ";
+CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart";
+CM_ SG_ 359 Sig1All_Depart "Left and right depart";
+CM_ SG_ 359 Sig2All_Depart "Left and right depart";
+CM_ SG_ 359 All_depart_2015 "always 1 on 2017";
+CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane";
+CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane";
+CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 642 COUNTER "Affected by signals";
+CM_ SG_ 642 SEATBELT_FL "Driver seatbelt";
+CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371";
+CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial";
+
+VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P";
+
+CM_ "subaru_forester_2017.dbc starts here";
+
+BO_ 355 ES_DashStatus: 8 XXX
+ SG_ Not_Ready_Startup : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 17|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 40|3@1+ (1,0) [0|7] "" XXX
+ SG_ Brake : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ Car_Follow : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX
+
+BO_ 881 Steering_Torque: 8 XXX
+ SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX
+ SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/subaru_global_2017_generated.dbc b/iqdbc_repo/iqdbc/dbc/subaru_global_2017_generated.dbc
new file mode 100644
index 000000000..f9ac24748
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/subaru_global_2017_generated.dbc
@@ -0,0 +1,375 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _subaru_global.dbc starts here";
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [0|65535] "" XXX
+ SG_ COUNTER : 25|3@1+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 64 Throttle: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Engine_RPM : 16|13@1+ (1,0) [0|8191] "" XXX
+ SG_ Neutral : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal3 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ Off_Accel : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 316 Brake_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX
+ SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX
+ SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 326 Cruise_Buttons: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX
+ SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Set : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX
+
+BO_ 315 G_Sensor: 8 XXX
+ SG_ Lateral : 48|8@1- (-0.1,0) [0|255] "m/s2" XXX
+ SG_ Longitudinal : 56|8@1- (-0.1,0) [0|255] "m/s2" XXX
+
+BO_ 314 Wheel_Speeds: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ FR : 12|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ RR : 25|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ FL : 51|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ RL : 38|13@1+ (0.057,0) [0|255] "kph" XXX
+
+BO_ 280 Steering_Torque_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steer_Torque_Output : 13|11@1- (-10,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|511] "" XXX
+ SG_ Steer_Torque_Sensor : 45|11@1- (-1,0) [0|255] "" XXX
+ SG_ Steering_Active : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ Steering_Disabled : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 281 Steering_Torque: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steer_Error_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 16|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_2 : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Warning : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steering_Angle : 32|16@1- (-0.0217,0) [-600|600] "" X
+ SG_ Steer_Torque_Output : 48|11@1- (-10,0) [-1000|1000] "" XXX
+
+BO_ 282 Steering_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX
+ SG_ Steering_Angle : 24|17@1- (-0.01,0) [0|1] "" XXX
+
+BO_ 312 Brake_Pressure_L_R: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steering_Angle : 16|16@1- (-0.1,0) [-3276.8|3276.7] "" XXX
+ SG_ Brake_1 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_2 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 313 Brake_Pedal: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Speed : 16|12@1+ (0.05625,0) [0|255] "kph" XXX
+ SG_ Signal2 : 28|6@1+ (1,0) [0|63] "" XXX
+ SG_ Brake_Lights : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal : 36|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal4 : 48|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 372 Engine_Stop_Start: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ STOP_START_STATE : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 290 ES_LKAS: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Output : 16|13@1- (-1,0) [-8191|8191] "" XXX
+ SG_ LKAS_Request : 29|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 292 ES_LKAS_ANGLE: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Request : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Output : 40|17@1- (-0.01,0) [0|1] "deg" XXX
+ SG_ SET_3 : 60|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 544 ES_Brake: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Pressure : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ AEB_Status : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ Cruise_Brake_Lights : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Fault : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 40|24@1+ (1,0) [0|16777215] "" XXX
+
+BO_ 577 Cruise_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Clutch_Depressed : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 51|12@0+ (1,0) [0|120] "" XXX
+ SG_ Cruise_On : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 55|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 552 BSD_RCTA: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ R_ADJACENT : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 59|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 912 Dashlights: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ UNITS : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ICY_ROAD : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ SEATBELT_FL : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ STOP_START : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 940 BodyInfo: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ DOOR_OPEN_FL : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ DASH_BTN_LIGHTS : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOWBEAM : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ HIGHBEAM : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ FOG_LIGHTS : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ WIPERS : 62|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 801 ES_DashStatus: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ PCB_Off : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_Off : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_State_Msg : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_State_Msg : 20|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal2 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Soft_Disable : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Status_Msg : 25|2@1+ (1,0) [0|3] "" XXX
+ SG_ Signal3 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal4 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Conventional_Cruise : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 33|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_Disengaged_Dash : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal6 : 37|3@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Display_Own_Car : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Lights : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Car_Follow : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal7 : 53|3@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX
+ SG_ Cruise_State : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 802 ES_LKAS_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_Alert_Msg : 12|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal1 : 15|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Dash_State : 18|2@1+ (1,0) [0|2] "" XXX
+ SG_ Signal2 : 20|3@1+ (1,0) [0|7] "" XXX
+ SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Enable : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Light_Blink : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Right_Line_Enable : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Right_Line_Light_Blink : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Visible : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_Right_Line_Visible : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_Alert : 32|5@1+ (1,0) [0|31] "" XXX
+ SG_ Signal3 : 37|27@1+ (1,0) [0|1] "" XXX
+
+BO_ 803 ES_Infotainment: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_Blue_Lines : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKAS_State_Infotainment : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ Signal2 : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 722 AC_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ AC_Mode : 37|3@1+ (1,0) [0|1] "" XXX
+ SG_ AC_ON : 24|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 1677 Dash_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Units : 29|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 554 ES_HighBeamAssist: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ HBA_Available : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 805 ES_STATIC_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_3 : 23|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 289 ES_STATIC_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_3 : 15|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_Fault : 18|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 64 Throttle_Combo "Throttle Cruise + Pedal";
+CM_ SG_ 313 Brake_Lights "Driver or Cruise Brake on";
+CM_ SG_ 544 Cruise_Brake_Lights "1 = switch on brake lights";
+CM_ SG_ 544 Brake_Pressure "Winds down after cruise disabled. Also can be non-zero when likely preparing for AEB";
+CM_ SG_ 544 Signal3 "Usually goes to 2 if AEB_Status is 4";
+CM_ SG_ 544 AEB_Status "Occasionally is 4 instead of 8 while Brake_Pressure is non-zero, unsure why";
+CM_ SG_ 801 Cruise_Activated_Dash "Falls during user gas or standstill. This is likely only a UI signal to the dash to show if ACC is actually actuating";
+CM_ SG_ 801 PCB_Off "Pre-Collision Braking off";
+CM_ SG_ 801 Brake_Lights "Driver or Cruise brake on";
+CM_ SG_ 801 Cruise_State "0 = Normal, 1 = Hold+User Brake, 2 = Ready, 3 = Hold";
+CM_ SG_ 801 Far_Distance "1=0-5m, 2=5-10m, 3=10-15m, 4=15-20m, 5=20-25m, 6=25-30m, 7=30-35m, 8=35-40m, 9=40-45m, 10=45-50m, 11=50-55m, 12=55-60m, 13=60-65m, 14=65-70m, 15=75m+";
+CM_ SG_ 801 LKAS_State_Msg "1 = LKAS_Off_Sharp_Curve, 2 = Keep_Hands_On_Steering_wheel_disabled, 3 = LKAS_Off, 4 = LKAS_Off_Too_Slow, 5 = LKAS_Off_Too_Fast";
+CM_ SG_ 801 Cruise_State_Msg "1 = Cruise_Off_Steep_Slope, 2 = Cruise_lvl1_eco, 3 = Cruise_lvl2_comfort, 4 = Cruise_off_empty_reason, 5 = Cruise_off, 6 = Cruise_Unable_to_set, 7 = Cruise_Unable_to_set_brakes_applied, 8 = Eyesight_not_ready, 9 = Cruise_lvl3_standard, 10 = Cruise_lvl4_dynamic, 11 = Cruise_Unable_to_set_steep_slope";
+CM_ SG_ 801 Cruise_Soft_Disable "Eyesight soft disable (eg direct sunlight)";
+CM_ SG_ 801 Cruise_Status_Msg "1 = Disabled_Bad_Visibility, 2 = Disabled_Check_Manual";
+CM_ SG_ 802 LKAS_ACTIVE "Turns on the full LKAS dash display";
+CM_ SG_ 802 LKAS_Alert_Msg "1 = Keep_Hands_On_Wheel, 6 = Pre_Collision_Braking, 7 = Keep_Hands_On_Wheel_Off";
+CM_ SG_ 802 LKAS_Alert "1 = FCW_Cont_Beep, 2 = FCW_Repeated_Beep, 3 = Throttle_Management_Activated_Warning, 4 = Throttle_Management_Activated_Alert, 5 = Pre_Collision_Activated_Alert, 8 = Traffic_Light_Ahead, 9 = Apply_Brake_to_Hold Position, 11 = LDW_Right, 12 = LDW_Left, 13 = Stay_Alert, 14 = Lead_Vehicle_Start_Alert, 18 = Keep_Hands_On_Steering_Alert, 24 = Audio_Beep, 25 = Audio_Lead_Car_Change, 26 = Audio_ACC_Disengaged, 27 = Audio_LKAS_disabled, 28 = Audio_Ding_Ding, 30 = Audio_Repeated_Beep";
+CM_ SG_ 802 LKAS_Left_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange";
+CM_ SG_ 802 LKAS_Dash_State "0 = Off, 1 = Ready, 2 = Active";
+CM_ SG_ 802 LKAS_Right_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange";
+CM_ SG_ 912 UNITS "0 = Metric, 1 = Imperial";
+CM_ SG_ 912 ICY_ROAD "1 = DASHLIGHT ON, 2 = WARNING, 3 = OFF";
+VAL_ 544 AEB_Status 12 "AEB related" 8 "AEB actuation" 4 "AEB related" 0 "No AEB actuation";
+
+CM_ "subaru_global_2017.dbc starts here";
+
+BO_ 72 Transmission: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Gear : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ RPM : 40|15@1+ (1,0) [0|65535] "" XXX
+
+BO_ 73 CVT: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ CVT_Gear : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 545 ES_Distance: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Throttle : 16|13@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal2 : 29|3@1+ (1,0) [0|15] "" XXX
+ SG_ Car_Follow : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Low_Speed_Follow : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Soft_Disable : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal7 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Distance_Swap : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_EPB : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal4 : 39|1@0+ (1,0) [0|1] "" XXX
+ SG_ Close_Distance : 40|8@1+ (0.019607,0) [0|5] "m" XXX
+ SG_ Signal5 : 48|8@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Cancel : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Resume : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal6 : 59|5@1+ (1,0) [0|1] "" XXX
+
+BO_ 546 ES_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|3@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_RPM : 16|13@1+ (1,0) [0|4095] "" XXX
+ SG_ Cruise_Activated : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ Brake_Lights : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Hold : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 32|32@1+ (1,0) [0|1] "" XXX
+
+BO_ 576 CruiseControl: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|28@1+ (1,0) [0|268435455] "" XXX
+ SG_ Cruise_On : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 42|22@1+ (1,0) [0|4194303] "" XXX
+
+CM_ SG_ 545 Cruise_Throttle "RPM-like output signal";
+CM_ SG_ 545 Cruise_EPB "1 = Electric Parking Brake set";
+CM_ SG_ 545 Distance_Swap "Switch from Close to Far distance";
+CM_ SG_ 545 Cruise_Soft_Disable "Eyesight Temporary disable, sets CruiseControl Activated = 0";
+CM_ SG_ 546 Cruise_RPM "ES RPM output for ECM and TCM";
+CM_ SG_ 546 Signal3 "0 when cruise_activated = 1";
+CM_ SG_ 803 Signal1 "Seems to be static, set only on some cars";
+CM_ SG_ 803 Signal2 "Seems to be static, set only on some cars";
+VAL_ 803 LKAS_Blue_Lines 0 "no modifier" 2 "changes lines to blue";
+VAL_ 803 LKAS_State_Infotainment 0 "none" 2 "Obstacle Detected" 3 "Keep Hands On Wheel" 4 "Keep Hands On Wheel Off";
+VAL_ 72 Gear 2 "N" 3 "R" 4 "P" 121 "D" 137 "1" 145 "2" 153 "3" 161 "4" 169 "5" 177 "6";
diff --git a/iqdbc_repo/iqdbc/dbc/subaru_global_2020_hybrid_generated.dbc b/iqdbc_repo/iqdbc/dbc/subaru_global_2020_hybrid_generated.dbc
new file mode 100644
index 000000000..1767a924d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/subaru_global_2020_hybrid_generated.dbc
@@ -0,0 +1,328 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _subaru_global.dbc starts here";
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [0|65535] "" XXX
+ SG_ COUNTER : 25|3@1+ (1,0) [0|7] "" XXX
+ SG_ CHECKSUM : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 64 Throttle: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Engine_RPM : 16|13@1+ (1,0) [0|8191] "" XXX
+ SG_ Neutral : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal3 : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ Off_Accel : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 316 Brake_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX
+ SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX
+ SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 326 Cruise_Buttons: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX
+ SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Set : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX
+
+BO_ 315 G_Sensor: 8 XXX
+ SG_ Lateral : 48|8@1- (-0.1,0) [0|255] "m/s2" XXX
+ SG_ Longitudinal : 56|8@1- (-0.1,0) [0|255] "m/s2" XXX
+
+BO_ 314 Wheel_Speeds: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ FR : 12|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ RR : 25|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ FL : 51|13@1+ (0.057,0) [0|255] "kph" XXX
+ SG_ RL : 38|13@1+ (0.057,0) [0|255] "kph" XXX
+
+BO_ 280 Steering_Torque_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steer_Torque_Output : 13|11@1- (-10,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|511] "" XXX
+ SG_ Steer_Torque_Sensor : 45|11@1- (-1,0) [0|255] "" XXX
+ SG_ Steering_Active : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ Steering_Disabled : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 281 Steering_Torque: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steer_Error_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 16|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_2 : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Warning : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steering_Angle : 32|16@1- (-0.0217,0) [-600|600] "" X
+ SG_ Steer_Torque_Output : 48|11@1- (-10,0) [-1000|1000] "" XXX
+
+BO_ 282 Steering_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX
+ SG_ Steering_Angle : 24|17@1- (-0.01,0) [0|1] "" XXX
+
+BO_ 312 Brake_Pressure_L_R: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Steering_Angle : 16|16@1- (-0.1,0) [-3276.8|3276.7] "" XXX
+ SG_ Brake_1 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_2 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 313 Brake_Pedal: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Speed : 16|12@1+ (0.05625,0) [0|255] "kph" XXX
+ SG_ Signal2 : 28|6@1+ (1,0) [0|63] "" XXX
+ SG_ Brake_Lights : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal : 36|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal4 : 48|16@1+ (1,0) [0|65535] "" XXX
+
+BO_ 372 Engine_Stop_Start: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ STOP_START_STATE : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 290 ES_LKAS: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_1 : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Output : 16|13@1- (-1,0) [-8191|8191] "" XXX
+ SG_ LKAS_Request : 29|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 292 ES_LKAS_ANGLE: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Request : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Output : 40|17@1- (-0.01,0) [0|1] "deg" XXX
+ SG_ SET_3 : 60|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 544 ES_Brake: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Pressure : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ AEB_Status : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ Cruise_Brake_Lights : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Fault : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 40|24@1+ (1,0) [0|16777215] "" XXX
+
+BO_ 577 Cruise_Status: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Clutch_Depressed : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 51|12@0+ (1,0) [0|120] "" XXX
+ SG_ Cruise_On : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 55|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 552 BSD_RCTA: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ R_ADJACENT : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 59|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 912 Dashlights: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ UNITS : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ICY_ROAD : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ SEATBELT_FL : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ STOP_START : 54|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 940 BodyInfo: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ DOOR_OPEN_FL : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_TRUNK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ DASH_BTN_LIGHTS : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOWBEAM : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ HIGHBEAM : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ FOG_LIGHTS : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ WIPERS : 62|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 801 ES_DashStatus: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ PCB_Off : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_Off : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_State_Msg : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_State_Msg : 20|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal2 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Soft_Disable : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Status_Msg : 25|2@1+ (1,0) [0|3] "" XXX
+ SG_ Signal3 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal4 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Conventional_Cruise : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 33|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_Disengaged_Dash : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal6 : 37|3@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Set_Speed : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Display_Own_Car : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Lights : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Car_Follow : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal7 : 53|3@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX
+ SG_ Cruise_State : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 802 ES_LKAS_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_Alert_Msg : 12|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal1 : 15|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Dash_State : 18|2@1+ (1,0) [0|2] "" XXX
+ SG_ Signal2 : 20|3@1+ (1,0) [0|7] "" XXX
+ SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Enable : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Light_Blink : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Right_Line_Enable : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Right_Line_Light_Blink : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Left_Line_Visible : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_Right_Line_Visible : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ LKAS_Alert : 32|5@1+ (1,0) [0|31] "" XXX
+ SG_ Signal3 : 37|27@1+ (1,0) [0|1] "" XXX
+
+BO_ 803 ES_Infotainment: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LKAS_Blue_Lines : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 19|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKAS_State_Infotainment : 22|3@0+ (1,0) [0|7] "" XXX
+ SG_ Signal2 : 24|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 722 AC_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ AC_Mode : 37|3@1+ (1,0) [0|1] "" XXX
+ SG_ AC_ON : 24|2@1+ (1,0) [0|1] "" XXX
+
+BO_ 1677 Dash_State: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Units : 29|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 554 ES_HighBeamAssist: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ HBA_Available : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 805 ES_STATIC_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_3 : 23|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 289 ES_STATIC_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SET_3 : 15|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_Fault : 18|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 64 Throttle_Combo "Throttle Cruise + Pedal";
+CM_ SG_ 313 Brake_Lights "Driver or Cruise Brake on";
+CM_ SG_ 544 Cruise_Brake_Lights "1 = switch on brake lights";
+CM_ SG_ 544 Brake_Pressure "Winds down after cruise disabled. Also can be non-zero when likely preparing for AEB";
+CM_ SG_ 544 Signal3 "Usually goes to 2 if AEB_Status is 4";
+CM_ SG_ 544 AEB_Status "Occasionally is 4 instead of 8 while Brake_Pressure is non-zero, unsure why";
+CM_ SG_ 801 Cruise_Activated_Dash "Falls during user gas or standstill. This is likely only a UI signal to the dash to show if ACC is actually actuating";
+CM_ SG_ 801 PCB_Off "Pre-Collision Braking off";
+CM_ SG_ 801 Brake_Lights "Driver or Cruise brake on";
+CM_ SG_ 801 Cruise_State "0 = Normal, 1 = Hold+User Brake, 2 = Ready, 3 = Hold";
+CM_ SG_ 801 Far_Distance "1=0-5m, 2=5-10m, 3=10-15m, 4=15-20m, 5=20-25m, 6=25-30m, 7=30-35m, 8=35-40m, 9=40-45m, 10=45-50m, 11=50-55m, 12=55-60m, 13=60-65m, 14=65-70m, 15=75m+";
+CM_ SG_ 801 LKAS_State_Msg "1 = LKAS_Off_Sharp_Curve, 2 = Keep_Hands_On_Steering_wheel_disabled, 3 = LKAS_Off, 4 = LKAS_Off_Too_Slow, 5 = LKAS_Off_Too_Fast";
+CM_ SG_ 801 Cruise_State_Msg "1 = Cruise_Off_Steep_Slope, 2 = Cruise_lvl1_eco, 3 = Cruise_lvl2_comfort, 4 = Cruise_off_empty_reason, 5 = Cruise_off, 6 = Cruise_Unable_to_set, 7 = Cruise_Unable_to_set_brakes_applied, 8 = Eyesight_not_ready, 9 = Cruise_lvl3_standard, 10 = Cruise_lvl4_dynamic, 11 = Cruise_Unable_to_set_steep_slope";
+CM_ SG_ 801 Cruise_Soft_Disable "Eyesight soft disable (eg direct sunlight)";
+CM_ SG_ 801 Cruise_Status_Msg "1 = Disabled_Bad_Visibility, 2 = Disabled_Check_Manual";
+CM_ SG_ 802 LKAS_ACTIVE "Turns on the full LKAS dash display";
+CM_ SG_ 802 LKAS_Alert_Msg "1 = Keep_Hands_On_Wheel, 6 = Pre_Collision_Braking, 7 = Keep_Hands_On_Wheel_Off";
+CM_ SG_ 802 LKAS_Alert "1 = FCW_Cont_Beep, 2 = FCW_Repeated_Beep, 3 = Throttle_Management_Activated_Warning, 4 = Throttle_Management_Activated_Alert, 5 = Pre_Collision_Activated_Alert, 8 = Traffic_Light_Ahead, 9 = Apply_Brake_to_Hold Position, 11 = LDW_Right, 12 = LDW_Left, 13 = Stay_Alert, 14 = Lead_Vehicle_Start_Alert, 18 = Keep_Hands_On_Steering_Alert, 24 = Audio_Beep, 25 = Audio_Lead_Car_Change, 26 = Audio_ACC_Disengaged, 27 = Audio_LKAS_disabled, 28 = Audio_Ding_Ding, 30 = Audio_Repeated_Beep";
+CM_ SG_ 802 LKAS_Left_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange";
+CM_ SG_ 802 LKAS_Dash_State "0 = Off, 1 = Ready, 2 = Active";
+CM_ SG_ 802 LKAS_Right_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange";
+CM_ SG_ 912 UNITS "0 = Metric, 1 = Imperial";
+CM_ SG_ 912 ICY_ROAD "1 = DASHLIGHT ON, 2 = WARNING, 3 = OFF";
+VAL_ 544 AEB_Status 12 "AEB related" 8 "AEB actuation" 4 "AEB related" 0 "No AEB actuation";
+
+CM_ "subaru_global_2020_hybrid.dbc starts here";
+
+BO_ 39 Cruise_Status_2: 8 XXX
+ SG_ Cruise_Activated : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 295 Transmission: 8 XXX
+ SG_ Gear : 44|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 360 Throttle_Hybrid: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 550 Brake_Hybrid: 8 XXX
+ SG_ Brake_Pedal : 24|8@1+ (1,0) [0|1] "" XXX
+ SG_ Brake : 37|1@1+ (1,0) [0|1] "" XXX
+
+VAL_ 295 Gear 0 "P" 1 "R" 3 "D";
diff --git a/iqdbc_repo/iqdbc/dbc/subaru_outback_2015_generated.dbc b/iqdbc_repo/iqdbc/dbc/subaru_outback_2015_generated.dbc
new file mode 100644
index 000000000..0cc6d2963
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/subaru_outback_2015_generated.dbc
@@ -0,0 +1,281 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _subaru_preglobal_2015.dbc starts here";
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX
+ SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 208 G_Sensor: 8 XXX
+ SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX
+ SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX
+ SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX
+
+BO_ 209 Brake_Pedal: 4 XXX
+ SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX
+ SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 210 Brake_2: 8 XXX
+ SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 211 Brake_Type: 8 XXX
+ SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 212 Wheel_Speeds: 8 XXX
+ SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX
+
+BO_ 320 Throttle: 8 XXX
+ SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX
+ SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX
+ SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 321 Engine: 8 XXX
+ SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX
+ SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX
+
+BO_ 324 CruiseControl: 8 XXX
+ SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 328 Transmission: 8 XXX
+ SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX
+ SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 329 CVT_Ratio: 8 XXX
+
+BO_ 336 Brake_Pressure: 8 XXX
+ SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 338 Stalk: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 352 ES_Brake: 8 XXX
+ SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 353 ES_Distance: 8 XXX
+ SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX
+ SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX
+ SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 354 ES_Status: 8 XXX
+ SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 356 ES_LKAS: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX
+ SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 359 ES_LDW: 8 XXX
+ SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 604 BSD_RCTA: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ State : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 642 Dashlights: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 880 Steering_Torque_2: 8 XXX
+ SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 884 BodyInfo: 8 XXX
+ SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 864 Engine_Temp: 8 XXX
+ SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 866 Fuel: 8 XXX
+
+BO_ 977 Dash_State2: 8 XXX
+ SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1745 Dash_State: 8 XXX
+ SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 320 Off_Throttle_2 "Less sensitive";
+CM_ SG_ 320 Throttle_Body "Throttle related";
+CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep";
+CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission";
+CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage";
+CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering";
+CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert ";
+CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart";
+CM_ SG_ 359 Sig1All_Depart "Left and right depart";
+CM_ SG_ 359 Sig2All_Depart "Left and right depart";
+CM_ SG_ 359 All_depart_2015 "always 1 on 2017";
+CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane";
+CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane";
+CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 642 COUNTER "Affected by signals";
+CM_ SG_ 642 SEATBELT_FL "Driver seatbelt";
+CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371";
+CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial";
+
+VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P";
+
+CM_ "subaru_outback_2015.dbc starts here";
+
+BO_ 358 ES_DashStatus: 8 XXX
+ SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX
+ SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX
+ SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX
+
+BO_ 881 Steering_Torque: 8 XXX
+ SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX
+ SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (1,0) [-1000|1000] "" XXX
+ SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX
+
+CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage";
+CM_ SG_ 358 Cruise_Fault "No engagement until restart";
+CM_ SG_ 358 Car_Follow "lead car detected";
diff --git a/iqdbc_repo/iqdbc/dbc/subaru_outback_2019_generated.dbc b/iqdbc_repo/iqdbc/dbc/subaru_outback_2019_generated.dbc
new file mode 100644
index 000000000..7d159d2cf
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/subaru_outback_2019_generated.dbc
@@ -0,0 +1,281 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _subaru_preglobal_2015.dbc starts here";
+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 X
+
+
+BO_ 2 Steering: 8 XXX
+ SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX
+ SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 208 G_Sensor: 8 XXX
+ SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX
+ SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX
+ SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX
+
+BO_ 209 Brake_Pedal: 4 XXX
+ SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX
+ SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 210 Brake_2: 8 XXX
+ SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 211 Brake_Type: 8 XXX
+ SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 212 Wheel_Speeds: 8 XXX
+ SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX
+ SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX
+
+BO_ 320 Throttle: 8 XXX
+ SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX
+ SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX
+ SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 321 Engine: 8 XXX
+ SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX
+ SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX
+
+BO_ 324 CruiseControl: 8 XXX
+ SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 328 Transmission: 8 XXX
+ SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX
+ SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 329 CVT_Ratio: 8 XXX
+
+BO_ 336 Brake_Pressure: 8 XXX
+ SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 338 Stalk: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 352 ES_Brake: 8 XXX
+ SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 353 ES_Distance: 8 XXX
+ SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX
+ SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX
+ SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX
+ SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 354 ES_Status: 8 XXX
+ SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX
+ SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 356 ES_LKAS: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX
+ SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 359 ES_LDW: 8 XXX
+ SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 604 BSD_RCTA: 8 XXX
+ SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ State : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 642 Dashlights: 8 XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 880 Steering_Torque_2: 8 XXX
+ SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 884 BodyInfo: 8 XXX
+ SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 864 Engine_Temp: 8 XXX
+ SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX
+ SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 866 Fuel: 8 XXX
+
+BO_ 977 Dash_State2: 8 XXX
+ SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1745 Dash_State: 8 XXX
+ SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 320 Off_Throttle_2 "Less sensitive";
+CM_ SG_ 320 Throttle_Body "Throttle related";
+CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear";
+CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep";
+CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission";
+CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage";
+CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering";
+CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert ";
+CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart";
+CM_ SG_ 359 Sig1All_Depart "Left and right depart";
+CM_ SG_ 359 Sig2All_Depart "Left and right depart";
+CM_ SG_ 359 All_depart_2015 "always 1 on 2017";
+CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane";
+CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane";
+CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear";
+CM_ SG_ 642 COUNTER "Affected by signals";
+CM_ SG_ 642 SEATBELT_FL "Driver seatbelt";
+CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371";
+CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial";
+
+VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P";
+
+CM_ "subaru_outback_2019.dbc starts here";
+
+BO_ 358 ES_DashStatus: 8 XXX
+ SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX
+ SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX
+ SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX
+ SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX
+
+BO_ 881 Steering_Torque: 8 XXX
+ SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX
+ SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX
+ SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX
+ SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX
+
+CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage";
+CM_ SG_ 358 Cruise_Fault "No engagement until restart";
+CM_ SG_ 358 Car_Follow "lead car detected";
diff --git a/iqdbc_repo/iqdbc/dbc/tesla_can.dbc b/iqdbc_repo/iqdbc/dbc/tesla_can.dbc
new file mode 100644
index 000000000..56624c3e5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/tesla_can.dbc
@@ -0,0 +1,901 @@
+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_:
+ NEO
+ MCU
+ GTW
+ EPAS
+ DI
+ ESP
+ SBW
+ STW
+ APP
+ DAS
+ XXX
+
+VAL_TABLE_ StW_AnglHP_Spd 16383 "SNA" ;
+VAL_TABLE_ DI_aebFaultReason 15 "DI_AEB_FAULT_DAS_REQ_DI_UNAVAIL" 14 "DI_AEB_FAULT_ACCEL_REQ_INVALID" 13 "DI_AEB_FAULT_MIN_TIME_BTWN_EVENTS" 12 "DI_AEB_FAULT_ESP_MIA" 11 "DI_AEB_FAULT_ESP_FAULT" 10 "DI_AEB_FAULT_EPB_NOT_PARKED" 9 "DI_AEB_FAULT_ACCEL_OUT_OF_BOUNDS" 8 "DI_AEB_FAULT_PM_REQUEST" 7 "DI_AEB_FAULT_VEL_EST_ABNORMAL" 6 "DI_AEB_FAULT_DAS_SNA" 5 "DI_AEB_FAULT_DAS_CONTROL_MIA" 4 "DI_AEB_FAULT_SPEED_DELTA" 3 "DI_AEB_FAULT_EBR_FAULT" 2 "DI_AEB_FAULT_PM_MIA" 1 "DI_AEB_FAULT_EPB_MIA" 0 "DI_AEB_FAULT_NONE" ;
+VAL_TABLE_ DI_aebLockState 3 "AEB_LOCK_STATE_SNA" 2 "AEB_LOCK_STATE_UNUSED" 1 "AEB_LOCK_STATE_UNLOCKED" 0 "AEB_LOCK_STATE_LOCKED" ;
+VAL_TABLE_ DI_aebSmState 7 "DI_AEB_STATE_FAULT" 6 "DI_AEB_STATE_EXIT" 5 "DI_AEB_STATE_STANDSTILL" 4 "DI_AEB_STATE_STOPPING" 3 "DI_AEB_STATE_ENABLE" 2 "DI_AEB_STATE_ENABLE_INIT" 1 "DI_AEB_STATE_STANDBY" 0 "DI_AEB_STATE_UNAVAILABLE" ;
+VAL_TABLE_ DI_aebState 7 "AEB_CAN_STATE_SNA" 4 "AEB_CAN_STATE_FAULT" 3 "AEB_CAN_STATE_STANDSTILL" 2 "AEB_CAN_STATE_ENABLED" 1 "AEB_CAN_STATE_STANDBY" 0 "AEB_CAN_STATE_UNAVAILABLE" ;
+VAL_TABLE_ DI_epbInterfaceReady 1 "EPB_INTERFACE_READY" 0 "EPB_INTERFACE_NOT_READY" ;
+VAL_TABLE_ DI_gear 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ;
+VAL_TABLE_ DI_gpoReason 8 "DI_GPO_NUMREASONS" 7 "DI_GPO_CAPACITOR_OVERTEMP" 6 "DI_GPO_NOT_ENOUGH_12V" 5 "DI_GPO_NO_BATTERY_POWER" 4 "DI_GPO_AMBIENT_OVERTEMP" 3 "DI_GPO_FLUID_DELTAT" 2 "DI_GPO_STATOR_OVERTEMP" 1 "DI_GPO_HEATSINK_OVERTEMP" 0 "DI_GPO_OUTLET_OVERTEMP" ;
+VAL_TABLE_ DI_immobilizerCondition 1 "DI_IMM_CONDITION_LEARNED" 0 "DI_IMM_CONDITION_VIRGIN_SNA" ;
+VAL_TABLE_ DI_immobilizerState 7 "DI_IMM_STATE_FAULT" 6 "DI_IMM_STATE_FAULTRETRY" 5 "DI_IMM_STATE_RESET" 4 "DI_IMM_STATE_LEARN" 3 "DI_IMM_STATE_DISARMED" 2 "DI_IMM_STATE_AUTHENTICATING" 1 "DI_IMM_STATE_REQUEST" 0 "DI_IMM_STATE_INIT_SNA" ;
+VAL_TABLE_ DI_limpReason 24 "DI_LIMP_NUMREASONS" 23 "DI_LIMP_CAPACITOR_OVERTEMP" 22 "DI_LIMP_GTW_MIA" 21 "DI_LIMP_TRQCMD_VALIDITY_UNKNOWN" 20 "DI_LIMP_DI_MIA" 19 "DI_LIMP_CONFIG_MISMATCH" 18 "DI_LIMP_HEATSINK_TEMP" 17 "DI_LIMP_PMREQUEST" 16 "DI_LIMP_PMHEARTBEAT" 15 "DI_LIMP_TRQ_CROSS_CHECK" 14 "DI_LIMP_EXTERNAL_COMMAND" 13 "DI_LIMP_WRONG_CS_CALIBRATION" 12 "DI_LIMP_STATOR_TEMP" 11 "DI_LIMP_DELTAT_TOO_NEGATIVE" 10 "DI_LIMP_DELTAT_TOO_POSITIVE" 9 "DI_LIMP_AMBIENT_TEMP" 8 "DI_LIMP_OUTLET_TEMP" 7 "DI_LIMP_LOW_FLOW" 6 "DI_LIMP_BMS_MIA" 5 "DI_LIMP_12V_SUPPLY_UNDERVOLTAGE" 4 "DI_LIMP_NO_FLUID" 3 "DI_LIMP_NO_FUNC_HEATSINK_SENSOR" 2 "DI_LIMP_NO_FUNC_STATORT_SENSOR" 1 "DI_LIMP_BUSV_SENSOR_IRRATIONAL" 0 "DI_LIMP_PHASE_IMBALANCE" ;
+VAL_TABLE_ DI_mode 2 "DI_MODE_DYNO" 1 "DI_MODE_DRIVE" 0 "DI_MODE_UNDEF" ;
+VAL_TABLE_ DI_motorType 14 "DI_MOTOR_F2AE" 13 "DI_MOTOR_F2AD" 12 "DI_MOTOR_F2AC" 11 "DI_MOTOR_F2AB" 10 "DI_MOTOR_F1AC" 9 "DI_MOTOR_SSR1A" 8 "DI_MOTOR_F1A" 7 "DI_MOTOR_M7M6" 6 "DI_MOTOR_M8A" 5 "DI_MOTOR_M7M5" 4 "DI_MOTOR_M7M4" 3 "DI_MOTOR_M7M3" 2 "DI_MOTOR_ROADSTER_SPORT" 1 "DI_MOTOR_ROADSTER_BASE" 0 "DI_MOTOR_SNA" ;
+VAL_TABLE_ DI_speedUnits 1 "DI_SPEED_KPH" 0 "DI_SPEED_MPH" ;
+VAL_TABLE_ DI_state 4 "DI_STATE_ENABLE" 3 "DI_STATE_FAULT" 2 "DI_STATE_CLEAR_FAULT" 1 "DI_STATE_STANDBY" 0 "DI_STATE_PREAUTH" ;
+VAL_TABLE_ DI_velocityEstimatorState 4 "VE_STATE_BACKUP_MOTOR" 3 "VE_STATE_BACKUP_WHEELS_B" 2 "VE_STATE_BACKUP_WHEELS_A" 1 "VE_STATE_WHEELS_NORMAL" 0 "VE_STATE_NOT_INITIALIZED" ;
+
+
+BO_ 1160 DAS_steeringControl: 4 NEO
+ SG_ DAS_steeringControlType : 23|2@0+ (1,0) [0|0] "" EPAS
+ SG_ DAS_steeringControlChecksum : 31|8@0+ (1,0) [0|0] "" EPAS
+ SG_ DAS_steeringControlCounter : 19|4@0+ (1,0) [0|0] "" EPAS
+ SG_ DAS_steeringAngleRequest : 6|15@0+ (0.1,-1638.35) [-1638.35|1638.35] "deg" EPAS
+ SG_ DAS_steeringHapticRequest : 7|1@0+ (1,0) [0|0] "" EPAS
+
+BO_ 697 DAS_control: 8 NEO
+ SG_ DAS_setSpeed : 0|12@1+ (0.1,0) [0|409.4] "kph" NEO
+ SG_ DAS_accState : 12|4@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_aebEvent : 16|2@1+ (1,0) [0|3] "" NEO
+ SG_ DAS_jerkMin : 18|9@1+ (0.03,-15.232) [-15.232|0.098] "m/s^3" NEO
+ SG_ DAS_jerkMax : 27|8@1+ (0.059,0) [0|15.045] "m/s^3" NEO
+ SG_ DAS_accelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO
+ SG_ DAS_accelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO
+ SG_ DAS_controlCounter : 53|3@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_controlChecksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 521 DAS_longControl: 8 NEO
+ SG_ DAS_locMode : 0|2@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_locState : 2|3@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_locRequest : 5|3@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_locJerkMin : 8|8@1+ (0.034,-8.67) [-8.67|0] "m/s^3" NEO
+ SG_ DAS_locJerkMax : 16|8@1+ (0.034,0) [0|8.67] "m/s^3" NEO
+ SG_ DAS_locSpeed : 24|11@1+ (0.1,0) [0|204.7] "kph" NEO
+ SG_ DAS_locAccelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO
+ SG_ DAS_locAccelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO
+ SG_ DAS_longControlCounter : 53|3@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_longControlChecksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 569 DAS_lanes: 8 NEO
+ SG_ DAS_leftLaneExists : 0|1@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_rightLaneExists : 1|1@1+ (1,0) [0|0] "" NEO
+ SG_ DAS_virtualLaneWidth : 4|4@1+ (0.3125,2) [2|7] "m" NEO
+ SG_ DAS_virtualLaneViewRange : 8|8@1+ (1,0) [0|160] "m" NEO
+ SG_ DAS_virtualLaneC0 : 16|8@1+ (0.035,-3.5) [-3.5|3.5] "m" NEO
+ SG_ DAS_virtualLaneC1 : 24|8@1+ (0.0016,-0.2) [-0.2|0.2] "rad" NEO
+ SG_ DAS_virtualLaneC2 : 32|8@1+ (2E-05,-0.0025) [-0.0025|0.0025] "m-1" NEO
+ SG_ DAS_virtualLaneC3 : 40|8@1+ (2.4E-07,-3E-05) [-3E-05|3E-05] "m-2" NEO
+ SG_ DAS_leftLineUsage : 48|2@1+ (1,0) [0|3] "" NEO
+ SG_ DAS_rightLineUsage : 50|2@1+ (1,0) [0|3] "" NEO
+ SG_ DAS_leftFork : 52|2@1+ (1,0) [0|3] "" NEO
+ SG_ DAS_rightFork : 54|2@1+ (1,0) [0|3] "" NEO
+ SG_ DAS_lanesCounter : 60|4@1+ (1,0) [0|0] "" NEO
+
+BO_ 257 GTW_epasControl: 3 NEO
+ SG_ GTW_epasControlChecksum : 23|8@0+ (1,0) [0|255] "" NEO
+ SG_ GTW_epasControlCounter : 11|4@0+ (1,0) [0|15] "" NEO
+ SG_ GTW_epasControlType : 15|2@0+ (1,0) [-1|4] "" NEO
+ SG_ GTW_epasEmergencyOn : 7|1@0+ (1,0) [-1|2] "" NEO
+ SG_ GTW_epasLDWEnabled : 12|1@0+ (1,0) [-1|2] "" NEO
+ SG_ GTW_epasPowerMode : 6|4@0+ (1,0) [4|14] "" NEO
+ SG_ GTW_epasTuneRequest : 2|3@0+ (1,0) [-1|8] "" NEO
+
+BO_ 880 EPAS_sysStatus: 8 EPAS
+ SG_ EPAS_currentTuneMode : 7|4@0+ (1,0) [8|15] "" NEO
+ SG_ EPAS_eacErrorCode : 23|4@0+ (1,0) [-1|16] "" NEO
+ SG_ EPAS_eacStatus : 55|3@0+ (1,0) [5|7] "" NEO
+ SG_ EPAS_handsOnLevel : 39|2@0+ (1,0) [-1|4] "" NEO
+ SG_ EPAS_internalSAS : 37|14@0+ (0.1,-819.200012) [0|0] "deg" NEO
+ SG_ EPAS_steeringFault : 2|1@0+ (1,0) [-1|2] "" NEO
+ SG_ EPAS_steeringRackForce : 1|10@0+ (50,-25575) [0|0] "N" NEO
+ SG_ EPAS_steeringReduced : 3|1@0+ (1,0) [-1|2] "" NEO
+ SG_ EPAS_sysStatusChecksum : 63|8@0+ (1,0) [0|255] "" NEO
+ SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO
+ SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [0|0] "Nm" NEO
+
+BO_ 305 EPAS3P_sysStatus: 8 NEO
+ SG_ EPAS_currentTuneMode : 7|4@0+ (1,0) [0|0] "" NEO
+ SG_ EPAS_eacErrorCode : 23|4@0+ (1,0) [0|15] "" NEO
+ SG_ EPAS_eacStatus : 55|3@0+ (1,0) [0|7] "" NEO
+ SG_ EPAS_handsOnLevel : 39|2@0+ (1,0) [0|3] "" NEO
+ SG_ EPAS_internalSAS : 37|14@0+ (0.1,-819.2) [-819.2|819] "deg" NEO
+ SG_ EPAS_steeringFault : 2|1@0+ (1,0) [0|1] "" NEO
+ SG_ EPAS_steeringRackForce : 1|10@0+ (50,-25575) [-25575|25575] "N" NEO
+ SG_ EPAS_steeringReduced : 3|1@0+ (1,0) [0|1] "" NEO
+ SG_ EPAS_sysStatusChecksum : 63|8@0+ (1,0) [0|255] "" NEO
+ SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO
+ SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [-20.5|20.45] "Nm" NEO
+
+BO_ 3 STW_ANGL_STAT: 8 STW
+ SG_ StW_Angl : 5|14@0+ (0.5,-2048) [0|0] "deg" NEO
+ SG_ StW_AnglSpd : 21|14@0+ (0.5,-2048) [0|0] "/s" NEO
+ SG_ StW_AnglSens_Stat : 33|2@0+ (1,0) [-1|4] "" NEO
+ SG_ StW_AnglSens_Id : 35|2@0+ (1,0) [3|3] "" NEO
+ SG_ MC_STW_ANGL_STAT : 55|4@0+ (1,0) [0|15] "" NEO
+ SG_ CRC_STW_ANGL_STAT : 63|8@0+ (1,0) [0|255] "" NEO
+
+BO_ 14 STW_ANGLHP_STAT: 8 STW
+ SG_ StW_AnglHP : 5|14@0+ (0.1,-819.2) [-819.2|819] "deg" NEO
+ SG_ StW_AnglHP_Spd : 21|14@0+ (0.5,-4096) [-4096|4095.5] "deg/s" NEO
+ SG_ StW_AnglHP_Sens_Stat : 33|2@0+ (1,0) [0|0] "" NEO
+ SG_ StW_AnglHP_Sens_Id : 35|2@0+ (1,0) [0|0] "" NEO
+ SG_ MC_STW_ANGLHP_STAT : 55|4@0+ (1,0) [0|15] "" NEO
+ SG_ CRC_STW_ANGLHP_STAT : 63|8@0+ (1,0) [0|0] "" NEO
+
+BO_ 264 DI_torque1: 8 DI
+ SG_ DI_torqueDriver : 0|13@1- (0.25,0) [-750|750] "Nm" NEO
+ SG_ DI_torque1Counter : 13|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torqueMotor : 16|13@1- (0.25,0) [-750|750] "Nm" NEO
+ SG_ DI_soptState : 29|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_motorRPM : 32|16@1- (1,0) [-17000|17000] "RPM" NEO
+ SG_ DI_pedalPos : 48|8@1+ (0.4,0) [0|100] "%" NEO
+ SG_ DI_torque1Checksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 280 DI_torque2: 6 DI
+ SG_ DI_torqueEstimate : 0|12@1- (0.5,0) [-750|750] "Nm" NEO
+ SG_ DI_gear : 12|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_brakePedal : 15|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_vehicleSpeed : 16|12@1+ (0.05,-25) [-25|179.75] "MPH" NEO
+ SG_ DI_gearRequest : 28|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torqueInterfaceFailure : 31|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torque2Counter : 32|4@1+ (1,0) [0|0] "" NEO
+ SG_ DI_brakePedalState : 36|2@1+ (1,0) [0|0] "" NEO
+ SG_ DI_epbParkRequest : 38|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_epbInterfaceReady : 39|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torque2Checksum : 40|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 309 ESP_135h: 5 ESP
+ SG_ ESP_135hChecksum : 23|8@0+ (1,0) [0|255] "" NEO
+ SG_ ESP_135hCounter : 11|4@0+ (1,0) [0|15] "" NEO
+ SG_ ESP_absBrakeEvent : 2|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_brakeDiscWipingActive : 4|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_brakeLamp : 3|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_espFaultLamp : 6|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_espLampFlash : 7|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_hillStartAssistActive : 1|2@0+ (1,0) [-1|4] "" NEO
+ SG_ ESP_messagePumpService : 24|1@0+ (1,0) [0|1] "" NEO
+ SG_ ESP_messagePumpFailure : 25|1@0+ (1,0) [0|1] "" NEO
+ SG_ ESP_messageEBDFailure : 26|1@0+ (1,0) [0|1] "" NEO
+ SG_ ESP_absFaultLamp : 27|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_tcDisabledByFault : 28|1@0+ (1,0) [0|1] "" NEO
+ SG_ ESP_messageDynoModeActive : 29|1@0+ (1,0) [0|1] "" NEO
+ SG_ ESP_hydraulicBoostEnabled : 30|1@0+ (1,0) [0|1] "" NEO
+ SG_ ESP_espOffLamp : 31|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_stabilityControlSts : 14|3@0+ (1,0) [6|7] "" NEO
+ SG_ ESP_tcLampFlash : 5|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ESP_tcOffLamp : 15|1@0+ (1,0) [0|1] "" NEO
+
+BO_ 341 ESP_B: 8 ESP
+ SG_ ESP_BChecksum : 39|8@0+ (1,0) [0|255] "" NEO,EPAS
+ SG_ ESP_BCounter : 62|4@0+ (1,0) [1|15] "" NEO,EPAS
+ SG_ ESP_vehicleSpeed : 47|16@0+ (0.00999999978,0) [0|0] "kph" NEO,EPAS
+ SG_ ESP_vehicleSpeedQF : 57|2@0+ (1,0) [1|2] "" NEO,EPAS
+ SG_ ESP_wheelPulseCountFrL : 7|8@0+ (1,0) [0|254] "" NEO,EPAS
+ SG_ ESP_wheelPulseCountFrR : 15|8@0+ (1,0) [0|254] "" NEO,EPAS
+ SG_ ESP_wheelPulseCountReL : 23|8@0+ (1,0) [0|254] "" NEO,EPAS
+ SG_ ESP_wheelPulseCountReR : 31|8@0+ (1,0) [0|254] "" NEO,EPAS
+
+BO_ 513 SDM1: 5 GTW
+ SG_ SDM_bcklPassStatus : 3|2@0+ (1,0) [0|3] "" NEO
+ SG_ SDM_bcklDrivStatus : 5|2@0+ (1,0) [0|3] "" NEO
+
+BO_ 532 EPB_epasControl: 3 EPB
+ SG_ EPB_epasControlChecksum : 23|8@0+ (1,0) [0|255] "" NEO,EPAS
+ SG_ EPB_epasControlCounter : 11|4@0+ (1,0) [0|15] "" NEO,EPAS
+ SG_ EPB_epasEACAllow : 2|3@0+ (1,0) [4|7] "" NEO,EPAS
+
+BO_ 792 GTW_carState: 8 GTW
+ SG_ YEAR : 0|7@1+ (1,2000) [2000|2127] "Year" NEO
+ SG_ CERRD : 7|1@1+ (1,0) [0|1] "" NEO
+ SG_ MONTH : 8|4@1+ (1,0) [1|12] "Month" NEO
+ SG_ DOOR_STATE_FL : 12|2@1+ (1,0) [0|3] "" NEO
+ SG_ DOOR_STATE_FR : 14|2@1+ (1,0) [0|3] "" NEO
+ SG_ SECOND : 16|6@1+ (1,0) [0|59] "s" NEO
+ SG_ DOOR_STATE_RL : 22|2@1+ (1,0) [0|3] "" NEO
+ SG_ Hour : 24|5@1+ (1,0) [0|23] "h" NEO
+ SG_ DOOR_STATE_RR : 29|2@1+ (1,0) [0|3] "" NEO
+ SG_ DAY : 32|5@1+ (1,0) [0|31] "" NEO
+ SG_ MINUTE : 40|6@1+ (1,0) [0|59] "min" NEO
+ SG_ BOOT_STATE : 46|2@1+ (1,0) [0|3] "" NEO
+ SG_ GTW_updateInProgress : 48|2@1+ (1,0) [0|3] "" NEO
+ SG_ DOOR_STATE_FrontTrunk : 50|2@1+ (1,0) [0|3] "" NEO
+ SG_ MCU_factoryMode : 52|1@1+ (1,0) [0|1] "" NEO
+ SG_ MCU_transportModeOn : 53|1@0+ (1,0) [0|1] "" NEO
+ SG_ BC_headLightLStatus : 55|2@0+ (1,0) [0|3] "" NEO
+ SG_ BC_headLightRStatus : 57|2@0+ (1,0) [0|3] "" NEO
+ SG_ BC_indicatorLStatus : 59|2@0+ (1,0) [0|3] "" NEO
+ SG_ BC_indicatorRStatus : 61|2@0+ (1,0) [0|3] "" NEO
+
+BO_ 872 DI_state: 8 DI
+ SG_ DI_systemState : 0|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_vehicleHoldState : 3|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_proximity : 6|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_driveReady : 7|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_regenLight : 8|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_state : 9|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_cruiseState : 12|4@1+ (1,0) [0|0] "" NEO
+ SG_ DI_analogSpeed : 16|12@1+ (0.1,0) [0|150] "speed" NEO
+ SG_ DI_immobilizerState : 28|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_speedUnits : 31|1@1+ (1,0) [0|1] "" NEO
+ SG_ DI_cruiseSet : 32|9@1+ (0.5,0) [0|255.5] "speed" NEO
+ SG_ DI_aebState : 41|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_stateCounter : 44|4@1+ (1,0) [0|0] "" NEO
+ SG_ DI_digitalSpeed : 48|8@1+ (1,0) [0|250] "" NEO
+ SG_ DI_stateChecksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 109 SBW_RQ_SCCM: 4 STW
+ SG_ StW_Sw_Stat3 : 0|3@1+ (1,0) [0|0] "" NEO
+ SG_ MsgTxmtId : 6|2@1+ (1,0) [0|0] "" NEO
+ SG_ TSL_RND_Posn_StW : 8|4@1+ (1,0) [0|0] "" NEO
+ SG_ TSL_P_Psd_StW : 12|2@1+ (1,0) [0|0] "" NEO
+ SG_ MC_SBW_RQ_SCCM : 20|4@1+ (1,0) [0|15] "" NEO
+ SG_ CRC_SBW_RQ_SCCM : 24|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 69 STW_ACTN_RQ: 8 STW
+ SG_ SpdCtrlLvr_Stat : 0|6@1+ (1,0) [0|0] "" NEO
+ SG_ VSL_Enbl_Rq : 6|1@1+ (1,0) [0|0] "" NEO
+ SG_ SpdCtrlLvrStat_Inv : 7|1@1+ (1,0) [0|0] "" NEO
+ SG_ DTR_Dist_Rq : 8|8@1+ (1,0) [0|200] "" NEO
+ SG_ TurnIndLvr_Stat : 16|2@1+ (1,0) [0|0] "" NEO
+ SG_ HiBmLvr_Stat : 18|2@1+ (1,0) [0|0] "" NEO
+ SG_ WprWashSw_Psd : 20|2@1+ (1,0) [0|0] "" NEO
+ SG_ WprWash_R_Sw_Posn_V2 : 22|2@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Lvr_Stat : 24|3@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Cond_Flt : 27|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Cond_Psd : 28|2@1+ (1,0) [0|0] "" NEO
+ SG_ HrnSw_Psd : 30|2@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw00_Psd : 32|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw01_Psd : 33|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw02_Psd : 34|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw03_Psd : 35|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw04_Psd : 36|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw05_Psd : 37|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw06_Psd : 38|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw07_Psd : 39|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw08_Psd : 40|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw09_Psd : 41|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw10_Psd : 42|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw11_Psd : 43|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw12_Psd : 44|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw13_Psd : 45|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw14_Psd : 46|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw15_Psd : 47|1@1+ (1,0) [0|0] "" NEO
+ SG_ WprSw6Posn : 48|3@1+ (1,0) [0|0] "" NEO
+ SG_ MC_STW_ACTN_RQ : 52|4@1+ (1,0) [0|15] "" NEO
+ SG_ CRC_STW_ACTN_RQ : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 643 BODY_R1: 8 GTW
+ SG_ AirTemp_Insd : 47|8@0+ (0.25,0) [0|63.5] "C" NEO
+ SG_ AirTemp_Outsd : 63|8@0+ (0.5,-40) [-40|86.5] "C" NEO
+ SG_ Bckl_Sw_RL_Stat_SAM_R : 49|2@0+ (1,0) [-1|4] "" NEO
+ SG_ Bckl_Sw_RM_Stat_SAM_R : 53|2@0+ (1,0) [-1|4] "" NEO
+ SG_ Bckl_Sw_RR_Stat_SAM_R : 51|2@0+ (1,0) [-1|4] "" NEO
+ SG_ DL_RLtch_Stat : 9|2@0+ (1,0) [-1|4] "" NEO
+ SG_ DrRLtch_FL_Stat : 1|2@0+ (1,0) [-1|4] "" NEO
+ SG_ DrRLtch_FR_Stat : 3|2@0+ (1,0) [-1|4] "" NEO
+ SG_ DrRLtch_RL_Stat : 5|2@0+ (1,0) [-1|4] "" NEO
+ SG_ DrRLtch_RR_Stat : 7|2@0+ (1,0) [-1|4] "" NEO
+ SG_ EngHd_Stat : 11|2@0+ (1,0) [-1|4] "" NEO
+ SG_ LoBm_On_Rq : 32|1@0+ (1,0) [0|1] "" NEO
+ SG_ HiBm_On : 33|1@0+ (1,0) [0|1] "" NEO
+ SG_ Hrn_On : 26|1@0+ (1,0) [0|1] "" NEO
+ SG_ IrLmp_D_Lt_Flt : 34|1@0+ (1,0) [0|1] "" NEO
+ SG_ IrLmp_P_Rt_Flt : 35|1@0+ (1,0) [0|1] "" NEO
+ SG_ LgtSens_Twlgt : 18|3@0+ (1,0) [0|7] "Steps" NEO
+ SG_ LgtSens_SNA : 19|1@0+ (1,0) [0|1] "" NEO
+ SG_ LgtSens_Tunnel : 20|1@0+ (1,0) [0|1] "" NEO
+ SG_ LgtSens_Flt : 21|1@0+ (1,0) [0|1] "" NEO
+ SG_ LgtSens_Night : 22|1@0+ (1,0) [-1|2] "" NEO
+ SG_ ADL_LoBm_On_Rq : 23|1@0+ (1,0) [0|1] "" NEO
+ SG_ LoBm_D_Lt_Flt : 36|1@0+ (1,0) [0|1] "" NEO
+ SG_ LoBm_P_Rt_Flt : 37|1@0+ (1,0) [0|1] "" NEO
+ SG_ MPkBrk_Stat : 28|1@0+ (1,0) [-1|2] "" NEO
+ SG_ RevGr_Engg : 39|2@0+ (1,0) [-1|4] "" NEO
+ SG_ StW_Cond_Stat : 55|2@0+ (1,0) [-1|4] "" NEO
+ SG_ Term54_Actv : 27|1@0+ (1,0) [0|1] "" NEO
+ SG_ Trlr_Stat : 25|2@0+ (1,0) [-1|4] "" NEO
+ SG_ VTA_Alm_Actv : 13|1@0+ (1,0) [0|1] "" NEO
+ SG_ WprOutsdPkPosn : 29|1@0+ (1,0) [0|1] "" NEO
+
+BO_ 760 UI_gpsVehicleSpeed: 8 GTW
+ SG_ UI_gpsHDOP : 0|8@1+ (0.1,0) [0|25.5] "1" DAS
+ SG_ UI_gpsVehicleHeading : 8|16@1+ (0.0078125,0) [0|511.9921875] "deg" DAS
+ SG_ UI_gpsVehicleSpeed : 24|16@1+ (0.00390625,0) [0|250.996] "km/hr" Vector__XXX
+ SG_ UI_userSpeedOffset : 40|6@1+ (1,-30) [-30|33] "kph/mph" DAS
+ SG_ UI_mapSpeedLimitUnits : 46|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_userSpeedOffsetUnits : 47|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_mppSpeedLimit : 48|5@1+ (5,0) [0|155] "kph/mph" DAS
+ SG_ UI_gpsNmeaMIA : 53|1@1+ (1,0) [0|0] "" DAS
+
+BO_ 536 MCU_chassisControl: 8 GTW
+ SG_ MCU_dasDebugEnable : 0|1@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_parkBrakeRequest : 1|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_trailerModeCH : 3|1@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_fcwSensitivity : 4|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_fcwEnable : 6|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_latControlEnable : 8|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_accOvertakeEnable : 10|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_ldwEnable : 12|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_aebEnable : 14|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_bsdEnable : 16|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_ahlbEnable : 18|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_parkSetting : 20|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_pedalSafetyEnable : 22|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_frontDefrostReq_das : 24|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_autoParkRequest : 26|4@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_redLightStopSignEnable : 30|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_enableCreepTorqueCH : 32|1@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_narrowGarages : 33|1@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_rebootAutopilot : 34|1@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_enableAutowipers : 35|1@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_overPaintedUSS : 38|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_selfParkTune : 40|4@1+ (1,0) [0|15] "" NEO
+ SG_ MCU_towModeEnable : 44|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_zeroSpeedConfirmed : 46|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_aesEnable : 48|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_autoLaneChangeEnable : 50|2@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_chassisControlCounter : 52|4@1+ (1,0) [0|0] "" NEO
+ SG_ MCU_chassisControlChecksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 904 MCU_clusterBacklightRequest: 3 NEO
+ SG_ MCU_clusterBacklightOn : 7|1@1+ (1,0) [0|1] "" NEO
+ SG_ MCU_clusterBrightnessLevel : 8|8@1+ (0.5,0) [0|127.5] "%" NEO
+ SG_ MCU_clusterReadyForDrive : 6|1@1+ (1,0) [-1|2] "" NEO
+ SG_ MCU_clusterReadyForPowerOff : 5|1@1+ (1,0) [0|1] "" NEO
+
+BO_ 984 MCU_locationStatus: 8 MCU
+ SG_ MCU_gpsAccuracy : 57|7@1+ (0.2,0) [0|0] "m" NEO
+ SG_ MCU_latitude : 0|28@1- (1E-06,0) [0|0] "deg" NEO
+ SG_ MCU_longitude : 28|29@1- (1E-06,0) [0|0] "deg" NEO
+
+BO_ 104 MCU_locationStatus2: 8 MCU
+ SG_ MCU_elevation : 0|32@1- (0.1,0) [0|0] "m" GTW
+ SG_ MCU_navigonExpectedSpeed : 32|7@1+ (1,0) [0|126] "mph" GTW
+
+BO_ 840 GTW_status: 8 GTW
+ SG_ GTW_accGoingDown : 6|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_accRailReq : 8|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_brakePressed : 1|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_driveGoingDown : 7|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_driveRailReq : 0|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_driverIsLeaving : 5|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_driverPresent : 2|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_hvacGoingDown : 11|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_hvacRailReq : 9|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_icPowerOff : 4|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_notEnough12VForDrive : 3|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_preconditionRequest : 10|1@0+ (1,0) [0|1] "" NEO
+ SG_ GTW_statusChecksum : 63|8@0+ (1,0) [0|255] "" NEO
+ SG_ GTW_statusCounter : 51|4@0+ (1,0) [0|15] "" NEO
+
+BO_ 920 GTW_carConfig: 8 GTW
+ SG_ GTW_performanceConfig : 2|3@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_fourWheelDrive : 4|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_unknown1 : 5|1@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_dasHw : 7|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_parkAssistInstalled : 9|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_forwardRadarHw : 11|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_airSuspensionInstalled : 14|3@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_unknown2 : 15|1@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_country : 23|16@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_parkSensorGeometryType : 33|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_rhd : 34|1@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_bodyControlsType : 35|1@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_radarPosition : 39|4@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_rearCornerRadarHw : 41|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_frontCornerRadarHw : 43|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_epasType : 45|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_chassisType : 47|2@0+ (1,0) [0|2] "" NEO
+ SG_ GTW_wheelType : 52|5@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_rearSeatControllerMask : 55|3@0+ (1,0) [0|7] "" NEO
+ SG_ GTW_euVehicle : 56|1@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_foldingMirrorsInstalled : 57|1@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_brakeHwType : 59|2@0+ (1,0) [0|2] "" NEO
+ SG_ GTW_autopilot : 61|2@0+ (1,0) [0|0] "" NEO
+ SG_ GTW_unknown3 : 63|2@0+ (1,0) [0|0] "" NEO
+
+BO_ 1006 UI_autopilotControl: 8 GTW
+ SG_ UI_autopilotControlIndex M : 0|3@1+ (1,0) [0|7] "" APP,APS
+ SG_ UI_hovEnabled m0 : 3|1@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donDisableAutoWiperDuration m0 : 4|3@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donDisableOnAutoWiperSpeed m0 : 7|4@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_blindspotMinSpeed m0 : 11|4@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_blindspotDistance m0 : 15|3@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_blindspotTTC m0 : 18|3@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donStopEndOfRampBuffer m0 : 21|3@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donDisableCutin m0 : 24|1@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donMinGoreWidthForAbortMap m0 : 25|4@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donAlcProgGoreAbortThres m0 : 29|4@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_donMinGoreWidthForAbortNotMap m0 : 33|4@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcDisableUltrasonicCheck m0 : 37|1@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcUltrasonicDistance m0 : 38|4@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcUltrasonicWaitTime m0 : 42|3@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcEgoLeadingReactionAccel m0 : 48|2@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcMergIntervalRearDHyst m0 : 50|2@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcMergingIntervalHeadwayHyst m0 : 52|2@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcAssertivenessRate m0 : 54|2@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_alcViewRangeSensitivity m0 : 56|2@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_camBlockLaneCheckDisable m1 : 3|1@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_camBlockLaneCheckThreshold m1 : 4|6@1+ (0.01587,0) [0|1] "%" APP,APS
+ SG_ UI_camBlockBlurDisable m1 : 10|1@1+ (1,0) [0|0] "" APP,APS
+ SG_ UI_camBlockBlurThreshold m1 : 11|6@1+ (0.01587,0) [0|1] "%" APP,APS
+
+BO_ 728 UI_csaOfframpCurvature: 8 GTW
+ SG_ UI_csaOfframpCurvC2 : 0|16@1- (1E-06,0) [-0.032768|0.032767] "1/m" DAS
+ SG_ UI_csaOfframpCurvC3 : 16|16@1- (4E-09,0) [-0.000131072|0.000131068] "1/m2" DAS
+ SG_ UI_csaOfframpCurvRange : 32|8@1+ (2,0) [0|510] "m" DAS
+ SG_ UI_csaOfframpCurvCounter : 40|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ UI_csaOfframpCurvUsingTspline : 48|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_csaOfframpCurvReserved : 49|7@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_csaOfframpCurvChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 744 UI_csaRoadCurvature: 8 GTW
+ SG_ UI_csaRoadCurvC2 : 0|16@1- (1E-06,0) [-0.032768|0.032767] "1/m" DAS
+ SG_ UI_csaRoadCurvC3 : 16|16@1- (4E-09,0) [-0.000131072|0.000131068] "1/m2" DAS
+ SG_ UI_csaRoadCurvRange : 32|8@1+ (2,0) [0|510] "m" DAS
+ SG_ UI_csaRoadCurvCounter : 40|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ UI_csaRoadCurvUsingTspline : 48|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_csaRoadCurvReserved : 49|7@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_csaRoadCurvChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1080 UI_driverAssistAnonDebugParams: 8 GTW
+ SG_ UI_anonDebugParam1 : 0|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_anonDebugFlag1 : 7|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_anonDebugParam2 : 8|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_anonDebugFlag2 : 15|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_anonDebugParam3 : 16|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_anonDebugFlag3 : 23|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_anonDebugParam4 : 24|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_anonDebugFlag4 : 31|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_anonDebugParam5 : 32|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_anonDebugParam6 : 40|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_anonDebugParam7 : 48|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_visionSpeedSlider : 56|7@1+ (1,0) [0|100] "" DAS
+
+BO_ 1000 UI_driverAssistControl: 8 GTW
+ SG_ UI_autopilotControlRequest : 0|1@1+ (1,0) [1|0] "" DAS
+ SG_ UI_ulcStalkConfirm : 1|1@1+ (1,0) [1|0] "" DAS
+ SG_ UI_summonHeartbeat : 2|2@1+ (1,0) [0|0] "" DAS
+ SG_ UI_curvSpeedAdaptDisable : 4|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_dasDeveloper : 5|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_enableVinAssociation : 6|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_lssLkaEnabled : 7|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_lssLdwEnabled : 8|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_autoSummonEnable : 10|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_exceptionListEnable : 11|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_roadCheckDisable : 12|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_driveOnMapsEnable : 13|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_handsOnRequirementDisable : 14|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_forksEnable : 15|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_fuseLanesDisable : 16|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_fuseHPPDisable : 17|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_fuseVehiclesDisable : 18|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_enableNextGenACC : 19|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_visionSpeedType : 20|2@1+ (1,0) [0|0] "" APP
+ SG_ UI_curvatureDatabaseOnly : 22|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_lssElkEnabled : 23|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_summonExitType : 24|2@1+ (1,0) [0|3] "" DAS
+ SG_ UI_summonEntryType : 26|2@1+ (1,0) [0|3] "" DAS
+ SG_ UI_selfParkRequest : 28|4@1+ (1,0) [0|15] "" DAS,PARK
+ SG_ UI_summonReverseDist : 32|6@1+ (1,0) [0|63] "" DAS
+ SG_ UI_undertakeAssistEnable : 38|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_adaptiveSetSpeedEnable : 39|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_drivingSide : 40|2@1+ (1,0) [0|3] "" DAS
+ SG_ UI_enableClipTelemetry : 42|1@1+ (1,0) [0|0] "" APP
+ SG_ UI_enableTripTelemetry : 43|1@1+ (1,0) [0|0] "" APP
+ SG_ UI_enableRoadSegmentTelemetry : 44|1@1+ (1,0) [0|0] "" APP
+ SG_ UI_followNavRouteEnable : 46|1@1+ (1,0) [0|0] "" APP
+ SG_ UI_ulcSpeedConfig : 48|2@1+ (1,0) [0|3] "" APP
+ SG_ UI_ulcBlindSpotConfig : 50|2@1+ (1,0) [0|3] "" APP
+ SG_ UI_autopilotAlwaysOn : 52|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_accFromZero : 53|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_alcOffHighwayEnable : 54|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_validationLoop : 55|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_ulcOffHighway : 56|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_enableNavRouteCSA : 57|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_enableCutinExperiments : 58|1@1+ (1,0) [0|1] "" APP
+ SG_ UI_source3D : 60|3@1+ (1,0) [0|7] "" APP
+ SG_ UI_enableVisionOnlyStops : 63|1@1+ (1,0) [0|1] "" APP
+
+BO_ 968 UI_driverAssistMapData: 8 GTW
+ SG_ UI_mapSpeedLimitDependency : 0|3@1+ (1,0) [0|0] "" DAS
+ SG_ UI_roadClass : 3|3@1+ (1,0) [0|0] "" DAS
+ SG_ UI_inSuperchargerGeofence : 6|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_mapSpeedUnits : 7|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_mapSpeedLimit : 8|5@1+ (1,0) [0|0] "" DAS
+ SG_ UI_mapSpeedLimitType : 13|3@1+ (1,0) [0|0] "" DAS
+ SG_ UI_countryCode : 16|10@1+ (1,0) [0|0] "" DAS
+ SG_ UI_streetCount : 26|2@1+ (1,0) [0|0] "" DAS
+ SG_ UI_gpsRoadMatch : 28|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_navRouteActive : 29|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_parallelAutoparkEnabled : 30|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_perpendicularAutoparkEnabled : 31|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_nextBranchDist : 32|5@1+ (10,0) [0|300] "m" DAS
+ SG_ UI_controlledAccess : 37|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_nextBranchLeftOffRamp : 38|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_nextBranchRightOffRamp : 39|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectLeftLane : 40|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectRightLane : 41|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectHPP : 42|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectNav : 43|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectLeftFreeSpace : 44|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectRightFreeSpace : 45|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectAutosteer : 46|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_rejectHandsOn : 47|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_acceptBottsDots : 48|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_autosteerRestricted : 49|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_pmmEnabled : 50|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_scaEnabled : 51|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_mapDataCounter : 52|4@1+ (1,0) [0|0] "" DAS
+ SG_ UI_mapDataChecksum : 56|8@1+ (1,0) [0|0] "" DAS
+
+BO_ 568 UI_driverAssistRoadSign: 8 GTW
+ SG_ UI_roadSign M : 0|8@1+ (1,0) [0|0] "" DAS
+ SG_ UI_splineLocConfidence : 40|7@1+ (1,0) [0|100] "" DAS
+ SG_ UI_splineID : 48|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ UI_roadSignCounter : 52|4@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_roadSignChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_dummyData m0 : 8|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_stopSignStopLineDist m1 : 8|10@1+ (0.25,-8) [-8|247.5] "m" Vector__XXX
+ SG_ UI_stopSignStopLineConf m1 : 18|7@1+ (1,0) [0|100] "" Vector__XXX
+ SG_ UI_trafficLightStopLineDist m2 : 8|10@1+ (0.25,-8) [-8|247.5] "m" Vector__XXX
+ SG_ UI_trafficLightStopLineConf m2 : 18|7@1+ (1,0) [0|100] "" Vector__XXX
+ SG_ UI_baseMapSpeedLimitMPS m3 : 8|8@1+ (0.25,0) [0|63.75] "m/s" DAS
+ SG_ UI_bottomQrtlFleetSpeedMPS m3 : 16|8@1+ (0.25,0) [0|63.75] "m/s" DAS
+ SG_ UI_topQrtlFleetSpeedMPS m3 : 24|8@1+ (0.25,0) [0|63.75] "m/s" DAS
+ SG_ UI_meanFleetSplineSpeedMPS m4 : 8|8@1+ (0.25,0) [0|63.75] "m/s" DAS
+ SG_ UI_medianFleetSpeedMPS m4 : 16|8@1+ (0.25,0) [0|63.75] "m/s" DAS
+ SG_ UI_meanFleetSplineAccelMPS2 m4 : 24|8@1+ (0.05,-6.35) [-6.35|6.4] "m/s^2" DAS
+ SG_ UI_rampType m4 : 32|3@1+ (1,0) [0|7] "" DAS
+ SG_ UI_currSplineIdFull m5 : 8|32@1+ (1,0) [0|1] "" APP
+
+
+BO_ 696 UI_radarMapData: 8 GTW
+ SG_ UI_radarTargetDx : 0|8@1+ (1,-95) [-95|160] "m" DAS
+ SG_ UI_radarTargetDxEnd : 8|8@1+ (1,0) [0|255] "m" DAS
+ SG_ UI_radarTargetTrustMap : 16|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_radarEnableBraking : 17|1@1+ (1,0) [0|1] "" DAS
+ SG_ UI_radarMapDataCounter : 52|4@1+ (1,0) [0|0] "" DAS
+ SG_ UI_radarMapDataChecksum : 56|8@1+ (1,0) [0|0] "" DAS
+
+BO_ 712 UI_roadCurvature: 8 GTW
+ SG_ UI_roadCurvC0 : 0|11@1- (0.02,0) [-20.48|20.46] "m" DAS
+ SG_ UI_roadCurvC1 : 11|10@1- (0.00075,0) [-0.384|0.38325] "1" DAS
+ SG_ UI_roadCurvC2 : 21|14@1- (7.5E-06,0) [-0.03072|0.03071625] "1/m" DAS
+ SG_ UI_roadCurvC3 : 35|13@1- (3E-08,0) [-0.00012288|0.00012285] "1/m2" DAS
+ SG_ UI_roadCurvRange : 48|6@1+ (4,0) [0|252] "m" DAS
+ SG_ UI_roadCurvHealth : 54|2@1+ (1,0) [0|0] "" DAS
+ SG_ UI_roadCurvChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 582 UI_solarData: 5 GTW
+ SG_ UI_solarAzimuthAngle : 0|16@1- (1,0) [0|360] "deg" APP
+ SG_ UI_solarAzimuthAngleCarRef : 16|9@1- (1,0) [-180|180] "deg" APP
+ SG_ UI_isSunUp : 25|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_solarElevationAngle : 32|8@1- (1,0) [-90|90] "deg" APP
+
+BO_ 824 UI_status: 8 GTW
+ SG_ UI_touchActive : 0|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_audioActive : 1|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_bluetoothActive : 2|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_cellActive : 3|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_displayReady : 4|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_gpsActive : 5|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_wifiConnected : 6|1@1+ (1,0) [0|0] "" IC,APP
+ SG_ UI_systemActive : 7|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_xmActive : 8|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_displayOn : 9|1@1+ (1,0) [0|0] "" IC,APP
+ SG_ UI_readyForDrive : 10|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_cellConnected : 11|1@1+ (1,0) [0|0] "" IC,APP
+ SG_ UI_vpnActive : 12|1@1+ (1,0) [0|0] "" IC,APP
+ SG_ UI_wifiActive : 13|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_cameraActive : 14|1@1+ (1,0) [0|0] "" IC,APP
+ SG_ UI_usbActive : 15|1@1+ (1,0) [0|0] "" IC
+ SG_ UI_screenshotActive : 16|1@1+ (1,0) [0|0] "" IC,APP
+ SG_ UI_monitorModemPower : 17|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_factoryReset : 18|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ UI_cellNetworkTechnology : 20|4@1+ (1,0) [0|15] "" APP
+ SG_ UI_tegraCoreTemperature : 24|8@1+ (1,-64) [0|0] "deg C" IC
+ SG_ UI_tegraAmbientTemperature : 32|8@1+ (1,-64) [0|0] "deg C" IC
+ SG_ UI_googleWifiUsages : 40|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_autopilotTrial : 48|2@1+ (1,0) [0|0] "" APP
+ SG_ UI_cellSignalBars : 50|3@1+ (1,0) [0|7] "" APP
+ SG_ UI_hardwareType : 53|2@1+ (1,0) [0|3] "" APP
+ SG_ UI_developmentCar : 55|1@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_cellReceiverPower : 56|8@1+ (1,-128) [-128|127] "dB" APP
+
+BO_ 1064 UI_telemetryControl: 8 GTW
+ SG_ UI_TCR_enable : 0|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_moveStateStanding : 1|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_moveStateStopped : 2|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_moveStateMoving : 3|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_moveStateIndeterm : 4|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_classConstElem : 5|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_classMovingPed : 6|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_classMovingTwoWheel : 7|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_classMovingFourWheel : 8|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_classUnknown : 9|1@1+ (1,0) [0|0] "" DAS
+ SG_ UI_TCR_downSampleFactor : 16|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ UI_TCR_wExist : 24|5@1+ (1,0) [0|31] "" Vector__XXX
+ SG_ UI_TCR_vehSpeed : 32|8@1+ (1,0) [0|0] "" Vector__XXX
+ SG_ UI_TCR_minRCS : 40|8@1+ (0.25,-14) [-14|49.75] "dB" Vector__XXX
+ SG_ UI_TCR_maxDy : 48|5@1+ (0.5,0) [0|15.5] "m" Vector__XXX
+ SG_ UI_TCR_maxObjects : 56|5@1+ (1,0) [0|31] "" Vector__XXX
+ SG_ UI_TCR_maxRoadClass : 61|3@1+ (1,0) [0|7] "" Vector__XXX
+
+BO_ 522 BrakeMessage: 8 XXX
+ SG_ driverBrakeStatus : 2|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 921 AutopilotStatus: 8 XXX
+ SG_ autopilotStatus : 0|4@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_blindSpotRearLeft : 4|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_blindSpotRearRight : 6|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_fusedSpeedLimit : 8|5@1+ (5,0) [0|150] "kph/mph" XXX
+ SG_ DAS_suppressSpeedWarning : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_summonObstacle : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_summonClearedGate : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_visionOnlySpeedLimit : 16|5@1+ (5,0) [0|150] "kph/mph" XXX
+ SG_ DAS_heaterState : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_forwardCollisionWarning : 22|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_autoparkReady : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_autoParked : 25|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_autoparkWaitingForBrake : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_summonFwdLeashReached : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_summonRvsLeashReached : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_sideCollisionAvoid : 30|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_sideCollisionWarning : 32|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_sideCollisionInhibit : 34|1@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_csaState : 35|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_laneDepartureWarning : 37|3@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_fleetSpeedState : 40|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_autopilotHandsOnState : 42|4@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_autoLaneChangeState : 46|5@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_summonAvailable : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_statusCounter : 52|4@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_statusChecksum : 56|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 905 DAS_status2: 8 XXX
+ SG_ DAS_accSpeedLimit : 0|10@1+ (0.2,0) [0|204.6] "mph" XXX
+ SG_ DAS_pmmObstacleSeverity : 10|3@1+ (1,0) [0|7] "" XXX
+ SG_ DAS_pmmLoggingRequest : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_activationFailureStatus : 14|2@1+ (1,0) [0|1] "" XXX
+ SG_ DAS_pmmUltrasonicsFaultReason : 16|3@1+ (1,0) [0|7] "" XXX
+ SG_ DAS_pmmRadarFaultReason : 19|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_pmmSysFaultReason : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ DAS_pmmCameraFaultReason : 24|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_ACC_report : 26|5@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_lssState : 31|3@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_radarTelemetry : 34|2@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_robState : 36|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_driverInteractionLevel : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_ppOffsetDesiredRamp : 40|8@1+ (0.01,-1.28) [-1.28|1.27] "m" XXX
+ SG_ DAS_longCollisionWarning : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ DAS_status2Counter : 52|4@1+ (1,0) [0|0] "" XXX
+ SG_ DAS_status2Checksum : 56|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 1001 DAS_bodyControls: 8 XXX
+ SG_ DAS_headlightRequest : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_hazardLightRequest : 2|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_wiperSpeed : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ DAS_turnIndicatorRequest : 8|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_highLowBeamDecision : 10|2@1+ (1,0) [0|3] "" XXX
+ SG_ DAS_highLowBeamOffReason : 12|3@1+ (1,0) [0|4] "" XXX
+ SG_ DAS_turnIndicatorRequestReason : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ DAS_bodyControlsCounter : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ DAS_bodyControlsChecksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 780 DriverSeat: 8 XXX
+ SG_ occupancyStatus : 16|3@1+ (1,0) [0|7] "" XXX
+ SG_ buckleStatus : 19|2@1+ (1,0) [0|3] "" XXX
+
+VAL_ 3 StW_Angl 16383 "SNA" ;
+VAL_ 3 StW_AnglSens_Id 2 "MUST" 0 "PSBL" 1 "SELF" ;
+VAL_ 3 StW_AnglSens_Stat 2 "ERR" 3 "ERR_INI" 1 "INI" 0 "OK" ;
+VAL_ 3 StW_AnglSpd 16383 "SNA" ;
+VAL_ 14 StW_AnglHP 16383 "SNA" ;
+VAL_ 14 StW_AnglHP_Spd 16383 "SNA" ;
+VAL_ 14 StW_AnglHP_Sens_Stat 3 "SNA" 2 "ERR" 1 "INI" 0 "OK" ;
+VAL_ 14 StW_AnglHP_Sens_Id 3 "SNA" 2 "KOSTAL" 1 "DELPHI" 0 "TEST" ;
+VAL_ 69 SpdCtrlLvr_Stat 32 "DN_1ST" 16 "UP_1ST" 8 "DN_2ND" 4 "UP_2ND" 2 "RWD" 1 "FWD" 0 "IDLE" ;
+VAL_ 69 DTR_Dist_Rq 255 "SNA" 200 "ACC_DIST_7" 166 "ACC_DIST_6" 133 "ACC_DIST_5" 100 "ACC_DIST_4" 66 "ACC_DIST_3" 33 "ACC_DIST_2" 0 "ACC_DIST_1" ;
+VAL_ 69 TurnIndLvr_Stat 3 "SNA" 2 "RIGHT" 1 "LEFT" 0 "IDLE" ;
+VAL_ 69 HiBmLvr_Stat 3 "SNA" 2 "HIBM_FLSH_ON_PSD" 1 "HIBM_ON_PSD" 0 "IDLE" ;
+VAL_ 69 WprWashSw_Psd 3 "SNA" 2 "WASH" 1 "TIPWIPE" 0 "NPSD" ;
+VAL_ 69 WprWash_R_Sw_Posn_V2 3 "SNA" 2 "WASH" 1 "INTERVAL" 0 "OFF" ;
+VAL_ 69 StW_Lvr_Stat 4 "STW_BACK" 3 "STW_FWD" 2 "STW_DOWN" 1 "STW_UP" 0 "NPSD" ;
+VAL_ 69 StW_Cond_Psd 3 "SNA" 2 "DOWN" 1 "UP" 0 "NPSD" ;
+VAL_ 69 HrnSw_Psd 3 "SNA" 2 "NDEF2" 1 "PSD" 0 "NPSD" ;
+VAL_ 69 StW_Sw00_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 69 StW_Sw01_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 69 StW_Sw03_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 69 StW_Sw04_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 69 WprSw6Posn 7 "SNA" 6 "STAGE2" 5 "STAGE1" 4 "INTERVAL4" 3 "INTERVAL3" 2 "INTERVAL2" 1 "INTERVAL1" 0 "OFF" ;
+VAL_ 257 GTW_epasControlType 0 "WITHOUT" 1 "WITH_ANGLE" 3 "WITH_BOTH" 2 "WITH_TORQUE" ;
+VAL_ 109 StW_Sw_Stat3 7 "SNA" 6 "NDEF6" 5 "NDEF5" 4 "NDEF4" 3 "PLUS_MINUS" 2 "MINUS" 1 "PLUS" 0 "NPSD" ;
+VAL_ 109 MsgTxmtId 3 "NDEF3" 2 "NDEF2" 1 "SCCM" 0 "EWM" ;
+VAL_ 109 TSL_RND_Posn_StW 15 "SNA" 8 "D" 6 "INI" 4 "N_DOWN" 2 "N_UP" 1 "R" 0 "IDLE" ;
+VAL_ 109 TSL_P_Psd_StW 3 "SNA" 2 "INI" 1 "PSD" 0 "IDLE" ;
+VAL_ 257 GTW_epasEmergencyOn 1 "EMERGENCY_POWER" 0 "NONE" ;
+VAL_ 257 GTW_epasLDWEnabled 1 "ALLOWED" 0 "INHIBITED" ;
+VAL_ 257 GTW_epasPowerMode 0 "DRIVE_OFF" 1 "DRIVE_ON" 3 "LOAD_SHED" 2 "SHUTTING_DOWN" 15 "SNA" ;
+VAL_ 257 GTW_epasTuneRequest 1 "DM_COMFORT" 3 "DM_SPORT" 2 "DM_STANDARD" 0 "FAIL_SAFE_DEFAULT" 4 "RWD_COMFORT" 6 "RWD_SPORT" 5 "RWD_STANDARD" 7 "SNA" ;
+VAL_ 264 DI_torqueDriver -4096 "SNA" ;
+VAL_ 264 DI_torqueMotor -4096 "SNA" ;
+VAL_ 264 DI_soptState 7 "SOPT_TEST_SNA" 4 "SOPT_TEST_NOT_RUN" 3 "SOPT_TEST_PASSED" 2 "SOPT_TEST_FAILED" 1 "SOPT_TEST_IN_PROGRESS" 0 "SOPT_PRE_TEST" ;
+VAL_ 264 DI_motorRPM -32768 "SNA" ;
+VAL_ 264 DI_pedalPos 255 "SNA" ;
+VAL_ 280 DI_torqueEstimate -2048 "SNA" ;
+VAL_ 280 DI_gear 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ;
+VAL_ 280 DI_brakePedal 1 "Applied" 0 "Not_applied" ;
+VAL_ 280 DI_vehicleSpeed 4095 "SNA" ;
+VAL_ 280 DI_gearRequest 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ;
+VAL_ 280 DI_torqueInterfaceFailure 1 "TORQUE_INTERFACE_FAILED" 0 "TORQUE_INTERFACE_NORMAL" ;
+VAL_ 280 DI_brakePedalState 3 "SNA" 2 "INVALID" 1 "ON" 0 "OFF" ;
+VAL_ 280 DI_epbParkRequest 1 "Park_requested" 0 "No_request" ;
+VAL_ 280 DI_epbInterfaceReady 1 "EPB_INTERFACE_READY" 0 "EPB_INTERFACE_NOT_READY" ;
+VAL_ 309 ESP_absBrakeEvent 1 "ACTIVE" 0 "NOT_ACTIVE" ;
+VAL_ 309 ESP_brakeDiscWipingActive 1 "ACTIVE" 0 "INACTIVE" ;
+VAL_ 309 ESP_brakeLamp 0 "OFF" 1 "ON" ;
+VAL_ 309 ESP_espFaultLamp 0 "OFF" 1 "ON" ;
+VAL_ 309 ESP_espLampFlash 1 "FLASH" 0 "OFF" ;
+VAL_ 309 ESP_hillStartAssistActive 1 "ACTIVE" 0 "INACTIVE" 2 "NOT_AVAILABLE" 3 "SNA" ;
+VAL_ 309 ESP_absFaultLamp 0 "OFF" 1 "ON" ;
+VAL_ 309 ESP_espOffLamp 0 "OFF" 1 "ON" ;
+VAL_ 309 ESP_stabilityControlSts 2 "ENGAGED" 3 "FAULTED" 5 "INIT" 4 "NOT_CONFIGURED" 0 "OFF" 1 "ON" ;
+VAL_ 309 ESP_tcLampFlash 1 "FLASH" 0 "OFF" ;
+VAL_ 568 UI_mapSpeedLimit 31 "SNA" 30 "UNLIMITED" 29 "LESS_OR_EQ_160" 28 "LESS_OR_EQ_150" 27 "LESS_OR_EQ_140" 26 "LESS_OR_EQ_130" 25 "LESS_OR_EQ_120" 24 "LESS_OR_EQ_115" 23 "LESS_OR_EQ_110" 22 "LESS_OR_EQ_105" 21 "LESS_OR_EQ_100" 20 "LESS_OR_EQ_95" 19 "LESS_OR_EQ_90" 18 "LESS_OR_EQ_85" 17 "LESS_OR_EQ_80" 16 "LESS_OR_EQ_75" 15 "LESS_OR_EQ_70" 14 "LESS_OR_EQ_65" 13 "LESS_OR_EQ_60" 12 "LESS_OR_EQ_55" 11 "LESS_OR_EQ_50" 10 "LESS_OR_EQ_45" 9 "LESS_OR_EQ_40" 8 "LESS_OR_EQ_35" 7 "LESS_OR_EQ_30" 6 "LESS_OR_EQ_25" 5 "LESS_OR_EQ_20" 4 "LESS_OR_EQ_15" 3 "LESS_OR_EQ_10" 2 "LESS_OR_EQ_7" 1 "LESS_OR_EQ_5" 0 "UNKNOWN" ;
+VAL_ 569 DAS_leftLineUsage 3 "BLACKLISTED" 2 "FUSED" 1 "AVAILABLE" 0 "REJECTED_UNAVAILABLE" ;
+VAL_ 569 DAS_rightLineUsage 3 "BLACKLISTED" 2 "FUSED" 1 "AVAILABLE" 0 "REJECTED_UNAVAILABLE" ;
+VAL_ 569 DAS_leftFork 3 "LEFT_FORK_UNAVAILABLE" 2 "LEFT_FORK_SELECTED" 1 "LEFT_FORK_AVAILABLE" 0 "LEFT_FORK_NONE" ;
+VAL_ 569 DAS_rightFork 3 "RIGHT_FORK_UNAVAILABLE" 2 "RIGHT_FORK_SELECTED" 1 "RIGHT_FORK_AVAILABLE" 0 "RIGHT_FORK_NONE" ;
+VAL_ 521 DAS_locMode 3 "DAS_LOC_DRIVERLESS" 2 "DAS_LOC_RESTRICTED" 1 "DAS_LOC_NORMAL" 0 "DAS_LOC_OFF" ;
+VAL_ 521 DAS_locState 7 "DAS_LOC_FAULT_SNA" 6 "DAS_LOC_AEB_ACTIVE" 2 "DAS_LOC_CANCEL_SILENT" 1 "DAS_LOC_CANCEL_GENERIC" 0 "DAS_LOC_HEALTHY" ;
+VAL_ 521 DAS_locRequest 4 "DAS_RQ_PARK" 3 "DAS_RQ_HOLD" 2 "DAS_RQ_BACKWARD" 1 "DAS_RQ_FORWARD" 0 "DAS_RQ_IDLE" ;
+VAL_ 521 DAS_locJerkMin 255 "SNA" ;
+VAL_ 521 DAS_locJerkMax 255 "SNA" ;
+VAL_ 521 DAS_locSpeed 2047 "SNA" ;
+VAL_ 521 DAS_locAccelMin 511 "SNA" ;
+VAL_ 521 DAS_locAccelMax 511 "SNA" ;
+VAL_ 522 driverBrakeStatus 2 "APPLIED" 1 "NOT_APPLIED" ;
+VAL_ 760 UI_mapSpeedLimitUnits 1 "KPH" 0 "MPH" ;
+VAL_ 760 UI_userSpeedOffsetUnits 1 "KPH" 0 "MPH" ;
+VAL_ 643 AirTemp_Insd 255 "SNA" ;
+VAL_ 643 AirTemp_Outsd 254 "INIT" 255 "SNA" ;
+VAL_ 643 Bckl_Sw_RL_Stat_SAM_R 2 "FLT" 1 "NOT" 0 "OK" 3 "SNA" ;
+VAL_ 643 Bckl_Sw_RM_Stat_SAM_R 2 "FLT" 1 "NOT" 0 "OK" 3 "SNA" ;
+VAL_ 643 Bckl_Sw_RR_Stat_SAM_R 2 "FLT" 1 "NOT" 0 "OK" 3 "SNA" ;
+VAL_ 643 DL_RLtch_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ;
+VAL_ 643 DrRLtch_FL_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ;
+VAL_ 643 DrRLtch_FR_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ;
+VAL_ 643 DrRLtch_RL_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ;
+VAL_ 643 DrRLtch_RR_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ;
+VAL_ 643 EngHd_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ;
+VAL_ 643 LgtSens_Night 0 "DAY" 1 "NIGHT" ;
+VAL_ 643 MPkBrk_Stat 1 "ENGG" 0 "RELS" ;
+VAL_ 643 RevGr_Engg 0 "DISENGG" 1 "ENGG" 2 "NDEF2" 3 "SNA" ;
+VAL_ 643 StW_Cond_Stat 3 "BLINK" 1 "NDEF1" 0 "OFF" 2 "ON" ;
+VAL_ 643 Trlr_Stat 2 "NDEF2" 0 "NONE" 1 "OK" 3 "SNA" ;
+VAL_ 697 DAS_setSpeed 4095 "SNA" ;
+VAL_ 697 DAS_accState 15 "FAULT_SNA" 13 "ACC_CANCEL_GENERIC_SILENT" 11 "APC_SELFPARK_START" 10 "APC_UNPARK_COMPLETE" 9 "APC_PAUSE" 8 "APC_ABORT" 7 "APC_COMPLETE" 6 "APC_FORWARD" 5 "APC_BACKWARD" 4 "ACC_ON" 3 "ACC_HOLD" 0 "ACC_CANCEL_GENERIC" ;
+VAL_ 697 DAS_aebEvent 3 "AEB_SNA" 2 "AEB_FAULT" 1 "AEB_ACTIVE" 0 "AEB_NOT_ACTIVE" ;
+VAL_ 697 DAS_jerkMin 511 "SNA" ;
+VAL_ 697 DAS_jerkMax 255 "SNA" ;
+VAL_ 697 DAS_accelMin 511 "SNA" ;
+VAL_ 697 DAS_accelMax 511 "SNA" ;
+VAL_ 780 occupancyStatus 1 "OCCUPIED" 0 "UNOCCUPIED" ;
+VAL_ 780 buckleStatus 1 "LATCHED" 0 "UNLATCHED" ;
+VAL_ 792 BOOT_STATE 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
+VAL_ 792 CERRD 1 "CAN error detect" 0 "no Can error detected" ;
+VAL_ 792 DAY 1 "Init" 0 "SNA" ;
+VAL_ 792 DOOR_STATE_FL 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
+VAL_ 792 DOOR_STATE_FR 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
+VAL_ 792 DOOR_STATE_FrontTrunk 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
+VAL_ 792 DOOR_STATE_RL 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
+VAL_ 792 DOOR_STATE_RR 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
+VAL_ 792 GTW_updateInProgress 1 "IN_PROGRESS" 2 "IN_PROGRESS_NOT_USED" 3 "IN_PROGRESS_SNA" 0 "NOT_IN_PROGRESS" ;
+VAL_ 792 Hour 30 "Init" 31 "SNA" ;
+VAL_ 792 MCU_factoryMode 1 "FACTORY_MODE" 0 "NORMAL_MODE" ;
+VAL_ 792 MCU_transportModeOn 0 "NORMAL_MODE" ;
+VAL_ 792 MINUTE 62 "Init" 63 "SNA" ;
+VAL_ 792 MONTH 1 "Init" 15 "SNA" ;
+VAL_ 792 SECOND 62 "Init" 63 "SNA" ;
+VAL_ 792 YEAR 126 "Init" 127 "SNA" ;
+VAL_ 872 DI_aebState 2 "ENABLED" 4 "FAULT" 7 "SNA" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ;
+VAL_ 872 DI_analogSpeed 4095 "SNA" ;
+VAL_ 872 DI_cruiseState 2 "ENABLED" 5 "FAULT" 0 "OFF" 4 "OVERRIDE" 7 "PRE_CANCEL" 6 "PRE_FAULT" 1 "STANDBY" 3 "STANDSTILL" ;
+VAL_ 872 DI_digitalSpeed 255 "SNA" ;
+VAL_ 872 DI_immobilizerState 2 "AUTHENTICATING" 3 "DISARMED" 6 "FAULT" 4 "IDLE" 0 "INIT_SNA" 1 "REQUEST" 5 "RESET" ;
+VAL_ 872 DI_speedUnits 1 "KPH" 0 "MPH" ;
+VAL_ 872 DI_state 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ;
+VAL_ 872 DI_systemState 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ;
+VAL_ 872 DI_vehicleHoldState 2 "BLEND_IN" 4 "BLEND_OUT" 6 "FAULT" 7 "INIT" 5 "PARK" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ;
+VAL_ 880 EPAS_currentTuneMode 1 "DM_COMFORT" 3 "DM_SPORT" 2 "DM_STANDARD" 0 "FAIL_SAFE_DEFAULT" 4 "RWD_COMFORT" 6 "RWD_SPORT" 5 "RWD_STANDARD" 7 "UNAVAILABLE" ;
+VAL_ 880 EPAS_eacErrorCode 14 "EAC_ERROR_EPB_INHIBIT" 3 "EAC_ERROR_HANDS_ON" 7 "EAC_ERROR_HIGH_ANGLE_RATE_REQ" 9 "EAC_ERROR_HIGH_ANGLE_RATE_SAFETY" 6 "EAC_ERROR_HIGH_ANGLE_REQ" 8 "EAC_ERROR_HIGH_ANGLE_SAFETY" 10 "EAC_ERROR_HIGH_MMOT_SAFETY" 11 "EAC_ERROR_HIGH_TORSION_SAFETY" 0 "EAC_ERROR_IDLE" 12 "EAC_ERROR_LOW_ASSIST" 2 "EAC_ERROR_MAX_SPEED" 1 "EAC_ERROR_MIN_SPEED" 13 "EAC_ERROR_PINION_VEL_DIFF" 4 "EAC_ERROR_TMP_FAULT" 5 "EAR_ERROR_MAX_STEER_DELTA" 15 "SNA" ;
+VAL_ 880 EPAS_eacStatus 2 "EAC_ACTIVE" 1 "EAC_AVAILABLE" 3 "EAC_FAULT" 0 "EAC_INHIBITED" 4 "SNA" ;
+VAL_ 880 EPAS_handsOnLevel 0 "0" 1 "1" 2 "2" 3 "3" ;
+VAL_ 880 EPAS_steeringFault 1 "FAULT" 0 "NO_FAULT" ;
+VAL_ 880 EPAS_steeringRackForce 1022 "NOT_IN_SPEC" 1023 "SNA" ;
+VAL_ 880 EPAS_steeringReduced 0 "NORMAL_ASSIST" 1 "REDUCED_ASSIST" ;
+VAL_ 880 EPAS_torsionBarTorque 0 "SEE_SPECIFICATION" 4095 "SNA" 4094 "UNDEFINABLE_DATA" ;
+VAL_ 904 MCU_clusterReadyForDrive 0 "NO_SNA" 1 "YES" ;
+VAL_ 905 DAS_accSpeedLimit 1023 "SNA" 0 "NONE" ;
+VAL_ 905 DAS_pmmObstacleSeverity 7 "PMM_SNA" 6 "PMM_ACCEL_LIMIT" 5 "PMM_CRASH_FRONT" 4 "PMM_CRASH_REAR" 3 "PMM_BRAKE_REQUEST" 2 "PMM_IMMINENT_FRONT" 1 "PMM_IMMINENT_REAR" 0 "PMM_NONE" ;
+VAL_ 905 DAS_pmmLoggingRequest 1 "TRUE" 0 "FALSE" ;
+VAL_ 905 DAS_activationFailureStatus 2 "LC_ACTIVATION_FAILED_2" 1 "LC_ACTIVATION_FAILED_1" 0 "LC_ACTIVATION_IDLE" ;
+VAL_ 905 DAS_pmmUltrasonicsFaultReason 4 "PMM_ULTRASONICS_INVALID_MIA" 3 "PMM_ULTRASONICS_BLOCKED_BOTH" 2 "PMM_ULTRASONICS_BLOCKED_REAR" 1 "PMM_ULTRASONICS_BLOCKED_FRONT" 0 "PMM_ULTRASONICS_NO_FAULT" ;
+VAL_ 905 DAS_pmmRadarFaultReason 2 "PMM_RADAR_INVALID_MIA" 1 "PMM_RADAR_BLOCKED_FRONT" 0 "PMM_RADAR_NO_FAULT" ;
+VAL_ 905 DAS_pmmSysFaultReason 7 "PMM_FAULT_BRAKE_PEDAL_INHIBIT" 6 "PMM_FAULT_ROAD_TYPE" 5 "PMM_FAULT_DISABLED_BY_USER" 4 "PMM_FAULT_STEERING_ANGLE_RATE" 3 "PMM_FAULT_DI_FAULT" 2 "PMM_FAULT_SPEED" 1 "PMM_FAULT_DAS_DISABLED" 0 "PMM_FAULT_NONE" ;
+VAL_ 905 DAS_pmmCameraFaultReason 2 "PMM_CAMERA_INVALID_MIA" 1 "PMM_CAMERA_BLOCKED_FRONT" 0 "PMM_CAMERA_NO_FAULT" ;
+VAL_ 905 DAS_ACC_report 24 "ACC_REPORT_BEHAVIOR_REPORT" 23 "ACC_REPORT_CAMERA_ONLY" 22 "ACC_REPORT_RADAR_OBJ_FIVE" 21 "ACC_REPORT_CIPV_CUTTING_OUT" 20 "ACC_REPORT_MCVLR_IN_PATH" 19 "ACC_REPORT_MCVLR_DPP" 18 "ACC_REPORT_FLEET_SPEEDS" 17 "ACC_REPORT_TARGET_MCP" 16 "ACC_REPORT_RADAR_OBJ_TWO" 15 "ACC_REPORT_RADAR_OBJ_ONE" 14 "ACC_REPORT_LC_EXTERNAL_STATE_ACTIVE_RESTRICTED" 13 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTED" 12 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTING" 11 "ACC_REPORT_LC_HANDS_ON_REQD_STRUCK_OUT" 10 "ACC_REPORT_CSA" 9 "ACC_REPORT_TARGET_TYPE_FAULT" 8 "ACC_REPORT_TARGET_TYPE_IPSO" 7 "ACC_REPORT_TARGET_TYPE_TRAFFIC_LIGHT" 6 "ACC_REPORT_TARGET_TYPE_STOP_SIGN" 5 "ACC_REPORT_TARGET_CUTIN" 4 "ACC_REPORT_TARGET_MCVR" 3 "ACC_REPORT_TARGET_MCVL" 2 "ACC_REPORT_TARGET_IN_FRONT_OF_CIPV" 1 "ACC_REPORT_TARGET_CIPV" 0 "ACC_REPORT_TARGET_NONE" ;
+VAL_ 905 DAS_lssState 7 "LSS_STATE_OFF" 6 "LSS_STATE_ABORT" 5 "LSS_STATE_BLINDSPOT" 4 "LSS_STATE_MONITOR" 3 "LSS_STATE_ELK" 2 "LSS_STATE_LKA" 1 "LSS_STATE_LDW" 0 "LSS_STATE_FAULT" ;
+VAL_ 905 DAS_radarTelemetry 2 "RADAR_TELEMETRY_URGENT" 1 "RADAR_TELEMETRY_NORMAL" 0 "RADAR_TELEMETRY_IDLE" ;
+VAL_ 905 DAS_robState 3 "ROB_STATE_MAPLESS" 2 "ROB_STATE_ACTIVE" 1 "ROB_STATE_MEASURE" 0 "ROB_STATE_INHIBITED" ;
+VAL_ 905 DAS_driverInteractionLevel 2 "CONTINUED_DRIVER_NOT_INTERACTING" 1 "DRIVER_NOT_INTERACTING" 0 "DRIVER_INTERACTING" ;
+VAL_ 905 DAS_ppOffsetDesiredRamp 128 "PP_NO_OFFSET" ;
+VAL_ 905 DAS_longCollisionWarning 15 "FCM_LONG_COLLISION_WARNING_SNA" 12 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV2" 11 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR2" 10 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR" 9 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL2" 8 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL" 7 "FCM_LONG_COLLISION_WARNING_VEHICLE_CUTIN" 6 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV" 5 "FCM_LONG_COLLISION_WARNING_TFL_STOPLINE" 4 "FCM_LONG_COLLISION_WARNING_STOPSIGN_STOPLINE" 3 "FCM_LONG_COLLISION_WARNING_IPSO" 2 "FCM_LONG_COLLISION_WARNING_PEDESTRIAN" 1 "FCM_LONG_COLLISION_WARNING_VEHICLE_UNKNOWN" 0 "FCM_LONG_COLLISION_WARNING_NONE" ;
+VAL_ 921 autopilotStatus 5 "ACTIVE_NAVIGATE_ON_AUTOPILOT" 4 "ACTIVE_2" 3 "ACTIVE_1" 2 "AVAILABLE" 1 "UNAVAILABLE" 0 "DISABLED" ;
+VAL_ 921 DAS_blindSpotRearLeft 3 "SNA" 2 "WARNING_LEVEL_2" 1 "WARNING_LEVEL_1" 0 "NO_WARNING" ;
+VAL_ 921 DAS_blindSpotRearRight 3 "SNA" 2 "WARNING_LEVEL_2" 1 "WARNING_LEVEL_1" 0 "NO_WARNING" ;
+VAL_ 921 DAS_fusedSpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ;
+VAL_ 921 DAS_suppressSpeedWarning 1 "Suppress_Speed_Warning" 0 "Do_Not_Suppress" ;
+VAL_ 921 DAS_visionOnlySpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ;
+VAL_ 921 DAS_heaterState 1 "HEATER_ON" 0 "HEATER_OFF_SNA" ;
+VAL_ 921 DAS_forwardCollisionWarning 3 "SNA" 1 "FORWARD_COLLISION_WARNING" 0 "NONE" ;
+VAL_ 921 DAS_autoparkReady 1 "AUTOPARK_READY" 0 "AUTOPARK_UNAVAILABLE" ;
+VAL_ 921 DAS_sideCollisionAvoid 3 "SNA" 2 "AVOID_RIGHT" 1 "AVOID_LEFT" 0 "NONE" ;
+VAL_ 921 DAS_sideCollisionWarning 3 "WARN_LEFT_RIGHT" 2 "WARN_RIGHT" 1 "WARN_LEFT" 0 "NONE" ;
+VAL_ 921 DAS_sideCollisionInhibit 1 "INHIBIT" 0 "NO_INHIBIT" ;
+VAL_ 921 DAS_csaState 3 "CSA_EXTERNAL_STATE_HOLD" 2 "CSA_EXTERNAL_STATE_ENABLE" 1 "CSA_EXTERNAL_STATE_AVAILABLE" 0 "CSA_EXTERNAL_STATE_UNAVAILABLE" ;
+VAL_ 921 DAS_laneDepartureWarning 5 "SNA" 4 "RIGHT_WARNING_SEVERE" 3 "LEFT_WARNING_SEVERE" 2 "RIGHT_WARNING" 1 "LEFT_WARNING" 0 "NONE" ;
+VAL_ 921 DAS_fleetSpeedState 3 "FLEETSPEED_HOLD" 2 "FLEETSPEED_ACTIVE" 1 "FLEETSPEED_AVAILABLE" 0 "FLEETSPEED_UNAVAILABLE" ;
+VAL_ 921 DAS_autopilotHandsOnState 15 "LC_HANDS_ON_SNA" 8 "LC_HANDS_ON_SUSPENDED" 7 "LC_HANDS_ON_REQD_STRUCK_OUT" 5 "LC_HANDS_ON_REQD_CHIME_2" 4 "LC_HANDS_ON_REQD_CHIME_1" 3 "LC_HANDS_ON_REQD_VISUAL" 2 "LC_HANDS_ON_REQD_NOT_DETECTED" 1 "LC_HANDS_ON_REQD_DETECTED" 0 "LC_HANDS_ON_NOT_REQD" ;
+VAL_ 921 DAS_autoLaneChangeState 31 "ALC_SNA" 30 "ALC_ABORT_MISSION_PLAN_INVALID" 29 "ALC_ABORT_TIMEOUT" 28 "ALC_WAITING_HANDS_ON" 27 "ALC_BLOCKED_LANE_TYPE_R" 26 "ALC_BLOCKED_LANE_TYPE_L" 25 "ALC_BLOCKED_VEH_TTC_AND_USS_R" 24 "ALC_BLOCKED_VEH_TTC_R" 23 "ALC_BLOCKED_VEH_TTC_AND_USS_L" 22 "ALC_BLOCKED_VEH_TTC_L" 21 "ALC_UNAVAILABLE_SOLID_LANE_LINE" 20 "ALC_ABORT_OTHER_REASON" 19 "ALC_ABORT_BLINKER_TURNED_OFF" 18 "ALC_ABORT_LC_HEALTH_BAD" 17 "ALC_ABORT_POOR_VIEW_RANGE" 16 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_R" 15 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_L" 14 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_R" 13 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_L" 12 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_R" 11 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_L" 10 "ALC_IN_PROGRESS_R" 9 "ALC_IN_PROGRESS_L" 8 "ALC_AVAILABLE_BOTH" 7 "ALC_AVAILABLE_ONLY_R" 6 "ALC_AVAILABLE_ONLY_L" 5 "ALC_UNAVAILABLE_VEHICLE_SPEED" 4 "ALC_UNAVAILABLE_EXITING_HIGHWAY" 3 "ALC_UNAVAILABLE_TP_FOLLOW" 2 "ALC_UNAVAILABLE_SONICS_INVALID" 1 "ALC_UNAVAILABLE_NO_LANES" 0 "ALC_UNAVAILABLE_DISABLED" ;
+VAL_ 1001 DAS_headlightRequest 3 "DAS_HEADLIGHT_REQUEST_INVALID" 1 "DAS_HEADLIGHT_REQUEST_ON" 0 "DAS_HEADLIGHT_REQUEST_OFF" ;
+VAL_ 1001 DAS_hazardLightRequest 3 "DAS_REQUEST_HAZARDS_SNA" 2 "DAS_REQUEST_HAZARDS_UNUSED" 1 "DAS_REQUEST_HAZARDS_ON" 0 "DAS_REQUEST_HAZARDS_OFF" ;
+VAL_ 1001 DAS_wiperSpeed 15 "DAS_WIPER_SPEED_INVALID" 14 "DAS_WIPER_SPEED_14" 13 "DAS_WIPER_SPEED_13" 12 "DAS_WIPER_SPEED_12" 11 "DAS_WIPER_SPEED_11" 10 "DAS_WIPER_SPEED_10" 9 "DAS_WIPER_SPEED_9" 8 "DAS_WIPER_SPEED_8" 7 "DAS_WIPER_SPEED_7" 6 "DAS_WIPER_SPEED_6" 5 "DAS_WIPER_SPEED_5" 4 "DAS_WIPER_SPEED_4" 3 "DAS_WIPER_SPEED_3" 2 "DAS_WIPER_SPEED_2" 1 "DAS_WIPER_SPEED_1" 0 "DAS_WIPER_SPEED_OFF" ;
+VAL_ 1001 DAS_turnIndicatorRequest 3 "DAS_TURN_INDICATOR_CANCEL" 2 "DAS_TURN_INDICATOR_RIGHT" 1 "DAS_TURN_INDICATOR_LEFT" 0 "DAS_TURN_INDICATOR_NONE" ;
+VAL_ 1001 DAS_highLowBeamDecision 3 "DAS_HIGH_BEAM_SNA" 2 "DAS_HIGH_BEAM_ON" 1 "DAS_HIGH_BEAM_OFF" 0 "DAS_HIGH_BEAM_UNDECIDED" ;
+VAL_ 1001 DAS_highLowBeamOffReason 5 "HIGH_BEAM_OFF_REASON_SNA" 4 "HIGH_BEAM_OFF_REASON_HEAD_LIGHT" 3 "HIGH_BEAM_OFF_REASON_AMBIENT_LIGHT" 2 "HIGH_BEAM_OFF_REASON_MOVING_RADAR_TARGET" 1 "HIGH_BEAM_OFF_REASON_MOVING_VISION_TARGET" 0 "HIGH_BEAM_ON" ;
+VAL_ 1001 DAS_turnIndicatorRequestReason 6 "DAS_ACTIVE_COMMANDED_LANE_CHANGE" 5 "DAS_CANCEL_FORK" 4 "DAS_CANCEL_LANE_CHANGE" 3 "DAS_ACTIVE_FORK" 2 "DAS_ACTIVE_SPEED_LANE_CHANGE" 1 "DAS_ACTIVE_NAV_LANE_CHANGE" 0 "DAS_NONE" ;
+VAL_ 1160 DAS_steeringAngleRequest 16384 "ZERO_ANGLE" ;
+VAL_ 1160 DAS_steeringControlType 1 "ANGLE_CONTROL" 3 "DISABLED" 0 "NONE" 2 "RESERVED" ;
+VAL_ 1160 DAS_steeringHapticRequest 1 "ACTIVE" 0 "IDLE" ;
+
+
diff --git a/iqdbc_repo/iqdbc/dbc/tesla_model3_party.dbc b/iqdbc_repo/iqdbc/dbc/tesla_model3_party.dbc
new file mode 100644
index 000000000..f08a72a01
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/tesla_model3_party.dbc
@@ -0,0 +1,488 @@
+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_: CH DIPF DIPR ETH FC HVI HVS PARTY SDCV VEH VIRT
+
+
+BO_ 905 DAS_status2: 8 PARTY
+ SG_ DAS_status2Checksum : 56|8@1+ (1,0) [0|255] "" aps
+ SG_ DAS_status2Counter : 52|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_longCollisionWarning : 48|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_ppOffsetDesiredRamp : 40|8@1+ (0.01,-1.28) [-1.28|1.27] "m" aps
+ SG_ DAS_driverInteractionLevel : 38|2@1+ (1,0) [0|2] "" aps
+ SG_ DAS_robState : 36|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_radarTelemetry : 34|2@1+ (1,0) [0|2] "" aps
+ SG_ DAS_lssState : 31|3@1+ (1,0) [0|7] "" aps
+ SG_ DAS_ACC_report : 26|5@1+ (1,0) [0|24] "" aps
+ SG_ DAS_pmmCameraFaultReason : 24|2@1+ (1,0) [0|2] "" aps
+ SG_ DAS_pmmSysFaultReason : 21|3@1+ (1,0) [0|7] "" aps
+ SG_ DAS_pmmRadarFaultReason : 19|2@1+ (1,0) [0|2] "" aps
+ SG_ DAS_pmmUltrasonicsFaultReason : 16|3@1+ (1,0) [0|4] "" aps
+ SG_ DAS_activationFailureStatus : 14|2@1+ (1,0) [0|2] "" aps
+ SG_ DAS_pmmLoggingRequest : 13|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_pmmObstacleSeverity : 10|3@1+ (1,0) [0|7] "" aps
+ SG_ DAS_accSpeedLimit : 0|10@1+ (0.4,0) [0|204.6] "mph" aps
+
+BO_ 264 DI_torque: 8 PARTY
+ SG_ DI_axleSpeed : 40|16@1- (0.1,0.0) [-2750|2750] "RPM" epas3s
+ SG_ DI_torqueActual : 27|13@1- (2,0) [-7500|7500] "Nm" X
+ SG_ DI_torqueCommand : 12|13@1- (2,0) [-7500|7500] "Nm" X
+ SG_ DI_torqueCounter : 8|4@1+ (1,0) [0|15] "" epas3s
+ SG_ DI_torqueChecksum : 0|8@1+ (1,0) [0|255] "" epas3s
+
+BO_ 585 SCCM_leftStalk: 3 PARTY
+ SG_ SCCM_leftStalkReserved1 : 19|5@1+ (1,0) [0|31] "" X
+ SG_ SCCM_turnIndicatorStalkStatus : 16|3@1+ (1,0) [0|5] "" park
+ SG_ SCCM_washWipeButtonStatus : 14|2@1+ (1,0) [0|3] "" X
+ SG_ SCCM_highBeamStalkStatus : 12|2@1+ (1,0) [0|3] "" X
+ SG_ SCCM_leftStalkCounter : 8|4@1+ (1,0) [0|15] "" X
+ SG_ SCCM_leftStalkCrc : 0|8@1+ (1,0) [0|255] "" X
+
+BO_ 280 DI_systemStatus: 8 PARTY
+ SG_ DI_trackModeState : 48|2@1+ (1,0) [0|2] "" X
+ SG_ DI_keepAliveRequest : 47|1@1+ (1,0) [0|1] "" X
+ SG_ DI_proximity : 46|1@1+ (1,0) [0|1] "" X
+ SG_ DI_epbRequest : 44|2@1+ (1,0) [0|2] "" X
+ SG_ DI_tractionControlMode : 40|3@1+ (1,0) [0|5] "" X
+ SG_ DI_accelPedalPos : 32|8@1+ (0.4,0) [0|100] "%" X
+ SG_ DI_immobilizerState : 27|3@1+ (1,0) [0|6] "" X
+ SG_ DI_regenLight : 26|1@1+ (1,0) [0|1] "" X
+ SG_ DI_gear : 21|3@1+ (1,0) [0|7] "" park
+ SG_ DI_brakePedalState : 19|2@1+ (1,0) [0|2] "" X
+ SG_ DI_systemState : 16|3@1+ (1,0) [0|5] "" X
+ SG_ DI_systemStatusCounter : 8|4@1+ (1,0) [0|15] "" X
+ SG_ DI_systemStatusChecksum : 0|8@1+ (1,0) [0|255] "" X
+
+BO_ 697 DAS_control: 8 PARTY
+ SG_ DAS_controlChecksum : 56|8@1+ (1,0) [0|255] "" aps
+ SG_ DAS_controlCounter : 53|3@1+ (1,0) [0|7] "" aps
+ SG_ DAS_accelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" aps
+ SG_ DAS_accelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" aps
+ SG_ DAS_jerkMax : 27|8@1+ (0.034,0) [0|8.67] "m/s^3" aps
+ SG_ DAS_jerkMin : 18|9@1+ (0.018,-9.1) [-9.1|0.097999999999999] "m/s^3" aps
+ SG_ DAS_aebEvent : 16|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_accState : 12|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_setSpeed : 0|12@1+ (0.1,0) [0|409.4] "kph" aps
+
+BO_ 341 ESP_B: 8 PARTY
+ SG_ ESP_wheelRotationChecksum : 56|8@1+ (1,0) [0|255] "" app
+ SG_ ESP_wheelRotationCounter : 52|4@1+ (1,0) [0|15] "" app
+ SG_ ESP_vehicleSpeed : 42|10@1+ (0.5,0) [0|511] "kph" app
+ SG_ ESP_vehicleStandstillSts : 41|1@1+ (1,0) [0|1] "" park
+ SG_ ESP_wheelSpeedsQF : 40|1@1+ (1,0) [0|1] "" epas3s
+ SG_ ESP_WheelRotationFrL : 38|2@1+ (1,0) [0|3] "" aps
+ SG_ ESP_WheelRotationFrR : 36|2@1+ (1,0) [0|3] "" aps
+ SG_ ESP_WheelRotationReL : 34|2@1+ (1,0) [0|3] "" aps
+ SG_ ESP_WheelRotationReR : 32|2@1+ (1,0) [0|3] "" aps
+ SG_ ESP_wheelPulseCountReR : 24|8@1+ (1,0) [0|254] "1" das
+ SG_ ESP_wheelPulseCountReL : 16|8@1+ (1,0) [0|254] "1" das
+ SG_ ESP_wheelPulseCountFrR : 8|8@1+ (1,0) [0|254] "1" app
+ SG_ ESP_wheelPulseCountFrL : 0|8@1+ (1,0) [0|254] "1" app
+
+BO_ 373 ESP_wheelSpeeds: 8 CH
+ SG_ ESP_wheelSpeedsChecksum : 56|8@1+ (1,0) [0|255] "" das
+ SG_ ESP_wheelSpeedsCounter : 52|4@1+ (1,0) [0|15] "" das
+ SG_ ESP_wheelSpeedReR : 39|13@1+ (0.04,0) [0|327.64] "km/h" das
+ SG_ ESP_wheelSpeedReL : 26|13@1+ (0.04,0) [0|327.64] "km/h" das
+ SG_ ESP_wheelSpeedFrR : 13|13@1+ (0.04,0) [0|327.64] "km/h" das
+ SG_ ESP_wheelSpeedFrL : 0|13@1+ (0.04,0) [0|327.64] "km/h" das
+
+BO_ 969 APS_status: 4 PARTY
+ SG_ APS_statusCounter : 22|4@1+ (1,0) [0|15] "" X
+ SG_ APS_apbGpioState : 20|2@1+ (1,0) [0|3] "" gtw
+ SG_ APS_apbStatusMonitorState : 16|3@1+ (1,0) [0|7] "" gtw
+ SG_ APS_switchState : 15|1@1+ (1,0) [0|1] "" X
+ SG_ APS_eacInternalState : 12|3@1+ (1,0) [0|7] "" gtw
+ SG_ APS_appGpioState : 10|2@1+ (1,0) [0|3] "" gtw
+ SG_ APS_canMaster : 8|2@1+ (1,0) [0|3] "" gtw
+ SG_ APS_vehBehaviorState : 4|3@1+ (1,0) [0|7] "" gtw
+ SG_ APS_appStatusMonitorState : 0|3@1+ (1,0) [0|7] "" gtw
+
+BO_ 925 IBST_status: 5 PARTY
+ SG_ IBST_sInputRodDriver : 21|12@1+ (0.015625,-5) [-5|47] "mm" gtw
+ SG_ IBST_internalState : 18|3@1+ (1,0) [0|6] "" gtw
+ SG_ IBST_driverBrakeApply : 16|2@1+ (1,0) [0|3] "" gtw
+ SG_ IBST_iBoosterStatus : 12|3@1+ (1,0) [0|6] "" gtw
+ SG_ IBST_statusCounter : 8|4@1+ (1,0) [0|15] "" X
+ SG_ IBST_statusChecksum : 0|8@1+ (1,0) [0|255] "" X
+
+BO_ 880 EPAS3S_sysStatus: 8 PARTY
+ SG_ EPAS3S_sysStatusChecksum : 56|8@1+ (1,0) [0|255] "" park
+ SG_ EPAS3S_sysStatusCounter : 48|4@1+ (1,0) [0|15] "" gtw
+ SG_ EPAS3S_eacStatus : 55|3@0+ (1,0) [0|7] "" das
+ SG_ EPAS3S_internalSAS : 37|14@0+ (0.1,-819.2) [-819.2|819] "deg" das
+ SG_ EPAS3S_handsOnLevel : 39|2@0+ (1,0) [0|3] "" das
+ SG_ EPAS3S_torsionBarTorque : 19|12@0+ (0.01,-20.5) [-20.5|20.45] "Nm" das
+ SG_ EPAS3S_eacErrorCode : 23|4@0+ (1,0) [0|15] "" das
+ SG_ EPAS3S_steeringRackForce : 1|10@0+ (50,-25575) [-25575|25575] "N" gtw
+ SG_ EPAS3S_steeringFault : 2|1@0+ (1,0) [0|1] "" das
+ SG_ EPAS3S_steeringReduced : 3|1@0+ (1,0) [0|1] "" das
+ SG_ EPAS3S_internalSASQF : 4|1@0+ (1,0) [0|1] "" gtw
+ SG_ EPAS3S_currentTuneMode : 7|3@0+ (1,0) [0|5] "" gtw
+
+BO_ 637 APS_eacMonitor: 3 PARTY
+ SG_ APS_eacAllow : 0|2@1+ (1,0) [0|0] "" X
+ SG_ APS_eacMonitorChecksum : 16|8@1+ (1,0) [0|0] "" X
+ SG_ APS_eacMonitorCounter : 8|4@1+ (1,0) [0|0] "" X
+
+BO_ 545 VCFRONT_LVPowerState: 8 CH
+ SG_ VCFRONT_LVPowerStateChecksum : 56|8@1+ (1,0) [0|255] "" ibst
+ SG_ VCFRONT_LVPowerStateCounter : 52|4@1+ (1,0) [0|15] "" ibst
+ SG_ VCFRONT_uiAudioLVState m0 : 50|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_uiHiCurrentLVState m0 : 48|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_vcrightHiCurrentLVState m0 : 46|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_vcleftHiCurrentLVState m0 : 44|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_ocsLVRequest m0 : 42|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_oilPumpRearLVRequest m0 : 40|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_oilPumpFrontLVState m0 : 38|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_disLVState m0 : 36|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_diLVRequest m0 : 34|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_das2HighCurrentLVState m0 : 32|2@1+ (1,0) [0|3] "" das
+ SG_ VCFRONT_das1HighCurrentLVState m0 : 30|2@1+ (1,0) [0|3] "" das
+ SG_ VCFRONT_amplifierLVRequest m0 : 28|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_tunerLVRequest m0 : 26|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_iBoosterLVState m0 : 24|2@1+ (1,0) [0|3] "" ibst
+ SG_ VCFRONT_rcmLVRequest m0 : 22|2@1+ (1,0) [0|3] "" rcm
+ SG_ VCFRONT_tpmsLVRequest m0 : 20|2@1+ (1,0) [0|3] "" tpms
+ SG_ VCFRONT_sccmLVRequest m0 : 18|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_pcsLVState m1 : 16|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_ptcLVRequest m0 : 16|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_hvacCompLVState m0 : 14|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_tasLVState m1 : 14|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_hvcLVRequest m1 : 12|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_radcLVState m0 : 12|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_epasLVState m1 : 10|2@1+ (1,0) [0|3] "" epas3s
+ SG_ VCFRONT_espLVState m0 : 10|2@1+ (1,0) [0|3] "" ibst
+ SG_ VCFRONT_parkLVState m0 : 8|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_cpLVRequest m1 : 8|2@1+ (1,0) [0|3] "" X
+ SG_ VCFRONT_vehiclePowerState : 5|2@1+ (1,0) [0|3] "" park
+ SG_ VCFRONT_LVPowerStateIndex M : 0|5@1+ (1,0) [0|1] "" epas3s
+
+BO_ 599 DI_speed: 8 PARTY
+ SG_ DI_uiSpeedUnits : 33|1@1+ (1,0) [0|1] "" das
+ SG_ DI_uiSpeed : 24|8@1+ (1,0) [0|254] "" das
+ SG_ DI_vehicleSpeed : 12|12@1+ (0.08,-40) [-40|285] "kph" park
+ SG_ DI_speedCounter : 8|4@1+ (1,0) [0|15] "" park
+ SG_ DI_speedChecksum : 0|8@1+ (1,0) [0|255] "" park
+
+BO_ 605 DAS_road: 6 XXX
+ SG_ DAS_stopLineDist : 16|8@1+ (0.5,0) [0|127.5] "m" XXX
+ SG_ DAS_trafficLightColor : 26|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 1160 DAS_steeringControl: 4 PARTY
+ SG_ DAS_steeringControlChecksum : 24|8@1+ (1,0) [0|255] "" aps
+ SG_ DAS_steeringControlCounter : 16|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_steeringControlType : 23|3@0+ (1,0) [0|7] "" aps
+ SG_ DAS_steeringAngleRequest : 6|15@0+ (0.1,-1638.35) [-1638.35|1638.35] "deg" aps
+ SG_ DAS_steeringHapticRequest : 7|1@0+ (1,0) [0|1] "" aps
+
+BO_ 297 SCCM_steeringAngleSensor: 8 PARTY
+ SG_ SCCM_steeringAngleSensorReservd3 : 56|8@1+ (1,0) [0|255] "" X
+ SG_ SCCM_steeringAngleSensorReservd2 : 48|8@1+ (1,0) [0|255] "" X
+ SG_ SCCM_steeringAngleSensorReservd1 : 46|2@1+ (1,0) [0|3] "" X
+ SG_ SCCM_steeringAngleSpeed : 32|14@1+ (0.5,-4096) [-4096|4095.5] "deg/s" park
+ SG_ SCCM_steeringAngleValidity : 30|2@1+ (1,0) [0|3] "" park
+ SG_ SCCM_steeringAngle : 16|14@1+ (0.1,-819.2) [-819.2|819] "deg" epas3s
+ SG_ SCCM_steeringAngleSensorStatus : 14|2@1+ (1,0) [0|3] "" epas3s
+ SG_ SCCM_supplierID : 12|2@1+ (1,0) [0|3] "" park
+ SG_ SCCM_steeringAngleCounter : 8|4@1+ (1,0) [0|15] "" epas3s
+ SG_ SCCM_steeringAngleCrc : 0|8@1+ (1,0) [0|255] "" epas3s
+
+BO_ 646 DI_state: 8 ETH
+ SG_ DI_summonInPanic : 48|1@1+ (1,0) [0|0] "" X
+ SG_ DI_rollPreventionState : 45|3@1+ (1,0) [0|0] "" X
+ SG_ DI_vehicleHoldState : 42|3@1+ (1,0) [0|0] "" X
+ SG_ DI_pmmStatus : 40|2@1+ (1,0) [0|0] "" X
+ SG_ DI_aebState : 37|3@1+ (1,0) [0|0] "" X
+ SG_ DI_autopilotRequest : 36|1@1+ (1,0) [0|0] "" X
+ SG_ DI_parkBrakeState : 32|4@1+ (1,0) [0|0] "" X
+ SG_ DI_autoparkState : 25|4@1+ (1,0) [0|0] "" X
+ SG_ DI_speedUnits : 24|1@1+ (1,0) [0|0] "" X
+ SG_ DI_digitalSpeed : 15|9@1+ (0.5,0) [0|0] "speed" X
+ SG_ DI_cruiseState : 12|3@1+ (1,0) [0|0] "" X
+ SG_ DI_locStatusCounter : 8|4@1+ (1,0) [0|0] "" X
+ SG_ DI_locStatusChecksum : 0|8@1+ (1,0) [0|0] "" X
+
+BO_ 659 DAS_settings: 8 XXX
+ SG_ DAS_driverSteeringWeight : 1|2@0+ (1,0) [0|255] "" XXX
+ SG_ DAS_slipStart : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAS_offRoadAssist : 3|2@1+ (1,0) [0|63] "" XXX
+ SG_ DAS_distanceUnits : 13|1@1+ (1,0) [0|255] "" XXX
+ SG_ DAS_aebEnabled : 18|1@0+ (1,0) [0|255] "" XXX
+ SG_ DAS_adaptiveHeadlights : 22|1@1+ (1,0) [0|31] "" XXX
+ SG_ DAS_autosteerEnabled2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAS_fcwEnabled : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAS_fcwSensitivity : 37|2@0+ (1,0) [0|63] "" XXX
+ SG_ DAS_autosteerEnabled : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAS_obstacleAwareAcceleration : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAS_driverAccelerationMode : 44|1@1+ (1,0) [0|127] "" XXX
+ SG_ DAS_settingCounter : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ DAS_settingChecksum : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 785 UI_warning: 7 XXX
+ SG_ buckleStatus : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ scrollWheelPressed : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ leftBlinkerOn : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ rightBlinkerOn : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ leftBlinkerBlinking : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ rightBlinkerBlinking : 26|2@1+ (1,0) [0|15] "" XXX
+ SG_ anyDoorOpen : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ wiperSettings : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ highBeam : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_warningCounter : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ UI_warningChecksum : 0|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 923 DAS_status: 8 PARTY
+ SG_ DAS_statusChecksum : 56|8@1+ (1,0) [0|255] "" aps
+ SG_ DAS_statusCounter : 52|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_summonAvailable : 51|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_autoLaneChangeState : 46|5@1+ (1,0) [0|31] "" aps
+ SG_ DAS_autopilotHandsOnState : 42|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_fleetSpeedState : 40|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_laneDepartureWarning : 37|3@1+ (1,0) [0|5] "" aps
+ SG_ DAS_csaState : 35|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_sideCollisionInhibit : 34|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_sideCollisionWarning : 32|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_sideCollisionAvoid : 30|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_summonRvsLeashReached : 29|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_summonFwdLeashReached : 28|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_autoparkWaitingForBrake : 26|1@1+ (1,0) [0|1] "" gtw
+ SG_ DAS_autoParked : 25|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_autoparkReady : 24|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_forwardCollisionWarning : 22|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_heaterState : 21|1@1+ (1,0) [0|1] "" gtw
+ SG_ DAS_visionOnlySpeedLimit : 16|5@1+ (5,0) [0|150] "kph/mph" aps
+ SG_ DAS_summonClearedGate : 15|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_summonObstacle : 14|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_suppressSpeedWarning : 13|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_fusedSpeedLimit : 8|5@1+ (5,0) [0|150] "kph/mph" aps
+ SG_ DAS_blindSpotRearRight : 6|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_blindSpotRearLeft : 4|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_autopilotState : 0|4@1+ (1,0) [0|15] "" aps
+
+BO_ 325 ESP_status: 8 PARTY
+ SG_ ESP_absBrakeEvent2 : 22|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_absFaultLamp : 17|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_brakeApply : 31|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_brakeDiscWipingActive : 28|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_brakeLamp : 21|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_brakeTorqueTarget : 51|13@1+ (2,0) [0|0] "Nm" X
+ SG_ ESP_btcTargetState : 38|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_cdpStatus : 34|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_driverBrakeApply : 29|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_ebdFaultLamp : 16|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_ebrStandstillSkid : 48|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_ebrStatus : 49|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_espFaultLamp : 18|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_espLampFlash : 20|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_espModeActive : 12|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_hydraulicBoostEnabled : 19|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_lateralAccelQF : 25|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_longitudinalAccelQF : 24|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_ptcTargetState : 36|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_stabilityControlSts2 : 14|2@1+ (1,0) [0|0] "" X
+ SG_ ESP_statusChecksum : 0|8@1+ (1,0) [0|0] "" X
+ SG_ ESP_statusCounter : 8|4@1+ (1,0) [0|0] "" X
+ SG_ ESP_steeringAngleQF : 27|1@1+ (1,0) [0|0] "" X
+ SG_ ESP_yawRateQF : 26|1@1+ (1,0) [0|0] "" X
+
+CM_ BO_ 605 "Bytes change when toggling between FSD and AP, as well as Traffic Light and Stop Sign Control in TACC";
+
+CM_ SG_ 659 DAS_autosteerEnabled "1 if Autosteer or FSD is enabled, 0 otherwise";
+CM_ SG_ 785 leftBlinkerOn "only describes stalk position if half pressed without auto-cancel blinkers. otherwise acts as expected";
+CM_ SG_ 785 rightBlinkerOn "only describes stalk position if half pressed without auto-cancel blinkers. otherwise acts as expected";
+CM_ SG_ 785 scrollWheelPressed "captures either scroll wheel left, right or down press";
+
+VAL_ 545 VCFRONT_uiAudioLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_uiHiCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_vcrightHiCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_vcleftHiCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_ocsLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_oilPumpRearLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_oilPumpFrontLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_disLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_diLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_das2HighCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_das1HighCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_amplifierLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_tunerLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_iBoosterLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_rcmLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_tpmsLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_sccmLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_pcsLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_ptcLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_hvacCompLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_tasLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_hvcLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_radcLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_epasLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_espLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_parkLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_cpLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ;
+VAL_ 545 VCFRONT_vehiclePowerState 3 "VEHICLE_POWER_STATE_DRIVE" 1 "VEHICLE_POWER_STATE_CONDITIONING" 2 "VEHICLE_POWER_STATE_ACCESSORY" 0 "VEHICLE_POWER_STATE_OFF" ;
+VAL_ 545 VCFRONT_LVPowerStateIndex 0 "Mux0" 1 "Mux1" ;
+VAL_ 905 DAS_longCollisionWarning 7 "FCM_LONG_COLLISION_WARNING_VEHICLE_CUTIN" 0 "FCM_LONG_COLLISION_WARNING_NONE" 4 "FCM_LONG_COLLISION_WARNING_STOPSIGN_STOPLINE" 9 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL2" 15 "FCM_LONG_COLLISION_WARNING_SNA" 8 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL" 5 "FCM_LONG_COLLISION_WARNING_TFL_STOPLINE" 2 "FCM_LONG_COLLISION_WARNING_PEDESTRIAN" 12 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV2" 6 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV" 10 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR" 3 "FCM_LONG_COLLISION_WARNING_IPSO" 1 "FCM_LONG_COLLISION_WARNING_VEHICLE_UNKNOWN" 11 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR2" ;
+VAL_ 905 DAS_ppOffsetDesiredRamp 128 "PP_NO_OFFSET" ;
+VAL_ 905 DAS_driverInteractionLevel 0 "DRIVER_INTERACTING" 1 "DRIVER_NOT_INTERACTING" 2 "CONTINUED_DRIVER_NOT_INTERACTING" ;
+VAL_ 905 DAS_robState 0 "ROB_STATE_INHIBITED" 2 "ROB_STATE_ACTIVE" 3 "ROB_STATE_MAPLESS" 1 "ROB_STATE_MEASURE" ;
+VAL_ 905 DAS_radarTelemetry 0 "RADAR_TELEMETRY_IDLE" 1 "RADAR_TELEMETRY_NORMAL" 2 "RADAR_TELEMETRY_URGENT" ;
+VAL_ 905 DAS_lssState 7 "LSS_STATE_OFF" 1 "LSS_STATE_LDW" 4 "LSS_STATE_MONITOR" 2 "LSS_STATE_LKA" 3 "LSS_STATE_ELK" 0 "LSS_STATE_FAULT" 5 "LSS_STATE_BLINDSPOT" 6 "LSS_STATE_ABORT" ;
+VAL_ 905 DAS_ACC_report 12 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTING" 17 "ACC_REPORT_TARGET_MCP" 11 "ACC_REPORT_LC_HANDS_ON_REQD_STRUCK_OUT" 19 "ACC_REPORT_MCVLR_DPP" 1 "ACC_REPORT_TARGET_CIPV" 15 "ACC_REPORT_RADAR_OBJ_ONE" 16 "ACC_REPORT_RADAR_OBJ_TWO" 14 "ACC_REPORT_LC_EXTERNAL_STATE_ACTIVE_RESTRICTED" 4 "ACC_REPORT_TARGET_MCVR" 20 "ACC_REPORT_MCVLR_IN_PATH" 10 "ACC_REPORT_CSA" 5 "ACC_REPORT_TARGET_CUTIN" 9 "ACC_REPORT_TARGET_TYPE_FAULT" 7 "ACC_REPORT_TARGET_TYPE_TRAFFIC_LIGHT" 6 "ACC_REPORT_TARGET_TYPE_STOP_SIGN" 24 "ACC_REPORT_BEHAVIOR_REPORT" 18 "ACC_REPORT_FLEET_SPEEDS" 2 "ACC_REPORT_TARGET_IN_FRONT_OF_CIPV" 23 "ACC_REPORT_CAMERA_ONLY" 3 "ACC_REPORT_TARGET_MCVL" 22 "ACC_REPORT_RADAR_OBJ_FIVE" 0 "ACC_REPORT_TARGET_NONE" 8 "ACC_REPORT_TARGET_TYPE_IPSO" 21 "ACC_REPORT_CIPV_CUTTING_OUT" 13 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTED" ;
+VAL_ 905 DAS_pmmCameraFaultReason 1 "PMM_CAMERA_BLOCKED_FRONT" 2 "PMM_CAMERA_INVALID_MIA" 0 "PMM_CAMERA_NO_FAULT" ;
+VAL_ 905 DAS_pmmSysFaultReason 4 "PMM_FAULT_STEERING_ANGLE_RATE" 6 "PMM_FAULT_ROAD_TYPE" 5 "PMM_FAULT_DISABLED_BY_USER" 0 "PMM_FAULT_NONE" 1 "PMM_FAULT_DAS_DISABLED" 3 "PMM_FAULT_DI_FAULT" 2 "PMM_FAULT_SPEED" 7 "PMM_FAULT_BRAKE_PEDAL_INHIBIT" ;
+VAL_ 905 DAS_pmmRadarFaultReason 2 "PMM_RADAR_INVALID_MIA" 1 "PMM_RADAR_BLOCKED_FRONT" 0 "PMM_RADAR_NO_FAULT" ;
+VAL_ 905 DAS_pmmUltrasonicsFaultReason 2 "PMM_ULTRASONICS_BLOCKED_REAR" 0 "PMM_ULTRASONICS_NO_FAULT" 1 "PMM_ULTRASONICS_BLOCKED_FRONT" 3 "PMM_ULTRASONICS_BLOCKED_BOTH" 4 "PMM_ULTRASONICS_INVALID_MIA" ;
+VAL_ 905 DAS_activationFailureStatus 0 "LC_ACTIVATION_IDLE" 2 "LC_ACTIVATION_FAILED_2" 1 "LC_ACTIVATION_FAILED_1" ;
+VAL_ 905 DAS_pmmLoggingRequest 0 "FALSE" 1 "TRUE" ;
+VAL_ 905 DAS_pmmObstacleSeverity 5 "PMM_CRASH_FRONT" 0 "PMM_NONE" 2 "PMM_IMMINENT_FRONT" 4 "PMM_CRASH_REAR" 1 "PMM_IMMINENT_REAR" 6 "PMM_ACCEL_LIMIT" 7 "PMM_SNA" 3 "PMM_BRAKE_REQUEST" ;
+VAL_ 905 DAS_accSpeedLimit 1023 "SNA" 0 "NONE" ;
+VAL_ 264 DI_axleSpeed -32768 "SNA" ;
+VAL_ 264 DI_torqueActual -4096 "SNA" ;
+VAL_ 264 DI_torqueCommand -4096 "SNA" ;
+VAL_ 585 SCCM_turnIndicatorStalkStatus 3 "DOWN_1" 5 "SNA" 0 "IDLE" 1 "UP_1" 4 "DOWN_2" 2 "UP_2" ;
+VAL_ 585 SCCM_washWipeButtonStatus 3 "SNA" 0 "NOT_PRESSED" 2 "2ND_DETENT" 1 "1ST_DETENT" ;
+VAL_ 585 SCCM_highBeamStalkStatus 3 "SNA" 0 "IDLE" 1 "PULL" 2 "PUSH" ;
+VAL_ 280 DI_trackModeState 0 "TRACK_MODE_UNAVAILABLE" 1 "TRACK_MODE_AVAILABLE" 2 "TRACK_MODE_ON" ;
+VAL_ 280 DI_keepAliveRequest 1 "KEEP_ALIVE" 0 "NO_REQUEST" ;
+VAL_ 280 DI_epbRequest 0 "DI_EPBREQUEST_NO_REQUEST" 1 "DI_EPBREQUEST_PARK" 2 "DI_EPBREQUEST_UNPARK" ;
+VAL_ 280 DI_tractionControlMode 0 "TC_NORMAL" 1 "TC_SLIP_START" 4 "TC_ROLLS_MODE" 2 "TC_DEV_MODE_1" 5 "TC_DYNO_MODE" 3 "TC_DEV_MODE_2" ;
+VAL_ 280 DI_accelPedalPos 255 "SNA" ;
+VAL_ 280 DI_immobilizerState 2 "DI_IMM_STATE_AUTHENTICATING" 0 "DI_IMM_STATE_INIT_SNA" 3 "DI_IMM_STATE_DISARMED" 4 "DI_IMM_STATE_IDLE" 6 "DI_IMM_STATE_FAULT" 1 "DI_IMM_STATE_REQUEST" 5 "DI_IMM_STATE_RESET" ;
+VAL_ 280 DI_gear 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" 7 "DI_GEAR_SNA" 2 "DI_GEAR_R" 3 "DI_GEAR_N" 4 "DI_GEAR_D" ;
+VAL_ 280 DI_brakePedalState 2 "INVALID" 0 "OFF" 1 "ON" ;
+VAL_ 280 DI_systemState 5 "DI_SYS_ENABLE" 1 "DI_SYS_IDLE" 2 "DI_SYS_STANDBY" 0 "DI_SYS_UNAVAILABLE" 3 "DI_SYS_FAULT" 4 "DI_SYS_ABORT" ;
+VAL_ 605 DAS_trafficLightColor 0 "NONE" 1 "RED" 2 "GREEN" 3 "YELLOW" ;
+VAL_ 697 DAS_accelMax 511 "SNA" ;
+VAL_ 697 DAS_accelMin 511 "SNA" ;
+VAL_ 697 DAS_jerkMax 255 "SNA" ;
+VAL_ 697 DAS_jerkMin 511 "SNA" ;
+VAL_ 697 DAS_aebEvent 2 "AEB_FAULT" 0 "AEB_NOT_ACTIVE" 3 "AEB_SNA" 1 "AEB_ACTIVE" ;
+VAL_ 697 DAS_accState 4 "ACC_ON" 9 "APC_PAUSE" 14 "ACC_CANCEL_OUT_OF_CALIBRATION" 10 "APC_UNPARK_COMPLETE" 6 "APC_FORWARD" 3 "ACC_HOLD" 2 "ACC_CANCEL_RADAR_BLIND" 7 "APC_COMPLETE" 1 "ACC_CANCEL_CAMERA_BLIND" 8 "APC_ABORT" 13 "ACC_CANCEL_GENERIC_SILENT" 5 "APC_BACKWARD" 11 "APC_SELFPARK_START" 0 "ACC_CANCEL_GENERIC" 12 "ACC_CANCEL_PATH_NOT_CLEAR" 15 "FAULT_SNA" ;
+VAL_ 697 DAS_setSpeed 4095 "SNA" ;
+VAL_ 341 ESP_vehicleSpeed 1023 "ESP_VEHICLE_SPEED_SNA" ;
+VAL_ 341 ESP_vehicleStandstillSts 1 "STANDSTILL" 0 "NOT_STANDSTILL" ;
+VAL_ 341 ESP_wheelSpeedsQF 0 "ONE_OR_MORE_WSS_INVALID" 1 "ALL_WSS_VALID" ;
+VAL_ 341 ESP_WheelRotationFrL 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ;
+VAL_ 341 ESP_WheelRotationFrR 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ;
+VAL_ 341 ESP_WheelRotationReL 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ;
+VAL_ 341 ESP_WheelRotationReR 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ;
+VAL_ 341 ESP_wheelPulseCountReR 255 "SNA" ;
+VAL_ 341 ESP_wheelPulseCountReL 255 "SNA" ;
+VAL_ 341 ESP_wheelPulseCountFrR 255 "SNA" ;
+VAL_ 341 ESP_wheelPulseCountFrL 255 "SNA" ;
+VAL_ 969 APS_apbGpioState 0 "AP_GPIO_STATE_PWR_DOWN_REBOOT" 3 "AP_GPIO_STATE_HEALTHY" 1 "AP_GPIO_STATE_DISABLED" 2 "AP_GPIO_STATE_CRITICAL" ;
+VAL_ 969 APS_apbStatusMonitorState 1 "STATUS_MONITOR_STATE_PWR_OFF" 2 "STATUS_MONITOR_STATE_INIT" 7 "STATUS_MONITOR_NUM_STATES" 0 "STATUS_MONITOR_STATE_UNKNOWN" 4 "STATUS_MONITOR_STATE_CRITICAL" 6 "STATUS_MONITOR_STATE_RECOVERY" 5 "STATUS_MONITOR_STATE_SHUTTING_DOWN" 3 "STATUS_MONITOR_STATE_NOMINAL" ;
+VAL_ 969 APS_eacInternalState 1 "APS_EAC_STATE_MOMENTARY" 3 "APS_EAC_STATE_AUTOPARK" 5 "APS_EAC_STATE_OVERRIDE" 4 "APS_EAC_STATE_INHIBIT" 0 "APS_EAC_STATE_INIT" 2 "APS_EAC_STATE_CONTINUOUS" 7 "APS_EAC_NUM_STATES" 6 "APS_EAC_STATE_LSS" ;
+VAL_ 969 APS_appGpioState 0 "AP_GPIO_STATE_PWR_DOWN_REBOOT" 3 "AP_GPIO_STATE_HEALTHY" 1 "AP_GPIO_STATE_DISABLED" 2 "AP_GPIO_STATE_CRITICAL" ;
+VAL_ 969 APS_canMaster 0 "CAN_MASTER_APS" 2 "CAN_MASTER_APB" 3 "CAN_MASTER_SNA" 1 "CAN_MASTER_APP" ;
+VAL_ 969 APS_vehBehaviorState 0 "VEH_BEHAVIOR_STATE_UNKNOWN" 3 "VEH_BEHAVIOR_STATE_APS_BRIDGE_APP" 1 "VEH_BEHAVIOR_STATE_APS_AVAILABLE" 5 "VEH_BEHAVIOR_STATE_APS_FAIL_SAFE" 7 "VEH_BEHAVIOR_NUM_STATES" 2 "VEH_BEHAVIOR_STATE_APS_CONTROL" 6 "VEH_BEHAVIOR_STATE_APS_OVERRIDE" 4 "VEH_BEHAVIOR_STATE_APS_BRIDGE_APB" ;
+VAL_ 969 APS_appStatusMonitorState 1 "STATUS_MONITOR_STATE_PWR_OFF" 2 "STATUS_MONITOR_STATE_INIT" 7 "STATUS_MONITOR_NUM_STATES" 0 "STATUS_MONITOR_STATE_UNKNOWN" 4 "STATUS_MONITOR_STATE_CRITICAL" 6 "STATUS_MONITOR_STATE_RECOVERY" 5 "STATUS_MONITOR_STATE_SHUTTING_DOWN" 3 "STATUS_MONITOR_STATE_NOMINAL" ;
+VAL_ 925 IBST_internalState 5 "TRANSITION_TO_IDLE" 0 "NO_MODE_ACTIVE" 4 "DIAGNOSTIC" 6 "POST_DRIVE_CHECK" 1 "PRE_DRIVE_CHECK" 3 "EXTERNAL_BRAKE_REQUEST" 2 "LOCAL_BRAKE_REQUEST" ;
+VAL_ 925 IBST_driverBrakeApply 1 "BRAKES_NOT_APPLIED" 2 "DRIVER_APPLYING_BRAKES" 3 "FAULT" 0 "NOT_INIT_OR_OFF" ;
+VAL_ 925 IBST_iBoosterStatus 6 "IBOOSTER_ACTUATION" 4 "IBOOSTER_ACTIVE_GOOD_CHECK" 2 "IBOOSTER_FAILURE" 5 "IBOOSTER_READY" 3 "IBOOSTER_DIAGNOSTIC" 0 "IBOOSTER_OFF" 1 "IBOOSTER_INIT" ;
+VAL_ 880 EPAS3S_eacStatus 7 "SNA" 2 "EAC_ACTIVE" 4 "LANE_KEEP_ASSIST" 3 "EAC_FAULT" 1 "EAC_AVAILABLE" 5 "EMERGENCY_LANE_KEEP" 0 "EAC_INHIBITED" ;
+VAL_ 880 EPAS3S_handsOnLevel 1 "LEVEL_1" 0 "LEVEL_0" 3 "LEVEL_3" 2 "LEVEL_2" ;
+VAL_ 880 EPAS3S_torsionBarTorque 4095 "SNA" 4094 "UNDEFINABLE_DATA" ;
+VAL_ 880 EPAS3S_eacErrorCode 15 "SNA" 11 "EAC_ERROR_HIGH_TORSION_SAFETY" 4 "EAC_ERROR_TMP_FAULT" 2 "EAC_ERROR_MAX_SPEED" 7 "EAC_ERROR_HIGH_ANGLE_RATE_REQ" 0 "EAC_ERROR_IDLE" 10 "EAC_ERROR_HIGH_MMOT_SAFETY" 6 "EAC_ERROR_HIGH_ANGLE_REQ" 8 "EAC_ERROR_HIGH_ANGLE_SAFETY" 5 "EAR_ERROR_MAX_STEER_DELTA" 13 "EAC_ERROR_PINION_VEL_DIFF" 1 "EAC_ERROR_MIN_SPEED" 14 "EAC_EXTERNAL_MONITOR_INHIBIT" 12 "EAC_ERROR_LOW_ASSIST" 9 "EAC_ERROR_HIGH_ANGLE_RATE_SAFETY" 3 "EAC_ERROR_HANDS_ON" ;
+VAL_ 880 EPAS3S_steeringRackForce 1023 "SNA" 1022 "NOT_IN_SPEC" ;
+VAL_ 880 EPAS3S_steeringFault 0 "NO_FAULT" 1 "FAULT" ;
+VAL_ 880 EPAS3S_steeringReduced 0 "NORMAL_ASSIST" 1 "REDUCED_ASSIST" ;
+VAL_ 880 EPAS3S_internalSASQF 1 "IN_SPEC" 0 "UNDEFINABLE_ACCURACY" ;
+VAL_ 880 EPAS3S_currentTuneMode 3 "STEERING_TUNE_RWD_COMFORT" 1 "STEERING_TUNE_DM_STANDARD" 5 "STEERING_TUNE_RWD_SPORT" 0 "STEERING_TUNE_DM_COMFORT" 4 "STEERING_TUNE_RWD_STANDARD" 2 "STEERING_TUNE_DM_SPORT" ;
+VAL_ 599 DI_uiSpeedUnits 0 "DI_SPEED_MPH" 1 "DI_SPEED_KPH" ;
+VAL_ 599 DI_uiSpeed 255 "DI_UI_SPEED_SNA" ;
+VAL_ 599 DI_vehicleSpeed 4095 "SNA" ;
+VAL_ 637 APS_eacAllow 0 "INHIBIT" 1 "ALLOW" 2 "RESERVED" 3 "SNA";
+VAL_ 1160 DAS_steeringControlType 2 "LANE_KEEP_ASSIST" 0 "NONE" 1 "ANGLE_CONTROL" 3 "EMERGENCY_LANE_KEEP" 4 "FSD" ;
+VAL_ 1160 DAS_steeringAngleRequest 16384 "ZERO_ANGLE" ;
+VAL_ 297 SCCM_steeringAngleValidity 3 "SNA" 2 "INIT" 0 "INVALID" 1 "VALID" ;
+VAL_ 297 SCCM_steeringAngleSensorStatus 0 "OK" 1 "INIT" 2 "ERROR" 3 "ERROR_INIT" ;
+VAL_ 646 DI_rollPreventionState 0 "UNAVAILABLE" 1 "STANDBY" 2 "READY" 3 "BUILD" 4 "HOLD" 5 "PARK" 6 "FAULT" 7 "INIT" ;
+VAL_ 646 DI_vehicleHoldState 0 "UNAVAILABLE" 1 "STANDBY" 2 "BLEND_IN" 3 "STANDSTILL" 4 "BLEND_OUT" 5 "PARK" 6 "FAULT" 7 "INIT" ;
+VAL_ 646 DI_pmmStatus 0 "INACTIVE" 1 "ACTIVE" 2 "LOGGING_ACTIVE" 3 "SNA" ;
+VAL_ 646 DI_aebState 0 "UNAVAILABLE" 1 "STANDBY" 2 "ENABLED" 3 "STANDSTILL" 4 "FAULT" 7 "SNA" ;
+VAL_ 646 DI_autopilotRequest 0 "IDLE" 1 "ACTIVATE" ;
+VAL_ 646 DI_parkBrakeState 0 "UNAVAILABLE" 1 "RELEASED" 2 "REQUESTED" 3 "APPLIED" 4 "FAULTED" 5 "PANIC_EPB" 6 "PANIC_SKID" 7 "RELEASING" 15 "SNA" ;
+VAL_ 646 DI_autoparkState 0 "UNAVAILABLE" 1 "STANDBY" 2 "STARTED" 3 "ACTIVE" 4 "COMPLETE" 5 "PAUSED" 6 "ABORTED" 7 "RESUMED" 8 "UNPARK_COMPLETE" 9 "SELFPARK_STARTED" 15 "SNA" ;
+VAL_ 646 DI_speedUnits 0 "MPH" 1 "KPH" ;
+VAL_ 646 DI_cruiseState 0 "UNAVAILABLE" 1 "STANDBY" 2 "ENABLED" 3 "STANDSTILL" 4 "OVERRIDE" 5 "FAULT" 6 "PRE_FAULT" 7 "PRE_CANCEL" ;
+VAL_ 659 DAS_driverSteeringWeight 0 "light" 1 "standard" 2 "heavy";
+VAL_ 659 DAS_offRoadAssist 0 "disabled" 3 "enabled";
+VAL_ 659 DAS_distanceUnits 1 "miles" 0 "kilometers";
+VAL_ 659 DAS_fcwSensitivity 0 "early" 1 "medium" 2 "late" 3 "off";
+VAL_ 659 DAS_driverAccelerationMode 0 "chill" 1 "standard";
+VAL_ 785 buckleStatus 1 "LATCHED" 0 "UNLATCHED" ;
+VAL_ 785 anyDoorOpen 1 "OPEN" 0 "CLOSED" ;
+VAL_ 785 leftBlinkerBlinking 0 "off" 1 "blinking, off" 2 "blinking, on";
+VAL_ 785 rightBlinkerBlinking 0 "off" 1 "blinking, off" 2 "blinking, on";
+VAL_ 923 DAS_autoLaneChangeState 5 "ALC_UNAVAILABLE_VEHICLE_SPEED" 17 "ALC_ABORT_POOR_VIEW_RANGE" 23 "ALC_BLOCKED_VEH_TTC_AND_USS_L" 0 "ALC_UNAVAILABLE_DISABLED" 26 "ALC_BLOCKED_LANE_TYPE_L" 29 "ALC_ABORT_TIMEOUT" 9 "ALC_IN_PROGRESS_L" 4 "ALC_UNAVAILABLE_EXITING_HIGHWAY" 22 "ALC_BLOCKED_VEH_TTC_L" 12 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_R" 18 "ALC_ABORT_LC_HEALTH_BAD" 28 "ALC_WAITING_HANDS_ON" 8 "ALC_AVAILABLE_BOTH" 11 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_L" 3 "ALC_UNAVAILABLE_TP_FOLLOW" 2 "ALC_UNAVAILABLE_SONICS_INVALID" 21 "ALC_UNAVAILABLE_SOLID_LANE_LINE" 24 "ALC_BLOCKED_VEH_TTC_R" 1 "ALC_UNAVAILABLE_NO_LANES" 25 "ALC_BLOCKED_VEH_TTC_AND_USS_R" 30 "ALC_ABORT_MISSION_PLAN_INVALID" 27 "ALC_BLOCKED_LANE_TYPE_R" 19 "ALC_ABORT_BLINKER_TURNED_OFF" 31 "ALC_SNA" 13 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_L" 16 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_R" 6 "ALC_AVAILABLE_ONLY_L" 20 "ALC_ABORT_OTHER_REASON" 15 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_L" 7 "ALC_AVAILABLE_ONLY_R" 14 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_R" 10 "ALC_IN_PROGRESS_R" ;
+VAL_ 923 DAS_autopilotHandsOnState 8 "LC_HANDS_ON_SUSPENDED" 15 "LC_HANDS_ON_SNA" 7 "LC_HANDS_ON_REQD_STRUCK_OUT" 3 "LC_HANDS_ON_REQD_VISUAL" 4 "LC_HANDS_ON_REQD_CHIME_1" 6 "LC_HANDS_ON_REQD_SLOWING" 1 "LC_HANDS_ON_REQD_DETECTED" 2 "LC_HANDS_ON_REQD_NOT_DETECTED" 5 "LC_HANDS_ON_REQD_CHIME_2" 0 "LC_HANDS_ON_NOT_REQD" ;
+VAL_ 923 DAS_fleetSpeedState 0 "FLEETSPEED_UNAVAILABLE" 1 "FLEETSPEED_AVAILABLE" 2 "FLEETSPEED_ACTIVE" 3 "FLEETSPEED_HOLD" ;
+VAL_ 923 DAS_laneDepartureWarning 5 "SNA" 0 "NONE" 2 "RIGHT_WARNING" 4 "RIGHT_WARNING_SEVERE" 3 "LEFT_WARNING_SEVERE" 1 "LEFT_WARNING" ;
+VAL_ 923 DAS_csaState 1 "CSA_EXTERNAL_STATE_AVAILABLE" 3 "CSA_EXTERNAL_STATE_HOLD" 2 "CSA_EXTERNAL_STATE_ENABLE" 0 "CSA_EXTERNAL_STATE_UNAVAILABLE" ;
+VAL_ 923 DAS_sideCollisionInhibit 0 "NO_INHIBIT" 1 "INHIBIT" ;
+VAL_ 923 DAS_sideCollisionWarning 0 "NONE" 2 "WARN_RIGHT" 1 "WARN_LEFT" 3 "WARN_LEFT_RIGHT" ;
+VAL_ 923 DAS_sideCollisionAvoid 3 "SNA" 0 "NONE" 1 "AVOID_LEFT" 2 "AVOID_RIGHT" ;
+VAL_ 923 DAS_autoparkReady 0 "AUTOPARK_UNAVAILABLE" 1 "AUTOPARK_READY" ;
+VAL_ 923 DAS_forwardCollisionWarning 3 "SNA" 0 "NONE" 1 "FORWARD_COLLISION_WARNING" ;
+VAL_ 923 DAS_heaterState 0 "HEATER_OFF_SNA" 1 "HEATER_ON" ;
+VAL_ 923 DAS_visionOnlySpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ;
+VAL_ 923 DAS_suppressSpeedWarning 1 "Suppress_Speed_Warning" 0 "Do_Not_Suppress" ;
+VAL_ 923 DAS_fusedSpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ;
+VAL_ 923 DAS_blindSpotRearRight 3 "SNA" 0 "NO_WARNING" 1 "WARNING_LEVEL_1" 2 "WARNING_LEVEL_2" ;
+VAL_ 923 DAS_blindSpotRearLeft 3 "SNA" 0 "NO_WARNING" 1 "WARNING_LEVEL_1" 2 "WARNING_LEVEL_2" ;
+VAL_ 923 DAS_autopilotState 15 "SNA" 8 "ABORTING" 3 "ACTIVE_NOMINAL" 0 "DISABLED" 4 "ACTIVE_RESTRICTED" 5 "ACTIVE_NAV" 6 "ACTIVE_FSD" 14 "FAULT" 1 "UNAVAILABLE" 9 "ABORTED" 2 "AVAILABLE" ;
+VAL_ 325 ESP_absBrakeEvent2 0 "NOT_ACTIVE" 1 "ACTIVE_FRONT_REAR" 2 "ACTIVE_FRONT" 3 "ACTIVE_REAR";
+VAL_ 325 ESP_absFaultLamp 0 "OFF" 1 "ON";
+VAL_ 325 ESP_brakeApply 0 "INACTIVE" 1 "ACTIVE";
+VAL_ 325 ESP_brakeDiscWipingActive 0 "INACTIVE" 1 "ACTIVE";
+VAL_ 325 ESP_brakeLamp 0 "OFF" 1 "ON";
+VAL_ 325 ESP_brakeTorqueTarget 8191 "SNA";
+VAL_ 325 ESP_btcTargetState 0 "OFF" 1 "BACKUP" 2 "ON" 3 "SNA";
+VAL_ 325 ESP_cdpStatus 0 "CDP_IS_NOT_AVAILABLE" 1 "CDP_IS_AVAILABLE" 2 "ACTUATING_EPB_CDP" 3 "CDP_COMMAND_INVALID";
+VAL_ 325 ESP_driverBrakeApply 0 "NotInit_orOff" 1 "Not_Applied" 2 "Driver_applying_brakes" 3 "Faulty_SNA";
+VAL_ 325 ESP_ebdFaultLamp 0 "OFF" 1 "ON";
+VAL_ 325 ESP_ebrStandstillSkid 0 "NO_STANDSTILL_SKID" 1 "STANDSTILL_SKID_DETECTED";
+VAL_ 325 ESP_ebrStatus 0 "EBR_IS_NOT_AVAILABLE" 1 "EBR_IS_AVAILABLE" 2 "ACTUATING_DI_EBR" 3 "EBR_COMMAND_INVALID";
+VAL_ 325 ESP_espFaultLamp 0 "OFF" 1 "ON";
+VAL_ 325 ESP_espLampFlash 0 "OFF" 1 "FLASH";
+VAL_ 325 ESP_espModeActive 0 "00_NORMAL" 1 "01" 2 "02" 3 "03";
+VAL_ 325 ESP_lateralAccelQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC";
+VAL_ 325 ESP_longitudinalAccelQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC";
+VAL_ 325 ESP_ptcTargetState 0 "FAULT" 1 "BACKUP" 2 "ON" 3 "SNA";
+VAL_ 325 ESP_stabilityControlSts2 0 "INIT" 1 "ON" 2 "ENGAGED" 3 "FAULTED";
+VAL_ 325 ESP_steeringAngleQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC";
+VAL_ 325 ESP_yawRateQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC";
diff --git a/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc b/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc
new file mode 100644
index 000000000..a8faeca93
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc
@@ -0,0 +1,406 @@
+VERSION ""
+
+
+BU_: CH DIPF DIPR ETH FC HVI HVS PARTY SDCV VEH VIRT
+
+
+BO_ 962 VCLEFT_switchStatus: 8 VEH
+ SG_ VCLEFT_frontBuckleSwitch m0: 48|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_btnWindowSwPackUpLF m0: 32|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_frontSeatTrackBack m0: 8|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoDownLF m0: 35|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackDownRR m0: 46|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoUpRR m0: 45|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoDownRR m0: 47|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_rightMirrorTilt m0: 5|3@1+ (1,0) [0|4] "" vcright
+ SG_ VCLEFT_btnWindowSwPackUpRR m0: 44|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_frontOccupancySwitch m0: 50|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_swcRightTiltLeft m1: 8|2@1+ (1,0) [0|3] "" das
+ SG_ VCLEFT_rearRightOccupancySwitch m0: 58|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_btnWindowSwPackDownLF m0: 34|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoUpLF m0: 33|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_swcLeftTiltRight m1: 3|2@1+ (1,0) [0|3] "" das
+ SG_ VCLEFT_frontSeatBackrestForward m0: 22|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_swcRightTiltRight m1: 10|2@1+ (1,0) [0|3] "" das
+ SG_ VCLEFT_swcLeftScrollTicks m1: 16|6@1- (1,0) [-32|31] "" das
+ SG_ VCLEFT_btnWindowUpLR m1: 32|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowAutoDownLR m1: 35|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackDownRF m0: 42|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoUpRF m0: 41|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_frontSeatLumbarIn m0: 28|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_frontSeatLiftUp m0: 18|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_btnWindowSwPackDownLR m0: 38|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoUpLR m0: 37|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_frontSeatLumbarDown m0: 24|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_driverPresent m0: 4|1@1+ (1,0) [0|1] "" das
+ SG_ VCLEFT_frontSeatTiltDown m0: 12|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_frontSeatTrackForward m0: 10|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_rearLeftBuckleSwitch m0: 52|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_hazardButtonPressed m0: 3|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_swcRightScrollTicks m1: 24|6@1- (1,0) [-32|31] "" das
+ SG_ VCLEFT_swcRightPressed m1: 12|2@1+ (1,0) [0|3] "" das
+ SG_ VCLEFT_frontSeatLumbarOut m0: 30|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_brakePressed m0: 60|1@1+ (1,0) [0|1] "" di
+ SG_ VCLEFT_swcLeftTiltLeft m1: 14|2@1+ (1,0) [0|3] "" das
+ SG_ VCLEFT_swcLeftPressed m1: 5|2@1+ (1,0) [0|3] "" das
+ SG_ VCLEFT_btnWindowSwPackUpLR m0: 36|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_frontSeatTiltUp m0: 14|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_rearLeftOccupancySwitch m0: 56|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_frontSeatBackrestBack m0: 20|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoDownLR m0: 39|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_rearCenterOccupancySwitch m0: 54|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_frontSeatLumbarUp m0: 26|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_frontSeatLiftDown m0: 16|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCLEFT_hornSwitchPressed m0: 2|1@1+ (1,0) [0|1] "" app
+ SG_ VCLEFT_btnWindowSwPackUpRF m0: 40|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowAutoUpLR m1: 33|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_btnWindowSwPackAutoDownRF m0: 43|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_switchStatusIndex M: 0|2@1+ (1,0) [0|2] "" X
+ SG_ VCLEFT_btnWindowDownLR m1: 34|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_rearHVACButtonPressed m0: 61|1@1+ (1,0) [0|1] "" gtw
+
+BO_ 259 VCRIGHT_doorStatus: 8 VEH
+ SG_ VCRIGHT_reservedForBackCompat : 28|2@1+ (1,0) [0|3] "" X
+ SG_ VCRIGHT_trunkLatchStatus : 56|4@1+ (1,0) [0|8] "" di
+ SG_ VCRIGHT_mirrorFoldState : 52|3@1+ (1,0) [0|4] "" gtw
+ SG_ VCRIGHT_rearLatchStatus : 4|4@1+ (1,0) [0|8] "" aps
+ SG_ VCRIGHT_mirrorTiltYPosition : 41|8@1+ (0.02,0) [0|5] "V" gtw
+ SG_ VCRIGHT_frontRelActuatorSwitch : 12|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_mirrorRecallState : 60|3@1+ (1,0) [0|5] "" gtw
+ SG_ VCRIGHT_frontIntSwitchPressed : 31|1@1+ (1,0) [0|1] "" aps
+ SG_ VCRIGHT_mirrorState : 49|3@1+ (1,0) [0|4] "" gtw
+ SG_ VCRIGHT_rearRelActuatorSwitch : 13|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_frontHandlePulledPersist : 30|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_mirrorTiltXPosition : 33|8@1+ (0.02,0) [0|5] "V" gtw
+ SG_ VCRIGHT_mirrorDipped : 63|1@1+ (1,0) [0|1] "" X
+ SG_ VCRIGHT_frontHandlePulled : 10|1@1+ (1,0) [0|1] "" aps
+ SG_ VCRIGHT_frontLatchStatus : 0|4@1+ (1,0) [0|8] "" aps
+ SG_ VCRIGHT_rearHandlePulled : 11|1@1+ (1,0) [0|1] "" aps
+ SG_ VCRIGHT_frontHandlePWM : 14|7@1+ (1,0) [0|100] "%" X
+ SG_ VCRIGHT_frontLatchSwitch : 8|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_rearLatchSwitch : 9|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_rearHandlePWM : 21|7@1+ (1,0) [0|100] "%" X
+ SG_ VCRIGHT_rearIntSwitchPressed : 32|1@1+ (1,0) [0|1] "" aps
+
+BO_ 585 SCCM_leftStalk: 3 VEH
+ SG_ SCCM_leftStalkCounter : 8|4@1+ (1,0) [0|15] "" X
+ SG_ SCCM_washWipeButtonStatus : 14|2@1+ (1,0) [0|3] "" das
+ SG_ SCCM_turnIndicatorStalkStatus : 16|3@1+ (1,0) [0|5] "" das
+ SG_ SCCM_leftStalkCrc : 0|8@1+ (1,0) [0|255] "" X
+ SG_ SCCM_leftStalkReserved1 : 19|5@1+ (1,0) [0|31] "" X
+ SG_ SCCM_highBeamStalkStatus : 12|2@1+ (1,0) [0|3] "" das
+
+BO_ 280 DI_systemStatus: 8 VEH
+ SG_ DI_epbRequest : 44|2@1+ (1,0) [0|2] "" epbl
+ SG_ DI_systemStatusCounter : 8|4@1+ (1,0) [0|15] "" X
+ SG_ DI_proximity : 46|1@1+ (1,0) [0|1] "" bms
+ SG_ DI_keepAliveRequest : 47|1@1+ (1,0) [0|1] "" bms
+ SG_ DI_accelPedalPos : 32|8@1+ (0.4,0) [0|100] "%" vcfront
+ SG_ DI_gear : 21|3@1+ (1,0) [0|7] "" gtw
+ SG_ DI_tractionControlMode : 40|3@1+ (1,0) [0|5] "" X
+ SG_ DI_trackModeState : 48|2@1+ (1,0) [0|2] "" gtw
+ SG_ DI_regenLight : 26|1@1+ (1,0) [0|1] "" vcleft
+ SG_ DI_systemState : 16|3@1+ (1,0) [0|5] "" epbl
+ SG_ DI_immobilizerState : 27|3@1+ (1,0) [0|6] "" X
+ SG_ DI_systemStatusChecksum : 0|8@1+ (1,0) [0|255] "" X
+ SG_ DI_brakePedalState : 19|2@1+ (1,0) [0|2] "" vcleft
+
+BO_ 835 VCRIGHT_status: 8 VEH
+ SG_ VCRIGHT_5AVoltage : 18|10@1+ (0.005443676098,0) [0|5.56888] "V" gtw
+ SG_ VCRIGHT_loadShedPriority : 0|8@1+ (1,0) [0|255] "" X
+ SG_ VCRIGHT_rearDefrostState : 11|3@1+ (1,0) [0|4] "" gtw
+ SG_ VCRIGHT_vbatProt : 28|12@1+ (0.005443676098,0) [0|22.29185] "V" gtw
+ SG_ VCRIGHT_vehiclePowerStateDBG : 8|2@1+ (1,0) [0|3] "" gtw
+ SG_ VCRIGHT_swEnStatus : 10|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_mirrorHeatState : 14|3@1+ (1,0) [0|4] "" X
+ SG_ VCRIGHT_OTAState : 17|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCRIGHT_footwellLightCurrent : 40|12@1- (0.1,0) [-204.8|204.7] "mA" X
+ SG_ VCRIGHT_pcbaTemperature : 52|11@1+ (0.125,-40) [-40|150] "degC" gtw
+
+BO_ 553 SCCM_rightStalk: 3 VEH
+ SG_ SCCM_rightStalkCounter : 8|4@1+ (1,0) [0|15] "" X
+ SG_ SCCM_rightStalkCrc : 0|8@1+ (1,0) [0|255] "" X
+ SG_ SCCM_rightStalkReserved1 : 15|1@1+ (1,0) [0|1] "" X
+ SG_ SCCM_parkButtonStatus : 16|2@1+ (1,0) [0|3] "" das
+ SG_ SCCM_rightStalkReserved2 : 18|6@1+ (1,0) [0|63] "" X
+ SG_ SCCM_rightStalkStatus : 12|3@1+ (1,0) [0|6] "" das
+
+BO_ 297 SCCM_steeringAngleSensor: 8 VEH
+ SG_ SCCM_steeringAngleValidity : 30|2@1+ (1,0) [0|3] "" gtw
+ SG_ SCCM_supplierID : 12|2@1+ (1,0) [0|3] "" gtw
+ SG_ SCCM_steeringAngleSensorReservd1 : 46|2@1+ (1,0) [0|3] "" X
+ SG_ SCCM_steeringAngleCrc : 0|8@1+ (1,0) [0|255] "" gtw
+ SG_ SCCM_steeringAngleSensorStatus : 14|2@1+ (1,0) [0|3] "" aps
+ SG_ SCCM_steeringAngleSpeed : 32|14@1+ (0.5,-4096) [-4096|4095.5] "deg/s" das
+ SG_ SCCM_steeringAngle : 16|14@1+ (0.1,-819.2) [-819.2|819] "deg" aps
+ SG_ SCCM_steeringAngleSensorReservd2 : 48|8@1+ (1,0) [0|255] "" X
+ SG_ SCCM_steeringAngleCounter : 8|4@1+ (1,0) [0|15] "" gtw
+ SG_ SCCM_steeringAngleSensorReservd3 : 56|8@1+ (1,0) [0|255] "" X
+
+BO_ 258 VCLEFT_doorStatus: 8 VEH
+ SG_ VCLEFT_mirrorDipped : 61|1@1+ (1,0) [0|1] "" X
+ SG_ VCLEFT_frontHandlePulledPersist : 62|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_mirrorRecallState : 55|3@1+ (1,0) [0|5] "" gtw
+ SG_ VCLEFT_rearIntSwitchPressed : 32|1@1+ (1,0) [0|1] "" aps
+ SG_ VCLEFT_rearLatchSwitch : 9|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_rearHandlePWM : 24|7@1+ (1,0) [0|100] "%" X
+ SG_ VCLEFT_frontLatchSwitch : 8|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_frontHandlePWM : 16|7@1+ (1,0) [0|100] "%" X
+ SG_ VCLEFT_rearHandlePulled : 11|1@1+ (1,0) [0|1] "" aps
+ SG_ VCLEFT_rearLatchStatus : 4|4@1+ (1,0) [0|8] "" aps
+ SG_ VCLEFT_frontHandlePulled : 10|1@1+ (1,0) [0|1] "" aps
+ SG_ VCLEFT_mirrorTiltXPosition : 33|8@1+ (0.02,0) [0|5] "V" gtw
+ SG_ VCLEFT_mirrorState : 49|3@1+ (1,0) [0|4] "" gtw
+ SG_ VCLEFT_frontIntSwitchPressed : 31|1@1+ (1,0) [0|1] "" aps
+ SG_ VCLEFT_rearRelActuatorSwitch : 13|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_mirrorHeatState : 58|3@1+ (1,0) [0|4] "" X
+ SG_ VCLEFT_frontRelActuatorSwitch : 12|1@1+ (1,0) [0|1] "" gtw
+ SG_ VCLEFT_mirrorTiltYPosition : 41|8@1+ (0.02,0) [0|5] "V" gtw
+ SG_ VCLEFT_frontLatchStatus : 0|4@1+ (1,0) [0|8] "" aps
+ SG_ VCLEFT_mirrorFoldState : 52|3@1+ (1,0) [0|4] "" gtw
+
+
+BO_ 568 STW_ACTN_RQ: 8 STW
+ SG_ SpdCtrlLvr_Stat : 0|6@1+ (1,0) [0|0] "" NEO
+ SG_ VSL_Enbl_Rq : 6|1@1+ (1,0) [0|0] "" NEO
+ SG_ SpdCtrlLvrStat_Inv : 7|1@1+ (1,0) [0|0] "" NEO
+ SG_ DTR_Dist_Rq : 8|8@1+ (1,0) [0|200] "" NEO
+ SG_ TurnIndLvr_Stat : 16|2@1+ (1,0) [0|0] "" NEO
+ SG_ HiBmLvr_Stat : 18|2@1+ (1,0) [0|0] "" NEO
+ SG_ WprWashSw_Psd : 20|2@1+ (1,0) [0|0] "" NEO
+ SG_ WprWash_R_Sw_Posn_V2 : 22|2@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Lvr_Stat : 24|3@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Cond_Flt : 27|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Cond_Psd : 28|2@1+ (1,0) [0|0] "" NEO
+ SG_ HrnSw_Psd : 30|2@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw00_Psd : 32|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw01_Psd : 33|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw02_Psd : 34|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw03_Psd : 35|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw04_Psd : 36|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw05_Psd : 37|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw06_Psd : 38|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw07_Psd : 39|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw08_Psd : 40|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw09_Psd : 41|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw10_Psd : 42|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw11_Psd : 43|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw12_Psd : 44|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw13_Psd : 45|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw14_Psd : 46|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw15_Psd : 47|1@1+ (1,0) [0|0] "" NEO
+ SG_ WprSw6Posn : 48|3@1+ (1,0) [0|0] "" NEO
+ SG_ MC_STW_ACTN_RQ : 52|4@1+ (1,0) [0|15] "" NEO
+ SG_ CRC_STW_ACTN_RQ : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 1001 DAS_bodyControls: 8 VEH
+ SG_ DAS_headlightRequest : 0|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_hazardLightRequest : 2|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_wiperSpeed : 4|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_turnIndicatorRequest : 8|3@1+ (1,0) [0|4] "" aps
+ SG_ DAS_highLowBeamDecision : 11|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_heaterRequest : 13|2@1+ (1,0) [0|2] "" aps
+ SG_ DAS_highLowBeamOffReason : 15|3@1+ (1,0) [0|5] "" aps
+ SG_ DAS_turnIndicatorRequestReason : 18|4@1+ (1,0) [0|12] "" aps
+ SG_ DAS_dynamicBrakeLightRequest : 22|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_radarHeaterRequest : 23|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_ahlbOverride : 24|1@1+ (1,0) [0|1] "" aps
+ SG_ DAS_mirrorFoldRequest : 25|2@1+ (1,0) [0|3] "" aps
+ SG_ DAS_bodyControlsCounter : 52|4@1+ (1,0) [0|15] "" aps
+ SG_ DAS_bodyControlsChecksum : 56|8@1+ (1,0) [0|255] "" aps
+
+BO_ 994 VCLEFT_lightStatus: 7 VEH
+ SG_ VCLEFT_turnSignalStatus : 4|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 995 VCRIGHT_lightStatus: 2 VEH
+ SG_ VCRIGHT_turnSignalStatus : 4|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 1013 ID3F5VCFRONT_lighting: 8 VEH
+ SG_ VCFRONT_lowBeamsCalibrated : 62|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_lowBeamsOnForDRL : 61|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_simLatchingStalk : 59|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_highBeamSwitchActive : 58|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_parkRightStatus : 56|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_parkLeftStatus : 54|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_turnSignalRightStatus : 52|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_turnSignalLeftStatus : 50|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_sideRepeaterRightStatus : 48|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_sideRepeaterLeftStatus : 46|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_sideMarkersStatus : 44|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_fogRightStatus : 42|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_fogLeftStatus : 40|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_DRLRightStatus : 38|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_DRLLeftStatus : 36|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_highBeamRightStatus : 34|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_highBeamLeftStatus : 32|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_lowBeamRightStatus : 30|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_lowBeamLeftStatus : 28|2@1+ (1,0) [0|3] "" Receiver
+ SG_ VCFRONT_hazardSwitchBacklight : 27|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_seeYouHomeLightingReq : 26|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_approachLightingRequest : 25|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_courtesyLightingRequest : 24|1@1+ (1,0) [0|1] "" Receiver
+ SG_ VCFRONT_switchLightingBrightness : 16|8@1+ (0.5,0) [0|127] "%" Receiver
+ SG_ VCFRONT_ambientLightingBrightnes : 8|8@1+ (0.5,0) [0|127] "%" Receiver
+ SG_ VCFRONT_hazardLightRequest : 4|4@1+ (1,0) [0|8] "" Receiver
+ SG_ VCFRONT_indicatorRightRequest : 2|2@1+ (1,0) [0|2] "" Receiver
+ SG_ VCFRONT_indicatorLeftRequest : 0|2@1+ (1,0) [0|2] "" Receiver
+
+BO_ 851 UI_status: 8 VehicleBus
+ SG_ UI_touchActive : 0|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_audioActive : 1|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_bluetoothActive : 2|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_cellActive : 3|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_displayReady : 4|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_displayOn : 5|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_wifiActive : 6|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_wifiConnected : 7|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_systemActive : 8|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_readyForDrive : 9|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_cellConnected : 10|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_vpnActive : 11|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_autopilotTrial : 12|2@1+ (1,0) [0|3] "" VehicleBus
+ SG_ UI_factoryReset : 14|2@1+ (1,0) [0|3] "" VehicleBus
+ SG_ UI_gpsActive : 16|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_screenshotActive : 17|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_radioActive : 18|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_cellNetworkTechnology : 19|4@1+ (1,0) [0|15] "" VehicleBus
+ SG_ UI_cellReceiverPower : 24|8@1+ (1,-128) [-128|127] "dB" VehicleBus
+ SG_ UI_falseTouchCounter : 32|8@1+ (1,0) [0|255] "1" VehicleBus
+ SG_ UI_developmentCar : 40|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_cameraActive : 41|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_cellSignalBars : 42|3@1+ (1,0) [0|7] "" VehicleBus
+ SG_ UI_trailerModeTelltale : 45|2@1+ (1,0) [0|3] "" VehicleBus
+ SG_ UI_pcbTemperature : 48|8@1- (1,40) [-87|167] "degC" VehicleBus
+ SG_ UI_cpuTemperature : 56|8@1- (1,40) [-87|167] "degC" VehicleBus
+
+BO_ 991 UI_status2: 8 VehicleBus
+ SG_ UI_mobileAppStepCount : 0|16@1+ (1,0) [0|65535] "" VehicleBus
+ SG_ UI_userRequestSnapshot : 16|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_touchDetected : 17|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_validDeviceForEUSummon : 18|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_locatedAtHome : 19|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_locatedAtWork : 20|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_locatedAtFavorite : 21|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_displayInDarkMode : 22|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_userActivity : 23|1@1+ (1,0) [0|1] "" VehicleBus
+ SG_ UI_activeTouchPoints : 24|8@1+ (1,0) [0|255] "" VehicleBus
+ SG_ UI_linkState : 32|2@1+ (1,0) [0|3] "" VehicleBus
+ SG_ UI_sentryModeState : 34|3@1+ (1,0) [0|7] "" VehicleBus
+
+VAL_ 568 SpdCtrlLvr_Stat 32 "DN_1ST" 16 "UP_1ST" 8 "DN_2ND" 4 "UP_2ND" 2 "RWD" 1 "FWD" 0 "IDLE" ;
+VAL_ 568 DTR_Dist_Rq 255 "SNA" 200 "ACC_DIST_7" 166 "ACC_DIST_6" 133 "ACC_DIST_5" 100 "ACC_DIST_4" 66 "ACC_DIST_3" 33 "ACC_DIST_2" 0 "ACC_DIST_1" ;
+VAL_ 568 TurnIndLvr_Stat 3 "SNA" 2 "RIGHT" 1 "LEFT" 0 "IDLE" ;
+VAL_ 568 HiBmLvr_Stat 3 "SNA" 2 "HIBM_FLSH_ON_PSD" 1 "HIBM_ON_PSD" 0 "IDLE" ;
+VAL_ 568 WprWashSw_Psd 3 "SNA" 2 "WASH" 1 "TIPWIPE" 0 "NPSD" ;
+VAL_ 568 WprWash_R_Sw_Posn_V2 3 "SNA" 2 "WASH" 1 "INTERVAL" 0 "OFF" ;
+VAL_ 568 StW_Lvr_Stat 4 "STW_BACK" 3 "STW_FWD" 2 "STW_DOWN" 1 "STW_UP" 0 "NPSD" ;
+VAL_ 568 StW_Cond_Psd 3 "SNA" 2 "DOWN" 1 "UP" 0 "NPSD" ;
+VAL_ 568 HrnSw_Psd 3 "SNA" 2 "NDEF2" 1 "PSD" 0 "NPSD" ;
+VAL_ 568 StW_Sw00_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 StW_Sw01_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 StW_Sw03_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 StW_Sw04_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 WprSw6Posn 7 "SNA" 6 "STAGE2" 5 "STAGE1" 4 "INTERVAL4" 3 "INTERVAL3" 2 "INTERVAL2" 1 "INTERVAL1" 0 "OFF" ;
+
+VAL_ 1001 DAS_headlightRequest 3 "DAS_HEADLIGHT_REQUEST_INVALID" 1 "DAS_HEADLIGHT_REQUEST_ON" 0 "DAS_HEADLIGHT_REQUEST_OFF";
+VAL_ 1001 DAS_hazardLightRequest 3 "DAS_REQUEST_HAZARDS_SNA" 2 "DAS_REQUEST_HAZARDS_UNUSED" 0 "DAS_REQUEST_HAZARDS_OFF" 1 "DAS_REQUEST_HAZARDS_ON";
+VAL_ 1001 DAS_wiperSpeed 3 "DAS_WIPER_SPEED_3" 12 "DAS_WIPER_SPEED_12" 8 "DAS_WIPER_SPEED_8" 14 "DAS_WIPER_SPEED_14" 5 "DAS_WIPER_SPEED_5" 13 "DAS_WIPER_SPEED_13" 2 "DAS_WIPER_SPEED_2" 0 "DAS_WIPER_SPEED_OFF" 4 "DAS_WIPER_SPEED_4" 1 "DAS_WIPER_SPEED_1" 15 "DAS_WIPER_SPEED_INVALID" 10 "DAS_WIPER_SPEED_10" 11 "DAS_WIPER_SPEED_11" 7 "DAS_WIPER_SPEED_7" 9 "DAS_WIPER_SPEED_9" 6 "DAS_WIPER_SPEED_6";
+VAL_ 1001 DAS_turnIndicatorRequest 0 "DAS_TURN_INDICATOR_NONE" 2 "DAS_TURN_INDICATOR_RIGHT" 3 "DAS_TURN_INDICATOR_CANCEL" 1 "DAS_TURN_INDICATOR_LEFT";
+VAL_ 1001 DAS_highLowBeamDecision 2 "DAS_HIGH_BEAM_ON" 1 "DAS_HIGH_BEAM_OFF" 3 "DAS_HIGH_BEAM_SNA" 0 "DAS_HIGH_BEAM_UNDECIDED";
+VAL_ 1001 DAS_heaterRequest 0 "DAS_HEATER_SNA" 2 "DAS_HEATER_ON" 1 "DAS_HEATER_OFF";
+VAL_ 1001 DAS_turnIndicatorRequestReason 8 "DAS_ACTIVE_COMMANDED_LANE_CHANGE" 4 "DAS_CANCEL_LANE_CHANGE" 6 "DAS_ACTIVE_MERGE" 2 "DAS_ACTIVE_SPEED_LANE_CHANGE" 5 "DAS_CANCEL_FORK" 0 "DAS_NONE" 3 "DAS_ACTIVE_FORK" 7 "DAS_CANCEL_MERGE" 1 "DAS_ACTIVE_NAV_LANE_CHANGE";
+
+VAL_ 1013 VCFRONT_DRLLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_DRLRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_ambientLightingBrightnes 255 "SNA" ;
+VAL_ 1013 VCFRONT_fogLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_fogRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_hazardLightRequest 1 "HAZARD_REQUEST_BUTTON" 6 "HAZARD_REQUEST_CAR_ALARM" 5 "HAZARD_REQUEST_CRASH" 7 "HAZARD_REQUEST_DAS" 2 "HAZARD_REQUEST_LOCK" 4 "HAZARD_REQUEST_MISLOCK" 0 "HAZARD_REQUEST_NONE" 8 "HAZARD_REQUEST_UDS" 3 "HAZARD_REQUEST_UNLOCK" ;
+VAL_ 1013 VCFRONT_highBeamLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_highBeamRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_indicatorLeftRequest 2 "TURN_SIGNAL_ACTIVE_HIGH" 1 "TURN_SIGNAL_ACTIVE_LOW" 0 "TURN_SIGNAL_OFF" ;
+VAL_ 1013 VCFRONT_indicatorRightRequest 2 "TURN_SIGNAL_ACTIVE_HIGH" 1 "TURN_SIGNAL_ACTIVE_LOW" 0 "TURN_SIGNAL_OFF" ;
+VAL_ 1013 VCFRONT_lowBeamLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_lowBeamRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_parkLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_parkRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_sideMarkersStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_sideRepeaterLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_sideRepeaterRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_simLatchingStalk 0 "SIMULATED_LATCHING_STALK_IDLE" 1 "SIMULATED_LATCHING_STALK_LEFT" 2 "SIMULATED_LATCHING_STALK_RIGHT" 3 "SIMULATED_LATCHING_STALK_SNA" ;
+VAL_ 1013 VCFRONT_switchLightingBrightness 255 "SNA" ;
+VAL_ 1013 VCFRONT_turnSignalLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 1013 VCFRONT_turnSignalRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ;
+VAL_ 962 VCLEFT_frontBuckleSwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatTrackBack 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_rightMirrorTilt 4 "MIRROR_TILT_LEFT" 2 "MIRROR_TILT_UP" 3 "MIRROR_TILT_RIGHT" 0 "MIRROR_TILT_STOP" 1 "MIRROR_TILT_DOWN";
+VAL_ 962 VCLEFT_frontOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_swcRightTiltLeft 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_rearRightOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_swcLeftTiltRight 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatBackrestForward 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_swcRightTiltRight 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatLumbarIn 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatLiftUp 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatLumbarDown 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatTiltDown 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatTrackForward 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_rearLeftBuckleSwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_swcRightPressed 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatLumbarOut 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_swcLeftTiltLeft 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_swcLeftPressed 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatTiltUp 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_rearLeftOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatBackrestBack 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_rearCenterOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatLumbarUp 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_frontSeatLiftDown 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF";
+VAL_ 962 VCLEFT_switchStatusIndex 1 "VCLEFT_SWITCH_STATUS_INDEX_1" 2 "VCLEFT_SWITCH_STATUS_INDEX_INVALID" 0 "VCLEFT_SWITCH_STATUS_INDEX_0";
+VAL_ 259 VCRIGHT_trunkLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA";
+VAL_ 259 VCRIGHT_mirrorFoldState 4 "MIRROR_FOLD_STATE_UNFOLDING" 1 "MIRROR_FOLD_STATE_FOLDED" 3 "MIRROR_FOLD_STATE_FOLDING" 0 "MIRROR_FOLD_STATE_UNKNOWN" 2 "MIRROR_FOLD_STATE_UNFOLDED";
+VAL_ 259 VCRIGHT_rearLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA";
+VAL_ 259 VCRIGHT_mirrorRecallState 5 "MIRROR_RECALL_STATE_RECALLING_STOPPED" 2 "MIRROR_RECALL_STATE_RECALLING_AXIS_2" 0 "MIRROR_RECALL_STATE_INIT" 3 "MIRROR_RECALL_STATE_RECALLING_COMPLETE" 4 "MIRROR_RECALL_STATE_RECALLING_FAILED" 1 "MIRROR_RECALL_STATE_RECALLING_AXIS_1";
+VAL_ 259 VCRIGHT_mirrorState 3 "MIRROR_STATE_FOLD_UNFOLD" 1 "MIRROR_STATE_TILT_X" 0 "MIRROR_STATE_IDLE" 2 "MIRROR_STATE_TILT_Y" 4 "MIRROR_STATE_RECALL";
+VAL_ 259 VCRIGHT_frontLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA";
+VAL_ 585 SCCM_washWipeButtonStatus 3 "SNA" 0 "NOT_PRESSED" 2 "2ND_DETENT" 1 "1ST_DETENT";
+VAL_ 585 SCCM_turnIndicatorStalkStatus 3 "DOWN_1" 5 "SNA" 0 "IDLE" 1 "UP_1" 4 "DOWN_2" 2 "UP_2";
+VAL_ 585 SCCM_highBeamStalkStatus 3 "SNA" 0 "IDLE" 1 "PULL" 2 "PUSH";
+VAL_ 280 DI_epbRequest 0 "DI_EPBREQUEST_NO_REQUEST" 1 "DI_EPBREQUEST_PARK" 2 "DI_EPBREQUEST_UNPARK";
+VAL_ 280 DI_keepAliveRequest 1 "KEEP_ALIVE" 0 "NO_REQUEST";
+VAL_ 280 DI_accelPedalPos 255 "SNA";
+VAL_ 280 DI_gear 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" 7 "DI_GEAR_SNA" 2 "DI_GEAR_R" 3 "DI_GEAR_N" 4 "DI_GEAR_D";
+VAL_ 280 DI_tractionControlMode 0 "TC_NORMAL" 1 "TC_SLIP_START" 4 "TC_ROLLS_MODE" 2 "TC_DEV_MODE_1" 5 "TC_DYNO_MODE" 3 "TC_DEV_MODE_2";
+VAL_ 280 DI_trackModeState 0 "TRACK_MODE_UNAVAILABLE" 1 "TRACK_MODE_AVAILABLE" 2 "TRACK_MODE_ON";
+VAL_ 280 DI_systemState 5 "DI_SYS_ENABLE" 1 "DI_SYS_IDLE" 2 "DI_SYS_STANDBY" 0 "DI_SYS_UNAVAILABLE" 3 "DI_SYS_FAULT" 4 "DI_SYS_ABORT";
+VAL_ 280 DI_immobilizerState 2 "DI_IMM_STATE_AUTHENTICATING" 0 "DI_IMM_STATE_INIT_SNA" 3 "DI_IMM_STATE_DISARMED" 4 "DI_IMM_STATE_IDLE" 6 "DI_IMM_STATE_FAULT" 1 "DI_IMM_STATE_REQUEST" 5 "DI_IMM_STATE_RESET";
+VAL_ 280 DI_brakePedalState 2 "INVALID" 0 "OFF" 1 "ON";
+VAL_ 835 VCRIGHT_rearDefrostState 2 "HEATER_STATE_OFF" 4 "HEATER_STATE_FAULT" 1 "HEATER_STATE_ON" 0 "HEATER_STATE_SNA" 3 "HEATER_STATE_OFF_UNAVAILABLE";
+VAL_ 835 VCRIGHT_vehiclePowerStateDBG 3 "VEHICLE_POWER_STATE_DRIVE" 1 "VEHICLE_POWER_STATE_CONDITIONING" 2 "VEHICLE_POWER_STATE_ACCESSORY" 0 "VEHICLE_POWER_STATE_OFF";
+VAL_ 835 VCRIGHT_mirrorHeatState 2 "HEATER_STATE_OFF" 4 "HEATER_STATE_FAULT" 1 "HEATER_STATE_ON" 0 "HEATER_STATE_SNA" 3 "HEATER_STATE_OFF_UNAVAILABLE";
+VAL_ 553 SCCM_parkButtonStatus 3 "SNA" 0 "NOT_PRESSED" 2 "INIT" 1 "PRESSED";
+VAL_ 553 SCCM_rightStalkStatus 3 "DOWN_1" 6 "SNA" 0 "IDLE" 5 "INIT" 1 "UP_1" 4 "DOWN_2" 2 "UP_2";
+VAL_ 297 SCCM_steeringAngleValidity 3 "SNA" 2 "INIT" 0 "INVALID" 1 "VALID";
+VAL_ 297 SCCM_steeringAngleSensorStatus 0 "OK" 1 "INIT" 2 "ERROR" 3 "ERROR_INIT";
+VAL_ 258 VCLEFT_mirrorRecallState 5 "MIRROR_RECALL_STATE_RECALLING_STOPPED" 2 "MIRROR_RECALL_STATE_RECALLING_AXIS_2" 0 "MIRROR_RECALL_STATE_INIT" 3 "MIRROR_RECALL_STATE_RECALLING_COMPLETE" 4 "MIRROR_RECALL_STATE_RECALLING_FAILED" 1 "MIRROR_RECALL_STATE_RECALLING_AXIS_1";
+VAL_ 258 VCLEFT_rearLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA";
+VAL_ 258 VCLEFT_mirrorState 3 "MIRROR_STATE_FOLD_UNFOLD" 1 "MIRROR_STATE_TILT_X" 0 "MIRROR_STATE_IDLE" 2 "MIRROR_STATE_TILT_Y" 4 "MIRROR_STATE_RECALL";
+VAL_ 258 VCLEFT_mirrorHeatState 2 "HEATER_STATE_OFF" 4 "HEATER_STATE_FAULT" 1 "HEATER_STATE_ON" 0 "HEATER_STATE_SNA" 3 "HEATER_STATE_OFF_UNAVAILABLE";
+VAL_ 258 VCLEFT_frontLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA";
+VAL_ 258 VCLEFT_mirrorFoldState 4 "MIRROR_FOLD_STATE_UNFOLDING" 1 "MIRROR_FOLD_STATE_FOLDED" 3 "MIRROR_FOLD_STATE_FOLDING" 0 "MIRROR_FOLD_STATE_UNKNOWN" 2 "MIRROR_FOLD_STATE_UNFOLDED";
+
+
+BO_ 826 ID33AUI_rangeSOC: 8 VehicleBus
+ SG_ UI_Range : 0|10@1+ (1,0) [0|1023] "mi" Receiver
+ SG_ UI_SOC : 48|7@1+ (1,0) [0|127] "%" Receiver
+
+BO_ 306 ID132HVBattAmpVolt: 8 VehicleBus
+ SG_ BattVoltage132 : 0|16@1+ (0.01,0) [0|655.35] "V" Receiver
+
+BO_ 950 ID3B6UI_odometer: 8 VehicleBus
+ SG_ UI_odometer : 0|32@1+ (0.001,0) [0|4294967.295] "km" Receiver
+ SG_ UI_odometerCounter : 52|4@1+ (1,0) [0|15] "" Receiver
+ SG_ UI_odometerChecksum : 56|8@1+ (1,0) [0|255] "" Receiver
+
+BO_ 658 ID292BMS_SOC: 8 VehicleBus
+ SG_ SOCUI292 : 10|10@1+ (0.1,0) [0|102.3] "%" Receiver
diff --git a/iqdbc_repo/iqdbc/dbc/tesla_powertrain.dbc b/iqdbc_repo/iqdbc/dbc/tesla_powertrain.dbc
new file mode 100644
index 000000000..8572ee20f
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/tesla_powertrain.dbc
@@ -0,0 +1,179 @@
+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_:
+ NEO
+ MCU
+ GTW
+ EPAS
+ DI
+ ESP
+ SBW
+ STW
+ APP
+ DAS
+ XXX
+
+BO_ 262 DI_torque1: 8 DI
+ SG_ DI_torqueDriver : 0|13@1- (0.25,0) [-750|750] "Nm" NEO
+ SG_ DI_torque1Counter : 13|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torqueMotor : 16|13@1- (0.25,0) [-750|750] "Nm" NEO
+ SG_ DI_soptState : 29|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_motorRPM : 32|16@1- (1,0) [-17000|17000] "RPM" NEO
+ SG_ DI_pedalPos : 48|8@1+ (0.4,0) [0|100] "%" NEO
+ SG_ DI_torque1Checksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 278 DI_torque2: 6 DI
+ SG_ DI_torqueEstimate : 0|12@1- (0.5,0) [-750|750] "Nm" NEO
+ SG_ DI_gear : 12|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_brakePedal : 15|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_vehicleSpeed : 16|12@1+ (0.05,-25) [-25|179.75] "MPH" NEO
+ SG_ DI_gearRequest : 28|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torqueInterfaceFailure : 31|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torque2Counter : 32|4@1+ (1,0) [0|0] "" NEO
+ SG_ DI_brakePedalState : 36|2@1+ (1,0) [0|0] "" NEO
+ SG_ DI_epbParkRequest : 38|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_epbInterfaceReady : 39|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_torque2Checksum : 40|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 504 BrakeMessage: 8 XXX
+ SG_ driverBrakeStatus : 2|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 568 STW_ACTN_RQ: 8 STW
+ SG_ SpdCtrlLvr_Stat : 0|6@1+ (1,0) [0|0] "" NEO
+ SG_ VSL_Enbl_Rq : 6|1@1+ (1,0) [0|0] "" NEO
+ SG_ SpdCtrlLvrStat_Inv : 7|1@1+ (1,0) [0|0] "" NEO
+ SG_ DTR_Dist_Rq : 8|8@1+ (1,0) [0|200] "" NEO
+ SG_ TurnIndLvr_Stat : 16|2@1+ (1,0) [0|0] "" NEO
+ SG_ HiBmLvr_Stat : 18|2@1+ (1,0) [0|0] "" NEO
+ SG_ WprWashSw_Psd : 20|2@1+ (1,0) [0|0] "" NEO
+ SG_ WprWash_R_Sw_Posn_V2 : 22|2@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Lvr_Stat : 24|3@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Cond_Flt : 27|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Cond_Psd : 28|2@1+ (1,0) [0|0] "" NEO
+ SG_ HrnSw_Psd : 30|2@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw00_Psd : 32|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw01_Psd : 33|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw02_Psd : 34|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw03_Psd : 35|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw04_Psd : 36|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw05_Psd : 37|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw06_Psd : 38|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw07_Psd : 39|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw08_Psd : 40|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw09_Psd : 41|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw10_Psd : 42|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw11_Psd : 43|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw12_Psd : 44|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw13_Psd : 45|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw14_Psd : 46|1@1+ (1,0) [0|0] "" NEO
+ SG_ StW_Sw15_Psd : 47|1@1+ (1,0) [0|0] "" NEO
+ SG_ WprSw6Posn : 48|3@1+ (1,0) [0|0] "" NEO
+ SG_ MC_STW_ACTN_RQ : 52|4@1+ (1,0) [0|15] "" NEO
+ SG_ CRC_STW_ACTN_RQ : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 598 DI_state: 8 DI
+ SG_ DI_systemState : 0|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_vehicleHoldState : 3|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_proximity : 6|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_driveReady : 7|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_regenLight : 8|1@1+ (1,0) [0|0] "" NEO
+ SG_ DI_state : 9|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_cruiseState : 12|4@1+ (1,0) [0|0] "" NEO
+ SG_ DI_analogSpeed : 16|12@1+ (0.1,0) [0|150] "speed" NEO
+ SG_ DI_immobilizerState : 28|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_speedUnits : 31|1@1+ (1,0) [0|1] "" NEO
+ SG_ DI_cruiseSet : 32|9@1+ (0.5,0) [0|255.5] "speed" NEO
+ SG_ DI_aebState : 41|3@1+ (1,0) [0|0] "" NEO
+ SG_ DI_stateCounter : 44|4@1+ (1,0) [0|0] "" NEO
+ SG_ DI_digitalSpeed : 48|8@1+ (1,0) [0|250] "" NEO
+ SG_ DI_stateChecksum : 56|8@1+ (1,0) [0|0] "" NEO
+
+BO_ 703 DAS_control: 8 GTW
+ SG_ DAS_setSpeed : 0|12@1+ (0.1,0) [0|409.4] "kph" DI,PM,APS
+ SG_ DAS_accState : 12|4@1+ (1,0) [0|0] "" DI,PM,APS
+ SG_ DAS_aebEvent : 16|2@1+ (1,0) [0|3] "" DI,PM,APS
+ SG_ DAS_jerkMin : 18|9@1+ (0.03,-15.232) [-15.232|0.098] "m/s^3" DI,PM,APS
+ SG_ DAS_jerkMax : 27|8@1+ (0.059,0) [0|15.045] "m/s^3" DI,PM,APS
+ SG_ DAS_accelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" DI,PM,APS
+ SG_ DAS_accelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" DI,PM,APS
+ SG_ DAS_controlCounter : 53|3@1+ (1,0) [0|0] "" DI,PM,APS
+ SG_ DAS_controlChecksum : 56|8@1+ (1,0) [0|0] "" DI,PM,APS
+
+VAL_ 262 DI_torqueDriver -4096 "SNA" ;
+VAL_ 262 DI_torqueMotor -4096 "SNA" ;
+VAL_ 262 DI_soptState 7 "SOPT_TEST_SNA" 4 "SOPT_TEST_NOT_RUN" 3 "SOPT_TEST_PASSED" 2 "SOPT_TEST_FAILED" 1 "SOPT_TEST_IN_PROGRESS" 0 "SOPT_PRE_TEST" ;
+VAL_ 262 DI_motorRPM -32768 "SNA" ;
+VAL_ 262 DI_pedalPos 255 "SNA" ;
+VAL_ 278 DI_torqueEstimate -2048 "SNA" ;
+VAL_ 278 DI_gear 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ;
+VAL_ 278 DI_brakePedal 1 "Applied" 0 "Not_applied" ;
+VAL_ 278 DI_vehicleSpeed 4095 "SNA" ;
+VAL_ 278 DI_gearRequest 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ;
+VAL_ 278 DI_torqueInterfaceFailure 1 "TORQUE_INTERFACE_FAILED" 0 "TORQUE_INTERFACE_NORMAL" ;
+VAL_ 278 DI_brakePedalState 3 "SNA" 2 "INVALID" 1 "ON" 0 "OFF" ;
+VAL_ 278 DI_epbParkRequest 1 "Park_requested" 0 "No_request" ;
+VAL_ 278 DI_epbInterfaceReady 1 "EPB_INTERFACE_READY" 0 "EPB_INTERFACE_NOT_READY" ;
+VAL_ 504 driverBrakeStatus 2 "APPLIED" 1 "NOT_APPLIED" ;
+VAL_ 568 SpdCtrlLvr_Stat 32 "DN_1ST" 16 "UP_1ST" 8 "DN_2ND" 4 "UP_2ND" 2 "RWD" 1 "FWD" 0 "IDLE" ;
+VAL_ 568 DTR_Dist_Rq 255 "SNA" 200 "ACC_DIST_7" 166 "ACC_DIST_6" 133 "ACC_DIST_5" 100 "ACC_DIST_4" 66 "ACC_DIST_3" 33 "ACC_DIST_2" 0 "ACC_DIST_1" ;
+VAL_ 568 TurnIndLvr_Stat 3 "SNA" 2 "RIGHT" 1 "LEFT" 0 "IDLE" ;
+VAL_ 568 HiBmLvr_Stat 3 "SNA" 2 "HIBM_FLSH_ON_PSD" 1 "HIBM_ON_PSD" 0 "IDLE" ;
+VAL_ 568 WprWashSw_Psd 3 "SNA" 2 "WASH" 1 "TIPWIPE" 0 "NPSD" ;
+VAL_ 568 WprWash_R_Sw_Posn_V2 3 "SNA" 2 "WASH" 1 "INTERVAL" 0 "OFF" ;
+VAL_ 568 StW_Lvr_Stat 4 "STW_BACK" 3 "STW_FWD" 2 "STW_DOWN" 1 "STW_UP" 0 "NPSD" ;
+VAL_ 568 StW_Cond_Psd 3 "SNA" 2 "DOWN" 1 "UP" 0 "NPSD" ;
+VAL_ 568 HrnSw_Psd 3 "SNA" 2 "NDEF2" 1 "PSD" 0 "NPSD" ;
+VAL_ 568 StW_Sw00_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 StW_Sw01_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 StW_Sw03_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 StW_Sw04_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ;
+VAL_ 568 WprSw6Posn 7 "SNA" 6 "STAGE2" 5 "STAGE1" 4 "INTERVAL4" 3 "INTERVAL3" 2 "INTERVAL2" 1 "INTERVAL1" 0 "OFF" ;
+VAL_ 598 DI_aebState 2 "ENABLED" 4 "FAULT" 7 "SNA" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ;
+VAL_ 598 DI_analogSpeed 4095 "SNA" ;
+VAL_ 598 DI_cruiseState 2 "ENABLED" 5 "FAULT" 0 "OFF" 4 "OVERRIDE" 7 "PRE_CANCEL" 6 "PRE_FAULT" 1 "STANDBY" 3 "STANDSTILL" ;
+VAL_ 598 DI_digitalSpeed 255 "SNA" ;
+VAL_ 598 DI_immobilizerState 2 "AUTHENTICATING" 3 "DISARMED" 6 "FAULT" 4 "IDLE" 0 "INIT_SNA" 1 "REQUEST" 5 "RESET" ;
+VAL_ 598 DI_speedUnits 1 "KPH" 0 "MPH" ;
+VAL_ 598 DI_state 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ;
+VAL_ 598 DI_systemState 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ;
+VAL_ 598 DI_vehicleHoldState 2 "BLEND_IN" 4 "BLEND_OUT" 6 "FAULT" 7 "INIT" 5 "PARK" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ;
+VAL_ 703 DAS_setSpeed 4095 "SNA" ;
+VAL_ 703 DAS_accState 15 "FAULT_SNA" 13 "ACC_CANCEL_GENERIC_SILENT" 11 "APC_SELFPARK_START" 10 "APC_UNPARK_COMPLETE" 9 "APC_PAUSE" 8 "APC_ABORT" 7 "APC_COMPLETE" 6 "APC_FORWARD" 5 "APC_BACKWARD" 4 "ACC_ON" 3 "ACC_HOLD" 0 "ACC_CANCEL_GENERIC" ;
+VAL_ 703 DAS_aebEvent 3 "AEB_SNA" 2 "AEB_FAULT" 1 "AEB_ACTIVE" 0 "AEB_NOT_ACTIVE" ;
+VAL_ 703 DAS_jerkMin 511 "SNA" ;
+VAL_ 703 DAS_jerkMax 255 "SNA" ;
+VAL_ 703 DAS_accelMin 511 "SNA" ;
+VAL_ 703 DAS_accelMax 511 "SNA" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/tesla_radar_bosch_generated.dbc b/iqdbc_repo/iqdbc/dbc/tesla_radar_bosch_generated.dbc
new file mode 100644
index 000000000..cdd03908a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/tesla_radar_bosch_generated.dbc
@@ -0,0 +1,1373 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "tesla_radar_bosch.dbc starts here";
+
+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_: Autopilot Radar Diag
+
+
+BO_ 769 TeslaRadarSguInfo: 8 Radar
+ SG_ RADC_VerticalMisalignment : 0|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_SCUTemperature : 8|8@1+ (1,-128) [-128|127] "" Autopilot
+ SG_ RADC_VMA_Plaus : 16|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_SGU_ITC : 24|8@1+ (1,0) [0|255] "" Autopilot
+ SG_ RADC_HorizontMisalignment : 32|12@1+ (1,0) [0|4096] "" Autopilot
+ SG_ RADC_SensorDirty : 44|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_HWFail : 45|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_SGUFail : 46|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_SGUInfoConsistBit : 47|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 770 TeslaRadarTguInfo: 8 Radar
+ SG_ RADC_ACCTargObj1_sguIndex : 0|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj2_sguIndex : 6|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj3_sguIndex : 12|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj4_sguIndex : 18|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ RADC_ACCTargObj5_sguIndex : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ unused30 : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_TGUInfoConsistBit : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_ACCTargObj1_dBPower : 32|16@1+ (1,0) [0|65535] "" Autopilot
+ SG_ RADC_ACCTargObj5_dBPower : 48|16@1+ (1,0) [0|65535] "" Autopilot
+
+BO_ 1281 TeslaRadarAlertMatrix: 8 Radar
+ SG_ RADC_a001_ecuInternalPerf : 0|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a002_flashPerformance : 1|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a003_vBatHigh : 2|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a004_adjustmentNotDone : 3|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a005_adjustmentReq : 4|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a006_adjustmentNotOk : 5|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a007_sensorBlinded : 6|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a008_plantModeActive : 7|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a009_configMismatch : 8|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a010_canBusOff : 9|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a011_bdyMIA : 10|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a012_espMIA : 11|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a013_gtwMIA : 12|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a014_sccmMIA : 13|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a015_adasMIA : 14|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a016_bdyInvalidCount : 15|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a017_adasInvalidCount : 16|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a018_espInvalidCount : 17|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a019_sccmInvalidCount : 18|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a020_bdyInvalidChkSm : 19|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a021_espInvalidChkSm : 20|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a022_sccmInvalidChkSm : 21|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a023_sccmInvalidChkSm : 22|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a024_absValidity : 23|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a025_ambTValidity : 24|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a026_brakeValidity : 25|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a027_CntryCdValidity : 26|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a028_espValidity : 27|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a029_longAccOffValidity : 28|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a030_longAccValidity : 29|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a031_odoValidity : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a032_gearValidity : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a033_steerAngValidity : 32|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a034_steerAngSpdValidity : 33|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a035_indctrValidity : 34|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a036_vehStandStillValidity : 35|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a037_vinValidity : 36|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a038_whlRotValidity : 37|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a039_whlSpdValidity : 38|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a040_whlStandStillValidity : 39|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a041_wiperValidity : 40|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a042_xwdValidity : 41|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a043_yawOffValidity : 42|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a044_yawValidity : 43|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a045_bsdSanity : 44|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a046_rctaSanity : 45|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a047_lcwSanity : 46|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a048_steerAngOffSanity : 47|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a049_tireSizeSanity : 48|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a050_velocitySanity : 49|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a051_yawSanity : 50|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a052_radomeHtrInop : 51|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a053_espmodValidity : 52|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a054_gtwmodValidity : 53|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a055_stwmodValidity : 54|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a056_bcmodValidity : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a057_dimodValidity : 56|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a058_opmodValidity : 57|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a059_drmiInvalidChkSm : 58|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a060_drmiInvalidCount : 59|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a061_radPositionMismatch : 60|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ RADC_a062_strRackMismatch : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ unused62 : 62|2@1+ (1,0) [0|3] "" Autopilot
+
+BO_ 784 RadarPoint0_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 785 RadarPoint0_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 787 RadarPoint1_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 788 RadarPoint1_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 790 RadarPoint2_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 791 RadarPoint2_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 793 RadarPoint3_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 794 RadarPoint3_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 796 RadarPoint4_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 797 RadarPoint4_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 799 RadarPoint5_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 800 RadarPoint5_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 802 RadarPoint6_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 803 RadarPoint6_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 805 RadarPoint7_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 806 RadarPoint7_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 808 RadarPoint8_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 809 RadarPoint8_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 811 RadarPoint9_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 812 RadarPoint9_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 814 RadarPoint10_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 815 RadarPoint10_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 817 RadarPoint11_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 818 RadarPoint11_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 820 RadarPoint12_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 821 RadarPoint12_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 823 RadarPoint13_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 824 RadarPoint13_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 826 RadarPoint14_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 827 RadarPoint14_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 829 RadarPoint15_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 830 RadarPoint15_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 832 RadarPoint16_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 833 RadarPoint16_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 835 RadarPoint17_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 836 RadarPoint17_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 838 RadarPoint18_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 839 RadarPoint18_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 841 RadarPoint19_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 842 RadarPoint19_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 844 RadarPoint20_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 845 RadarPoint20_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 847 RadarPoint21_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 848 RadarPoint21_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 850 RadarPoint22_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 851 RadarPoint22_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 853 RadarPoint23_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 854 RadarPoint23_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 856 RadarPoint24_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 857 RadarPoint24_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 859 RadarPoint25_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 860 RadarPoint25_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 862 RadarPoint26_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 863 RadarPoint26_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 865 RadarPoint27_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 866 RadarPoint27_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 868 RadarPoint28_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 869 RadarPoint28_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 871 RadarPoint29_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 872 RadarPoint29_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 874 RadarPoint30_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 875 RadarPoint30_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 877 RadarPoint31_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 878 RadarPoint31_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 881 ProcessedRadarPoint1_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 882 ProcessedRadarPoint1_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 884 ProcessedRadarPoint2_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 885 ProcessedRadarPoint2_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 887 ProcessedRadarPoint3_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 888 ProcessedRadarPoint3_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 890 ProcessedRadarPoint4_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 891 ProcessedRadarPoint4_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 893 ProcessedRadarPoint5_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 894 ProcessedRadarPoint5_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 697 VIN_VIP_405HS: 8 Autopilot
+ SG_ VIN_MuxID M : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ VIN_Part1 m16 : 47|24@0+ (1,0) [0|16777215] "" Radar
+ SG_ VIN_Part2 m17 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar
+ SG_ VIN_Part3 m18 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar
+
+BO_ 681 Msg2A9_GTW_carConfig: 8 Autopilot
+ SG_ Msg2A9_Always0x02 : 48|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x10 : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x16 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x41 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Value1_0x02 : 0|3@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_FourWheelDrive : 3|2@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Value2_0x02 : 5|3@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2A9_Always0x43 : 16|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 409 Msg199_STW_ANGLHP_STAT: 8 Autopilot
+ SG_ Msg199Always0x04 : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x20 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x2F : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0x67 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Always0xFF : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg199Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 361 Msg169_ESP_wheelSpeeds: 8 Autopilot
+ SG_ ESP_wheelSpeedFrL_HS : 0|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedFrR_HS : 13|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedReL_HS : 26|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ ESP_wheelSpeedReR_HS : 39|13@1+ (0.04,0) [0|327.64] "km/h" Radar
+ SG_ Msg169Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg169Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 345 Msg159_ESP_C: 8 Autopilot
+ SG_ Msg159Always0x3A : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xA5 : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xCF : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Always0xF4 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Counter : 44|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg159Checksum : 24|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 329 Msg149_ESP_145h: 8 Autopilot
+ SG_ Msg149Always0x02 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x04 : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x26 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0x6A : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0xAA : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Always0xF : 48|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg149Counter : 52|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 297 Msg129_ESP_115h: 6 Autopilot
+ SG_ Msg129Always0x20 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg129Checksum : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg129Counter : 36|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 281 Msg119_DI_torque2: 6 Autopilot
+ SG_ Msg119Always0x11 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0x1F : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0x8 : 36|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0xF4 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Always0xFF : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Checksum : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg119Counter : 32|4@1+ (1,0) [0|0] "" Radar
+
+BO_ 265 Msg109_DI_torque1: 8 Autopilot
+ SG_ Msg109Always0x80 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg109Checksum : 56|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg109Counter : 13|3@1+ (1,0) [0|0] "" Radar
+
+BO_ 521 Msg209_GTW_odo: 8 Autopilot
+ SG_ Msg209Always0x61 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x94 : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x52 : 24|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x13 : 32|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x03 : 40|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg209Always0x80 : 48|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 537 Msg219_STW_ACTN_RQ: 8 Autopilot
+ SG_ Msg219Counter : 52|4@1+ (1,0) [0|15] "" Radar
+ SG_ Msg219CRC : 56|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 425 Msg1A9_DI_espControl: 5 Autopilot
+ SG_ Msg1A9Always0x0C : 16|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg1A9Counter : 28|4@1+ (1,0) [0|0] "" Radar
+ SG_ Msg1A9Checksum : 32|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 729 Msg2D9_BC_status : 8 Autopilot
+ SG_ Msg2D9Always0x80 : 0|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2D9Always0x40 : 8|8@1+ (1,0) [0|0] "" Radar
+ SG_ Msg2D9Always0x83 : 16|8@1+ (1,0) [0|0] "" Radar
+
+BO_ 1601 UDS_radarRequest: 8 Diag
+ SG_ UDS_radarRequestData : 7|64@0+ (1,0) [0|0] "" Radar
+
+BO_ 1617 Radar_udsResponse: 8 Radar
+ SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|0] "" Diag
+
+CM_ BO_ 697 "Start with MuxID 0x12, then 0x11 and finally 0x10 (VIN is then transmitted in the reverse order)";
+CM_ BO_ 681 "Message sent every 1000 ms. All fixed bytes, no checksum, the byte for RWD or AWD needs to match VIN config";
+CM_ BO_ 409 "Message sent every 10ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo";
+CM_ BO_ 361 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x76";
+CM_ BO_ 345 "Message sent every 20ms. Checksum : Sum of all first bytes + 0xc; place checksum in 4th octet";
+CM_ BO_ 329 "Message sent every 20ms. Checksum : Sum of all first 7 bytes + 0x46";
+CM_ BO_ 297 "Message sent every 20ms. Checksum : Sum of all first 5 bytes + 0x16";
+CM_ BO_ 281 "Message sent every 10ms. Checksum : Sum of all first 5 bytes + 0x17";
+CM_ BO_ 265 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x7";
+CM_ BO_ 521 "Message sent every 100ms. All fixed bytes, no checksum.";
+CM_ BO_ 537 "Message sent every 100ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo";
+CM_ BO_ 425 "Message sent every 20ms. Checksum : Sum of all first 4 bytes + 0x38";
+CM_ BO_ 729 "Message sent every 1000ms. All fixed bytes, no checksum.";
+
+BA_DEF_ "BusType" STRING ;
+BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
+BA_DEF_ SG_ "FieldType" STRING ;
+
+BA_DEF_DEF_ "BusType" "CAN";
+BA_DEF_DEF_ "FieldType" "";
+BA_DEF_DEF_ "GenMsgCycleTime" 0;
+
+BA_ "GenMsgCycleTime" BO_ 697 250;
+BA_ "GenMsgCycleTime" BO_ 681 1000;
+BA_ "GenMsgCycleTime" BO_ 409 10;
+BA_ "GenMsgCycleTime" BO_ 361 10;
+BA_ "GenMsgCycleTime" BO_ 345 20;
+BA_ "GenMsgCycleTime" BO_ 329 20;
+BA_ "GenMsgCycleTime" BO_ 297 20;
+BA_ "GenMsgCycleTime" BO_ 281 10;
+BA_ "GenMsgCycleTime" BO_ 265 10;
+BA_ "GenMsgCycleTime" BO_ 521 100;
+BA_ "GenMsgCycleTime" BO_ 537 100;
+BA_ "GenMsgCycleTime" BO_ 425 20;
+BA_ "GenMsgCycleTime" BO_ 729 1000;
+
+VAL_ 681 Msg2A9_FourWheelDrive 3 "SNA" 2 "UNUSED" 1 "4WD" 0 "2WD" ;
+VAL_ 785 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 785 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 788 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 788 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 791 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 791 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 794 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 794 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 797 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 797 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 800 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 800 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 803 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 803 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 806 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 806 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 809 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 809 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 812 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 812 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 815 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 815 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 818 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 818 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 821 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 821 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 824 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 824 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 827 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 827 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 830 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 830 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 833 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 833 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 836 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 836 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 839 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 839 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 842 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 842 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 845 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 845 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 848 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 848 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 851 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 851 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 854 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 854 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 857 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 857 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 860 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 860 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 863 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 863 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 866 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 866 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 869 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 869 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 872 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 872 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 875 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 875 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 878 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 878 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 882 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 882 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 885 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 885 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 888 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 888 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 891 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 891 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 894 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 894 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/tesla_radar_continental_generated.dbc b/iqdbc_repo/iqdbc/dbc/tesla_radar_continental_generated.dbc
new file mode 100644
index 000000000..9a543b345
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/tesla_radar_continental_generated.dbc
@@ -0,0 +1,1262 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+CM_ "tesla_radar_continental.dbc starts here";
+
+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_: Autopilot Radar Diag
+
+BO_ 1025 RadarStatus: 8 Radar
+ SG_ carparkDetected : 29|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ decreaseBlockage : 25|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ horizontMisalignment : 8|12@1+ (0.00012207,-0.25) [-0.25|0.249878] "rad" Autopilot
+ SG_ increaseBlockage : 24|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ lowPowerMode : 20|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ powerOnSelfTest : 22|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorBlocked : 26|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorInfoConsistBit : 30|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ sensorReplace : 31|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ shortTermUnavailable : 23|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ tunnelDetected : 28|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ vehDynamicsError : 27|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ verticalMisalignment : 0|8@1+ (0.00195313,-0.25) [-0.25|0.248047] "rad" Autopilot
+
+BO_ 1617 Radar_udsResponse: 8 Radar
+ SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|1.84467e+19] "" Diag
+
+BO_ 1601 UDS_radcRequest: 8 Diag
+ SG_ UDS_radcRequestData : 7|64@0+ (1,0) [0|1.84467e+19] "" Radar
+
+BO_ 1040 RadarPoint0_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1041 RadarPoint0_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1042 RadarPoint1_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1043 RadarPoint1_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1044 RadarPoint2_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1045 RadarPoint2_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1046 RadarPoint3_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1047 RadarPoint3_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1048 RadarPoint4_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1049 RadarPoint4_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1050 RadarPoint5_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1051 RadarPoint5_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1052 RadarPoint6_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1053 RadarPoint6_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1054 RadarPoint7_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1055 RadarPoint7_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1056 RadarPoint8_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1057 RadarPoint8_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1058 RadarPoint9_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1059 RadarPoint9_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1060 RadarPoint10_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1061 RadarPoint10_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1062 RadarPoint11_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1063 RadarPoint11_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1064 RadarPoint12_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1065 RadarPoint12_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1066 RadarPoint13_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1067 RadarPoint13_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1068 RadarPoint14_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1069 RadarPoint14_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1070 RadarPoint15_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1071 RadarPoint15_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1072 RadarPoint16_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1073 RadarPoint16_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1074 RadarPoint17_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1075 RadarPoint17_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1076 RadarPoint18_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1077 RadarPoint18_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1078 RadarPoint19_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1079 RadarPoint19_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1080 RadarPoint20_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1081 RadarPoint20_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1082 RadarPoint21_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1083 RadarPoint21_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1084 RadarPoint22_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1085 RadarPoint22_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1086 RadarPoint23_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1087 RadarPoint23_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1088 RadarPoint24_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1089 RadarPoint24_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1090 RadarPoint25_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1091 RadarPoint25_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1092 RadarPoint26_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1093 RadarPoint26_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1094 RadarPoint27_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1095 RadarPoint27_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1096 RadarPoint28_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1097 RadarPoint28_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1098 RadarPoint29_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1099 RadarPoint29_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1100 RadarPoint30_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1101 RadarPoint30_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1102 RadarPoint31_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1103 RadarPoint31_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1104 RadarPoint32_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1105 RadarPoint32_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1106 RadarPoint33_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1107 RadarPoint33_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1108 RadarPoint34_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1109 RadarPoint34_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1110 RadarPoint35_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1111 RadarPoint35_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1112 RadarPoint36_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1113 RadarPoint36_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1114 RadarPoint37_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1115 RadarPoint37_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1116 RadarPoint38_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1117 RadarPoint38_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1118 RadarPoint39_A: 8 Radar
+ SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot
+ SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot
+ SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot
+ SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot
+ SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+BO_ 1119 RadarPoint39_B: 8 Radar
+ SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot
+ SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot
+ SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot
+ SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot
+ SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot
+ SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot
+ SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot
+ SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot
+ SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot
+
+VAL_ 1025 lowPowerMode 1 "COMMANDED_LOW_POWER" 0 "DEFAULT_LOW_POWER" 2 "NORMAL_POWER" 3 "SNA";
+VAL_ 1041 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1041 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1043 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1043 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1045 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1045 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1047 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1047 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1049 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1049 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1051 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1051 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1053 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1053 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1055 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1055 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1057 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1057 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1059 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1059 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1061 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1061 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1063 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1063 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1065 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1065 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1067 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1067 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1069 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1069 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1071 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1071 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1073 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1073 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1075 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1075 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1077 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1077 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1079 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1079 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1081 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1081 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1083 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1083 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1085 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1085 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1087 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1087 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1089 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1089 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1091 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1091 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1093 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1093 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1095 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1095 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1097 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1097 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1099 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1099 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1101 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1101 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1103 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1103 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1105 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1105 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1107 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1107 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1109 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1109 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1111 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1111 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1113 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1113 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1115 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1115 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1117 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1117 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
+VAL_ 1119 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ;
+VAL_ 1119 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_2017_ref_pt.dbc b/iqdbc_repo/iqdbc/dbc/toyota_2017_ref_pt.dbc
new file mode 100644
index 000000000..17cd8f1b3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_2017_ref_pt.dbc
@@ -0,0 +1,1638 @@
+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_: AFS BSR CGW CSR DS1 FCM FRD KSS MAV SCS Vector__XXX
+
+
+BO_ 1196 ABG1D50: 8 CGW
+ SG_ DRABG01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1212 ABG1D51: 8 CGW
+ SG_ DRABG09 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG10 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG11 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG12 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG13 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG14 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG15 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRABG16 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 945 ABG1S01: 8 CGW
+ SG_ CDT : 22|3@0+ (1,0) [0|0] "" DS1
+ SG_ AB : 19|2@0+ (1,0) [0|0] "" DS1
+ SG_ DBKLAB : 17|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PODT : 27|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PBKLAB : 25|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EDRTRG : 44|2@0+ (1,0) [0|0] "" DS1
+
+BO_ 836 ACC1F01: 8 DS1
+ SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
+ SG_ DS1STAT2 : 13|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DS1STBK2 : 10|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSWAR : 18|1@0+ (1,0) [0|0] "" FCM
+ SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
+ SG_ PCSOPR : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSABK : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PPTRGR : 28|1@0+ (1,0) [0|0] "" FCM
+ SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
+ SG_ CLEXTRGR : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ IRLT_REQ : 25|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKHLD : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
+ SG_ VGRSTRGR : 35|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PBRTRGR : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSDIS : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PBPREPMP : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCF01SM : 63|8@0+ (1,0) [0|0] "" FCM
+
+BO_ 1227 ACC1N01: 8 DS1
+ SG_ ACCNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ ACCSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ ACCSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ ACCREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 835 ACC1S03: 8 DS1
+ SG_ ATACC2 : 7|16@0- (0.001,0) [0|0] "m/s^2" Vector__XXX
+ SG_ ACCTYPE : 23|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XTRGT2 : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XLTMD2 : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LCDT2 : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LCNG : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SMC : 17|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STOKJD : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PMTBRKG : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LVSTP : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LCCWOK : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LCBW2 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACC : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AT_RAW : 47|8@0- (0.05,0) [0|0] "m/s^2" Vector__XXX
+ SG_ ACC03SUM : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 896 ACN1S01: 8 CGW
+ SG_ R_AC2 : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_HTR : 5|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECOSW : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_EGON : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BLWON : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SCAC : 13|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CGIH : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FAN_AC : 22|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACHI : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACMAX : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_VSCUS : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_SHTR : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_PTC : 29|2@0+ (1,0) [0|0] "piece" Vector__XXX
+ SG_ GNRTIH : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_COL_TM : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_HET_TM : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TAMOUT : 55|8@0- (0.625,0) [0|0] "" Vector__XXX
+
+BO_ 897 ACN1S04: 8 CGW
+ SG_ R_ACCALL : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_AC_WNG : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_SW_CON : 5|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_BEEP : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_RA_AUT : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_RA_AC : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_RA_LO : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_RA_HI : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_AUTO_D : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_AUTO_P : 14|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_DEF : 13|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_RRDEF : 12|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_RFAUT : 11|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_REC : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_FRS : 9|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_AC : 8|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_MHTR : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_WIPD : 22|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_DUSY : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_SWNG : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_BLW_F : 19|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_OAUT_D : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_OLET_D : 30|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_OAUT_P : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_OLET_P : 26|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ST_BMN_F : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_AIRPR : 47|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_O2 : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_PLSM : 45|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_KAFUN : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_SAFS : 42|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_ACOFF : 41|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_ONSCRN : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 944 ACN1S07: 6 CGW
+ SG_ RDEF : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MHTR : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TR_TEMP : 15|8@0+ (0.25,-6.5) [0|0] "" Vector__XXX
+ SG_ ACN_AMB : 31|8@0+ (1,0) [0|0] "" CSR,DS1,FCM
+ SG_ AC_AMB05 : 44|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AC_MODE : 43|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1250 AFS1N01: 8 AFS
+ SG_ AFSNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ AFSSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ AFSSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ AFSREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 913 AFS1S01: 8 AFS
+ SG_ HLLI : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AZB_ADV : 5|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HEDH_AZB : 3|1@0+ (1,0) [0|0] "" FCM
+ SG_ AZB_IND : 13|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AZB_HIND : 11|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AZB_PRE : 10|1@0+ (1,0) [0|0] "" FCM
+ SG_ LED_HLI : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LPECU_PR : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 845 AFS1S02: 5 AFS
+ SG_ AHRR : 17|10@0+ (0.0048828125,0) [0|0] "V" Vector__XXX
+ SG_ AHVLD : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AHFAIL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1044 AHB1S01: 8 FCM
+ SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+ SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 900 AVN1S01: 6 CGW
+ SG_ RDC : 7|4@0+ (1,0) [0|0] "" SCS
+ SG_ CONFID01 : 3|2@0+ (1,0) [0|0] "" SCS
+ SG_ CONF : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LYT : 15|4@0+ (1,0) [0|0] "" SCS
+ SG_ DRVW : 9|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MWMP : 8|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GRAD : 23|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HARSHID : 19|4@0+ (1,0) [0|0] "" SCS
+ SG_ BRANCH : 27|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HARSH : 35|2@0+ (1,0) [0|0] "" SCS
+ SG_ TOLLGATE : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TUNL : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LEAVEOUT : 47|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MRGLANE : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LVLANE : 45|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 902 AVN1S03: 6 CGW
+ SG_ ANS : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CRS1 : 15|1@0+ (1,0) [0|0] "" SCS
+ SG_ RQAC : 14|7@0+ (0.02,0) [0|0] "G" Vector__XXX
+ SG_ GUID : 23|1@0+ (1,0) [0|0] "" SCS
+ SG_ GYRO : 22|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NCRN : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CRN6 : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CRN5 : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CRN3 : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CRN2 : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CRN1 : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CONFID03 : 31|2@0+ (1,0) [0|0] "" SCS
+ SG_ CURV : 29|2@0+ (1,0) [0|0] "" SCS
+ SG_ CVST : 27|1@0+ (1,0) [0|0] "" SCS
+ SG_ NAVI_STR : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MIND : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ONOFF : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HWPB : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RAD : 38|7@0+ (5,0) [0|0] "m" SCS
+ SG_ AFS_SW : 41|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVS_SW : 40|1@0+ (1,0) [0|0] "" SCS
+
+BO_ 911 AVN1S07: 8 CGW
+ SG_ TOFC_RST : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SL_CSTM : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SL_RMDG : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ST_RTCOM : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVN07VLD : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ST_UCST : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSCOM51 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSCOM52 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSCOM53 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSCOM54 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSCOM55 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSCOM56 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 905 AVN1S08: 8 CGW
+ SG_ VVSW : 7|3@0+ (1,0) [0|0] "" CSR
+ SG_ BZV : 4|3@0+ (1,0) [0|0] "" CSR
+ SG_ DFS : 1|2@0+ (1,0) [0|0] "" CSR
+ SG_ BZ_M_SW : 15|1@0+ (1,0) [0|0] "" CSR
+ SG_ VOL_SW : 14|1@0+ (1,0) [0|0] "" CSR
+ SG_ BM : 13|1@0+ (1,0) [0|0] "" CSR
+ SG_ DOFR : 12|1@0+ (1,0) [0|0] "" CSR
+ SG_ RDSW : 11|1@0+ (1,0) [0|0] "" CSR
+ SG_ FDSW : 10|1@0+ (1,0) [0|0] "" CSR
+ SG_ RBSW : 9|1@0+ (1,0) [0|0] "" CSR
+ SG_ FBSW : 8|1@0+ (1,0) [0|0] "" CSR
+ SG_ NVDP_OK : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DEVICE : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DISPSIZE : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HPTCSW_L : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HPTCSW_R : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HPTCSW_E : 28|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_MODE : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VARBGM : 26|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WBGM : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ X_LL : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Y_LL : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ X_RH : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ Y_RH : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 998 AVN1S11: 5 CGW
+ SG_ SENSPFM : 7|3@0+ (1,0) [0|0] "" SCS
+ SG_ SENSFAIL : 4|3@0+ (1,0) [0|0] "" SCS
+ SG_ CONFID11 : 1|2@0+ (1,0) [0|0] "" SCS
+ SG_ CONFMMC : 15|8@0+ (1,0) [0|0] "" SCS
+ SG_ DISTERR : 23|8@0+ (1,0) [0|0] "" SCS
+ SG_ CONFLANE : 31|8@0+ (1,0) [0|0] "" SCS
+ SG_ CONFDIR : 39|8@0+ (1,0) [0|0] "" SCS
+
+BO_ 933 AVN1S13: 8 CGW
+ SG_ HUD_DISP : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRVSIDE : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DT_GP : 5|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DT_UNIT : 15|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DIR_TURN : 12|5@0+ (11.25,0) [0|0] "degree" Vector__XXX
+ SG_ ROTARY : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ROAD_TP1 : 22|15@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ROAD_TP2 : 39|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ N_H_UP : 55|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ COMPASS : 54|6@0+ (11.25,0) [0|0] "degree" Vector__XXX
+ SG_ DIR : 63|6@0+ (11.25,0) [0|0] "degree" Vector__XXX
+
+BO_ 936 AVN1S16: 5 CGW
+ SG_ NDADVSRY : 7|5@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NDCAUTON : 15|5@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NDSSLCT : 23|5@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NDCNFDID : 18|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NDINDST : 25|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVN16SUM : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 999 AVN1S17: 7 CGW
+ SG_ AVN17VLD : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANEID17 : 6|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRVLANE : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRV_SIDE : 12|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE_NS : 11|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE1FLG : 23|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE2FLG : 19|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE1DIR : 31|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE2DIR : 47|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1000 AVN1S18: 8 CGW
+ SG_ AVN18VLD : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANEID18 : 6|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE3FLG : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE4FLG : 15|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE5FLG : 11|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE3DIR : 23|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE4DIR : 39|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE5DIR : 55|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1001 AVN1S19: 8 CGW
+ SG_ AVN19VLD : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANEID19 : 6|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE6FLG : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE7FLG : 15|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE8FLG : 11|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE6DIR : 23|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE7DIR : 39|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LANE8DIR : 55|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1076 AVN1S20: 8 CGW
+ SG_ A_LNG_ST : 7|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LANG : 5|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB1 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB2 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB3 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB4 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB5 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB6 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGDB7 : 63|7@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_LNGCHG : 56|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1077 AVN1S21: 8 CGW
+ SG_ A_OPEN_S : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OPENCHG : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CAPSW_S : 5|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_CLR_S : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DISP_BRT : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DISP_CNT : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MM_CLOCK : 31|11@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CLK_OFST : 36|4@0- (5,0) [0|0] "min" Vector__XXX
+ SG_ DST : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CLK_TYP : 47|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_UNTTMP : 45|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_UNTSP : 43|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_UNTDST : 41|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_UNTCSP : 55|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_CLRCHG : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_TMPCHG : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_SPCHG : 50|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_DSTCHG : 49|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_CSPCHG : 48|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ A_SPLM : 63|6@0+ (5,0) [0|0] "" Vector__XXX
+ SG_ A_UTSPLM : 57|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1043 AVN1S31: 8 CGW
+ SG_ GPSTM_Y : 7|8@0+ (1,0) [0|0] "year" Vector__XXX
+ SG_ GPSTM_MO : 15|8@0+ (1,0) [0|0] "month" Vector__XXX
+ SG_ GPSTM_D : 23|8@0+ (1,0) [0|0] "day" Vector__XXX
+ SG_ GPSTM_H : 31|8@0+ (1,0) [0|0] "hour" Vector__XXX
+ SG_ GPSTM_MI : 39|8@0+ (1,0) [0|0] "minute" Vector__XXX
+ SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GMTDIF_H : 54|4@0+ (1,0) [0|0] "hour" Vector__XXX
+ SG_ GMTDIF_M : 50|6@0+ (1,0) [0|0] "minute" Vector__XXX
+ SG_ SUMMERTM : 60|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075054137 BDB1F01_14: 8 CGW
+ SG_ BDBF01ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDBF01IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SALR : 23|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HDCY_BDB : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AARE_B : 31|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ I_SEN_B : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ INTSET_B : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ INCSET_B : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ISSD_BDB : 39|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SEID : 37|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WS_ID : 44|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WS_SWON : 41|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WS_DATA : 55|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075185211 BDB1F03_16: 8 CGW
+ SG_ BDBF03ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ BDBF03IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TRIP_CNT : 23|16@0+ (1,0) [0|0] "trip" AFS,BSR,CSR,DS1,FCM,MAV
+ SG_ TIME_CNT : 39|32@0+ (100,0) [0|0] "ms" AFS,BSR,CSR,DS1,FCM,MAV
+
+BO_ 1074791968 BDB1S01_10: 8 CGW
+ SG_ BDB01_ID : 7|8@0+ (1,0) [0|0] "" FCM,MAV
+ SG_ BDB01_IF : 15|8@0+ (1,0) [0|0] "" FCM
+ SG_ LX : 23|16@0+ (0.2,0) [0|0] "ms" FCM
+ SG_ ADIM : 39|2@0+ (1,0) [0|0] "" AFS,BSR,CSR
+ SG_ IG_BDB : 37|1@0+ (1,0) [0|0] "" AFS,MAV
+ SG_ ACC_BDB : 36|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SKSW : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DCTY : 45|1@0+ (1,0) [0|0] "" FCM,MAV,SCS
+ SG_ PCTY : 44|1@0+ (1,0) [0|0] "" MAV,SCS
+ SG_ RRCY : 43|1@0+ (1,0) [0|0] "" MAV,SCS
+ SG_ RLCY : 42|1@0+ (1,0) [0|0] "" MAV,SCS
+ SG_ BCTY : 41|1@0+ (1,0) [0|0] "" MAV,SCS
+ SG_ PSW : 51|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SRBZ : 49|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DBKL : 63|2@0+ (1,0) [0|0] "" FCM
+ SG_ PKB_BDB : 60|1@0+ (1,0) [0|0] "" CSR
+ SG_ SREXIST : 59|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SRPOS : 58|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1074857505 BDB1S02_11: 8 CGW
+ SG_ BDB02_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB02_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LUD : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRNKOPN : 45|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1074923042 BDB1S03_12: 8 CGW
+ SG_ BDB03_ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BDB03_IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ LTS : 23|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PANL : 19|1@0+ (1,0) [0|0] "" BSR,CSR
+ SG_ UDRL : 31|1@0+ (1,0) [0|0] "" AFS
+ SG_ HEDH : 30|1@0+ (1,0) [0|0] "" AFS,DS1,FCM
+ SG_ HEDL : 29|1@0+ (1,0) [0|0] "" AFS,DS1
+ SG_ TAIL : 28|1@0+ (1,0) [0|0] "" AFS,BSR,CSR,DS1
+ SG_ FFOG : 27|1@0+ (1,0) [0|0] "" DS1
+ SG_ RFOG : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SB_IND : 39|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SB_OK : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RTRRQ : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SRWARN : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PWWARN : 50|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WEL_REQ : 48|1@0+ (1,0) [0|0] "" AFS
+ SG_ DRPBZ_R : 62|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075381795 BDB1S04_19: 8 CGW
+ SG_ BDB04_ID : 7|8@0+ (1,0) [0|0] "" MAV
+ SG_ BDB04_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MRMV_R : 23|2@0+ (1,0) [0|0] "" MAV
+ SG_ RSEL : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LSEL : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MHR : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MHL : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MVU : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MVD : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GHSW : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GCTY : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GHOPN : 42|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ABIF : 55|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FLSHRQ : 63|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SB_ADV : 60|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1074988600 BDB1S05_13: 8 CGW
+ SG_ BDB05_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB05_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PARK : 23|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSWB : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LSWD : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LSWP : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LSWR : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LSWL : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LSWB : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRVKS_R : 31|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PWDRD : 39|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PWDRP : 37|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PWDRR : 35|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PWDRL : 33|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DKLS : 43|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BKLS : 54|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ KIDSCN_R : 51|7@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075250736 BDB1S06_17: 8 CGW
+ SG_ BDB06_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB06_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TBSW : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WBZF : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WVOL : 42|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075316273 BDB1S07_18: 8 CGW
+ SG_ BDB07_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB07_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WCD : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ W1D : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ W2D : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ W3D : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB7SUM1 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB7SUM2 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075447332 BDB1S08_1A: 8 CGW
+ SG_ BDB08_ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ BDB08_IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ DEST_BDB : 23|8@0+ (1,0) [0|0] "" AFS,BSR,CSR,DS1,FCM,MAV
+ SG_ DS_PACK1 : 31|8@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,MAV
+ SG_ DS_PACK2 : 39|8@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,MAV
+ SG_ STRG_WHL : 47|2@0+ (1,0) [0|0] "" AFS,CSR,DS1,FCM,MAV
+ SG_ DEICER : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ KEYPLATE : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DBLLCK : 62|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ U2OP_CST : 61|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ U2OP_DFT : 60|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075643943 BDB1S11_1D: 8 CGW
+ SG_ BDB11_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB11_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDBREQ11 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDBREQ12 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1083704892 BDB1S17_98: 8 CGW
+ SG_ BDB17_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB17_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CHABASE1 : 23|8@0+ (1,0) [0|0] "" AFS
+ SG_ CHABASE2 : 31|8@0+ (1,0) [0|0] "" AFS
+ SG_ CHABASE3 : 39|8@0+ (1,0) [0|0] "" AFS
+ SG_ CHA_NO1 : 47|4@0+ (1,0) [0|0] "" AFS
+ SG_ CHA_NO2 : 43|4@0+ (1,0) [0|0] "" AFS
+ SG_ CHA_NO3 : 55|4@0+ (1,0) [0|0] "" AFS
+ SG_ SP_BODY : 63|5@0+ (1,0) [0|0] "" AFS
+
+BO_ 1083770429 BDB1S18_99: 8 CGW
+ SG_ BDB18_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB18_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ POP_NAME : 23|8@0+ (1,0) [0|0] "" AFS
+ SG_ BODY : 31|8@0+ (1,0) [0|0] "" AFS
+ SG_ GEAR : 39|8@0+ (1,0) [0|0] "" AFS
+ SG_ GRADE : 47|8@0+ (1,0) [0|0] "" AFS
+ SG_ ENGINE : 55|8@0+ (1,0) [0|0] "" AFS
+
+BO_ 1020 BDB1S19: 8 CGW
+ SG_ SOLAR_R : 23|9@0+ (100,0) [0|0] "" Vector__XXX
+ SG_ SOLAR_L : 39|9@0+ (100,0) [0|0] "" Vector__XXX
+ SG_ N_LX : 55|13@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1083835966 BDB1S20_9A: 8 CGW
+ SG_ BDB20_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB20_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RNBDYC : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RNBDYD : 39|32@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1083901503 BDB1S21_9B: 8 CGW
+ SG_ BDB21_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BDB21_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RFOG_SW : 22|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FFOG_SW : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HF_SW : 20|1@0+ (1,0) [0|0] "" AFS
+ SG_ HU_SW : 19|1@0+ (1,0) [0|0] "" AFS
+ SG_ AUTO_SW : 18|1@0+ (1,0) [0|0] "" AFS
+ SG_ HEAD_SW : 17|1@0+ (1,0) [0|0] "" AFS
+ SG_ TAIL_SW : 16|1@0+ (1,0) [0|0] "" AFS
+ SG_ DRL_OFF : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1005 BGM1S01: 2 CGW
+ SG_ WCAA : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ R_DISP : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BGM_BEEP : 11|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BGM_MODE : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1237 BSR1N01: 8 BSR
+ SG_ BSRNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ BSRSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ BSRSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ BSRREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 1014 BSR1S01: 8 BSR
+ SG_ BSD_STAT : 7|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BSD_SW : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BSD_BUZ : 23|1@0+ (1,0) [0|0] "" CSR
+
+BO_ 1114 CGW1N02: 8 CGW
+ SG_ CGW2REV : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1228 CSR1N01: 8 CSR
+ SG_ CSRNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ CSRSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ CSRSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ CSRREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 918 CSR1S01: 7 CSR
+ SG_ CSV : 7|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CSSR : 4|2@0+ (1,0) [0|0] "" MAV
+ SG_ CSD : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CSME : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CSIN : 0|1@0+ (1,0) [0|0] "" MAV
+ SG_ FL_INFO : 15|4@0+ (1,0) [0|0] "" MAV
+ SG_ FR_INFO : 11|4@0+ (1,0) [0|0] "" MAV
+ SG_ RB_INFO : 23|4@0+ (1,0) [0|0] "" MAV
+ SG_ FC_INFO : 19|4@0+ (1,0) [0|0] "" MAV
+ SG_ RL_INFO : 31|4@0+ (1,0) [0|0] "" MAV
+ SG_ RR_INFO : 27|4@0+ (1,0) [0|0] "" MAV
+ SG_ CZV : 39|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VOT : 47|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FCZD : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RCZD : 42|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FCDD : 41|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RCDD : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VOL : 55|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CDG : 52|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MUTE : 49|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BZ_OFF : 48|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1087768273 DMS1S02_D6: 8 CGW
+ SG_ SS_MODE : 25|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 869 DS11D70: 7 DS1
+ SG_ D_TRGJDG : 7|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_RESSW : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_SETSW : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_CANSW : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_MAINSW : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_VMCC : 15|8@0+ (1,0) [0|0] "km/h" Vector__XXX
+ SG_ D_VNCC : 23|8@0+ (1,0) [0|0] "km/h" Vector__XXX
+ SG_ D_CCREQ : 31|8@0+ (100,-12800) [0|0] "N" Vector__XXX
+ SG_ D_TGTDST : 39|8@0+ (1,0) [0|0] "m" Vector__XXX
+ SG_ D_VRCC : 47|8@0- (1,0) [0|0] "km/h" Vector__XXX
+ SG_ D_WSTL : 55|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_DSW : 54|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_FDJDG : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ D_DSSJDG : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 870 DS11D71: 7 DS1
+ SG_ XREQALM : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XREQABK : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TGT_DIST : 5|14@0+ (0.01,0) [0|0] "m" Vector__XXX
+ SG_ XREQPBA : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XREQFPB : 22|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XREQPB : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XREQEXT : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XREQPSB : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TGT_VGAP : 18|11@0+ (0.025,-51.175) [0|0] "m/s" Vector__XXX
+ SG_ PCSDISP : 39|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XPCSRDY : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TGT_NUMB : 34|3@0+ (1,1) [0|0] "" Vector__XXX
+ SG_ TGT_POSX : 47|8@0- (0.04,0) [0|0] "m" Vector__XXX
+
+BO_ 871 DS11D72: 2 FCM
+ SG_ LKADRTRG : 7|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKADRSHR : 5|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKADRSLK : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKADRSLD : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKADRCC : 2|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKADRTUR : 15|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKADRINV : 13|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 643 DS11F01: 7 DS1
+ SG_ DSCOUNT : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DSLCCW1 : 15|1@0+ (1,0) [0|0] "" FCM
+ SG_ DSSTPBZ : 14|1@0+ (1,0) [0|0] "" FCM
+ SG_ PBRTRGR2 : 12|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DSSFTRQD : 11|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DSS1FDRV : 23|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ DSS1STBK : 39|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DSS1STAT : 36|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DSBHOK : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PPTRGR2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DSRQBH : 47|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ IBTRGR2 : 45|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSABK2 : 44|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSNOCHG : 41|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DS1F01SM : 55|8@0+ (1,0) [0|0] "" FCM
+
+BO_ 1041 DS12F02: 8 DS1
+ SG_ PCSINDI : 7|2@0+ (1,0) [0|0] "" FCM
+ SG_ PCSWM : 5|2@0+ (1,0) [0|0] "" FCM
+ SG_ PCSFCT : 3|1@0+ (1,0) [0|0] "" FCM
+ SG_ PCSTUCT : 2|1@0+ (1,0) [0|0] "" FCM
+ SG_ DS1LCCK : 1|2@0+ (1,0) [0|0] "" FCM
+ SG_ PBTUCT : 14|1@0+ (1,0) [0|0] "" FCM
+ SG_ PCSEXIST : 13|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSWDUCT : 11|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSWD : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSDW : 39|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSDSRF : 36|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSTEMP : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSDUST : 34|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSLCCK : 33|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSPEDW : 47|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSPVSN : 44|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCTEMP2 : 42|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSDUST2 : 41|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSOFFS : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSWDS : 55|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FRDADJ : 53|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1042 DS12F03: 8 FCM
+ SG_ LKAINDI : 7|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKAWLSL : 5|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKAWLSR : 3|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKAFCT : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKATUCT : 14|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKACAMT : 13|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LDWEXIST : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKASPCND : 23|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKAWTCS : 18|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKASAUT : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LDWBZ : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LDAFCVB : 47|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LDARDA : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SWSSENSD : 45|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SWSSWD : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SWSRAD : 55|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SWSFLD : 53|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SWSBUZ : 50|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1207 ECO1D50: 8 CGW
+ SG_ DRECO01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECO08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 355 ECO1S01: 5 CGW
+ SG_ ECOSTAON : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECOMODE : 18|3@0+ (1,0) [0|0] "" KSS,SCS
+ SG_ FCREQ : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SSVMREQ : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ E2MRXMK : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BPHLDRQ : 36|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BPHLDRQ2 : 35|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECOEGSTP : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 922 ECO1S90: 8 CGW
+ SG_ ECOBZR : 23|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECOLMP : 21|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TESTECO : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OPLMPMSK : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MSTART : 28|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECOMODE3 : 27|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ INFSSCOP : 39|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ INFSSSTL : 36|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECLMP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AUTOSTA : 47|1@0+ (1,0) [0|0] "" SCS
+ SG_ INFSSFAL : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ INFSSINH : 45|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SSACMODE : 52|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ INFSSADV : 50|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1182 ECT1D50: 8 CGW
+ SG_ DRECT01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1183 ECT1D51: 8 CGW
+ SG_ DRECT11 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT12 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT13 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT14 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT15 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT16 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT17 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT18 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1200 ECT1D52: 8 CGW
+ SG_ DRECT21 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT22 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT23 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT24 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT25 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT26 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT27 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT28 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1201 ECT1D53: 8 CGW
+ SG_ DRECT31 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT32 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT33 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT34 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT35 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT36 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT37 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT38 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1202 ECT1D54: 8 CGW
+ SG_ DRECT41 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT42 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT43 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT44 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT45 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT46 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT47 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT48 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1203 ECT1D55: 8 CGW
+ SG_ DRECT51 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT52 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT53 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT54 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT55 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT56 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT57 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRECT58 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 464 ECT1F03: 8 CGW
+ SG_ NT : 7|16@0- (0.390625,0) [0|0] "rpm" Vector__XXX
+ SG_ ACT : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XDMET : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XNTSW : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XNMET : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XRMET : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XPMET : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SFTOUT_S : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ X3MET : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ X2MET : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XLOMET : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ L4SW : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SNOW : 36|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFSFT : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SFTOUT : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HSSLWN : 55|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HSINH : 54|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CLTMODBK : 53|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LUOUT : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LUKG : 50|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FBCOA : 48|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ECTF03SM : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 725 ECT1S10: 2 CGW
+ SG_ VTORATIO : 7|16@0+ (0.0009765625,0) [0|0] "" Vector__XXX
+
+BO_ 956 ECT1S92: 8 CGW
+ SG_ B_OILW : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_OILMD : 5|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_ISNW : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_RJTB : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_WNDL : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_LMULRJ : 14|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_P : 13|1@0+ (1,0) [0|0] "" AFS,CSR,MAV
+ SG_ B_R : 12|1@0+ (1,0) [0|0] "" AFS,BSR,CSR,DS1,FCM,MAV
+ SG_ B_N : 11|1@0+ (1,0) [0|0] "" AFS,CSR,MAV
+ SG_ B_ISPTM : 10|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BV_THOCL : 23|16@0+ (0.625,-50) [0|0] "" Vector__XXX
+ SG_ B_GEAR : 39|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_SMDE : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_D : 47|1@0+ (1,0) [0|0] "" AFS,CSR,DS1,MAV
+ SG_ B_ECOMI : 40|1@0+ (1,0) [0|0] "" DS1
+ SG_ B_SPTMI : 55|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_PWRM : 54|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_OILWM : 51|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_SPTMS : 49|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_DMODE : 61|3@0+ (1,0) [0|0] "" SCS
+
+BO_ 1176 ENG1D50: 8 CGW
+ SG_ DRENG01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1177 ENG1D51: 8 CGW
+ SG_ DRENG11 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG12 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG13 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG14 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG15 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG16 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG17 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG18 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1178 ENG1D52: 8 CGW
+ SG_ DRENG21 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG22 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG23 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG24 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG25 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG26 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG27 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG28 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1179 ENG1D53: 8 CGW
+ SG_ DRENG31 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG32 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG33 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG34 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG35 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG36 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG37 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG38 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1180 ENG1D54: 8 CGW
+ SG_ DRENG41 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG42 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG43 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG44 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG45 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG46 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG47 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG48 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1181 ENG1D55: 8 CGW
+ SG_ DRENG51 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG52 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG53 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG54 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG55 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG56 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG57 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG58 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1192 ENG1D56: 8 CGW
+ SG_ DRENG61 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG62 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG63 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG64 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG65 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG66 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG67 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG68 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1191 ENG1D57: 8 CGW
+ SG_ DRENG71 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG72 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG73 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG74 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG75 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG76 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG77 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG78 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1197 ENG1D58: 8 CGW
+ SG_ DRENG81 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG82 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG83 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG84 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG85 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG86 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG87 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG88 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1198 ENG1D59: 8 CGW
+ SG_ DRENG91 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG92 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG93 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG94 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG95 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG96 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG97 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG98 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1199 ENG1D60: 8 CGW
+ SG_ DRENG101 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG102 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG103 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG104 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG105 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG106 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG107 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRENG108 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1017 ENG1F03: 8 CGW
+ SG_ VARENG1 : 7|4@0+ (1,0) [0|0] "" AFS,SCS
+ SG_ VARENG2 : 3|4@0+ (1,0) [0|0] "" AFS,SCS
+ SG_ VARENG3 : 15|4@0+ (1,0) [0|0] "" AFS,SCS
+ SG_ VARENG4 : 11|1@0+ (1,0) [0|0] "" AFS,SCS
+ SG_ HVFLAG : 10|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,SCS
+ SG_ VARTRM1 : 23|4@0+ (1,0) [0|0] "" AFS,CSR,FCM,MAV,SCS
+ SG_ GEARINF : 19|4@0+ (1,0) [0|0] "" SCS
+ SG_ DVINF : 31|2@0+ (1,0) [0|0] "" AFS,DS1,FCM,SCS
+ SG_ OBDINF : 27|4@0+ (1,0) [0|0] "" BSR,DS1,FCM,SCS
+ SG_ ECOFLAG : 39|1@0+ (1,0) [0|0] "" FCM
+ SG_ CDYMD : 38|2@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ENGF03SM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 452 ENG1F07: 8 CGW
+ SG_ NE1 : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
+ SG_ THA1 : 23|8@0+ (2.5,-40) [0|0] "" Vector__XXX
+ SG_ THWX : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGF : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ T2ERXF : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ T2ERXMK : 28|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ASTEFI : 27|1@0+ (1,0) [0|0] "" AFS
+ SG_ B2ERXMK : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PDLF : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENTCAL2 : 39|8@0+ (12.5,0) [0|0] "rpm" Vector__XXX
+ SG_ EGFB : 46|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ PTFB : 45|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MILREQ : 43|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_ECOL : 55|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_IECOCR : 53|6@0+ (2,0) [0|0] "" Vector__XXX
+ SG_ ENGF07SM : 63|8@0+ (1,0) [0|0] "" AFS,DS1,FCM
+
+BO_ 114 ENG1F43: 5 CGW
+ SG_ FAVLMCHL : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FAVLMONL : 23|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ ENGF43SM : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 705 ENG1S01: 8 CGW
+ SG_ ETCSFB : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ETCSF : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSCTH : 5|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ THF : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ IDL1 : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XCCACT2 : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STPSWF : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WTC : 0|1@0+ (1,0) [0|0] "" KSS,SCS
+ SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" Vector__XXX
+ SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS
+ SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" Vector__XXX
+ SG_ EACCP : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM
+ SG_ ENG01SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 961 ENG1S23: 3 CGW
+ SG_ EKLSM : 7|8@0+ (0.625,0) [0|0] "%" Vector__XXX
+ SG_ GATHW : 15|16@0- (0.625,0) [0|0] "" Vector__XXX
+
+BO_ 979 ENG1S28: 2 CGW
+ SG_ B_FC : 7|16@0+ (0.0005,0) [0|0] "ml" Vector__XXX
+
+BO_ 1408 ENG1S51: 8 CGW
+ SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1409 ENG1S52: 8 CGW
+ SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1410 ENG1S54: 8 CGW
+ SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VC : 52|5@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TES : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 955 ENG1S92: 8 CGW
+ SG_ B_ST : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_TC : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_GLOW : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_STPE : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_OMWI : 15|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_SILUP : 13|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_SILDN : 12|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_WSTP : 11|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_LOUT : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_OILPL : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_TMP : 23|8@0+ (0.5,0) [0|0] "" Vector__XXX
+ SG_ OGENETCS : 30|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_DPFW : 28|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BOSLAMP : 37|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BOSMINF : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GOSLAMP : 45|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GOSMINF : 42|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 921 ENG1S95: 8 CGW
+ SG_ B_LLSP2 : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TLSTBZ : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_ASLBZ2 : 5|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_SPU2 : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACASID1 : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACASID2 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_LSP2 : 31|8@0+ (1,0) [0|0] "km/h Emph" Vector__XXX
+ SG_ B_ASLSP2 : 39|8@0+ (1,0) [0|0] "km/h Emph" Vector__XXX
+ SG_ CACCTRN : 47|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCINF : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCFR2 : 45|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCFR1 : 44|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCFLD : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCCM3 : 42|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCCM2 : 41|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CACCCM1 : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 238 ENG2F01: 4 CGW
+ SG_ STOFOK : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GROWIND : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_TMP3 : 15|8@0+ (0.5,0) [0|0] "" Vector__XXX
+ SG_ IMMINJST : 23|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 466 ENG2F04: 8 CGW
+ SG_ XLDR : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ XACCACTV : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XACCACT : 5|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ XPAIDLV : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ XPAIDL : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ BHOK : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RQBH : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCSTAT : 15|3@0+ (1,0) [0|0] "" DS1
+ SG_ ACCSTBK : 12|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STPBZ : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ PLOCKF : 8|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ACCREQ : 23|16@0- (0.0009765625,0) [0|0] "m/s^2" DS1
+ SG_ ACCAVL : 39|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ SPDSTAT : 55|4@0+ (1,0) [0|0] "" DS1
+ SG_ SSTOK : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CANREQ : 49|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FCACT : 48|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SM1D2 : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 467 ENG2F05: 8 CGW
+ SG_ LCCW2 : 4|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ WSTL2 : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ LCCHK : 2|3@0+ (1,0) [0|0] "" DS1
+ SG_ XCCOK2 : 15|1@0+ (1,0) [0|0] "" DS1
+ SG_ SLTACC : 14|2@0+ (1,0) [0|0] "" DS1
+ SG_ LTME2 : 12|2@0+ (1,0) [0|0] "" DS1
+ SG_ STPSWF2 : 10|1@0+ (1,0) [0|0] "" DS1
+ SG_ CCSF : 9|1@0+ (1,0) [0|0] "" DS1
+ SG_ CCSNG : 8|1@0+ (1,0) [0|0] "" DS1
+ SG_ VM : 23|16@0+ (0.00390625,0) [0|0] "km/h" DS1
+ SG_ INTG : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ D2PRXMK : 47|1@0+ (1,0) [0|0] "" DS1
+ SG_ SM1D3 : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 119 ENG2F41: 6 CGW
+ SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX
+ SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 120 ENG2F42: 4 CGW
+ SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 916 EPS1S90: 1 CGW
+ SG_ B_WPS0 : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1235 FCM1N01: 8 FCM
+ SG_ FCMNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ FCMSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ FCMSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ FCMREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 1161 FCM1S10: 8 FCM
+ SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1162 FCM1S11: 8 FCM
+ SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1163 FCM1S12: 8 FCM
+ SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" Vector__XXX
+ SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" Vector__XXX
+ SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" Vector__XXX
+ SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1279 FRD1N01: 8 FRD
+ SG_ FRDNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ FRDSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ FRDSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ FRDREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 737 FWM1S01: 2 CGW
+ SG_ ACTHLF : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MOT4WD : 6|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CCANCEL : 5|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AI4WD : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LOW4 : 3|1@0+ (1,0) [0|0] "" MAV,SCS
+ SG_ DLOCK : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RDLOCK : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HLN : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ F_SP4WD : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RQ_SP4WD : 14|7@0+ (1,73) [0|0] "km/h" Vector__XXX
+
+BO_ 1082263092 IDT1S03_82: 8 CGW
+ SG_ IDT03_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ IDT03_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CO_IDT : 23|16@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ UACK : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WRT : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RSTP : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1082328629 IDT1S04_83: 8 CGW
+ SG_ IDT04_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ IDT04_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OSID : 47|16@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1257 KSS1N01: 8 KSS
+ SG_ KSSNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ KSSSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ KSSSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ KSSREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 927 KSS1S90: 1 KSS
+ SG_ LKSS0 : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1263 MAV1N01: 8 MAV
+ SG_ MAVNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ MAVSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ MAVSPF : 23|16@0+ (1,0) [0|0] "" CGW
+
+BO_ 1075840528 MET1S01_20: 8 CGW
+ SG_ MET01_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET01_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET_SPD : 23|8@0+ (1,0) [0|0] "km/h" CSR
+ SG_ RHEOSTAT : 30|7@0+ (1,0) [0|0] "%" Vector__XXX
+ SG_ TAIL_CN : 39|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ILL_OF : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ UNIT_TMP : 33|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ IN_FC : 47|16@0+ (0.1,0) [0|0] "Note" Vector__XXX
+ SG_ UNIT_0 : 63|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SP_TL : 60|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET_TC : 56|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075906065 MET1S02_21: 8 CGW
+ SG_ MET02_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET02_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET_DEST : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ODO_UNIT : 29|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OMRS : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ UNIT_CH : 26|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ODO : 39|32@0+ (1,0) [0|0] "km/mile" Vector__XXX
+
+BO_ 1076037145 MET1S04_23: 8 CGW
+ SG_ MET04_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET04_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AF_FC : 23|16@0+ (0.1,0) [0|0] "Note" Vector__XXX
+ SG_ UNIT_3 : 39|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RANGE : 47|16@0+ (1,0) [0|0] "Note" Vector__XXX
+ SG_ UNIT_4 : 63|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1076102682 MET1S05_24: 8 CGW
+ SG_ MET05_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET05_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TO_SP : 23|16@0+ (0.1,0) [0|0] "km/h,MPH" Vector__XXX
+ SG_ UNIT_5 : 39|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TO_FC : 47|16@0+ (0.1,0) [0|0] "MPG Ekm/l El/100km Ekm/gallon" Vector__XXX
+ SG_ UNIT_6 : 63|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1076299282 MET1S08_27: 8 CGW
+ SG_ MET08_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET08_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TO_DT : 23|16@0+ (1,0) [0|0] "km,mile" Vector__XXX
+ SG_ UNIT_10 : 39|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1076364819 MET1S09_28: 8 CGW
+ SG_ MET09_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET09_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WASH : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BLVW : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_CW : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENGW : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ABSW : 28|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSCW : 27|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OPW : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OLW : 36|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LW : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FSRS : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ HALW : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRW : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TIRW : 42|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FWW : 40|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SUSW : 53|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LKAW : 61|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET_PCSW : 59|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ WTPW : 57|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1076430356 MET1S10_29: 8 CGW
+ SG_ MET10_ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ MET10_IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ OM_MLG : 23|7@0+ (100,0) [0|0] "miles" Vector__XXX
+ SG_ PR_OM_FL : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TNS : 29|2@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM
+ SG_ HZS : 27|1@0+ (1,0) [0|0] "" AFS,FCM
+
+BO_ 1076495893 MET1S11_2A: 8 CGW
+ SG_ MET11_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET11_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ UNIT_CH2 : 23|2@0+ (1,0) [0|0] "" FCM
+ SG_ TOLER_A : 21|6@0+ (0.002,0.94) [0|0] "" FCM
+ SG_ CDISP_EX : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TOLER_B : 29|6@0- (0.2,0) [0|0] "km/h" FCM
+ SG_ TRIP_B : 39|32@0+ (0.1,0) [0|0] "km/MILE" Vector__XXX
+
+BO_ 1076561430 MET1S12_2B: 8 CGW
+ SG_ MET12_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MET12_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ESLW : 19|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CSOW : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LHLW : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SMBW : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ KDSW : 32|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OMRW : 46|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BSDW : 54|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MTSW : 48|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ATSW : 63|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 992 MET1S18: 8 CGW
+ SG_ M_LANG : 7|6@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNG_ST : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB1 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB2 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB3 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB4 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB5 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB6 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ M_LNGDB7 : 63|7@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1075840755 MET1S22_20: 8 CGW
+ SG_ ID6F320 : 7|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ IF6F320 : 15|8@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSR_OSM : 22|2@0+ (1,0) [0|0] "" FCM
+ SG_ TSR_OSL : 20|2@0+ (1,0) [0|0] "" FCM
+ SG_ TSR_SNM : 18|2@0+ (1,0) [0|0] "" FCM
+ SG_ TSR_MAIN : 16|1@0+ (1,0) [0|0] "" FCM
+ SG_ LDAMCUS : 31|2@0+ (1,0) [0|0] "" FCM
+ SG_ LDAMSW : 29|2@0+ (1,0) [0|0] "" FCM
+ SG_ FCMUSER : 27|1@0+ (1,0) [0|0] "" FCM
+ SG_ FCMMCUS : 26|2@0+ (1,0) [0|0] "" FCM
+ SG_ FCMMSW : 24|1@0+ (1,0) [0|0] "" FCM
+ SG_ BSMMSW : 37|1@0+ (1,0) [0|0] "" BSR
+ SG_ CSRMSW : 34|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSMCUS : 41|1@0+ (1,0) [0|0] "" DS1
+ SG_ PCSMSW : 40|1@0+ (1,0) [0|0] "" DS1
+ SG_ LKACTCSW : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LDA_SFB : 50|3@0+ (1,0) [0|0] "" FCM
+
+BO_ 1088685760 PMN1F03_E4: 8 CGW
+ SG_ PMNF03ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PMNF03IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSSW_PMN : 17|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSW_PMN : 31|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ KCC_PMN : 29|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PMOD_PMN : 27|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ MOD_EIG : 39|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SWBZ_EIG : 36|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1193 SCS1D50: 8 SCS
+ SG_ DRSCS01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DRSCS08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1226 SCS1N01: 8 SCS
+ SG_ SCSNID : 7|8@0+ (1,0) [0|0] "" CGW
+ SG_ SCSSNG : 15|1@0+ (1,0) [0|0] "" CGW
+ SG_ SCSSPF : 23|16@0+ (1,0) [0|0] "" CGW
+ SG_ SCSREV : 39|32@0+ (1,0) [0|0] "" CGW
+
+BO_ 744 SCS1S01: 8 SCS
+ SG_ SELECTOR : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVS_MD : 63|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 815 SCS1S06: 5 SCS
+ SG_ RRVH : 23|8@0- (1,0) [0|0] "mm" AFS
+ SG_ RLVH : 31|8@0- (1,0) [0|0] "mm" AFS
+ SG_ SCECOINH : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 917 SCS1S90: 4 SCS
+ SG_ B_LSUS6 : 7|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_LSUS4 : 5|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_LSUS2 : 3|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_LSUS8 : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ DLR_HSID : 23|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LAR_HS : 18|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVSNI : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 37 STR1S01: 8 CGW
+ SG_ STS3 : 7|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,MAV
+ SG_ STS2 : 6|1@0+ (1,0) [0|0] "" AFS,DS1,FCM,KSS,MAV,SCS
+ SG_ STS1 : 5|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,KSS,MAV,SCS
+ SG_ STS0 : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SSA : 3|12@0- (1.5,0) [0|0] "deg" AFS,BSR,DS1,FCM,KSS,MAV,SCS
+ SG_ SAZS : 23|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM
+ SG_ SFRZ : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ SSAZ : 19|12@0- (1.5,0) [0|0] "deg" AFS,BSR,DS1,FCM
+ SG_ SSAS : 39|4@0- (0.1,0) [0|0] "deg" FCM,KSS,SCS
+ SG_ SSAV : 35|12@0- (1,0) [0|0] "deg/s" FCM,KSS,SCS
+ SG_ STDID : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STR01SUM : 63|8@0+ (1,0) [0|0] "" AFS,DS1,FCM,MAV
+
+BO_ 1059 STR1S02: 1 CGW
+ SG_ SFR : 5|1@0+ (1,0) [0|0] "" MAV
+ SG_ STRWVG : 4|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM
+
+BO_ 170 VSC1F01: 8 CGW
+ SG_ VXFREF : 7|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
+ SG_ VXFR : 6|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
+ SG_ VXFLEF : 23|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
+ SG_ VXFL : 22|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
+ SG_ VXRREF : 39|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
+ SG_ VXRR : 38|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
+ SG_ VXRLEF : 55|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
+ SG_ VXRL : 54|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
+
+BO_ 426 VSC1F02: 6 CGW
+ SG_ VXFRF : 7|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
+ SG_ VXFRIGS : 6|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
+ SG_ VXFRHDS : 5|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
+ SG_ VXFLF : 2|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
+ SG_ VXFLIGS : 1|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
+ SG_ VXFLHDS : 0|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
+ SG_ VXRRF : 13|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
+ SG_ VXRRIGS : 12|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
+ SG_ VXRRHDS : 11|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
+ SG_ VXRLF : 8|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
+ SG_ VXRLIGS : 23|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
+ SG_ VXRLHDS : 22|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
+ SG_ VSCF02SM : 47|8@0+ (1,0) [0|0] "" AFS,DS1,FCM,MAV
+
+BO_ 550 VSC1F06: 8 CGW
+ SG_ VSCF01FG : 7|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AHCURQ : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PMCF : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ PMCS : 2|1@0+ (1,0) [0|0] "" DS1
+ SG_ PMC : 1|10@0+ (0.02,0) [0|0] "Mpa" DS1
+ SG_ ECOEN : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ CCS : 22|1@0+ (1,0) [0|0] "" DS1
+ SG_ FBA : 21|1@0+ (1,0) [0|0] "" DS1
+ SG_ TRBRKSYS : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TS : 38|1@0+ (1,0) [0|0] "" KSS,SCS
+ SG_ WSTP : 37|1@0+ (1,0) [0|0] "" DS1,KSS,SCS
+ SG_ VSCACT : 36|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BAEX : 35|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TEM : 34|3@0+ (1,0) [0|0] "" SCS
+ SG_ FSTP : 60|1@0+ (1,0) [0|0] "" DS1
+ SG_ ABSACT : 59|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 180 VSC1S03: 8 CGW
+ SG_ SP1P : 39|6@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ SP1S : 33|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
+ SG_ SP1 : 47|16@0- (0.01,0) [0|0] "km/h" BSR,DS1,FCM,MAV
+ SG_ VSC03SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 800 VSC1S07: 8 CGW
+ SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1
+ SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1
+ SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1
+ SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1
+ SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1
+ SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1
+ SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 1056 VSC1S08: 8 CGW
+ SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 186 VSC1S12: 4 CGW
+ SG_ HAC2ESRQ : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FHACHOLD : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSC12SUM : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 562 VSC1S14: 6 CGW
+ SG_ VWPSUMFR : 7|8@0+ (1,0) [0|0] "" MAV
+ SG_ VWPSUMFL : 15|8@0+ (1,0) [0|0] "" MAV
+ SG_ VWPFRPM : 23|1@0+ (1,0) [0|0] "" MAV
+ SG_ VWPFLPM : 22|1@0+ (1,0) [0|0] "" MAV
+ SG_ S14CNT : 21|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VWPFRPMS : 18|1@0+ (1,0) [0|0] "" MAV
+ SG_ VWPFLPMS : 17|1@0+ (1,0) [0|0] "" MAV
+ SG_ VWPSUMRR : 31|8@0+ (1,0) [0|0] "" MAV
+ SG_ VWPSUMRL : 39|8@0+ (1,0) [0|0] "" MAV
+ SG_ VSC14SUM : 47|8@0+ (1,0) [0|0] "" MAV
+
+BO_ 552 VSC1S29: 4 CGW
+ SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1
+ SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1
+
+BO_ 1168 VSC1S92: 1 CGW
+ SG_ C_DCMOD1 : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_DCMOD2 : 6|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_DCMOD3 : 3|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 951 VSC1S95: 8 CGW
+ SG_ B_BRKW : 7|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_ABS : 5|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_BRLV : 14|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRCOFF : 13|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ VSCOFF : 12|2@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ SLP_WL : 10|3@0+ (1,0) [0|0] "" MAV
+ SG_ B_MCST : 19|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_BUZZER : 31|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_ALSD : 27|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_DACIND : 25|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ OGENVSC : 37|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_ATRC : 47|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_STRC : 46|3@0+ (1,0) [0|0] "" MAV
+ SG_ B_HZD : 43|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSCSWIH : 51|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STRCDISP : 50|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ STRCDSP2 : 60|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSCEXIST : 59|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1063 VSC1S96: 8 CGW
+ SG_ MTS_DISP : 5|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ B_MTS : 1|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRCCONRL : 11|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRCCONRR : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRCCONFL : 9|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRCCONFR : 8|1@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 545 VSC2F05: 5 CGW
+ SG_ TQER : 7|16@0- (0.03125,0) [0|0] "Nm" Vector__XXX
+ SG_ REQC : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ REQ2 : 22|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ REQ1 : 21|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AIDWI : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ RTD : 19|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ LOMUSFT : 31|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSC2F05S : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 544 VSC2F07: 4 CGW
+ SG_ FSROT : 7|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRK2 : 4|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRK1 : 3|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FCNG : 1|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TSLP : 0|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ TRCACT : 15|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ABSSLP : 14|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VDMACT : 13|1@0+ (1,0) [0|0] "" FCM
+ SG_ DAC_CND : 9|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ VSC2F07S : 31|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 36 YGS1S03: 8 CGW
+ SG_ YRS11S : 7|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRS14S : 6|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRS21S : 5|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRS24S : 4|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YGS1 : 3|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YGS0 : 2|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR : 1|10@0+ (0.244,-125) [0|0] "deg/sec" DS1,FCM,MAV
+ SG_ YR_CPUMN : 23|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GS4S : 19|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ GS1S : 18|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ GL1X : 17|10@0+ (0.03589,-18.375) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YG_ID : 39|4@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GS5S : 35|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ GS2S : 34|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Y : 33|10@0+ (0.03589,-18.375) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YR_DIF : 55|8@0+ (0.244,-31) [0|0] "deg/sec" DS1,FCM,MAV
+ SG_ YGS03SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 1073743490 YGW1S01_0: 8 CGW
+ SG_ YGW01_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YGW01_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_STSW : 22|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_EGST : 20|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_DRLK : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_KLEG : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_HZRD : 26|3@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1073743491 YGW1S02_0: 8 CGW
+ SG_ YGW02_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YGW02_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_DEFOG : 19|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YR_ARCON : 17|2@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1073743494 YGW1S05_0: 8 CGW
+ SG_ YGW05_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YGW05_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YI_IMO_E : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YI_UREQ : 16|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ YI_RE : 47|16@0+ (1,0) [0|0] "" Vector__XXX
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_adas.dbc b/iqdbc_repo/iqdbc/dbc/toyota_adas.dbc
new file mode 100644
index 000000000..4aae65aa4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_adas.dbc
@@ -0,0 +1,276 @@
+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
+
+BO_ 528 TRACK_A_0: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 529 TRACK_A_1: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 530 TRACK_A_2: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 531 TRACK_A_3: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 532 TRACK_A_4: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 533 TRACK_A_5: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 534 TRACK_A_6: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 535 TRACK_A_7: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 536 TRACK_A_8: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 537 TRACK_A_9: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 538 TRACK_A_10: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 539 TRACK_A_11: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 540 TRACK_A_12: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 541 TRACK_A_13: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 542 TRACK_A_14: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 543 TRACK_A_15: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 544 TRACK_B_0: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 545 TRACK_B_1: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 546 TRACK_B_2: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 547 TRACK_B_3: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 548 TRACK_B_4: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 549 TRACK_B_5: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 550 TRACK_B_6: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 551 TRACK_B_7: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 552 TRACK_B_8: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 553 TRACK_B_9: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 554 TRACK_B_10: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 555 TRACK_B_11: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 556 TRACK_B_12: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 557 TRACK_B_13: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 558 TRACK_B_14: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 559 TRACK_B_15: 6 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_iQ_2009_can.dbc b/iqdbc_repo/iqdbc/dbc/toyota_iQ_2009_can.dbc
new file mode 100644
index 000000000..2213e1ade
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_iQ_2009_can.dbc
@@ -0,0 +1,196 @@
+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
+
+BO_ 1552 CONTAINS_LRES_SPEED: 8 XXX
+ SG_ SPEED_LOWRES : 16|8@1+ (1,0) [0|255] "km/h?" XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 452 ENGINE: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "rpm" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIFFERENT_EACH_RIDE : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ A_DECREASING_VALUE : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 37 STEERING: 8 XXX
+ SG_ STEER_DIRECTION : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 42|2@0- (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 44|2@0- (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 46|2@0- (1,0) [0|3] "" XXX
+ SG_ STEER_ANGLE : 2|11@0- (1,0) [-350|350] "" XXX
+
+BO_ 36 ACCELERATIONS: 8 XXX
+ SG_ ACC_LAT_CLEAN : 2|11@0- (1,0) [0|255] "" XXX
+ SG_ ACC_LATERAL : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ ACC_FRONT_BACK_1 : 31|8@0- (1,0) [0|255] "" XXX
+ SG_ ACC_FRONT_BACK_2 : 47|8@0- (1,0) [0|255] "" XXX
+
+BO_ 947 LOW_RES_INDICATORS: 8 XXX
+ SG_ LOW_RES_ACC_PEDAL : 23|7@0+ (1,0) [0|63] "" XXX
+ SG_ LOW_RES_RPM : 7|16@0+ (1,0) [0|255] "rpm" XXX
+
+BO_ 955 BRAKING_PLUS_OTHER: 8 XXX
+ SG_ IS_BRAKING_2 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENGINE_TEMPERATURE : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ MAYBE_CLUTCH : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1595 CONTAINS_TIME: 8 XXX
+ SG_ TIME_ON : 55|16@0+ (0.1,0) [0|65535] "s" XXX
+ SG_ BETWEEN_RIDES : 7|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 170 WHEELS_SPEEDS: 8 XXX
+ SG_ FRONT_LEFT_WHEEL_SPEED : 23|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX
+ SG_ REAR_RIGHT_WHEEL_SPEED : 39|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX
+ SG_ REAR_LEFT_WHEEL_SPEED : 55|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX
+ SG_ FRONT_RIGHT_WHEEL_SPEED : 7|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX
+
+BO_ 180 VEHICLE_DYNAMICS: 8 XXX
+ SG_ WIERD_STUFF : 8|2@1+ (1,0) [0|3] "" XXX
+ SG_ VEHICLE_SPEED : 47|16@0+ (0.01,0) [0|255] "km/h" XXX
+ SG_ SPEED_MOD_256 : 63|8@0- (1,0) [0|255] "" XXX
+ SG_ MAYBE_DISTANCE_MOD_256 : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 186 NEW_MSG_9: 8 XXX
+ SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 426 NEW_MSG_5: 8 XXX
+ SG_ CONSTANT : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 906 BOOLS: 8 XXX
+ SG_ MAY_CONTAIN_LIGHTS : 7|4@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_1 : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ MOVEMENT_START_TRIGGER : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 979 LOW_RES_ACCELERATOR: 8 XXX
+ SG_ VERY_LRES_ACC : 7|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 1600 SLOW_VARIABLE_INFOS: 8 XXX
+ SG_ CHANGES_EACH_RIDE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ INCREASING_VALUE_FUEL : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1568 DOORS: 8 XXX
+ SG_ KEY_ACC : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ KEY_ON : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ KEY_INSERT : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ NOT_ON : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_RIGHT : 44|1@0+ (1,0) [0|3] "" XXX
+ SG_ DOOR_TRUNK : 41|1@1+ (1,0) [0|3] "" XXX
+ SG_ DOOR_LEFT : 45|1@0+ (1,0) [0|255] "" XXX
+ SG_ HANDBRAKE : 60|1@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_1 : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVER_SEATBELT : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ TRIGGER_BOOL : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 705 COMMAND: 8 XXX
+ SG_ NOT_ACCELERATING_PEDAL : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_PEDAL_SENSOR : 55|16@0+ (1,0) [0|65535] "" XXX
+ SG_ ACC_COMMAND : 31|16@0- (1,0) [0|7] "" XXX
+ SG_ ACC_PEDAL_MEAN : 15|16@0- (1,0) [0|255] "" XXX
+ SG_ NEGATIVE_COMMAND_OFFSET : 47|8@0- (1,0) [0|255] "" XXX
+
+BO_ 928 STEER2_MAYBE: 8 XXX
+ SG_ NEW_SIGNAL_1 : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 60|5@0+ (1,0) [0|31] "" XXX
+ SG_ NEW_SIGNAL_4 : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 46|7@0+ (1,0) [0|15] "" XXX
+
+BO_ 896 LONG_TERM_2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 944 LONG_TERM_MSG: 8 XXX
+ SG_ LONG_TERM_SIGN : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1553 TOTAL_DIST: 8 XXX
+ SG_ TOTAL_DISTANCE : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 1572 WHY_THESE_VALUES: 8 XXX
+
+BO_ 1555 BETWEEN_RIDES_CHANGE_1: 8 XXX
+ SG_ BETWEEN_RIDES : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1090 ASYNC_MSG_ACK: 8 XXX
+ SG_ NEW_SIGNAL_1 : 13|2@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1592 NEW_MSG_14: 8 XXX
+ SG_ DOORS_LOCKED2 : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOORS_LOCKED1 : 16|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 608 NEW_MSG_6: 8 XXX
+ SG_ VERY_SMALL_SIGNAL2 : 56|1@0+ (1,0) [0|255] "" XXX
+ SG_ VERY_SMALL_SIGNAL1 : 0|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 945 BETWEEN_RIDES_CHANGES_2: 8 XXX
+ SG_ BETWEEN_RIDES : 24|1@0+ (1,0) [0|65535] "" XXX
+
+
+
+
+CM_ SG_ 1552 SPEED_LOWRES "Negative values to check";
+CM_ SG_ 452 CHECKSUM "Follows path of RPMs but more precise & 1 byte only";
+CM_ SG_ 452 A_DECREASING_VALUE "stabilizes to 62 after ~10 mins";
+CM_ SG_ 37 STEER_DIRECTION "Could be intended as 12 bit steering angle";
+CM_ SG_ 37 STEER_ANGLE "can convert to degrees (imprecise) or percentage of max amplitude";
+CM_ SG_ 36 ACC_FRONT_BACK_1 "more likely up-down";
+CM_ SG_ 36 ACC_FRONT_BACK_2 "more likely front-back";
+CM_ SG_ 947 LOW_RES_ACC_PEDAL "Follows rather closely other acceleration commands";
+CM_ SG_ 947 LOW_RES_RPM "Maybe used for onboard display?";
+CM_ SG_ 955 MAYBE_CLUTCH "might be related to shifting gears";
+CM_ SG_ 1595 TIME_ON "Time since last ignition, tenth of seconds";
+CM_ SG_ 1595 BETWEEN_RIDES "the fourth byte (at least) changes between rides";
+CM_ SG_ 180 WIERD_STUFF "Might be a signed value on the whole two bytes (sometimes all set)";
+CM_ SG_ 180 VEHICLE_SPEED "Roughly 2 seconds before wheel speeds";
+CM_ SG_ 180 SPEED_MOD_256 "One byte speed, a bit before vehicle speed";
+CM_ SG_ 180 MAYBE_DISTANCE_MOD_256 "Looks like measure for distance or wheel angle";
+CM_ SG_ 906 MOVEMENT_START_TRIGGER "trigger of when speed becomes != 0";
+CM_ SG_ 979 VERY_LRES_ACC "Power used by engine? moves alongside speed, very low res, goes from 0 to 9 max?";
+CM_ SG_ 1600 CHANGES_EACH_RIDE "Small decrementation during some rides, possibly long term fuel";
+CM_ SG_ 1600 INCREASING_VALUE_FUEL "Fuel/distance? Average fuel consumption?";
+CM_ SG_ 705 NOT_ACCELERATING_PEDAL "Looks like opposite of accelerating bit";
+CM_ SG_ 705 ACC_PEDAL_SENSOR "similar to pedal sensor maybe checksum.";
+CM_ SG_ 705 ACC_COMMAND "Similar to other pedal indicator., cleaner, must be sent back to engine";
+CM_ SG_ 705 ACC_PEDAL_MEAN "Actual sensor for pedal (works when engine off)";
+CM_ SG_ 705 NEGATIVE_COMMAND_OFFSET "Mysterious for now";
+CM_ SG_ 928 NEW_SIGNAL_1 "Very slow changing noisy value, 45-49 in 10 min";
+CM_ SG_ 928 NEW_SIGNAL_2 "Other very slow changing 24-26 in 10 min";
+CM_ SG_ 928 NEW_SIGNAL_4 "Inconsistent across rides";
+CM_ SG_ 896 NEW_SIGNAL_1 "there is a difference at the beginning of 2017-10-31--12-04-05";
+CM_ SG_ 1553 TOTAL_DISTANCE "Probably also contains the previous/two previous bytes but can't confirm";
+CM_ SG_ 945 BETWEEN_RIDES "Might be others in the same message. at least this one";
+
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_new_mc_pt_generated.dbc b/iqdbc_repo/iqdbc/dbc/toyota_new_mc_pt_generated.dbc
new file mode 100644
index 000000000..1c8eaaf09
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_new_mc_pt_generated.dbc
@@ -0,0 +1,688 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
+
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX
+ SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX
+
+CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss";
+
+BO_ 767 SDSU: 8 XXX
+ SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX
+
+CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu";
+CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
+
+VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _toyota_2017.dbc starts here";
+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 DSU HCU EPS IPAS CGW BGM
+
+BO_ 36 KINEMATICS: 8 XXX
+ SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+ SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX
+ SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+
+BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
+ SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
+ SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
+ SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
+
+BO_ 119 ENG2F41: 6 CGW
+ SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX
+ SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 120 ENG2F42: 4 CGW
+ SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X
+ SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 166 BRAKE: 8 XXX
+ SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
+
+BO_ 170 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+
+BO_ 180 SPEED: 8 XXX
+ SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 295 GEAR_PACKET_HYBRID: 8 XXX
+ SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX
+ SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 353 DSU_SPEED: 7 XXX
+ SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
+
+BO_ 452 ENGINE_RPM: 8 CGW
+ SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
+ SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 467 PCM_CRUISE_2: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 552 VSC1S29: 4 CGW
+ SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1
+ SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1
+
+BO_ 560 BRAKE_2: 7 XXX
+ SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 581 GAS_PEDAL_HYBRID: 8 XXX
+ SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
+
+BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 614 STEERING_IPAS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 742 LEAD_INFO: 8 DSU
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
+ SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
+ SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
+
+BO_ 800 VSC1S07: 8 CGW
+ SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1
+ SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1
+ SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1
+ SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1
+ SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1
+ SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1
+ SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 835 ACC_CONTROL: 8 DSU
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX
+ SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
+ SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
+ SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
+ SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
+ SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
+ SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 865 CLUTCH: 8 XXX
+ SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX
+
+BO_ 869 DSU_CRUISE : 7 DSU
+ SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
+
+BO_ 898 AIR_CONDITIONER: 8 XXX
+ SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX
+ SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 921 PCM_CRUISE_SM: 8 XXX
+ SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 944 AIR_CONDITIONER_2: 8 XXX
+ SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 951 ESP_CONTROL: 8 ESP
+ SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 956 GEAR_PACKET: 8 XXX
+ SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM
+ SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX
+
+BO_ 1009 PCM_CRUISE_ALT: 8 XXX
+ SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+
+BO_ 1020 SOLAR_SENSOR: 8 XXX
+ SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX
+
+BO_ 1041 PCS_HUD: 8 DSU
+ SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 LKAS_HUD: 8 DSU
+ SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX
+ SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 TIME : 8 CGW
+ SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
+ SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
+ SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
+ SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
+ SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
+ SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
+ SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
+ SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1044 AUTO_HIGH_BEAM: 8 FCM
+ SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+ SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1056 VSC1S08: 8 CGW
+ SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 1083 AUTOPARK_STATUS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1161 RSA1: 8 FCM
+ SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1162 RSA2: 8 FCM
+ SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1163 RSA3: 8 FCM
+ SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
+ SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1408 VIN_PART_1: 8 CGW
+ SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1409 VIN_PART_2: 8 CGW
+ SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1410 VIN_PART_3: 8 CGW
+ SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX
+ SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX
+ SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX
+
+BO_ 1553 UI_SETTING: 8 XXX
+ SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX
+
+BO_ 1556 BLINKERS_STATE: 8 XXX
+ SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1568 BODY_CONTROL_STATE: 8 XXX
+ SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1570 LIGHT_STALK: 8 SCM
+ SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1571 CERTIFICATION_ECU: 8 CGW
+ SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1592 DOOR_LOCKS: 8 XXX
+ SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX
+ SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM
+ SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 36 YAW_RATE "verify";
+CM_ SG_ 36 ACCEL_X "x-axis accel";
+CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
+CM_ SG_ 37 STEER_RATE "factor is tbd";
+CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking";
+CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command";
+CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking";
+CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
+CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect";
+CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
+CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
+CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered";
+CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
+CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
+CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
+CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok";
+CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD";
+CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
+CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
+CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
+CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
+CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
+CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
+CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
+CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
+CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
+CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
+CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force";
+CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
+CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs";
+CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
+CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
+CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
+CM_ SG_ 956 GEAR "on 6MT, only R shows.";
+CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to";
+CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator";
+CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity";
+CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual";
+CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor";
+CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature";
+CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual";
+CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM";
+CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle";
+CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0";
+CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity";
+CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message";
+CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning";
+CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1";
+CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages";
+CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1";
+CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning";
+CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch";
+CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered";
+CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled";
+CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS";
+CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations";
+CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations";
+CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero";
+CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
+CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1161 SPDVAL2 "conditional speed value 70";
+CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
+CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1163 TSREQPD "always 1";
+CM_ SG_ 1163 TSRMSW "always 1";
+CM_ SG_ 1163 OTSGNNTM "always 3";
+CM_ SG_ 1163 NTLVLSPD "always 3";
+CM_ SG_ 1163 OVSPNTM "always 3";
+CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
+CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
+CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
+CM_ SG_ 1163 TSRSPU "always 1";
+CM_ SG_ 1552 UI_SPEED "Does not appear to match dash";
+CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting";
+CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
+CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking";
+CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal.";
+CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch";
+
+VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B";
+VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
+VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 614 STATE 3 "enabled" 1 "disabled";
+VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
+VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
+VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok";
+VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear";
+VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press";
+VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released";
+VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF";
+VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF";
+VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
+VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far";
+VAL_ 956 SPORT_ON 0 "off" 1 "on";
+VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
+VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on";
+VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6";
+VAL_ 956 ECON_ON 0 "off" 1 "on";
+VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on";
+VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on";
+VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines";
+VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled";
+VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off";
+VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
+VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none";
+VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LKAS_STATUS 1 "on" 0 "off";
+VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear";
+VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on";
+VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined";
+VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok";
+VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok";
+VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok";
+VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok";
+VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok";
+VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
+VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
+VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
+VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on";
+VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed";
+VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)";
+VAL_ 1553 UNITS 1 "km" 2 "miles";
+VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
+VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed";
+VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights";
+VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
+
+
+CM_ "Imported file _toyota_adas_standard.dbc starts here";
+BO_ 466 PCM_CRUISE: 8 XXX
+ SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX
+ SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX
+ SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 7 DSU
+ SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
+ SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
+ SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 705 GAS_PEDAL: 8 XXX
+ SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX
+ SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS
+ SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX
+ SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 740 STEERING_LKA: 5 XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 836 PRE_COLLISION_2: 8 DSU
+ SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
+ SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
+ SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
+ SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input";
+CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command";
+CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground";
+CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
+CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
+
+VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
+VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
+
+CM_ "toyota_new_mc_pt.dbc starts here";
+
+BO_ 548 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 43|12@0+ (1,0) [0|4047] "" XXX
+ SG_ BRAKE_PRESSED : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 610 EPS_STATUS: 5 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1178 BRAKE_RELATED: 8 XXX
+ SG_ BRAKE_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_nodsu_pt_generated.dbc b/iqdbc_repo/iqdbc/dbc/toyota_nodsu_pt_generated.dbc
new file mode 100644
index 000000000..84cf63790
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_nodsu_pt_generated.dbc
@@ -0,0 +1,745 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
+
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX
+ SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX
+
+CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss";
+
+BO_ 767 SDSU: 8 XXX
+ SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX
+
+CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu";
+CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
+
+VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _toyota_2017.dbc starts here";
+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 DSU HCU EPS IPAS CGW BGM
+
+BO_ 36 KINEMATICS: 8 XXX
+ SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+ SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX
+ SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+
+BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
+ SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
+ SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
+ SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
+
+BO_ 119 ENG2F41: 6 CGW
+ SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX
+ SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 120 ENG2F42: 4 CGW
+ SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X
+ SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 166 BRAKE: 8 XXX
+ SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
+
+BO_ 170 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+
+BO_ 180 SPEED: 8 XXX
+ SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 295 GEAR_PACKET_HYBRID: 8 XXX
+ SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX
+ SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 353 DSU_SPEED: 7 XXX
+ SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
+
+BO_ 452 ENGINE_RPM: 8 CGW
+ SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
+ SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 467 PCM_CRUISE_2: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 552 VSC1S29: 4 CGW
+ SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1
+ SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1
+
+BO_ 560 BRAKE_2: 7 XXX
+ SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 581 GAS_PEDAL_HYBRID: 8 XXX
+ SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
+
+BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 614 STEERING_IPAS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 742 LEAD_INFO: 8 DSU
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
+ SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
+ SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
+
+BO_ 800 VSC1S07: 8 CGW
+ SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1
+ SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1
+ SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1
+ SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1
+ SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1
+ SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1
+ SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 835 ACC_CONTROL: 8 DSU
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX
+ SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
+ SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
+ SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
+ SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
+ SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
+ SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 865 CLUTCH: 8 XXX
+ SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX
+
+BO_ 869 DSU_CRUISE : 7 DSU
+ SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
+
+BO_ 898 AIR_CONDITIONER: 8 XXX
+ SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX
+ SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 921 PCM_CRUISE_SM: 8 XXX
+ SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 944 AIR_CONDITIONER_2: 8 XXX
+ SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 951 ESP_CONTROL: 8 ESP
+ SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 956 GEAR_PACKET: 8 XXX
+ SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM
+ SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX
+
+BO_ 1009 PCM_CRUISE_ALT: 8 XXX
+ SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+
+BO_ 1020 SOLAR_SENSOR: 8 XXX
+ SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX
+
+BO_ 1041 PCS_HUD: 8 DSU
+ SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 LKAS_HUD: 8 DSU
+ SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX
+ SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 TIME : 8 CGW
+ SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
+ SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
+ SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
+ SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
+ SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
+ SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
+ SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
+ SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1044 AUTO_HIGH_BEAM: 8 FCM
+ SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+ SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1056 VSC1S08: 8 CGW
+ SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 1083 AUTOPARK_STATUS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1161 RSA1: 8 FCM
+ SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1162 RSA2: 8 FCM
+ SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1163 RSA3: 8 FCM
+ SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
+ SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1408 VIN_PART_1: 8 CGW
+ SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1409 VIN_PART_2: 8 CGW
+ SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1410 VIN_PART_3: 8 CGW
+ SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX
+ SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX
+ SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX
+
+BO_ 1553 UI_SETTING: 8 XXX
+ SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX
+
+BO_ 1556 BLINKERS_STATE: 8 XXX
+ SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1568 BODY_CONTROL_STATE: 8 XXX
+ SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1570 LIGHT_STALK: 8 SCM
+ SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1571 CERTIFICATION_ECU: 8 CGW
+ SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1592 DOOR_LOCKS: 8 XXX
+ SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX
+ SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM
+ SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 36 YAW_RATE "verify";
+CM_ SG_ 36 ACCEL_X "x-axis accel";
+CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
+CM_ SG_ 37 STEER_RATE "factor is tbd";
+CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking";
+CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command";
+CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking";
+CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
+CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect";
+CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
+CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
+CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered";
+CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
+CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
+CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
+CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok";
+CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD";
+CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
+CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
+CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
+CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
+CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
+CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
+CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
+CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
+CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
+CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
+CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force";
+CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
+CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs";
+CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
+CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
+CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
+CM_ SG_ 956 GEAR "on 6MT, only R shows.";
+CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to";
+CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator";
+CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity";
+CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual";
+CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor";
+CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature";
+CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual";
+CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM";
+CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle";
+CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0";
+CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity";
+CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message";
+CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning";
+CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1";
+CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages";
+CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1";
+CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning";
+CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch";
+CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered";
+CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled";
+CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS";
+CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations";
+CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations";
+CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero";
+CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
+CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1161 SPDVAL2 "conditional speed value 70";
+CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
+CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1163 TSREQPD "always 1";
+CM_ SG_ 1163 TSRMSW "always 1";
+CM_ SG_ 1163 OTSGNNTM "always 3";
+CM_ SG_ 1163 NTLVLSPD "always 3";
+CM_ SG_ 1163 OVSPNTM "always 3";
+CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
+CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
+CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
+CM_ SG_ 1163 TSRSPU "always 1";
+CM_ SG_ 1552 UI_SPEED "Does not appear to match dash";
+CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting";
+CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
+CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking";
+CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal.";
+CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch";
+
+VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B";
+VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
+VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 614 STATE 3 "enabled" 1 "disabled";
+VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
+VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
+VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok";
+VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear";
+VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press";
+VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released";
+VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF";
+VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF";
+VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
+VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far";
+VAL_ 956 SPORT_ON 0 "off" 1 "on";
+VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
+VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on";
+VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6";
+VAL_ 956 ECON_ON 0 "off" 1 "on";
+VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on";
+VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on";
+VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines";
+VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled";
+VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off";
+VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
+VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none";
+VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LKAS_STATUS 1 "on" 0 "off";
+VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear";
+VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on";
+VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined";
+VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok";
+VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok";
+VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok";
+VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok";
+VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok";
+VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
+VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
+VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
+VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on";
+VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed";
+VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)";
+VAL_ 1553 UNITS 1 "km" 2 "miles";
+VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
+VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed";
+VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights";
+VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
+
+
+CM_ "Imported file _toyota_adas_standard.dbc starts here";
+BO_ 466 PCM_CRUISE: 8 XXX
+ SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX
+ SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX
+ SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 7 DSU
+ SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
+ SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
+ SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 705 GAS_PEDAL: 8 XXX
+ SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX
+ SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS
+ SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX
+ SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 740 STEERING_LKA: 5 XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 836 PRE_COLLISION_2: 8 DSU
+ SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
+ SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
+ SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
+ SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input";
+CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command";
+CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground";
+CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
+CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
+
+VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
+VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
+
+CM_ "toyota_nodsu_pt.dbc starts here";
+
+BO_ 401 STEERING_LTA: 8 XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX
+ SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX
+ SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 550 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 610 EPS_STATUS: 8 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 881 LTA_RELATED: 8 FCM
+ SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX
+ SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1014 BSM: 8 XXX
+ SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP";
+CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override";
+CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera";
+CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out";
+CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel";
+CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA";
+CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist";
+CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)";
+CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far";
+CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE";
+CM_ SG_ 881 TURN_SIGNALS "flipped on some cars";
+CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars";
+CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST";
+CM_ SG_ 881 UNKNOWN "related to steering wheel angle";
+CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal";
+CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility";
+CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility";
+
+VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX";
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby";
+VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_prius_2010_pt.dbc b/iqdbc_repo/iqdbc/dbc/toyota_prius_2010_pt.dbc
new file mode 100644
index 000000000..5c7df7d18
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_prius_2010_pt.dbc
@@ -0,0 +1,203 @@
+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 DSU HCU EPS IPAS
+
+
+BO_ 36 KINEMATICS: 8 XXX
+ SG_ ACCEL_Y : 33|10@0+ (1,-512) [0|65535] "" XXX
+ SG_ STEERING_TORQUE : 17|10@0+ (1,-512) [0|65535] "" XXX
+ SG_ YAW_RATE : 1|10@0+ (1,-512) [0|65535] "" XXX
+
+BO_ 166 BRAKE: 8 XXX
+ SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_PEDAL : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 170 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.0062,-67.67) [0|250] "mph" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.0062,-67.67) [0|250] "mph" XXX
+ SG_ WHEEL_SPEED_RR : 39|16@0+ (0.0062,-67.67) [0|250] "mph" XXX
+ SG_ WHEEL_SPEED_RL : 55|16@0+ (0.0062,-67.67) [0|250] "mph" XXX
+
+BO_ 180 SPEED: 8 XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 47|16@0+ (0.0062,0) [0|115] "mph" XXX
+ SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 295 GEAR_PACKET: 8 XXX
+ SG_ CAR_MOVEMENT : 39|8@0- (1,0) [0|255] "" XXX
+ SG_ COUNTER : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 466 PCM_CRUISE: 8 XXX
+ SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 23|16@0- (0.001,0) [-20|20] "m/s2" XXX
+ SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 550 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 552 ACCELEROMETER: 8 XXX
+ SG_ ACCEL_Z : 22|15@0- (1,0) [0|32767] "" XXX
+ SG_ ACCEL_X : 6|15@0- (0.001,0) [-20|20] "m/s2" XXX
+
+BO_ 560 BRAKE_MODULE2: 8 XXX
+ SG_ BRAKE_LIGHTS : 26|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 581 GAS_PEDAL: 8 XXX
+ SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
+
+BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ STEER_TORQUE_EPS : 47|16@0- (0.66,0) [-20000|20000] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 610 EPS_STATUS: 5 EPS
+ SG_ STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 614 STEERING_IPAS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1,0) [0|16777215] "" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 8 XXX
+
+BO_ 740 STEERING_LKA: 8 XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+
+BO_ 742 LEAD_INFO: 8 DSU
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
+ SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
+ SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
+
+BO_ 835 ACC_CONTROL: 8 DSU
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s2" HCU
+
+BO_ 1556 STEERING_LEVERS: 8 XXX
+ SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
+ SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
+ SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
+ SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
+
+BO_ 467 PCM_CRUISE_2: 8 XXX
+ SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "kph" XXX
+ SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "kph" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 921 PCM_CRUISE_SM: 8 XXX
+ SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 951 ESP_CONTROL: 8 ESP
+ SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 LKAS_HUD: 8 XXX
+ SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_1 : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1553 UI_SEETING: 8 XXX
+ SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1568 SEATS_DOORS: 8 XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 452 POWERTRAIN: 8 XXX
+ SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "rpm" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+
+
+
+CM_ SG_ 36 ACCEL_Y "unit is tbd";
+CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
+CM_ SG_ 36 YAW_RATE "verify";
+CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
+CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
+CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
+CM_ SG_ 560 BRAKE_LIGHTS "double check";
+CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered";
+CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
+CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
+CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
+CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
+CM_ SG_ 37 STEER_RATE "factor is tbd";
+CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
+CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
+CM_ SG_ 921 UI_SET_SPEED "set speed shown in UI with user set unit";
+CM_ SG_ 1042 SET_ME_1 "unclear what this is, nut it's always 1 in drive traces";
+VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B" ;
+VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "setspeeddown" 9 "setspeedup" 8 "active" 7 "standstill" 1 "off" 0 "off";
+VAL_ 610 STATE 5 "override" 3 "enabled" 1 "disabled" ;
+VAL_ 610 LKA_STATE 50 "temporary_fault" ;
+VAL_ 614 STATE 3 "enabled" 1 "disabled" ;
+VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left" ;
+VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left" ;
+VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok" ;
+VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted" ;
+VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none" ;
+VAL_ 1042 RIGHT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none" ;
+VAL_ 1042 LEFT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none" ;
+VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none" ;
+VAL_ 1553 UNITS 1 "km" 2 "miles" ;
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_radar_dsu_tssp.dbc b/iqdbc_repo/iqdbc/dbc/toyota_radar_dsu_tssp.dbc
new file mode 100644
index 000000000..168e58913
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_radar_dsu_tssp.dbc
@@ -0,0 +1,194 @@
+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 RADAR
+
+BO_ 768 BUTTONS: 8 RADAR
+ SG_ LKAS_PRESS : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE_PRESS : 5|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 769 OBJECT_0: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 771 OBJECT_1: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 773 OBJECT_2: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 775 OBJECT_3: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 777 OBJECT_4: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 779 OBJECT_5: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 781 OBJECT_6: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 783 OBJECT_7: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 785 OBJECT_8: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 787 OBJECT_9: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 789 OBJECT_10: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 791 OBJECT_11: 8 RADAR
+ SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "Front target"
+BO_ 1664 CLUSTER_F: 8 RADAR
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "Front target ahead"
+BO_ 1665 CLUSTER_F_A: 8 RADAR
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "Left target"
+BO_ 1666 CLUSTER_L: 8 RADAR
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "Right target"
+BO_ 1667 CLUSTER_R: 8 RADAR
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "Left target ahead"
+BO_ 1668 CLUSTER_L_A: 8 RADAR
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "Right target ahead"
+BO_ 1669 CLUSTER_R_A: 8 RADAR
+ SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX
+ SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX
+ SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX
+ SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX
+ SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_secoc_pt_generated.dbc b/iqdbc_repo/iqdbc/dbc/toyota_secoc_pt_generated.dbc
new file mode 100644
index 000000000..4f7f3f911
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_secoc_pt_generated.dbc
@@ -0,0 +1,721 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _toyota_2017.dbc starts here";
+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 DSU HCU EPS IPAS CGW BGM
+
+BO_ 36 KINEMATICS: 8 XXX
+ SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+ SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX
+ SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+
+BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
+ SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
+ SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
+ SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
+
+BO_ 119 ENG2F41: 6 CGW
+ SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX
+ SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 120 ENG2F42: 4 CGW
+ SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X
+ SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 166 BRAKE: 8 XXX
+ SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
+
+BO_ 170 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+
+BO_ 180 SPEED: 8 XXX
+ SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 295 GEAR_PACKET_HYBRID: 8 XXX
+ SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX
+ SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 353 DSU_SPEED: 7 XXX
+ SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
+
+BO_ 452 ENGINE_RPM: 8 CGW
+ SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
+ SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 467 PCM_CRUISE_2: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 552 VSC1S29: 4 CGW
+ SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1
+ SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1
+
+BO_ 560 BRAKE_2: 7 XXX
+ SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 581 GAS_PEDAL_HYBRID: 8 XXX
+ SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
+
+BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 614 STEERING_IPAS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 742 LEAD_INFO: 8 DSU
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
+ SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
+ SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
+
+BO_ 800 VSC1S07: 8 CGW
+ SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1
+ SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1
+ SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1
+ SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1
+ SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1
+ SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1
+ SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 835 ACC_CONTROL: 8 DSU
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX
+ SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
+ SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
+ SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
+ SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
+ SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
+ SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 865 CLUTCH: 8 XXX
+ SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX
+
+BO_ 869 DSU_CRUISE : 7 DSU
+ SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
+
+BO_ 898 AIR_CONDITIONER: 8 XXX
+ SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX
+ SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 921 PCM_CRUISE_SM: 8 XXX
+ SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 944 AIR_CONDITIONER_2: 8 XXX
+ SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 951 ESP_CONTROL: 8 ESP
+ SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 956 GEAR_PACKET: 8 XXX
+ SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM
+ SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX
+
+BO_ 1009 PCM_CRUISE_ALT: 8 XXX
+ SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+
+BO_ 1020 SOLAR_SENSOR: 8 XXX
+ SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX
+
+BO_ 1041 PCS_HUD: 8 DSU
+ SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 LKAS_HUD: 8 DSU
+ SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX
+ SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 TIME : 8 CGW
+ SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
+ SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
+ SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
+ SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
+ SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
+ SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
+ SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
+ SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1044 AUTO_HIGH_BEAM: 8 FCM
+ SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+ SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1056 VSC1S08: 8 CGW
+ SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 1083 AUTOPARK_STATUS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1161 RSA1: 8 FCM
+ SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1162 RSA2: 8 FCM
+ SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1163 RSA3: 8 FCM
+ SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
+ SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1408 VIN_PART_1: 8 CGW
+ SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1409 VIN_PART_2: 8 CGW
+ SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1410 VIN_PART_3: 8 CGW
+ SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX
+ SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX
+ SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX
+
+BO_ 1553 UI_SETTING: 8 XXX
+ SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX
+
+BO_ 1556 BLINKERS_STATE: 8 XXX
+ SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1568 BODY_CONTROL_STATE: 8 XXX
+ SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1570 LIGHT_STALK: 8 SCM
+ SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1571 CERTIFICATION_ECU: 8 CGW
+ SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1592 DOOR_LOCKS: 8 XXX
+ SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX
+ SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM
+ SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 36 YAW_RATE "verify";
+CM_ SG_ 36 ACCEL_X "x-axis accel";
+CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
+CM_ SG_ 37 STEER_RATE "factor is tbd";
+CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking";
+CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command";
+CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking";
+CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
+CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect";
+CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
+CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
+CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered";
+CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
+CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
+CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
+CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok";
+CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD";
+CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
+CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
+CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
+CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
+CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
+CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
+CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
+CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
+CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
+CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
+CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force";
+CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
+CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs";
+CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
+CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
+CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
+CM_ SG_ 956 GEAR "on 6MT, only R shows.";
+CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to";
+CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator";
+CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity";
+CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual";
+CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor";
+CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature";
+CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual";
+CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM";
+CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle";
+CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0";
+CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity";
+CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message";
+CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning";
+CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1";
+CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages";
+CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1";
+CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning";
+CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch";
+CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered";
+CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled";
+CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS";
+CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations";
+CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations";
+CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero";
+CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
+CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1161 SPDVAL2 "conditional speed value 70";
+CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
+CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1163 TSREQPD "always 1";
+CM_ SG_ 1163 TSRMSW "always 1";
+CM_ SG_ 1163 OTSGNNTM "always 3";
+CM_ SG_ 1163 NTLVLSPD "always 3";
+CM_ SG_ 1163 OVSPNTM "always 3";
+CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
+CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
+CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
+CM_ SG_ 1163 TSRSPU "always 1";
+CM_ SG_ 1552 UI_SPEED "Does not appear to match dash";
+CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting";
+CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
+CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking";
+CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal.";
+CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch";
+
+VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B";
+VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
+VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 614 STATE 3 "enabled" 1 "disabled";
+VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
+VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
+VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok";
+VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear";
+VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press";
+VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released";
+VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF";
+VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF";
+VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
+VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far";
+VAL_ 956 SPORT_ON 0 "off" 1 "on";
+VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
+VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on";
+VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6";
+VAL_ 956 ECON_ON 0 "off" 1 "on";
+VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on";
+VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on";
+VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines";
+VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled";
+VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off";
+VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
+VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none";
+VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LKAS_STATUS 1 "on" 0 "off";
+VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear";
+VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on";
+VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined";
+VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok";
+VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok";
+VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok";
+VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok";
+VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok";
+VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
+VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
+VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
+VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on";
+VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed";
+VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)";
+VAL_ 1553 UNITS 1 "km" 2 "miles";
+VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
+VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed";
+VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights";
+VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
+
+CM_ "toyota_secoc_pt.dbc starts here";
+
+BO_ 15 SECOC_SYNCHRONIZATION: 8 XXX
+ SG_ TRIP_CNT : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ RESET_CNT : 23|20@0+ (1,0) [0|65535] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+
+BO_ 257 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_PRESSURE_1 : 31|8@0+ (1,0) [0|15] "" XXX
+ SG_ BRAKE_PRESSURE_2 : 61|6@0+ (1,0) [0|63] "" XXX
+
+BO_ 278 GAS_PEDAL: 8 XXX
+ SG_ GAS_PEDAL_ACC : 7|8@0+ (0.005,0) [0|255] "" XXX
+ SG_ GAS_PEDAL_USER : 15|8@0+ (0.005,0) [0|255] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 305 STEERING_LTA_2: 8 XXX
+ SG_ STEER_REQUEST_2 : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_REQUEST : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ STEER_ANGLE_CMD : 23|16@0- (0.0573,0) [0|65535] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 374 PCM_CRUISE: 8 XXX
+ SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_STATE : 31|4@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 375 PCM_CRUISE_3: 8 XXX
+ SG_ NEW_SIGNAL_1 : 7|16@0- (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_4 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_RELEASED : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_2 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 387 ACC_CONTROL_2: 8 XXX
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 401 STEERING_LTA: 8 XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX
+ SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX
+ SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX
+ SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 418 CRUISE_RELATED: 8 XXX
+ SG_ CRUISE_ACTIVE : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 589 PCM_CRUISE_4: 8 PCM
+ SG_ DISTANCE : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ CANCEL : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ DECREASE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ENABLE : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ INCREASE : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 27|4@0+ (1,0) [0|15] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 610 EPS_STATUS: 8 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 8 DSU
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 740 STEERING_LKA: 8 XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 836 PRE_COLLISION_2: 8 DSU
+ SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX
+ SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX
+ SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 881 LTA_RELATED: 8 FCM
+ SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX
+ SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1014 BSM: 8 XXX
+ SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 305 STEER_ANGLE_CMD "Used in place of STEERING_LTA.STEER_ANGLE_CMD on SecOC cars";
+CM_ SG_ 387 ACCEL_CMD "Used in place of ACC_CONTROL.ACCEL_CMD on SecOC cars";
+CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist";
+CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out";
+CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not";
+CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA";
+CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)";
+CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel";
+CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP";
+CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override";
+CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far";
+CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE";
+CM_ SG_ 881 TURN_SIGNALS "flipped on some cars";
+CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars";
+CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST";
+CM_ SG_ 881 UNKNOWN "related to steering wheel angle";
+CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal";
+CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility";
+CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED";
+CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility";
+
+VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX";
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_tnga_k_pt_generated.dbc b/iqdbc_repo/iqdbc/dbc/toyota_tnga_k_pt_generated.dbc
new file mode 100644
index 000000000..d52f7e99c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_tnga_k_pt_generated.dbc
@@ -0,0 +1,687 @@
+CM_ "AUTOGENERATED FILE, DO NOT EDIT";
+
+
+CM_ "Imported file _community.dbc starts here";
+BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
+
+BO_ 512 GAS_COMMAND: 6 EON
+ SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
+ SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
+ SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
+
+BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
+ SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON
+ SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON
+ SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON
+ SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON
+
+VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX
+ SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX
+
+CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss";
+
+BO_ 767 SDSU: 8 XXX
+ SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX
+
+CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu";
+CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
+
+VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
+
+
+CM_ "Imported file _toyota_2017.dbc starts here";
+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 DSU HCU EPS IPAS CGW BGM
+
+BO_ 36 KINEMATICS: 8 XXX
+ SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+ SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX
+ SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
+
+BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
+ SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
+ SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
+ SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
+
+BO_ 119 ENG2F41: 6 CGW
+ SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX
+ SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX
+ SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 120 ENG2F42: 4 CGW
+ SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X
+ SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 166 BRAKE: 8 XXX
+ SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
+
+BO_ 170 WHEEL_SPEEDS: 8 XXX
+ SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+ SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
+
+BO_ 180 SPEED: 8 XXX
+ SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 295 GEAR_PACKET_HYBRID: 8 XXX
+ SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX
+ SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 353 DSU_SPEED: 7 XXX
+ SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
+
+BO_ 452 ENGINE_RPM: 8 CGW
+ SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
+ SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 467 PCM_CRUISE_2: 8 XXX
+ SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX
+ SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 552 VSC1S29: 4 CGW
+ SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1
+ SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1
+ SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1
+
+BO_ 560 BRAKE_2: 7 XXX
+ SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 581 GAS_PEDAL_HYBRID: 8 XXX
+ SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
+
+BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
+ SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
+ SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
+ SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 614 STEERING_IPAS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+ SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
+ SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 742 LEAD_INFO: 8 DSU
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
+ SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
+ SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
+
+BO_ 800 VSC1S07: 8 CGW
+ SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1
+ SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1
+ SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1
+ SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1
+ SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1
+ SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM
+ SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1
+ SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1
+ SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1
+ SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1
+ SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1
+ SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 835 ACC_CONTROL: 8 DSU
+ SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU
+ SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX
+ SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX
+ SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
+ SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
+ SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
+ SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
+ SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
+ SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
+ SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 865 CLUTCH: 8 XXX
+ SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
+ SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX
+
+BO_ 869 DSU_CRUISE : 7 DSU
+ SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
+ SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
+ SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
+ SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
+
+BO_ 898 AIR_CONDITIONER: 8 XXX
+ SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX
+ SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX
+
+BO_ 921 PCM_CRUISE_SM: 8 XXX
+ SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
+ SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 944 AIR_CONDITIONER_2: 8 XXX
+ SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 951 ESP_CONTROL: 8 ESP
+ SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 956 GEAR_PACKET: 8 XXX
+ SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
+ SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
+ SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX
+ SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM
+ SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX
+
+BO_ 1009 PCM_CRUISE_ALT: 8 XXX
+ SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX
+ SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
+ SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
+
+BO_ 1020 SOLAR_SENSOR: 8 XXX
+ SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX
+
+BO_ 1041 PCS_HUD: 8 DSU
+ SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX
+ SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX
+ SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1042 LKAS_HUD: 8 DSU
+ SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
+ SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX
+ SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX
+ SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX
+ SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX
+ SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX
+ SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
+
+BO_ 1043 TIME : 8 CGW
+ SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
+ SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
+ SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
+ SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
+ SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
+ SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
+ SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
+ SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
+ SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1044 AUTO_HIGH_BEAM: 8 FCM
+ SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX
+ SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 1056 VSC1S08: 8 CGW
+ SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV
+ SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS
+ SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS
+ SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS
+ SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV
+ SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV
+
+BO_ 1083 AUTOPARK_STATUS: 8 IPAS
+ SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 1161 RSA1: 8 FCM
+ SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX
+ SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1162 RSA2: 8 FCM
+ SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
+ SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
+ SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
+ SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
+ SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
+ SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
+ SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
+ SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
+ SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
+
+BO_ 1163 RSA3: 8 FCM
+ SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
+ SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
+ SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
+ SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
+ SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
+ SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
+ SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
+
+BO_ 1408 VIN_PART_1: 8 CGW
+ SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1409 VIN_PART_2: 8 CGW
+ SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
+ SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1410 VIN_PART_3: 8 CGW
+ SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
+
+BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX
+ SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX
+ SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX
+
+BO_ 1553 UI_SETTING: 8 XXX
+ SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX
+
+BO_ 1556 BLINKERS_STATE: 8 XXX
+ SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1568 BODY_CONTROL_STATE: 8 XXX
+ SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1570 LIGHT_STALK: 8 SCM
+ SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1571 CERTIFICATION_ECU: 8 CGW
+ SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX
+ SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX
+
+BO_ 1592 DOOR_LOCKS: 8 XXX
+ SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX
+ SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX
+ SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM
+ SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX
+ SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 36 YAW_RATE "verify";
+CM_ SG_ 36 ACCEL_X "x-axis accel";
+CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
+CM_ SG_ 37 STEER_RATE "factor is tbd";
+CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking";
+CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command";
+CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking";
+CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
+CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect";
+CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
+CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
+CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered";
+CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
+CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
+CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
+CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok";
+CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD";
+CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
+CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
+CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
+CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
+CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
+CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
+CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
+CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
+CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
+CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
+CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force";
+CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
+CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs";
+CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
+CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
+CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
+CM_ SG_ 956 GEAR "on 6MT, only R shows.";
+CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to";
+CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator";
+CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity";
+CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual";
+CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor";
+CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature";
+CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual";
+CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM";
+CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle";
+CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0";
+CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity";
+CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message";
+CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning";
+CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1";
+CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages";
+CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1";
+CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning";
+CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch";
+CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered";
+CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled";
+CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS";
+CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations";
+CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations";
+CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero";
+CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
+CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1161 SPDVAL2 "conditional speed value 70";
+CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
+CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
+CM_ SG_ 1163 TSREQPD "always 1";
+CM_ SG_ 1163 TSRMSW "always 1";
+CM_ SG_ 1163 OTSGNNTM "always 3";
+CM_ SG_ 1163 NTLVLSPD "always 3";
+CM_ SG_ 1163 OVSPNTM "always 3";
+CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
+CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
+CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
+CM_ SG_ 1163 TSRSPU "always 1";
+CM_ SG_ 1552 UI_SPEED "Does not appear to match dash";
+CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting";
+CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state";
+CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
+CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking";
+CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal.";
+CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch";
+
+VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B";
+VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
+VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 614 STATE 3 "enabled" 1 "disabled";
+VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
+VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
+VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok";
+VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear";
+VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press";
+VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released";
+VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF";
+VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF";
+VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
+VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far";
+VAL_ 956 SPORT_ON 0 "off" 1 "on";
+VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
+VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on";
+VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6";
+VAL_ 956 ECON_ON 0 "off" 1 "on";
+VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on";
+VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on";
+VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines";
+VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close";
+VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled";
+VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off";
+VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
+VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none";
+VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LKAS_STATUS 1 "on" 0 "off";
+VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
+VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear";
+VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on";
+VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined";
+VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok";
+VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok";
+VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok";
+VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok";
+VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok";
+VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
+VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
+VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
+VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
+VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on";
+VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed";
+VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)";
+VAL_ 1553 UNITS 1 "km" 2 "miles";
+VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
+VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed";
+VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights";
+VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
+
+
+CM_ "Imported file _toyota_adas_standard.dbc starts here";
+BO_ 466 PCM_CRUISE: 8 XXX
+ SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
+ SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX
+ SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX
+ SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
+ SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 643 PRE_COLLISION: 7 DSU
+ SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
+ SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
+ SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
+ SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
+ SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 705 GAS_PEDAL: 8 XXX
+ SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX
+ SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS
+ SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX
+ SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM
+
+BO_ 740 STEERING_LKA: 5 XXX
+ SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
+ SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 836 PRE_COLLISION_2: 8 DSU
+ SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
+ SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
+ SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
+ SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
+
+CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input";
+CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command";
+CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground";
+CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
+CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
+CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
+
+VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
+VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
+
+CM_ "toyota_tnga_k_pt.dbc starts here";
+
+BO_ 550 BRAKE_MODULE: 8 XXX
+ SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
+ SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 610 EPS_STATUS: 5 EPS
+ SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
+ SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
+
+CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
+CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
+CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
+
+VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
+VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";
diff --git a/iqdbc_repo/iqdbc/dbc/toyota_tss2_adas.dbc b/iqdbc_repo/iqdbc/dbc/toyota_tss2_adas.dbc
new file mode 100644
index 000000000..d472debd6
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/toyota_tss2_adas.dbc
@@ -0,0 +1,285 @@
+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
+
+
+BO_ 384 TRACK_A_0: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 385 TRACK_A_1: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 386 TRACK_A_2: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 387 TRACK_A_3: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 388 TRACK_A_4: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 389 TRACK_A_5: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 390 TRACK_A_6: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 391 TRACK_A_7: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 392 TRACK_A_8: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 393 TRACK_A_9: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 394 TRACK_A_10: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 395 TRACK_A_11: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 396 TRACK_A_12: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 397 TRACK_A_13: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 398 TRACK_A_14: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 399 TRACK_A_15: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX
+ SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX
+ SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX
+ SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 400 TRACK_B_0: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 401 TRACK_B_1: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 402 TRACK_B_2: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 403 TRACK_B_3: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 404 TRACK_B_4: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 405 TRACK_B_5: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 406 TRACK_B_6: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 407 TRACK_B_7: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 408 TRACK_B_8: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 409 TRACK_B_9: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 410 TRACK_B_10: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 411 TRACK_B_11: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 412 TRACK_B_12: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 413 TRACK_B_13: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 414 TRACK_B_14: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 415 TRACK_B_15: 8 XXX
+ SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX
+ SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX
+ SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 576 NEW_MSG_1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|7@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 577 NEW_MSG_2: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|7@0+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX
diff --git a/iqdbc_repo/iqdbc/dbc/volvo_v40_2017_pt.dbc b/iqdbc_repo/iqdbc/dbc/volvo_v40_2017_pt.dbc
new file mode 100644
index 000000000..c5f533d60
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/volvo_v40_2017_pt.dbc
@@ -0,0 +1,363 @@
+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 BCM CEM CVM DIM ECM FSM PSCM SAS SRS TCM
+
+BO_ 8 SAS0: 8 SAS
+ SG_ SteeringDirection : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ RelativeTurnDirection : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ SteeringAngle : 53|14@0+ (0.04395,0) [0|65535] "degrees" XXX
+ SG_ NEW_SIGNAL_1 : 47|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ AngleRate : 21|14@0+ (0.075,0) [0|1500] "deg/S" XXX
+
+BO_ 16 CCButtons: 8 CEM
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|5@0+ (1,0) [0|31] "" XXX
+ SG_ B7b0 : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ B7b1 : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ B7b6 : 62|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCOnOffBtn : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCSetBtn : 63|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCStopBtn : 60|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCResumeBtn : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCMinusBtn : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ TimeGapIncreaseBtn : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ TimeGapDecreaseBtn : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ B7b3 : 59|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 48 FSM0: 8 FSM
+ SG_ ACCStatusTracking : 56|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCStatusOnOff : 57|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCStatusActive : 58|1@0+ (1,0) [0|1] "" XXX
+ SG_ FCWSomething : 25|3@0+ (1,0) [0|3] "" XXX
+ SG_ StatusSomething : 55|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 64 TCM0: 8 TCM
+ SG_ RPMSomething : 42|11@0+ (1,0) [0|2047] "" XXX
+ SG_ GearShifter : 46|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 85 PedalandBrake: 8 ECM
+ SG_ AccPedal : 9|10@0+ (0.1,0) [0|1023] "%" XXX
+ SG_ BrakePedalActive2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 35|12@0+ (1,0) [0|4095] "" XXX
+ SG_ BrakePedalActive : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 101 EngineInfo: 8 XXX
+ SG_ NEW_SIGNAL_1 : 17|10@0+ (1,-512) [0|1023] "" XXX
+ SG_ EngineSpeed : 52|13@0+ (1,0) [0|1023] "" XXX
+
+BO_ 112 NEW_MSG_4: 8 XXX
+ SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 114 ECM1: 8 ECM1
+ SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ ECM_ACC_ONOFF_INV : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ ECM_ACC_RESUME_INV : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ ECM_ACC_SET_INV : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ECM_ACC_TIMEGAP_INC_INV : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ ECM_ACC_DEC_INV : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ ECM_ACC_TIMEGAP_DEC_INV : 34|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 117 ECM1_2: 8 ECM
+
+BO_ 128 NEW_MSG_5: 8 XXX
+ SG_ NEW_SIGNAL_2 : 26|11@0+ (1,0) [0|2047] "" XXX
+ SG_ NEW_SIGNAL_1 : 52|13@0+ (1,0) [0|8191] "" XXX
+
+BO_ 176 ECM2: 8 ECM
+ SG_ NEW_SIGNAL_1 : 50|11@0+ (1,0) [0|2047] "" XXX
+ SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|63] "" XXX
+
+BO_ 192 Gear: 8 XXX
+ SG_ TransmissionGear : 36|3@0+ (1,1) [0|7] "" XXX
+
+BO_ 208 FSM1: 8 FSM
+ SG_ SET_X_E3 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_X_B4 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SET_X_08 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ TrqLim : 31|8@0+ (1,-128) [0|255] "" XXX
+ SG_ Checksum : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKASteerDirection : 57|2@0+ (1,0) [0|2] "" XXX
+ SG_ SET_X_25 : 63|6@0+ (1,0) [0|63] "" XXX
+ SG_ LKAAngleReq : 37|14@0+ (0.04395,-360.0384) [-360.0384|359.99445] "degrees" XXX
+ SG_ SET_X_02 : 39|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 224 PSCM0: 8 PSCM
+ SG_ NEW_SIGNAL_2 : 12|5@0+ (1,0) [0|31] "" XXX
+ SG_ counter_07 : 15|3@0+ (1,0) [0|7] "" XXX
+ SG_ counter2_07 : 37|3@0+ (1,0) [0|16383] "" XXX
+ SG_ rate_of_something : 46|7@0+ (1,0) [0|62] "" XXX
+ SG_ OneDuringDriving : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 245 wheelspeed0: 8 BCM
+ SG_ counter1 : 21|6@0+ (1,0) [0|65535] "" XXX
+ SG_ counter0 : 7|16@0+ (1,0) [0|65535] "" XXX
+ SG_ WhlSpdLF : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ WhlSpdRF : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 272 SpeedSignal0: 8 XXX
+ SG_ VehicleSpeedSignal : 55|16@0+ (0.01,0) [0|65535] "" XXX
+
+BO_ 288 wheel_speed1: 8 BCM
+ SG_ WhlSpdLR : 39|16@0+ (1,0) [0|65535] "" XXX
+ SG_ WhlSpdRR : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 293 PSCM1: 8 PSCM
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+ SG_ LKATorque : 11|12@0+ (1,-2000) [0|4095] "" XXX
+ SG_ SteeringAngleServo : 47|16@0+ (0.04395,-1440.1536) [0|65535] "deg" XXX
+ SG_ LKAActive : 15|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 304 VehicleSpeed0: 8 BCM
+ SG_ NEW_SIGNAL_2 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ VehicleSpeed : 31|16@0+ (0.01,0) [0|65535] "km/h" XXX
+ SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 325 ECM3: 8 ECM
+
+BO_ 336 VehicleSpeed1: 8 BCM
+ SG_ NEW_SIGNAL_2 : 31|16@0+ (1,0) [0|65535] "" XXX
+ SG_ NEW_SIGNAL_1 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ VehicleSpeed : 55|16@0+ (0.01,0) [0|65535] "" XXX
+
+BO_ 352 FSM2: 8 FSM
+ SG_ LkaDimLine : 51|2@1+ (1,0) [0|127] "" XXX
+ SG_ NEW_SIGNAL_2 : 56|7@1+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 55|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 7|24@0+ (1,0) [0|16777215] "" XXX
+ SG_ NEW_SIGNAL_4 : 36|5@0+ (1,0) [0|31] "" XXX
+
+BO_ 432 BrakeMessages: 8 BCM
+ SG_ BrakePress0 : 1|10@0+ (1,0) [0|1023] "" XXX
+ SG_ BrakePress1 : 33|10@0+ (1,0) [0|1023] "" XXX
+ SG_ BrakeStatus : 18|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 464 DIM0: 8 DIM
+
+BO_ 480 BCM0: 8 BCM
+
+BO_ 528 CEM0: 8 CEM
+
+BO_ 608 CVM0: 8 CVM
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 15|5@0+ (1,0) [0|32] "" XXX
+ SG_ Distance : 10|11@0+ (1,0) [0|2048] "" XXX
+
+BO_ 624 FSM3: 8 FSM
+ SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 640 FSM4: 8 FSM
+ SG_ SpeedTarget : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_1 : 49|10@0+ (1,0) [0|255] "" XXX
+
+BO_ 648 SRS0: 8 SRS
+
+BO_ 652 ECM4: 8 ECM
+
+BO_ 656 ECM5: 8 ECM
+
+BO_ 657 ECM6: 8 ECM
+
+BO_ 681 MiscCarInfo: 8 CEM
+ SG_ TurnSignal : 1|2@0+ (1,0) [0|3] "" XXX
+ SG_ HighBeamOn : 52|1@0+ (1,0) [0|1] "" XX
+
+BO_ 693 ECM7: 8 ECM
+
+BO_ 709 ACC: 8 ECM
+ SG_ SpeedTargetACC : 0|9@0+ (0.5,0) [0|511] "" XXX
+
+BO_ 853 FSM5: 8 FSM
+ SG_ TargetSpeedOdo : 23|8@0+ (1,0) [0|63] "kph" XXX
+ SG_ SpeedSign : 36|5@0+ (5,0) [0|32] "" XXX
+ SG_ TextUnderSign : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 39|3@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ LaneMarkingsOdo : 15|4@0+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_2 : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 864 CEM1: 8 CEM
+
+BO_ 912 DIM1: 8 DIM
+
+BO_ 968 SRS1: 8 SRS
+ SG_ PassengerSeatBelt : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ DriverSeatBelt : 19|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1029 CEMBCM0: 8 CEM
+
+BO_ 1344 NEW_MSG_1: 8 XXX
+ SG_ NEW_SIGNAL_1 : 4|13@0+ (1,0) [0|8191] "" XXX
+
+BO_ 1830 diagCEMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1838 diagCEMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1840 diagPSCMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1848 diagPSCMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1892 diagFSMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1900 diagFSMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1939 diagCVMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1947 diagCVMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2015 diagGlobalReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+
+
+
+CM_ SG_ 85 BrakePedalActive2 "Active during braking";
+CM_ SG_ 85 NEW_SIGNAL_1 "Not yet figured out.";
+CM_ SG_ 85 BrakePedalActive "Brake pedal pushed";
+CM_ SG_ 8 SteeringDirection "1=Right turn, 0=Left turn. Steering wheel pointing left or right from center (0 deg).";
+CM_ SG_ 8 RelativeTurnDirection "1=Right turn, 0=Left turn. Steering wheel currently turning the way.";
+CM_ SG_ 101 NEW_SIGNAL_1 "Rate of something?";
+CM_ SG_ 192 TransmissionGear "0 = 1st gear, 1= 2nd gear...";
+CM_ SG_ 681 TurnSignal "0 = Nothing, 1= Left, 3=Right";
+CM_ SG_ 681 HighBeamOn "1=HighBeam On, 0=HighBeam Off";
+CM_ SG_ 48 ACCStatusTracking "ACC Tracking vehicle, distance control.";
+CM_ SG_ 48 ACCStatusOnOff "Turns one after pressing on/off button on steering wheel";
+CM_ SG_ 48 ACCStatusActive "ACC Active";
+CM_ SG_ 48 FCWSomething "All bit set during fcw";
+CM_ SG_ 48 StatusSomething "Some status changes when zeroing DTCs";
+CM_ SG_ 208 TrqLim "Used in checksum calculation, Limit directional torque based on the number.";
+CM_ SG_ 208 Checksum "Checksum calculated as a one-complement addition of LKAAngleRequest+LKADirection+Unkown, Zeros used to pad missing bits.";
+CM_ SG_ 208 SET_X_02 "Bit 0 = Vibrate steering wheel., Bit 1 = Heartbeat";
+CM_ SG_ 352 LkaDimLine "Not true, but follows lka steer direction.";
+CM_ SG_ 352 NEW_SIGNAL_1 "Turned one. Got LKA service needed can this be the one?";
+CM_ SG_ 640 SpeedTarget "SpeedTarget ACC (noisy bf starting acc Jumps from 0->252->0)";
+CM_ SG_ 853 TargetSpeedOdo "Probably target speed odo";
+CM_ SG_ 853 LaneMarkingsOdo "Bit 3=Left lane, Bit 2=Right lane, Bit 1=LKA on?, Bit 0=?";
+CM_ SG_ 709 SpeedTargetACC "SpeedTargetACC";
+CM_ SG_ 224 rate_of_something "Seems to be some kind of torque rather than rate.";
+CM_ SG_ 224 OneDuringDriving "Set to 1 when vehicle is rolling.";
+CM_ SG_ 293 byte7 "Bit0=0 when gearshift in park, else 1";
+CM_ SG_ 293 LKAActive "Bit0=0 when gear in park otherwise =1, Bit1=1 when LKA Active, 0 when not active. Bit2=? Bit3=?";
+CM_ SG_ 16 ACCOnOffBtn "Cruise control on/off button pressed";
+CM_ SG_ 16 ACCSetBtn "Acc Set button (+) pressed";
+CM_ SG_ 16 ACCStopBtn "ACC Stop button pressed";
+CM_ SG_ 16 ACCResumeBtn "ACC Resume button pressed";
+CM_ SG_ 16 ACCMinusBtn "ACC Minus (-) button pressed";
+CM_ SG_ 16 TimeGapIncreaseBtn "Increase the time gap on ACC";
+CM_ SG_ 16 TimeGapDecreaseBtn "Decrease the time gap on ACC";
+CM_ SG_ 245 counter0 "Speed based counter";
+CM_ SG_ 245 WhlSpdLF "Wheel speed left front";
+CM_ SG_ 245 WhlSpdRF "Wheel speed right front";
+CM_ SG_ 288 WhlSpdLR "Wheel speed left rear";
+CM_ SG_ 288 WhlSpdRR "Wheel speed right rear";
+CM_ SG_ 64 RPMSomething "TransmissionOutput?";
+CM_ SG_ 64 GearShifter "P=0, R=1, N=2, D=3";
+CM_ SG_ 272 VehicleSpeedSignal "km/h";
+CM_ SG_ 432 BrakePress0 "Brake being pressed";
+CM_ SG_ 432 BrakePress1 "Brake being pressed";
+CM_ SG_ 432 BrakeStatus "ACC brake?";
+CM_ SG_ 437 Counter0 "Related to braking? Maybe one per wheel?";
+CM_ SG_ 437 Counter1 "Related to braking? Maybe one per wheel?";
+CM_ SG_ 437 Counter2 "Related to braking? Maybe one per wheel?";
+CM_ SG_ 437 Counter3 "Related to braking? Maybe one per wheel?";
+CM_ SG_ 114 NEW_SIGNAL_1 "Jumped from 0 -> 120 during start. Makes triangle from time to time";
+CM_ SG_ 608 NEW_SIGNAL_1 "Status?";
+CM_ SG_ 608 NEW_SIGNAL_2 "Classification of object?";
+CM_ SG_ 608 Distance "Distance to object in front.";
+CM_ SG_ 968 PassengerSeatBelt "1 = Seatbelt latched";
+CM_ SG_ 968 DriverSeatBelt "1=Seatbelt latched";
+VAL_ 64 GearShifter 0 "P" 1 "R" 2 "N" 3 "D" ;
diff --git a/iqdbc_repo/iqdbc/dbc/volvo_v60_2015_pt.dbc b/iqdbc_repo/iqdbc/dbc/volvo_v60_2015_pt.dbc
new file mode 100644
index 000000000..d2b58fdd0
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/volvo_v60_2015_pt.dbc
@@ -0,0 +1,298 @@
+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 BCM CEM FSM PSCM SAS
+
+BO_ 16 SAS0: 8 SAS
+ SG_ Counter0 : 3|8@0+ (1,0) [0|511] "" XXX
+ SG_ SteeringDirection : 6|1@0+ (1,0) [0|1] "" XXX
+ SG_ SteeringRateOfChange2 : 22|15@0+ (1,0) [0|32767] "" XXX
+ SG_ SteeringPressureOnIt : 23|1@0+ (1,0) [0|1] "" XXX
+ SG_ SteeringRateOfChange : 39|16@0+ (1,-32768) [0|65535] "" XXX
+ SG_ SteeringAngle : 53|14@0+ (0.0445,0) [0|65535] "degrees" XXX
+
+BO_ 32 AccPedal: 8 XXX
+ SG_ AccPedal : 17|10@0+ (0.1,0) [0|100.0] "%" XXX
+
+BO_ 81 FSM0: 8 FSM
+ SG_ ACCStatus : 18|3@0+ (1,0) [0|7] "" XXX
+
+BO_ 277 NEW_MSG_7: 8 XXX
+ SG_ NEW_SIGNAL_1 : 39|16@0+ (1,0) [0|65535] "" XXX
+
+BO_ 295 CCButtons: 8 CEM
+ SG_ ACCMinusBtnInv : 32|1@0+ (1,0) [0|1] "" XXX
+ SG_ TimeGapIncreaseBtnInv : 33|1@0+ (1,0) [0|1] "" XXX
+ SG_ TimeGapDecreaseBtnInv : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCOnOffBtnInv : 43|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCResumeBtnInv : 45|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCSetBtnInv : 47|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCMinusBtn : 48|1@0+ (1,0) [0|1] "" XXX
+ SG_ TimeGapIncreaseBtn : 49|1@0+ (1,0) [0|1] "" XXX
+ SG_ TimeGapDecreaseBtn : 50|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCOnOffBtn : 59|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCResumeBtn : 61|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACCSetBtn : 63|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 298 EngineData: 8 XXX
+ SG_ NEW_SIGNAL_1 : 1|10@0+ (1,0) [0|1023] "" XXX
+ SG_ BrakePressed2 : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_7 : 25|2@0+ (1,0) [0|3] "" XXX
+ SG_ NEW_SIGNAL_2 : 33|10@0- (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_3 : 34|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_4 : 35|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_5 : 36|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_6 : 37|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrakePressed : 38|1@0+ (1,0) [0|1] "" XXX
+ SG_ EngineRpm : 52|13@0+ (1,0) [0|8000] "" XXX
+
+BO_ 307 NEW_MSG_133: 8 XXX
+ SG_ Brake : 14|7@0+ (1,0) [0|127] "" XXX
+
+BO_ 328 VehicleSpeed1: 8 XXX
+ SG_ BrakePressure2 : 33|10@0+ (1,0) [0|63] "" XXX
+ SG_ COUNTER : 37|4@0+ (1,0) [0|15] "" XXX
+ SG_ VehicleSpeed : 55|16@0+ (0.01,0) [0|65535] "" XXX
+
+BO_ 336 NEW_MSG_8: 8 XXX
+ SG_ NEW_SIGNAL_1 : 3|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_2 : 19|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_3 : 35|12@0+ (1,0) [0|4095] "" XXX
+ SG_ NEW_SIGNAL_4 : 51|12@0+ (1,0) [0|4095] "" XXX
+
+BO_ 359 ACC_Speed: 8 XXX
+ SG_ ACC_Speed : 0|8@0+ (1,0) [0|255] "km/h" XXX
+ SG_ GasPedal : 51|12@0- (1,0) [0|255] "" XXX
+ SG_ GasPressed : 52|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 384 Accessories_02: 8 XXX
+ SG_ Park_Assist_State : 42|1@0+ (1,0) [0|1] "" XXX
+ SG_ StartStop_Inv : 44|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 465 NEW_MSG_4: 8 XXX
+ SG_ BrakePressedInv : 3|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|4095] "" XXX
+
+BO_ 522 Brake_Info: 8 XXX
+ SG_ NEW_SIGNAL_2 : 1|1@0+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX
+ SG_ BrakeCmd : 13|1@0+ (1,0) [0|1] "" XXX
+ SG_ BrakePressure : 17|10@0+ (1,0) [0|255] "" XXX
+ SG_ BrakePedal : 19|2@0+ (1,0) [0|3] "" XXX
+ SG_ BrakePedal2 : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ CHECKSUM : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 544 wheelspeed1: 8 BCM
+ SG_ WhlSpdRR : 39|16@0+ (0.01,-327.68) [0|65535] "" XXX
+ SG_ WhlSpdLR : 55|16@0+ (0.01,-327.68) [0|65535] "" XXX
+
+BO_ 565 wheelspeed0: 8 BCM
+ SG_ WhlSpdRF : 39|16@0+ (0.01,-327.68) [0|65535] "" XXX
+ SG_ WhlSpdLF : 55|16@0+ (0.01,-327.68) [0|65535] "" XXX
+
+BO_ 582 PSCM1: 8 PSCM
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ SteeringWheelRateOfChange : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ SteeringAngleServo : 23|16@0+ (0.0447,-1464.8) [0|65535] "deg" XXX
+ SG_ LKATorque : 35|12@0+ (1,-2000) [0|65535] "" XXX
+ SG_ byte4 : 39|4@0+ (1,0) [0|15] "" XXX
+ SG_ LKAActive : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 608 FSM1: 8 FSM
+ SG_ ACC_Distance : 7|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 609 fromWhere: 8 XXX
+ SG_ COUNTER : 3|4@0+ (1,0) [0|15] "" XXX
+ SG_ CHECKSUM : 15|4@0+ (1,0) [0|15] "" XXX
+ SG_ SteeringAngle : 21|14@0+ (0.1,-1021) [0|65535] "deg" XXX
+
+BO_ 610 FSM2: 8 FSM
+ SG_ SET_X_22 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ TrqLim : 23|8@0+ (1,-128) [0|255] "" PSCM
+ SG_ LKAAngleReq : 29|14@0+ (0.04,-327.68) [0|16383] "" PSCM
+ SG_ SET_X_02 : 31|2@0+ (1,0) [0|3] "" XXX
+ SG_ LKASteerDirection : 41|2@0+ (1,0) [0|3] "" PSCM
+ SG_ SET_X_10 : 47|6@0+ (1,0) [0|63] "" XXX
+ SG_ Checksum : 55|8@0+ (1,0) [0|255] "" PSCM
+ SG_ SET_X_A4 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 612 Accessories_03: 8 XXX
+ SG_ Park_Assist_Button : 60|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 624 FSM3: 8 FSM
+ SG_ ACC_Standstill : 0|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_Check : 2|1@0+ (1,0) [0|1] "" XXX
+ SG_ ACC_AccelDecel : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ ACC_Some : 17|10@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 648 BrakePedal: 8 XXX
+ SG_ Counter : 0|3@1+ (1,0) [0|6] "" XXX
+ SG_ BrakePressure : 17|10@0+ (1,0) [0|1023] "" XXX
+
+BO_ 750 HandBrake: 8 XXX
+ SG_ Hand_Brake_Button : 33|2@0+ (1,0) [0|3] "" XXX
+ SG_ Hand_Brake_State : 44|4@0+ (1,0) [0|15] "" XXX
+
+BO_ 794 FSM4: 8 FSM
+ SG_ ACC_LeadSpeed : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ NEW_SIGNAL_2 : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_1 : 47|16@0+ (1,-46090) [0|16383] "" XXX
+
+BO_ 802 StartStop: 8 XXX
+ SG_ StartStop : 8|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 923 Accessories_01: 8 XXX
+ SG_ NEW_SIGNAL_1 : 15|16@0+ (1,0) [0|65535] "" XXX
+ SG_ Wipers : 38|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1006 Doors: 8 XXX
+ SG_ DriverDoorClosed : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ PassengerDoorClosed : 9|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1021 FSM5: 8 FSM
+ SG_ TSR_Speed : 25|4@1+ (10,0) [0|15] "km/h" XXX
+
+BO_ 1024 NEW_MSG_400: 8 XXX
+ SG_ NEW_SIGNAL_1 : 25|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1039 MiscCarInfo: 8 XXX
+ SG_ TurnSignal : 33|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 1174 Lights: 8 XXX
+ SG_ High_Beam : 23|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 1279 PSCM3: 8 PSCM
+
+BO_ 1830 diagCEMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1838 diagCEMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1840 diagPSCMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1848 diagPSCMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1892 diagFSMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1900 diagFSMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 1939 diagCVMReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+BO_ 1947 diagCVMResp: 8 XXX
+ SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX
+ SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX
+
+BO_ 2015 diagGlobalReq: 8 XXX
+ SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX
+ SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX
+
+CM_ SG_ 16 SteeringDirection "0 = CCW, 1=CW (turning left or right of center)";
+CM_ SG_ 16 SteeringRateOfChange "Rate of change? Torque?";
+CM_ SG_ 81 ACCStatus "0=Acc Unavailable, 1=???, 2=Acc Ready, 3,4=???, 6= Acc Active, 7=Acc active tracking object (probably)";
+CM_ SG_ 295 ACCMinusBtnInv "Active zero when button pressed.";
+CM_ SG_ 295 TimeGapIncreaseBtnInv "Active zero when button pressed.";
+CM_ SG_ 295 TimeGapDecreaseBtnInv "Active zero when button pressed.";
+CM_ SG_ 295 ACCOnOffBtnInv "Active zero when button pressed.";
+CM_ SG_ 295 ACCResumeBtnInv "Active zero when button pressed.";
+CM_ SG_ 295 ACCSetBtnInv "Active zero when button pressed.";
+CM_ SG_ 295 ACCMinusBtn "ACC Minus (-) button pressed";
+CM_ SG_ 295 TimeGapIncreaseBtn "Increase the time gap on ACC";
+CM_ SG_ 295 TimeGapDecreaseBtn "Decrease the time gap on ACC";
+CM_ SG_ 295 ACCOnOffBtn "Cruise control on/off button pressed";
+CM_ SG_ 295 ACCResumeBtn "ACC Resume button pressed";
+CM_ SG_ 295 ACCSetBtn "Acc Set button (+) pressed";
+CM_ SG_ 298 NEW_SIGNAL_4 "related to gas pedal";
+CM_ SG_ 298 NEW_SIGNAL_5 "related to ACCStatus";
+CM_ SG_ 298 NEW_SIGNAL_6 "went high at same time as ACCStatus >= 2";
+CM_ SG_ 298 BrakePressed "driver";
+CM_ SG_ 298 EngineRpm "Might be engine rpm. But behaves a bit weird.";
+CM_ SG_ 582 byte0 "0=CCW, 1=CW, bit 2,";
+CM_ SG_ 582 SteeringWheelRateOfChange "Some rate of change for steering wheel? Torque?";
+CM_ SG_ 582 byte4 "High nibble";
+CM_ SG_ 582 LKAActive "Bit 1, 1 When LKA Active, Bit 3, 1 When denying?";
+CM_ SG_ 608 ACC_Distance "Seems to track distance, or speed of vehicle in front.";
+CM_ SG_ 610 SET_X_22 "0x20 Heartbeat, VEgo <58kph = 0x03, VEgo >65kph = 0x04, 0x05";
+CM_ SG_ 624 ACC_AccelDecel "Might be some acc speed, moved a bit after activating acc";
+CM_ SG_ 624 ACC_Some "Jumps to life after activating ACC, 0 when not active";
+CM_ SG_ 648 Counter "counts 0 to 6";
+CM_ SG_ 1021 TSR_Speed "Traffic Sign Recognition speed";
+CM_ SG_ 1039 TurnSignal "0 = Nothing, 1= Left, 3=Right";
+VAL_ 522 BrakePedal 1 "Not Pressed" 2 "Pressed";
diff --git a/iqdbc_repo/iqdbc/dbc/vw_meb.dbc b/iqdbc_repo/iqdbc/dbc/vw_meb.dbc
new file mode 100644
index 000000000..c22407cca
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/vw_meb.dbc
@@ -0,0 +1,3530 @@
+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_ Voltage : 86|12@1+ (0.24,0) [0|3] "V" XXX
+ SG_ Unknown_01 : 100|9@1+ (1,0) [0|7] "" XXX
+ SG_ Battery_Voltage : 113|13@1+ (0.065,0) [0|127] "V" 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_ 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_ 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_ 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_ 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_ 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.4,-14.8) [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|12@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_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ COUNTER : 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_Passenger : 12|7@1+ (1,0) [0|15] "" XXX
+ SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX
+ SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Warn_Driver : 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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX
+ SG_ Same_Lane_01_Unknown_01 : 256|8@1+ (1,-128) [0|31] "" XXX
+ SG_ Same_Lane_01_Unknown_02 : 264|6@1+ (1,-15) [0|31] "" XXX
+ SG_ Same_Lane_01_Unknown_03 : 270|6@1+ (1,0) [0|127] "" XXX
+ SG_ Same_Lane_01_Unknown_04 : 277|6@1+ (1,0) [0|7] "" XXX
+ SG_ Same_Lane_01_Unknown_05 : 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_ 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_ ACC_Event_Wunschgeschw : 140|10@1+ (0.32,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_Position : 281|2@1+ (1,0) [0|1] "" 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_ Lead_Distance_Right : 300|10@1+ (0.2,0) [0|15] "Unit_Meter" XXX
+ SG_ Lead_Distance_Left : 310|10@1+ (0.2,0) [0|3] "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] "Unit_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_ Unknown_01 : 45|2@1+ (1,0) [0|3] "" XXX
+ 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_VZE_01: 32 XXX
+ SG_ VZE_Anzeigemodus : 0|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ Detected_01 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_3 : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_2 : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Verkehrszeichen_1 : 11|8@1+ (5,0) [1|520] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_2 : 19|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_3 : 27|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_1 : 35|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_2 : 36|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_3 : 37|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_1 : 38|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_2 : 42|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_3 : 46|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_1 : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Zeichen_01_KameraWied : 51|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_KameraWied : 52|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_KameraWied : 53|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Kamera : 54|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Karte : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Gesetz : 56|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Kamera : 57|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Karte : 58|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Gesetz : 59|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Kamera : 60|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Karte : 61|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Gesetz : 62|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Gong : 63|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_4 : 75|8@1+ (1,0) [0|31] "" XXX
+ SG_ VZE_Verkehrszeichen_6 : 92|7@1+ (1,0) [0|7] "" XXX
+ SG_ VZE_Baustelle : 110|1@0+ (1,0) [0|1] "" XXX
+ SG_ Zeichen_Unknown : 129|4@1+ (1,0) [0|15] "" XXX
+ SG_ Zeichen_Unknown_Entfernung : 140|6@1+ (1,0) [0|15] "" XXX
+ SG_ Zusatzschild_Unknown : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ Unknown_02 : 167|4@1+ (1,0) [0|3] "" XXX
+ SG_ Unknown_01 : 207|1@0+ (1,0) [0|1] "" 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_ 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
+
+BO_ 316495058 Battery_Heating_Status: 8 XXX
+ SG_ Battery_Heating_Active : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Heating_Request : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cooling_Request : 42|3@1+ (1,0) [0|7] "" XXX
+ SG_ Power_Batt_Heating : 48|8@1+ (1,0) [0|255] "W" XXX
+ SG_ Power_Batt_Heating_Req : 56|8@1+ (1,0) [0|255] "W" XXX
+
+BO_ 441800114 Charging_Optimization: 8 XXX
+ SG_ Temperature_Status_Charge : 15|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 316495056 Charging_Dynamics: 8 XXX
+ SG_ Max_Charge_Power : 51|13@1+ (0.1,0) [0|819.1] "kW" XXX
+ SG_ Max_Charge_Current : 25|13@1+ (0.2,0) [0|1638.2] "A" XXX
+
+BO_ 380196006 Battery_Temperatures: 8 XXX
+ SG_ Battery_Max_Temp : 24|8@1+ (0.5,-40) [-40|87.5] "degC" XXX
+ SG_ Battery_Min_Temp : 32|8@1+ (0.5,-40) [-40|87.5] "degC" 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_ 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_ 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_ 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 ACC_Event_Wunschgeschw 1023 "None";
+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_Detected" 9 "Crossing" 4 "Speed_Limit_Ahead" 10 "Roundabout" 6 "Curve";
+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";
+VAL_ 316495015 VZE_Anzeigemodus 0 "EU_RDW" 1 "USA" 2 "Canada" 3 "China";
+VAL_ 316495015 VZE_Verkehrszeichen_Einheit 0 "mph" 1 "kmh";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_3 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_2 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Verkehrszeichen_1_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_1 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Verkehrszeichen_2_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_2 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Verkehrszeichen_3_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_3 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_2 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_3 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Zusatzschild_1 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Zusatzschild_2 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Zusatzschild_3 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_1 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Zeichen_01_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_02_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_03_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_01_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_01_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_01_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_02_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_02_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_02_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_03_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_03_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_03_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Gong 0 "Gong_deaktiv" 1 "Gong_aktiv";
+VAL_ 441800114 Temperature_Status_Charge 0 "init" 1 "temp under optimal" 2 "temp optimal" 3 "temp over optimal" 7 "fault";
+
+
+
+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_ Brake_Power : 80|8@1+ (1,-100) [0|255] "" XXX
+ SG_ Brake_01 : 90|1@0+ (1,0) [0|1] "" XXX
+ SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX
+ SG_ Brake_02 : 125|1@0+ (1,0) [0|1] "" XXX
+ SG_ Motion_State : 171|2@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 180|1@0+ (1,0) [0|1] "" XXX
+ SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX
+ SG_ Brake_Power_02 : 226|8@1+ (1,-100) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 236|9@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_1 : 248|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPB_Status : 317|3@1+ (1,0) [0|7] "" 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_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" 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_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" 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
+ SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX
+ SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" 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_ Unknown_01 : 12|3@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_63 : 18|6@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1_2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ Unknown_02 : 25|2@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_30 : 27|5@1+ (1,0) [0|15] "" XXX
+ SG_ SET_ME_127 : 33|7@1+ (1,0) [0|127] "" XXX
+ SG_ Unknown_03 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_127_2 : 41|7@1+ (1,0) [0|127] "" XXX
+ SG_ Pre_FCW : 64|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_63_2 : 66|6@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_15_1 : 72|4@1+ (1,0) [0|15] "" XXX
+ SG_ FCW_Active : 76|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_255 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_1023 : 94|10@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_1 : 129|1@0+ (1,0) [0|1] "" 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_ 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_ HCA_No_Override : 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_ 389241616 MEB_Camera_09: 8 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_ FCW_Reaction_1 : 12|1@0+ (1,0) [0|1] "" 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_Reaction_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX
+ SG_ FCW_Reaction_3 : 88|5@1+ (1,0) [0|31] "" XXX
+
+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
+
+VAL_ 258 Motion_State 1 "Forwards" 2 "Reversing" 3 "Stopped";
+VAL_ 258 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_ 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_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected";
+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";
diff --git a/iqdbc_repo/iqdbc/dbc/vw_meb_2024.dbc b/iqdbc_repo/iqdbc/dbc/vw_meb_2024.dbc
new file mode 100644
index 000000000..6e9aa3fa7
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/vw_meb_2024.dbc
@@ -0,0 +1,3543 @@
+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_ 84569818 Panda_Data_01: 32 Vector__XXX
+ SG_ Roll : 0|15@1+ (0.0001,0) [0|3] "rad" Vector__XXX
+ SG_ Roll_VZ : 15|1@1+ (1,0) [0|1] "" XXX
+
+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_ Voltage : 86|12@1+ (0.24,0) [0|3] "V" XXX
+ SG_ Unknown_01 : 100|9@1+ (1,0) [0|7] "" XXX
+ SG_ Battery_Voltage : 113|13@1+ (0.065,0) [0|127] "V" 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_ 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_ 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_ 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_ 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_ 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.4,-14.8) [0|100] "Unit_Percent" 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_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ COUNTER : 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_Passenger : 12|7@1+ (1,0) [0|15] "" XXX
+ SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX
+ SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Warn_Driver : 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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX
+ SG_ Same_Lane_01_Unknown_01 : 256|8@1+ (1,-128) [0|31] "" XXX
+ SG_ Same_Lane_01_Unknown_02 : 264|6@1+ (1,-15) [0|31] "" XXX
+ SG_ Same_Lane_01_Unknown_03 : 270|6@1+ (1,0) [0|127] "" XXX
+ SG_ Same_Lane_01_Unknown_04 : 277|6@1+ (1,0) [0|7] "" XXX
+ SG_ Same_Lane_01_Unknown_05 : 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_ 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_ ACC_Event_Wunschgeschw : 140|10@1+ (0.32,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_Position : 281|2@1+ (1,0) [0|1] "" 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_ Lead_Distance_Right : 300|10@1+ (0.2,0) [0|15] "Unit_Meter" XXX
+ SG_ Lead_Distance_Left : 310|10@1+ (0.2,0) [0|3] "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] "Unit_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_ Unknown_01 : 45|2@1+ (1,0) [0|3] "" XXX
+ 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_VZE_01: 32 XXX
+ SG_ VZE_Anzeigemodus : 0|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ Detected_01 : 8|1@0+ (1,0) [0|1] "" XXX
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_3 : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_2 : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Verkehrszeichen_1 : 11|8@1+ (5,0) [1|520] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_2 : 19|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_3 : 27|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_1 : 35|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_2 : 36|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_3 : 37|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_1 : 38|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_2 : 42|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_3 : 46|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_1 : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Zeichen_01_KameraWied : 51|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_KameraWied : 52|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_KameraWied : 53|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Kamera : 54|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Karte : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Gesetz : 56|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Kamera : 57|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Karte : 58|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Gesetz : 59|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Kamera : 60|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Karte : 61|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Gesetz : 62|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Gong : 63|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_4 : 75|8@1+ (1,0) [0|31] "" XXX
+ SG_ VZE_Verkehrszeichen_6 : 92|7@1+ (1,0) [0|7] "" XXX
+ SG_ VZE_Baustelle : 110|1@0+ (1,0) [0|1] "" XXX
+ SG_ Zeichen_Unknown : 129|4@1+ (1,0) [0|15] "" XXX
+ SG_ Zeichen_Unknown_Entfernung : 140|6@1+ (1,0) [0|15] "" XXX
+ SG_ Zusatzschild_Unknown : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ Unknown_02 : 167|4@1+ (1,0) [0|3] "" XXX
+ SG_ Unknown_01 : 207|1@0+ (1,0) [0|1] "" 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_ 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
+
+BO_ 316495058 Battery_Heating_Status: 8 XXX
+ SG_ Battery_Heating_Active : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ Heating_Request : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ Cooling_Request : 42|3@1+ (1,0) [0|7] "" XXX
+ SG_ Power_Batt_Heating : 48|8@1+ (1,0) [0|255] "W" XXX
+ SG_ Power_Batt_Heating_Req : 56|8@1+ (1,0) [0|255] "W" XXX
+
+BO_ 441800114 Charging_Optimization: 8 XXX
+ SG_ Temperature_Status_Charge : 15|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 316495056 Charging_Dynamics: 8 XXX
+ SG_ Max_Charge_Power : 51|13@1+ (0.1,0) [0|819.1] "kW" XXX
+ SG_ Max_Charge_Current : 25|13@1+ (0.2,0) [0|1638.2] "A" XXX
+
+BO_ 380196006 Battery_Temperatures: 8 XXX
+ SG_ Battery_Max_Temp : 24|8@1+ (0.5,-40) [-40|87.5] "degC" XXX
+ SG_ Battery_Min_Temp : 32|8@1+ (0.5,-40) [-40|87.5] "degC" 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_ 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_ 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_ 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_ 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 ACC_Event_Wunschgeschw 1023 "None";
+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_Detected" 9 "Crossing" 4 "Speed_Limit_Ahead" 10 "Roundabout" 6 "Curve";
+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";
+VAL_ 316495015 VZE_Anzeigemodus 0 "EU_RDW" 1 "USA" 2 "Canada" 3 "China";
+VAL_ 316495015 VZE_Verkehrszeichen_Einheit 0 "mph" 1 "kmh";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_3 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_2 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Verkehrszeichen_1_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_1 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Verkehrszeichen_2_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_2 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Verkehrszeichen_3_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_3 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_2 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_3 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Zusatzschild_1 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Zusatzschild_2 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Zusatzschild_3 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_1 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Zeichen_01_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_02_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_03_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_01_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_01_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_01_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_02_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_02_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_02_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_03_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_03_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_03_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Gong 0 "Gong_deaktiv" 1 "Gong_aktiv";
+VAL_ 441800114 Temperature_Status_Charge 0 "init" 1 "temp under optimal" 2 "temp optimal" 3 "temp over optimal" 7 "fault";
+
+
+
+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_ Brake_Power : 80|8@1+ (1,-100) [0|255] "" XXX
+ SG_ Brake_01 : 90|1@0+ (1,0) [0|1] "" XXX
+ SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX
+ SG_ Brake_02 : 125|1@0+ (1,0) [0|1] "" XXX
+ SG_ Motion_State : 171|2@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 180|1@0+ (1,0) [0|1] "" XXX
+ SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX
+ SG_ Brake_Power_02 : 226|8@1+ (1,-100) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 236|9@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_1 : 248|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPB_Status : 317|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 252 ESC_51: 64 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" 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_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" 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
+ SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX
+ SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" 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_ Unknown_01 : 12|3@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_63 : 18|6@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1_2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ Unknown_02 : 25|2@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_30 : 27|5@1+ (1,0) [0|15] "" XXX
+ SG_ SET_ME_127 : 33|7@1+ (1,0) [0|127] "" XXX
+ SG_ Unknown_03 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_127_2 : 41|7@1+ (1,0) [0|127] "" XXX
+ SG_ Pre_FCW : 64|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_63_2 : 66|6@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_15_1 : 72|4@1+ (1,0) [0|15] "" XXX
+ SG_ FCW_Active : 76|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_255 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_1023 : 94|10@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_1 : 129|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 267 Motor_51: 48 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_ 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_ HCA_No_Override : 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_ 389241616 MEB_Camera_09: 3 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_ FCW_Reaction_1 : 12|1@0+ (1,0) [0|1] "" 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_Reaction_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX
+ SG_ FCW_Reaction_3 : 88|5@1+ (1,0) [0|31] "" XXX
+
+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_ Speed_Mode_01 : 16|1@0+ (1,0) [0|1] "" XXX
+ SG_ Speed_Mode_02 : 18|1@0+ (1,0) [0|1] "" XXX
+ SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX
+ SG_ Init : 22|1@0+ (1,0) [0|1] "" XXX
+ SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Unknown_01 : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ Unknown_02 : 28|1@0+ (1,0) [0|1] "" XXX
+ SG_ Unknown_03 : 31|1@0+ (1,0) [0|1] "" XXX
+ SG_ Speed_Mode_Status : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ Lane_Unsure : 37|2@1+ (1,0) [0|3] "" 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_0x2FE : 98|10@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX
+ SG_ Speed : 236|12@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
+
+VAL_ 258 Motion_State 1 "Forwards" 2 "Reversing" 3 "Stopped";
+VAL_ 258 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_ 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_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected";
+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_ 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";
diff --git a/iqdbc_repo/iqdbc/dbc/vw_mlb.dbc b/iqdbc_repo/iqdbc/dbc/vw_mlb.dbc
new file mode 100644
index 000000000..052bc1ead
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/vw_mlb.dbc
@@ -0,0 +1,2759 @@
+VERSION "HNNBNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/4/%%%/4/'%**4NNN///"
+
+
+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_
+
+BS_:
+
+BU_: Airbag_D4 EPB_D4 ESP_D4 Gateway_D4C7 Getriebe_AL551_951_D4_C7 Getriebe_DL501_C7 Getriebe_VL381_C7 LWS_D4 Motor_EDC17_D4 Motor_ME17_BY Motor_MED17_SIMOS8_D4 Motor_Slave_D4 QSP_D4 SAK_C7 SCR_C7 SCU_D4
+
+BO_ 265 ACC_01: 8 Gateway_B8
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Magnetic_Ride_LB,Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Magnetic_Ride_LB,Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_Sollbeschleunigung : 24|11@1+ (0.005,-7.22) [-7.22|3.01] "Unit_MeterPerSeconSquar" Magnetic_Ride_LB,Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_neg_Sollbeschl_Grad : 40|8@1+ (0.05,0) [0|12.7] "Unit_MeterPerCubicSecon" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_pos_Sollbeschl_Grad : 48|8@1+ (0.05,0) [0|12.7] "Unit_MeterPerCubicSecon" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_Dynamik : 58|2@1+ (1,0) [0|3] "" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+ SG_ ACC_Anhalten : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid
+
+BO_ 780 ACC_02: 8 Gateway_D4C7
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" HUD_C7,Kombi_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" HUD_C7,Kombi_D4
+ SG_ ACC_Wunschgeschw_02 : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" HUD_C7,Kombi_D4
+ SG_ ACC_Status_Prim_Anz : 22|2@1+ (1.0,0.0) [0.0|3] "" HUD_C7,Kombi_D4
+ SG_ ACC_Abstandsindex : 24|10@1+ (1,0) [1|1021] "" HUD_C7,Kombi_D4
+ SG_ ACC_Akustik : 34|3@1+ (1.0,0.0) [0.0|7] "" Kombi_D4
+ SG_ ACC_Gesetzte_Zeitluecke : 37|3@1+ (1.0,0.0) [0.0|7] "" Kombi_D4
+ SG_ ACC_Optischer_Fahrerhinweis : 40|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ ACC_Typ_Tachokranz : 41|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ ACC_Anzeige_Zeitluecke : 42|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ ACC_Tachokranz : 43|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ ACC_Display_Prio : 44|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ ACC_Relevantes_Objekt : 46|2@1+ (1.0,0.0) [0.0|3] "" HUD_C7,Kombi_D4
+ SG_ ACC_Texte_Primaeranz : 48|7@1+ (1.0,0.0) [0.0|127] "" HUD_C7,Kombi_D4
+ SG_ ACC_Wunschgeschw_erreicht : 55|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ ACC_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" APS_D4,Kombi_D4
+
+BO_ 804 ACC_04: 8 Gateway_D4C7
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" HUD_C7,Kombi_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" HUD_C7,Kombi_D4
+ SG_ ACC_Texte_Zusatzanz : 16|6@1+ (1.0,0.0) [0.0|63] "" Kombi_D4
+ SG_ ACC_Status_Zusatzanz : 22|5@1+ (1.0,0.0) [0.0|31] "" HUD_C7,Kombi_D4
+ SG_ ACC_Texte : 27|5@1+ (1.0,0.0) [0.0|31] "" Kombi_D4
+ SG_ ACC_Texte_braking_guard : 32|3@1+ (1.0,0.0) [0.0|7] "" HUD_C7,Kombi_D4
+ SG_ ACC_Warnhinweis : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ACC_Geschw_Zielfahrzeug : 40|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Vector__XXX
+ SG_ ACC_Charisma_FahrPr : 56|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ ACC_Charisma_Status : 59|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ ACC_Charisma_Umschaltung : 61|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+
+BO_ 269 ACC_05: 8 Gateway_D4C7
+ SG_ ACC_05_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_Freigabe_Momentenanf : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_Freigabe_Verzanf : 13|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ ACC_Getriebestellung_P : 14|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ ACC_limitierte_Anfahrdyn : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_Momentenanforderung : 16|10@1+ (1,0) [0|1021] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_zul_Regelabw : 26|6@1+ (0.024,0) [0.000|1.512] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ ACC_Verz_anf : 32|11@1+ (0.005,-7.22) [-7.220|3.015] "Unit_MeterPerSeconSquar" Vector__XXX
+ SG_ ACC_Loeseanforderung : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ACC_StartStopp_Info : 44|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_Vorbefuellung_Bremsanlage : 47|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ACC_ax_Getriebe : 48|9@1+ (0.024,-2.016) [-2.016|10.248] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ ACC_Status_ACC : 57|3@1+ (1.0,0.0) [0.0|7] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_Betaetigung_EPB : 60|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ACC_Beeinflussung_ESP : 61|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ACC_Anhalten : 62|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ACC_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 279 ACC_10: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ AWV1_Anf_Prefill : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_CM_Info : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV2_Freigabe : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV1_HBA_Param : 19|2@1+ (1,0) [0|3] "" XXX
+ SG_ AWV2_Ruckprofil : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV2_Priowarnung : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_CM_Anforderung : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Info_Teilbremsung : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Notfallblinken : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Teilbremsung_Freigabe : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Zielbrems_Teilbrems_Verz_Anf : 29|10@1+ (0.024,-20.016) [-20.016|4.536] "Unit_MeterPerSeconSquar" XXX
+ SG_ ANB_Zielbremsung_Freigabe : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Vorstufe : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Halten : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_CityANB_Auspraegung : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ PCF_Freigabe : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV1_ECD_Anlauf : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_AWA_VZ_Anf_Lenkmomoffset : 46|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ AWV_AWA_Anf_Lenkmomoffset : 47|9@1+ (0.01,0) [0.00|5.11] "Unit_NewtoMeter" XXX
+ SG_ PCF_Time_to_collision : 56|8@1+ (0.01,0) [0|2.5] "Unit_Secon" XXX
+
+BO_ 64 Airbag_01: 8 Airbag_D4
+ SG_ Airbag_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AB_RGS_Anst : 12|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ AB_Front_Crash : 16|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Heck_Crash : 17|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_SF_Crash : 18|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_SB_Crash : 19|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Rollover_Crash : 20|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Crash_Int : 21|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AB_Lampe : 24|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Deaktiviert : 25|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_VB_deaktiviert : 26|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Systemfehler : 27|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Diagnose : 28|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Stellgliedtest : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AB_Erh_Auf_VB : 30|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtwarn_VF : 32|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Gurtwarn_VB : 33|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Anzeige_Fussg : 34|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Texte_AKS : 36|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_PAO_Leuchte_Anf : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_MKB_gueltig : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_MKB_Anforderung : 40|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_Versorgungsspannung : 41|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ AB_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 1312 Airbag_02: 8 Airbag_D4
+ SG_ AB_Belegung_VB : 26|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_FA : 40|2@1+ (1.0,0.0) [0.0|3] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AB_Gurtschloss_BF : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+
+BO_ 1633 Anhaenger_01: 3 Gateway_D4C7
+ SG_ AAG_BZ : 0|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AAG_Bremsl_durch_ECD : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AAG_Anhaenger_abgesteckt : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_NSL_aktiv : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_Anhaenger_erkannt : 8|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AAG_Blinker_H_aktiv : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_Blinker_HL_def : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_Blinker_HR_def : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_Bremslicht_H_def : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ AAG_Schlusslicht_HL_def : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_Schlusslicht_HR_def : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_KD_Fehler : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ AAG_AVS_Fehler : 18|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ AAG_AVS_Stati : 20|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+
+BO_ 777 BEM_01: 4 Gateway_D4C7
+ SG_ BEM_01_CHK : 0|8@1+ (1,0) [0|255] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BEM_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BEM_Segel_Info : 12|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BEM_n_LLA : 24|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BEM_01_Abschaltstufen : 26|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ BEM_Anf_KL : 29|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BEM_StartStopp_Info : 30|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 867 Blinkmodi_01: 4 Gateway_D4C7
+ SG_ BM_ZV_auf : 0|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_ZV_zu : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_DWA_ein : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_DWA_Alarm : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Crash : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Panik : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Not_Bremsung : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_GDO : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_links : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_rechts : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Warnblinken : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Autobahn : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Taxi_Notalarm : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_Telematik : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_HD_Oeffnung_angelernt : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_WBT_Beleuchtung : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ Blinken_li_Fzg_Takt : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ Blinken_re_Fzg_Takt : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ Blinken_li_Kombi_Takt : 18|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ Blinken_re_Kombi_Takt : 19|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ BM_NBA_n_codiert_n_aktiv : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BM_NBA_Status : 21|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ Blinken_FWB_aktiv : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 482 CCP_GE_CR0_01: 8 Gateway_D4C7
+ SG_ CCP_GE_CRO_01_Data : 0|64@1+ (1,0) [0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 490 CCP_GE_DTO_01: 8 Getriebe_AL551_951_D4_C7
+ SG_ CCP_GE_DTO_01_Data : 0|64@1+ (1,0) [0|1] "" Gateway_D4C7
+
+BO_ 480 CCP_MO_CRO_01: 8 Gateway_D4C7
+ SG_ CCP_MO_CRO_01_Data : 0|64@1+ (1,0) [0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 2616986624 CCP_MO_CRO_02: 8 Vector__XXX
+ SG_ CCP_MO_CRO_02_Data : 0|64@1+ (1,0) [0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 488 CCP_MO_DTO_01: 8 Motor_EDC17_D4
+ SG_ CCP_MO_DTO_01_Data : 0|64@1+ (1,0) [0|1] "" Gateway_D4C7
+
+BO_ 2616986625 CCP_MO_DTO_02: 8 Motor_EDC17_D4
+ SG_ CCP_MO_DTO_02_Data : 0|64@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 481 CCP_MOS_CRO_01: 8 Gateway_D4C7
+ SG_ CCP_MOS_CRO_01_Data : 0|64@1+ (1,0) [0|1] "" Motor_Slave_D4
+
+BO_ 2616986629 CCP_MOS_CRO_02: 8 Vector__XXX
+ SG_ CCP_MOS_CRO_02_Data : 0|64@1+ (1,0) [0|1] "" Motor_Slave_D4
+
+BO_ 489 CCP_MOS_DTO_01: 8 Motor_Slave_D4
+ SG_ CCP_MOS_DTO_01_Data : 0|64@1+ (1,0) [0|1] "" Gateway_D4C7
+
+BO_ 2616986630 CCP_MOS_DTO_02: 8 Motor_Slave_D4
+ SG_ CCP_MOS_DTO_02_Data : 0|64@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2617042432 CCP_Soundaktor_CRO_01: 8 Vector__XXX
+ SG_ CCP_Soundaktor_CRO_01_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SAK_C7
+
+BO_ 2617042433 CCP_Soundaktor_DTO_01: 8 SAK_C7
+ SG_ CCP_Soundaktor_DTO_01_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Vector__XXX
+
+BO_ 901 Charisma_01: 8 Gateway_D4C7
+ SG_ CHA_01_CHK : 0|8@1+ (1,0) [0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ CHA_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ CHA_Systemstatus : 12|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ CHA_Fahrer_Umschaltung : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_MO : 16|3@1+ (1.0,0.0) [0.0|7] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ CHA_Ziel_FahrPr_GE : 20|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ CHA_Ziel_FahrPr_ST : 24|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_SCU : 28|3@1+ (1.0,0.0) [0.0|7] "" SCU_D4
+ SG_ CHA_Ziel_FahrPr_DR : 32|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_QS : 36|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_AFS : 40|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_RGS : 44|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_EPS : 48|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_ACC : 52|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_SAK : 56|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+
+BO_ 2617027072 DEV_Airbag_01: 4 Airbag_D4
+ SG_ DEV_Airbag_01 : 0|32@1+ (1.0,0.0) [0.0|4294967295] "" Vector__XXX
+
+BO_ 1714 Diagnose_01: 8 Gateway_D4C7
+ SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,SAK_C7,SCR_C7,SCU_D4
+ SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4
+ SG_ Kombi_02_alt : 62|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4
+ SG_ Uhrzeit_01_alt : 63|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4
+
+BO_ 1520 Dimmung_01: 5 Gateway_D4C7
+ SG_ DI_KL_58d : 0|8@1+ (1,0) [0|253] "" Airbag_D4,Getriebe_AL551_951_D4_C7
+ SG_ DI_KL_58s : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Getriebe_AL551_951_D4_C7
+ SG_ DI_KL_58st : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Getriebe_AL551_951_D4_C7
+ SG_ DI_Lichtsensorwert : 24|16@1+ (1,0) [0|65535] "" Airbag_D4,Getriebe_AL551_951_D4_C7
+
+BO_ 1603 Einheiten_01: 3 Gateway_D4C7
+ SG_ KBI_Einheit_Datum : 0|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KBI_Einheit_Druck : 2|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4
+ SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KBI_Einheit_Temp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KBI_Einheit_Volumen : 10|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 260 EPB_01: 8 EPB_D4
+ SG_ EPB_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_QBit_Laengsbeschleunigung : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_QBit_Pedalweg_Kuppl : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_BCM2_Motor_Wakeup : 14|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Freig_Verzoeg_Anf : 15|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_Verzoeg_Anf : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" Gateway_D4C7
+ SG_ EPB_Laengsbeschleunigung : 24|8@1+ (1,-128) [-128|126] "Unit_PerCentOfForceOfGravi" Gateway_D4C7
+ SG_ EPB_Pedalweg_Kuppl : 32|8@1+ (0.4,0) [8.0|92.0] "Unit_PerCent" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_Anfahrwunsch_erkannt : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_DAA_Randbed_erf : 49|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Fehlerstatus : 50|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ EPB_Schalterposition : 52|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_QBit_Schalterpos : 54|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_Konsistenz_ACC : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Spannkraft : 56|5@1+ (1,0) [0|29] "Unit_KiloNewto" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ EPB_Status : 61|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EPB_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 781 EPB_02: 4 EPB_D4
+ SG_ EPB_Fehlerlampe_Gelb : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Fehlerlampe_BKL : 1|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Funktionslampe : 2|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Texte : 3|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ EPB_Akustik : 7|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Autoholdlampe : 8|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ EPB_Bremsbelag_Warn : 9|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 256 ESP_01: 8 Gateway_D4C7
+ SG_ ESP_01_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ASR_Moment_langsam : 12|10@1+ (1,0) [0|1021] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ASR_MSR_Moment_schnell : 22|10@1+ (1,0) [0|1021] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0.00|655.32] "Unit_KiloMeterPerHour" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7
+ SG_ ASR_Tastung_passiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Tastung_passiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Systemstatus : 50|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ASR_Schalteingriff : 51|2@1+ (1.0,0.0) [0.0|3] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Schlechtweg : 53|1@1+ (1.0,0.0) [0.0|1] "" Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ OBD_QBit_Schlechtweg : 54|1@1+ (1.0,0.0) [0.0|1] "" Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_QBit_v_Signal : 55|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7
+ SG_ ABS_Bremsung : 56|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ASR_Anf : 57|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ MSR_Anf : 58|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EBV_Eingriff : 59|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ EDS_Eingriff : 60|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Eingriff : 61|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_ASP : 62|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 257 ESP_02: 8 Gateway_D4C7
+ SG_ ESP_02_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_QBit_Gierrate : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4
+ SG_ ESP_QBit_Laengsbeschl : 13|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_QBit_Querb : 14|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Stillstandsflag : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Querbeschleunigung : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Laengsbeschl : 24|10@1+ (0.03125,-16) [-16.00000|15.90625] "Unit_MeterPerSeconSquar" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Verteil_Wankmom : 34|5@1+ (0.1,-1) [-1.0|1.0] "" Vector__XXX
+ SG_ ESP_QBit_Anf_Vert_Wank : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Gierrate : 40|14@1+ (0.01,0) [0.00|163.82] "Unit_DegreOfArcPerSecon" Airbag_D4
+ SG_ ESP_VZ_Gierrate : 54|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4
+ SG_ ESP_Notbremsanzeige : 55|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_SpannungsAnf : 56|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_PLA_Abbruch : 57|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ ESP_Status_ESP_PLA : 60|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+
+BO_ 259 ESP_03: 8 Gateway_D4C7
+ SG_ ESP_03_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_VL_FR : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_VR_FR : 13|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_HL_FR : 14|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_HR_FR : 15|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_VL_Radgeschw : 16|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4
+ SG_ ESP_VR_Radgeschw : 28|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4
+ SG_ ESP_HL_Radgeschw : 40|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4
+ SG_ ESP_HR_Radgeschw : 52|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4
+
+BO_ 776 ESP_04: 8 Gateway_D4C7
+ SG_ ESP_Meldungen : 0|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ ESP_HDC_FktLampe : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Lampe : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ABS_Lampe : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BK_Lampe : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Akustik : 7|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ ESP_Diagnose : 9|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4
+ SG_ ESP_Textanzeigen_02 : 10|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ ESP_Off_Lampe : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_m_Raddrehz : 16|15@1+ (0.002,0) [0.000|65.278] "Unit_Hertz" Vector__XXX
+ SG_ ESP_ASR_Lampe : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Wegimp_VA : 32|11@1+ (1,0) [0|2047] "" Vector__XXX
+ SG_ ESP_Fehlerstatus_Wegimp : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Wegimp_Ueberlauf : 44|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_QBit_Wegimp_VA : 45|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Displaywarnungen : 46|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ ESP_HDC_Regelgeschw : 48|7@1+ (0.32,0) [0.32|39.68] "Unit_KiloMeterPerHour" Vector__XXX
+ SG_ ESP_BKV_Warnung : 55|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Zaehnezahl : 56|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 262 ESP_05: 8 Gateway_D4C7
+ SG_ ESP_05_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_QBit_Bremsdruck : 12|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_QBit_Fahrer_bremst : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Schwelle_Unterdruck : 14|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ ESP_Bremsdruck : 16|10@1+ (0.3,-30) [-30.0|276.6] "Unit_Bar" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Fahrer_bremst : 26|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Verz_TSK_aktiv : 27|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Lenkeingriff_ADS : 28|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ESP_Konsistenz_TSK : 29|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Bremsruck_AWV2 : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Konsistenz_AWV2 : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ECD_Fehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ECD_nicht_verfuegbar : 33|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Status_Bremsentemp : 34|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Autohold_Standby : 35|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7
+ SG_ ESP_HDC_Standby : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_HBA_aktiv : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Prefill_ausgeloest : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Rueckwaertsfahrt_erkannt : 39|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Status_Anfahrhilfe : 40|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_MED17_SIMOS8_D4
+ SG_ ESP_HDC_aktiv : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_StartStopp_Info : 42|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Eingr_HL : 44|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Eingr_HR : 45|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Eingr_VL : 46|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Eingr_VR : 47|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_BKV_Unterdruck : 48|8@1+ (4,0) [0|1012] "Unit_MilliBar" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Autohold_aktiv : 56|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_FStatus_Anfahrhilfe : 57|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Verz_EPB_aktiv : 58|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7
+ SG_ ECD_Bremslicht : 59|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Verzoeg_EPB_verf : 60|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4
+ SG_ ESP_Status_Bremsdruck : 61|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Anforderung_EPB : 62|2@1+ (1.0,0.0) [0.0|3] "" EPB_D4
+
+BO_ 132 ESP_06: 8 ESP_D4
+ SG_ ESP_06_CHK : 0|8@1+ (1,0) [0|255] "" SCU_D4
+ SG_ ESP_06_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_D4,SCU_D4
+ SG_ ESP_06_KD_Fehler : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ ESP_Teilsollwinkel : 16|11@1+ (0.1,0) [0.0|204.7] "Unit_DegreOfArc" SCU_D4
+ SG_ ESP_VZ_Teilsollwinkel : 27|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4
+ SG_ ESP_Winkeleingriff : 28|2@1+ (1.0,0.0) [0.0|3] "" SCU_D4
+ SG_ ESP_Status_ADS : 30|2@1+ (1.0,0.0) [0.0|3] "" SCU_D4
+ SG_ ESP_v_ref : 32|12@1+ (0.125,0) [0.000|511.500] "Unit_KiloMeterPerHour" Airbag_D4
+ SG_ void_Byte_10 : 48|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ ESP_06_CRC : 56|8@1+ (1,0) [0|255] "" Airbag_D4,SCU_D4
+
+BO_ 914 ESP_07_FR: 8 Gateway_D4C7
+ SG_ ESP_07_CHK : 0|8@1+ (1,0) [0|255] "" LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_07_BZ : 8|4@1+ (1,0) [0|15] "" LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_ACC_LDE : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Quattro_Antrieb : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Codierung_ADS : 14|2@1+ (1.0,0.0) [0.0|3] "" LWS_D4
+ SG_ ESP_RTA_HL : 16|8@1+ (0.048828125,-6.20117) [-6.201170000|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ ESP_RTA_HR : 24|8@1+ (0.048828125,-6.20117) [-6.201170000|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ ESP_RTA_VR : 32|8@1+ (0.048828125,-6.20117) [-6.201170000|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ OBD_Fehler_Radsensor_HL : 40|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ OBD_Fehler_Radsensor_HR : 44|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ OBD_Fehler_Radsensor_VL : 48|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ OBD_Fehler_Radsensor_VR : 52|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Qualifizierung_Antriebsart : 56|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Offroad_Modus : 57|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_MKB_ausloesbar : 58|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_MKB_Status : 59|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_CM_Variante : 60|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_OBD_Status : 61|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 286 ESP_08: 8 Vector__XXX
+ SG_ ESP_08_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ ESP_08_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ ESP_ANB_CM_Rueckk_Umsetz : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Konsistenz_ACC_Botschaft : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Stillstandsphase_erschoepft : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_ZT_Rueckk_Umsetz : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Tuerkontakt_Fahrertuer : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Abrutschen_Stillstand : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Fahrer_tritt_ZBR_Schw : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_QBit_v_ref : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_v_ref_Fahrtrichtung : 42|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ ESC_Bremsdruckgradient : 44|8@1+ (10,0) [0|2500] "Unit_BarPerSecon" Vector__XXX
+ SG_ ESP_v_ref : 52|12@1+ (0.125,0) [0|511.5] "Unit_KiloMeterPerHour" Vector__XXX
+
+BO_ 1623 ESP_17: 8 ESP_D4
+ SG_ ESP_17_CRC : 0|8@1+ (1,0) [0|255] "" EPB_D4
+ SG_ ESP_17_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4
+ SG_ ESP_BremsenTemp_hinten : 12|3@1+ (1.0,0.0) [0.0|7] "" EPB_D4
+
+BO_ 924 Gateway_05: 8 Gateway_D4C7
+ SG_ BCM1_02_alt : 0|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Wischer_01_alt : 1|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Klima_02_alt : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_01_alt : 3|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_07_alt : 4|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ TSG_BT_1_alt : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ TSG_HL_1_alt : 6|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ TSG_HR_1_alt : 7|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Motor_02_alt : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ Klima_Sensor_02_alt : 9|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7
+ SG_ TSG_FT_1_alt : 10|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Motor_05_alt : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ QSP_01_alt : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Parkhilfe_01_alt : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Fahrwerk_02_alt : 14|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GW_05_va_27 : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_MH_WIV_Schalter : 16|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Wischer_vorne_aktiv : 17|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BCM1_Rueckfahrlicht_Schalter : 18|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ MO_Status_Normalbetrieb_01 : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KL_Zuheizer_Freigabe : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Vorwaertsgang_eingelegt : 21|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4
+ SG_ ESP_Codierung_ADS : 22|2@1+ (1.0,0.0) [0.0|3] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ QSP_StartStopp_Info : 24|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ FA_StartStopp_Info : 26|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ PH_StartStopp_Info : 28|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Beschlagsgefahr : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_GLW_Fernlicht_Anf : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_RFahrlicht_Fzg_Anf : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FT_Tuer_geoeffnet : 33|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ MO_Handshake_STH : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FT_Sperrklinke : 35|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BCM1_OBD_FStatus_ATemp : 36|4@1+ (1.0,0.0) [0.0|15] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7
+ SG_ BCM1_Aussen_Temp_ungef : 40|8@1+ (0.5,-50) [-50.0|76.0] "Unit_DegreCelsi" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7
+ SG_ BCM1_Oeldruck_Schalter : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Oeldruck_Schalter_2 : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BT_Tuer_geoeffnet : 50|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ HL_Tuer_geoeffnet : 51|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ HR_Tuer_geoeffnet : 52|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BCM1_Adaptive_Lichtvert_Anf : 53|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Gleitende_Leuchtw_Anf : 54|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Schalter_StartStopp : 55|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ESP_Offroad_Modus : 56|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ MO_Freig_Reku : 57|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+
+BO_ 927 Gateway_06: 8 XXX
+ SG_ AB_Gurtschloss_FA : 30|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 1604 Gateway_11: 8 Gateway_D4C7
+ SG_ SMLS_01_alt : 0|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ HUD_01_alt : 1|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_01_alt : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_02_alt : 3|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BCM2_02_alt : 4|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_VL381_C7
+ SG_ HYB_Anf_E_Mode_alt : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_04_alt : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_04_alt : 7|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4
+ SG_ GW_11_va_20 : 8|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_21 : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_22 : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_23 : 11|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_24 : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_25 : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_26 : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_11_va_27 : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BH_Blinker_li : 16|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BH_Blinker_re : 17|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BM_Autobahn : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BH_Fernlicht : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BH_Lichthupe : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_MH_Schalter : 21|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ HYB_Anf_E_Mode : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ HUD_NV_in_Anzeige : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Touristen_Licht_Anf : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LV_Abblendlicht_li_def : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LV_Abblendlicht_re_def : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LV_Abblendlicht_Anzeige : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LV_AFL_aktiv_Anzeige : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Licht_Dunkelheit_aktiv : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LV_Nebelschlusslicht_Anzeige : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM1_Linksverkehr : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ BCM2_P_verriegelt : 32|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_VL381_C7
+ SG_ BCM1_LDS_Stellung : 33|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ BCM1_Allwetterlicht_Anf : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ HUD_Anzeigefehler_NV : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ ESP_Diagnose : 38|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4
+
+BO_ 130 Getriebe_01: 8 Getriebe_AL551_951_D4_C7
+ SG_ Getriebe_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Getriebe_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Schaltvorgang : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Status_Kupplung : 13|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Verbot_Ausblendung : 15|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_MMom_Soll : 16|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_MMom_Status : 26|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Freig_Mmom_Soll : 28|1@1+ (1,0) [0|1] "" Gateway_D4C7
+ SG_ GE_Status_Schaltablauf : 29|3@1+ (1,0) [0|7] "" Gateway_D4C7
+ SG_ GE_MMom_Vorhalt : 32|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Freig_MMom_Vorhalt : 42|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 131 Getriebe_02: 8 Getriebe_AL551_951_D4_C7
+ SG_ Getriebe_02_CHK : 0|8@1+ (1,0) [0|255] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Getriebe_02_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Anf_Zylabsch : 13|2@1+ (1.0,0.0) [0.0|3] "" Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Synchro_Wunschdrehz : 15|9@1+ (25,0) [0|12750] "Unit_MinutInver" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Synchro_Zeit : 24|8@1+ (20,0) [0|5080] "Unit_MilliSecon" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Mom_Begr_Gradient : 32|8@1+ (10,0) [0|2540] "Unit_NewtoMeterPerSecon" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Anheb_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Vorsteuermoment : 48|9@1+ (1,0) [0|509] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Drehzahlmesser_Daempfung : 58|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Schubabschalt_Unt : 59|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Freigabe_Synchro : 60|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_HYB_DZ_Eingriff : 61|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+
+BO_ 258 Getriebe_03: 8 Getriebe_AL551_951_D4_C7
+ SG_ Getriebe_03_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Getriebe_03_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Freig_Langfr_Schutzmom : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Uefkt : 14|10@1+ (0.1,0) [0.0|102.2] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Zielgang : 24|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_StartStopp_Info : 28|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Langfr_Schutzmom : 32|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_reserv_Waehlhebel : 43|1@1+ (1,0) [0|1] "" Gateway_D4C7
+ SG_ GE_Waehlhebel : 44|4@1+ (1.0,0.0) [0.0|15] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Eingangsdrehz : 48|14@1+ (1,0) [0|16381] "Unit_MinutInver" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Notlauf : 62|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Codierung_MSG : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 1089 Getriebe_04: 8 Getriebe_AL551_951_D4_C7
+ SG_ GE_Index_Fahrwid : 0|8@1+ (0.249,-31.623) [-31.623|31.623] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Heizwunsch : 8|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_OBD_Status : 10|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_LFR_Adaption : 11|1@1+ (1,0) [0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_OBD_AbsperrVent : 12|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ GE_Grenzkriechmoment : 16|6@1+ (2,0) [0|122] "" Gateway_D4C7
+ SG_ GE_Charisma_FahrPr : 24|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+ SG_ GE_Charisma_Status : 27|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ GE_Charisma_Umschaltung : 29|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ GE_Freigabe_Verfallsinfo_WFS : 31|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Verlustmoment : 32|8@1+ (1,0) [0|254] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_amax_moeglich : 42|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ GE_Sumpftemperatur : 56|8@1+ (1,-58) [-58|196] "Unit_DegreCelsi" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+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) [15|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_Sendestatus : 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_Status_HCA : 32|4@1+ (1,0) [0|15] "" 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_ 1811 ISO_ABS_Req: 8 Gateway_D4C7
+ SG_ ISO_ABS_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" ESP_D4
+
+BO_ 1917 ISO_ABS_Resp: 8 ESP_D4
+ SG_ ISO_ABS_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1813 ISO_Airbag_01_Req: 8 Gateway_D4C7
+ SG_ ISO_Airbag_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4
+
+BO_ 1919 ISO_Airbag_01_Resp: 8 Airbag_D4
+ SG_ ISO_Airbag_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1874 ISO_EPB_Req: 8 Gateway_D4C7
+ SG_ ISO_EPB_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" EPB_D4
+
+BO_ 1980 ISO_EPB_Resp: 8 EPB_D4
+ SG_ ISO_EPB_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1795 ISO_Funktionaler_Req_Aggregate: 8 Gateway_D4C7
+ SG_ ISO_Functionaler_Req_Aggregate : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+
+BO_ 1792 ISO_Funktionaler_Req_All: 8 Gateway_D4C7
+ SG_ ISO_ALL_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4,EPB_D4,ESP_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SAK_C7,SCR_C7
+
+BO_ 2015 ISO_Funktionaler_Req_OBD: 8 Gateway_D4C7
+ SG_ ISO_OBD_Funktionaler_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+
+BO_ 2017 ISO_Getriebe_01_Req: 8 Gateway_D4C7
+ SG_ ISO_Getriebe_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 2025 ISO_Getriebe_01_Resp: 8 Getriebe_AL551_951_D4_C7
+ SG_ ISO_Getriebe_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 2016 ISO_MO_01_Req: 8 Gateway_D4C7
+ SG_ ISO_MO_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 2024 ISO_MO_01_Resp: 8 Motor_EDC17_D4
+ SG_ ISO_MO_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 2018 ISO_MOS_01_Req: 8 Gateway_D4C7
+ SG_ ISO_MOS_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Motor_Slave_D4
+
+BO_ 2026 ISO_MOS_01_Resp: 8 Motor_Slave_D4
+ SG_ ISO_MOS_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 2019 ISO_OBD_reserv5_Req: 8 Gateway_D4C7
+ SG_ ISO_OBD_reserv5_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Vector__XXX
+
+BO_ 2027 ISO_OBD_reserv5_Resp: 8 Vector__XXX
+ SG_ ISO_OBD_reserv5_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1834 ISO_SCR_Req: 8 Gateway_D4C7
+ SG_ ISO_SCR_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SCR_C7
+
+BO_ 1940 ISO_SCR_Resp: 8 SCR_C7
+ SG_ ISO_SCR_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1814 ISO_SCU_Req: 8 Gateway_D4C7
+ SG_ ISO_SCU_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Vector__XXX
+
+BO_ 1920 ISO_SCU_Resp: 8 Vector__XXX
+ SG_ ISO_SCU_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1820 ISO_Soundaktor_Req: 8 Gateway_D4C7
+ SG_ ISO_Soundaktor_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SAK_C7
+
+BO_ 1926 ISO_Soundaktor_Resp: 8 SAK_C7
+ SG_ ISO_Soundaktor_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1875 ISO_Waehlhebel_Req: 8 Gateway_D4C7
+ SG_ ISO_Waehlhebel_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7
+
+BO_ 1981 ISO_Waehlhebel_Resp: 8 Getriebe_AL551_951_D4_C7
+ SG_ ISO_Waehlhebel_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1424 Kessy_02: 8 Gateway_D4C7
+ SG_ KY_Funkschl_Nr : 0|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+ SG_ KY_ID_Geb_autorisiert : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_ID_Geb_steckt : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_FFB_Frequenz : 6|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KY_HF_Aktiv : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_LF_Aktiv : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_ELV_verr : 10|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4
+ SG_ KY_ELV_entr : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_ELV_enable_Anforderung : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_Valet_Parking : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_Keyless_Verbau : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_FBS_Fahrer_Hinweise : 16|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ FBS_Warn_Lenkung_def : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FBS_Warn_LenkVerriegelung_def : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FBS_Warn_Schluessel_Batt : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FBS_Prio_Warn_04 : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FBS_Prio_Warn_05 : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_KYL_Fahrer_Hinweise : 24|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ KYL_Warn_kein_Schluessel : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KYL_Warn_Kessy_defekt : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_KYL_Prio_Warn_03 : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_KYL_Prio_Warn_04 : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_KYL_Prio_Warn_05 : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_Schluessel_Soll : 32|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+ SG_ KY_Schluessel_Ist : 36|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+ SG_ KY_WFS_Safe : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KY_WFS_LZ : 41|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KY_StartStopp_Info : 43|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KYL_Notzuendschloss : 45|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KYL_Warn_Notzuendschloss : 46|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ FBS_KD_Fehler : 47|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 960 Klemmen_Status_01: 4 Gateway_D4C7
+ SG_ Klemmen_Status_01_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ Klemmen_Status_01_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ ZV_verriegelt_extern_soll_02 : 12|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ ZAS_Kl_S : 16|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7
+ SG_ ZAS_Kl_15 : 17|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4
+ SG_ ZAS_Kl_X : 18|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,SCU_D4
+ SG_ ZAS_Kl_50 : 19|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 959 Klima_01: 8 Gateway_D4C7
+ SG_ KL_Drehz_Anh : 0|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Handshake_BEM : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KL_Komp_Moment_alt : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KL_Vorwarn_HHS_ein : 4|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Vorwarn_HFS_ein : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KL_KD_Fehler : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KL_Comp_rev_rq : 8|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX
+ SG_ KL_Charisma_FahrPr : 16|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ KL_Charisma_Status : 19|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KL_Charisma_Umschaltung : 21|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0.00|63.50] "Unit_NewtoMeter" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Leistung_Hzg_Soll : 32|8@1+ (11,0) [0|2805] "Unit_Watt" Vector__XXX
+ SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0.0|101.6] "Unit_PerCent" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_4_Zonen : 48|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_AC_Schalter : 49|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KL_Zustand : 50|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Thermomanagement : 51|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_Comp_enable : 53|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KL_StartStopp_Info : 54|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KL_el_Zuheizer_Stufe : 56|3@1+ (1.0,0.0) [0.0|7] "" Motor_EDC17_D4
+ SG_ KL_Diag_Absperrvent : 59|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+
+BO_ 779 Kombi_01: 8 Gateway_D4C7
+ SG_ KBI_ABS_Lampe : 0|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_ESP_Lampe : 1|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_BKL_Lampe : 2|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Airbag_Lampe : 3|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_SILA_gueltig : 4|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Lenkung_Lampe : 5|1@1+ (1,0) [0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Vorglueh_System_Lampe : 6|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4
+ SG_ KBI_NV_in_Anzeige : 7|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ XCOUNTER : 8|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Anzeigestatus_ACC : 12|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Oeldruck_Schalter : 15|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Tankwarnung : 16|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_MFA_v_Einheit_01 : 17|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_im_Stellgliedtest : 18|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Anzeigefehler_LDW : 19|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Variante_USA : 21|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Oeldruckwarnung : 22|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Handbremse : 23|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_V_Digital : 24|9@1+ (1,0) [0|511] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_PLA_in_Anzeige : 33|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Anzeigefehler_NV : 34|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_angez_Geschw : 48|10@1+ (0.32,0) [0.00|325.12] "Unit_KiloMeterPerHour" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_Einheit_Tacho : 58|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_Konsistenz_ACC : 59|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Fehler_Anzeige_ACC : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_Anzeigefehler_SWA : 61|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7
+ SG_ KBI_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+
+BO_ 1719 Kombi_02: 8 Gateway_D4C7
+ SG_ KBI_Kilometerstand : 0|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Vector__XXX
+ SG_ KBI_Standzeit : 20|15@1+ (4,0) [0|131068] "Unit_Secon" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_Reset_Standzeit : 35|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_Inhalt_Tank : 40|7@1+ (1,0) [0|126] "Unit_Liter" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_FStatus_Tank : 47|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ KBI_QBit_Aussen_Temp_gef : 55|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7
+ SG_ KBI_Aussen_Temp_gef : 56|8@1+ (0.5,-50) [-50.0|75.0] "Unit_DegreCelsi" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7
+
+BO_ 1720 Kombi_03: 8 Gateway_D4C7
+ SG_ KBI_Reifenumfang : 0|12@1+ (1,0) [0|4095] "Unit_MilliMeter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ WFS_Schluessel_Fahrberecht : 12|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+ SG_ KBI_BCmE_aktiv : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ KBI_Sparhinweis_quittiert : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 517 KS_Airbag: 8 Airbag_D4
+ SG_ KS_Airbag_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 640 KS_Master: 8 Gateway_D4C7
+ SG_ KS_Master_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4
+
+BO_ 919 LDW_02: 8 Gateway_D4C7
+ SG_ LDW_Gong : 12|2@1+ (1.0,0.0) [0.0|3] "" Kombi_D4
+ SG_ LDW_SW_Warnung_links : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LDW_Texte : 16|4@1+ (1.0,0.0) [0.0|15] "" Kombi_D4
+ SG_ LDW_Seite_DLCTLC : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LDW_Lernmodus : 21|3@1+ (1.0,0.0) [0.0|7] "" HUD_C7
+ SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" SMLS_D4
+ SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" SMLS_D4
+ SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" SMLS_D4
+ 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" Vector__XXX
+ SG_ LDW_TLC : 48|5@1+ (0.1,0) [0.0|3.0] "Unit_Secon" Vector__XXX
+ SG_ LDW_Warnung_links : 56|1@1+ (1.0,0.0) [0.0|1] "" SMLS_D4
+ SG_ LDW_Warnung_rechts : 57|1@1+ (1.0,0.0) [0.0|1] "" SMLS_D4
+ SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1.0,0.0) [0.0|3] "" SMLS_D4
+ SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1.0,0.0) [0.0|1] "" Klima_D4_C7,SMLS_D4
+ SG_ LDW_Status_LED_gelb : 61|1@1+ (1.0,0.0) [0.0|1] "" APS_D4,Kombi_D4
+ SG_ LDW_Status_LED_gruen : 62|1@1+ (1.0,0.0) [0.0|1] "" APS_D4,Kombi_D4
+ SG_ LDW_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 810 LH_EPS_01: 8 Gateway_D4C7
+ SG_ EPS_01_CRC : 0|8@1+ (1,0) [0|255] "" APS_D4
+ SG_ EPS_01_BZ : 8|4@1+ (1,0) [0|15] "" APS_D4
+ SG_ EPS_Akustiksignal : 16|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4
+ SG_ EPS_Fehlerlampe : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ EPS_KD_Fehler : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ EPS_Warnungen : 19|3@1+ (1.0,0.0) [0.0|7] "" Kombi_D4
+ SG_ EPS_PLA_Fehler : 26|4@1+ (1,0) [0|15] "" APS_D4
+ SG_ EPS_Charisma_FahrPr : 34|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ EPS_Charisma_Status : 37|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ EPS_Charisma_Umschaltung : 39|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ EPS_Lenkerposition : 41|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ EPS_Anf_KL : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+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.0) [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.0|100.0] "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.0) [0.0|1] "" SCU_D4
+ SG_ EPS_Leistungsanforderung : 40|1@1+ (1.0,0.0) [0.0|1] "" 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_ 1137 Licht_hinten_01: 8 Gateway_D4C7
+ SG_ Licht_hinten_01_BZ : 0|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LH_Aussenlicht_def : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Blinker_HL_akt : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Blinker_HR_akt : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Blinker_li_def : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Bremsl_li_def : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schlusslicht_li_def : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Rueckf_li_def : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Nebel_li_def : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Brems_Blk_li_def : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Blinker_re_def : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Bremsl_re_def : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schlusslicht_re_def : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Rueckf_re_def : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Nebel_re_def : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Brems_Blk_re_def : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Kennzl_def : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_3_Bremsl_def : 49|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LH_Nebel_mi_def : 50|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Rueckf_mi_def : 51|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 267 LS_01: 4 Gateway_D4C7
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Hauptschalter : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Abbrechen : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Typ_Hauptschalter : 14|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Limiter : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Tip_Setzen : 16|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Tip_Hoch : 17|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Tip_Runter : 18|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Tip_Wiederaufnahme : 19|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Verstellung_Zeitluecke : 20|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ MFL_Tip_Down : 22|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MFL_Tip_Up : 23|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ LS_Tiptronic_Fehler : 24|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7
+ SG_ LS_Fehler : 25|1@1+ (1,0) [0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Codierung : 26|3@1+ (1.0,0.0) [0.0|7] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_Tip_Stufe_2 : 29|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ LS_GRA_ACC_2stufig : 30|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ MFL_M_Taste : 31|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+
+BO_ 134 LWI_01: 8 LWS_D4
+ SG_ LWI_01_CHK : 0|8@1+ (1,0) [0|255] "" ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4
+ SG_ LWI_Sensorstatus : 12|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4
+ SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,QSP_D4,SCU_D4
+ SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4
+ SG_ LWI_Lenkradwinkel : 16|13@1+ (0.1,0) [0.0|800.0] "Unit_DegreOfArc" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4
+ SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4
+ SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,QSP_D4
+ SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" Gateway_D4C7,QSP_D4
+ SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" ESP_D4,Gateway_D4C7,QSP_D4,SCU_D4
+ SG_ LWI_01_CRC : 56|8@1+ (1,0) [0|255] "" Airbag_D4,ESP_D4,Gateway_D4C7,QSP_D4,SCU_D4
+
+BO_ 128 Motor_01: 8 Motor_EDC17_D4
+ SG_ Motor_01_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ Motor_01_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Mom_o_ex : 12|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Mom_m_ex : 22|10@1+ (1,0) [0|1021] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7
+ SG_ MO_Mom_Verlust : 32|10@1+ (1,0) [0|1021] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7
+ SG_ MO_Mom_Begrenzung : 42|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Mom_Fahrerwunsch : 52|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Kickdown : 62|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 129 Motor_02: 8 Motor_EDC17_D4
+ SG_ Motor_02_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4
+ SG_ Motor_02_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4
+ SG_ MO_Mom_ZWR : 12|10@1+ (1,0) [0|1021] "" Gateway_D4C7
+ SG_ MO_Mom_Soll : 22|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Mom_Ist : 32|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Status_Zylabschalt_01 : 42|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7
+ SG_ MO_Status_Normalbetrieb_01 : 43|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_StartStopp_Status : 44|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4
+ SG_ MO_StartStopp_Motorstopp : 46|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4
+ SG_ MO_StartStopp_Wiederstart : 47|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4
+ SG_ MO_Ext_E_Fahrt_aktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Gangposition : 49|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ MO_StartStopp_Fahrerwunsch : 53|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Momentenintegral : 56|8@1+ (0.3921,0) [0.0000|99.9855] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 261 Motor_03: 8 Motor_EDC17_D4
+ SG_ MOTOR_03_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4
+ SG_ MO_QBit_Fahrpedalwerte_01 : 12|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_QBit_Motormomente : 13|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_QBit_Fahrer_bremst : 14|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_QBit_Drehzahl_01 : 15|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7
+ SG_ MO_Drehzahl_01 : 16|16@1+ (0.25,0) [0.00|16383.00] "Unit_MinutInver" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7,SCR_C7,SCU_D4
+ SG_ MO_Moment_im_Leerlauf : 32|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Interlock : 33|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7
+ SG_ MO_BLS : 34|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Fahrer_bremst : 35|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Konsistenz_Bremsped : 36|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Kuppl_schalter : 37|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7
+ SG_ MO_Timeout_ESP : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Motor_laeuft : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Fahrpedalrohwert_01 : 48|8@1+ (0.4,0) [0.0|101.6] "Unit_PerCent" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_erste_Ungenauschwelle : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_QBit_Stressfaktor : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Stressfaktor : 58|6@1+ (1.6,0) [0.0|100.8] "Unit_PerCent" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 263 Motor_04: 8 Motor_EDC17_D4
+ SG_ MO_Istgang : 8|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ MO_Sollgang : 12|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ MO_Oeldruck : 16|8@1+ (0.04,0) [0.00|10.00] "Unit_Bar" Gateway_D4C7
+ SG_ MO_Anzeigedrehz : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" Gateway_D4C7
+ SG_ MO_Schaltempf_verfbar : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Ladedruck : 39|9@1+ (0.01,0) [0.00|5.10] "Unit_Bar" Gateway_D4C7
+ SG_ MO_KVS : 48|15@1+ (1,0) [0|32767] "Unit_MicroLiter" Gateway_D4C7
+ SG_ MO_KVS_Ueberlauf : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 782 Motor_05: 8 Motor_EDC17_D4
+ SG_ Motor_05_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ Motor_05_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_EKlKomLeiRed : 12|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Freig_Reku : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Klima_Eingr : 16|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Status_Normalbetrieb_02 : 18|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Schaltbeeinfl_Leistungsbegr : 19|1@1+ (1,0) [0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7
+ SG_ MO_Schaltbeeinfl_Partikelfilter : 20|1@1+ (1,0) [0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7
+ SG_ MO_Prio_MIN_Wunschdrehzahl : 21|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Freig_Anlass : 22|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Aussp_Anlass : 23|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_MAX_Wunschdrehzahl : 24|9@1+ (25,0) [0|12750] "Unit_MinutInver" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Prio_MAX_Wunschdrehzahl : 33|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Luftpfad_aktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7
+ SG_ MO_v_Begrenz_Aktiv : 35|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_v_Begrenz_Aktivierbar : 36|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Verbot_EKP : 37|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Anf_Pruefimpuls : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Anf_KL75 : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Charisma_FahrPr : 40|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+ SG_ MO_Charisma_Status : 43|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Charisma_Umschaltung : 45|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Handshake_STH : 47|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_MIN_Wunschdrehzahl : 48|8@1+ (25,0) [0|6350] "Unit_MinutInver" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Drehzahlbeeinflussung : 56|8@1+ (0.39,0) [0.00|99.45] "Unit_PerCent" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 1088 Motor_06: 8 Motor_EDC17_D4
+ SG_ MO_Kuehlerluefter_MUX M : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Kuehlerluefter_1 m0 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_D4C7
+ SG_ MO_Kuehlerluefter_2 m1 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_D4C7
+ SG_ MO_HYB_Status_HV_Ladung : 8|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+ SG_ WIV_Anzeige_aktiv : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Oelmin_Warn : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Sensorfehler : 14|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Schieflage : 15|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0.0|100.0] "Unit_PerCent" Gateway_D4C7
+ SG_ MO_Zustand_HWP : 20|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_nicht_betriebswarm : 25|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_laufender_Motor : 27|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_HYB_Text_1 : 28|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_HYB_Text_2 : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_HYB_Text_3 : 30|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Text_Motorstart : 32|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7
+ SG_ MO_HYB_Text_5 : 36|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_HYB_Text_6 : 37|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_HYB_Text_7 : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Oeldyn_avl : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Text_MSG_Werkstatt : 40|1@1+ (1,0) [0|1] "" Gateway_D4C7
+ SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Gateway_D4C7
+ SG_ MO_Text_Fehler_Kraftstoffsys : 42|1@1+ (1,0) [0|1] "" Gateway_D4C7
+ SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Gateway_D4C7
+ SG_ MO_Systemlampe : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_OBD2_Lampe : 49|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Heissleuchte : 50|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Partikel_Lampe : 51|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Winterfahrprog : 52|1@1+ (1,0) [0|1] "" Gateway_D4C7
+ SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Unterfuell_Warn : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Enable_Oeldr_Motor : 59|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Avus_Motorschutz : 61|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_HYB_Fahrbereitschaft : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 1600 Motor_07: 8 Motor_EDC17_D4
+ SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_QBit_Oel_Temp : 1|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7
+ SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48.00|141.75] "Unit_DegreCelsi" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_D4C7,Getriebe_AL551_951_D4_C7
+ SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48.00|141.75] "Unit_DegreCelsi" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0.00000|1.98374] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Kennfeldk : 40|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Versionsinfo : 41|6@1+ (1.0,0.0) [0.0|63] "" Gateway_D4C7
+ SG_ MO_Getriebe_kuehlen : 47|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0.00|0.31] "Unit_KiloGramMeterSquar" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_D4C7
+ SG_ MO_SpannungsAnf : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_D4C7
+
+BO_ 1607 Motor_09: 8 Motor_EDC17_D4
+ SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-45.75|143.25] "Unit_DegreCelsi" Gateway_D4C7
+ SG_ MO_E85_Sensor : 8|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_D4C7
+ SG_ SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|8] "" Gateway_D4C7
+ SG_ SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "" Gateway_D4C7
+ SG_ SCR_Warnstufe_1 : 32|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ SCR_Warnstufe_2 : 33|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ SCR_Text : 34|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+ SG_ SCR_Akustik : 37|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Kraftstofffilter_Wasser : 40|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ SCR_Systemfehler : 41|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ SCR_Inducement_Strategie : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_CO2_Faktor : 44|12@1+ (1,0) [1|4094] "Unit_GramPerLiter" Gateway_D4C7
+ SG_ MO_MKB_MUX M : 56|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_MKB_01 m0 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7
+ SG_ MO_MKB_02 m1 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7
+ SG_ MO_MKB_03 m2 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7
+ SG_ MO_MKB_04 m3 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7
+
+BO_ 276 Motor_10: 8 Motor_EDC17_D4
+ SG_ Motor_10_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7
+ SG_ Motor_10_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7
+ SG_ MO_Sig_Fahrpedalgradient : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_BKV_Unterdruckwarnung : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Zylinderabschaltung : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7
+ SG_ MO_Fahrpedalgradient : 16|8@1+ (25,0) [0|6350] "Unit_PerCentPerSecon" Gateway_D4C7
+ SG_ MO_Schubabschaltung : 24|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_rel_Saugrohrdruck : 25|6@1+ (18,0) [0|1116] "Unit_MilliBar" Gateway_D4C7
+ SG_ MO_rel_Saugrohrdruck_gem_err : 31|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_BKV_Unterdruck : 32|8@1+ (4,0) [0|1012] "Unit_MilliBar" Gateway_D4C7
+
+BO_ 1648 Motor_18: 8 Motor_EDC17_D4
+ SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7
+ SG_ MO_Zylabsch_Texte : 50|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_E85_BS_Texte : 52|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+ SG_ MO_Drehzahl_Warnung : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Gateway_D4C7
+
+BO_ 1010 Motor_19: 8 Motor_EDC17_D4
+ SG_ Motor_19_BZ : 8|4@1+ (1,0) [0|15] "" SCR_C7
+ SG_ MO_SCR_Tankheizung : 43|1@1+ (1.0,0.0) [0.0|1] "" SCR_C7
+ SG_ MO_SCR_Dosierpumpe_Zustand : 44|3@1+ (1.0,0.0) [0.0|7] "" SCR_C7
+ SG_ MO_SCR_Leitungsheizung : 47|1@1+ (1.0,0.0) [0.0|1] "" SCR_C7
+ SG_ MO_SCR_Dosierpumpe_Wartezeit : 48|7@1+ (1,0) [0|120] "Unit_Secon" SCR_C7
+ SG_ MO_SCR_Transferpumpe : 55|1@1+ (1.0,0.0) [0.0|1] "" SCR_C7
+ SG_ MO_SCR_Dosierpumpe_Soll : 56|8@1+ (0.4,0) [0.0|100.0] "Unit_PerCent" SCR_C7
+
+BO_ 1601 Motor_Code_01: 8 Motor_EDC17_D4
+ SG_ Motor_Code_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Faktor_Momente : 12|2@1+ (1.0,0.0) [0.0|3] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_Hybridfahrzeug : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7
+ SG_ MO_Getriebe_Code : 24|6@1+ (1.0,0.0) [0.0|63] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ MO_StartStopp_Codiert : 30|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_D4C7
+ SG_ MO_Kraftstoffart : 36|4@1+ (1.0,0.0) [0.0|15] "" EPB_D4,Gateway_D4C7
+ SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0.0|12.7] "Unit_Liter" Gateway_D4C7
+ SG_ MO_Ansaugsystem : 47|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7
+ SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_D4C7
+ SG_ MO_Abgastyp : 57|6@1+ (1.0,0.0) [0.0|63] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7
+ SG_ MO_Einspritzart : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 969 MotorSlave_01: 1 Motor_Slave_D4
+ SG_ MOS_KD_Fehler : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 1696 NightVision_01: 8 Gateway_D4C7
+ SG_ NV_aktiv : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4
+ SG_ NV_Texte : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NV_Gong : 16|2@1+ (1.0,0.0) [0.0|3] "" Airbag_D4
+ SG_ NV_Symbol : 18|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4
+ SG_ NV_Hinweise : 19|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ NV_Piktogramm_aktiv : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NV_Akustik_deaktiviert_Icon : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NV_FGM_deaktiviert_Icon : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NV_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1753 NMH_EPB: 7 EPB_D4
+ SG_ NMH_EPB_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_EPB_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ NMH_EPB_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NMH_EPB_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NM_aktiv_Schalter : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NM_aktiv_Bedarf_Anzeige : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NM_aktiv_v_groesser_Null : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_kein_NL : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NL_Temp_Modell : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NL_Min : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_NL_AutoAdjust : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NM_EPB_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_EPB_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1728 NMH_Gateway: 7 Gateway_D4C7
+ SG_ NMH_GW_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_GW_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_GW_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_GW_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_GW_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ NMH_GW_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NMH_GW_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_NM_aktiv_BDM : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_NM_aktiv_Warnblinken : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_NM_aktiv_ESP : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Abschaltstufe_3 : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_SG_Fehlerdauer : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_STH_Wakeup : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_NL_Diagnose : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NM_GW_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_ACAN : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_KombiCAN : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_KomfortCAN : 42|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Infotainment : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_Fahrwerk : 44|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GW_WakeUp_CAN_Bus : 45|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+
+BO_ 1730 NMH_Getriebe: 7 Getriebe_AL551_951_D4_C7
+ SG_ NMH_GE_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_GE_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ NMH_GE_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NMH_GE_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_N_Haltephase : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_kein_NL : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NL_Daten_EEPROM : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NL_Drucksens : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NL_Abtrieb : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NL_Waehlhebel : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_NL_Wegfahrsperre : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NM_GE_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GE_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_GSG_Subbusaktiv : 50|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1729 NMH_Motor: 7 Motor_EDC17_D4
+ SG_ NMH_MO_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_MO_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ NMH_MO_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NMH_MO_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NM_aktiv_EKP_Vorlauf : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NM_aktiv_STH_Betrieb : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NM_aktiv_HV_Abschaltung : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_kein_NL : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NL_Kuehlerluefter : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NL_Diagnose : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NL_WFS : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NL_EEPROM : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_NL_Sonstige : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NM_MO_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1736 NMH_Motor_Slave: 7 Motor_Slave_D4
+ SG_ NMH_MO_SL_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_MO_SL_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ NMH_MO_SL_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NMH_MO_SL_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Busfehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_Sl_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_MO_SL_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1782 NMH_SCR: 7 SCR_C7
+ SG_ NMH_SCR_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7
+ SG_ NMH_SCR_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ NMH_SCR_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ NMH_SCR_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_MindestAktivZeit : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_NL_Datem_EEPROM : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Busfehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ NMH_SCR_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 913 OBD_01: 8 Motor_EDC17_D4
+ SG_ OBD_Calc_Load_Val : 0|8@1+ (0.39215686274509803,0) [0E-17|99.99999999999999765] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Eng_Cool_Temp : 8|8@1+ (1,-40) [-40|215] "Unit_DegreCelsi" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Abs_Throttle_Pos : 16|8@1+ (0.39215686274509803,0) [0E-17|99.99999999999999765] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Abs_Load_Val : 24|16@1+ (0.39215686274509803,0) [0E-17|25699.99999999999939605] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Abs_Pedal_Pos : 40|8@1+ (0.39215686274509803,0) [0E-17|99.99999999999999765] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Kaltstart_Denominator : 59|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ OBD_Minimum_Trip : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ OBD_Driving_Cycle : 61|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7
+ SG_ OBD_Warm_Up_Cycle : 62|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7
+ SG_ OBD_Normed_Trip : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7
+
+BO_ 803 PCF_01: 8 Gateway_D4C7
+ SG_ PCF_01_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_D4
+ SG_ PCF_01_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_D4
+ SG_ PCF_Objektstatus : 12|3@1+ (1.0,0.0) [0.0|7] "" Airbag_D4
+ SG_ PCF_Fahrer_aktiv_erkannt : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ PCF_Time_to_collision : 16|8@1+ (0.01,0) [0.00|2.50] "Unit_Secon" Airbag_D4
+ SG_ PCF_v_rel : 24|7@1+ (0.5,0) [0.5|63.5] "Unit_MeterPerSecon" Airbag_D4
+ SG_ PCF_dy_Kollisionsueberdeckung : 31|5@1+ (0.1,0) [0.1|2.9] "Unit_Meter" Vector__XXX
+
+BO_ 802 PCR_01: 8 Gateway_D4C7
+ SG_ PCR_Sensorstatus : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4
+ SG_ PCR_Obj_vx_rel : 13|11@1+ (0.1,-102.3) [-102.3|102.3] "Unit_MeterPerSecon" Airbag_D4
+ SG_ PCR_Obj_vy_rel : 24|11@1+ (0.1,-102.3) [-102.3|102.3] "Unit_MeterPerSecon" Airbag_D4
+ SG_ PCR_Obj_TTC : 35|9@1+ (0.01,0) [0.00|5.10] "Unit_Secon" Airbag_D4
+ SG_ PCR_Obj_Guete : 44|7@1+ (1,0) [0|100] "Unit_PerCent" Airbag_D4
+ SG_ PCR_Crashwahrscheinlichkeit : 51|7@1+ (1,0) [0|100] "Unit_PerCent" Airbag_D4
+
+BO_ 929 PSD_01: 8 Gateway_D4C7
+ SG_ PSD_Pos_Segment_ID : 0|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Pos_Segmentlaenge : 6|7@1+ (2,0) [0|254] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Pos_Inhibitzeit : 13|5@1+ (10,0) [0|310] "Unit_MilliSecon" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Pos_Standort : 18|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Pos_Laengsfehler : 19|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Segment_ID : 22|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Vorgaenger_Segment_ID : 28|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Strassenklasse : 34|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Segmentlaenge : 36|7@1+ (2,0) [0|254] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Rampe : 43|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Endkruemmung : 45|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Endkruemmung_Vorz : 53|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Endsteigung : 54|5@1+ (0.5,0) [0.0|14.5] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Endsteigung_Vorz : 59|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_ADAS_Qualitaet : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Fahrspuren : 61|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_wahrscheinlichster_Pfad : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 930 PSD_02: 8 Gateway_D4C7
+ SG_ PSD_Multiplex M : 0|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Segment_ID m0 : 2|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Segment_ID m1 : 2|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Segment_ID m2 : 2|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ort_Laenge_VZ m3 : 2|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ort_Laenge m3 : 3|25@1+ (0.00001,0) [0.00000|180.00000] "Unit_DegreOfArc" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Laendercode m0 : 8|8@1+ (1.0,0.0) [0.0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Segmentlaenge m1 : 8|7@1+ (2,0) [0|254] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit m2 : 8|5@1+ (1.0,0.0) [0.0|31] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Typ m2 : 13|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Gespann m2 : 14|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Vorgaenger_Segment_ID m1 : 15|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Geschwindigkeit_Einheit m0 : 16|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Witter m2 : 16|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Verkehrsrichtung m0 : 17|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Release_Monat m0 : 18|4@1+ (1,0) [1|12] "Unit_Month" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Tag_Anf m2 : 18|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Geschwindigkeit m1 : 21|5@1+ (1.0,0.0) [0.0|31] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Tag_Ende m2 : 21|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Release_Jahr m0 : 22|5@1+ (1,2000) [2000|2031] "Unit_Year" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Std_Anf m2 : 24|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Geschwindigkeit_Typ m1 : 26|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Tunnel m0 : 27|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Strassenklasse m1 : 27|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Bruecke m0 : 28|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ort_Breite_VZ m3 : 28|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Fahrsp_Gegenr m0 : 29|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_ADAS_Qualitaet m1 : 29|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Geschwindigkeit_Std_Ende m2 : 29|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ort_Breite m3 : 29|24@1+ (0.00001,0) [0.00000|90.00000] "Unit_DegreOfArc" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Abzweigerichtung m1 : 30|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_TMC_Baustelle m0 : 31|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Abzweigewinkel m1 : 31|4@1+ (1.0,0.0) [0.0|15] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_TMC_Stau m0 : 32|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw m2 : 34|5@1+ (1.0,0.0) [0.0|31] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Rampe m1 : 35|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Anfangskruemmung m1 : 37|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw_Gespann m2 : 39|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw_Witter m2 : 41|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw_Tag_Anf m2 : 43|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Anfangskruemmung_Vorz m1 : 45|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Anfangskruemmung m0 : 46|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Endkruemmung m1 : 46|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw_Tag_Ende m2 : 46|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw_Std_Anf m2 : 49|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ort_Hoehe m3 : 53|11@1+ (5,-1000) [-1000|8000] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Anfangskruemmung_Vorz m0 : 54|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Endkruemmung_Vorz m1 : 54|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_alter_Geschw_Std_Ende m2 : 54|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Anfangssteigung m0 : 55|5@1+ (0.5,0) [0.0|14.5] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Endsteigung m1 : 55|5@1+ (0.5,0) [0.0|14.5] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Ueberholverbot m2 : 59|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Anfangssteigung_Vorz m0 : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Endsteigung_Vorz m1 : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Ortschaft m0 : 61|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_Fahrspuren m1 : 61|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Ges_Wechselverkehrszeichen m2 : 61|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Digitalisierung m0 : 62|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Sys_Zielfuehrung m0 : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ PSD_Abz_wahrscheinlichster_Pfad m1 : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 2033 Request_Airbag_Deployment: 8 Gateway_D4C7
+ SG_ Request_Airbag_Deployment : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4
+
+BO_ 2041 Response_Airbag_Deployment: 8 Airbag_D4
+ SG_ Response_Airbag_Deployment : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 1528 SAK_01: 8 SAK_C7
+ SG_ SAK_Charisma_FahrPr : 16|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ SAK_Charisma_Status : 19|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ SAK_Charisma_Umschaltung : 21|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX
+ SG_ SAK_KD_Fehler : 23|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+BO_ 1011 SCR_01: 8 SCR_C7
+ SG_ SCR_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4
+ SG_ SCR_Dosierpumpe_Drehzahl : 23|11@1+ (4,-4080) [-4080|4100] "Unit_MinutInver" Motor_EDC17_D4
+ SG_ SCR_Druck : 34|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4
+ SG_ SCR_Level_Aktivtank : 44|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4
+ SG_ SCR_Level_Passivtank : 54|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4
+
+BO_ 1507 SCR_02: 8 SCR_C7
+ SG_ SCR_Heizkreis_3_Strom : 0|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4
+ SG_ SCR_02_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4
+ SG_ SCR_KD_Fehler : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ SCR_Guetesensor : 14|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4
+ SG_ SCR_Temp_Aktivtank : 24|8@1+ (20,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4
+ SG_ SCR_Temp_Passivtank : 32|8@1+ (20,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4
+ SG_ SCR_Leitungsheizung_Strom : 40|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4
+ SG_ SCR_Transferpumpe_Strom : 48|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4
+ SG_ SCR_Tankheizung_Strom : 56|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4
+
+BO_ 1508 SCR_03: 8 SCR_C7
+ SG_ SCR_03_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4
+ SG_ SCR_Spannungsversorgung_Status : 12|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_VersorgungSensoren_Status : 16|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Heizkreis_3_Status : 20|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Guetesensor_Status : 24|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Leitungsheizung_Status : 28|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Tankheizung_Status : 32|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Druck_Status : 36|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Dosierpumpe_Status_Spule : 40|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Transferpumpe_Status : 44|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Level_Aktivtank_Status : 48|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Level_Passivtank_Status : 52|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Temp_Aktivtank_Status : 56|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+ SG_ SCR_Temp_Passivtank_Status : 60|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4
+
+BO_ 1509 SCR_04: 8 SCR_C7
+ SG_ SCR_04_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4
+ SG_ SCR_Ansteuerung_Transferpumpe : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4
+ SG_ SCR_Ansteuerung_Dosierpumpe : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4
+ SG_ SCR_Ansteuerung_Heizkreis_3 : 14|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4
+ SG_ SCR_Ansteuerung_Leitungsheizung : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4
+ SG_ SCR_Ansteuerung_Tankheizung : 16|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4
+ SG_ SCR_CAL_CVN_CRC_32 : 32|32@1+ (1.0,0.0) [0.0|4294967295] "" Motor_EDC17_D4
+
+BO_ 1526 SCR_05: 8 SCR_C7
+ SG_ SCR_05_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Heizung_Status : 48|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Pumpe_Status : 50|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Relais_Status : 52|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Bus_Status : 56|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Codierung_St000 : 58|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Datensatz_St001 : 60|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+ SG_ SCR_Steuergeraet_Defekt_Status : 62|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4
+
+BO_ 1510 SCR_CAL_ID1: 8 SCR_C7
+ SG_ SCR_CAL_ID_Name_01 : 0|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Name_02 : 8|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Name_03 : 16|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_01 : 24|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_02 : 32|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_03 : 40|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_04 : 48|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_05 : 56|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+
+BO_ 1512 SCR_CAL_ID2: 8 SCR_C7
+ SG_ SCR_CAL_ID_TN_06 : 0|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_07 : 8|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_TN_08 : 16|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Leer : 24|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Index_01 : 32|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Index_02 : 40|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Index_03 : 48|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+ SG_ SCR_CAL_ID_Index_04 : 56|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4
+
+BO_ 133 SCU_01: 8 SCU_D4
+ SG_ SCU_01_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4
+ SG_ SCU_01_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4
+ SG_ SCU_Ue_Winkel_ADS : 16|12@1+ (0.1,0) [0.0|409.3] "Unit_DegreOfArc" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4
+ SG_ SCU_VZ_Ue_Winkel_ADS : 28|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4
+ SG_ SCU_Soll_Ue_Winkel : 29|11@1+ (0.1,0) [0.0|204.5] "Unit_DegreOfArc" ESP_D4,Gateway_D4C7,QSP_D4
+ SG_ SCU_max_Gradient : 40|9@1+ (1,0) [0|510] "" ESP_D4,Gateway_D4C7,QSP_D4
+ SG_ SCU_VZ_Soll_Ue_Winkel : 49|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,QSP_D4
+ SG_ SCU_Status : 50|3@1+ (1.0,0.0) [0.0|7] "" ESP_D4,Gateway_D4C7,QSP_D4
+ SG_ SCU_KD_Fehler : 53|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,QSP_D4
+ SG_ SCU_01_CRC : 56|8@1+ (1,0) [0|255] "" ESP_D4,Gateway_D4C7,QSP_D4
+
+BO_ 784 SCU_02: 8 SCU_D4
+ SG_ SCU_Warnlampe : 12|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ SCU_Warnungen : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ SCU_Charisma_FahrPr : 16|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+ SG_ SCU_Charisma_Status : 19|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ SCU_Charisma_Umschaltung : 21|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+
+BO_ 1313 STH_01: 8 Gateway_D4C7
+ SG_ STH_Funk_ein : 0|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_Funk_aus : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_Zusatzheizung : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_LED : 3|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ STH_Pumpe_ein : 4|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Geblaese : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_EKP_Anst : 6|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ STH_Start_folgt : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_Ventiloeffnungszeit : 8|6@1+ (1,0) [0|63] "Unit_Minut" Vector__XXX
+ SG_ STH_Ventil_Status : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_Waermeeintrag : 16|6@1+ (1,0) [0|63] "" Vector__XXX
+ SG_ STH_KVS : 24|13@1+ (1,0) [0|8191] "Unit_MilliLiter" Vector__XXX
+ SG_ STH_Fehlerstatus : 37|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX
+ SG_ STH_Heizleistung : 40|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ STH_Wassertemp : 48|8@1+ (0.75,-40) [-40.00|142.25] "Unit_DegreCelsi" Vector__XXX
+ SG_ STH_Motorvorwaermung : 59|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ STH_Servicemode : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_war_aktiv : 61|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ STH_KVS_Ueberlauf : 62|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STH_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1172 STS_01: 8 Gateway_D4C7
+ SG_ STS_01_CHK : 0|8@1+ (1,0) [0|255] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ STS_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ STS_Car_not_under_theft : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Car_under_theft : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Anlassersperre : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Typencodierung : 16|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX
+ SG_ STS_KD_Fehler : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_LIN_aktiv : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Standlicht : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Fahrlicht : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Alarm_still : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Texte : 27|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX
+ SG_ STS_Laderelais : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Summer : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Alarm_Blinker : 50|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Notstart : 51|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Signalhorn : 55|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ STS_Leerlaufschaltung : 56|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+
+BO_ 783 SWA_01: 8 Gateway_D4C7
+ SG_ SWA_Status_CHK : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ SWA_Status_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ SWA_Anzeigen : 12|4@1+ (1.0,0.0) [0.0|15] "" Kombi_D4
+ SG_ SWA_Blindheit_erkannt : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_rel_Nichtverf : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_rel_Fehler : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Sta_aktiv : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Sta_passiv : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Standziele_li : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Kolonne_li : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Warnung_SWA_li : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Kolonne_mi : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Standziele_re : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Kolonne_re : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Warnung_SWA_re : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SWA_Gischtzaehler : 48|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX
+ SG_ SWA_KD_Fehler : 59|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1413 Systeminfo_01: 8 Gateway_D4C7
+ SG_ SI_Int_CAN_gespiegelt : 0|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_CAN_Komfort_Sleep : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_CAN_Dashboard_Sleep : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_CAN_Antrieb_Sleep : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_Infotainment_Sleep : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_CAN_Extended_Sleep : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_Fahrwerk_Sleep : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_Diagnose_Aktiv : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_QRS_Mode : 8|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7
+ SG_ SI_T_Mode : 9|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4
+ SG_ SI_NWDF : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_NWDF_gueltig : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_Sammelfehler : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ GW_KD_Fehler : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_MOST_Status : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+ SG_ SI_Sammel_SG_Fehler : 56|6@1+ (1,0) [0|60] "" Vector__XXX
+ SG_ SI_MO_WU : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX
+
+BO_ 1214 TPD_SCU_01: 8 Gateway_D4C7
+ SG_ TPD_SCU_Data_1 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SCU_D4
+
+BO_ 768 TPD_Tester_01: 8 SCU_D4
+ SG_ TPD_Tester_Data_1 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 769 TPD_Tester_02: 8 SCU_D4
+ SG_ TPD_Tester_Data_2 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 770 TPD_Tester_03: 8 SCU_D4
+ SG_ TPD_Tester_Data_3 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 771 TPD_Tester_04: 8 SCU_D4
+ SG_ TPD_Tester_Data_4 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 772 TPD_Tester_05: 8 SCU_D4
+ SG_ TPD_Tester_Data_5 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 773 TPD_Tester_06: 8 SCU_D4
+ SG_ TPD_Tester_Data_6 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 774 TPD_Tester_07: 8 SCU_D4
+ SG_ TPD_Tester_Data_7 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 775 TPD_Tester_08: 8 SCU_D4
+ SG_ TPD_Tester_Data_8 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7
+
+BO_ 542 TPS_SCU: 7 SCU_D4
+ SG_ TPS_SCU_Data : 0|56@1+ (1.0,0.0) [0.0|72057594037927935] "" Gateway_D4C7
+
+BO_ 512 TPS_Tester: 7 Gateway_D4C7
+ SG_ TPS_Tester_Data : 0|56@1+ (1.0,0.0) [0.0|72057594037927935] "" SCU_D4
+
+BO_ 268 TSK_02: 8 XXX
+ SG_ TSK_02_CHK : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ TSK_Status : 16|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 786 TSK_03: 8 Motor_EDC17_D4
+ SG_ TSK_03_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7
+ SG_ TSK_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7
+ SG_ FAS_Wunschgeschw : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Gateway_D4C7
+ SG_ FAS_Status_Prim_Anz : 22|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ FAS_Texte_Primaeranz : 48|7@1+ (1.0,0.0) [0.0|127] "" Gateway_D4C7
+ SG_ FAS_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7
+
+BO_ 270 TSK_04: 8 Motor_EDC17_D4
+ SG_ TSK_04_CHK : 0|8@1+ (1,0) [0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_04_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_zul_Regelabw : 12|6@1+ (0.024,0) [0.000|1.512] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_ax_Getriebe : 18|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Wunsch_Uebersetz : 27|10@1+ (0.0245,0) [0.0245|25.0635] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Freig_WU : 37|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Limiter_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Status_GRA_ACC_02 : 62|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+
+BO_ 273 TSK_05: 8 Motor_EDC17_D4
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_QBit_Steigung : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Status_GRA_ACC_01 : 16|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ TSK_Fahrzeugmasse : 18|5@1+ (200,500) [500|6500] "Unit_KiloGram" Gateway_D4C7
+ SG_ TSK_QBit_Fahrzeugmasse : 23|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Fahrzeugmasse_02 : 24|8@1+ (32,0) [0|8128] "Unit_KiloGram" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Steigung : 40|8@1+ (0.8,-101.6) [-101.6|101.6] "Unit_PerCent" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Getriebeinfo : 51|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7
+ SG_ TSK_Codierung_ACC : 53|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Zwangszusch_ESP : 54|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+ SG_ TSK_Freig_Verzoeg_Anf : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7
+ SG_ TSK_Verzoeg_Anf_02 : 56|8@1+ (0.024,-3.984) [-3.984|2.136] "Unit_MeterPerSeconSquar" Gateway_D4C7
+
+BO_ 1716 VIN_01: 8 Gateway_D4C7
+ SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4
+ SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4
+ SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4
+ SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4
+ SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4
+ SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4
+ SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4
+ SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4
+ SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7
+ SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4
+
+BO_ 1414 Waehlhebel_02: 8 Getriebe_AL551_951_D4_C7
+ SG_ WH_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7
+
+
+VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" ;
+VAL_ 269 ACC_Freigabe_Momentenanf 0 "Momanf_nicht_freigegeben" 1 "Momanf_freigegeben" ;
+VAL_ 269 ACC_Freigabe_Verzanf 0 "Verzanf_nicht_freigegeben" 1 "Verzanf_freigegeben" ;
+VAL_ 269 ACC_Getriebestellung_P 0 "P_Stellung_nicht_angefordert" 1 "Anforderung_P_Stellung" ;
+VAL_ 269 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert" ;
+VAL_ 269 ACC_Loeseanforderung 0 "keine_Anforderung" 1 "Loeseanforderung" ;
+VAL_ 269 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_ 269 ACC_Vorbefuellung_Bremsanlage 0 "Vorbefuellung_AUS" 1 "Vorbefuellung_EIN" ;
+VAL_ 269 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "nicht_definiert" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System" ;
+VAL_ 269 ACC_Betaetigung_EPB 0 "keine_EPB_Anforderung" 1 "EPB_Aktuator_schliessen" ;
+VAL_ 269 ACC_Beeinflussung_ESP 0 "keine_Zwangszuschaltung" 1 "ESP_Zwangszuschaltung" ;
+VAL_ 269 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht" ;
+VAL_ 269 ACC_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+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_B8)" 3 "Crash_Intensitaet_2_(nur_D4_C7_Colorado_NF_PAG__Crash_im_B8)" 4 "Crash_Intensitaet_3_(alt_VW/AUDI__Stellgiedtest_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_PAO_Leuchte_Anf 0 "Leuchte_ausschalten" 1 "Leuchte_einschalten" ;
+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_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1312 AB_Belegung_VB 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt" ;
+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_ 1633 AAG_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv" ;
+VAL_ 1633 AAG_Anhaenger_abgesteckt 1 "Anhaenger_wurde_bei_KL15_aus_abgesteckt" ;
+VAL_ 1633 AAG_NSL_aktiv 1 "Anhaenger_Nebelschusslicht_aktiv" ;
+VAL_ 1633 AAG_Anhaenger_erkannt 0 "kein_Anhaenger_erkannt" 1 "AAG_Anhaenger_erkannt" ;
+VAL_ 1633 AAG_Blinker_H_aktiv 1 "Anhaenger_Blinker_aktiv" ;
+VAL_ 1633 AAG_Blinker_HL_def 1 "Anhaenger_Blinker_links_defekt" ;
+VAL_ 1633 AAG_Blinker_HR_def 1 "Anhaenger_Blinker_rechts_defekt" ;
+VAL_ 1633 AAG_Bremslicht_H_def 1 "Anhaenger_Bremslicht_defekt" ;
+VAL_ 1633 AAG_Schlusslicht_HL_def 1 "Anhaenger_Schlusslicht_links_defekt" ;
+VAL_ 1633 AAG_Schlusslicht_HR_def 1 "Anhaenger_Schlusslicht_rechts_defekt" ;
+VAL_ 1633 AAG_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1633 AAG_AVS_Fehler 0 "iO" 1 "niO" 2 "niO_Fahrzeugstopp_erforderlich" 3 "tbd" ;
+VAL_ 1633 AAG_AVS_Stati 0 "endlage eingefahren erreicht" 1 "endlage ausgefahren erreicht" 2 "ausfahren automatik " 3 "einfahren automatik" 4 "ausfahren manuell " 5 "einfahren manuell" 6 "zwischenposition" 7 "nicht initialisiert" ;
+VAL_ 777 BEM_Segel_Info 0 "keine_Anforderung" 1 "Mindestdrehzahl_1" 2 "Mindestdrehzahl_2" 3 "Segelveto" ;
+VAL_ 777 BEM_P_Generator 255 "Fehler" ;
+VAL_ 777 BEM_n_LLA 0 "keine_Erhoehung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3" ;
+VAL_ 777 BEM_01_Abschaltstufen 0 "Stufe_0_keine_Einschraenkung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3" 4 "Transportmodus" 7 "Ruhestrommessmodus" ;
+VAL_ 777 BEM_Anf_KL 0 "keine Anforderung" 1 "Anforderung K�hlerl�fter Ansteuerung" ;
+VAL_ 777 BEM_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 901 CHA_Systemstatus 0 "Status in Ordnung" 1 "reserviert" 2 "reserviert" 3 "reserviert" ;
+VAL_ 901 CHA_Fahrer_Umschaltung 0 "keine_oder_automatische Umschaltung" 1 "manuelle_Umschaltung" ;
+VAL_ 901 CHA_Ziel_FahrPr_MO 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_GE 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_ST 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_SCU 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_DR 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_QS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_AFS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_RGS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_EPS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_ACC 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 901 CHA_Ziel_FahrPr_SAK 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 1714 DGN_Verlernzaehler 255 "ung�ltiger Z�hlerstand oder kein g�ltiger Fahrzyklus" ;
+VAL_ 1714 KBI_Kilometerstand 1048574 "Init" 1048575 "Fehler" ;
+VAL_ 1714 UH_Monat 14 "reserviert" ;
+VAL_ 1714 UH_Tag 0 "reserviert" ;
+VAL_ 1714 Kombi_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1714 Uhrzeit_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1520 DI_KL_58d 254 "Init" 255 "Fehler" ;
+VAL_ 1520 DI_KL_58s 126 "Init" 127 "Fehler" ;
+VAL_ 1520 DI_KL_58st 126 "Init" 127 "Fehler" ;
+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_ 260 EPB_QBit_Laengsbeschleunigung 0 "g�ltiger Wert" 1 "Ersatz-, Init- oder Fehlerwert" ;
+VAL_ 260 EPB_QBit_Pedalweg_Kuppl 0 "g�ltiger Wert" 1 "Ersatz-, Init- oder Fehlerwert" ;
+VAL_ 260 EPB_BCM2_Motor_Wakeup 0 "keine Anforderung" 1 "Anforderung an BCM2 Wakeupleitung zum Motor hochzuziehen aufgrund von Car-Wakeup" ;
+VAL_ 260 EPB_Freig_Verzoeg_Anf 0 "nicht freigegeben" 1 "freigegeben" ;
+VAL_ 260 EPB_Laengsbeschleunigung 255 "Fehler" ;
+VAL_ 260 EPB_Pedalweg_Kuppl 0 "Init" 255 "Fehler" ;
+VAL_ 260 EPB_Anfahrwunsch_erkannt 0 "kein Anfahrwunsch erkannt" 1 "Anfahrwunsch erkannt" ;
+VAL_ 260 EPB_DAA_Randbed_erf 0 "Randbed_nicht_erfuellt" 1 "Randbed_erfuellt" ;
+VAL_ 260 EPB_Fehlerstatus 0 "kein Fehler in EPB - AVH darf von ESP ausgef�hrt werden" 1 "nur VW526: tempor�rer Fehler" 2 "nur VW526: EPB in Diagnose" 3 "Fehler in EPB - AVH darf von ESP nicht ausgef�hrt werden" ;
+VAL_ 260 EPB_Schalterposition 0 "keine Fahreranforderung" 1 "Fahreranforderung �ffnen" 2 "Fahreranforderung Schlie�en" 3 "Fehler" ;
+VAL_ 260 EPB_QBit_Schalterpos 0 "g�ltiger Wert (volle Funktion)" 1 " Ersatz-, Init- oder Fehlerwert (Schalter ausser Funktion)" ;
+VAL_ 260 EPB_Konsistenz_ACC 0 "kein Fehler erkannt" 1 "Fehler erkannt" ;
+VAL_ 260 EPB_Spannkraft 30 "Init" 31 "Fehler" ;
+VAL_ 260 EPB_Status 0 "offen" 1 "Bremse_geschl_(Spannkraft_voll/reduziert)" 2 "Aktuator im Lauf" 3 "Fehler" ;
+VAL_ 260 EPB_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 781 EPB_Fehlerlampe_Gelb 0 "Aus" 1 "Ein" ;
+VAL_ 781 EPB_Fehlerlampe_BKL 0 "BKL aus" 1 "BKL an" ;
+VAL_ 781 EPB_Funktionslampe 0 "Aus" 1 "Ein" ;
+VAL_ 781 EPB_Texte 0 "keine_Anzeige" 1 "Neigungswinkel_zu_gross" 2 "Parkbremse_von_Hand_oeffnen" 3 "EPB_in_Diagnose" 4 "Bremspedal_betaetigen" 5 "tbd." 6 "tbd." 7 "St�rung Anfahrassistent" 8 "Abschleppschutz blockiert" ;
+VAL_ 781 EPB_Akustik 0 "Warnton aus" 1 "Warnton an" ;
+VAL_ 781 EPB_Autoholdlampe 0 "Lampe aus (Autohold inaktiv)" 1 "Lampe ein (Autohold aktiv)" ;
+VAL_ 781 EPB_Bremsbelag_Warn 0 "Bremsbelag_ok" 1 "Bremsbelag_unter_Minimum" ;
+VAL_ 256 ASR_Moment_langsam 1022 "Init" 1023 "Fehler" ;
+VAL_ 256 ASR_MSR_Moment_schnell 1022 "Init" 1023 "Fehler" ;
+VAL_ 256 ESP_v_Signal 65533 "Unterspannung" 65534 "Init" 65535 "Fehler" ;
+VAL_ 256 ASR_Tastung_passiv 0 "ASR_aktiviert" 1 "ASR_passiv_getastet_oder_Schwellen_geaendert" ;
+VAL_ 256 ESP_Tastung_passiv 0 "ESP_aktiviert" 1 "ESP_passiv_getastet_oder_Schwellen_geaendert" ;
+VAL_ 256 ESP_Systemstatus 0 "iO" 1 "Fehler" ;
+VAL_ 256 ASR_Schalteingriff 0 "keine Anforderung" 1 "ASR_Schaltkennfeld" 2 "R�ckschaltung" 3 "Schaltverbot" ;
+VAL_ 256 OBD_Schlechtweg 0 "kein Schlechtweg erkannt" 1 "Schlechtweg erkannt" ;
+VAL_ 256 OBD_QBit_Schlechtweg 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 256 ESP_QBit_v_Signal 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 256 ABS_Bremsung 0 "keine_ABS_Regelung" 1 "ABS_Regelung_aktiv" ;
+VAL_ 256 ASR_Anf 0 "keine_Anforderung" 1 "ASR_Anforderung" ;
+VAL_ 256 MSR_Anf 0 "keine Anfoderung" 1 "MSR-Anforderung" ;
+VAL_ 256 EBV_Eingriff 0 "kein EBV-Eingriff" 1 "EBV-Eingriff" ;
+VAL_ 256 EDS_Eingriff 0 "kein_EDS_Eingriff" 1 "EDS_Eingriff" ;
+VAL_ 256 ESP_Eingriff 0 "kein_ESP_Eingriff" 1 "ESP_Eingriff_aktiv" ;
+VAL_ 256 ESP_ASP 0 "inaktiv" 1 "aktiv" ;
+VAL_ 256 ESP_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 257 ESP_QBit_Gierrate 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 257 ESP_QBit_Laengsbeschl 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 257 ESP_QBit_Querb 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 257 ESP_Stillstandsflag 0 "kein_Stillstand_erkannt" 1 "Stillstand_erkannt" ;
+VAL_ 257 ESP_Querbeschleunigung 255 "Fehler" ;
+VAL_ 257 ESP_Laengsbeschl 1022 "Signal_nicht_vorhanden" 1023 "Fehler" ;
+VAL_ 257 ESP_Verteil_Wankmom 30 "Init" 31 "Fehler" ;
+VAL_ 257 ESP_QBit_Anf_Vert_Wank 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 257 ESP_Gierrate 16383 "Fehler" ;
+VAL_ 257 ESP_VZ_Gierrate 0 "positiv" 1 "negativ" ;
+VAL_ 257 ESP_Notbremsanzeige 0 "keine_Notbremsung_erkannt" 1 "Notbremsung_erkannt" ;
+VAL_ 257 ESP_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung_Spannungswert_1" ;
+VAL_ 257 ESP_PLA_Abbruch 0 "Init" 1 "Geschwindigkeitsueberschreitung" 2 "Falscher_PLA_Status" 3 "Deaktivierung_durch_Abbruch_Lenkung" 4 "PLA_Bremsanforderung_nach_Stillstand" 5 "Abbruch_durch_Kl15_aus" 6 "Abbruch_durch_FT_offen" ;
+VAL_ 257 ESP_Status_ESP_PLA 0 "ESP_PLA_deaktiv" 1 "ESP_PLA_Init" 2 "ESP_PLA_Fehler" 4 "ESP_PLA_aktivierbar" 6 "ESP_PLA_Bremse_aktiv" 8 "ESP_PLA_funktionsbereit" 9 "ESP_PLA_Neustart" 10 "ESP_PLA_Abbruch" ;
+VAL_ 259 ESP_VL_FR 0 "Vorwaerts" 1 "Rueckwaerts" ;
+VAL_ 259 ESP_VR_FR 0 "Vorwaerts" 1 "Rueckwaerts" ;
+VAL_ 259 ESP_HL_FR 0 "Vorwaerts" 1 "Rueckwaerts" ;
+VAL_ 259 ESP_HR_FR 0 "Vorwaerts" 1 "Rueckwaerts" ;
+VAL_ 259 ESP_VL_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ;
+VAL_ 259 ESP_VR_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ;
+VAL_ 259 ESP_HL_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ;
+VAL_ 259 ESP_HR_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ;
+VAL_ 776 ESP_Meldungen 0 "keine_Anzeige_kein_Gong" 1 "Autohold_Hinweis_1_und_kein_Gong" 2 "Stoerung_Autohold_und_1x_Gong" 3 "Stoerung_Hillholder_und_1x_Gong" 4 "Uebernehmen_und_1x_Gong" ;
+VAL_ 776 ESP_HDC_FktLampe 0 "Aus" 1 "Ein" ;
+VAL_ 776 ESP_Lampe 0 "Aus" 1 "Ein" ;
+VAL_ 776 ABS_Lampe 0 "Aus" 1 "Ein" ;
+VAL_ 776 BK_Lampe 0 "Aus" 1 "Ein" ;
+VAL_ 776 ESP_Akustik 0 "keine_Akustik" 1 "1x_Beep" ;
+VAL_ 776 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose" ;
+VAL_ 776 ESP_Textanzeigen_02 0 "kein_Text" 1 "ESP_Stoerung" 2 "ABS_Stoerung" 3 "ESP_ABS_Stoerung" 4 "nicht_definiert" 5 "ASR_Stoerung" 6 "ESP_switched_off" 7 "ASR_off" 8 "ESP_ASR_on" 9 "Stoerung_Hillholder" 10 "keine_Bremskraftverstaerkung" 11 "ASR_aktiviert" 12 "ABS_ASR_Stoerung" 13 "bitte_Reifen_pruefen" 14 "Stoerung_Autohold" 15 "ESP_offroad" 16 "Autohold_Hinweis_1" 17 "ESP_sport" 18 "ESP_Zwangsaktivierung" ;
+VAL_ 776 ESP_Off_Lampe 0 "Lampe_aus" 1 "Lampe_ein" ;
+VAL_ 776 ESP_m_Raddrehz 32765 "Unterspannung" 32766 "Init" 32767 "Fehler" ;
+VAL_ 776 ESP_ASR_Lampe 0 "ESP_ASR_Lampe_aus" 1 "ESP_ASR_Lampe_an" ;
+VAL_ 776 ESP_Fehlerstatus_Wegimp 0 "Wegimpulse_iO" 1 "Fehler" ;
+VAL_ 776 ESP_Wegimp_Ueberlauf 0 "Reset und kein �berlauf" 1 "mindestens 1x �berlauf" ;
+VAL_ 776 ESP_QBit_Wegimp_VA 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 776 ESP_Displaywarnungen 0 "keine_Warnung" 1 "BKL_Display_Warnung" ;
+VAL_ 776 ESP_HDC_Regelgeschw 0 "nicht_verbaut" 125 "HDC_Standby" 127 "Fehler" ;
+VAL_ 776 ESP_BKV_Warnung 0 "keine_Anzeige_kein_Gong" 1 "keine_Bremskraftverstaerkung_plus_1x_Gong" ;
+VAL_ 262 ESP_QBit_Bremsdruck 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 262 ESP_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 262 ESP_Schwelle_Unterdruck 0 "kein_Signal" 1 "Unterdruck_kleiner_gleich_450_mbar" 2 "Unterdruck_groesser_450_mbar" 3 "Fehler_Unterdrucksensor" ;
+VAL_ 262 ESP_Bremsdruck 1023 "Fehler" ;
+VAL_ 262 ESP_Fahrer_bremst 0 "Bremsdruckschwelle_nicht_ueberschritten" 1 "Bremsdruckschwelle_ueberschritten" ;
+VAL_ 262 ESP_Verz_TSK_aktiv 0 "TSK_Verzoegerung_inaktiv" 1 "TSK_Verzoegerung_aktiv" ;
+VAL_ 262 ESP_Lenkeingriff_ADS 0 "kein_Lenkeingriff" 1 "stabilisierender_Lenkeingriff" ;
+VAL_ 262 ESP_Konsistenz_TSK 0 "Botschaft_fuer_Verzoegerungsanforderung_konsistent" 1 "Botschaft_fuer_Verzoegerungsanforderung_nicht_konsistent" ;
+VAL_ 262 ESP_Bremsruck_AWV2 0 "kein_Bremsruck_ausgefuehrt" 1 "Bremsruck_ausgefuehrt" ;
+VAL_ 262 ESP_Konsistenz_AWV2 0 "Botschaft_fuer_AWV2_konsistent" 1 "Botschaft_fuer_AWV2_nicht_konsistent" ;
+VAL_ 262 ECD_Fehler 0 "ECD_iO" 1 "ECD_Fehler" ;
+VAL_ 262 ECD_nicht_verfuegbar 0 "ECD_Funktion_verfuegbar" 1 "ECD_Funktion_nicht_verfuegbar" ;
+VAL_ 262 ESP_Status_Bremsentemp 0 "Bremse nicht �berhitzt" 1 "Bremse �berhitzt" ;
+VAL_ 262 ESP_Autohold_Standby 0 "Autohold_nicht_im_Standby" 1 "Autohold_im_Standby" ;
+VAL_ 262 ESP_HDC_Standby 0 "HDC_Funktion_nicht_im_Standby" 1 "HDC_Funktion_im_Standby" ;
+VAL_ 262 ESP_HBA_aktiv 0 "HBA_nicht_aktiv" 1 "HBA_aktiv" ;
+VAL_ 262 ESP_Prefill_ausgeloest 0 "nicht_ausgeloest" 1 "Prefill_ausgeloest" ;
+VAL_ 262 ESP_Rueckwaertsfahrt_erkannt 0 "keine_Rueckwaetsfahrt" 1 "Rueckwaertsfahrt_erkannt" ;
+VAL_ 262 ESP_Status_Anfahrhilfe 0 "Aus" 1 "Ein" ;
+VAL_ 262 ESP_HDC_aktiv 0 "inaktiv" 1 "aktiv" ;
+VAL_ 262 ESP_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 262 ESP_Eingr_HL 0 "kein_Eingriff" 1 "ESP_Eingriff_HL" ;
+VAL_ 262 ESP_Eingr_HR 0 "kein_Eingriff" 1 "ESP_Eingriff_HR" ;
+VAL_ 262 ESP_Eingr_VL 0 "kein_Eingriff" 1 "ESP_Eingriff_VL" ;
+VAL_ 262 ESP_Eingr_VR 0 "kein_Eingriff" 1 "ESP_Eingriff_VR" ;
+VAL_ 262 ESP_BKV_Unterdruck 255 "Fehler" ;
+VAL_ 262 ESP_Autohold_aktiv 0 "Autohold inaktiv" 1 "Autohold aktiv" ;
+VAL_ 262 ESP_FStatus_Anfahrhilfe 0 "kein_Fehler" 1 "Fehler" ;
+VAL_ 262 ESP_Verz_EPB_aktiv 0 "nicht aktiviert" 1 "aktiviert" ;
+VAL_ 262 ECD_Bremslicht 0 "Aus" 1 "Ein" ;
+VAL_ 262 ESP_Verzoeg_EPB_verf 0 "nicht verfuegbar" 1 "System verfuegbar" ;
+VAL_ 262 ESP_Status_Bremsdruck 0 "Bremse drucklos" 1 "mit Bremsdruck" ;
+VAL_ 262 ESP_Anforderung_EPB 0 "keine_Anforderung" 1 "Anforderung_Oeffnen" 2 "Anforderung_Schliessen" 3 "reserviert" ;
+VAL_ 132 ESP_06_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 132 ESP_VZ_Teilsollwinkel 0 "positiv" 1 "negativ" ;
+VAL_ 132 ESP_Winkeleingriff 0 "kein Eingriff" 1 "Eingriff mit langsamer R�ckf�hrung" 2 "Eingriff mit mittlerer R�ckf�hrung" 3 "Eingriff mit schneller R�ckf�hrung" ;
+VAL_ 132 ESP_Status_ADS 0 "ADS iO" 1 "ADS noch nicht verf�gbar" 2 "ADS tempor�r nicht verf�gbar" ;
+VAL_ 132 ESP_v_ref 4093 "Unterspannung" 4095 "Fehler" ;
+VAL_ 914 ESP_ACC_LDE 0 "Lebensdauerende_nicht_erreicht" 1 "Lebensdauerende_erreicht" ;
+VAL_ 914 ESP_Quattro_Antrieb 0 "Front" 1 "Allrad" ;
+VAL_ 914 ESP_Codierung_ADS 0 "Init" 1 "ESP_nicht_ADS_codiert" 2 "ADS_codiert" 3 "tbd" ;
+VAL_ 914 ESP_RTA_HL 254 "Abgleich_nocht_nicht_genuegend_konvergent" 255 "Fehler" ;
+VAL_ 914 ESP_RTA_HR 254 "Abgleich_nocht_nicht_genuegend_konvergent" 255 "Fehler" ;
+VAL_ 914 ESP_RTA_VR 254 "Abgleich_nocht_nicht_genuegend_konvergent" 255 "Fehler" ;
+VAL_ 914 OBD_Fehler_Radsensor_HL 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ;
+VAL_ 914 OBD_Fehler_Radsensor_HR 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ;
+VAL_ 914 OBD_Fehler_Radsensor_VL 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ;
+VAL_ 914 OBD_Fehler_Radsensor_VR 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ;
+VAL_ 914 ESP_Qualifizierung_Antriebsart 0 "alte_Bedeutung_Bit_ESP_Quattro_Antrieb" 1 "neue_Bedeutung_Bit_ESP_Quattro_Antrieb" ;
+VAL_ 914 ESP_Offroad_Modus 0 "kein_ESP_Offroadmodus" 1 "ESP_Offroadmodus" ;
+VAL_ 914 ESP_MKB_ausloesbar 0 "Multikollisionsbremsung_nicht_freigeschaltet" 1 "Multikollisionsbremsung_freigeschaltet" ;
+VAL_ 914 ESP_MKB_Status 0 "Multikollisionsbremsung_nicht_aktiv" 1 "Multikollisionsbremsung_aktiv" ;
+VAL_ 914 ESP_CM_Variante 0 "Standard" 1 "Erweitert" ;
+VAL_ 914 ESP_OBD_Status 0 "MIL_aus" 1 "MIL_ein" ;
+VAL_ 1623 ESP_BremsenTemp_hinten 0 "Temp_kleiner_99GradC" 1 "Temp_zwischen_100-199GradC" 2 "Temp_zwischen_200-299GradC" 3 "Temp_zwischen_300-399GradC" 4 "Temp_zwischen_400-499GradC" 5 "Temp_zwischen_500-599GradC" 6 "Temp_groesser_599GradC" 7 "Fehler" ;
+VAL_ 924 BCM1_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Wischer_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Klima_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 BCM1_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 ESP_07_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 TSG_BT_1_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 TSG_HL_1_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 TSG_HR_1_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Motor_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Klima_Sensor_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 TSG_FT_1_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Motor_05_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 QSP_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Parkhilfe_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 Fahrwerk_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 924 BCM1_MH_WIV_Schalter 0 "MH_geschlossen" 1 "MH_offen" ;
+VAL_ 924 Wischer_vorne_aktiv 1 "Wischer vorne l�uft" ;
+VAL_ 924 BCM1_Rueckfahrlicht_Schalter 0 "aus" 1 "betaetigt" ;
+VAL_ 924 MO_Status_Normalbetrieb_01 0 "kein Normalbetrieb" 1 "Normalbetrieb erreicht" ;
+VAL_ 924 KL_Zuheizer_Freigabe 0 "keine_Freigabe_Zuheizer" 1 "Zuheizerfreigabe" ;
+VAL_ 924 BCM1_Vorwaertsgang_eingelegt 0 "Rueckwaertsgang bzw. restliche Gaenge eingelegt" 1 "Erster oder zweiter Gang eingelegt" ;
+VAL_ 924 ESP_Codierung_ADS 0 "Init" 1 "ESP_nicht_ADS_codiert" 2 "ADS_codiert" 3 "tbd" ;
+VAL_ 924 QSP_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 924 FA_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 924 PH_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 924 KL_Beschlagsgefahr 0 "keine_Beschlagsgefahr" 1 "Beschlagsgefahr" ;
+VAL_ 924 BCM1_GLW_Fernlicht_Anf 0 "Aus" 1 "Ein" ;
+VAL_ 924 BCM1_RFahrlicht_Fzg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten" ;
+VAL_ 924 FT_Tuer_geoeffnet 1 "Tuer offen" ;
+VAL_ 924 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung" ;
+VAL_ 924 FT_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste" ;
+VAL_ 924 BCM1_OBD_FStatus_ATemp 0 "kein Fehler" 1 "KS-" 2 "KS+" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (out of range high)" 5 "OOR- (out of range low)" 6 "RC+ (Signal unplausibel hoch)" 7 "RC- (Signal unplausibel niedrig)" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC (allgemeiner Fehler)" ;
+VAL_ 924 BCM1_Aussen_Temp_ungef 253 "nicht verbaut" 254 "Initwert" 255 "Fehler" ;
+VAL_ 924 BCM1_Oeldruck_Schalter 0 "offen" 1 "geschlossen (p > p soll)" ;
+VAL_ 924 BCM1_Oeldruck_Schalter_2 0 "offen" 1 "geschlossen" ;
+VAL_ 924 BT_Tuer_geoeffnet 1 "Tuer_offen" ;
+VAL_ 924 HL_Tuer_geoeffnet 1 "Tuer geoeffnet" ;
+VAL_ 924 HR_Tuer_geoeffnet 1 "Tuer offen" ;
+VAL_ 924 BCM1_Adaptive_Lichtvert_Anf 0 "Aus" 1 "Ein" ;
+VAL_ 924 BCM1_Gleitende_Leuchtw_Anf 0 "Aus" 1 "Ein" ;
+VAL_ 924 BCM1_Schalter_StartStopp 0 "Start_Stopp_ueber_Hauptschalter_deaktiviert" 1 "Start_Stopp_ueber_Hauptschalter_aktiviert" ;
+VAL_ 924 ESP_Offroad_Modus 0 "kein_ESP_Offroadmodus" 1 "ESP_Offroadmodus" ;
+VAL_ 924 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig" ;
+VAL_ 1604 SMLS_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1604 BCM1_01_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1604 BCM1_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1604 BCM2_02_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1604 HYB_Anf_E_Mode_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1604 ESP_04_alt 0 "aktuell" 1 "veraltet" ;
+VAL_ 1604 BH_Blinker_li 0 "nicht_betaetigt" 1 "Blinkerhebel_Richtung_links_betaetigt" ;
+VAL_ 1604 BH_Blinker_re 0 "nicht_betaetigt" 1 "Blinkerhebel_Richtung_rechts_betaetigt" ;
+VAL_ 1604 BM_Autobahn 0 "Autobahnblinken nicht aktiv " 1 "Autobahnblinken aktiv " ;
+VAL_ 1604 BH_Fernlicht 0 "nicht_betaetigt" 1 "Blinkerhebel_in_Richtung_Fernlicht_betaetigt" ;
+VAL_ 1604 BH_Lichthupe 0 "nicht_betaetigt" 1 "Blinkerhebel in Richtung Lichthupe betaetigt" ;
+VAL_ 1604 BCM1_MH_Schalter 0 "MH_geschlossen" 1 "MH_offen" ;
+VAL_ 1604 HYB_Anf_E_Mode 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt" ;
+VAL_ 1604 HUD_NV_in_Anzeige 0 "NV_nicht_in_Anzeige" 1 "NV_in_Anzeige" ;
+VAL_ 1604 BCM1_Touristen_Licht_Anf 0 "Licht_nicht_angefordert" 1 "Anforderung von Touristenlicht" ;
+VAL_ 1604 LV_Abblendlicht_li_def 0 "OK" 1 "defekt" ;
+VAL_ 1604 LV_Abblendlicht_re_def 0 "OK" 1 "defekt" ;
+VAL_ 1604 LV_Abblendlicht_Anzeige 0 "nicht aktiv" 1 "aktiv" ;
+VAL_ 1604 LV_AFL_aktiv_Anzeige 0 "nicht aktiv" 1 "aktiv" ;
+VAL_ 1604 BCM1_Licht_Dunkelheit_aktiv 1 "Licht wegen Dunkelheit aktiv, nicht bei Autobahnlicht, Tagfahrlicht oder Regenlicht" ;
+VAL_ 1604 LV_Nebelschlusslicht_Anzeige 0 "nicht aktiv" 1 "aktiv" ;
+VAL_ 1604 BCM1_Linksverkehr 0 "Rechtsverkehr" 1 "Linksverkehr" ;
+VAL_ 1604 BCM2_P_verriegelt 0 "WH nicht in Stellung P" 1 "WH in Stellung P" ;
+VAL_ 1604 BCM1_LDS_Stellung 0 "Init" 1 "Stellung_0" 2 "Auto" 3 "Standlicht" 4 "Abblendlicht" 7 "Fehler" ;
+VAL_ 1604 BCM1_Allwetterlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten" ;
+VAL_ 1604 HUD_Anzeigefehler_NV 0 "kein_Fehler" 1 "Anzeigefehler" ;
+VAL_ 1604 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose" ;
+VAL_ 130 GE_Schaltvorgang 0 "keine Schaltung" 1 "Schaltung aktiv" ;
+VAL_ 130 GE_Status_Kupplung 0 "Kupplung ge�ffnet" 1 "Kupplung geregelt" 2 "Kupplung geschlossen" 3 "Fehler" ;
+VAL_ 130 GE_Verbot_Ausblendung 0 "kein_Verbot" 1 "Verbot" ;
+VAL_ 130 GE_MMom_Soll 1022 "kein Eingriff" 1023 "Fehler" ;
+VAL_ 130 GE_MMom_Status 0 "keine Anforderung" 1 "reduzierender Getriebeeingriff" 2 "erh�hender Getriebeeingriff" 3 "�nderung mit Sprung" ;
+VAL_ 130 GE_MMom_Vorhalt 1022 "keine_Anforderung" 1023 "Fehler" ;
+VAL_ 130 GE_Freig_MMom_Vorhalt 0 "nicht_freigegeben" 1 "freigegeben" ;
+VAL_ 130 GE_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 131 GE_Anf_Zylabsch 0 "Umschaltung erlaubt" 1 "Umschaltung verboten" 3 "VMB-Empfehlung" ;
+VAL_ 131 GE_Synchro_Wunschdrehz 511 "Fehler" ;
+VAL_ 131 GE_Synchro_Zeit 255 "Fehler" ;
+VAL_ 131 GE_Mom_Begr_Gradient 255 "keine Begrenzung (Init)" ;
+VAL_ 131 GE_Anheb_Solldrehz_Leerlauf 255 "Fehler" ;
+VAL_ 131 GE_Vorsteuermoment 510 "Init" 511 "Fehler" ;
+VAL_ 131 GE_Drehzahlmesser_Daempfung 0 "normale D�mpfung" 1 "dynamische D�mpfung" ;
+VAL_ 131 GE_Schubabschalt_Unt 0 "inaktiv" 1 "aktiv" ;
+VAL_ 131 GE_Freigabe_Synchro 0 "inaktiv" 1 "aktiv" ;
+VAL_ 131 GE_HYB_DZ_Eingriff 0 "kein_Drehzahleingriff" 1 "Slip_Start" 2 "Low_Speed_Modus" ;
+VAL_ 258 GE_Freig_Langfr_Schutzmom 0 "nicht freigegeben" 1 "freigegeben" ;
+VAL_ 258 GE_Uefkt 1023 "Fehler" ;
+VAL_ 258 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" 14 "Istgang nicht definiert" 15 "Fehler" ;
+VAL_ 258 GE_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 258 GE_Langfr_Schutzmom 1022 "Init" 1023 "Fehler" ;
+VAL_ 258 GE_Waehlhebel 0 "UNDEFINED" 1 "INIT" 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T" ;
+VAL_ 258 GE_Eingangsdrehz 16382 "Init" 16383 "Fehler" ;
+VAL_ 258 GE_Notlauf 0 "kein Notlauf / Init" 1 "Getriebe im Notlauf" ;
+VAL_ 258 GE_Codierung_MSG 0 "Codierung iO / Init" 1 "Codierung niO" ;
+VAL_ 1089 GE_Index_Fahrwid 255 "Fehler" ;
+VAL_ 1089 GE_Heizwunsch 0 "maximaler_Waermebedarf" 1 "kein_Waermebedarf" 2 "Kuehlbedarf" 3 "Notfall_(maximaler_Kuehlbedarf)" ;
+VAL_ 1089 GE_OBD_Status 0 "MIL aus" 1 "MIL ein" ;
+VAL_ 1089 GE_LFR_Adaption 0 "fuer_Adaption_geeignet" 1 "fuer_Adaption_nicht_geeignet" ;
+VAL_ 1089 GE_OBD_AbsperrVent 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ;
+VAL_ 1089 GE_Grenzkriechmoment 62 "Init" 63 "Fehler" ;
+VAL_ 1089 GE_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 1089 GE_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ;
+VAL_ 1089 GE_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ;
+VAL_ 1089 GE_Freigabe_Verfallsinfo_WFS 0 "aus" 1 "ein" ;
+VAL_ 1089 GE_Verlustmoment 255 "Fehler" ;
+VAL_ 1089 GE_amax_moeglich 511 "Wert ist nicht definiert" ;
+VAL_ 1089 GE_Sumpftemperatur 255 "Fehler" ;
+VAL_ 1424 KY_Funkschl_Nr 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 "ungueltig_15" ;
+VAL_ 1424 KY_ID_Geb_autorisiert 0 "Schluessel_nicht_authorisiert" 1 "Schluessel authorisiert" ;
+VAL_ 1424 KY_ID_Geb_steckt 0 "kein_Schluessel_im_Zuendschloss" 1 " Schluessel steckt im Zuendschloss" ;
+VAL_ 1424 KY_FFB_Frequenz 1 "433 MHz" 2 "315 MHz" 3 "868 MHz" ;
+VAL_ 1424 KY_HF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "HF_Funkempfang_aktiv" ;
+VAL_ 1424 KY_LF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "LF_Funkempfang_aktiv" ;
+VAL_ 1424 KY_ELV_verr 0 "ELV_nicht_verriegelt" 1 "ELV verriegelt" ;
+VAL_ 1424 KY_ELV_entr 0 "ELV_nicht_entriegelt" 1 "ELV entriegelt" ;
+VAL_ 1424 KY_ELV_enable_Anforderung 0 "Freigabe_nicht_angefordert" 1 "Freigabe ELV wird angefordert" ;
+VAL_ 1424 KY_Valet_Parking 0 "kein_Valet_Schluessel_erkannt" 1 "Valet Schluessel erkannt" ;
+VAL_ 1424 KY_Keyless_Verbau 0 "kein_Keyless_verbaut" 1 "Keyless verbaut" ;
+VAL_ 1424 FBS_Warn_Lenkung_def 0 "iO" 1 "defekt" ;
+VAL_ 1424 FBS_Warn_LenkVerriegelung_def 0 "i.O." 1 "defekt" ;
+VAL_ 1424 FBS_Warn_Schluessel_Batt 0 "i.O." 1 "defekt" ;
+VAL_ 1424 FBS_Prio_Warn_04 1 "Kombi Prio Warnung FBS 4" ;
+VAL_ 1424 FBS_Prio_Warn_05 1 "Kombi Prio Warnung FBS 5" ;
+VAL_ 1424 KYL_Warn_kein_Schluessel 1 "kein Schluessel erkannt" ;
+VAL_ 1424 KYL_Warn_Kessy_defekt 0 "Kessy_i.O." 1 "Kessy defekt" ;
+VAL_ 1424 KY_KYL_Prio_Warn_03 1 "Kombi Prio Warnung Keyless 3" ;
+VAL_ 1424 KY_KYL_Prio_Warn_04 1 "Kombi Prio Warnung Keyless 4" ;
+VAL_ 1424 KY_KYL_Prio_Warn_05 1 "Kombi Prio Warnung Keyless 5" ;
+VAL_ 1424 KY_WFS_Safe 1 "WFS nicht deaktiviert" ;
+VAL_ 1424 KY_WFS_LZ 0 "nicht def." 1 "LZ 1" 2 "LZ 2" 3 "LZ 3" ;
+VAL_ 1424 KY_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 1424 KYL_Notzuendschloss 0 "nicht_verbaut" 1 "verbaut" ;
+VAL_ 1424 KYL_Warn_Notzuendschloss 0 "Aus" 1 "Ein" ;
+VAL_ 1424 FBS_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 960 ZV_verriegelt_extern_soll_02 1 "Fahrzeug verriegelt extern; Sollzusstand" ;
+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 0 "aus" 1 "KL50_ein_Startwunsch_Fahrer" ;
+VAL_ 959 KL_Drehz_Anh 0 "keine_Anhebung" 1 "Drehzahlanhebung_vom_Motor_angefordert" ;
+VAL_ 959 KL_Vorwarn_Komp_ein 1 "Vorwarnung Kompressor ein" ;
+VAL_ 959 KL_Handshake_BEM 0 "keine_Leistungsaenderung_in_den_Heizsystemen_aktiv" 1 "Heizleistungsaenderung_wird_gerade_durchgefuehrt" ;
+VAL_ 959 KL_Komp_Moment_alt 1 "veraltet_bzw_Ermittlung_des_Moments_nicht_moeglich__zB_keine_Drehzahl_kein_Kaeltemitteldruck" ;
+VAL_ 959 KL_Vorwarn_HHS_ein 1 "Vorwarnung_Heckscheibenheizung_ein" ;
+VAL_ 959 KL_Vorwarn_HFS_ein 1 "Vorwarnung_Frontscheibenheizung_ein" ;
+VAL_ 959 KL_Vorwarn_Zuheizer_ein 1 "Vorwarnung_Zuheizer_ein" ;
+VAL_ 959 KL_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 959 KL_Comp_rev_rq 255 "Fehler" ;
+VAL_ 959 KL_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 959 KL_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ;
+VAL_ 959 KL_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ;
+VAL_ 959 KL_Last_Kompr 255 "Fehler" ;
+VAL_ 959 KL_Anf_KL 255 "Fehler" ;
+VAL_ 959 KL_4_Zonen 0 "2_Zonen_Klimaanlage" 1 "4_Zonen_Klimaanlage" ;
+VAL_ 959 KL_AC_Schalter 0 "aus" 1 "ein" ;
+VAL_ 959 KL_Zustand 0 "aus" 1 "ein" ;
+VAL_ 959 KL_Thermomanagement 0 "keine_Freigabe_TMM__max_Heizbedarf" 1 "kleine_Freigabe_TMM" 2 "mittlere_Freigabe_TMM" 3 "volle_Freigabe_TMM__kein_Heizbedarf" ;
+VAL_ 959 KL_Comp_enable 0 "Disable" 1 "Enable" ;
+VAL_ 959 KL_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ;
+VAL_ 959 KL_Diag_Absperrvent 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" ;
+VAL_ 779 KBI_ABS_Lampe 0 "ABS Lampe aus" 1 "ABS Lampe ein" ;
+VAL_ 779 KBI_ESP_Lampe 0 "ESP Lampe aus" 1 "ESP Lampe ein" ;
+VAL_ 779 KBI_BKL_Lampe 0 "BKL aus" 1 "BKL ein" ;
+VAL_ 779 KBI_Airbag_Lampe 0 "Airbag Lampe aus" 1 "Airbag Lampe ein" ;
+VAL_ 779 KBI_SILA_gueltig 0 "ungueltig" 1 "gueltig" ;
+VAL_ 779 KBI_Vorglueh_System_Lampe 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 779 KBI_NV_in_Anzeige 0 "NV_nicht_in_Anzeige" 1 "NV_in_Anzeige" ;
+VAL_ 779 KBI_Anzeigestatus_ACC 0 "keine_ACC_Anzeige" 1 "ACC_Anzeige_aktiv" ;
+VAL_ 779 KBI_Tankwarnung 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 779 KBI_MFA_v_Einheit_01 0 "kmh" 1 "mph" ;
+VAL_ 779 KBI_im_Stellgliedtest 0 "kein Stellgliedtest" 1 "Kombi im Stellgliedtest" ;
+VAL_ 779 KBI_Anzeigefehler_LDW 0 "nicht vorhanden bzw. unterst�tzt" 1 "Anzeige iO" 2 "Anzeigefehler" 3 "nicht definiert" ;
+VAL_ 779 KBI_Variante_USA 0 "keine USA-Variante" 1 "USA-Variante" ;
+VAL_ 779 KBI_Oeldruckwarnung 0 "inaktiv" 1 "aktiv" ;
+VAL_ 779 KBI_Handbremse 0 "nicht_angezogen" 1 "angezogen" ;
+VAL_ 779 KBI_PLA_in_Anzeige 0 "PLA_nicht_in_Anzeige" 1 "PLA_in_Anzeige" ;
+VAL_ 779 KBI_Anzeigefehler_NV 0 "kein_Anzeigefehler" 1 "Anzeigefehler" ;
+VAL_ 779 KBI_Einheit_Tacho 0 "km/h" 1 "mph" ;
+VAL_ 779 KBI_Konsistenz_ACC 0 "ACC Botschaft konsistent" 1 "ACC Botschaft inkonsistent " ;
+VAL_ 779 KBI_Fehler_Anzeige_ACC 0 " iO" 1 "Anzeigefehler ACC" ;
+VAL_ 779 KBI_Anzeigefehler_SWA 0 "nicht vorhanden bzw. unterst�tzt" 1 "Anzeige iO" 2 "Anzeigefehler" 3 "nicht definiert" ;
+VAL_ 779 KBI_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1719 KBI_Kilometerstand 1048574 "Init" 1048575 "Fehler" ;
+VAL_ 1719 KBI_Reset_Standzeit 0 "Standzeit iO" 1 "KL30 war weg" ;
+VAL_ 1719 KBI_Inhalt_Tank 127 "Fehler" ;
+VAL_ 1719 KBI_FStatus_Tank 0 "Tankf�llstand i.O." 1 "Tankf�llstand n.i.O" ;
+VAL_ 1719 KBI_QBit_Aussen_Temp_gef 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 1719 KBI_Aussen_Temp_gef 253 "nicht verbaut" 254 "Init" 255 "Fehler" ;
+VAL_ 1720 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 "ungueltig_15" ;
+VAL_ 1720 KBI_BCmE_aktiv 0 "Anzeige_nicht_aktiv" 1 "Anzeige_aktiv" ;
+VAL_ 1720 KBI_Sparhinweis_quittiert 0 "nicht_quittiert" 1 "quittiert" ;
+VAL_ 285 EPS_Notlauf 0 "kein_Notlauf" 1 "Notlauf_Unterspannung" 2 "Notlauf_Ueberspannung" 3 "reserviert" 4 "Notlauf_Uebertemperatur" 5 "Notlauf_Unterspannung_und_Uebertemperatur" 6 "Notlauf_Ueberspannung_und_Uebertemperatur" 7 "reserviert" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert" ;
+VAL_ 285 EPS_Lastinfo 255 "Fehler" ;
+VAL_ 285 EPS_Unterstuetzungsleistung 255 "Fehler" ;
+VAL_ 285 EPS_Drehzahlreserve 127 "Fehler" ;
+VAL_ 285 EPS_VZ_Drehzahlreserve 0 "positiv" 1 "negativ" ;
+VAL_ 285 EPS_Leistungsanforderung 0 "keine_Anforderung" 1 "Anforderung_hoehere_Spannung_oder_Leistung" ;
+VAL_ 1137 BCM2_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv" ;
+VAL_ 1137 LH_Aussenlicht_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Standlicht_H_aktiv 1 "Standlicht hinten aktiv" ;
+VAL_ 1137 LH_Parklicht_HL_aktiv 0 "nicht aktiv" 1 "Parklicht hinten links aktiv" ;
+VAL_ 1137 LH_Parklicht_HR_aktiv 0 "nicht aktiv" 1 "Parklicht hinten rechts aktiv" ;
+VAL_ 1137 LH_Bremslicht_H_aktiv 1 "Bremslicht hinten aktiv" ;
+VAL_ 1137 LH_Nebelschluss_aktiv 0 "nicht aktiv" 1 "aktiv" ;
+VAL_ 1137 LH_Rueckfahrlicht_aktiv 0 "nicht aktiv" 1 "aktiv" ;
+VAL_ 1137 LH_Blinker_HL_akt 1 "Blinker hinten links aktiv" ;
+VAL_ 1137 LH_Blinker_HR_akt 1 "Blinker hinten rechts aktiv" ;
+VAL_ 1137 LH_Blinker_li_def 0 "OK" 1 "Blinker hinten links defekt" ;
+VAL_ 1137 LH_Bremsl_li_def 0 "OK" 1 "mindestens ein Bremslicht hinten links defekt" ;
+VAL_ 1137 LH_Schlusslicht_li_def 0 "OK" 1 "mindestens ein Schlusslicht hinten links defekt" ;
+VAL_ 1137 LH_Rueckf_li_def 0 "OK" 1 "R�ckfahrlicht hinten links defekt" ;
+VAL_ 1137 LH_Nebel_li_def 0 "OK" 1 " Nebelschlusslicht hinten links defekt" ;
+VAL_ 1137 LH_Schluss_Brems_Nebel_li_def 0 "iO" 1 "defekt" ;
+VAL_ 1137 LH_Schluss_Brems_Nebel_re_def 0 "iO" 1 "defekt" ;
+VAL_ 1137 LH_Schluss_Brems_li_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Schluss_Nebel_li_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_SL_BRL_BLK_li_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Brems_Blk_li_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Blinker_re_def 0 "OK" 1 "Blinker hinten rechts defekt" ;
+VAL_ 1137 LH_Bremsl_re_def 0 "OK" 1 "mindestens ein Bremslicht hinten rechts defekt" ;
+VAL_ 1137 LH_Schlusslicht_re_def 0 "OK" 1 "mindestens ein Schlusslicht hinten rechts defekt" ;
+VAL_ 1137 LH_Rueckf_re_def 0 "OK" 1 "R�ckfahrlicht hinten rechts defekt" ;
+VAL_ 1137 LH_Nebel_re_def 0 "OK" 1 "Nebelschlusslicht hinten rechts defekt" ;
+VAL_ 1137 LH_Schluss_Brems_re_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Schluss_Nebel_re_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_SL_BRL_BLK_re_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Brems_Blk_re_def 0 "OK" 1 "defekt" ;
+VAL_ 1137 LH_Kennzl_def 0 "OK" 1 "Kennzeichenbeleuchtung hinten defekt" ;
+VAL_ 1137 LH_3_Bremsl_def 0 "OK" 1 "hochgesetzte Bremsleuchte defekt" ;
+VAL_ 1137 LH_Nebel_mi_def 0 "OK" 1 " Nebelschlusslicht hinten Mitte defekt" ;
+VAL_ 1137 LH_Rueckf_mi_def 0 "OK" 1 "R�ckfahllicht Mitte defekt" ;
+VAL_ 1137 LH_Bremsl_li_ges_def 0 "OK" 1 "Alle Bremslichter hinten links defekt" ;
+VAL_ 1137 LH_Bremsl_re_ges_def 0 "OK" 1 "Alle Bremslichter hinten rechts defekt" ;
+VAL_ 267 LS_Hauptschalter 0 "Gerastet Aus" 1 "Ein" ;
+VAL_ 267 LS_Abbrechen 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ;
+VAL_ 267 LS_Typ_Hauptschalter 0 "gerasteter_Lenkstockschalter" 1 "getasteter_Lenkstockschalter" ;
+VAL_ 267 LS_Limiter 0 "Limiter aus" 1 "Limiter ein" ;
+VAL_ 267 LS_Tip_Setzen 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ;
+VAL_ 267 LS_Tip_Hoch 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ;
+VAL_ 267 LS_Tip_Runter 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ;
+VAL_ 267 LS_Tip_Wiederaufnahme 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ;
+VAL_ 267 LS_Verstellung_Zeitluecke 0 "Taste nicht betaetigt" 1 "Dist -1" 2 "Dist +1" 3 "nicht belegt" ;
+VAL_ 267 MFL_Tip_Down 0 "nicht_betaetigt" 1 "betaetigt" ;
+VAL_ 267 MFL_Tip_Up 0 "nicht_betaetigt" 1 "betaetigt" ;
+VAL_ 267 LS_Tiptronic_Fehler 0 " i. O." 1 "Fehler erkannt" ;
+VAL_ 267 LS_Codierung 0 "kein Hebel, keine Tiptronic am Lenkrad" 1 "kein Hebel, Tiptronic am Lenkrad" 2 "GRA Hebel, keine Tiptronic am Lenkrad" 3 "GRA Hebel, Tiptronic am Lenkrad" 4 "ACC Hebel, keine Tiptronic am Lenkrad" 5 "ACC Hebel, Tiptronic am Lenkrad" 6 "nicht verwendet" 7 "nicht verwendet" ;
+VAL_ 267 LS_Tip_Stufe_2 0 "Hebelbetaetigung_in_erster_Tipstufe__Keine_Hebelbetaetigung" 1 "Hebelbetaetigung_in_der_zweiten_Tipstufe" ;
+VAL_ 267 LS_GRA_ACC_2stufig 0 "kein_zweistufiger_Hebel_verbaut" 1 "zweistufiger_Hebel_verbaut" ;
+VAL_ 267 MFL_M_Taste 0 "nicht_betaetigt" 1 "betaetigt" ;
+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_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_ 128 MO_Mom_o_ex 1022 "Init" 1023 "Fehler" ;
+VAL_ 128 MO_Mom_m_ex 1022 "Init" 1023 "Fehler" ;
+VAL_ 128 MO_Mom_Verlust 1022 "Init" 1023 "Fehler" ;
+VAL_ 128 MO_Mom_Begrenzung 1022 "Init" 1023 "Fehler" ;
+VAL_ 128 MO_Mom_Fahrerwunsch 1022 "Init" 1023 "Fehler" ;
+VAL_ 128 MO_Kickdown 0 "kein Kickdown" 1 "Kickdown" ;
+VAL_ 128 MO_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 129 MO_Mom_ZWR 1022 "Init" 1023 "Fehler" ;
+VAL_ 129 MO_Mom_Soll 1022 "Init" 1023 "Fehler" ;
+VAL_ 129 MO_Mom_Ist 1022 "Init" 1023 "Fehler" ;
+VAL_ 129 MO_Status_Zylabschalt_01 0 "alle Zylinder brennen" 1 "mindestens ein Zylinder wurde abgeschaltet" ;
+VAL_ 129 MO_Status_Normalbetrieb_01 0 "kein Normalbetrieb" 1 "Normalbetrieb erreicht" ;
+VAL_ 129 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_ 129 MO_StartStopp_Motorstopp 0 "Motor_Stop_inaktiv" 1 "Motor_Stop_aktiv" ;
+VAL_ 129 MO_StartStopp_Wiederstart 0 "Wiederstart_inaktiv" 1 "Wiederstart_aktiv" ;
+VAL_ 129 MO_Ext_E_Fahrt_aktiv 0 "Rueckmeldung_E_Taster_aus " 1 "Rueckmeldung_E_Taster_ein" ;
+VAL_ 129 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" 12 "Zwischengangstellung" 13 "Gang_R" 14 "Istgang_nicht_definiert" 15 "Fehler" ;
+VAL_ 129 MO_StartStopp_Fahrerwunsch 0 "Init" 1 "Stoppverbot_durch_Fahrer" 2 "Stoppfreigabe_durch_Fahrer" 3 "Stoppanforderung_durch_Fahrer" ;
+VAL_ 261 MO_QBit_Fahrpedalwerte_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 261 MO_QBit_Motormomente 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 261 MO_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 261 MO_QBit_Drehzahl_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 261 MO_Drehzahl_01 65535 "Fehler" ;
+VAL_ 261 MO_Moment_im_Leerlauf 0 "kein_Leergas" 1 "Leergas" ;
+VAL_ 261 MO_Interlock 0 "Interlockschalter nicht bet�tigt" 1 "Interlockschalter bet�tigt" ;
+VAL_ 261 MO_BLS 0 "kein Bremsen" 1 "Bremse bet�tigt" ;
+VAL_ 261 MO_Fahrer_bremst 0 "kein Bremsen" 1 "Bremse bet�tigt" ;
+VAL_ 261 MO_Konsistenz_Bremsped 0 "Bremspedalinformation_plausibel" 1 "Bremspedalinformation_unplausibel" ;
+VAL_ 261 MO_Kuppl_schalter 0 "Schalter sagt nicht bet�tigt (Eingekuppelt)" 1 "Schalter sagt bet�tigt (Ausgekuppelt)" ;
+VAL_ 261 MO_Timeout_ESP 0 "Empfang i.O." 1 "Timeout" ;
+VAL_ 261 MO_Motor_laeuft 0 "Motor l�uft nicht" 1 "Motor l�uft autark und stabil und darf mechanisch belastet werden" ;
+VAL_ 261 MO_Solldrehz_Leerlauf 255 "Fehler" ;
+VAL_ 261 MO_Fahrpedalrohwert_01 255 "Fehler" ;
+VAL_ 261 MO_erste_Ungenauschwelle 0 "genau" 1 "Momente ungenauer >8%" ;
+VAL_ 261 MO_QBit_Stressfaktor 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 263 MO_Istgang 0 "kein_Gang_eingelegt" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" ;
+VAL_ 263 MO_Sollgang 0 "keine_Empfehlung" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" ;
+VAL_ 263 MO_Oeldruck 255 "Fehler" ;
+VAL_ 263 MO_Anzeigedrehz 4095 "Fehler" ;
+VAL_ 263 MO_Schaltempf_verfbar 0 "nicht_verfuegbar" 1 "verfuegbar" ;
+VAL_ 263 MO_Ladedruck 511 "Fehler" ;
+VAL_ 263 MO_KVS_Ueberlauf 0 "kein Ueberlauf" 1 "Kraftstoffverbrauchsignale mindestens 1x �bergelaufen" ;
+VAL_ 782 MO_EKlKomLeiRed 0 "keine_Leistungsbegr" 1 "Leistungsbegr_75" 2 "Leistungsbegr_50" 3 "Leistungsbegr_25" ;
+VAL_ 782 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig" ;
+VAL_ 782 MO_Klima_Eingr 0 "kein Eingriff" 1 "Klimakompressor ausschalten" 2 "Klimakompressor Leistungsreduzierung" 3 "Klimakompressor aufgrund der Heissleuchtenvorwarnung ausschalten" ;
+VAL_ 782 MO_Status_Normalbetrieb_02 0 "kein Normalbetrieb" 1 "Normalbetrieb erreicht" ;
+VAL_ 782 MO_Prio_MIN_Wunschdrehzahl 0 "Wunsch" 1 "Zwang" ;
+VAL_ 782 MO_Freig_Anlass 0 "Start nicht zul�ssig" 1 "Startfreigabe" ;
+VAL_ 782 MO_Aussp_Anlass 0 "Motor l�uft nicht stabil" 1 "Anlasser ausspuren (Motor l�uft stabil)" ;
+VAL_ 782 MO_MAX_Wunschdrehzahl 511 "Fehler" ;
+VAL_ 782 MO_Prio_MAX_Wunschdrehzahl 0 "Wunsch" 1 "Zwang" ;
+VAL_ 782 MO_Luftpfad_aktiv 0 "kein Eingriff oder nur Eingriff �ber Z�ndpfad" 1 "Eingriff �ber Luftpfad" ;
+VAL_ 782 MO_v_Begrenz_Aktiv 0 "inaktiv" 1 "aktiv" ;
+VAL_ 782 MO_v_Begrenz_Aktivierbar 0 "V-Begrenzung nicht m�glich" 1 "V-Begrenzung m�glich" ;
+VAL_ 782 MO_Verbot_EKP 0 "Ansteuerung zugelassen" 1 "Ansteuerung verboten" ;
+VAL_ 782 MO_Anf_Pruefimpuls 0 "keine Anforderung" 1 "Anforderung" ;
+VAL_ 782 MO_Anf_KL75 0 "Anforderung KL75 ausschalten" 1 "Anforderung KL75 einschalten" ;
+VAL_ 782 MO_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 782 MO_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ;
+VAL_ 782 MO_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ;
+VAL_ 782 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung" ;
+VAL_ 782 MO_MIN_Wunschdrehzahl 255 "Fehler" ;
+VAL_ 1088 MO_Kuehlerluefter_MUX 0 "Kuehlerluefter_1" 1 "Kuehlerluefter_2" ;
+VAL_ 1088 MO_Kuehlerluefter_1 126 "Init" 127 "Fehler" ;
+VAL_ 1088 MO_Kuehlerluefter_2 126 "Init" 127 "Fehler" ;
+VAL_ 1088 MO_HYB_Status_HV_Ladung 0 "HV-Ladung_nicht_notwendig" 1 "HV-Ladung_notwendig_Freigaben_erforderlich" 2 "HV-Ladung laeuf" 3 "HV-Ladung_erfolgreich_Motorstart_moeglich" 4 "HV_Ladung_abgebrochen" ;
+VAL_ 1088 WIV_Anzeige_aktiv 0 "Anzeige aus" 1 "WIV Anzeige aktiv" ;
+VAL_ 1088 WIV_Oelmin_Warn 0 "in_Ordnung" 1 "Warnung" ;
+VAL_ 1088 WIV_Sensorfehler 0 "in_Ordnung" 1 "Sensor_defekt" ;
+VAL_ 1088 WIV_Schieflage 0 "Fahrzeug_gerade" 1 "Fahrzeug_in_Schieflage" ;
+VAL_ 1088 MO_Zustand_HWP 0 "HWP_nicht_schaltbar" 1 "HWP_foerdert_nicht" 2 "HWP_foerdert" 3 "reserviert" ;
+VAL_ 1088 WIV_Oelsystem_aktiv 0 "Anzeige_aus" 1 "Anzeige_aktiv" ;
+VAL_ 1088 WIV_nicht_betriebswarm 0 "Motor_warm" 1 "Motor_nicht_betriebswarm" ;
+VAL_ 1088 WIV_Ueberfuell_Warn 0 "in_Ordnung" 1 "Ueberfuellwarnung" ;
+VAL_ 1088 WIV_laufender_Motor 0 "Messung_moeglich" 1 "Messung_nicht_moeglich" ;
+VAL_ 1088 MO_HYB_Text_1 0 "kein_Text" 1 "Text_anzeigen" ;
+VAL_ 1088 MO_HYB_Text_2 0 "kein_Text" 1 "Text_anzeigen" ;
+VAL_ 1088 MO_HYB_Text_3 0 "kein_Text" 1 "Text_anzeigen" ;
+VAL_ 1088 MO_Text_Motorstart 0 "keine_Anzeige" 1 "Motor_im_Stoppbetrieb" 2 "StartStopp_sicherheitsbedingt_deaktiviert" 3 "System_fordert_Wiederstart" 5 "Motorlauf_noetig" 9 "Unerwuenschter_Motorstillstand" 12 "Motor_startet" 13 "Kupplung_betaetigen" 14 "Waehlhebel_in_PN_Position" 15 "Bremse_treten" ;
+VAL_ 1088 MO_HYB_Text_5 0 "kein_Text" 1 "Text_anzeigen" ;
+VAL_ 1088 MO_HYB_Text_6 0 "kein_Text" 1 "Text_anzeigen" ;
+VAL_ 1088 MO_HYB_Text_7 0 "kein_Text" 1 "Text_anzeigen" ;
+VAL_ 1088 WIV_Oeldyn_avl 0 "Oeldyn_nicht_vorhanden" 1 "Oeldyn_vorhanden" ;
+VAL_ 1088 MO_Systemlampe 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 1088 MO_OBD2_Lampe 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 1088 MO_Heissleuchte 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 1088 MO_Partikel_Lampe 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 1088 WIV_Oelstand_nicht_vorhanden 0 "�lstand vorhanden" 1 "�lstand nicht vorhanden" ;
+VAL_ 1088 WIV_nachfuellanzeige_ein 0 "keine_Nachfuellanzeige" 1 "Nachfuellanzeige" ;
+VAL_ 1088 WIV_Ueberfuell_deaktiv 0 "Ueberfuellwarnung_am_Kombi_aktiv" 1 "Ueberfuellwarnung_am_Kombi_deaktiv" ;
+VAL_ 1088 WIV_Unterfuell_Warn 0 "in_Ordnung" 1 "Unterfuellwarnung" ;
+VAL_ 1088 MO_Tankdeckel_Lampe 0 "Lampe aus" 1 "Lampe ein" ;
+VAL_ 1088 MO_Text_Tankdeckelwarn 0 "kein Text" 1 "Anzeige Text Tankdeckelwarnung im Kombi" ;
+VAL_ 1088 WIV_Enable_Oeldr_Motor 0 "Oeldruckauswertung_im_Kombi" 1 "Oeldruckauswertung_im_MSG" ;
+VAL_ 1088 WIV_Oeldr_Warn_Motor 0 "keine_Warnung" 1 "niedrige_Oeldruckstufe_nicht_erreicht " ;
+VAL_ 1088 MO_Avus_Motorschutz 0 "keine Warnung" 1 "Drehzahlwarnung Stufe 1" 2 "Drehzahlwarnung Stufe 2" 3 "Drehzahlwarnung Stufe 3" ;
+VAL_ 1088 MO_HYB_Fahrbereitschaft 0 "keine_Fahrbereitschaft" 1 "Fahrbereitschaft" ;
+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_Stellgliedtest_Soundaktuator 0 "kein_Stellgliedtest" 1 "Anforderung_des_Stellgliedtest" ;
+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_Versionsinfo 0 "zum Projektbeginn 'aufger�umter CAN' " 1 "Motor_03_mit_10ms" 16 "MQB_mit_neuer_Momentenschnittstelle" ;
+VAL_ 1600 MO_Getriebe_kuehlen 0 "nicht_kuehlen" 1 "kuehlen" ;
+VAL_ 1600 MO_Heizungspumpenansteuerung 15 "nicht_verbaut" ;
+VAL_ 1600 MO_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung" ;
+VAL_ 1607 MO_ITM_Kuehlmittel_Temp 0 "nicht_verbaut" 2 "Fehler" ;
+VAL_ 1607 MO_E85_Sensor 13 "nicht_verbaut" 15 "Fehler" ;
+VAL_ 1607 SCR_Anz_Motorstarts 15 "keine Einschr�nkung (Anzeige Reichweite)" ;
+VAL_ 1607 SCR_Reichweite 32767 "Init" ;
+VAL_ 1607 SCR_Warnstufe_1 0 "nicht aktiv" 1 "Warnstufe 1 aktiv" ;
+VAL_ 1607 SCR_Warnstufe_2 0 "nicht aktiv" 1 "Warnstufe 2 aktiv" ;
+VAL_ 1607 SCR_Text 0 "kein Text" 1 "Warntext 1" 2 "Warntext 2" 3 "Hinweistext (nur AUDI)" 4 "Reserve" 5 "Warntext 'SCR-Systemfehler Stufe 1'" 6 "Warntext 'SCR-Systemfehler Stufe 2'" ;
+VAL_ 1607 SCR_Akustik 0 "keine Akustik" 1 "Akustik 1" 2 "Akustik 2" 3 "Akustik_bei_Hinweis_(VW)" ;
+VAL_ 1607 MO_Kraftstofffilter_Wasser 0 "keine_Anzeige" 1 "Abscheidevolumen_erschoepft" ;
+VAL_ 1607 SCR_Systemfehler 0 "Warnung_nicht_aktiv" 1 "Warnung_aktiv" ;
+VAL_ 1607 SCR_Inducement_Strategie 0 "Restart_Strategie" 1 "Reduced_Drivability_Strategie" ;
+VAL_ 1607 MO_CO2_Faktor 0 "nicht_verbaut" 4095 "Fehler" ;
+VAL_ 1607 MO_MKB_MUX 0 "MKB_01" 1 "MKB_02" 2 "MKB_03" 3 "MKB_04" ;
+VAL_ 1607 MO_MKB_01 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ;
+VAL_ 1607 MO_MKB_02 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ;
+VAL_ 1607 MO_MKB_03 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ;
+VAL_ 1607 MO_MKB_04 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ;
+VAL_ 276 MO_Sig_Fahrpedalgradient 0 "Fahrpedalgradient positiv" 1 "Fahrpedalgradient negativ" ;
+VAL_ 276 MO_BKV_Unterdruckwarnung 0 "Unterdruckhaushalt_iO" 1 "Unterdruckhaushalt_niO" ;
+VAL_ 276 MO_Zylinderabschaltung 0 "Vollmotorbetrieb_VMB" 1 "Uebergang_HMB_in_VMB" 2 "Uebergang_VMB_in_HMB" 3 "Halbmotorbetrieb_HMB" ;
+VAL_ 276 MO_Fahrpedalgradient 255 "Fehler" ;
+VAL_ 276 MO_Schubabschaltung 0 "keine_Schubabschaltung" 1 "Schubabschaltung_aktiv" ;
+VAL_ 276 MO_rel_Saugrohrdruck 0 "Init_Ueberdruck" 63 "Fehler" ;
+VAL_ 276 MO_rel_Saugrohrdruck_gem_err 0 "errechnet" 1 "gemessen" ;
+VAL_ 276 MO_BKV_Unterdruck 255 "Fehler" ;
+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_E85_BS_Texte 0 "kein Text" 1 "FlexFuel Warm_Up_ Lampe" 2 "FlexFuel Warnung 3.Stufe " 3 "FlexFuel Warnung 1.Stufe " 4 "FlexFuel Warnung 2.Stufe " 5 "FlexFuel Warnung 4.Stufe " ;
+VAL_ 1648 MO_Drehzahl_Warnung 0 "keinen_Warnhinweis_anzeigen" 1 "Warnhinweis_anzeigen" ;
+VAL_ 1010 MO_SCR_Tankheizung 0 "Heizung_aus" 1 "Heizung_ein" ;
+VAL_ 1010 MO_SCR_Dosierpumpe_Zustand 0 "frei" 1 "Drehzahlregelung" 2 "Druckregelung_langsam" 3 "Druckregelung_schnell" 4 "Pumpe_Stop" 5 "Rueckwaertsbetrieb" 6 "verzoegerter_Rueckwaertsbetrieb" 7 "Pumpe_heizen" ;
+VAL_ 1010 MO_SCR_Leitungsheizung 0 "Heizung_aus" 1 "Heizung_ein" ;
+VAL_ 1010 MO_SCR_Dosierpumpe_Wartezeit 125 "nicht_verbaut" 127 "Fehler" ;
+VAL_ 1010 MO_SCR_Transferpumpe 0 "Pumpe_aus" 1 "Pumpe_ein" ;
+VAL_ 1601 MO_Faktor_Momente 0 "nicht belegt" 1 "Faktor: x 0,5Nm" 2 "Faktor: x 1,0Nm" 3 "Faktor: x 2,0Nm" ;
+VAL_ 1601 MO_Hybridfahrzeug 0 "kein_Hybridfahrzeug" 1 "Mild_Hybrid" 2 "Full_Hybrid" ;
+VAL_ 1601 MO_Getriebe_Code 2 "DL501" 4 "VL381" 10 "AL651" 11 "AL551, AL951, AL1000-8A" 12 "PDK_PAG" 13 "AL551_Hybrid" 15 "Handschalter (konventionell)" 16 "AQ250" 17 "AQ450" 18 "DQ200" 19 "DQ250" 20 "DQ500" 21 "SQ100" 22 "SQ200" ;
+VAL_ 1601 MO_StartStopp_Codiert 0 "Start_Stopp_nicht_verbaut" 1 "Start_Stopp_verbaut" ;
+VAL_ 1601 MO_Kraftstoffart 0 "Diesel" 1 "Benzin" 2 "CNG" 3 "Erdgas" 4 "Wasserstoff" ;
+VAL_ 1601 MO_Ansaugsystem 0 "Turbo" 1 "Sauger" ;
+VAL_ 1601 MO_Einspritzart 0 "MPI" 1 " FSI / TDI" ;
+VAL_ 969 MOS_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1696 NV_aktiv 0 "NV nicht aktiv" 1 "NV aktiv" ;
+VAL_ 1696 NV_Texte 0 "kein_Text" 1 "Abblendlicht_einschalten" 2 "Fussgaengermarkierung_nicht_verfuegbar" 3 "zur_Zeit_nicht_verfuegbar" 4 "Systemfehler" ;
+VAL_ 1696 NV_Gong 0 "kein_Gong" 1 "Gong_leise" 2 "Gong_mittel" 3 "Gong_laut" ;
+VAL_ 1696 NV_Symbol 0 "kein_Symbol_anzeigen" 1 "Symbol_fuer_erkanntes_Objekt_anzeigen" ;
+VAL_ 1696 NV_Hinweise 0 "keine_Anzeige" 1 "Disclaimer" 2 "Fussgaenger_Markierung_nicht_verfuegbar" 3 "Nachtsichtsystem_wird_initialisiert" ;
+VAL_ 1696 NV_Piktogramm_aktiv 0 "keine_Anzeigenprioritaet" 1 "Anzeigenprioritaet" ;
+VAL_ 1696 NV_Akustik_deaktiviert_Icon 0 "aus" 1 "ein" ;
+VAL_ 1696 NV_FGM_deaktiviert_Icon 0 "aus" 1 "ein" ;
+VAL_ 1696 NV_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1753 NMH_EPB_Start_1 1 "Zustand Start (<--Sleep)" ;
+VAL_ 1753 NMH_EPB_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ;
+VAL_ 1753 NMH_EPB_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ;
+VAL_ 1753 NMH_EPB_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ;
+VAL_ 1753 NMH_EPB_Per_WakeUp 0 "Wenn Funktions-Wakeup" 1 "CAN-Wakeup" 2 "Periphrie-Wakeup Ursache nicht bekannt" 3 "Klemme 15 HW (falls vorhanden)" 4 "t.b.d." 5 "Schalter_EPB" ;
+VAL_ 1753 NMH_EPB_Fkt_WakeUp 0 "Wenn Peripherie-Wakeup" ;
+VAL_ 1753 NMH_EPB_NM_aktiv_Klemme_15 1 "Klemme 15 EIN" ;
+VAL_ 1753 NMH_EPB_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus" ;
+VAL_ 1753 NMH_EPB_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ;
+VAL_ 1753 NMH_EPB_NM_aktiv_Schalter 1 "Schalter aktiv" ;
+VAL_ 1753 NMH_EPB_NM_aktiv_Bedarf_Anzeige 1 "Kombi-Anzeige EPB" ;
+VAL_ 1753 NMH_EPB_NM_aktiv_v_groesser_Null 1 "v > 0" ;
+VAL_ 1753 NMH_EPB_kein_NL 1 "kein lokaler Nachlauf" ;
+VAL_ 1753 NMH_EPB_NL_Temp_Modell 1 "Temperaturmodell aktiv" ;
+VAL_ 1753 NMH_EPB_NL_AutoAdjust 0 "AutoAdjust_nicht_aktiv" 1 "AutoAdjust_aktiv" ;
+VAL_ 1753 NM_EPB_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ;
+VAL_ 1753 NMH_EPB_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ;
+VAL_ 1753 NMH_EPB_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ;
+VAL_ 1753 NMH_EPB_KompSchutz 1 "KS aktiv" ;
+VAL_ 1753 NMH_EPB_Mute_Mode 1 "MuteMode aktiv" ;
+VAL_ 1753 NMH_EPB_Transport_Mode 1 "Transportmodus aktiv" ;
+VAL_ 1753 NMH_EPB_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ;
+VAL_ 1753 NMH_EPB_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ;
+VAL_ 1753 NMH_EPB_Lokalaktiv 0 "war nicht Lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1753 NMH_EPB_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1728 NMH_GW_Start_1 1 "Zustand Start (<--Sleep)" ;
+VAL_ 1728 NMH_GW_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ;
+VAL_ 1728 NMH_GW_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ;
+VAL_ 1728 NMH_GW_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ;
+VAL_ 1728 NMH_GW_Per_WakeUp 0 "Wenn_FunktionsWakeup" 1 "CAN_Wakeup__Weckendes_CAN_Segment_siehe_NMH_GW_WakeUp_CAN_Bus" 2 "P_WakeUp_Ursache_unbekannt" 3 "Klemme_15HW__falls_vorhanden" 4 "MOST_Wakeup" 5 "LIN_Wakeup" 6 "KL30_Reset" ;
+VAL_ 1728 NMH_GW_Fkt_WakeUp 0 "Wenn_Peripherie_Wakeup" 1 "Funktionswakeup_EM" 2 "Car_Wakeup_empfangen" 3 "VNSM_VehicleNetworkStateManager" 4 "Alarm_RTC__Wecken_weil_Weckzeit_abgelaufen" 5 "Wecken_durch_Diagnose" ;
+VAL_ 1728 NMH_GW_NM_aktiv_Klemme_15 1 "Klemme 15 EIN" ;
+VAL_ 1728 NMH_GW_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus" ;
+VAL_ 1728 NMH_GW_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ;
+VAL_ 1728 NMH_GW_NM_aktiv_BDM 1 "BDM-Kommunikation" ;
+VAL_ 1728 NMH_GW_NM_aktiv_Warnblinken 1 "Warnblinken aktiv" ;
+VAL_ 1728 NMH_GW_NM_aktiv_ESP 1 "ESP aktiv (Wakeup/Sleep-Konzept)" ;
+VAL_ 1728 NMH_GW_Abschaltstufe_3 1 "BEM aufgrund Abschaltstufe 3 aktiv" ;
+VAL_ 1728 NMH_GW_SG_Fehlerdauer 1 "BEM aufgrund Steuergeraetefehlerdauer aktiv" ;
+VAL_ 1728 NMH_GW_STH_Wakeup 1 "BEM aktiv aufgrund Standheizungswakeup" ;
+VAL_ 1728 NMH_GW_NL_Diagnose 0 "keine_Diagnose_aktiv" 1 "Diagnose_war_lokal_aktiv" ;
+VAL_ 1728 NM_GW_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ;
+VAL_ 1728 NMH_GW_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ;
+VAL_ 1728 NMH_GW_CAN_Diag_deaktiv 1 "CAN Bus bezogene Eigendiagnose deaktiv" ;
+VAL_ 1728 NMH_GW_KompSchutz 1 "KS aktiv" ;
+VAL_ 1728 NMH_GW_Mute_Mode 1 "MuteMode aktiv" ;
+VAL_ 1728 NMH_GW_Transport_Mode 1 "Transportmodus aktiv" ;
+VAL_ 1728 NMH_GW_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ;
+VAL_ 1728 NMH_GW_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ;
+VAL_ 1728 NMH_GW_ACAN 1 "ACAN aktiv (Wakeup/Sleep-Konzept)" ;
+VAL_ 1728 NMH_GW_KombiCAN 1 "KombiCAN aktiv (Wakeup/Sleep-Konzept)" ;
+VAL_ 1728 NMH_GW_KomfortCAN 1 "KomfortCAN aktiv (Wakeup/Sleep-Konzept)" ;
+VAL_ 1728 NMH_GW_Infotainment 1 "Infotainment aktiv (CAN oder MOST), Wakeup/Sleep-Konzept" ;
+VAL_ 1728 NMH_GW_Fahrwerk 1 "BUS_Fahrwerk_aktiv (Wakeup/Sleep-Konzept)" ;
+VAL_ 1728 NMH_GW_WakeUp_CAN_Bus 0 "Nicht zutreffend (kein CAN-Wakeup bzw. CarWakeup)" 1 "Antriebs-CAN" 2 "Kombi-CAN" 3 "Komfort-CAN" 4 "Infotainment-CAN (wenn verfuegbar)" 5 "Fahrwerks-CAN" 6 "Diagnose-CAN" ;
+VAL_ 1730 NMH_GE_Start_1 1 "Zustand Start (<--Sleep)" ;
+VAL_ 1730 NMH_GE_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ;
+VAL_ 1730 NMH_GE_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ;
+VAL_ 1730 NMH_GE_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ;
+VAL_ 1730 NMH_GE_Per_WakeUp 0 "wenn Funktionswakeup" 1 "CAN" 2 "P-Wakeup, Ursache nicht bekannt" 3 "KL 15 HW (falls vorhanden)" ;
+VAL_ 1730 NMH_GE_Fkt_WakeUp 0 "wenn Peripheriewakeup" 1 "Ende_N_Haltephase" ;
+VAL_ 1730 NMH_GE_NM_aktiv_Klemme_15 1 "Klemme 15 ein" ;
+VAL_ 1730 NMH_GE_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus" ;
+VAL_ 1730 NMH_GE_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ;
+VAL_ 1730 NMH_GE_N_Haltephase 0 "keine_N_Haltephase" 1 "N_Haltephase_aktiv" ;
+VAL_ 1730 NMH_GE_kein_NL 1 "kein lokaler Nachlauf" ;
+VAL_ 1730 NMH_GE_NL_Daten_EEPROM 1 "EEPROM Datenspeicherung" ;
+VAL_ 1730 NM_GE_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ;
+VAL_ 1730 NMH_GE_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ;
+VAL_ 1730 NMH_GE_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ;
+VAL_ 1730 NMH_GE_KompSchutz 1 "KS aktiv" ;
+VAL_ 1730 NMH_GE_Mute_Mode 1 "MuteMode aktiv" ;
+VAL_ 1730 NMH_GE_Transport_Mode 1 "Transportmodus aktiv" ;
+VAL_ 1730 NMH_GE_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ;
+VAL_ 1730 NMH_GE_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ;
+VAL_ 1730 NMH_GE_Lokalaktiv 0 "war nicht Lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1730 NMH_GE_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1730 NMH_GSG_Subbusaktiv 0 "Subbus inaktiv" 1 "Subbus aktiv" ;
+VAL_ 1729 NMH_MO_Start_1 1 "Zustand Start (<--Sleep)" ;
+VAL_ 1729 NMH_MO_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ;
+VAL_ 1729 NMH_MO_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ;
+VAL_ 1729 NMH_MO_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ;
+VAL_ 1729 NMH_MO_Per_WakeUp 0 "Wenn Funktions-Wakeup" 1 "CAN-Wakeup" 2 "Peripherie-Wakeup Ursache nicht bekannt" 3 "Klemme 15 HW (falls vorhanden)" 4 "analog (Standheizung/Tuerkontakt)(nur MED9)" ;
+VAL_ 1729 NMH_MO_Fkt_WakeUp 0 "Wenn_Peripherie_Wakeup" ;
+VAL_ 1729 NMH_MO_NM_aktiv_Klemme_15 1 "Klemme 15 EIN" ;
+VAL_ 1729 NMH_MO_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus " ;
+VAL_ 1729 NMH_MO_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ;
+VAL_ 1729 NMH_MO_NM_aktiv_EKP_Vorlauf 1 "EKP-Vorlauf" ;
+VAL_ 1729 NMH_MO_NM_aktiv_STH_Betrieb 1 "STH-Betrieb" ;
+VAL_ 1729 NMH_MO_NM_aktiv_HV_Abschaltung 0 "kein_Nachlauf" 1 "Abschaltung_aktiv" ;
+VAL_ 1729 NMH_MO_kein_NL 1 "kein lokaler Nachlauf" ;
+VAL_ 1729 NMH_MO_NL_Kuehlerluefter 1 "K�hlerl�fter Steuerung / Zusatzwasserpumpe aktiv" ;
+VAL_ 1729 NMH_MO_NL_Diagnose 1 "Diagnosefunktionen aktiv" ;
+VAL_ 1729 NMH_MO_NL_WFS 1 "WFS aktiv" ;
+VAL_ 1729 NMH_MO_NL_EEPROM 1 "EEPROM Zugriffe RAM/ROM Tests" ;
+VAL_ 1729 NMH_MO_NL_Sonstige 1 "Sonstige Nachl�ufe aktiv" ;
+VAL_ 1729 NM_MO_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ;
+VAL_ 1729 NMH_MO_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ;
+VAL_ 1729 NMH_MO_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ;
+VAL_ 1729 NMH_MO_KompSchutz 1 "KS aktiv" ;
+VAL_ 1729 NMH_MO_Mute_Mode 1 "MuteMode aktiv" ;
+VAL_ 1729 NMH_MO_Transport_Mode 1 "Transportmodus aktiv" ;
+VAL_ 1729 NMH_MO_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ;
+VAL_ 1729 NMH_MO_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ;
+VAL_ 1729 NMH_MO_Lokalaktiv 0 "war nicht Lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1729 NMH_MO_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1736 NMH_MO_SL_Start_1 1 "Zustand Start (<--Sleep)" ;
+VAL_ 1736 NMH_MO_SL_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ;
+VAL_ 1736 NMH_MO_SL_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ;
+VAL_ 1736 NMH_MO_SL_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ;
+VAL_ 1736 NMH_MO_SL_Per_WakeUp 0 "Wenn Funktions-Wakeup" 1 "CAN-Wakeup" 2 "Peripherie-Wakeup Ursache nicht bekannt" 3 "Klemme 15 HW (falls vorhanden)" 4 "analog (Standheizung/Tuerkontakt)(nur MED9)" ;
+VAL_ 1736 NMH_MO_SL_Fkt_WakeUp 0 "Wenn Peripherie-Wakeup" ;
+VAL_ 1736 NMH_MO_SL_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ;
+VAL_ 1736 NMH_MO_SL_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ;
+VAL_ 1736 NMH_MO_SL_KompSchutz 1 "KS aktiv" ;
+VAL_ 1736 NMH_MO_SL_Mute_Mode 1 "MuteMode aktiv" ;
+VAL_ 1736 NMH_MO_SL_Transport_Mode 1 "Transportmodus aktiv" ;
+VAL_ 1736 NMH_MO_SL_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ;
+VAL_ 1736 NMH_MO_SL_Busfehler 1 "Busfehler" ;
+VAL_ 1736 NMH_MO_Sl_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv" ;
+VAL_ 1736 NMH_MO_SL_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 1782 NMH_SCR_Start_1 1 "Zustand Start (<--Sleep)" ;
+VAL_ 1782 NMH_SCR_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ;
+VAL_ 1782 NMH_SCR_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ;
+VAL_ 1782 NMH_SCR_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ;
+VAL_ 1782 NMH_SCR_Car_WakeUp 1 "Car Wake Up" ;
+VAL_ 1782 NMH_SCR_Per_WakeUp 0 "Funktions-WakeUp" 1 "CAN" 2 "P_WakeUp_Ursache_unbekannt" 3 "KL_15_Hardware_falls_vorhanden" ;
+VAL_ 1782 NMH_SCR_Fkt_WakeUp 0 "Peripheriewakeup" ;
+VAL_ 1782 NMH_SCR_Klemme_15 1 "Klemme 15 ein" ;
+VAL_ 1782 NMH_SCR_Diagnose 1 "Diagnose bei Kl 15 aus" ;
+VAL_ 1782 NMH_SCR_MindestAktivZeit 1 "aktiv" ;
+VAL_ 1782 NMH_SCR_NL_Datem_EEPROM 0 "kein_Nachlauf" 1 "EEPROM_schreibzugriff" ;
+VAL_ 1782 NMH_SCR_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ;
+VAL_ 1782 NMH_SCR_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag" ;
+VAL_ 1782 NMH_SCR_CAN_Diag_deaktiv 1 "CAN Bus bezogene Eigendiagnose deaktiviert" ;
+VAL_ 1782 NMH_SCR_KompSchutz 1 "KS aktiv" ;
+VAL_ 1782 NMH_SCR_Mute_Mode 1 "Mute Mode aktiv" ;
+VAL_ 1782 NMH_SCR_Transport_Mode 1 "Transportmodus aktiv" ;
+VAL_ 1782 NMH_SCR_Abschaltstufe_aktiv 1 "Funktionsabschaltung wegen Abschaltschaltstufe" ;
+VAL_ 1782 NMH_SCR_Busfehler 1 "Busfehler" ;
+VAL_ 1782 NMH_SCR_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv" ;
+VAL_ 1782 NMH_SCR_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ;
+VAL_ 913 OBD_Kaltstart_Denominator 0 "Denominator_nicht_hochzaehlen" 1 "Bedingungen_zum_Inkr_des_Kaltstart_Denom_erf" ;
+VAL_ 913 OBD_Minimum_Trip 0 "kein_Min_Normed_Trip" 1 "Min_Normed_Trip" ;
+VAL_ 913 OBD_Driving_Cycle 0 "kein Driving Cycle erkannt" 1 "DC erkannt" ;
+VAL_ 913 OBD_Warm_Up_Cycle 0 "kein Warm Up Cycle erkannt" 1 "Warm Up Cycle erkannt" ;
+VAL_ 913 OBD_Normed_Trip 0 "kein Normed Trip" 1 "Normed Trip erf�llt" ;
+VAL_ 803 PCF_Objektstatus 0 "Kein_relevantes_Objekt_erkannt" 1 "Relevantes_Objekt_vorausfahrend" 2 "Relevantes_Objekt_stehend" 3 "Relevantes_Objekt_angehalten" 4 "Relevantes_Objekt_entgegenkommend" 5 "Ungueltig" 6 "Ungueltig" 7 "Ungueltig" ;
+VAL_ 803 PCF_Fahrer_aktiv_erkannt 0 "Fahrer_nicht_aktiv" 1 "Fahrer_aktiv" ;
+VAL_ 803 PCF_Time_to_collision 255 "Objektstatus=0x0__oder_berechneter_TTC_Wert_groesser_als_Maximalwert" ;
+VAL_ 803 PCF_v_rel 0 " Objektstatus_0x0_oder _berechnete_v_rel_>= 0_(Objekt_entfernt_sich_oder_faehrt_vorraus_mit v_Obj_=_v_ego)" ;
+VAL_ 803 PCF_dy_Kollisionsueberdeckung 0 "Keine_Ueberdeckung_oder_bei_Objektstatus_0x0" 30 "Ueberdeckung_groesser_Maximalwert" 31 "Objekueberdeckung_nicht_ermittelbar" ;
+VAL_ 802 PCR_Sensorstatus 0 "Sensor_ok" 1 "Sensor_nok" ;
+VAL_ 802 PCR_Obj_vx_rel 2047 "Fehler" ;
+VAL_ 802 PCR_Obj_vy_rel 2047 "Fehler" ;
+VAL_ 802 PCR_Obj_TTC 511 "Fehler" ;
+VAL_ 802 PCR_Obj_Guete 127 "Fehler" ;
+VAL_ 802 PCR_Crashwahrscheinlichkeit 127 "Fehler" ;
+VAL_ 929 PSD_Pos_Segment_ID 0 "keine Position gegeben" 1 "Fehlerwert" ;
+VAL_ 929 PSD_Pos_Standort 0 "mehrdeutiger_Standort" 1 "eindeutiger_Standort" ;
+VAL_ 929 PSD_Pos_Laengsfehler 0 "keine Pr�diktion (off-road)" 1 "< 2m" 2 "< 5m" 3 "< 10m " 4 "< 20m" 5 "< 50m" 6 "> 50m " 7 "nicht erlaubt" ;
+VAL_ 929 PSD_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "Fehlerwert" ;
+VAL_ 929 PSD_Vorgaenger_Segment_ID 0 "keine Segmentinformation vorhanden" 1 "Fehlerwert" ;
+VAL_ 929 PSD_Strassenklasse 0 "Rest_Feldweg_Schotterweg_Privatweg" 1 "Ortsstrasse" 2 "Bundes_Landstrasse" 3 "Autobahn" ;
+VAL_ 929 PSD_Rampe 0 "Strasse_mit_Gegenverkehr" 1 "Auffahrt_Einbahnstr" 2 "Abfahrt_Einbahnstr" 3 "Einbahnstrasse" ;
+VAL_ 929 PSD_Endkruemmung 255 "Gerade" ;
+VAL_ 929 PSD_Endkruemmung_Vorz 0 "Kruemmung_positiv" 1 "Kruemmung_negativ" ;
+VAL_ 929 PSD_Endsteigung 30 "gleich_oder_mehr_15_Prozent_Steigung" 31 "nicht_definiert" ;
+VAL_ 929 PSD_Endsteigung_Vorz 0 "Gefaelle" 1 "Steigung" ;
+VAL_ 929 PSD_ADAS_Qualitaet 0 "keine_ADAS_Qualitaet" 1 "ADAS_Qualitaet" ;
+VAL_ 929 PSD_Fahrspuren 0 "Einbahnstrasse_in_falscher_Richtung" 1 "eine_Fahrspur" 2 "zwei_Fahrspuren" 3 "drei_Fahrspuren" ;
+VAL_ 929 PSD_wahrscheinlichster_Pfad 0 "Pfad_mit_geringer_Wahrscheinlichkeit" 1 "wahrscheinlichster_Pfad" ;
+VAL_ 930 PSD_Multiplex 0 "f�r System Informationen, die sich nur langsam �ndern" 1 "Informationen �ber ein Streckensegment" 2 "f�r Informationen �ber Geschwindigkeitsbegrenzungen und m�gliche Einschr�nkungen der Geschwindigkeitsbegrenzungen" 3 "Fahrzeugposition aus der Koppelortung" ;
+VAL_ 930 PSD_Sys_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ;
+VAL_ 930 PSD_Abz_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ;
+VAL_ 930 PSD_Ges_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ;
+VAL_ 930 PSD_Ort_Laenge_VZ 0 "Ost" 1 "West" ;
+VAL_ 930 PSD_Ort_Laenge 33554431 "Keine GPS Position verfuegbar" ;
+VAL_ 930 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_ 930 PSD_Ges_Geschwindigkeit_Typ 0 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht der Geschwindigkeitsklasse von Navteq." 1 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht einer explizit angegebenen Begrenzung der Geschwindigkeit." ;
+VAL_ 930 PSD_Ges_Geschwindigkeit_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc." ;
+VAL_ 930 PSD_Abz_Vorgaenger_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ;
+VAL_ 930 PSD_Sys_Geschwindigkeit_Einheit 0 "km/h" 1 "mph" ;
+VAL_ 930 PSD_Ges_Geschwindigkeit_Witter 0 "Witterungsunabh�ngig" 1 "N�sse, Regen, Niederschlag" 2 "Gl�tte" 3 "Nebel" ;
+VAL_ 930 PSD_Sys_Verkehrsrichtung 0 "Rechtsverkehr" 1 "Linksverkehr" ;
+VAL_ 930 PSD_Ges_Geschwindigkeit_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ;
+VAL_ 930 PSD_Abz_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_ 930 PSD_Ges_Geschwindigkeit_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ;
+VAL_ 930 PSD_Ges_Geschwindigkeit_Std_Anf 25 "kein Beginn f�r stundenweise Einschr�nkungen" ;
+VAL_ 930 PSD_Abz_Geschwindigkeit_Typ 0 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht der Geschwindigkeitsklasse von Navteq." 1 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht einer explizit angegebenen Begrenzung der Geschwindigkeit" ;
+VAL_ 930 PSD_Sys_Tunnel 0 "kein Tunnel oder keine Information verfuegbar" 1 "Tunnel" ;
+VAL_ 930 PSD_Abz_Strassenklasse 0 " Rest (Feldweg, Schotter, Privatweg)" 1 "Ortsstra�e" 2 "Bundes-,Landstrasse" 3 "Autobahn" ;
+VAL_ 930 PSD_Sys_Bruecke 0 "keine Bruecke oder keine Information verfuegbar" 1 "Bruecke" ;
+VAL_ 930 PSD_Ort_Breite_VZ 0 "Nord" 1 "Sued" ;
+VAL_ 930 PSD_Sys_Fahrsp_Gegenr 0 "keine Fahrspur" 1 "eine Fahrspur" 2 "mehr als eine Fahrspur" 3 "keine Information verfuegbar" ;
+VAL_ 930 PSD_Abz_ADAS_Qualitaet 0 "keine ADAS Qualit�t" 1 "ADAS Qualit�t" ;
+VAL_ 930 PSD_Ges_Geschwindigkeit_Std_Ende 25 "kein Ende f�r stundenweise Einschr�nkungen" ;
+VAL_ 930 PSD_Abz_Abzweigerichtung 0 "rechts abzweigende Stra�e" 1 "links abzweigende Stra�e" ;
+VAL_ 930 PSD_Sys_TMC_Baustelle 0 "keine Baustelle oder keine Information verfuegbar" 1 "Baustelle" ;
+VAL_ 930 PSD_Abz_Abzweigewinkel 0 "0�: Stra�e verl�uft gerade aus" 1 "0� < Winkel � 12�" 2 "12� < Winkel � 24�" 3 "24� < Winkel � 36�" 4 "36� < Winkel � 48�" 5 "48� < Winkel � 60�" 6 "60� < Winkel � 72�" 7 "72� < Winkel � 84�" 8 "84� < Winkel � 96�" 9 "96� < Winkel � 108�" 10 "108� < Winkel � 120�" 11 "120� < Winkel � 132�" 12 "132� < Winkel � 144�" 13 "144� < Winkel � 156�" 14 "156� < Winkel � 168�" 15 "168� < Winkel � 180�" ;
+VAL_ 930 PSD_Sys_TMC_Stau 0 "kein Stau oder keine Information verfuegbar" 1 "Stau" ;
+VAL_ 930 PSD_Ges_alter_Geschw 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_ 930 PSD_Abz_Rampe 0 "Stra�e mit Gegenverkehr" 1 "Auffahrt (Einbahnstr.) " 2 "Abfahrt (Einbahnstr.)" 3 "Einbahnstra�e" ;
+VAL_ 930 PSD_Abz_Anfangskruemmung 255 "Gerade" ;
+VAL_ 930 PSD_Ges_alter_Geschw_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc." ;
+VAL_ 930 PSD_Ges_alter_Geschw_Witter 0 "Witterungsunabh�ngig" 1 "N�sse, Regen, Niederschlag" 2 "Gl�tte" 3 "Nebel" ;
+VAL_ 930 PSD_Ges_alter_Geschw_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ;
+VAL_ 930 PSD_Abz_Anfangskruemmung_Vorz 0 "Kr�mmung positiv" 1 "Kr�mmung negativ" ;
+VAL_ 930 PSD_Sys_Anfangskruemmung 255 "Gerade" ;
+VAL_ 930 PSD_Abz_Endkruemmung 255 "Gerade" ;
+VAL_ 930 PSD_Ges_alter_Geschw_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ;
+VAL_ 930 PSD_Ges_alter_Geschw_Std_Anf 25 "kein Beginn f�r stundenweise Einschr�nkungen" ;
+VAL_ 930 PSD_Sys_Anfangskruemmung_Vorz 0 "Kr�mmung positiv" 1 "Kr�mmung negativ" ;
+VAL_ 930 PSD_Abz_Endkruemmung_Vorz 0 "Kr�mmung positiv" 1 "Kr�mmung negativ" ;
+VAL_ 930 PSD_Ges_alter_Geschw_Std_Ende 25 "kein Ende f�r stundenweise Einschr�nkungen" ;
+VAL_ 930 PSD_Sys_Anfangssteigung 30 "gleich oder mehr als 15 % Steigung" 31 "ung�ltig" ;
+VAL_ 930 PSD_Abz_Endsteigung 30 "gleich oder mehr als 15 % Steigung" 31 "ung�ltig" ;
+VAL_ 930 PSD_Ges_Ueberholverbot 0 "kein �berholverbot" 1 "alle Fahrzeuge" 2 "�berholverbot f�r PKW mit Gespann" 3 "�berholverbot f�r LKW, Busse, etc." ;
+VAL_ 930 PSD_Sys_Anfangssteigung_Vorz 0 "Gef�lle " 1 "Steigung" ;
+VAL_ 930 PSD_Abz_Endsteigung_Vorz 0 "Gef�lle" 1 "Steigung" ;
+VAL_ 930 PSD_Sys_Ortschaft 0 "au�erhalb der Ortschaft" 1 "innerhalb der Ortschaft" ;
+VAL_ 930 PSD_Abz_Fahrspuren 0 "Einbahnstra�e in falscher Richtung" 1 "eine Fahrspur" 2 "zwei Fahrspuren" 3 "mehr als 2 Fahrspuren" ;
+VAL_ 930 PSD_Ges_Wechselverkehrszeichen 0 "Kein Wechselverkehrszeichen" 1 "Wechselverkehrszeichen links" 2 "Wechselverkehrszeichen rechts" 3 "Wechselverkehrszeichen links und rechts" 4 "Wechselverkerhszeichen �ber der Fahrbahn" ;
+VAL_ 930 PSD_Sys_Digitalisierung 0 "teildigitalisiert" 1 "volldigitalisiert" ;
+VAL_ 930 PSD_Sys_Zielfuehrung 0 "Zielfuehrung nicht aktiv" 1 "Zielfuehrung aktiv" ;
+VAL_ 930 PSD_Abz_wahrscheinlichster_Pfad 0 "Pfad mit geringer Wahrscheinlichkeit" 1 "wahrscheinlichster Pfad" ;
+VAL_ 1528 SAK_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 1528 SAK_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ;
+VAL_ 1528 SAK_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ;
+VAL_ 1528 SAK_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1011 SCR_Dosierpumpe_Drehzahl 2047 "Fehler" ;
+VAL_ 1011 SCR_Druck 1021 "nicht_verbaut" 1023 "Fehler" ;
+VAL_ 1011 SCR_Level_Aktivtank 1021 "nicht_verbaut" 1023 "Fehler" ;
+VAL_ 1011 SCR_Level_Passivtank 1021 "nicht_verbaut" 1023 "Fehler" ;
+VAL_ 1507 SCR_Heizkreis_3_Strom 253 "nicht_verbaut" 255 "Fehler" ;
+VAL_ 1507 SCR_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1507 SCR_Guetesensor 1021 "nicht_verbaut" 1023 "Fehler" ;
+VAL_ 1507 SCR_Temp_Aktivtank 255 "Fehler" ;
+VAL_ 1507 SCR_Temp_Passivtank 253 "nicht_verbaut" 255 "Fehler" ;
+VAL_ 1507 SCR_Leitungsheizung_Strom 255 "Fehler" ;
+VAL_ 1507 SCR_Transferpumpe_Strom 253 "nicht_verbaut" 255 "Fehler" ;
+VAL_ 1507 SCR_Tankheizung_Strom 255 "Fehler" ;
+VAL_ 1508 SCR_Spannungsversorgung_Status 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+(Ueberspannung)" 5 "OOR-(Unterspannung)" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "OOR+(FktEinschr_Ueberspg)" 13 "OOR-(FktEinschr_Unterspg)" 14 "frei" 15 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1508 SCR_VersorgungSensoren_Status 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1508 SCR_Heizkreis_3_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Guetesensor_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Leitungsheizung_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Tankheizung_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Druck_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Dosierpumpe_Status_Spule 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+(Drehzahl_zu_hoch)" 7 "RC-(Drehzahl_zu_niedrig)" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "KS_zwischen_Phasen" 13 "frei" 14 "frei" 15 "frei" ;
+VAL_ 1508 SCR_Transferpumpe_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Level_Aktivtank_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Level_Passivtank_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Temp_Aktivtank_Status 0 "kein_Fehler" 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 plus/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_ 1508 SCR_Temp_Passivtank_Status 0 "kein_Fehler" 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 plus/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_ 1509 SCR_Ansteuerung_Transferpumpe 0 "nicht_aktiv" 1 "aktiv" ;
+VAL_ 1509 SCR_Ansteuerung_Dosierpumpe 0 "nicht_aktiv" 1 "aktiv" ;
+VAL_ 1509 SCR_Ansteuerung_Heizkreis_3 0 "nicht_aktiv" 1 "aktiv" ;
+VAL_ 1509 SCR_Ansteuerung_Leitungsheizung 0 "nicht_aktiv" 1 "aktiv" ;
+VAL_ 1509 SCR_Ansteuerung_Tankheizung 0 "nicht_aktiv" 1 "aktiv" ;
+VAL_ 1526 SCR_Steuergeraet_Heizung_Status 0 "kein_Fehler" 1 "Endstufe_Tankheizung_ueberhitzt" 2 "Endstufe_Leitungsheizung_ueberhitzt" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1526 SCR_Steuergeraet_Pumpe_Status 0 "kein_Fehler" 1 "Endstufe_Pumpe_ueberhitzt" 2 "Pumpe_blockiert" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1526 SCR_Steuergeraet_Relais_Status 0 "kein_Fehler" 1 "KS+ (Ausgang Leistungsrelais) " 2 "KS-/OC (Ausgang Leistungsrelais)" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1526 SCR_Steuergeraet_Bus_Status 0 "kein_Fehler" 1 "Bus_Kommunikation_Fehler" 2 "Bus_Kommunikation_Stoerung_(temporaer)" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1526 SCR_Steuergeraet_Codierung_St000 0 "kein_Fehler" 1 "Steuergeraet_nicht_codiert" 2 "Steuergeraet_falsch_codiert" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1526 SCR_Steuergeraet_Datensatz_St001 0 "kein_Fehler" 1 "ungueltiger_Datensatz" 2 "unplausibeler_Datensatz" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1526 SCR_Steuergeraet_Defekt_Status 0 "kein_Fehler" 1 "Steuergeraet_defekt" 2 "Steuergeraet_Stoerung_(temporaer)" 3 "Diagnose_noch_nicht_beendet" ;
+VAL_ 1510 SCR_CAL_ID_Name_01 48 "Fehler" ;
+VAL_ 1510 SCR_CAL_ID_Name_02 48 "Fehler" ;
+VAL_ 1510 SCR_CAL_ID_Name_03 48 "Fehler" ;
+VAL_ 1512 SCR_CAL_ID_Leer 48 "Fehler" ;
+VAL_ 133 SCU_Ue_Winkel_ADS 4094 "Init" 4095 "Fehler" ;
+VAL_ 133 SCU_VZ_Ue_Winkel_ADS 0 "positiv" 1 "negativ" ;
+VAL_ 133 SCU_Soll_Ue_Winkel 2046 "Init" 2047 "Fehler" ;
+VAL_ 133 SCU_max_Gradient 511 "Fehler" ;
+VAL_ 133 SCU_VZ_Soll_Ue_Winkel 0 "positiv" 1 "negativ" ;
+VAL_ 133 SCU_Status 0 "betriebsbereit" 1 "Init" 2 "sichere �bersetzung" 3 "Motorsperre verriegelt" 4 "Synchronisierung l�uft" ;
+VAL_ 133 SCU_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 784 SCU_Warnlampe 0 "keine Anzeige (SCU_Status=0x0)" 1 "Warnlampe an (SCU_Status=0x1, 0x2, 0x3)" 2 "reserviert" 3 "Warnlampe Synchronisation (SCU_Status=0x4)" ;
+VAL_ 784 SCU_Warnungen 0 "keine Anzeige (SCU_Status=0x0, 0x1)" 1 "ADS Stoerung (SCU_Status=0x2, 0x3)" 2 "ADS Initialisierung (SCU_Status=0x4)" 3 "reserviert" ;
+VAL_ 784 SCU_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ;
+VAL_ 784 SCU_Charisma_Status 0 "Init (SCU_Status=0x1)" 1 "idle (SCU_Status=0x0, 0x4)" 2 "nicht verfuegbar (SCU_Status=0x2, 0x3)" 3 "reserviert" ;
+VAL_ 784 SCU_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ;
+VAL_ 1313 STH_Funk_ein 0 "kein Funkbefehl zum Einschalten" 1 "Funkbefehl zum Einschalten erhalten" ;
+VAL_ 1313 STH_Funk_aus 0 "kein Funkbefehl" 1 "Funkbefehl zum Ausschalten erhalten" ;
+VAL_ 1313 STH_Zusatzheizung 0 "Zuheizer aus" 1 "Zuheizer ein" ;
+VAL_ 1313 STH_LED 0 "keine R�ckmeldung" 1 "Rueckmeldung Standheizung in Betrieb" ;
+VAL_ 1313 STH_Geblaese 0 "kein Einschaltbefehl an die Klimaanlage, Gebl�se" 1 "Einschaltbefehl an die Klimaanlage, Gebl�se" ;
+VAL_ 1313 STH_EKP_Anst 0 "EKP nicht ansteuern" 1 "EKP ansteuern" ;
+VAL_ 1313 STH_Start_folgt 0 "kein_Start_folgt" 1 "Start_folgt" ;
+VAL_ 1313 STH_Ventil_Status 0 "Ventil_offen__grosser_Kreislauf" 1 "Ventil_geschlossen__kleiner_Kreislauf" ;
+VAL_ 1313 STH_Fehlerstatus 0 "kein Fehler" 1 "Batterie Low" 2 "Fuel Low" 3 "Hardware defekt" 4 "Heizgeraet verriegelt" ;
+VAL_ 1313 STH_Wassertemp 254 "Init" 255 "Fehler" ;
+VAL_ 1313 STH_Motorvorwaermung 0 "keine Motorvorw�rmung erfolgt" 1 "Aufheizung mit Motorvorw�rmung erfolgt" ;
+VAL_ 1313 STH_war_aktiv 0 "war inaktiv" 1 "Standheizung war letzte halbe Stunde aktiv" ;
+VAL_ 1313 STH_KVS_Ueberlauf 0 "kein �berlauf" 1 "Kraftstoffverbrauchssignal, mindestens ein �berlauf hat stattgefunden" ;
+VAL_ 1313 STH_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1172 STS_Car_not_under_theft 0 "false" 1 "true" ;
+VAL_ 1172 STS_Car_under_theft 0 "false" 1 "true" ;
+VAL_ 1172 STS_Anlassersperre 0 "inaktiv" 1 "aktiv" ;
+VAL_ 1172 STS_Typencodierung 0 "Basis" 1 "E-Gas" 4 "Sonderschutz" ;
+VAL_ 1172 STS_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
+VAL_ 1172 STS_Standlicht 0 "inaktiv" 1 "aktiv" ;
+VAL_ 1172 STS_Fahrlicht 0 "inaktiv" 1 "aktiv" ;
+VAL_ 1172 STS_Alarm_still 0 "inaktiv" 1 "aktiv" ;
+VAL_ 1172 STS_Texte 0 "kein_Text" 1 "Text_01" 2 "Text_02" 3 "Text_03" 4 "Text_04" 5 "Text_05" 6 "Text_06" 7 "Text_07" 8 "Text_08" 9 "Text_09" 10 "Text_10" 11 "Text_11" 12 "Text_12" 13 "Text_13" 14 "Init" 15 "Fehler" ;
+VAL_ 1172 STS_Laderelais 0 "Relais_offen" 1 "Relais_geschlossen" ;
+VAL_ 1172 STS_Summer 0 "inaktiv" 1 "aktiv" ;
+VAL_ 1172 STS_Notstart 0 "kein_Notstart" 1 "Notstart" ;
+VAL_ 1172 STS_Signalhorn 0 "inaktiv" 1 "aktiv" ;
+VAL_ 1172 STS_Leerlaufschaltung 0 "Leerlaufschaltung_Aus" 1 "Leerlaufschaltung_Ein" ;
+VAL_ 1413 SI_Int_CAN_gespiegelt 0 "interner CAN getrennt" 1 "interner CAN gespiegelt" ;
+VAL_ 1413 SI_CAN_Komfort_Sleep 0 "keine_Busruhe" 1 "Busruhe" ;
+VAL_ 1413 SI_CAN_Dashboard_Sleep 0 "keine_Busruhe" 1 "Busruhe" ;
+VAL_ 1413 SI_CAN_Antrieb_Sleep 0 "keine_Busruhe" 1 "Busruhe" ;
+VAL_ 1413 SI_Infotainment_Sleep 0 "keine_Busruhe" 1 "Busruhe" ;
+VAL_ 1413 SI_CAN_Extended_Sleep 0 "keine_Busruhe" 1 "Busruhe" ;
+VAL_ 1413 SI_Fahrwerk_Sleep 0 "keine_Busruhe" 1 "Busruhe" ;
+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_MOST_Status 0 "MOST_sleep_(Licht_AUS)" 1 "MOST_aktiv_(Kommunikation_moeglich)" ;
+VAL_ 1413 SI_Sammel_SG_Fehler 61 "Reserviert" 62 "Overflow" ;
+VAL_ 1413 SI_MO_WU 0 "kein Wakeup angefordert" 1 "Wakeup MED9 angefordert" ;
+VAL_ 786 FAS_Wunschgeschw 1022 "keine Anzeige" 1023 "nicht definiert" ;
+VAL_ 786 FAS_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'gr�n')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')" ;
+VAL_ 786 FAS_Texte_Primaeranz 0 "keine Anzeige " 1 "ACC nicht verfuegbar !" 2 "Auto_Auto_ _ _" 3 "Auto_ _Auto_ _" 4 "Auto_ _ _Auto_" 5 "Auto_ _ _ _Auto" 6 "Auto_Auto_ _ _ Gong (durchgestrichen)" 7 "Auto_ _Auto_ _ Gong (durchgestrichen)" 8 "Auto_ _ _Auto_ Gong (durchgestrichen)" 9 "Auto_ _ _ _Auto Gong (durchgestrichen)" 10 "ACC bereit" 11 "keine Abstandsregelung" 12 "ACC Sensor Sicht !" 13 "ACC nicht verfuegbar" 14 "o o o" 15 "Hochschalten" 16 "ESP Eingriff" 17 "Herunterschalten" 18 "Parkbremse !" 19 "Geschwindigkeitsgrenze" 20 "Waehlhebelposition !" 21 "VDA ACC-Symbol YYY km/h / mph" 22 "Tempolimit XXX km/h / mph" 23 "Kurve XXX km/h / mph" 24 "ACC Abschaltung" 25 "Symbol 'Eieruhr'" 26 "!" 27 "--- km/h / mph" 28 "XXX km/h / mph (Schriftart 2)" 29 "Lenkradwinkel" 30 "Anfahren bestaetigen" 31 "Fahrzeug verloren" 32 "Im Stand nicht moeglich" 33 "Ungueltiger Anfahrbefehl" 34 "Tuer offen !" 35 "Fahrer Gurtschloss offen !" 36 "Schalthebelposition !" 37 "Drehzahl !" 38 "Kurvenassistent aus" 39 "Tempolimit aus" 40 "Abbiegeassistent" 41 "Ortsanfang XXX km/h / mph" 42 "Ortsende XXX km/h / mph" 43 "Tempolimit Ende XXX km/h / mph" 44 "HDC aktiv" 45 "braking guard Bremsruck" 46 "braking guard aus " 47 "braking guard aus" 48 "Uebernehmen !" 49 "Steigung zu gross" 50 "Stehendes Objekt voraus" 51 "SET / 'GRA Symbol'___xxx km/h / mph" 52 "SET / 'GRA Symbol' xxx km/h / mph" 53 "ACC aus" 54 "ACC startet" 55 "ACC reinigen" 56 "ACC Fehler" 57 "ACC haelt an !" 58 "Bremse betaetigen !" 59 "Kupplung betaetigt" 60 "LIM AUS" 61 "LIM AKTIV " 62 "LIM PASSIV" 63 "LIM FEHLER" 64 "Bremse ueberhitzt !" 65 "Bremse haelt !" 66 "ESP PASSIV !" ;
+VAL_ 786 FAS_Status_Anzeige 0 "ACC/GRA Hauptschalter aus" 1 "ACC in Init (nicht bei GRA)" 2 "ACC/GRA passiv" 3 "ACCGRA aktiv" 4 "ACC/GRA im Hintergrund (�bertreten)" 5 "frei" 6 "ACC reversibel aus (nicht bei GRA)" 7 "ACC/GRA irreversibel aus" ;
+VAL_ 270 TSK_ax_Getriebe 511 "nicht definiert" ;
+VAL_ 270 TSK_Freig_WU 0 "TSK_Uebersetzungswunsch nicht freigegeben" 1 "TSK_Uebersetzungswunsch freigegeben" ;
+VAL_ 270 TSK_Limiter_aktiv 0 "Speed Limiter ist nicht aktiv" 1 "Speed Limiter aktiv und regelt" ;
+VAL_ 270 TSK_Status_GRA_ACC_02 0 "nicht verbaut / kein ACC zul�ssig" 1 "GRA / ACC aktiv " 2 "GRA / ACC vom Fahrer �bersteuert" 3 "Fehler, GRA/ACC nicht m�glich " ;
+VAL_ 273 TSK_QBit_Steigung 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 273 TSK_Status_GRA_ACC_01 0 "nicht_verbaut_kein_ACC_zulaessig" 1 "GRA_ACC_aktiv" 2 "GRA_ACC_vom_Fahrer_uebersteuert" 3 "Fehler_GRA_ACC_nicht_moeglich" ;
+VAL_ 273 TSK_Fahrzeugmasse 31 "Fehler" ;
+VAL_ 273 TSK_QBit_Fahrzeugmasse 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ;
+VAL_ 273 TSK_Fahrzeugmasse_02 255 "Fehler" ;
+VAL_ 273 TSK_Steigung 255 "Fehler" ;
+VAL_ 273 TSK_Getriebeinfo 0 "Handschalter" 1 "AL_AQ_Getriebe" 2 "DL_DQ_Getriebe" 3 "CVT_Getriebe" ;
+VAL_ 273 TSK_Codierung_ACC 0 "TSK_korrekt_auf_kein_ACC_codiert_oder_TSK_falsch_codiert" 1 "TSK_korrekt_auf_ACC_codiert" ;
+VAL_ 273 TSK_Zwangszusch_ESP 0 "keine_ESP_ASR_Beeinflussung" 1 "ESP_ASR_Beeinflussung" ;
+VAL_ 273 TSK_Freig_Verzoeg_Anf 0 "Verzoegerungsanforderung_nicht_freigegeben" 1 "Verzoegerungsanforderung_freigegeben" ;
+VAL_ 1414 WH_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ;
diff --git a/iqdbc_repo/iqdbc/dbc/vw_mqb.dbc b/iqdbc_repo/iqdbc/dbc/vw_mqb.dbc
new file mode 100644
index 000000000..dc79e16e9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/vw_mqb.dbc
@@ -0,0 +1,1804 @@
+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_: Airbag_MQB BAP_Tester_MQB BMS_MQB Datenlogger_MQB Gateway_MQB Getriebe_DQ_Hybrid_MQB Getriebe_DQ_MQB LEH_MQB Motor_Diesel_MQB Motor_Hybrid_MQB Motor_Otto_MQB SAK_MQB Waehlhebel_MQB Vector__XXX l c i XXX
+
+
+BO_ 290 ACC_06: 8 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.0) [0.0|1] "" XXX
+ SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1.0,0.0) [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
+
+BO_ 279 ACC_10: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ AWV_AWA_Status_EPS : 12|4@1+ (1,0) [0|7] "" XXX
+ SG_ AWV1_Anf_Prefill : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_CM_Info : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV2_Freigabe : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV1_HBA_Param : 19|2@1+ (1,0) [0|3] "" XXX
+ SG_ AWV2_Ruckprofil : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV2_Priowarnung : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_CM_Anforderung : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Info_Teilbremsung : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Notfallblinken : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Teilbremsung_Freigabe : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Zielbrems_Teilbrems_Verz_Anf : 29|10@1+ (0.024,-20.016) [-20.016|4.536] "Unit_MeterPerSeconSquar" XXX
+ SG_ ANB_Zielbremsung_Freigabe : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Vorstufe : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Halten : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_CityANB_Auspraegung : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ PCF_Freigabe : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV1_ECD_Anlauf : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_AWA_VZ_Anf_Lenkmomoffset : 46|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ AWV_AWA_Anf_Lenkmomoffset : 47|9@1+ (0.01,0) [0.00|5.11] "Unit_NewtoMeter" XXX
+ SG_ PCF_Time_to_collision : 56|8@1+ (0.01,0) [0|2.5] "Unit_Secon" XXX
+
+BO_ 304 PLA_01: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ PLA_Status_PLA_ESP : 12|4@1+ (1.0,0.0) [0.0|15] "" XXX
+ SG_ PLA_LW_Soll : 16|13@1+ (0.1,0) [0.0|819.1] "Unit_DegreOfArc" XXX
+ SG_ PLA_VZ_LW_Soll : 31|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ PLA_Status_PLA_EPS : 32|4@1+ (1.0,0.0) [0.0|15] "" XXX
+ SG_ PLA_Bremsmoment : 36|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" XXX
+ SG_ PLA_Bremsverzoegerung : 36|7@1+ (0.1,0) [0.0|12.0] "Unit_MeterPerSeconSquar" XXX
+ SG_ PLA_Anf_Bremsverzoegerung : 43|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ PLA_BremsMom_Verzoeg : 50|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ PLA_Anhalten : 51|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ PLA_Anhalteweg : 52|11@1+ (0.01,0) [0.01|20.45] "Unit_Meter" XXX
+ SG_ PLA_01_Signal_red_cyclic : 63|1@1+ (1.0,0.0) [0.0|1] "" XXX
+
+BO_ 679 ACC_13: 8 XXX
+ SG_ ACC_Regelgeschw : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_Einheit_maxSetzgeschw : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_maxSetzgeschw : 23|9@1+ (1,0) [0|510] "" XXX
+ SG_ ACC_minRegelgeschw : 32|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_maxRegelgeschw : 40|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_Tempolimitassistent : 48|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Kurvenassistent : 52|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_RUV : 56|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Tachokranz : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Typ_Tachokranz_unten : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_ENG_Texte : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_ADAPTIVE : 63|2@0+ (1,0) [0|3] "" XXX
+
+BO_ 681 ACC_15: 8 XXX
+ SG_ AWV_Warnung : 16|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV_Texte : 24|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV_Status_Anzeige : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ AWV_Einstellung_System_FSG : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Einstellung_Warnung_FSG : 36|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV_Warnlevel : 58|6@1+ (1,0) [0|63] "" XXX
+
+BO_ 64 Airbag_01: 8 Airbag_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB
+ SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_PAO_Leuchte_Anf : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Deaktivierung_HV : 42|3@1+ (1.0,0.0) [0.0|7] "" BMS,Gateway_MQB,LEH_MQB,Motor_Hybrid_MQB
+ SG_ AB_EDR_Trigger : 45|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB
+ SG_ AB_Gurtwarn_HFS : 47|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ AB_Gurtwarn_HBFS : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ SC_Masterzeit_Offset : 53|2@1+ (5.08,0) [0.00|15.24] "Unit_Secon" Gateway_MQB
+ SG_ SC_Masterzeit : 57|7@1+ (0.04,0) [0.00|5.04] "Unit_Secon" Gateway_MQB
+
+BO_ 1312 Airbag_02: 8 Airbag_MQB
+ SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" Gateway_MQB
+
+BO_ 65 Airbag_03: 8 Airbag_MQB
+ SG_ Airbag_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ Airbag_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ AB_MKB_Safing : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 1633 Anhaenger_01: 8 Gateway_MQB
+ SG_ AAG_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Anhaenger_abgesteckt : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_NSL_aktiv : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Anhaenger_erkannt : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Blinker_H_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Blinker_HL_def : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Blinker_HR_def : 11|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Bremslicht_H_def : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Schlusslicht_HL_def : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Schlusslicht_HR_def : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_AVS_Fehler_02 : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_AVS_Stati : 20|4@1+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 1626 BCM_01: 8 Gateway_MQB
+ SG_ BCM_Bremsbelag_Sensor : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Bremsfluessigkeit_Sensor : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Licht_Warn : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Waschwasser_Sensor : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Kuehlmittel_Sensor : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BCM1_Kl_15_HW_erkannt : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Eis_Offroad_Taste : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ ZZH_Endlage_oben : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZZH_Endlage_unten : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZZH_Endlage_unplausibel : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM2_EZS_gedrueckt : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM2_SST_gedrueckt : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Hybrid_StartStopp_Taste : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM1_Warnblink_Taster : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Valet_Parking_Taster : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Remotestart_Betrieb : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BCM1_HSK_Taster : 28|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Heckrollo_Taster : 29|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Rueckfahrlicht_Schalter : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM1_MH_Schalter : 31|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BCM1_MH_WIV_Schalter : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM_Eco_Charisma_Taste : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ BCM_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM_Thermomanagement_Fehler : 36|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM_Thermomanagement_gueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM1_Lichtwarn_Texte : 38|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 869 BEM_05: 8 Gateway_MQB
+ SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_01_Abschaltstufen : 26|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_EMLIN_ungueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_Segel_Info : 48|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" LEH_MQB
+ SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" LEH_MQB
+
+BO_ 1628 BMS_Hybrid_01: 8 BMS_MQB
+ SG_ BMS_HYB_ASV_hinten_Status : 13|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_ASV_vorne_Status : 14|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_BattFanSpd : 16|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB
+ SG_ BMS_HYB_VentilationReq : 20|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_Spuelbetrieb_Status : 21|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_Kuehlung_Anf : 22|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ BMS_HYB_Temp_vor_Verd : 24|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_HYB_Temp_nach_Verd : 32|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_Temperatur : 40|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_Temperatur_Ansaugluft : 48|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_IstSpannung_HV : 56|8@1+ (1,100) [100|350] "Unit_Volt" Gateway_MQB
+
+BO_ 901 Charisma_01: 8 Gateway_MQB
+ SG_ CHA_Ziel_FahrPr_ALR : 0|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_ESP : 4|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_FL : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Fahrer_Umschaltung : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB
+ SG_ CHA_Ziel_FahrPr_MO : 16|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ CHA_Ziel_FahrPr_GE : 20|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ CHA_Ziel_FahrPr_ST : 24|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_SCU : 28|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_DR : 32|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_QS : 36|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_AFS : 40|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_RGS : 44|4@1+ (1,0) [0|15] "" Airbag_MQB
+ SG_ CHA_Ziel_FahrPr_EPS : 48|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_ACC : 52|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_SAK : 56|4@1+ (1,0) [0|15] "" SAK_MQB
+ SG_ CHA_Ziel_FahrPr_MStSt : 60|4@1+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 945 DC_Hybrid_01: 8 LEH_MQB
+ SG_ DC_HYB_iAktLV : 12|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB
+ SG_ DC_HYB_iAktReserveLV : 22|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB
+ SG_ DC_HYB_uAktLV : 32|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Gateway_MQB
+ SG_ DC_HYB_LangsRegelung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Abregelung_Temperatur : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Fehler_RedLeistung : 42|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Fehler_intern : 43|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Fehler_Spannung : 44|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Auslastungsgrad : 56|8@1+ (0.4,0) [0|100] "Unit_PerCent" Gateway_MQB
+
+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_ 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_ 1603 Einheiten_01: 8 Gateway_MQB
+ 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] "" Motor_Diesel_MQB
+ 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] "" Vector__XXX
+ SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ 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_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 260 EPB_01: 8 Gateway_MQB
+ SG_ EPB_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_01_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_QBit_Laengsbeschleunigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_QBit_Pedalweg_Kuppl : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_BCM2_Motor_Wakeup : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_Freig_Verzoeg_Anf : 15|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_Verzoeg_Anf : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" Vector__XXX
+ SG_ EPB_Laengsbeschleunigung : 24|8@1+ (1,-128) [-128|126] "Unit_PerCentOfForceOfGravi" Vector__XXX
+ SG_ EPB_Pedalweg_Kuppl : 32|8@1+ (0.4,0) [8|92] "Unit_PerCent" Vector__XXX
+ SG_ EPB_Anfahrwunsch_erkannt : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_DAA_Randbed_erf : 49|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ EPB_Fehlerstatus : 50|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EPB_Schalterposition : 52|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_QBit_Schalterpos : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_Konsistenz_ACC : 55|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_Spannkraft : 56|5@1+ (1,0) [0|29] "Unit_KiloNewto" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ EPB_Status : 61|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 257 ESP_02: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Gierrate : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_QBit_Laengsbeschl : 13|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Querb : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Stillstandsflag : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Querbeschleunigung : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Laengsbeschl : 24|10@1+ (0.03125,-16) [-16|15.90625] "Unit_MeterPerSeconSquar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Verteil_Wankmom : 34|5@1+ (0.1,-1) [-1|1] "" Vector__XXX
+ SG_ ESP_QBit_Anf_Vert_Wank : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Gierrate : 40|14@1+ (0.01,0) [0|163.82] "Unit_DegreOfArcPerSecon" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_VZ_Gierrate : 54|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_Notbremsanzeige : 55|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESP_SpannungsAnf : 56|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_PLA_Abbruch : 57|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ ESP_Status_ESP_PLA : 60|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 262 ESP_05: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Bremsdruck : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Fahrer_bremst : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Schwelle_Unterdruck : 14|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Bremsdruck : 16|10@1+ (0.3,-30) [-30|276.6] "Unit_Bar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Fahrer_bremst : 26|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Verz_TSK_aktiv : 27|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Lenkeingriff_ADS : 28|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Konsistenz_TSK : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Bremsruck_AWV2 : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Konsistenz_AWV2 : 31|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ECD_Fehler : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ECD_nicht_verfuegbar : 33|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Status_Bremsentemp : 34|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Autohold_Standby : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_HDC_Standby : 36|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_HBA_aktiv : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Prefill_ausgeloest : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Rueckwaertsfahrt_erkannt : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Status_Anfahrhilfe : 40|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_HDC_aktiv : 41|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_StartStopp_Info : 42|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ ESP_Eingr_HL : 44|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Eingr_HR : 45|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Eingr_VL : 46|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Eingr_VR : 47|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_BKV_Unterdruck : 48|8@1+ (4,0) [0|1012] "Unit_MilliBar" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Autohold_aktiv : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_FStatus_Anfahrhilfe : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_Verz_EPB_aktiv : 58|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ECD_Bremslicht : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Verzoeg_EPB_verf : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Status_Bremsdruck : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Anforderung_EPB : 62|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 914 ESP_07: 8 Gateway_MQB
+ SG_ ESP_07_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_07_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_ACC_LDE : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Quattro_Antrieb : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Codierung_ADS : 14|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ ESP_RTA_HL : 16|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ ESP_RTA_HR : 24|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ ESP_RTA_VR : 32|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ OBD_Fehler_Radsensor_HL : 40|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_Fehler_Radsensor_HR : 44|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_Fehler_Radsensor_VL : 48|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_Fehler_Radsensor_VR : 52|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Qualifizierung_Antriebsart : 56|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Offroad_Modus : 57|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_MKB_ausloesbar : 58|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESP_MKB_Status : 59|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESP_CM_Variante : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_OBD_Status : 61|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 278 ESP_10: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 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_ 178 ESP_19: 8 Gateway_MQB
+ SG_ ESP_HL_Radgeschw_02 : 0|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_HR_Radgeschw_02 : 16|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_VL_Radgeschw_02 : 32|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_VR_Radgeschw_02 : 48|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 1629 ESP_20: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESP_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ ESP_Charisma_FahrPr : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ ESP_Charisma_Status : 28|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESP_Wiederstart_Anz_01 : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Wiederstart_Anz_02 : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Wiederstart_Anz_03 : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Wiederstart_Anz_04 : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_01 : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_02 : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_03 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_04 : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_05 : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_06 : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_07 : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stoppverbot_Anz_Std : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Dachrelingsensor : 42|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESP_Stoppverbot_Anz_08 : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ HDC_Charisma_FahrPr : 45|4@1+ (1,0) [0|15] "" XXX
+ SG_ HDC_Charisma_Status : 49|2@1+ (1,0) [0|3] "" XXX
+ SG_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX
+
+BO_ 253 ESP_21: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "" XXX
+ SG_ ESP_PLA_Bremseingriff : 22|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Diagnose : 23|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESC_Reku_Freigabe : 24|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESC_v_Signal_Qualifier_High_Low : 25|3@1+ (1.0,0.0) [0.0|7] "" XXX
+ SG_ ESP_Vorsteuerung : 28|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_AWV3_Brems_aktiv : 29|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ OBD_Schlechtweg : 30|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ OBD_QBit_Schlechtweg : 31|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0.00|655.32] "Unit_KiloMeterPerHour" XXX
+ SG_ ASR_Tastung_passiv : 48|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Tastung_passiv : 49|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Systemstatus : 50|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ASR_Schalteingriff : 51|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ ESP_Haltebestaetigung : 53|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_MKB_Abbruch_Geschw : 54|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_QBit_v_Signal : 55|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ABS_Bremsung : 56|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ASR_Anf : 57|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MSR_Anf : 58|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ EBV_Eingriff : 59|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ EDS_Eingriff : 60|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Eingriff : 61|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_ASP : 62|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Anhaltevorgang_ACC_aktiv : 63|1@1+ (1.0,0.0) [0.0|1] "" XXX
+
+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_ 989 Gateway_74: 8 Gateway_MQB
+ SG_ LH_EPS_01_alt : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB
+ SG_ Kessy_04_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ LIN_2_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MFG_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ GW_74_va_14 : 4|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Klima_02_alt : 5|1@1+ (1,0) [0|1] "" BMS_MQB
+ SG_ Parkhilfe_01_alt : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ ELV_01_alt : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KY_StartStopp_Info : 16|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ PH_StartStopp_Info : 18|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ EPS_Lenkerposition : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB
+ SG_ ELV_Anf_Klemme_50 : 22|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ MF_StartStopp_Info : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ KL_Geblaesespannung_Soll : 40|8@1+ (0.05,0.5) [2|13] "Unit_Volt" BMS_MQB
+ SG_ KL_Umluftklappe_Status : 48|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ MFL_Tip_Down : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MFL_Tip_Up : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ LS_Tiptronic_Fehler : 58|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 296 Getriebe_06: 3 Getriebe_DQ_Hybrid_MQB
+ SG_ GE_WH_Sperre : 0|1@1+ (1,0) [0|1] "" Waehlhebel_MQB
+ SG_ GE_Ausleuchtungsmode : 1|1@1+ (1,0) [0|1] "" Waehlhebel_MQB
+ SG_ GE_Test_Freigabe : 2|1@1+ (1,0) [0|1] "" Waehlhebel_MQB
+ SG_ GE_Ist_Fahrstufe : 4|4@1+ (1,0) [0|15] "" Waehlhebel_MQB
+ SG_ GE_Testparameter_1 : 8|8@1+ (1,0) [0|255] "" Waehlhebel_MQB
+ SG_ GE_Testparameter_2 : 16|8@1+ (1,0) [0|255] "" Waehlhebel_MQB
+
+BO_ 173 Getriebe_11: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER_DISABLED : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "" XXX
+ SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "" XXX
+ SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" XXX
+ SG_ GE_Fahrstufe : 42|4@1+ (1,0) [0|15] "" XXX
+ SG_ GE_reserv_Fahrstufe : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ GE_Schaltablauf : 47|2@1+ (1,0) [0|3] "" XXX
+ SG_ GE_Uefkt_unplausibel : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ GE_MMom_Status_02 : 50|3@1+ (1,0) [0|7] "" XXX
+ SG_ GE_Status_Kraftschluss : 53|3@1+ (1,0) [0|7] "" XXX
+ SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" XXX
+ SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 174 Getriebe_12: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_12_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ Getriebe_12_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Drehzahlmesser_Daempfung : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Schubabschalt_Unt : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freigabe_Synchro : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Synchro_Wunschdrehz : 15|9@1+ (25,0) [0|12750] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Synchro_Zeit : 24|8@1+ (20,0) [0|5080] "Unit_MilliSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Mom_Begr_Gradient : 32|8@1+ (10,0) [0|2540] "Unit_NewtoMeterPerSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Anheb_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Aufnahmemoment : 48|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Anf_Zylabsch : 58|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ GE_HYB_DZ_Eingriff : 62|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB
+
+BO_ 301 Getriebe_13: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_13_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ Getriebe_13_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_StartStopp_Info : 12|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ GE_Langfr_Schutzmom_02 : 14|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Eingangsdrehz : 48|14@1+ (1,0) [0|16381] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Notlauf : 62|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freig_Langfr_Schutzmom : 63|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 968 Getriebe_14: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ GE_OBD_AbsperrVent : 12|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_amax_moeglich : 16|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Charisma_FahrPr : 25|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ GE_Charisma_Status : 29|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ GE_Verlustmoment : 32|8@1+ (1,0) [0|254] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freigabe_Verfallsinfo_WFS : 49|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ GE_Codierung_MSG : 50|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ GE_LaunchControl : 51|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ GE_Heizwunsch : 52|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_OBD_Status : 54|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_LFR_Adaption : 55|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Sumpftemperatur : 56|8@1+ (1,-58) [-58|196] "Unit_DegreCelsi" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 158 Getriebe_Hybrid_01: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Hybrid_MQB
+ SG_ Getriebe_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Fehlerstatus : 12|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freigabe_K0 : 16|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freigabe_LL_Reg : 17|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freig_sSchl_K0 : 18|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freig_VM_EM_Stop : 19|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Wiederstart : 20|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Filt_MomAufbau : 21|3@1+ (1,0) [0|7] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_nK0 : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Vector__XXX
+ SG_ GE_HYB_MomEingriff_EM : 32|6@1+ (0.5,0) [0|31.5] "Unit_NewtoMeter" LEH_MQB
+ SG_ GE_HYB_VZ_MomEingriff_EM : 38|1@1+ (1,0) [0|1] "" LEH_MQB
+ SG_ GE_HYB_Sportfaktor : 56|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_VM_akt_halten : 61|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_StartAnf : 62|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_VM_Startkontr : 63|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+
+BO_ 299 GRA_ACC_01: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Typ468 : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Stufe_2 : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_ButtonTypeInfo : 28|2@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 960 Klemmen_Status_01: 4 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZAS_Kl_50 : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 949 Klima_11: 8 Gateway_MQB
+ SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Zonen : 4|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Comp_rev_rq : 8|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX
+ SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ KL_Comp_enable : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB
+
+BO_ 1625 Klimakomp_01: 8 Gateway_MQB
+ SG_ EKL_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EKL_Comp_SCI_com_stat : 16|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_output_stat : 18|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_main_stat : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EKL_Comp_ovld_stat : 21|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ EKL_Comp_Inv_stat : 24|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_photo_temp_stat : 30|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_photo_temp : 32|8@1+ (1,0) [0|254] "Unit_DegreCelsi" Vector__XXX
+ SG_ EKL_Comp_current : 40|8@1+ (0.1,0) [0|25.4] "Unit_Amper" Motor_Hybrid_MQB
+ SG_ EKL_Comp_rev_stat : 48|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX
+
+BO_ 2549088277 KN_Airbag_01: 8 Airbag_MQB
+ SG_ Airbag_01_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Airbag_01_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ AB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088380 KN_EMotor_01: 8 LEH_MQB
+ SG_ EMotor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EMotor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ EM_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088375 KN_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Getriebe_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ GE_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088379 KN_Hybrid_01: 8 BMS_MQB
+ SG_ Hybrid_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Hybrid_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ BMS_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088374 KN_MO_01: 8 Motor_Diesel_MQB
+ SG_ Motor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Motor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088284 KN_SAK: 8 SAK_MQB
+ SG_ SAK_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SAK_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ SAK_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 779 Kombi_01: 8 Gateway_MQB
+ SG_ KBI_ABS_Lampe : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_ESP_Lampe : 1|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_BKL_Lampe : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Airbag_Lampe : 3|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ KBI_SILA_gueltig : 4|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ KBI_Lenkung_Lampe : 5|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Vorglueh_System_Lampe : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB
+ SG_ KBI_NV_in_Anzeige : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Kombi_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Anzeigestatus_ACC : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigestatus_GRA : 13|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Oeldruck_Schalter : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Tankwarnung : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_MFA_v_Einheit_01 : 17|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_im_Stellgliedtest : 18|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ KBI_Anzeigefehler_LDW : 19|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ KBI_Variante_USA : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Oeldruckwarnung : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Handbremse : 23|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ KBI_V_Digital : 24|9@1+ (1,0) [0|511] "" Vector__XXX
+ SG_ KBI_PLA_in_Anzeige : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigefehler_NV : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigestatus_LIM : 35|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_angez_Geschw : 48|10@1+ (0.32,0) [0|325.12] "Unit_KiloMeterPerHour" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Einheit_Tacho : 58|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Konsistenz_ACC : 59|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Fehler_Anzeige_ACC : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigefehler_SWA : 61|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 1719 Kombi_02: 8 Gateway_MQB
+ SG_ KBI_Kilometerstand : 0|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Vector__XXX
+ SG_ KBI_Standzeit_02 : 20|17@1+ (1,0) [0|131068] "Unit_Secon" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Inhalt_Tank : 40|7@1+ (1,0) [0|125] "Unit_Liter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_FStatus_Tank : 47|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_QBit_Aussen_Temp_gef : 55|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Aussen_Temp_gef : 56|8@1+ (0.5,-50) [-50|75] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 982 Licht_hinten_01: 8 Gateway_MQB
+ SG_ Licht_hinten_01_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 134 LWI_01: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_Lenkradwinkel : 16|13@1+ (0.1,0) [0|800] "Unit_DegreOfArc" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" Vector__XXX
+ SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX
+
+BO_ 263 Motor_04: 8 Motor_Diesel_MQB
+ SG_ MO_Istgang : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_Sollgang : 12|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_Oeldruck : 16|8@1+ (0.04,0) [0|10] "Unit_Bar" Gateway_MQB
+ SG_ MO_Anzeigedrehz : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" Gateway_MQB
+ SG_ MO_Schaltempf_verfbar : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Ladedruck : 39|9@1+ (0.01,0) [0|5.1] "Unit_Bar" Gateway_MQB
+ SG_ MO_KVS : 48|15@1+ (1,0) [0|32767] "Unit_MicroLiter" Gateway_MQB
+ SG_ MO_KVS_Ueberlauf : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+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_ 1607 Motor_09: 8 Motor_Diesel_MQB
+ SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-45.75|143.25] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_E85_Sensor : 8|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB
+ SG_ SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|8] "" Gateway_MQB
+ SG_ SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "" Gateway_MQB
+ SG_ SCR_Warnstufe_1 : 32|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Warnstufe_2 : 33|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Text : 34|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ SCR_Akustik : 37|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Kraftstofffilter_Wasser : 40|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Systemfehler : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Inducement_Strategie : 42|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_CO2_Faktor : 44|12@1+ (1,0) [1|4094] "Unit_GramPerLiter" Gateway_MQB
+
+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_ 958 Motor_14: 8 Motor_Diesel_MQB
+ SG_ MO_StartStopp_Status : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" Gateway_MQB,LEH_MQB
+ SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB
+ SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Timeout_ESP : 32|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Status_Zylabschalt_01 : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 1631 Motor_16: 8 Motor_Diesel_MQB
+ SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Gateway_MQB
+ SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Gateway_MQB
+ SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Steigung : 56|8@1+ (0.8,-101.6) [-101.6|101.6] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 812 Motor_17: 8 Motor_Diesel_MQB
+ SG_ MO_Prio_MAX_Wunschdrehzahl : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Prio_MIN_Wunschdrehzahl : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Luftpfad_aktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ MO_v_Begrenz_Aktivierbar : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ MO_Drehzahlbeeinflussung : 16|8@1+ (0.39,0) [0|99.45] "Unit_PerCent" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_MIN_Wunschdrehzahl : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_MAX_Wunschdrehzahl : 32|9@1+ (25,0) [0|12750] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Charisma_FahrPr : 41|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_Charisma_Status : 45|2@1+ (1,0) [0|3] "" Gateway_MQB
+
+BO_ 1648 Motor_18: 8 Motor_Diesel_MQB
+ SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Eis_Offroad_LED : 45|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_E85_BS_Texte : 52|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 289 Motor_20: 8 Motor_Diesel_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|255] "" XXX
+ SG_ MO_Fahrpedalrohwert_01 : 12|8@1+ (0.4,0) [0.0|101.6] "Unit_PerCent" XXX
+ SG_ MO_QBit_Fahrpedalwerte_01 : 20|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Fahrpedalgradient : 21|8@1+ (25,0) [0|6350] "Unit_PerCentPerSecon" XXX
+ SG_ MO_Sig_Fahrpedalgradient : 29|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_rel_Saugrohrdruck : 30|6@1+ (18,0) [0|1116] "Unit_MilliBar" XXX
+ SG_ MO_rel_Saugrohrdruck_gem_err : 36|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Moment_im_Leerlauf : 37|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Schubabschaltung : 38|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_StartStopp_StoppVorbereitung : 39|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" XXX
+ SG_ MO_Entkopplung_Sollschlupf : 48|7@1+ (20,0) [0|2480] "Unit_MinutInver" XXX
+ SG_ MO_temporaere_Fahrerabwesenheit : 55|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ TSK_a_Soll_gradientenbegrenzt : 57|7@1+ (0.1,-7.2) [-7.2|5.4] "Unit_MeterPerSeconSquar" XXX
+
+BO_ 967 Motor_26: 8 Motor_Diesel_MQB
+ SG_ MO_HYB_Status_HV_Ladung : 8|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Gateway_MQB
+ SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_1 : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_2 : 29|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_3 : 30|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_4 : 31|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_HYB_Text_5 : 36|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_6 : 37|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_7 : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Gateway_MQB
+ SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Winterfahrprog : 52|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" 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_ 157 Motor_Hybrid_01: 8 Motor_Hybrid_MQB
+ SG_ Motor_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB
+ SG_ Motor_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_IstStatusK0 : 12|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_max_ind_VM_Mom : 16|10@1+ (1,0) [0|1021] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Zielzustand : 26|3@1+ (1,0) [0|7] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Startmodus : 29|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ MO_HYB_Startmodus_PQ3x : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Stoppmodus : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_VM_Mom_oE : 40|10@1+ (1,-100) [-100|922] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_VM_aktiv : 50|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Schaltverhinderung : 51|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+
+BO_ 811 Motor_Hybrid_02: 8 Motor_Hybrid_MQB
+ SG_ MO_HYB_E_Faktor : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Drehzahl_VM : 16|16@1+ (0.25,0) [0|16256] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_LowSpeedModus : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+
+BO_ 2600468501 NMH_Airbag_01: 8 Airbag_MQB
+ SG_ NM_Airbag_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Airbag_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_Airbag_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Airbag_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468604 NMH_EMotor_01: 8 LEH_MQB
+ SG_ NM_EMotor_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_EMotor_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_EMotor_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468496 NMH_Gateway: 8 Gateway_MQB
+ SG_ NM_Gateway_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Gateway_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Gateway_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Gateway_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_ACAN_Aktivitaet : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_FCAN_Aktivitaet : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_KCAN_Aktivitaet : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_ICAN_Aktivitaet : 38|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_DiagCAN_Aktivitaet : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_ECAN_Aktivitaet : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_Energie_LIN_Aktivi000 : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_Bedien_LIN_Aktivitaet : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_EM_Aktivitaet : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_EM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_Shutdown : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_Spg_Messung : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_Wakeup_Monitor : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468599 NMH_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ NM_Getriebe_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Getriebe_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_Getriebe_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_v_gr_0 : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Pos_Erk : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Umg_Bed : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468603 NMH_Hybrid_01: 8 BMS_MQB
+ SG_ NM_Hybrid_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Hybrid_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_Hybrid_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NL_Luefter : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468598 NMH_MO_01: 8 Motor_Diesel_MQB
+ SG_ NM_MO_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_MO_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_MO_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_MO_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_HV_Abschaltung : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_EKP_Vorlauf : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_STH_Betrieb : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_Kuehlerluefter : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_Diagnose : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_WFS : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_EEPROM : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_Sonstige : 52|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 913 OBD_01: 8 Motor_Diesel_MQB
+ SG_ OBD_Calc_Load_Val : 0|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Eng_Cool_Temp : 8|8@1+ (1,-40) [-40|215] "Unit_DegreCelsi" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Abs_Throttle_Pos : 16|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Abs_Load_Val : 24|16@1+ (0.39215686275,0) [0|25700] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Abs_Pedal_Pos : 40|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Kaltstart_Denominator : 59|1@1+ (1,0) [0|1] "" BMS_MQB,LEH_MQB
+ SG_ OBD_Minimum_Trip : 60|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Driving_Cycle : 61|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Warm_Up_Cycle : 62|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Normed_Trip : 63|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+
+BO_ 1630 OBD_Tankgeber_01: 8 Gateway_MQB
+ SG_ OBD_TG_F_Status_1 : 0|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_F_Status_2 : 4|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_F_Status_3 : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_F_Status_4 : 12|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_1 : 16|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_2 : 28|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_3 : 40|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_4 : 52|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 1437 Remotestart_FFB: 8 Gateway_MQB
+ SG_ RSF_Tastencode_1 : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ RSF_Tastencode_2 : 8|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ RSF_Tastencode_Maske : 16|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB
+
+BO_ 984 RGS_VL_01: 8 Airbag_MQB
+ SG_ RGS_VL_Texte : 12|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ RGS_VL_Charisma_FahrPr : 14|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ RGS_VL_Charisma_Status : 18|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ RGS_VL_aktiv : 21|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Sitz : 25|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Schiebedach : 26|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Fenster : 27|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Warnblinken : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_Precrash_Basis : 32|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ RGS_VL_Precrash_Front : 40|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ RGS_VL_Precrash_Rear : 48|8@1+ (1,0) [0|255] "" Gateway_MQB
+
+BO_ 1528 SAK_01: 8 SAK_MQB
+ SG_ SAK_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ SAK_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Gateway_MQB
+
+BO_ 1313 STH_01: 8 Gateway_MQB
+ SG_ STH_Funk_ein : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Funk_aus : 1|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Zusatzheizung : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_LED : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_Pumpe_ein : 4|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Geblaese : 5|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_EKP_Anst : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_Start_folgt : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Ventiloeffnungszeit : 8|6@1+ (1,0) [0|63] "Unit_Minut" Vector__XXX
+ SG_ STH_Ventil_Status : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Waermeeintrag : 16|6@1+ (1,0) [0|63] "" Vector__XXX
+ SG_ STH_KVS : 24|13@1+ (1,0) [0|8191] "Unit_MilliLiter" Vector__XXX
+ SG_ STH_Fehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ STH_Heizleistung : 40|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ STH_Wassertemp : 48|8@1+ (0.75,-40) [-40|142.25] "Unit_DegreCelsi" Vector__XXX
+ SG_ STH_Motorvorwaermung : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_Servicemode : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_war_aktiv : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_KVS_Ueberlauf : 62|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1172 STS_01: 8 Gateway_MQB
+ SG_ STS_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STS_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STS_Car_not_under_theft : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Car_under_theft : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Anlassersperre : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Typencodierung : 16|5@1+ (1,0) [0|31] "" Vector__XXX
+ SG_ STS_LIN_aktiv : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Standlicht : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Fahrlicht : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Alarm_still : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Texte : 27|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ STS_Laderelais : 38|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Summer : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Alarm_Blinker : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Notstart : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Signalhorn : 55|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Leerlaufschaltung : 56|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 1413 Systeminfo_01: 8 Gateway_MQB
+ SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" Vector__XXX
+ SG_ SI_Rollenmode : 6|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" SAK_MQB
+ SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" SAK_MQB
+ SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 288 TSK_06: 8 Motor_Diesel_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Radbremsmom : 12|12@1+ (8,0) [0|32760] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Status : 24|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_v_Begrenzung_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Standby_Anf_ESP : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ TSK_Freig_WU : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ TSK_Freig_Verzoeg_Anf : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Limiter_ausgewaehlt : 31|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Wunsch_Uebersetz : 32|10@1+ (0.0245,0) [0.0245|25.0635] "" Gateway_MQB
+ SG_ TSK_Hauptschalter_GRA_ACC : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB
+ SG_ TSK_SRBM_Anf_ASIL : 44|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB
+ SG_ TSK_ax_Getriebe_02 : 48|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Zwangszusch_ESP : 57|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ TSK_zul_Regelabw : 58|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 798 TSK_07: 8 Motor_Diesel_MQB
+ SG_ TSK_07_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_AQ
+ SG_ TSK_07_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_AQ
+ SG_ TSK_Wunschgeschw : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Gateway_MQB,Getriebe_AQ
+ SG_ TSK_Texte : 40|5@1+ (1.0,0.0) [0.0|31] "" Gateway_MQB
+ SG_ TSK_Akustik : 45|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB
+ SG_ TSK_Texte_Primaeranz : 48|5@1+ (1.0,0.0) [0.0|31] "" Gateway_MQB
+ SG_ TSK_Limiter_Fahrerinfo : 53|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB
+ SG_ TSK_Limiter_Anzeige : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ TSK_Fahrzeugstatus_GRA : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ TSK_Fahrzeugstatus_Limiter : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ MO_Motorlaufwarnung : 58|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB
+ SG_ TSK_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB
+
+BO_ 346 TSK_08: 8 Motor_Diesel_MQB
+ SG_ TSK_08_CRC : 0|8@1+ (1,0) [0|255] "" Frontradar
+ SG_ TSK_08_BZ : 8|4@1+ (1,0) [0|15] "" Frontradar
+ SG_ MO_Anforderung_HMS : 12|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ TSK_Status_EA : 32|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ TSK_vMax_Fahrerassistenz : 40|9@1+ (1,0) [0|510] "" Frontradar
+ SG_ TSK_Einheit_vMax_Fahrerassistenz : 49|1@1+ (1,0) [0|1] "" Frontradar
+ SG_ TSK_Status_PLA : 50|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ TSK_aktives_System : 53|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ TSK_erhoehter_Fahrwiderstand : 56|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ TSK_Anf_Antriebsmoment : 57|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ TSK_Status_ARA : 58|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ TSK_Status_IPA : 61|3@1+ (1,0) [0|7] "" Vector__XXX
+
+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_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB
+ SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB
+
+BO_ 175 Waehlhebel_03: 4 Waehlhebel_MQB
+ SG_ WH_Status_Sperre : 0|3@1+ (1,0) [0|7] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Initialisierung : 3|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_SensorPos_roh : 4|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_03_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_SensorPos_roh_inv : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Testergebnis : 16|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Test_Aktiv : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Status : 25|7@1+ (1,0) [0|127] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 916 WBA_03: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Gateway_MQB
+
+BO_ 1602 WIV_01: 8 Motor_Diesel_MQB
+ SG_ WIV_Verschleissindex : 0|16@1+ (2e-8,0) [0|0.00131068] "" Gateway_MQB
+ SG_ WIV_Russindex : 16|16@1+ (2e-8,0) [0|0.00131068] "" Gateway_MQB
+ SG_ WIV_t_min : 32|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB
+ SG_ WIV_t_max : 40|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB
+ SG_ WIV_W_min : 48|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB
+ SG_ WIV_W_max : 56|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB
+
+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) [15|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_Sendestatus : 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_Status_HCA : 32|4@1+ (1,0) [0|15] "" 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_ 810 LH_EPS_01: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPS_SpannungsAnf : 12|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ EPS_Endanschlag : 14|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ EPS_Akustiksignal : 16|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ EPS_Fehlerlampe : 17|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ EPS_Warnungen : 19|3@1+ (1.0,0.0) [0.0|7] "" XXX
+ SG_ EPS_PLA_Fehler : 26|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPS_Charisma_FahrPr : 34|4@1+ (1.0,0.0) [0.0|15] "" XXX
+ SG_ EPS_Charisma_Status : 38|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ EPS_Lenkerposition : 41|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ EPS_Anf_KL : 43|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ EPS_ARA_Status : 44|4@1+ (1.0,0.0) [0.0|15] "" 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_AWA_Status : 36|4@1+ (1,0) [0|14] "" 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_ 286 ESP_08: 8 Gateway_MQB
+ SG_ ESP_08_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ ESP_08_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ESP_ANB_CM_Rueckk_Umsetz : 12|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Konsistenz_ACC_Botschaft : 13|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Stillstandsphase_erschoepft : 14|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_ZT_Rueckk_Umsetz : 15|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Tuerkontakt_Fahrertuer : 16|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Abrutschen_Stillstand : 18|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_Fahrer_tritt_ZBR_Schw : 19|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_QBit_v_ref : 41|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ ESP_v_ref_Fahrtrichtung : 42|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ ESC_Bremsdruckgradient : 44|8@1+ (10,0) [0|2500] "Unit_BarPerSecon" XXX
+ SG_ ESP_v_ref : 52|12@1+ (0.125,0) [0.000|511.500] "Unit_KiloMeterPerHour" XXX
+
+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_ 780 ACC_02: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Wunschgeschw_02 : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_Status_Prim_Anz : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Abstandsindex : 24|10@1+ (1,0) [1|1021] "" XXX
+ SG_ ACC_Akustik_02 : 34|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Warnung_Verkehrszeichen_1 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Gesetzte_Zeitluecke : 37|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Optischer_Fahrerhinweis : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Typ_Tachokranz : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Anzeige_Zeitluecke : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Tachokranz : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Display_Prio : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Relevantes_Objekt : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Texte_Primaeranz : 48|7@1+ (1,0) [0|127] "" XXX
+ SG_ ACC_Wunschgeschw_erreicht : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Typ_Tachokranz_unten : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 302 ACC_07: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Anhalteweg : 12|11@1+ (0.01,0) [0|20.45] "Unit_Meter" XXX
+ SG_ ACC_Anhalten : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Boost_Anf : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Freilauf_Anf : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Freilauf_Info : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Anforderung_HMS : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Anfahren : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Folgebeschl : 32|8@1+ (0.03,-4.6) [-4.6|2.99] "Unit_MeterPerSeconSquar" XXX
+ SG_ ACC_Sollbeschleunigung_02 : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX
+
+BO_ 264 Fahrwerk_01: 8 XXX
+ SG_ Fahrwerk_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fahrwerk_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 695 RCTA_01: 8 XXX
+ SG_ RCTA_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ RCTA_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 783 SWA_01: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SWA_Anzeigen : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ SWA_Blindheit_erkannt : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_rel_Nichtverf : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_rel_Fehler : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Sta_aktiv : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Sta_passiv : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_FT_RueckLED : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ ASW_Status : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ SWA_Standziele_li : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Kolonne_li : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Warnung_SWA_li : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ ASW_Warnung_FS : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ ASW_Warnung_BFS : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ ASW_Kombitexte : 30|3@1+ (1,0) [0|7] "" XXX
+ SG_ SWA_Kolonne_mi : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Standziele_re : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Kolonne_re : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Warnung_SWA_re : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ HRE_Anzeigetexte : 44|4@1+ (1,0) [0|15] "" XXX
+ SG_ SWA_Gischtzaehler : 48|7@1+ (1,0) [0|100] "Unit_PerCent" XXX
+ SG_ Heckradar_Kombitexte : 56|5@1+ (1,0) [0|31] "" XXX
+ SG_ RCTA_Kombitexte : 61|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 804 ACC_04: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Texte_Sekundaeranz : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Texte_Zusatzanz : 16|6@1+ (1,0) [0|63] "" XXX
+ SG_ ACC_Status_Zusatzanz : 22|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACC_Texte : 27|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACC_Texte_braking_guard : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Warnhinweis : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Zeitluecke_Abstandswarner : 36|6@1+ (0.1,0) [0|6] "Unit_Secon" XXX
+ SG_ ACC_Abstand_Abstandswarner : 42|9@1+ (1,0) [0|508] "" XXX
+ SG_ ACC_Tempolimit : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACC_Charisma_FahrPr : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Charisma_Status : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Texte_Abstandswarner : 62|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 917 LWR_AFS_01: 8 XXX
+
+BO_ 991 Gateway_76: 8 XXX
+
+BO_ 997 TSG_FT_02: 8 XXX
+ SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 1175 Parkhilfe_01: 8 XXX
+
+BO_ 427 ESP_33: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_AHW_aktiv : 12|3@1+ (1,0) [0|7] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_AHW_nicht_verfuegbar : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_ANB_CM_aktiv : 16|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_ANB_CM_nicht_verfuegbar : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Warnruck_aktiv : 19|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Warnruck_nicht_verfuegbar : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Prefill_aktiv : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Prefill_nicht_verfuegbar : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_HBA_aktiv : 26|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESC_HBA_nicht_verfuegbar : 27|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESC_TSK_SRBM_Anf : 28|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_TSK_SRBM_nicht_verfuegbar : 29|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Verz_Reg_aktiv : 30|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Verz_Reg_nicht_verfuegbar : 34|1@1+ (1,0) [0|1] "" Airbag_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Verz_Reg_TB_nicht_verfuegbar : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Verz_Reg_ZB_nicht_verfuegbar : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Bremslicht_unplausibel : 37|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Konsistenz_ACC : 38|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_AWV : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_ARA : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_IPA : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_FCW : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_NV : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_RCTA : 44|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_TSK : 45|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Konsistenz_vFGS : 46|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_STA : 47|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Fahrer_Bremsdruck_bestimmend : 48|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Konsistenz_EA : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_BFF : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_MKB : 51|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESC_Verz_ASIL_Verfuegbarkeit : 52|3@1+ (1,0) [0|7] "" Airbag_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESC_Pumpenanlauf_aktiv : 55|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_AGW : 56|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_KAS : 57|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_PCF : 58|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_FAS_VK : 59|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Verz_Begrenzung : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESC_Konsistenz_AWA : 61|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 418 ESP_15: 8 XXX
+ SG_ ESP_15_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ ESP_15_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 1122 PSD_04: 8 XXX
+ SG_ PSD_Object_Index : 0|6@1+ (1,0) [0|63] "" XXX
+
+BO_ 1123 PSD_05: 8 XXX
+ SG_ PSD_Current_Route_Index : 0|6@1+ (1,0) [0|63] "" XXX
+ SG_ Route_Distance_Remaining : 8|5@1+ (1,0) [0|31] "" 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
+
+BO_ 981 Licht_Anf_01: 8 Vector__XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ BCM1_Kurvenlicht_links_Anf : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Kurvenlicht_rechts_Anf : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Standlicht_Anf : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Abblendlicht_Anf : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Fernlicht_Anf : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Nebellicht_Anf : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Parklicht_li_Anf : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Parklicht_re_Anf : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Nebelschluss_Ahg_Anf : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Nebelschluss_Fzg_Anf : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Schlusslicht_Anf : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Rueckfahrlicht_Anf : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Signaturlicht_Anf : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Umfeldleuchten_Anf : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Tagfahrlicht_Anf : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Regenlicht_Anf : 27|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Autobahnlicht_Anf : 28|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Touristen_Licht_Anf : 29|1@1+ (1,0) [0|1] "" Frontradar
+ SG_ BCM1_CH_aktiv : 30|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_LH_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Gleitende_Leuchtw_Anf : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_GLW_Fernlicht_Anf : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Adaptive_Lichtvert_Anf : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_CH_LH_aktiv : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Allwetterlicht_Anf : 41|1@1+ (1,0) [0|1] "" Frontradar
+
+BO_ 1440 RLS_01: 8 XXX
+
+BO_ 870 Blinkmodi_02: 8 XXX
+ SG_ Hazard_Switch : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ Comfort_Signal_Left : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ Comfort_Signal_Right : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Turn_Exterior_Bulb_1 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Turn_Exterior_Bulb_1 : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Turn_Exterior_Bulb_2 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Turn_Exterior_Bulb_2 : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Fast_Send_Rate_Active : 37|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1385 HVEM_04: 8 XXX
+
+BO_ 1605 FLA_01: 8 XXX
+
+BO_ 1624 Licht_vorne_01: 8 XXX
+
+BO_ 1646 Klima_03: 8 XXX
+
+BO_ 1720 Kombi_03: 8 XXX
+ SG_ KBI_Reifenumfang : 0|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX
+ SG_ KBI_Variante_USA : 12|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ KBI_Variante : 13|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ KBI_BCmE_aktiv : 16|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ KBI_Sparhinweis_quittiert : 17|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ KBI_Tankfuellstand_Prozent : 18|7@1+ (1,0) [0|100] "Unit_PerCent" XXX
+ SG_ KBI_Nachtanken_erkannt : 25|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ KBI_Tankinhalt_hochaufl : 26|14@1+ (0.01,0) [0.00|163.81] "Unit_Liter" XXX
+ SG_ KBI_Max_Tankinhalt : 40|8@1+ (0.5,0) [0.0|126.5] "" XXX
+ SG_ KBI_Reifenumfang_Sekundaer : 48|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX
+
+BO_ 391 Motor_EV_01: 8 Motor_MQB_BEV
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ EV_Rekuperationsstufe : 12|3@1+ (1.0,0.0) [0.0|7] "" XXX
+ SG_ HV_Bordnetz_aktiv : 15|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Waehlpos : 16|3@1+ (1.0,0.0) [0.0|7] "" XXX
+ SG_ MO_Fehler_NTKreis : 19|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Fehler_Notabschaltung_Klima : 20|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ MO_KLE_FStatus : 22|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ MO_WH_Texte : 24|3@1+ (1.0,0.0) [0.0|7] "" XXX
+ SG_ MO_Drehzahl_VM : 32|16@1+ (0.25,0) [0.00|16383.00] "Unit_MinutInver" XXX
+ SG_ HV_Bordnetz_Fehler : 48|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_Tankbereitschaft_Status : 49|3@1+ (1.0,0.0) [0.0|7] "" XXX
+ SG_ MO_Tankklappensteuerung : 52|2@1+ (1.0,0.0) [0.0|3] "" XXX
+ SG_ MO_HVEM_Eskalation : 54|1@1+ (1.0,0.0) [0.0|1] "" XXX
+ SG_ MO_HVEM_MaxLeistung : 55|9@1+ (50,0) [0|25450] "Unit_Watt" XXX
+
+CM_ SG_ 134 LWI_Lenkradwinkel "Steering angle WITH variable ratio effect included";
+CM_ SG_ 159 EPS_HCA_Status "Status of Heading Control Assist feature";
+CM_ SG_ 159 EPS_Lenkmoment "Steering input by driver, torque";
+CM_ SG_ 159 EPS_VZ_Lenkmoment "Steering input by driver, direction";
+CM_ SG_ 159 EPS_Berechneter_LW "Raw steering angle, degrees";
+CM_ SG_ 159 EPS_VZ_BLW "Raw steering angle, direction";
+CM_ SG_ 173 COUNTER_DISABLED "Message not renamed to COUNTER because J533 rate-limiting makes it look like messages are being lost";
+CM_ SG_ 294 HCA_01_Vib_Freq "Frequenz der Lenkradvibration";
+CM_ SG_ 294 HCA_01_LM_Offset "Von HCA angefordertes Lenkmoment (Betrag)";
+CM_ SG_ 294 EA_ACC_Sollstatus "Status-Anforderung ACC von Emergency Alert. Statuswechsel bei Flanke. Solange Wert=1, wird EA_ACC_Wunschgeschwindigkeit übernommen. Wert=2 führt zu Zustand ¿ACC_GRA_passiv¿";
+CM_ SG_ 294 EA_Ruckprofil "Emergency Alert Anforderung an ESP, welcher Ruck verwendet werden soll. Eine Umsetzung der Ruckanforderung im ESP erfolgt nur mit gesetztem Bit 'EA_Ruckfreigabe'.";
+CM_ SG_ 294 HCA_01_Sendestatus "Gibt den Sendestatus der HCA_01 an (notwendig für IL-Unterstützung)";
+CM_ SG_ 294 HCA_01_LM_OffSign "Vorzeichen des HCA-Lenkmoments";
+CM_ SG_ 294 HCA_01_Status_HCA "Statusinformation vom HCA und Manoevrierassistent für Handshakemechanismus mit der Lenkung";
+CM_ SG_ 294 HCA_01_Vib_Amp "Momentenamplitude der Lenkradvibration";
+CM_ SG_ 294 EA_Ruckfreigabe "Emergency Alert Freigabit für die Warnruck-Anforderung an das ESP";
+CM_ SG_ 294 EA_ACC_Wunschgeschwindigkeit "Emergency Alert Anforderung neue Wunschgeschwindigkeit";
+CM_ SG_ 302 ACC_Hold_Request "Active request for ABS brake hold in ACC_Hold_Type";
+CM_ SG_ 302 ACC_Boost_Request "Hybrid engine start related";
+CM_ SG_ 302 ACC_Freewheel_Request "Active request for DSG sailing/coasting in ACC_Freewheel_Type";
+CM_ SG_ 302 ACC_Hold_Release "Request to ABS to release brake hold";
+CM_ SG_ 302 ACC_Accel_Secondary "Target acceleration of the secondary controller";
+CM_ SG_ 302 ACC_Accel_TSK "Mirror of request to TSK to implement a target acceleration";
+CM_ SG_ 870 Hazard_Switch "Four-way flashers active";
+CM_ SG_ 870 Comfort_Signal_Left "Comfort turn signal active, left";
+CM_ SG_ 870 Comfort_Signal_Right "Comfort turn signal active, right";
+CM_ SG_ 870 Left_Turn_Exterior_Bulb_1 "Probably front";
+CM_ SG_ 870 Right_Turn_Exterior_Bulb_1 "Probably front";
+CM_ SG_ 870 Left_Turn_Exterior_Bulb_2 "Probably rear";
+CM_ SG_ 870 Right_Turn_Exterior_Bulb_2 "Probably rear";
+CM_ SG_ 870 Fast_Send_Rate_Active "CAN message send rate";
+CM_ SG_ 919 LDW_DLC "Probable DLC (distance to line crossing)";
+CM_ SG_ 919 LDW_TLC "Probable TLC (time to line crossing)";
+CM_ SG_ 919 LDW_Unknown "Might be a steering pressed / driver active flag";
+CM_ SG_ 919 Alert_Message "Static table of alert messages to be invoked in the instrument cluster, some with or without beeps, 0 = no current message";
+CM_ SG_ 919 LDW_Direction "Left/right indicator for DLC and TLC";
+CM_ SG_ 919 Right_Lane_Status "Display brightness range, 0 = no lane, 3 = full brightness";
+CM_ SG_ 919 Left_Lane_Status "Display brightness range, 0 = no lane, 3 = full brightness";
+CM_ SG_ 919 Kombi_Lamp_Orange "Enables orange LDW light in instrument cluster";
+CM_ SG_ 919 Kombi_Lamp_Green "Enables green LDW light in instrument cluster";
+CM_ SG_ 780 Folgefahrt "Following another vehicle";
+CM_ SG_ 780 SetAbstand "Set following distance";
+CM_ SG_ 780 Abstand "Following distance";
+CM_ SG_ 780 SetSpeed "ACC set speed";
+CM_ SG_ 391 MO_Waehlpos "Traditional PRND plus B-mode aggressive regen, B-mode mapped to Drive";
+CM_ SG_ 679 ACC_ADAPTIVE "TSK_06.TSK_Limiter_ausgewaehlt seems to take precedence";
+CM_ SG_ 960 ZAS_Kl_15 "Indicates ignition on";
+CM_ SG_ 1720 KBI_BCmE_aktiv "Anzeige BCmE aktiv (BCmE-Screen oder Einsparhinweis in der Anzeige)";
+CM_ SG_ 1720 KBI_Max_Tankinhalt "Mitteilung des maximalen Tankinhalts an das Reichweitenmodul";
+CM_ SG_ 1720 KBI_Nachtanken_erkannt "Statusinformation Nachtankmodus";
+
+Primärachse: KBI_Reifenumfang
+Sekundärachse: KBI_Reifenumfang_Sekundaer
+";
+CM_ SG_ 1720 KBI_Sparhinweis_quittiert "angezeigter Sparhinweis ist quittiert. Signal wird nach zwei Sendebotschaften wieder auf '0' gesetzt.";
+CM_ SG_ 1720 KBI_Tankfuellstand_Prozent "Tankfüllstand in %";
+CM_ SG_ 1720 KBI_Tankinhalt_hochaufl "angezeigter Tankinhalt hochauflösend zur Restreichweitenberechnung";
+CM_ SG_ 1720 KBI_Variante "Zeigt an ob es sich um ein konventionelles Zeiger-Kombiinstrument handelt oder um eine Volldisplay-Kombiinstrument";
+CM_ SG_ 1720 KBI_Variante_USA "In diesem Signal wird die HW-Variante des Kombis ausgegeben, ACC plausibilisiert auf dieses Signal hin seine US-Codierung";
+
+
+VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 8 "preempted" ;
+VAL_ 159 EPS_AWA_Status 0 "AWA_deaktiviert" 1 "AWA_Anf_nicht_ausfuehrbar" 2 "Kom_AWA_gestoert" 3 "EPS_bzgl_AWA_funktionsbereit" 4 "AWA_Anf_abgewiesen" 5 "AWA_Momeingriff_1_aktiv" 7 "AWA_Momeingriff_2_aktiv" 8 "AWA_abgewiesen_Momentenpriorisierung" 9 "Anf_abgewiesen_Bedienueblich" 14 "Init" ;
+VAL_ 173 GE_Fahrstufe 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T" ;
+VAL_ 279 AWV_AWA_Status_EPS 0 "AWA_deactivated" 1 "AWA_request_not_executable" 2 "EPS_communication_disturbed" 3 "AWA_ready" 5 "AWA_torque_intervention_1" 7 "AWA_torque_intervention_2" ;
+VAL_ 288 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault" ;
+VAL_ 288 TSK_v_Begrenzung_aktiv 0 "inaktiv" 1 "aktiv" ;
+VAL_ 288 TSK_Standby_Anf_ESP 0 "keine_Standby_Anforderung" 1 "Standby_Anforderung" ;
+VAL_ 288 TSK_Freig_WU 0 "TSK_Uebersetzungswunsch_nicht_freigegeben" 1 "TSK_Uebersetzungswunsch_freigegeben" ;
+VAL_ 288 TSK_Freig_Verzoeg_Anf 0 "Verzoegerungsanforderung_nicht_freigegeben" 1 "Verzoegerungsanforderung_freigegeben" ;
+VAL_ 288 TSK_Limiter_ausgewaehlt 0 "kein_Limiter_ausgewaehlt" 1 "Limiter_ausgewaehlt" ;
+VAL_ 288 TSK_Wunsch_Uebersetz 0 "Init" ;
+VAL_ 288 TSK_Hauptschalter_GRA_ACC 0 "Init" 1 "Aus" 2 "Ein" 3 "Fehler" ;
+VAL_ 288 TSK_ax_Getriebe_02 511 "Neutralwert" ;
+VAL_ 288 TSK_Zwangszusch_ESP 0 "keine_ESP_ASR_Beeinflussung" 1 "ESP_ASR_Beeinflussung" ;
+VAL_ 294 EA_ACC_Sollstatus 0 "Init" 1 "ACC_aktivieren" 2 "ACC_deaktivieren" ;
+VAL_ 294 EA_Ruckprofil 0 "Init" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7" ;
+VAL_ 294 HCA_01_Sendestatus 0 "HCA_sendet_mit_1000ms" 1 "HCA_sendet_mit_20ms" ;
+VAL_ 294 HCA_01_LM_OffSign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen" ;
+VAL_ 294 HCA_01_Status_HCA 0 "deaktiviert" 1 "reserviert" 2 "reserviert" 3 "funktionsbereit" 4 "reserviert" 5 "HCA_Momenteneingriff_1" 6 "MA_Aktiv" 7 "HCA_Momenteneingriff_2" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert" ;
+VAL_ 294 EA_Ruckfreigabe 0 "keine_Freigabe" 1 "Freigabe" ;
+VAL_ 294 EA_ACC_Wunschgeschwindigkeit 1023 "Init" ;
+VAL_ 346 MO_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" ;
+VAL_ 346 TSK_Status_EA 0 "Aus" 1 "Init_oder_nicht_verbaut" 3 "Aktiv" 4 "Uebertreten" 5 "Abschaltung_laeuft" 6 "Reversibel_aus" 7 "Irreversibel_Aus" ;
+VAL_ 346 TSK_vMax_Fahrerassistenz 511 "Init_ungueltig_keine_Beschraenkung" ;
+VAL_ 346 TSK_Einheit_vMax_Fahrerassistenz 0 "kmh" 1 "mph" ;
+VAL_ 346 TSK_Status_PLA 0 "Aus_Funktionsbereit" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "Abschaltung_laeuft" 6 "reversibel_aus" 7 "Fehler" ;
+VAL_ 346 TSK_aktives_System 0 "keine_Funktion_aktiv" 1 "GRA_ACC" 2 "ARA" 3 "Speedlimiter" 4 "IPA" 5 "PLA" 6 "PEA_Ausrollassistent" 7 "EA" ;
+VAL_ 346 TSK_erhoehter_Fahrwiderstand 0 "kein_erhoehter_Fahrwiderstand" 1 "erhoehter_Fahrwiderstand" ;
+VAL_ 346 TSK_Anf_Antriebsmoment 0 "keine_Anforderung" 1 "Anforderung_aktiv" ;
+VAL_ 346 TSK_Status_ARA 0 "Aus" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "abschaltung_laeuft" 6 "reversibel_aus" 7 "Fehler" ;
+VAL_ 346 TSK_Status_IPA 0 "Aus_Funktionsbereit" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "Abschaltung_laueft" 6 "reversibel_aus" 7 "Fehler" ;
+VAL_ 798 TSK_Wunschgeschw 1022 "keine_Anzeige" 1023 "kein_Wert_im_Speicher" ;
+VAL_ 798 TSK_Texte 0 "kein_Text" 1 "GRA_Modus_ausgewaehlt" 2 "ACC_Modus_ausgewaehlt" 3 "Lim_Modus_ausgewaehlt" 4 "Lim_nicht_verfuegbar_ESC_passiv" 5 "GRA_nicht_verfuegbar_ESC_passiv" 6 "Lim_nicht_verfuegbar_Charisma" 7 "GRA_nicht_verfuegbar_Charisma" 8 "Lim_nicht_verfuegbar_HDC" 9 "GRA_nicht_verfuegbar_HDC" ;
+VAL_ 798 TSK_Akustik 0 "keine_Akustik" 1 "einzelner_Warnton" 2 "dauerhafter_Warnton" ;
+VAL_ 798 TSK_Texte_Primaeranz 0 "keine_Anzeige" 1 "GRA_Symbol_passiv_xxx_kmh_mph" 2 "GRA_Symbol_aktiv_xxx_kmh_mph" 3 "Bremse_ueberhitzt" 4 "Limiter_Modus_aktiviert" 5 "GRA_Modus_aktiviert" 6 "ACC_Modus_aktiviert" 7 "Opt_Geschwindigkeitswarnung" 8 "Opt_und_akustische_GeschwWarnung" 9 "Opt_GeschwWarnung_dauerhaft_mit_einmal_Akustik" 10 "Limiter_passiv_mit_Akustik" 11 "Limiter_Fehler_mit_Akustik" 12 "Limiter_Symbol_passiv_xxx_kmh_mph" 13 "Limiter_Symbol_aktiv_xxx_kmh_mph" 14 "Popup_Geschw_zu_hoch__Resume_unzulaessig" ;
+VAL_ 798 TSK_Limiter_Fahrerinfo 0 "keine_Info" 1 "Limit_erreicht" 2 "Ueberschritten" 3 "Vom_Fahrer_Ueberstimmt" ;
+VAL_ 798 TSK_Limiter_Anzeige 0 "Display_Anzeige_GRA_ACC" 1 "Display_Anzeige_Limiter" ;
+VAL_ 798 TSK_Fahrzeugstatus_GRA 0 "GRA_verfuegbar" 1 "GRA_nicht_verfuegbar" ;
+VAL_ 798 TSK_Fahrzeugstatus_Limiter 0 "Limiter_verfuegbar" 1 "Limiter_nicht_verfuegbar" ;
+VAL_ 798 MO_Motorlaufwarnung 0 "keine_Anzeige" 1 "Anforderung_Motorlaufwarnung" ;
+VAL_ 798 TSK_Status_Anzeige 0 "Hauptschalter_aus" 1 "Init" 2 "passiv" 3 "aktiv" 4 "Uebertreten" 5 "Limitiierung_aktiv" 6 "reversibel_aus" 7 "irreversibel_aus" ;
+VAL_ 780 ACC_Wunschgeschw_02 1023 "keine_Anzeige" ;
+VAL_ 780 ACC_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'gruen')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')" ;
+VAL_ 780 ACC_Abstandsindex 0 "Sonderanzeige_graue_Fahrbahn" 1022 "Sonderanzeige_graue_Fahrbahn" 1023 "Sonderanzeige_Fahrbahn_mit_gruenem_roten_Bereich" ;
+VAL_ 780 ACC_Akustik_02 0 "keine_Akustik" 1 "hochpriore_Akustik" 2 "niederpriore_Akustik" 3 "hochpriore_Dauerakustik" ;
+VAL_ 780 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung" ;
+VAL_ 780 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_ 780 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN" ;
+VAL_ 780 ACC_Typ_Tachokranz 0 "Tachokranz_lang" 1 "Tachokranz_kurz" ;
+VAL_ 780 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert" ;
+VAL_ 780 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet" ;
+VAL_ 780 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio" ;
+VAL_ 780 ACC_Relevantes_Objekt 0 "Symbol_nicht_beleuchtet" 1 "Farbe_1_typisch_gruen" 2 "Farbe_2_typisch_rot" 3 "Farbe_3_typisch_gelb" ;
+VAL_ 780 ACC_Texte_Primaeranz 0 "keine Anzeige" 1 "ACC nicht verfuegbar !" 2 "Auto_Auto_ _ _" 3 "Auto_ _Auto_ _" 4 "Auto_ _ _Auto_" 5 "Auto_ _ _ _Auto" 6 "Auto_Auto_ _ _ Gong (durchgestrichen)" 7 "Auto_ _Auto_ _ Gong (durchgestrichen)" 8 "Auto_ _ _Auto_ Gong (durchgestrichen)" 9 "Auto_ _ _ _Auto Gong (durchgestrichen)" 10 "ACC bereit" 11 "keine Abstandsregelung" 12 "ACC Sensor Sicht !" 13 "ACC nicht verfuegbar" 14 "o o o" 15 "Hochschalten" 16 "ESP Eingriff" 17 "Herunterschalten" 18 "Parkbremse !" 19 "Geschwindigkeitsgrenze" 20 "Waehlhebelposition !" 21 "VDA ACC-Symbol YYY km/h / mph" 22 "Tempolimit XXX km/h / mph" 23 "Kurve XXX km/h / mph" 24 "ACC Abschaltung" 25 "Symbol 'Eieruhr'" 26 "!" 27 "--- km/h / mph" 28 "XXX km/h / mph (Schriftart 2)" 29 "Lenkradwinkel" 30 "Anfahren bestaetigen" 31 "Fahrzeug verloren" 32 "Im Stand nicht moeglich" 33 "Ungueltiger Anfahrbefehl" 34 "Tuer offen !" 35 "Fahrer Gurtschloss offen !" 36 "Schalthebelposition !" 37 "Drehzahl !" 38 "Kurvenassistent aus" 39 "Tempolimit aus" 40 "Abbiegeassistent" 41 "Ortsanfang XXX km/h / mph" 42 "Ortsende XXX km/h / mph" 43 "Tempolimit Ende XXX km/h / mph" 44 "HDC aktiv" 45 "braking guard Bremsruck" 46 "braking guard aus" 47 "braking guard aus" 48 "Uebernehmen !" 49 "Steigung zu gross" 50 "Stehendes Objekt voraus" 51 "SET / 'GRA Symbol'___xxx km/h / mph" 52 "SET / 'GRA Symbol' xxx km/h / mph" 53 "ACC aus" 54 "ACC startet" 55 "ACC reinigen" 56 "ACC Fehler" 57 "ACC haelt an !" 58 "Bremse betaetigen !" 59 "Kupplung betaetigt" 60 "LIM AUS" 61 "LIM AKTIV" 62 "LIM PASSIV" 63 "LIM FEHLER" 64 "Bremse ueberhitzt !" 65 "Bremse haelt !" 66 "ESP PASSIV !" 67 "ACC_anfahrbereit" 68 "Gang_einlegen" 69 "Rechtsueberholen_verhindert" 70 "Linksueberholen_verhindert" 71 "Achtung_Geschwindigkeitsueberschreitung" 72 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar" ;
+VAL_ 780 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht" ;
+VAL_ 780 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus" ;
+VAL_ 780 ACC_Status_Anzeige 0 "ACC_GRA_Hauptschalter_aus" 1 "ACC_in_Init_nicht_bei_GRA" 2 "ACC_GRA_passiv" 3 "ACC_GRA_aktiv" 4 "ACC_GRA_im_Hintergrund_uebertreten" 5 "ACC_GRA_Abschaltreaktion" 6 "ACC_reversibel_aus_nicht_bei_GRA" 7 "ACC_GRA_irreversibel_aus" ;
+VAL_ 804 ACC_Texte_Sekundaeranz 0 "keine_Anzeige" 1 "Zielfahrzeug_erkannt" 2 "Rechtskurve_voraus" 3 "Linkskurve_voraus" 4 "Tempolimit_voraus" 5 "Sensorsicht" 6 "Anfahrbereit" 7 "Tempolimit_erkannt" 8 "Kreuzung_voraus" 9 "Kreisverkehr_voraus" ;
+VAL_ 804 ACC_Texte_Zusatzanz 0 "keine_Anzeige" 1 "ACC_AUS" 2 "ACC_BEREIT" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_1__dyn" 10 "DISTANZ_2__dyn" 11 "DISTANZ_3__dyn" 12 "DISTANZ_4__dyn" 13 "DISTANZ_1__stand" 14 "DISTANZ_2__stand" 15 "DISTANZ_3__stand" 16 "DISTANZ_4__stand" 17 "DISTANZ_1__comf" 18 "DISTANZ_2__comf" 19 "DISTANZ_3__comf" 20 "DISTANZ_4__comf" 21 "DISTANZ_1__efficiency" 22 "DISTANZ_2__efficiency" 23 "DISTANZ_3__efficiency" 24 "DISTANZ_4__efficiency" 25 "DISTANZ_5" 26 "DISTANZ_5__dyn" 27 "DISTANZ_5__stand" 28 "DISTANZ_5__comf" 29 "DISTANZ_5__efficiency" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanz_Warnung_aktiviert" ;
+VAL_ 804 ACC_Status_Zusatzanz 0 "keine Anzeige" 1 "Bild 1 (Fzg. Silhouette, typ. farblos)" 2 "Bild 2 (Fzg. Farbe 1, typ. grau)" 3 "Bild 3 (Fzg. Farbe 2, typ. rot)" 4 "Bild 4 (Symbol 1 ACCplus, typ. Doppelfzg. gelb)" 5 "Bild 5 (Symbol 2 ACCplus, typ. Doppelfzg. grau)" 6 "Bild 6 (Fzg. Farbe 2, typ. rot) mit Priorität im Kombi (Pop-up)" ;
+VAL_ 804 ACC_Texte 0 "keine_Anzeige" 1 "ACC_nicht_verfuegbar" 2 "ACC_und_AWV_nicht_verfuegbar" 3 "ACC_keine_Sensorsicht" 4 "ACC_und_AWV_keine_Sensorsicht" 5 "ACC_Steigung_zu_gross" 6 "ACC_nur_in_Fahrstufe_verfuegbar" 7 "ACC_Parkbremse_betaetigt" 8 "ACC_ESP_Eingriff" 9 "ACC_Bitte_uebernehmen" 10 "ACC_HDC_betaetigt" 11 "ACC_Geschwindigkeitsgrenze" 12 "ACC_Schalthebelposition" 13 "ACC_Drehzahl" 14 "ACC_Kupplung_betaetigt" 15 "ACC_Aktivierverhinderung" 16 "ACC_Abschaltung" 17 "ACC_Parkassistent_aktiv" 18 "ACC_ESC_aus" 19 "ACC_Charisma_Modus_inkompatibel" 20 "ACC_Stehendes_Objekt_voraus" 21 "ACA_Fahreruebernahme" 22 "ACA_Querfuehrung_nicht_verfuegbar" ;
+VAL_ 804 ACC_Texte_braking_guard 0 "keine_Anzeige" 1 "AWV_aus" 2 "AWV_Warnung" 3 "AWV_Demomodus" 4 "AWV_Systemstoerung" 5 "AWV_Eingriff" 6 "AWV_Vorwarnung_aus" 7 "AWV_keine_Sensorsicht" ;
+VAL_ 804 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis" ;
+VAL_ 804 ACC_Zeitluecke_Abstandswarner 61 "Freifahrt" 62 "nicht_definiert" 63 "keine_Anzeige" ;
+VAL_ 804 ACC_Abstand_Abstandswarner 509 "Freifahrt" 510 "nicht_definiert" 511 "keine_Anzeige" ;
+VAL_ 804 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_ 804 ACC_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_ 804 ACC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ;
+VAL_ 804 ACC_Texte_Abstandswarner 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "zurzeit_eingeschraenkt" ;
+VAL_ 290 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert" ;
+VAL_ 290 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert" ;
+VAL_ 290 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_ 290 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler" ;
+VAL_ 290 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren" ;
+VAL_ 290 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht" ;
+VAL_ 290 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert" ;
+VAL_ 290 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_ 290 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv" ;
+VAL_ 302 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler" ;
+VAL_ 302 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht" ;
+VAL_ 302 ACC_Freilauf_Anf 0 "keine Freilauf-Anforderung" 1 "Freilauf-Anforderung" ;
+VAL_ 302 ACC_Freilauf_Info 0 "Freilauf_freigegeben" 1 "kein_Uebergang_in_Freilauf_zulaessig" 2 "Freilauf_nicht_freigegeben" 3 "Freilauf_Anforderung" ;
+VAL_ 302 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" ;
+VAL_ 302 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren" ;
+VAL_ 302 ACC_Folgebeschl 254 "Neutralwert" ;
+VAL_ 302 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler" ;
+VAL_ 279 AWV1_Anf_Prefill 0 "Prefill_nicht_aktivieren" 1 "Prefill_aktivieren" ;
+VAL_ 279 ANB_CM_Info 0 "Standard" 1 "Erweitert" ;
+VAL_ 279 AWV2_Freigabe 0 "keine_Freigabe" 1 "Freigabe" ;
+VAL_ 279 AWV1_HBA_Param 0 "Defaultparametersatz" 1 "Parametersatz_mit_leicht_erhoehter_Empfindlichkeit" 2 "Parametersatz_mit_erhoehter_Empfindlichkeit" 3 "Parametersatz_mit_hoechster_Empfindlichkeit" ;
+VAL_ 279 AWV2_Priowarnung 0 "Anzeige_Verlassen_der_Fahrspur_wird_nicht_unterdrueckt" 1 "Anzeige_Verlassen_der_Fahrspur_wird_unterdrueckt" ;
+VAL_ 279 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv" ;
+VAL_ 279 ANB_Info_Teilbremsung 0 "Auspraegung_Standard" 1 "Auspraegung_Erweitert" ;
+VAL_ 279 ANB_Notfallblinken 0 "kein_ANB_Notfallblinken" 1 "Notfallblinken_ANB_angefordert" ;
+VAL_ 279 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben" ;
+VAL_ 279 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben" ;
+VAL_ 279 AWV_Vorstufe 0 "keine_Notbremsung_erwartet" 1 "Notbremsung_in_Kuerze" ;
+VAL_ 279 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten" ;
+VAL_ 279 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich" ;
+VAL_ 279 PCF_Freigabe 0 "keine_Freigabe_PreCrashFront" 1 "Freigabe_PreCrashFront" ;
+VAL_ 279 AWV1_ECD_Anlauf 0 "ECD_Anlauf_nicht_aktivieren" 1 "ECD_Anlauf_aktivieren" ;
+VAL_ 279 PCF_Time_to_collision 255 "Objektstatus=0x0__oder_berechneter_TTC_Wert_groesser_als_Maximalwert" ;
+VAL_ 679 ACC_Regelgeschw 1023 "keine_Anzeige" ;
+VAL_ 679 ACC_Einheit_maxSetzgeschw 0 "kmh" 1 "mph" ;
+VAL_ 679 ACC_maxSetzgeschw 511 "Init_Neutralwert" ;
+VAL_ 679 ACC_minRegelgeschw 255 "keine_Anzeige" ;
+VAL_ 679 ACC_maxRegelgeschw 255 "keine_Anzeige" ;
+VAL_ 679 ACC_Tempolimitassistent 0 "keine_Anzeige" 1 "Tempolimitassistent_aktiv" 2 "Tempolimitassistent_nicht_verfuegbar" 3 "Tempolimitassistent_Fahreruebernahme" ;
+VAL_ 679 ACC_Kurvenassistent 0 "keine_Anzeige" 1 "Kreuzung" 2 "Rechtskurve" 3 "Linkskurve" 4 "Kreisverkehr" ;
+VAL_ 679 ACC_RUV 0 "keine_Anzeige" 1 "RUV_aktiv_Rechtsverkehr" 2 "RUV_aktiv_Linksverkehr" ;
+VAL_ 679 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet" ;
+VAL_ 679 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus" ;
+VAL_ 679 ACC_ENG_Texte 0 "keine_Anzeige" 1 "keine_Laenderverfuegbarkeit" 2 "nicht_verfuegbar" 3 "Geschwindigkeitsgrenze" ;
+VAL_ 679 ACC_ADAPTIVE 1 "adaptive" 2 "non-adaptive" ;
+VAL_ 681 AWV_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung" ;
+VAL_ 681 AWV_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "nicht_definiert" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt" ;
+VAL_ 681 AWV_Status_Anzeige 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" ;
+VAL_ 681 AWV_Einstellung_System_FSG 0 "deaktiviert" 1 "aktiviert" ;
+VAL_ 681 AWV_Einstellung_Warnung_FSG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein" ;
+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" ;
+VAL_ 1720 KBI_Sparhinweis_quittiert 0 "nicht_quittiert" 1 "quittiert" ;
+VAL_ 1720 KBI_Tankfuellstand_Prozent 126 "Init" 127 "Fehler" ;
+VAL_ 1720 KBI_Nachtanken_erkannt 0 "Geberbetrieb" 1 "Nachtankmodus" ;
+VAL_ 1720 KBI_Tankinhalt_hochaufl 16382 "Init" 16383 "Fehler" ;
+VAL_ 1720 KBI_Max_Tankinhalt 254 "Init" 255 "Fehler" ;
diff --git a/iqdbc_repo/iqdbc/dbc/vw_mqbevo.dbc b/iqdbc_repo/iqdbc/dbc/vw_mqbevo.dbc
new file mode 100644
index 000000000..4b5043be5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/vw_mqbevo.dbc
@@ -0,0 +1,2309 @@
+BO_ 64 Airbag_01: 8 Airbag_MQB
+ SG_ Airbag_01_CRC : 0|8@1+ (1,0) [0|255] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB
+ SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_PAO_Leuchte_Anf : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 65 Airbag_03: 8 Airbag_MQB
+ SG_ Airbag_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ Airbag_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ AB_MKB_Safing : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 134 LWI_01: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_Lenkradwinkel : 16|13@1+ (0.1,0) [0|800] "Unit_DegreOfArc" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" Vector__XXX
+ SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX
+
+BO_ 157 Motor_Hybrid_01: 8 Motor_Hybrid_MQB
+ SG_ Motor_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB
+ SG_ Motor_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_IstStatusK0 : 12|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_max_ind_VM_Mom : 16|10@1+ (1,0) [0|1021] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Zielzustand : 26|3@1+ (1,0) [0|7] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Startmodus : 29|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ MO_HYB_Startmodus_PQ3x : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Stoppmodus : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_VM_Mom_oE : 40|10@1+ (1,-100) [-100|922] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_VM_aktiv : 50|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Schaltverhinderung : 51|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+
+BO_ 158 Getriebe_Hybrid_01: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Hybrid_MQB
+ SG_ Getriebe_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Fehlerstatus : 12|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freigabe_K0 : 16|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freigabe_LL_Reg : 17|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freig_sSchl_K0 : 18|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Freig_VM_EM_Stop : 19|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Wiederstart : 20|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_Filt_MomAufbau : 21|3@1+ (1,0) [0|7] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_nK0 : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Vector__XXX
+ SG_ GE_HYB_MomEingriff_EM : 32|6@1+ (0.5,0) [0|31.5] "Unit_NewtoMeter" LEH_MQB
+ SG_ GE_HYB_VZ_MomEingriff_EM : 38|1@1+ (1,0) [0|1] "" LEH_MQB
+ SG_ GE_HYB_Sportfaktor : 56|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_VM_akt_halten : 61|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_StartAnf : 62|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+ SG_ GE_HYB_VM_Startkontr : 63|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB
+
+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 Getriebe_DQ_Hybrid_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTERXX : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Fahrstufe : 42|5@1+ (1,0) [0|31] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Schaltvorgang : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Status_Kupplung : 54|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 174 Getriebe_12: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_12_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ Getriebe_12_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Drehzahlmesser_Daempfung : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Schubabschalt_Unt : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freigabe_Synchro : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Synchro_Wunschdrehz : 15|9@1+ (25,0) [0|12750] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Synchro_Zeit : 24|8@1+ (20,0) [0|5080] "Unit_MilliSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Mom_Begr_Gradient : 32|8@1+ (10,0) [0|2540] "Unit_NewtoMeterPerSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Anheb_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Aufnahmemoment : 48|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Anf_Zylabsch : 58|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ GE_HYB_DZ_Eingriff : 62|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB
+
+BO_ 175 Waehlhebel_03: 4 Waehlhebel_MQB
+ SG_ WH_Status_Sperre : 0|3@1+ (1,0) [0|7] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Initialisierung : 3|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_SensorPos_roh : 4|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_03_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_SensorPos_roh_inv : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Testergebnis : 16|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Test_Aktiv : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WH_Status : 25|7@1+ (1,0) [0|127] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 178 ESP_19: 8 Gateway_MQB
+ SG_ ESP_HL_Radgeschw_02 : 0|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_HR_Radgeschw_02 : 16|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_VL_Radgeschw_02 : 32|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_VR_Radgeschw_02 : 48|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+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_ Unknown_01 : 12|3@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_63 : 18|6@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_1_2 : 24|1@0+ (1,0) [0|1] "" XXX
+ SG_ Unknown_02 : 25|2@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_30 : 27|5@1+ (1,0) [0|15] "" XXX
+ SG_ SET_ME_127 : 33|7@1+ (1,0) [0|127] "" XXX
+ SG_ Unknown_03 : 40|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_127_2 : 41|7@1+ (1,0) [0|127] "" XXX
+ SG_ Pre_FCW : 64|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_63_2 : 66|6@1+ (1,0) [0|63] "" XXX
+ SG_ SET_ME_15_1 : 72|4@1+ (1,0) [0|15] "" XXX
+ SG_ FCW_Active : 76|1@0+ (1,0) [0|1] "" XXX
+ SG_ SET_ME_255 : 80|8@1+ (1,0) [0|255] "" XXX
+ SG_ SET_ME_1023 : 94|10@1+ (1,0) [0|3] "" XXX
+ SG_ SET_ME_1 : 129|1@0+ (1,0) [0|1] "" 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_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" 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_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" 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_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" 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
+ SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX
+ SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" XXX
+
+BO_ 253 ESP_21: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0|655.32] "Unit_KiloMeterPerHour" 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_ ASR_Tastung_passiv : 48|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Tastung_passiv : 49|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Systemstatus : 50|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ASR_Schalteingriff : 51|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_Haltebestaetigung : 53|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_v_Signal : 55|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ABS_Bremsung : 56|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ASR_Anf : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ MSR_Anf : 58|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EBV_Eingriff : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EDS_Eingriff : 60|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Eingriff : 61|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_ASP : 62|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Anhaltevorgang_ACC_aktiv : 63|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 257 ESP_02: 8 Gateway_MQB
+ SG_ ESP_02_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_02_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Gierrate : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_QBit_Laengsbeschl : 13|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Querb : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Stillstandsflag : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Querbeschleunigung : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Laengsbeschl : 24|10@1+ (0.03125,-16) [-16|15.90625] "Unit_MeterPerSeconSquar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Verteil_Wankmom : 34|5@1+ (0.1,-1) [-1|1] "" Vector__XXX
+ SG_ ESP_QBit_Anf_Vert_Wank : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Gierrate : 40|14@1+ (0.01,0) [0|163.82] "Unit_DegreOfArcPerSecon" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_VZ_Gierrate : 54|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_Notbremsanzeige : 55|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESP_SpannungsAnf : 56|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_PLA_Abbruch : 57|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ ESP_Status_ESP_PLA : 60|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+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_ Brake_Power : 80|8@1+ (1,-100) [0|255] "" XXX
+ SG_ Brake_01 : 90|1@0+ (1,0) [0|1] "" XXX
+ SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX
+ SG_ Brake_02 : 125|1@0+ (1,0) [0|1] "" XXX
+ SG_ Standstill : 171|1@0+ (1,0) [0|1] "" XXX
+ SG_ NEW_SIGNAL_3 : 180|1@0+ (1,0) [0|1] "" XXX
+ SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX
+ SG_ Brake_Power_02 : 226|8@1+ (1,-100) [0|63] "" XXX
+ SG_ NEW_SIGNAL_2 : 236|9@1+ (1,0) [0|7] "" XXX
+ SG_ NEW_SIGNAL_1 : 248|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPB_Status : 317|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 260 EPB_01: 8 Gateway_MQB
+ SG_ EPB_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_01_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_QBit_Laengsbeschleunigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_QBit_Pedalweg_Kuppl : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_BCM2_Motor_Wakeup : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_Freig_Verzoeg_Anf : 15|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_Verzoeg_Anf : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" Vector__XXX
+ SG_ EPB_Laengsbeschleunigung : 24|8@1+ (1,-128) [-128|126] "Unit_PerCentOfForceOfGravi" Vector__XXX
+ SG_ EPB_Pedalweg_Kuppl : 32|8@1+ (0.4,0) [8|92] "Unit_PerCent" Vector__XXX
+ SG_ EPB_Anfahrwunsch_erkannt : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_DAA_Randbed_erf : 49|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ EPB_Fehlerstatus : 50|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EPB_Schalterposition : 52|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_QBit_Schalterpos : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ EPB_Konsistenz_ACC : 55|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EPB_Spannkraft : 56|5@1+ (1,0) [0|29] "Unit_KiloNewto" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ EPB_Status : 61|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+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_ 262 ESP_05: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Bremsdruck : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_QBit_Fahrer_bremst : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Schwelle_Unterdruck : 14|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Bremsdruck : 16|10@1+ (0.3,-30) [-30|276.6] "Unit_Bar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Fahrer_bremst : 26|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Verz_TSK_aktiv : 27|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Lenkeingriff_ADS : 28|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Konsistenz_TSK : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Bremsruck_AWV2 : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Konsistenz_AWV2 : 31|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ECD_Fehler : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ECD_nicht_verfuegbar : 33|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Status_Bremsentemp : 34|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Autohold_Standby : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_HDC_Standby : 36|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_HBA_aktiv : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Prefill_ausgeloest : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Rueckwaertsfahrt_erkannt : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Status_Anfahrhilfe : 40|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_HDC_aktiv : 41|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_StartStopp_Info : 42|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ ESP_Eingr_HL : 44|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Eingr_HR : 45|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Eingr_VL : 46|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Eingr_VR : 47|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_BKV_Unterdruck : 48|8@1+ (4,0) [0|1012] "Unit_MilliBar" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Autohold_aktiv : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_FStatus_Anfahrhilfe : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ ESP_Verz_EPB_aktiv : 58|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ECD_Bremslicht : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Verzoeg_EPB_verf : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Status_Bremsdruck : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Anforderung_EPB : 62|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 263 Motor_04: 8 Motor_Diesel_MQB
+ SG_ MO_Istgang : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_Sollgang : 12|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_Oeldruck : 16|8@1+ (0.04,0) [0|10] "Unit_Bar" Gateway_MQB
+ SG_ MO_Anzeigedrehz : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" Gateway_MQB
+ SG_ MO_Schaltempf_verfbar : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Ladedruck : 39|9@1+ (0.01,0) [0|5.1] "Unit_Bar" Gateway_MQB
+ SG_ MO_KVS : 48|15@1+ (1,0) [0|32767] "Unit_MicroLiter" Gateway_MQB
+ SG_ MO_KVS_Ueberlauf : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 264 Fahrwerk_01: 8 XXX
+ SG_ Fahrwerk_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ Fahrwerk_01_BZ : 8|4@1+ (1,0) [0|15] "" 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_ 279 ACC_10: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ AWV1_Anf_Prefill : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_CM_Info : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV2_Freigabe : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV1_HBA_Param : 19|2@1+ (1,0) [0|3] "" XXX
+ SG_ AWV2_Ruckprofil : 21|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV2_Priowarnung : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_CM_Anforderung : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Info_Teilbremsung : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Notfallblinken : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Teilbremsung_Freigabe : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ ANB_Zielbrems_Teilbrems_Verz_Anf : 29|10@1+ (0.024,-20.016) [-20.016|4.536] "Unit_MeterPerSeconSquar" XXX
+ SG_ ANB_Zielbremsung_Freigabe : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Vorstufe : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Halten : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_CityANB_Auspraegung : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ PCF_Freigabe : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV1_ECD_Anlauf : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_AWA_VZ_Anf_Lenkmomoffset : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_AWA_Anf_Lenkmomoffset : 47|9@1+ (0.01,0) [0|5.11] "Unit_NewtoMeter" XXX
+ SG_ PCF_Time_to_collision : 56|8@1+ (0.01,0) [0|2.5] "Unit_Secon" XXX
+
+BO_ 286 VehicleSpeed: 8 XXX
+ SG_ VehicleSpeed_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ VehicleSpeed_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Speed : 52|12@1+ (0.125,0) [0|1] "" XXX
+
+BO_ 288 TSK_06: 8 Motor_Diesel_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Radbremsmom : 12|12@1+ (8,0) [0|32760] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Status : 24|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_v_Begrenzung_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Standby_Anf_ESP : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ TSK_Freig_Verzoeg_Anf : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Limiter_ausgewaehlt : 31|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_ax_Getriebe_02 : 48|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Zwangszusch_ESP : 57|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ TSK_zul_Regelabw : 58|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 289 Motor_20: 8 Motor_Diesel_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|255] "" XXX
+ SG_ MO_Fahrpedalrohwert_01 : 12|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_QBit_Fahrpedalwerte_01 : 20|1@1+ (1,0) [0|1] "" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Fahrpedalgradient : 21|8@1+ (25,0) [0|6350] "Unit_PerCentPerSecon" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Sig_Fahrpedalgradient : 29|1@1+ (1,0) [0|1] "" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_rel_Saugrohrdruck : 30|6@1+ (18,0) [0|1116] "Unit_MilliBar" Gateway_MQB
+ SG_ MO_rel_Saugrohrdruck_gem_err : 36|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Moment_im_Leerlauf : 37|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Schubabschaltung : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 290 ACC_06: 8 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
+
+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) [15|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_Sendestatus : 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_Status_HCA : 32|4@1+ (1,0) [0|15] "" 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_ 296 Getriebe_06: 3 Getriebe_DQ_Hybrid_MQB
+ SG_ GE_WH_Sperre : 0|1@1+ (1,0) [0|1] "" Waehlhebel_MQB
+ SG_ GE_Ausleuchtungsmode : 1|1@1+ (1,0) [0|1] "" Waehlhebel_MQB
+ SG_ GE_Test_Freigabe : 2|1@1+ (1,0) [0|1] "" Waehlhebel_MQB
+ SG_ GE_Ist_Fahrstufe : 4|4@1+ (1,0) [0|15] "" Waehlhebel_MQB
+ SG_ GE_Testparameter_1 : 8|8@1+ (1,0) [0|255] "" Waehlhebel_MQB
+ SG_ GE_Testparameter_2 : 16|8@1+ (1,0) [0|255] "" Waehlhebel_MQB
+
+BO_ 299 GRA_ACC_01: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Typ468 : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_Tip_Stufe_2 : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GRA_ButtonTypeInfo : 28|2@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ MAYBE_TRAVEL_ASSIST : 30|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 301 Getriebe_13: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_13_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ Getriebe_13_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_StartStopp_Info : 12|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ GE_Langfr_Schutzmom_02 : 14|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Eingangsdrehz : 48|14@1+ (1,0) [0|16381] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Notlauf : 62|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freig_Langfr_Schutzmom : 63|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 302 ACC_07: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Anhalteweg : 12|11@1+ (0.01,0) [0|20.45] "Unit_Meter" XXX
+ SG_ ACC_Anhalten : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Boost_Anf : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Freilauf_Anf : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Freilauf_Info : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Anforderung_HMS : 28|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Anfahren : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Folgebeschl : 32|8@1+ (0.03,-4.6) [-4.6|2.99] "Unit_MeterPerSeconSquar" XXX
+ SG_ ACC_Sollbeschleunigung_02 : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" 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_ FCW_Reaction_1 : 12|1@0+ (1,0) [0|1] "" 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_Reaction_2 : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX
+ SG_ FCW_Reaction_3 : 88|5@1+ (1,0) [0|31] "" 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_ HCA_No_Override : 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_ 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.4,-14.4) [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|12@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_ 387 CAMERA_NEW_3_HF: 64 XXX
+ SG_ NEW_SIGNAL_1 : 28|12@1+ (1,0) [0|15] "" XXX
+
+BO_ 391 EV_Gearshift: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ RegenBrakingMode : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ GearPosition : 16|4@1+ (1,0) [0|255] "" XXX
+
+BO_ 418 ESP_15: 8 XXX
+ SG_ ESP_15_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ ESP_15_BZ : 8|4@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_ 427 ESP_33: 8 XXX
+ SG_ ESP_33_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ ESP_33_BZ : 8|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 496 EA_02: 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_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_ 519 CAMERA_NEW_1_HF: 64 XXX
+ SG_ NEW_SIGNAL_2 : 36|11@1+ (1,0) [0|2047] "" XXX
+ SG_ NEW_SIGNAL_1 : 48|12@1+ (1,0) [0|4095] "" XXX
+
+BO_ 564 CAMERA_NEW_2_HF: 64 XXX
+
+BO_ 588 MEB_Side_Assist_01: 16 XXX
+ SG_ Blind_Spot_Passenger : 12|7@1+ (1,0) [0|15] "" XXX
+ SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX
+ SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX
+ SG_ Blind_Spot_Warn_Driver : 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 NEW_MSG_24D: 64 XXX
+ SG_ NEW_SIGNAL_1 : 24|12@1+ (1,0) [0|4095] "" 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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "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.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX
+ SG_ Same_Lane_01_Unknown_01 : 256|8@1+ (1,-128) [0|31] "" XXX
+ SG_ Same_Lane_01_Unknown_02 : 264|6@1+ (1,-15) [0|31] "" XXX
+ SG_ Same_Lane_01_Unknown_03 : 270|6@1+ (1,0) [0|127] "" XXX
+ SG_ Same_Lane_01_Unknown_04 : 277|6@1+ (1,0) [0|7] "" XXX
+ SG_ Same_Lane_01_Unknown_05 : 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_ 679 ACC_13: 8 XXX
+ SG_ ACC_Regelgeschw : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_Einheit_maxSetzgeschw : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_maxSetzgeschw : 23|9@1+ (1,0) [0|510] "" XXX
+ SG_ ACC_minRegelgeschw : 32|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_maxRegelgeschw : 40|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_Tempolimitassistent : 48|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Kurvenassistent : 52|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_RUV : 56|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Tachokranz : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Typ_Tachokranz_unten : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_ENG_Texte : 60|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 681 ACC_15: 8 XXX
+ SG_ AWV_Warnung : 16|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV_Texte : 24|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV_Status_Anzeige : 32|2@1+ (1,0) [0|3] "" XXX
+ SG_ AWV_Einstellung_System_FSG : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ AWV_Einstellung_Warnung_FSG : 36|3@1+ (1,0) [0|7] "" XXX
+ SG_ AWV_Warnlevel : 58|6@1+ (1,0) [0|63] "" 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_ 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_ ACC_Event_Wunschgeschw : 140|10@1+ (0.32,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_Position : 281|2@1+ (1,0) [0|1] "" 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_ Lead_Distance_Right : 300|10@1+ (0.2,0) [0|15] "Unit_Meter" XXX
+ SG_ Lead_Distance_Left : 310|10@1+ (0.2,0) [0|3] "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|100] "Unit_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_ 779 Kombi_01: 8 Gateway_MQB
+ SG_ KBI_ABS_Lampe : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_ESP_Lampe : 1|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_BKL_Lampe : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Airbag_Lampe : 3|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ KBI_SILA_gueltig : 4|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ KBI_Lenkung_Lampe : 5|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Vorglueh_System_Lampe : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB
+ SG_ KBI_NV_in_Anzeige : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Kombi_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Anzeigestatus_ACC : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigestatus_GRA : 13|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Oeldruck_Schalter : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Tankwarnung : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_MFA_v_Einheit_01 : 17|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_im_Stellgliedtest : 18|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ KBI_Anzeigefehler_LDW : 19|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ KBI_Variante_USA : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Oeldruckwarnung : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Handbremse : 23|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ KBI_V_Digital : 24|9@1+ (1,0) [0|511] "" Vector__XXX
+ SG_ KBI_PLA_in_Anzeige : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigefehler_NV : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigestatus_LIM : 35|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_angez_Geschw : 48|10@1+ (0.32,0) [0|325.12] "Unit_KiloMeterPerHour" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Einheit_Tacho : 58|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Konsistenz_ACC : 59|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Fehler_Anzeige_ACC : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KBI_Anzeigefehler_SWA : 61|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 780 ACC_02: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Wunschgeschw_02 : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX
+ SG_ ACC_Status_Prim_Anz : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Abstandsindex : 24|10@1+ (1,0) [1|1021] "" XXX
+ SG_ ACC_Akustik_02 : 34|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Warnung_Verkehrszeichen_1 : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Gesetzte_Zeitluecke : 37|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Optischer_Fahrerhinweis : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Typ_Tachokranz : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Anzeige_Zeitluecke : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Tachokranz : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Display_Prio : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Relevantes_Objekt : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Texte_Primaeranz : 48|7@1+ (1,0) [0|127] "" XXX
+ SG_ ACC_Wunschgeschw_erreicht : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Typ_Tachokranz_unten : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 783 SWA_01: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ SWA_Anzeigen : 12|4@1+ (1,0) [0|15] "" Kombi_D4
+ SG_ SWA_Blindheit_erkannt : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_rel_Nichtverf : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_rel_Fehler : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Sta_aktiv : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Sta_passiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Standziele_li : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Kolonne_li : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Warnung_SWA_li : 27|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Kolonne_mi : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Standziele_re : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Kolonne_re : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Warnung_SWA_re : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SWA_Gischtzaehler : 48|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX
+ SG_ SWA_KD_Fehler : 59|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 792 Kamera_Status: 8 XXX
+
+BO_ 798 TSK_07: 8 Motor_Diesel_MQB
+ SG_ TSK_07_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ TSK_07_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ TSK_Wunschgeschw : 12|10@1+ (0.32,0) [0|326.72] "Unit_KiloMeterPerHour" Gateway_MQB
+ SG_ TSK_Texte_Primaeranz : 48|5@1+ (1,0) [0|31] "" Gateway_MQB
+ SG_ TSK_Limiter_Anzeige : 55|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ TSK_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" Gateway_MQB
+
+BO_ 804 ACC_04: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Texte_Sekundaeranz : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Texte_Zusatzanz : 16|6@1+ (1,0) [0|63] "" XXX
+ SG_ ACC_Status_Zusatzanz : 22|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACC_Texte : 27|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACC_Texte_braking_guard : 32|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACC_Warnhinweis : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACC_Zeitluecke_Abstandswarner : 36|6@1+ (0.1,0) [0|6] "Unit_Secon" XXX
+ SG_ ACC_Abstand_Abstandswarner : 42|9@1+ (1,0) [0|508] "" XXX
+ SG_ ACC_Tempolimit : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACC_Charisma_FahrPr : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACC_Charisma_Status : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACC_Texte_Abstandswarner : 62|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 811 Motor_Hybrid_02: 8 Motor_Hybrid_MQB
+ SG_ MO_HYB_E_Faktor : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_Drehzahl_VM : 16|16@1+ (0.25,0) [0|16256] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB
+ SG_ MO_HYB_LowSpeedModus : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB
+
+BO_ 812 Motor_17: 8 Motor_Diesel_MQB
+ SG_ MO_Prio_MAX_Wunschdrehzahl : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Prio_MIN_Wunschdrehzahl : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Luftpfad_aktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ MO_v_Begrenz_Aktivierbar : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ MO_Drehzahlbeeinflussung : 16|8@1+ (0.39,0) [0|99.45] "Unit_PerCent" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_MIN_Wunschdrehzahl : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_MAX_Wunschdrehzahl : 32|9@1+ (25,0) [0|12750] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Charisma_FahrPr : 41|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_Charisma_Status : 45|2@1+ (1,0) [0|3] "" Gateway_MQB
+
+BO_ 869 BEM_05: 8 Gateway_MQB
+ SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_01_Abschaltstufen : 26|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_EMLIN_ungueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_Segel_Info : 48|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" LEH_MQB
+ SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" LEH_MQB
+
+BO_ 870 Blinkmodi_02: 8 XXX
+ SG_ Hazard_Switch : 20|1@1+ (1,0) [0|1] "" XXX
+ 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_ Left_Turn_Exterior_Bulb_1 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Turn_Exterior_Bulb_1 : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Turn_Exterior_Bulb_2 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Turn_Exterior_Bulb_2 : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Fast_Send_Rate_Active : 37|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 873 CAMERA_NEW_4: 8 XXX
+
+BO_ 901 Charisma_01: 8 Gateway_MQB
+ SG_ CHA_Ziel_FahrPr_ALR : 0|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_ESP : 4|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_FL : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Fahrer_Umschaltung : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB
+ SG_ CHA_Ziel_FahrPr_MO : 16|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ CHA_Ziel_FahrPr_GE : 20|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ CHA_Ziel_FahrPr_ST : 24|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_SCU : 28|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_DR : 32|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_QS : 36|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_AFS : 40|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_RGS : 44|4@1+ (1,0) [0|15] "" Airbag_MQB
+ SG_ CHA_Ziel_FahrPr_EPS : 48|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_ACC : 52|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ CHA_Ziel_FahrPr_SAK : 56|4@1+ (1,0) [0|15] "" SAK_MQB
+ SG_ CHA_Ziel_FahrPr_MStSt : 60|4@1+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 913 OBD_01: 8 Motor_Diesel_MQB
+ SG_ OBD_Calc_Load_Val : 0|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Eng_Cool_Temp : 8|8@1+ (1,-40) [-40|215] "Unit_DegreCelsi" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Abs_Throttle_Pos : 16|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Abs_Load_Val : 24|16@1+ (0.39215686275,0) [0|25700] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Abs_Pedal_Pos : 40|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Kaltstart_Denominator : 59|1@1+ (1,0) [0|1] "" BMS_MQB,LEH_MQB
+ SG_ OBD_Minimum_Trip : 60|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Driving_Cycle : 61|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Warm_Up_Cycle : 62|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+ SG_ OBD_Normed_Trip : 63|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB
+
+BO_ 914 ESP_07: 8 Gateway_MQB
+ SG_ ESP_07_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_07_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_ACC_LDE : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Quattro_Antrieb : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Codierung_ADS : 14|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ ESP_RTA_HL : 16|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ ESP_RTA_HR : 24|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ ESP_RTA_VR : 32|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX
+ SG_ OBD_Fehler_Radsensor_HL : 40|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_Fehler_Radsensor_HR : 44|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_Fehler_Radsensor_VL : 48|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_Fehler_Radsensor_VR : 52|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ESP_Qualifizierung_Antriebsart : 56|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_Offroad_Modus : 57|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_MKB_ausloesbar : 58|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESP_MKB_Status : 59|1@1+ (1,0) [0|1] "" Airbag_MQB
+ SG_ ESP_CM_Variante : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ESP_OBD_Status : 61|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 916 WBA_03: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Gateway_MQB
+
+BO_ 917 LWR_AFS_01: 8 XXX
+
+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_ 945 DC_Hybrid_01: 8 LEH_MQB
+ SG_ DC_HYB_iAktLV : 12|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB
+ SG_ DC_HYB_iAktReserveLV : 22|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB
+ SG_ DC_HYB_uAktLV : 32|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Gateway_MQB
+ SG_ DC_HYB_LangsRegelung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Abregelung_Temperatur : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Fehler_RedLeistung : 42|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Fehler_intern : 43|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Fehler_Spannung : 44|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ DC_HYB_Auslastungsgrad : 56|8@1+ (0.4,0) [0|100] "Unit_PerCent" Gateway_MQB
+
+BO_ 949 Klima_11: 8 Gateway_MQB
+ SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Zonen : 4|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Comp_rev_rq : 8|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX
+ SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ KL_Comp_enable : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB
+
+BO_ 958 Motor_14: 8 Motor_Diesel_MQB
+ 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] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" Gateway_MQB,LEH_MQB
+ SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB
+ SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Timeout_ESP : 32|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Status_Zylabschalt_01 : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 960 Klemmen_Status_01: 4 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZAS_Kl_50 : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 967 Motor_26: 8 Motor_Diesel_MQB
+ SG_ MO_HYB_Status_HV_Ladung : 8|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Gateway_MQB
+ SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_1 : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_2 : 29|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_3 : 30|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_4 : 31|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_HYB_Text_5 : 36|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_6 : 37|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_HYB_Text_7 : 38|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Gateway_MQB
+ SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Winterfahrprog : 52|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 968 Getriebe_14: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ GE_OBD_AbsperrVent : 12|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_amax_moeglich : 16|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Charisma_FahrPr : 25|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ GE_Charisma_Status : 29|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ GE_Verlustmoment : 32|8@1+ (1,0) [0|254] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Freigabe_Verfallsinfo_WFS : 49|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ GE_Codierung_MSG : 50|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ GE_LaunchControl : 51|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ GE_Heizwunsch : 52|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_OBD_Status : 54|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_LFR_Adaption : 55|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ GE_Sumpftemperatur : 56|8@1+ (1,-58) [-58|196] "Unit_DegreCelsi" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+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 XXX
+
+BO_ 982 Licht_hinten_01: 8 Gateway_MQB
+ SG_ Licht_hinten_01_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 984 RGS_VL_01: 8 Airbag_MQB
+ SG_ RGS_VL_Texte : 12|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ RGS_VL_Charisma_FahrPr : 14|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ RGS_VL_Charisma_Status : 18|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ RGS_VL_aktiv : 21|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Sitz : 25|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Schiebedach : 26|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Fenster : 27|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_PC_Aktuator_Warnblinken : 28|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ RGS_VL_Precrash_Basis : 32|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ RGS_VL_Precrash_Front : 40|8@1+ (1,0) [0|255] "" Gateway_MQB
+ SG_ RGS_VL_Precrash_Rear : 48|8@1+ (1,0) [0|255] "" Gateway_MQB
+
+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_ 989 Gateway_74: 8 Gateway_MQB
+ SG_ LH_EPS_01_alt : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB
+ SG_ Kessy_04_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ LIN_2_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MFG_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ GW_74_va_14 : 4|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Klima_02_alt : 5|1@1+ (1,0) [0|1] "" BMS_MQB
+ SG_ Parkhilfe_01_alt : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ ELV_01_alt : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KY_StartStopp_Info : 16|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ PH_StartStopp_Info : 18|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ EPS_Lenkerposition : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB
+ SG_ ELV_Anf_Klemme_50 : 22|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ MF_StartStopp_Info : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ KL_Geblaesespannung_Soll : 40|8@1+ (0.05,0.5) [2|13] "Unit_Volt" BMS_MQB
+ SG_ KL_Umluftklappe_Status : 48|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ MFL_Tip_Down : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MFL_Tip_Up : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ LS_Tiptronic_Fehler : 58|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 991 Gateway_76: 8 XXX
+
+BO_ 997 TSG_FT_02: 8 XXX
+ SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" 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_ 1172 STS_01: 8 Gateway_MQB
+ SG_ STS_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STS_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STS_Car_not_under_theft : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Car_under_theft : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Anlassersperre : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Typencodierung : 16|5@1+ (1,0) [0|31] "" Vector__XXX
+ SG_ STS_LIN_aktiv : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Standlicht : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Fahrlicht : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Alarm_still : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Texte : 27|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ STS_Laderelais : 38|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Summer : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Alarm_Blinker : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Notstart : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Signalhorn : 55|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STS_Leerlaufschaltung : 56|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 1175 Parkhilfe_01: 8 XXX
+
+BO_ 1312 Airbag_02: 8 Airbag_MQB
+ SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" Gateway_MQB
+
+BO_ 1313 STH_01: 8 Gateway_MQB
+ SG_ STH_Funk_ein : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Funk_aus : 1|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Zusatzheizung : 2|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_LED : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_Pumpe_ein : 4|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Geblaese : 5|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_EKP_Anst : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_Start_folgt : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Ventiloeffnungszeit : 8|6@1+ (1,0) [0|63] "Unit_Minut" Vector__XXX
+ SG_ STH_Ventil_Status : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_Waermeeintrag : 16|6@1+ (1,0) [0|63] "" Vector__XXX
+ SG_ STH_KVS : 24|13@1+ (1,0) [0|8191] "Unit_MilliLiter" Vector__XXX
+ SG_ STH_Fehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ STH_Heizleistung : 40|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ STH_Wassertemp : 48|8@1+ (0.75,-40) [-40|142.25] "Unit_DegreCelsi" Vector__XXX
+ SG_ STH_Motorvorwaermung : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_Servicemode : 60|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_war_aktiv : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ STH_KVS_Ueberlauf : 62|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ STH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1385 HVEM_04: 8 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_MQB
+ SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" Vector__XXX
+ SG_ SI_Rollenmode : 6|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" SAK_MQB
+ SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" SAK_MQB
+ SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 1437 Remotestart_FFB: 8 Gateway_MQB
+ SG_ RSF_Tastencode_1 : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ RSF_Tastencode_2 : 8|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ RSF_Tastencode_Maske : 16|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB
+
+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_ 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_ 1528 SAK_01: 8 SAK_MQB
+ SG_ SAK_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ SAK_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Gateway_MQB
+
+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_ 1602 WIV_01: 8 Motor_Diesel_MQB
+ SG_ WIV_Verschleissindex : 0|16@1+ (2e-08,0) [0|0.00131068] "" Gateway_MQB
+ SG_ WIV_Russindex : 16|16@1+ (2e-08,0) [0|0.00131068] "" Gateway_MQB
+ SG_ WIV_t_min : 32|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB
+ SG_ WIV_t_max : 40|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB
+ SG_ WIV_W_min : 48|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB
+ SG_ WIV_W_max : 56|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB
+
+BO_ 1603 Einheiten_01: 8 Gateway_MQB
+ 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] "" Motor_Diesel_MQB
+ 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] "" Vector__XXX
+ SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ 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_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX
+
+BO_ 1605 FLA_01: 8 XXX
+
+BO_ 1607 Motor_09: 8 Motor_Diesel_MQB
+ SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-45.75|143.25] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_E85_Sensor : 8|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB
+ SG_ SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|8] "" Gateway_MQB
+ SG_ SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "" Gateway_MQB
+ SG_ SCR_Warnstufe_1 : 32|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Warnstufe_2 : 33|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Text : 34|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ SCR_Akustik : 37|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Kraftstofffilter_Wasser : 40|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Systemfehler : 41|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ SCR_Inducement_Strategie : 42|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_CO2_Faktor : 44|12@1+ (1,0) [1|4094] "Unit_GramPerLiter" Gateway_MQB
+
+BO_ 1624 Licht_vorne_01: 8 XXX
+
+BO_ 1625 Klimakomp_01: 8 Gateway_MQB
+ SG_ EKL_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EKL_Comp_SCI_com_stat : 16|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_output_stat : 18|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_main_stat : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EKL_Comp_ovld_stat : 21|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ EKL_Comp_Inv_stat : 24|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_photo_temp_stat : 30|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EKL_Comp_photo_temp : 32|8@1+ (1,0) [0|254] "Unit_DegreCelsi" Vector__XXX
+ SG_ EKL_Comp_current : 40|8@1+ (0.1,0) [0|25.4] "Unit_Amper" Motor_Hybrid_MQB
+ SG_ EKL_Comp_rev_stat : 48|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX
+
+BO_ 1626 BCM_01: 8 Gateway_MQB
+ SG_ BCM_Bremsbelag_Sensor : 12|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Bremsfluessigkeit_Sensor : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Licht_Warn : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Waschwasser_Sensor : 15|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Kuehlmittel_Sensor : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BCM1_Kl_15_HW_erkannt : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Eis_Offroad_Taste : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ ZZH_Endlage_oben : 19|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZZH_Endlage_unten : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ZZH_Endlage_unplausibel : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM2_EZS_gedrueckt : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM2_SST_gedrueckt : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Hybrid_StartStopp_Taste : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM1_Warnblink_Taster : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Valet_Parking_Taster : 26|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM_Remotestart_Betrieb : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BCM1_HSK_Taster : 28|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Heckrollo_Taster : 29|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ BCM1_Rueckfahrlicht_Schalter : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM1_MH_Schalter : 31|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB
+ SG_ BCM1_MH_WIV_Schalter : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM_Eco_Charisma_Taste : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ BCM_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM_Thermomanagement_Fehler : 36|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM_Thermomanagement_gueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ BCM1_Lichtwarn_Texte : 38|2@1+ (1,0) [0|3] "" Vector__XXX
+
+BO_ 1628 BMS_Hybrid_01: 8 BMS_MQB
+ SG_ BMS_HYB_ASV_hinten_Status : 13|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_ASV_vorne_Status : 14|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_BattFanSpd : 16|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB
+ SG_ BMS_HYB_VentilationReq : 20|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_Spuelbetrieb_Status : 21|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ BMS_HYB_Kuehlung_Anf : 22|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ BMS_HYB_Temp_vor_Verd : 24|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_HYB_Temp_nach_Verd : 32|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_Temperatur : 40|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_Temperatur_Ansaugluft : 48|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB
+ SG_ BMS_IstSpannung_HV : 56|8@1+ (1,100) [100|350] "Unit_Volt" Gateway_MQB
+
+BO_ 1629 ESP_20: 8 Gateway_MQB
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ 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_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 1630 OBD_Tankgeber_01: 8 Gateway_MQB
+ SG_ OBD_TG_F_Status_1 : 0|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_F_Status_2 : 4|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_F_Status_3 : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_F_Status_4 : 12|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_1 : 16|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_2 : 28|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_3 : 40|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ OBD_TG_Sens_Rohwert_4 : 52|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 1631 Motor_16: 8 Motor_Diesel_MQB
+ SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Gateway_MQB
+ SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Gateway_MQB
+ SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+ SG_ TSK_Steigung : 56|8@1+ (0.8,-101.6) [-101.6|101.6] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+BO_ 1633 Anhaenger_01: 8 Gateway_MQB
+ SG_ AAG_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Anhaenger_abgesteckt : 6|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_NSL_aktiv : 7|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Anhaenger_erkannt : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Blinker_H_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Blinker_HL_def : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Blinker_HR_def : 11|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Bremslicht_H_def : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ AAG_Schlusslicht_HL_def : 13|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_Schlusslicht_HR_def : 14|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_AVS_Fehler_02 : 18|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AAG_AVS_Stati : 20|4@1+ (1,0) [0|15] "" Vector__XXX
+
+BO_ 1646 Klima_03: 8 XXX
+
+BO_ 1648 Motor_18: 8 Motor_Diesel_MQB
+ SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Eis_Offroad_LED : 45|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Gateway_MQB
+ SG_ MO_E85_BS_Texte : 52|3@1+ (1,0) [0|7] "" Gateway_MQB
+ SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB
+
+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_ 1719 Kombi_02: 8 Gateway_MQB
+ SG_ KBI_Kilometerstand : 0|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Vector__XXX
+ SG_ KBI_Standzeit_02 : 20|17@1+ (1,0) [0|131068] "Unit_Secon" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Inhalt_Tank : 40|7@1+ (1,0) [0|125] "Unit_Liter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_FStatus_Tank : 47|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_QBit_Aussen_Temp_gef : 55|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ KBI_Aussen_Temp_gef : 56|8@1+ (0.5,-50) [-50|75] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+
+BO_ 1720 Kombi_03: 8 XXX
+ SG_ KBI_Reifenumfang : 0|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX
+ SG_ KBI_Variante_USA : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ KBI_Variante : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ KBI_BCmE_aktiv : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ KBI_Sparhinweis_quittiert : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ KBI_Tankfuellstand_Prozent : 18|7@1+ (1,0) [0|100] "Unit_PerCent" XXX
+ SG_ KBI_Nachtanken_erkannt : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ KBI_Tankinhalt_hochaufl : 26|14@1+ (0.01,0) [0|163.81] "Unit_Liter" XXX
+ SG_ KBI_Max_Tankinhalt : 40|8@1+ (0.5,0) [0|126.5] "" XXX
+ SG_ KBI_Reifenumfang_Sekundaer : 48|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX
+
+BO_ 316495015 MEB_VZE_01: 32 XXX
+ SG_ VZE_Anzeigemodus : 0|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_Einheit : 8|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_3 : 9|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_2 : 10|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Verkehrszeichen_1_Typ : 11|1@0+ (1,0) [0|1] "" XXX
+ SG_ VZE_Verkehrszeichen_1 : 12|7@1+ (10,0) [1|520] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_2_Typ : 19|1@0+ (1,0) [0|1] "" XXX
+ SG_ VZE_Verkehrszeichen_2 : 20|7@1+ (10,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_3_Typ : 27|1@0+ (1,0) [0|1] "" XXX
+ SG_ VZE_Verkehrszeichen_3 : 28|7@1+ (10,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_1 : 35|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_2 : 36|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Warnung_Verkehrszeichen_3 : 37|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_1 : 38|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_2 : 42|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zusatzschild_3 : 46|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Anzeigeunterdrueck_Zeichen_1 : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ VZE_Zeichen_01_KameraWied : 51|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_KameraWied : 52|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_KameraWied : 53|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Kamera : 54|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Karte : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_01_Gesetz : 56|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Kamera : 57|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Karte : 58|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_02_Gesetz : 59|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Kamera : 60|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Karte : 61|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Zeichen_03_Gesetz : 62|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Gong : 63|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3
+ SG_ VZE_Verkehrszeichen_4 : 75|8@1+ (1,0) [0|31] "" XXX
+ SG_ VZE_Verkehrszeichen_6 : 92|7@1+ (1,0) [0|7] "" XXX
+ SG_ VZE_Baustelle : 110|1@0+ (1,0) [0|1] "" XXX
+ SG_ Zeichen_Unknown : 129|4@1+ (1,0) [0|15] "" XXX
+ SG_ Zeichen_Unknown_Entfernung : 140|6@1+ (1,0) [0|15] "" XXX
+ SG_ Zusatzschild_Unknown : 147|2@1+ (1,0) [0|3] "" XXX
+ SG_ Unknown_02 : 167|4@1+ (1,0) [0|3] "" XXX
+ SG_ Unknown_01 : 207|1@0+ (1,0) [0|1] "" XXX
+
+BO_ 380196019 CAMERA_NEW_16: 16 XXX
+
+BO_ 380196036 CAMERA_NEW_18: 8 XXX
+
+BO_ 389224720 CAMERA_NEW_13: 3 XXX
+
+BO_ 389226768 CAMERA_NEW_12: 2 XXX
+
+BO_ 389241616 CAMERA_NEW_14: 5 XXX
+
+BO_ 401604687 CAMERA_NEW_9: 8 XXX
+
+BO_ 441800082 CAMERA_NEW_15: 8 XXX
+
+BO_ 441800100 CAMERA_NEW_8: 64 XXX
+
+BO_ 441800101 CAMERA_NEW_7: 64 XXX
+
+BO_ 2549088277 KN_Airbag_01: 8 Airbag_MQB
+ SG_ Airbag_01_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Airbag_01_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ AB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088284 KN_SAK: 8 SAK_MQB
+ SG_ SAK_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ SAK_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ SAK_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088374 KN_MO_01: 8 Motor_Diesel_MQB
+ SG_ Motor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Motor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ MO_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088375 KN_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ Getriebe_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Getriebe_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ GE_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088379 KN_Hybrid_01: 8 BMS_MQB
+ SG_ Hybrid_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ Hybrid_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ BMS_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2549088380 KN_EMotor_01: 8 LEH_MQB
+ SG_ EMotor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EMotor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB
+ SG_ EM_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB
+
+BO_ 2600468496 NMH_Gateway: 8 Gateway_MQB
+ SG_ NM_Gateway_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Gateway_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Gateway_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Gateway_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_ACAN_Aktivitaet : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_FCAN_Aktivitaet : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_KCAN_Aktivitaet : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_ICAN_Aktivitaet : 38|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_DiagCAN_Aktivitaet : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_ECAN_Aktivitaet : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_Energie_LIN_Aktivi000 : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_Bedien_LIN_Aktivitaet : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_EM_Aktivitaet : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_EM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_Shutdown : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_Spg_Messung : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_NL_Wakeup_Monitor : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Gateway_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468501 NMH_Airbag_01: 8 Airbag_MQB
+ SG_ NM_Airbag_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Airbag_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_Airbag_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Airbag_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Airbag_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468598 NMH_MO_01: 8 Motor_Diesel_MQB
+ SG_ NM_MO_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_MO_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_MO_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_MO_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_HV_Abschaltung : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_EKP_Vorlauf : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NM_aktiv_STH_Betrieb : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_Kuehlerluefter : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_Diagnose : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_WFS : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_EEPROM : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_NL_Sonstige : 52|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_MO_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468599 NMH_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB
+ SG_ NM_Getriebe_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Getriebe_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_Getriebe_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_v_gr_0 : 35|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Pos_Erk : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NM_aktiv_Umg_Bed : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Getriebe_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468603 NMH_Hybrid_01: 8 BMS_MQB
+ SG_ NM_Hybrid_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_Hybrid_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_Hybrid_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_NL_Luefter : 49|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_Hybrid_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+BO_ 2600468604 NMH_EMotor_01: 8 LEH_MQB
+ SG_ NM_EMotor_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB
+ SG_ NM_EMotor_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB
+ SG_ NM_EMotor_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ NM_EMotor_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX
+
+CM_ SG_ 134 LWI_Lenkradwinkel "Steering angle WITH variable ratio effect included";
+CM_ SG_ 159 EPS_Berechneter_LW "Raw steering angle, degrees";
+CM_ SG_ 159 EPS_VZ_BLW "Raw steering angle, direction";
+CM_ SG_ 159 EPS_HCA_Status "Status of Heading Control Assist feature";
+CM_ SG_ 159 EPS_Lenkmoment "Steering input by driver, torque";
+CM_ SG_ 159 EPS_VZ_Lenkmoment "Steering input by driver, direction";
+CM_ SG_ 173 COUNTERXX "Message not renamed to COUNTER because J533 rate-limiting makes it look like messages are being lost";
+CM_ SG_ 294 HCA_01_Vib_Freq "Frequenz der Lenkradvibration";
+CM_ SG_ 294 HCA_01_LM_Offset "Von HCA angefordertes Lenkmoment (Betrag)";
+CM_ SG_ 294 EA_ACC_Sollstatus "Status-Anforderung ACC von Emergency Alert. Statuswechsel bei Flanke. Solange Wert=1, wird EA_ACC_Wunschgeschwindigkeit übernommen. Wert=2 führt zu Zustand ¿ACC_GRA_passiv¿";
+CM_ SG_ 294 EA_Ruckprofil "Emergency Alert Anforderung an ESP, welcher Ruck verwendet werden soll. Eine Umsetzung der Ruckanforderung im ESP erfolgt nur mit gesetztem Bit 'EA_Ruckfreigabe'.";
+CM_ SG_ 294 HCA_01_Sendestatus "Gibt den Sendestatus der HCA_01 an (notwendig für IL-Unterstützung)";
+CM_ SG_ 294 HCA_01_LM_OffSign "Vorzeichen des HCA-Lenkmoments";
+CM_ SG_ 294 HCA_01_Status_HCA "Statusinformation vom HCA und Manoevrierassistent für Handshakemechanismus mit der Lenkung";
+CM_ SG_ 294 HCA_01_Vib_Amp "Momentenamplitude der Lenkradvibration";
+CM_ SG_ 294 EA_Ruckfreigabe "Emergency Alert Freigabit für die Warnruck-Anforderung an das ESP";
+CM_ SG_ 294 EA_ACC_Wunschgeschwindigkeit "Emergency Alert Anforderung neue Wunschgeschwindigkeit";
+CM_ SG_ 391 GearPosition "Traditional PRND plus B-mode aggressive regen, B-mode mapped to Drive";
+CM_ SG_ 919 LDW_DLC "Probable DLC (distance to line crossing)";
+CM_ SG_ 919 LDW_TLC "Probable TLC (time to line crossing)";
+CM_ SG_ 960 ZAS_Kl_15 "Indicates ignition on";
+CM_ SG_ 1720 KBI_Reifenumfang "Mittlerer Radumfang aus der K-Zahl gerechnet in Millimeter. Byte 2 Bit 5,4 reserviert, Byte 2 Bit 3..0 und Byte 1 Bit 7..0; Wertebereich 0..4096 mm";
+CM_ SG_ 1720 KBI_Variante_USA "In diesem Signal wird die HW-Variante des Kombis ausgegeben, ACC plausibilisiert auf dieses Signal hin seine US-Codierung";
+CM_ SG_ 1720 KBI_Variante "Zeigt an ob es sich um ein konventionelles Zeiger-Kombiinstrument handelt oder um eine Volldisplay-Kombiinstrument";
+CM_ SG_ 1720 KBI_BCmE_aktiv "Anzeige BCmE aktiv (BCmE-Screen oder Einsparhinweis in der Anzeige)";
+CM_ SG_ 1720 KBI_Sparhinweis_quittiert "angezeigter Sparhinweis ist quittiert. Signal wird nach zwei Sendebotschaften wieder auf '0' gesetzt.";
+CM_ SG_ 1720 KBI_Tankfuellstand_Prozent "Tankfüllstand in %";
+CM_ SG_ 1720 KBI_Nachtanken_erkannt "Statusinformation Nachtankmodus";
+CM_ SG_ 1720 KBI_Tankinhalt_hochaufl "angezeigter Tankinhalt hochauflösend zur Restreichweitenberechnung";
+CM_ SG_ 1720 KBI_Max_Tankinhalt "Mitteilung des maximalen Tankinhalts an das Reichweitenmodul";
+CM_ SG_ 1720 KBI_Reifenumfang_Sekundaer "Fahrzeuge mit unterschiedlichen Reifenumfängen Vorderachse / Hinterachse:Primärachse: KBI_Reifenumfang Sekundärachse: KBI_Reifenumfang_Sekundaer";
+
+VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active";
+VAL_ 173 GE_Fahrstufe 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T";
+VAL_ 258 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_ 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_ 279 AWV1_Anf_Prefill 0 "Prefill_nicht_aktivieren" 1 "Prefill_aktivieren";
+VAL_ 279 ANB_CM_Info 0 "Standard" 1 "Erweitert";
+VAL_ 279 AWV2_Freigabe 0 "keine_Freigabe" 1 "Freigabe";
+VAL_ 279 AWV1_HBA_Param 0 "Defaultparametersatz" 1 "Parametersatz_mit_leicht_erhoehter_Empfindlichkeit" 2 "Parametersatz_mit_erhoehter_Empfindlichkeit" 3 "Parametersatz_mit_hoechster_Empfindlichkeit";
+VAL_ 279 AWV2_Priowarnung 0 "Anzeige_Verlassen_der_Fahrspur_wird_nicht_unterdrueckt" 1 "Anzeige_Verlassen_der_Fahrspur_wird_unterdrueckt";
+VAL_ 279 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv";
+VAL_ 279 ANB_Info_Teilbremsung 0 "Auspraegung_Standard" 1 "Auspraegung_Erweitert";
+VAL_ 279 ANB_Notfallblinken 0 "kein_ANB_Notfallblinken" 1 "Notfallblinken_ANB_angefordert";
+VAL_ 279 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben";
+VAL_ 279 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben";
+VAL_ 279 AWV_Vorstufe 0 "keine_Notbremsung_erwartet" 1 "Notbremsung_in_Kuerze";
+VAL_ 279 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten";
+VAL_ 279 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich";
+VAL_ 279 PCF_Freigabe 0 "keine_Freigabe_PreCrashFront" 1 "Freigabe_PreCrashFront";
+VAL_ 279 AWV1_ECD_Anlauf 0 "ECD_Anlauf_nicht_aktivieren" 1 "ECD_Anlauf_aktivieren";
+VAL_ 279 PCF_Time_to_collision 255 "Objektstatus=0x0__oder_berechneter_TTC_Wert_groesser_als_Maximalwert";
+VAL_ 288 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault";
+VAL_ 290 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert";
+VAL_ 290 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert";
+VAL_ 290 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_ 290 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler";
+VAL_ 290 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren";
+VAL_ 290 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht";
+VAL_ 290 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert";
+VAL_ 290 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_ 290 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv";
+VAL_ 294 EA_ACC_Sollstatus 0 "Init" 1 "ACC_aktivieren" 2 "ACC_deaktivieren";
+VAL_ 294 EA_Ruckprofil 0 "Init" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7";
+VAL_ 294 HCA_01_Sendestatus 0 "HCA_sendet_mit_1000ms" 1 "HCA_sendet_mit_20ms";
+VAL_ 294 HCA_01_LM_OffSign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen";
+VAL_ 294 HCA_01_Status_HCA 0 "deaktiviert" 1 "reserviert" 2 "reserviert" 3 "funktionsbereit" 4 "reserviert" 5 "HCA_Momenteneingriff_1" 6 "MA_Aktiv" 7 "HCA_Momenteneingriff_2" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert";
+VAL_ 294 EA_Ruckfreigabe 0 "keine_Freigabe" 1 "Freigabe";
+VAL_ 294 EA_ACC_Wunschgeschwindigkeit 1023 "Init";
+VAL_ 302 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler";
+VAL_ 302 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht";
+VAL_ 302 ACC_Freilauf_Anf 0 "keine Freilauf-Anforderung" 1 "Freilauf-Anforderung";
+VAL_ 302 ACC_Freilauf_Info 0 "Freilauf_freigegeben" 1 "kein_Uebergang_in_Freilauf_zulaessig" 2 "Freilauf_nicht_freigegeben" 3 "Freilauf_Anforderung";
+VAL_ 302 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe";
+VAL_ 302 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren";
+VAL_ 302 ACC_Folgebeschl 254 "Neutralwert";
+VAL_ 302 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler";
+VAL_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected";
+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_ 391 RegenBrakingMode 0 "default" 1 "B1" 2 "B2" 3 "B3";
+VAL_ 391 GearPosition 2 "P" 3 "R" 4 "N" 5 "D" 6 "D";
+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_ 679 ACC_Regelgeschw 1023 "keine_Anzeige";
+VAL_ 679 ACC_Einheit_maxSetzgeschw 0 "kmh" 1 "mph";
+VAL_ 679 ACC_maxSetzgeschw 511 "Init_Neutralwert";
+VAL_ 679 ACC_minRegelgeschw 255 "keine_Anzeige";
+VAL_ 679 ACC_maxRegelgeschw 255 "keine_Anzeige";
+VAL_ 679 ACC_Tempolimitassistent 0 "keine_Anzeige" 1 "Tempolimitassistent_aktiv" 2 "Tempolimitassistent_nicht_verfuegbar" 3 "Tempolimitassistent_Fahreruebernahme";
+VAL_ 679 ACC_Kurvenassistent 0 "keine_Anzeige" 1 "Kreuzung" 2 "Rechtskurve" 3 "Linkskurve" 4 "Kreisverkehr";
+VAL_ 679 ACC_RUV 0 "keine_Anzeige" 1 "RUV_aktiv_Rechtsverkehr" 2 "RUV_aktiv_Linksverkehr";
+VAL_ 679 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet";
+VAL_ 679 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus";
+VAL_ 679 ACC_ENG_Texte 0 "keine_Anzeige" 1 "keine_Laenderverfuegbarkeit" 2 "nicht_verfuegbar" 3 "Geschwindigkeitsgrenze";
+VAL_ 681 AWV_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung";
+VAL_ 681 AWV_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "nicht_definiert" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt";
+VAL_ 681 AWV_Status_Anzeige 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar";
+VAL_ 681 AWV_Einstellung_System_FSG 0 "deaktiviert" 1 "aktiviert";
+VAL_ 681 AWV_Einstellung_Warnung_FSG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein";
+VAL_ 681 AWV_Warnlevel 0 "keine_Gefaehrdung" 63 "max_Gefaehrdung";
+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 ACC_Event_Wunschgeschw 1023 "None";
+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_Detected" 9 "Crossing" 4 "Speed_Limit_Ahead" 10 "Roundabout" 6 "Curve";
+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_ 780 ACC_Wunschgeschw_02 1023 "keine_Anzeige";
+VAL_ 780 ACC_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'gruen')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')";
+VAL_ 780 ACC_Abstandsindex 0 "Sonderanzeige_graue_Fahrbahn" 1022 "Sonderanzeige_graue_Fahrbahn" 1023 "Sonderanzeige_Fahrbahn_mit_gruenem_roten_Bereich";
+VAL_ 780 ACC_Akustik_02 0 "keine_Akustik" 1 "hochpriore_Akustik" 2 "niederpriore_Akustik" 3 "hochpriore_Dauerakustik";
+VAL_ 780 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung";
+VAL_ 780 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_ 780 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN";
+VAL_ 780 ACC_Typ_Tachokranz 0 "Tachokranz_lang" 1 "Tachokranz_kurz";
+VAL_ 780 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert";
+VAL_ 780 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet";
+VAL_ 780 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio";
+VAL_ 780 ACC_Relevantes_Objekt 0 "Symbol_nicht_beleuchtet" 1 "Farbe_1_typisch_gruen" 2 "Farbe_2_typisch_rot" 3 "Farbe_3_typisch_gelb";
+VAL_ 780 ACC_Texte_Primaeranz 0 "keine Anzeige" 1 "ACC nicht verfuegbar !" 2 "Auto_Auto_ _ _" 3 "Auto_ _Auto_ _" 4 "Auto_ _ _Auto_" 5 "Auto_ _ _ _Auto" 6 "Auto_Auto_ _ _ Gong (durchgestrichen)" 7 "Auto_ _Auto_ _ Gong (durchgestrichen)" 8 "Auto_ _ _Auto_ Gong (durchgestrichen)" 9 "Auto_ _ _ _Auto Gong (durchgestrichen)" 10 "ACC bereit" 11 "keine Abstandsregelung" 12 "ACC Sensor Sicht !" 13 "ACC nicht verfuegbar" 14 "o o o" 15 "Hochschalten" 16 "ESP Eingriff" 17 "Herunterschalten" 18 "Parkbremse !" 19 "Geschwindigkeitsgrenze" 20 "Waehlhebelposition !" 21 "VDA ACC-Symbol YYY km/h / mph" 22 "Tempolimit XXX km/h / mph" 23 "Kurve XXX km/h / mph" 24 "ACC Abschaltung" 25 "Symbol 'Eieruhr'" 26 "!" 27 "--- km/h / mph" 28 "XXX km/h / mph (Schriftart 2)" 29 "Lenkradwinkel" 30 "Anfahren bestaetigen" 31 "Fahrzeug verloren" 32 "Im Stand nicht moeglich" 33 "Ungueltiger Anfahrbefehl" 34 "Tuer offen !" 35 "Fahrer Gurtschloss offen !" 36 "Schalthebelposition !" 37 "Drehzahl !" 38 "Kurvenassistent aus" 39 "Tempolimit aus" 40 "Abbiegeassistent" 41 "Ortsanfang XXX km/h / mph" 42 "Ortsende XXX km/h / mph" 43 "Tempolimit Ende XXX km/h / mph" 44 "HDC aktiv" 45 "braking guard Bremsruck" 46 "braking guard aus" 47 "braking guard aus" 48 "Uebernehmen !" 49 "Steigung zu gross" 50 "Stehendes Objekt voraus" 51 "SET / 'GRA Symbol'___xxx km/h / mph" 52 "SET / 'GRA Symbol' xxx km/h / mph" 53 "ACC aus" 54 "ACC startet" 55 "ACC reinigen" 56 "ACC Fehler" 57 "ACC haelt an !" 58 "Bremse betaetigen !" 59 "Kupplung betaetigt" 60 "LIM AUS" 61 "LIM AKTIV" 62 "LIM PASSIV" 63 "LIM FEHLER" 64 "Bremse ueberhitzt !" 65 "Bremse haelt !" 66 "ESP PASSIV !" 67 "ACC_anfahrbereit" 68 "Gang_einlegen" 69 "Rechtsueberholen_verhindert" 70 "Linksueberholen_verhindert" 71 "Achtung_Geschwindigkeitsueberschreitung" 72 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar";
+VAL_ 780 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht";
+VAL_ 780 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus";
+VAL_ 780 ACC_Status_Anzeige 0 "ACC_GRA_Hauptschalter_aus" 1 "ACC_in_Init_nicht_bei_GRA" 2 "ACC_GRA_passiv" 3 "ACC_GRA_aktiv" 4 "ACC_GRA_im_Hintergrund_uebertreten" 5 "ACC_GRA_Abschaltreaktion" 6 "ACC_reversibel_aus_nicht_bei_GRA" 7 "ACC_GRA_irreversibel_aus";
+VAL_ 804 ACC_Texte_Sekundaeranz 0 "keine_Anzeige" 1 "Zielfahrzeug_erkannt" 2 "Rechtskurve_voraus" 3 "Linkskurve_voraus" 4 "Tempolimit_voraus" 5 "Sensorsicht" 6 "Anfahrbereit" 7 "Tempolimit_erkannt" 8 "Kreuzung_voraus" 9 "Kreisverkehr_voraus";
+VAL_ 804 ACC_Texte_Zusatzanz 0 "keine_Anzeige" 1 "ACC_AUS" 2 "ACC_BEREIT" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_1__dyn" 10 "DISTANZ_2__dyn" 11 "DISTANZ_3__dyn" 12 "DISTANZ_4__dyn" 13 "DISTANZ_1__stand" 14 "DISTANZ_2__stand" 15 "DISTANZ_3__stand" 16 "DISTANZ_4__stand" 17 "DISTANZ_1__comf" 18 "DISTANZ_2__comf" 19 "DISTANZ_3__comf" 20 "DISTANZ_4__comf" 21 "DISTANZ_1__efficiency" 22 "DISTANZ_2__efficiency" 23 "DISTANZ_3__efficiency" 24 "DISTANZ_4__efficiency" 25 "DISTANZ_5" 26 "DISTANZ_5__dyn" 27 "DISTANZ_5__stand" 28 "DISTANZ_5__comf" 29 "DISTANZ_5__efficiency" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanz_Warnung_aktiviert";
+VAL_ 804 ACC_Status_Zusatzanz 0 "keine Anzeige" 1 "Bild 1 (Fzg. Silhouette, typ. farblos)" 2 "Bild 2 (Fzg. Farbe 1, typ. grau)" 3 "Bild 3 (Fzg. Farbe 2, typ. rot)" 4 "Bild 4 (Symbol 1 ACCplus, typ. Doppelfzg. gelb)" 5 "Bild 5 (Symbol 2 ACCplus, typ. Doppelfzg. grau)" 6 "Bild 6 (Fzg. Farbe 2, typ. rot) mit Priorität im Kombi (Pop-up)";
+VAL_ 804 ACC_Texte 0 "keine_Anzeige" 1 "ACC_nicht_verfuegbar" 2 "ACC_und_AWV_nicht_verfuegbar" 3 "ACC_keine_Sensorsicht" 4 "ACC_und_AWV_keine_Sensorsicht" 5 "ACC_Steigung_zu_gross" 6 "ACC_nur_in_Fahrstufe_verfuegbar" 7 "ACC_Parkbremse_betaetigt" 8 "ACC_ESP_Eingriff" 9 "ACC_Bitte_uebernehmen" 10 "ACC_HDC_betaetigt" 11 "ACC_Geschwindigkeitsgrenze" 12 "ACC_Schalthebelposition" 13 "ACC_Drehzahl" 14 "ACC_Kupplung_betaetigt" 15 "ACC_Aktivierverhinderung" 16 "ACC_Abschaltung" 17 "ACC_Parkassistent_aktiv" 18 "ACC_ESC_aus" 19 "ACC_Charisma_Modus_inkompatibel" 20 "ACC_Stehendes_Objekt_voraus" 21 "ACA_Fahreruebernahme" 22 "ACA_Querfuehrung_nicht_verfuegbar";
+VAL_ 804 ACC_Texte_braking_guard 0 "keine_Anzeige" 1 "AWV_aus" 2 "AWV_Warnung" 3 "AWV_Demomodus" 4 "AWV_Systemstoerung" 5 "AWV_Eingriff" 6 "AWV_Vorwarnung_aus" 7 "AWV_keine_Sensorsicht";
+VAL_ 804 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis";
+VAL_ 804 ACC_Zeitluecke_Abstandswarner 61 "Freifahrt" 62 "nicht_definiert" 63 "keine_Anzeige";
+VAL_ 804 ACC_Abstand_Abstandswarner 509 "Freifahrt" 510 "nicht_definiert" 511 "keine_Anzeige";
+VAL_ 804 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_ 804 ACC_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_ 804 ACC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch";
+VAL_ 804 ACC_Texte_Abstandswarner 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "zurzeit_eingeschraenkt";
+VAL_ 870 BM_links 0 "inaktiv" 1 "aktiv";
+VAL_ 870 BM_rechts 0 "inaktiv" 1 "aktiv";
+VAL_ 958 MO_Fahrer_bremst 0 "kein_Bremsen" 1 "Bremse_betaetigt";
+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_ 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_ 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_ 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_ 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_ 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_ 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";
+VAL_ 1720 KBI_Sparhinweis_quittiert 0 "nicht_quittiert" 1 "quittiert";
+VAL_ 1720 KBI_Tankfuellstand_Prozent 126 "Init" 127 "Fehler";
+VAL_ 1720 KBI_Nachtanken_erkannt 0 "Geberbetrieb" 1 "Nachtankmodus";
+VAL_ 1720 KBI_Tankinhalt_hochaufl 16382 "Init" 16383 "Fehler";
+VAL_ 1720 KBI_Max_Tankinhalt 254 "Init" 255 "Fehler";
+VAL_ 316495015 VZE_Anzeigemodus 0 "EU_RDW" 1 "USA" 2 "Canada" 3 "China";
+VAL_ 316495015 VZE_Verkehrszeichen_Einheit 0 "mph" 1 "kmh";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_3 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_2 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Verkehrszeichen_1_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_1 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Verkehrszeichen_2_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_2 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Verkehrszeichen_3_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen";
+VAL_ 316495015 VZE_Verkehrszeichen_3 0 "kein_Verkehrszeichen" 520 "Unbegrenzt";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_2 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Warnung_Verkehrszeichen_3 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung";
+VAL_ 316495015 VZE_Zusatzschild_1 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Zusatzschild_2 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Zusatzschild_3 0 "keine_Zusatzschild_Initialwert_Fehlerwert";
+VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_1 0 "anzeigerelevant" 1 "nicht_anzeigerelevant";
+VAL_ 316495015 VZE_Zeichen_01_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_02_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_03_KameraWied 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_01_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_01_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_01_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_02_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_02_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_02_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_03_Kamera 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Zeichen_03_Karte 0 "inaktiv" 1 "aktiv";
+VAL_ 316495015 VZE_Zeichen_03_Gesetz 0 "nicht_erkannt" 1 "erkannt";
+VAL_ 316495015 VZE_Gong 0 "Gong_deaktiv" 1 "Gong_aktiv";
diff --git a/iqdbc_repo/iqdbc/dbc/vw_pq.dbc b/iqdbc_repo/iqdbc/dbc/vw_pq.dbc
new file mode 100644
index 000000000..15626ecf5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/dbc/vw_pq.dbc
@@ -0,0 +1,2138 @@
+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_
+ SG_MUL_VAL_
+
+BS_:
+
+BU_: XXX
+
+
+BO_ 1394 ZAS_1: 2 XXX
+ SG_ Fehlerspeichereintrag__ZAS_ : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_ZAS_1_3 : 8|7@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_ZAS_1_2 : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_15_SV : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_ZAS_1_1 : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_P__Parklichtstellung_ : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_50__Starten_ : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_X__Startvorgang_ : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_15__Z_ndung_ein_ : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Kontakt__Schl_ssel_steckt_ : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1336 Wischer_1: 2 XXX
+ SG_ Blockierung_Heckwischer_erkannt : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Wischer_1_2 : 12|3@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerspeichereintrag__Wischer_ : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Scheibenwischer_Hec : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Wascher_Heck : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Scheibenwischer_Heck_eingeschal : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Blockierung_Frontwischer_erkann : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Wischer_1_1 : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Status_Waschduesenheizung : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Parklage_Frontwischer : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Frontwischer_Schnel : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Frontwischer_Normal : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Wascher_Front : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frontwischer__eingeschaltet : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1464 WFS_1: 2 XXX
+ SG_ WFS_Textbits : 8|8@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_WFS_1_1 : 1|7@1+ (1,0) [0|0] "" XXX
+ SG_ WFS_LED : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1096 Waehlhebel_1: 4 XXX
+ SG_ Frei_Waehlhebel_1_1 : 29|3@1+ (1,0) [0|0] "" XXX
+ SG_ Test_aktiv_Flag : 28|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_Waehlhebel_1 : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ Waehlhebel_Testergebnis : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Fehler_Waehlhebel : 8|8@1+ (1,0) [0|0] "" XXX
+ SG_ Waehlhebelposition : 4|4@1+ (1,0) [0|0] "" XXX
+ SG_ Waehlhebel_Initialisierung : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Shiftlock_Position : 0|3@1+ (1,0) [0|0] "" XXX
+
+BO_ 1496 Verbauliste_1: 8 XXX
+ SG_ TV_Tuner : 63|1@1+ (1,0) [0|0] "" XXX
+ SG_ DSP : 62|1@1+ (1,0) [0|0] "" XXX
+ SG_ CD_Wechsler : 61|1@1+ (1,0) [0|0] "" XXX
+ SG_ Spracheingabe : 60|1@1+ (1,0) [0|0] "" XXX
+ SG_ Telematik : 59|1@1+ (1,0) [0|0] "" XXX
+ SG_ Navigation : 58|1@1+ (1,0) [0|0] "" XXX
+ SG_ Telefon : 57|1@1+ (1,0) [0|0] "" XXX
+ SG_ Radio : 56|1@1+ (1,0) [0|0] "" XXX
+ SG_ MMI_vorne : 55|1@1+ (1,0) [0|0] "" XXX
+ SG_ MMI_hinten : 54|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Verbauliste_1_11 : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klimabedienteil_HL : 52|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Verbauliste_1_10 : 50|2@1+ (1,0) [0|0] "" XXX
+ SG_ Tankgeber : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ Assistenzfahrlicht : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ Memory_hinter_Fahrer : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ Sitzmemory_hinten : 46|1@1+ (1,0) [0|0] "" XXX
+ SG_ Sitzmemory_Beifahrer : 45|1@1+ (1,0) [0|0] "" XXX
+ SG_ Anh_ngersteuergeraet : 44|1@1+ (1,0) [0|0] "" XXX
+ SG_ Energiemanagement : 43|1@1+ (1,0) [0|0] "" XXX
+ SG_ Wischermodul : 42|1@1+ (1,0) [0|0] "" XXX
+ SG_ EZS___Kessy__Komfort_ : 41|1@1+ (1,0) [0|0] "" XXX
+ SG_ Verdecksteuergeraet : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ Standheizung : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Verbauliste_1_9 : 38|1@1+ (1,0) [0|0] "" XXX
+ SG_ Einparkhilfe : 37|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klimasteuergeraet_Komfort : 36|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gateway : 35|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenksaeulenmodul : 34|1@1+ (1,0) [0|0] "" XXX
+ SG_ Reifendruck : 33|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombiinstrument_Komfort : 32|1@1+ (1,0) [0|0] "" XXX
+ SG_ Dachmodul : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ Memory : 30|1@1+ (1,0) [0|0] "" XXX
+ SG_ TSG_HR : 29|1@1+ (1,0) [0|0] "" XXX
+ SG_ TSG_HL : 28|1@1+ (1,0) [0|0] "" XXX
+ SG_ TSG_BT : 27|1@1+ (1,0) [0|0] "" XXX
+ SG_ TSG_FT : 26|1@1+ (1,0) [0|0] "" XXX
+ SG_ ZKE : 25|1@1+ (1,0) [0|0] "" XXX
+ SG_ BSG_Komfort : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Verbauliste_1_8 : 19|5@1+ (1,0) [0|0] "" XXX
+ SG_ Stabi_Entkopplung : 18|1@1+ (1,0) [0|0] "" XXX
+ SG_ Waehlhebel : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Batteriemanager : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ Daempfer_SG : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Niveauregulierung : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ EZS___Kessy__Antrieb_ : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Bremsbooster : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Antrieb : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Einspritzpumpe : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkwinkel : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Allrad : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ BSG_Antrieb : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ ADR : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Airbag : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Climatronic_Antrieb : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ABS : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Getriebesteuergeraet : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Motorsteuergeraet : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1488 Systeminfo_1: 6 XXX
+ SG_ CAN_Stand_4_1_Antrieb_Daten_Hau : 44|4@1+ (1,0) [0|15] "" XXX
+ SG_ CAN_Stand_4_1_Antrieb_Daten_Neb : 40|4@1+ (1,0) [0|15] "" XXX
+ SG_ CAN_Stand_4_1_Komfort_Daten_Hau : 36|4@1+ (1,0) [0|15] "" XXX
+ SG_ CAN_Stand_4_1_Komfort_Daten_Neb : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ Frei_Systeminfo_1_6 : 30|1@1+ (1,0) [0|0] "" XXX
+ SG_ Viertuerer : 29|1@1+ (1,0) [0|0] "" XXX
+ SG_ Rechtslenker : 28|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrzeug_Index : 24|4@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrzeug_Generation : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fahrzeug_Derivat : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fahrzeug_Marke_2 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fahrzeug_Klasse : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Verbauinformation_gueltig : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ CAN_Infotainment_verbaut : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ CAN_Infotainment_in_Diagnose : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Sleep_CAN_Infotainment : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ CAN_Komfort_in_Diagnose : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Sleep_CAN_Komfort : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ CAN_Antrieb_in_Diagnose : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ CAN_Extern_zugeschaltet : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 268 Slave_1: 8 XXX
+ SG_ Delta_reduziertes_Sollmoment : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ Delta_Drosselklappenwinkel : 32|16@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Slave_1_1 : 25|7@1+ (1,0) [0|0] "" XXX
+ SG_ Delta_Zuendwinkelausgabe : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ubat_Freigabe_DVE__Slave_ : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ Drosselklappe_Sollwertbegrenzun : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ Einspritzverbot_lernen__Slave_ : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ Master_erkannt__Slave_ : 20|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehler_Momentenausgabe : 19|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehler_Getriebe_Moment : 18|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehler_Bremsenbotschaft : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Indiziertes_Istmoment__Slave_ : 0|16@1+ (0.0015259,0) [0|99.998] "%" XXX
+ SG_ Timeout_Bremsenbotschaft : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1332 Sitz_info: 2 XXX
+ SG_ Positionserkennung_Beifahrersit : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Beifahrersitz_im_vorderen_Dritt : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Positionserkennung_Fahrersitz_u : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrersitz_im_vorderen_Drittel : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_Sitzinfo : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Checksumme_Sitzinfo : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 1810 PSG_3: 2 XXX
+ SG_ Selbsttestergebnis : 0|16@1+ (1,0) [0|0] "" XXX
+
+BO_ 1298 PSG_2: 8 XXX
+ SG_ RAM_Inhalt_4 : 48|16@1+ (1,0) [0|0] "" XXX
+ SG_ RAM_Inhalt_3 : 32|16@1+ (1,0) [0|0] "" XXX
+ SG_ RAM_Inhalt_2 : 16|16@1+ (1,0) [0|0] "" XXX
+ SG_ RAM_Inhalt_1 : 0|16@1+ (1,0) [0|0] "" XXX
+
+BO_ 274 PSG_1: 8 XXX
+ SG_ Pumpentemperatur__2_1_ : 48|16@1+ (0.0625,0) [0|4096] "K" XXX
+ SG_ Pumpentemperatur__3_2_2_ : 44|12@1+ (1,0) [0|0] "" XXX
+ SG_ Zylinderzaehler__3_2_2_ : 43|3@1+ (1,0) [1|8] "Zaehler" XXX
+ SG_ Ansteuerdauer__3_2_2_ : 32|11@1+ (0.0469,0) [0|96] "NW" XXX
+ SG_ Nockenwellendrehzahl__3_2_2_ : 20|12@1+ (4,0) [0|16380] "upm" XXX
+ SG_ Pumpen_Statuswort__3_2_2_ : 0|20@1+ (1,0) [0|0] "" XXX
+
+BO_ 1300 NOX_1: 8 XXX
+ SG_ OBD_fuer_NOX : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_NOX1_4 : 53|3@1+ (1,0) [0|0] "" XXX
+ SG_ IP2 : 52|1@1+ (1,0) [0|0] "" XXX
+ SG_ IP1 : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ IP0 : 50|1@1+ (1,0) [0|0] "" XXX
+ SG_ Sondenheizung_NOX : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ Offsetkorrektur_NOX : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_NOX1_3 : 43|5@1+ (1,0) [0|0] "" XXX
+ SG_ Sauerstoff_binaer : 32|11@1+ (1,-200) [-200|1847] "mV" XXX
+ SG_ Frei_NOX1_2 : 27|5@1+ (1,0) [0|0] "" XXX
+ SG_ Sauerstoff_linear : 16|11@1+ (1,0) [0|2047] "1000/Lambd" XXX
+ SG_ Frei_NOX1_1 : 11|5@1+ (1,0) [0|0] "" XXX
+ SG_ NOX_Signal : 0|11@1+ (1,0) [0|2047] "ppm" XXX
+
+BO_ 1424 Niveau_1: 6 XXX
+ SG_ Beladungszustand : 40|8@1+ (1,0) [0|253] "Zuladung" XXX
+ SG_ Fehlerspeichereintrag__Niveau_1 : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ Systemstatus__Niveau_1_ : 38|1@1+ (1,0) [0|0] "" XXX
+ SG_ Reserve_Fahrzeugart : 37|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrzeugart_Niveau : 36|1@1+ (1,0) [0|0] "" XXX
+ SG_ Textbits__Niveau_1_ : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ Verstellung_HL : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ Verstellung_HR : 30|1@1+ (1,0) [0|0] "" XXX
+ SG_ Verstellung_VL : 29|1@1+ (1,0) [0|0] "" XXX
+ SG_ Verstellung_VR : 28|1@1+ (1,0) [0|0] "" XXX
+ SG_ Absenkung_Fahrzeug : 27|1@1+ (1,0) [0|0] "" XXX
+ SG_ Anhebung_Fahrzeug : 26|1@1+ (1,0) [0|0] "" XXX
+ SG_ Verstellung_aktiv : 25|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kompressorlauf_in_Kuerze : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Niveau_1_5 : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ Taster_Niveau : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ Parkniveau : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zwischenniveau : 20|1@1+ (1,0) [0|0] "" XXX
+ SG_ Niveaustati : 16|4@1+ (1,0) [0|0] "" XXX
+ SG_ MSG_Einschraenkung : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ ESP_Beeinflussung : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Warnlampe_Niveau_1 : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Niveau_1_1 : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_Niveau_1 : 8|4@1+ (1,0) [0|15] "Zaehler" XXX
+ SG_ Checksumme_Niveau_1 : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 1328 Navigation_1: 7 XXX
+ SG_ Kreuzungstyp : 54|2@1+ (1,0) [0|3] "" XXX
+ SG_ Entfernung_bis_Kreuzung : 48|6@1+ (5,0) [0|315] "m" XXX
+ SG_ Entfernung_bis_Kurvenanfang : 40|8@1+ (1,0) [0|255] "m" XXX
+ SG_ Voarusliegende_Kurvenrichtung : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ Vorausliegender_Kurvenverlauf : 32|7@1+ (50,0) [0|6350] "m" XXX
+ SG_ Fehler_Navigation : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ Anzahl_Fahrbahnen__0_ist_unguel : 28|3@1+ (1,0) [1|7] "" XXX
+ SG_ Strassentyp : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ Laenderkennung : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ Vorzeichen_Gierrate______ : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gierratenfehler : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gierrate : 0|14@1+ (0.01,0) [0|100] "deg/sek" XXX
+
+BO_ 1792 MSG_3: 3 XXX
+ SG_ MSG_Konfiguration : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ Lage_des_OT_Impuls : 0|16@1+ (0.01172,-384) [-384|384] "KW" XXX
+
+BO_ 1280 MSG_2: 8 XXX
+ SG_ RAM_Adresse_4 : 48|16@1+ (1,0) [0|0] "" XXX
+ SG_ RAM_Adresse_3 : 32|16@1+ (1,0) [0|0] "" XXX
+ SG_ RAM_Adresse_2 : 16|16@1+ (1,0) [0|0] "" XXX
+ SG_ Ram_Adresse_1 : 0|16@1+ (1,0) [0|0] "" XXX
+
+BO_ 256 MSG_1: 8 XXX
+ SG_ Kurbelwellendrehzahl__3_2_2_ : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ Soll_Foerderbeginn_KW__3_2_2_ : 40|16@1+ (0.01172,-384) [-384|384] "KW" XXX
+ SG_ Soll_Foerderbeginn_NW__3_2_2_ : 28|12@1+ (0.01172,0) [0|768] "degNW" XXX
+ SG_ Soll_Voreinspritzung : 16|12@1+ (1,0) [0|0] "" XXX
+ SG_ Soll_Einspritzmenge : 0|16@1+ (0.03125,0) [0|2047] "mg/H" XXX
+
+BO_ 1796 Motor_NOX: 8 XXX
+ SG_ Frei_Motor_NOX_1_2 : 24|40@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Motor_NOX_1_1 : 19|5@1+ (1,0) [0|0] "" XXX
+ SG_ Heizleistungsanforderung : 18|1@1+ (1,0) [0|0] "" XXX
+ SG_ Offsetkorrektur_moeglich : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Betriebsbereich : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ Abgastemperatur_NOX : 8|8@1+ (5,-40) [-40|1230] "C" XXX
+ SG_ Abgasdruck_NOX : 0|8@1+ (5,600) [600|1870] "mbar" XXX
+
+BO_ 900 Motor_Momente: 8 XXX
+ SG_ Momentenangaben_ungenau__Moment : 35|2@1+ (1,0) [0|0] "" XXX
+
+BO_ 1408 Motor_Flexia: 8 XXX
+ SG_ Ansaugsystem m0 : 63|1@1+ (1,0) [0|0] "" XXX
+ SG_ Hubraum m0 : 56|7@1+ (0.1,0) [0|12.7] "l" XXX
+ SG_ Steigung_der_Befuellungskennlin m1 : 56|8@1+ (0.001,0) [0|0.255] "l/mm" XXX
+ SG_ Anzahl_Zylinder m0 : 52|4@1+ (1,0) [0|15] "Vent./Zyl." XXX
+ SG_ Bewertungsfaktor_Russindex_Turb m1 : 50|6@1+ (0.1,0) [0|6.3] "" XXX
+ SG_ Anzahl_Ventile m0 : 49|3@1+ (1,0) [0|7] "Vent./Zyl." XXX
+ SG_ Bewertungsfaktor_Verschleissind m1 : 44|6@1+ (0.1,0) [0|6.3] "" XXX
+ SG_ Hersteller_Code m1 : 40|4@1+ (1,0) [0|15] "" XXX
+ SG_ Motorleistung m0 : 40|9@1+ (1,0) [0|512] "KW" XXX
+ SG_ Max_Drehmoment m0 : 32|8@1+ (10,0) [0|2550] "Nm" XXX
+ SG_ Normierter_Verbrauch m1 : 32|8@1+ (10,0) [0|2550] "l/Zyl." XXX
+ SG_ Oelniveauschwelle m1 : 24|8@1+ (0.25,0) [0|63.75] "cm" XXX
+ SG_ Drehzahl_MaxNorm m0 : 24|8@1+ (100,0) [0|25500] "U/min" XXX
+ SG_ Verschleissindex : 16|8@1+ (1,0) [0|254] "" XXX
+ SG_ Russindex : 8|8@1+ (1,0) [0|254] "" XXX
+ SG_ Verbrennungsart : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Motor_Flexia_1 : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Warm_Up_Cycle : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Driving_Cycle : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_Motor_Flexia : 1|3@1+ (1,0) [0|15] "" XXX
+ SG_ Multiplex_Schalter_Motor_Flexia M : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1160 Motor_6: 8 XXX
+ SG_ MO6_Zaehler M : 60|4@1+ (1,0) [0|15] "" XXX
+ SG_ MO6_FF_Mux00 m0 : 48|8@1+ (0.39215686,0) [0|100] "%" XXX
+ SG_ MO6_FF_Mux01 m1 : 48|8@1+ (0.39215686,0) [0|100] "%" XXX
+ SG_ MO6_FF_Mux02 m2 : 48|8@1+ (1,-40) [-40|215] "C" XXX
+ SG_ MO6_FF_Mux03 m3 : 48|8@1+ (3.1372549,0) [0|800] "%" XXX
+ SG_ MO6_FF_Mux04 m4 : 48|8@1+ (0.39215686,0) [0|100] "%" XXX
+ SG_ MO6_Checksum : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ MO6_SollM_Getr : 8|8@1+ (0.39,0) [0|99.06] "%" XXX
+ SG_ MO6_Ist_Moment : 16|8@1+ (0.39,0) [0|99.06] "%" XXX
+ SG_ MO6_Hoeheninfo : 24|8@1+ (0.0078125,0) [0|2] "" XXX
+ SG_ MO6_GRA_Soll : 32|8@1+ (0.024,-3.984) [-3.984|2.112] "m/s2" XXX
+ SG_ MO6_MomIntGeOng : 40|8@1+ (0.39215686,0) [0|100] "%" XXX
+ SG_ MO6_Freigabe_GRA : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO6_Schutz_Toel : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO6_Luftpfad_akt : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO6_RegPartikel : 59|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1162 Motor_8: 8 XXX
+ SG_ MO8_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ MO8_AnzeigeDZ : 8|12@1+ (3,0) [0|12282] "rpm" XXX
+ SG_ MO_Effizienzmodus : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_SGT_Soundakt : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_Spoiler_ausf : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_Sportschalter : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_LampeDZBegr : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_Enable_Oeldr_Motor : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_Oeldr_Warn_Motor : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_Avus_Motorschutz : 27|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO8_Anzeigecode : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_P_verriegelt : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO8_GRA_v_Wunsch : 32|9@1+ (1,0) [0|511] "km/h" XXX
+ SG_ MO_Schaltempf_verfbar : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO8_Trailing_ZWP : 42|6@1+ (15,0) [0|945] "s" XXX
+ SG_ MO_Istgang : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ MO_Sollgang : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ MO8_Zaehler : 60|4@1+ (1,0) [0|15] "" XXX
+
+
+BO_ 1152 Motor_5: 8 Motor
+ SG_ MO5_Mp_Code M : 6|2@1+ (1,0) [0|3] "" Gateway
+ SG_ MO5_max_Moment m0 : 0|6@1+ (10,0) [0|630] "Nm" Gateway
+ SG_ MO5_Drehzahl m1 : 0|6@1+ (100,0) [0|6300] "U/min" Gateway
+ SG_ MO5_Motortyp m2 : 0|6@1+ (1,0) [0|63] "" Gateway
+ SG_ MO5_Abgastyp m3 : 0|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Abgastyp2 m3 : 1|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Abgastyp3 m3 : 2|1@1+ (1,0) [0|1] "" Gateway
+ SG_ OBD_Kaltstart_Denominator m3 : 3|1@1+ (1,0) [0|1] "" Gateway
+ SG_ OBD_Minimum_Trip m3 : 4|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_DPF_reg m3 : 5|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Vorgluehen : 9|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_E_Gas : 10|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_OBD_2 : 11|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Heissl : 12|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_KlimaKompr : 13|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Feld_kuehl : 14|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_KliKo_Red : 15|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Verbrauch : 16|15@1+ (1,0) [0|32767] "µl" KOMBI
+ SG_ MO5_UeberlVerb : 31|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Luefter : 32|8@1+ (0.4,0) [0|101.6] "%" Gateway
+ SG_ MO5_HLeuchte : 40|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_PartikelLamp : 41|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Sta_BKU : 42|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_TypStartSteu : 43|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_TDE_Lampe : 44|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_TDE_Text : 45|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_DZM_Daempf : 46|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Interlock : 47|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Start : 48|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Anlasser : 49|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_GRA_Hauptsch : 50|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Momente : 51|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO5_Motortext1 : 52|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Motortext2 : 53|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Motortext3 : 54|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ MO5_Motortext4 : 55|1@1+ (1,0) [0|1] "" KOMBI
+ SG_ CHECKSUM : 56|8@1+ (1,0) [0|255] "" Gateway
+
+BO_ 896 Motor_3: 8 Motor
+ SG_ MO3_Vorgluehen : 0|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO3_Prio_Dz : 1|1@1+ (1,0) [0|1] "" Transmission
+ SG_ MO_Schalter_StartStopp : 2|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO3_Winterprg : 3|1@1+ (1,0) [0|1] "" Transmission
+ SG_ MO3_Sta_Pedal : 4|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO3_Sta_FPG M : 5|1@1+ (1,0) [0|1] "" ESP
+ SG_ MO3_Sign_FPG m1 : 6|1@1+ (1,0) [0|1] "" ESP
+ SG_ MO3_Sta_Temp : 7|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO3_Offsentemp : 8|8@1+ (0.75,-48) [-48|142.5] "°C" Gateway
+ SG_ MO3_Pedalwert : 16|8@1+ (0.4,0) [0|101.6] "%" Gateway
+ SG_ MO3_Rad_Wu_Mo : 24|12@1+ (0.39,0) [0|1596.66] "%" Transmission
+ SG_ MO3_Vorz_RadWu : 36|1@1+ (1,0) [0|1] "" Transmission
+ SG_ MO3_Freigabe_Segeln : 37|1@1+ (1,0) [0|1] "" Transmission
+ SG_ MO_StartStopp_StoppVorbereitung : 38|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO3_Dz_Beeinfl : 40|8@1+ (0.39,0) [0|99.45] "%" Transmission
+ SG_ MO3_WunschDz : 48|8@1+ (25,0) [0|6350] "U/min" Transmission
+ SG_ MO3_DKW m0 : 56|8@1+ (0.4,0) [0|101.6] "%" Gateway
+ SG_ MO3_FPGradient m1 : 56|8@1+ (25,0) [0|6350] "%/s" ESP
+
+BO_ 648 Motor_2: 8 Motor
+ SG_ MO2_Mp_Code m : 6|2@1+ (1,0) [0|3] "" Gateway
+ SG_ MO2_Getr_Code m2 : 0|6@1+ (1,0) [0|63] "" Gateway
+ SG_ MO2_max_Mo m3 : 0|6@1+ (10,0) [0|630] "Nm" Gateway
+ SG_ MO2_CAN_Vers m0 : 0|6@1+ (1,0) [0|63] "" Gateway
+ SG_ MO2_Motor_Code m1 : 0|6@1+ (1,0) [0|63] "" Gateway
+ SG_ MO2_Kuehlm_T : 8|8@1+ (0.75,-48) [-47.25|142.5] "°C" Gateway
+ SG_ MO2_BLS : 16|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_BTS : 17|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_Sta_Kuehlm : 18|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_Sta_Klima : 19|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_Sta_No_Bet : 20|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_Status_TSK : 21|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_Sta_GRA : 22|2@1+ (1,0) [0|3] "" ACC,GRA
+ SG_ TSK_Limiter_ausgewaehlt : 25|1@1+ (1,0) [0|1] "" ACC,GRA
+ SG_ MO2_GRAregelt : 26|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_Sport_Error : 27|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_OffRoad : 28|1@1+ (1,0) [0|1] "" Gateway
+ SG_ MO2_RME_Gehalt : 29|3@1+ (12.5,0) [0|75] "%" Gateway
+ SG_ MO2_GRA_Soll : 32|8@1+ (1.28,0) [0|325.12] "km/h" ACC,GRA
+ SG_ MO2_LL_Solldz : 40|8@1+ (10,0) [0|2540] "1/min" Gateway
+ SG_ MO2_Begr_Mo : 48|8@1+ (0.39,0) [0|99.06] "%" Gateway
+ SG_ MO2_Mo_ZWR : 56|8@1+ (0.39,0) [0|99.06] "%" Gateway
+
+BO_ 1416 Motor_7: 8 XXX
+ SG_ MO7_LL_Solldz : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Fehler_VBegr : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Sta_VBegr : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Fehlereintr : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_StaOeltemp : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Sta_PTC : 5|3@1+ (1,0) [0|7] "" XXX
+ SG_ MO7_DFM : 8|8@1+ (0.4,0) [0|101.6] "%" XXX
+ SG_ MO7_Hoeheninfo : 16|8@1+ (0.0078125,0) [0|2] "" XXX
+ SG_ MO7_Gradient_Dz : 24|7@1+ (1,0) [0|126] "rpm" XXX
+ SG_ MO7_GradientVorz : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Ladedruckneu : 32|8@1+ (0.02,0) [0|5.08] "bar" XXX
+ SG_ MO7_GenLdResp : 40|2@1+ (3,0) [0|9] "s" XXX
+ SG_ MO7_PTC_bereit : 42|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO7_Mot_weckfaehig : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Zus_Kuehl : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_SleepInd : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_RueckLLDz : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Lastabwurf : 48|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO7_Gen_ein : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_Lastabw_Heiz : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO7_StaGluehk : 52|4@1+ (8,0) [0|112] "%" XXX
+ SG_ MO7_Oeltemp : 56|8@1+ (1,-60) [-60|194] "C" XXX
+
+BO_ 1450 Motor_13: 8 XXX
+ SG_ MO_NMAX_Schaltanzeige : 0|9@1+ (25,0) [0|12775] "rpm" XXX
+ SG_ MO_Ethanol_BS_Texte : 9|3@1+ (1,0) [0|7] "" XXX
+ SG_ MO_Heizungspumpenansteuerung : 12|4@1+ (10,0) [0|100] "%" XXX
+ SG_ MO_Trailingzeit_Heizungspumpe : 16|6@1+ (15,0) [0|945] "s" XXX
+ SG_ MO_Absperrventil_oeffnen : 22|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO_activees_Getriebeheizen : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_Getriebe_kuehlen : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_Zustand_HWP : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO_BKV_Unterdruckwarnung : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_StartStopp_Codiert : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_Zylinderabschaltung : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO_Heizstrom_SCR : 32|6@1+ (1,0) [0|62] "A" XXX
+ SG_ MO_Heizstrom_EKAT : 38|7@1+ (1,0) [0|126] "A" XXX
+ SG_ MO_Tankklappenstatus : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ MO_Tankklappensteuerung : 48|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO_Zylabsch_Texte_02 : 50|4@1+ (1,0) [0|15] "" XXX
+ SG_ MO_EFLEX_Lampe : 54|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO_Testmode_AG : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_Ext_E_Fahrt_active : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_E85_WU_Lampe : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_E85_WU_Texte : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_Zylabsch_Texte : 60|2@1+ (1,0) [0|3] "" XXX
+ SG_ MO_E85_BS_Texte : 62|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 1420 Motor_10: 8 XXX
+ SG_ M10_Anzeige : 0|4@1+ (1,0) [0|15] "" XXX
+ SG_ M10_Anf_Kl75 : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ MSG_Remotestart_Betrieb : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_SpannungsAnf : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_UDruckDyn : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Status_StSt : 8|2@1+ (1,0) [0|3] "" XXX
+ SG_ M10_MotorStopp : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Wiederstart : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Schubabschaltung : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Druck_err_gem : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Freigabe_Reku : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ M10_rel_Saugrohrdruck : 16|6@1+ (18,0) [0|1116] "mbar" XXX
+ SG_ M10_Fahrbereitschaft : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Hybrid : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_EM_active : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_VM_active : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_HYB_Bereitlampe : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_HYB_Warnlampe : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_HYB_Fehlerlampe : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Fehler_HV_Netz : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_EKlKomLeiRed : 30|2@1+ (1,0) [0|3] "" XXX
+ SG_ M10_Klimadruck : 32|8@1+ (0.2,0) [0|50.8] "bar" XXX
+ SG_ M10_KompOffCode : 40|4@1+ (1,0) [0|15] "" XXX
+ SG_ M10_StartStopp_Fahrerwunsch : 44|2@1+ (1,0) [0|3] "" XXX
+ SG_ M10_Akustik : 46|2@1+ (1,0) [0|3] "" XXX
+ SG_ M10_Text_1_Hybrid : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_2_Hybrid : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_3_Hybrid : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_4_Hybrid : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_5_Hybrid : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_6_Hybrid : 53|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_7_Hybrid : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_Text_8_Hybrid : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_ShiftLockLampe : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO_Auth_Aufforderung_WFS : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_BMSInfo_gue : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_VentilationReq : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ M10_BattFanSpd : 60|4@1+ (10,0) [0|140] "%" XXX
+
+BO_ 1423 Motor_12: 8 XXX
+ SG_ M12_MKB_MUX M : 56|2@1+ (1,0) [0|3] "" XXX
+ SG_ M12_MKB_01 m0 : 59|5@1+ (1,0) [0|31] "" XXX
+ SG_ M12_MKB_02 m1 : 59|5@1+ (1,0) [0|31] "" XXX
+ SG_ M12_MKB_03 m2 : 59|5@1+ (1,0) [0|31] "" XXX
+ SG_ M12_MKB_04 m3 : 59|5@1+ (1,0) [0|31] "" XXX
+ SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-48|143.25] "C" XXX
+ SG_ M12_E85_Sensor : 8|4@1+ (10,0) [0|100] "%" XXX
+ SG_ M12_SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ M12_SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "km" XXX
+ SG_ SCR_Tankdeckel : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ M12_SCR_Warnstufe_1 : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ M12_SCR_Warnstufe_2 : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ M12_SCR_Text : 34|3@1+ (1,0) [0|7] "" XXX
+ SG_ M12_Akustik : 37|2@1+ (1,0) [0|3] "" XXX
+ SG_ M12_Luftfilter_Lampe : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ M12_Kraftstofffilter_Wasser : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ M12_SCR_Systemfehler : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ M12_SCR_Inducement : 42|2@1+ (1,0) [0|3] "" XXX
+ SG_ M12_CO2_Faktor : 44|12@1+ (1,0) [0|4094] "g/l" XXX
+ SG_ MO_EDK_Luefter_defekt : 58|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1437 mRemotestart_FFB: 8 Vector__XXX
+ SG_ RSF_Tastencode_1 : 0|8@1+ (1,0) [1|255] "" Vector__XXX
+ SG_ RSF_Tastencode_2 : 8|8@1+ (1,0) [1|255] "" Vector__XXX
+ SG_ RSF_Tastencode_Maske : 16|8@1+ (1,0) [1|255] "" Vector__XXX
+
+BO_ 640 Motor_1: 8 Motor
+ SG_ MO1_Wunschmo : 56|8@1+ (0.39,0) [0|99.06] "%" XXX
+ SG_ MO1_Verlustmo : 48|8@1+ (0.39,0) [0|99.06] "%" XXX
+ SG_ MO1_Pedalwert : 40|8@1+ (0.4,0) [0|101.6] "%" XXX
+ SG_ MO1_Mo_o_ex : 32|8@1+ (0.39,0) [0|99.06] "%" XXX
+ SG_ MO1_Drehzahl : 16|16@1+ (0.25,0) [0|16256] "1/min" XXX
+ SG_ MO1_Mo_m_ex : 8|8@1+ (0.39,0) [0|99.06] "%" XXX
+ SG_ MO1_Sta_MotMo : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_Sta_Getr : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_Sta_Bremse : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_TiOut_Br : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_Kup_schalt : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_Kickdown : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_Sta_Pedal : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ MO1_Leergas : 0|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 262 Master_3: 8 XXX
+ SG_ Frei_Master_3_1 : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ Motortemperatur_linearisiert : 48|8@1+ (0.75,-48) [-48|143.25] "" XXX
+ SG_ Indiziertes_Sollmoment_f_r_Vmax : 32|16@1+ (0.0015259,0) [0|100] "%" XXX
+ SG_ Relative_Momentenanforderung_de : 16|16@1+ (0.003052,0) [0|200] "%" XXX
+ SG_ Delta_Motormoment_aus_Verlustmo : 0|16@1+ (0.003052,-100) [-100|100] "%" XXX
+
+BO_ 260 Master_2: 8 XXX
+ SG_ Ubat_Freigabe_DVE : 45|1@1+ (1,0) [0|0] "" XXX
+ SG_ DK_Sollwertbegrenzung : 44|1@1+ (1,0) [0|0] "" XXX
+ SG_ Einspritzverbot_DV_E_lernen : 43|1@1+ (1,0) [0|0] "" XXX
+ SG_ Master_erkannt : 42|1@1+ (1,0) [0|0] "" XXX
+ SG_ Vmax_Begrenzung_aktiv : 41|1@1+ (1,0) [0|0] "" XXX
+ SG_ SA_Verbot_von_FGR : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ Pedalwert_Komplement : 24|16@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler__Master_2_ : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Normierter_Fahrpedalwinkel : 0|16@1+ (0.001526,0) [0|100] "%" XXX
+
+BO_ 258 Master_1: 8 XXX
+ SG_ Stationaere_Solldrehzahl : 56|8@1+ (10,0) [0|2550] "Umin" XXX
+ SG_ Drehmoment_LLR__I_Anteil_ : 40|16@1+ (0.003052,-100) [-100|100] "%" XXX
+ SG_ Drehmoment_LLR__PD_Anteil_ : 24|16@1+ (0.003052,-100) [-100|100] "%" XXX
+ SG_ Drehmoment_LLR__Luftpfad_ : 8|16@1+ (0.003052,-100) [-100|100] "%" XXX
+ SG_ Frei_Master_1_1 : 4|4@1+ (1,0) [0|0] "" XXX
+ SG_ LLR_ist_aktiv : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ I_Anteil_der_LLR_aktiv : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ PD_Anteil_der_LLR_aktiv : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ LLR_Freigabe_nach_Start : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1984 LWS_Kalibrierung: 2 XXX
+ SG_ Frei_LWS_Kalibrierung_1_1 : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ LWS_Identifier : 8|7@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_LWS_Kalibrierung_1_2 : 4|4@1+ (1,0) [0|0] "" XXX
+ SG_ Command_Dode_Word : 0|4@1+ (1,0) [0|0] "" XXX
+
+BO_ 1986 Lenkwinkel_Init: 4 XXX
+ SG_ Kodierbytes : 8|24@1+ (1,0) [0|0] "" XXX
+ SG_ Identiifier_f_r_LWS_Init : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 192 Lenkwinkel_1__RB_: 2 XXX
+ SG_ Vorzeichen__RB_ : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkwinkel__RB_ : 5|10@1+ (2.5,-720) [-720|720] "" XXX
+ SG_ LWS_OK__RB_ : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ LWS_Abgleich__RB_ : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Lenkwinkel_1_1__RB_ : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FINE_CHECK__RB_ : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ COARSE_CHECK__RB_ : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 196 Lenkwinkel_1__ITT_: 2 XXX
+ SG_ Vorzeichen__ITT_ : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkwinkel__ITT_ : 5|10@1+ (1.5,-768) [-768|766.5] "" XXX
+ SG_ LWS_OK : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ LWS_Abgleich__ITT_ : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ LWS_Initialisierung__ITT_ : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ FINE_CHECK__ITT_ : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ COARSE_CHECK__ITT_ : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 194 Lenkwinkel_1: 8 XXX
+ SG_ LW1_LRW : 0|15@1+ (0.04375,0) [0|1433.55625] "°Grad" Gateway,ESP,ABS
+ SG_ LW1_LRW_Sign : 15|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS
+ SG_ LW1_Lenk_Gesch : 16|15@1+ (0.04375,0) [0|1433.55625] "°Grad/s" Gateway,ESP,ABS
+ SG_ LW1_Gesch_Sign : 31|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS
+ SG_ LW1_ID : 32|8@1+ (1,0) [0|255] "" Gateway,ESP,ABS
+ SG_ LW1_Initquelle : 40|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS
+ SG_ LW1_Status : 41|2@1+ (1,0) [0|3] "" Gateway,ESP,ABS
+ SG_ LW1_Sta_KL30 : 43|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS
+ SG_ LW1_Zaehler : 44|4@1+ (1,0) [0|15] "" Gateway,ESP,ABS
+ SG_ LW1_Kodier : 48|8@1+ (1,0) [0|255] "" Gateway
+ SG_ LW1_CRC : 56|8@1+ (1,0) [0|255] "" Gateway,ESP,ABS
+
+BO_ 1502 Lenkhilfe_Fehler: 7 XXX
+ SG_ Werkstattcode : 48|8@1+ (1,0) [0|0] "" XXX
+ SG_ Multiplex_Signal : 45|3@1+ (1,0) [0|7] "" XXX
+ SG_ Sensorcodierung_Lenkhilfe : 44|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kennliniencodierung_Lenkhilfe : 40|4@1+ (1,0) [0|15] "Kennlinie" XXX
+ SG_ Geber_f__Lenkw__Speicher_ausles : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombiinstr__Speicher_auslesen : 38|1@1+ (1,0) [0|0] "" XXX
+ SG_ Steuerger__Speicher_auslesen : 37|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Steuergeraet_defekt : 36|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Lenkhilfe_1_3 : 32|4@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Lenkhilfe_1_4 : 30|2@1+ (1,0) [0|0] "" XXX
+ SG_ Geber_f__Lenkwi__k__CAN_Komm_sp : 29|1@1+ (1,0) [0|0] "" XXX
+ SG_ Geber_f__Lenkwinkel_k__CAN_Komm : 28|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombiinstr__k__CAN_Kommunik__sp : 27|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombiinstrument_k__CAN_Kommunik : 26|1@1+ (1,0) [0|0] "" XXX
+ SG_ Steuergeraet_k__CAN_Kommunik__S : 25|1@1+ (1,0) [0|0] "" XXX
+ SG_ Steuergeraet_keine_CAN_Kommunik : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Spannung_Ks__nach_Mas : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Spannung_Ks_nach_Mass : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Spannung_Ks__nach___s : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Spannung_Ks__nach__ : 20|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Temperaturschutz_sp_ : 19|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Temperaturschutz : 18|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Betrieb_unpl__Sig__sp : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfe_Betrieb_unpl__Signal : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_k__Kommunik__sp : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_keine_Kommunik_ : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_defekt_sp_ : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_defekt : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_Unterbrechung_s : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_Unterbrechung : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhilfesensor_Ks_nach_Masse_s : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkhifesensor_Ks_nach_Masse : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Spannung_Kl_15_zu_klein_sp_ : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Spannung_Kl_15_zu_klein : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Lenkhilfe_1_5 : 4|2@1+ (1,0) [0|0] "" XXX
+ SG_ Spannung_Kl_30_zu_klein_sp_ : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Spannung_Kl_30_zu_klein : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Spannung_Kl_30_zu_gro__sp_ : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Spannung_Kl_30_zu_gro_ : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 976 Lenkhilfe_1: 2 XXX
+ SG_ LH1_Lastinfo : 0|7@1+ (1,0) [0|127] "A" XXX
+ SG_ LH1_Fehler_LI : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_Sicherheitslamp : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_Fehlerlampe : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_Textbits : 10|3@1+ (1,0) [0|7] "" XXX
+ SG_ LH1_Akustiksign : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_SleepInd : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_Fehlereintr : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_EPS_Diagmode : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_gue_ECU_Temp : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_Kuehlung : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_Mode_Hybrid : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_Untersp : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_Uebersp : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_Uebertemp : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_Sensor : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_CAN_SS : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_ECU : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_Motor : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_NL_LeistDichte : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH1_ULeistung : 32|8@1+ (0.5,0) [0|100] "%" XXX
+ SG_ LH1_ECU_Temp : 40|8@1+ (1,-70) [-70|185] "°C" XXX
+
+BO_ 1312 Kombi_3: 8 XXX
+ SG_ Frei_Kombi_3_2 : 60|4@1+ (1,0) [0|0] "" XXX
+ SG_ Kilometerstand : 40|20@1+ (1,0) [0|1000000] "km" XXX
+ SG_ Fehlerstatus_Standzeit : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ Standzeit : 24|15@1+ (4,0) [0|131068] "sec" XXX
+ SG_ Frei_Kombi_3_1 : 20|4@1+ (1,0) [0|0] "" XXX
+ SG_ Schluesselinfo : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ Kombi_Multiplex_Code M : 14|2@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Niveauregulie m3 : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Marke m1 : 11|3@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Lenkhilfe m3 : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Dieselpumpe m3 : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Lenkwinkel m3 : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Baureihe m1 : 8|3@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Laendervariante m0 : 8|6@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Allrad m3 : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Bordnetz m3 : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_ACC m3 : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Airbag m3 : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Generation m1 : 4|4@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Klima m3 : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_ABS m3 : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Verbauliste_Motor m3 : 0|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Derivat m1 : 0|4@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Sprachvariante m0 : 0|8@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_Multiplex_Reifenumfang m2 : 0|12@1+ (1,0) [0|4095] "mm" XXX
+
+BO_ 1056 Kombi_2: 8 XXX
+ SG_ Frei_Kombi_2_2 : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerstatus_Kl__58_s : 55|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_58s__Kombi_2_ : 48|7@1+ (1,0) [0|100] "%" XXX
+ SG_ Fehlerstatus_Kl__58_d : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_58d__Kombi_2_ : 40|7@1+ (1,0) [0|100] "%" XXX
+ SG_ Kuehlmitteltemp__4_1__Kombi_2_ : 32|8@1+ (0.75,-48) [-48|142.5] "C" XXX
+ SG_ Oeltemperatur_4_1 : 24|8@1+ (1,-60) [-60|194] "C" XXX
+ SG_ Aussentemp__ungefiltert_4_1__Ko : 16|8@1+ (0.5,-50) [-50|77] "C" XXX
+ SG_ Aussentemperatur_gefiltert : 8|8@1+ (0.5,-50) [-50|77] "C" XXX
+ SG_ Fehlerspeichereintrag__Kombi_ : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Kombi_2_1 : 4|3@1+ (1,0) [0|0] "" XXX
+ SG_ Anhaenger_erkannt : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerst__Kuehlmitteltemp__4_1 : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerstatus_Oeltemperatur_4_1 : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerstatus_Aussentemp__4_1 : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 800 Kombi_1: 8 XXX
+ SG_ Frei_Kombi_1_3 : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ Angezeigte_Geschwindigkeit : 46|10@1+ (0.32,0) [0|325] "km/h" XXX
+ SG_ Blinker_rechts_4_1 : 45|1@1+ (1,0) [0|0] "" XXX
+ SG_ Blinker_links_4_1 : 44|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gesetzte_Zeitluecke__Kombi_1_ : 43|1@1+ (1,0) [0|0] "" XXX
+ SG_ ADR_Summer_abgeschaltet : 42|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Kombi_1_2 : 40|2@1+ (1,0) [0|0] "" XXX
+ SG_ Geschwindigkeit__Kombi_1_ : 25|15@1+ (0.01,0) [0|326] "km/h" XXX
+ SG_ Signalquelle_Geschwindigkeit_4_ : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Tankwarnung : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ Tankinhalt : 16|7@1+ (1,0) [0|126] "l" XXX
+ SG_ Tankstop : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Kombi_1_7 : 12|3@1+ (1,0) [0|0] "" XXX
+ SG_ Kombi_im_Stellgliedtest : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ladekontroll_Lampe__Kombi_ : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Bremsinfo : 8|2@1+ (1,0) [0|0] "" XXX
+ SG_ Vorgluehlampe__Kombi_1_ : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Tankwarnlampe : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heissleuchten_Vorwarnung : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kuehlmittelmangel : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Dynamische_Oeldruckwarnung : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Oeldruck : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerstatus_Tank : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrertuer_4_1 : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1504 Klima_1: 8 XXX
+ SG_ Aussentemp__ungef__Sto_f__4_1 : 56|8@1+ (0.5,-50) [-50|77] "C" XXX
+ SG_ Fehlerspeichereintrag__Klima_ : 55|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Klima_1_5 : 50|5@1+ (1,0) [0|0] "" XXX
+ SG_ AC_Schalter : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ Temperatureinheit : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kuehlerluefteransteuerung__Klim : 40|8@1+ (0.4,0) [0|101.6] "%" XXX
+ SG_ Geblaeselast_4_1 : 32|8@1+ (0.4,0) [0|101.6] "%" XXX
+ SG_ Kompressorlast : 24|8@1+ (0.25,0) [0|63.5] "Nm" XXX
+ SG_ Klimadrucksignal__Klima_1_ : 16|8@1+ (0.2,0) [0|50.8] "bar" XXX
+ SG_ Aussentemp__ungef__4_1__Klima_1 : 8|8@1+ (0.5,-50) [-50|77] "C" XXX
+ SG_ Kaeltemitteldruck_veraltet : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kompressormoment_veraltet_4_1 : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Keine_Heizleistg_gewuenscht_4_1 : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kompressorzustand__4_1_ : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heizbare_Frontscheibe : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heizbare_Heckscheibe : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrerwunsch_Zuheizer : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Drehzahlanhebung : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 906 GRA_Neu: 4 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ GRA_Hauptschalt : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Abbrechen : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Down_kurz : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Up_kurz : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Down_lang : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Up_lang : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Fehler_Bed : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Kodierinfo : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Neu_Setzen : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Recall : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Sender : 18|2@1+ (1,0) [0|3] "" XXX
+ SG_ COUNTER : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ GRA_Tip_Down : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Tip_Up : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Zeitluecke : 26|2@1+ (1,0) [0|3] "" XXX
+ SG_ GRA_Sta_Limiter : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Typ_Hauptschalt : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Sportschalter : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ GRA_Fehler_Tip : 31|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 904 GRA: 3 XXX
+ SG_ Checksumme_GRA_alt : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_GRA_alt : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR_Bedienteil_Fehler : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR_beschleunigen : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR_verzoegern : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR___Tipschalter__Wie : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR___Tipschalter__Set : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR___Tipschalter__Aus : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ GRA_alt__ADR___Hauptschalter : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_GRA_alt : 0|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 1352 Getriebe_4: 3 XXX
+ SG_ Testparameter_2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ Testparameter_1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ Waehlhebelausleuchtung : 4|4@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Getriebe_4_1 : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Testfreigabeflag : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Handbremserinnerung_s_Lampe : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Shiftlock_Getriebe_4 : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1344 Getriebe_2: 8 XXX
+ SG_ eingelegte_Fahrstufe : 60|4@1+ (1,0) [0|0] "" XXX
+ SG_ Ganganzeige_Kombi___Getriebe_Va : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fehlerlampe_f_r_Kupplung_bei_VL : 55|1@1+ (1,0) [0|0] "" XXX
+ SG_ Anforderung_Kriechadaption : 54|1@1+ (1,0) [0|0] "" XXX
+ SG_ ECO_Anzeige__4_1_ : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Shift_Lock_Lampe : 52|1@1+ (1,0) [0|0] "" XXX
+ SG_ Unterdrueckung_von_Warnungen : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gong : 50|1@1+ (1,0) [0|0] "" XXX
+ SG_ Starter_wird_angesteuert : 49|1@1+ (1,0) [0|0] "" XXX
+ SG_ Hochschaltlampe : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ Synchronisationszeit : 40|8@1+ (20,0) [0|5080] "ms" XXX
+ SG_ invertierte_Synchronisations_Wu : 32|8@1+ (25,0) [0|6350] "U/min" XXX
+ SG_ Synchronisations_Wunschdrehzahl : 24|8@1+ (25,0) [0|6350] "U/min" XXX
+ SG_ Gradientenbegrenzung : 16|8@1+ (10,0) [0|2540] "Nm/s" XXX
+ SG_ Leerlaufsolldrehzahl__Getriebe : 8|8@1+ (10,0) [0|2540] "U/min" XXX
+ SG_ Zahler_Getriebe_2 : 4|4@1+ (1,0) [0|15] "" XXX
+ SG_ Zwischengasflag : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ecomatic__4_1_ : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Schubabschaltunterstuetzung : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ LFR_Adaption_Freigabeflag : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1088 Getriebe_1: 8 Transmission
+ SG_ GE1_Schaltung : 0|1@1+ (1,0) [0|1] "" Gateway
+ SG_ GE1_Sta_Schutz : 1|1@1+ (1,0) [0|1] "" Motor
+ SG_ GE1_Klimakompr : 2|1@1+ (1,0) [0|1] "" Motor
+ SG_ GE1_WK : 3|2@1+ (1,0) [0|3] "" Gateway
+ SG_ GE1_StSt_Info : 5|2@1+ (1,0) [0|3] "" Gateway
+ SG_ GE1_EGS_Anf : 7|1@1+ (1,0) [0|1] "" Motor
+ SG_ GE1_Zielgang : 8|4@1+ (1,0) [0|15] "" Gateway
+ SG_ GE1_Wahl_Pos : 12|4@1+ (1,0) [0|15] "" Gateway
+ SG_ GE1_Mrad_Mkurb : 16|8@1+ (0.1,0) [0|25.4] "" Gateway
+ SG_ GE1_Soll_Mo : 24|8@1+ (0.39,0) [0|99.06] "%" Motor
+ SG_ GE1_Fahrwistd : 32|8@1+ (0.249,-31.623) [-31.623|31.623] "" Gateway
+ SG_ GE1_Notlauf : 40|4@1+ (1,0) [0|15] "" Gateway
+ SG_ GE1_Kuehlung : 44|2@1+ (1,0) [0|3] "" Gateway
+ SG_ GE1_Sta_OBD : 47|1@1+ (1,0) [0|1] "" Motor
+ SG_ GE1_LaunchControl : 48|1@1+ (1,0) [0|1] "" ESP
+ SG_ GE1_Infobit : 49|1@1+ (1,0) [0|1] "" Gateway
+ SG_ GE1_SleepInd : 50|1@1+ (1,0) [0|1] "" Gateway
+ SG_ COUNTER : 51|4@1+ (1,0) [0|15] "" Gateway
+ SG_ GE1_Fehlereintr : 55|1@1+ (1,0) [0|1] "" Gateway
+ SG_ GE1_WaVerl_Mo : 56|8@1+ (0.39,0) [0|99.06] "%" Motor
+
+BO_ 912 Gate_Komf_1: 8 XXX
+ SG_ GK1_Sta_RDK_Warn : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Anhaen : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Licht1 : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Licht3 : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Tuerkont : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Li_vorn : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ LIA_Standlicht : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_SleepAckn : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_CharismaModus : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ GK1_SamFktNr : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ GK1_Fa_Tuerkont : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_RueckfahrSch : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_ELV_verrieg : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Kessy_2 : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Stdhzg : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_SH_Verbau : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_ParkFrontWi : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_KW_Warm : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ BCM_Remotestart_Betrieb : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ BCM_Offroad_Taster : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ BSK_HL_geoeffnet : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ BSK_HR_geoeffnet : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Rueckfahr : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_BrLi_links : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_BrLi_rechts : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_BrLi_mitte : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_BLS_ILM : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_EDC_ILM : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Blinker_li : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Blinker_re : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_def_P_verr : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_LS1_Fernlicht : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_Licht2 : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_LSM : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ WI1_Front_Wasch : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ BSK_BT_geoeffnet : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ BCM_CV_Taster : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ BSK_HD_Hauptraste : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ BSK_Tankklappe : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ EV1_Anf_Klemme_50 : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Anhaenger : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_BrLi_Anhaen : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Abblendlicht : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Fernlicht : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Wischer_vorn : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Sta_ILM_F_1 : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Abbl_VL_def : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Abbl_VR_def : 53|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Blink_Autob : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Warnblk_Status : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_SH_laeuft : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ SH1_ein_Wasserpumpe : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Nebel_ein : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Bremslicht : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_Anh_abgesteckt : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_AnhKonLamp : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDS_Stellung_AFL : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK1_SH_Zusatzfkt : 63|1@1+ (1,0) [0|1] "" XXX
+
+
+BO_ 1340 Fahrwerk_1: 1 XXX
+ SG_ Frei_Fahrwerk_1_2 : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Fahrwerk_1_1 : 6|2@1+ (1,0) [0|0] "" XXX
+ SG_ Einstellung_Fahrwerkdaempfung_4 : 4|3@1+ (1,0) [0|7] "" XXX
+ SG_ Ansteuererung_Fahrzeugniveau : 0|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 1482 EPB_2: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ EPB_Status : 12|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 1472 EPB_1: 8 XXX
+ SG_ COUNTER : 0|4@1+ (1,0) [0|15] "" XXX
+ SG_ EP1_Fehler_Sta : 4|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ EP1_Sta_EPB : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Sta_Schalter : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Spannkraft : 8|5@1+ (1,0) [0|30] "Unit_KiloNewto" XXX
+ SG_ EP1_Schalterinfo : 13|2@1+ (1,0) [0|3] "" XXX
+ SG_ EP1_Sta_NWS : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Neig_winkel : 16|8@1+ (1,-128) [-128|127] "Unit_PerCentOfForceOfGravi" XXX
+ SG_ EP1_Verzoegerung : 24|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" XXX
+ SG_ EP1_Fehlereintr : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Freigabe_Ver : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_AutoHold_zul : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_AutoHold_aktiv : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_SleepInd : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Status_Kl_15 : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Lampe_AutoP : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Bremslicht : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Warnton1 : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Warnton2 : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_AnfShLock : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ EPB_Autoholdlampe : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_QualNeigWi : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_KuppModBer : 45|2@1+ (1,0) [0|3] "" XXX
+ SG_ EP1_HydrHalten : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Fkt_Lampe : 48|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EP1_Warnton : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1_Fehler_BKL : 50|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ EP1_Fehler_gelb : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ EP1__Text : 52|4@1+ (1,0) [0|8] "" Vector__XXX
+ SG_ CHECKSUM : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 1326 Diag_Lenkhilfe: 3 XXX
+ SG_ Werkstattcode__Diag_ : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ Multiplex_Signal__Diag_ : 13|3@1+ (1,0) [0|7] "" XXX
+ SG_ Befehl_Sensorcodierung_Lenkhilf : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Befehl_Kennliniencodierung_Lenk : 8|4@1+ (1,0) [0|0] "" XXX
+ SG_ Befehl_Fehlerspeicher_loeschen : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 1432 Daempfer_1: 2 XXX
+ SG_ Frei_Daempfer_1_4 : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ Textbits_Daempfer : 8|4@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerspeicherbit__Daempfer_1_ : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Systemstatus__Daempfer_1_ : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Daempfer_1_3 : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Status_CDC_Taster : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Daempfer_1_2 : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Status_Daempferregelung_4_1 : 0|3@1+ (1,0) [0|7] "" XXX
+
+BO_ 1392 BSG_Last: 4 XXX
+ SG_ Klimaanlage_abschalten : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ Sitzbelueftung_abschalten : 30|1@1+ (1,0) [0|0] "" XXX
+ SG_ Wischwasserheizung_abschalten : 29|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lenkradheizung_abschalten : 28|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heizbare_Sitze_abschalten : 27|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heizbare_Aussenspiegel_abschalt : 26|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heizbare_Frontscheibe_abschalte : 25|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heizbare_Heckscheibe_abschalten : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Batteriespannung_Bordnetzbatter : 16|8@1+ (0.05,5) [5|17.7] "V" XXX
+ SG_ Motorhaubenkontakt : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Leuchtweitenregulierung : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerspeichereintrag__BSG_Last : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zustand_der_Starterbatterie : 11|2@1+ (1,0) [0|0] "" XXX
+ SG_ Zustand_der_Bordnetzbatterie : 9|2@1+ (1,0) [0|0] "" XXX
+ SG_ LL_Drehzahlanhebung : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_L : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_BSG_Last_1_1 : 4|3@1+ (1,0) [0|0] "" XXX
+ SG_ ZAS_Klemme_50 : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ ZAS_Klemme_X : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ ZAS_Klemme_15 : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ ZAS_Klemme_S : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1136 BSG_Kombi: 5 XXX
+ SG_ Frei_BSG_Kombi_1_3 : 36|4@1+ (1,0) [0|0] "" XXX
+ SG_ Ruecksitzlehne_HR_verr__4_1 : 35|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ruecksitzlehne_HL_verr__4_1 : 34|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerlampe_Lenkhilfe_veraltet : 33|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerlampe_Lenkhilfe__BSG_Komb : 32|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerstatus_Kl__58s : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_58s__BSG_Kombi_ : 24|7@1+ (1,0) [0|100] "%" XXX
+ SG_ Fehlerstatus_Kl__58d : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ Klemme_58d__BSG_Kombi_ : 16|7@1+ (1,0) [0|100] "%" XXX
+ SG_ Unterspannung : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_BSG_Kombi_1_2 : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heckdeckel_geoeffnet : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Motorhaube_geoeffnet : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Tuer_hinten_rechts_geoeffnet : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Tuer_hinten_links_geoeffnet : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Beifahrertuer_geoeffnet : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fahrertuer_geoeffnet : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Lade_Kontrollampe : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_BSG_Kombi_1_1 : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Rueckfahrlicht : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ DWA_Akku : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Warnblink_Mode : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Anhaenger_Kontrollampe : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Blinker_rechts_Kontrollampe : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Blinker_links_Kontrollampe : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 424 Bremse_6: 3 XXX
+ SG_ Checksumme_Bremse_6 : 16|8@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_Bremse_6 : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ Status_Bremsdruck__Bremse_6__du : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Bremse_6_1 : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Bremsdruck__Bremse_6_ : 0|10@1+ (0.3255,-40) [-40|293] "bar" XXX
+
+BO_ 1192 Bremse_5: 8 XXX
+ SG_ CHECKSUM : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 52|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR5_ECD_Lampe : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ BR5_ZT_Rueckk_Umsetz : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Anhi_Sta : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Rollenmodus_Deactiveieren : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Sign_Druck : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Sta_Druck : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Druckvalid : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Stillstand : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Bremsdruck : 16|12@1+ (0.1,0) [0|250] "bar" XXX
+ SG_ BR5_Vorzeichen : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Sta_Gierrate : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Giergeschw : 0|14@1+ (0.01,0) [0|100] "Grad/sec" XXX
+ SG_ BR5_ANB_CM_Rueckk_Umsetz : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_HDC_bereit : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Stat_FallBack_eBKV : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Anforderung_EPB : 36|2@1+ (1,0) [0|3] "" XXX
+ SG_ ESP_Autohold_active : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Autohold_Standby : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Anhi_akt : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_v_Ueberw : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Bremslicht : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Notbremsung : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_Fahrer_tritt_ZBR_Schw : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_AWV2_Bremsruck : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR5_AWV2_Fehler : 47|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 672 Bremse_4: 3 XXX
+ SG_ Frei_Bremse_4_1 : 17|7@1+ (1,0) [0|0] "" XXX
+ SG_ Einheit_Kupplungssteifigkeit : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ ABS_Vorgabewert_hinten_Kupplung : 8|8@1+ (0.7874,0) [0|100] "%" XXX
+ SG_ ABS_Vorgabewert_mitte_Kupplungs : 0|8@1+ (3,-381) [-381|378] "Nm/min" XXX
+
+BO_ 1184 Bremse_3: 8 XXX
+ SG_ Radgeschw__HR_4_1 : 49|15@1+ (0.01,0) [0|326] "km/h" XXX
+ SG_ Frei_Bremse_3_4 : 48|1@1+ (1,0) [0|0] "" XXX
+ SG_ Radgeschw__HL_4_1 : 33|15@1+ (0.01,0) [0|326] "km/h" XXX
+ SG_ Frei_Bremse_3_3 : 32|1@1+ (1,0) [0|0] "" XXX
+ SG_ Radgeschw__VR_4_1 : 17|15@1+ (0.01,0) [0|326] "km/h" XXX
+ SG_ Frei_Bremse_3_2 : 16|1@1+ (0.01,0) [0|325] "km/h" XXX
+ SG_ Radgeschw__VL_4_1 : 1|15@1+ (0.01,0) [0|326] "km/h" XXX
+ SG_ Frei_Bremse_3_1 : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1440 Bremse_2: 8 XXX
+ SG_ gemessene_Querbeschleunigung : 63|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Bremse_2_2 : 62|1@1+ (1,0) [0|0] "" XXX
+ SG_ Impulszahl : 56|6@1+ (1,0) [0|63] "" XXX
+ SG_ Fehlerstatus_Wegimpulse_4_1 : 55|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Bremse_2_5 : 54|1@1+ (1,0) [0|0] "" XXX
+ SG_ Warnlampe_DDS : 53|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerspeichereintrag_Bremse : 52|1@1+ (1,0) [0|0] "" XXX
+ SG_ Wegimpulszaehlerstatus : 51|1@1+ (1,0) [0|0] "" XXX
+ SG_ Wegimpulse_Vorderachse : 40|11@1+ (1,0) [0|2047] "" XXX
+ SG_ Zeitstempel : 24|16@1+ (1,0) [0|65535] "tics" XXX
+ SG_ mittlere_Raddrehzahl__Bremse_2 : 9|15@1+ (0.002,0) [0|65.278] "U/sec" XXX
+ SG_ Querbeschl__TimerTic M : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Timer m1 : 0|8@1+ (0.04,0) [0|10.2] "usec" XXX
+ SG_ Querbeschleunigung m0 : 0|8@1+ (0.01,-1.27) [-1.27|1.27] "g" XXX
+
+BO_ 416 Bremse_1: 8 ABS
+ SG_ BR1_ASR_Anf : 0|1@1+ (1,0) [0|1] "" Motor
+ SG_ BR1_MSR_Anf M : 1|1@1+ (1,0) [0|1] "" Motor
+ SG_ BR1_ABS_Brems : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_EDS_Ongr : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_ESP_Ongr : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_ASR_Ongr : 5|2@1+ (1,0) [0|3] "" Transmission
+ SG_ BR1_EBV_Ongr : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Lampe_ABS : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Lampe_ASR : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Lampe_BK : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Lichtschalt : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_StaDruckschw : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_MAD : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Sta_MAD : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Diagnose : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_BKV_active : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Rad_kmh : 17|15@1+ (0.01,0) [0|326.39] "km/h" XXX
+ SG_ BR1_ASRMo_sl : 32|8@1+ (0.39,0) [0|99.06] "%" Motor
+ SG_ BR1_ASRMo_fa m0 : 40|8@1+ (0.39,0) [0|99.06] "%" Motor
+ SG_ BR1_MSR_Mo_inv m1 : 40|8@1+ (-0.39,99.45) [0|99.06] "%" Motor
+ SG_ BR1_MSR_Mo : 48|8@1+ (0.39,0) [0|99.06] "%" Motor
+ SG_ BR1_Zaehler : 56|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR1_ASR_ESP : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_ESPASR_passive : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Sta_ESP : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR1_Ersatz_Kmh : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 680 Bremsbooster_1: 3 XXX
+ SG_ Fehlerspeichereintrag_Booster : 23|1@1+ (1,0) [0|0] "" XXX
+ SG_ Loseschalter_unplausibel_Boost : 22|1@1+ (1,0) [0|0] "" XXX
+ SG_ Position_Standby : 21|1@1+ (1,0) [0|0] "" XXX
+ SG_ ADR_Relais_ge_ffnet : 20|1@1+ (1,0) [0|0] "" XXX
+ SG_ Status_Bremsbooster_Steuerung : 19|1@1+ (1,0) [0|0] "" XXX
+ SG_ Bremsbooster_verf_gbar : 18|1@1+ (1,0) [0|0] "" XXX
+ SG_ Eingriff_Bremsbooster : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Bremseingriff_Fahrer : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Bremsbooster_1_1 : 12|4@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_Booster_1 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Checksumme_Booster_1 : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 1400 BatMan_1: 1 XXX
+ SG_ Fehlerspeichereintrag__BatMan_ : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Leistungsrelais : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Messung_Starterleitung : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zustand_Starterleitung : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Umschaltrelais_Bordnetzbatterie : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ladung_Starterbatterie : 1|2@1+ (1,0) [0|0] "" XXX
+ SG_ Startmodus : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 704 Allrad_1: 5 XXX
+ SG_ Kupplungssteifigkeit_Hinten__Is : 32|8@1+ (0.7874,0) [0|100] "%" XXX
+ SG_ Fehlerspeichereintrag_Allrad_1 : 31|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Allrad_1_1 : 26|5@1+ (1,0) [0|0] "" XXX
+ SG_ Schaltung_Vorwarnung : 25|1@1+ (1,0) [0|0] "" XXX
+ SG_ Schaltung_aktiv__Allrad_1_ : 24|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ganginfo__PNG_ : 20|4@1+ (1,0) [0|0] "" XXX
+ SG_ PNG_Anzeige_blinkend : 19|1@1+ (1,0) [0|0] "" XXX
+ SG_ PNG_Status_4_1 : 16|3@1+ (1,0) [0|0] "" XXX
+ SG_ Kupplungssteifigkeit_Mitte__Ist : 8|8@1+ (3,-381) [-381|378] "Nm/min" XXX
+ SG_ Einheit_der_Kupplungssteifigkei : 7|1@1+ (1,0) [0|0] "" XXX
+ SG_ Geschwindigkeitsbegrenzung : 6|1@1+ (1,0) [0|0] "" XXX
+ SG_ Allrad_Warnlampe : 5|1@1+ (1,0) [0|0] "" XXX
+ SG_ Notlauf : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kupplung_komplett_offen : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehlerstatus_Kupplungssteifigke : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ubertemperaturschutz__Allrad_1_ : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Fehler_Allrad_Kupplung : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 1360 Airbag_2: 2 XXX
+ SG_ OOP_Beifahrer : 14|2@1+ (1,0) [0|0] "" XXX
+ SG_ OOP_Fahrer : 12|2@1+ (1,0) [0|0] "" XXX
+ SG_ Belegungserkennung_hinten_mitte : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Belegungserkennung_hinten_recht : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Belegungserkennung_hinten_links : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Belegungserkennung_Beifahrersit : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Checksumme_Airbag_2__reserviert : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 80 Airbag_1: 4 XXX
+ SG_ CHECKSUM : 24|8@1+ (1,0) [0|0] "" XXX
+ SG_ COUNTER : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fehlerspeichereintrag : 19|1@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_Airbag_1_2 : 18|1@1+ (1,0) [0|0] "" XXX
+ SG_ Airbag_im_Stellgliedtest : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Airbag_in_Diagnose : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gurtwarnung_Beifahrer : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gurtschalter_Beifahrer : 14|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gurtwarnung_Fahrer : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Gurtschalter_Fahrer : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Airbag_Systemfehler : 11|1@1+ (1,0) [0|0] "" XXX
+ SG_ Kindersitzerkennung : 10|1@1+ (1,0) [0|0] "" XXX
+ SG_ Airbag_deaktiviert : 9|1@1+ (1,0) [0|0] "" XXX
+ SG_ Airbag_Lampe : 8|1@1+ (1,0) [0|0] "" XXX
+ SG_ Crash_Intensitaet : 5|3@1+ (1,0) [0|111] "B" XXX
+ SG_ Rollover : 4|1@1+ (1,0) [0|0] "" XXX
+ SG_ Seiten_Crash_Beifahrer : 3|1@1+ (1,0) [0|0] "" XXX
+ SG_ Seiten_Crash_Fahrer : 2|1@1+ (1,0) [0|0] "" XXX
+ SG_ Heck_Crash : 1|1@1+ (1,0) [0|0] "" XXX
+ SG_ Front_Crash : 0|1@1+ (1,0) [0|0] "" XXX
+
+BO_ 864 ADR_System: 8 XXX
+ SG_ S_Checksumme_ADR_1 : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ S_Frei_ADR_1_1 : 52|4@1+ (1,0) [0|0] "" XXX
+ SG_ S_Zeitluecke_gemessen : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ S_Fehlerspeichereintrag_ADR : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Fehlerspeichereintrag_Bremsbo : 46|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_ADR_Relais_geoeffnet : 45|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Bremsbooster_Status : 43|2@1+ (1,0) [0|0] "" XXX
+ SG_ S_Eingriff_Bremsbooster : 42|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Loeseschalter_unplausibel : 41|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Bremseingriff_Fahrer : 40|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Anzeige_Sensor_blind : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Ansteuerung_optischer_Fahrerh : 38|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Ansteuerung_Gong_2 : 37|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Ansteuerung_Gong_1 : 36|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Schaltaufforderung : 34|2@1+ (1,0) [0|0] "" XXX
+ SG_ S_Anzeige_Prioritaet : 33|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Anzeige_Zeitluecke : 32|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Wunschgeschwindigkeit : 24|8@1+ (1,0) [0|254] "km/h" XXX
+ SG_ S_Objekt_erfasst : 22|2@1+ (1,0) [0|0] "" XXX
+ SG_ S_Gesetzte_Zeitluecke__ADR_1_ : 18|4@1+ (1,0) [0|15] "" XXX
+ SG_ S_Synchronisation_Bremsbooster : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Momentenanforderung_Freigabe : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Verhinderung_Schubabschaltung : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Status_ADR_1__S_ : 13|2@1+ (1,0) [0|0] "" XXX
+ SG_ S_Fehler_ADR_1__S_ : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ S_Zaehler_ADR_1 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ S_Momentenanforderung_ADR : 0|8@1+ (0.39,0) [0|99] "MDI" XXX
+
+BO_ 608 ADR_2: 4 XXX
+ SG_ Frei_ADR_2_2 : 27|5@1+ (1,0) [0|0] "" XXX
+ SG_ Anforderung_Bremsdruck : 16|11@1+ (0.0625,0) [0|127.9375] "bar" XXX
+ SG_ Frei_ADR_2_1 : 14|2@1+ (1,0) [0|0] "" XXX
+ SG_ Relais_Test_Fehler : 13|1@1+ (1,0) [0|0] "" XXX
+ SG_ Standby : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_ADR_2 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Checksumme_ADR_2 : 0|8@1+ (1,0) [0|0] "" XXX
+
+BO_ 1324 ADR_1: 8 XXX
+ SG_ Checksumme_ADR_1 : 56|8@1+ (1,0) [0|0] "" XXX
+ SG_ Frei_ADR_1_5 : 52|4@1+ (1,0) [0|0] "" XXX
+ SG_ Zeitluecke_gemessen : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ Fehlerspeichereintrag_ADR : 47|1@1+ (1,0) [0|0] "" XXX
+ SG_ Reserviert_ADR_1_1 : 40|7@1+ (1,0) [0|0] "" XXX
+ SG_ Anzeige_Sensor_blind : 39|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_optischer_Fahrerhin : 38|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Gong_2 : 37|1@1+ (1,0) [0|0] "" XXX
+ SG_ Ansteuerung_Gong_1 : 36|1@1+ (1,0) [0|0] "" XXX
+ SG_ Schaltaufforderung : 34|2@1+ (1,0) [0|0] "" XXX
+ SG_ Anzeige_Prioritaet : 33|1@1+ (1,0) [0|0] "" XXX
+ SG_ Anzeige_Zeitluecke : 32|1@1+ (1,0) [0|0] "" XXX
+ SG_ Wunschgeschwindigkeit : 24|8@1+ (1,0) [0|254] "km/h" XXX
+ SG_ Objekt_erfasst : 22|2@1+ (1,0) [0|0] "" XXX
+ SG_ Gesetzte_Zeitluecke__ADR_1_ : 18|4@1+ (1,0) [0|15] "" XXX
+ SG_ Synchronisation_Bremsbooster : 17|1@1+ (1,0) [0|0] "" XXX
+ SG_ Momentenanforderung_Freigabe : 16|1@1+ (1,0) [0|0] "" XXX
+ SG_ Verhinderung_Schubabschaltung : 15|1@1+ (1,0) [0|0] "" XXX
+ SG_ Status_ADR_1 : 13|2@1+ (1,0) [0|0] "" XXX
+ SG_ Fehler_ADR_1 : 12|1@1+ (1,0) [0|0] "" XXX
+ SG_ Zaehler_ADR_1 : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ Momentenanforderung_ADR : 0|8@1+ (0.39,0) [0|99] "MDI" XXX
+
+BO_ 1550 Einheiten_1: 2 XXX
+ SG_ MFA_v_Einheit_02 : 0|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 872 ACC_System: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACS_Sta_ADR : 12|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACS_ADR_Schub : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACS_Schubabsch : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACS_StSt_Info : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACS_MomEingriff : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACS_Typ_ACC : 19|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACS_FreigSollB : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACS_Sollbeschl : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX
+ SG_ ACS_Anhaltewunsch : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACS_Fehler : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACS_zul_Regelabw : 40|8@1+ (0.005,0) [0|1.265] "Unit_MeterPerSeconSquar" XXX
+ SG_ ACS_max_AendGrad : 48|8@1+ (0.02,0) [0.02|5.06] "Unit_MeterPerSeconSquar" XXX
+
+BO_ 1386 ACC_GRA_Anzeige: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ ACA_StaACC : 8|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACA_ID_StaACC : 11|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACA_Fahrerhinw : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_AnzDisplay : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_Zeitluecke : 18|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACA_V_Wunsch : 24|8@1+ (1,0) [0|255] "Unit_KiloMeterPerHour" XXX
+ SG_ ACA_kmh_mph : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_Akustik1 : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_Akustik2 : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_PrioDisp : 35|2@1+ (1,0) [0|3] "" XXX
+ SG_ ACA_gemZeitl : 40|4@1+ (1,0) [0|15] "" XXX
+ SG_ ACA_ACC_Verz : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_StaGRA : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ ACA_ID_StaGRA : 51|5@1+ (1,0) [0|31] "" XXX
+ SG_ ACA_Codierung : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_Tachokranz : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ ACA_Aend_Zeitluecke : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX
+
+BO_ 208 Lenkhilfe_3: 6 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ LH3_BS_Spiegel : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ LH3_LM : 16|10@1+ (1,0) [0|1023] "" XXX
+ SG_ LH3_LMSign : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH3_LMValid : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH3_Sta_DSR : 28|4@1+ (1,0) [0|15] "" XXX
+ SG_ LH3_BLW : 32|12@1+ (0.15,0) [0|615] "" XXX
+ SG_ LH3_BLWSign : 44|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH3_BLWValid : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH3_Lenkungstyp : 46|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 978 Lenkhilfe_2: 7 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ LH2_Geradeaus : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH2_Sta_Charisma : 13|3@1+ (1,0) [0|7] "" XXX
+ SG_ LH2_Sta_HCA : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ LH2_Ausg_LW1 : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH2_Ausg_LW1_gue : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ LH2_aktLenkeingriff : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 980 PLA_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ PL1_Status_EPS : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ PL1_ArcAngleReq : 16|15@1+ (0.04375,0) [0|1433.55625] "Unit_DegreeOfArc" XXX
+ SG_ PL1_AngleReqSign : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ PL1_Stat_PLA_ESP : 32|4@1+ (1,0) [0|10] "" Vector__XXX
+ SG_ PL1_Bremsmoment : 40|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" Vector__XXX
+ SG_ PL1_void : 53|11@1+ (1,0) [0|2047] "" XXX
+
+BO_ 982 APD_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ APD_Version : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ APD_Flags : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ APD_SteerRatio : 20|11@1+ (0.01,8) [8|28.47] "" XXX
+ SG_ APD_Wheelbase : 31|11@1+ (1,2000) [2000|4047] "mm" XXX
+ SG_ APD_AngleOffSet : 42|11@1+ (0.01,-10) [-10|10.47] "deg" XXX
+ SG_ APD_GripFactor : 53|11@1+ (0.001,0) [0|2.047] "" XXX
+
+BO_ 983 SNG_1: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ SNG_HandoffActive : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ SNG_DecelReq : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" XXX
+
+BO_ 210 HCA_1: 5 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ HCA_Status : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ LM_Offset : 16|15@1+ (0.03125,0) [0|300] "cNm" XXX
+ SG_ LW_Offset : 16|15@1+ (0.04375,0) [0|1433.55625] "Unit_DegreeOfArc" XXX
+ SG_ LM_OffSign : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ Vib_Freq : 32|4@1+ (4,0) [0|60] "Hz" XXX
+ SG_ Vib_Amp : 36|4@1+ (0.5,0) [0|7.5] "Nm" XXX
+ SG_ HCA_ALC_LW_KeyCipher : 32|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 174 Bremse_9: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ BR9_Sta_ESP_PLA : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR9_LMOffset : 16|15@1+ (0.0003052,0) [0|9.9987] "Nm" XXX
+ SG_ BR9_LMOffSign : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR9_LWOffset : 32|15@1+ (0.04375,0) [0|1433.5] "deg" XXX
+ SG_ BR9_Sta_DSR : 48|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR9_PLA_Abbruch : 52|3@1+ (1,0) [0|7] "" XXX
+ SG_ BR9_LWOffSign : 55|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 644 Motor_Bremse: 6 XXX
+ SG_ MOB_Standby : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ MOB_Freigabe : 14|1@1+ (1,0) [0|1] "" BCM_Gateway,Bremse_MK25AESP,Gateway_separat
+ SG_ MOB_Anhaltewunsch : 13|1@1+ (1,0) [0|1] "" Bremse_MK25AESP,Getriebe_DQ
+ SG_ MOB_CHECKSUM : 0|8@1+ (1,0) [0|255] "" Bremse_MK25AESP
+ SG_ MOB_COUNTER : 8|4@1+ (1,0) [0|15] "" Bremse_MK25AESP
+ SG_ TSK_v_Begrenzung_aktiv : 15|1@0+ (1,0) [0|1] "" XXX
+ SG_ TSK_ax_Getriebe_01 : 40|8@1+ (0.048,0) [0|255] "m/s2" XXX
+ SG_ MOB_Bremsstgr : 16|11@1+ (0.048852,0) [0|100] "Unit_PerCent" Vector__XXX
+ SG_ MOB_Bremsmom : 27|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" Bremse_MK25AESP
+
+BO_ 870 AWV: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX
+ SG_ AWV_Text : 12|4@1+ (1,0) [0|14] "" Vector__XXX
+ SG_ AWV_1_Freigabe : 16|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_1_Prefill : 17|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_1_Parameter : 18|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ AWV_only : 20|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_CityANB_Auspraegung : 21|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_Halten : 22|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ANB_Teilbremsung_Freigabe : 23|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Status : 24|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Fehler : 25|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_SU_Warnzeit : 26|2@1+ (1,0) [0|3] "" Vector__XXX
+ SG_ AWV_2_SU_Bremsruck : 28|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_SU_Gong : 29|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_SU_Lampe : 30|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Umfeldwarn : 31|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Freigabe : 32|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Ruckprofil : 33|3@1+ (1,0) [0|7] "" Vector__XXX
+ SG_ AWV_2_Warnton : 36|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Warnsymbol : 37|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_Infoton : 38|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Gurtstraffer : 39|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_Konfiguration_Menueanf : 40|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_Konfiguration_Vorw_Menueanf : 41|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_Konfiguration_Status : 42|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_Konfiguration_Vorw_Status : 43|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ AWV_2_Abstandswarnung : 51|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ANB_Zielbremsung_Freigabe : 52|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ANB_CM_Anforderung : 53|1@1+ (1,0) [0|1] "" Vector__XXX
+ SG_ ANB_Ziel_Teilbrems_Verz_Anf : 54|10@1+ (0.024,-20.016) [0|1023] "Unit_MeterPerSeconSquar" Vector__XXX
+
+BO_ 1470 LDW_Status: 8 XXX
+ SG_ LDW_Lernmodus_rechts : 0|2@1+ (1,0) [0|3] "" XXX
+ SG_ LDW_Lernmodus_links : 2|2@1+ (1,0) [0|3] "" XXX
+ SG_ LDW_Lernmodus : 9|3@1+ (1,0) [0|3] "" XXX
+ SG_ LDW_Textbits : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ LDW_Gong : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ LDW_Kameratyp : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_Lampe_gelb : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_Lampe_gruen : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_SW_Warnung_links : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_SW_Warnung_rechts : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_KD_Fehler : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_DLC : 24|8@1+ (0.01,-1.25) [-1.25|1.25] "" XXX
+ SG_ LDW_TLC : 32|5@1+ (0.1,0) [0|3] "" XXX
+ SG_ LDW_Seite_DLCTLC : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ LDW_Frueh_Spaet : 38|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 428 Bremse_8: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ BR8_Sta_ACC_Anf : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Verz_EPB_akt : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Sta_Br_temp : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Sta_Br_Druck : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_HHC_Haltebestaetigung : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_HHC_Signal_QBit : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_MKB_ausloesbar : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESP_Haltebestaetigung : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ ESC_Motorstartverzeogerung : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Istbeschl : 32|9@1+ (0.02,-7.22) [-7.22|2.98] "Unit_MeterPerSeconSquar" XXX
+ SG_ BR8_Sta_HW_BLS : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_QB_LBeschl : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_ESC_Mode : 43|2@1+ (1,0) [0|3] "" XXX
+ SG_ BR8_aktBrSyst : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Fa_bremst : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_StaBrSyst : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Laengsbeschl : 48|10@1+ (0.03125,-16) [-15.96875|15.9375] "Unit_MeterPerSeconSquar" XXX
+ SG_ BR8_Sta_ADR_BR : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Quattro : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Sta_VerzReg : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Sta_BLS : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Verz_EPB : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ BR8_Check_EPB : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 928 Bremse_10: 8 XXX
+ SG_ B10_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ B10_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ B10_QB_Wegimp_VL : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_QB_Wegimp_VR : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_QB_Wegimp_HL : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_QB_Wegimp_HR : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_Wegimp_VL : 16|10@1+ (1,0) [0|1000] "" XXX
+ SG_ B10_Wegimp_VR : 26|10@1+ (1,0) [0|1000] "" XXX
+ SG_ B10_Wegimp_HL : 36|10@1+ (1,0) [0|1000] "" XXX
+ SG_ B10_Wegimp_HR : 46|10@1+ (1,0) [0|1000] "" XXX
+ SG_ B10_QB_Fahrtr_VL : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_QB_Fahrtr_VR : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_QB_Fahrtr_HL : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_QB_Fahrtr_HR : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_Fahrtr_VL : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_Fahrtr_VR : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_Fahrtr_HL : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ B10_Fahrtr_HR : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 170 Blinkmodi_02: 8 XXX
+ SG_ Hazard_Switch : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ BM_links : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ BM_rechts : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Turn_Exterior_Bulb_1 : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Turn_Exterior_Bulb_1 : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ Left_Turn_Exterior_Bulb_2 : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ Right_Turn_Exterior_Bulb_2 : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ Fast_Send_Rate_Active : 37|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 835 RDK_Status: 3 XXX
+ SG_ RKS_Reifen_VL : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Reifen_VR : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Reifen_HL : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Reifen_HR : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Reifen_RR : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Warnung_2 : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Warnung_1 : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Systemfehler : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Kalibrier_abgew : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Druckdiff_Vorn : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Druckdiff_Hinten : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Befuellung_RR_low : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Funkstoerung : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_System_Aus : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_KD_Fehler : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Lampe : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Ton : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Gong : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_RDK_Blinkbit : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ RKS_Teillast : 20|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 914 Gate_Komf_2: 8 XXX
+ SG_ GK2_Sta_LSM : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_Lichtsensor : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_Licht1 : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_VSG : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_Schluessel : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_Profil : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_Clima2 : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_BSG4 : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Sta_Kessy_4 : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ BS4_Gleitende_Leuchtw_Anf : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ BS4_GLW_Fernlicht_Anf : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Blk_L_Kontrolle : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Blk_R_Kontrolle : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_LS_KomFehler : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_LS_def : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Helligkeit : 16|3@1+ (714.286,0) [0|5000.002] "Unit_Lux" XXX
+ SG_ GK2_VD_zu_ver : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_VD_entriegelt : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_VD_offen_ver : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Verdeck_Anf : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_VDKD_auf : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Schluessel : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ GK2_Hardtop : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_AFL_Schalter : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Nebelschluss : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_EM_LIN_ungueltig : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ GK2_Profil : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ GK2_Kl_StSt_Info : 36|2@1+ (1,0) [0|3] "" XXX
+ SG_ GK2_BSG_StSt_Info : 38|2@1+ (1,0) [0|3] "" XXX
+ SG_ GK2_BEM_P_Generator : 40|8@1+ (50,0) [0|12700] "Unit_Watt" XXX
+ SG_ GK2_BEM_Abschaltstufen : 48|3@1+ (1,0) [0|7] "" XXX
+ SG_ GK2_BEM_DFM : 51|5@1+ (3.225,0.025) [0.025|100] "Unit_PerCent" XXX
+ SG_ GK2_Kessy_StSt_Info : 56|2@1+ (1,0) [0|3] "" XXX
+ SG_ GK2_BEM_StSt_Info : 58|2@1+ (1,0) [0|3] "" XXX
+
+BO_ 954 SWA_1: 8 SWA
+ SG_ SWA_Textbits : 12|4@1+ (1,0) [0|15] "" XXX
+ SG_ SWA_Gong : 16|2@1+ (1,0) [0|3] "" XXX
+ SG_ SWA_Sta_passiv : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Sta_aktiv : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Warnung_SWA_li : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_Warnung_SWA_re : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ SWA_KD_Fehler : 59|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1175 Parkhilfe_01: 8 XXX
+ SG_ PH_Abschaltursache : 13|3@1+ (1,0) [0|7] "" XXX
+ SG_ PH_Opt_Anzeige_V_ein : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Opt_Anzeige_H_ein : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Opt_Anz_V_Hindernis : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Opt_Anz_H_Hindernis : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Tongeber_V_aktiv : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Tongeber_H_aktiv : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Tongeber_mute : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Anf_Audioabsenkung : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Frequenz_hinten : 32|4@1+ (1,0) [0|15] "" XXX
+ SG_ PH_Lautstaerke_hinten : 36|4@1+ (1,0) [0|15] "" XXX
+ SG_ PH_Frequenz_vorn : 40|4@1+ (1,0) [0|15] "" XXX
+ SG_ PH_Lautstaerke_vorn : 44|4@1+ (1,0) [0|15] "" XXX
+ SG_ PH_Trigger_Bildaufschaltung : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_StartStopp_Info : 49|2@1+ (1,0) [0|3] "" XXX
+ SG_ PH_Aufbauten_erk : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_BerErk_vorn : 52|2@1+ (1,0) [0|3] "" XXX
+ SG_ PH_BerErk_hinten : 54|2@1+ (1,0) [0|3] "" XXX
+ SG_ PH_defekt : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_gestoert : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ PH_Systemzustand : 58|3@1+ (1,0) [0|7] "" XXX
+ SG_ PH_Display_Kundenwunsch : 61|2@1+ (1,0) [0|3] "" XXX
+ SG_ PH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1463 Bremse_11: 8 XXX
+ SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
+ SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
+ SG_ B11_HydHalten : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ B11_Br_StSt_Info : 14|2@1+ (1,0) [0|3] "" XXX
+ SG_ B11_OBD_Nib_VL : 16|4@1+ (1,0) [0|15] "" XXX
+ SG_ B11_OBD_Nib_VR : 20|4@1+ (1,0) [0|15] "" XXX
+ SG_ B11_OBD_Nib_HL : 24|4@1+ (1,0) [0|15] "" XXX
+ SG_ B11_OBD_Nib_HR : 28|4@1+ (1,0) [0|15] "" XXX
+ SG_ B11_EPB_Steller_akt : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ B11_EPB_Steller_gue : 33|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1500 Soll_Verbauliste_neu: 8 XXX
+ SG_ VL1_Motor_SG : 0|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Getr_SG : 1|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_ABS : 2|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Kombi : 3|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_LSM : 4|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Airbag : 5|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Lenkhilfe : 6|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_dyn_LWR : 7|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_res_08 : 8|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Allrad : 9|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_ADR : 10|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_ADR_getrennt : 11|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_EPB : 12|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_res_13 : 13|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Daempfer : 14|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Quersperre : 15|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_MotorSlave : 16|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_SWA : 17|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_HCA : 18|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_RKA_Plus : 19|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_PLA : 20|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_WFS_KBI : 21|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Kombi_KBI : 22|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Soll_eq_Ist : 23|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_BSG_Komf : 24|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_ZKE : 25|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_TSG_FT : 26|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_TSG_BT : 27|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_TSG_HL : 28|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_TSG_HR : 29|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Memory : 30|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Dachmodul_K : 31|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Zentralelektrik_II : 32|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_RDK : 33|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Lenksaeule : 34|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Gateway : 35|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Clima_Komf : 36|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Einparkhilfe : 37|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_PTC_Heizung : 38|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Standheiz : 39|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Verdeck : 40|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_RSE_I : 41|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_res_42 : 42|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_MDI_I : 43|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Anhaenger : 44|1@1+ (1,0) [0|1] "" SWA
+ SG_ VL1_Memory_BF : 45|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Easy_Entry_VF : 46|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Easy_Entry_VB : 47|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Heckdeckel : 48|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Rearview : 49|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Sonderfzg_SG : 50|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Tastenmodul : 51|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Kompass : 52|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_WFS_K : 53|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_GSM_Pager : 54|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_InfoElektronik : 55|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_DSP : 56|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_DAB : 57|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Telematik : 58|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Navigation : 59|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_TV_Tuner : 60|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Neigungsmodul_I : 61|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Radio : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ VL1_Telefon : 63|1@1+ (1,0) [0|1] "" XXX
+
+BO_ 1490 Ident: 8 XXX
+ SG_ IDT_Mux M : 0|2@1+ (1,0) [0|2] "" XXX
+ SG_ IDT_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" XXX
+ SG_ IDT_VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" XXX
+
+BO_ 2000 Diagnose_1: 8 XXX
+ SG_ DI1_VerlernZaehl : 0|8@1+ (1,0) [0|254] "" XXX
+ SG_ DI1_km_Stand : 8|20@1+ (1,0) [0|1048575] "Unit_KiloMeter" XXX
+ SG_ DI1_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" XXX
+ SG_ DI1_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" XXX
+ SG_ DI1_Tag : 39|5@1+ (1,0) [0|31] "Unit_Day" XXX
+ SG_ DI1_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" XXX
+ SG_ DI1_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" XXX
+ SG_ DI1_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" XXX
+ SG_ DI1_KM_Stand_alt : 62|1@1+ (1,0) [0|1] "" XXX
+ SG_ DI1_Zeit_alt : 63|1@1+ (1,0) [0|1] "" XXX
+
+CM_ SG_ 80 Checksumme_Airbag_1 "Checksum Airbag_1";
+CM_ SG_ 80 Zaehler_Airbag_1 "Counter Airbag_1";
+
+CM_ BO_ 194 "Steering wheel angle message 1 - Contains steering angle, speed, and status information";
+
+CM_ SG_ 194 LW1_LRW "Steering wheel angle (0 = straight ahead, 7FFFh = stop)";
+CM_ SG_ 194 LW1_LRW_Sign "Steering angle sign: 0=positive (left), 1=negative (right)";
+CM_ SG_ 194 LW1_Lenk_Gesch "Steering wheel angular velocity (0 = no movement, 7FFFh = max speed)";
+CM_ SG_ 194 LW1_Gesch_Sign "Angular velocity sign: 0=positive, 1=negative";
+CM_ SG_ 194 LW1_ID "Calibration ID - 0=not calibrated, 128=calibrated (PQ35/46/VW32x/VW411)";
+CM_ SG_ 194 LW1_Initquelle "Initialization source";
+CM_ SG_ 194 LW1_Status "Sensor status";
+CM_ SG_ 194 LW1_Sta_KL30 "Terminal 30 status (Kostal sensor)";
+CM_ SG_ 194 LW1_Zaehler "Free running message counter";
+CM_ SG_ 194 LW1_Kodier "Coding data (multiplex output depends on counter)";
+CM_ SG_ 194 LW1_CRC "Checksum - One's complement of 8-bit sum of bytes 1,2,3,4,6";
+
+CM_ SG_ 210 LM_Offset "centiNewton-meters for ease of calculation without FP math in Panda";
+CM_ SG_ 210 Vib_Amp "Steering wheel haptic, amplitude";
+CM_ SG_ 210 Vib_Freq "Steering wheel haptic, frequency";
+CM_ SG_ 210 HCA_ALC_LW_KeyCipher "Private PQ ALC cipher byte. Valid on the private HCA_Status 8/3 path only.";
+CM_ SG_ 416 BR1_ASR_Anf "ASR request to engine - requests in bytes 5 and 6 to be executed";
+CM_ SG_ 416 BR1_MSR_Anf "MSR request - when set, byte 6 contains inverse MSR torque";
+CM_ SG_ 416 BR1_ABS_Brems "ABS control active (including pressure reduction)";
+CM_ SG_ 416 BR1_EDS_Ongr "Electronic differential lock intervention";
+CM_ SG_ 416 BR1_ESP_Ongr "ESP driving dynamics control intervention";
+CM_ SG_ 416 BR1_ASR_Ongr "ASR transmission switching influence";
+CM_ SG_ 416 BR1_EBV_Ongr "Electronic brake force distribution intervention";
+CM_ SG_ 416 BR1_Lampe_ABS "ABS safety warning lamp";
+CM_ SG_ 416 BR1_Lampe_ASR "ASR/ESP lamp (including flashing info)";
+CM_ SG_ 416 BR1_Lampe_BK "Brake control lamp (red)";
+CM_ SG_ 416 BR1_Lichtschalt "Brake light switch / brake pressure threshold exceeded";
+CM_ SG_ 416 BR1_StaDruckschw "Brake test switch / pressure threshold status";
+CM_ SG_ 416 BR1_MAD "OBD rough road suppression";
+CM_ SG_ 416 BR1_Sta_MAD "Rough road suppression status";
+CM_ SG_ 416 BR1_Diagnose "ABS diagnosis mode active";
+CM_ SG_ 416 BR1_BKV_active "Active brake booster installed and not faulty";
+CM_ SG_ 416 BR1_Rad_kmh "Vehicle speed (mean of driven wheels or ABS reference)";
+CM_ SG_ 416 BR1_ASRMo_sl "ASR engagement torque slow (0-99.06%)";
+CM_ SG_ 416 BR1_ASRMo_fa "ASR engagement torque fast when MSR_Anf=0 (0-99.06%)";
+CM_ SG_ 416 BR1_MSR_Mo_inv "Inverse MSR torque when MSR_Anf=1 (99.06-0%)";
+CM_ SG_ 416 BR1_MSR_Mo "MSR engagement torque (0-99.06%)";
+CM_ SG_ 416 BR1_Zaehler "Message counter to mark intervention moment";
+CM_ SG_ 416 BR1_ASR_ESP "Control unit type: 0=ABS/EDS, 1=ASR/ESP/MABS";
+CM_ SG_ 416 BR1_ESPASR_passive "ESP/ASR passive or deactivated by driver";
+CM_ SG_ 416 BR1_Sta_ESP "ESP error status (fault memory entry)";
+CM_ SG_ 416 BR1_Ersatz_Kmh "Speed is substitute value (sensor defect)";
+
+CM_ SG_ 640 inneres_Motor_Moment "Engine Indicated Torque";
+CM_ SG_ 640 Fahrerwunschmoment "Driver Requested Torque";
+CM_ SG_ 640 mechanisches_Motor_Verlustmomen "Mechanical Torque Loss";
+CM_ SG_ 640 Fahrpedalwert_oder_Drosselklapp "Accelerator Pedal or Throttle Position";
+CM_ SG_ 640 Motordrehzahl "Engine Speed";
+CM_ SG_ 640 Momentenangaben_ungenau "Approximate Torque Values";
+CM_ SG_ 640 inneres_Motor_Moment_ohne_exter "Inner torque without external";
+
+CM_ SG_ 644 MOB_CHECKSUM "Checksum MOB";
+CM_ SG_ 644 MOB_COUNTER "Counter MOB";
+
+CM_ BO_ 648 "Motor message 2 - Contains engine status, temperatures, and torque information";
+CM_ SG_ 648 MO2_Mp_Code "Multiplex code - switches after 4 transmissions";
+CM_ SG_ 648 MO2_Getr_Code "Transmission code (multiplex value when Mp_Code=2)";
+CM_ SG_ 648 MO2_max_Mo "Maximum torque MDI (multiplex value when Mp_Code=3)";
+CM_ SG_ 648 MO2_CAN_Vers "CAN version (multiplex value when Mp_Code=0)";
+CM_ SG_ 648 MO2_Motor_Code "Motor code (multiplex value when Mp_Code=1)";
+CM_ SG_ 648 MO2_Kuehlm_T "Engine coolant temperature or substitute value";
+CM_ SG_ 648 MO2_BLS "Brake light switch - unfiltered raw signal";
+CM_ SG_ 648 MO2_BTS "Brake test switch";
+CM_ SG_ 648 MO2_Sta_Kuehlm "Coolant temperature status - 0=OK, 1=Not OK";
+CM_ SG_ 648 MO2_Sta_Klima "Air conditioning compressor status";
+CM_ SG_ 648 MO2_Sta_No_Bet "Normal operation status (Terminal 15 on, init complete)";
+CM_ SG_ 648 MO2_Status_TSK "Drive train coordinator status";
+CM_ SG_ 648 MO2_Sta_GRA "GRA/ACC status";
+CM_ SG_ 648 TSK_Limiter_ausgewaehlt "Speed limiter selected";
+CM_ SG_ 648 MO2_GRAregelt "GRA regulating to displayed speed";
+CM_ SG_ 648 MO2_Sport_Error "Sport mode error (Porsche Cayenne)";
+CM_ SG_ 648 MO2_OffRoad "OffRoad mode active";
+CM_ SG_ 648 MO2_RME_Gehalt "Rapeseed oil methyl ester content (diesel)";
+CM_ SG_ 648 MO2_GRA_Soll "GRA target speed setpoint";
+CM_ SG_ 648 MO2_LL_Solldz "Idle target speed";
+CM_ SG_ 648 MO2_Begr_Mo "Limiting torque - max possible at speed";
+CM_ SG_ 648 MO2_Mo_ZWR "Minimum engine torque with ignition angle retardation";
+
+CM_ SG_ 896 MO3_Vorgluehen "Pre-glow active (diesel engines)";
+CM_ SG_ 896 MO3_Prio_Dz "Engine speed priority: 0=request, 1=mandatory";
+CM_ SG_ 896 MO_Schalter_StartStopp "Start/stop deactivated by driver (LED on when 0)";
+CM_ SG_ 896 MO3_Winterprg "Winter driving program active";
+CM_ SG_ 896 MO3_Sta_Pedal "Accelerator pedal status: 0=OK, 1=substitute value";
+CM_ SG_ 896 MO3_Sta_FPG "Accelerator pedal gradient control bit (multiplexer for byte 8)";
+CM_ SG_ 896 MO3_Sign_FPG "Accelerator pedal gradient sign (only when MO3_Sta_FPG=1)";
+CM_ SG_ 896 MO3_Sta_Temp "Intake air temperature status: 0=OK, 1=substitute value";
+CM_ SG_ 896 MO3_Offsentemp "Intake air temperature";
+CM_ SG_ 896 MO3_Pedalwert "Accelerator pedal raw signal (0-101.6%)";
+CM_ SG_ 896 MO3_Rad_Wu_Mo "Wheel torque request (12-bit value, 0-1596.66% MDI)";
+CM_ SG_ 896 MO3_Vorz_RadWu "Wheel torque sign: 0=positive, 1=negative";
+CM_ SG_ 896 MO3_Freigabe_Segeln "Sailing operation enable for transmission";
+CM_ SG_ 896 MO_StartStopp_StoppVorbereitung "Engine stop in preparation";
+CM_ SG_ 896 MO3_Dz_Beeinfl "Engine speed influence factor (0-100% interpolation)";
+CM_ SG_ 896 MO3_WunschDz "Desired engine speed (when MO3_Prio_Dz=1)";
+CM_ SG_ 896 MO3_DKW "Throttle valve position when MO3_Sta_FPG=0 (0-101.6%)";
+CM_ SG_ 896 MO3_FPGradient "Accelerator pedal gradient when MO3_Sta_FPG=1 (0-6350%/s)";
+
+CM_ SG_ 912 GK1_Fa_Tuerkont "Status of the driver's door rotary latch";
+CM_ SG_ 912 BSK_HL_geoeffnet "Status of the rear left door rotary latch";
+CM_ SG_ 912 BSK_HR_geoeffnet "Status of the rear right door rotary latch";
+CM_ SG_ 912 BSK_BT_geoeffnet "Status of the passenger door rotary latch";
+CM_ SG_ 912 BSK_HD_Hauptraste "Status of trunk lid main detent";
+
+CM_ BO_ 1088 "Getriebe 1 - Contains gear status, torque requests, and control signals";
+
+CM_ SG_ 1088 GE1_Schaltung "Gear shift active: 0=no shift, 1=shift in progress";
+CM_ SG_ 1088 GE1_Sta_Schutz "Transmission/converter protection request (power reduction or ignition angle)";
+CM_ SG_ 1088 GE1_Klimakompr "AC compressor off request";
+CM_ SG_ 1088 GE1_WK "Torque converter clutch status";
+CM_ SG_ 1088 GE1_StSt_Info "Start/stop coordinator info";
+CM_ SG_ 1088 GE1_EGS_Anf "EGS request - byte 4 becomes valid when set";
+CM_ SG_ 1088 GE1_Zielgang "Target gear when shifting or current gear";
+CM_ SG_ 1088 GE1_Wahl_Pos "Selector lever position / driving program";
+CM_ SG_ 1088 GE1_Mrad_Mkurb "Wheel torque to crankshaft torque ratio (Mrad/Mcrank)";
+CM_ SG_ 1088 GE1_Soll_Mo "Internal target engine torque request (0-99.06%)";
+CM_ SG_ 1088 GE1_Fahrwistd "Driving resistance index (normalized % slope)";
+CM_ SG_ 1088 GE1_Notlauf "Emergency mode status";
+CM_ SG_ 1088 GE1_Kuehlung "Cooling request level";
+CM_ SG_ 1088 GE1_Sta_OBD "OBD status - MIL lamp control";
+CM_ SG_ 1088 GE1_LaunchControl "Launch control active";
+CM_ SG_ 1088 GE1_Infobit "Transmission type: 0=stepped automatic, 1=CVT";
+CM_ SG_ 1088 GE1_SleepInd "Sleep readiness after terminal 15 off";
+CM_ SG_ 1088 GE1_Zaehler "Message counter (synchronized with Getriebe_2)";
+CM_ SG_ 1088 GE1_Fehlereintr "Fault memory entry present";
+CM_ SG_ 1088 GE1_WaVerl_Mo "Transmission torque loss / clutch torque (0-99.06%)";
+
+CM_ SG_ 1056 Fehlerstatus_Aussentemp__4_1 "ambient temp error";
+CM_ SG_ 1056 Fehlerstatus_Oeltemperatur_4_1 "oil temp error";
+CM_ SG_ 1056 Fehlerst__Kuehlmitteltemp__4_1 "water temp error";
+CM_ SG_ 1056 Aussentemperatur_gefiltert "outside temp, filtered";
+CM_ SG_ 1056 Oeltemperatur_4_1 "kombi oil temperature";
+CM_ SG_ 1056 Kuehlmitteltemp__4_1__Kombi_2_ "kombi coolant temperature";
+
+CM_ SG_ 1096 Zaehler_Waehlhebel_1 "Counter Waehlhebel_1";
+
+CM_ BO_ 1152 "Motor message 5 - Contains engine type, consumption, lamps, and diagnostic info";
+
+CM_ SG_ 1152 MO5_Mp_Code "Multiplex selector - switches every 4 transmissions";
+CM_ SG_ 1152 MO5_max_Moment "Maximum torque when Mp_Code=0 (0-630 Nm)";
+CM_ SG_ 1152 MO5_Drehzahl "Engine speed at max torque when Mp_Code=1 (0-6300 RPM)";
+CM_ SG_ 1152 MO5_Motortyp "Engine type info when Mp_Code=2 (cylinder count, turbo, fuel type)";
+CM_ SG_ 1152 MO5_Abgastyp "Exhaust type EOBD when Mp_Code=3";
+CM_ SG_ 1152 MO5_Abgastyp2 "Exhaust type OBD when Mp_Code=3";
+CM_ SG_ 1152 MO5_Abgastyp3 "DPF installed when Mp_Code=3";
+CM_ SG_ 1152 OBD_Kaltstart_Denominator "Cold start denominator increment when Mp_Code=3";
+CM_ SG_ 1152 OBD_Minimum_Trip "Minimum normalized trip when Mp_Code=3";
+CM_ SG_ 1152 MO5_DPF_reg "DPF regenerating when Mp_Code=3";
+CM_ SG_ 1152 MO5_Vorgluehen "Diesel pre-glow lamp";
+CM_ SG_ 1152 MO5_E_Gas "E-Gas system lamp (petrol only)";
+CM_ SG_ 1152 MO5_OBD_2 "OBD/MIL lamp control";
+CM_ SG_ 1152 MO5_Heissl "Coolant overheat warning lamp";
+CM_ SG_ 1152 MO5_KlimaKompr "AC compressor off request";
+CM_ SG_ 1152 MO5_Feld_kuehl "Map cooling installed and OK";
+CM_ SG_ 1152 MO5_KliKo_Red "AC compressor power reduction";
+CM_ SG_ 1152 MO5_Verbrauch "Fuel consumption counter (15-bit, µl)";
+CM_ SG_ 1152 MO5_UeberlVerb "Consumption counter overflow";
+CM_ SG_ 1152 MO5_Luefter "Cooling fan PWM control (0-101.6%)";
+CM_ SG_ 1152 MO5_HLeuchte "Overheat pre-warning";
+CM_ SG_ 1152 MO5_PartikelLamp "Particle filter lamp";
+CM_ SG_ 1152 MO5_Sta_BKU "Brake vacuum pump status (Porsche only)";
+CM_ SG_ 1152 MO5_TypStartSteu "Starter control type: 0=BSG/BCM, 1=MSG";
+CM_ SG_ 1152 MO5_TDE_Lampe "Fuel cap warning lamp (petrol only)";
+CM_ SG_ 1152 MO5_TDE_Text "Fuel cap text display (petrol only)";
+CM_ SG_ 1152 MO5_DZM_Daempf "RPM gauge damping control";
+CM_ SG_ 1152 MO5_Interlock "Interlock switch for manual transmission start";
+CM_ SG_ 1152 MO5_Start "Automatic start permission";
+CM_ SG_ 1152 MO5_Anlasser "Starter control permission";
+CM_ SG_ 1152 MO5_GRA_Hauptsch "GRA main switch / readiness";
+CM_ SG_ 1152 MO5_Momente "MDI torque values doubled";
+CM_ SG_ 1152 MO5_Motortext1 "Text: Engine workshop";
+CM_ SG_ 1152 MO5_Motortext2 "Text: Exhaust workshop (deprecated)";
+CM_ SG_ 1152 MO5_Motortext3 "Text: Fuel system fault";
+CM_ SG_ 1152 MO5_Motortext4 "Text: Particle filter needs regeneration";
+CM_ SG_ 1152 CHECKSUM "Checksum with final value 0x0";
+
+CM_ SG_ 1160 Zaehler_Motor_6 "Counter Motor_6";
+CM_ SG_ 1160 Hoeheninfo__Motor_6_ "Altitude Correction";
+CM_ SG_ 1160 Istmoment_f_r_Getriebe "Actual torque for gear";
+CM_ SG_ 1160 Sollmoment_f_r_Getriebe "Target torque for gearbox";
+CM_ SG_ 1160 Checksumme_Motor_6 "Checksum Motor_6";
+CM_ SG_ 1160 GRA_Sollbeschleunigung "GRA target acceleration";
+CM_ SG_ 1160 Ruckmeldung_Momenten "Feedback torque-integral gear intervention";
+
+CM_ SG_ 1344 Zahler_Getriebe_2 "Counter Getriebe_2";
+CM_ SG_ 1344 Hochschaltlampe "Upshift Flag";
+
+CM_ SG_ 1386 ACA_V_Wunsch "255=unset";
+
+CM_ SG_ 1408 Zaehler_Motor_Flexia "Counter Motor_Flexia";
+CM_ SG_ 1408 Verbrennungsart "Type of combustion";
+CM_ SG_ 1408 Max_Drehmoment "Maximum torque";
+CM_ SG_ 1408 Drehzahl_MaxNorm "RPM of maximum torque";
+CM_ SG_ 1408 Hubraum "Displacement";
+CM_ SG_ 1408 Anzahl_Zylinder "Number of cylinders";
+CM_ SG_ 1408 Anzahl_Ventile "Number of valves";
+CM_ SG_ 1408 Ansaugsystem "Induction System";
+CM_ SG_ 1408 Motorleistung "Maximum engine power";
+
+CM_ SG_ 1416 Ladedruck "Boost Pressure";
+CM_ SG_ 1416 Motordrehzahlgradient "Engine speed gradient";
+CM_ SG_ 1416 Hoeheninfo__Motor_7_ "Altitude correction factor";
+CM_ SG_ 1416 Oltemperatur "Oil temperature";
+
+CM_ SG_ 1470 LDW_Direction "0=right,1=left";
+CM_ SG_ 1470 XX_DLCORTLC1 "Might be DLC or TLC";
+CM_ SG_ 1470 XX_DLCORTLC2 "Might be DLC or TLC, might have wrong size";
+
+CM_ SG_ 1550 MFA_v_Signal_02 "0=km/h, 1=mph";
+
+SG_MUL_VAL_ 416 BR1_ASRMo_fa BR1_MSR_Anf 0-0;
+SG_MUL_VAL_ 416 BR1_MSR_Mo_inv BR1_MSR_Anf 1-1;
+
+SG_MUL_VAL_ 896 MO3_DKW MO3_Sta_FPG 0-0;
+SG_MUL_VAL_ 896 MO3_FPGradient MO3_Sta_FPG 1-1;
+SG_MUL_VAL_ 896 MO3_Sign_FPG MO3_Sta_FPG 1-1;
+
+VAL_ 194 LW1_LRW_Sign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen";
+VAL_ 194 LW1_Gesch_Sign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen";
+VAL_ 194 LW1_ID 0 "noch_not_kalibriert" 128 "kalibriert_nur_bei_PQ35_46_VW32x_VW411";
+VAL_ 194 LW1_Initquelle 0 "Bremse_3" 1 "EPS_Bit";
+VAL_ 194 LW1_Status 0 "OK" 1 "no_initial" 2 "sporadic_failure" 3 "permanent_failure";
+VAL_ 194 LW1_Sta_KL30 0 "ok" 1 "no_init_s";
+
+VAL_ 416 BR1_ASR_Anf 0 "no_requirement" 1 "ASR_requirement";
+VAL_ 416 BR1_MSR_Anf 0 "no_requirement" 1 "MSR_requirement";
+VAL_ 416 BR1_ABS_Brems 0 "no_ABS_control" 1 "ABS_control";
+VAL_ 416 BR1_EDS_Ongr 0 "no_EDS_intervention" 1 "EDS_intervention";
+VAL_ 416 BR1_ESP_Ongr 0 "no_ESP_intervention" 1 "ESP_intervention";
+VAL_ 416 BR1_ASR_Ongr 0 "no_requirement" 1 "ASR_shift_map" 2 "Downshift" 3 "Switching_ban";
+VAL_ 416 BR1_EBV_Ongr 0 "no_EBV_intervention" 1 "EBV_intervention";
+VAL_ 416 BR1_Lampe_ABS 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 416 BR1_Lampe_ASR 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 416 BR1_Lampe_BK 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 416 BR1_Lichtschalt 0 "no_Bremsen_Schw_unterschr" 1 "Bremse_betaetigt_Schw_ueberschr";
+VAL_ 416 BR1_StaDruckschw 0 "Sta_guel_BKV_n_angest_k_Br" 1 "Sta_n_verf_BKV_angest_Br";
+VAL_ 416 BR1_MAD 0 "no_Offblendung" 1 "Offblendung";
+VAL_ 416 BR1_Sta_MAD 0 "valid" 1 "invalid";
+VAL_ 416 BR1_Diagnose 0 "no" 1 "in_Diagnose";
+VAL_ 416 BR1_BKV_active 0 "BKV_not_installed_or_fault" 1 "BKV_installed_and_not_fault";
+VAL_ 416 BR1_ASR_ESP 0 "ABS_ABS_EDS" 1 "ASR_ESP_MABS";
+VAL_ 416 BR1_ESPASR_passive 0 "ESP_ASR_activated" 1 "ESP_oder_ASR_passive_get_oder_Fktumsch_oder_Rollenmodus";
+VAL_ 416 BR1_Sta_ESP 0 "ok" 1 "Failure";
+VAL_ 416 BR1_Ersatz_Kmh 0 "OK" 1 "Substitute_value";
+
+SG_MUL_VAL_ 648 MO2_Getr_Code MO2_Mp_Code 2-2;
+SG_MUL_VAL_ 648 MO2_max_Mo MO2_Mp_Code 3-3;
+SG_MUL_VAL_ 648 MO2_CAN_Vers MO2_Mp_Code 0-0;
+SG_MUL_VAL_ 648 MO2_Motor_Code MO2_Mp_Code 1-1;
+
+SG_MUL_VAL_ 1152 MO5_max_Moment MO5_Mp_Code 0-0;
+SG_MUL_VAL_ 1152 MO5_Drehzahl MO5_Mp_Code 1-1;
+SG_MUL_VAL_ 1152 MO5_Motortyp MO5_Mp_Code 2-2;
+SG_MUL_VAL_ 1152 MO5_Abgastyp MO5_Mp_Code 3-3;
+SG_MUL_VAL_ 1152 MO5_Abgastyp2 MO5_Mp_Code 3-3;
+SG_MUL_VAL_ 1152 MO5_Abgastyp3 MO5_Mp_Code 3-3;
+SG_MUL_VAL_ 1152 OBD_Kaltstart_Denominator MO5_Mp_Code 3-3;
+SG_MUL_VAL_ 1152 OBD_Minimum_Trip MO5_Mp_Code 3-3;
+SG_MUL_VAL_ 1152 MO5_DPF_reg MO5_Mp_Code 3-3;
+
+VAL_ 648 MO2_Mp_Code 0 "CAN_Stand" 1 "Motor_Kod" 2 "Getriebe_Kod" 3 "MDI_Max";
+
+VAL_ 648 MO2_Getr_Code 0 "_5HP19" 1 "_5HP24" 2 "AG4" 3 "VL300" 4 "VQ250" 5 "VQ35" 6 "AG4_yestco" 7 "AG5_yestco" 8 "autom_Kupplung" 9 "autom_Kupplung_mit_ASG" 10 "AG6_yestco_ZF_6HP_AISIN" 11 "DQ500_DQ250_DQ200" 12 "SQ100_SQ200" 14 "AL1000_AL551_AL951_ZF8HPx" 15 "Handschalter_konv" 16 "DL800" 17 "E_Fahrzeug__Single_Gear";
+
+VAL_ 648 MO2_BLS 0 "no_Bremsen" 1 "Bremse_betaetigt";
+VAL_ 648 MO2_BTS 0 "no_braking" 1 "Brake_activated";
+VAL_ 648 MO2_Sta_Kuehlm 0 "Temperature_ok" 1 "Temperature_not_ok";
+VAL_ 648 MO2_Sta_Klima 0 "Climate_off" 1 "Climate_on";
+VAL_ 648 MO2_Sta_No_Bet 0 "no_Normalbetrieb" 1 "Normalbetrieb";
+VAL_ 648 MO2_Status_TSK 0 "TSK_not_available" 1 "TSK_available";
+VAL_ 648 MO2_Sta_GRA 0 "ADR_GRA_off" 1 "gra_activated_lamp_on" 2 "gra_overdriven_lamp_on" 3 "ADR_gra_faulted";
+VAL_ 648 TSK_Limiter_ausgewaehlt 0 "no_limiter_selected" 1 "Limiter_Selected";
+VAL_ 648 MO2_GRAregelt 0 "no" 1 "yes";
+VAL_ 648 MO2_Sport_Error 0 "no_Failure" 1 "Failure";
+VAL_ 648 MO2_OffRoad 0 "not_active" 1 "active";
+
+VAL_ 870 AWV_Text 0 "kein_Text" 1 "FrontAssist_aus" 2 "FrontAssist_startet" 3 "FrontAssist_Warnung" 4 "FrontAssist_Sens_reinig" 5 "FrontAssist_Failure" 6 "FrontAssist_Demo" 7 "Vorhalt" 8 "Bremsung_wird_gerade_durchgefuehrt" 9 "Sensor_not_verfuegbar" 10 "Sensor_reinigen" 11 "Service_notwendig_Failure" 12 "Funktion_vom_Fahrer_deactivated" 13 "Funktion_vom_Fahrer_activated" 14 "FrontAssist_zur_Zeit_not_verfuegbar__rev_Failure";
+VAL_ 870 AWV_1_Freigabe 0 "nicht_freigegeben" 1 "freigegeben";
+VAL_ 870 AWV_1_Prefill 0 "keine_Prefill_Anf" 1 "Prefill_Anf";
+VAL_ 870 AWV_1_Parameter 0 "Defaultparametersatz" 1 "Par_leicht_erh_Empf" 2 "Par_erh_Empf" 3 "Par_hoechster_Empf";
+VAL_ 870 AWV_only 0 "ACC_und_AWV_verbaut" 1 "AWV_ohne_ACC_verbaut";
+VAL_ 870 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich";
+VAL_ 870 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten";
+VAL_ 870 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben";
+VAL_ 870 AWV_2_Status 0 "Lampe_aus" 1 "Lampe_ein";
+VAL_ 870 AWV_2_Fehler 0 "Lampe_aus" 1 "Lampe_ein";
+VAL_ 870 AWV_2_SU_Warnzeit 0 "frueh" 1 "normal" 2 "spaet" 3 "adaptiv";
+VAL_ 870 AWV_2_SU_Bremsruck 0 "Bremsruck_deaktiviert" 1 "Bremsruck_aktiviert";
+VAL_ 870 AWV_2_SU_Gong 0 "Gong_deaktiviert" 1 "Gong_aktiviert";
+VAL_ 870 AWV_2_SU_Lampe 0 "Lampe_deaktiviert" 1 "Lampe_aktiviert";
+VAL_ 870 AWV_2_Umfeldwarn 0 "keine_Warnung" 1 "Warnung";
+VAL_ 870 AWV_2_Freigabe 0 "keine_Ruckfreigabe" 1 "Ruckfreigabe";
+VAL_ 870 AWV_2_Ruckprofil 0 "kein_Ruck" 1 "Ruckprofil_1" 2 "Ruckprofil_2" 3 "Ruckprofil_3" 4 "Ruckprofil_4" 5 "Ruckprofil_5" 6 "not_erlaubt" 7 "not_erlaubt";
+VAL_ 870 AWV_2_Warnton 0 "Aus" 1 "Ein";
+VAL_ 870 AWV_2_Warnsymbol 0 "Aus" 1 "Ein";
+VAL_ 870 AWV_Infoton 0 "Aus" 1 "Ein";
+VAL_ 870 AWV_2_Gurtstraffer 0 "Gurt_not_straffen" 1 "Gurt_straffen";
+VAL_ 870 AWV_Konfiguration_Menueanf 0 "Menue_deaktivieren" 1 "Menue_aktivieren";
+VAL_ 870 AWV_Konfiguration_Vorw_Menueanf 0 "Menue_deaktivieren" 1 "Menue_aktivieren";
+VAL_ 870 AWV_Konfiguration_Status 0 "AWV_inaktiv" 1 "AWV_aktiv";
+VAL_ 870 AWV_Konfiguration_Vorw_Status 0 "AWV_Vorwarnung_inaktiv" 1 "AWV_Vorwarnung_aktiv";
+VAL_ 870 AWV_2_Abstandswarnung 0 "kein_Warnhinweis" 1 "Warnhinweis";
+VAL_ 870 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben";
+VAL_ 870 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv";
+
+VAL_ 872 ACS_Sta_ADR 2 "ADR_passiv" 0 "ADR_nicht_aktiv" 1 "ADR_aktiv" 3 "irrev_Fehler" ;
+VAL_ 872 ACS_ADR_Schub 1 "Verz_begr_auf_Schub" 0 "Verz_nicht_begr_auf_Schub" ;
+VAL_ 872 ACS_Schubabsch 1 "SA_nicht_zulaessig" 0 "SA_zulaessig" ;
+VAL_ 872 ACS_StSt_Info 3 "Systemfehler" 0 "Motorlauf_nn" 1 "Stoppverbot_Motoranlauf_nn" 2 "Motoranlauf_notwendig" ;
+VAL_ 872 ACS_MomEingriff 1 "MomEingr_verhindern" 0 "keine_Beeinfl_MomEingr_Mot" ;
+VAL_ 872 ACS_Typ_ACC 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 3 "frei" 2 "frei" ;
+VAL_ 872 ACS_FreigSollB 0 "Sollbeschl_nicht_freigeg" 1 "Sollbeschl_freigeg" ;
+VAL_ 872 ACS_Sollbeschl 2046 "ADR_nicht_aktiv" 2047 "Fehler" ;
+VAL_ 872 ACS_Anhaltewunsch 0 "kein_Haltewunsch" 1 "Fzg_haelt_an" ;
+VAL_ 872 ACS_Fehler 1 "Fehlerspeichereintrag" 0 "kein_Fehlerspeichereintrag" ;
+VAL_ 872 ACS_zul_Regelabw 254 "ADR_nicht_aktiv" 255 "Fehler" ;
+VAL_ 872 ACS_max_AendGrad 254 "Neutralwert" 0 "Neutralwert" 255 "Fehler" ;
+
+VAL_ 896 MO3_Vorgluehen 0 "no_Vorgluehen" 1 "Vorgluehen_active";
+VAL_ 896 MO3_Prio_Dz 0 "Wunsch" 1 "Zwang";
+VAL_ 896 MO_Schalter_StartStopp 0 "StartStopp_ueber_Hauptschalter_deactivated_LED_an" 1 "StartStopp_ueber_Hauptschalter_activated_LED_aus";
+VAL_ 896 MO3_Winterprg 0 "not_active" 1 "active";
+VAL_ 896 MO3_Sta_Pedal 0 "Fahrpedal_iO" 1 "Ersatzwert";
+VAL_ 896 MO3_Sta_FPG 0 "Gradient_not_bed" 1 "Gradient_bed";
+VAL_ 896 MO3_Sign_FPG 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen";
+VAL_ 896 MO3_Sta_Temp 0 "Geber_iO" 1 "Ersatzwert";
+VAL_ 896 MO3_Vorz_RadWu 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen";
+VAL_ 896 MO3_Freigabe_Segeln 0 "Segelbetrieb_not_freigegeben" 1 "Segelbetrieb_freigegeben";
+VAL_ 896 MO_StartStopp_StoppVorbereitung 0 "Motorstopp_not_in_Vorbereitung" 1 "Motorstopp_in_Vorbereitung";
+CM_ BO_ 896 "Motor message 3 - Contains accelerator pedal, temperatures, and control signals";
+
+VAL_ 978 LH2_Sta_HCA 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 7 "active";
+VAL_ 210 HCA_Status 3 "ready" 5 "torque" 7 "torque_active" 8 "alc_angle_private" 10 "override_reset" 11 "pla_entry" 15 "standby";
+VAL_ 1088 GE1_Schaltung 0 "no_circuit" 1 "circuit_is_running";
+VAL_ 1088 GE1_Sta_Schutz 0 "no_protection" 1 "protection_requested";
+VAL_ 1088 GE1_Klimakompr 0 "no_Anforderung" 1 "Kompressor_aus";
+VAL_ 1088 GE1_WK 0 "WK_open" 1 "WK_regulated" 2 "WK_closed" 3 "Failure";
+VAL_ 1088 GE1_StSt_Info 0 "Engine_running_not_necessary_stop_release" 1 "Motor_start_not_mandatory_necessary_stop_prohibition" 2 "Motor_start_absolute_necessary_start_request" 3 "System_error";
+VAL_ 1088 GE1_EGS_Anf 0 "no_requirement" 1 "EGS_requirement";
+VAL_ 1088 GE1_Zielgang 0 "P (Park) | Disengaged" 1 "Gear 1 | Engaged" 2 "Gear 2 | Engaged" 3 "Gear 3 | Engaged" 4 "Gear 4 | Engaged" 5 "Gear 5 | Engaged" 6 "1m Gear" 7 "Gang_R" 8 "Gear 6 | Engaged" 9 "Gear 7 | Engaged" 10 "Gear 8 | Engaged" 14 "Speed Not Defined" 15 "Failure";
+VAL_ 1088 GE1_Wahl_Pos 8 "P" 7 "R" 6 "N" 5 "D" 9 "U" 12 "S" 14 "T" 10 "T" 11 "T";
+VAL_ 1088 GE1_Notlauf 0 "No Emergency" 1 "No Switching" 2 "Switch to Neutral" 3 "50% Shifting Capacity" 4 "Driving Without UK" 5 "No Emeregency" 6 "No Emergency" 7 "No Emergency, Target Shifting Reached" 15 "Failure";
+VAL_ 1088 GE1_Kuehlung 0 "No Additional Cooling Requested" 1 "20% Additional Fan Cooling Requested" 2 "40% Additional Fan Cooling Requested" 3 "Maximum Additional Fan Cooling Requested";
+VAL_ 1088 GE1_Sta_OBD 0 "MIL Off" 1 "MIL On";
+VAL_ 1088 GE1_LaunchControl 0 "Launch Control Not Active" 1 "Launch Control Program Active";
+VAL_ 1088 GE1_Infobit 0 "Standard Automatic" 1 "CVT";
+VAL_ 1088 GE1_SleepInd 0 "CAN is Required" 1 "Sleep Ready";
+VAL_ 1088 GE1_Fehlereintr 0 "No Failure Memory Entry" 1 "Failure Memory Entry";
+
+VAL_ 1152 MO5_Mp_Code 0 "Max_Moment" 1 "Drehzahl" 2 "Motor_Typ" 3 "Abgastyp_od_norm_Verbrauch";
+VAL_ 1152 MO5_Abgastyp 0 "no_EOBD" 1 "EOBD";
+VAL_ 1152 MO5_Abgastyp2 0 "no_OBD" 1 "OBD";
+VAL_ 1152 MO5_Abgastyp3 0 "no_DPF_verbaut" 1 "DPF_verbaut";
+VAL_ 1152 OBD_Kaltstart_Denominator 0 "Denominator_not_hochzaehlen" 1 "Bedingungen_zum_Inkr_des_Kaltstart_Denom_erf";
+VAL_ 1152 OBD_Minimum_Trip 0 "no_Min_Normed_Trip" 1 "Min_Normed_Trip";
+VAL_ 1152 MO5_DPF_reg 0 "DPF_regeneriert_nicht" 1 "DPF_regeneriert";
+VAL_ 1152 MO5_Vorgluehen 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 1152 MO5_E_Gas 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 1152 MO5_OBD_2 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 1152 MO5_Heissl 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 1152 MO5_KlimaKompr 0 "no_Anforderung" 1 "Klimakompr_aus";
+VAL_ 1152 MO5_Feld_kuehl 0 "no" 1 "yes";
+VAL_ 1152 MO5_KliKo_Red 0 "no" 1 "yes";
+VAL_ 1152 MO5_UeberlVerb 0 "no_Ueberlauf" 1 "mindestens_einmal_uebergelaufen";
+VAL_ 1152 MO5_HLeuchte 0 "no_Warnung" 1 "Vorwarnung";
+VAL_ 1152 MO5_PartikelLamp 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 1152 MO5_Sta_BKU 0 "iO_oder_not_verbaut" 1 "n_iO";
+VAL_ 1152 MO5_TypStartSteu 0 "Startersteuerung_BSG_BCM_KessyD1_ZAS" 1 "Startersteuerung_durch_MSG";
+VAL_ 1152 MO5_TDE_Lampe 0 "Lamp_off" 1 "Lamp_on";
+VAL_ 1152 MO5_TDE_Text 0 "no_Text" 1 "Textanzeige_nach_ISO";
+VAL_ 1152 MO5_DZM_Daempf 0 "normale_Daempfung" 1 "dynamische_Daempfung";
+VAL_ 1152 MO5_Interlock 0 "Interlock_not_betaetigt" 1 "Interlock_betaetigt";
+VAL_ 1152 MO5_Start 0 "Start_not_zulaessig" 1 "Startfreigabe";
+VAL_ 1152 MO5_Anlasser 0 "Anlasser_darf_angesteuert_werden" 1 "Anlasser_ausspuren_Ansteuerung_not_moeglich";
+VAL_ 1152 MO5_GRA_Hauptsch 0 "Off" 1 "On";
+VAL_ 1152 MO5_Momente 0 "Einfach" 1 "Doppelt";
+VAL_ 1152 MO5_Motortext1 0 "no_Text" 1 "Text_1";
+VAL_ 1152 MO5_Motortext2 0 "no_Text" 1 "Text_2";
+VAL_ 1152 MO5_Motortext3 0 "no_Text" 1 "Text_3";
+VAL_ 1152 MO5_Motortext4 0 "no_Text" 1 "Text_4";
+
+VAL_ 1386 ACA_StaACC 6 "ACC_rev_aus" 0 "Hauptschalter_aus" 4 "ACC_im_Hintergrund" 3 "ACC_aktiv" 1 "Reserve" 2 "ACC_passiv" 7 "ACC_irrev_aus" 5 "frei" ;
+VAL_ 1386 ACA_ID_StaACC 0 "keine_Anzeige" ;
+VAL_ 1386 ACA_Fahrerhinw 1 "Ein" 0 "Aus" ;
+VAL_ 1386 ACA_AnzDisplay 1 "Anzeige_erw" 0 "Anzeige_nicht_erw" ;
+VAL_ 1386 ACA_Zeitluecke 3 "Zeitluecke3" 10 "Zeitluecke10" 4 "Zeitluecke4" 14 "Zeitluecke14" 11 "Zeitluecke11" 2 "Zeitluecke2" 13 "Zeitluecke13" 9 "Zeitluecke9" 1 "Zeitluecke1" 8 "Zeitluecke8" 5 "Zeitluecke5" 15 "Zeitluecke15" 0 "nicht_definiert" 12 "Zeitluecke12" 6 "Zeitluecke6" 7 "Zeitluecke7" ;
+VAL_ 1386 ACA_V_Wunsch 255 "kein_Wert_im_Speicher" ;
+VAL_ 1386 ACA_kmh_mph 0 "km_h" 1 "mph" ;
+VAL_ 1386 ACA_Akustik1 0 "kein_Gong" 1 "Gong" ;
+VAL_ 1386 ACA_Akustik2 0 "kein_Summer" 1 "Summer" ;
+VAL_ 1386 ACA_PrioDisp 1 "mittlere_Prio" 3 "keine_Anzeige_Anf" 0 "hohe_Prio" 2 "niedrige_Prio" ;
+VAL_ 1386 ACA_gemZeitl 6 "Zeitluecke6" 2 "Zeitluecke2" 7 "Zeitluecke7" 13 "Zeitluecke13" 11 "Zeitluecke11" 4 "Zeitluecke4" 8 "Zeitluecke8" 12 "Zeitluecke12" 10 "Zeitluecke10" 0 "Kein_Objekt_erfasst" 1 "Zeitluecke1" 3 "Zeitluecke3" 9 "Zeitluecke9" 15 "Zeitluecke15" 14 "Zeitluecke14" 5 "Zeitluecke5" ;
+VAL_ 1386 ACA_ACC_Verz 0 "ACC_verzoegert_nicht" 1 "ACC_verzoegert" ;
+VAL_ 1386 ACA_StaGRA 3 "GRA_aktiv" 4 "GRA_uebertreten" 2 "GRA_passiv" 0 "Hauptschalter_aus" 6 "frei" 7 "GRA_Fehler" 1 "Reserve" 5 "frei" ;
+VAL_ 1386 ACA_ID_StaGRA 0 "keine_Anzeige" ;
+VAL_ 1386 ACA_Codierung 0 "ACC" 1 "GRA" ;
+VAL_ 1386 ACA_Tachokranz 0 "nicht_beleuchtet" 1 "beleuchtet" ;
+VAL_ 1386 ACA_Aend_Zeitluecke 1 "Anzeige_angef" 0 "keine_Anzeige" ;
+
+VAL_ 1472 EP1_Fehler_Sta 0 "volle_Funktion" 1 "linke_Seite_fehlerhaft" 2 "rechte_Seite_fehlerhaft" 3 "beide_Seiten_fehlerhaft";
+VAL_ 1472 EP1_Sta_EPB 0 "Bremse_geoeffnet" 1 "Bremse_geschlossen";
+VAL_ 1472 EP1_Sta_Schalter 0 "volle_Funktion" 1 "Schalter_ausser_Funktion";
+VAL_ 1472 EP1_Spannkraft 31 "Fehler";
+VAL_ 1472 EP1_Schalterinfo 0 "keine_Fahreranforderung" 1 "Fahreranforderung_oeffnen" 2 "Fahreranforderung_schliessen" 3 "Schalterfehler";
+VAL_ 1472 EP1_Sta_NWS 0 "volle_Funktion" 1 "keine_Funktion";
+VAL_ 1472 EP1_Fehlereintr 0 "kein_Fehlerspeichereintrag" 1 "Fehlerspeichereintrag";
+VAL_ 1472 EP1_Freigabe_Ver 0 "Verzoegerungsanf_nicht_freigegeb" 1 "Verzoegerungsanf_freigegeben";
+VAL_ 1472 EP1_AutoHold_zul 0 "Pers_nicht_zulaessig" 1 "Pers_zulaessig";
+VAL_ 1472 EP1_AutoHold_aktiv 0 "nein" 1 "ja";
+VAL_ 1472 EP1_SleepInd 0 "CAN_wird_benoetigt" 1 "Sleep_bereit";
+VAL_ 1472 EP1_Status_Kl_15 0 "Kl_15_aus" 1 "Kl_15_ein";
+VAL_ 1472 EP1_Lampe_AutoP 0 "Lampe_aus" 1 "Lampe_ein";
+VAL_ 1472 EP1_Bremslicht 0 "Aus" 1 "Ein";
+VAL_ 1472 EP1_Warnton1 0 "Aus" 1 "Ein";
+VAL_ 1472 EP1_Warnton2 0 "Aus" 1 "Ein";
+VAL_ 1472 EP1_AnfShLock 0 "Aus" 1 "Ein";
+VAL_ 1472 EPB_Autoholdlampe 0 "Lampe_aus" 1 "Lampe_ein";
+VAL_ 1472 EP1_QualNeigWi 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert";
+VAL_ 1472 EP1_KuppModBer 0 "Kuppsensor_aus_Modbereich" 1 "Kupplsensor_im_Modbereich" 2 "Sensorsignal_ungenau" 3 "Sensor_defekt";
+VAL_ 1472 EP1_HydrHalten 0 "Fzg_nicht_hydr_geh" 1 "Fzg_hydr_geh";
+VAL_ 1472 EP1_Fkt_Lampe 0 "Lampe_aus" 1 "Lampe_ein";
+VAL_ 1472 EP1_Warnton 0 "Warnton_aus" 1 "Warnton_an";
+VAL_ 1472 EP1_Fehler_BKL 0 "BKL_aus" 1 "BKL_an";
+VAL_ 1472 EP1_Fehler_gelb 0 "Lampe_aus" 1 "Lampe_ein";
+VAL_ 1472 EP1__Text 0 "kein_Text" 1 "Text_1" 2 "Text_2" 3 "Text_3" 4 "Text_4" 5 "Text_5" 6 "reserviert" 7 "reserviert" 8 "Text_8";
diff --git a/iqdbc_repo/iqdbc/lvbs/__init__.py b/iqdbc_repo/iqdbc/lvbs/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqdbc_repo/iqdbc/lvbs/aol_base.py b/iqdbc_repo/iqdbc/lvbs/aol_base.py
new file mode 100644
index 000000000..b472e81fa
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/aol_base.py
@@ -0,0 +1,22 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from abc import abstractmethod, ABC
+from enum import StrEnum
+
+from iqdbc.car import structs
+from iqdbc.can.parser import CANParser
+
+
+class AolCarStateBase(ABC):
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.lkas_button = 0
+ self.prev_lkas_button = 0
+
+ @abstractmethod
+ def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ pass
diff --git a/iqdbc_repo/iqdbc/lvbs/car/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/__init__.py
new file mode 100644
index 000000000..f08cca121
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/__init__.py
@@ -0,0 +1,38 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+
+def crc8_pedal(data):
+ crc = 0xFF # standard init value
+ poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1
+ size = len(data)
+ for i in range(size - 1, -1, -1):
+ crc ^= data[i]
+ for _ in range(8):
+ if (crc & 0x80) != 0:
+ crc = ((crc << 1) ^ poly) & 0xFF
+ else:
+ crc <<= 1
+ return crc
+
+
+def create_gas_interceptor_command(packer, gas_amount, idx):
+ # Common gas pedal msg generator
+ enable = gas_amount > 0.001
+
+ values = {
+ "ENABLE": enable,
+ "PEDAL_COUNTER": idx & 0xF,
+ }
+
+ if enable:
+ values["GAS_COMMAND"] = gas_amount * 255.
+ values["GAS_COMMAND2"] = gas_amount * 255.
+
+ dat = packer.make_can_msg("GAS_COMMAND", 0, values)[1]
+
+ checksum = crc8_pedal(dat[:-1])
+ values["PEDAL_CHECKSUM"] = checksum
+
+ return packer.make_can_msg("GAS_COMMAND", 0, values)
diff --git a/iqdbc_repo/iqdbc/lvbs/car/car_catalog.py b/iqdbc_repo/iqdbc/lvbs/car/car_catalog.py
new file mode 100644
index 000000000..3da55cb46
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/car_catalog.py
@@ -0,0 +1,62 @@
+import re
+import unicodedata
+
+from iqdbc.car.docs import get_all_footnotes, get_params_for_docs
+from iqdbc.car.values import PLATFORMS
+
+
+def build_car_catalog() -> dict[str, dict[str, list[str] | str]]:
+ collected_footnote = get_all_footnotes()
+ sorted_list: dict[str, dict[str, list[str] | str]] = collect_car_docs(PLATFORMS, collected_footnote)
+ return sorted_list
+
+
+def _natural_sort_key(s):
+ # NFKD normalization ensures accented characters sort with their base letter (e.g., Š sorts with S)
+ normalized = unicodedata.normalize('NFKD', s)
+ return [int(t) if t.isdigit() else t.lower() for t in re.split(r'(\d+)', normalized) if t]
+
+
+def collect_car_docs(platforms, footnotes) -> dict[str, dict[str, list[str] | str]]:
+ cars: dict[str, dict[str, list[str] | str]] = {}
+ for model, platform in platforms.items():
+ car_docs = platform.config.get_all_docs()
+ CP, CP_IQ = get_params_for_docs(platform)
+
+ if CP.dashcamOnly or not len(car_docs):
+ continue
+
+ # A platform can include multiple car models
+ for _car_docs in car_docs:
+ if not hasattr(_car_docs, "row"):
+ _car_docs.init_make(CP)
+ _car_docs.init(CP, footnotes)
+ cars[_car_docs.name] = model
+
+ _platform = model
+ _name = _car_docs.name
+ _make = _car_docs.make
+ _brand = _car_docs.brand
+ _model = _car_docs.model
+ _years = _car_docs.year_list
+ _package = _car_docs.package if _car_docs.package else []
+
+ cars[_name] = {
+ "platform": _platform,
+ "make": _make,
+ "brand": _brand,
+ "model": _model,
+ "year": _years if _years else [],
+ "package": _package,
+ }
+
+ # Sort cars by make and model + year
+ sorted_cars = sorted(cars.keys(), key=lambda car: _natural_sort_key(car))
+ sorted_car_list = {car: cars[car] for car in sorted_cars}
+ return sorted_car_list
+
+
+if __name__ == "__main__":
+ # build_car_catalog() is the raw platform source; the shipped catalog is generated
+ # (and encoded to its on-disk envelope) by the main-repo entry point:
+ print("run: python -m openpilot.iqpilot.selfdrive.car.vehicle_catalog")
diff --git a/iqdbc_repo/iqdbc/lvbs/car/chrysler/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/lvbs/car/chrysler/aol.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/aol.py
new file mode 100644
index 000000000..348641785
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/aol.py
@@ -0,0 +1,73 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Always-on-Lateral adapter for Chrysler. CarState reads the LKAS toggle button
+(and the forwarded LKAS heartbeat); CarController tracks the AOL state and, when
+AOL is available, drives the LKAS_DISABLED bit the dash reads from the heartbeat.
+"""
+from enum import StrEnum
+from collections import namedtuple
+
+from iqdbc.car import Bus, structs
+from iqdbc.car.chrysler.values import RAM_CARS
+from iqdbc.lvbs.aol_base import AolCarStateBase
+from iqdbc.can.parser import CANParser
+
+AolDataIQ = namedtuple("AolDataIQ", ["enable_aol", "paused", "lkas_disabled"])
+ButtonType = structs.CarState.ButtonEvent.Type
+
+_HEARTBIT_FIELDS = ("LKAS_DISABLED", "AUTO_HIGH_BEAM", "FORWARD_1", "FORWARD_2", "FORWARD_3")
+
+
+class AolCarController:
+ def __init__(self):
+ self.aol = AolDataIQ(False, False, False)
+
+ @staticmethod
+ def create_lkas_heartbit(packer, lkas_heartbit, aol):
+ values = {name: lkas_heartbit[name] for name in _HEARTBIT_FIELDS}
+ if aol.enable_aol:
+ values["LKAS_DISABLED"] = 1 if aol.lkas_disabled else 0
+ return packer.make_can_msg("LKAS_HEARTBIT", 0, values)
+
+ @staticmethod
+ def aol_status_update(CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS) -> AolDataIQ:
+ enable_aol = CC_IQ.aol.available
+ paused = CC_IQ.aol.enabled and not CC.latActive
+ # A tap of the LKAS button flips the driver's "LKAS disabled" preference.
+ if any(be.type == ButtonType.lkas and be.pressed for be in CS.out.buttonEvents):
+ CS.lkas_disabled = not CS.lkas_disabled
+ return AolDataIQ(enable_aol, paused, CS.lkas_disabled)
+
+ def update(self, CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS) -> None:
+ self.aol = self.aol_status_update(CC, CC_IQ, CS)
+
+
+class AolCarState(AolCarStateBase):
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ super().__init__(CP, CP_IQ)
+ self.lkas_heartbit = 0
+ self.init_lkas_disabled = False
+ self.lkas_disabled = False
+
+ @staticmethod
+ def get_parser(CP, pt_messages, cam_messages) -> None:
+ if CP.carFingerprint in RAM_CARS:
+ pt_messages.append(("Center_Stack_2", 1))
+ else:
+ pt_messages.append(("TRACTION_BUTTON", 1))
+ cam_messages.append(("LKAS_HEARTBIT", 1))
+
+ def _read_lkas_button(self, cp, cp_cam) -> int:
+ if self.CP.carFingerprint in RAM_CARS:
+ return cp.vl["Center_Stack_2"]["LKAS_Button"]
+
+ self.lkas_heartbit = cp_cam.vl["LKAS_HEARTBIT"]
+ if not self.init_lkas_disabled:
+ self.lkas_disabled = cp_cam.vl["LKAS_HEARTBIT"]["LKAS_DISABLED"]
+ self.init_lkas_disabled = True
+ return cp.vl["TRACTION_BUTTON"]["TOGGLE_LKAS"]
+
+ def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ self.prev_lkas_button = self.lkas_button
+ self.lkas_button = self._read_lkas_button(can_parsers[Bus.pt], can_parsers[Bus.cam])
diff --git a/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_carcontroller.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_carcontroller.py
new file mode 100644
index 000000000..140fff14a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_carcontroller.py
@@ -0,0 +1,30 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Chrysler low-speed steering gate: overrides the stock LKAS control bit when the
+no-min-steering-speed option is set, and holds the RAM DT engagement window.
+"""
+from iqdbc.car import structs
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.chrysler.values import RAM_DT
+from iqdbc.lvbs.car.chrysler.iq_values import ChryslerFlagsIQ
+
+GearShifter = structs.CarState.GearShifter
+
+
+class IQCarController:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ def get_lkas_control_bit(self, CS: CarStateBase, CC: structs.CarControl, lkas_control_bit: bool) -> bool:
+ if self.CP_IQ.flags & ChryslerFlagsIQ.NO_MIN_STEERING_SPEED:
+ return CC.latActive
+
+ if self.CP.carFingerprint in RAM_DT:
+ if self.CP.minEnableSpeed <= CS.out.vEgo <= self.CP.minEnableSpeed + 0.5:
+ lkas_control_bit = True
+ if self.CP.minEnableSpeed >= 14.5 and CS.out.gearShifter != GearShifter.drive:
+ lkas_control_bit = False
+
+ return lkas_control_bit
diff --git a/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_carstate.py
new file mode 100644
index 000000000..e92944a69
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_carstate.py
@@ -0,0 +1,32 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Chrysler cruise-button reader: emits edge ButtonEvents for the ACC steering-wheel
+buttons so IQ.Pilot can react to accel/decel/cancel/resume.
+"""
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.can.parser import CANParser
+from iqdbc.lvbs.car.chrysler.iq_values import BUTTONS
+
+
+class IQCarState:
+ def __init__(self, CP, CP_IQ):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.button_events: list = []
+ self.button_states = {button.event_type: False for button in BUTTONS}
+
+ def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ cp = can_parsers[Bus.pt]
+ events = []
+ for button in BUTTONS:
+ pressed = cp.vl[button.can_addr][button.can_msg] in button.values
+ if pressed != self.button_states[button.event_type]:
+ event = structs.CarState.ButtonEvent.new_message()
+ event.type = button.event_type
+ event.pressed = pressed
+ events.append(event)
+ self.button_states[button.event_type] = pressed
+ self.button_events = events
diff --git a/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_fingerprints.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_fingerprints.py
new file mode 100644
index 000000000..ff5d937b4
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_fingerprints.py
@@ -0,0 +1,27 @@
+from iqdbc.car.structs import CarParams
+from iqdbc.car.chrysler.values import CAR
+
+Ecu = CarParams.Ecu
+
+
+FW_VERSIONS_EXT = {
+ CAR.RAM_1500_5TH_GEN: {
+ (Ecu.combinationMeter, 0x742, None): [
+ b'68453485AC',
+ b'68510283AH',
+ ],
+ (Ecu.eps, 0x75a, None): [
+ b'68552791AA',
+ ],
+ (Ecu.engine, 0x7e0, None): [
+ b'05149390AA ',
+ b'68378696AI ',
+ b'68500631AF',
+ ],
+ (Ecu.transmission, 0x7e1, None): [
+ b'68360085AF',
+ b'68360086AL',
+ b'68502996AC',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_values.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_values.py
new file mode 100644
index 000000000..caee7333c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/iq_values.py
@@ -0,0 +1,24 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot Chrysler extension flags + the cruise-button table read by the AOL
+cruise-button reader.
+"""
+from collections import namedtuple
+from enum import IntFlag
+
+from iqdbc.car import structs
+
+ButtonType = structs.CarState.ButtonEvent.Type
+Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
+
+BUTTONS = [
+ Button(ButtonType.accelCruise, "CRUISE_BUTTONS", "ACC_Accel", [1]),
+ Button(ButtonType.decelCruise, "CRUISE_BUTTONS", "ACC_Decel", [1]),
+ Button(ButtonType.cancel, "CRUISE_BUTTONS", "ACC_Cancel", [1]),
+ Button(ButtonType.resumeCruise, "CRUISE_BUTTONS", "ACC_Resume", [1]),
+]
+
+
+class ChryslerFlagsIQ(IntFlag):
+ NO_MIN_STEERING_SPEED = 1
diff --git a/iqdbc_repo/iqdbc/lvbs/car/gm/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/gm/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/lvbs/car/gm/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_carstate.py
new file mode 100644
index 000000000..96d1344ad
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_carstate.py
@@ -0,0 +1,26 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Non-ACC GM carState: these cars have no adaptive cruise, so cruise engage/set
+speed come from the stock (non-adaptive) ECM cruise message.
+"""
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.can.parser import CANParser
+from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ
+
+
+class IQCarState:
+ def __init__(self, CP, CP_IQ):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ if not self.CP_IQ.flags & GMFlagsIQ.NON_ACC:
+ return
+ pt_cp = can_parsers[Bus.pt]
+ ret.cruiseState.enabled = pt_cp.vl["ECMCruiseControl"]["CruiseActive"] != 0
+ ret.cruiseState.speed = pt_cp.vl["ECMCruiseControl"]["CruiseSetSpeed"] * CV.KPH_TO_MS
+ ret.accFaulted = False
diff --git a/iqdbc_repo/iqdbc/lvbs/car/gm/iq_fingerprints.py b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_fingerprints.py
new file mode 100644
index 000000000..4d5944140
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_fingerprints.py
@@ -0,0 +1,119 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+# ruff: noqa: E501
+from iqdbc.car.gm.values import CAR
+
+FINGERPRINTS_EXT = {
+ # FIXME-IQ: Need user validation
+ # CAR.CHEVROLET_VOLT: [{
+ # 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 513: 6, 528: 4, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 5, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1922: 7
+ # }],
+ # FIXME-IQ: Need a message to distinguish flashed from non-flashed
+ # CAR.CHEVROLET_VOLT_CC: [
+ # Volt Premier w/o acc 2016
+ # {
+ # 170: 8, 171: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 209: 7, 211: 2, 241: 6, 288: 5, 289: 1, 290: 1, 298: 2, 304: 8, 308: 4, 309: 8, 311: 8, 313: 8, 320: 8, 328: 1, 352: 5, 368: 8, 381: 6, 384: 8, 386: 5, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 3, 508: 8, 512: 3, 528: 4, 530: 8, 532: 6, 537: 4, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 8, 563: 5, 564: 5, 565: 8, 566: 5, 567: 3, 568: 1, 577: 8, 578: 8, 594: 8, 647: 3, 707: 8, 711: 6, 717: 5, 761: 7, 800: 6, 810: 8, 821: 4, 823: 7, 832: 8, 840: 5, 842: 6, 844: 8, 866: 4, 869: 4, 961: 8, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1602: 8, 1618: 8, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1928: 7, 1930: 7, 2016: 8, 2017: 8, 2018: 8, 2019: 8, 2020: 8, 2024: 8, 2025: 8, 2028: 8
+ # },
+ # {
+ # 201: 8, 493: 8, 495: 4, 193: 8, 197: 8, 209: 7, 171: 8, 456: 8, 199: 4, 489: 8, 211: 2, 499: 3, 390: 7, 532: 6, 568: 1, 761: 7, 381: 6, 485: 8, 189: 7, 479: 3, 711: 6, 501: 8, 241: 6, 717: 5, 869: 4, 389: 2, 454: 8, 170: 8, 190: 6, 497: 8, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 500: 6, 508: 8, 528: 4, 647: 3, 1105: 6, 1005: 6, 481: 7, 844: 8, 866: 4, 564: 5, 969: 8, 388: 8, 352: 5, 562: 8, 961: 8, 386: 8, 707: 8, 977: 8, 979: 7, 298: 8, 840: 5, 842: 5, 988: 6, 1001: 8, 560: 8, 546: 7, 558: 8, 309: 8, 995: 7, 311: 8, 566: 5, 567:3, 989: 8, 384: 4, 800: 6, 1033: 7, 1034: 7, 313: 8, 554: 3, 810: 8, 1017: 8, 1019: 2, 1020: 8, 1217: 8, 1223: 3, 1233: 8, 1227: 4, 1417: 8, 1009: 8, 1221: 5, 1275: 3, 1225: 7, 289: 8, 550: 8, 1273: 3, 1928: 7, 1187: 4, 1265: 8, 1927: 7, 1267: 1, 1906: 7, 288: 5, 304: 1, 328: 1, 1912: 7, 320: 3, 1910: 7, 563: 5, 1249: 8, 1930: 7, 1257: 6, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 565: 5, 1280: 4, 1907: 7
+ # },
+ # # Volt Premier w/o ACC 2018 + Pedal
+ # {
+ # 189: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 513: 6, 528: 4, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 5, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1922: 7, 1930: 7
+ # }
+ # ],
+ CAR.CHEVROLET_BOLT_NON_ACC: [
+ # Bolt Premier w/o ACC 2017
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 201: 6, 209: 7, 211: 2, 241: 6, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 311: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 5, 353: 3, 368: 8, 381: 6, 384: 8, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 512: 3, 513: 6, 514: 2, 516: 4, 519: 2, 521: 3, 528: 5, 530: 8, 532: 7, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 8, 566: 6, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 832: 8, 840: 6, 842: 6, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8
+ },
+ # Bolt EV Premier 2017
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 201: 6, 209: 7, 211: 2, 241: 6, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 311: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 5, 353: 3, 368: 8, 381: 6, 384: 8, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 513: 6, 512: 3, 514: 2, 516: 4, 519: 2, 521: 3, 528: 5, 530: 8, 532: 7, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 8, 566: 6, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 832: 8, 840: 6, 842: 6, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8
+ },
+ # Bolt EV Premier 2017 w Pedal
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 201: 6, 209: 7, 211: 2, 241: 6, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 311: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 5, 353: 3, 368: 8, 381: 6, 384: 8, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 512: 3, 512: 6, 513: 6, 514: 2, 516: 4, 519: 2, 521: 3, 528: 5, 530: 8, 532: 7, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 8, 566: 6, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 832: 8, 840: 6, 842: 6, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 # noqa: F601
+ },
+ # Bolt EV Premier 2017 2 w Pedal
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 6, 567: 5, 568: 1, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7
+ },
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 6, 567: 5, 568: 1, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8
+ }],
+ CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN: [
+ # Bolt Premier no ACC 2018 + Pedal
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 6, 567: 5, 568: 1, 573: 1, 577: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1616: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 2020: 8, 2023: 8, 2028: 8, 2031: 8
+ },
+ # Bolt Premier no ACC 2019 + Pedal
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 512: 6, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 568: 2, 569: 3, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1037: 5, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1268: 2, 1275: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2024: 8
+ },
+ # Bolt Premier no ACC 2020
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 568: 2, 569: 3, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1037: 5, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1268: 2, 1275: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2024: 8
+ }],
+ CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN: [
+ # Bolt EV Premier no ACC 2023 w Pedal
+ {
+ 170: 8, 188: 8, 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 308: 4, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 398: 8, 407: 7, 417: 8, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 8, 567: 5, 568: 2, 569: 3, 573: 1, 577: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 711: 6, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1010: 8, 1013: 6, 1015: 1, 1017: 8, 1019: 2, 1020: 8, 1037: 5, 1105: 5, 1187: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1601: 8, 1616: 8, 1618: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 1930: 7, 2016: 8, 2020: 8, 2023: 8, 2024: 8, 2028: 8, 2031: 8
+ },
+ # Bolt EV Premier no ACC 2021
+ {
+ 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 257: 8, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 578: 8, 579: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1037: 5, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1346: 8, 1347: 8, 1513: 8, 1516: 8, 1601: 8, 1616: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 2016: 8, 2017: 8, 2018: 8, 2020: 8, 2023: 8, 2024: 8, 2028: 8, 2031: 8
+ },
+ # shermy99's Bolt EV Premier no ACC 2023
+ {
+ 170: 8, 188: 8, 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 308: 4, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 398: 8, 407: 7, 417: 8, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 8, 567: 5, 568: 2, 569: 3, 573: 1, 577: 8, 579: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 711: 6, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1010: 8, 1013: 6, 1015: 1, 1017: 8, 1019: 2, 1020: 8, 1037: 5, 1105: 5, 1187: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1347: 8, 1513: 8, 1516: 8, 1601: 8, 1609: 8, 1613: 8, 1616: 8, 1618: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1913: 7, 1920: 8, 1922: 7, 1924: 8, 1927: 7, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 2000: 8, 2001: 8, 2002: 8, 2017: 8, 2018: 8, 2020: 8, 2023: 8, 2025: 8, 2028: 8, 2031: 8
+ },
+ {
+ 170: 8, 188: 8, 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 398: 8, 407: 7, 417: 8, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 564: 5, 566: 8, 567: 5, 568: 2, 569: 3, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 711: 6, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1009: 8, 1010: 8, 1013: 6, 1015: 1, 1017: 8, 1019: 2, 1020: 8, 1105: 5, 1187: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1913: 7, 1927: 7, 1930: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8
+ }],
+ CAR.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN: [{
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 401: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 444: 7, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 569: 3, 573: 1, 577: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1273: 3, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1611: 8, 1618: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 7, 1930: 7
+ },
+ {
+ 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 384: 4, 393: 8, 398: 8, 401: 8, 413: 8, 422: 4, 431: 8, 444: 7, 453: 6, 456: 8, 479: 3, 481: 7, 485: 8, 499: 3, 500: 6, 501: 8, 567: 5, 647: 6, 800: 6, 1033: 7, 1034: 7, 1296: 4
+ }],
+ # Trailblazer also matches as a Silverado, so comment out to avoid conflicts.
+ # TODO-IQ: split with FW versions
+ # CAR.TRAILBLAZER: [
+ # {
+ # 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1609: 8, 1611: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8
+ # }],
+ CAR.CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN: [
+ # Slav's 2018 Suburban, LKAS no ACC
+ {
+ 170: 8, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 493: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 562: 8, 563: 5, 564: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 7
+ },
+ # Qube's 2017 Suburban, LKAS no ACC
+ {
+ 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 534: 2, 562: 8, 563: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 717: 5, 761: 7, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1609: 8, 1611: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1871: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1920: 8, 1924: 8, 1927: 8, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 1990: 8, 2000: 8, 2001: 8, 2004: 8, 2017: 8, 2018: 8, 2020: 8
+ }],
+ CAR.CADILLAC_CT6_NON_ACC_1ST_GEN: [
+ # badgers4life's 2017 CT6
+ {
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 4, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 460: 5, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 3, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 723: 2, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 969: 8, 977: 8, 979: 7, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 1, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 7, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 4, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1919: 7, 1920: 8, 1924: 8, 1927: 8, 1928: 7, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 2000: 8, 2001: 8, 2002: 8, 2004: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8
+ }],
+ CAR.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN: [
+ {
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 723: 4, 730: 4, 761: 7, 800: 6, 840: 5, 842: 5, 844: 8, 869: 4, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 6, 1017: 8, 1020: 8, 1037: 5, 1105: 5, 1187: 5, 1195: 3, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1273: 3, 1276: 2, 1277: 7, 1278: 4, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7
+ }],
+ CAR.CHEVROLET_MALIBU_NON_ACC_9TH_GEN: [
+ # Verylukyguy's Malibu
+ {
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 328: 1, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 409: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 730: 4, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 6, 1017: 8, 1020: 8, 1037: 5, 1105: 5, 1187: 6, 1189: 1, 1195: 3, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1273: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7
+ },
+ # Tesla's Malibu
+ {
+ 189: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 6, 390: 8, 392: 4, 393: 4, 394: 8, 395: 3, 396: 4, 397: 4, 398: 4, 399: 4, 400: 4, 401: 4, 402: 4, 403: 4, 404: 4, 405: 4, 406: 4, 407: 4, 408: 4, 409: 4, 410: 4, 411: 4, 412: 4, 413: 4, 414: 4, 415: 4, 416: 4, 417: 4, 418: 4, 419: 4, 420: 4, 421: 4, 422: 4, 423: 4, 424: 4, 425: 4, 426: 4, 427: 4, 428: 4, 429: 4, 430: 4, 431: 4, 432: 4, 433: 4, 434: 4, 435: 4, 436: 4, 437: 4, 438: 4, 439: 4, 440: 4, 441: 4, 442: 4, 443: 4, 444: 4, 445: 4, 446: 4, 447: 4, 448: 4, 449: 4, 450: 4, 451: 8, 452: 8, 453: 6, 479: 4, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 6, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1922: 7
+ }],
+ CAR.CADILLAC_XT5_NON_ACC_1ST_GEN: [
+ # TRain's 2017 XT5
+ {
+ 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 647: 3, 707: 8, 717: 5, 723: 2, 753: 5, 761: 7, 800: 6, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1919: 7, 1920: 7
+ }],
+}
diff --git a/iqdbc_repo/iqdbc/lvbs/car/gm/iq_interface.py b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_interface.py
new file mode 100644
index 000000000..1c7b64cef
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_interface.py
@@ -0,0 +1,43 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+GM torque-space feed-forward for the IQ.Pilot lateral extension: a sigmoid+linear
+lat-accel -> torque curve for the tuned platforms, else the linear default.
+"""
+from math import exp
+
+from iqdbc.car import structs
+from iqdbc.car.gm.interface import CAR
+from iqdbc.lvbs.car.interfaces import LatControlInputs, TorqueFromLateralAccelCallbackTypeTorqueSpace
+
+_NON_LINEAR_TORQUE_PARAMS = {
+ CAR.CHEVROLET_BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178],
+ CAR.GMC_ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772],
+ CAR.CHEVROLET_SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122],
+}
+
+
+class IQCarInterface:
+ def __init__(self, CP: structs.CarParams, CI_Base):
+ self.CP = CP
+ self.CI_Base = CI_Base
+
+ @staticmethod
+ def _centered_sigmoid(val: float) -> float:
+ # sigmoid shifted to pass through the origin; branch keeps exp() from overflowing
+ if val >= 0:
+ return 1.0 / (1.0 + exp(-val)) - 0.5
+ z = exp(val)
+ return z / (1.0 + z) - 0.5
+
+ def torque_from_lateral_accel_siglin(self, latcontrol_inputs: LatControlInputs,
+ torque_params: structs.CarParams.LateralTorqueTuning,
+ gravity_adjusted: bool) -> float:
+ a, b, c, _ = _NON_LINEAR_TORQUE_PARAMS[self.CP.carFingerprint]
+ lat_accel = latcontrol_inputs.lateral_acceleration
+ return float(self._centered_sigmoid(lat_accel * a) * b + lat_accel * c)
+
+ def torque_from_lateral_accel_in_torque_space(self) -> TorqueFromLateralAccelCallbackTypeTorqueSpace:
+ if self.CP.carFingerprint in _NON_LINEAR_TORQUE_PARAMS:
+ return self.torque_from_lateral_accel_siglin
+ return self.CI_Base.torque_from_lateral_accel_linear_in_torque_space
diff --git a/iqdbc_repo/iqdbc/lvbs/car/gm/iq_values.py b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_values.py
new file mode 100644
index 000000000..b52d29380
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/gm/iq_values.py
@@ -0,0 +1,14 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot GM extension flags for the non-adaptive-cruise (Non-ACC) camera-harness port.
+"""
+from enum import IntFlag
+
+
+class GMFlagsIQ(IntFlag):
+ NON_ACC = 1
+
+
+class GMSafetyFlagsIQ:
+ NON_ACC = 1
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/honda/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/aol.py b/iqdbc_repo/iqdbc/lvbs/car/honda/aol.py
new file mode 100644
index 000000000..449949168
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/aol.py
@@ -0,0 +1,19 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from iqdbc.car import structs
+from iqdbc.car.honda.values import HONDA_BOSCH_RADARLESS
+
+
+class AolCarController:
+ def __init__(self):
+ self.dashed_lanes = False
+
+ def update(self, CP: structs.CarParams, CC: structs.CarControl, CC_IQ: structs.IQCarControl) -> None:
+ enable_aol = CC_IQ.aol.available
+
+ if enable_aol:
+ self.dashed_lanes = CC_IQ.aol.enabled and not CC.latActive
+ else:
+ self.dashed_lanes = CC.hudControl.lanesVisible if CP.carFingerprint in HONDA_BOSCH_RADARLESS else False
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/gas_interceptor.py b/iqdbc_repo/iqdbc/lvbs/car/honda/gas_interceptor.py
new file mode 100644
index 000000000..95ed00a91
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/gas_interceptor.py
@@ -0,0 +1,32 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+import numpy as np
+
+from iqdbc.car import structs
+from iqdbc.car.can_definitions import CanData
+from iqdbc.lvbs.car import create_gas_interceptor_command
+
+
+class GasInterceptorCarController:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.gas = 0.
+ self.interceptor_gas_cmd = 0.
+
+ def update(self, CC: structs.CarControl, CS: structs.CarState, gas: float, brake: float, wind_brake: float,
+ packer, frame: int) -> list[CanData]:
+ can_sends = []
+
+ if self.CP_IQ.enableGasInterceptor:
+ gas_pedal = np.interp(CS.out.vEgo, [0., 10.], [0.4, 1.0])
+ if CC.longActive:
+ self.gas = float(np.clip(gas_pedal * (gas - brake + wind_brake * 3 / 4), 0., 1.))
+ else:
+ self.gas = 0.0
+ can_sends.append(create_gas_interceptor_command(packer, self.gas, frame // 2))
+
+ return can_sends
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/honda/iq_carstate.py
new file mode 100644
index 000000000..830b77b42
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/iq_carstate.py
@@ -0,0 +1,30 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.can.parser import CANParser
+from iqdbc.lvbs.car.honda.iq_values import HondaFlagsIQ
+
+
+class IQCarState:
+ def __init__(self, CP, CP_IQ):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+
+ if self.CP_IQ.flags & HondaFlagsIQ.NIDEC_HYBRID:
+ ret.accFaulted = bool(cp.vl["HYBRID_BRAKE_ERROR"]["BRAKE_ERROR_1"] or cp.vl["HYBRID_BRAKE_ERROR"]["BRAKE_ERROR_2"])
+ ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE_HYBRID"] > 1e-5)
+
+ if self.CP_IQ.flags & HondaFlagsIQ.HYBRID_ALT_BRAKEHOLD:
+ ret.brakeHoldActive = cp.vl["BRAKE_HOLD_HYBRID_ALT"]["BRAKE_HOLD_ACTIVE"] == 1
+
+ if self.CP_IQ.enableGasInterceptor and "GAS_SENSOR" in cp.vl:
+ # Same threshold as panda, equivalent to 1e-5 with previous DBC scaling
+ gas = (cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] + cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"]) // 2
+ ret.gasPressed = gas > 492
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/iq_fingerprints.py b/iqdbc_repo/iqdbc/lvbs/car/honda/iq_fingerprints.py
new file mode 100644
index 000000000..34cead11b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/iq_fingerprints.py
@@ -0,0 +1,56 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from iqdbc.car.structs import CarParams
+from iqdbc.car.honda.values import CAR
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS_EXT = {
+ CAR.HONDA_ACCORD: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TVA,A150\x00\x00',
+ ],
+ },
+ CAR.HONDA_CIVIC: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TBA,A030\x00\x00',
+ ],
+ },
+ CAR.HONDA_CIVIC_BOSCH: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TGG,A020\x00\x00',
+ b'39990-TGG,A120\x00\x00',
+ ],
+ },
+ CAR.HONDA_CRV_5G: {
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TLA,A040\x00\x00',
+ ],
+ },
+ CAR.HONDA_CLARITY: {
+ (Ecu.shiftByWire, 0x18da0bf1, None): [
+ b'54008-TRW-A910\x00\x00',
+ ],
+ (Ecu.vsa, 0x18da28f1, None): [
+ b'57114-TRW-A010\x00\x00',
+ b'57114-TRW-A020\x00\x00',
+ ],
+ (Ecu.eps, 0x18da30f1, None): [
+ b'39990-TRW-A020\x00\x00',
+ b'39990-TRW,A020\x00\x00', # modified firmware
+ b'39990,TRW,A020\x00\x00', # extra modified firmware
+ ],
+ (Ecu.srs, 0x18da53f1, None): [
+ b'77959-TRW-A210\x00\x00',
+ b'77959-TRW-A220\x00\x00',
+ ],
+ (Ecu.gateway, 0x18daeff1, None): [
+ b'38897-TRW-A010\x00\x00',
+ ],
+ (Ecu.fwdRadar, 0x18dab0f1, None): [
+ b'36161-TRW-A110\x00\x00',
+ ],
+ },
+}
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/iq_values.py b/iqdbc_repo/iqdbc/lvbs/car/honda/iq_values.py
new file mode 100644
index 000000000..137d5686a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/iq_values.py
@@ -0,0 +1,18 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from enum import IntFlag
+
+
+class HondaFlagsIQ(IntFlag):
+ NIDEC_HYBRID = 1
+ EPS_MODIFIED = 2
+ HYBRID_ALT_BRAKEHOLD = 4
+
+
+class HondaSafetyFlagsIQ:
+ NIDEC_HYBRID = 1
+ GAS_INTERCEPTOR = 2
+
+
diff --git a/iqdbc_repo/iqdbc/lvbs/car/honda/test_honda.py b/iqdbc_repo/iqdbc/lvbs/car/honda/test_honda.py
new file mode 100644
index 000000000..2384a7378
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/honda/test_honda.py
@@ -0,0 +1,26 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from parameterized import parameterized
+
+from iqdbc.car import gen_empty_fingerprint
+from iqdbc.car.structs import CarParams
+from iqdbc.car.car_helpers import interfaces
+from iqdbc.car.honda.values import CAR
+
+CarFw = CarParams.CarFw
+
+
+class TestHondaEpsMod:
+
+ @parameterized.expand([(CAR.HONDA_CIVIC, b'39990-TBA,A030\x00\x00'), (CAR.HONDA_CIVIC, b'39990-TBA-A030\x00\x00'),
+ (CAR.HONDA_CLARITY, b'39990-TRW-A020\x00\x00'), (CAR.HONDA_CLARITY, b'39990,TRW,A020\x00\x00')])
+ def test_eps_mod_fingerprint(self, car_name, fw):
+ fingerprint = gen_empty_fingerprint()
+ car_fw = [CarFw(ecu="eps", fwVersion=fw)]
+
+ CarInterface = interfaces[car_name]
+ CP = CarInterface.get_params(car_name, fingerprint, car_fw, False, False, False)
+ _ = CarInterface.get_params_iq(CP, car_name, fingerprint, car_fw, False, False, False)
+
+ assert not CP.dashcamOnly
diff --git a/iqdbc_repo/iqdbc/lvbs/car/interfaces.py b/iqdbc_repo/iqdbc/lvbs/car/interfaces.py
new file mode 100644
index 000000000..59905eded
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/interfaces.py
@@ -0,0 +1,123 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import json
+import numpy as np
+from typing import NamedTuple
+from collections.abc import Callable
+
+from iqdbc.car import structs
+from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable
+from iqdbc.car.subaru.values import SubaruFlags
+from iqdbc.lvbs.car.subaru.iq_values import SubaruFlagsIQ, SubaruSafetyFlagsIQ
+from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ
+from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ
+
+
+class LatControlInputs(NamedTuple):
+ lateral_acceleration: float
+ roll_compensation: float
+ vego: float
+ aego: float
+
+
+TorqueFromLateralAccelCallbackTypeTorqueSpace = Callable[[LatControlInputs, structs.CarParams.LateralTorqueTuning, bool], float]
+
+
+class CarInterfaceBaseIQ:
+ @staticmethod
+ def torque_from_lateral_accel_linear_in_torque_space(latcontrol_inputs: LatControlInputs, torque_params: structs.CarParams.LateralTorqueTuning,
+ gravity_adjusted: bool) -> float:
+ # The default is a linear relationship between torque and lateral acceleration (accounting for road roll and steering friction)
+ return latcontrol_inputs.lateral_acceleration / float(torque_params.latAccelFactor)
+
+ def torque_from_lateral_accel_in_torque_space(self) -> TorqueFromLateralAccelCallbackTypeTorqueSpace:
+ return self.torque_from_lateral_accel_linear_in_torque_space
+
+
+class NanoFFModel:
+ def __init__(self, weights_loc: str, platform: str):
+ self.weights_loc = weights_loc
+ self.platform = platform
+ self.load_weights(platform)
+
+ def load_weights(self, platform: str):
+ with open(self.weights_loc) as fob:
+ self.weights = {k: np.array(v) for k, v in json.load(fob)[platform].items()}
+
+ def relu(self, x: np.ndarray):
+ return np.maximum(0.0, x)
+
+ def forward(self, x: np.ndarray):
+ assert x.ndim == 1
+ x = (x - self.weights['input_norm_mat'][:, 0]) / (self.weights['input_norm_mat'][:, 1] - self.weights['input_norm_mat'][:, 0])
+ x = self.relu(np.dot(x, self.weights['w_1']) + self.weights['b_1'])
+ x = self.relu(np.dot(x, self.weights['w_2']) + self.weights['b_2'])
+ x = self.relu(np.dot(x, self.weights['w_3']) + self.weights['b_3'])
+ x = np.dot(x, self.weights['w_4']) + self.weights['b_4']
+ return x
+
+ def predict(self, x: list[float], do_sample: bool = False):
+ x = self.forward(np.array(x))
+ if do_sample:
+ pred = np.random.laplace(x[0], np.exp(x[1]) / self.weights['temperature'])
+ else:
+ pred = x[0]
+ pred = pred * (self.weights['output_norm_mat'][1] - self.weights['output_norm_mat'][0]) + self.weights['output_norm_mat'][0]
+ return pred
+
+
+def apply_iq_car_config(CI, CP: structs.CarParams, CP_IQ: structs.IQCarParams,
+ params_list: list[dict[str, str]] | None = None,
+ can_recv: CanRecvCallable | None = None, can_send: CanSendCallable | None = None) -> None:
+ if params_list is None:
+ params_list = []
+
+ params_dict = {k: v for param in params_list for k, v in param.items()}
+
+ _apply_long_tuning(CI, CP, CP_IQ, params_dict)
+ _apply_torque_blend(CP, CP_IQ, params_dict)
+ _apply_creep_assist(CP, CP_IQ, params_dict)
+ _apply_toyota_options(CP, CP_IQ, params_dict)
+
+
+def _apply_long_tuning(CI, CP: structs.CarParams, CP_IQ: structs.IQCarParams,
+ params_dict: dict[str, str]) -> None:
+
+ _ = CI.get_longitudinal_tuning_iq(CP, CP_IQ)
+
+
+def _apply_torque_blend(CP: structs.CarParams, CP_IQ: structs.IQCarParams,
+ params_dict: dict[str, str]) -> None:
+ if CP.brand == 'tesla':
+ torque_blend = int(params_dict.get("IQTeslaTorqueBlend", 0)) == 1
+ if torque_blend:
+ CP_IQ.flags |= TeslaFlagsIQ.COOP_STEERING.value
+
+
+def _apply_creep_assist(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params_dict: dict[str, str]) -> None:
+ # Subaru stop-and-go; unsupported on gen2-global and hybrid platforms.
+ if CP.brand != 'subaru' or CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID):
+ return
+
+ if int(params_dict.get("IQSubaruCreepAssist", 0)) == 1:
+ CP_IQ.flags |= SubaruFlagsIQ.STOP_AND_GO.value
+ if int(params_dict.get("IQSubaruCreepAssistManualBrake", 0)) == 1:
+ CP_IQ.flags |= SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE.value
+
+ if CP_IQ.flags & (SubaruFlagsIQ.STOP_AND_GO | SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE):
+ CP_IQ.iqSafetyFlags |= SubaruSafetyFlagsIQ.STOP_AND_GO
+
+
+def _apply_toyota_options(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params_dict: dict[str, str]) -> None:
+ if CP.brand == 'toyota':
+ toyota_stock_long = int(params_dict.get("IQToyotaFactoryLong", 0)) == 1
+ toyota_sng_hack = int(params_dict.get("ToyotaSnGHack", 0)) == 1
+
+ if toyota_stock_long:
+ CP_IQ.flags |= ToyotaFlagsIQ.STOCK_LONGITUDINAL.value
+
+ if toyota_sng_hack:
+ CP_IQ.flags |= ToyotaFlagsIQ.STOP_AND_GO_HACK.value
+ CP.minEnableSpeed = -1.
+ CP.autoResumeSng = CP.openpilotLongitudinalControl
diff --git a/iqdbc_repo/iqdbc/lvbs/car/iq_fingerprints.py b/iqdbc_repo/iqdbc/lvbs/car/iq_fingerprints.py
new file mode 100644
index 000000000..1d43a621b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/iq_fingerprints.py
@@ -0,0 +1,36 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+
+def extend_fw_versions(fw_versions, new_fw_versions):
+ """
+ Merge firmware versions by extending lists for matching ECUs,
+ adding all entries regardless of duplicates.
+ """
+ for c, f in new_fw_versions.items():
+ if c not in fw_versions:
+ fw_versions[c] = f
+ continue
+
+ for e, new_fw_list in f.items():
+ if e not in fw_versions[c]:
+ fw_versions[c][e] = new_fw_list
+ else:
+ fw_versions[c][e].extend(new_fw_list)
+
+ return fw_versions
+
+
+def extend_fingerprints(fingerprints, new_fingerprints):
+ """
+ Merge fingerprints by extending lists for matching keys,
+ adding all entries regardless of duplicates.
+ """
+ for car, fp_list in new_fingerprints.items():
+ if car not in fingerprints:
+ fingerprints[car] = fp_list
+ else:
+ fingerprints[car].extend(fp_list)
+
+ return fingerprints
diff --git a/iqdbc_repo/iqdbc/lvbs/car/iq_lateral.py b/iqdbc_repo/iqdbc/lvbs/car/iq_lateral.py
new file mode 100644
index 000000000..bffb4af59
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/iq_lateral.py
@@ -0,0 +1,18 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import numpy as np
+
+from iqdbc.car import structs
+from iqdbc.car.lateral import apply_center_deadzone
+
+
+def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, friction_threshold: float,
+ torque_params: structs.CarParams.LateralTorqueTuning) -> float:
+ # TODO torque params' friction should be in lataxel space, not torque space
+ friction_interp = np.interp(
+ apply_center_deadzone(lateral_accel_error, lateral_accel_deadzone),
+ [-friction_threshold, friction_threshold],
+ [-torque_params.friction, torque_params.friction]
+ )
+ return float(friction_interp)
diff --git a/iqdbc_repo/iqdbc/lvbs/car/nissan/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/nissan/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/lvbs/car/nissan/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/nissan/iq_carstate.py
new file mode 100644
index 000000000..76e88915a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/nissan/iq_carstate.py
@@ -0,0 +1,31 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Nissan cruise-button reader: emits edge ButtonEvents for the RES/SET buttons.
+"""
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.can.parser import CANParser
+from iqdbc.lvbs.car.nissan.values import BUTTONS
+
+
+class IQCarState:
+ def __init__(self, CP, CP_IQ):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.button_events: list = []
+ self.button_states = {button.event_type: False for button in BUTTONS}
+
+ def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ cp = can_parsers[Bus.pt]
+ events = []
+ for button in BUTTONS:
+ pressed = cp.vl[button.can_addr][button.can_msg] in button.values
+ if pressed != self.button_states[button.event_type]:
+ event = structs.CarState.ButtonEvent.new_message()
+ event.type = button.event_type
+ event.pressed = pressed
+ events.append(event)
+ self.button_states[button.event_type] = pressed
+ self.button_events = events
diff --git a/iqdbc_repo/iqdbc/lvbs/car/nissan/values.py b/iqdbc_repo/iqdbc/lvbs/car/nissan/values.py
new file mode 100644
index 000000000..d1cbe203a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/nissan/values.py
@@ -0,0 +1,22 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot Nissan extension: safety flag + cruise-button table.
+"""
+from collections import namedtuple
+
+from iqdbc.car import structs
+
+
+class NissanSafetyFlagsIQ:
+ DEFAULT = 0
+ LEAF = 1
+
+
+ButtonType = structs.CarState.ButtonEvent.Type
+Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
+
+BUTTONS = [
+ Button(ButtonType.accelCruise, "CRUISE_THROTTLE", "RES_BUTTON", [1]),
+ Button(ButtonType.decelCruise, "CRUISE_THROTTLE", "SET_BUTTON", [1]),
+]
diff --git a/iqdbc_repo/iqdbc/lvbs/car/rivian/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/lvbs/car/rivian/aol.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/aol.py
new file mode 100644
index 000000000..3c92c9a31
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/rivian/aol.py
@@ -0,0 +1,30 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Always-on-Lateral output adapter for Rivian: derives the per-frame lateral-active
+and lane-keep icon state the LKAS command needs from the shared AOL state.
+"""
+from collections import namedtuple
+
+from iqdbc.car import structs
+from iqdbc.car.interfaces import CarStateBase
+
+# Rivian EPAS rejects large-angle torque, so lateral is dropped past this bound.
+_MAX_STEERING_ANGLE = 90.0
+
+AolDataIQ = namedtuple("AolDataIQ", ["lka_icon_states", "lat_active"])
+
+
+class AolCarController:
+ def __init__(self):
+ self.aol = AolDataIQ(False, False)
+
+ def update(self, CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS: CarStateBase) -> None:
+ prev_active = self.aol.lat_active
+ if CC_IQ.aol.available:
+ lat_active = CC.latActive and abs(CS.out.steeringAngleDeg) < _MAX_STEERING_ANGLE
+ lka_icon = prev_active
+ else:
+ lat_active = CC.latActive
+ lka_icon = CC.enabled
+ self.aol = AolDataIQ(lka_icon, lat_active)
diff --git a/iqdbc_repo/iqdbc/lvbs/car/rivian/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/iq_carstate.py
new file mode 100644
index 000000000..d7098e2df
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/rivian/iq_carstate.py
@@ -0,0 +1,104 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Rivian longitudinal-harness-upgrade carState reader: with the upgrade harness the
+right steering-wheel controls and the drive stalk drive the openpilot set speed,
+and the harness exposes blind-spot indicators. Only active behind the upgrade flag.
+"""
+import math
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.can.parser import CANParser
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.rivian.values import DBC
+from iqdbc.lvbs.car.rivian.values import RivianFlagsIQ
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+_SET_SPEED_MAX = 85 * CV.MPH_TO_MS
+_SET_SPEED_MIN = 20 * CV.MPH_TO_MS
+_LONG_PRESS_FRAMES = 66
+_STALK_HOLD_FRAMES = 50
+
+
+class IQCarState:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.set_speed = 10
+ self.increase_button = False
+ self.decrease_button = False
+ self.distance_button = 0
+ self.increase_counter = 0
+ self.decrease_counter = 0
+ self.stalk_down_counter = 0
+
+ def _apply_set_speed_buttons(self, ret: structs.CarState, cp_park, cp_adas) -> None:
+ was_increasing = self.increase_button
+ was_decreasing = self.decrease_button
+
+ self.increase_button = cp_park.vl["WheelButtons"]["RightButton_RightClick"] == 2
+ self.decrease_button = cp_park.vl["WheelButtons"]["RightButton_LeftClick"] == 2
+ self.increase_counter = self.increase_counter + 1 if self.increase_button else 0
+ self.decrease_counter = self.decrease_counter + 1 if self.decrease_button else 0
+
+ metric = cp_adas.vl["Cluster"]["Cluster_Unit"] == 0
+ conversion = CV.KPH_TO_MS if metric else CV.MPH_TO_MS
+ step = 10.0 if metric else 5.0
+ shown = self.set_speed * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH)
+
+ # A held button steps to the next round multiple; a tap nudges by one unit.
+ if self.increase_button:
+ if self.increase_counter % _LONG_PRESS_FRAMES == 0:
+ self.set_speed = math.ceil((shown + 1) / step) * step * conversion
+ elif not was_increasing:
+ self.set_speed += conversion
+ if self.decrease_button:
+ if self.decrease_counter % _LONG_PRESS_FRAMES == 0:
+ self.set_speed = math.floor((shown - 1) / step) * step * conversion
+ elif not was_decreasing:
+ self.set_speed -= conversion
+
+ def update_longitudinal_upgrade(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ cp_park = can_parsers[Bus.alt]
+ cp_adas = can_parsers[Bus.adas]
+ cp = can_parsers[Bus.pt]
+
+ if self.CP.openpilotLongitudinalControl:
+ right_scroll = cp_park.vl["WheelButtons"]["RightButton_Scroll"]
+ if right_scroll != 255:
+ if self.distance_button != right_scroll:
+ ret.buttonEvents = [structs.CarState.ButtonEvent(pressed=False, type=ButtonType.gapAdjustCruise)]
+ self.distance_button = right_scroll
+
+ self._apply_set_speed_buttons(ret, cp_park, cp_adas)
+
+ if not ret.cruiseState.enabled:
+ self.set_speed = ret.vEgoCluster
+
+ # Drive stalk held down (VDM_UserAdasRequest 3/4) for ~0.5s snaps set speed
+ # up to the current speed, matching stock Rivian ACC (it never lowers it).
+ stalk_down = int(cp.vl["VDM_AdasSts"]["VDM_UserAdasRequest"]) in (3, 4)
+ self.stalk_down_counter = self.stalk_down_counter + 1 if stalk_down else 0
+ if self.stalk_down_counter == _STALK_HOLD_FRAMES:
+ self.set_speed = max(self.set_speed, ret.vEgoCluster)
+
+ self.set_speed = max(_SET_SPEED_MIN, min(self.set_speed, _SET_SPEED_MAX))
+ ret.cruiseState.speed = self.set_speed
+
+ if self.CP.enableBsm:
+ ret.leftBlindspot = cp_park.vl["BSM_BlindSpotIndicator"]["BSM_BlindSpotIndicator_Left"] != 0
+ ret.rightBlindspot = cp_park.vl["BSM_BlindSpotIndicator"]["BSM_BlindSpotIndicator_Right"] != 0
+
+ def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ if self.CP_IQ.flags & RivianFlagsIQ.LONGITUDINAL_HARNESS_UPGRADE:
+ self.update_longitudinal_upgrade(ret, can_parsers)
+
+ @staticmethod
+ def get_parser(CP, CP_IQ) -> dict[StrEnum, CANParser]:
+ messages: dict[StrEnum, CANParser] = {}
+ if CP_IQ.flags & RivianFlagsIQ.LONGITUDINAL_HARNESS_UPGRADE:
+ messages[Bus.alt] = CANParser(DBC[CP.carFingerprint][Bus.alt], [], 5)
+ return messages
diff --git a/iqdbc_repo/iqdbc/lvbs/car/rivian/values.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/values.py
new file mode 100644
index 000000000..0cbd70116
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/rivian/values.py
@@ -0,0 +1,10 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot Rivian extension flags.
+"""
+from enum import IntFlag
+
+
+class RivianFlagsIQ(IntFlag):
+ LONGITUDINAL_HARNESS_UPGRADE = 1
diff --git a/iqdbc_repo/iqdbc/lvbs/car/subaru/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/lvbs/car/subaru/aol.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/aol.py
new file mode 100644
index 000000000..6846fafc3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/subaru/aol.py
@@ -0,0 +1,36 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Always-on-Lateral input adapter for Subaru: turns the dashboard LKAS button into
+a carState lkas ButtonEvent so the shared AOL state machine can toggle lateral.
+"""
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.car.subaru.values import SubaruFlags
+from iqdbc.lvbs.aol_base import AolCarStateBase
+from iqdbc.can.parser import CANParser
+
+_LKAS = structs.CarState.ButtonEvent.Type.lkas
+
+# ES_LKAS_State/LKAS_Dash_State: 0 = neutral, 1 = LKAS shown on, 2 = LKAS shown off
+_DASH_ON = 1
+_DASH_OFF = 2
+
+
+class AolCarState(AolCarStateBase):
+ def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ if self.CP.flags & SubaruFlags.PREGLOBAL:
+ return
+
+ self.prev_lkas_button = self.lkas_button
+ self.lkas_button = can_parsers[Bus.cam].vl["ES_LKAS_State"]["LKAS_Dash_State"]
+
+ if self._is_toggle_edge():
+ ret.buttonEvents = [*ret.buttonEvents, structs.CarState.ButtonEvent(type=_LKAS, pressed=True)]
+
+ def _is_toggle_edge(self) -> bool:
+ # every dash-state change is a deliberate press except the off->on rebound (2 -> 1)
+ if self.lkas_button == self.prev_lkas_button:
+ return False
+ return not (self.prev_lkas_button == _DASH_OFF and self.lkas_button == _DASH_ON)
diff --git a/iqdbc_repo/iqdbc/lvbs/car/subaru/creep_assist.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/creep_assist.py
new file mode 100644
index 000000000..29417e142
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/subaru/creep_assist.py
@@ -0,0 +1,93 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot Subaru stop-and-go: nudges the ACC out of a standstill it would
+otherwise hold. Two variants gated by user flags — an electronic-parking-brake
+resume pulse (distance/lead triggered) and a manual-parking-brake hold-timer
+resume. Both work by spoofing the camera-bus throttle/brake frames.
+"""
+import copy
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs, DT_CTRL
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.interfaces import CarStateBase
+from iqdbc.car.subaru.values import SubaruFlags
+
+from iqdbc.lvbs.car.subaru import iq_subarucan
+from iqdbc.lvbs.car.subaru.iq_values import SubaruFlagsIQ
+from iqdbc.can.parser import CANParser
+
+# EPB resume fires only while the lead is pulling away within this gap band (m).
+_RESUME_GAP_MIN = 3.0
+_RESUME_GAP_MAX = 4.5
+_EPB_PULSE_FRAMES = 15
+
+
+class IQStopAndGoController:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.enabled = bool(CP_IQ.flags & (SubaruFlagsIQ.STOP_AND_GO | SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE))
+ self.manual_parking_brake = bool(CP_IQ.flags & SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE)
+
+ self.standstill_since = 0
+ self._pulse_left = 0
+ self.prev_gap = 0.0
+
+ def _epb_pulse(self, trigger: bool) -> bool:
+ # A trigger arms a fixed-length resume pulse; the pulse then plays out frame by frame.
+ if self.manual_parking_brake:
+ return False
+ if trigger:
+ self._pulse_left = _EPB_PULSE_FRAMES
+ if self._pulse_left > 0:
+ self._pulse_left -= 1
+ return True
+ return False
+
+ def _want_resume(self, CC: structs.CarControl, CS: CarStateBase, frame: int) -> bool:
+ if not CC.enabled or not CC.hudControl.leadVisible:
+ return False
+
+ gap = CS.es_distance_msg["Close_Distance"]
+ standing = CS.out.standstill
+ if not standing:
+ self.standstill_since = frame
+
+ hold_arm, hold_reset = (0.75, 0.8) if self.CP.flags & SubaruFlags.PREGLOBAL else (0.5, 0.55)
+ held_for = (frame - self.standstill_since) * DT_CTRL
+ held_long_enough = held_for > hold_arm
+ if held_for >= hold_reset:
+ self.standstill_since = frame
+
+ lead_pulling_away = _RESUME_GAP_MIN < gap < _RESUME_GAP_MAX and gap > self.prev_gap
+ self.prev_gap = gap
+
+ if self.manual_parking_brake:
+ return held_long_enough
+ return self._epb_pulse(standing and lead_pulling_away)
+
+ def create_creep_assist(self, packer, CC: structs.CarControl, CS: CarStateBase, frame: int) -> list[CanData]:
+ if not self.enabled:
+ return []
+
+ resume = self._want_resume(CC, CS, frame)
+ can_sends = [iq_subarucan.create_throttle(packer, self.CP, CS.throttle_msg, resume and not self.manual_parking_brake)]
+ if frame % 2 == 0:
+ can_sends.append(iq_subarucan.create_brake_pedal(packer, self.CP, CS.brake_pedal_msg, resume and self.manual_parking_brake))
+ return can_sends
+
+
+class IQStopAndGoState:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self.brake_pedal_msg: dict[str, float] = {}
+ self.throttle_msg: dict[str, float] = {}
+
+ def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ cp = can_parsers[Bus.pt]
+ self.brake_pedal_msg = copy.copy(cp.vl["Brake_Pedal"])
+ if not self.CP.flags & SubaruFlags.HYBRID:
+ self.throttle_msg = copy.copy(cp.vl["Throttle"])
diff --git a/iqdbc_repo/iqdbc/lvbs/car/subaru/iq_subarucan.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/iq_subarucan.py
new file mode 100644
index 000000000..5fd8e16e7
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/subaru/iq_subarucan.py
@@ -0,0 +1,41 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Camera-bus message spoofers for Subaru stop-and-go: re-emit the stock Throttle
+and Brake_Pedal frames, nudging a single field to trigger an ACC resume from a
+standstill. Field sets mirror the DBC message layout.
+"""
+from iqdbc.car.subaru.values import CanBus, SubaruFlags
+
+_THROTTLE_FIELDS_PREGLOBAL = ("Throttle_Pedal", "Signal1", "Not_Full_Throttle", "Signal2", "Engine_RPM",
+ "Off_Throttle", "Signal3", "Throttle_Cruise", "Throttle_Combo", "Throttle_Body",
+ "Off_Throttle_2", "Signal4")
+_THROTTLE_FIELDS_GLOBAL = ("CHECKSUM", "Signal1", "Engine_RPM", "Neutral", "Throttle_Pedal", "Throttle_Cruise",
+ "Throttle_Combo", "Signal3", "Off_Accel")
+_BRAKE_FIELDS_PREGLOBAL = ("Speed", "Brake_Pedal", "Signal1")
+_BRAKE_FIELDS_GLOBAL = ("CHECKSUM", "Signal1", "Speed", "Signal2", "Brake_Lights", "Signal3", "Brake_Pedal", "Signal4")
+
+
+def _next_counter(msg):
+ return (msg["COUNTER"] + 1) % 0x10
+
+
+def create_throttle(packer, CP, throttle_msg, send_resume):
+ preglobal = bool(CP.flags & SubaruFlags.PREGLOBAL)
+ fields = _THROTTLE_FIELDS_PREGLOBAL if preglobal else _THROTTLE_FIELDS_GLOBAL
+ values = {name: throttle_msg[name] for name in fields}
+ values["COUNTER"] = _next_counter(throttle_msg)
+ if send_resume:
+ values["Throttle_Pedal"] = 5
+ return packer.make_can_msg("Throttle", CanBus.camera, values)
+
+
+def create_brake_pedal(packer, CP, brake_pedal_msg, send_resume):
+ preglobal = bool(CP.flags & SubaruFlags.PREGLOBAL)
+ fields = _BRAKE_FIELDS_PREGLOBAL if preglobal else _BRAKE_FIELDS_GLOBAL
+ values = {name: brake_pedal_msg[name] for name in fields}
+ if not preglobal:
+ values["COUNTER"] = _next_counter(brake_pedal_msg)
+ if send_resume:
+ values["Speed"] = 1 if preglobal else 3
+ return packer.make_can_msg("Brake_Pedal", CanBus.camera, values)
diff --git a/iqdbc_repo/iqdbc/lvbs/car/subaru/iq_values.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/iq_values.py
new file mode 100644
index 000000000..6536b0c0d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/subaru/iq_values.py
@@ -0,0 +1,16 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot Subaru extension flags. Selected in apply_iq_car_config() from the user's
+stop-and-go params and consumed by the stop-and-go controller and panda safety.
+"""
+from enum import IntFlag
+
+
+class SubaruFlagsIQ(IntFlag):
+ STOP_AND_GO = 1
+ STOP_AND_GO_MANUAL_PARKING_BRAKE = 2
+
+
+class SubaruSafetyFlagsIQ:
+ STOP_AND_GO = 1
diff --git a/iqdbc_repo/iqdbc/lvbs/car/tesla/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/tesla/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqdbc_repo/iqdbc/lvbs/car/tesla/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/iq_carstate.py
new file mode 100644
index 000000000..90be56407
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/tesla/iq_carstate.py
@@ -0,0 +1,83 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from enum import StrEnum
+
+from iqdbc.car import Bus, create_button_events, structs
+from iqdbc.can.parser import CANParser
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.car.tesla.values import DBC, CANBUS
+from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ
+
+ButtonType = structs.CarState.ButtonEvent.Type
+
+
+class IQCarState:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.infotainment_3_finger_press = 0
+ self.vehicle_bus_available = bool(CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS)
+
+ def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ if Bus.adas in can_parsers:
+ cp_adas = can_parsers[Bus.adas]
+
+ odometer_km = float(cp_adas.vl["ID3B6UI_odometer"].get("UI_odometer", 0.0))
+ if 0.0 < odometer_km < 4294967.296:
+ self.vehicle_bus_available = True
+ ret.odometer = odometer_km
+
+ if self.vehicle_bus_available and Bus.adas in can_parsers:
+ cp_adas = can_parsers[Bus.adas]
+
+ prev_infotainment_3_finger_press = self.infotainment_3_finger_press
+ self.infotainment_3_finger_press = int(cp_adas.vl["UI_status2"]["UI_activeTouchPoints"])
+
+ ret.buttonEvents = [*create_button_events(self.infotainment_3_finger_press, prev_infotainment_3_finger_press,
+ {3: ButtonType.lkas})]
+
+ bms_soc_ui = float(cp_adas.vl["ID292BMS_SOC"].get("SOCUI292", 0.0))
+ ui_range_mi = float(cp_adas.vl["ID33AUI_rangeSOC"].get("UI_Range", 0.0))
+ hv_batt_voltage_v = float(cp_adas.vl["ID132HVBattAmpVolt"].get("BattVoltage132", 0.0))
+ battery_details = None
+ try:
+ battery_details = ret.batteryDetails
+ except Exception:
+ battery_details = None
+
+ soc_ui = bms_soc_ui if 0.0 <= bms_soc_ui <= 102.3 else None
+ if soc_ui is not None:
+ ret.fuelGauge = min(100.0, soc_ui) / 100.0
+ if battery_details is not None:
+ battery_details.soc = soc_ui
+ battery_details.charge = soc_ui
+ if 0.0 <= ui_range_mi <= 1023.0 and battery_details is not None:
+ battery_details.capacity = ui_range_mi
+ if 0.0 < hv_batt_voltage_v <= 800.0 and battery_details is not None:
+ battery_details.voltage = hv_batt_voltage_v
+
+ cp_party = can_parsers[Bus.party]
+ cp_ap_party = can_parsers[Bus.ap_party]
+
+ speed_units = self.can_define.dv["DI_state"]["DI_speedUnits"].get(int(cp_party.vl["DI_state"]["DI_speedUnits"]), None)
+ speed_limit = cp_ap_party.vl["DAS_status"]["DAS_fusedSpeedLimit"]
+ if self.can_define.dv["DAS_status"]["DAS_fusedSpeedLimit"].get(int(speed_limit), None) in ["NONE", "UNKNOWN_SNA"]:
+ ret_iq.speedLimit = 0
+ else:
+ if speed_units == "KPH":
+ ret_iq.speedLimit = speed_limit * CV.KPH_TO_MS
+ elif speed_units == "MPH":
+ ret_iq.speedLimit = speed_limit * CV.MPH_TO_MS
+
+ @staticmethod
+ def get_parser(CP: structs.CarParams, CP_IQ: structs.IQCarParams) -> dict[StrEnum, CANParser]:
+ messages = {}
+
+ # Only tap the vehicle bus on cars where fingerprinting saw it: an always-on
+ # bus-1 parser trips bus_timeout -> canBusMissing on harnesses without the tap.
+ if CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS and Bus.adas in DBC[CP.carFingerprint]:
+ messages[Bus.adas] = CANParser(DBC[CP.carFingerprint][Bus.adas], [], CANBUS.vehicle)
+
+ return messages
diff --git a/iqdbc_repo/iqdbc/lvbs/car/tesla/torque_blend.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/torque_blend.py
new file mode 100644
index 000000000..c8c40926a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/tesla/torque_blend.py
@@ -0,0 +1,312 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import math
+import numpy as np
+from collections import namedtuple
+from dataclasses import replace
+
+from iqdbc.car import structs, rate_limit, DT_CTRL
+from iqdbc.car.vehicle_model import VehicleModel
+from iqdbc.car.lateral import apply_steer_angle_limits_vm
+from iqdbc.car.tesla.values import CarControllerParams
+from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ
+
+
+DT_LAT_CTRL = DT_CTRL * CarControllerParams.STEER_STEP
+
+class TorqueBlendParams(CarControllerParams):
+ ANGLE_LIMITS = replace(CarControllerParams.ANGLE_LIMITS, MAX_ANGLE_RATE=5)
+
+STEERING_DEG_PHASE_LEAD_COEFF = 8.0
+
+# angle override # todo implement steering torque inertia compensation to increase gains
+STEER_OVERRIDE_MIN_TORQUE = 0.5 # Nm - based on typical steering bias + noise
+STEER_OVERRIDE_MAX_TORQUE = 2.5 # Nm max torque before EPS disengages, LKAS takes over at 1.8Nm
+STEER_OVERRIDE_MAX_LAT_ACCEL = 1.5 # m/s^2 - determines angle rate - speed dependent - similar to Tesla comfort steering mode
+STEER_OVERRIDE_LAT_ACCEL_GAIN_LIMIT = 10 # deg/Nm stability and smoothness for angle control # todo this could be increased after solving feedback stability
+
+# angle ramping
+STEER_OVERRIDE_MAX_LAT_JERK = 2.0 # m/s^3 - determines angle ramping rate - speed dependent
+STEER_OVERRIDE_MAX_LAT_JERK_CENTERING = TorqueBlendParams.ANGLE_LIMITS.MAX_LATERAL_JERK # m/s^3 - for low speed angle ramp down
+# stability and smoothness for angle ramp control - at very low speeds this takes precedence over jerk settings
+STEER_OVERRIDE_LAT_JERK_GAIN_LIMIT = 100 # deg/s/Nm - should be less than CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE / DT_CTRL / STEER_OVERRIDE_TORQUE_RANGE
+STEER_OVERRIDE_TORQUE_RANGE = STEER_OVERRIDE_MAX_TORQUE - STEER_OVERRIDE_MIN_TORQUE
+
+# model fighting mitigation
+STEER_DESIRED_LIMITER_ALLOW_SPEED = 6.0 # m/s - below this speed the desired angle limiter is active
+STEER_DESIRED_LIMITER_ACCEL = 100 # deg/s^2 when override angle ramp is active
+STEER_DESIRED_LIMITER_OVERRIDE_ACTIVE_COUNTER = 0.7 # second
+
+# limit model acceleration when engaging
+STEER_RESUME_RATE_LIMIT_RAMP_RATE = 500 # deg/s^2 - controls rate of rise of angle rate limit, not angle directly
+
+
+TorqueBlendDataIQ = namedtuple("TorqueBlendDataIQ",
+ ["steeringAngleDeg", "lat_active", "control_type"])
+
+def get_steer_from_lat_accel(lat_accel, v_ego: float, VM: VehicleModel):
+ """Calculate the maximum steering angle based on lateral acceleration."""
+ curvature = lat_accel / (max(1, v_ego) ** 2) # 1/m
+ return math.degrees(VM.get_steer_from_curvature(curvature, v_ego, 0)) # deg
+
+
+def apply_bounds(signal: float, limit: float) -> float:
+ """Limit input to a range."""
+ return float(np.clip(signal, -limit, limit))
+
+
+def apply_deadzone(signal: float, deadzone: float) -> float:
+ """Apply deadzone to input."""
+ return signal - apply_bounds(signal, deadzone)
+
+
+def calc_override_angle_limited(torque: float, vEgo: float, VM: VehicleModel, lat_accel) -> float:
+ """
+ Map driver torque to lateral acceleration and convert to steering angle.
+ Limit gain for stability with EPS and torque sensor interaction.
+ """
+
+ # lateral accel is linear in respect to angle so it's fine to interpolate it with torque
+ torque_to_angle = get_steer_from_lat_accel(lat_accel, vEgo, VM) / STEER_OVERRIDE_TORQUE_RANGE
+
+ # limit the gain to prevent jerkiness and instability
+ gain_limit = STEER_OVERRIDE_LAT_ACCEL_GAIN_LIMIT
+ override_angle_target = torque * min(torque_to_angle, gain_limit)
+
+ return override_angle_target
+
+
+def calc_override_angle_delta_limited(torque: float, vEgo: float, VM: VehicleModel, lat_jerk) -> float:
+ """
+ Map driver torque to lateral jerk and convert to steering speed.
+ Limit gain for stability with EPS and torque sensor interaction.
+ """
+
+ # prevents windup in carcontroller rate limiter
+ lat_jerk = min(lat_jerk, TorqueBlendParams.ANGLE_LIMITS.MAX_LATERAL_JERK)
+
+ # lateral accel is linear in respect to angle so it's fine to interpolate it with torque
+ torque_to_angle = get_steer_from_lat_accel(lat_jerk, vEgo, VM) / STEER_OVERRIDE_TORQUE_RANGE
+ # limit the gain to prevent jerkiness and instability
+ gain_limit = min(STEER_OVERRIDE_LAT_JERK_GAIN_LIMIT, CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE / DT_CTRL / STEER_OVERRIDE_TORQUE_RANGE)
+ override_angle_rate = torque * min(torque_to_angle, gain_limit)
+
+ # prevent windup in angle rate limiter
+ return apply_bounds(override_angle_rate * DT_LAT_CTRL, TorqueBlendParams.ANGLE_LIMITS.MAX_ANGLE_RATE)
+
+
+class SteerRateLimiter:
+ """Handles rate limiting of steering angle changes with a configurable rate."""
+ def __init__(self):
+ self._last = 0.0
+
+ def reset(self, angle: float) -> None:
+ """Reset the rate limiter state with the given angle."""
+ self._last = angle
+
+ def update(self, angle: float, angle_delta_lim: float) -> float:
+ angle_lim = rate_limit(angle, self._last, -angle_delta_lim, angle_delta_lim)
+ self._last = angle_lim
+ return angle_lim
+
+
+class SteerAccelLimiter:
+ """
+ Second-order limiter for steering angle:
+ - Limits angular acceleration (change in allowed angular rate).
+ - Enforces a hard max angular rate.
+ """
+ def __init__(self):
+ self.delta_rl = SteerRateLimiter()
+ self.angle_cmd = 0.0
+
+ def reset(self, angle: float) -> None:
+ self.delta_rl.reset(0)
+ self.angle_cmd = angle
+
+ def update(self, angle_target: float, max_rate: float, accel: float, decel: float, dt: float) -> float:
+ if dt <= 0.0:
+ return self.angle_cmd
+
+ # acceleration limits per update step
+ accel_delta = max(0.0, accel) * (dt * dt)
+ decel_delta = max(0.0, decel) * (dt * dt)
+
+ err = angle_target - self.angle_cmd
+ err = apply_bounds(err, max(0.0, max_rate) * dt)
+
+ # acceleration (towards target) or deceleration (away from target)
+ if err * self.delta_rl._last < 0:
+ delta = decel_delta
+ else:
+ delta = accel_delta
+
+ # Handle large decel (enabled with inf value)
+ if decel == np.inf and err * self.delta_rl._last < 0:
+ # if output crosses the target or target crosses the output
+ self.delta_rl._last = 0
+ angle_out = self.angle_cmd
+ else:
+ self.delta_rl._last = self.delta_rl.update(err, delta)
+ if decel == np.inf:
+ # if we are close to target, snap to it before we cross it
+ self.delta_rl._last = apply_bounds(self.delta_rl._last, abs(err))
+ angle_out = self.angle_cmd + self.delta_rl._last
+
+ # Integrate
+ self.angle_cmd = angle_out
+
+ return angle_out
+
+
+class TorqueBlendController:
+ def __init__(self):
+ self.coop_apply_angle_last = 0
+ self.blend_apply_angle_last_sat = 0
+ self.override_angle_accu = 0
+ self.override_active_counter = 0 # Counter for how many cycles torque is below threshold
+ self.resume_rate_limiter_delta = SteerRateLimiter()
+ self.resume_rate_limiter = SteerRateLimiter()
+ self.override_accel_rate_limiter = SteerAccelLimiter()
+ self.debug_angle_desired_limited = 0
+
+ def apply_override_angle_direct(self, lat_active: bool, driverTorque: float, vEgo: float, VM: VehicleModel) -> float:
+ """
+ Emulates steering springiness based on lateral acceleration exerted on the steering rack.
+ We rely on apply_override_angle_ramp to reach the max angle at low speeds.
+ At low speed lateral acceleration approaches infinity and it is not good proxy
+ for the torque to target angle conversion and needs to be limited
+
+ """
+ if not lat_active:
+ return 0.0
+
+ ## torque to position
+ # ignore torque sensor offset and disturbances
+ steering_torque_with_deadzone = apply_deadzone(driverTorque, STEER_OVERRIDE_MIN_TORQUE)
+ angle_override = calc_override_angle_limited(steering_torque_with_deadzone, vEgo, VM, STEER_OVERRIDE_MAX_LAT_ACCEL)
+ return angle_override
+
+ def apply_override_angle_relative(self, lat_active: bool, driverTorque: float, vEgo: float,
+ VM: VehicleModel, unwind_weight: float = 1.0) -> float:
+ """
+ Converts steering torque to steering rotation rate.
+ Physically angle rate is related to viscous damping of tires rotating on the ground.
+ Here, however, the angle rate target is obtained from lateral jerk limit
+ as a reasonable safe rate which decays quadratically with vehicle speed.
+ """
+ if not lat_active:
+ self.override_angle_accu = 0
+ return 0
+
+ # unwind accumulator toward zero if the previous loop saturated (apply_steer_angle_limits_vm)
+ unwind = (self.coop_apply_angle_last - self.blend_apply_angle_last_sat) * unwind_weight
+ if self.override_angle_accu * unwind > 0:
+ unwind = apply_bounds(unwind, abs(self.override_angle_accu))
+ self.override_angle_accu -= unwind
+
+ # torque biasing emulates the steering centering when released:
+ if self.override_angle_accu > 0 and abs(vEgo) > 0.1:
+ torque_biased = driverTorque - STEER_OVERRIDE_MIN_TORQUE
+ elif self.override_angle_accu < 0 and abs(vEgo) > 0.1:
+ torque_biased = driverTorque + STEER_OVERRIDE_MIN_TORQUE
+ else:
+ # when override_angle_accu is reset this turns off everything
+ torque_biased = apply_deadzone(driverTorque, STEER_OVERRIDE_MIN_TORQUE)
+
+ # higher rate when centering
+ angle_override_delta = calc_override_angle_delta_limited(torque_biased, vEgo, VM,
+ STEER_OVERRIDE_MAX_LAT_JERK if (torque_biased * self.override_angle_accu) > 0
+ else STEER_OVERRIDE_MAX_LAT_JERK_CENTERING)
+
+ # ramp the angle
+ new_override_angle_accu = self.override_angle_accu + angle_override_delta
+ # snap to 0 if sign changes and driver torque is steering centering zone
+ if (new_override_angle_accu * self.override_angle_accu) < 0 and abs(driverTorque) < STEER_OVERRIDE_MIN_TORQUE:
+ new_override_angle_accu = 0
+
+ self.override_angle_accu = new_override_angle_accu
+
+ return self.override_angle_accu
+
+ def apply_override_angle_combined(self, lat_active: bool, driverTorque: float, vEgo: float, VM: VehicleModel) -> float:
+ """
+ Combines direct and relative override angles based on direct angle override limitations (stability and practical range depending on vehicle speed).
+ Effectively vehicle-speed based transition.
+ """
+ if not lat_active:
+ return 0
+
+ # calculate capability of direct angle override (fully active above ~36kph)
+ direct_override_capability = (calc_override_angle_limited(STEER_OVERRIDE_TORQUE_RANGE, vEgo, VM, STEER_OVERRIDE_MAX_LAT_ACCEL) /
+ get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, vEgo, VM))
+
+ angle_override_direct = self.apply_override_angle_direct(lat_active, driverTorque, vEgo, VM)
+ relative_weight = 1.0 - direct_override_capability
+ angle_override_relative = self.apply_override_angle_relative(lat_active, driverTorque, vEgo, VM,
+ unwind_weight=relative_weight)
+
+ return angle_override_direct * direct_override_capability + angle_override_relative * relative_weight
+
+ def overriding_steer_desired_accel_limit(self, lat_active: bool, apply_angle: float, vEgo: float, steeringTorque: float) -> float:
+ """
+ Acceleration rate limiter - limits acceleration but allows for quick deceleration (no overshoot)
+ """
+ if not lat_active:
+ self.override_accel_rate_limiter.reset(apply_angle)
+ return apply_angle
+
+ if abs(steeringTorque) >= STEER_OVERRIDE_MIN_TORQUE:
+ self.override_active_counter = 0
+ else:
+ self.override_active_counter += DT_LAT_CTRL
+ self.override_active_counter = min(self.override_active_counter, STEER_DESIRED_LIMITER_OVERRIDE_ACTIVE_COUNTER)
+
+ max_angle_rate = CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE / DT_LAT_CTRL # MAX_ANGLE_RATE is per frame units so convert to real rate
+ # this ensures no acceleration limit when override is disabled:
+ max_angle_accel = max_angle_rate / DT_LAT_CTRL # ensures max deceleration
+ if vEgo < STEER_DESIRED_LIMITER_ALLOW_SPEED:
+ # Interpolate between STEER_DESIRED_LIMITER_ACCEL and max_angle_accel based on counter progress
+ max_angle_accel = np.interp(
+ self.override_active_counter,
+ [0, STEER_DESIRED_LIMITER_OVERRIDE_ACTIVE_COUNTER],
+ [STEER_DESIRED_LIMITER_ACCEL, max_angle_accel]
+ )
+ # max_angle_rate / DT_LAT_CTRL ensures max deceleration
+ return self.override_accel_rate_limiter.update(apply_angle, max_angle_rate, max_angle_accel, np.inf, DT_LAT_CTRL)
+
+ def resume_steer_desired_rate_limit(self, lat_active: bool, apply_angle: float, steering_angle: float) -> float:
+ """Limits steering wheel acceleration when resuming steering"""
+ if not lat_active:
+ # reset and bypass
+ self.resume_rate_limiter_delta.reset(0)
+ self.resume_rate_limiter.reset(steering_angle)
+ return steering_angle
+
+ angle_rate_delta_lim = self.resume_rate_limiter_delta.update(CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE,
+ STEER_RESUME_RATE_LIMIT_RAMP_RATE * DT_LAT_CTRL**2)
+ apply_angle_lim = self.resume_rate_limiter.update(apply_angle, angle_rate_delta_lim)
+ return apply_angle_lim
+
+ def update(self, apply_angle, lat_active, CP_IQ: structs.IQCarParams, CS: structs.CarState, VM: VehicleModel) -> TorqueBlendDataIQ:
+ # estimate real steering angle by adding rate to the tesla filtered angle
+ steeringAngleDegPhaseLead = CS.out.steeringAngleDeg + CS.out.steeringRateDeg / STEERING_DEG_PHASE_LEAD_COEFF
+
+ angle_coop_enabled = CP_IQ.flags & TeslaFlagsIQ.COOP_STEERING.value
+
+ # avoid sudden rotation on engagement
+ apply_angle = self.resume_steer_desired_rate_limit(lat_active, apply_angle, steeringAngleDegPhaseLead)
+
+ if angle_coop_enabled:
+ # apply_angle = self.overriding_steer_desired_accel_limit(lat_active, apply_angle, CS.out.vEgo, CS.out.steeringTorque)
+ self.debug_angle_desired_limited = apply_angle #! debug
+
+ apply_angle += self.apply_override_angle_combined(lat_active, CS.out.steeringTorque, CS.out.vEgo, VM)
+
+ # final rate limit - matching panda safety
+ self.coop_apply_angle_last = apply_angle
+ self.blend_apply_angle_last_sat = apply_steer_angle_limits_vm(apply_angle, self.blend_apply_angle_last_sat, CS.out.vEgoRaw,
+ CS.out.steeringAngleDeg, lat_active, TorqueBlendParams, VM)
+
+ return TorqueBlendDataIQ(self.blend_apply_angle_last_sat, lat_active, 1) # 1 = angle control
diff --git a/iqdbc_repo/iqdbc/lvbs/car/tesla/values.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/values.py
new file mode 100644
index 000000000..2ed839ceb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/tesla/values.py
@@ -0,0 +1,15 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from enum import IntFlag
+
+
+class TeslaFlagsIQ(IntFlag):
+ HAS_VEHICLE_BUS = 1 # 3-finger infotainment press signal is present on the VEHICLE bus with the deprecated Tesla harness installed
+ COOP_STEERING = 2 # virtual torque blending
+
+
+class TeslaSafetyFlagsIQ:
+ HAS_VEHICLE_BUS = 1
+
+
diff --git a/iqdbc_repo/iqdbc/lvbs/car/tests/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/tests/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/tests/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqdbc_repo/iqdbc/lvbs/car/tests/test_car_catalog.py b/iqdbc_repo/iqdbc/lvbs/car/tests/test_car_catalog.py
new file mode 100644
index 000000000..5ce5da3a9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/tests/test_car_catalog.py
@@ -0,0 +1,25 @@
+import json
+import os
+
+from iqdbc.car.common.basedir import BASEDIR
+from iqdbc.lvbs.car.car_catalog import build_car_catalog
+
+CATALOG_JSON = os.path.join(BASEDIR, "..", "..", "iqpilot", "selfdrive", "car", "vehicle_catalog.json")
+
+_KEY_TO_ATTR = {"id": "platform", "mk": "make", "grp": "brand", "mdl": "model", "yrs": "year", "req": "package"}
+
+
+def _decode(envelope) -> dict:
+ out = {}
+ for record in (envelope.get("vehicles") or {}).values():
+ out[record.get("label", "")] = {attr: record.get(key) for key, attr in _KEY_TO_ATTR.items()}
+ return out
+
+
+class TestCarList:
+ def test_generator(self):
+ generated = build_car_catalog()
+ with open(CATALOG_JSON) as f:
+ shipped = _decode(json.load(f))
+
+ assert shipped == generated, "Run: python -m openpilot.iqpilot.selfdrive.car.vehicle_catalog"
diff --git a/iqdbc_repo/iqdbc/lvbs/car/toyota/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqdbc_repo/iqdbc/lvbs/car/toyota/gas_interceptor.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/gas_interceptor.py
new file mode 100644
index 000000000..34ab7986a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/gas_interceptor.py
@@ -0,0 +1,47 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+import numpy as np
+
+from iqdbc.car import structs
+from iqdbc.car.can_definitions import CanData
+from iqdbc.car.toyota.values import CAR, MIN_ACC_SPEED, PEDAL_TRANSITION
+from iqdbc.lvbs.car import create_gas_interceptor_command
+
+
+class GasInterceptorCarController:
+ def __init__(self, CP, CP_IQ):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.gas = 0.
+ self.interceptor_gas_cmd = 0.
+
+ def create_gas_command(self, CC: structs.CarControl, CS: structs.CarState, actuators: structs.CarControl.Actuators,
+ packer, frame: int) -> list[CanData]:
+ can_sends = []
+
+ if self.CP_IQ.enableGasInterceptor and CC.longActive:
+ MAX_INTERCEPTOR_GAS = 0.3
+ # RAV4 has very sensitive gas pedal
+ if self.CP.carFingerprint in (CAR.TOYOTA_RAV4, CAR.TOYOTA_RAV4H, CAR.TOYOTA_HIGHLANDER):
+ PEDAL_SCALE = np.interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.15, 0.3, 0.0])
+ elif self.CP.carFingerprint in (CAR.TOYOTA_COROLLA,):
+ PEDAL_SCALE = np.interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.3, 0.4, 0.0])
+ else:
+ PEDAL_SCALE = np.interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.4, 0.5, 0.0])
+ # offset for creep and windbrake
+ pedal_offset = np.interp(CS.out.vEgo, [0.0, 2.3, MIN_ACC_SPEED + PEDAL_TRANSITION], [-.4, 0.0, 0.2])
+ pedal_command = PEDAL_SCALE * (actuators.accel + pedal_offset)
+ self.interceptor_gas_cmd = float(np.clip(pedal_command, 0., MAX_INTERCEPTOR_GAS))
+ else:
+ self.interceptor_gas_cmd = 0.
+
+ if frame % 2 == 0 and self.CP_IQ.enableGasInterceptor and self.CP.openpilotLongitudinalControl:
+ # send exactly zero if gas cmd is zero. Interceptor will send the max between read value and gas cmd.
+ # This prevents unexpected pedal range rescaling
+ can_sends.append(create_gas_interceptor_command(packer, self.interceptor_gas_cmd, frame // 2))
+ self.gas = self.interceptor_gas_cmd
+
+ return can_sends
diff --git a/iqdbc_repo/iqdbc/lvbs/car/toyota/iq_carstate.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/iq_carstate.py
new file mode 100644
index 000000000..df00ceec0
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/iq_carstate.py
@@ -0,0 +1,167 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from enum import StrEnum
+
+from iqdbc.car import Bus, structs
+from iqdbc.car.carlog import carlog
+from iqdbc.can.parser import CANParser
+from iqdbc.car.common.conversions import Conversions as CV
+from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ
+
+TRAFFIC_SIGNAL_MAP = {
+ 1: "kph",
+ 36: "mph",
+ 65: "No overtake",
+ 66: "No overtake"
+}
+
+ZSS_DIFF_THRESHOLD = 4
+ZSS_MAX_THRESHOLD = 10
+
+
+class IQCarState:
+ def __init__(self, CP, CP_IQ):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+
+ self.acc_type = 1
+ self.zss_compute = False
+ self.zss_cruise_active_last = False
+ self.zss_angle_offset = 0.
+ self.zss_threshold_count = 0
+
+ """Initialize traffic signal variables"""
+ self._tsgn1 = None
+ self._spdval1 = None
+ self._splsgn1 = None
+ self._tsgn2 = None
+ self._splsgn2 = None
+ self._tsgn3 = None
+ self._splsgn3 = None
+ self._tsgn4 = None
+ self._splsgn4 = None
+
+ @staticmethod
+ def traffic_signal_description(tsgn):
+ """Get description for traffic signal code"""
+ desc = TRAFFIC_SIGNAL_MAP.get(int(tsgn))
+ return f'{tsgn}: {desc}' if desc is not None else f'{tsgn}'
+
+ def update_traffic_signals(self, cp_cam):
+ """Update traffic signals with error handling"""
+ try:
+ # Add error handling for missing RSA messages
+ tsgn1 = cp_cam.vl.get("RSA1", {}).get('TSGN1', 0)
+ spdval1 = cp_cam.vl.get("RSA1", {}).get('SPDVAL1', 0)
+ splsgn1 = cp_cam.vl.get("RSA1", {}).get('SPLSGN1', 0)
+ tsgn2 = cp_cam.vl.get("RSA1", {}).get('TSGN2', 0)
+ splsgn2 = cp_cam.vl.get("RSA1", {}).get('SPLSGN2', 0)
+ tsgn3 = cp_cam.vl.get("RSA2", {}).get('TSGN3', 0)
+ splsgn3 = cp_cam.vl.get("RSA2", {}).get('SPLSGN3', 0)
+ tsgn4 = cp_cam.vl.get("RSA2", {}).get('TSGN4', 0)
+ splsgn4 = cp_cam.vl.get("RSA2", {}).get('SPLSGN4', 0)
+ except (KeyError, AttributeError) as e:
+ # Handle case where RSA messages are not available
+ carlog.debug(f"RSA messages not available: {e}")
+ return
+
+ has_changed = tsgn1 != self._tsgn1 \
+ or spdval1 != self._spdval1 \
+ or splsgn1 != self._splsgn1 \
+ or tsgn2 != self._tsgn2 \
+ or splsgn2 != self._splsgn2 \
+ or tsgn3 != self._tsgn3 \
+ or splsgn3 != self._splsgn3 \
+ or tsgn4 != self._tsgn4 \
+ or splsgn4 != self._splsgn4
+
+ self._tsgn1 = tsgn1
+ self._spdval1 = spdval1
+ self._splsgn1 = splsgn1
+ self._tsgn2 = tsgn2
+ self._splsgn2 = splsgn2
+ self._tsgn3 = tsgn3
+ self._splsgn3 = splsgn3
+ self._tsgn4 = tsgn4
+ self._splsgn4 = splsgn4
+
+ if not has_changed:
+ return
+
+ carlog.debug('---- TRAFFIC SIGNAL UPDATE -----')
+ if tsgn1 is not None and tsgn1 != 0:
+ carlog.debug(f'TSGN1: {self.traffic_signal_description(tsgn1)}')
+ if spdval1 is not None and spdval1 != 0:
+ carlog.debug(f'SPDVAL1: {spdval1}')
+ if splsgn1 is not None and splsgn1 != 0:
+ carlog.debug(f'SPLSGN1: {splsgn1}')
+ if tsgn2 is not None and tsgn2 != 0:
+ carlog.debug(f'TSGN2: {self.traffic_signal_description(tsgn2)}')
+ if splsgn2 is not None and splsgn2 != 0:
+ carlog.debug(f'SPLSGN2: {splsgn2}')
+ if tsgn3 is not None and tsgn3 != 0:
+ carlog.debug(f'TSGN3: {self.traffic_signal_description(tsgn3)}')
+ if splsgn3 is not None and splsgn3 != 0:
+ carlog.debug(f'SPLSGN3: {splsgn3}')
+ if tsgn4 is not None and tsgn4 != 0:
+ carlog.debug(f'TSGN4: {self.traffic_signal_description(tsgn4)}')
+ if splsgn4 is not None and splsgn4 != 0:
+ carlog.debug(f'SPLSGN4: {splsgn4}')
+ carlog.debug('------------------------')
+
+ def calculate_speed_limit(self):
+ """Calculate speed limit from traffic signals with validation"""
+ # Check all traffic sign slots for speed limits, not just tsgn1
+ for tsgn, spdval in [(self._tsgn1, self._spdval1),
+ (self._tsgn2, None),
+ (self._tsgn3, None),
+ (self._tsgn4, None)]:
+
+ if tsgn == 1 and spdval is not None and 0 < spdval <= 200: # Reasonable speed range
+ return spdval * CV.KPH_TO_MS
+
+ if tsgn == 36 and spdval is not None and 0 < spdval <= 120: # Reasonable MPH range
+ return spdval * CV.MPH_TO_MS
+
+ return 0
+
+ def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None:
+ cp = can_parsers[Bus.pt]
+ cp_cam = can_parsers[Bus.cam]
+
+ if self.CP_IQ.flags & ToyotaFlagsIQ.SMART_DSU or self.CP_IQ.flags & ToyotaFlagsIQ.STOP_AND_GO_HACK:
+ self.acc_type = 1
+
+ if self.CP_IQ.enableGasInterceptor:
+ gas = (cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] + cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"]) // 2
+ ret.gasPressed = gas > 805
+
+ # ZSS support thanks to zorrobyte, ErichMoraga, and dragonpilot
+ if self.CP_IQ.flags & ToyotaFlagsIQ.ZSS:
+ zorro_steer = cp.vl["SECONDARY_STEER_ANGLE"]["ZORRO_STEER"]
+ control_available = ret.cruiseState.available
+
+ # Only compute ZSS offset when control is available
+ if control_available and not self.zss_cruise_active_last:
+ self.zss_threshold_count = 0
+ self.zss_compute = True # Control was just activated, so allow offset to be recomputed
+ self.zss_cruise_active_last = control_available
+
+ # Compute ZSS offset once we have meaningful angles
+ if self.zss_compute and abs(ret.steeringAngleDeg) > 1e-3 and abs(zorro_steer) > 1e-3:
+ self.zss_compute = False
+ self.zss_angle_offset = zorro_steer - ret.steeringAngleDeg
+
+ # Sanity checks
+ steering_angle_deg = zorro_steer - self.zss_angle_offset
+ if self.zss_threshold_count <= ZSS_MAX_THRESHOLD:
+ if abs(ret.steeringAngleDeg - steering_angle_deg) > ZSS_DIFF_THRESHOLD:
+ self.zss_threshold_count += 1
+ else:
+ ret.steeringAngleDeg = steering_angle_deg
+
+ # Update traffic signals and speed limit
+ self.update_traffic_signals(cp_cam)
+ ret_iq.speedLimit = self.calculate_speed_limit()
diff --git a/iqdbc_repo/iqdbc/lvbs/car/toyota/iq_fingerprints.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/iq_fingerprints.py
new file mode 100644
index 000000000..07b4125fc
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/iq_fingerprints.py
@@ -0,0 +1,6 @@
+from iqdbc.car.structs import CarParams
+
+Ecu = CarParams.Ecu
+
+FW_VERSIONS_EXT = {
+}
diff --git a/iqdbc_repo/iqdbc/lvbs/car/toyota/values.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/values.py
new file mode 100644
index 000000000..8cef5d983
--- /dev/null
+++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/values.py
@@ -0,0 +1,21 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from enum import IntFlag
+
+
+class ToyotaFlagsIQ(IntFlag):
+ SMART_DSU = 1
+ RADAR_CAN_FILTER = 2
+ ZSS = 4
+ STOCK_LONGITUDINAL = 8
+ STOP_AND_GO_HACK = 16
+
+
+class ToyotaSafetyFlagsIQ:
+ DEFAULT = 0
+ UNSUPPORTED_DSU = 1
+ GAS_INTERCEPTOR = 2
+
+
diff --git a/iqdbc_repo/iqdbc/safety/__init__.py b/iqdbc_repo/iqdbc/safety/__init__.py
new file mode 100644
index 000000000..3285397c3
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/__init__.py
@@ -0,0 +1,15 @@
+# constants from can.h
+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 ALTERNATIVE_EXPERIENCE:
+ DEFAULT = 0
+ DISABLE_STOCK_AEB = 2
+ RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX = 8
+ ALLOW_AEB = 16
+
+ # iqpilot
+ ENABLE_AOL = 1024
+ AOL_DISENGAGE_LATERAL_ON_BRAKE = 2048
+ AOL_PAUSE_LATERAL_ON_BRAKE = 4096
diff --git a/iqdbc_repo/iqdbc/safety/tests/__init__.py b/iqdbc_repo/iqdbc/safety/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/safety/tests/aol_common.py b/iqdbc_repo/iqdbc/safety/tests/aol_common.py
new file mode 100644
index 000000000..f0435f310
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/aol_common.py
@@ -0,0 +1,372 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from parameterized import parameterized
+import abc
+import unittest
+
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+
+class AolSafetyTestBase(unittest.TestCase):
+ safety: libsafety_py.LibSafety
+
+ @abc.abstractmethod
+ def _lkas_button_msg(self, enabled):
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def _acc_state_msg(self, enabled):
+ raise NotImplementedError
+
+ def tearDown(self):
+ self.safety = libsafety_py.libsafety
+ self.safety.set_aol_button_press(-1)
+ self.safety.set_controls_allowed_lat(False)
+ self.safety.set_controls_requested_lat(False)
+ self.safety.set_acc_main_on(False)
+ self.safety.set_aol_params(False, False, False)
+ self.safety.set_heartbeat_engaged_aol(True)
+
+ def test_heartbeat_engaged_aol_check(self):
+ """Test AOL heartbeat engaged check behavior"""
+ for boolean in (True, False):
+ # If boolean is True, the heartbeat is engaged and should remain engaged, otherwise it should disengage.
+ with self.subTest(heartbeat_engaged=boolean, should_remain_engaged=boolean):
+ # Setup initial conditions
+ self.safety.set_aol_params(True, False, False) # Enable AOL
+ self.safety.set_controls_allowed_lat(True)
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # Set heartbeat engaged state based on test case
+ self.safety.set_heartbeat_engaged_aol(boolean)
+
+ # Call the heartbeat check function multiple times
+ # We know from the implementation that it takes 3 mismatches to disengage
+ for _ in range(4): # More than 3 times to ensure we pass the threshold
+ self.safety.aol_heartbeat_engaged_check()
+
+ # Verify engagement state matches expectation
+ self.assertEqual(self.safety.get_controls_allowed_lat(), boolean,
+ f"Expected controls_allowed_lat to be [{boolean}] but got [{self.safety.get_controls_allowed_lat()}]")
+
+ def test_enable_control_allowed_with_aol_button(self):
+ """Toggle AOL with AOL button"""
+ try:
+ self._lkas_button_msg(False)
+ except NotImplementedError as err:
+ raise unittest.SkipTest("Skipping test because AOL button is not supported") from err
+
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self.safety.set_aol_params(enable_aol, False, False)
+ self.assertEqual(enable_aol, self.safety.get_enable_aol())
+
+ self._rx(self._lkas_button_msg(True))
+ self._rx(self._lkas_button_msg(False))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ def test_enable_control_allowed_with_manual_acc_main_on_state(self):
+ try:
+ self._acc_state_msg(False)
+ except NotImplementedError as err:
+ raise unittest.SkipTest("Skipping test because _acc_state_msg is not implemented for this car") from err
+
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self.safety.set_aol_params(enable_aol, False, False)
+ self._rx(self._acc_state_msg(True))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ def test_enable_control_allowed_with_manual_aol_button_state(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ for aol_button_press in (-1, 0, 1):
+ with self.subTest("aol_button_press", button_state=aol_button_press):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ self.safety.set_aol_button_press(aol_button_press)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol and aol_button_press == 1, self.safety.get_controls_allowed_lat())
+
+ def test_enable_control_allowed_from_acc_main_on(self):
+ """Test that lateral controls are allowed when ACC main is enabled and disabled when ACC main is disabled"""
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ for acc_main_on in (True, False):
+ with self.subTest("initial_acc_main", initial_acc_main=acc_main_on):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ # Set initial state
+ self.safety.set_acc_main_on(acc_main_on)
+ self._rx(self._speed_msg(0))
+ expected_lat = enable_aol and acc_main_on
+ self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(),
+ f"Expected lat: [{expected_lat}] when acc_main_on goes to [{acc_main_on}]")
+
+ # Test transition to opposite state
+ self.safety.set_acc_main_on(not acc_main_on)
+ self._rx(self._speed_msg(0))
+ expected_lat = enable_aol and not acc_main_on
+ self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(),
+ f"Expected lat: [{expected_lat}] when acc_main_on goes from [{acc_main_on}] to [{not acc_main_on}]")
+
+ # Test transition back to initial state
+ self.safety.set_acc_main_on(acc_main_on)
+ self._rx(self._speed_msg(0))
+ expected_lat = enable_aol and acc_main_on
+ self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(),
+ f"Expected lat: [{expected_lat}] when acc_main_on goes from [{not acc_main_on}] to [{acc_main_on}]")
+
+ def test_aol_with_acc_main_on(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ self.safety.set_acc_main_on(True)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ self.safety.set_acc_main_on(False)
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ def test_pause_lateral_on_brake_setup(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ for pause_lateral_on_brake in (True, False):
+ with self.subTest("pause_lateral_on_brake", pause_lateral_on_brake=pause_lateral_on_brake):
+ self.safety.set_aol_params(enable_aol, False, pause_lateral_on_brake)
+ self.assertEqual(enable_aol and pause_lateral_on_brake, self.safety.get_pause_lateral_on_brake())
+
+ def test_pause_lateral_on_brake(self):
+ self.safety.set_aol_params(True, False, True)
+
+ self._rx(self._user_brake_msg(False))
+ self.safety.set_controls_requested_lat(True)
+ self.safety.set_controls_allowed_lat(True)
+
+ self._rx(self._user_brake_msg(True))
+ # Test we pause lateral
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ # Make sure we can re-gain lateral actuation
+ self._rx(self._user_brake_msg(False))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ def test_no_pause_lateral_on_brake(self):
+ self.safety.set_aol_params(True, False, False)
+
+ self._rx(self._user_brake_msg(False))
+ self.safety.set_controls_requested_lat(True)
+ self.safety.set_controls_allowed_lat(True)
+
+ self._rx(self._user_brake_msg(True))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ @parameterized.expand(["aol_button", "acc_main_on"])
+ def test_engage_with_brake_pressed(self, engage_method):
+ if engage_method == "aol_button":
+ try:
+ self._lkas_button_msg(False)
+ except NotImplementedError as err:
+ raise unittest.SkipTest("Skipping test because AOL button is not supported") from err
+ elif engage_method == "acc_main_on":
+ try:
+ self._acc_state_msg(False)
+ except NotImplementedError as err:
+ raise unittest.SkipTest("Skipping test because ACC main is not supported") from err
+
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ for pause_lateral_on_brake in (True, False):
+ with self.subTest("pause_lateral_on_brake", pause_lateral_on_brake=pause_lateral_on_brake):
+ with self.subTest(engage_method):
+ self.safety.set_aol_params(enable_aol, False, pause_lateral_on_brake)
+
+ # Brake press rising edge
+ self._rx(self._user_brake_msg(True))
+
+ if engage_method == "aol_button":
+ self._rx(self._lkas_button_msg(True))
+ elif engage_method == "acc_main_on":
+ self.safety.set_acc_main_on(True)
+ self.assertTrue(self.safety.get_acc_main_on())
+ else:
+ raise ValueError(f"Invalid engage_method: {engage_method}")
+ self._rx(self._speed_msg(0))
+
+ self.assertEqual(enable_aol and not pause_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ # Continuous braking after the first frame of brake press rising edge
+ for _ in range(400):
+ self.assertEqual(enable_aol and not pause_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ def test_pause_lateral_on_brake_with_pressed_and_released(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ for pause_lateral_on_brake in (True, False):
+ with self.subTest("pause_lateral_on_brake", pause_lateral_on_brake=pause_lateral_on_brake):
+ self.safety.set_aol_params(enable_aol, False, pause_lateral_on_brake)
+
+ # Set controls_allowed_lat rising edge
+ self.safety.set_controls_requested_lat(True)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ # User brake press, validate controls_allowed_lat is false
+ self._rx(self._user_brake_msg(True))
+ self.assertEqual(enable_aol and not pause_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ # User brake release, validate controls_allowed_lat is true
+ self._rx(self._user_brake_msg(False))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ def test_pause_lateral_on_brake_persistent_control_allowed_off(self):
+ self.safety.set_aol_params(True, False, True)
+
+ self.safety.set_controls_requested_lat(True)
+
+ # Vehicle moving, validate controls_allowed_lat is true
+ for _ in range(10):
+ self._rx(self._speed_msg(10))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # User braked, vehicle slowed down in 10 frames, then stopped for 10 frames
+ # Validate controls_allowed_lat is false
+ self._rx(self._user_brake_msg(True))
+ for _ in range(10):
+ self._rx(self._speed_msg(5))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ for _ in range(10):
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ def test_enable_lateral_control_with_controls_allowed_rising_edge(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ self.safety.set_controls_allowed(False)
+ self._rx(self._speed_msg(0))
+ self.safety.set_controls_allowed(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed())
+
+ def test_enable_control_allowed_with_aol_button_and_disable_with_main_cruise(self):
+ """Tests main cruise and AOL button state transitions.
+
+ Sequence:
+ 1. Main cruise off -> on
+ 2. AOL button engage
+ 3. Main cruise off
+
+ """
+ try:
+ self._lkas_button_msg(False)
+ except NotImplementedError as err:
+ raise unittest.SkipTest("Skipping test because AOL button is not supported") from err
+
+ try:
+ self._acc_state_msg(False)
+ except NotImplementedError as err:
+ raise unittest.SkipTest("Skipping test because _acc_state_msg is not implemented for this car") from err
+
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ self._rx(self._lkas_button_msg(True))
+ self._rx(self._lkas_button_msg(False))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ self._rx(self._acc_state_msg(True))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ self._rx(self._acc_state_msg(False))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ def test_brake_disengage_with_control_request(self):
+ """Tests behavior when controls are requested while brake is engaged
+
+ Sequence:
+ 1. Enable AOL with pause lateral on brake
+ 2. Brake to pause lateral control
+ 3. Set control request while braking
+ 4. Release brake
+ 5. Verify controls become allowed
+ """
+ self.safety.set_aol_params(True, False, True) # enable AOL with pause lateral on brake
+
+ # Initial state
+ self.safety.set_controls_allowed_lat(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # Brake press disengages lateral
+ self._rx(self._user_brake_msg(True))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Request controls while braking
+ self.safety.set_controls_requested_lat(True)
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Release brake - should enable since controls were requested
+ self._rx(self._user_brake_msg(False))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ def test_brake_disengage_with_acc_main_off(self):
+ """Tests behavior when ACC main is turned off while brake is engaged
+
+ Sequence:
+ 1. Enable AOL with pause lateral on brake
+ 2. Brake to pause lateral control
+ 3. Turn ACC main off while braking
+ 4. Release brake
+ 5. Verify controls remain disengaged
+ """
+ self.safety.set_aol_params(True, False, True) # enable AOL with pause lateral on brake
+
+ # Initial state - enable with ACC main
+ self.safety.set_acc_main_on(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # Brake press disengages lateral
+ self._rx(self._user_brake_msg(True))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Turn ACC main off while braking
+ self.safety.set_acc_main_on(False)
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Release brake - should remain disabled since ACC main is off
+ self._rx(self._user_brake_msg(False))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ def test_steering_disengage_with_control_request(self):
+ self.safety.set_aol_params(True, False, False)
+
+ self.safety.set_controls_allowed_lat(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ self.safety.set_steering_disengage(True)
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ def test_disengage_on_brake(self):
+ for disengage_on_brake in (True, False):
+ self.safety.set_aol_params(True, disengage_on_brake, False)
+
+ self.safety.set_controls_allowed_lat(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ self._rx(self._user_brake_msg(True))
+ self.assertEqual(not disengage_on_brake, self.safety.get_controls_allowed_lat())
+
+ self._rx(self._user_brake_msg(False))
+ self.assertEqual(not disengage_on_brake, self.safety.get_controls_allowed_lat())
+
+ # TODO-IQ: controls_allowed and controls_allowed_lat check for steering safety tests
diff --git a/iqdbc_repo/iqdbc/safety/tests/common.py b/iqdbc_repo/iqdbc/safety/tests/common.py
new file mode 100644
index 000000000..935fcb7c5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/common.py
@@ -0,0 +1,1151 @@
+import os
+import abc
+import math
+import unittest
+import importlib
+import numpy as np
+from collections.abc import Callable
+
+from iqdbc.can import CANPacker
+from iqdbc.safety import ALTERNATIVE_EXPERIENCE
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+from iqdbc.safety.tests.aol_common import AolSafetyTestBase
+
+MAX_WRONG_COUNTERS = 5
+MAX_SAMPLE_VALS = 6
+VEHICLE_SPEED_FACTOR = 1000
+RT_INTERVAL = 250000 # 250ms
+
+# Max allowed delta between car speeds
+MAX_SPEED_DELTA = 2.0 # m/s
+
+MessageFunction = Callable[[float], libsafety_py.CANPacket]
+
+
+def sign_of(a):
+ return 1 if a > 0 else -1
+
+
+def away_round(x):
+ # non-banker's/away from zero rounding, C++ CANParser uses this style
+ return math.floor(x + 0.5) if x >= 0 else math.ceil(x - 0.5)
+
+
+def round_speed(v):
+ return round(v * VEHICLE_SPEED_FACTOR) / VEHICLE_SPEED_FACTOR
+
+
+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 CANPackerSafety(CANPacker):
+ def make_can_msg_safety(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 SafetyTestBase(unittest.TestCase):
+ safety: libsafety_py.LibSafety | None
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "SafetyTestBase":
+ 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(SafetyTestBase, 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]:
+ for gas_pressed in [True, False]:
+ self.safety.set_controls_allowed(controls_allowed)
+ self.safety.set_gas_pressed_prev(gas_pressed)
+ self.safety.set_alternative_experience(alternative_experience)
+ if self.LONGITUDINAL:
+ gas_allowed = controls_allowed
+ brake_allowed = controls_allowed and not gas_pressed
+ longitudinal_allowed = gas_allowed if accel >= 0 else brake_allowed
+ should_tx = longitudinal_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(SafetyTestBase, 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
+ MIN_POSSIBLE_GAS: int = 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)
+
+ assert self.MAX_BRAKE is not None and self.MAX_GAS is not None
+ 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, self.MIN_POSSIBLE_GAS, self.MAX_POSSIBLE_GAS, 1, self.INACTIVE_GAS)
+
+
+class TorqueSteeringSafetyTestBase(SafetyTestBase, abc.ABC):
+
+ MAX_RATE_UP = 0
+ MAX_RATE_DOWN = 0
+ MAX_TORQUE_LOOKUP: tuple[list[float], list[int]] = ([0], [0])
+ DYNAMIC_MAX_TORQUE = False
+ MAX_RT_DELTA = 0
+
+ NO_STEER_REQ_BIT = False
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "TorqueSteeringSafetyTestBase":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ @property
+ def MAX_TORQUE(self):
+ return max(self.MAX_TORQUE_LOOKUP[1])
+
+ @property
+ def _torque_speed_range(self):
+ if not self.DYNAMIC_MAX_TORQUE:
+ return [0]
+ else:
+ # test with more precision inside breakpoint range
+ min_speed = min(self.MAX_TORQUE_LOOKUP[0])
+ max_speed = max(self.MAX_TORQUE_LOOKUP[0])
+ return np.concatenate([np.arange(0, min_speed, 5), np.arange(min_speed, max_speed, 0.5), np.arange(max_speed, 40, 5)])
+
+ def _get_max_torque(self, speed):
+ # matches safety fudge
+ torque = int(np.interp(speed - 1, self.MAX_TORQUE_LOOKUP[0], self.MAX_TORQUE_LOOKUP[1]) + 1)
+ return min(torque, self.MAX_TORQUE)
+
+ @abc.abstractmethod
+ def _torque_cmd_msg(self, torque, steer_req=1):
+ pass
+
+ @abc.abstractmethod
+ def _speed_msg(self, speed):
+ pass
+
+ def _reset_speed_measurement(self, speed):
+ for _ in range(MAX_SAMPLE_VALS):
+ self._rx(self._speed_msg(speed))
+
+ 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 speed in self._torque_speed_range:
+ self._reset_speed_measurement(speed)
+ max_torque = self._get_max_torque(speed)
+ for enabled in [0, 1]:
+ for t in range(int(-max_torque * 1.5), int(max_torque * 1.5)):
+ self.safety.set_controls_allowed(enabled)
+ self._set_prev_torque(t)
+ if abs(t) > 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
+ STEER_STEP: int = 1
+
+ @property
+ def MIN_VALID_STEERING_RT_INTERVAL(self):
+ # a ~10% buffer
+ return int((self.MIN_VALID_STEERING_FRAMES + 1) * self.STEER_STEP * 10000 * 0.9)
+
+ 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)
+
+ for speed in self._torque_speed_range:
+ self._reset_speed_measurement(speed)
+ max_torque = self._get_max_torque(speed)
+
+ # 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(max_torque * sign)
+ should_tx = abs(driver_torque) <= self.DRIVER_TORQUE_ALLOWANCE
+ self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(max_torque * sign)))
+
+ # arbitrary high driver torque to ensure max steer torque is allowed
+ max_driver_torque = int(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 = (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(max_torque * sign)
+ self._reset_torque_driver_measurement(-max_driver_torque * sign)
+ self.assertTrue(self._tx(self._torque_cmd_msg((max_torque - self.MAX_RATE_DOWN) * sign)))
+ self._set_prev_torque(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(max_torque * sign)
+ self._reset_torque_driver_measurement(-max_driver_torque * sign)
+ self.assertFalse(self._tx(self._torque_cmd_msg((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(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 speed in self._torque_speed_range:
+ self._reset_speed_measurement(speed)
+ max_torque = self._get_max_torque(speed)
+ for controls_allowed in [True, False]:
+ for torque in np.arange(-max_torque - 1000, 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 = (-max_torque <= torque <= 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)
+
+ for speed in self._torque_speed_range:
+ self._reset_speed_measurement(speed)
+ max_torque = self._get_max_torque(speed)
+
+ torque_meas = max_torque - self.MAX_TORQUE_ERROR - 50
+
+ self.safety.set_rt_torque_last(max_torque)
+ self.safety.set_torque_meas(torque_meas, torque_meas)
+ self.safety.set_desired_torque_last(max_torque)
+ self.assertTrue(self._tx(self._torque_cmd_msg(max_torque - self.MAX_RATE_DOWN)))
+
+ self.safety.set_rt_torque_last(max_torque)
+ self.safety.set_torque_meas(torque_meas, torque_meas)
+ self.safety.set_desired_torque_last(max_torque)
+ self.assertFalse(self._tx(self._torque_cmd_msg(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(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 VehicleSpeedSafetyTest(SafetyTestBase):
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "VehicleSpeedSafetyTest":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ @abc.abstractmethod
+ def _speed_msg(self, speed):
+ pass
+
+ 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)
+
+
+class AngleSteeringSafetyTest(VehicleSpeedSafetyTest):
+
+ STEER_ANGLE_MAX: float = 300
+ STEER_ANGLE_TEST_MAX: float | None = None
+ DEG_TO_CAN: float
+ ANGLE_RATE_BP: list[float]
+ ANGLE_RATE_UP: list[float] # windup limit
+ ANGLE_RATE_DOWN: list[float] # unwind limit
+
+ # Real time limits
+ LATERAL_FREQUENCY: int = -1 # Hz
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "AngleSteeringSafetyTest":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ @abc.abstractmethod
+ def _angle_cmd_msg(self, angle: float, enabled: bool, increment_timer: bool = True):
+ pass
+
+ @abc.abstractmethod
+ def _angle_meas_msg(self, angle: float):
+ pass
+
+ def _get_steer_cmd_angle_max(self, speed):
+ return self.STEER_ANGLE_MAX
+
+ 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_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.]
+ # TODO: what should CANPacker do here? we should also have good coverage checks on this
+ if self.STEER_ANGLE_TEST_MAX is None:
+ self.STEER_ANGLE_TEST_MAX = self.STEER_ANGLE_MAX * 2
+ angles = np.concatenate((np.arange(-self.STEER_ANGLE_TEST_MAX, self.STEER_ANGLE_TEST_MAX, 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)))
+
+ def test_angle_violation(self):
+ # If violation occurs, angle cmd is blocked until reset to 0. Matches behavior of torque safety modes
+ self.safety.set_controls_allowed(True)
+
+ for speed in (0., 1., 5., 10., 15., 50.):
+ self._tx(self._angle_cmd_msg(0, True))
+ self._reset_speed_measurement(speed)
+
+ for _ in range(20):
+ self.assertFalse(self._tx(self._angle_cmd_msg(self._get_steer_cmd_angle_max(speed), True)))
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
+
+ def test_rt_limits(self):
+ # TODO: remove and check all safety modes
+ if self.LATERAL_FREQUENCY == -1:
+ raise unittest.SkipTest("No real time limits")
+
+ # Angle safety enforces real time limits by checking the message send frequency in a 250ms time window
+ self.safety.set_timer(0)
+ self.safety.set_controls_allowed(True)
+ max_rt_msgs = int(self.LATERAL_FREQUENCY * RT_INTERVAL / 1e6 * 1.2 + 1) # 1.2x buffer
+
+ for i in range(max_rt_msgs * 2):
+ should_tx = i <= max_rt_msgs
+ self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
+
+ # One under RT interval should do nothing
+ self.safety.set_timer(RT_INTERVAL - 1)
+ for _ in range(5):
+ self.assertFalse(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
+
+ # Increment timer and send 1 message to reset RT window
+ self.safety.set_timer(RT_INTERVAL)
+ self.assertFalse(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
+ for _ in range(5):
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
+
+
+class SafetyTest(SafetyTestBase):
+ TX_MSGS: list[list[int]] = []
+ 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__ == "SafetyTest" 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:
+ try:
+ test = importlib.import_module("iqdbc.safety.tests."+tf[:-3])
+ except ImportError:
+ continue
+ 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('TestElm327'):
+ 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', 'TestGmAscmSafety',
+ 'TestGmCameraEVSafety', 'TestGmCameraLongitudinalEVSafety', 'TestGmAscmEVSafety',
+ 'TestGmCameraNonACCSafety', 'TestGmCameraEVNonACCSafety'}):
+ 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({'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong'}):
+ continue
+ base_tests = {'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong',
+ 'TestHyundaiLongitudinalESCCSafety'}
+ if any(attr.startswith(test) for test in base_tests) and any(current_test.startswith(test) for test in base_tests):
+ continue
+ volkswagen_shared = ('TestVolkswagenMqb', 'TestVolkswagenMlb', 'TestVolkswagenMeb')
+ if attr.startswith(volkswagen_shared) and current_test.startswith(volkswagen_shared):
+ 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))
+ if attr.startswith('TestSubaru') and current_test == 'TestVolkswagenMqbLongSafety':
+ tx = list(filter(lambda m: m[0] not in [0x122, ], tx))
+
+ # Volkswagen MQB/MLB and Honda Nidec ACC HUD messages overlap
+ if attr in ('TestVolkswagenMqbLongSafety', 'TestVolkswagenMlbLongSafety') and current_test.startswith('TestHondaNidec'):
+ tx = list(filter(lambda m: m[0] not in [0x30c, ], tx))
+
+ # Volkswagen MQB/MLB and Honda Bosch Radarless ACC HUD messages overlap
+ if attr in ('TestVolkswagenMqbLongSafety', 'TestVolkswagenMlbLongSafety') 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 CarSafetyTest(SafetyTest, AolSafetyTestBase):
+ 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__ == "CarSafetyTest" 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
+
+ @abc.abstractmethod
+ def _speed_msg_2(self, speed: float):
+ 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, hex(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_no_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.assertTrue(self.safety.get_controls_allowed())
+ self.assertFalse(self.safety.get_longitudinal_allowed())
+ self.assertTrue(self.safety.get_longitudinal_gas_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_brake_allowed())
+ self.assertTrue(self.safety.get_longitudinal_gas_allowed())
+ self._rx(_user_brake_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed())
+ self.assertTrue(self.safety.get_longitudinal_brake_allowed())
+ self.assertTrue(self.safety.get_longitudinal_gas_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_brake_allowed())
+ self.assertFalse(self.safety.get_longitudinal_gas_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_brake_allowed())
+ self.assertTrue(self.safety.get_longitudinal_gas_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_brake_allowed())
+ self.assertFalse(self.safety.get_longitudinal_gas_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_rx_hook_speed_mismatch(self):
+ if self._speed_msg_2(0) is None:
+ raise unittest.SkipTest("No second speed message for this safety mode")
+
+ 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) <= MAX_SPEED_DELTA
+ self.assertEqual(self.safety.get_controls_allowed(), within_delta)
+
+ def test_safety_tick(self):
+ self.safety.set_timer(int(2e6))
+ self.safety.set_controls_allowed(True)
+ self.safety.set_controls_allowed_lat(True)
+ self.safety.safety_tick_current_safety_config()
+ self.assertFalse(self.safety.get_controls_allowed())
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ self.assertFalse(self.safety.safety_config_valid())
diff --git a/iqdbc_repo/iqdbc/safety/tests/gas_interceptor_common.py b/iqdbc_repo/iqdbc/safety/tests/gas_interceptor_common.py
new file mode 100644
index 000000000..20eba2326
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/gas_interceptor_common.py
@@ -0,0 +1,82 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+import numpy as np
+import unittest
+
+from iqdbc.safety.tests.common import CANPackerSafety, CarSafetyTest
+
+
+class GasInterceptorSafetyTest(CarSafetyTest):
+
+ INTERCEPTOR_THRESHOLD = 0
+
+ cnt_gas_cmd = 0
+ cnt_user_gas = 0
+
+ packer: CANPackerSafety
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "GasInterceptorSafetyTest" or cls.__name__.endswith("Base"):
+ cls.safety = None
+ raise unittest.SkipTest
+
+ def _interceptor_gas_cmd(self, gas: int):
+ values: dict[str, float | int] = {"PEDAL_COUNTER": self.__class__.cnt_gas_cmd & 0xF}
+ if gas > 0:
+ values["GAS_COMMAND"] = gas * 255.
+ values["GAS_COMMAND2"] = gas * 255.
+ self.__class__.cnt_gas_cmd += 1
+ return self.packer.make_can_msg_safety("GAS_COMMAND", 0, values)
+
+ def _interceptor_user_gas(self, gas: int):
+ values = {"INTERCEPTOR_GAS": gas, "INTERCEPTOR_GAS2": gas,
+ "PEDAL_COUNTER": self.__class__.cnt_user_gas}
+ self.__class__.cnt_user_gas += 1
+ return self.packer.make_can_msg_safety("GAS_SENSOR", 0, values)
+
+ # Skip non-interceptor user gas tests
+ def test_prev_gas(self):
+ pass
+
+ def test_no_disengage_on_gas(self):
+ pass
+
+ def test_prev_gas_interceptor(self):
+ self._rx(self._interceptor_user_gas(0x0))
+ self.assertFalse(self.safety.get_gas_interceptor_prev())
+ self._rx(self._interceptor_user_gas(0x1000))
+ self.assertTrue(self.safety.get_gas_interceptor_prev())
+ self._rx(self._interceptor_user_gas(0x0))
+
+ def test_no_disengage_on_gas_interceptor(self):
+ self.safety.set_controls_allowed(True)
+ for g in range(0x1000):
+ self._rx(self._interceptor_user_gas(g))
+ # Test we allow lateral, but not longitudinal
+ self.assertTrue(self.safety.get_controls_allowed())
+ self.assertEqual(g <= self.INTERCEPTOR_THRESHOLD, self.safety.get_longitudinal_brake_allowed())
+ self.assertTrue(self.safety.get_longitudinal_gas_allowed())
+ # Make sure we can re-gain longitudinal actuation
+ self._rx(self._interceptor_user_gas(0))
+ self.assertTrue(self.safety.get_longitudinal_brake_allowed())
+ self.assertTrue(self.safety.get_longitudinal_gas_allowed())
+
+ def test_allow_engage_with_gas_interceptor_pressed(self):
+ self._rx(self._interceptor_user_gas(0x1000))
+ self.safety.set_controls_allowed(True)
+ self._rx(self._interceptor_user_gas(0x1000))
+ self.assertTrue(self.safety.get_controls_allowed())
+ self._rx(self._interceptor_user_gas(0))
+
+ def test_gas_interceptor_safety_check(self):
+ for gas in np.arange(0, 4000, 100):
+ for controls_allowed in [True, False]:
+ self.safety.set_controls_allowed(controls_allowed)
+ if controls_allowed:
+ send = True
+ else:
+ send = gas == 0
+ self.assertEqual(send, self._tx(self._interceptor_gas_cmd(gas)))
diff --git a/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py b/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py
new file mode 100644
index 000000000..b5ea09d47
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py
@@ -0,0 +1,46 @@
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+
+def packet(addr: int, bus: int, length: int, updates: dict[int, int] | None = None):
+ data = bytearray(length)
+ for index, value in (updates or {}).items():
+ data[index] = value
+ return libsafety_py.make_CANPacket(addr, bus, data)
+
+
+def classic_steer(torque: int, request: bool = True):
+ value = torque + 1024
+ word = (value << 16) | (int(request) << 27)
+ return packet(0x340, 0, 8, {i: (word >> (8 * i)) & 0xFF for i in range(4)})
+
+
+def canfd_steer(addr: int, length: int, torque: int, request: bool = True):
+ value = torque + 1024
+ return packet(addr, 0, length, {
+ 5: (value & 0x7F) << 1,
+ 6: ((value >> 7) & 0xF) | (int(request) << 4),
+ })
+
+
+def classic_accel(accel: int, *, aeb_decel: int = 0, aeb_request: bool = False):
+ value = accel + 1023
+ return packet(0x421, 0, 8, {
+ 2: aeb_decel,
+ 3: value & 0xFF,
+ 4: ((value >> 8) & 0x7) | ((value & 0x7) << 5),
+ 5: (value >> 3) & 0xFF,
+ 6: int(aeb_request) << 6,
+ })
+
+
+def canfd_accel(accel: int, *, acc_mode: int = 0, bus: int = 0):
+ value = accel + 1023
+ return packet(0x1A0, bus, 32, {
+ 8: (acc_mode & 0x7) << 4,
+ 16: value & 0xFF,
+ 17: ((value >> 8) & 0x7) | ((value & 0xF) << 4),
+ 18: (value >> 4) & 0xFF,
+ })
+
+
+TESTER_PRESENT = bytes.fromhex("023e800000000000")
diff --git a/iqdbc_repo/iqdbc/safety/tests/libsafety/__init__.py b/iqdbc_repo/iqdbc/safety/tests/libsafety/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/safety/tests/libsafety/libsafety_py.py b/iqdbc_repo/iqdbc/safety/tests/libsafety/libsafety_py.py
new file mode 100644
index 000000000..2c0290ebd
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/libsafety/libsafety_py.py
@@ -0,0 +1,120 @@
+import os
+from cffi import FFI
+
+from iqdbc.safety import LEN_TO_DLC
+
+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)
+class CANPacket:
+ pass
+
+ffi.cdef("""
+bool safety_rx_hook(CANPacket_t *msg);
+bool safety_tx_hook(CANPacket_t *msg);
+int safety_fwd_hook(int bus_num, int addr);
+int set_safety_hooks(uint16_t mode, uint16_t param);
+
+void set_controls_allowed(bool c);
+bool get_controls_allowed(void);
+void set_heartbeat_engaged(bool c);
+bool get_longitudinal_allowed(void);
+bool get_longitudinal_gas_allowed(void);
+bool get_longitudinal_brake_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_steering_disengage_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);
+
+bool get_lat_active(void);
+bool get_controls_allowed_lat(void);
+bool get_controls_requested_lat(void);
+void set_current_safety_param_iq(uint16_t param);
+uint16_t get_current_safety_param_iq(void);
+bool get_enable_aol(void);
+bool get_disengage_lateral_on_brake(void);
+bool get_pause_lateral_on_brake(void);
+void set_aol_button_press(int aol_button_press);
+void set_controls_allowed_lat(bool c);
+void set_controls_requested_lat(bool c);
+bool get_aol_acc_main(void);
+void set_acc_main_on(bool c);
+int get_aol_button_press(void);
+void aol_set_current_disengage_reason(int reason);
+int aol_get_current_disengage_reason(void);
+int get_temp_debug(void);
+uint32_t get_acc_main_on_mismatches(void);
+void set_aol_params(bool enable_aol, bool disengage_lateral_on_brake, bool pause_lateral_on_brake);
+void set_heartbeat_engaged_aol(bool c);
+void aol_heartbeat_engaged_check(void);
+void set_steering_disengage(bool c);
+int get_gas_interceptor_prev(void);
+""")
+
+class LibSafety:
+ pass
+libsafety: LibSafety = ffi.dlopen(libsafety_fn)
+
+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)
+ return ret
diff --git a/iqdbc_repo/iqdbc/safety/tests/misra/.gitignore b/iqdbc_repo/iqdbc/safety/tests/misra/.gitignore
new file mode 100644
index 000000000..fc9ac228c
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/misra/.gitignore
@@ -0,0 +1,5 @@
+*.pdf
+*.txt
+.output.log
+new_table
+cppcheck/
diff --git a/iqdbc_repo/iqdbc/safety/tests/misra/checkers.txt b/iqdbc_repo/iqdbc/safety/tests/misra/checkers.txt
new file mode 100644
index 000000000..8aa0ddd08
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/misra/checkers.txt
@@ -0,0 +1,456 @@
+Cppcheck checkers list from test_misra.sh:
+
+
+
+
+
+TEST variant options:
+--enable=all --enable=unusedFunction --addon=misra -DCANFD /iqdbc/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
+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::analyseWholeProgram
+Yes CheckUninitVar::check
+Yes CheckUninitVar::valueFlowUninit
+Yes CheckUnusedFunctions::check
+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/iqdbc_repo/iqdbc/safety/tests/misra/coverage_table b/iqdbc_repo/iqdbc/safety/tests/misra/coverage_table
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqdbc_repo/iqdbc/safety/tests/misra/install.sh b/iqdbc_repo/iqdbc/safety/tests/misra/install.sh
new file mode 100755
index 000000000..f586fc32d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/misra/install.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+: "${CPPCHECK_DIR:=$DIR/cppcheck/}"
+
+# skip if we're running in parallel with test_mutation.py
+if [ ! -z "$OPENDBC_ROOT" ]; then
+ exit 0
+fi
+
+if [ ! -d "$CPPCHECK_DIR" ]; then
+ git clone https://github.com/danmar/cppcheck.git $CPPCHECK_DIR
+fi
+
+cd $CPPCHECK_DIR
+
+VERS="2.19.1"
+if [ "$(git describe --tags --always)" != "$VERS" ]; then
+ git fetch --all --tags --force
+ git checkout $VERS
+fi
+
+#make clean
+make MATCHCOMPILTER=yes CXXFLAGS="-O2" -j8
diff --git a/iqdbc_repo/iqdbc/safety/tests/misra/suppressions.txt b/iqdbc_repo/iqdbc/safety/tests/misra/suppressions.txt
new file mode 100644
index 000000000..4800a270b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/misra/suppressions.txt
@@ -0,0 +1,21 @@
+# 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/iqdbc_repo/iqdbc/safety/tests/misra/test_misra.sh b/iqdbc_repo/iqdbc/safety/tests/misra/test_misra.sh
new file mode 100755
index 000000000..86be98e84
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/misra/test_misra.sh
@@ -0,0 +1,71 @@
+#!/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/}"
+
+# ensure checked in coverage table is up to date
+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
+
+cd $BASEDIR
+
+CHECKLIST=$(mktemp)
+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"
+
+ # note that cppcheck build cache results in inconsistent results as of v2.13.0
+ OUTPUT=$(mktemp)
+
+ echo -e "\n\n\n\n\nTEST variant options:" >> $CHECKLIST
+ echo -e ""${@//$BASEDIR/}"\n\n" >> $CHECKLIST # (absolute path removed)
+
+ OPENDBC_ROOT=${OPENDBC_ROOT:-$BASEDIR}
+ $CPPCHECK_DIR/cppcheck --inline-suppr -I $OPENDBC_ROOT \
+ --suppress=missingIncludeSystem \
+ --suppressions-list=$DIR/suppressions.txt \
+ --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
+}
+
+OPTS=" --enable=all --enable=unusedFunction --addon=misra"
+
+printf "\n${GREEN}** Safety **${NC}\n"
+cppcheck $OPTS $BASEDIR/iqdbc/safety/tests/misra/main.c
+
+printf "\n${GREEN}Success!${NC} took $SECONDS seconds\n"
+
+# ensure list of checkers is up to date
+if [ -z "$OPENDBC_ROOT" ]; then
+ cd $DIR
+ if ! git diff --quiet $CHECKLIST; then
+ echo -e "\n${YELLOW}WARNING: Cppcheck checkers.txt report has changed. Review and commit...${NC}"
+ mv $CHECKLIST $DIR/checkers.txt
+ exit 4
+ fi
+fi
diff --git a/iqdbc_repo/iqdbc/safety/tests/misra/test_mutation.py b/iqdbc_repo/iqdbc/safety/tests/misra/test_mutation.py
new file mode 100644
index 000000000..295a73d50
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/misra/test_mutation.py
@@ -0,0 +1,66 @@
+#!/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 = (
+ 'iqdbc/safety/main.c',
+ 'iqdbc/safety/tests/',
+)
+
+mutations = [
+ # no mutation, should pass
+ (None, None, lambda s: s, False),
+]
+
+patterns = [
+ ("misra-c2012-10.3", lambda s: s + "\nvoid test(float len) { for (float j = 0; j < len; j++) {;} }\n"),
+ ("misra-c2012-13.3", lambda s: s + "\nvoid test(int tmp) { int tmp2 = tmp++ + 2; if (tmp2) {;}}\n"),
+ ("misra-c2012-13.4", lambda s: s + "\nint test(int x, int y) { return (x=2) && (y=2); }\n"),
+ ("misra-c2012-13.5", lambda s: s + "\nvoid test(int tmp) { if (true && tmp++) {;} }\n"),
+ ("misra-c2012-13.6", lambda s: s + "\nvoid test(int tmp) { if (sizeof(tmp++)) {;} }\n"),
+ ("misra-c2012-14.2", lambda s: s + "\nvoid test(int cnt) { for (cnt=0;;cnt++) {;} }\n"),
+ ("misra-c2012-14.4", lambda s: s + "\nvoid test(int len) { if (len - 8) {;} }\n"),
+ ("misra-c2012-16.4", lambda s: s + "\nvoid test(int temp) {switch (temp) { case 1: ; }}\n"),
+ ("misra-c2012-20.4", lambda s: s + "\n#define auto 1\n"),
+ ("misra-c2012-20.5", lambda s: s + "\n#define TEST 1\n#undef TEST\n"),
+]
+
+all_files = glob.glob('iqdbc/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))
+
+mutations = random.sample(mutations, 2) # can remove this once cppcheck is faster
+
+
+@pytest.mark.parametrize("fn, rule, transform, should_fail", mutations)
+def test_misra_mutation(fn, rule, transform, should_fail):
+ with tempfile.TemporaryDirectory() as tmp:
+ shutil.copytree(ROOT, tmp, dirs_exist_ok=True,
+ ignore=shutil.ignore_patterns('.venv', 'cppcheck', '.git', '*.ctu-info', '.hypothesis'))
+
+ # apply patch
+ if fn is not None:
+ with open(os.path.join(tmp, fn), 'r+') as f:
+ content = f.read()
+ f.seek(0)
+ f.write(transform(content))
+
+ # run test
+ r = subprocess.run(f"OPENDBC_ROOT={tmp} iqdbc/safety/tests/misra/test_misra.sh",
+ stdout=subprocess.PIPE, cwd=ROOT, shell=True, encoding='utf8')
+ print(r.stdout) # helpful for debugging failures
+ failed = r.returncode != 0
+ assert failed == should_fail
+ if should_fail:
+ assert rule in r.stdout, "MISRA test failed but not for the correct violation"
\ No newline at end of file
diff --git a/iqdbc_repo/iqdbc/safety/tests/mutation.sh b/iqdbc_repo/iqdbc/safety/tests/mutation.sh
new file mode 100755
index 000000000..3a46b0056
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/mutation.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+source $DIR/../../../setup.sh
+
+GIT_REF="${GIT_REF:-origin/master}"
+GIT_ROOT=$(git rev-parse --show-toplevel)
+cat > $GIT_ROOT/mull.yml <= (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 in (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy):
+ ret = addr == 832
+ elif mode == CarParams.SafetyModel.hyundaiCanfd:
+ ret = addr == (0x110 if param & HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT else
+ 0x50 if param & HyundaiSafetyFlags.CANFD_LKA_STEERING else
+ 0x12A)
+ 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
+ elif mode == CarParams.SafetyModel.tesla:
+ ret = addr == 0x488
+ return ret
+
+
+def get_steer_value(mode, param, msg):
+ # TODO: use CANParser
+ torque, angle = 0, 0
+ if mode in (CarParams.SafetyModel.hondaNidec, CarParams.SafetyModel.hondaBosch):
+ torque = (msg.data[0] << 8) | msg.data[1]
+ torque = to_signed(torque, 16)
+ elif mode == CarParams.SafetyModel.toyota:
+ if param & ToyotaSafetyFlags.LTA:
+ angle = (msg.data[1] << 8) | msg.data[2]
+ angle = to_signed(angle, 16)
+ else:
+ torque = (msg.data[1] << 8) | (msg.data[2])
+ torque = to_signed(torque, 16)
+ elif mode == CarParams.SafetyModel.gm:
+ torque = ((msg.data[0] & 0x7) << 8) | msg.data[1]
+ torque = to_signed(torque, 11)
+ elif mode in (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy):
+ torque = (((msg.data[3] & 0x7) << 8) | msg.data[2]) - 1024
+ elif mode == CarParams.SafetyModel.hyundaiCanfd:
+ torque = ((msg.data[5] >> 1) | (msg.data[6] & 0xF) << 7) - 1024
+ elif mode == CarParams.SafetyModel.chrysler:
+ torque = (((msg.data[0] & 0x7) << 8) | msg.data[1]) - 1024
+ elif mode == CarParams.SafetyModel.subaru:
+ torque = ((msg.data[3] & 0x1F) << 8) | msg.data[2]
+ torque = -to_signed(torque, 13)
+ elif mode == CarParams.SafetyModel.ford:
+ if param & FordSafetyFlags.CANFD:
+ angle = ((msg.data[2] << 3) | (msg.data[3] >> 5)) - 1000
+ else:
+ angle = ((msg.data[0] << 3) | (msg.data[1] >> 5)) - 1000
+ elif mode == CarParams.SafetyModel.nissan:
+ angle = (msg.data[0] << 10) | (msg.data[1] << 2) | (msg.data[2] >> 6)
+ angle = -angle + (1310 * 100)
+ elif mode == CarParams.SafetyModel.rivian:
+ torque = ((msg.data[2] << 3) | (msg.data[3] >> 5)) - 1024
+ elif mode == CarParams.SafetyModel.tesla:
+ angle = (((msg.data[0] & 0x7F) << 8) | (msg.data[1])) - 16384 # ceil(1638.35/0.1)
+ 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
+
+ msg = package_can_msg(msg)
+ torque, angle = get_steer_value(mode, param, msg)
+ if torque != 0:
+ safety.set_controls_allowed(1)
+ safety.set_controls_allowed_lat(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_controls_allowed_lat(1)
+ safety.set_desired_angle_last(angle)
+ safety.set_angle_meas(angle, angle)
+ assert safety.safety_tx_hook(msg), "failed to initialize safety for segment"
diff --git a/iqdbc_repo/iqdbc/safety/tests/safety_replay/replay_drive.py b/iqdbc_repo/iqdbc/safety/tests/safety_replay/replay_drive.py
new file mode 100755
index 000000000..b8fa4fe57
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/safety_replay/replay_drive.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python3
+import argparse
+import os
+from collections import Counter, defaultdict
+from tqdm import tqdm
+
+from iqdbc.safety import ALTERNATIVE_EXPERIENCE
+from iqdbc.safety.tests.libsafety import libsafety_py
+from iqdbc.car.carlog import carlog
+from iqdbc.safety.tests.safety_replay.helpers import package_can_msg, init_segment
+
+# Define debug variables and their getter methods
+DEBUG_VARS = {
+ 'lat_active': lambda safety: safety.get_lat_active(),
+ 'controls_allowed': lambda safety: safety.get_controls_allowed(),
+ 'controls_requested_lat': lambda safety: safety.get_controls_requested_lat(),
+ 'controls_allowed_lat': lambda safety: safety.get_controls_allowed_lat(),
+ 'current_disengage_reason': lambda safety: safety.aol_get_current_disengage_reason(),
+ 'stock_acc_main': lambda safety: safety.get_acc_main_on(),
+ 'aol_acc_main': lambda safety: safety.get_aol_acc_main(),
+}
+
+
+# replay a drive to check for safety violations
+def replay_drive(msgs, safety_mode, param, alternative_experience, param_iq):
+ safety = libsafety_py.libsafety
+ msgs.sort(key=lambda m: m.logMonoTime)
+
+ safety.set_current_safety_param_iq(param_iq)
+ err = safety.set_safety_hooks(safety_mode, param)
+ assert err == 0, "invalid safety mode: %d" % safety_mode
+ safety.set_alternative_experience(alternative_experience)
+
+ _enable_aol = bool(alternative_experience & ALTERNATIVE_EXPERIENCE.ENABLE_AOL)
+ _disengage_lateral_on_brake = bool(alternative_experience & ALTERNATIVE_EXPERIENCE.AOL_DISENGAGE_LATERAL_ON_BRAKE)
+ _pause_lateral_on_brake = bool(alternative_experience & ALTERNATIVE_EXPERIENCE.AOL_PAUSE_LATERAL_ON_BRAKE)
+ safety.set_aol_params(_enable_aol, _disengage_lateral_on_brake, _pause_lateral_on_brake)
+ print("alternative experience:")
+ print(f" enable aol: {_enable_aol}")
+ print(f" disengage lateral on brake: {_disengage_lateral_on_brake}")
+ print(f" pause lateral on brake: {_pause_lateral_on_brake}")
+
+ init_segment(safety, msgs, safety_mode, param)
+
+ rx_tot, rx_invalid, tx_tot, tx_blocked, tx_controls, tx_controls_lat, tx_controls_blocked, tx_controls_lat_blocked, aol_mismatch = 0, 0, 0, 0, 0, 0, 0, 0, 0
+ safety_tick_rx_invalid = False
+ blocked_addrs = Counter()
+ invalid_addrs = set()
+
+ # Track last good state for each address
+ last_good_states = defaultdict(lambda: {
+ 'timestamp': None,
+ **{var: None for var in DEBUG_VARS}
+ })
+
+ 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:
+ _msg = package_can_msg(canmsg)
+ sent = safety.safety_tx_hook(_msg)
+
+ # mismatched
+ if safety.get_controls_allowed() and not safety.get_controls_allowed_lat():
+ aol_mismatch += 1
+ print(f"controls allowed but not controls allowed lat [{aol_mismatch}]")
+ print(f"msg:{canmsg.address} ({hex(canmsg.address)})")
+ for var, getter in DEBUG_VARS.items():
+ print(f" {var}: {getter(safety)}")
+ if not sent:
+ tx_blocked += 1
+ tx_controls_blocked += safety.get_controls_allowed()
+ tx_controls_lat_blocked += safety.get_controls_allowed_lat()
+ blocked_addrs[canmsg.address] += 1
+
+ carlog.debug("blocked bus %d msg %d at %f" % (canmsg.src, canmsg.address, (msg.logMonoTime - start_t) / 1e9))
+
+ if "DEBUG" in os.environ:
+ last_good = last_good_states[canmsg.address]
+ print(f"\nBlocked message at {(msg.logMonoTime - start_t) / 1e9:.3f}s:")
+ print(f"Address: {hex(canmsg.address)} (bus {canmsg.src})")
+ print("Current state:")
+ for var, getter in DEBUG_VARS.items():
+ print(f" {var}: {getter(safety)}")
+
+ if last_good['timestamp'] is not None:
+ print(f"\nLast good state ({last_good['timestamp']:.3f}s):")
+ for var in DEBUG_VARS:
+ print(f" {var}: {last_good[var]}")
+ else:
+ print("\nNo previous good state found for this address")
+ print("-" * 80)
+ else: # Update last good state if message is allowed
+ last_good_states[canmsg.address].update({
+ 'timestamp': (msg.logMonoTime - start_t) / 1e9,
+ **{var: getter(safety) for var, getter in DEBUG_VARS.items()}
+ })
+
+ tx_controls += safety.get_controls_allowed()
+ tx_controls_lat += safety.get_controls_allowed_lat()
+ tx_tot += 1
+ elif msg.which() == 'can':
+ # ignore msgs we sent
+ for canmsg in filter(lambda m: m.src < 128, msg.can):
+ safety.safety_fwd_hook(canmsg.src, canmsg.address)
+ _msg = package_can_msg(canmsg)
+ recv = safety.safety_rx_hook(_msg)
+ 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("total msgs with controls_lat allowed:", tx_controls_lat)
+ print("blocked msgs:", tx_blocked)
+ print("blocked with controls allowed:", tx_controls_blocked)
+ print("blocked with controls_lat allowed:", tx_controls_lat_blocked)
+ print("blocked addrs:", blocked_addrs)
+ print("aol enabled:", safety.get_enable_aol())
+
+ return tx_controls_blocked == 0 and tx_controls_lat_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")
+ parser.add_argument("--param-sp", type=int, help="Override the iqpilot safety param 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, args.param_iq):
+ CP = lr.first('carParams')
+ CP_IQ = lr.first('iqCarParams')
+ 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
+ if args.param_iq is None:
+ _param_iq = CP_IQ.safetyParam if hasattr(CP_IQ, 'safetyParam') else 0
+ args.param_iq = _param_iq
+
+ print(f"replaying {args.route_or_segment_name[0]} with safety mode {args.mode}, param {args.param}, alternative experience {args.alternative_experience}, " +
+ f"param_iq {args.param_iq}")
+ replay_drive(list(lr), args.mode, args.param, args.alternative_experience, args.param_iq)
diff --git a/iqdbc_repo/iqdbc/safety/tests/test.sh b/iqdbc_repo/iqdbc/safety/tests/test.sh
new file mode 100755
index 000000000..1ff4ee820
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test.sh
@@ -0,0 +1,36 @@
+#!/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
+scons -j$(nproc) -D
+
+# run safety tests and generate coverage data
+pytest -n8 --ignore-glob=misra/*
+
+if [ "$(uname)" = "Darwin" ]; then
+ GCOV_EXEC="/opt/homebrew/opt/llvm@18/bin/llvm-cov gcov"
+else
+ GCOV_EXEC="llvm-cov-18 gcov"
+fi
+
+# generate and open report
+if [ "$1" == "--report" ]; then
+ mkdir -p coverage-out
+ gcovr -r ../ --gcov-executable "$GCOV_EXEC" --html-nested coverage-out/index.html
+ sensible-browser coverage-out/index.html
+fi
+
+# test coverage
+GCOV="gcovr -r $DIR/../ --gcov-executable \"$GCOV_EXEC\" -d --fail-under-line=100 -e ^libsafety"
+if ! GCOV_OUTPUT="$(eval $GCOV)"; then
+ echo -e "FAILED:\n$GCOV_OUTPUT"
+ exit 1
+else
+ echo "SUCCESS: All checked files have 100% coverage!"
+fi
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_body.py b/iqdbc_repo/iqdbc/safety/tests/test_body.py
new file mode 100755
index 000000000..428758802
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_body.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.structs import CarParams
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.libsafety import libsafety_py
+from iqdbc.safety.tests.common import CANPackerSafety
+
+
+class TestBody(common.SafetyTest):
+ TX_MSGS = [[0x250, 0], [0x251, 0],
+ [0x1, 0], [0x1, 1], [0x1, 2], [0x1, 3]]
+ FWD_BUS_LOOKUP = {}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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_safety("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_safety("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_safety("MAX_MOTOR_RPM_CMD", 0, values)
+
+ def test_rx_hook(self):
+ self.assertFalse(self.safety.get_controls_allowed())
+
+ # controls allowed when we get MOTORS_DATA message
+ self.assertTrue(self._rx(self._torque_cmd_msg(0, 0)))
+ self.assertFalse(self.safety.get_controls_allowed())
+
+ self.assertTrue(self._rx(self._motors_data_msg(0, 0)))
+ self.assertTrue(self.safety.get_controls_allowed())
+
+ def test_tx_hook(self):
+ self.assertFalse(self._tx(self._torque_cmd_msg(0, 0)))
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._tx(self._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 allowed for CAN flashing mode
+ self.assertTrue(self._tx(common.make_msg(0, 0x250, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a')))
+ self.assertFalse(self._tx(common.make_msg(0, 0x250, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0'))) # not correct data/len
+ self.assertFalse(self._tx(common.make_msg(0, 0x251, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a'))) # wrong address
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_chrysler.py b/iqdbc_repo/iqdbc/safety/tests/test_chrysler.py
new file mode 100755
index 000000000..23b4b815b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_chrysler.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.chrysler.values import ChryslerSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+
+class TestChryslerSafety(common.CarSafetyTest, common.MotorTorqueSteeringSafetyTest):
+ TX_MSGS = [[0x23B, 0], [0x292, 0], [0x2A6, 0], [0x2D9, 0]]
+ RELAY_MALFUNCTION_ADDRS = {0: (0x292, 0x2A6, 0x2D9)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x292, 0x2A6, 0x2D9]}
+
+ MAX_RATE_UP = 3
+ MAX_RATE_DOWN = 3
+ MAX_TORQUE_LOOKUP = [0], [261]
+ MAX_RT_DELTA = 112
+ MAX_TORQUE_ERROR = 80
+
+ LKAS_ACTIVE_VALUE = 1
+
+ DAS_BUS = 0
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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, accel=False, decel=False):
+ values = {"ACC_Cancel": cancel, "ACC_Resume": resume, "ACC_Accel": accel, "ACC_Decel": decel}
+ return self.packer.make_can_msg_safety("CRUISE_BUTTONS", self.DAS_BUS, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"ACC_ACTIVE": enable}
+ return self.packer.make_can_msg_safety("DAS_3", self.DAS_BUS, values)
+
+ def _speed_msg(self, speed):
+ values = {"SPEED_LEFT": speed, "SPEED_RIGHT": speed}
+ return self.packer.make_can_msg_safety("SPEED_1", 0, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"Accelerator_Position": gas}
+ return self.packer.make_can_msg_safety("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_safety("ESP_1", 0, values)
+
+ def _torque_meas_msg(self, torque):
+ values = {"EPS_TORQUE_MOTOR": torque}
+ return self.packer.make_can_msg_safety("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_safety("LKAS_COMMAND", 0, values)
+
+ def test_buttons(self):
+ for controls_allowed in (True, False):
+ self.safety.set_controls_allowed(controls_allowed)
+
+ # resume/accel/decel only while controls allowed
+ self.assertEqual(controls_allowed, self._tx(self._button_msg(resume=True)))
+ self.assertEqual(controls_allowed, self._tx(self._button_msg(accel=True)))
+ self.assertEqual(controls_allowed, self._tx(self._button_msg(decel=True)))
+
+ # can always cancel
+ self.assertTrue(self._tx(self._button_msg(cancel=True)))
+
+ # invalid: more than one button pressed
+ combos = [
+ # 2 buttons
+ {"cancel": True, "resume": True},
+ {"cancel": True, "accel": True},
+ {"cancel": True, "decel": True},
+ {"resume": True, "accel": True},
+ {"resume": True, "decel": True},
+ {"accel": True, "decel": True},
+
+ # 3 buttons
+ {"cancel": True, "resume": True, "accel": True},
+ {"cancel": True, "resume": True, "decel": True},
+ {"cancel": True, "accel": True, "decel": True},
+ {"resume": True, "accel": True, "decel": True},
+
+ # all 4 buttons
+ {"cancel": True, "resume": True, "accel": True, "decel": True},
+ ]
+
+ for combo in combos:
+ with self.subTest(combo=combo):
+ self.assertFalse(self._tx(self._button_msg(**combo)))
+
+ def _lkas_button_msg(self, enabled):
+ values = {"TOGGLE_LKAS": enabled}
+ return self.packer.make_can_msg_safety("TRACTION_BUTTON", 0, values)
+
+
+class TestChryslerRamDTSafety(TestChryslerSafety):
+ TX_MSGS = [[0xB1, 2], [0xA6, 0], [0xFA, 0]]
+ RELAY_MALFUNCTION_ADDRS = {0: (0xA6, 0xFA)}
+ FWD_BLACKLISTED_ADDRS = {2: [0xA6, 0xFA]}
+
+ MAX_RATE_UP = 6
+ MAX_RATE_DOWN = 6
+ MAX_TORQUE_LOOKUP = [0], [350]
+
+ DAS_BUS = 2
+
+ LKAS_ACTIVE_VALUE = 2
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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_safety("ESP_8", 0, values)
+
+ def _lkas_button_msg(self, enabled):
+ values = {"LKAS_Button": enabled}
+ return self.packer.make_can_msg_safety("Center_Stack_2", 0, values)
+
+
+class TestChryslerRamHDSafety(TestChryslerSafety):
+ TX_MSGS = [[0x275, 0], [0x276, 0], [0x23A, 2]]
+ RELAY_MALFUNCTION_ADDRS = {0: (0x276, 0x275)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x275, 0x276]}
+
+ MAX_TORQUE_LOOKUP = [0], [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 = CANPackerSafety("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_safety("ESP_8", 0, values)
+
+ def _lkas_button_msg(self, enabled):
+ values = {"LKAS_Button": enabled}
+ return self.packer.make_can_msg_safety("Center_Stack_2", 0, values)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_defaults.py b/iqdbc_repo/iqdbc/safety/tests/test_defaults.py
new file mode 100755
index 000000000..d5f22c283
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_defaults.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+import unittest
+
+import iqdbc.safety.tests.common as common
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+
+class TestDefaultRxHookBase(common.SafetyTest):
+ 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.SafetyTest.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/iqdbc_repo/iqdbc/safety/tests/test_elm327.py b/iqdbc_repo/iqdbc/safety/tests/test_elm327.py
new file mode 100755
index 000000000..a9d40c58a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_elm327.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+import unittest
+
+import iqdbc.safety.tests.common as common
+from iqdbc.car.structs import CarParams
+from iqdbc.safety import DLC_TO_LEN
+from iqdbc.safety.tests.libsafety import libsafety_py
+from iqdbc.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))))
+
+ # test GM camera diagnostic address with malformed length
+ self.assertEqual(False, self._tx(common.make_msg(0, GM_CAMERA_DIAG_ADDR, dat=bytes([0x00] * 7))))
+
+ 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/iqdbc_repo/iqdbc/safety/tests/test_ford.py b/iqdbc_repo/iqdbc/safety/tests/test_ford.py
new file mode 100755
index 000000000..ee543283a
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_ford.py
@@ -0,0 +1,511 @@
+#!/usr/bin/env python3
+import numpy as np
+import random
+import unittest
+
+import iqdbc.safety.tests.common as common
+from iqdbc.car.ford.values import FordSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+from iqdbc.safety.tests.common import CANPackerSafety
+
+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
+
+SAFETY_ISO_LATERAL_ACCEL = 5.0
+EARTH_G = 9.81
+AVERAGE_ROAD_ROLL = 0.06
+MAX_LATERAL_ACCEL = SAFETY_ISO_LATERAL_ACCEL - (EARTH_G * AVERAGE_ROAD_ROLL)
+
+
+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.CarSafetyTest):
+ 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]}
+
+ 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: CANPackerSafety
+ safety: libsafety_py.LibSafety
+
+ 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_safety("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_safety("BrakeSysFeatures", 0, values, fix_checksum=checksum)
+
+ # PCM vehicle speed
+ def _speed_msg_2(self, speed: float, quality_flag=True):
+ # Ford relies on speed for driver curvature limiting, so it checks two sources
+ 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_safety("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_safety("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_safety("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_safety("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_safety("EngBrakeData", 0, values)
+
+ # LKAS command
+ def _lkas_command_msg(self, action: int):
+ values = {
+ "LkaActvStats_D2_Req": action,
+ }
+ return self.packer.make_can_msg_safety("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_safety("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_safety("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_safety("Steering_Data_FD1", bus, values)
+
+ def test_rx_hook(self):
+ # checksum, counter, and quality flag checks
+ for quality_flag in [True, False]:
+ for msg_type in ["speed", "speed_2", "yaw"]:
+ self.safety.set_controls_allowed(True)
+ # send multiple times to verify counter checks
+ for _ in range(10):
+ if msg_type == "speed":
+ msg = self._speed_msg(0, quality_flag=quality_flag)
+ elif msg_type == "speed_2":
+ msg = self._speed_msg_2(0, quality_flag=quality_flag)
+ elif msg_type == "yaw":
+ msg = self._yaw_rate_msg(0, 0, quality_flag=quality_flag)
+
+ self.assertEqual(quality_flag, self._rx(msg))
+ self.assertEqual(quality_flag, self.safety.get_controls_allowed())
+
+ # Mess with checksum to make it fail, checksum is not checked for 2nd speed
+ msg[0].data[3] = 0 # Speed checksum & half of yaw signal
+ should_rx = msg_type == "speed_2" and quality_flag
+ self.assertEqual(should_rx, self._rx(msg))
+ self.assertEqual(should_rx, self.safety.get_controls_allowed())
+
+ 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=float(path_offset), path_angle=float(path_angle), curvature_rate=float(curvature_rate),
+ curvature=float(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 safety 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)))
+
+ def test_enable_control_allowed_from_acc_main_on(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ for main_button_msg_valid in (True, False):
+ with self.subTest("main_button_msg_valid", state_valid=main_button_msg_valid):
+ self.safety.set_aol_params(enable_aol, False, False)
+ self._rx(self._pcm_status_msg(main_button_msg_valid))
+ self.assertEqual(enable_aol and main_button_msg_valid, self.safety.get_controls_allowed_lat())
+
+
+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],
+ ]
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2,
+ MSG_IPMA_Data)}
+
+ FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2,
+ MSG_IPMA_Data]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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):
+ 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
+
+ # 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_safety("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],
+ ]
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl,
+ MSG_IPMA_Data)}
+
+ FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl,
+ MSG_IPMA_Data]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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],
+ ]
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2,
+ MSG_IPMA_Data)}
+
+ FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2,
+ MSG_IPMA_Data]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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/iqdbc_repo/iqdbc/safety/tests/test_gm.py b/iqdbc_repo/iqdbc/safety/tests/test_gm.py
new file mode 100755
index 000000000..705bd3fbb
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_gm.py
@@ -0,0 +1,254 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.gm.values import GMSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+# GM_PARAM_IQ_NON_ACC in safety/modes/gm.h (IQ safety framework flag)
+GM_PARAM_IQ_NON_ACC = 1
+
+
+class Buttons:
+ UNPRESS = 1
+ RES_ACCEL = 2
+ DECEL_SET = 3
+ CANCEL = 6
+
+
+class GmLongitudinalBase(common.CarSafetyTest, common.LongitudinalGasBrakeSafetyTest):
+
+ RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB), 2: (0x184,)} # ASCMLKASteeringCmd, ASCMGasRegenCmd, PSCMStatus
+
+ MAX_POSSIBLE_BRAKE = 2 ** 12
+ MAX_BRAKE = 400
+
+ MAX_POSSIBLE_GAS = 4000 # reasonably excessive limits, not signal max
+ MIN_POSSIBLE_GAS = -4000
+
+ 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_safety("EBCMFrictionBrakeCmd", self.BRAKE_BUS, values)
+
+ def _send_gas_msg(self, gas):
+ values = {"GasRegenCmd": gas}
+ return self.packer.make_can_msg_safety("ASCMGasRegenCmd", 0, values)
+
+ # override these tests from CarSafetyTest, 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.CarSafetyTest, 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,), 2: (0x184,)} # ASCMLKASteeringCmd, PSCMStatus
+ BUTTONS_BUS = 0 # rx or tx
+ BRAKE_BUS = 0 # tx only
+
+ MAX_RATE_UP = 10
+ MAX_RATE_DOWN = 15
+ MAX_TORQUE_LOOKUP = [0], [300]
+ MAX_RT_DELTA = 128
+ DRIVER_TORQUE_ALLOWANCE = 65
+ DRIVER_TORQUE_FACTOR = 4
+
+ PCM_CRUISE = True # openpilot is tied to the PCM state if not longitudinal
+
+ EXTRA_SAFETY_PARAM = 0
+
+ def setUp(self):
+ self.packer = CANPackerSafety("gm_global_a_powertrain_generated")
+ self.packer_chassis = CANPackerSafety("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_safety("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_safety("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_safety("ECMAcceleratorPos", 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_safety("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_safety("PSCMStatus", 0, values)
+
+ def _torque_cmd_msg(self, torque, steer_req=1):
+ values = {"LKASteeringCmd": torque, "LKASteeringCmdActive": steer_req}
+ return self.packer.make_can_msg_safety("ASCMLKASteeringCmd", 0, values)
+
+ def _button_msg(self, buttons):
+ values = {"ACCButtons": buttons}
+ return self.packer.make_can_msg_safety("ASCMSteeringButton", self.BUTTONS_BUS, values)
+
+
+class TestGmEVSafetyBase(TestGmSafetyBase):
+ EXTRA_SAFETY_PARAM = GMSafetyFlags.EV
+
+ # existence of _user_regen_msg adds regen tests
+ def _user_regen_msg(self, regen):
+ values = {"RegenPaddle": 2 if regen else 0}
+ return self.packer.make_can_msg_safety("EBCMRegenPaddle", 0, 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]] = {}
+ RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB)} # ASCMLKASteeringCmd, ASCMGasRegenCmd
+ FWD_BUS_LOOKUP: dict[int, int] = {}
+ BRAKE_BUS = 2
+
+ MAX_GAS = 1018
+ MIN_GAS = -650 # maximum regen
+ INACTIVE_GAS = -650
+
+ def setUp(self):
+ self.packer = CANPackerSafety("gm_global_a_powertrain_generated")
+ self.packer_chassis = CANPackerSafety("gm_global_a_chassis")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.gm, self.EXTRA_SAFETY_PARAM)
+ self.safety.init_tests()
+
+
+class TestGmAscmEVSafety(TestGmAscmSafety, TestGmEVSafetyBase):
+ pass
+
+
+class TestGmCameraSafetyBase(TestGmSafetyBase):
+ def _user_brake_msg(self, brake):
+ values = {"BrakePressed": brake}
+ return self.packer.make_can_msg_safety("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 = CANPackerSafety("gm_global_a_powertrain_generated")
+ self.packer_chassis = CANPackerSafety("gm_global_a_chassis")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM | self.EXTRA_SAFETY_PARAM)
+ 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 TestGmCameraEVSafety(TestGmCameraSafety, TestGmEVSafetyBase):
+ pass
+
+
+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
+ RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB, 0x370, 0x315), 2: (0x184,)}
+ BUTTONS_BUS = 0 # rx only
+
+ MAX_GAS = 1346
+ MIN_GAS = -540 # maximum regen
+ INACTIVE_GAS = -500
+
+ def setUp(self):
+ self.packer = CANPackerSafety("gm_global_a_powertrain_generated")
+ self.packer_chassis = CANPackerSafety("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.EXTRA_SAFETY_PARAM)
+ self.safety.init_tests()
+
+
+class TestGmCameraLongitudinalEVSafety(TestGmCameraLongitudinalSafety, TestGmEVSafetyBase):
+ pass
+
+
+class TestGmCameraNonACCSafety(TestGmCameraSafety):
+
+ def setUp(self):
+ self.packer = CANPackerSafety("gm_global_a_powertrain_generated")
+ self.packer_chassis = CANPackerSafety("gm_global_a_chassis")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(GM_PARAM_IQ_NON_ACC)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM | self.EXTRA_SAFETY_PARAM)
+ self.safety.init_tests()
+
+ def _pcm_status_msg(self, enable):
+ values = {"CruiseActive": enable}
+ return self.packer.make_can_msg_safety("ECMCruiseControl", 0, values)
+
+
+class TestGmCameraEVNonACCSafety(TestGmCameraNonACCSafety, TestGmEVSafetyBase):
+ pass
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_honda.py b/iqdbc_repo/iqdbc/safety/tests/test_honda.py
new file mode 100755
index 000000000..a12ea521e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_honda.py
@@ -0,0 +1,705 @@
+#!/usr/bin/env python3
+import unittest
+import numpy as np
+
+from iqdbc.car.honda.values import HondaSafetyFlags
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.common import CANPackerSafety, MAX_WRONG_COUNTERS
+from iqdbc.safety.tests.gas_interceptor_common import GasInterceptorSafetyTest
+
+from iqdbc.lvbs.car.honda.iq_values import HondaSafetyFlagsIQ
+
+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 safety has several different configurations tested here:
+# * Nidec
+# * normal (PCM-enable)
+# * alt SCM messages (PCM-enable)
+# * gas interceptor (button-enable)
+# * gas interceptor with alt SCM messages (button-enable)
+# * Bosch
+# * Bosch with Longitudinal Support
+# * Bosch Radarless
+# * Bosch Radarless with Longitudinal Support
+
+
+class HondaButtonEnableBase(common.CarSafetyTest):
+
+ # 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_type in ["btn", "gas", "speed"]:
+ self.safety.set_controls_allowed(1)
+ if msg_type == "btn":
+ msg = self._button_msg(Btn.SET)
+ if msg_type == "gas":
+ msg = self._user_gas_msg(0)
+ if msg_type == "speed":
+ msg = self._speed_msg(0)
+ self.assertTrue(self._rx(msg))
+ if msg_type != "btn":
+ msg[0].data[4] = 0 # invalidate checksum
+ msg[0].data[5] = 0
+ msg[0].data[6] = 0
+ msg[0].data[7] = 0
+ self.assertFalse(self._rx(msg))
+ 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.CarSafetyTest):
+
+ 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.CarSafetyTest):
+ 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
+
+ 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_safety("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_safety("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_safety("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_safety("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_safety("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)))
+
+ def _lkas_button_msg(self, lkas_button=False, setting_btn=0):
+ values = {"CRUISE_SETTING": 1 if lkas_button else setting_btn, "COUNTER": self.cnt_button % 4}
+ self.__class__.cnt_button += 1
+ return self.packer.make_can_msg_safety("SCM_BUTTONS", self.PT_BUS, values)
+
+ def test_enable_control_allowed_with_aol_button(self):
+ """Tests AOL button state transitions and internal button press state."""
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ # Verify initial state
+ self._rx(self._lkas_button_msg(False, 0))
+ self.assertEqual(0, self.safety.get_aol_button_press()) # NOT_PRESSED
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Verify press sets correct internal state
+ self._rx(self._lkas_button_msg(False, 1))
+ self.assertEqual(1, self.safety.get_aol_button_press()) # PRESSED
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ # Verify release sets correct internal state
+ self._rx(self._lkas_button_msg(False, 0))
+ self.assertEqual(0, self.safety.get_aol_button_press()) # NOT_PRESSED
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ # Test invalid values - should not change button press state
+ for invalid_setting in (2, 3):
+ self._rx(self._lkas_button_msg(False, invalid_setting))
+ self.assertEqual(0, self.safety.get_aol_button_press()) # Should remain NOT_PRESSED
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ # Verify we can still transition after invalid values
+ self._rx(self._lkas_button_msg(False, 1))
+ self.assertEqual(1, self.safety.get_aol_button_press())
+ self._rx(self._lkas_button_msg(False, 0))
+ self.assertEqual(0, self.safety.get_aol_button_press())
+
+
+# ********************* Honda Nidec **********************
+
+
+class TestHondaNidecSafetyBase(HondaBase):
+ TX_MSGS = HONDA_N_COMMON_TX_MSGS
+ FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x194, 0x33D, 0x30C]}
+ RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x194, 0x33D, 0x30C)}
+
+ PT_BUS = 0
+ STEER_BUS = 0
+ BUTTONS_BUS = 0
+
+ MAX_GAS = 198
+
+ BRAKE_SIG = "COMPUTER_BRAKE"
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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 = {self.BRAKE_SIG: brake, "AEB_REQ_1": aeb_req}
+ return self.packer.make_can_msg_safety("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_safety("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 TestHondaNidecGasInterceptorSafety(GasInterceptorSafetyTest, HondaButtonEnableBase, TestHondaNidecSafetyBase):
+ """
+ Covers the Honda Nidec safety mode with a gas interceptor, switches to a button-enable car
+ """
+
+ TX_MSGS = HONDA_N_COMMON_TX_MSGS + [[0x200, 0]]
+ INTERCEPTOR_THRESHOLD = 492
+
+ def setUp(self):
+ self.packer = CANPackerSafety("honda_civic_touring_2016_can_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(HondaSafetyFlagsIQ.GAS_INTERCEPTOR)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, 0)
+ self.safety.init_tests()
+
+
+class TestHondaNidecPcmAltSafety(TestHondaNidecPcmSafety):
+ """
+ Covers the Honda Nidec safety mode with alt SCM messages
+ """
+ def setUp(self):
+ self.packer = CANPackerSafety("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_safety("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_safety("SCM_BUTTONS", bus, values)
+
+
+class TestHondaNidecAltGasInterceptorSafety(GasInterceptorSafetyTest, HondaButtonEnableBase, TestHondaNidecSafetyBase):
+ """
+ Covers the Honda Nidec safety mode with alt SCM messages and gas interceptor, switches to a button-enable car
+ """
+
+ TX_MSGS = HONDA_N_COMMON_TX_MSGS + [[0x200, 0]]
+ INTERCEPTOR_THRESHOLD = 492
+
+ def setUp(self):
+ self.packer = CANPackerSafety("acura_ilx_2016_can_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(HondaSafetyFlagsIQ.GAS_INTERCEPTOR)
+ 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_safety("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_safety("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]}
+ RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB)} # STEERING_CONTROL, BOSCH_SUPPLEMENTAL_1
+
+ def setUp(self):
+ self.packer = CANPackerSafety("honda_civic_hatchback_ex_2017_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_safety("BRAKE_MODULE", self.PT_BUS, values)
+
+ def _send_brake_msg(self, brake):
+ pass
+
+ 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)
+ msg = self._alt_brake_msg(0)
+ self.assertTrue(self._rx(msg))
+ msg[0].data[2] = msg[0].data[2] & 0xF0 # invalidate checksum
+ self.assertFalse(self._rx(msg))
+ self.assertFalse(self.safety.get_controls_allowed())
+
+ 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())
+
+
+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 = {}
+ # 0x1DF is to test that radar is disabled
+ RELAY_MALFUNCTION_ADDRS = {1: (0xE4, 0x1DF, 0x33D, 0x33DA, 0x33DB)} # 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_safety("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, 0x33D]}
+ RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x33D)} # STEERING_CONTROL
+
+ def setUp(self):
+ self.packer = CANPackerSafety("honda_bosch_radarless_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, 0x33D, 0x1C8, 0x30C]}
+ RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x1C8, 0x30C, 0x33D)}
+
+ 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_safety("ACC_CONTROL", self.PT_BUS, values)
+
+ # Longitudinal doesn't need to send buttons
+ def test_spam_cancel_safety_check(self):
+ pass
+
+
+class TestHondaBoschCANFDSafetyBase(TestHondaBoschSafetyBase):
+ """Base class for CANFD Honda Bosch"""
+ PT_BUS = 0
+ STEER_BUS = 0
+ BUTTONS_BUS = 0
+
+ TX_MSGS = [[0xE4, 0], [0x296, 0], [0x33D, 0]]
+ FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D]}
+ RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x33D)}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("honda_common_canfd_generated")
+ self.safety = libsafety_py.libsafety
+
+
+class TestHondaBoschCANFDSafety(HondaPcmEnableBase, TestHondaBoschCANFDSafetyBase):
+ """
+ Covers the Honda Bosch CANFD safety mode with stock longitudinal
+ """
+
+ def setUp(self):
+ super().setUp()
+ self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_CANFD)
+ self.safety.init_tests()
+
+
+class TestHondaBoschCANFDAltBrakeSafety(HondaPcmEnableBase, TestHondaBoschCANFDSafetyBase, TestHondaBoschAltBrakeSafetyBase):
+ """
+ Covers the Honda Bosch CANFD safety mode with stock longitudinal and an alternate brake message
+ """
+
+ def setUp(self):
+ super().setUp()
+ self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_CANFD | HondaSafetyFlags.ALT_BRAKE)
+ self.safety.init_tests()
+
+
+class TestHondaNidecHybridSafety(TestHondaNidecPcmSafety):
+ """
+ Covers the Honda Nidec safety mode with hybrid brake
+ """
+
+ BRAKE_SIG = "COMPUTER_BRAKE_HYBRID"
+
+ def setUp(self):
+ self.packer = CANPackerSafety("honda_clarity_hybrid_2018_can_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(HondaSafetyFlagsIQ.NIDEC_HYBRID)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, 0)
+ self.safety.init_tests()
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py b/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py
new file mode 100644
index 000000000..398d03a0b
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py
@@ -0,0 +1,107 @@
+import pytest
+
+from iqdbc.car.hyundai.values import HyundaiSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.hyundai_common import TESTER_PRESENT, classic_accel, classic_steer, packet
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+
+@pytest.fixture
+def safety():
+ return libsafety_py.libsafety
+
+
+@pytest.mark.parametrize("mode", (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy))
+@pytest.mark.parametrize("param", (
+ 0,
+ HyundaiSafetyFlags.EV_GAS,
+ HyundaiSafetyFlags.HYBRID_GAS,
+ HyundaiSafetyFlags.LONG,
+ HyundaiSafetyFlags.CAMERA_SCC,
+ HyundaiSafetyFlags.ALT_LIMITS,
+ HyundaiSafetyFlags.FCEV_GAS,
+ HyundaiSafetyFlags.ALT_LIMITS_2,
+))
+def test_classic_safety_configurations_initialize(safety, mode, param):
+ assert safety.set_safety_hooks(mode, param) == 0
+ safety.init_tests()
+ assert safety.get_current_safety_param() == param
+
+
+@pytest.mark.parametrize("mode", (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy))
+def test_classic_tx_whitelist_and_steering_limits(safety, mode):
+ safety.set_safety_hooks(mode, 0)
+ safety.init_tests()
+
+ assert not safety.safety_tx_hook(packet(0x123, 0, 8))
+ assert not safety.safety_tx_hook(packet(0x340, 1, 8))
+
+ safety.set_controls_allowed(False)
+ assert safety.safety_tx_hook(classic_steer(0, False))
+ assert not safety.safety_tx_hook(classic_steer(1))
+
+ safety.set_controls_allowed(True)
+ assert safety.safety_tx_hook(classic_steer(10))
+ safety.set_desired_torque_last(512)
+ safety.set_rt_torque_last(512)
+ assert safety.safety_tx_hook(classic_steer(512))
+ assert not safety.safety_tx_hook(classic_steer(513))
+ assert not safety.safety_tx_hook(classic_steer(-513))
+
+
+def test_classic_alt_limits_2(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS_2)
+ safety.init_tests()
+ safety.set_controls_allowed(True)
+ safety.set_desired_torque_last(170)
+ safety.set_rt_torque_last(170)
+ assert safety.safety_tx_hook(classic_steer(170))
+ assert not safety.safety_tx_hook(classic_steer(171))
+
+
+def test_classic_longitudinal_accel_and_aeb_guards(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG)
+ safety.init_tests()
+
+ safety.set_controls_allowed(False)
+ assert safety.safety_tx_hook(classic_accel(0))
+ assert not safety.safety_tx_hook(classic_accel(1))
+
+ safety.set_controls_allowed(True)
+ for accel in (-400, 0, 250):
+ assert safety.safety_tx_hook(classic_accel(accel))
+ for accel in (-401, 251):
+ assert not safety.safety_tx_hook(classic_accel(accel))
+ assert not safety.safety_tx_hook(classic_accel(0, aeb_decel=1))
+ assert not safety.safety_tx_hook(classic_accel(0, aeb_request=True))
+
+ assert safety.safety_tx_hook(packet(0x38D, 0, 8))
+ assert not safety.safety_tx_hook(packet(0x38D, 0, 8, {1: 1}))
+ assert not safety.safety_tx_hook(packet(0x38D, 0, 8, {2: 1 << 4}))
+ assert not safety.safety_tx_hook(packet(0x38D, 0, 8, {3: 1 << 7}))
+
+
+def test_classic_buttons(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0)
+ safety.init_tests()
+
+ safety.set_controls_allowed(False)
+ assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 1}))
+ assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 2}))
+ assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 4}))
+
+ safety.set_controls_allowed(True)
+ assert safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 1}))
+ assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 2}))
+ assert safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 4}))
+
+ safety.set_controls_allowed(False)
+ safety.set_cruise_engaged_prev(True)
+ assert safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 4}))
+
+
+def test_classic_diagnostic_payload_is_restricted(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG)
+ safety.init_tests()
+ assert safety.safety_tx_hook(packet(0x7D0, 0, 8, dict(enumerate(TESTER_PRESENT))))
+ assert not safety.safety_tx_hook(packet(0x7D0, 0, 8, {0: 3, 1: 0x22}))
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_hyundai_canfd.py b/iqdbc_repo/iqdbc/safety/tests/test_hyundai_canfd.py
new file mode 100644
index 000000000..b0c0f27fa
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_hyundai_canfd.py
@@ -0,0 +1,104 @@
+import pytest
+
+from iqdbc.car.hyundai.values import HyundaiSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.hyundai_common import TESTER_PRESENT, canfd_accel, canfd_steer, packet
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+
+@pytest.fixture
+def safety():
+ return libsafety_py.libsafety
+
+
+@pytest.mark.parametrize("param", (
+ 0,
+ HyundaiSafetyFlags.EV_GAS,
+ HyundaiSafetyFlags.HYBRID_GAS,
+ HyundaiSafetyFlags.LONG,
+ HyundaiSafetyFlags.CAMERA_SCC,
+ HyundaiSafetyFlags.CANFD_LKA_STEERING,
+ HyundaiSafetyFlags.CANFD_ALT_BUTTONS,
+ HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT,
+ HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG,
+ HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.CANFD_ALT_BUTTONS,
+))
+def test_canfd_safety_configurations_initialize(safety, param):
+ assert safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param) == 0
+ safety.init_tests()
+ assert safety.get_current_safety_param() == param
+
+
+@pytest.mark.parametrize(("param", "addr", "length"), (
+ (0, 0x12A, 16),
+ (HyundaiSafetyFlags.CANFD_LKA_STEERING, 0x50, 16),
+ (HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT, 0x110, 32),
+ (HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG, 0x12A, 16),
+))
+def test_canfd_steering_limits(safety, param, addr, length):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param)
+ safety.init_tests()
+
+ safety.set_controls_allowed(False)
+ assert safety.safety_tx_hook(canfd_steer(addr, length, 0, False))
+ assert not safety.safety_tx_hook(canfd_steer(addr, length, 1))
+
+ safety.set_controls_allowed(True)
+ assert safety.safety_tx_hook(canfd_steer(addr, length, 10))
+ safety.set_desired_torque_last(512)
+ safety.set_rt_torque_last(512)
+ assert safety.safety_tx_hook(canfd_steer(addr, length, 512))
+ assert not safety.safety_tx_hook(canfd_steer(addr, length, 513))
+ assert not safety.safety_tx_hook(canfd_steer(addr, length, -513))
+
+
+def test_canfd_tx_whitelist_and_buttons(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, 0)
+ safety.init_tests()
+ assert not safety.safety_tx_hook(packet(0x123, 0, 8))
+ assert not safety.safety_tx_hook(packet(0x12A, 1, 16))
+
+ safety.set_controls_allowed(False)
+ assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 1}))
+ assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 2}))
+ assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 4}))
+
+ safety.set_controls_allowed(True)
+ assert safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 1}))
+ assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 2}))
+ assert safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 4}))
+
+ safety.set_controls_allowed(False)
+ safety.set_cruise_engaged_prev(True)
+ assert safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 4}))
+
+
+def test_canfd_stock_longitudinal_only_allows_cancel(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, 0)
+ safety.init_tests()
+ assert safety.safety_tx_hook(canfd_accel(0, acc_mode=4))
+ assert not safety.safety_tx_hook(canfd_accel(1, acc_mode=4))
+ assert not safety.safety_tx_hook(canfd_accel(0, acc_mode=0))
+
+
+def test_canfd_longitudinal_accel_limits(safety):
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.LONG)
+ safety.init_tests()
+
+ safety.set_controls_allowed(False)
+ assert safety.safety_tx_hook(canfd_accel(0))
+ assert not safety.safety_tx_hook(canfd_accel(1))
+
+ safety.set_controls_allowed(True)
+ for accel in (-400, 0, 250):
+ assert safety.safety_tx_hook(canfd_accel(accel))
+ for accel in (-401, 251):
+ assert not safety.safety_tx_hook(canfd_accel(accel))
+
+
+def test_canfd_hda2_diagnostic_payload_is_restricted(safety):
+ param = HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG
+ safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param)
+ safety.init_tests()
+ assert safety.safety_tx_hook(packet(0x730, 1, 8, dict(enumerate(TESTER_PRESENT))))
+ assert not safety.safety_tx_hook(packet(0x730, 1, 8, {0: 3, 1: 0x22}))
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_hyundai_controller.py b/iqdbc_repo/iqdbc/safety/tests/test_hyundai_controller.py
new file mode 100644
index 000000000..71c14b5b1
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_hyundai_controller.py
@@ -0,0 +1,39 @@
+import pytest
+
+from iqdbc.car import gen_empty_fingerprint, structs
+from iqdbc.car.hyundai.interface import CarInterface
+from iqdbc.car.hyundai.values import CAR
+from iqdbc.safety.tests.libsafety import libsafety_py
+
+
+@pytest.mark.parametrize("candidate", list(CAR), ids=lambda candidate: candidate.value)
+@pytest.mark.parametrize("alpha_long", (False, True), ids=("stock_long", "openpilot_long"))
+def test_controller_frames_match_configured_safety(candidate, alpha_long, monkeypatch, tmp_path):
+ """Run real controller output through the safety configuration selected for every HKG platform."""
+ monkeypatch.setenv("PARAMS_ROOT", str(tmp_path / candidate.value))
+ fingerprint = gen_empty_fingerprint()
+ cp = CarInterface.get_params(candidate, fingerprint, [], alpha_long, False, False)
+ cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], alpha_long, False, False)
+ interface = CarInterface(cp, cp_iq)
+ interface.update([])
+
+ safety_config = cp.safetyConfigs[-1]
+ safety = libsafety_py.libsafety
+ assert safety.set_safety_hooks(safety_config.safetyModel.raw, safety_config.safetyParam) == 0
+ safety.init_tests()
+ safety.set_controls_allowed(True)
+
+ control = structs.CarControl.new_message()
+ control.enabled = True
+ control.latActive = True
+ control.longActive = alpha_long
+ control.actuators.torque = 0.01
+ control.actuators.accel = 0.0
+
+ for frame in range(20):
+ _, can_sends = interface.apply(control.as_reader(), structs.IQCarControl())
+ assert isinstance(can_sends, list)
+ for address, data, bus in can_sends:
+ packet = libsafety_py.make_CANPacket(address, bus, data)
+ rejection = f"{candidate.value} frame {frame}: safety rejected address={address:#x} bus={bus} data={data.hex()}"
+ assert safety.safety_tx_hook(packet), rejection
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_mazda.py b/iqdbc_repo/iqdbc/safety/tests/test_mazda.py
new file mode 100755
index 000000000..e370c39a2
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_mazda.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+
+class TestMazdaSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest):
+
+ TX_MSGS = [[0x243, 0], [0x09d, 0], [0x440, 0]]
+ STANDSTILL_THRESHOLD = .1
+ RELAY_MALFUNCTION_ADDRS = {0: (0x243, 0x440)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x243, 0x440]}
+
+ MAX_RATE_UP = 10
+ MAX_RATE_DOWN = 25
+ MAX_TORQUE_LOOKUP = [0], [800]
+
+ MAX_RT_DELTA = 300
+
+ 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 = CANPackerSafety("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_safety("STEER_TORQUE", 0, values)
+
+ def _torque_driver_msg(self, torque):
+ values = {"STEER_TORQUE_SENSOR": torque}
+ return self.packer.make_can_msg_safety("STEER_TORQUE", 0, values)
+
+ def _torque_cmd_msg(self, torque, steer_req=1):
+ values = {"LKAS_REQUEST": torque}
+ return self.packer.make_can_msg_safety("CAM_LKAS", 0, values)
+
+ def _speed_msg(self, speed):
+ values = {"SPEED": speed}
+ return self.packer.make_can_msg_safety("ENGINE_DATA", 0, values)
+
+ def _user_brake_msg(self, brake):
+ values = {"BRAKE_ON": brake}
+ return self.packer.make_can_msg_safety("PEDALS", 0, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"PEDAL_GAS": gas}
+ return self.packer.make_can_msg_safety("ENGINE_DATA", 0, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"CRZ_ACTIVE": enable}
+ return self.packer.make_can_msg_safety("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_safety("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/iqdbc_repo/iqdbc/safety/tests/test_nissan.py b/iqdbc_repo/iqdbc/safety/tests/test_nissan.py
new file mode 100755
index 000000000..fe09fa03e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_nissan.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.nissan.values import NissanSafetyFlags
+from iqdbc.car.structs import CarParams
+
+# NISSAN_PARAM_IQ_LEAF in safety/modes/nissan.h (IQ safety framework flag)
+NISSAN_PARAM_IQ_LEAF = 1
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+
+class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest):
+
+ TX_MSGS = [[0x169, 0], [0x2b1, 0], [0x4cc, 0], [0x20b, 2], [0x280, 2]]
+ GAS_PRESSED_THRESHOLD = 3
+ RELAY_MALFUNCTION_ADDRS = {0: (0x169, 0x2b1, 0x4cc), 2: (0x280,)}
+ FWD_BLACKLISTED_ADDRS = {0: [0x280], 2: [0x169, 0x2b1, 0x4cc]}
+
+ EPS_BUS = 0
+ CRUISE_BUS = 2
+ ACC_MAIN_BUS = 1
+
+ # 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 = CANPackerSafety("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_safety("LKAS", 0, values)
+
+ def _angle_meas_msg(self, angle: float):
+ values = {"STEER_ANGLE": angle}
+ return self.packer.make_can_msg_safety("STEER_ANGLE_SENSOR", self.EPS_BUS, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"CRUISE_ENABLED": enable}
+ return self.packer.make_can_msg_safety("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_safety("WHEEL_SPEEDS_REAR", self.EPS_BUS, values)
+
+ def _user_brake_msg(self, brake):
+ values = {"USER_BRAKE_PRESSED": brake}
+ return self.packer.make_can_msg_safety("DOORS_LIGHTS", self.EPS_BUS, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"GAS_PEDAL": gas}
+ return self.packer.make_can_msg_safety("GAS_PEDAL", self.EPS_BUS, values)
+
+ def _acc_state_msg(self, main_on):
+ values = {"CRUISE_ON": main_on}
+ return self.packer.make_can_msg_safety("PRO_PILOT", self.ACC_MAIN_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_safety("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
+ ACC_MAIN_BUS = 2
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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 = CANPackerSafety("nissan_leaf_2018_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(NISSAN_PARAM_IQ_LEAF)
+ 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_safety("CRUISE_THROTTLE", 0, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"GAS_PEDAL": gas}
+ return self.packer.make_can_msg_safety("CRUISE_THROTTLE", 0, values)
+
+ def _acc_state_msg(self, main_on):
+ values = {"CRUISE_AVAILABLE": main_on}
+ return self.packer.make_can_msg_safety("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/iqdbc_repo/iqdbc/safety/tests/test_psa.py b/iqdbc_repo/iqdbc/safety/tests/test_psa.py
new file mode 100644
index 000000000..be56f1426
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_psa.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+LANE_KEEP_ASSIST = 0x3F2
+
+
+class TestPsaSafetyBase(common.CarSafetyTest, common.AngleSteeringSafetyTest):
+ RELAY_MALFUNCTION_ADDRS = {0: (LANE_KEEP_ASSIST,)}
+ FWD_BLACKLISTED_ADDRS = {2: [LANE_KEEP_ASSIST]}
+ TX_MSGS = [[1010, 0]]
+
+ MAIN_BUS = 0
+ ADAS_BUS = 1
+ CAM_BUS = 2
+
+ STEER_ANGLE_MAX = 390
+ DEG_TO_CAN = 10
+
+ ANGLE_RATE_BP = [0., 5., 25.]
+ ANGLE_RATE_UP = [2.5, 1.5, .2]
+ ANGLE_RATE_DOWN = [5., 2., .3]
+
+ def setUp(self):
+ self.packer = CANPackerSafety("psa_aee2010_r3")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.psa, 0)
+ self.safety.init_tests()
+
+ def _angle_cmd_msg(self, angle: float, enabled: bool):
+ values = {"SET_ANGLE": angle, "TORQUE_FACTOR": 100 if enabled else 0}
+ return self.packer.make_can_msg_safety("LANE_KEEP_ASSIST", self.MAIN_BUS, values)
+
+ def _angle_meas_msg(self, angle: float):
+ values = {"ANGLE": angle}
+ return self.packer.make_can_msg_safety("STEERING_ALT", self.MAIN_BUS, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"RVV_ACC_ACTIVATION_REQ": enable}
+ return self.packer.make_can_msg_safety("HS2_DAT_MDD_CMD_452", self.ADAS_BUS, values)
+
+ def _speed_msg(self, speed):
+ values = {"VITESSE_VEHICULE_ROUES": speed * 3.6}
+ return self.packer.make_can_msg_safety("HS2_DYN_ABR_38D", self.MAIN_BUS, values)
+
+ def _user_brake_msg(self, brake):
+ values = {"P013_MainBrake": brake}
+ return self.packer.make_can_msg_safety("Dat_BSI", self.CAM_BUS, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"P002_Com_rAPP": int(gas * 100)}
+ return self.packer.make_can_msg_safety("Dyn_CMM", self.MAIN_BUS, values)
+
+ def test_rx_hook(self):
+ # speed
+ for _ in range(10):
+ self.assertTrue(self._rx(self._speed_msg(0)))
+ msg = self._speed_msg(0)
+ # invalidate checksum
+ msg[0].data[5] = 0x00
+ self.assertFalse(self._rx(msg))
+
+ # cruise
+ for _ in range(10):
+ self.assertTrue(self._rx(self._pcm_status_msg(0)))
+ msg = self._pcm_status_msg(0)
+ # invalidate checksum
+ msg[0].data[5] = 0x00
+ self.assertFalse(self._rx(msg))
+ msg = self._pcm_status_msg(0)
+ # write to unused payload byte
+ msg[0].data[6] = 0xAB
+ self.assertTrue(self._rx(msg))
+
+
+class TestPsaStockSafety(TestPsaSafetyBase):
+
+ def setUp(self):
+ self.packer = CANPackerSafety("psa_aee2010_r3")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.psa, 0)
+ self.safety.init_tests()
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_rivian.py b/iqdbc_repo/iqdbc/safety/tests/test_rivian.py
new file mode 100755
index 000000000..52551a8a5
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_rivian.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+from iqdbc.car.rivian.values import RivianSafetyFlags
+from iqdbc.car.rivian.riviancan import checksum as _checksum
+
+
+def checksum(msg):
+ addr, dat, bus = msg
+ ret = bytearray(dat)
+
+ # ESP_Status
+ if addr == 0x208:
+ ret[0] = _checksum(ret[1:], 0x1D, 0xB1)
+ elif addr == 0x150:
+ ret[0] = _checksum(ret[1:], 0x1D, 0x9A)
+
+ return addr, ret, bus
+
+
+class TestRivianSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.LongitudinalAccelSafetyTest,
+ common.VehicleSpeedSafetyTest):
+
+ TX_MSGS = [[0x120, 0], [0x321, 2], [0x162, 2]]
+ RELAY_MALFUNCTION_ADDRS = {0: (0x120,), 2: (0x321, 0x162)}
+ FWD_BLACKLISTED_ADDRS = {0: [0x321, 0x162], 2: [0x120]}
+
+ MAX_TORQUE_LOOKUP = [9, 17], [350, 250]
+ DYNAMIC_MAX_TORQUE = True
+ MAX_RATE_UP = 3
+ MAX_RATE_DOWN = 5
+
+ MAX_RT_DELTA = 125
+
+ DRIVER_TORQUE_ALLOWANCE = 100
+ DRIVER_TORQUE_FACTOR = 2
+
+ cnt_speed = 0
+ cnt_speed_2 = 0
+
+ def _torque_driver_msg(self, torque):
+ values = {"EPAS_TorsionBarTorque": torque / 100.0}
+ return self.packer.make_can_msg_safety("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_safety("ACM_lkaHbaCmd", 0, values)
+
+ def _speed_msg(self, speed, quality_flag=True):
+ values = {"ESP_Vehicle_Speed": speed * 3.6, "ESP_Status_Counter": self.cnt_speed % 15,
+ "ESP_Vehicle_Speed_Q": 1 if quality_flag else 0}
+ self.__class__.cnt_speed += 1
+ return self.packer.make_can_msg_safety("ESP_Status", 0, values, fix_checksum=checksum)
+
+ def _speed_msg_2(self, speed, quality_flag=True):
+ # Rivian has a dynamic max torque limit based on speed, so it checks two sources
+ return self._user_gas_msg(0, speed, quality_flag)
+
+ def _user_brake_msg(self, brake):
+ values = {"iBESP2_BrakePedalApplied": brake}
+ return self.packer.make_can_msg_safety("iBESP2", 0, values)
+
+ def _user_gas_msg(self, gas, speed=0, quality_flag=True):
+ values = {"VDM_AcceleratorPedalPosition": gas, "VDM_VehicleSpeed": speed * 3.6,
+ "VDM_PropStatus_Counter": self.cnt_speed_2 % 15, "VDM_VehicleSpeedQ": 1 if quality_flag else 0}
+ self.__class__.cnt_speed_2 += 1
+ return self.packer.make_can_msg_safety("VDM_PropStatus", 0, values, fix_checksum=checksum)
+
+ def _pcm_status_msg(self, enable):
+ values = {"ACM_FeatureStatus": enable, "ACM_Unkown1": 1}
+ return self.packer.make_can_msg_safety("ACM_Status", 2, values)
+
+ def _accel_msg(self, accel: float):
+ values = {"ACM_AccelerationRequest": accel}
+ return self.packer.make_can_msg_safety("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_safety("SCCM_WheelTouch", 2, values)))
+
+ def test_rx_hook(self):
+ # checksum, counter, and quality flag checks
+ for quality_flag in (True, False):
+ for msg_type in ("speed", "speed_2"):
+ self.safety.set_controls_allowed(True)
+ # send multiple times to verify counter checks
+ for _ in range(10):
+ if msg_type == "speed":
+ msg = self._speed_msg(0, quality_flag=quality_flag)
+ elif msg_type == "speed_2":
+ msg = self._speed_msg_2(0, quality_flag=quality_flag)
+
+ self.assertEqual(quality_flag, self._rx(msg))
+ self.assertEqual(quality_flag, self.safety.get_controls_allowed())
+
+ # Mess with checksum to make it fail
+ msg[0].data[0] = 0xff
+ self.assertFalse(self._rx(msg))
+ self.assertFalse(self.safety.get_controls_allowed())
+
+
+class TestRivianStockSafety(TestRivianSafetyBase):
+
+ LONGITUDINAL = False
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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_safety("VDM_AdasSts", 2, values)))
+
+
+class TestRivianLongitudinalSafety(TestRivianSafetyBase):
+
+ TX_MSGS = [[0x120, 0], [0x321, 2], [0x160, 0]]
+ RELAY_MALFUNCTION_ADDRS = {0: (0x120, 0x160), 2: (0x321,)}
+ FWD_BLACKLISTED_ADDRS = {0: [0x321], 2: [0x120, 0x160]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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/iqdbc_repo/iqdbc/safety/tests/test_subaru.py b/iqdbc_repo/iqdbc/safety/tests/test_subaru.py
new file mode 100755
index 000000000..304cd5fea
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_subaru.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python3
+import enum
+import unittest
+
+from iqdbc.car.subaru.values import SubaruSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+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 = 0x22A
+ ES_STATIC_1 = 0x325
+ ES_STATIC_2 = 0x121
+
+
+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.CarSafetyTest):
+ FLAGS = 0
+ RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
+ SubaruMsg.ES_Infotainment)}
+ FWD_BLACKLISTED_ADDRS = fwd_blacklisted_addr()
+
+ MAX_RT_DELTA = 940
+
+ 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 = CANPackerSafety("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_safety("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_safety("Wheel_Speeds", self.ALT_MAIN_BUS, values)
+
+ def _user_brake_msg(self, brake):
+ values = {"Brake": brake}
+ return self.packer.make_can_msg_safety("Brake_Status", self.ALT_MAIN_BUS, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"Throttle_Pedal": gas}
+ return self.packer.make_can_msg_safety("Throttle", 0, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"Cruise_Activated": enable}
+ return self.packer.make_can_msg_safety("CruiseControl", self.ALT_MAIN_BUS, values)
+
+ def _lkas_button_msg(self, lkas_pressed=False, lkas_hud=0):
+ values = {"LKAS_Dash_State": 2 if lkas_pressed else lkas_hud}
+ return self.packer.make_can_msg_safety("ES_LKAS_State", SUBARU_CAM_BUS, values)
+
+ def test_enable_control_allowed_with_aol_button(self):
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ for aol_button_press in range(4):
+ with self.subTest("aol_button_press", button_state=aol_button_press):
+ self.safety.set_aol_params(enable_aol, False, False)
+
+ self._rx(self._lkas_button_msg(False, aol_button_press))
+ self.assertEqual(enable_aol and aol_button_press in range(1, 4),
+ self.safety.get_controls_allowed_lat())
+
+
+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_safety("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_safety("ES_Brake", self.ALT_MAIN_BUS, values)
+
+ def _send_gas_msg(self, gas):
+ values = {"Cruise_Throttle": gas}
+ return self.packer.make_can_msg_safety("ES_Distance", self.ALT_MAIN_BUS, values)
+
+ def _send_rpm_msg(self, rpm):
+ values = {"Cruise_RPM": rpm}
+ return self.packer.make_can_msg_safety("ES_Status", self.ALT_MAIN_BUS, values)
+
+
+class TestSubaruTorqueSafetyBase(TestSubaruSafetyBase, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest):
+ MAX_RATE_UP = 50
+ MAX_RATE_DOWN = 70
+ MAX_TORQUE_LOOKUP = [0], [2047]
+
+ # Safety around steering req bit
+ MIN_VALID_STEERING_FRAMES = 7
+ MAX_INVALID_STEERING_FRAMES = 1
+ STEER_STEP = 2
+
+ def _torque_cmd_msg(self, torque, steer_req=1):
+ values = {"LKAS_Output": torque, "LKAS_Request": steer_req}
+ return self.packer.make_can_msg_safety("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 = 35
+ MAX_RATE_DOWN = 50
+ MAX_TORQUE_LOOKUP = [0], [1500]
+
+
+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)
+ RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
+ SubaruMsg.ES_Infotainment, SubaruMsg.ES_Brake, SubaruMsg.ES_Status,
+ SubaruMsg.ES_Distance)}
+
+
+class TestSubaruGen2LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruGen2TorqueSafetyBase):
+ FLAGS = SubaruSafetyFlags.LONG | SubaruSafetyFlags.GEN2
+ TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS) + long_tx_msgs(SUBARU_ALT_BUS) + gen2_long_additional_tx_msgs()
+ FWD_BLACKLISTED_ADDRS = {2: [SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
+ SubaruMsg.ES_Infotainment]}
+ RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
+ SubaruMsg.ES_Infotainment),
+ SUBARU_ALT_BUS: (SubaruMsg.ES_Brake, SubaruMsg.ES_Status, SubaruMsg.ES_Distance)}
+
+ def _rdbi_msg(self, did: int):
+ return b'\x03\x22' + did.to_bytes(2) + b'\x00\x00\x00\x00'
+
+ def _es_uds_msg(self, msg: bytes):
+ return libsafety_py.make_CANPacket(SubaruMsg.ES_UDS_Request, 2, msg)
+
+ def test_es_uds_message(self):
+ tester_present = b'\x02\x3E\x80\x00\x00\x00\x00\x00'
+ not_tester_present = b"\x03\xAA\xAA\x00\x00\x00\x00\x00"
+
+ button_did = 0x1130
+
+ # Tester present is allowed for gen2 long to keep eyesight disabled
+ self.assertTrue(self._tx(self._es_uds_msg(tester_present)))
+
+ # Non-Tester present is not allowed
+ self.assertFalse(self._tx(self._es_uds_msg(not_tester_present)))
+
+ # Only button_did is allowed to be read via UDS
+ for did in range(0xFFFF):
+ should_tx = (did == button_did)
+ self.assertEqual(self._tx(self._es_uds_msg(self._rdbi_msg(did))), should_tx)
+
+ # any other msg is not allowed
+ for sid in range(0xFF):
+ msg = b'\x03' + sid.to_bytes(1) + b'\x00' * 6
+ self.assertFalse(self._tx(self._es_uds_msg(msg)))
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_subaru_preglobal.py b/iqdbc_repo/iqdbc/safety/tests/test_subaru_preglobal.py
new file mode 100755
index 000000000..bd33d3057
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_subaru_preglobal.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+import unittest
+
+from iqdbc.car.structs import CarParams
+from iqdbc.car.subaru.values import SubaruSafetyFlags
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+
+class TestSubaruPreglobalSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest):
+ FLAGS = 0
+ DBC = "subaru_outback_2015_generated"
+ TX_MSGS = [[0x161, 0], [0x164, 0]]
+ RELAY_MALFUNCTION_ADDRS = {0: (0x164, 0x161)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x161, 0x164]}
+
+ MAX_RATE_UP = 50
+ MAX_RATE_DOWN = 70
+ MAX_TORQUE_LOOKUP = [0], [2047]
+
+ MAX_RT_DELTA = 940
+
+ DRIVER_TORQUE_ALLOWANCE = 75
+ DRIVER_TORQUE_FACTOR = 10
+
+ def setUp(self):
+ self.packer = CANPackerSafety(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_safety("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_safety("Wheel_Speeds", 0, values)
+
+ def _user_brake_msg(self, brake):
+ values = {"Brake_Pedal": brake}
+ return self.packer.make_can_msg_safety("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_safety("ES_LKAS", 0, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"Throttle_Pedal": gas}
+ return self.packer.make_can_msg_safety("Throttle", 0, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"Cruise_Activated": enable}
+ return self.packer.make_can_msg_safety("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/iqdbc_repo/iqdbc/safety/tests/test_tesla.py b/iqdbc_repo/iqdbc/safety/tests/test_tesla.py
new file mode 100755
index 000000000..cde24518e
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_tesla.py
@@ -0,0 +1,486 @@
+#!/usr/bin/env python3
+import random
+import unittest
+import numpy as np
+
+import pytest
+try:
+ from iqdbc.car.tesla.carcontroller import get_safety_CP
+ from iqdbc.lvbs.car.tesla.values import TeslaSafetyFlagsIQ
+except ImportError:
+ pytest.skip("requires openpilot dependencies", allow_module_level=True)
+
+from iqdbc.car.lateral import get_max_angle_delta_vm, get_max_angle_vm
+from iqdbc.car.tesla.values import CarControllerParams, TeslaSafetyFlags, CANBUS
+from iqdbc.car.structs import CarParams
+from iqdbc.car.vehicle_model import VehicleModel
+from iqdbc.can import CANDefine
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety, MAX_SPEED_DELTA, MAX_WRONG_COUNTERS, away_round, round_speed
+
+MSG_DAS_steeringControl = 0x488
+MSG_APS_eacMonitor = 0x27d
+MSG_DAS_Control = 0x2b9
+MSG_DAS_bodyControls = 0x3E9
+
+
+def round_angle(apply_angle, can_offset=0):
+ apply_angle_can = (apply_angle + 1638.35) / 0.1 + can_offset
+ # 0.49999_ == 0.5
+ rnd_offset = 1e-5 if apply_angle >= 0 else -1e-5
+ return away_round(apply_angle_can + rnd_offset) * 0.1 - 1638.35
+
+
+class TestTeslaSafetyBase(common.CarSafetyTest, common.AngleSteeringSafetyTest, common.LongitudinalAccelSafetyTest):
+ SAFETY_PARAM = 0
+ STEER_TYPE_SHIFT = 0 # legacy firmware uses a 2-bit field, one bit up from the 3-bit signal
+
+ 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
+
+ # Tesla uses get_max_angle_delta_vm and get_max_angle_vm for real lateral accel and jerk limits
+ # TODO: integrate this into AngleSteeringSafetyTest
+ ANGLE_RATE_BP = None
+ ANGLE_RATE_UP = None
+ ANGLE_RATE_DOWN = None
+
+ # Real time limits
+ LATERAL_FREQUENCY = 50 # Hz
+
+ # Long control limits
+ MAX_ACCEL = 2.0
+ MIN_ACCEL = -3.48
+ INACTIVE_ACCEL = 0.0
+
+ cnt_epas = 0
+ cnt_angle_cmd = 0
+
+ packer: CANPackerSafety
+
+ def _get_steer_cmd_angle_max(self, speed):
+ return get_max_angle_vm(max(speed, 1), self.VM, CarControllerParams)
+
+ def setUp(self):
+ self.VM = VehicleModel(get_safety_CP())
+ self.packer = CANPackerSafety("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()}
+ self.autopark_states = {d: v for v, d in self.define.dv["DI_state"]["DI_autoparkState"].items()}
+ self.active_autopark_states = [self.autopark_states[s] for s in ('ACTIVE', 'COMPLETE', 'SELFPARK_STARTED')]
+
+ self.steer_control_types = {d: v for v, d in self.define.dv["DAS_steeringControl"]["DAS_steeringControlType"].items()}
+
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, self.SAFETY_PARAM)
+ self.safety.init_tests()
+
+ def _angle_cmd_msg(self, angle: float, state: bool | int, increment_timer: bool = True, bus: int = 0):
+ values = {"DAS_steeringAngleRequest": angle, "DAS_steeringControlType": int(state) << self.STEER_TYPE_SHIFT}
+ if increment_timer:
+ self.safety.set_timer(self.cnt_angle_cmd * int(1e6 / self.LATERAL_FREQUENCY))
+ self.__class__.cnt_angle_cmd += 1
+ return self.packer.make_can_msg_safety("DAS_steeringControl", bus, values)
+
+ def _angle_meas_msg(self, angle: float, hands_on_level: int = 0, eac_status: int = 1, eac_error_code: int = 0):
+ values = {"EPAS3S_internalSAS": angle, "EPAS3S_handsOnLevel": hands_on_level,
+ "EPAS3S_eacStatus": eac_status, "EPAS3S_eacErrorCode": eac_error_code,
+ "EPAS3S_sysStatusCounter": self.cnt_epas % 16}
+ self.__class__.cnt_epas += 1
+ return self.packer.make_can_msg_safety("EPAS3S_sysStatus", 0, values)
+
+ def _user_brake_msg(self, brake, quality_flag: bool = True):
+ values = {"ESP_driverBrakeApply": 2 if brake else 1}
+ if not quality_flag:
+ values["ESP_driverBrakeApply"] = random.choice((0, 3)) # NotInit_orOff, Faulty_SNA
+ return self.packer.make_can_msg_safety("ESP_status", 0, values)
+
+ def _speed_msg(self, speed):
+ values = {"DI_vehicleSpeed": speed * 3.6}
+ return self.packer.make_can_msg_safety("DI_speed", 0, values)
+
+ def _speed_msg_2(self, speed, quality_flag=True):
+ values = {"ESP_vehicleSpeed": speed * 3.6, "ESP_wheelSpeedsQF": quality_flag}
+ return self.packer.make_can_msg_safety("ESP_B", 0, values)
+
+ def _vehicle_moving_msg(self, speed: float, quality_flag=True):
+ values = {"ESP_vehicleStandstillSts": 1 if speed <= self.STANDSTILL_THRESHOLD else 0,
+ "ESP_wheelSpeedsQF": quality_flag}
+ return self.packer.make_can_msg_safety("ESP_B", 0, values)
+
+ def _user_gas_msg(self, gas):
+ values = {"DI_accelPedalPos": gas}
+ return self.packer.make_can_msg_safety("DI_systemStatus", 0, values)
+
+ def _pcm_status_msg(self, enable, autopark_state=0):
+ values = {
+ "DI_cruiseState": 2 if enable else 0,
+ "DI_autoparkState": autopark_state,
+ }
+ return self.packer.make_can_msg_safety("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_safety("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_rx_hook(self):
+ # counter check
+ for msg_type in ("angle", "long", "speed", "speed_2"):
+ # send multiple times to verify counter checks
+ for i in range(10):
+ if msg_type == "angle":
+ msg = self._angle_cmd_msg(0, True, bus=2)
+ elif msg_type == "long":
+ msg = self._long_control_msg(0, bus=2)
+ elif msg_type == "speed":
+ msg = self._speed_msg(0)
+ elif msg_type == "speed_2":
+ msg = self._speed_msg_2(0)
+
+ should_rx = i >= 5
+ if not should_rx:
+ # mess with checksums
+ if msg_type == "angle":
+ msg[0].data[3] = 0
+ elif msg_type == "long":
+ msg[0].data[7] = 0
+ elif msg_type == "speed":
+ msg[0].data[0] = 0
+ elif msg_type == "speed_2":
+ msg[0].data[7] = 0
+
+ self.safety.set_controls_allowed(True)
+ self.assertEqual(should_rx, self._rx(msg))
+ self.assertEqual(should_rx, self.safety.get_controls_allowed())
+
+ # Send static counters
+ for i in range(MAX_WRONG_COUNTERS + 1):
+ should_rx = i + 1 < MAX_WRONG_COUNTERS
+ self.assertEqual(should_rx, self._rx(msg))
+ self.assertEqual(should_rx, self.safety.get_controls_allowed())
+
+ 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)
+
+ def test_rx_hook_speed_mismatch(self):
+ # TODO: overridden because of custom rounding
+ # Tesla relies on speed for lateral limits close to ISO 11270, so it checks two sources
+ for speed in np.arange(0, 40, 0.5):
+ # match signal rounding on CAN
+ speed = away_round(speed / 0.08 * 3.6) * 0.08 / 3.6
+ for speed_delta in np.arange(-5, 5, 0.1):
+ speed_2 = max(speed + speed_delta, 0)
+ speed_2 = away_round(speed_2 * 2 * 3.6) / 2 / 3.6
+
+ # Set controls allowed in between rx since first message can reset it
+ self.assertTrue(self._rx(self._speed_msg(speed)))
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._rx(self._speed_msg_2(speed_2)))
+
+ within_delta = abs(speed - speed_2) <= MAX_SPEED_DELTA
+ self.assertEqual(self.safety.get_controls_allowed(), within_delta)
+
+ # Test ESP_B quality flag
+ for quality_flag in (True, False):
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._rx(self._speed_msg(0)))
+ self.assertEqual(quality_flag, self._rx(self._speed_msg_2(0, quality_flag=quality_flag)))
+ self.assertEqual(quality_flag, self.safety.get_controls_allowed())
+
+ def test_user_brake_quality_flag(self):
+ for quality_flag in (True, False):
+ msg = self._user_brake_msg(True, quality_flag=quality_flag)
+ self.assertEqual(quality_flag, self._rx(msg))
+
+ def test_steering_wheel_disengage(self):
+ # Tesla disengages when the user forcibly overrides the locked-in angle steering control
+ # Either when the hands on level is high, or if there is a high angle rate fault
+ for hands_on_level in range(4):
+ for eac_status in range(8):
+ for eac_error_code in range(16):
+ self.safety.set_controls_allowed(True)
+
+ should_disengage = hands_on_level >= 3 or (eac_status == 0 and eac_error_code == 9)
+ self.assertTrue(self._rx(self._angle_meas_msg(0, hands_on_level=hands_on_level, eac_status=eac_status,
+ eac_error_code=eac_error_code)))
+ self.assertNotEqual(should_disengage, self.safety.get_controls_allowed())
+ self.assertEqual(should_disengage, self.safety.get_steering_disengage_prev())
+
+ # Should not recover
+ self.assertTrue(self._rx(self._angle_meas_msg(0, hands_on_level=0, eac_status=1, eac_error_code=0)))
+ self.assertNotEqual(should_disengage, self.safety.get_controls_allowed())
+ self.assertFalse(self.safety.get_steering_disengage_prev())
+
+ def test_autopark_summon_while_enabled(self):
+ # We should not respect Autopark that activates while controls are allowed
+ self._rx(self._pcm_status_msg(True, 0))
+
+ self._rx(self._pcm_status_msg(True, self.autopark_states["SELFPARK_STARTED"]))
+ self.assertTrue(self.safety.get_controls_allowed())
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
+ self.assertTrue(self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"])))
+
+ # We should still not respect Autopark if we disengage cruise
+ self._rx(self._pcm_status_msg(False, self.autopark_states["SELFPARK_STARTED"]))
+ self.assertFalse(self.safety.get_controls_allowed())
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, False)))
+ self.assertTrue(self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"])))
+
+ def test_autopark_summon_behavior(self):
+ for autopark_state in range(16):
+ self._rx(self._pcm_status_msg(False, 0))
+
+ # We shouldn't allow controls if Autopark is an active state
+ autopark_active = autopark_state in self.active_autopark_states
+ self._rx(self._pcm_status_msg(False, autopark_state))
+ self._rx(self._pcm_status_msg(True, autopark_state))
+ self.assertNotEqual(autopark_active, self.safety.get_controls_allowed())
+
+ # We should also start blocking all inactive/active openpilot msgs
+ self.assertNotEqual(autopark_active, self._tx(self._angle_cmd_msg(0, False)))
+ self.assertNotEqual(autopark_active, self._tx(self._angle_cmd_msg(0, True)))
+ self.assertNotEqual(autopark_active, self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"])))
+ self.assertNotEqual(autopark_active or not self.LONGITUDINAL, self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_ON"])))
+
+ # Regain controls when Autopark disables
+ self._rx(self._pcm_status_msg(True, 0))
+ self.assertTrue(self.safety.get_controls_allowed())
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, False)))
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
+ self.assertTrue(self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"])))
+ self.assertEqual(self.LONGITUDINAL, self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_ON"])))
+
+ def test_steering_control_type(self):
+ # Only angle control is allowed (no LANE_KEEP_ASSIST or EMERGENCY_LANE_KEEP)
+ self.safety.set_controls_allowed(True)
+ for steer_control_type in range(4):
+ should_tx = steer_control_type in (self.steer_control_types["NONE"],
+ self.steer_control_types["ANGLE_CONTROL"],
+ self.steer_control_types["LANE_KEEP_ASSIST"])
+ self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(0, state=steer_control_type)))
+
+ def test_stock_lkas_passthrough(self):
+ # TODO: make these generic passthrough tests
+ no_lkas_msg = self._angle_cmd_msg(0, state=False)
+ no_lkas_msg_cam = self._angle_cmd_msg(0, state=self.steer_control_types['NONE'], bus=2)
+ lkas_msg_cam = self._angle_cmd_msg(0, state=self.steer_control_types['LANE_KEEP_ASSIST'], bus=2)
+
+ # stock system sends no LKAS -> no forwarding, and OP is allowed to TX
+ self.assertEqual(1, self._rx(no_lkas_msg_cam))
+ self.assertEqual(-1, self.safety.safety_fwd_hook(2, no_lkas_msg_cam.addr))
+ self.assertTrue(self._tx(no_lkas_msg))
+
+ # stock system sends LKAS -> forwarding, and OP is not allowed to TX
+ self.assertEqual(1, self._rx(lkas_msg_cam))
+ self.assertEqual(0, self.safety.safety_fwd_hook(2, lkas_msg_cam.addr))
+ self.assertFalse(self._tx(no_lkas_msg))
+
+ def test_angle_cmd_when_enabled(self):
+ # We properly test lateral acceleration and jerk below
+ pass
+
+ def test_lateral_accel_limit(self):
+ for speed in np.linspace(0, 40, 100):
+ speed = max(speed, 1)
+ # match DI_vehicleSpeed rounding on CAN
+ speed = round_speed(away_round(speed / 0.08 * 3.6) * 0.08 / 3.6)
+ for sign in (-1, 1):
+ self.safety.set_controls_allowed(True)
+ self._reset_speed_measurement(speed + 1) # safety fudges the speed
+
+ # angle signal can't represent 0, so it biases one unit down
+ angle_unit_offset = -1 if sign == -1 else 0
+
+ # at limit (safety tolerance adds 1)
+ max_angle = round_angle(get_max_angle_vm(speed, self.VM, CarControllerParams), angle_unit_offset + 1) * sign
+ max_angle = np.clip(max_angle, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX)
+ self.safety.set_desired_angle_last(round(max_angle * self.DEG_TO_CAN))
+
+ self.assertTrue(self._tx(self._angle_cmd_msg(max_angle, True)))
+
+ # 1 unit above limit
+ max_angle_raw = round_angle(get_max_angle_vm(speed, self.VM, CarControllerParams), angle_unit_offset + 2) * sign
+ max_angle = np.clip(max_angle_raw, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX)
+ self._tx(self._angle_cmd_msg(max_angle, True))
+
+ # at low speeds max angle is above 360, so adding 1 has no effect
+ should_tx = abs(max_angle_raw) >= self.STEER_ANGLE_MAX
+ self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(max_angle, True)))
+
+ def test_lateral_jerk_limit(self):
+ for speed in np.linspace(0, 40, 100):
+ speed = max(speed, 1)
+ # match DI_vehicleSpeed rounding on CAN
+ speed = round_speed(away_round(speed / 0.08 * 3.6) * 0.08 / 3.6)
+ for sign in (-1, 1): # (-1, 1):
+ self.safety.set_controls_allowed(True)
+ self._reset_speed_measurement(speed + 1) # safety fudges the speed
+ self._tx(self._angle_cmd_msg(0, True))
+
+ # angle signal can't represent 0, so it biases one unit down
+ angle_unit_offset = 1 if sign == -1 else 0
+
+ # Stay within limits
+ # Up
+ max_angle_delta = round_angle(get_max_angle_delta_vm(speed, self.VM, CarControllerParams), angle_unit_offset) * sign
+ self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
+
+ # Don't change
+ self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
+
+ # Down
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
+
+ # Inject too high rates
+ # Up
+ max_angle_delta = round_angle(get_max_angle_delta_vm(speed, self.VM, CarControllerParams), angle_unit_offset + 1) * sign
+ self.assertFalse(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
+
+ # Don't change
+ self.safety.set_desired_angle_last(round(max_angle_delta * self.DEG_TO_CAN))
+ self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
+
+ # Down
+ self.assertFalse(self._tx(self._angle_cmd_msg(0, True)))
+
+ # Recover
+ self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
+
+
+class TestTeslaStockSafety(TestTeslaSafetyBase):
+
+ LONGITUDINAL = False
+
+ 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):
+ should_tx = aeb_event == 0
+ ret = self._tx(self._long_control_msg(10, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"], aeb_event=aeb_event))
+ self.assertEqual(ret, should_tx)
+
+ def test_stock_aeb_no_cancel(self):
+ # No passthrough logic since we always forward DAS_control,
+ # but ensure we can't send cancel cmd while stock AEB is active
+ no_aeb_msg = self._long_control_msg(10, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"], 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(0, 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))
+
+
+class TestTeslaLegacyDasSteeringStockSafety(TestTeslaStockSafety):
+ SAFETY_PARAM = TeslaSafetyFlags.LEGACY_DAS_STEERING
+ STEER_TYPE_SHIFT = 1
+
+
+class TestTeslaLongitudinalSafety(TestTeslaSafetyBase):
+ SAFETY_PARAM = TeslaSafetyFlags.LONG_CONTROL
+
+ 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 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))))
+
+
+class TestTeslaLegacyDasSteeringLongitudinalSafety(TestTeslaLongitudinalSafety):
+ SAFETY_PARAM = TeslaSafetyFlags.LONG_CONTROL | TeslaSafetyFlags.LEGACY_DAS_STEERING
+ STEER_TYPE_SHIFT = 1
+
+
+class TestTeslaVehicleBusSafety(TestTeslaSafetyBase):
+
+ LONGITUDINAL = False
+
+ # With the vehicle bus harness, DAS_bodyControls is also TX'd on bus 1 (blinker MITM)
+ TX_MSGS = [*TestTeslaSafetyBase.TX_MSGS, [MSG_DAS_bodyControls, 1]]
+
+ def setUp(self):
+ super().setUp()
+ self.safety = libsafety_py.libsafety
+ self.packer_adas = CANPackerSafety("tesla_model3_vehicle")
+ self.safety.set_current_safety_param_iq(TeslaSafetyFlagsIQ.HAS_VEHICLE_BUS)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, 0)
+ self.safety.init_tests()
+
+ def _lkas_button_msg(self, enabled):
+ values = {"UI_activeTouchPoints": 3 if enabled else 0}
+ return self.packer_adas.make_can_msg_safety("UI_status2", CANBUS.vehicle, values)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_toyota.py b/iqdbc_repo/iqdbc/safety/tests/test_toyota.py
new file mode 100755
index 000000000..b5730ebd9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_toyota.py
@@ -0,0 +1,494 @@
+#!/usr/bin/env python3
+from parameterized import parameterized_class
+import numpy as np
+import random
+import unittest
+import itertools
+
+from iqdbc.car.toyota.values import ToyotaSafetyFlags
+from iqdbc.lvbs.car.toyota.values import ToyotaSafetyFlagsIQ
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+from iqdbc.safety.tests.gas_interceptor_common import GasInterceptorSafetyTest
+
+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], [0x183, 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
+GAS_INTERCEPTOR_TX_MSGS = [[0x200, 0]]
+
+UNSUPPORTED_DSU = [
+ {"SAFETY_PARAM_IQ": ToyotaSafetyFlagsIQ.DEFAULT},
+ {"SAFETY_PARAM_IQ": ToyotaSafetyFlagsIQ.UNSUPPORTED_DSU},
+]
+
+
+class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyTest):
+
+ TX_MSGS = TOYOTA_COMMON_TX_MSGS + TOYOTA_COMMON_LONG_TX_MSGS
+ RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x343)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191, 0x343]}
+ EPS_SCALE = 73
+
+ SAFETY_PARAM_IQ: int = 0
+
+ packer: CANPackerSafety
+ safety: libsafety_py.LibSafety
+
+ 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_safety("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_safety("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_safety("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_safety("STEERING_LTA", 0, values)
+
+ def _accel_msg_343(self, accel, cancel_req=0):
+ values = {"ACCEL_CMD": accel, "CANCEL_REQ": cancel_req}
+ return self.packer.make_can_msg_safety("ACC_CONTROL", 0, values)
+
+ def _accel_msg(self, accel, cancel_req=0):
+ return self._accel_msg_343(accel, cancel_req)
+
+ 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_safety("WHEEL_SPEEDS", 0, values)
+
+ def _user_brake_msg(self, brake):
+ values = {"BRAKE_PRESSED": brake}
+ return self.packer.make_can_msg_safety("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_safety("PCM_CRUISE", 0, values)
+
+ def _pcm_status_msg(self, enable):
+ values = {"CRUISE_ACTIVE": enable}
+ return self.packer.make_can_msg_safety("PCM_CRUISE", 0, values)
+
+ def _acc_state_msg(self, enabled):
+ msg = "DSU_CRUISE" if self.SAFETY_PARAM_IQ & ToyotaSafetyFlagsIQ.UNSUPPORTED_DSU else "PCM_CRUISE_2"
+ values = {"MAIN_ON": enabled}
+ return self.packer.make_can_msg_safety(msg, 0, values)
+
+ def test_diagnostics(self, stock_longitudinal: bool = False, ecu_disabled: bool = True):
+ 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 ecu_disabled 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":
+ msg = self._torque_meas_msg(0)
+ if msg == "pcm":
+ msg = self._pcm_status_msg(True)
+ self.assertTrue(self._rx(msg))
+ msg[0].data[4] = 0
+ msg[0].data[5] = 0
+ msg[0].data[6] = 0
+ msg[0].data[7] = 0
+ self.assertFalse(self._rx(msg))
+ self.assertFalse(self.safety.get_controls_allowed())
+
+
+class TestToyotaSafetyGasInterceptorBase(GasInterceptorSafetyTest, TestToyotaSafetyBase):
+
+ TX_MSGS = TOYOTA_COMMON_TX_MSGS + TOYOTA_COMMON_LONG_TX_MSGS + GAS_INTERCEPTOR_TX_MSGS
+ INTERCEPTOR_THRESHOLD = 805
+
+ def setUp(self):
+ super().setUp()
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ | ToyotaSafetyFlagsIQ.GAS_INTERCEPTOR)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.safety.get_current_safety_param())
+ self.safety.init_tests()
+
+ def test_stock_longitudinal(self):
+ # If stock longitudinal is set, the gas interceptor safety param should not be respected
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ | ToyotaSafetyFlagsIQ.GAS_INTERCEPTOR)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.safety.get_current_safety_param() | ToyotaSafetyFlags.STOCK_LONGITUDINAL)
+ self.safety.init_tests()
+
+ # Spot check a few gas interceptor tests: (1) reading interceptor,
+ # (2) behavior around interceptor, and (3) txing interceptor msgs
+ for test in (self.test_prev_gas_interceptor, self.test_no_disengage_on_gas_interceptor,
+ self.test_gas_interceptor_safety_check):
+ with self.subTest(test=test.__name__):
+ with self.assertRaises(AssertionError):
+ test()
+
+
+@parameterized_class(UNSUPPORTED_DSU)
+class TestToyotaSafetyTorque(TestToyotaSafetyBase, common.MotorTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest):
+
+ MAX_RATE_UP = 15
+ MAX_RATE_DOWN = 25
+ MAX_TORQUE_LOOKUP = [0], [1500]
+ MAX_RT_DELTA = 450
+ 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 = 17
+ MAX_INVALID_STEERING_FRAMES = 1
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "TestToyotaSafetyTorque":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ def setUp(self):
+ self.packer = CANPackerSafety("toyota_nodsu_pt_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ)
+ self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE)
+ self.safety.init_tests()
+
+
+@parameterized_class(UNSUPPORTED_DSU)
+class TestToyotaSafetyTorqueGasInterceptor(TestToyotaSafetyGasInterceptorBase, TestToyotaSafetyTorque):
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "TestToyotaSafetyTorqueGasInterceptor":
+ cls.safety = None
+ raise unittest.SkipTest
+
+
+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 = CANPackerSafety("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 TestToyotaSafetyAngleGasInterceptor(TestToyotaSafetyGasInterceptorBase, TestToyotaSafetyAngle):
+ pass
+
+
+@parameterized_class(UNSUPPORTED_DSU)
+class TestToyotaAltBrakeSafety(TestToyotaSafetyTorque):
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "TestToyotaAltBrakeSafety":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ def setUp(self):
+ self.packer = CANPackerSafety("toyota_new_mc_pt_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ)
+ 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_safety("BRAKE_MODULE", 0, values)
+
+ # No LTA message in the DBC
+ def test_lta_steer_cmd(self):
+ pass
+
+
+@parameterized_class(UNSUPPORTED_DSU)
+class TestToyotaAltBrakeSafetyGasInterceptor(TestToyotaSafetyGasInterceptorBase, TestToyotaAltBrakeSafety):
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "TestToyotaAltBrakeSafetyGasInterceptor":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ # 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, 0x191, 0x412)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191]}
+
+ LONGITUDINAL = False
+
+ def test_diagnostics(self, stock_longitudinal: bool = True, ecu_disabled: bool = True):
+ super().test_diagnostics(stock_longitudinal=stock_longitudinal, ecu_disabled=ecu_disabled)
+
+ 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_343(accel)))
+ should_tx = np.isclose(accel, self.INACTIVE_ACCEL, atol=0.0001)
+ self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel, cancel_req=1)))
+
+
+@parameterized_class(UNSUPPORTED_DSU)
+class TestToyotaStockLongitudinalTorque(TestToyotaStockLongitudinalBase, TestToyotaSafetyTorque):
+
+ @classmethod
+ def setUpClass(cls):
+ if cls.__name__ == "TestToyotaStockLongitudinalTorque":
+ cls.safety = None
+ raise unittest.SkipTest
+
+ def setUp(self):
+ self.packer = CANPackerSafety("toyota_nodsu_pt_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ)
+ 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 = CANPackerSafety("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 TestToyotaSecOcSafetyBase(TestToyotaSafetyBase):
+
+ TX_MSGS = TOYOTA_SECOC_TX_MSGS
+ RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x131)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x191, 0x412, 0x131]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("toyota_secoc_pt_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.toyota,
+ self.EPS_SCALE | ToyotaSafetyFlags.SECOC)
+ self.safety.init_tests()
+
+ def test_diagnostics(self, ecu_disabled: bool = False):
+ super().test_diagnostics(ecu_disabled=ecu_disabled)
+
+ # 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_safety("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_safety("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=}")
+
+ def _accel_msg_183(self, accel):
+ values = {"ACCEL_CMD": accel}
+ return self.packer.make_can_msg_safety("ACC_CONTROL_2", 0, values)
+
+ def _accel_msg(self, accel, cancel_req=0):
+ return self._accel_msg_183(accel)
+
+
+class TestToyotaSecOcSafetyStockLongitudinal(TestToyotaSecOcSafetyBase, TestToyotaStockLongitudinalBase):
+
+ def setUp(self):
+ self.packer = CANPackerSafety("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()
+
+
+class TestToyotaSecOcSafety(TestToyotaSecOcSafetyBase):
+
+ RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x131, 0x343, 0x183)}
+ FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x191, 0x412, 0x131, 0x343, 0x183]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("toyota_secoc_pt_generated")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.SECOC)
+ self.safety.init_tests()
+
+ @unittest.skip("test not applicable for cars without a DSU")
+ def test_block_aeb(self, stock_longitudinal: bool = False):
+ pass
+
+ def test_343_actuation_blocked(self):
+ """
+ For SecOC cars, longitudinal acceleration must be sent in ACC_CONTROL_2, but all other ACC
+ data remains in ACC_CONTROL. Verify no actuation is sent via ACC_CONTROL.
+ """
+ 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):
+ should_tx = np.isclose(accel, self.INACTIVE_ACCEL, atol=0.0001)
+ self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel)))
+ self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel, cancel_req=1)))
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_meb.py b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_meb.py
new file mode 100644
index 000000000..fceb0fa64
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_meb.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+import unittest
+import numpy as np
+
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags
+from iqdbc.car.lateral import ISO_LATERAL_JERK
+
+MAX_ACCEL = 2.0
+MIN_ACCEL = -3.5
+
+MSG_ESC_51 = 0xFC
+MSG_QFK_01 = 0x13D
+MSG_Motor_54 = 0x14C
+MSG_Motor_51 = 0x10B
+MSG_ACC_18 = 0x14D
+MSG_MEB_ACC_01 = 0x300
+MSG_HCA_03 = 0x303
+MSG_GRA_ACC_01 = 0x12B
+MSG_LDW_02 = 0x397
+MSG_MOTOR_14 = 0x3BE
+MSG_TA_01 = 0x26B
+MSG_KLR_01 = 0x25D
+MSG_EA_01 = 0x1A4
+MSG_EA_02 = 0x1F0
+MSG_AWV_03 = 0xDB
+MSG_MEB_DISTANCE_01 = 0x24F
+MSG_UDS_FUNCTIONAL = 0x700
+
+
+class TestVolkswagenMebSafetyBase(common.CarSafetyTest):
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_03, MSG_LDW_02, MSG_EA_02),
+ 2: (MSG_KLR_01,)}
+
+ CURVATURE_TO_CAN = 149253.7313
+ MAX_CURVATURE = 0.195
+ SEND_RATE = 0.02
+ MAX_POWER = 225
+ POWER_FACTOR = 0.4
+
+ def _speed_msg(self, speed_mps: float):
+ spd_kph = speed_mps * 3.6
+ values = {"HL_Radgeschw": spd_kph, "HR_Radgeschw": spd_kph, "VL_Radgeschw": spd_kph, "VR_Radgeschw": spd_kph}
+ return self.packer.make_can_msg_safety("ESC_51", 0, values)
+
+ def _speed_msg_2(self, speed: float):
+ return None
+
+ def _motor_14_msg(self, brake):
+ values = {"MO_Fahrer_bremst": brake}
+ return self.packer.make_can_msg_safety("Motor_14", 0, values)
+
+ def _user_brake_msg(self, brake):
+ return self._motor_14_msg(brake)
+
+ def _user_gas_msg(self, gas):
+ values = {"Accel_Pedal_Pressure": gas, "TSK_Status": 3}
+ return self.packer.make_can_msg_safety("Motor_51", 0, values)
+
+ def _tsk_status_msg(self, enable, main_switch=True):
+ tsk_status = 3 if enable else (2 if main_switch else 0)
+ values = {"TSK_Status": tsk_status}
+ return self.packer.make_can_msg_safety("Motor_51", 0, values)
+
+ def _pcm_status_msg(self, enable):
+ return self._tsk_status_msg(enable)
+
+ def _curvature_meas_msg(self, curvature):
+ values = {"Curvature": abs(curvature), "Curvature_VZ": curvature > 0}
+ return self.packer.make_can_msg_safety("QFK_01", 0, values)
+
+ def _curvature_cmd_msg(self, curvature, steer_req=True, power=50):
+ values = {
+ "Curvature": abs(curvature),
+ "Curvature_VZ": curvature > 0,
+ "RequestStatus": 4 if steer_req else 0,
+ "Power": power,
+ }
+ return self.packer.make_can_msg_safety("HCA_03", 0, values)
+
+ def _button_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_safety("GRA_ACC_01", bus, values)
+
+ def test_curvature_measurements(self):
+ self._rx(self._curvature_meas_msg(0.15))
+ self._rx(self._curvature_meas_msg(-0.1))
+ for _ in range(4):
+ self._rx(self._curvature_meas_msg(0))
+
+ self.assertEqual(int(-0.1 * self.CURVATURE_TO_CAN), self.safety.get_angle_meas_min())
+ self.assertEqual(int(0.15 * self.CURVATURE_TO_CAN), self.safety.get_angle_meas_max())
+
+ self._reset_safety_hooks()
+ self.assertEqual(0, self.safety.get_angle_meas_min())
+ self.assertEqual(0, self.safety.get_angle_meas_max())
+
+ def test_curvature_cmd_limits(self):
+ self._rx(self._speed_msg(0.0))
+ self._rx(self._curvature_meas_msg(0.0))
+ self.safety.set_controls_allowed(True)
+
+ self.safety.set_desired_angle_last(int(self.MAX_CURVATURE * self.CURVATURE_TO_CAN))
+ self.assertTrue(self._tx(self._curvature_cmd_msg(self.MAX_CURVATURE, True, power=50)))
+ self.safety.set_desired_angle_last(int(self.MAX_CURVATURE * self.CURVATURE_TO_CAN))
+ self.assertTrue(self._tx(self._curvature_cmd_msg(self.MAX_CURVATURE + 0.05, True, power=50)))
+
+ self.assertTrue(self._tx(self._curvature_cmd_msg(0.0, False, power=0)))
+ self.assertTrue(self._tx(self._curvature_cmd_msg(0.01, False, power=0)))
+
+ power_over = (self.MAX_POWER + 1) * self.POWER_FACTOR
+ self.assertTrue(self._tx(self._curvature_cmd_msg(0.0, True, power=power_over)))
+
+ def test_curvature_cmd_jerk_limit(self):
+ speed = 10.0
+ for _ in range(common.MAX_SAMPLE_VALS):
+ self._rx(self._speed_msg(speed))
+ self._rx(self._curvature_meas_msg(0.0))
+ self.safety.set_controls_allowed(True)
+
+ max_rate = ISO_LATERAL_JERK / (speed * speed)
+ max_delta = max_rate * self.SEND_RATE
+ prev = 0.0
+ self.safety.set_desired_angle_last(int(prev * self.CURVATURE_TO_CAN))
+
+ self.assertTrue(self._tx(self._curvature_cmd_msg(prev + max_delta * 0.9, True, power=50)))
+ self.safety.set_desired_angle_last(int(prev * self.CURVATURE_TO_CAN))
+ self.assertTrue(self._tx(self._curvature_cmd_msg(prev + max_delta * 3.0, True, power=50)))
+
+
+class TestVolkswagenMebStockSafety(TestVolkswagenMebSafetyBase):
+ TX_MSGS = [[MSG_HCA_03, 0], [MSG_LDW_02, 0], [MSG_GRA_ACC_01, 0], [MSG_GRA_ACC_01, 2],
+ [MSG_EA_01, 0], [MSG_EA_02, 0], [MSG_KLR_01, 0], [MSG_KLR_01, 2]]
+ FWD_BLACKLISTED_ADDRS = {0: [MSG_KLR_01],
+ 2: [MSG_HCA_03, MSG_LDW_02, MSG_EA_02]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_meb")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMeb, 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=1)))
+ self.assertFalse(self._tx(self._button_msg(resume=1)))
+ self.assertFalse(self._tx(self._button_msg(_set=1)))
+ self.safety.set_controls_allowed(1)
+ self.assertTrue(self._tx(self._button_msg(resume=1)))
+
+
+class TestVolkswagenMqbEvoStockSafety(TestVolkswagenMebStockSafety):
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_mqbevo")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMqbEvo, VolkswagenSafetyFlags.NO_GAS_OFFSET)
+ self.safety.init_tests()
+
+
+class TestVolkswagenMebLongSafety(TestVolkswagenMebSafetyBase):
+ TX_MSGS = [[MSG_HCA_03, 0], [MSG_LDW_02, 0],
+ [MSG_MEB_ACC_01, 0], [MSG_ACC_18, 0], [MSG_TA_01, 0],
+ [MSG_EA_01, 0], [MSG_EA_02, 0], [MSG_KLR_01, 0], [MSG_KLR_01, 2],
+ [MSG_AWV_03, 0], [MSG_MEB_DISTANCE_01, 0], [MSG_UDS_FUNCTIONAL, 0]]
+ FWD_BLACKLISTED_ADDRS = {0: [MSG_KLR_01],
+ 2: [MSG_HCA_03, MSG_LDW_02, MSG_EA_02, MSG_MEB_ACC_01, MSG_ACC_18, MSG_TA_01]}
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_03, MSG_LDW_02, MSG_EA_02, MSG_TA_01, MSG_MEB_ACC_01, MSG_ACC_18),
+ 2: (MSG_KLR_01,)}
+ INACTIVE_ACCEL = 3.01
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_meb")
+ self.safety = libsafety_py.libsafety
+ safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMeb, safety_param)
+ self.safety.init_tests()
+
+ def _accel_msg(self, accel):
+ values = {"ACC_Sollbeschleunigung_02": accel}
+ return self.packer.make_can_msg_safety("ACC_18", 0, values)
+
+ 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"]:
+ self.safety.set_controls_allowed(0)
+ self._rx(self._tsk_status_msg(False, main_switch=False))
+ self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=0))
+ self.assertFalse(self.safety.get_controls_allowed())
+ self._rx(self._tsk_status_msg(False, main_switch=True))
+ self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=0))
+ self.assertFalse(self.safety.get_controls_allowed())
+ self._rx(self._button_msg(bus=0))
+ self.assertTrue(self.safety.get_controls_allowed())
+
+ def test_cancel_button(self):
+ self._rx(self._tsk_status_msg(False, 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())
+
+ def test_main_switch(self):
+ 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())
+
+ def test_accel_safety_check(self):
+ for controls_allowed in [True, False]:
+ for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, self.INACTIVE_ACCEL])):
+ accel = round(accel, 2)
+ self.safety.set_controls_allowed(controls_allowed)
+ self.assertTrue(self._tx(self._accel_msg(accel)), (controls_allowed, accel))
+
+ def test_accel_allowed_with_gas_pressed(self):
+ self._rx(self._user_gas_msg(1))
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._tx(self._accel_msg(0.5)))
+
+
+class TestVolkswagenMqbEvoLongSafety(TestVolkswagenMebLongSafety):
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_mqbevo")
+ self.safety = libsafety_py.libsafety
+ safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.NO_GAS_OFFSET | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMqbEvo, safety_param)
+ self.safety.init_tests()
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_mlb.py b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_mlb.py
new file mode 100755
index 000000000..a1fce498d
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_mlb.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python3
+import unittest
+import numpy as np
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags
+
+MAX_ACCEL = 2.0
+MIN_ACCEL = -3.5
+
+MSG_LH_EPS_03 = 0x9F # RX from EPS, for driver steering torque
+MSG_ACC_01 = 0x109 # TX by OP, ACC acceleration request to the drivetrain coordinator
+MSG_ESP_03 = 0x103 # RX from ABS, for wheel speeds
+MSG_MOTOR_03 = 0x105 # RX from ECU, for driver throttle input and driver brake input
+MSG_ESP_05 = 0x106 # RX from ABS, for brake light state
+MSG_LS_01 = 0x10B # TX by OP, ACC control buttons for cancel/resume
+MSG_TSK_02 = 0x10C # RX from ECU, for ACC status from drivetrain coordinator
+MSG_HCA_01 = 0x126 # TX by OP, Heading Control Assist steering torque
+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 TestVolkswagenMlbSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest):
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02)}
+
+ MAX_RATE_UP = 9
+ MAX_RATE_DOWN = 10
+ MAX_TORQUE_LOOKUP = [0], [300]
+ MAX_RT_DELTA = 169
+
+ DRIVER_TORQUE_ALLOWANCE = 60
+ DRIVER_TORQUE_FACTOR = 3
+
+ # Wheel speeds _esp_03_msg
+ def _speed_msg(self, speed):
+ values = {"ESP_%s_Radgeschw" % s: speed for s in ["HL", "HR", "VL", "VR"]}
+ return self.packer.make_can_msg_safety("ESP_03", 0, values)
+
+ # Driver brake pressure over threshold
+ def _esp_05_msg(self, brake):
+ values = {"ESP_Fahrer_bremst": brake}
+ return self.packer.make_can_msg_safety("ESP_05", 0, values)
+
+ # Brake pedal switch
+ def _motor_03_msg(self, brake_signal=False, gas_signal=0):
+ values = {
+ "MO_Fahrer_bremst": brake_signal,
+ "MO_Fahrpedalrohwert_01": gas_signal,
+ }
+ return self.packer.make_can_msg_safety("Motor_03", 0, values)
+
+ def _user_brake_msg(self, brake):
+ return self._motor_03_msg(brake_signal=brake)
+
+ def _user_gas_msg(self, gas):
+ return self._motor_03_msg(gas_signal=gas)
+
+ # ACC engagement status
+ def _tsk_status_msg(self, enable, main_switch=True):
+ values = {"ACC_Status_ACC": 1 if not main_switch else 3 if enable else 2}
+ return self.packer.make_can_msg_safety("ACC_05", 2, 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_safety("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,
+ "HCA_01_Status_HCA": 7 if steer_req else 3}
+ return self.packer.make_can_msg_safety("HCA_01", 0, values)
+
+ # Cruise control buttons
+ def _ls_01_msg(self, cancel=0, resume=0, _set=0, main_switch=1, bus=2):
+ values = {"LS_Abbrechen": cancel, "LS_Tip_Setzen": _set, "LS_Tip_Wiederaufnahme": resume,
+ "LS_Hauptschalter": main_switch}
+ return self.packer.make_can_msg_safety("LS_01", bus, values)
+
+ # Acceleration request to drivetrain coordinator
+ def _acc_01_msg(self, accel):
+ values = {"ACC_Sollbeschleunigung": accel}
+ return self.packer.make_can_msg_safety("ACC_01", 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_03_signal, esp_05_signal in test_combinations:
+ self._rx(self._motor_03_msg(brake_signal=False))
+ self._rx(self._esp_05_msg(False))
+ self.assertFalse(self.safety.get_brake_pressed_prev())
+ self._rx(self._motor_03_msg(brake_signal=motor_03_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_03_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 TestVolkswagenMlbStockSafety(TestVolkswagenMlbSafetyBase):
+ TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_LS_01, 0], [MSG_LS_01, 2]]
+ FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_01, MSG_LDW_02]}
+ FWD_BUS_LOOKUP = {0: 2, 2: 0}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_mlb")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMlb, 0)
+ self.safety.init_tests()
+
+ def test_spam_cancel_safety_check(self):
+ self.safety.set_controls_allowed(0)
+ self.assertTrue(self._tx(self._ls_01_msg(cancel=1)))
+ self.assertFalse(self._tx(self._ls_01_msg(resume=1)))
+ self.assertFalse(self._tx(self._ls_01_msg(_set=1)))
+ # do not block resume if we are engaged already
+ self.safety.set_controls_allowed(1)
+ self.assertTrue(self._tx(self._ls_01_msg(resume=1)))
+
+ 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._ls_01_msg(cancel=True, bus=0))
+ self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel")
+
+
+class TestVolkswagenMlbLongSafety(TestVolkswagenMlbSafetyBase):
+ TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_ACC_01, 0], [MSG_ACC_02, 0]]
+ FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_01, MSG_LDW_02, MSG_ACC_01, MSG_ACC_02]}
+ FWD_BUS_LOOKUP = {0: 2, 2: 0}
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02, MSG_ACC_01, MSG_ACC_02)}
+ INACTIVE_ACCEL = 3.01
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_mlb")
+ self.safety = libsafety_py.libsafety
+ safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMlb, safety_param)
+ 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._ls_01_msg(_set=(button == "set"), resume=(button == "resume"), main_switch=0, bus=0))
+ self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} with main switch off")
+ self._rx(self._ls_01_msg(main_switch=0, bus=0))
+ self._rx(self._ls_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._ls_01_msg(bus=0))
+ self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge")
+
+ def test_main_switch(self):
+ # Disable as soon as the ACC main switch turns off
+ self._rx(self._ls_01_msg(bus=0))
+ self.safety.set_controls_allowed(1)
+ self._rx(self._ls_01_msg(main_switch=0, bus=0))
+ 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]:
+ for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, self.INACTIVE_ACCEL])):
+ accel = round(accel, 2)
+ 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)
+ self.assertEqual(send, self._tx(self._acc_01_msg(accel)), (controls_allowed, accel))
+
+ def test_accel_allowed_with_gas_pressed(self):
+ self._rx(self._user_gas_msg(1))
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._tx(self._acc_01_msg(0.5)))
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_mqb.py b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_mqb.py
new file mode 100755
index 000000000..cafd491f9
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_mqb.py
@@ -0,0 +1,223 @@
+#!/usr/bin/env python3
+import unittest
+import numpy as np
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+from iqdbc.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
+
+
+MSG_MQB_APD_1 = 0x6A0
+
+
+class TestVolkswagenMqbSafetyBase(common.CarSafetyTest):
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02), 2: (MSG_LH_EPS_03,)}
+
+ MAX_RATE_UP = 4
+ MAX_RATE_DOWN = 10
+ MAX_TORQUE_LOOKUP = [0], [300]
+ MAX_RT_DELTA = 75
+
+ DRIVER_TORQUE_ALLOWANCE = 80
+ DRIVER_TORQUE_FACTOR = 3
+
+ # 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_safety("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_safety("ESP_05", 0, values)
+
+ # Brake pedal switch
+ def _motor_14_msg(self, brake):
+ values = {"MO_Fahrer_bremst": brake}
+ return self.packer.make_can_msg_safety("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_safety("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_safety("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_safety("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_safety("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_safety("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_safety("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_safety("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(TestVolkswagenMqbSafetyBase):
+ 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], [MSG_MQB_APD_1, 1]]
+ FWD_BLACKLISTED_ADDRS = {0: [MSG_LH_EPS_03], 2: [MSG_HCA_01, MSG_LDW_02]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_mqb")
+ 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(TestVolkswagenMqbSafetyBase):
+ 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], [MSG_MQB_APD_1, 1]]
+ FWD_BLACKLISTED_ADDRS = {0: [MSG_LH_EPS_03], 2: [MSG_HCA_01, MSG_LDW_02, MSG_ACC_02, MSG_ACC_06, MSG_ACC_07]}
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02, MSG_ACC_02, MSG_ACC_06, MSG_ACC_07), 2: (MSG_LH_EPS_03,)}
+ INACTIVE_ACCEL = 3.01
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_mqb")
+ self.safety = libsafety_py.libsafety
+ safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagen, safety_param)
+ 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]:
+ for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, self.INACTIVE_ACCEL])):
+ accel = round(accel, 2)
+ 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)
+ self.assertEqual(send, self._tx(self._acc_06_msg(accel)), (controls_allowed, accel))
+ self.assertEqual(send, self._tx(self._acc_07_msg(accel)), (controls_allowed, accel))
+ both_send = (controls_allowed and MIN_ACCEL <= accel <= MAX_ACCEL) or is_inactive_accel
+ self.assertEqual(both_send, self._tx(self._acc_07_msg(accel, secondary_accel=accel)), (controls_allowed, accel))
+
+ def test_accel_allowed_with_gas_pressed(self):
+ self._rx(self._user_gas_msg(1))
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._tx(self._acc_06_msg(0.5)))
+ self.assertTrue(self._tx(self._acc_07_msg(0.5)))
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_pq.py b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_pq.py
new file mode 100755
index 000000000..c6ca4b829
--- /dev/null
+++ b/iqdbc_repo/iqdbc/safety/tests/test_volkswagen_pq.py
@@ -0,0 +1,292 @@
+#!/usr/bin/env python3
+import unittest
+import numpy as np
+
+from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags
+from iqdbc.car.structs import CarParams
+from iqdbc.safety.tests.libsafety import libsafety_py
+import iqdbc.safety.tests.common as common
+from iqdbc.safety.tests.common import CANPackerSafety
+
+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
+MSG_BLINKMODI_02 = 0x0AA # TX by OP, turn signal control
+MSG_APD_1 = 0x3D6 # TX by OP, CarParams
+MSG_IQ = 0x6A1 # TX by OP
+
+
+class TestVolkswagenPqSafetyBase(common.CarSafetyTest):
+ cruise_engaged = False
+ tsk_status = False
+
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_1, MSG_LDW_1)}
+
+ MAX_RATE_UP = 6
+ MAX_RATE_DOWN = 10
+ MAX_TORQUE_LOOKUP = [0], [300]
+ MAX_RT_DELTA = 113
+
+ DRIVER_TORQUE_ALLOWANCE = 80
+ DRIVER_TORQUE_FACTOR = 3
+
+ 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 = {"BR1_Rad_kmh": speed}
+ return self.packer.make_can_msg_safety("Bremse_1", 1, 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(), tsk_status=self.tsk_status)
+
+ # 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, tsk_status=self.tsk_status)
+
+ # Acceleration request to drivetrain coordinator
+ def _accel_msg(self, accel):
+ values = {"ACS_Sollbeschl": accel}
+ return self.packer.make_can_msg_safety("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_safety("Lenkhilfe_3", 1, values)
+
+ # openpilot steering output torque
+ def _torque_cmd_msg(self, torque, steer_req=1, hca_status=7):
+ values = {"LM_Offset": abs(torque), "LM_OffSign": torque < 0, "HCA_Status": hca_status if steer_req else 3}
+ return self.packer.make_can_msg_safety("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, tsk_status=False):
+ values = {"MO2_BLS": brake_pressed,
+ "MO2_Sta_GRA": cruise_engaged,
+ "MO2_Status_TSK": tsk_status}
+ return self.packer.make_can_msg_safety("Motor_2", 1, values)
+
+ # ACC main switch status
+ def _motor_5_msg(self, main_switch=False):
+ values = {"MO5_GRA_Hauptsch": main_switch}
+ return self.packer.make_can_msg_safety("Motor_5", 1, values)
+
+ # Driver throttle input (Motor_3)
+ def _user_gas_msg(self, gas):
+ values = {"MO3_Pedalwert": gas}
+ return self.packer.make_can_msg_safety("Motor_3", 1, 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_safety("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(TestVolkswagenPqSafetyBase):
+ # Transmit of GRA_Neu is allowed on bus 0/1/2 to keep compatibility with gateway and camera integration
+ TX_MSGS = [[MSG_HCA_1, 0], [MSG_GRA_NEU, 0], [MSG_GRA_NEU, 1], [MSG_GRA_NEU, 2], [MSG_LDW_1, 0], [MSG_BLINKMODI_02, 0], [MSG_APD_1, 1], [MSG_IQ, 1]]
+ FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_1, MSG_LDW_1]}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_pq")
+ 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(TestVolkswagenPqSafetyBase, common.LongitudinalAccelSafetyTest):
+ tsk_status = True
+
+ TX_MSGS = [[MSG_HCA_1, 0], [MSG_LDW_1, 0], [MSG_ACC_SYSTEM, 0], [MSG_ACC_GRA_ANZEIGE, 0],
+ [MSG_GRA_NEU, 1], [MSG_GRA_NEU, 2], [MSG_BLINKMODI_02, 0], [MSG_MOTOR_2, 2], [MSG_MOTOR_5, 2], [MSG_APD_1, 1], [MSG_IQ, 1]]
+ FWD_BLACKLISTED_ADDRS = {0: [MSG_MOTOR_2, MSG_MOTOR_5, MSG_GRA_NEU],
+ 2: [MSG_HCA_1, MSG_LDW_1, MSG_ACC_SYSTEM, MSG_ACC_GRA_ANZEIGE]}
+ RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_1, MSG_LDW_1, MSG_ACC_SYSTEM, MSG_ACC_GRA_ANZEIGE),
+ 2: (MSG_MOTOR_2, MSG_GRA_NEU, MSG_MOTOR_5)}
+ INACTIVE_ACCEL = 3.01
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_pq")
+ self.safety = libsafety_py.libsafety
+ safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, safety_param)
+ 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=1))
+ self._rx(self._button_msg(bus=1))
+ 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=1))
+ self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} rising edge")
+ self._rx(self._button_msg(bus=1))
+ 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=1))
+ 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_main_switch_tsk_or(self):
+ for main_switch, tsk_status, expected in (
+ (False, False, False),
+ (True, False, True),
+ (False, True, True),
+ (True, True, True),
+ ):
+ self._rx(self._motor_5_msg(main_switch=True))
+ self._rx(self._motor_2_msg(tsk_status=True))
+ self.safety.set_controls_allowed(1)
+ self._rx(self._motor_5_msg(main_switch=main_switch))
+ self._rx(self._motor_2_msg(tsk_status=tsk_status))
+ self.assertEqual(expected, self.safety.get_controls_allowed(),
+ f"main_switch={main_switch} tsk_status={tsk_status} expected={expected}")
+
+ def test_main_switch_flicker_tsk_holds(self):
+ self._rx(self._motor_5_msg(main_switch=True))
+ self._rx(self._motor_2_msg(tsk_status=True))
+ self.safety.set_controls_allowed(1)
+ self._rx(self._motor_5_msg(main_switch=False))
+ self.assertTrue(self.safety.get_controls_allowed(), "controls dropped on MO5 flicker while TSK ready")
+ self._rx(self._motor_5_msg(main_switch=True))
+ self.assertTrue(self.safety.get_controls_allowed())
+ self._rx(self._motor_5_msg(main_switch=False))
+ self._rx(self._motor_2_msg(tsk_status=False))
+ self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after both MO5 and TSK off")
+
+ def test_set_and_resume_buttons_with_tsk_only(self):
+ for button in ("set", "resume"):
+ self.safety.set_controls_allowed(0)
+ self._rx(self._motor_5_msg(main_switch=False))
+ self._rx(self._motor_2_msg(tsk_status=True))
+ self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=1))
+ self._rx(self._button_msg(bus=1))
+ self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge with TSK ready")
+
+ 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=}")
+
+ def test_accel_actuation_limits(self):
+ for accel in np.concatenate((np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.05), [0, self.INACTIVE_ACCEL])):
+ accel = round(accel, 2)
+ for controls_allowed in [True, False]:
+ for gas_pressed in [True, False]:
+ self.safety.set_controls_allowed(controls_allowed)
+ self.safety.set_gas_pressed_prev(gas_pressed)
+ is_inactive = accel == self.INACTIVE_ACCEL
+ should_tx = (controls_allowed and self.MIN_ACCEL <= accel <= self.MAX_ACCEL) or is_inactive
+ self.assertEqual(should_tx, self._tx(self._accel_msg(accel)), (controls_allowed, gas_pressed, accel))
+
+ def test_accel_allowed_with_gas_pressed(self):
+ self._rx(self._user_gas_msg(1))
+ self.safety.set_controls_allowed(True)
+ self.assertTrue(self._tx(self._accel_msg(0.5)))
+
+
+class TestVolkswagenPqLowlineSafety(TestVolkswagenPqSafetyBase):
+ """Non-ECAN lateral-only PQ cars: bus 0 dead, TX on bus 1 (ptCAN) directly to EPS."""
+ TX_MSGS = [[MSG_HCA_1, 1], [MSG_GRA_NEU, 1], [MSG_GRA_NEU, 2], [MSG_LDW_1, 1], [MSG_BLINKMODI_02, 1], [MSG_APD_1, 1], [MSG_IQ, 1]]
+ FWD_BUS_LOOKUP = {2: 0}
+ FWD_BLACKLISTED_ADDRS = {}
+ RELAY_MALFUNCTION_ADDRS = {1: (MSG_HCA_1, MSG_LDW_1)}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_pq")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, VolkswagenSafetyFlags.PQ_LOWLINE | VolkswagenSafetyFlags.PQ_NO_CAM_BUS)
+ self.safety.init_tests()
+
+ def _torque_cmd_msg(self, torque, steer_req=1, hca_status=7):
+ values = {"LM_Offset": abs(torque), "LM_OffSign": torque < 0, "HCA_Status": hca_status if steer_req else 3}
+ return self.packer.make_can_msg_safety("HCA_1", 1, values)
+
+ 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)))
+ self.safety.set_controls_allowed(1)
+ self.assertTrue(self._tx(self._button_msg(resume=True)))
+
+
+class TestVolkswagenPqNoCamSafety(TestVolkswagenPqStockSafety):
+ FWD_BUS_LOOKUP = {2: 0}
+
+ def setUp(self):
+ self.packer = CANPackerSafety("vw_pq")
+ self.safety = libsafety_py.libsafety
+ self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, VolkswagenSafetyFlags.PQ_NO_CAM_BUS)
+ self.safety.init_tests()
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/iqdbc_repo/pyproject.toml b/iqdbc_repo/pyproject.toml
new file mode 100644
index 000000000..1806468df
--- /dev/null
+++ b/iqdbc_repo/pyproject.toml
@@ -0,0 +1,148 @@
+[project]
+name = "iqdbc"
+version = "0.2.1"
+description = "CAN bus databases and tools"
+license = "MIT"
+authors = [{ name = "IQ.Lvbs", email = "team@iqlvbs.com" }]
+readme = "README.md"
+requires-python = ">=3.11,<3.13" # pycapnp doesn't work with 3.13
+
+urls = { "homepage" = "https://git.konn3kt.com/teal/iqdbc" }
+
+dependencies = [
+ "scons",
+ "numpy",
+ "crcmod-plus",
+ "tqdm",
+ "pycapnp==2.1.0",
+ "pycryptodome",
+]
+
+[project.optional-dependencies]
+testing = [
+ "comma-car-segments @ https://huggingface.co/datasets/commaai/commaCarSegments/resolve/main/dist/comma_car_segments-0.1.0-py3-none-any.whl",
+ "cffi",
+ "gcovr",
+ # FIXME: pytest 9.0.0 doesn't support unittest.SkipTest
+ "pytest==8.4.2",
+ "pytest-coverage",
+ "pytest-mock",
+ "pytest-randomly",
+ # https://github.com/pytest-dev/pytest-xdist/pull/1229
+ "pytest-xdist @ git+https://github.com/sshane/pytest-xdist@2b4372bd62699fb412c4fe2f95bf9f01bd2018da",
+ "pytest-subtests",
+ "hypothesis==6.47.*",
+ "parameterized>=0.8,<0.9",
+ "zstandard",
+
+ # static analysis
+ "ruff",
+ "ty",
+ "lefthook",
+ "cpplint",
+ "codespell",
+]
+docs = [
+ "Jinja2",
+]
+examples = [
+ "inputs",
+ "matplotlib",
+]
+
+[build-system]
+requires = ["setuptools"]
+build-backend = "setuptools.build_meta"
+
+[tool.pytest.ini_options]
+addopts = "-Werror --strict-config --strict-markers --durations=10 -n auto"
+python_files = "test_*.py"
+testpaths = [
+ "iqdbc"
+]
+
+[tool.codespell]
+quiet-level = 3
+ignore-words-list = "alo,ba,bu,deque,hda,grey,arange"
+builtin = "clear,rare,informal,code,names,en-GB_to_en-US"
+check-hidden = true
+
+# https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml
+[tool.ruff]
+line-length = 160
+indent-width = 2
+target-version="py311"
+
+[tool.ruff.lint]
+preview = true
+select = [
+ "E", "F", "W", "PIE", "C4", "ISC", "A", "B",
+ "NPY", # numpy
+ "UP", # pyupgrade
+ "TRY203", "TRY400", "TRY401", # try/excepts
+ "RUF008", "RUF100",
+ "TID251",
+ "PLR1704",
+ "INP001",
+]
+ignore = [
+ "E302", "E305", # too restrictive
+ "W292",
+ "E741",
+ "E402",
+ "C408",
+ "ISC003",
+ "B027",
+ "B024",
+ "UP031",
+ "NPY002", # new numpy random syntax is worse
+ "C420",
+ "E111", "E114", "E226", "E241",
+ "E221", "E265", "E266", "E261",
+ "E252", "E251", "E231", "E225",
+ "E262", "C419",
+]
+flake8-implicit-str-concat.allow-multiline=false
+
+[tool.ruff.lint.per-file-ignores]
+"site_scons/*" = ["ALL"]
+
+[tool.ruff.lint.flake8-tidy-imports.banned-api]
+"pytest.main".msg = "pytest.main requires special handling that is easy to mess up!"
+"numpy.mean".msg = "Sum and divide. np.mean is slow"
+# TODO: re-enable when all tests are converted to pytest
+#"unittest".msg = "Use pytest"
+
+[tool.ty.rules]
+# Ignore rules that produce false positives due to:
+# - Dynamic attributes on LibSafety (loaded from compiled C library)
+# - External dependencies not installed (panda, cereal, openpilot)
+# - capnp dynamically generated types
+possibly-missing-attribute = "ignore"
+unresolved-attribute = "ignore"
+unresolved-import = "ignore"
+
+# Intentional LSP violations in subclass method signatures
+invalid-method-override = "ignore"
+
+# Optional callables called without None checks in test code
+call-non-callable = "ignore"
+
+# Complex type narrowing ty doesn't handle well (isinstance with abstract types)
+invalid-argument-type = "ignore"
+
+# Dynamic type patterns (e.g., values converted from Number to list in __init__)
+not-subscriptable = "ignore"
+unsupported-operator = "ignore"
+
+# Return types with complex callable signatures
+invalid-return-type = "ignore"
+
+# Test class method signature differences
+too-many-positional-arguments = "ignore"
+
+[tool.setuptools]
+include-package-data = true
+
+[tool.setuptools.package-data]
+"iqdbc.safety" = ["*.h", "board/*.h", "board/drivers/*.h", "modes/*.h"]
diff --git a/iqdbc_repo/setup.sh b/iqdbc_repo/setup.sh
new file mode 100755
index 000000000..feb781afc
--- /dev/null
+++ b/iqdbc_repo/setup.sh
@@ -0,0 +1,45 @@
+#!/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 [ "$(uname -s)" = "Linux" ]; then
+ if ! command -v "mull-runner-18" > /dev/null 2>&1; then
+ 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 clang-18 mull-18
+ fi
+elif [ "$(uname -s)" = "Darwin" ]; then
+ if ! brew list llvm@18 &>/dev/null; then
+ brew install llvm@18
+ fi
+ if [ ! -f "$BASEDIR/.mull/bin/mull-runner-18" ]; then
+ MULL_VERSION="0.26.1"
+ MULL_ZIP="Mull-18-${MULL_VERSION}-LLVM-18.1-macOS-arm64-14.7.4.zip"
+ MULL_DIR="Mull-18-${MULL_VERSION}-LLVM-18.1-macOS-arm64-14.7.4"
+ curl -LO "https://github.com/mull-project/mull/releases/download/${MULL_VERSION}/${MULL_ZIP}"
+ unzip -o "$MULL_ZIP"
+ mv "$MULL_DIR" "$BASEDIR/.mull"
+ rm "$MULL_ZIP"
+ fi
+ export PATH="$BASEDIR/.mull/bin:$PATH"
+fi
+
+if ! command -v uv &>/dev/null; then
+ echo "'uv' is not installed. Installing 'uv'..."
+ curl -LsSf https://astral.sh/uv/install.sh | sh
+
+ # must source this after install on some platforms
+ if [ -f $HOME/.local/bin/env ]; then
+ source $HOME/.local/bin/env
+ fi
+fi
+
+export UV_PROJECT_ENVIRONMENT="$BASEDIR/.venv"
+uv sync --all-extras --inexact
+source "$PYTHONPATH/.venv/bin/activate"
+
+$BASEDIR/iqdbc/safety/tests/misra/install.sh
diff --git a/iqdbc_repo/test.sh b/iqdbc_repo/test.sh
new file mode 100755
index 000000000..e81841b65
--- /dev/null
+++ b/iqdbc_repo/test.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+source ./setup.sh
+
+# *** uv lockfile check ***
+uv lock --check
+
+# *** build ***
+scons -j8
+
+# *** lint + test ***
+lefthook run test
+
+# *** all done ***
+GREEN='\033[0;32m'
+NC='\033[0m'
+printf "\n${GREEN}All good!${NC} Finished build, lint, and test in ${SECONDS}s\n"
diff --git a/iqdbc_repo/uv.lock b/iqdbc_repo/uv.lock
new file mode 100644
index 000000000..381b264d6
--- /dev/null
+++ b/iqdbc_repo/uv.lock
@@ -0,0 +1,1066 @@
+version = 1
+revision = 3
+requires-python = ">=3.11, <3.13"
+
+[[package]]
+name = "attrs"
+version = "25.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2026.1.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" },
+ { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" },
+ { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" },
+ { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
+ { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" },
+ { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
+ { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
+ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" },
+ { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" },
+ { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" },
+ { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" },
+ { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" },
+ { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" },
+ { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" },
+ { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" },
+ { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
+ { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
+ { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
+ { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
+ { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
+ { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
+]
+
+[[package]]
+name = "codespell"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740, upload-time = "2025-01-28T18:52:39.411Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501, upload-time = "2025-01-28T18:52:37.057Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "colorlog"
+version = "6.10.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a2/61/f083b5ac52e505dfc1c624eafbf8c7589a0d7f32daa398d2e7590efa5fda/colorlog-6.10.1.tar.gz", hash = "sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321", size = 17162, upload-time = "2025-10-16T16:14:11.978Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl", hash = "sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c", size = 11743, upload-time = "2025-10-16T16:14:10.512Z" },
+]
+
+[[package]]
+name = "comma-car-segments"
+version = "0.1.0"
+source = { url = "https://huggingface.co/datasets/commaai/commaCarSegments/resolve/main/dist/comma_car_segments-0.1.0-py3-none-any.whl" }
+dependencies = [
+ { name = "requests" },
+]
+wheels = [
+ { url = "https://huggingface.co/datasets/commaai/commaCarSegments/resolve/main/dist/comma_car_segments-0.1.0-py3-none-any.whl", hash = "sha256:6c6483558cd90d3e9152ff7930394bb13678a7ab50ef2c79601d818c66235352" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "requests" }]
+
+[[package]]
+name = "contourpy"
+version = "1.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" },
+ { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" },
+ { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" },
+ { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" },
+ { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" },
+ { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" },
+ { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" },
+ { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" },
+ { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" },
+ { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" },
+ { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" },
+ { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" },
+ { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" },
+ { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" },
+]
+
+[[package]]
+name = "coverage"
+version = "7.13.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6c/01/abca50583a8975bb6e1c59eff67ed8e48bb127c07dad5c28d9e96ccc09ec/coverage-7.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:060ebf6f2c51aff5ba38e1f43a2095e087389b1c69d559fde6049a4b0001320e", size = 218971, upload-time = "2026-01-25T12:57:36.953Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/0e/b6489f344d99cd1e5b4d5e1be52dfd3f8a3dc5112aa6c33948da8cabad4e/coverage-7.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1ea8ca9db5e7469cd364552985e15911548ea5b69c48a17291f0cac70484b2e", size = 219473, upload-time = "2026-01-25T12:57:38.934Z" },
+ { url = "https://files.pythonhosted.org/packages/17/11/db2f414915a8e4ec53f60b17956c27f21fb68fcf20f8a455ce7c2ccec638/coverage-7.13.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b780090d15fd58f07cf2011943e25a5f0c1c894384b13a216b6c86c8a8a7c508", size = 249896, upload-time = "2026-01-25T12:57:40.365Z" },
+ { url = "https://files.pythonhosted.org/packages/80/06/0823fe93913663c017e508e8810c998c8ebd3ec2a5a85d2c3754297bdede/coverage-7.13.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:88a800258d83acb803c38175b4495d293656d5fac48659c953c18e5f539a274b", size = 251810, upload-time = "2026-01-25T12:57:42.045Z" },
+ { url = "https://files.pythonhosted.org/packages/61/dc/b151c3cc41b28cdf7f0166c5fa1271cbc305a8ec0124cce4b04f74791a18/coverage-7.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6326e18e9a553e674d948536a04a80d850a5eeefe2aae2e6d7cf05d54046c01b", size = 253920, upload-time = "2026-01-25T12:57:44.026Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/35/e83de0556e54a4729a2b94ea816f74ce08732e81945024adee46851c2264/coverage-7.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59562de3f797979e1ff07c587e2ac36ba60ca59d16c211eceaa579c266c5022f", size = 250025, upload-time = "2026-01-25T12:57:45.624Z" },
+ { url = "https://files.pythonhosted.org/packages/39/67/af2eb9c3926ce3ea0d58a0d2516fcbdacf7a9fc9559fe63076beaf3f2596/coverage-7.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27ba1ed6f66b0e2d61bfa78874dffd4f8c3a12f8e2b5410e515ab345ba7bc9c3", size = 251612, upload-time = "2026-01-25T12:57:47.713Z" },
+ { url = "https://files.pythonhosted.org/packages/26/62/5be2e25f3d6c711d23b71296f8b44c978d4c8b4e5b26871abfc164297502/coverage-7.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8be48da4d47cc68754ce643ea50b3234557cbefe47c2f120495e7bd0a2756f2b", size = 249670, upload-time = "2026-01-25T12:57:49.378Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/51/400d1b09a8344199f9b6a6fc1868005d766b7ea95e7882e494fa862ca69c/coverage-7.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2a47a4223d3361b91176aedd9d4e05844ca67d7188456227b6bf5e436630c9a1", size = 249395, upload-time = "2026-01-25T12:57:50.86Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/36/f02234bc6e5230e2f0a63fd125d0a2093c73ef20fdf681c7af62a140e4e7/coverage-7.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6f141b468740197d6bd38f2b26ade124363228cc3f9858bd9924ab059e00059", size = 250298, upload-time = "2026-01-25T12:57:52.287Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/06/713110d3dd3151b93611c9cbfc65c15b4156b44f927fced49ac0b20b32a4/coverage-7.13.2-cp311-cp311-win32.whl", hash = "sha256:89567798404af067604246e01a49ef907d112edf2b75ef814b1364d5ce267031", size = 221485, upload-time = "2026-01-25T12:57:53.876Z" },
+ { url = "https://files.pythonhosted.org/packages/16/0c/3ae6255fa1ebcb7dec19c9a59e85ef5f34566d1265c70af5b2fc981da834/coverage-7.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:21dd57941804ae2ac7e921771a5e21bbf9aabec317a041d164853ad0a96ce31e", size = 222421, upload-time = "2026-01-25T12:57:55.433Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/37/fabc3179af4d61d89ea47bd04333fec735cd5e8b59baad44fed9fc4170d7/coverage-7.13.2-cp311-cp311-win_arm64.whl", hash = "sha256:10758e0586c134a0bafa28f2d37dd2cdb5e4a90de25c0fc0c77dabbad46eca28", size = 221088, upload-time = "2026-01-25T12:57:57.41Z" },
+ { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" },
+ { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" },
+ { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" },
+ { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" },
+ { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" },
+ { url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" },
+]
+
+[package.optional-dependencies]
+toml = [
+ { name = "tomli", marker = "python_full_version <= '3.11'" },
+]
+
+[[package]]
+name = "cpplint"
+version = "2.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c5/83/47a9e7513ba4d943a9dac2f6752b444377c91880f4f4968799b4f42d89cc/cpplint-2.0.2.tar.gz", hash = "sha256:8a5971e4b5490133e425284f0c566c7ade0b959e61018d2c9af3ff7f357ddc57", size = 373781, upload-time = "2025-04-08T01:22:26.017Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/66/65/08d3a5039b565231c501b31d1a973d4222e9803c03b2c31a9c08bdec3e30/cpplint-2.0.2-py3-none-any.whl", hash = "sha256:7ec188b5a08e604294ae7e7f88ec3ece2699de857f0533b305620c8cf237cad5", size = 81987, upload-time = "2025-04-08T01:22:24.101Z" },
+]
+
+[[package]]
+name = "crcmod-plus"
+version = "2.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/0c/71733bbaf38e9f1eaecfdf7f8e350993f3dcac208a5297c41503ae66e513/crcmod_plus-2.3.1.tar.gz", hash = "sha256:732ffe3c3ce3ef9b272e1827d8fb894590c4d6ff553f2a2b41ae30f4f94b0f5d", size = 22319, upload-time = "2025-10-10T22:14:21.691Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/47/e0/2dad2e6f0cd4914b4144496d9785780ec820e200816c080df785cfa34da6/crcmod_plus-2.3.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:b7e35e0f7d93d7571c2c9c3d6760e456999ea4c1eae5ead6acac247b5a79e469", size = 23279, upload-time = "2025-10-10T22:13:47.281Z" },
+ { url = "https://files.pythonhosted.org/packages/66/76/53c0b65b9679b903f98fc54efa32b0e5a19634712a45200c7a80674aa6f5/crcmod_plus-2.3.1-cp311-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6853243120db84677b94b625112116f0ef69cd581741d20de58dce4c34242654", size = 20185, upload-time = "2025-10-10T22:13:48.06Z" },
+ { url = "https://files.pythonhosted.org/packages/98/79/2b4dc9bb26394873d7699737124408b5106264ae33053fdec600e9a9fa65/crcmod_plus-2.3.1-cp311-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:17735bc4e944d552ea18c8609fc6d08a5e64ee9b29cc216ba4d623754029cc3a", size = 26999, upload-time = "2025-10-10T22:13:48.854Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/e8/f5d66778b5a1bff915807016561a02b5cebf6b3840fb8a2be40bbb0c8575/crcmod_plus-2.3.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ac755040a2a35f43ab331978c48a9acb4ff64b425f282a296be467a410f00c3", size = 27536, upload-time = "2025-10-10T22:13:49.956Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/2c/0113ad30cadad40c22eef08c0f2618f2446dd282f02268fecbcfc9fda3c1/crcmod_plus-2.3.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bdcfb838ca093ca673a3bbb37f62d1e5ec7182e00cc5ee2d00759f9f9f8ab11", size = 27385, upload-time = "2025-10-10T22:13:50.765Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/ba/501ef1b02119402cf1a31c01eb2cb8399660bca863c2f4dd3dc060220284/crcmod_plus-2.3.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9166bc3c9b5e7b07b4e6854cac392b4a451b31d58d3950e48c140ab7b5d05394", size = 27135, upload-time = "2025-10-10T22:13:51.889Z" },
+ { url = "https://files.pythonhosted.org/packages/49/90/d4556c9db69c83e726c5b88da3d656fdaac7d60c4d27b43cb939bed80069/crcmod_plus-2.3.1-cp311-abi3-win32.whl", hash = "sha256:cb99b694cce5c862560cf332a8b5e793620e28f0de3726995608bbd6f9b6e09a", size = 22384, upload-time = "2025-10-10T22:13:53.016Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/7e/57bb97a8c7b4e19900744f58b67dc83bc9c83aaac670deeede9fb3bfab6a/crcmod_plus-2.3.1-cp311-abi3-win_amd64.whl", hash = "sha256:82b0f7e968c430c5a80fe0fc59e75cb54f2e84df2ed0cee5a3ff9cadfbf8a220", size = 22912, upload-time = "2025-10-10T22:13:53.849Z" },
+ { url = "https://files.pythonhosted.org/packages/76/66/419ae3991bb68943cb752e2f4d317c555e3f02a298dd498f26113874ee59/crcmod_plus-2.3.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9397324da1be2729f894744d9031a21ed97584c17fb0289e69e0c3c60916fc5f", size = 19880, upload-time = "2025-10-10T22:14:17.269Z" },
+ { url = "https://files.pythonhosted.org/packages/18/f0/d10c9b859927b2cdc38eafc33c8b66e4ede02eaa174df4575681dab5a0f1/crcmod_plus-2.3.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:073c7a3b832652e66c41c8b8705eaecda704d1cbe850b9fa05fdee36cd50745a", size = 21120, upload-time = "2025-10-10T22:14:18.117Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/68/cbd8f1707b37b80f9a0bf643e04747b0196f69cf065b52ed56639afbecef/crcmod_plus-2.3.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e5f4c62553f772ea7ae12d9484801b752622c9c288e49ee7ea34a20b94e4920", size = 21698, upload-time = "2025-10-10T22:14:20.044Z" },
+ { url = "https://files.pythonhosted.org/packages/41/1b/4ab1681ecbfc48d7e4641fb178c97374eb475ae4109255bdd832110cbbe2/crcmod_plus-2.3.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5e80a9860f66f339956f540d86a768f4fe8c8bfcb139811f14be864425c48d64", size = 23289, upload-time = "2025-10-10T22:14:20.875Z" },
+]
+
+[[package]]
+name = "cycler"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
+]
+
+[[package]]
+name = "execnet"
+version = "2.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" },
+]
+
+[[package]]
+name = "fonttools"
+version = "4.61.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" },
+ { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" },
+ { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" },
+ { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" },
+ { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" },
+ { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" },
+ { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" },
+ { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" },
+]
+
+[[package]]
+name = "gcovr"
+version = "8.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorlog" },
+ { name = "jinja2" },
+ { name = "lxml" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/07/37/b4a87dff166dc0a5002e9d03fcb6ca8eeff048247b011b67f047e31122c9/gcovr-8.6.tar.gz", hash = "sha256:b2e7042abca9321cadbab8a06eb34d19f801b831557b28cdc30a029313de8b9e", size = 199997, upload-time = "2026-01-13T20:04:30.019Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/92/be/f722c843e7875c7cf92cf0e0c1604cddda55a70278c768c6327a78fdba79/gcovr-8.6-py3-none-any.whl", hash = "sha256:dbf9d87c38042752ad6f530aa8210427e22b526611bb7b7bfed0e81977d1f1ef", size = 254618, upload-time = "2026-01-13T20:04:28.15Z" },
+]
+
+[[package]]
+name = "hypothesis"
+version = "6.47.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "sortedcontainers" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/45/f2/f77da8271b1abb630cb2090ead2f5aa4acc9639d632e8e68187f52527e4b/hypothesis-6.47.5.tar.gz", hash = "sha256:e0c1e253fc97e7ecdb9e2bbff2cf815d8739e0d1d3d093d67c3af5bb6a7211b0", size = 326641, upload-time = "2022-06-25T20:58:48.926Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d3/a7/389bbaade2cbbb2534cb2715986041ed01c6d792152c527e71f7f68e93b5/hypothesis-6.47.5-py3-none-any.whl", hash = "sha256:87049b781ee11ec1c7948565b889ab02e428a1e32d427ab4de8fdb3649242d06", size = 387311, upload-time = "2022-06-25T20:58:45.281Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "inputs"
+version = "0.5"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d1/cd/5f434220920f76eb73d19bb7aab8d857445f40aa642718e6e51e850cd663/inputs-0.5.tar.gz", hash = "sha256:a31d5b96a3525f1232f326be9e7ce8ccaf873c6b1fb84d9f3c9bc3d79b23eae4", size = 33393, upload-time = "2018-10-05T22:38:14.206Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/94/040a0d9c81f018c39bd887b7b825013b024deb0a6c795f9524797e2cd41b/inputs-0.5-py2.py3-none-any.whl", hash = "sha256:13f894564e52134cf1e3862b1811da034875eb1f2b62e6021e3776e9669a96ec", size = 33630, upload-time = "2018-10-05T22:38:28.28Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "kiwisolver"
+version = "1.4.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" },
+ { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" },
+ { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" },
+ { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" },
+ { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" },
+ { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" },
+ { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" },
+ { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" },
+ { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" },
+ { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" },
+ { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" },
+ { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" },
+ { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" },
+ { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" },
+ { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" },
+ { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" },
+ { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" },
+ { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" },
+]
+
+[[package]]
+name = "lefthook"
+version = "2.0.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/8f/e90724128f481c637b7e9343b6535622cfa136541959a49f8a3de0d0e7a5/lefthook-2.0.15.tar.gz", hash = "sha256:8a32c9f2d44f0ff0f3e3ab48f9802ca10f1222b491f3f14e03f577ec175b6649", size = 50175274, upload-time = "2026-01-13T10:02:58.76Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7c/d5/243d967f541d422a7252f92dbcc201cfd588bd404a66935baacc83be49c5/lefthook-2.0.15-py3-none-any.whl", hash = "sha256:54b174520f18a4fa2545ff1e5eae4c4d2515539fb25b8c4fe04b9224a2ff07ee", size = 50416709, upload-time = "2026-01-13T10:02:55.761Z" },
+]
+
+[[package]]
+name = "lxml"
+version = "6.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" },
+ { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" },
+ { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" },
+ { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" },
+ { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" },
+ { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" },
+ { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" },
+ { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" },
+ { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" },
+ { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" },
+ { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" },
+ { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" },
+ { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
+ { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
+ { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
+ { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
+ { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+]
+
+[[package]]
+name = "matplotlib"
+version = "3.10.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "contourpy" },
+ { name = "cycler" },
+ { name = "fonttools" },
+ { name = "kiwisolver" },
+ { name = "numpy" },
+ { name = "packaging" },
+ { name = "pillow" },
+ { name = "pyparsing" },
+ { name = "python-dateutil" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" },
+ { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" },
+ { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" },
+ { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" },
+ { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" },
+ { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.4.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" },
+ { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" },
+ { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" },
+ { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" },
+ { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" },
+ { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" },
+ { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" },
+ { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" },
+ { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" },
+ { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" },
+ { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" },
+ { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" },
+ { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" },
+ { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" },
+ { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" },
+]
+
+[[package]]
+name = "iqdbc"
+version = "0.2.1"
+source = { editable = "." }
+dependencies = [
+ { name = "crcmod-plus" },
+ { name = "numpy" },
+ { name = "pycapnp" },
+ { name = "pycryptodome" },
+ { name = "scons" },
+ { name = "tqdm" },
+]
+
+[package.optional-dependencies]
+docs = [
+ { name = "jinja2" },
+]
+examples = [
+ { name = "inputs" },
+ { name = "matplotlib" },
+]
+testing = [
+ { name = "cffi" },
+ { name = "codespell" },
+ { name = "comma-car-segments" },
+ { name = "cpplint" },
+ { name = "gcovr" },
+ { name = "hypothesis" },
+ { name = "lefthook" },
+ { name = "parameterized" },
+ { name = "pytest" },
+ { name = "pytest-coverage" },
+ { name = "pytest-mock" },
+ { name = "pytest-randomly" },
+ { name = "pytest-subtests" },
+ { name = "pytest-xdist" },
+ { name = "ruff" },
+ { name = "ty" },
+ { name = "zstandard" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "cffi", marker = "extra == 'testing'" },
+ { name = "codespell", marker = "extra == 'testing'" },
+ { name = "comma-car-segments", marker = "extra == 'testing'", url = "https://huggingface.co/datasets/commaai/commaCarSegments/resolve/main/dist/comma_car_segments-0.1.0-py3-none-any.whl" },
+ { name = "cpplint", marker = "extra == 'testing'" },
+ { name = "crcmod-plus" },
+ { name = "gcovr", marker = "extra == 'testing'" },
+ { name = "hypothesis", marker = "extra == 'testing'", specifier = "==6.47.*" },
+ { name = "inputs", marker = "extra == 'examples'" },
+ { name = "jinja2", marker = "extra == 'docs'" },
+ { name = "lefthook", marker = "extra == 'testing'" },
+ { name = "matplotlib", marker = "extra == 'examples'" },
+ { name = "numpy" },
+ { name = "parameterized", marker = "extra == 'testing'", specifier = ">=0.8,<0.9" },
+ { name = "pycapnp", specifier = "==2.1.0" },
+ { name = "pycryptodome" },
+ { name = "pytest", marker = "extra == 'testing'", specifier = "==8.4.2" },
+ { name = "pytest-coverage", marker = "extra == 'testing'" },
+ { name = "pytest-mock", marker = "extra == 'testing'" },
+ { name = "pytest-randomly", marker = "extra == 'testing'" },
+ { name = "pytest-subtests", marker = "extra == 'testing'" },
+ { name = "pytest-xdist", marker = "extra == 'testing'", git = "https://github.com/sshane/pytest-xdist?rev=2b4372bd62699fb412c4fe2f95bf9f01bd2018da" },
+ { name = "ruff", marker = "extra == 'testing'" },
+ { name = "scons" },
+ { name = "tqdm" },
+ { name = "ty", marker = "extra == 'testing'" },
+ { name = "zstandard", marker = "extra == 'testing'" },
+]
+provides-extras = ["testing", "docs", "examples"]
+
+[[package]]
+name = "packaging"
+version = "26.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" },
+]
+
+[[package]]
+name = "parameterized"
+version = "0.8.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c6/23/2288f308d238b4f261c039cafcd650435d624de97c6ffc903f06ea8af50f/parameterized-0.8.1.tar.gz", hash = "sha256:41bbff37d6186430f77f900d777e5bb6a24928a1c46fb1de692f8b52b8833b5c", size = 23936, upload-time = "2021-01-09T20:35:18.235Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/31/13/fe468c8c7400a8eca204e6e160a29bf7dcd45a76e20f1c030f3eaa690d93/parameterized-0.8.1-py2.py3-none-any.whl", hash = "sha256:9cbb0b69a03e8695d68b3399a8a5825200976536fe1cb79db60ed6a4c8c9efe9", size = 26354, upload-time = "2021-01-09T20:35:16.307Z" },
+]
+
+[[package]]
+name = "pillow"
+version = "12.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" },
+ { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" },
+ { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" },
+ { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" },
+ { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" },
+ { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" },
+ { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" },
+ { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" },
+ { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pycapnp"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/15/86/a57e3c92acd3e1d2fc3dcad683ada191f722e4ac927e1a384b228ec2780a/pycapnp-2.1.0.tar.gz", hash = "sha256:69cc3d861fee1c9b26c73ad2e8a5d51e76ad87e4ff9be33a4fd2fc72f5846aec", size = 689734, upload-time = "2025-09-05T03:50:40.851Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/68/7c/934750a0ca77431a22e68e11521dcc6b801bea3ff37331d6a519e5ad142e/pycapnp-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efacc439ec287d9e8a0ebf01a515404eff795659401e65ba6f1819c7b24f4380", size = 1628855, upload-time = "2025-09-05T03:48:32.317Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/a2/fd2c10b3f2e5010c747aa946b27fe09f665d65d5dc2afdd31838a3ef2f5d/pycapnp-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d8af535a8b44dfd71731a191386c6b821b8a4915806948893d18c79f547a8e", size = 1496942, upload-time = "2025-09-05T03:48:34.905Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/8a/42bd0e4c094ef534ac6890d34adae580cbbf5b0497fc0a6340bea833a617/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:117d1d5ebfc08cc189aca4f771b34fedc1291a3f9417167bd2d9b2a4e607e640", size = 5200170, upload-time = "2025-09-05T03:48:36.502Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/2e92268383135082191c3dea4a9ad184d20b7fb2dda1477fd6ee520fd88e/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:d881ccc69e381863a88c7b6c7092a6baecb6dfc8c5558d66bc967c7f778fe7bc", size = 5684026, upload-time = "2025-09-05T03:48:38.063Z" },
+ { url = "https://files.pythonhosted.org/packages/46/9c/bca1cbd7711c9c0f0f62ca95a49835369a61c4f6527a6900c8982045bf2f/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:8a4ea330e38ba83f6f03fbdc1f58642eb53e6f6f66734a426fa592dc988d70e9", size = 5709307, upload-time = "2025-09-05T03:48:40.127Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/29/cd14676d992c7b166baa7e022b369c15240d408b202410d105b23b25f737/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:fb2563de4619d359820de9d47b4704e4f7eda193ffc4a56e39cdcd2c8301c336", size = 5386505, upload-time = "2025-09-05T03:48:41.785Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/dd/2fc57cebe9be7e4cd3d6aec0b9c8a0db9772c1b17c37cfe4f04c050422cf/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5265d1ae34f9c089fa6983f6c1be404ce480c82b927017290bd703328fa3f5df", size = 6095180, upload-time = "2025-09-05T03:48:43.795Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/16/da8c1ada7770a532c859df475533eec5a1b2f5e81a269466a2fe670c5747/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b0a56370a868f752375a785bfb7e06b55cbe71605972615d1220c380bc452380", size = 6603414, upload-time = "2025-09-05T03:48:45.457Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/e6/a36eacaf2da6a5ac9c6565600e559edf95115ff990aa3379aee8dd7ba4fe/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5d7403c25275cf4badf6f9d0c07b1cb94fcdd599df81aba9b621c32b3dcefae9", size = 6621440, upload-time = "2025-09-05T03:48:47.706Z" },
+ { url = "https://files.pythonhosted.org/packages/81/54/9150c03638cf4ecdf1664867382d0049146c658d6de30f189817c502df1a/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dea5d0d250fe4851b42cd380a207d773ebae76a990e542a888a5f1442f4c247e", size = 6354219, upload-time = "2025-09-05T03:48:49.336Z" },
+ { url = "https://files.pythonhosted.org/packages/66/3e/e49ba2d74456d53b570c8d30a660c3b29ecfea075d5dd663132ff9049f19/pycapnp-2.1.0-cp311-cp311-win32.whl", hash = "sha256:593844c3cd92937eb5e7cd47ea3a62cde2d49a1fc05dba644f513c68f60f1318", size = 1053647, upload-time = "2025-09-05T03:48:51.108Z" },
+ { url = "https://files.pythonhosted.org/packages/53/de/2b61908dc6abf25b17fed6b5a3b42a2226ec09467a3944f1d845ac29ef9b/pycapnp-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac13dd30062bb9985ae9ec4feca106af2b4fdac6468a09c7b74ad754f3921a06", size = 1208911, upload-time = "2025-09-05T03:48:53.219Z" },
+ { url = "https://files.pythonhosted.org/packages/74/0e/66b41ba600e5f2523e900b7cc0d2e8496b397a1f2d6a5b7b323ab83418b7/pycapnp-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d2ec561bc948d11f64f43bf9601bede5d6a603d105ae311bd5583c7130624a4", size = 1619223, upload-time = "2025-09-05T03:48:54.64Z" },
+ { url = "https://files.pythonhosted.org/packages/40/6e/9bcb30180bd40cb0534124ff7f8ba8746a735018d593f608bf40c97821c0/pycapnp-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132cd97f57f6b6636323ca9b68d389dd90b96e87af38cde31e2b5c5a064f277e", size = 1484321, upload-time = "2025-09-05T03:48:55.85Z" },
+ { url = "https://files.pythonhosted.org/packages/14/0a/9ee1c9ecaff499e4fd1df2f0335bc20f666ec6ce5cd80f8ab055007f3c9b/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:568e79268ba7c02a71fe558a8aec1ae3c0f0e6aff809ff618a46afe4964957d2", size = 5143502, upload-time = "2025-09-05T03:48:57.733Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/50/65837e1416f7a8861ca1e8fe4582a5aef37192d7ef5e2ecfe46880bfdf9c/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:bcbf6f882d78d368c8e4bb792295392f5c4d71ddffa13a48da27e7bd47b99e37", size = 5508134, upload-time = "2025-09-05T03:48:59.383Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/59/46df6db800e77dbc3cc940723fb3fd7bc837327c858edf464a0f904bf547/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:dc25b96e393410dde25c61c1df3ce644700ef94826c829426d58c2c6b3e2d2f5", size = 5631794, upload-time = "2025-09-05T03:49:03.511Z" },
+ { url = "https://files.pythonhosted.org/packages/63/9d/18e978500d5f6bd8d152f4d6919e3cfb83ead8a71c14613bbb54322df8b9/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:48938e0436ab1be615fc0a41434119a2065490a6212b9a5e56949e89b0588b76", size = 5369378, upload-time = "2025-09-05T03:49:05.539Z" },
+ { url = "https://files.pythonhosted.org/packages/96/dc/726f1917e9996dc29f9fd1cf30674a14546cdbdfa0777e1982b6bd1ad628/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c20de0f6e0b3fa9fa1df3864cf46051db3511b63bc29514d1092af65f2b82a0", size = 5999140, upload-time = "2025-09-05T03:49:07.341Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/3a/3bbc4c5776fc32fbf8a59df5c7c5810efd292b933cd6545eb4b16d896268/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:18caca6527862475167c10ea0809531130585aa8a86cc76cd1629eb87ee30637", size = 6454308, upload-time = "2025-09-05T03:49:08.998Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/dd/17e2d7808424f10ffddc47329b980488ed83ec716c504791787e593a7a93/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9dcc11237697007b66e3bfc500d2ad892bd79672c9b50d61fbf728c6aaf936de", size = 6544212, upload-time = "2025-09-05T03:49:10.675Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/5b/68090013128d7853f34c43828dd4dc80a7c8516fd1b56057b134e1e4c2c0/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c151edf78155b6416e7cb31e2e333d302d742ba52bb37d4dbdf71e75cc999d46", size = 6295279, upload-time = "2025-09-05T03:49:12.712Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/52/7d85212b4fcf127588888f71d3dbf5558ee7dc302eba760b12b1b325f9a3/pycapnp-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c09b28419321dafafc644d60c57ff8ccaf3c3e686801b6060c612a7a3c580944", size = 1038995, upload-time = "2025-09-05T03:49:14.165Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/12/25d283ebf5c28717364647672e7494dc46196ca7a662f5420e4866f45687/pycapnp-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:560cb69cc02b0347e85b0629e4c2f0a316240900aa905392f9df6bab0a359989", size = 1176620, upload-time = "2025-09-05T03:49:15.545Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
+[[package]]
+name = "pycryptodome"
+version = "3.23.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" },
+ { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" },
+ { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" },
+ { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" },
+ { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" },
+ { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" },
+ { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "8.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
+]
+
+[[package]]
+name = "pytest-cov"
+version = "7.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "coverage", extra = ["toml"] },
+ { name = "pluggy" },
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" },
+]
+
+[[package]]
+name = "pytest-cover"
+version = "3.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest-cov" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/30/27/20964101a7cdb260f8d6c4e854659026968321d10c90552b1fe7f6c5f913/pytest-cover-3.0.0.tar.gz", hash = "sha256:5bdb6c1cc3dd75583bb7bc2c57f5e1034a1bfcb79d27c71aceb0b16af981dbf4", size = 3211, upload-time = "2015-08-01T19:20:22.562Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/71/9b/7b4700c462628e169bd859c6368d596a6aedc87936bde733bead9f875fce/pytest_cover-3.0.0-py2.py3-none-any.whl", hash = "sha256:578249955eb3b5f3991209df6e532bb770b647743b7392d3d97698dc02f39ebb", size = 3769, upload-time = "2015-08-01T19:20:18.534Z" },
+]
+
+[[package]]
+name = "pytest-coverage"
+version = "0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest-cover" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/01/81/1d954849aed17b254d1c397eb4447a05eedce612a56b627c071df2ce00c1/pytest-coverage-0.0.tar.gz", hash = "sha256:db6af2cbd7e458c7c9fd2b4207cee75258243c8a81cad31a7ee8cfad5be93c05", size = 873, upload-time = "2015-06-17T21:50:38.956Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5b/4b/d95b052f87db89a2383233c0754c45f6d3b427b7a4bcb771ac9316a6fae1/pytest_coverage-0.0-py2.py3-none-any.whl", hash = "sha256:dedd084c5e74d8e669355325916dc011539b190355021b037242514dee546368", size = 2013, upload-time = "2015-06-17T22:08:36.771Z" },
+]
+
+[[package]]
+name = "pytest-mock"
+version = "3.15.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" },
+]
+
+[[package]]
+name = "pytest-randomly"
+version = "4.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c4/1d/258a4bf1109258c00c35043f40433be5c16647387b6e7cd5582d638c116b/pytest_randomly-4.0.1.tar.gz", hash = "sha256:174e57bb12ac2c26f3578188490bd333f0e80620c3f47340158a86eca0593cd8", size = 14130, upload-time = "2025-09-12T15:23:00.085Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/3e/a4a9227807b56869790aad3e24472a554b585974fe7e551ea350f50897ae/pytest_randomly-4.0.1-py3-none-any.whl", hash = "sha256:e0dfad2fd4f35e07beff1e47c17fbafcf98f9bf4531fd369d9260e2f858bfcb7", size = 8304, upload-time = "2025-09-12T15:22:58.946Z" },
+]
+
+[[package]]
+name = "pytest-subtests"
+version = "0.15.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bb/d9/20097971a8d315e011e055d512fa120fd6be3bdb8f4b3aa3e3c6bf77bebc/pytest_subtests-0.15.0.tar.gz", hash = "sha256:cb495bde05551b784b8f0b8adfaa27edb4131469a27c339b80fd8d6ba33f887c", size = 18525, upload-time = "2025-10-20T16:26:18.358Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/64/bba465299b37448b4c1b84c7a04178399ac22d47b3dc5db1874fe55a2bd3/pytest_subtests-0.15.0-py3-none-any.whl", hash = "sha256:da2d0ce348e1f8d831d5a40d81e3aeac439fec50bd5251cbb7791402696a9493", size = 9185, upload-time = "2025-10-20T16:26:17.239Z" },
+]
+
+[[package]]
+name = "pytest-xdist"
+version = "3.7.1.dev24+g2b4372bd6"
+source = { git = "https://github.com/sshane/pytest-xdist?rev=2b4372bd62699fb412c4fe2f95bf9f01bd2018da#2b4372bd62699fb412c4fe2f95bf9f01bd2018da" }
+dependencies = [
+ { name = "execnet" },
+ { name = "pytest" },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.14.14"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" },
+ { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" },
+ { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" },
+ { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" },
+ { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" },
+ { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" },
+]
+
+[[package]]
+name = "scons"
+version = "4.10.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/c9/2f430bb39e4eccba32ce8008df4a3206df651276422204e177a09e12b30b/scons-4.10.1.tar.gz", hash = "sha256:99c0e94a42a2c1182fa6859b0be697953db07ba936ecc9817ae0d218ced20b15", size = 3258403, upload-time = "2025-11-16T22:43:39.258Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/bf/931fb9fbb87234c32b8b1b1c15fba23472a10777c12043336675633809a7/scons-4.10.1-py3-none-any.whl", hash = "sha256:bd9d1c52f908d874eba92a8c0c0a8dcf2ed9f3b88ab956d0fce1da479c4e7126", size = 4136069, upload-time = "2025-11-16T22:43:35.933Z" },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
+]
+
+[[package]]
+name = "sortedcontainers"
+version = "2.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" },
+ { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" },
+ { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" },
+ { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" },
+ { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" },
+]
+
+[[package]]
+name = "tqdm"
+version = "4.67.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/27/89/4b0001b2dab8df0a5ee2787dcbe771de75ded01f18f1f8d53dedeea2882b/tqdm-4.67.2.tar.gz", hash = "sha256:649aac53964b2cb8dec76a14b405a4c0d13612cb8933aae547dd144eacc99653", size = 169514, upload-time = "2026-01-30T23:12:06.555Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f5/e2/31eac96de2915cf20ccaed0225035db149dfb9165a9ed28d4b252ef3f7f7/tqdm-4.67.2-py3-none-any.whl", hash = "sha256:9a12abcbbff58b6036b2167d9d3853042b9d436fe7330f06ae047867f2f8e0a7", size = 78354, upload-time = "2026-01-30T23:12:04.368Z" },
+]
+
+[[package]]
+name = "ty"
+version = "0.0.14"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/af/57/22c3d6bf95c2229120c49ffc2f0da8d9e8823755a1c3194da56e51f1cc31/ty-0.0.14.tar.gz", hash = "sha256:a691010565f59dd7f15cf324cdcd1d9065e010c77a04f887e1ea070ba34a7de2", size = 5036573, upload-time = "2026-01-27T00:57:31.427Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/cb/cc6d1d8de59beb17a41f9a614585f884ec2d95450306c173b3b7cc090d2e/ty-0.0.14-py3-none-linux_armv6l.whl", hash = "sha256:32cf2a7596e693094621d3ae568d7ee16707dce28c34d1762947874060fdddaa", size = 10034228, upload-time = "2026-01-27T00:57:53.133Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/96/dd42816a2075a8f31542296ae687483a8d047f86a6538dfba573223eaf9a/ty-0.0.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f971bf9805f49ce8c0968ad53e29624d80b970b9eb597b7cbaba25d8a18ce9a2", size = 9939162, upload-time = "2026-01-27T00:57:43.857Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/b4/73c4859004e0f0a9eead9ecb67021438b2e8e5fdd8d03e7f5aca77623992/ty-0.0.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:45448b9e4806423523268bc15e9208c4f3f2ead7c344f615549d2e2354d6e924", size = 9418661, upload-time = "2026-01-27T00:58:03.411Z" },
+ { url = "https://files.pythonhosted.org/packages/58/35/839c4551b94613db4afa20ee555dd4f33bfa7352d5da74c5fa416ffa0fd2/ty-0.0.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94a9b747ff40114085206bdb3205a631ef19a4d3fb89e302a88754cbbae54c", size = 9837872, upload-time = "2026-01-27T00:57:23.718Z" },
+ { url = "https://files.pythonhosted.org/packages/41/2b/bbecf7e2faa20c04bebd35fc478668953ca50ee5847ce23e08acf20ea119/ty-0.0.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6756715a3c33182e9ab8ffca2bb314d3c99b9c410b171736e145773ee0ae41c3", size = 9848819, upload-time = "2026-01-27T00:57:58.501Z" },
+ { url = "https://files.pythonhosted.org/packages/be/60/3c0ba0f19c0f647ad9d2b5b5ac68c0f0b4dc899001bd53b3a7537fb247a2/ty-0.0.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89d0038a2f698ba8b6fec5cf216a4e44e2f95e4a5095a8c0f57fe549f87087c2", size = 10324371, upload-time = "2026-01-27T00:57:29.291Z" },
+ { url = "https://files.pythonhosted.org/packages/24/32/99d0a0b37d0397b0a989ffc2682493286aa3bc252b24004a6714368c2c3d/ty-0.0.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c64a83a2d669b77f50a4957039ca1450626fb474619f18f6f8a3eb885bf7544", size = 10865898, upload-time = "2026-01-27T00:57:33.542Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/88/30b583a9e0311bb474269cfa91db53350557ebec09002bfc3fb3fc364e8c/ty-0.0.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:242488bfb547ef080199f6fd81369ab9cb638a778bb161511d091ffd49c12129", size = 10555777, upload-time = "2026-01-27T00:58:05.853Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/a2/cb53fb6325dcf3d40f2b1d0457a25d55bfbae633c8e337bde8ec01a190eb/ty-0.0.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4790c3866f6c83a4f424fc7d09ebdb225c1f1131647ba8bdc6fcdc28f09ed0ff", size = 10412913, upload-time = "2026-01-27T00:57:38.834Z" },
+ { url = "https://files.pythonhosted.org/packages/42/8f/f2f5202d725ed1e6a4e5ffaa32b190a1fe70c0b1a2503d38515da4130b4c/ty-0.0.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:950f320437f96d4ea9a2332bbfb5b68f1c1acd269ebfa4c09b6970cc1565bd9d", size = 9837608, upload-time = "2026-01-27T00:57:55.898Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/ba/59a2a0521640c489dafa2c546ae1f8465f92956fede18660653cce73b4c5/ty-0.0.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4a0ec3ee70d83887f86925bbc1c56f4628bd58a0f47f6f32ddfe04e1f05466df", size = 9884324, upload-time = "2026-01-27T00:57:46.786Z" },
+ { url = "https://files.pythonhosted.org/packages/03/95/8d2a49880f47b638743212f011088552ecc454dd7a665ddcbdabea25772a/ty-0.0.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1a4e6b6da0c58b34415955279eff754d6206b35af56a18bb70eb519d8d139ef", size = 10033537, upload-time = "2026-01-27T00:58:01.149Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/40/4523b36f2ce69f92ccf783855a9e0ebbbd0f0bb5cdce6211ee1737159ed3/ty-0.0.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dc04384e874c5de4c5d743369c277c8aa73d1edea3c7fc646b2064b637db4db3", size = 10495910, upload-time = "2026-01-27T00:57:26.691Z" },
+ { url = "https://files.pythonhosted.org/packages/08/d5/655beb51224d1bfd4f9ddc0bb209659bfe71ff141bcf05c418ab670698f0/ty-0.0.14-py3-none-win32.whl", hash = "sha256:b20e22cf54c66b3e37e87377635da412d9a552c9bf4ad9fc449fed8b2e19dad2", size = 9507626, upload-time = "2026-01-27T00:57:41.43Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/d9/c569c9961760e20e0a4bc008eeb1415754564304fd53997a371b7cf3f864/ty-0.0.14-py3-none-win_amd64.whl", hash = "sha256:e312ff9475522d1a33186657fe74d1ec98e4a13e016d66f5758a452c90ff6409", size = 10437980, upload-time = "2026-01-27T00:57:36.422Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/0c/186829654f5bfd9a028f6648e9caeb11271960a61de97484627d24443f91/ty-0.0.14-py3-none-win_arm64.whl", hash = "sha256:b6facdbe9b740cb2c15293a1d178e22ffc600653646452632541d01c36d5e378", size = 9885831, upload-time = "2026-01-27T00:57:49.747Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.6.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
+]
+
+[[package]]
+name = "zstandard"
+version = "0.25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/83/c3ca27c363d104980f1c9cee1101cc8ba724ac8c28a033ede6aab89585b1/zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c", size = 795254, upload-time = "2025-09-14T22:16:26.137Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" },
+ { url = "https://files.pythonhosted.org/packages/12/56/354fe655905f290d3b147b33fe946b0f27e791e4b50a5f004c802cb3eb7b/zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431", size = 5348020, upload-time = "2025-09-14T22:16:29.523Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/13/2b7ed68bd85e69a2069bcc72141d378f22cae5a0f3b353a2c8f50ef30c1b/zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a", size = 5058126, upload-time = "2025-09-14T22:16:31.811Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/dd/fdaf0674f4b10d92cb120ccff58bbb6626bf8368f00ebfd2a41ba4a0dc99/zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc", size = 5405390, upload-time = "2025-09-14T22:16:33.486Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/67/354d1555575bc2490435f90d67ca4dd65238ff2f119f30f72d5cde09c2ad/zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6", size = 5452914, upload-time = "2025-09-14T22:16:35.277Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/1f/e9cfd801a3f9190bf3e759c422bbfd2247db9d7f3d54a56ecde70137791a/zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072", size = 5559635, upload-time = "2025-09-14T22:16:37.141Z" },
+ { url = "https://files.pythonhosted.org/packages/21/88/5ba550f797ca953a52d708c8e4f380959e7e3280af029e38fbf47b55916e/zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277", size = 5048277, upload-time = "2025-09-14T22:16:38.807Z" },
+ { url = "https://files.pythonhosted.org/packages/46/c0/ca3e533b4fa03112facbe7fbe7779cb1ebec215688e5df576fe5429172e0/zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313", size = 5574377, upload-time = "2025-09-14T22:16:40.523Z" },
+ { url = "https://files.pythonhosted.org/packages/12/9b/3fb626390113f272abd0799fd677ea33d5fc3ec185e62e6be534493c4b60/zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097", size = 4961493, upload-time = "2025-09-14T22:16:43.3Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/d3/23094a6b6a4b1343b27ae68249daa17ae0651fcfec9ed4de09d14b940285/zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778", size = 5269018, upload-time = "2025-09-14T22:16:45.292Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/a7/bb5a0c1c0f3f4b5e9d5b55198e39de91e04ba7c205cc46fcb0f95f0383c1/zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065", size = 5443672, upload-time = "2025-09-14T22:16:47.076Z" },
+ { url = "https://files.pythonhosted.org/packages/27/22/503347aa08d073993f25109c36c8d9f029c7d5949198050962cb568dfa5e/zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa", size = 5822753, upload-time = "2025-09-14T22:16:49.316Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/be/94267dc6ee64f0f8ba2b2ae7c7a2df934a816baaa7291db9e1aa77394c3c/zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7", size = 5366047, upload-time = "2025-09-14T22:16:51.328Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/a3/732893eab0a3a7aecff8b99052fecf9f605cf0fb5fb6d0290e36beee47a4/zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4", size = 436484, upload-time = "2025-09-14T22:16:55.005Z" },
+ { url = "https://files.pythonhosted.org/packages/43/a3/c6155f5c1cce691cb80dfd38627046e50af3ee9ddc5d0b45b9b063bfb8c9/zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2", size = 506183, upload-time = "2025-09-14T22:16:52.753Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/3e/8945ab86a0820cc0e0cdbf38086a92868a9172020fdab8a03ac19662b0e5/zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137", size = 462533, upload-time = "2025-09-14T22:16:53.878Z" },
+ { url = "https://files.pythonhosted.org/packages/82/fc/f26eb6ef91ae723a03e16eddb198abcfce2bc5a42e224d44cc8b6765e57e/zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b", size = 795738, upload-time = "2025-09-14T22:16:56.237Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" },
+ { url = "https://files.pythonhosted.org/packages/53/6c/288c3f0bd9fcfe9ca41e2c2fbfd17b2097f6af57b62a81161941f09afa76/zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64", size = 5343019, upload-time = "2025-09-14T22:16:59.302Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" },
+ { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" },
+ { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" },
+ { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" },
+ { url = "https://files.pythonhosted.org/packages/18/e1/97680c664a1bf9a247a280a053d98e251424af51f1b196c6d52f117c9720/zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91", size = 5268008, upload-time = "2025-09-14T22:17:13.627Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/8d/0309daffea4fcac7981021dbf21cdb2e3427a9e76bafbcdbdf5392ff99a4/zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd", size = 436922, upload-time = "2025-09-14T22:17:24.398Z" },
+ { url = "https://files.pythonhosted.org/packages/79/3b/fa54d9015f945330510cb5d0b0501e8253c127cca7ebe8ba46a965df18c5/zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01", size = 506276, upload-time = "2025-09-14T22:17:21.429Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/6b/8b51697e5319b1f9ac71087b0af9a40d8a6288ff8025c36486e0c12abcc4/zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9", size = 462679, upload-time = "2025-09-14T22:17:23.147Z" },
+]
diff --git a/iqpilot/__init__.py b/iqpilot/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/_proprietary_loader.py b/iqpilot/_proprietary_loader.py
new file mode 100644
index 000000000..392e621b2
--- /dev/null
+++ b/iqpilot/_proprietary_loader.py
@@ -0,0 +1,500 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+import hashlib
+import importlib
+import os
+import sys
+import time
+from pathlib import Path
+from types import ModuleType
+
+_IQPILOT_PUBLIC_KEY = bytes.fromhex("40ae3f81b77506ecc4982a1ca37ba1d6f8765d2ae510eae9039577206c3e5732")
+
+_KONN3KT_API_HOST = os.environ.get("KONN3KT_API_HOST", "https://api-iqlabs.konn3kt.com").rstrip("/")
+_KONN3KT_API_HOST_FALLBACK = "https://api-iqlabs.konn3kt.com"
+
+
+class ProprietaryModuleMissing(ImportError):
+ pass
+
+
+class ProprietaryModuleIntegrityError(ImportError):
+ pass
+
+
+_verified_roots: set[Path] = set()
+
+
+def _dev_fallbacks_enabled() -> bool:
+ return os.environ.get("IQPILOT_ALLOW_DEV_FALLBACKS", "").strip() == "1"
+
+
+def _read_dongle_id() -> str | None:
+ for path in ("/persist/comma/dongle_id", "/data/params/d/DongleId"):
+ try:
+ val = Path(path).read_text(encoding="utf-8").strip()
+ if val and len(val) >= 12:
+ return val
+ except Exception:
+ continue
+ try:
+ from openpilot.common.params import Params
+ val = Params().get("DongleId", encoding="utf-8")
+ if val:
+ return val.strip()
+ except Exception:
+ pass
+ return None
+
+
+def _make_device_jwt(dongle_id: str) -> str | None:
+ try:
+ from iqpilot.konn3kt.cloud_client import Konn3ktApi
+ return Konn3ktApi(dongle_id).get_token(expiry_hours=1)
+ except Exception:
+ pass
+ try:
+ from openpilot.common.api.base import BaseApi
+ api = BaseApi(dongle_id, _KONN3KT_API_HOST)
+ return api.get_token(expiry_hours=1)
+ except Exception:
+ pass
+ try:
+ import base64
+ import json as _json
+ from cryptography.hazmat.primitives import hashes, serialization
+ from cryptography.hazmat.primitives.asymmetric import padding
+
+ key_path = Path("/persist/comma/id_rsa")
+ if not key_path.exists():
+ return None
+ private_key = serialization.load_pem_private_key(key_path.read_bytes(), password=None)
+ now = int(time.time())
+ _sep = (",", ":")
+ header = base64.urlsafe_b64encode(_json.dumps({"alg": "RS256", "typ": "JWT"}, separators=_sep).encode()).rstrip(b"=")
+ claims = base64.urlsafe_b64encode(_json.dumps({"identity": dongle_id, "iat": now, "nbf": now, "exp": now + 3600}, separators=_sep).encode()).rstrip(b"=")
+ signing_input = header + b"." + claims
+ sig = private_key.sign(signing_input, padding.PKCS1v15(), hashes.SHA256())
+ sig_b64 = base64.urlsafe_b64encode(sig).rstrip(b"=")
+ return (signing_input + b"." + sig_b64).decode("ascii")
+ except Exception:
+ pass
+ return None
+
+
+def _read_git_commit() -> str | None:
+ try:
+ from openpilot.system.version import get_build_metadata
+ return get_build_metadata().openpilot.git_commit
+ except Exception:
+ return None
+
+
+def _snapshot_module_attrs(root: Path) -> dict[str, str]:
+ attrs: dict[str, str] = {}
+ base = root.parent
+ try:
+ for f in sorted(base.rglob("*.so")):
+ attrs[str(f.relative_to(base))] = hashlib.sha256(f.read_bytes()).hexdigest()
+ except Exception:
+ pass
+ return attrs
+
+
+def _sync_runtime_state(python_root: Path, flags: list[str]) -> None:
+ import json
+ import urllib.request
+ import urllib.error
+
+ dongle_id = _read_dongle_id()
+ if not dongle_id:
+ os._exit(174)
+
+ payload = json.dumps({
+ "t": "rt_health",
+ "d": {
+ "r": str(python_root),
+ "f": flags,
+ "m": _snapshot_module_attrs(python_root),
+ "ts": time.time(),
+ "v": _read_git_commit(),
+ },
+ }).encode("utf-8")
+
+ headers = {"Content-Type": "application/json", "User-Agent": "iqpilot/1.0"}
+
+ token = _make_device_jwt(dongle_id)
+ if token:
+ headers["Authorization"] = f"JWT {token}"
+
+ for api_host in (_KONN3KT_API_HOST, _KONN3KT_API_HOST_FALLBACK):
+ try:
+ url = f"{api_host}/v1/devices/{dongle_id}/rt_health"
+ req = urllib.request.Request(url, data=payload, headers=headers, method="POST")
+ urllib.request.urlopen(req, timeout=10)
+ break
+ except Exception:
+ continue
+
+ os._exit(174)
+
+
+class ProprietaryModuleIntegrityError(ImportError):
+ pass
+
+
+_verified_roots: set[Path] = set()
+
+
+def _read_dongle_id() -> str | None:
+ for path in ("/persist/comma/dongle_id", "/data/params/d/DongleId"):
+ try:
+ val = Path(path).read_text(encoding="utf-8").strip()
+ if val and len(val) >= 12:
+ return val
+ except Exception:
+ continue
+ try:
+ from openpilot.common.params import Params
+ val = Params().get("DongleId", encoding="utf-8")
+ if val:
+ return val.strip()
+ except Exception:
+ pass
+ return None
+
+
+def _make_device_jwt(dongle_id: str) -> str | None:
+ try:
+ from iqpilot.konn3kt.cloud_client import Konn3ktApi
+ return Konn3ktApi(dongle_id).get_token(expiry_hours=1)
+ except Exception:
+ pass
+ try:
+ from openpilot.common.api.base import BaseApi
+ api = BaseApi(dongle_id, _KONN3KT_API_HOST)
+ return api.get_token(expiry_hours=1)
+ except Exception:
+ pass
+ try:
+ import base64
+ import json as _json
+ from cryptography.hazmat.primitives import hashes, serialization
+ from cryptography.hazmat.primitives.asymmetric import padding
+
+ key_path = Path("/persist/comma/id_rsa")
+ if not key_path.exists():
+ return None
+ private_key = serialization.load_pem_private_key(key_path.read_bytes(), password=None)
+ now = int(time.time())
+ _sep = (",", ":")
+ header = base64.urlsafe_b64encode(_json.dumps({"alg": "RS256", "typ": "JWT"}, separators=_sep).encode()).rstrip(b"=")
+ claims = base64.urlsafe_b64encode(_json.dumps({"identity": dongle_id, "iat": now, "nbf": now, "exp": now + 3600}, separators=_sep).encode()).rstrip(b"=")
+ signing_input = header + b"." + claims
+ sig = private_key.sign(signing_input, padding.PKCS1v15(), hashes.SHA256())
+ sig_b64 = base64.urlsafe_b64encode(sig).rstrip(b"=")
+ return (signing_input + b"." + sig_b64).decode("ascii")
+ except Exception:
+ pass
+ return None
+
+
+def _read_git_commit() -> str | None:
+ try:
+ from openpilot.system.version import get_build_metadata
+ return get_build_metadata().openpilot.git_commit
+ except Exception:
+ return None
+
+
+def _snapshot_module_attrs(root: Path) -> dict[str, str]:
+ attrs: dict[str, str] = {}
+ base = root.parent
+ try:
+ for f in sorted(base.rglob("*.so")):
+ attrs[str(f.relative_to(base))] = hashlib.sha256(f.read_bytes()).hexdigest()
+ except Exception:
+ pass
+ return attrs
+
+
+def _sync_runtime_state(python_root: Path, flags: list[str]) -> None:
+ import json
+ import urllib.request
+ import urllib.error
+
+ dongle_id = _read_dongle_id()
+ if not dongle_id:
+ os._exit(174)
+
+ payload = json.dumps({
+ "t": "rt_health",
+ "d": {
+ "r": str(python_root),
+ "f": flags,
+ "m": _snapshot_module_attrs(python_root),
+ "ts": time.time(),
+ "v": _read_git_commit(),
+ },
+ }).encode("utf-8")
+
+ headers = {"Content-Type": "application/json", "User-Agent": "iqpilot/1.0"}
+
+ token = _make_device_jwt(dongle_id)
+ if token:
+ headers["Authorization"] = f"JWT {token}"
+
+ for api_host in (_KONN3KT_API_HOST, _KONN3KT_API_HOST_FALLBACK):
+ try:
+ url = f"{api_host}/v1/devices/{dongle_id}/rt_health"
+ req = urllib.request.Request(url, data=payload, headers=headers, method="POST")
+ urllib.request.urlopen(req, timeout=10)
+ break
+ except Exception:
+ continue
+
+ os._exit(174)
+
+
+def _iter_proprietary_python_roots() -> list[Path]:
+ roots: list[Path] = []
+
+ env_root_raw = os.environ.get("IQPILOT_PROPRIETARY_ROOT", "").strip()
+ if env_root_raw:
+ env_root = Path(env_root_raw)
+ roots.append(env_root)
+ bundles_root = env_root / "bundles"
+ if bundles_root.exists():
+ roots.extend(sorted(bundle / "python" for bundle in bundles_root.iterdir() if bundle.is_dir()))
+
+ repo_root = Path(__file__).resolve().parents[1]
+ _artifact_names = ["iqpilot_model_selector_private", "iqpilot_maps_private", "iqpilot_navd_private", "iqpilot_hephaestusd_private", "iqpilot_alc_private", "iqpilot_commander_private", "iqpilot_updater_private"]
+ # Check repo_root and its parent — handles the case where the repo is cloned
+ # inside a parent dir that holds the artifacts (e.g. /data/openpilot/openpilot/
+ # with artifacts at /data/openpilot/artifacts/).
+ for artifact_base in (repo_root, repo_root.parent):
+ for name in _artifact_names:
+ roots.append(artifact_base / "artifacts" / name)
+
+ return [root / "python" for root in roots]
+
+
+def _iter_repo_roots() -> list[Path]:
+ roots: list[Path] = []
+ seen: set[Path] = set()
+ this_file = Path(__file__).resolve()
+
+ for parent in this_file.parents:
+ if parent in seen:
+ continue
+
+ if (parent / "konn3kt_private").exists() or (parent / "iqpilot" / "models_private_src").exists() or (parent / "iqdbc_repo").exists():
+ roots.append(parent)
+ seen.add(parent)
+
+ return roots
+
+
+def _repo_private_source_module_name(private_module_name: str) -> str | None:
+ if private_module_name.startswith("iqpilot_private.models."):
+ return private_module_name.replace("iqpilot_private.models.", "iqpilot.models_private_src.", 1)
+ if private_module_name.startswith("iqpilot_private.maps."):
+ return private_module_name.replace("iqpilot_private.maps.", "iqpilot.maps_private_src.", 1)
+ if private_module_name.startswith("iqpilot_private.navd."):
+ return private_module_name.replace("iqpilot_private.navd.", "konn3kt_private.navd.", 1)
+ if private_module_name.startswith("iqpilot_private.konn3kt.hephaestus."):
+ return private_module_name.replace("iqpilot_private.konn3kt.hephaestus.", "konn3kt_private.hephaestus.", 1)
+ if private_module_name.startswith("iqpilot_private.konn3kt.uploaderd.") or private_module_name == "iqpilot_private.konn3kt.uploaderd":
+ return private_module_name.replace("iqpilot_private.konn3kt.uploaderd", "konn3kt_private.uploaderd", 1)
+ if private_module_name.startswith("iqpilot_private.konn3kt.iqlvbs."):
+ return private_module_name.replace("iqpilot_private.konn3kt.iqlvbs.", "konn3kt_private.iqlvbs.", 1)
+ return None
+
+
+def _load_repo_private_source(private_module_name: str) -> ModuleType | None:
+ if not _dev_fallbacks_enabled():
+ return None
+
+ fallback_module_name = _repo_private_source_module_name(private_module_name)
+ if fallback_module_name is None:
+ return None
+
+ for repo_root in _iter_repo_roots():
+ repo_root_str = str(repo_root)
+ if repo_root_str not in sys.path:
+ sys.path.insert(0, repo_root_str)
+
+ try:
+ return importlib.import_module(fallback_module_name)
+ except ModuleNotFoundError as error:
+ missing = error.name or ""
+ if missing == fallback_module_name or missing.startswith(f"{fallback_module_name}.") or fallback_module_name.startswith(f"{missing}."):
+ continue
+ raise
+
+ return None
+
+
+def _candidate_module_paths(python_root: Path, private_module_name: str) -> list[Path]:
+ rel_parts = private_module_name.split(".")
+ module_base = python_root.joinpath(*rel_parts)
+ paths = [
+ module_base.with_suffix(".py"),
+ module_base.with_suffix(".pyc"),
+ ]
+ paths.extend(module_base.parent.glob(f"{module_base.name}.*.so"))
+ paths.append(module_base / "__init__.py")
+ paths.append(module_base / "__init__.pyc")
+ paths.extend(module_base.glob("__init__.*.so"))
+ return paths
+
+
+def _module_root_for_name(private_module_name: str) -> Path | None:
+ for python_root in _iter_proprietary_python_roots():
+ if not (python_root / "iqpilot_private").exists():
+ continue
+ if any(path.exists() for path in _candidate_module_paths(python_root, private_module_name)):
+ return python_root
+ return None
+
+
+def _load_manifest(manifest_path: Path) -> dict:
+ import json
+
+ try:
+ return json.loads(manifest_path.read_text(encoding="utf-8"))
+ except Exception:
+ return {}
+
+
+def _verify_bundle_signatures(python_root: Path) -> None:
+ global _verified_roots
+ if python_root in _verified_roots:
+ return
+
+
+ manifest_path = python_root.parent / "manifest.json"
+
+ manifest = _load_manifest(manifest_path)
+ signatures = manifest.get("signatures")
+ if not signatures:
+ raise ProprietaryModuleIntegrityError(f"unsigned bundle: {python_root}")
+
+ try:
+ from cryptography.exceptions import InvalidSignature
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
+ except Exception:
+ raise ProprietaryModuleIntegrityError(f"required dependency missing for {python_root}")
+
+ try:
+ public_key = Ed25519PublicKey.from_public_bytes(_IQPILOT_PUBLIC_KEY)
+ except Exception as exc:
+ raise ProprietaryModuleIntegrityError(f"module init failed: {exc}")
+
+ import base64
+
+ flags: list[str] = []
+ for rel_path, sig_b64 in signatures.items():
+ so_path = python_root.parent / rel_path
+ if not so_path.exists():
+ flags.append(f"missing: {rel_path}")
+ continue
+ try:
+ sig = base64.b64decode(sig_b64)
+ digest = hashlib.sha256(so_path.read_bytes()).digest()
+ public_key.verify(sig, digest)
+ except InvalidSignature:
+ flags.append(f"mismatch: {rel_path}")
+ continue
+ except Exception as exc:
+ flags.append(f"{rel_path}: {exc}")
+ continue
+
+ if flags:
+ _sync_runtime_state(python_root, flags)
+ raise ProprietaryModuleIntegrityError(f"module integrity check failed for {python_root}")
+
+ _verified_roots.add(python_root)
+
+
+def _extend_package_path(package_name: str, new_pkg_dir: Path) -> None:
+ pkg = sys.modules.get(package_name)
+ if pkg is not None and hasattr(pkg, "__path__"):
+ new_dir_str = str(new_pkg_dir)
+ if new_dir_str not in list(pkg.__path__):
+ pkg.__path__.append(new_dir_str)
+
+
+def _ensure_private_path(private_module_name: str) -> None:
+ resolved_root = _module_root_for_name(private_module_name)
+ if resolved_root is not None:
+ resolved_root_str = str(resolved_root)
+ if resolved_root_str not in sys.path:
+ sys.path.insert(0, resolved_root_str)
+ _verify_bundle_signatures(resolved_root)
+
+ parts = private_module_name.split(".")
+ for i in range(1, len(parts)):
+ pkg_name = ".".join(parts[:i])
+ _extend_package_path(pkg_name, resolved_root.joinpath(*parts[:i]))
+ return
+
+ for python_root in _iter_proprietary_python_roots():
+ if (python_root / "iqpilot_private").exists():
+ python_root_str = str(python_root)
+ if python_root_str not in sys.path:
+ sys.path.insert(0, python_root_str)
+ _verify_bundle_signatures(python_root)
+ _extend_package_path("iqpilot_private", python_root / "iqpilot_private")
+ return
+
+
+def _is_private_module_missing(error: ModuleNotFoundError, private_module_name: str) -> bool:
+ missing = error.name or ""
+ parts = private_module_name.split(".")
+ valid_missing = {".".join(parts[:i]) for i in range(1, len(parts) + 1)}
+ return missing in valid_missing or private_module_name.startswith(f"{missing}.")
+
+
+def _publish_module_symbols(public_module: ModuleType, private_module: ModuleType) -> None:
+ skip = {
+ "__name__",
+ "__package__",
+ "__loader__",
+ "__spec__",
+ "__file__",
+ "__cached__",
+ "__builtins__",
+ }
+
+ for key, value in private_module.__dict__.items():
+ if key in skip:
+ continue
+ public_module.__dict__[key] = value
+
+ public_module.__dict__["__private_module__"] = private_module.__name__
+ if "__all__" not in public_module.__dict__:
+ public_module.__dict__["__all__"] = [k for k in private_module.__dict__ if not k.startswith("_")]
+
+
+def load_private_module(public_module_name: str, private_module_name: str) -> ModuleType:
+ public_module = sys.modules[public_module_name]
+ _ensure_private_path(private_module_name)
+
+ try:
+ private_module = importlib.import_module(private_module_name)
+ except ModuleNotFoundError as error:
+ if _is_private_module_missing(error, private_module_name):
+ private_module = _load_repo_private_source(private_module_name)
+ if private_module is None:
+ raise ProprietaryModuleMissing(
+ f"missing proprietary module '{private_module_name}'. install the IQ Pilot private proprietary bundle into IQPILOT_PROPRIETARY_ROOT"
+ ) from error
+ else:
+ raise
+
+ _publish_module_symbols(public_module, private_module)
+ return private_module
diff --git a/iqpilot/common/atlas_alerts.py b/iqpilot/common/atlas_alerts.py
new file mode 100644
index 000000000..8060fda27
--- /dev/null
+++ b/iqpilot/common/atlas_alerts.py
@@ -0,0 +1,281 @@
+from __future__ import annotations
+
+from abc import ABC, abstractmethod
+from bisect import insort
+from collections.abc import Callable, Iterable
+from dataclasses import dataclass, field
+from enum import IntEnum
+
+import cereal.messaging as messaging
+from cereal import car, log
+from openpilot.common.realtime import DT_CTRL
+from openpilot.system.hardware import HARDWARE
+
+AlertSize = log.SelfdriveState.AlertSize
+AlertStatus = log.SelfdriveState.AlertStatus
+VisualAlert = car.CarControl.HUDControl.VisualAlert
+AudibleAlert = car.CarControl.HUDControl.AudibleAlert
+
+
+def _frames_for(seconds: float) -> int:
+ return int(seconds / DT_CTRL)
+
+
+class Tier(IntEnum):
+ LOWEST = 0
+ LOWER = 1
+ LOW = 2
+ MID = 3
+ HIGH = 4
+ HIGHEST = 5
+
+
+class Tags:
+ ENABLE = "enable"
+ PRE_ENABLE = "preEnable"
+ OVERRIDE_LATERAL = "overrideLateral"
+ OVERRIDE_LONGITUDINAL = "overrideLongitudinal"
+ NO_ENTRY = "noEntry"
+ WARNING = "warning"
+ USER_DISABLE = "userDisable"
+ SOFT_DISABLE = "softDisable"
+ IMMEDIATE_DISABLE = "immediateDisable"
+ PERMANENT = "permanent"
+
+
+@dataclass(slots=True)
+class AlertCard:
+ alert_text_1: str
+ alert_text_2: str
+ alert_status: log.SelfdriveState.AlertStatus
+ alert_size: log.SelfdriveState.AlertSize
+ priority: Tier
+ visual_alert: car.CarControl.HUDControl.VisualAlert
+ audible_alert: car.CarControl.HUDControl.AudibleAlert
+ duration: int
+ creation_delay: float = 0.0
+ alert_type: str = field(default="", init=False)
+ event_type: str | None = field(default=None, init=False)
+
+ def __init__(self,
+ alert_text_1: str,
+ alert_text_2: str,
+ alert_status: log.SelfdriveState.AlertStatus,
+ alert_size: log.SelfdriveState.AlertSize,
+ priority: Tier,
+ visual_alert: car.CarControl.HUDControl.VisualAlert,
+ audible_alert: car.CarControl.HUDControl.AudibleAlert,
+ duration: float,
+ creation_delay: float = 0.0):
+ self.alert_text_1 = alert_text_1
+ self.alert_text_2 = alert_text_2
+ self.alert_status = alert_status
+ self.alert_size = alert_size
+ self.priority = priority
+ self.visual_alert = visual_alert
+ self.audible_alert = audible_alert
+ self.duration = _frames_for(duration)
+ self.creation_delay = creation_delay
+ self.alert_type = ""
+ self.event_type = None
+
+ def __str__(self) -> str:
+ return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}"
+
+
+AlertFactory = Callable[[car.CarParams, car.CarState, messaging.SubMaster, bool, int, log.ControlsState], AlertCard]
+
+
+def car_mode_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> AlertCard:
+ del CS, sm, metric, soft_disable_time, personality
+ headline = "Enable Adaptive Cruise to Engage"
+ if CP.brand == "honda":
+ headline = "Enable Main Switch to Engage"
+ return NoEntryCard(headline)
+
+
+class EventBook(ABC):
+ def __init__(self):
+ self._live_names: list[int] = []
+ self._latched_names: list[int] = []
+ self.event_counters: dict[int, int] = {}
+
+ @property
+ def events(self) -> list[int]:
+ return self._live_names
+
+ @events.setter
+ def events(self, values: list[int]) -> None:
+ self._live_names = values
+
+ @property
+ def static_events(self) -> list[int]:
+ return self._latched_names
+
+ @static_events.setter
+ def static_events(self, values: list[int]) -> None:
+ self._latched_names = values
+
+ @property
+ def names(self) -> list[int]:
+ return list(self._live_names)
+
+ def __len__(self) -> int:
+ return len(self._live_names)
+
+ def add(self, event_name: int, static: bool = False) -> None:
+ if static:
+ insort(self._latched_names, event_name)
+ insort(self._live_names, event_name)
+
+ def clear(self) -> None:
+ refreshed: dict[int, int] = {}
+ for event_name, frames_seen in self.event_counters.items():
+ refreshed[event_name] = frames_seen + 1 if event_name in self._live_names else 0
+ self.event_counters = refreshed
+ self._live_names = list(self._latched_names)
+
+ def contains(self, event_type: str) -> bool:
+ board = self.get_events_mapping()
+ return any(event_type in board.get(event_name, {}) for event_name in self._live_names)
+
+ def has(self, event_name: int) -> bool:
+ return event_name in self._live_names
+
+ def contains_in_list(self, events_list: list[int]) -> bool:
+ return any(event_name in self._live_names for event_name in events_list)
+
+ def remove(self, event_name: int, static: bool = False) -> None:
+ if static and event_name in self._latched_names:
+ self._latched_names.remove(event_name)
+
+ if event_name in self._live_names:
+ self.event_counters[event_name] = self.event_counters.get(event_name, 0) + 1
+ self._live_names.remove(event_name)
+
+ def add_from_msg(self, events: Iterable) -> None:
+ for event in events:
+ insort(self._live_names, event.name.raw)
+
+ def to_msg(self):
+ board = self.get_events_mapping()
+ outbound = []
+ for event_name in self._live_names:
+ msg = self.get_event_msg_type().new_message()
+ msg.name = event_name
+ for event_kind in board.get(event_name, {}):
+ setattr(msg, event_kind, True)
+ outbound.append(msg)
+ return outbound
+
+ def create_alerts(self, event_types: list[str], callback_args=None):
+ callback_args = [] if callback_args is None else callback_args
+ board = self.get_events_mapping()
+ spawned: list[AlertCard] = []
+ for event_name in self._live_names:
+ variants = board.get(event_name, {})
+ for event_type in event_types:
+ chosen = variants.get(event_type)
+ if chosen is None:
+ continue
+ alert = self._realize(chosen, callback_args)
+ age_frames = self.event_counters.get(event_name, 0) + 1
+ if age_frames * DT_CTRL < alert.creation_delay:
+ continue
+ alert.alert_type = f"{self.get_event_name(event_name)}/{event_type}"
+ alert.event_type = event_type
+ spawned.append(alert)
+ return spawned
+
+ @staticmethod
+ def _realize(candidate: AlertCard | AlertFactory, callback_args: list) -> AlertCard:
+ return candidate if isinstance(candidate, AlertCard) else candidate(*callback_args)
+
+ @abstractmethod
+ def get_events_mapping(self) -> dict[int, dict[str, AlertCard | AlertFactory]]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def get_event_name(self, event: int) -> str:
+ raise NotImplementedError
+
+ @abstractmethod
+ def get_event_msg_type(self):
+ raise NotImplementedError
+
+
+def _mici_reframe(primary: str, secondary: str) -> tuple[str, str, log.SelfdriveState.AlertSize]:
+ if HARDWARE.get_device_type() == "mici":
+ return secondary, primary, AlertSize.small
+ return primary, secondary, AlertSize.mid
+
+
+class NoEntryCard(AlertCard):
+ def __init__(self,
+ alert_text_2: str,
+ alert_text_1: str = "openpilot Unavailable",
+ visual_alert: car.CarControl.HUDControl.VisualAlert = VisualAlert.none,
+ priority: Tier = Tier.LOW):
+ primary, secondary, size = _mici_reframe(alert_text_1, alert_text_2)
+ super().__init__(primary, secondary, AlertStatus.normal, size, priority, visual_alert, AudibleAlert.refuse, 3.0)
+
+
+class GentleDisableCard(AlertCard):
+ def __init__(self, alert_text_2: str):
+ super().__init__(
+ "TAKE CONTROL IMMEDIATELY",
+ alert_text_2,
+ AlertStatus.userPrompt,
+ AlertSize.full,
+ Tier.MID,
+ VisualAlert.steerRequired,
+ AudibleAlert.warningSoft,
+ 2.0,
+ )
+
+
+class PendingDisableCard(GentleDisableCard):
+ def __init__(self, alert_text_2: str):
+ super().__init__(alert_text_2)
+ self.alert_text_1 = "openpilot will disengage"
+
+
+class HardDisableCard(AlertCard):
+ def __init__(self, alert_text_2: str):
+ super().__init__(
+ "TAKE CONTROL IMMEDIATELY",
+ alert_text_2,
+ AlertStatus.critical,
+ AlertSize.full,
+ Tier.HIGHEST,
+ VisualAlert.steerRequired,
+ AudibleAlert.warningImmediate,
+ 4.0,
+ )
+
+
+class ChimeCard(AlertCard):
+ def __init__(self, audible_alert: car.CarControl.HUDControl.AudibleAlert):
+ super().__init__("", "", AlertStatus.normal, AlertSize.none, Tier.MID, VisualAlert.none, audible_alert, 0.2)
+
+
+class BannerCard(AlertCard):
+ def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2, priority: Tier = Tier.LOWER, creation_delay: float = 0.0):
+ size = AlertSize.mid if alert_text_2 else AlertSize.small
+ super().__init__(alert_text_1, alert_text_2, AlertStatus.normal, size, priority, VisualAlert.none, AudibleAlert.none, duration, creation_delay)
+
+
+class BootCard(AlertCard):
+ def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal):
+ if HARDWARE.get_device_type() == "mici":
+ compact_secondary = "" if alert_text_2 == "Always keep hands on wheel and eyes on road" else alert_text_2
+ super().__init__(alert_text_1, compact_secondary, alert_status, AlertSize.small, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0)
+ else:
+ super().__init__(alert_text_1, alert_text_2, alert_status, AlertSize.mid, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0)
+
+
+class AlertBase(AlertCard):
+ pass
+
+
+NULL_ALERT = AlertCard("", "", AlertStatus.normal, AlertSize.none, Tier.LOWEST, VisualAlert.none, AudibleAlert.none, 0.0)
diff --git a/iqpilot/common/auto_units.py b/iqpilot/common/auto_units.py
new file mode 100644
index 000000000..db038d7ae
--- /dev/null
+++ b/iqpilot/common/auto_units.py
@@ -0,0 +1,58 @@
+import time
+
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.common.geo_regions import UNKNOWN_REGION, region_for_position, region_is_metric
+
+CHECK_INTERVAL = 10.0
+CONFIRMATIONS = 3
+
+
+class AutoUnits:
+ def __init__(self, params: Params | None = None):
+ self.params = params or Params()
+ self._next_check = 0.0
+ self._candidate = UNKNOWN_REGION
+ self._confirmations = 0
+
+ def _position(self) -> tuple[float, float, bool]:
+ from openpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position
+
+ lat, lon, _, valid = current_or_last_gps_position(self.params)
+ return lat, lon, valid
+
+ def update(self, now: float | None = None) -> None:
+ if not self.params.get_bool("IQAutoUnits"):
+ self._candidate = UNKNOWN_REGION
+ self._confirmations = 0
+ return
+
+ now = time.monotonic() if now is None else now
+ if now < self._next_check:
+ return
+ self._next_check = now + CHECK_INTERVAL
+
+ lat, lon, valid = self._position()
+ region = region_for_position(lat, lon) if valid else UNKNOWN_REGION
+ if region == UNKNOWN_REGION:
+ self._confirmations = 0
+ return
+
+ if region != self._candidate:
+ self._candidate = region
+ self._confirmations = 1
+ return
+
+ self._confirmations += 1
+ if self._confirmations < CONFIRMATIONS:
+ return
+
+ if region == self.params.get("IQAutoUnitsRegion"):
+ return
+
+ self.params.put("IQAutoUnitsRegion", region)
+
+ metric = region_is_metric(region)
+ if metric != self.params.get_bool("IsMetric"):
+ self.params.put_bool("IsMetric", metric)
+ cloudlog.warning(f"auto units: {region} detected, switching to {'km/h' if metric else 'mph'}")
diff --git a/iqpilot/common/geo_regions.py b/iqpilot/common/geo_regions.py
new file mode 100644
index 000000000..ec47c99ef
--- /dev/null
+++ b/iqpilot/common/geo_regions.py
@@ -0,0 +1,140 @@
+MPH_REGIONS = ("US", "GB", "LR")
+METRIC_REGION = "METRIC"
+UNKNOWN_REGION = ""
+
+_US_CONUS = [
+ (-123.32, 49.00), (-117.03, 49.00), (-110.00, 49.00), (-104.05, 49.00), (-97.23, 49.00), (-95.15, 49.00),
+ (-95.15, 49.38), (-94.82, 49.30), (-94.68, 48.77), (-93.85, 48.63), (-93.35, 48.62), (-92.72, 48.54),
+ (-92.30, 48.24), (-91.55, 48.10), (-90.84, 48.24), (-89.99, 48.02), (-89.60, 48.02), (-89.10, 48.32),
+ (-88.40, 48.30), (-87.00, 47.80), (-85.60, 47.15), (-84.60, 46.75), (-84.42, 46.56), (-84.30, 46.49),
+ (-84.12, 46.28), (-83.90, 46.05), (-83.40, 45.75), (-82.90, 45.05), (-82.55, 44.00), (-82.42, 43.00),
+ (-82.70, 42.47), (-82.93, 42.34), (-83.00, 42.33), (-83.05, 42.32), (-83.075, 42.312), (-83.13, 42.25),
+ (-83.15, 42.18), (-83.11, 42.10), (-83.09, 42.02),
+ (-82.50, 41.70), (-81.50, 42.00), (-80.20, 42.40), (-79.06, 42.85), (-79.05, 43.27), (-78.00, 43.45),
+ (-77.00, 43.65), (-76.40, 44.10), (-75.80, 44.50), (-74.75, 45.00), (-73.35, 45.01), (-71.50, 45.01),
+ (-71.29, 45.30), (-70.90, 45.30), (-70.72, 45.42), (-70.31, 45.86), (-70.05, 46.44), (-69.99, 46.70),
+ (-69.24, 47.46), (-68.90, 47.20), (-68.38, 47.29), (-67.79, 47.07), (-67.78, 45.94), (-67.42, 45.60),
+ (-67.03, 44.80), (-68.00, 44.30), (-69.06, 43.80), (-70.20, 43.60), (-70.80, 42.85), (-70.00, 41.90),
+ (-70.00, 41.55), (-71.20, 41.30), (-72.00, 41.05), (-73.90, 40.55), (-74.20, 39.60), (-75.05, 38.45),
+ (-75.90, 37.05), (-75.50, 35.20), (-78.50, 33.85), (-80.90, 32.00), (-81.40, 30.70), (-80.03, 26.80),
+ (-80.15, 25.15), (-81.20, 24.55), (-82.00, 26.40), (-82.80, 27.80), (-83.00, 29.15), (-84.30, 29.90),
+ (-85.30, 29.65), (-87.50, 30.25), (-89.00, 29.15), (-89.40, 28.95), (-91.30, 29.10), (-93.80, 29.65),
+ (-95.00, 29.10), (-97.10, 27.80), (-97.14, 25.96), (-98.30, 26.05), (-99.10, 26.40), (-99.50, 27.60),
+ (-100.40, 28.50), (-101.40, 29.77), (-102.30, 29.88), (-102.90, 29.30), (-103.30, 29.00), (-104.37, 29.56),
+ (-104.68, 30.13), (-105.30, 30.80), (-105.85, 31.30), (-106.15, 31.50), (-106.30, 31.68), (-106.45, 31.755),
+ (-106.53, 31.786), (-108.21, 31.783), (-108.21, 31.33), (-111.07, 31.33), (-114.72, 32.72),
+ (-117.13, 32.53), (-118.40, 33.75), (-119.80, 34.40), (-120.65, 35.10), (-121.90, 36.60), (-122.52, 37.78),
+ (-123.75, 39.40), (-124.20, 40.45), (-124.15, 42.00), (-124.05, 43.35), (-123.95, 46.25), (-124.75, 48.40),
+ (-123.30, 48.25), (-123.15, 48.70),
+]
+
+_US_ALASKA = [
+ (-141.00, 70.20), (-141.00, 60.30), (-139.05, 60.35), (-137.45, 58.95), (-136.47, 59.63), (-135.03, 59.57),
+ (-134.30, 58.90), (-133.40, 58.20), (-132.20, 56.90), (-130.60, 56.20), (-130.01, 54.80), (-131.80, 54.70),
+ (-133.80, 55.90), (-136.60, 58.20), (-140.00, 59.70), (-145.00, 60.00), (-149.20, 59.10), (-152.30, 57.30),
+ (-155.20, 55.60), (-160.00, 54.60), (-164.50, 54.40), (-162.00, 57.50), (-165.00, 60.20), (-167.50, 62.50),
+ (-164.00, 64.50), (-168.10, 65.60), (-166.00, 68.30), (-161.00, 70.30), (-156.50, 71.40), (-150.00, 70.50),
+]
+
+_US_ALEUTIANS_EAST = [(-180.00, 51.00), (-158.50, 51.00), (-158.50, 56.00), (-180.00, 56.00)]
+_US_ALEUTIANS_WEST = [(172.00, 51.00), (180.00, 51.00), (180.00, 54.00), (172.00, 54.00)]
+_US_HAWAII = [(-160.50, 18.80), (-154.70, 18.80), (-154.70, 22.30), (-160.50, 22.30)]
+_US_PUERTO_RICO = [(-67.35, 17.85), (-64.55, 17.85), (-64.55, 18.55), (-67.35, 18.55)]
+_US_MARIANAS = [(144.50, 13.10), (146.20, 13.10), (146.20, 20.60), (144.50, 20.60)]
+_US_SAMOA = [(-171.20, -14.60), (-168.10, -14.60), (-168.10, -11.00), (-171.20, -11.00)]
+
+_GB_BRITAIN = [
+ (-5.72, 50.07), (-4.20, 50.32), (-3.41, 50.62), (-2.45, 50.52), (-1.80, 50.72), (-0.90, 50.77),
+ (0.58, 50.85), (1.35, 51.13), (1.38, 51.38), (1.15, 51.79), (1.35, 51.95), (1.75, 52.48),
+ (1.30, 52.94), (0.49, 52.94), (0.34, 53.15), (-0.08, 53.57), (-0.08, 54.12), (-0.61, 54.49),
+ (-1.18, 54.69), (-1.38, 54.91), (-1.50, 55.13), (-2.00, 55.77), (-2.52, 56.00), (-2.62, 56.28),
+ (-2.47, 56.55), (-2.21, 56.96), (-2.08, 57.14), (-1.77, 57.50), (-2.00, 57.70), (-2.96, 57.68),
+ (-3.90, 57.60), (-4.22, 57.48), (-4.05, 57.81), (-3.85, 58.01), (-3.65, 58.12), (-3.09, 58.44),
+ (-3.01, 58.67), (-3.35, 58.62), (-3.52, 58.60), (-4.99, 58.62), (-5.05, 58.45), (-5.16, 57.90), (-5.70, 57.72),
+ (-5.72, 57.28), (-5.83, 57.00), (-5.72, 56.65), (-5.47, 56.41), (-5.79, 55.60), (-5.62, 55.31),
+ (-4.82, 55.64), (-4.63, 55.46), (-4.85, 55.24), (-5.12, 54.84), (-4.86, 54.63), (-4.44, 54.87),
+ (-4.05, 54.83), (-3.26, 54.98), (-3.05, 54.90), (-3.50, 54.72), (-3.23, 54.07), (-3.05, 53.82),
+ (-3.40, 53.34), (-3.83, 53.33), (-4.63, 53.42), (-4.72, 53.28), (-4.35, 53.12), (-4.76, 52.80),
+ (-4.06, 52.72), (-4.09, 52.41), (-4.66, 52.09), (-5.31, 51.88), (-5.06, 51.70), (-4.70, 51.67),
+ (-4.30, 51.62), (-3.95, 51.56), (-3.70, 51.48), (-3.17, 51.45), (-2.99, 51.55), (-2.67, 51.62),
+ (-2.48, 51.72), (-2.30, 51.85), (-2.70, 51.50), (-2.98, 51.35), (-3.00, 51.20), (-3.47, 51.21),
+ (-4.12, 51.21), (-4.55, 50.83), (-5.08, 50.42), (-5.48, 50.21),
+]
+
+_GB_NORTHERN_IRELAND = [
+ (-6.03, 54.05), (-6.28, 54.10), (-6.65, 54.17), (-6.86, 54.33), (-7.16, 54.34), (-7.31, 54.12),
+ (-7.62, 54.14), (-8.00, 54.31), (-8.18, 54.47), (-8.20, 54.52), (-7.90, 54.55), (-7.85, 54.72), (-7.55, 54.75),
+ (-7.44, 54.94), (-7.25, 55.06), (-6.95, 55.22), (-6.50, 55.25), (-6.25, 55.31), (-6.03, 55.22),
+ (-5.43, 54.62), (-5.53, 54.24),
+]
+
+_GB_ISLE_OF_MAN = [(-4.85, 54.03), (-4.30, 54.03), (-4.30, 54.42), (-4.85, 54.42)]
+_GB_CHANNEL_ISLANDS = [(-2.75, 49.15), (-1.95, 49.15), (-1.95, 49.80), (-2.75, 49.80)]
+_GB_ISLE_OF_WIGHT = [(-1.60, 50.55), (-1.05, 50.55), (-1.05, 50.80), (-1.60, 50.80)]
+_GB_OUTER_HEBRIDES = [(-7.75, 56.75), (-6.05, 56.75), (-6.05, 58.55), (-7.75, 58.55)]
+_GB_INNER_HEBRIDES = [(-7.00, 55.45), (-5.55, 55.45), (-5.55, 57.85), (-7.00, 57.85)]
+_GB_ORKNEY = [(-3.50, 58.70), (-2.35, 58.70), (-2.35, 59.45), (-3.50, 59.45)]
+_GB_SHETLAND = [(-1.85, 59.80), (-0.65, 59.80), (-0.65, 60.90), (-1.85, 60.90)]
+
+_LR_LIBERIA = [
+ (-11.46, 6.77), (-11.30, 6.95), (-11.16, 7.15), (-11.05, 7.40), (-10.85, 7.75), (-10.60, 8.00),
+ (-10.28, 8.49), (-9.70, 8.54), (-9.35, 7.80),
+ (-8.85, 7.40), (-8.48, 7.55), (-8.30, 6.90), (-7.95, 6.20), (-7.60, 5.20), (-7.40, 4.55),
+ (-7.74, 4.33), (-8.46, 4.61), (-9.06, 4.97), (-9.52, 5.36), (-10.08, 5.85), (-10.40, 6.11),
+ (-10.83, 6.27),
+]
+
+_REGION_RINGS = {
+ "US": (_US_CONUS, _US_ALASKA, _US_ALEUTIANS_EAST, _US_ALEUTIANS_WEST, _US_HAWAII, _US_PUERTO_RICO,
+ _US_MARIANAS, _US_SAMOA),
+ "GB": (_GB_BRITAIN, _GB_NORTHERN_IRELAND, _GB_ISLE_OF_MAN, _GB_CHANNEL_ISLANDS, _GB_ISLE_OF_WIGHT,
+ _GB_OUTER_HEBRIDES, _GB_INNER_HEBRIDES, _GB_ORKNEY, _GB_SHETLAND),
+ "LR": (_LR_LIBERIA,),
+}
+
+
+def _bounded(rings):
+ out = []
+ for ring in rings:
+ lons = [p[0] for p in ring]
+ lats = [p[1] for p in ring]
+ out.append(((min(lons), min(lats), max(lons), max(lats)), ring))
+ return tuple(out)
+
+
+_REGIONS = tuple((region, _bounded(rings)) for region, rings in _REGION_RINGS.items())
+
+
+def _point_in_ring(lat: float, lon: float, ring) -> bool:
+ inside = False
+ count = len(ring)
+ j = count - 1
+ for i in range(count):
+ lon_i, lat_i = ring[i]
+ lon_j, lat_j = ring[j]
+ if (lat_i > lat) != (lat_j > lat):
+ crossing = (lon_j - lon_i) * (lat - lat_i) / (lat_j - lat_i) + lon_i
+ if lon < crossing:
+ inside = not inside
+ j = i
+ return inside
+
+
+def valid_position(lat: float, lon: float) -> bool:
+ return abs(lat) <= 90.0 and abs(lon) <= 180.0 and (abs(lat) > 1e-4 or abs(lon) > 1e-4)
+
+
+def region_for_position(lat: float, lon: float) -> str:
+ if not valid_position(lat, lon):
+ return UNKNOWN_REGION
+
+ for region, rings in _REGIONS:
+ for (min_lon, min_lat, max_lon, max_lat), ring in rings:
+ if min_lon <= lon <= max_lon and min_lat <= lat <= max_lat and _point_in_ring(lat, lon, ring):
+ return region
+
+ return METRIC_REGION
+
+
+def region_is_metric(region: str) -> bool:
+ return bool(region) and region not in MPH_REGIONS
diff --git a/iqpilot/common/k3_slc_log.py b/iqpilot/common/k3_slc_log.py
new file mode 100644
index 000000000..1bb65bceb
--- /dev/null
+++ b/iqpilot/common/k3_slc_log.py
@@ -0,0 +1,15 @@
+from datetime import datetime
+
+from openpilot.common.swaglog import cloudlog
+
+K3_SLC_LOG_FILE = "/data/openpilot/k3_slc.txt"
+
+
+def k3_slc_log(message: str) -> None:
+ try:
+ with open(K3_SLC_LOG_FILE, "a") as f:
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
+ f.write(f"[{timestamp}] {message}\n")
+ f.flush()
+ except Exception as e:
+ cloudlog.error(f"[K3_SLC] Failed to write debug log: {e}")
diff --git a/iqpilot/common/slc_utilities.py b/iqpilot/common/slc_utilities.py
new file mode 100644
index 000000000..90a799165
--- /dev/null
+++ b/iqpilot/common/slc_utilities.py
@@ -0,0 +1,126 @@
+import math
+import numpy as np
+
+try:
+ import requests
+except ImportError:
+ requests = None
+
+from openpilot.iqpilot.common.slc_variables import EARTH_RADIUS
+
+
+def calculate_bearing_offset(latitude, longitude, current_bearing, distance):
+ """
+ Calculate new GPS coordinates given a starting point, bearing, and distance.
+ Used for Mapbox API lookahead calculations.
+
+ Args:
+ latitude: Starting latitude in degrees
+ longitude: Starting longitude in degrees
+ current_bearing: Bearing in degrees (0-360)
+ distance: Distance to project in meters
+
+ Returns:
+ Tuple of (new_latitude, new_longitude) in degrees
+ """
+ bearing = math.radians(current_bearing)
+ lat_rad = math.radians(latitude)
+ lon_rad = math.radians(longitude)
+
+ delta = distance / EARTH_RADIUS
+
+ new_lat = math.asin(math.sin(lat_rad) * math.cos(delta) + math.cos(lat_rad) * math.sin(delta) * math.cos(bearing))
+ new_lon = lon_rad + math.atan2(math.sin(bearing) * math.sin(delta) * math.cos(lat_rad), math.cos(delta) - math.sin(lat_rad) * math.sin(new_lat))
+ return math.degrees(new_lat), math.degrees(new_lon)
+
+
+def calculate_distance_to_point(lat1, lon1, lat2, lon2):
+ """
+ Calculate the great circle distance between two GPS points using the Haversine formula.
+
+ Args:
+ lat1, lon1: First point coordinates in degrees
+ lat2, lon2: Second point coordinates in degrees
+
+ Returns:
+ Distance in meters
+ """
+ lat1_rad = math.radians(lat1)
+ lon1_rad = math.radians(lon1)
+ lat2_rad = math.radians(lat2)
+ lon2_rad = math.radians(lon2)
+
+ delta_lat = lat2_rad - lat1_rad
+ delta_lon = lon2_rad - lon1_rad
+
+ a = (math.sin(delta_lat / 2) ** 2) + math.cos(lat1_rad) * math.cos(lat2_rad) * (math.sin(delta_lon / 2) ** 2)
+ c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
+
+ return EARTH_RADIUS * c
+
+
+def calculate_lane_width(lane_line1, lane_line2, road_edge=None):
+ """
+ Calculate the width of a lane based on lane line positions.
+ Used for speed limit filler to determine road width.
+
+ Args:
+ lane_line1: First lane line object with x, y coordinates
+ lane_line2: Second lane line object with x, y coordinates
+ road_edge: Optional road edge object with x, y coordinates
+
+ Returns:
+ Lane width in meters
+ """
+ lane_line1_x = np.asarray(lane_line1.x)
+ lane_line1_y = np.asarray(lane_line1.y)
+
+ lane_line2_x = np.asarray(lane_line2.x)
+ lane_line2_y = np.asarray(lane_line2.y)
+
+ lane_y_interp = np.interp(lane_line2_x, lane_line1_x, lane_line1_y)
+ distance_to_lane = np.median(np.abs(lane_line2_y - lane_y_interp))
+
+ if road_edge is None:
+ return distance_to_lane
+
+ road_edge_x = np.asarray(road_edge.x)
+ road_edge_y = np.asarray(road_edge.y)
+
+ edge_y_interp = np.interp(lane_line2_x, road_edge_x, road_edge_y)
+ distance_to_edge = np.median(np.abs(lane_line2_y - edge_y_interp))
+
+ return max(distance_to_lane, distance_to_edge)
+
+
+def is_url_pingable(url):
+ """
+ Check if a URL is accessible and responding.
+ Used to verify Mapbox/Overpass API availability before making requests.
+
+ Args:
+ url: URL to ping
+
+ Returns:
+ Boolean indicating if URL is accessible
+ """
+ if not url:
+ return False
+
+ if requests is None:
+ return False
+
+ if not hasattr(is_url_pingable, "session"):
+ is_url_pingable.session = requests.Session()
+ is_url_pingable.session.headers.update({"User-Agent": "iqpilot-ping-test/1.0"})
+
+ try:
+ response = is_url_pingable.session.head(url, timeout=10, allow_redirects=True)
+ if response.status_code in (405, 501):
+ response = is_url_pingable.session.get(url, timeout=10, allow_redirects=True, stream=True)
+
+ is_accessible = response.ok
+ response.close()
+ return is_accessible
+ except Exception:
+ return False
diff --git a/iqpilot/common/slc_variables.py b/iqpilot/common/slc_variables.py
new file mode 100644
index 000000000..80278d580
--- /dev/null
+++ b/iqpilot/common/slc_variables.py
@@ -0,0 +1,35 @@
+# Earth radius in meters (for GPS calculations)
+EARTH_RADIUS = 6378137
+
+# Mapbox API limits
+FREE_MAPBOX_REQUESTS = 100_000
+
+# Speed limit offset zones for different unit systems
+# Each entry is (min_speed_ms, max_speed_ms, param_name); the param value is a
+# percent offset applied to the resolved limit (e.g. 10 -> +10%), lower bound inclusive
+
+OFFSET_PERCENT_MAX = 50.0
+
+OFFSET_MAP_IMPERIAL = [
+ (0, 8.94, "speed_limit_offset1"), # 0-20 mph
+ (8.94, 17.88, "speed_limit_offset2"), # 20-40 mph
+ (17.88, float("inf"), "speed_limit_offset3"), # 40+ mph
+]
+
+OFFSET_MAP_METRIC = [
+ (0, 8.33, "speed_limit_offset1"), # 0-30 km/h
+ (8.33, 16.67, "speed_limit_offset2"), # 30-60 km/h
+ (16.67, float("inf"), "speed_limit_offset3"), # 60+ km/h
+]
+
+# Speed limit filler constants
+BOUNDING_BOX_RADIUS_DEGREE = 0.1
+MAX_ENTRIES = 1_000_000
+MAX_OVERPASS_DATA_BYTES = 1_073_741_824
+MAX_OVERPASS_REQUESTS = 10_000
+METERS_PER_DEG_LAT = 111_320
+VETTING_INTERVAL_DAYS = 7
+
+# Overpass API URLs
+OVERPASS_API_URL = "https://overpass-api.de/api/interpreter"
+OVERPASS_STATUS_URL = "https://overpass-api.de/api/status"
diff --git a/iqpilot/common/speed_assist_tiers.py b/iqpilot/common/speed_assist_tiers.py
new file mode 100644
index 000000000..ef94c1bb1
--- /dev/null
+++ b/iqpilot/common/speed_assist_tiers.py
@@ -0,0 +1,20 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Engagement tiers for the speed-assist feature. A tier is persisted as an integer
+under the "IQSpeedAssistMode" param; the ordinal IS the stored value and must remain
+stable (0..3), ordered by how much the tier is allowed to intervene.
+"""
+from enum import IntEnum
+
+STORE_KEY = "IQSpeedAssistMode"
+
+# none -> just display the limit -> highlight overspeed -> move the set speed
+SpeedAssistTier = IntEnum("SpeedAssistTier", "DISABLED ADVISORY ALERTING ACTUATING", start=0)
+
+DEFAULT_TIER = SpeedAssistTier.ADVISORY
+
+
+def actuates_speed(tier) -> bool:
+ """Only the top tier is permitted to drive the cruise set speed."""
+ return int(tier) == SpeedAssistTier.ACTUATING
diff --git a/iqpilot/common/steer_delay.py b/iqpilot/common/steer_delay.py
new file mode 100644
index 000000000..ff50d5434
--- /dev/null
+++ b/iqpilot/common/steer_delay.py
@@ -0,0 +1,43 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Chooses which steer-actuator delay the lateral controllers run with: the value the
+live estimator learned, or the driver's fixed software delay — gated by the
+"IQLiveSteerDelay" param. The pick is mirrored into "IQSteerDelayCache" so consumers that do
+not subscribe to liveDelay can still read the current value.
+"""
+from openpilot.common.params import Params
+
+_ENABLE_KEY = "IQLiveSteerDelay"
+_FIXED_KEY = "IQSoftwareSteerDelay"
+_CACHE_KEY = "IQSteerDelayCache"
+
+
+def resolve_steer_delay(params, stock_delay):
+ """Learned lateral delay while live-learning is enabled, otherwise the stock delay."""
+ if not params.get_bool(_ENABLE_KEY):
+ return stock_delay
+ return float(params.get(_CACHE_KEY, return_default=True))
+
+
+def cached_steer_delay():
+ """Last value SteerDelayPublisher mirrored into the param — usable without a
+ liveDelay subscription (e.g. at process startup)."""
+ return Params().get(_CACHE_KEY, return_default=True)
+
+
+class SteerDelayPublisher:
+ """Refreshes IQSteerDelayCache every lag message: the learned live delay when the
+ toggle is on, else the actuator delay plus the driver's fixed software offset."""
+
+ def __init__(self, car_params):
+ self._params = Params()
+ self._actuator_delay = car_params.steerActuatorDelay
+
+ def _fixed_delay(self):
+ return self._actuator_delay + self._params.get(_FIXED_KEY, return_default=True)
+
+ def update(self, lag_msg):
+ live = self._params.get_bool(_ENABLE_KEY)
+ value = lag_msg.liveDelay.lateralDelay if live else self._fixed_delay()
+ self._params.put_nonblocking(_CACHE_KEY, value)
diff --git a/iqpilot/common/version.h b/iqpilot/common/version.h
new file mode 100644
index 000000000..69626dd66
--- /dev/null
+++ b/iqpilot/common/version.h
@@ -0,0 +1 @@
+#define IQPILOT_VERSION "IQ.Pilot 1.0c"
diff --git a/iqpilot/iq_maps/__init__.py b/iqpilot/iq_maps/__init__.py
new file mode 100644
index 000000000..52d25cb53
--- /dev/null
+++ b/iqpilot/iq_maps/__init__.py
@@ -0,0 +1,5 @@
+import os
+from openpilot.common.basedir import BASEDIR
+
+VENDOR_MAPD_BIN_DIR = os.path.join(BASEDIR, "third_party/mapd_pfeiferj")
+VENDOR_MAPD_PATH = os.path.join(VENDOR_MAPD_BIN_DIR, "mapd")
diff --git a/iqpilot/iq_maps/orchestrator.py b/iqpilot/iq_maps/orchestrator.py
new file mode 100755
index 000000000..b8af353c7
--- /dev/null
+++ b/iqpilot/iq_maps/orchestrator.py
@@ -0,0 +1,463 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import platform
+import os
+import glob
+import shutil
+import signal
+import subprocess
+import threading
+import time
+from datetime import datetime
+
+import cereal.messaging as messaging
+from cereal import custom
+from openpilot.common.params import Params
+from openpilot.common.realtime import Ratekeeper, config_realtime_process
+from openpilot.common.swaglog import cloudlog
+from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert
+from openpilot.system.hardware.hw import Paths
+from openpilot.iqpilot.iq_maps import VENDOR_MAPD_BIN_DIR, VENDOR_MAPD_PATH
+from openpilot.iqpilot.iq_maps.tile_bundle_downloader import TileBundleDownloader, region_bundle_installed
+from openpilot.iqpilot.iq_maps.vendor_mapd_installer import VendorMapdInstaller
+
+OfflineMapAction = custom.MapdInputType
+_region_sync_worker: threading.Thread | None = None
+
+# mapd_manager only runs offroad (process_config.only_offroad) and the onroad
+# NativeProcess("mapd", ...) is started the instant `started` flips True. If a
+# vendor-map download is in flight at that exact moment, the two `mapd`
+# binaries end up pointed at the same Paths.mapd_root() tile directory at the
+# same time: this one still downloading/writing, the onroad one already
+# mmap-reading. Manager only sends SIGINT/SIGTERM to stop mapd_manager, which
+# by default only interrupts the main thread — the background download thread
+# and the vendor `mapd` subprocess it spawned are otherwise orphaned and keep
+# writing into the tile directory the onroad reader just opened, which is what
+# was segfaulting (-12) the onroad process in a tight restart loop. The lock +
+# pidfile below make sure that subprocess is always killed (on clean shutdown
+# via the signal handlers, and on the next boot if this process itself got
+# SIGKILLed) before anything else is allowed to read the tile directory.
+_active_proc_lock = threading.Lock()
+_active_proc: subprocess.Popen | None = None
+_shutdown = threading.Event()
+# Display-tile bundles for the offline on-screen map (separate asset from mapd's routing
+# data). Downloaded after the mapd fetch in the same worker so a region selection installs
+# both, and independently restorable when only the tile bundle is missing.
+_tile_downloader: TileBundleDownloader | None = None
+
+
+def _vendor_fetch_pidfile() -> str:
+ return os.path.join(Paths.mapd_root(), ".vendor_fetch.pid")
+
+
+def _pid_is_vendor_fetch(pid: int) -> bool:
+ try:
+ with open(f"/proc/{pid}/cmdline", "rb") as f:
+ cmdline = f.read()
+ except OSError:
+ return False
+ return VENDOR_MAPD_PATH.encode() in cmdline
+
+
+def _reap_orphaned_vendor_fetch() -> None:
+ """Kill any vendor-fetch mapd subprocess left running from a prior, uncleanly-terminated run."""
+ pidfile = _vendor_fetch_pidfile()
+ try:
+ with open(pidfile) as f:
+ pid = int(f.read().strip())
+ except (OSError, ValueError):
+ return
+ try:
+ if _pid_is_vendor_fetch(pid):
+ cloudlog.warning(f"iq_maps: reaping orphaned vendor-fetch mapd pid={pid} from a prior run")
+ os.kill(pid, signal.SIGTERM)
+ for _ in range(20):
+ time.sleep(0.1)
+ if not _pid_is_vendor_fetch(pid):
+ break
+ else:
+ os.kill(pid, signal.SIGKILL)
+ except ProcessLookupError:
+ pass
+ finally:
+ try:
+ os.remove(pidfile)
+ except OSError:
+ pass
+
+
+def _kill_active_proc() -> None:
+ with _active_proc_lock:
+ proc = _active_proc
+ if proc is None or proc.poll() is not None:
+ return
+ proc.terminate()
+ try:
+ proc.wait(timeout=3)
+ except Exception:
+ proc.kill()
+ try:
+ proc.wait(timeout=2)
+ except Exception:
+ pass
+
+
+def _handle_shutdown_signal(signum, _frame) -> None:
+ cloudlog.warning(f"iq_maps: mapd_manager received signal {signum}, cleaning up vendor-fetch subprocess")
+ _shutdown.set()
+ _kill_active_proc()
+ if _tile_downloader is not None:
+ _tile_downloader.cancel()
+ worker = _region_sync_worker
+ if worker is not None and worker.is_alive():
+ worker.join(timeout=3)
+ raise SystemExit(0)
+
+
+def _install_signal_handlers() -> None:
+ signal.signal(signal.SIGINT, _handle_shutdown_signal)
+ signal.signal(signal.SIGTERM, _handle_shutdown_signal)
+
+
+def ensure_vendor_runtime() -> None:
+ # verify-only: a hash-mismatched binary is quarantined, never replaced from
+ # the network — the updater restores the checked-in one
+ try:
+ VendorMapdInstaller().verify()
+ except Exception:
+ cloudlog.exception("iq_maps: vendor runtime verification failed")
+
+params = Params()
+mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else params
+
+
+def stale_region_artifacts() -> list[str]:
+ patterns = [
+ f"{Paths.mapd_root()}/db",
+ f"{Paths.mapd_root()}/v*"
+ ]
+ stale_paths: list[str] = []
+ for pattern in patterns:
+ for match in glob.glob(pattern):
+ stale_paths.append(match)
+ if os.path.isdir(match):
+ stale_paths.extend(glob.glob(match + '/**', recursive=True))
+ if not os.path.isfile(VENDOR_MAPD_PATH):
+ stale_paths.append(VENDOR_MAPD_PATH)
+ return stale_paths
+
+
+def purge_stale_region_artifacts(stale_paths: list[str]) -> None:
+ for candidate in stale_paths:
+ if candidate.endswith('/') and os.path.isfile(candidate[:-1]):
+ candidate = candidate[:-1]
+ if os.path.islink(candidate) or os.path.isfile(candidate):
+ os.remove(candidate)
+ elif os.path.isdir(candidate):
+ shutil.rmtree(candidate, ignore_errors=False)
+
+
+def _compose_region_selector(nations: list[str], states: list[str] | None = None) -> str:
+ requested_paths: list[str] = []
+ for state_code in (states or []):
+ code = str(state_code).strip().upper()
+ if code and code != "ALL":
+ requested_paths.append(f"us_state.{code}")
+ for nation_code in (nations or []):
+ code = str(nation_code).strip().upper()
+ if code:
+ requested_paths.append(f"nation.{code}")
+ return ",".join(requested_paths)
+
+
+def _fetch_tile_bundles(region_selector: str, abort_check=None) -> None:
+ """Download the offline on-screen map display tiles for the selected regions.
+
+ Separate asset from mapd's routing data: the on-screen map's OsmOfflineProvider reads
+ raster .mbtiles bundles, so a region selection installs both when OfflineOSMaps is on."""
+ global _tile_downloader
+ if not params.get_bool("OfflineOSMaps"):
+ return
+ selectors = [part for part in region_selector.split(",") if part]
+ if not selectors:
+ return
+ try:
+ _tile_downloader = TileBundleDownloader(params=params, mem_params=mem_params, abort_check=abort_check)
+ _tile_downloader.download_regions(selectors)
+ except Exception:
+ cloudlog.exception("iq_maps: tile bundle download failed")
+ finally:
+ _tile_downloader = None
+
+
+def _drive_vendor_fetch(region_selector: str, requested_regions: dict) -> None:
+ global _active_proc
+ proc = None
+ cancelled = False
+ try:
+ mem_params.put("OSMDownloadLocations", requested_regions)
+ proc = subprocess.Popen([VENDOR_MAPD_PATH], cwd=VENDOR_MAPD_BIN_DIR,
+ stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
+ start_new_session=True)
+ with _active_proc_lock:
+ _active_proc = proc
+ with open(_vendor_fetch_pidfile(), "w") as f:
+ f.write(str(proc.pid))
+
+ pm = messaging.PubMaster(["mapdIn"])
+ sm = messaging.SubMaster(["mapdExtendedOut"])
+ time.sleep(4.0)
+
+ for _ in range(10):
+ msg = messaging.new_message("mapdIn")
+ msg.mapdIn.type = OfflineMapAction.download
+ msg.mapdIn.str = region_selector
+ pm.send("mapdIn", msg)
+ time.sleep(0.2)
+
+ started = False
+ deadline = time.monotonic() + 3600.0
+ while time.monotonic() < deadline and not _shutdown.is_set():
+ sm.update(500)
+ dp = sm["mapdExtendedOut"].downloadProgress
+ mem_params.put("OSMDownloadProgress", {
+ "active": bool(dp.active),
+ "total_files": int(dp.totalFiles),
+ "downloaded_files": int(dp.downloadedFiles),
+ })
+ if dp.active:
+ started = True
+ elif started:
+ break
+ if not mem_params.get("OSMDownloadLocations"):
+ cancelled = True
+ cancel = messaging.new_message("mapdIn")
+ cancel.mapdIn.type = OfflineMapAction.cancelDownload
+ pm.send("mapdIn", cancel)
+ break
+ cloudlog.info(f"iq_maps: vendor map download finished for {region_selector}")
+ if not cancelled and not _shutdown.is_set():
+ # OSMDownloadLocations stays set until the finally below, so the konn3kt cancel RPC
+ # (which removes it) aborts the tile phase exactly like it cancels the mapd phase.
+ _fetch_tile_bundles(region_selector, abort_check=lambda: _shutdown.is_set() or not mem_params.get("OSMDownloadLocations"))
+ except Exception:
+ cloudlog.exception("iq_maps: vendor map download failed")
+ finally:
+ try:
+ mem_params.remove("OSMDownloadLocations")
+ except Exception:
+ pass
+ if proc is not None:
+ proc.terminate()
+ try:
+ proc.wait(timeout=5)
+ except Exception:
+ proc.kill()
+ with _active_proc_lock:
+ _active_proc = None
+ try:
+ os.remove(_vendor_fetch_pidfile())
+ except OSError:
+ pass
+
+
+def queue_region_refresh(nations: list[str], states: list[str] | None = None) -> None:
+ global _region_sync_worker
+ params.put("OsmDownloadedDate", str(datetime.now().timestamp()))
+ params.put_bool("OsmDbUpdatesCheck", False)
+
+ region_selector = _compose_region_selector(nations, states)
+ if not region_selector:
+ cloudlog.warning("iq_maps: no region selected for offline map download")
+ return
+ if _region_sync_worker is not None and _region_sync_worker.is_alive():
+ cloudlog.warning("iq_maps: vendor map download already in progress")
+ return
+
+ requested_regions = {"nations": nations, "states": states or [], "paths": region_selector}
+ cloudlog.info(f"iq_maps: starting vendor map download for {region_selector}")
+ _region_sync_worker = threading.Thread(
+ target=_drive_vendor_fetch,
+ args=(region_selector, requested_regions),
+ daemon=True,
+ )
+ _region_sync_worker.start()
+
+
+def normalize_region_selection(nations: list[str], states: list[str] | None = None) -> tuple[list[str], list[str]]:
+ normalized_nations = list(nations)
+ normalized_states = list(states or [])
+ lowered_states = {entry.lower() for entry in normalized_states}
+
+ if "US" in normalized_nations and normalized_states and "all" not in lowered_states:
+ normalized_nations = [entry for entry in normalized_nations if entry != "US"]
+ elif normalized_states:
+ normalized_states = [entry for entry in normalized_states if entry.lower() != "all"]
+
+ return normalized_nations, normalized_states
+
+
+_AUTO_RESTORE_INTERVAL_S = 1800.0
+_last_auto_restore_t = 0.0
+
+
+def region_data_missing() -> bool:
+ # a media wipe (reflash/format) can delete the downloaded region while the params
+ # that configure offline maps survive; mapd then retries the missing files forever
+ # and nothing re-downloads (stale_region_artifacts only sees leftover files)
+ if not params.get_bool("OsmLocal"):
+ return False
+ if not params.get("OsmDownloadedDate"):
+ return False
+ if glob.glob(f"{Paths.mapd_root()}/db") or glob.glob(f"{Paths.mapd_root()}/v*"):
+ return False
+ # mapd v2 stores region tiles under offline//.tar.gz — without this
+ # check a v2 install looks perpetually wiped and re-downloads every backoff interval
+ if glob.glob(f"{Paths.mapd_root()}/offline/*/*"):
+ return False
+ country = params.get("OsmLocationName", return_default=True)
+ return bool(country)
+
+
+def configured_states() -> list[str]:
+ """Selected US states: OsmStateNames (JSON list, multi-state) wins; the legacy
+ single OsmStateName remains the fallback for pre-list configs."""
+ try:
+ states = params.get("OsmStateNames")
+ if isinstance(states, bytes):
+ import json as _json
+ states = _json.loads(states.decode("utf-8"))
+ if isinstance(states, str):
+ import json as _json
+ states = _json.loads(states)
+ if isinstance(states, list) and states:
+ return [str(s).strip().upper() for s in states if str(s).strip()]
+ except Exception:
+ pass
+ state = params.get("OsmStateName", return_default=True)
+ return [state] if state else []
+
+
+def maybe_auto_restore_region() -> None:
+ global _last_auto_restore_t
+ if not region_data_missing():
+ return
+ if _region_sync_worker is not None and _region_sync_worker.is_alive():
+ return
+ now = time.monotonic()
+ if now - _last_auto_restore_t < _AUTO_RESTORE_INTERVAL_S:
+ return
+ _last_auto_restore_t = now
+ country = params.get("OsmLocationName", return_default=True)
+ states = configured_states()
+ nations, states_filtered = normalize_region_selection([country], states)
+ cloudlog.warning(f"iq_maps: configured offline region {country}/{states} has no data on disk; auto-restoring")
+ queue_region_refresh(nations, states_filtered)
+
+
+_TILE_RESTORE_INTERVAL_S = 1800.0
+_last_tile_restore_t = 0.0
+_tile_only_worker: threading.Thread | None = None
+
+
+def _configured_region_selector() -> str:
+ country = params.get("OsmLocationName", return_default=True)
+ states = configured_states()
+ nations, states_filtered = normalize_region_selection([country] if country else [], states)
+ return _compose_region_selector(nations, states_filtered)
+
+
+def tile_bundles_missing() -> bool:
+ # covers a media wipe AND the user enabling OfflineOSMaps after the region download
+ # already ran (the vendor fetch only pulls tile bundles when the toggle is on)
+ if not params.get_bool("OfflineOSMaps"):
+ return False
+ selector = _configured_region_selector()
+ if not selector:
+ return False
+ return any(not region_bundle_installed(part) for part in selector.split(",") if part)
+
+
+def maybe_restore_tile_bundles() -> None:
+ """Tile-only download: don't re-run the whole mapd vendor fetch when only the display
+ tiles are missing."""
+ global _last_tile_restore_t, _tile_only_worker
+ if not tile_bundles_missing():
+ return
+ if _region_sync_worker is not None and _region_sync_worker.is_alive():
+ return
+ if _tile_only_worker is not None and _tile_only_worker.is_alive():
+ return
+ now = time.monotonic()
+ if now - _last_tile_restore_t < _TILE_RESTORE_INTERVAL_S:
+ return
+ _last_tile_restore_t = now
+ selector = _configured_region_selector()
+ cloudlog.warning(f"iq_maps: offline map tile bundles missing for {selector}; downloading")
+ _tile_only_worker = threading.Thread(
+ target=_fetch_tile_bundles,
+ args=(selector,),
+ kwargs={"abort_check": _shutdown.is_set},
+ daemon=True,
+ )
+ _tile_only_worker.start()
+
+
+def sync_osm_request_flags() -> None:
+ maybe_auto_restore_region()
+ maybe_restore_tile_bundles()
+ if params.get_bool("OsmDbUpdatesCheck"):
+ if _region_sync_worker is not None and _region_sync_worker.is_alive():
+ # A download is already writing into Paths.mapd_root() - deleting/rewriting
+ # files under it right now would race the writer (and any onroad mapd
+ # reader) the same way the orphaned-subprocess bug did. Wait for it to finish.
+ return
+ purge_stale_region_artifacts(stale_region_artifacts())
+ country = params.get("OsmLocationName", return_default=True)
+ states = configured_states()
+ filtered_nations, filtered_states = normalize_region_selection([country], states)
+ queue_region_refresh(filtered_nations, filtered_states)
+
+ if not mem_params.get("OSMDownloadBounds"):
+ mem_params.put("OSMDownloadBounds", "")
+
+ if not mem_params.get("LastGPSPosition"):
+ mem_params.put("LastGPSPosition", "{}")
+
+
+def run_loop():
+ ensure_vendor_runtime()
+ config_realtime_process([0, 1, 2, 3], 5)
+
+ rk = Ratekeeper(1, print_delay_threshold=None)
+
+ try:
+ os.mkdir(Paths.mapd_root())
+ except FileExistsError:
+ pass
+ except PermissionError:
+ cloudlog.exception(f"iq_maps: failed to make {Paths.mapd_root()}")
+
+ # A prior run that got SIGKILLed (or crashed) may have left its vendor-fetch
+ # mapd subprocess running and still writing into Paths.mapd_root(); clear it
+ # before anything (including the onroad mapd, once `started` flips) reads
+ # from that directory. Signal handlers cover the graceful-shutdown path.
+ _reap_orphaned_vendor_fetch()
+ _install_signal_handlers()
+
+ while not _shutdown.is_set():
+ show_alert = stale_region_artifacts() and params.get_bool("OsmLocal")
+ set_offroad_alert("Offroad_OSMUpdateRequired", show_alert, "This alert will be cleared when new maps are downloaded.")
+
+ sync_osm_request_flags()
+ rk.keep_time()
+
+
+def main():
+ run_loop()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/iq_maps/road_data/__init__.py b/iqpilot/iq_maps/road_data/__init__.py
new file mode 100644
index 000000000..200a8b430
--- /dev/null
+++ b/iqpilot/iq_maps/road_data/__init__.py
@@ -0,0 +1,25 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Shared tunables and a small debug logger for the offline road-name / turn-speed path.
+"""
+from openpilot.common.swaglog import cloudlog
+
+# seconds of road ahead we scan for upcoming turn-speed zones published on iqLiveData
+LOOK_AHEAD_HORIZON_TIME = 15.0
+# clear the on-screen road name once it has gone this long without a refresh (s)
+ROAD_NAME_TIMEOUT = 30
+
+R = 6373000.0 # mean Earth radius in metres (great-circle distance math)
+QUERY_RADIUS = 3000 # online OSM query reach, metres
+QUERY_RADIUS_OFFLINE = 2250 # offline-tile OSM query reach, metres
+
+_DEBUG = False
+_CLOUDLOG_DEBUG = False
+
+
+def debug_road_data(msg, log_to_cloud=True):
+ if _CLOUDLOG_DEBUG and log_to_cloud:
+ cloudlog.debug(msg)
+ if _DEBUG:
+ print(msg)
diff --git a/iqpilot/iq_maps/road_data/iq_road_layer.py b/iqpilot/iq_maps/road_data/iq_road_layer.py
new file mode 100644
index 000000000..08bb60fb5
--- /dev/null
+++ b/iqpilot/iq_maps/road_data/iq_road_layer.py
@@ -0,0 +1,67 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import json
+import math
+import platform
+
+from cereal import custom
+from openpilot.common.params import Params
+from openpilot.iqpilot.iq_maps.road_data.signal_bridge import RoadSignalBridge
+from openpilot.iqpilot.navd.helpers import Coordinate
+
+
+class IQRoadLayer(RoadSignalBridge):
+ def __init__(self):
+ super().__init__()
+ self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else self.params
+
+ def refresh_position(self) -> None:
+ location = self.location_sub['iqLiveLocation']
+ self.fix_ready = (
+ location.solutionState == custom.IQLiveLocation.SolutionState.ready
+ and location.geodeticPosition.isValid
+ )
+
+ if self.fix_ready:
+ self.heading_deg = math.degrees(location.alignedOrientationNed.values[2])
+ self.last_coordinate = Coordinate(location.geodeticPosition.values[0], location.geodeticPosition.values[1])
+
+ if self.last_coordinate is None:
+ return
+
+ payload = {
+ "latitude": self.last_coordinate.latitude,
+ "longitude": self.last_coordinate.longitude,
+ }
+
+ if self.heading_deg is not None:
+ payload["bearing"] = self.heading_deg
+
+ self.mem_params.put("LastGPSPosition", json.dumps(payload))
+
+ def read_current_limit(self) -> float:
+ return float(self.mem_params.get("MapSpeedLimit") or 0.0)
+
+ def read_current_road(self) -> str:
+ return str(self.mem_params.get("RoadName") or "")
+
+ def read_upcoming_limit(self) -> tuple[float, float]:
+ raw_segment = self.mem_params.get("NextMapSpeedLimit")
+ if isinstance(raw_segment, bytes):
+ raw_segment = raw_segment.decode("utf-8")
+ try:
+ upcoming_segment = json.loads(raw_segment) if isinstance(raw_segment, str) and raw_segment else (raw_segment or {})
+ except json.JSONDecodeError:
+ upcoming_segment = {}
+
+ next_limit = float(upcoming_segment.get("speedlimit", 0.0) or 0.0)
+ target_lat = upcoming_segment.get("latitude")
+ target_lon = upcoming_segment.get("longitude")
+ distance_to_limit = 0.0
+
+ if target_lat is not None and target_lon is not None:
+ limit_coordinate = Coordinate(float(target_lat), float(target_lon))
+ distance_to_limit = (self.last_coordinate or Coordinate(0, 0)).distance_to(limit_coordinate)
+
+ return next_limit, distance_to_limit
diff --git a/iqpilot/iq_maps/road_data/road_daemon.py b/iqpilot/iq_maps/road_data/road_daemon.py
new file mode 100644
index 000000000..0e358da07
--- /dev/null
+++ b/iqpilot/iq_maps/road_data/road_daemon.py
@@ -0,0 +1,35 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import threading
+import traceback
+
+from openpilot.common.realtime import Ratekeeper, config_realtime_process
+from openpilot.iqpilot.iq_maps.road_data import debug_road_data
+from openpilot.iqpilot.iq_maps.road_data.iq_road_layer import IQRoadLayer
+
+ROAD_LAYER_HZ = 1
+ROAD_LAYER_CORES = [0, 1, 2, 3]
+
+
+def _log_thread_exception(args) -> None:
+ debug_road_data(f"IQ maps threading exception:\n{args}")
+ traceback.print_exception(args.exc_type, args.exc_value, args.exc_traceback)
+
+
+def run() -> None:
+ config_realtime_process(ROAD_LAYER_CORES, 5)
+ layer = IQRoadLayer()
+ rk = Ratekeeper(ROAD_LAYER_HZ, print_delay_threshold=None)
+ while True:
+ layer.step()
+ rk.keep_time()
+
+
+def main() -> None:
+ threading.excepthook = _log_thread_exception
+ run()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/iq_maps/road_data/signal_bridge.py b/iqpilot/iq_maps/road_data/signal_bridge.py
new file mode 100644
index 000000000..1a3d791aa
--- /dev/null
+++ b/iqpilot/iq_maps/road_data/signal_bridge.py
@@ -0,0 +1,62 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from abc import abstractmethod, ABC
+
+import cereal.messaging as messaging
+from openpilot.common.params import Params
+from openpilot.common.constants import CV
+from openpilot.selfdrive.car.cruise import V_CRUISE_UNSET
+from openpilot.iqpilot.navd.helpers import coordinate_from_param
+
+ROAD_SPEED_CEILING = V_CRUISE_UNSET * CV.KPH_TO_MS
+
+
+class RoadSignalBridge(ABC):
+ def __init__(self):
+ self.params = Params()
+
+ self.location_sub = messaging.SubMaster(['iqLiveLocation'])
+ self.output_pub = messaging.PubMaster(['iqLiveData'])
+
+ self.fix_ready = False
+ self.heading_deg = None
+ self.last_coordinate = coordinate_from_param("LastGPSPositionIQLoc", self.params)
+
+ @abstractmethod
+ def refresh_position(self) -> None:
+ pass
+
+ @abstractmethod
+ def read_current_limit(self) -> float:
+ pass
+
+ @abstractmethod
+ def read_upcoming_limit(self) -> tuple[float, float]:
+ pass
+
+ @abstractmethod
+ def read_current_road(self) -> str:
+ pass
+
+ def publish_snapshot(self) -> None:
+ active_limit = self.read_current_limit()
+ next_limit, next_limit_distance = self.read_upcoming_limit()
+
+ outbound = messaging.new_message('iqLiveData')
+ outbound.valid = self.location_sub['iqLiveLocation'].gpsHealthy
+ live_data = outbound.iqLiveData
+
+ live_data.speedLimitValid = bool(ROAD_SPEED_CEILING > active_limit > 0)
+ live_data.speedLimit = active_limit
+ live_data.speedLimitAheadValid = bool(ROAD_SPEED_CEILING > next_limit > 0)
+ live_data.speedLimitAhead = next_limit
+ live_data.speedLimitAheadDistance = next_limit_distance
+ live_data.roadName = self.read_current_road()
+
+ self.output_pub.send('iqLiveData', outbound)
+
+ def step(self) -> None:
+ self.location_sub.update(0)
+ self.refresh_position()
+ self.publish_snapshot()
diff --git a/iqpilot/iq_maps/tests/__init__.py b/iqpilot/iq_maps/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/iq_maps/tests/mapd_hash b/iqpilot/iq_maps/tests/mapd_hash
new file mode 100644
index 000000000..3da7ec672
--- /dev/null
+++ b/iqpilot/iq_maps/tests/mapd_hash
@@ -0,0 +1 @@
+4de87a77eb698200acf0cf734aaaa0222c29b64ab389430107f912ae201c762e
\ No newline at end of file
diff --git a/iqpilot/iq_maps/tests/test_tile_bundle_downloader.py b/iqpilot/iq_maps/tests/test_tile_bundle_downloader.py
new file mode 100644
index 000000000..fb1642895
--- /dev/null
+++ b/iqpilot/iq_maps/tests/test_tile_bundle_downloader.py
@@ -0,0 +1,235 @@
+import hashlib
+import json
+import sqlite3
+import threading
+from functools import partial
+from http.server import HTTPServer, SimpleHTTPRequestHandler
+
+import pytest
+
+from openpilot.iqpilot.iq_maps import tile_bundle_downloader as tbd
+from openpilot.iqpilot.ui.onroad import offline_tiles
+
+
+PNG_1X1 = (
+ b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01" +
+ b"\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\rIDATx\x9cc\xf8\xcf" +
+ b"\xc0\xf0\x1f\x00\x05\x00\x01\xff\x89\x99=\x1d\x00\x00\x00\x00IEND\xaeB`\x82"
+)
+
+
+class FakeParams:
+ def __init__(self):
+ self.store: dict[str, object] = {}
+
+ def get(self, key, return_default=False):
+ return self.store.get(key)
+
+ def get_bool(self, key):
+ return bool(self.store.get(key))
+
+ def put(self, key, value):
+ self.store[key] = value
+
+ def put_bool(self, key, value):
+ self.store[key] = bool(value)
+
+ def remove(self, key):
+ self.store.pop(key, None)
+
+
+def _make_mbtiles(path):
+ conn = sqlite3.connect(path)
+ conn.execute("CREATE TABLE metadata (name text, value text)")
+ conn.execute("CREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)")
+ conn.executemany("INSERT INTO metadata (name, value) VALUES (?, ?)",
+ [("format", "png"), ("minzoom", "10"), ("maxzoom", "16"),
+ ("bounds", "-124.5,32.4,-114.1,42.1")])
+ conn.execute("INSERT INTO tiles VALUES (?, ?, ?, ?)", (10, 163, 396, PNG_1X1))
+ conn.commit()
+ conn.close()
+
+
+@pytest.fixture
+def hosting(tmp_path, monkeypatch):
+ """Local static host serving index.json + a us_state.CA bundle; offline root redirected."""
+ serve_root = tmp_path / "serve"
+ serve_root.mkdir()
+ bundle = serve_root / "us_state.CA.mbtiles"
+ _make_mbtiles(bundle)
+ payload = bundle.read_bytes()
+ index = {
+ "version": 1,
+ "regions": {
+ "us_state.CA": {
+ "path": "us_state.CA.mbtiles",
+ "bytes": len(payload),
+ "sha256": hashlib.sha256(payload).hexdigest(),
+ "bounds": "-124.5,32.4,-114.1,42.1",
+ "minzoom": 10,
+ "maxzoom": 16,
+ "version": "20260709",
+ }
+ },
+ }
+ (serve_root / "index.json").write_text(json.dumps(index))
+
+ handler = partial(SimpleHTTPRequestHandler, directory=str(serve_root))
+ server = HTTPServer(("127.0.0.1", 0), handler)
+ thread = threading.Thread(target=server.serve_forever, daemon=True)
+ thread.start()
+
+ offline_root = tmp_path / "offline_maps"
+ monkeypatch.setenv(offline_tiles.OFFLINE_TILE_ROOT_ENV, str(offline_root / "tiles"))
+ offline_tiles._region_roots_cache = None
+ offline_tiles._region_bounds_cache.clear()
+
+ params = FakeParams()
+ params.put(tbd.BASE_URL_PARAM, f"http://127.0.0.1:{server.server_address[1]}")
+ sessions: list = []
+ real_ctor = tbd.TileBundleDownloader.__init__
+
+ def tracking_ctor(self, *args, **kwargs):
+ real_ctor(self, *args, **kwargs)
+ sessions.append(self.session)
+
+ monkeypatch.setattr(tbd.TileBundleDownloader, "__init__", tracking_ctor)
+ try:
+ yield params, index, offline_root
+ finally:
+ for session in sessions:
+ session.close()
+ server.shutdown()
+ server.server_close()
+
+
+def test_download_installs_bundle_and_manifest(hosting):
+ params, index, offline_root = hosting
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.CA"]) is True
+
+ installed = offline_root / "regions" / "us_state.CA" / "tiles" / "offline.mbtiles"
+ assert installed.exists()
+ manifest = json.loads((installed.parent.parent / "manifest.json").read_text())
+ assert manifest["mbtiles"]["bounds"] == "-124.5,32.4,-114.1,42.1"
+ assert manifest["mbtiles"]["sha256"] == index["regions"]["us_state.CA"]["sha256"]
+ # request/progress params cleaned up
+ assert params.get(tbd.REQUEST_PARAM) is None
+ assert params.get(tbd.PROGRESS_PARAM)["active"] is False
+
+ # and the on-screen map provider can find + read it
+ assert offline_tiles.find_offline_mbtiles_path(37.0, -120.0) == installed
+ conn = offline_tiles.open_mbtiles(installed)
+ try:
+ assert offline_tiles.mbtiles_is_raster(conn)
+ assert offline_tiles.load_raster_tile_blob(conn, 10, 163, 2 ** 10 - 1 - 396) == PNG_1X1
+ finally:
+ conn.close()
+
+
+def test_skips_already_installed_matching_sha(hosting):
+ params, _, offline_root = hosting
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.CA"]) is True
+ installed = offline_root / "regions" / "us_state.CA" / "tiles" / "offline.mbtiles"
+ first_mtime = installed.stat().st_mtime_ns
+ assert dl.download_regions(["us_state.CA"]) is True
+ assert installed.stat().st_mtime_ns == first_mtime
+
+
+def test_unknown_region_fails_cleanly(hosting):
+ params, _, offline_root = hosting
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.ZZ"]) is False
+ assert not (offline_root / "regions" / "us_state.ZZ").exists()
+
+
+def test_resume_from_partial(hosting):
+ params, _, offline_root = hosting
+ part = offline_root / "regions" / "us_state.CA" / "tiles" / "offline.mbtiles.part"
+ part.parent.mkdir(parents=True)
+ # pre-seed the first half as an interrupted download
+ full = (offline_root / ".." / "serve" / "us_state.CA.mbtiles").resolve().read_bytes()
+ part.write_bytes(full[: len(full) // 2])
+
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.CA"]) is True
+ installed = part.parent / "offline.mbtiles"
+ assert installed.read_bytes() == full
+ assert not part.exists()
+
+
+def test_cancel_aborts_before_install(hosting):
+ params, _, offline_root = hosting
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params, abort_check=lambda: True)
+ assert dl.download_regions(["us_state.CA"]) is False
+ assert not (offline_root / "regions" / "us_state.CA" / "tiles" / "offline.mbtiles").exists()
+ # request param cleaned up so the UI doesn't show a stuck download
+ assert params.get(tbd.REQUEST_PARAM) is None
+
+
+def test_sha_mismatch_rejected(hosting):
+ params, index, offline_root = hosting
+ index["regions"]["us_state.CA"]["sha256"] = "0" * 64
+ serve_root = (offline_root / ".." / "serve").resolve()
+ (serve_root / "index.json").write_text(json.dumps(index))
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.CA"]) is False
+ assert not (offline_root / "regions" / "us_state.CA" / "tiles" / "offline.mbtiles").exists()
+
+
+def test_new_region_visible_without_process_restart(hosting):
+ """Regression: lru_cache on _candidate_region_roots hid freshly downloaded regions."""
+ params, _, offline_root = hosting
+ # UI already scanned (and found nothing)
+ offline_tiles._region_roots_cache = None
+ assert offline_tiles.find_offline_mbtiles_path(37.0, -120.0) is None
+
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.CA"]) is True
+
+ # TTL cache: expire it and the new region shows up in the same process
+ offline_tiles._region_roots_cache = None
+ found = offline_tiles.find_offline_mbtiles_path(37.0, -120.0)
+ assert found is not None and found.exists()
+
+
+def test_candidate_base_urls_param_override_wins():
+ params = FakeParams()
+ params.put(tbd.BASE_URL_PARAM, "https://my-r2.example.com/v1/")
+ assert tbd.candidate_base_urls(params) == ["https://my-r2.example.com/v1"]
+
+
+def test_candidate_base_urls_private_endpoints_first():
+ params = FakeParams()
+ urls = tbd.candidate_base_urls(params)
+ # embedded private endpoints (gitea) come before the public default
+ assert urls[-1] == tbd.DEFAULT_TILE_BUNDLE_BASE_URL
+ if tbd._private_base_urls is not None:
+ assert any("git.konn3kt.com" in url for url in urls[:-1])
+ assert tbd.request_auth() is not None
+
+
+def test_day_variant_downloaded_and_manifested(hosting, tmp_path):
+ params, index, offline_root = hosting
+ serve_root = (offline_root / ".." / "serve").resolve()
+ day_bundle = serve_root / "us_state.CA_day.mbtiles"
+ _make_mbtiles(day_bundle)
+ day_payload = day_bundle.read_bytes()
+ entry = index["regions"]["us_state.CA"]
+ entry["day_path"] = "us_state.CA_day.mbtiles"
+ entry["day_bytes"] = len(day_payload)
+ entry["day_sha256"] = hashlib.sha256(day_payload).hexdigest()
+ (serve_root / "index.json").write_text(json.dumps(index))
+
+ dl = tbd.TileBundleDownloader(params=params, mem_params=params)
+ assert dl.download_regions(["us_state.CA"]) is True
+ tiles = offline_root / "regions" / "us_state.CA" / "tiles"
+ assert (tiles / "offline.mbtiles").exists()
+ assert (tiles / "offline_day.mbtiles").exists()
+ manifest = json.loads((tiles.parent / "manifest.json").read_text())
+ assert manifest["mbtiles_day"]["sha256"] == entry["day_sha256"]
+ # installed-and-current check must account for the day file
+ assert dl._installed_matches("us_state.CA", entry) is True
+ (tiles / "offline_day.mbtiles").unlink()
+ assert dl._installed_matches("us_state.CA", entry) is False
diff --git a/iqpilot/iq_maps/tests/test_vendor_mapd_installer.py b/iqpilot/iq_maps/tests/test_vendor_mapd_installer.py
new file mode 100644
index 000000000..a12aafd47
--- /dev/null
+++ b/iqpilot/iq_maps/tests/test_vendor_mapd_installer.py
@@ -0,0 +1,86 @@
+import hashlib
+
+import pytest
+
+from openpilot.iqpilot.iq_maps import vendor_mapd_installer as vmi
+
+
+class FakeParams:
+ def __init__(self):
+ self.store: dict[str, object] = {}
+
+ def get(self, key, return_default=False):
+ return self.store.get(key)
+
+ def put(self, key, value):
+ self.store[key] = value
+
+ def remove(self, key):
+ self.store.pop(key, None)
+
+
+@pytest.fixture
+def env(tmp_path, monkeypatch):
+ binary = tmp_path / "mapd"
+ hash_file = tmp_path / "mapd_hash"
+ monkeypatch.setattr(vmi, "VENDOR_MAPD_PATH", str(binary))
+ monkeypatch.setattr(vmi, "QUARANTINE_PATH", str(binary) + ".quarantined")
+ monkeypatch.setattr(vmi, "_HASH_FILE", str(hash_file))
+ monkeypatch.setattr(vmi.sentry, "init", lambda *a, **k: None)
+ monkeypatch.setattr(vmi.sentry, "capture_exception", lambda *a, **k: None)
+ return binary, hash_file
+
+
+def test_verified_binary_stamps_version(env):
+ binary, hash_file = env
+ binary.write_bytes(b"vetted")
+ hash_file.write_text(hashlib.sha256(b"vetted").hexdigest())
+
+ params = FakeParams()
+ assert vmi.VendorMapdInstaller(params=params).verify()
+ assert params.store["MapdVersion"] == vmi.VENDOR_RELEASE_TAG
+ assert binary.exists()
+
+
+def test_foreign_binary_quarantined(env):
+ # the fresh-install poison scenario: a stock release build on disk while the
+ # pin points at the vetted build
+ binary, hash_file = env
+ binary.write_bytes(b"stock release build")
+ hash_file.write_text(hashlib.sha256(b"vetted").hexdigest())
+
+ params = FakeParams()
+ params.store["MapdVersion"] = vmi.VENDOR_RELEASE_TAG
+ assert not vmi.VendorMapdInstaller(params=params).verify()
+ assert not binary.exists()
+ assert (binary.parent / "mapd.quarantined").read_bytes() == b"stock release build"
+ assert "MapdVersion" not in params.store
+
+
+def test_verify_clears_stale_quarantine(env):
+ binary, hash_file = env
+ binary.write_bytes(b"vetted")
+ hash_file.write_text(hashlib.sha256(b"vetted").hexdigest())
+ quarantine = binary.parent / "mapd.quarantined"
+ quarantine.write_bytes(b"old poison")
+
+ assert vmi.VendorMapdInstaller(params=FakeParams()).verify()
+ assert not quarantine.exists()
+
+
+def test_missing_hash_pin_leaves_binary_alone(env):
+ binary, _ = env
+ binary.write_bytes(b"anything")
+
+ assert not vmi.VendorMapdInstaller(params=FakeParams()).verify()
+ assert binary.exists()
+
+
+def test_missing_binary(env):
+ _, hash_file = env
+ hash_file.write_text(hashlib.sha256(b"vetted").hexdigest())
+
+ params = FakeParams()
+ params.store["MapdVersion"] = vmi.VENDOR_RELEASE_TAG
+ assert not vmi.VendorMapdInstaller(params=params).verify()
+ assert "MapdVersion" not in params.store
diff --git a/iqpilot/iq_maps/tests/test_vendor_mapd_version.py b/iqpilot/iq_maps/tests/test_vendor_mapd_version.py
new file mode 100644
index 000000000..abcdf598c
--- /dev/null
+++ b/iqpilot/iq_maps/tests/test_vendor_mapd_version.py
@@ -0,0 +1,16 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot.iq_maps.vendor_mapd_installer import sha256_of_file
+from openpilot.iqpilot.iq_maps import VENDOR_MAPD_PATH
+from openpilot.iqpilot.iq_maps.update_vendor_version import HASH_FILE
+
+
+class TestMapdVersion:
+ def test_compare_versions(self):
+ mapd_hash = sha256_of_file(VENDOR_MAPD_PATH)
+
+ with open(HASH_FILE) as f:
+ current_hash = f.read().strip()
+
+ assert current_hash == mapd_hash, "Run iqpilot/iq_maps/update_vendor_version.py to update the current mapd version and hash"
diff --git a/iqpilot/iq_maps/tile_bundle_downloader.py b/iqpilot/iq_maps/tile_bundle_downloader.py
new file mode 100644
index 000000000..9abfde8f8
--- /dev/null
+++ b/iqpilot/iq_maps/tile_bundle_downloader.py
@@ -0,0 +1,355 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Downloads per-region raster display-tile bundles (.mbtiles) for the offline on-screen map.
+
+These are a separate asset from mapd's routing/speed-limit data: mapd pulls OSM way tiles
+into Paths.mapd_root(), while the on-screen map (OsmOfflineProvider) reads raster .mbtiles
+from offline_map_root()/regions//tiles/offline.mbtiles. Bundles are built per
+state/nation by scripts/iqpilot/build_state_tile_bundles.py and hosted behind a static base
+URL that serves:
+
+ /index.json {"version": 1, "regions": {: entry}}
+ / the raster .mbtiles for that region
+
+Entry fields: path, bytes, sha256, bounds ("minLon,minLat,maxLon,maxLat"), minzoom, maxzoom.
+Selectors match the mapd region menu naming: us_state.CA, nation.US.
+"""
+import hashlib
+import json
+import platform
+import threading
+import time
+from pathlib import Path
+
+import requests
+
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.ui.onroad.offline_tiles import offline_map_root
+
+# Proprietary auth + hosted endpoints (gitea raw with an embedded read-only PAT, same
+# pattern as the model selector). Optional: without the private bundle the downloader
+# still works anonymously against OfflineTilesBaseUrl (e.g. a public R2 bucket).
+try:
+ from openpilot.iqpilot.iq_maps.tiles_auth import get_base_urls as _private_base_urls, get_requests_auth as _private_auth
+except Exception: # ProprietaryModuleMissing or import errors in stripped builds
+ _private_base_urls = None
+ _private_auth = None
+
+# R2 bucket iqnav behind the public custom domain (see scripts/iqpilot/tile_factory/r2_sync_watch.py)
+DEFAULT_TILE_BUNDLE_BASE_URL = "https://maps.konn3kt.com/iqosmd/v1"
+BASE_URL_PARAM = "OfflineTilesBaseUrl"
+PROGRESS_PARAM = "OfflineTilesDownloadProgress"
+REQUEST_PARAM = "OfflineTilesDownloadRequest"
+CHUNK_BYTES = 1 << 20
+HTTP_TIMEOUT_S = 30.0
+STREAM_RETRIES = 8
+
+
+def candidate_base_urls(params: Params) -> list[str]:
+ """Hosts to try in order: user/param override first, then the embedded private
+ endpoints (gitea raw), then the public default."""
+ override = params.get(BASE_URL_PARAM)
+ if isinstance(override, bytes):
+ override = override.decode("utf-8", errors="ignore")
+ override = (override or "").strip()
+ if override:
+ return [override.rstrip("/")]
+ urls: list[str] = []
+ if _private_base_urls is not None:
+ try:
+ urls.extend(url.rstrip("/") for url in _private_base_urls())
+ except Exception:
+ pass
+ urls.append(DEFAULT_TILE_BUNDLE_BASE_URL)
+ return urls
+
+
+def request_auth() -> tuple[str, str] | None:
+ if _private_auth is None:
+ return None
+ try:
+ return _private_auth()
+ except Exception:
+ return None
+
+
+def fetch_index(base_url: str, session: requests.Session) -> dict:
+ response = session.get(f"{base_url}/index.json", timeout=HTTP_TIMEOUT_S, auth=request_auth())
+ response.raise_for_status()
+ index = response.json()
+ regions = index.get("regions")
+ if not isinstance(regions, dict):
+ raise ValueError("tile bundle index has no regions")
+ return regions
+
+
+def region_bundle_dir(selector: str) -> Path:
+ return offline_map_root() / "regions" / selector
+
+
+def region_bundle_path(selector: str) -> Path:
+ return region_bundle_dir(selector) / "tiles" / "offline.mbtiles"
+
+
+def region_bundle_installed(selector: str) -> bool:
+ return region_bundle_path(selector).exists()
+
+
+def installed_region_selectors() -> list[str]:
+ regions_root = offline_map_root() / "regions"
+ if not regions_root.exists():
+ return []
+ return sorted(
+ child.name for child in regions_root.iterdir()
+ if child.is_dir() and (child / "tiles" / "offline.mbtiles").exists()
+ )
+
+
+def _hash_existing(path: Path) -> tuple["hashlib._Hash", int]:
+ digest = hashlib.sha256()
+ size = 0
+ with open(path, "rb") as f:
+ while True:
+ chunk = f.read(CHUNK_BYTES)
+ if not chunk:
+ break
+ digest.update(chunk)
+ size += len(chunk)
+ return digest, size
+
+
+def _write_manifest(selector: str, entry: dict) -> None:
+ manifest = {
+ "region": selector,
+ "version": entry.get("version", ""),
+ "mbtiles": {
+ "bounds": entry.get("bounds", ""),
+ "minzoom": entry.get("minzoom"),
+ "maxzoom": entry.get("maxzoom"),
+ "bytes": entry.get("bytes"),
+ "sha256": entry.get("sha256", ""),
+ },
+ }
+ if entry.get("day_path"):
+ manifest["mbtiles_day"] = {
+ "bytes": entry.get("day_bytes"),
+ "sha256": entry.get("day_sha256", ""),
+ }
+ manifest_path = region_bundle_dir(selector) / "manifest.json"
+ manifest_path.parent.mkdir(parents=True, exist_ok=True)
+ manifest_path.write_text(json.dumps(manifest, indent=2))
+
+
+class TileBundleDownloader:
+ """Streams region bundles to disk with resume + sha256 verify + atomic install.
+
+ Cancellation matches the mapd flow: the caller sets REQUEST_PARAM in mem params while a
+ download runs; removing it (konn3kt cancel RPC or settings) aborts between chunks. The
+ partial .part file is kept so a retry resumes instead of restarting.
+ """
+
+ def __init__(self, params: Params | None = None, mem_params: Params | None = None,
+ abort_check=None):
+ self.params = params if params is not None else Params()
+ if mem_params is not None:
+ self.mem_params = mem_params
+ else:
+ self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else self.params
+ self.session = requests.Session()
+ self._cancelled = threading.Event()
+ # optional external cancel signal, e.g. the orchestrator's OSMDownloadLocations removal
+ self._abort_check = abort_check
+
+ def cancel(self) -> None:
+ self._cancelled.set()
+
+ def _should_abort(self) -> bool:
+ if self._cancelled.is_set():
+ return True
+ if not self.mem_params.get(REQUEST_PARAM):
+ # request flag was removed out from under us -> user cancelled
+ self._cancelled.set()
+ return True
+ if self._abort_check is not None and self._abort_check():
+ self._cancelled.set()
+ return True
+ return False
+
+ def _publish_progress(self, region: str, downloaded: int, total: int, active: bool) -> None:
+ self.mem_params.put(PROGRESS_PARAM, {
+ "active": active,
+ "region": region,
+ "downloaded_bytes": int(downloaded),
+ "total_bytes": int(total),
+ })
+
+ def _download_one(self, selector: str, entry: dict, base_url: str,
+ progress_offset: int, progress_total: int) -> bool:
+ """Download a region: the night bundle, plus the optional day-style variant."""
+ night_path = region_bundle_path(selector)
+ ok = self._download_file(
+ selector, base_url, entry["path"], int(entry.get("bytes", 0)),
+ str(entry.get("sha256", "")).strip().lower(), night_path,
+ progress_offset, progress_total,
+ )
+ if not ok:
+ return False
+ if entry.get("day_path"):
+ day_ok = self._download_file(
+ selector, base_url, entry["day_path"], int(entry.get("day_bytes", 0)),
+ str(entry.get("day_sha256", "")).strip().lower(),
+ night_path.with_name("offline_day.mbtiles"),
+ progress_offset + int(entry.get("bytes", 0)), progress_total,
+ )
+ if not day_ok:
+ # the night set is complete and usable; a failed day variant retries next pass
+ cloudlog.warning(f"iq_maps: day-style bundle failed for {selector}; night set installed")
+ # manifest last: bounds drive region matching, so it must describe installed files
+ _write_manifest(selector, entry)
+ cloudlog.info(f"iq_maps: installed tile bundle {selector}")
+ return True
+
+ def _download_file(self, selector: str, base_url: str, remote_path: str, expected_bytes: int,
+ expected_sha: str, final_path: Path,
+ progress_offset: int, progress_total: int) -> bool:
+ url = f"{base_url}/{remote_path.lstrip('/')}"
+ part_path = final_path.with_name(final_path.name + ".part")
+ part_path.parent.mkdir(parents=True, exist_ok=True)
+
+ # A cellular/hotspot link routinely kills a multi-hundred-MB stream mid-flight; retry
+ # each interruption from the current .part offset instead of failing the whole region.
+ downloaded = 0
+ digest = hashlib.sha256()
+ last_error: Exception | None = None
+ for attempt in range(STREAM_RETRIES):
+ if self._should_abort():
+ cloudlog.warning(f"iq_maps: tile bundle download cancelled for {selector}")
+ return False
+ if attempt:
+ time.sleep(min(30.0, 2.0 * attempt))
+ try:
+ digest = hashlib.sha256()
+ resume_from = 0
+ if part_path.exists():
+ digest, resume_from = _hash_existing(part_path)
+ if expected_bytes and resume_from > expected_bytes:
+ part_path.unlink()
+ digest = hashlib.sha256()
+ resume_from = 0
+
+ headers = {"Range": f"bytes={resume_from}-"} if resume_from else {}
+ auth = request_auth()
+ response = self.session.get(url, headers=headers, stream=True, timeout=HTTP_TIMEOUT_S, auth=auth)
+ if resume_from and response.status_code != 206:
+ # server ignored the Range request -> restart from scratch
+ digest = hashlib.sha256()
+ resume_from = 0
+ part_path.unlink(missing_ok=True)
+ if response.status_code == 416:
+ response = self.session.get(url, stream=True, timeout=HTTP_TIMEOUT_S, auth=auth)
+ response.raise_for_status()
+
+ downloaded = resume_from
+ mode = "ab" if resume_from else "wb"
+ with open(part_path, mode) as f:
+ for chunk in response.iter_content(chunk_size=CHUNK_BYTES):
+ if self._should_abort():
+ cloudlog.warning(f"iq_maps: tile bundle download cancelled for {selector}")
+ return False
+ f.write(chunk)
+ digest.update(chunk)
+ downloaded += len(chunk)
+ self._publish_progress(selector, progress_offset + downloaded, progress_total, active=True)
+ break
+ except requests.RequestException as exc:
+ last_error = exc
+ cloudlog.warning(f"iq_maps: tile bundle stream interrupted for {selector} "
+ + f"(attempt {attempt + 1}/{STREAM_RETRIES}): {exc}")
+ else:
+ raise requests.RequestException(f"stream failed after {STREAM_RETRIES} attempts") from last_error
+
+ if expected_bytes and downloaded != expected_bytes:
+ cloudlog.error(f"iq_maps: tile bundle size mismatch for {selector}: {downloaded} != {expected_bytes}")
+ part_path.unlink(missing_ok=True)
+ return False
+ if expected_sha and digest.hexdigest() != expected_sha:
+ cloudlog.error(f"iq_maps: tile bundle sha256 mismatch for {selector}")
+ part_path.unlink(missing_ok=True)
+ return False
+
+ part_path.replace(final_path)
+ return True
+
+ def download_regions(self, selectors: list[str]) -> bool:
+ """Download the display-tile bundles for the given region selectors. Returns True if all
+ requested bundles are installed and current when done."""
+ self._cancelled.clear()
+ ok = True
+ try:
+ self.mem_params.put(REQUEST_PARAM, {"regions": list(selectors)})
+ regions = None
+ base_url = ""
+ for candidate in candidate_base_urls(self.params):
+ try:
+ regions = fetch_index(candidate, self.session)
+ base_url = candidate
+ break
+ except (requests.RequestException, ValueError, json.JSONDecodeError):
+ cloudlog.warning(f"iq_maps: tile bundle index unavailable at {candidate}")
+ if regions is None:
+ cloudlog.error("iq_maps: no tile bundle host reachable")
+ return False
+
+ wanted: list[tuple[str, dict]] = []
+ for selector in selectors:
+ entry = regions.get(selector)
+ if entry is None:
+ cloudlog.warning(f"iq_maps: no tile bundle published for {selector}")
+ ok = False
+ continue
+ if region_bundle_installed(selector) and self._installed_matches(selector, entry):
+ continue
+ wanted.append((selector, entry))
+
+ progress_total = sum(int(entry.get("bytes", 0)) + int(entry.get("day_bytes", 0)) for _, entry in wanted)
+ progress_offset = 0
+ for selector, entry in wanted:
+ if self._should_abort():
+ return False
+ try:
+ if not self._download_one(selector, entry, base_url, progress_offset, progress_total):
+ ok = False
+ except (requests.RequestException, OSError):
+ cloudlog.exception(f"iq_maps: tile bundle download failed for {selector}")
+ ok = False
+ progress_offset += int(entry.get("bytes", 0)) + int(entry.get("day_bytes", 0))
+ return ok
+ finally:
+ self._publish_progress("", 0, 0, active=False)
+ try:
+ self.mem_params.remove(REQUEST_PARAM)
+ except Exception:
+ pass
+
+ @staticmethod
+ def _installed_matches(selector: str, entry: dict) -> bool:
+ manifest_path = region_bundle_dir(selector) / "manifest.json"
+ try:
+ manifest = json.loads(manifest_path.read_text())
+ except (OSError, json.JSONDecodeError):
+ return False
+ installed_sha = str(manifest.get("mbtiles", {}).get("sha256", "")).strip().lower()
+ expected_sha = str(entry.get("sha256", "")).strip().lower()
+ if not expected_sha or installed_sha != expected_sha:
+ return False
+ if entry.get("day_path"):
+ # a published day variant must be installed and current too
+ day_file = region_bundle_dir(selector) / "tiles" / "offline_day.mbtiles"
+ installed_day = str(manifest.get("mbtiles_day", {}).get("sha256", "")).strip().lower()
+ expected_day = str(entry.get("day_sha256", "")).strip().lower()
+ if not day_file.exists() or installed_day != expected_day:
+ return False
+ return True
diff --git a/iqpilot/iq_maps/tiles_auth.py b/iqpilot/iq_maps/tiles_auth.py
new file mode 100644
index 000000000..e2dda81c9
--- /dev/null
+++ b/iqpilot/iq_maps/tiles_auth.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module
+
+try:
+ load_private_module(__name__, "iqpilot_private.maps.git_auth")
+except ProprietaryModuleMissing:
+ from iqpilot.maps_private_src.git_auth import * # noqa: F403
diff --git a/iqpilot/iq_maps/update_vendor_version.py b/iqpilot/iq_maps/update_vendor_version.py
new file mode 100755
index 000000000..13391ec9d
--- /dev/null
+++ b/iqpilot/iq_maps/update_vendor_version.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Maintainer utility: pin a new mapd release tag and refresh the checked-in binary
+hash. Not used at runtime. Binaries come from the gitlvb teal/mapd CI (built
+against teal/gomsgq) — drop the artifact at third_party/mapd_pfeiferj/mapd, then
+run this so the hash pin moves in the same commit.
+"""
+import argparse
+import os
+import re
+import sys
+
+from openpilot.common.basedir import BASEDIR
+from openpilot.iqpilot.iq_maps import VENDOR_MAPD_PATH
+from openpilot.iqpilot.iq_maps.vendor_mapd_installer import (
+ VENDOR_RELEASE_TAG,
+ sha256_of_file,
+)
+
+_RELEASE_SYMBOL = "VENDOR_RELEASE_TAG"
+_INSTALLER_SRC = os.path.join(BASEDIR, "iqpilot", "iq_maps", "vendor_mapd_installer.py")
+# public: the checked-in hash the version test compares the installed binary against
+HASH_FILE = os.path.join(BASEDIR, "iqpilot", "iq_maps", "tests", "mapd_hash")
+_HASH_FILE = HASH_FILE
+_TAG_ASSIGN = re.compile(rf'^{_RELEASE_SYMBOL}\s*=\s*["\'][^"\']*["\']', re.MULTILINE)
+
+
+def rewrite_pinned_tag(new_tag: str) -> bool:
+ with open(_INSTALLER_SRC) as f:
+ src = f.read()
+
+ patched, count = _TAG_ASSIGN.subn(f'{_RELEASE_SYMBOL} = "{new_tag}"', src, count=1)
+ if count != 1:
+ print(f"could not locate the {_RELEASE_SYMBOL} assignment in {_INSTALLER_SRC}; nothing written")
+ return False
+
+ with open(_INSTALLER_SRC, "w") as f:
+ f.write(patched)
+ print(f"pinned {_RELEASE_SYMBOL} -> {new_tag}")
+ return True
+
+
+def refresh_hash_file() -> None:
+ digest = sha256_of_file(VENDOR_MAPD_PATH)
+ with open(_HASH_FILE, "w") as f:
+ f.write(digest)
+ print(f"wrote binary hash {digest} -> {_HASH_FILE}")
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser(description="Pin a new mapd release tag and refresh its hash")
+ parser.add_argument("--new_ver", type=str, help='e.g. --new_ver "v2.1.0"')
+ args = parser.parse_args()
+
+ if not args.new_ver:
+ parser.print_help()
+ print(f'\ncurrently pinned: {VENDOR_RELEASE_TAG} (unchanged)')
+ return 0
+
+ target = args.new_ver.strip()
+ if target == VENDOR_RELEASE_TAG:
+ reply = input(f"{target} is already the pinned tag — re-run anyway? (y/N): ").strip().lower()
+ if reply != "y":
+ print("aborted; nothing changed")
+ return 0
+
+ if not rewrite_pinned_tag(target):
+ return 1
+ refresh_hash_file()
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/iqpilot/iq_maps/vendor_mapd_installer.py b/iqpilot/iq_maps/vendor_mapd_installer.py
new file mode 100755
index 000000000..3c4180059
--- /dev/null
+++ b/iqpilot/iq_maps/vendor_mapd_installer.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Verifies the vendored `mapd` routing binary authored by Jacob Pfeifer
+(github.com/pfeiferj/mapd), built from the gitlvb teal/mapd fork against
+teal/gomsgq. The only accepted binary is the checked-in one matching the pinned
+hash; nothing is ever downloaded at runtime. Jacob's stock release build embeds
+a 15-reader msgq header layout — on this fork (NUM_READERS=32) its registration
+writes land inside other processes' reader slots, so a wrong binary is
+quarantined rather than left where manager could start it.
+"""
+import hashlib
+import os
+import sys
+
+from openpilot.common.basedir import BASEDIR
+from openpilot.common.params import Params
+from openpilot.common.spinner import Spinner
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.iq_maps import VENDOR_MAPD_PATH
+import openpilot.system.sentry as sentry
+
+VENDOR_RELEASE_TAG = "v2.0.6-iq1"
+
+_VERSION_PARAM = "MapdVersion"
+_HASH_FILE = os.path.join(BASEDIR, "iqpilot", "iq_maps", "tests", "mapd_hash")
+QUARANTINE_PATH = VENDOR_MAPD_PATH + ".quarantined"
+
+
+def sha256_of_file(path: str) -> str:
+ """Hex SHA-256 digest of a file on disk."""
+ digest = hashlib.sha256()
+ with open(path, "rb") as handle:
+ for block in iter(lambda: handle.read(1 << 20), b""):
+ digest.update(block)
+ return digest.hexdigest()
+
+
+def stamp_vendor_version(version: str, params: Params | None = None) -> None:
+ (params or Params()).put(_VERSION_PARAM, version)
+
+
+class VendorMapdInstaller:
+ def __init__(self, spinner_ref: Spinner | None = None, params: Params | None = None):
+ self._spinner = spinner_ref
+ self._params = params if params is not None else Params()
+
+ def get_installed_version(self) -> str:
+ return str(self._params.get(_VERSION_PARAM) or "")
+
+ def verify(self) -> bool:
+ """True iff the on-disk binary matches the pinned hash; quarantines a wrong one."""
+ expected = self._expected_hash()
+ if not expected:
+ cloudlog.error("iq_maps: pinned mapd hash missing, vendor binary cannot be verified")
+ return False
+
+ if not os.path.isfile(VENDOR_MAPD_PATH):
+ # the binary is a tracked file: the updater/bundle restores it
+ self._say("Offline maps engine missing; it will be restored by the next update.")
+ self._params.remove(_VERSION_PARAM)
+ return False
+
+ try:
+ current = sha256_of_file(VENDOR_MAPD_PATH)
+ except OSError:
+ cloudlog.exception("iq_maps: vendor mapd unreadable")
+ return False
+
+ if current == expected:
+ stamp_vendor_version(VENDOR_RELEASE_TAG, self._params)
+ try:
+ os.remove(QUARANTINE_PATH)
+ except OSError:
+ pass
+ self._say(f"Offline maps engine verified [{VENDOR_RELEASE_TAG}]")
+ return True
+
+ # a foreign binary — e.g. a stock release download from the retired fetch
+ # path — must never run: quarantine it where manager can't start it
+ cloudlog.error(f"iq_maps: vendor mapd hash {current[:12]} != pinned {expected[:12]}, quarantining")
+ self._say("Offline maps engine failed verification; quarantined until the next update.")
+ try:
+ os.replace(VENDOR_MAPD_PATH, QUARANTINE_PATH)
+ except OSError:
+ cloudlog.exception("iq_maps: vendor mapd quarantine failed")
+ return False
+ self._params.remove(_VERSION_PARAM)
+ try:
+ raise RuntimeError(f"vendor mapd hash mismatch quarantined: {current}")
+ except RuntimeError as exc:
+ sentry.init(sentry.SentryProject.SELFDRIVE)
+ sentry.capture_exception(exc)
+ return False
+
+ def _expected_hash(self) -> str:
+ try:
+ with open(_HASH_FILE) as f:
+ return f.read().strip()
+ except OSError:
+ return ""
+
+ def _say(self, text: str) -> None:
+ if self._spinner is not None:
+ self._spinner.update(text)
+
+
+if __name__ == "__main__":
+ spinner = Spinner()
+ ok = VendorMapdInstaller(spinner).verify()
+ spinner.close()
+ sys.exit(0 if ok else 1)
diff --git a/iqpilot/iq_maps/version.py b/iqpilot/iq_maps/version.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/iqpilot_iq_nnff_models/neural_network_lateral_control/.gitkeep b/iqpilot/iqpilot_iq_nnff_models/neural_network_lateral_control/.gitkeep
new file mode 100644
index 000000000..03cd105ca
--- /dev/null
+++ b/iqpilot/iqpilot_iq_nnff_models/neural_network_lateral_control/.gitkeep
@@ -0,0 +1,2 @@
+# NNFF models removed pending retraining on user data.
+# latcontrol_torque skips NNFF entirely when this dir has no matching model.
diff --git a/iqpilot/konn3kt/__init__.py b/iqpilot/konn3kt/__init__.py
new file mode 100644
index 000000000..148992e3f
--- /dev/null
+++ b/iqpilot/konn3kt/__init__.py
@@ -0,0 +1,4 @@
+#!/usr/bin/env python3
+"""
+Copyright ©️ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
\ No newline at end of file
diff --git a/iqpilot/konn3kt/canlive/__init__.py b/iqpilot/konn3kt/canlive/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/konn3kt/canlive/canlived.py b/iqpilot/konn3kt/canlive/canlived.py
new file mode 100755
index 000000000..2cebdeec8
--- /dev/null
+++ b/iqpilot/konn3kt/canlive/canlived.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+"""
+canlived — live CAN bridge to konn3kt.
+
+Streams the device's live CAN bus to the konn3kt server so it can be viewed remotely
+in Cabana (via a local ZMQ proxy on the laptop). This is the remote analogue of running
+`./cereal/messaging/bridge` locally: instead of re-publishing CAN over a LAN ZMQ socket,
+canlived opens its OWN websocket to konn3kt and forwards the raw capnp `Event` frames.
+
+It is deliberately a separate daemon (not part of hephaestusd's control websocket):
+ * hephaestusd's send path fragments everything as TEXT frames through one queue, which
+ cannot carry binary capnp and would head-of-line-block the control plane at 100Hz.
+ * a dedicated socket means CAN traffic and control traffic never contend.
+
+Lifecycle: the manager launches canlived only while the `CanLiveStreaming` param is set.
+hephaestusd sets/clears that param via startCanLive/stopCanLive, which the konn3kt server
+calls when the first viewer connects / the last viewer disconnects. So canlived runs only
+during an active debug session — no idle connections, no battery/data cost otherwise.
+
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved.
+"""
+import os
+import threading
+
+from websocket import ABNF, create_connection
+
+import cereal.messaging as messaging
+from openpilot.common.api import Api
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+
+# Cabana's live "Device" stream subscribes only to "can", so that's all we forward to
+# match the local experience exactly. (sendcan/TX is not shown by the live device view.)
+CAN_SERVICES = ["can"]
+
+# Reconnect backoff bounds (seconds).
+RECONNECT_MIN = 1.0
+RECONNECT_MAX = 10.0
+
+
+def _api_host() -> str:
+ # Same host hephaestusd talks to; force the websocket scheme.
+ host = os.getenv("HEPHAESTUS_HOST") or os.getenv("KONN3KT_API_HOST") or "wss://api-iqlabs.konn3kt.com"
+ host = host.rstrip("/")
+ if host.startswith("https://"):
+ host = "wss://" + host[len("https://"):]
+ elif host.startswith("http://"):
+ host = "ws://" + host[len("http://"):]
+ return host
+
+
+def _stream_once(dongle_id: str, ws_uri: str, token: str, exit_event: threading.Event) -> None:
+ """Open one websocket and pump CAN until it drops or we're asked to exit."""
+ ws = create_connection(ws_uri, cookie="jwt=" + token, enable_multithread=True, timeout=30.0)
+ cloudlog.info("canlived: connected to %s", ws_uri)
+ try:
+ # Blocking receive with a short timeout so we periodically re-check exit_event and
+ # the socket stays responsive to shutdown even when the bus is quiet.
+ socks = [messaging.sub_sock(s, conflate=False, timeout=100) for s in CAN_SERVICES]
+ while not exit_event.is_set():
+ got_any = False
+ for sock in socks:
+ while True:
+ raw = sock.receive(non_blocking=True)
+ if raw is None:
+ break
+ got_any = True
+ # Forward the exact capnp Event bytes as a single binary frame. canlived owns
+ # this socket, so there is no fragmentation/interleaving to worry about.
+ ws.send_frame(ABNF.create_frame(raw, ABNF.OPCODE_BINARY, 1))
+ if not got_any:
+ # Nothing pending across any sub — yield briefly instead of busy-spinning.
+ exit_event.wait(0.005)
+ finally:
+ try:
+ ws.close()
+ except Exception:
+ pass
+
+
+def main(exit_event: threading.Event | None = None) -> None:
+ if exit_event is None:
+ exit_event = threading.Event()
+
+ params = Params()
+ dongle_id = params.get("DongleId", encoding="utf-8")
+ if not dongle_id:
+ cloudlog.error("canlived: no DongleId, cannot stream")
+ return
+
+ api = Api(dongle_id)
+ host = _api_host()
+ ws_uri = f"{host}/ws/can/{dongle_id}"
+
+ backoff = RECONNECT_MIN
+ while not exit_event.is_set():
+ try:
+ token = api.get_token(expiry_hours=1)
+ _stream_once(dongle_id, ws_uri, token, exit_event)
+ backoff = RECONNECT_MIN # clean disconnect, reset backoff
+ except Exception as e:
+ cloudlog.exception("canlived: stream error: %s", e)
+ exit_event.wait(backoff)
+ backoff = min(backoff * 2, RECONNECT_MAX)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/konn3kt/cloud_client.py b/iqpilot/konn3kt/cloud_client.py
new file mode 100644
index 000000000..7edac194e
--- /dev/null
+++ b/iqpilot/konn3kt/cloud_client.py
@@ -0,0 +1,17 @@
+"""
+Copyright ©️ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+
+import os
+from openpilot.common.api.base import BaseApi
+API_HOST = os.getenv('KONN3KT_API_HOST', 'https://api-iqlabs.konn3kt.com')
+
+class Konn3ktApi(BaseApi):
+
+ def __init__(self, dongle_id):
+ super().__init__(dongle_id, API_HOST)
+ self.user_agent = "konn3kt-device-"
+
+ def get_token(self, expiry_hours=1):
+ return super()._get_token(expiry_hours=expiry_hours)
diff --git a/iqpilot/konn3kt/common/__init__.py b/iqpilot/konn3kt/common/__init__.py
new file mode 100644
index 000000000..3cd07e084
--- /dev/null
+++ b/iqpilot/konn3kt/common/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright ©️ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
\ No newline at end of file
diff --git a/iqpilot/konn3kt/common/param_codec.py b/iqpilot/konn3kt/common/param_codec.py
new file mode 100644
index 000000000..a8906287f
--- /dev/null
+++ b/iqpilot/konn3kt/common/param_codec.py
@@ -0,0 +1,53 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Serialises openpilot params to/from their on-wire byte form for backup transport.
+The byte encoding is unchanged so archives round-trip: BYTES pass through, JSON is
+json-encoded, everything else is str()'d; decoding is typed per the param's key.
+"""
+import base64
+import gzip
+import json
+
+from openpilot.common.params import Params, ParamKeyType
+
+
+def encode_param(name: str, params=None, use_default: bool = False) -> bytes | None:
+ params = params or Params()
+ raw = params.get_default_value(name) if use_default else params.get(name)
+ if raw is None:
+ return None
+
+ ktype = params.get_type(name)
+ if ktype == ParamKeyType.BYTES:
+ return bytes(raw)
+ if ktype == ParamKeyType.JSON:
+ return json.dumps(raw).encode("utf-8")
+ return str(raw).encode("utf-8")
+
+
+# text-form decoders keyed by param type; anything unlisted is left as the raw string
+_FROM_TEXT = {
+ ParamKeyType.STRING: lambda s: s,
+ ParamKeyType.BOOL: lambda s: s.lower() in ("true", "1", "yes"),
+ ParamKeyType.INT: int,
+ ParamKeyType.FLOAT: float,
+ ParamKeyType.TIME: str,
+ ParamKeyType.JSON: json.loads,
+}
+
+
+def restore_param_from_base64(name: str, b64_data: str, compressed: bool = False) -> None:
+ params = Params()
+ ktype = params.get_type(name)
+
+ blob = base64.b64decode(b64_data)
+ if compressed:
+ blob = gzip.decompress(blob)
+
+ if ktype == ParamKeyType.BYTES:
+ value = blob
+ else:
+ value = _FROM_TEXT.get(ktype, lambda s: s)(blob.decode("utf-8"))
+
+ params.put(name, value)
diff --git a/iqpilot/konn3kt/hephaestus/__init__.py b/iqpilot/konn3kt/hephaestus/__init__.py
new file mode 100644
index 000000000..148992e3f
--- /dev/null
+++ b/iqpilot/konn3kt/hephaestus/__init__.py
@@ -0,0 +1,4 @@
+#!/usr/bin/env python3
+"""
+Copyright ©️ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
\ No newline at end of file
diff --git a/iqpilot/konn3kt/hephaestus/ble_transportd.py b/iqpilot/konn3kt/hephaestus/ble_transportd.py
new file mode 100644
index 000000000..92f492a89
--- /dev/null
+++ b/iqpilot/konn3kt/hephaestus/ble_transportd.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import logging
+
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+
+_ORIGINAL_LOGGER_LOG = logging.Logger._log
+
+
+def _ble_transport_logger_shim(self, level, msg, args,
+ exc_info=None, extra=None, stack_info=False, stacklevel=1, **kwargs):
+ if kwargs:
+ suffix = " ".join(f"{key}={value!r}" for key, value in sorted(kwargs.items()))
+ msg = f"{msg} {suffix}".strip() if msg is not None else suffix
+ return _ORIGINAL_LOGGER_LOG(
+ self, level, msg, args,
+ exc_info=exc_info, extra=extra, stack_info=stack_info, stacklevel=stacklevel,
+ )
+
+
+logging.Logger._log = _ble_transport_logger_shim
+
+load_private_module(__name__, "iqpilot_private.konn3kt.hephaestus.ble_transportd")
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/konn3kt/hephaestus/hephaestusd.py b/iqpilot/konn3kt/hephaestus/hephaestusd.py
new file mode 100644
index 000000000..b4b659123
--- /dev/null
+++ b/iqpilot/konn3kt/hephaestus/hephaestusd.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.konn3kt.hephaestus.hephaestusd")
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/konn3kt/hephaestus/manage_hephaestusd.py b/iqpilot/konn3kt/hephaestus/manage_hephaestusd.py
new file mode 100644
index 000000000..fa751021d
--- /dev/null
+++ b/iqpilot/konn3kt/hephaestus/manage_hephaestusd.py
@@ -0,0 +1,122 @@
+"""
+Copyright ©️ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import importlib
+import os
+import time
+from multiprocessing import Process
+
+HEPHAESTUS_MGR_PID_PARAM = "HephaestusdPid"
+
+
+def _cloudlog():
+ try:
+ from openpilot.common.swaglog import cloudlog
+ return cloudlog
+ except Exception:
+ return None
+
+
+def _log(level: str, msg: str) -> None:
+ cl = _cloudlog()
+ if cl is not None:
+ try:
+ getattr(cl, level)(msg)
+ return
+ except Exception:
+ pass
+ try:
+ print(f"manage_hephaestusd[{level}]: {msg}", flush=True)
+ except Exception:
+ pass
+
+
+def _lightweight_launcher(proc: str, name: str) -> None:
+ try:
+ mod = importlib.import_module(proc)
+ try:
+ from setproctitle import setproctitle
+ setproctitle(proc)
+ except Exception:
+ pass
+ cl = _cloudlog()
+ if cl is not None:
+ try:
+ cl.bind(daemon=name)
+ except Exception:
+ pass
+ mod.main()
+ except KeyboardInterrupt:
+ _log("warning", f"child {proc} got SIGINT")
+ except Exception:
+ _log("exception", f"child {proc} exception")
+ raise
+
+
+def _bind_global_best_effort(dongle_id_param: str) -> None:
+ try:
+ from openpilot.common.params import Params
+ from openpilot.common.swaglog import cloudlog
+ from openpilot.system.hardware import HARDWARE
+ except Exception:
+ return
+ try:
+ dongle_id = Params().get(dongle_id_param)
+ try:
+ from openpilot.system.version import get_build_metadata
+ build_metadata = get_build_metadata()
+ cloudlog.bind_global(dongle_id=dongle_id,
+ version=build_metadata.openpilot.version,
+ origin=build_metadata.openpilot.git_normalized_origin,
+ branch=build_metadata.channel,
+ commit=build_metadata.openpilot.git_commit,
+ dirty=build_metadata.openpilot.is_dirty,
+ device=HARDWARE.get_device_type())
+ except Exception:
+ cloudlog.bind_global(dongle_id=dongle_id, device=HARDWARE.get_device_type())
+ except Exception:
+ pass
+
+
+def _remove_pid_param(pid_param: str) -> None:
+ try:
+ from openpilot.common.params import Params
+ Params().remove(pid_param)
+ except Exception:
+ pass
+
+
+def manage_hephaestusd(dongle_id_param: str, pid_param: str, process_name: str, target: str) -> None:
+ _bind_global_best_effort(dongle_id_param)
+
+ try:
+ while 1:
+ _log("info", f"starting {process_name} daemon")
+ proc = Process(name=process_name, target=_lightweight_launcher, args=(target, process_name))
+ proc.start()
+ # Lower priority so BLE stack doesn't compete with OP's Python processes
+ # on an already heavily loaded system (RT processes like pandad/modeld are unaffected)
+ if proc.pid is not None:
+ try:
+ os.setpriority(os.PRIO_PROCESS, proc.pid, 10)
+ except OSError:
+ pass
+ proc.join()
+ _log("info", f"{process_name} exited (exitcode={proc.exitcode})")
+ if proc.exitcode == 174:
+ time.sleep(30)
+ else:
+ time.sleep(5)
+ except Exception:
+ _log("exception", f"manage_{process_name}.exception")
+ finally:
+ _remove_pid_param(pid_param)
+
+
+def main():
+ manage_hephaestusd(dongle_id_param="DongleId", pid_param=HEPHAESTUS_MGR_PID_PARAM, process_name="hephaestusd",
+ target="iqpilot.konn3kt.hephaestus.hephaestusd")
+
+
+if __name__ == '__main__':
+ main()
diff --git a/iqpilot/konn3kt/iqlvbs/__init__.py b/iqpilot/konn3kt/iqlvbs/__init__.py
new file mode 100644
index 000000000..bc540dc14
--- /dev/null
+++ b/iqpilot/konn3kt/iqlvbs/__init__.py
@@ -0,0 +1,4 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/konn3kt/iqlvbs/alc.py b/iqpilot/konn3kt/iqlvbs/alc.py
new file mode 100644
index 000000000..f2d9beb6d
--- /dev/null
+++ b/iqpilot/konn3kt/iqlvbs/alc.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.konn3kt.iqlvbs.alc")
diff --git a/iqpilot/konn3kt/iqlvbs/git_remote.py b/iqpilot/konn3kt/iqlvbs/git_remote.py
new file mode 100644
index 000000000..18fc28369
--- /dev/null
+++ b/iqpilot/konn3kt/iqlvbs/git_remote.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Public shim for the proprietary IQ.Lvbs git read-auth helper.
+
+The token + git config logic live in the standalone, signed bundle
+``iqpilot_private.updater.git_remote`` (artifact iqpilot_updater_private) -- a
+dedicated bundle so the read-only PAT can be rotated by rebuilding only that tiny
+bundle, never touching ALC. Never in the open tree.
+
+The private module exports:
+ configure(repo_dir: str) -> None
+ Install the read-only token as an ephemeral http..extraHeader on
+ repo_dir (the only auth method that survives the WAF's 403-to-anonymous).
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.updater.git_remote")
diff --git a/iqpilot/konn3kt/registration.py b/iqpilot/konn3kt/registration.py
new file mode 100755
index 000000000..45cf610c6
--- /dev/null
+++ b/iqpilot/konn3kt/registration.py
@@ -0,0 +1,236 @@
+#!/usr/bin/env python3
+import os
+import time
+import json
+import jwt
+import re
+import secrets
+from typing import cast
+from pathlib import Path
+
+from datetime import datetime, timedelta, UTC
+from openpilot.common.api import api_get, get_key_pair
+from openpilot.common.params import Params
+from openpilot.common.spinner import Spinner
+from openpilot.system.hardware import HARDWARE, PC
+from openpilot.system.hardware.hw import Paths
+from openpilot.common.swaglog import cloudlog
+
+
+UNREGISTERED_DONGLE_ID = "UnregisteredDevice"
+
+_DONGLE_ID_RE = re.compile(r"^[a-fA-F0-9]{16}$")
+IMEI_WAIT_TIMEOUT = 15.0
+
+
+def _read_persist_dongle_id() -> str | None:
+ p = Path(Paths.persist_root()) / "comma" / "dongle_id"
+ try:
+ if not p.is_file():
+ return None
+ s = p.read_text().strip()
+ return s or None
+ except Exception:
+ cloudlog.exception("failed to read persist dongle_id")
+ return None
+
+
+def get_cached_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str | None:
+ ro = _read_persist_dongle_id()
+ if is_valid_dongle_id(ro):
+ ro = ro.lower()
+ if prefer_readonly and ro:
+ return ro
+ p = Params() if params is None else params
+ v = p.get("DongleId")
+ if v and v != UNREGISTERED_DONGLE_ID:
+ return v.lower() if is_valid_dongle_id(v) else v
+ return ro or None
+def is_valid_dongle_id(dongle_id: str | None) -> bool:
+ return bool(dongle_id and _DONGLE_ID_RE.fullmatch(dongle_id))
+def get_or_create_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str:
+ p = Params() if params is None else params
+ dongle_id = get_cached_dongle_id(p, prefer_readonly=prefer_readonly)
+ if dongle_id and dongle_id != UNREGISTERED_DONGLE_ID:
+ return dongle_id
+ dongle_id = secrets.token_hex(8)
+ p.put("DongleId", dongle_id)
+ cloudlog.warning(f"generated new DongleId={dongle_id} (no readonly dongle_id found)")
+ return dongle_id
+def ensure_dev_pairing_identity(params: Params | None = None, force_reset: bool = False) -> dict[str, str]:
+ p = Params() if params is None else params
+
+ persist_dir = Path(Paths.persist_root()) / "comma"
+ persist_dir.mkdir(parents=True, exist_ok=True)
+
+ dongle_path = persist_dir / "dongle_id"
+ priv_path = persist_dir / "id_rsa"
+ pub_path = persist_dir / "id_rsa.pub"
+
+ if force_reset:
+ for fp in (dongle_path, priv_path, pub_path):
+ try:
+ fp.unlink(missing_ok=True)
+ except Exception:
+ cloudlog.exception(f"failed to remove {fp}")
+ try:
+ (persist_dir / "konn3kt_prime_type").unlink(missing_ok=True)
+ except Exception:
+ pass
+ try:
+ p.remove("PrimeType")
+ except Exception:
+ pass
+ forced_dongle = os.getenv("KONN3KT_DEV_DONGLE_ID")
+ dongle_id = forced_dongle.strip().lower() if forced_dongle else None
+ if dongle_id and not is_valid_dongle_id(dongle_id):
+ cloudlog.error("KONN3KT_DEV_DONGLE_ID must be 16 hex chars")
+ dongle_id = None
+ if dongle_id is None:
+ existing = None
+ try:
+ existing = dongle_path.read_text().strip().lower() if dongle_path.is_file() else None
+ except Exception:
+ cloudlog.exception("failed reading existing dev dongle_id")
+ dongle_id = existing if is_valid_dongle_id(existing) else secrets.token_hex(8)
+ try:
+ dongle_path.write_text(dongle_id)
+ except Exception:
+ cloudlog.exception("failed writing dev dongle_id")
+ p.put("DongleId", dongle_id)
+ p.put("HardwareSerial", p.get("HardwareSerial") or f"DEV-{dongle_id}")
+ if force_reset or (not priv_path.is_file()) or (not pub_path.is_file()):
+ try:
+ from cryptography.hazmat.primitives import serialization
+ from cryptography.hazmat.primitives.asymmetric import rsa
+ key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
+ priv_bytes = key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
+ encryption_algorithm=serialization.NoEncryption(),
+ )
+ pub_bytes = key.public_key().public_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PublicFormat.SubjectPublicKeyInfo,
+ )
+ priv_path.write_bytes(priv_bytes)
+ pub_path.write_bytes(pub_bytes)
+ except Exception:
+ cloudlog.exception("failed generating dev RSA keys")
+ raise
+ return {
+ "dongle_id": dongle_id,
+ "serial": p.get("HardwareSerial") or f"DEV-{dongle_id}",
+ "persist_dir": str(persist_dir),
+ }
+def is_registered_device() -> bool:
+ dongle = Params().get("DongleId")
+ return dongle not in (None, UNREGISTERED_DONGLE_ID)
+
+
+def _normalize_imei(value: str | None) -> str:
+ return value or ""
+
+
+def get_registration_identifiers(wait_timeout: float = IMEI_WAIT_TIMEOUT, show_spinner: bool = False) -> tuple[str, str, str]:
+ serial = HARDWARE.get_serial()
+ spinner = Spinner() if show_spinner else None
+ start_time = time.monotonic()
+ imei1: str | None = None
+ imei2: str | None = None
+
+ while time.monotonic() - start_time < wait_timeout:
+ try:
+ imei1, imei2 = HARDWARE.get_imei(0), HARDWARE.get_imei(1)
+ if imei1 or imei2:
+ break
+ except RuntimeError as e:
+ if "no modems" in str(e).lower():
+ cloudlog.warning("No cellular modem available, proceeding without IMEI")
+ break
+ cloudlog.exception("Error getting imei, trying again...")
+ except Exception:
+ cloudlog.exception("Error getting imei, trying again...")
+ time.sleep(1)
+
+ imei1 = _normalize_imei(imei1)
+ imei2 = _normalize_imei(imei2)
+
+ if not imei1 and not imei2:
+ cloudlog.warning(f"proceeding with serial-only registration for serial={serial}")
+ if spinner is not None:
+ spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})")
+ spinner.close()
+
+ return serial, imei1, imei2
+
+
+def register(show_spinner=False) -> str | None:
+ """
+ All devices built since March 2024 come with all
+ info stored in /persist/. This is kept around
+ only for devices built before then.
+
+ With a backend update to take serial number instead
+ of dongle ID to some endpoints, this can be removed
+ entirely.
+ """
+ params = Params()
+
+ dongle_id: str | None = get_cached_dongle_id(params, prefer_readonly=True)
+ if dongle_id in ("", UNREGISTERED_DONGLE_ID):
+ dongle_id = None
+
+ # Create registration token, in the future, this key will make JWTs directly
+ jwt_algo, private_key, public_key = get_key_pair()
+
+ if not public_key:
+ dongle_id = UNREGISTERED_DONGLE_ID
+ cloudlog.warning("missing public key")
+ elif dongle_id is None:
+ if show_spinner:
+ spinner = Spinner()
+ spinner.update("registering device")
+
+ serial, imei1, imei2 = get_registration_identifiers(wait_timeout=IMEI_WAIT_TIMEOUT, show_spinner=False)
+
+ backoff = 0
+ start_time = time.monotonic()
+ while True:
+ try:
+ register_token = jwt.encode({'register': True, 'exp': datetime.now(UTC).replace(tzinfo=None) + timedelta(hours=1)},
+ cast(str, private_key), algorithm=jwt_algo)
+ cloudlog.info("getting pilotauth")
+ cloudlog.info("getting pilotauth")
+ resp = api_get("v2/pilotauth/", method='POST', timeout=15,
+ imei=imei1, imei2=imei2, serial=serial, public_key=public_key, register_token=register_token)
+
+ if resp.status_code in (400, 402, 403):
+ cloudlog.info(f"Unable to register device, got {resp.status_code}")
+ dongle_id = UNREGISTERED_DONGLE_ID
+ else:
+ dongleauth = json.loads(resp.text)
+ dongle_id = dongleauth["dongle_id"]
+ break
+ except Exception:
+ cloudlog.exception("failed to authenticate")
+ backoff = min(backoff + 1, 15)
+ time.sleep(backoff)
+
+ if time.monotonic() - start_time > 60 and show_spinner:
+ spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})")
+ return UNREGISTERED_DONGLE_ID # hotfix to prevent an infinite wait for registration
+
+ if show_spinner:
+ spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})")
+ spinner.close()
+
+ if dongle_id:
+ params.put("DongleId", dongle_id)
+ from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert # lazy: keeps registration import light for the setup zipapp
+ set_offroad_alert("Offroad_UnregisteredHardware", False)
+ return dongle_id
+
+
+if __name__ == "__main__":
+ print(register())
diff --git a/iqpilot/konn3kt/service_health.py b/iqpilot/konn3kt/service_health.py
new file mode 100644
index 000000000..848978c1e
--- /dev/null
+++ b/iqpilot/konn3kt/service_health.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python3
+"""
+Copyright ©️ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+def hephaestus_ready(params=None) -> bool:
+ return True
+
+
+def hephaestus_ready_shim():
+ return hephaestus_ready()
\ No newline at end of file
diff --git a/iqpilot/konn3kt/tests/test_registration.py b/iqpilot/konn3kt/tests/test_registration.py
new file mode 100644
index 000000000..4ec92ccbd
--- /dev/null
+++ b/iqpilot/konn3kt/tests/test_registration.py
@@ -0,0 +1,41 @@
+from unittest.mock import patch
+
+from openpilot.iqpilot.konn3kt import registration
+
+
+def test_get_registration_identifiers_uses_serial_without_imei():
+ imei_calls = {"count": 0}
+
+ def fake_get_imei(slot: int) -> str | None:
+ imei_calls["count"] += 1
+ return None
+
+ monotonic_values = iter([0.0, 0.0, 1.0, 2.0])
+ with patch.object(registration.HARDWARE, "get_serial", return_value="lite123"), \
+ patch.object(registration.HARDWARE, "get_imei", side_effect=fake_get_imei), \
+ patch.object(registration.time, "monotonic", side_effect=lambda: next(monotonic_values)), \
+ patch.object(registration.time, "sleep", return_value=None):
+ serial, imei1, imei2 = registration.get_registration_identifiers(wait_timeout=1.5, show_spinner=False)
+
+ assert serial == "lite123"
+ assert imei1 == ""
+ assert imei2 == ""
+ assert imei_calls["count"] >= 2
+
+
+def test_get_registration_identifiers_returns_first_available_imei():
+ imeis = [None, "123456789012345"]
+ monotonic_values = iter([0.0, 0.0, 0.5, 0.5])
+
+ def fake_get_imei(slot: int) -> str | None:
+ return imeis.pop(0) if slot == 0 else None
+
+ with patch.object(registration.HARDWARE, "get_serial", return_value="lite123"), \
+ patch.object(registration.HARDWARE, "get_imei", side_effect=fake_get_imei), \
+ patch.object(registration.time, "monotonic", side_effect=lambda: next(monotonic_values)), \
+ patch.object(registration.time, "sleep", return_value=None):
+ serial, imei1, imei2 = registration.get_registration_identifiers(wait_timeout=2.0, show_spinner=False)
+
+ assert serial == "lite123"
+ assert imei1 == "123456789012345"
+ assert imei2 == ""
diff --git a/iqpilot/konn3kt/uploaderd/__init__.py b/iqpilot/konn3kt/uploaderd/__init__.py
new file mode 100644
index 000000000..527899e5f
--- /dev/null
+++ b/iqpilot/konn3kt/uploaderd/__init__.py
@@ -0,0 +1 @@
+"""Public wrappers for proprietary uploader modules."""
diff --git a/iqpilot/konn3kt/uploaderd/iquploaderd.py b/iqpilot/konn3kt/uploaderd/iquploaderd.py
new file mode 100644
index 000000000..dd11382c1
--- /dev/null
+++ b/iqpilot/konn3kt/uploaderd/iquploaderd.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.konn3kt.uploaderd.iquploaderd")
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/modeld/__init__.py b/iqpilot/modeld/__init__.py
new file mode 100644
index 000000000..366a299b9
--- /dev/null
+++ b/iqpilot/modeld/__init__.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.config import * # noqa: F401,F403
diff --git a/iqpilot/modeld/constants.py b/iqpilot/modeld/constants.py
new file mode 100644
index 000000000..366a299b9
--- /dev/null
+++ b/iqpilot/modeld/constants.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.config import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/__init__.py b/iqpilot/modeld/runners/__init__.py
new file mode 100644
index 000000000..a41962569
--- /dev/null
+++ b/iqpilot/modeld/runners/__init__.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/constants.py b/iqpilot/modeld/runners/constants.py
new file mode 100644
index 000000000..a41962569
--- /dev/null
+++ b/iqpilot/modeld/runners/constants.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/helpers.py b/iqpilot/modeld/runners/helpers.py
new file mode 100644
index 000000000..a41962569
--- /dev/null
+++ b/iqpilot/modeld/runners/helpers.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/model_runner.py b/iqpilot/modeld/runners/model_runner.py
new file mode 100644
index 000000000..a41962569
--- /dev/null
+++ b/iqpilot/modeld/runners/model_runner.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/onnx/__init__.py b/iqpilot/modeld/runners/onnx/__init__.py
new file mode 100644
index 000000000..e5a0d9b48
--- /dev/null
+++ b/iqpilot/modeld/runners/onnx/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python3
diff --git a/iqpilot/modeld/runners/onnx/onnx_runner.py b/iqpilot/modeld/runners/onnx/onnx_runner.py
new file mode 100644
index 000000000..7b8d7201a
--- /dev/null
+++ b/iqpilot/modeld/runners/onnx/onnx_runner.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.onnx.onnx_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/tinygrad/__init__.py b/iqpilot/modeld/runners/tinygrad/__init__.py
new file mode 100644
index 000000000..e5a0d9b48
--- /dev/null
+++ b/iqpilot/modeld/runners/tinygrad/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python3
diff --git a/iqpilot/modeld/runners/tinygrad/fused_runner.py b/iqpilot/modeld/runners/tinygrad/fused_runner.py
new file mode 100644
index 000000000..239fbf129
--- /dev/null
+++ b/iqpilot/modeld/runners/tinygrad/fused_runner.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.fused_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/tinygrad/model_types.py b/iqpilot/modeld/runners/tinygrad/model_types.py
new file mode 100644
index 000000000..af1e3e857
--- /dev/null
+++ b/iqpilot/modeld/runners/tinygrad/model_types.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.model_types import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/tinygrad/supercombo_runner.py b/iqpilot/modeld/runners/tinygrad/supercombo_runner.py
new file mode 100644
index 000000000..f6185e837
--- /dev/null
+++ b/iqpilot/modeld/runners/tinygrad/supercombo_runner.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import * # noqa: F401,F403
diff --git a/iqpilot/modeld/runners/tinygrad/tinygrad_runner.py b/iqpilot/modeld/runners/tinygrad/tinygrad_runner.py
new file mode 100644
index 000000000..e94b47d5d
--- /dev/null
+++ b/iqpilot/modeld/runners/tinygrad/tinygrad_runner.py
@@ -0,0 +1,2 @@
+#!/usr/bin/env python3
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import * # noqa: F401,F403
diff --git a/iqpilot/navd/__init__.py b/iqpilot/navd/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/navd/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/navd/event_builder.py b/iqpilot/navd/event_builder.py
new file mode 100644
index 000000000..f3da51fd4
--- /dev/null
+++ b/iqpilot/navd/event_builder.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.event_builder")
diff --git a/iqpilot/navd/helpers.py b/iqpilot/navd/helpers.py
new file mode 100644
index 000000000..0cd6a4fcf
--- /dev/null
+++ b/iqpilot/navd/helpers.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.helpers")
diff --git a/iqpilot/navd/iq_maps_bridge.py b/iqpilot/navd/iq_maps_bridge.py
new file mode 100644
index 000000000..f8d09ff5e
--- /dev/null
+++ b/iqpilot/navd/iq_maps_bridge.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.iqmapd")
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/navd/long_decel.py b/iqpilot/navd/long_decel.py
new file mode 100644
index 000000000..978c0a67d
--- /dev/null
+++ b/iqpilot/navd/long_decel.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.long_decel")
diff --git a/iqpilot/navd/mapbox_client.py b/iqpilot/navd/mapbox_client.py
new file mode 100644
index 000000000..3f62e6684
--- /dev/null
+++ b/iqpilot/navd/mapbox_client.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.mapbox_client")
diff --git a/iqpilot/navd/nav_cameras.py b/iqpilot/navd/nav_cameras.py
new file mode 100644
index 000000000..24e130898
--- /dev/null
+++ b/iqpilot/navd/nav_cameras.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.nav_cameras")
diff --git a/iqpilot/navd/navd.py b/iqpilot/navd/navd.py
new file mode 100644
index 000000000..89e17b2f4
--- /dev/null
+++ b/iqpilot/navd/navd.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.navd")
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/navd/navrenderd.py b/iqpilot/navd/navrenderd.py
new file mode 100644
index 000000000..7dbe6fc40
--- /dev/null
+++ b/iqpilot/navd/navrenderd.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.navrenderd")
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/navd/osm_cameras.py b/iqpilot/navd/osm_cameras.py
new file mode 100644
index 000000000..45ddec5dc
--- /dev/null
+++ b/iqpilot/navd/osm_cameras.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.osm_cameras")
diff --git a/iqpilot/navd/reroute.py b/iqpilot/navd/reroute.py
new file mode 100644
index 000000000..488d4328f
--- /dev/null
+++ b/iqpilot/navd/reroute.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.reroute")
diff --git a/iqpilot/navd/route_manager.py b/iqpilot/navd/route_manager.py
new file mode 100644
index 000000000..897c6c8a1
--- /dev/null
+++ b/iqpilot/navd/route_manager.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.route_manager")
diff --git a/iqpilot/navd/runtime_common.py b/iqpilot/navd/runtime_common.py
new file mode 100644
index 000000000..bf1a33870
--- /dev/null
+++ b/iqpilot/navd/runtime_common.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.runtime_common")
diff --git a/iqpilot/navd/turn_desire.py b/iqpilot/navd/turn_desire.py
new file mode 100644
index 000000000..313652517
--- /dev/null
+++ b/iqpilot/navd/turn_desire.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.turn_desire")
diff --git a/iqpilot/navd/web_server.py b/iqpilot/navd/web_server.py
new file mode 100644
index 000000000..7382b047e
--- /dev/null
+++ b/iqpilot/navd/web_server.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import load_private_module
+
+load_private_module(__name__, "iqpilot_private.navd.web_server")
diff --git a/iqpilot/sab/__init__.py b/iqpilot/sab/__init__.py
new file mode 100644
index 000000000..37c0527c7
--- /dev/null
+++ b/iqpilot/sab/__init__.py
@@ -0,0 +1,22 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from .behavior import (
+ SteeringAssistanceBehavior,
+ GuidanceStateMachine,
+ DriverInterventionMode,
+ BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE,
+ apply_aol_brand_overrides,
+ apply_aol_experience_flags,
+ read_aol_enabled_pref,
+ read_joint_engagement_pref,
+ read_main_cruise_pref,
+ resolve_brake_intervention_mode,
+)
+
+__all__ = [
+ "SteeringAssistanceBehavior", "GuidanceStateMachine", "DriverInterventionMode",
+ "BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE", "apply_aol_brand_overrides", "apply_aol_experience_flags",
+ "read_aol_enabled_pref", "read_joint_engagement_pref", "read_main_cruise_pref",
+ "resolve_brake_intervention_mode",
+]
diff --git a/iqpilot/sab/behavior.py b/iqpilot/sab/behavior.py
new file mode 100644
index 000000000..287930f78
--- /dev/null
+++ b/iqpilot/sab/behavior.py
@@ -0,0 +1,523 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Steering Assistance Behavior (SAB): brand preference resolution, the guidance
+state machine and the per-frame event/behaviour engine, together in one module.
+"""
+from dataclasses import dataclass
+from typing import Optional
+
+from openpilot.common.params import Params, UnknownKeyName
+from iqdbc.car import structs
+from openpilot.common.realtime import DT_CTRL
+from iqdbc.safety import ALTERNATIVE_EXPERIENCE
+from openpilot.selfdrive.selfdrived.events import ET
+from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ, HyundaiSafetyFlagsIQ
+from openpilot.selfdrive.selfdrived.state import SOFT_DISABLE_TIME
+from cereal import log, custom
+
+State = custom.AlwaysOnLateral.AlwaysOnLateralState
+
+
+# ===== preferences =====
+
+class DriverInterventionMode:
+ """What a brake press does to steering guidance (AolSteeringMode param values)."""
+ CONTINUE = 0
+ SUSPEND = 1
+ CANCEL = 2
+
+
+# Per-brand quirks. A brand absent from a set behaves normally.
+_FORCED_BRAKE_CANCEL = frozenset({"rivian"})
+BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE = ("rivian", "tesla")
+_HYUNDAI_MAIN_CRUISE_FLAG_BRANDS = frozenset({"hyundai"})
+
+_EXPERIENCE_BY_BRAKE_MODE = {
+ DriverInterventionMode.CANCEL: ALTERNATIVE_EXPERIENCE.AOL_DISENGAGE_LATERAL_ON_BRAKE,
+ DriverInterventionMode.SUSPEND: ALTERNATIVE_EXPERIENCE.AOL_PAUSE_LATERAL_ON_BRAKE,
+}
+
+
+def uses_forced_brake_cancel(CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ del CP_IQ
+ return CP.brand in _FORCED_BRAKE_CANCEL
+
+
+def read_aol_enabled_pref(params: Params):
+ return params.get_bool("AolEnabled")
+
+
+def read_main_cruise_pref(params: Params):
+ return params.get_bool("AolMainCruiseAllowed")
+
+
+def read_joint_engagement_pref(params: Params):
+ return params.get_bool("AolUnifiedEngagementMode")
+
+
+def resolve_brake_intervention_mode(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params: Params):
+ if uses_forced_brake_cancel(CP, CP_IQ):
+ return DriverInterventionMode.CANCEL
+ return params.get("AolSteeringMode", return_default=True)
+
+
+def apply_aol_experience_flags(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params: Params):
+ if not read_aol_enabled_pref(params):
+ return
+ CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.ENABLE_AOL
+ mode = resolve_brake_intervention_mode(CP, CP_IQ, params)
+ CP.alternativeExperience |= _EXPERIENCE_BY_BRAKE_MODE.get(mode, 0)
+
+
+def apply_aol_brand_overrides(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params: Params):
+ if CP.brand in _HYUNDAI_MAIN_CRUISE_FLAG_BRANDS:
+ CP_IQ.flags |= HyundaiFlagsIQ.MAIN_BTN_LONG_TOGGLE.value
+ CP_IQ.iqSafetyFlags |= HyundaiSafetyFlagsIQ.MAIN_BTN_LONG_TOGGLE
+
+ if uses_forced_brake_cancel(CP, CP_IQ):
+ # the brand can only cancel on brake; pin the params so the UI reflects reality
+ params.put("AolSteeringMode", DriverInterventionMode.CANCEL)
+ params.put_bool("AolUnifiedEngagementMode", True)
+
+ if CP.brand in BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE:
+ params.remove("AolMainCruiseAllowed")
+
+# ===== state_machine =====
+
+EventName = log.OnroadEvent.EventName
+EventNameIQ = custom.IQOnroadEvent.EventName
+TORQUE_DELIVERING_STATES = (State.overriding, State.enabled, State.softDisabling)
+LATERAL_CONTROLLED_STATES = (State.paused, *TORQUE_DELIVERING_STATES)
+GUIDANCE_AVAILABLE_SIGNAL = ET.ENABLE
+GUIDANCE_GATE_BLOCK_SIGNAL = ET.NO_ENTRY
+GUIDANCE_SUPPRESSION_SIGNAL = ET.SOFT_DISABLE
+GUIDANCE_OPERATOR_OFF_SIGNAL = ET.USER_DISABLE
+GUIDANCE_HARD_CUT_SIGNAL = ET.IMMEDIATE_DISABLE
+GUIDANCE_DRIVER_OVERRIDE_SIGNAL = ET.OVERRIDE_LATERAL
+GUIDANCE_ACTIVE_ALERT = ET.WARNING
+
+PAUSE_WITH_IQ_EVENTS = (
+ EventNameIQ.parkBrakeSilent,
+ EventNameIQ.seatbeltUnbuckledSilent,
+ EventNameIQ.doorAjarSilent,
+ EventNameIQ.brakeHoldSilent,
+ EventNameIQ.reverseSilent,
+ EventNameIQ.gearNotDriveSilent,
+)
+PAUSE_WITH_STOCK_EVENTS = (
+ EventName.parkBrake,
+ EventName.seatbeltNotLatched,
+ EventName.doorOpen,
+ EventName.brakeHold,
+ EventName.reverseGear,
+ EventName.wrongGear,
+)
+GEARS_ALLOW_PAUSED_SILENT = PAUSE_WITH_IQ_EVENTS
+GEARS_ALLOW_PAUSED = PAUSE_WITH_STOCK_EVENTS
+
+
+@dataclass(frozen=True)
+class GuidancePulse:
+ wake_ping: bool
+ gate_closed: bool
+ cooldown_call: bool
+ driver_kill: bool
+ hard_cut: bool
+ hands_on_wheel: bool
+ hush_cut: bool
+ pit_stop_ready: bool
+
+
+class GuidanceStateMachine:
+ def __init__(self, sab):
+ self.selfdrive = sab.selfdrive
+ self._sm_core = sab.selfdrive.state_machine
+ self._events = sab.selfdrive.events
+ self._events_iq = sab.selfdrive.events_iq
+ self.state = State.disabled
+
+ def _queue_alert_if_solo(self, alert_type: str):
+ if not self.selfdrive.enabled:
+ self._sm_core.current_alert_types.append(alert_type)
+
+ def _sees_event(self, event_type: str):
+ return self._events.contains(event_type) or self._events_iq.contains(event_type)
+
+ def _can_take_pit_stop(self):
+ return self._events.contains_in_list(PAUSE_WITH_STOCK_EVENTS) or self._events_iq.contains_in_list(PAUSE_WITH_IQ_EVENTS)
+
+ def _capture_pulse(self) -> GuidancePulse:
+ return GuidancePulse(
+ wake_ping=self._sees_event(GUIDANCE_AVAILABLE_SIGNAL),
+ gate_closed=self._sees_event(GUIDANCE_GATE_BLOCK_SIGNAL),
+ cooldown_call=self._sees_event(GUIDANCE_SUPPRESSION_SIGNAL),
+ driver_kill=self._sees_event(GUIDANCE_OPERATOR_OFF_SIGNAL),
+ hard_cut=self._sees_event(GUIDANCE_HARD_CUT_SIGNAL),
+ hands_on_wheel=self._sees_event(GUIDANCE_DRIVER_OVERRIDE_SIGNAL),
+ hush_cut=self._events_iq.has(EventNameIQ.alcDisengagedSilent),
+ pit_stop_ready=self._can_take_pit_stop(),
+ )
+
+ def _start_grace_period(self):
+ if not self.selfdrive.enabled:
+ self._sm_core.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL)
+ self._sm_core.current_alert_types.append(GUIDANCE_SUPPRESSION_SIGNAL)
+
+ def _run_global_cutoffs(self, pulse: GuidancePulse) -> Optional[object]:
+ if pulse.driver_kill:
+ self._sm_core.current_alert_types.append(GUIDANCE_OPERATOR_OFF_SIGNAL)
+ return State.paused if pulse.hush_cut else State.disabled
+ if pulse.hard_cut:
+ self._queue_alert_if_solo(GUIDANCE_HARD_CUT_SIGNAL)
+ return State.disabled
+ return None
+
+ def _handle_disabled(self, pulse: GuidancePulse) -> State:
+ if not pulse.wake_ping:
+ return State.disabled
+ if pulse.gate_closed:
+ self._queue_alert_if_solo(GUIDANCE_GATE_BLOCK_SIGNAL)
+ return State.paused if pulse.pit_stop_ready else State.disabled
+ self._queue_alert_if_solo(GUIDANCE_AVAILABLE_SIGNAL)
+ return State.overriding if pulse.hands_on_wheel else State.enabled
+
+ def _handle_enabled(self, pulse: GuidancePulse) -> State:
+ forced_state = self._run_global_cutoffs(pulse)
+ if forced_state is not None:
+ return forced_state
+ if pulse.cooldown_call:
+ self._start_grace_period()
+ return State.softDisabling
+ if pulse.hands_on_wheel:
+ self._queue_alert_if_solo(GUIDANCE_DRIVER_OVERRIDE_SIGNAL)
+ return State.overriding
+ return State.enabled
+
+ def _handle_soft_disabling(self, pulse: GuidancePulse) -> State:
+ forced_state = self._run_global_cutoffs(pulse)
+ if forced_state is not None:
+ return forced_state
+ if not pulse.cooldown_call:
+ return State.enabled
+ if self._sm_core.soft_disable_timer > 0:
+ self._queue_alert_if_solo(GUIDANCE_SUPPRESSION_SIGNAL)
+ return State.softDisabling
+ return State.disabled
+
+ def _handle_paused(self, pulse: GuidancePulse) -> State:
+ forced_state = self._run_global_cutoffs(pulse)
+ if forced_state is not None:
+ return forced_state
+ if not pulse.wake_ping:
+ return State.paused
+ if pulse.gate_closed:
+ self._queue_alert_if_solo(GUIDANCE_GATE_BLOCK_SIGNAL)
+ return State.paused
+ self._queue_alert_if_solo(GUIDANCE_AVAILABLE_SIGNAL)
+ return State.overriding if pulse.hands_on_wheel else State.enabled
+
+ def _handle_overriding(self, pulse: GuidancePulse) -> State:
+ forced_state = self._run_global_cutoffs(pulse)
+ if forced_state is not None:
+ return forced_state
+ if pulse.cooldown_call:
+ self._start_grace_period()
+ return State.softDisabling
+ if pulse.hands_on_wheel:
+ self._sm_core.current_alert_types.append(GUIDANCE_DRIVER_OVERRIDE_SIGNAL)
+ return State.overriding
+ return State.enabled
+
+ def update(self):
+ pulse = self._capture_pulse()
+ handler = {
+ State.disabled: self._handle_disabled,
+ State.enabled: self._handle_enabled,
+ State.softDisabling: self._handle_soft_disabling,
+ State.paused: self._handle_paused,
+ State.overriding: self._handle_overriding,
+ }[self.state]
+
+ self.state = handler(pulse)
+ enabled = self.state in LATERAL_CONTROLLED_STATES
+ active = self.state in TORQUE_DELIVERING_STATES
+ if active:
+ self._queue_alert_if_solo(GUIDANCE_ACTIVE_ALERT)
+ return enabled, active
+
+# ===== behavior =====
+
+_E = log.OnroadEvent.EventName
+_Q = custom.IQOnroadEvent.EventName
+_BTN = structs.CarState.ButtonEvent.Type
+_GEAR = structs.CarState.GearShifter
+
+_CRUISE_SET_TAPS = frozenset((_BTN.accelCruise, _BTN.resumeCruise, _BTN.decelCruise, _BTN.setCruise))
+_LATERAL_TOGGLE_BUTTONS = (_BTN.lkas, _BTN.lfaButton)
+_HYUNDAI_LDA_MASK = HyundaiFlags.CANFD
+
+# While a lateral-only session rides through a pause, these stock blockers are
+# swapped for their silent IQ twins. Order here is not load-bearing (each row
+# guards a distinct event), so it is grouped standstill-first for readability.
+# (silent replacement, stock trigger, only-when-stopped, extra predicate)
+_QUIET_SWAPS = (
+ (_Q.seatbeltUnbuckledSilent, _E.seatbeltNotLatched, True, None),
+ (_Q.doorAjarSilent, _E.doorOpen, True, None),
+ (_Q.reverseSilent, _E.reverseGear, False, None),
+ (_Q.parkBrakeSilent, _E.parkBrake, False, None),
+ (_Q.brakeHoldSilent, _E.brakeHold, False, None),
+ (_Q.gearNotDriveSilent, _E.wrongGear, False,
+ lambda cs: cs.vEgo < 2.5 or cs.gearShifter == _GEAR.reverse),
+)
+
+# Longitudinal-only chatter that must not gate a lateral-only session.
+_DROP_ON_ENTRY = (_E.speedTooLow, _E.belowEngageSpeed, _E.preEnableStandstill,
+ _E.manualRestart, _E.cruiseDisabled)
+_DROP_ON_EXIT = (_E.wrongCruiseMode, _E.pedalPressed, _E.buttonCancel, _E.pcmDisable)
+
+
+class SteeringAssistanceBehavior:
+ def __init__(self, selfdrive):
+ sd = selfdrive
+ self.selfdrive = sd
+ self.CP, self.CP_IQ, self.params = sd.CP, sd.CP_IQ, sd.params
+ self.events, self.events_iq = sd.events, sd.events_iq
+
+ self.enabled = self.active = self.available = False
+ sd.enabled_prev = False
+ self.state_machine = GuidanceStateMachine(self)
+
+ self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator")
+ self._apply_brand_capabilities()
+ self._reload_preferences(full=True)
+
+ def _apply_brand_capabilities(self):
+ brand = self.CP.brand
+ self.no_main_cruise = brand in BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE
+ lda_capable = bool(self.CP.flags & _HYUNDAI_LDA_MASK) or bool(self.CP_IQ.flags & HyundaiFlagsIQ.HAS_LFA_BUTTON)
+ self.hkg_allow = brand == "hyundai" and lda_capable
+
+ def _reload_preferences(self, full: bool = False):
+ self.main_enabled_toggle = read_main_cruise_pref(self.params)
+ self.unified_engagement_mode = read_joint_engagement_pref(self.params)
+ if full:
+ self.enabled_toggle = read_aol_enabled_pref(self.params)
+ self.steering_mode_on_brake = resolve_brake_intervention_mode(self.CP, self.CP_IQ, self.params)
+
+ def read_params(self):
+ self._reload_preferences()
+
+ # -- event plumbing (thin wrappers over the stock/IQ event queues) -----------
+ def _has(self, ev):
+ return self.events.has(ev)
+
+ def _drop(self, ev):
+ self.events.remove(ev)
+
+ def _raise(self, ev):
+ self.events.add(ev)
+
+ def _emit(self, ev):
+ self.events_iq.add(ev)
+
+ def _retract(self, ev):
+ self.events_iq.remove(ev)
+
+ def _emitted(self, ev):
+ return self.events_iq.contains(ev)
+
+ def _emitted_any(self, evs):
+ return self.events_iq.contains_in_list(evs)
+
+ def _iq_has(self, ev):
+ return self.events_iq.has(ev)
+
+ # -- predicates --------------------------------------------------------------
+ def _brake_without_gas(self, cs):
+ prev_gas = self.selfdrive.CS_prev.gasPressed
+ gas_rising_edge = cs.gasPressed and not prev_gas
+ override_via_gas = gas_rising_edge and self.disengage_on_accelerator
+ return self._has(_E.pedalPressed) and not override_via_gas
+
+ def _may_silently_resume(self, cs):
+ suspend_on_brake = self.steering_mode_on_brake == DriverInterventionMode.SUSPEND
+ if suspend_on_brake and self._brake_without_gas(cs):
+ return False
+ return not self._emitted_any(GEARS_ALLOW_PAUSED_SILENT)
+
+ @property
+ def _long_held_two_cycles(self):
+ sd = self.selfdrive
+ return bool(sd.enabled_prev and sd.enabled)
+
+ def _uem_blocks_engage(self):
+ if not self.unified_engagement_mode or self.enabled:
+ return True
+ return self._long_held_two_cycles
+
+ def _lateral_offered(self, cs):
+ return bool(cs.lateralAvailable or cs.cruiseState.available or self.hkg_allow or self.CP.brand == "tesla")
+
+ @staticmethod
+ def _main_cruise_live(cs):
+ cruise = getattr(cs, 'cruiseState', None)
+ if getattr(cruise, 'available', False):
+ return True
+ return bool(getattr(cs, 'cruiseFaultLateralMode', False))
+
+ # -- event surgery -----------------------------------------------------------
+ def _swap_event(self, stock: int, silent: int):
+ self._drop(stock)
+ self._emit(silent)
+
+ def _flag_pause(self):
+ already_held = self.state_machine.state is State.paused
+ if not already_held:
+ self._emit(_Q.alcDisengagedSilent)
+
+ def _resolve_wrong_mode(self, alert_only: bool):
+ if not alert_only:
+ self._drop(_E.wrongCarMode)
+ elif self._has(_E.wrongCarMode):
+ self._swap_event(_E.wrongCarMode, _Q.carModeMismatchNotice)
+
+ # -- joystick/debug hook -----------------------------------------------------
+ def _consume_joystick_aol_request(self, cs) -> str | None:
+ if not self.params.get_bool("JoystickDebugMode"):
+ return None
+ try:
+ raw = self.params.get("JoystickAolRequest")
+ except UnknownKeyName:
+ return None
+ if not raw:
+ return None
+ try:
+ request = raw.decode("utf-8") if isinstance(raw, (bytes, bytearray)) else str(raw)
+ except Exception:
+ request = ""
+ try:
+ self.params.remove("JoystickAolRequest")
+ except UnknownKeyName:
+ return None
+
+ verb = request.strip().lower()
+ if verb not in ("enable", "disable"):
+ return None
+ if not getattr(cs, "started", False):
+ return None
+ if getattr(cs, "doorOpen", False) or getattr(cs, "seatbeltUnlatched", False):
+ return None
+ parked_or_reverse = getattr(cs, "gearShifter", _GEAR.unknown) in (_GEAR.park, _GEAR.reverse)
+ return None if parked_or_reverse else verb
+
+ # -- pipeline stages ---------------------------------------------------------
+ def _phase_joystick(self, cs):
+ verb = self._consume_joystick_aol_request(cs)
+ if verb is not None:
+ self._emit(_Q.alcEngaged if verb == "enable" else _Q.alcDisengaged)
+
+ def _phase_soften_for_lateral_session(self, cs):
+ if self.selfdrive.enabled or not self.enabled:
+ return
+
+ for silent, stock, standstill_only, extra in _QUIET_SWAPS:
+ if standstill_only and not cs.standstill:
+ continue
+ if not self._has(stock):
+ continue
+ if extra is not None and not extra(cs):
+ continue
+ self._swap_event(stock, silent)
+ self._flag_pause()
+
+ if self.steering_mode_on_brake == DriverInterventionMode.SUSPEND and self._brake_without_gas(cs):
+ self._flag_pause()
+
+ for chatter in _DROP_ON_ENTRY:
+ self._drop(chatter)
+
+ _ENGAGE_TRIGGERS = (_E.pcmEnable, _E.buttonEnable)
+
+ def _phase_engagement(self, cs):
+ long_engage = any(self._has(trig) for trig in self._ENGAGE_TRIGGERS)
+ tapped_set = any(be.type in _CRUISE_SET_TAPS for be in cs.buttonEvents)
+ self._resolve_wrong_mode(long_engage or tapped_set)
+
+ if long_engage:
+ if self._brake_without_gas(cs):
+ self._emit(_Q.pedalHeldNotice)
+ if self._uem_blocks_engage():
+ self._drop(_E.pcmEnable)
+ self._drop(_E.buttonEnable)
+ return
+
+ if self.main_enabled_toggle and self._main_cruise_live(cs) and not self._main_cruise_live(self.selfdrive.CS_prev):
+ self._emit(_Q.alcEngaged)
+
+ def _phase_buttons(self, cs):
+ kill_all = False
+ long_dropped_out = self.selfdrive.enabled_prev and not self.selfdrive.enabled
+ for be in cs.buttonEvents:
+ if be.type == _BTN.cancel and long_dropped_out:
+ self._emit(_Q.speedManually)
+ if not (be.type in _LATERAL_TOGGLE_BUTTONS and be.pressed and self._lateral_offered(cs)):
+ continue
+ if not self.enabled:
+ self._emit(_Q.alcEngaged)
+ continue
+ self._emit(_Q.alcDisengaged)
+ if self.selfdrive.enabled:
+ kill_all = True
+ return kill_all
+
+ def _phase_availability(self, cs):
+ main_off = self.main_enabled_toggle and not self._main_cruise_live(cs)
+ if self.no_main_cruise or (self._lateral_offered(cs) and not main_off):
+ return
+ self._drop(_E.buttonEnable)
+ if self.enabled:
+ self._emit(_Q.alcDisengaged)
+
+ def _phase_brake_policy(self, cs):
+ if self.steering_mode_on_brake != DriverInterventionMode.CANCEL or not self._brake_without_gas(cs):
+ return
+ if self.enabled:
+ self._emit(_Q.alcDisengaged)
+ elif self._emitted(_Q.alcEngaged):
+ self._retract(_Q.alcEngaged)
+ self._emit(_Q.pedalHeldNotice)
+
+ def _phase_resume_from_pause(self, cs):
+ held = self.state_machine.state is State.paused
+ if held and self._may_silently_resume(cs):
+ self._emit(_Q.alcEngagedSilent)
+
+ def update_events(self, cs):
+ self._phase_joystick(cs)
+ self._phase_soften_for_lateral_session(cs)
+ self._phase_engagement(cs)
+ kill_all = self._phase_buttons(cs)
+ self._phase_availability(cs)
+ self._phase_brake_policy(cs)
+ self._phase_resume_from_pause(cs)
+
+ for chatter in _DROP_ON_EXIT:
+ self._drop(chatter)
+
+ if kill_all:
+ self._raise(_E.buttonCancel)
+
+ def update(self, cs):
+ if not self.enabled_toggle and not self.params.get_bool("JoystickDebugMode"):
+ return
+ self.update_events(cs)
+ self.update_state()
+
+ def update_state(self):
+ sd = self.selfdrive
+ sd.enabled_prev = sd.enabled
+ runnable = sd.initialized and not self.CP.passive
+ if runnable:
+ verdict = self.state_machine.update()
+ self.enabled, self.active = verdict
diff --git a/iqpilot/sab/tests/test_sab.py b/iqpilot/sab/tests/test_sab.py
new file mode 100644
index 000000000..a4e499416
--- /dev/null
+++ b/iqpilot/sab/tests/test_sab.py
@@ -0,0 +1,175 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from types import SimpleNamespace
+
+from cereal import custom
+from iqdbc.car import structs
+from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ
+from openpilot.iqpilot.sab.behavior import SteeringAssistanceBehavior
+from openpilot.iqpilot.selfdrive.selfdrived.events import IQEvents
+from openpilot.selfdrive.selfdrived.events import Events
+
+
+ButtonType = structs.CarState.ButtonEvent.Type
+EventNameIQ = custom.IQOnroadEvent.EventName
+
+
+class MockParams:
+ def __init__(self, main_cruise_allowed: bool = False, aol_enabled: bool = True):
+ self.main_cruise_allowed = main_cruise_allowed
+ self.aol_enabled = aol_enabled
+
+ def get_bool(self, key: str) -> bool:
+ return {
+ "AolEnabled": self.aol_enabled,
+ "AolMainCruiseAllowed": self.main_cruise_allowed,
+ "AolUnifiedEngagementMode": False,
+ "JoystickDebugMode": False,
+ }.get(key, False)
+
+ def get(self, key: str, return_default: bool = False):
+ if key == "AolSteeringMode":
+ return 0 if return_default else b"0"
+ return None
+
+ def remove(self, key: str) -> None:
+ return None
+
+
+def make_selfdrive(cp_flags: int, brand: str = "hyundai", main_cruise_allowed: bool = False,
+ aol_enabled: bool = True, cp_iq_flags: int = 0):
+ cp = SimpleNamespace(
+ brand=brand,
+ flags=cp_flags,
+ passive=False,
+ notCar=False,
+ safetyModel=structs.CarParams.SafetyModel.noOutput,
+ )
+ cp_iq = SimpleNamespace(flags=cp_iq_flags)
+ return SimpleNamespace(
+ CP=cp,
+ CP_IQ=cp_iq,
+ params=MockParams(main_cruise_allowed, aol_enabled),
+ state_machine=SimpleNamespace(soft_disable_timer=0, current_alert_types=[]),
+ events=Events(),
+ events_iq=IQEvents(),
+ CS_prev=SimpleNamespace(
+ gasPressed=False,
+ cruiseState=SimpleNamespace(available=False),
+ lateralAvailable=False,
+ ),
+ enabled=False,
+ enabled_prev=False,
+ initialized=True,
+ )
+
+
+def make_car_state():
+ return SimpleNamespace(
+ started=True,
+ standstill=False,
+ doorOpen=False,
+ seatbeltUnlatched=False,
+ gearShifter=structs.CarState.GearShifter.drive,
+ vEgo=0.0,
+ gasPressed=False,
+ brakePressed=False,
+ cruiseState=SimpleNamespace(available=False),
+ lateralAvailable=False,
+ buttonEvents=[structs.CarState.ButtonEvent(pressed=True, type=ButtonType.lkas)],
+ )
+
+
+def make_vw_car_state(cruise_available: bool, cruise_fault_lateral: bool = False):
+ return SimpleNamespace(
+ started=True,
+ standstill=False,
+ doorOpen=False,
+ seatbeltUnlatched=False,
+ gearShifter=structs.CarState.GearShifter.drive,
+ vEgo=0.0,
+ gasPressed=False,
+ brakePressed=False,
+ cruiseState=SimpleNamespace(available=cruise_available),
+ lateralAvailable=cruise_available or cruise_fault_lateral,
+ cruiseFaultLateralMode=cruise_fault_lateral,
+ buttonEvents=[],
+ )
+
+
+def test_hyundai_lkas_button_can_arm_guidance_before_lateral_available():
+ selfdrive = make_selfdrive(0, cp_iq_flags=HyundaiFlagsIQ.HAS_LFA_BUTTON)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+ car_state = make_car_state()
+ car_state.buttonEvents = [structs.CarState.ButtonEvent(pressed=True, type=ButtonType.lfaButton)]
+
+ guidance.update_events(car_state)
+
+ assert selfdrive.events_iq.has(EventNameIQ.alcEngaged)
+
+
+def test_hyundai_lkas_button_stays_inactive_without_platform_support():
+ selfdrive = make_selfdrive(0)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+
+ guidance.update_events(make_car_state())
+
+ assert not selfdrive.events_iq.has(EventNameIQ.alcEngaged)
+
+
+def test_main_cruise_drop_cuts_guidance_even_if_lateral_signal_stays_true():
+ selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True)
+ selfdrive.CS_prev = make_vw_car_state(cruise_available=True)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+ guidance.enabled = True
+
+ guidance.update_events(make_vw_car_state(cruise_available=False))
+
+ assert selfdrive.events_iq.has(EventNameIQ.alcDisengaged)
+
+
+def test_faulted_lateral_mode_does_not_force_disable_guidance():
+ selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True)
+ selfdrive.CS_prev = make_vw_car_state(cruise_available=True)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+ guidance.enabled = True
+
+ guidance.update_events(make_vw_car_state(cruise_available=False, cruise_fault_lateral=True))
+
+ assert not selfdrive.events_iq.has(EventNameIQ.alcDisengaged)
+
+
+def test_main_switch_rising_edge_arms_guidance_during_faulted_cruise():
+ selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True)
+ selfdrive.CS_prev = make_vw_car_state(cruise_available=False, cruise_fault_lateral=False)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+
+ guidance.update_events(make_vw_car_state(cruise_available=False, cruise_fault_lateral=True))
+
+ assert selfdrive.events_iq.has(EventNameIQ.alcEngaged)
+
+
+def test_main_cruise_rising_edge_does_not_engage_when_toggle_is_off():
+ selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True, aol_enabled=False)
+ selfdrive.CS_prev = make_vw_car_state(cruise_available=False)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+
+ guidance.update(make_vw_car_state(cruise_available=True))
+
+ assert not selfdrive.events_iq.has(EventNameIQ.alcEngaged)
+ assert not guidance.active
+ assert not guidance.enabled
+ assert guidance.state_machine.state == custom.AlwaysOnLateral.AlwaysOnLateralState.disabled
+
+
+def test_main_cruise_rising_edge_engages_when_toggle_is_on():
+ selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True, aol_enabled=True)
+ selfdrive.CS_prev = make_vw_car_state(cruise_available=False)
+ guidance = SteeringAssistanceBehavior(selfdrive)
+
+ guidance.update(make_vw_car_state(cruise_available=True))
+
+ assert selfdrive.events_iq.has(EventNameIQ.alcEngaged)
+ assert guidance.active
diff --git a/iqpilot/sab/tests/test_sab_state_machine.py b/iqpilot/sab/tests/test_sab_state_machine.py
new file mode 100644
index 000000000..7c0a84c07
--- /dev/null
+++ b/iqpilot/sab/tests/test_sab_state_machine.py
@@ -0,0 +1,221 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Table-driven checks for GuidanceStateMachine: every transition is one row of
+(start state, signals present, expected state), and the side effects (queued
+alert types, soft-disable timer arming) are asserted separately.
+"""
+import pytest
+
+from cereal import custom
+from openpilot.common.realtime import DT_CTRL
+from openpilot.selfdrive.selfdrived.events import ET
+from openpilot.selfdrive.selfdrived.state import SOFT_DISABLE_TIME
+from openpilot.iqpilot.sab.behavior import (GuidanceStateMachine, PAUSE_WITH_IQ_EVENTS,
+ PAUSE_WITH_STOCK_EVENTS)
+
+State = custom.AlwaysOnLateral.AlwaysOnLateralState
+EventNameIQ = custom.IQOnroadEvent.EventName
+
+SOFT_DISABLE_FRAMES = int(SOFT_DISABLE_TIME / DT_CTRL)
+
+# signal aliases used in the table rows
+ENABLE = ET.ENABLE
+NO_ENTRY = ET.NO_ENTRY
+SOFT = ET.SOFT_DISABLE
+USER = ET.USER_DISABLE
+IMMEDIATE = ET.IMMEDIATE_DISABLE
+OVERRIDE = ET.OVERRIDE_LATERAL
+SILENT = "silent-disable" # silentLkasDisable present in the IQ event bag
+PAUSE_OK = "pause-eligible" # a gear/door/belt event from the pause lists is present
+
+
+class SignalBag:
+ """Stands in for both event buckets; the machine only probes membership."""
+
+ def __init__(self, types=(), names=()):
+ self._types = set(types)
+ self._names = set(names)
+
+ def contains(self, event_type):
+ return event_type in self._types
+
+ def has(self, name):
+ return name in self._names
+
+ def contains_in_list(self, names):
+ return any(n in self._names for n in names)
+
+
+class Host:
+ """Minimal stand-in for the sab/selfdrive plumbing the machine touches."""
+
+ class _SSM:
+ def __init__(self):
+ self.current_alert_types = []
+ self.soft_disable_timer = 0
+
+ def __init__(self, signals, selfdrive_enabled=False):
+ types = {s for s in signals if s in (ENABLE, NO_ENTRY, SOFT, USER, IMMEDIATE, OVERRIDE)}
+ names = set()
+ if SILENT in signals:
+ names.add(EventNameIQ.alcDisengagedSilent)
+ if PAUSE_OK in signals:
+ names.add(PAUSE_WITH_IQ_EVENTS[0])
+
+ self.enabled = selfdrive_enabled
+ self.state_machine = self._SSM()
+ self.events = SignalBag(types)
+ self.events_iq = SignalBag((), names)
+
+
+class Sab:
+ def __init__(self, host):
+ self.selfdrive = host
+
+
+def machine_at(state, signals, selfdrive_enabled=False):
+ host = Host(signals, selfdrive_enabled)
+ m = GuidanceStateMachine(Sab(host))
+ m.state = state
+ return m, host
+
+
+# (id, start state, signals, expected state)
+TRANSITIONS = [
+ # from disabled
+ ("idle stays idle", State.disabled, (), State.disabled),
+ ("engage", State.disabled, (ENABLE,), State.enabled),
+ ("engage while overriding", State.disabled, (ENABLE, OVERRIDE), State.overriding),
+ ("blocked entry", State.disabled, (ENABLE, NO_ENTRY), State.disabled),
+ ("blocked entry parks when pause-eligible", State.disabled, (ENABLE, NO_ENTRY, PAUSE_OK), State.paused),
+
+ # from enabled
+ ("cruise steady", State.enabled, (), State.enabled),
+ ("driver off switch", State.enabled, (USER,), State.disabled),
+ ("driver off switch, silent -> pause", State.enabled, (USER, SILENT), State.paused),
+ ("hard fault", State.enabled, (IMMEDIATE,), State.disabled),
+ ("grace period entry", State.enabled, (SOFT,), State.softDisabling),
+ ("hands on wheel", State.enabled, (OVERRIDE,), State.overriding),
+ ("user beats soft", State.enabled, (USER, SOFT), State.disabled),
+ ("hard beats soft", State.enabled, (IMMEDIATE, SOFT), State.disabled),
+
+ # from softDisabling (timer still armed -> stays; see timer tests for expiry)
+ ("condition cleared", State.softDisabling, (), State.enabled),
+ ("user during grace", State.softDisabling, (USER,), State.disabled),
+ ("hard during grace", State.softDisabling, (IMMEDIATE,), State.disabled),
+
+ # from paused
+ ("stays parked", State.paused, (), State.paused),
+ ("blocked resume", State.paused, (ENABLE, NO_ENTRY), State.paused),
+ ("resume", State.paused, (ENABLE,), State.enabled),
+ ("resume into override", State.paused, (ENABLE, OVERRIDE), State.overriding),
+ ("user kill while parked", State.paused, (USER,), State.disabled),
+ ("silent user kill re-parks", State.paused, (USER, SILENT), State.paused),
+ ("hard fault while parked", State.paused, (IMMEDIATE,), State.disabled),
+
+ # from overriding
+ ("override released", State.overriding, (), State.enabled),
+ ("override held", State.overriding, (OVERRIDE,), State.overriding),
+ ("override to grace", State.overriding, (SOFT,), State.softDisabling),
+ ("override user kill", State.overriding, (USER,), State.disabled),
+ ("override hard fault", State.overriding, (IMMEDIATE,), State.disabled),
+]
+
+
+@pytest.mark.parametrize("label,start,signals,expected", TRANSITIONS, ids=[t[0] for t in TRANSITIONS])
+def test_transition(label, start, signals, expected):
+ m, _ = machine_at(start, signals)
+ m.update()
+ assert m.state == expected
+
+
+@pytest.mark.parametrize("start,signals,expected_enabled,expected_active", [
+ (State.disabled, (), False, False),
+ (State.disabled, (ENABLE,), True, True),
+ (State.disabled, (ENABLE, NO_ENTRY, PAUSE_OK), True, False), # paused: guidance armed, torque off
+ (State.enabled, (), True, True),
+ (State.enabled, (SOFT,), True, True),
+ (State.enabled, (USER,), False, False),
+ (State.overriding, (OVERRIDE,), True, True),
+])
+def test_update_outputs(start, signals, expected_enabled, expected_active):
+ m, _ = machine_at(start, signals)
+ enabled, active = m.update()
+ assert (enabled, active) == (expected_enabled, expected_active)
+
+
+class TestSoftDisableTimer:
+ def test_grace_period_arms_timer_when_solo(self):
+ m, host = machine_at(State.enabled, (SOFT,))
+ m.update()
+ assert m.state == State.softDisabling
+ assert host.state_machine.soft_disable_timer == SOFT_DISABLE_FRAMES
+ assert ET.SOFT_DISABLE in host.state_machine.current_alert_types
+
+ def test_grace_period_skips_timer_when_selfdrive_owns_it(self):
+ m, host = machine_at(State.enabled, (SOFT,), selfdrive_enabled=True)
+ m.update()
+ assert m.state == State.softDisabling
+ assert host.state_machine.soft_disable_timer == 0
+
+ def test_expiry_disables(self):
+ m, host = machine_at(State.softDisabling, (SOFT,))
+ host.state_machine.soft_disable_timer = 0
+ m.update()
+ assert m.state == State.disabled
+
+ def test_countdown_keeps_grace(self):
+ m, host = machine_at(State.softDisabling, (SOFT,))
+ host.state_machine.soft_disable_timer = 5
+ m.update()
+ assert m.state == State.softDisabling
+
+
+class TestAlertQueueing:
+ def test_alerts_only_queued_when_solo(self):
+ m, host = machine_at(State.disabled, (ENABLE,), selfdrive_enabled=True)
+ m.update()
+ assert host.state_machine.current_alert_types == []
+
+ def test_engage_alert_queued(self):
+ m, host = machine_at(State.disabled, (ENABLE,))
+ m.update()
+ assert ET.ENABLE in host.state_machine.current_alert_types
+ assert ET.WARNING in host.state_machine.current_alert_types # active -> warning channel open
+
+ def test_no_entry_alert_queued(self):
+ m, host = machine_at(State.disabled, (ENABLE, NO_ENTRY))
+ m.update()
+ assert ET.NO_ENTRY in host.state_machine.current_alert_types
+
+ def test_user_disable_alert_always_queued(self):
+ # user disable bypasses the solo gate — the driver asked, the driver hears back
+ m, host = machine_at(State.enabled, (USER,), selfdrive_enabled=True)
+ m.update()
+ assert ET.USER_DISABLE in host.state_machine.current_alert_types
+
+ def test_override_alert_repeats_while_held(self):
+ m, host = machine_at(State.overriding, (OVERRIDE,), selfdrive_enabled=True)
+ m.update()
+ assert ET.OVERRIDE_LATERAL in host.state_machine.current_alert_types
+
+
+class TestPauseEligibility:
+ @pytest.mark.parametrize("event_name", PAUSE_WITH_IQ_EVENTS)
+ def test_each_iq_pause_event_parks(self, event_name):
+ host = Host((ENABLE, NO_ENTRY))
+ host.events_iq = SignalBag((), {event_name})
+ m = GuidanceStateMachine(Sab(host))
+ m.state = State.disabled
+ m.update()
+ assert m.state == State.paused
+
+ @pytest.mark.parametrize("event_name", PAUSE_WITH_STOCK_EVENTS)
+ def test_each_stock_pause_event_parks(self, event_name):
+ host = Host((ENABLE, NO_ENTRY))
+ host.events = SignalBag({ENABLE, NO_ENTRY}, {event_name})
+ m = GuidanceStateMachine(Sab(host))
+ m.state = State.disabled
+ m.update()
+ assert m.state == State.paused
diff --git a/iqpilot/selfdrive/__init__.py b/iqpilot/selfdrive/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/assets/icons/clock.png b/iqpilot/selfdrive/assets/icons/clock.png
new file mode 100644
index 000000000..c93c69e6d
Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/clock.png differ
diff --git a/iqpilot/selfdrive/assets/img_minus_arrow_down.png b/iqpilot/selfdrive/assets/img_minus_arrow_down.png
new file mode 100644
index 000000000..b41bbe754
Binary files /dev/null and b/iqpilot/selfdrive/assets/img_minus_arrow_down.png differ
diff --git a/iqpilot/selfdrive/assets/img_plus_arrow_up.png b/iqpilot/selfdrive/assets/img_plus_arrow_up.png
new file mode 100644
index 000000000..0f72f27a0
Binary files /dev/null and b/iqpilot/selfdrive/assets/img_plus_arrow_up.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_arrive.png b/iqpilot/selfdrive/assets/navigation/direction_arrive.png
new file mode 100644
index 000000000..733c12909
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_arrive.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_continue_left.png b/iqpilot/selfdrive/assets/navigation/direction_continue_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_continue_left.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_continue_right.png b/iqpilot/selfdrive/assets/navigation/direction_continue_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_continue_right.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_flag.png b/iqpilot/selfdrive/assets/navigation/direction_flag.png
new file mode 100644
index 000000000..bad12ec66
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_flag.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_fork_left.png b/iqpilot/selfdrive/assets/navigation/direction_fork_left.png
new file mode 100644
index 000000000..b244b42b5
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_fork_left.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_fork_right.png b/iqpilot/selfdrive/assets/navigation/direction_fork_right.png
new file mode 100644
index 000000000..aa3efaabc
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_fork_right.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_merge_left.png b/iqpilot/selfdrive/assets/navigation/direction_merge_left.png
new file mode 100644
index 000000000..a713f52c5
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_merge_left.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_merge_right.png b/iqpilot/selfdrive/assets/navigation/direction_merge_right.png
new file mode 100644
index 000000000..3390b31a0
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_merge_right.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_off_ramp_left.png b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_left.png
new file mode 100644
index 000000000..d3fd18289
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_left.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_off_ramp_right.png b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_right.png
new file mode 100644
index 000000000..722e3f808
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_right.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_turn_left.png b/iqpilot/selfdrive/assets/navigation/direction_turn_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_turn_left.png differ
diff --git a/iqpilot/selfdrive/assets/navigation/direction_turn_right.png b/iqpilot/selfdrive/assets/navigation/direction_turn_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_turn_right.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_home.png b/iqpilot/selfdrive/assets/offroad/icon_home.png
new file mode 100644
index 000000000..83ea07b02
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_home.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_home.svg b/iqpilot/selfdrive/assets/offroad/icon_home.svg
new file mode 100644
index 000000000..d5a752a41
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_home.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/iqpilot/selfdrive/assets/offroad/icon_longitudinal.png b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.png
new file mode 100644
index 000000000..a11f3c2f0
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_longitudinal.svg b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.svg
new file mode 100644
index 000000000..6b03079fd
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.svg
@@ -0,0 +1 @@
+
diff --git a/iqpilot/selfdrive/assets/offroad/icon_models.png b/iqpilot/selfdrive/assets/offroad/icon_models.png
new file mode 100644
index 000000000..e94c3b10c
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_models.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_models.svg b/iqpilot/selfdrive/assets/offroad/icon_models.svg
new file mode 100644
index 000000000..63c42beef
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_models.svg
@@ -0,0 +1 @@
+
diff --git a/iqpilot/selfdrive/assets/offroad/icon_software.png b/iqpilot/selfdrive/assets/offroad/icon_software.png
new file mode 100644
index 000000000..760a283d6
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_software.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_software.svg b/iqpilot/selfdrive/assets/offroad/icon_software.svg
new file mode 100644
index 000000000..519ce068d
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_software.svg
@@ -0,0 +1 @@
+
diff --git a/iqpilot/selfdrive/assets/offroad/icon_toggle.png b/iqpilot/selfdrive/assets/offroad/icon_toggle.png
new file mode 100644
index 000000000..bd9554723
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_toggle.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_toggle.svg b/iqpilot/selfdrive/assets/offroad/icon_toggle.svg
new file mode 100644
index 000000000..17642b8b0
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_toggle.svg
@@ -0,0 +1 @@
+
diff --git a/iqpilot/selfdrive/assets/offroad/icon_vehicle.png b/iqpilot/selfdrive/assets/offroad/icon_vehicle.png
new file mode 100644
index 000000000..d59a7a939
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_vehicle.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_vehicle.svg b/iqpilot/selfdrive/assets/offroad/icon_vehicle.svg
new file mode 100644
index 000000000..909713d67
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_vehicle.svg
@@ -0,0 +1 @@
+
diff --git a/iqpilot/selfdrive/assets/offroad/icon_visuals.png b/iqpilot/selfdrive/assets/offroad/icon_visuals.png
new file mode 100644
index 000000000..b9ee43ad1
Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_visuals.png differ
diff --git a/iqpilot/selfdrive/assets/offroad/icon_visuals.svg b/iqpilot/selfdrive/assets/offroad/icon_visuals.svg
new file mode 100644
index 000000000..bcc105998
--- /dev/null
+++ b/iqpilot/selfdrive/assets/offroad/icon_visuals.svg
@@ -0,0 +1 @@
+
diff --git a/iqpilot/selfdrive/car/__init__.py b/iqpilot/selfdrive/car/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/car/enhanced_stock_longitudinal_control.py b/iqpilot/selfdrive/car/enhanced_stock_longitudinal_control.py
new file mode 100644
index 000000000..d8b8f5c58
--- /dev/null
+++ b/iqpilot/selfdrive/car/enhanced_stock_longitudinal_control.py
@@ -0,0 +1,67 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from __future__ import annotations
+
+from openpilot.common.constants import CV
+from openpilot.selfdrive.car.cruise import V_CRUISE_MAX
+
+from iqdbc.car import structs
+
+ENHANCED_STOCK_LONGITUDINAL_CONTROL_SET_SPEED_KPH_KEY = "enhancedStockLongitudinalControl.setSpeedKph"
+
+
+def _float_param(key: str, value: float) -> dict[str, object]:
+ return {"key": key, "type": "float", "value": f"{float(value):.3f}".encode("utf-8")}
+
+
+def _clamp_set_speed_kph(value: float) -> float:
+ return max(0.0, min(V_CRUISE_MAX, float(value)))
+
+
+def build_iq_control_params_from_plan(CP: structs.CarParams, iq_plan, selfdrive_enabled: bool,
+ current_set_speed_kph: float, previous_sync_limit_kph: float | None,
+ pending_sync_limit_kph: float | None) -> tuple[list[dict[str, object]], float | None, float | None]:
+ if not CP.openpilotLongitudinalControl or not selfdrive_enabled:
+ return [], None, None
+
+ resolver = getattr(getattr(iq_plan, "speedLimit", None), "resolver", None)
+ assist = getattr(getattr(iq_plan, "speedLimit", None), "assist", None)
+ if resolver is None or assist is None:
+ return [], None, None
+
+ speed_limit_final_last = float(getattr(resolver, "speedLimitFinalLast", 0.0) or 0.0)
+ assist_enabled = bool(getattr(assist, "enabled", False))
+ if not assist_enabled or speed_limit_final_last <= 0.0:
+ return [], None, None
+
+ resolved_limit_kph = _clamp_set_speed_kph(speed_limit_final_last * CV.MS_TO_KPH)
+ limit_changed = previous_sync_limit_kph is None or abs(resolved_limit_kph - previous_sync_limit_kph) > 0.05
+ if limit_changed:
+ pending_sync_limit_kph = resolved_limit_kph
+
+ if pending_sync_limit_kph is not None:
+ if abs(current_set_speed_kph - pending_sync_limit_kph) <= 0.25:
+ pending_sync_limit_kph = None
+ set_speed_kph = _clamp_set_speed_kph(current_set_speed_kph or resolved_limit_kph)
+ else:
+ set_speed_kph = pending_sync_limit_kph
+ else:
+ set_speed_kph = _clamp_set_speed_kph(current_set_speed_kph or resolved_limit_kph)
+
+ return [_float_param(ENHANCED_STOCK_LONGITUDINAL_CONTROL_SET_SPEED_KPH_KEY, set_speed_kph)], resolved_limit_kph, pending_sync_limit_kph
+
+
+def get_set_speed_kph_from_params(params) -> float | None:
+ for param in params:
+ key = param.key if hasattr(param, "key") else param.get("key")
+ if key != ENHANCED_STOCK_LONGITUDINAL_CONTROL_SET_SPEED_KPH_KEY:
+ continue
+ raw_value = param.value if hasattr(param, "value") else param.get("value")
+ try:
+ raw = raw_value.decode("utf-8") if isinstance(raw_value, (bytes, bytearray)) else str(raw_value)
+ value = float(raw)
+ except (AttributeError, TypeError, ValueError):
+ return None
+ return _clamp_set_speed_kph(value)
+ return None
diff --git a/iqpilot/selfdrive/car/gap_button_actions.py b/iqpilot/selfdrive/car/gap_button_actions.py
new file mode 100644
index 000000000..4d7e75b9d
--- /dev/null
+++ b/iqpilot/selfdrive/car/gap_button_actions.py
@@ -0,0 +1,52 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Maps the distance/gap steering-wheel button to an IQ.Pilot action: holding it for
+long enough toggles Experimental mode exactly once per hold. Only active when
+IQ.Pilot owns longitudinal control and cruise is available.
+"""
+from cereal import car, custom
+from iqdbc.car import structs
+from openpilot.common.params import Params
+
+_Button = car.CarState.ButtonEvent.Type
+_IQEvent = custom.IQOnroadEvent.EventName
+_GAP_BUTTON = _Button.gapAdjustCruise
+
+HOLD_FRAMES_TO_TOGGLE = 50
+
+
+class GapButtonActions:
+ def __init__(self, CP: structs.CarParams):
+ self._CP = CP
+ self._params = Params()
+ self._gap_hold_frames = 0
+ self._already_toggled = False
+ # read (and cleared) by the personality-decrement handler in selfdrived so a
+ # release that ends a toggle-hold does not also decrement personality
+ self.experimental_mode_switched = False
+
+ def update(self, CS, events, experimental_mode) -> None:
+ if not (self._CP.openpilotLongitudinalControl and CS.cruiseState.available):
+ return
+ self._advance_hold(CS)
+ self._toggle_experimental_on_long_hold(events, experimental_mode)
+
+ def _advance_hold(self, CS) -> None:
+ # once counting, keep incrementing each frame the hold persists
+ if self._gap_hold_frames > 0:
+ self._gap_hold_frames += 1
+ # a fresh press seeds the counter; a release zeroes it
+ for be in CS.buttonEvents:
+ if be.type.raw == _GAP_BUTTON:
+ self._gap_hold_frames = int(be.pressed)
+ if not be.pressed:
+ self._already_toggled = False
+
+ def _toggle_experimental_on_long_hold(self, events, experimental_mode) -> None:
+ if self._already_toggled or self._gap_hold_frames < HOLD_FRAMES_TO_TOGGLE:
+ return
+ self._params.put_bool_nonblocking("ExperimentalMode", not experimental_mode)
+ events.add(_IQEvent.experimentalToggled)
+ self._already_toggled = True
+ self.experimental_mode_switched = True
diff --git a/iqpilot/selfdrive/car/interfaces.py b/iqpilot/selfdrive/car/interfaces.py
new file mode 100644
index 000000000..7243529e9
--- /dev/null
+++ b/iqpilot/selfdrive/car/interfaces.py
@@ -0,0 +1,76 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from iqdbc.car import structs as _dbc
+from openpilot.common.params import Params as _Store
+from openpilot.common.swaglog import cloudlog as _log
+from openpilot.selfdrive.controls.lib.latcontrol_torque import get_nn_model_path as _resolve_nn
+
+import openpilot.system.sentry as _telemetry
+
+_ANGLE = _dbc.CarParams.SteerControlType.angle
+
+# Port tunables surfaced to the fingerprint step, flat so the read is one pass.
+_TUNABLES = (
+ "IQHyundaiLongTune",
+ "IQSubaruCreepAssist",
+ "IQSubaruCreepAssistManualBrake",
+ "IQTeslaTorqueBlend",
+ "IQToyotaFactoryLong",
+ "ToyotaSnGHack",
+)
+
+
+def initialize_params(store):
+ return [{name: store.get(name, return_default=True)} for name in _TUNABLES]
+
+
+def log_fingerprint(cp) -> None:
+ ident = cp.carFingerprint
+ if ident == "MOCK":
+ _telemetry.capture_fingerprint_mock()
+ else:
+ _telemetry.capture_fingerprint(ident, cp.brand)
+
+
+def set_speed_limit_controller_availability(cp, cp_iq, store=None) -> bool:
+ """Gate the speed-limit controller off on platforms that can't run it, dropping a
+ stuck 'control' mode down to 'warning'."""
+ store = store or _Store()
+ brand = cp.brand
+ off = (brand == "rivian"
+ or (brand == "tesla" and store.get_bool("IsReleaseIqBranch"))
+ or (not cp.openpilotLongitudinalControl and cp_iq.pcmCruiseSpeed))
+ if off and store.get("IQSpeedAssistMode", return_default=True) == 3: # control -> warning
+ store.put("IQSpeedAssistMode", 2)
+ return not off
+
+
+def _stamp_lateral_model(cp, cp_iq, store) -> bool:
+ where, label, precise = _resolve_nn(cp)
+ nn = cp_iq.iqLateralNet
+ nn.model.path, nn.model.name, nn.fuzzyFingerprint = where, label, not precise
+ if label == "MOCK":
+ _log.error({"nnff event": "car doesn't match any Neural Network model"})
+ return False
+ return cp.steerControlType != _ANGLE and store.get_bool("NeuralNetworkFeedForward")
+
+
+def _cleanup_unsupported_params(cp, cp_iq, store=None) -> None:
+ store = store or _Store()
+ doomed = {
+ "NeuralNetworkFeedForward": cp.steerControlType == _ANGLE,
+ "LongIncrementsEnabled": not cp.openpilotLongitudinalControl and cp_iq.pcmCruiseSpeed,
+ }
+ for name, gone in doomed.items():
+ if gone:
+ _log.warning(f"unsupported on this port, clearing {name}")
+ store.remove(name)
+ set_speed_limit_controller_availability(cp, cp_iq, store)
+
+
+def apply_iq_car_config(ci, store=None) -> None:
+ store = store or _Store()
+ if _stamp_lateral_model(ci.CP, ci.CP_IQ, store):
+ ci.configure_torque_tune(ci.CP.carFingerprint, ci.CP.lateralTuning)
+ _cleanup_unsupported_params(ci.CP, ci.CP_IQ, store)
diff --git a/iqpilot/selfdrive/car/long_increments.py b/iqpilot/selfdrive/car/long_increments.py
new file mode 100644
index 000000000..41153b758
--- /dev/null
+++ b/iqpilot/selfdrive/car/long_increments.py
@@ -0,0 +1,58 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from dataclasses import dataclass
+
+from openpilot.common.params import Params
+
+# Cruise set-speed step (in the caller's working unit, kph or the imperial increment)
+# a user is allowed to dial in for the accel/decel cruise buttons.
+MIN_BUTTON_STEP = 1
+MAX_BUTTON_STEP = 10
+
+# Once the resolved step reaches this size, we snap the set speed to the nearest
+# multiple of the step (e.g. a step of 5 lands on 45/50/55...) instead of just
+# adding it on top of whatever odd number the set speed currently sits at.
+SNAP_TO_GRID_THRESHOLD = 5
+
+# Stock behavior (feature disabled): tap moves by one unit, a held button moves
+# five times faster. This mirrors what every other unmodified button-input car
+# already does, so it's kept as the fallback rather than living in this module.
+STOCK_HOLD_MULTIPLIER = 5
+
+
+@dataclass(frozen=True)
+class LongIncrementConfig:
+ enabled: bool
+ tap_step: int
+ hold_step: int
+
+
+def _clamp_step(value) -> int:
+ try:
+ step = int(value)
+ except (TypeError, ValueError):
+ return MIN_BUTTON_STEP
+ return min(max(step, MIN_BUTTON_STEP), MAX_BUTTON_STEP)
+
+
+def read_long_increment_config(params: Params) -> LongIncrementConfig:
+ return LongIncrementConfig(
+ enabled=params.get_bool("LongIncrementsEnabled"),
+ tap_step=_clamp_step(params.get("LongIncrementTapStep", return_default=True)),
+ hold_step=_clamp_step(params.get("LongIncrementHoldStep", return_default=True)),
+ )
+
+
+def resolve_button_step(config: LongIncrementConfig, held: bool, unit_step: float) -> tuple[bool, float]:
+ """
+ Turn a single tap/hold cruise button event into a (snap_to_grid, delta) pair,
+ where delta is expressed in the same unit as unit_step (kph, or the mph-derived
+ increment used for imperial cars).
+ """
+ if not config.enabled:
+ return held, unit_step * (STOCK_HOLD_MULTIPLIER if held else 1)
+
+ multiplier = config.hold_step if held else config.tap_step
+ snap_to_grid = multiplier >= SNAP_TO_GRID_THRESHOLD
+ return snap_to_grid, unit_step * multiplier
diff --git a/iqpilot/selfdrive/car/refresh_car_list.py b/iqpilot/selfdrive/car/refresh_car_list.py
new file mode 100644
index 000000000..35e3bc6ea
--- /dev/null
+++ b/iqpilot/selfdrive/car/refresh_car_list.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.selfdrive.car.vehicle_catalog import load_catalog
+
+
+def refresh_car_list_param() -> None:
+ platforms = load_catalog()
+ if not platforms:
+ cloudlog.warning("vehicle catalog not found; leaving CarList param unchanged")
+ return
+
+ params = Params()
+ if params.get("CarList") == platforms:
+ cloudlog.warning("CarList param already current, nothing to write")
+ return
+
+ params.put("CarList", platforms)
+ cloudlog.warning("CarList param refreshed from vehicle catalog")
+
+
+if __name__ == "__main__":
+ refresh_car_list_param()
diff --git a/iqpilot/selfdrive/car/tests/__init__.py b/iqpilot/selfdrive/car/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/car/tests/test_longitudinal_mode_persistence.py b/iqpilot/selfdrive/car/tests/test_longitudinal_mode_persistence.py
new file mode 100644
index 000000000..79964dba8
--- /dev/null
+++ b/iqpilot/selfdrive/car/tests/test_longitudinal_mode_persistence.py
@@ -0,0 +1,38 @@
+from cereal import custom
+from iqdbc.car import structs
+
+from openpilot.iqpilot.selfdrive.car.interfaces import _cleanup_unsupported_params
+
+
+class DummyParams:
+ def __init__(self):
+ self.removed: list[str] = []
+ self.values: dict[str, object] = {}
+
+ def remove(self, key: str) -> None:
+ self.removed.append(key)
+
+ def get_bool(self, key: str) -> bool:
+ return bool(self.values.get(key, False))
+
+ def get(self, key: str, return_default: bool = False):
+ return self.values.get(key)
+
+ def put(self, key: str, value) -> None:
+ self.values[key] = value
+
+
+class TestLongitudinalModePersistence:
+ def test_iq_dynamic_mode_is_not_removed_when_openpilot_long_is_unavailable(self):
+ params = DummyParams()
+ cp = structs.CarParams()
+ cp.openpilotLongitudinalControl = False
+ cp.steerControlType = structs.CarParams.SteerControlType.torque
+
+ cp_iq = custom.IQCarParams()
+ cp_iq.pcmCruiseSpeed = True
+
+ _cleanup_unsupported_params(cp, cp_iq, params)
+
+ assert "IQDynamicMode" not in params.removed
+ assert "LongIncrementsEnabled" in params.removed
diff --git a/iqpilot/selfdrive/car/tests/test_speed_limit_set_speed.py b/iqpilot/selfdrive/car/tests/test_speed_limit_set_speed.py
new file mode 100644
index 000000000..aa8e5d836
--- /dev/null
+++ b/iqpilot/selfdrive/car/tests/test_speed_limit_set_speed.py
@@ -0,0 +1,121 @@
+from types import SimpleNamespace
+
+import pytest
+
+from cereal import car, custom
+from openpilot.common.constants import CV
+from openpilot.iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import build_iq_control_params_from_plan
+from openpilot.selfdrive.car.cruise import VCruiseHelper
+
+
+class TestSpeedLimitSetSpeedMirror:
+ def setup_method(self):
+ self.CP = car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True)
+ self.CP_IQ = custom.IQCarParams(pcmCruiseSpeed=True)
+ self.v_cruise_helper = VCruiseHelper(self.CP, self.CP_IQ)
+ self.v_cruise_helper.set_speed_to_limit = True
+
+ @staticmethod
+ def _iq_plan(limit_mps: float, state) -> SimpleNamespace:
+ resolver = SimpleNamespace(
+ speedLimitValid=limit_mps > 0,
+ speedLimitLastValid=limit_mps > 0,
+ speedLimitFinalLast=limit_mps,
+ )
+ assist = SimpleNamespace(state=state)
+ return SimpleNamespace(speedLimit=SimpleNamespace(resolver=resolver, assist=assist))
+
+ def test_op_long_mirrors_active_speed_limit_target_into_cluster_speed(self):
+ self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.active))
+
+ CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35})
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ assert self.v_cruise_helper.v_cruise_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+
+ def test_op_long_syncs_to_new_limit_even_when_assist_not_active(self):
+ self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.inactive))
+
+ CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35})
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ assert self.v_cruise_helper.v_cruise_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+
+ def test_op_long_allows_manual_set_speed_changes_between_limit_changes(self):
+ self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.inactive))
+
+ # First cycle after a valid limit appears will sync to the resolved target.
+ CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35})
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ # On later cycles with the same limit, manual set speed changes should be preserved.
+ CS = car.CarState(cruiseState={"available": True, "speed": 15.64, "speedCluster": 15.64})
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ assert self.v_cruise_helper.v_cruise_kph == pytest.approx(15.64 * CV.MS_TO_KPH, abs=0.1)
+ assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(15.64 * CV.MS_TO_KPH, abs=0.1)
+
+ def test_op_long_resyncs_when_limit_changes(self):
+ self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.inactive))
+
+ CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35})
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ CS = car.CarState(cruiseState={"available": True, "speed": 15.64, "speedCluster": 15.64})
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(13.41, custom.IQPlan.SpeedLimit.AssistState.inactive))
+ self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ assert self.v_cruise_helper.v_cruise_kph == pytest.approx(13.41 * CV.MS_TO_KPH, abs=0.1)
+ assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(13.41 * CV.MS_TO_KPH, abs=0.1)
+
+
+def test_set_speed_does_not_follow_limit_when_feature_off():
+ # Default off: set speed must stay the driver's value (limiter-only via planner min-blend).
+ CP = car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True)
+ CP_IQ = custom.IQCarParams(pcmCruiseSpeed=True)
+ helper = VCruiseHelper(CP, CP_IQ)
+ helper.set_speed_to_limit = False
+ helper.update_speed_limit_assist(False, TestSpeedLimitSetSpeedMirror._iq_plan(
+ 17.88, custom.IQPlan.SpeedLimit.AssistState.active))
+
+ CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35})
+ helper.update_v_cruise(CS, enabled=True, is_metric=False)
+
+ # Set speed tracks the car's cruise speed, NOT the 17.88 m/s limit.
+ assert helper.v_cruise_kph == pytest.approx(22.35 * CV.MS_TO_KPH, abs=0.1)
+
+
+def test_enhanced_stock_longitudinal_control_syncs_once_then_follows_cluster_speed():
+ CP = car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True)
+ resolver = SimpleNamespace(speedLimitFinalLast=17.88)
+ assist = SimpleNamespace(enabled=True)
+ iq_plan = SimpleNamespace(speedLimit=SimpleNamespace(resolver=resolver, assist=assist))
+
+ params, sync_limit, pending_limit = build_iq_control_params_from_plan(
+ CP, iq_plan, True, current_set_speed_kph=100.0, previous_sync_limit_kph=None, pending_sync_limit_kph=None
+ )
+ assert sync_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert pending_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert float(params[0]["value"].decode("utf-8")) == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+
+ params, sync_limit, pending_limit = build_iq_control_params_from_plan(
+ CP, iq_plan, True, current_set_speed_kph=22.0, previous_sync_limit_kph=sync_limit, pending_sync_limit_kph=pending_limit
+ )
+ assert sync_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert pending_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert float(params[0]["value"].decode("utf-8")) == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+
+ params, sync_limit, pending_limit = build_iq_control_params_from_plan(
+ CP, iq_plan, True, current_set_speed_kph=17.88 * CV.MS_TO_KPH, previous_sync_limit_kph=sync_limit, pending_sync_limit_kph=pending_limit
+ )
+ assert sync_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1)
+ assert pending_limit is None
+
+ params, sync_limit, pending_limit = build_iq_control_params_from_plan(
+ CP, iq_plan, True, current_set_speed_kph=22.0, previous_sync_limit_kph=sync_limit, pending_sync_limit_kph=pending_limit
+ )
+ assert float(params[0]["value"].decode("utf-8")) == pytest.approx(22.0, abs=0.1)
diff --git a/iqpilot/selfdrive/car/vehicle_catalog.json b/iqpilot/selfdrive/car/vehicle_catalog.json
new file mode 100644
index 000000000..07cd84b2d
--- /dev/null
+++ b/iqpilot/selfdrive/car/vehicle_catalog.json
@@ -0,0 +1,4876 @@
+{
+ "catalog": "iqlvbs/supported-vehicles",
+ "rev": 1,
+ "vehicles": {
+ "ACURA_ILX|2016-2018": {
+ "label": "Acura ILX 2016-18",
+ "id": "ACURA_ILX",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "ILX",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018"
+ ],
+ "req": "Technology Plus Package or AcuraWatch Plus"
+ },
+ "ACURA_ILX|2019": {
+ "label": "Acura ILX 2019",
+ "id": "ACURA_ILX",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "ILX",
+ "yrs": [
+ "2019"
+ ],
+ "req": "All"
+ },
+ "ACURA_MDX_4G_MMR|2025-2026": {
+ "label": "Acura MDX 2025-26",
+ "id": "ACURA_MDX_4G_MMR",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "MDX",
+ "yrs": [
+ "2025",
+ "2026"
+ ],
+ "req": "All except Type S"
+ },
+ "ACURA_RDX|2016-2018": {
+ "label": "Acura RDX 2016-18",
+ "id": "ACURA_RDX",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "RDX",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018"
+ ],
+ "req": "AcuraWatch Plus or Advance Package"
+ },
+ "ACURA_RDX_3G|2019-2021": {
+ "label": "Acura RDX 2019-21",
+ "id": "ACURA_RDX_3G",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "RDX",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "ACURA_TLX_2G|2021": {
+ "label": "Acura TLX 2021",
+ "id": "ACURA_TLX_2G",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "TLX",
+ "yrs": [
+ "2021"
+ ],
+ "req": "All"
+ },
+ "ACURA_TLX_2G_MMR|2025": {
+ "label": "Acura TLX 2025",
+ "id": "ACURA_TLX_2G_MMR",
+ "mk": "Acura",
+ "grp": "honda",
+ "mdl": "TLX",
+ "yrs": [
+ "2025"
+ ],
+ "req": "All"
+ },
+ "AUDI_A3_MK3|2014-2019": {
+ "label": "Audi A3 2014-19",
+ "id": "AUDI_A3_MK3",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "A3",
+ "yrs": [
+ "2014",
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "AUDI_A3_MK3|2017-2018": {
+ "label": "Audi A3 Sportback e-tron 2017-18",
+ "id": "AUDI_A3_MK3",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "A3 Sportback e-tron",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "AUDI_Q2_MK1|2018": {
+ "label": "Audi Q2 2018",
+ "id": "AUDI_Q2_MK1",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "Q2",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "AUDI_Q3_MK2|2019-2024": {
+ "label": "Audi Q3 2019-24",
+ "id": "AUDI_Q3_MK2",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "Q3",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "AUDI_Q5_MK1|2013-2017": {
+ "label": "Audi Q5 2013-17",
+ "id": "AUDI_Q5_MK1",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "Q5",
+ "yrs": [
+ "2013",
+ "2014",
+ "2015",
+ "2016",
+ "2017"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "PORSCHE_MACAN_MK1|2015-2026": {
+ "label": "Porsche Macan 2015-",
+ "id": "PORSCHE_MACAN_MK1",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "Macan",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025",
+ "2026"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "AUDI_A3_MK3|2018": {
+ "label": "Audi RS3 2018",
+ "id": "AUDI_A3_MK3",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "RS3",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "AUDI_A3_MK3|2015-2017": {
+ "label": "Audi S3 2015-17",
+ "id": "AUDI_A3_MK3",
+ "mk": "Audi",
+ "grp": "volkswagen",
+ "mdl": "S3",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "BUICK_LACROSSE|2017-2019": {
+ "label": "Buick LaCrosse 2017-19",
+ "id": "BUICK_LACROSSE",
+ "mk": "Buick",
+ "grp": "gm",
+ "mdl": "LaCrosse",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Driver Confidence Package 2"
+ },
+ "CADILLAC_ESCALADE|2017": {
+ "label": "Cadillac Escalade 2017",
+ "id": "CADILLAC_ESCALADE",
+ "mk": "Cadillac",
+ "grp": "gm",
+ "mdl": "Escalade",
+ "yrs": [
+ "2017"
+ ],
+ "req": "Driver Assist Package"
+ },
+ "CADILLAC_ESCALADE_ESV|2016": {
+ "label": "Cadillac Escalade ESV 2016",
+ "id": "CADILLAC_ESCALADE_ESV",
+ "mk": "Cadillac",
+ "grp": "gm",
+ "mdl": "Escalade ESV",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & LKAS"
+ },
+ "CADILLAC_ESCALADE_ESV_2019|2019": {
+ "label": "Cadillac Escalade ESV 2019",
+ "id": "CADILLAC_ESCALADE_ESV_2019",
+ "mk": "Cadillac",
+ "grp": "gm",
+ "mdl": "Escalade ESV",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & LKAS"
+ },
+ "CADILLAC_XT4|2023": {
+ "label": "Cadillac XT4 2023",
+ "id": "CADILLAC_XT4",
+ "mk": "Cadillac",
+ "grp": "gm",
+ "mdl": "XT4",
+ "yrs": [
+ "2023"
+ ],
+ "req": "Driver Assist Package"
+ },
+ "CHEVROLET_BOLT_EUV|2022-2023": {
+ "label": "Chevrolet Bolt EUV 2022-23",
+ "id": "CHEVROLET_BOLT_EUV",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Bolt EUV",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Premier or Premier Redline Trim, without Super Cruise Package"
+ },
+ "CHEVROLET_BOLT_EUV|2022-2023#2": {
+ "label": "Chevrolet Bolt EV 2022-23",
+ "id": "CHEVROLET_BOLT_EUV",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Bolt EV",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "2LT Trim with Adaptive Cruise Control Package"
+ },
+ "CHEVROLET_BOLT_NON_ACC|2017": {
+ "label": "Chevrolet Bolt EV Non-ACC 2017",
+ "id": "CHEVROLET_BOLT_NON_ACC",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Bolt EV Non-ACC",
+ "yrs": [
+ "2017"
+ ],
+ "req": "No Adaptive Cruise Control (Non-ACC)"
+ },
+ "CHEVROLET_BOLT_NON_ACC_1ST_GEN|2018-2021": {
+ "label": "Chevrolet Bolt EV Non-ACC 2018-21",
+ "id": "CHEVROLET_BOLT_NON_ACC_1ST_GEN",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Bolt EV Non-ACC",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "No Adaptive Cruise Control (Non-ACC)"
+ },
+ "CHEVROLET_EQUINOX|2019-2022": {
+ "label": "Chevrolet Equinox 2019-22",
+ "id": "CHEVROLET_EQUINOX",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Equinox",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHEVROLET_MALIBU_NON_ACC_9TH_GEN|2016-2023": {
+ "label": "Chevrolet Malibu Non-ACC 2016-23",
+ "id": "CHEVROLET_MALIBU_NON_ACC_9TH_GEN",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Malibu Non-ACC",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "No Adaptive Cruise Control (Non-ACC)"
+ },
+ "CHEVROLET_SILVERADO|2020-2021": {
+ "label": "Chevrolet Silverado 1500 2020-21",
+ "id": "CHEVROLET_SILVERADO",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Silverado 1500",
+ "yrs": [
+ "2020",
+ "2021"
+ ],
+ "req": "Safety Package II"
+ },
+ "CHEVROLET_TRAILBLAZER|2021-2022": {
+ "label": "Chevrolet Trailblazer 2021-22",
+ "id": "CHEVROLET_TRAILBLAZER",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Trailblazer",
+ "yrs": [
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHEVROLET_TRAVERSE|2022-2023": {
+ "label": "Chevrolet Traverse 2022-23",
+ "id": "CHEVROLET_TRAVERSE",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Traverse",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "RS, Premier, or High Country Trim"
+ },
+ "CHEVROLET_VOLT|2017-2018": {
+ "label": "Chevrolet Volt 2017-18",
+ "id": "CHEVROLET_VOLT",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Volt",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHEVROLET_VOLT_2019|2019": {
+ "label": "Chevrolet Volt 2019",
+ "id": "CHEVROLET_VOLT_2019",
+ "mk": "Chevrolet",
+ "grp": "gm",
+ "mdl": "Volt",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & LKAS"
+ },
+ "CHRYSLER_PACIFICA_2018|2017-2018": {
+ "label": "Chrysler Pacifica 2017-18",
+ "id": "CHRYSLER_PACIFICA_2018",
+ "mk": "Chrysler",
+ "grp": "chrysler",
+ "mdl": "Pacifica",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHRYSLER_PACIFICA_2020|2019-2020": {
+ "label": "Chrysler Pacifica 2019-20",
+ "id": "CHRYSLER_PACIFICA_2020",
+ "mk": "Chrysler",
+ "grp": "chrysler",
+ "mdl": "Pacifica",
+ "yrs": [
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHRYSLER_PACIFICA_2020|2021-2023": {
+ "label": "Chrysler Pacifica 2021-23",
+ "id": "CHRYSLER_PACIFICA_2020",
+ "mk": "Chrysler",
+ "grp": "chrysler",
+ "mdl": "Pacifica",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "CHRYSLER_PACIFICA_2018_HYBRID|2017-2018": {
+ "label": "Chrysler Pacifica Hybrid 2017-18",
+ "id": "CHRYSLER_PACIFICA_2018_HYBRID",
+ "mk": "Chrysler",
+ "grp": "chrysler",
+ "mdl": "Pacifica Hybrid",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHRYSLER_PACIFICA_2019_HYBRID|2019-2025": {
+ "label": "Chrysler Pacifica Hybrid 2019-25",
+ "id": "CHRYSLER_PACIFICA_2019_HYBRID",
+ "mk": "Chrysler",
+ "grp": "chrysler",
+ "mdl": "Pacifica Hybrid",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "COMMA_BODY|na": {
+ "label": "comma body",
+ "id": "COMMA_BODY",
+ "mk": "comma",
+ "grp": "body",
+ "mdl": "body",
+ "yrs": [],
+ "req": "All"
+ },
+ "SEAT_ATECA_MK1|2018-2023": {
+ "label": "CUPRA Ateca 2018-23",
+ "id": "SEAT_ATECA_MK1",
+ "mk": "CUPRA",
+ "grp": "volkswagen",
+ "mdl": "Ateca",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "DODGE_DURANGO|2020-2021": {
+ "label": "Dodge Durango 2020-21",
+ "id": "DODGE_DURANGO",
+ "mk": "Dodge",
+ "grp": "chrysler",
+ "mdl": "Durango",
+ "yrs": [
+ "2020",
+ "2021"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "FORD_BRONCO_SPORT_MK1|2021-2024": {
+ "label": "Ford Bronco Sport 2021-24",
+ "id": "FORD_BRONCO_SPORT_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Bronco Sport",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_ESCAPE_MK4|2020-2022": {
+ "label": "Ford Escape 2020-22",
+ "id": "FORD_ESCAPE_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Escape",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_ESCAPE_MK4_5|2023-2024": {
+ "label": "Ford Escape 2023-24",
+ "id": "FORD_ESCAPE_MK4_5",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Escape",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_ESCAPE_MK4|2020-2022#2": {
+ "label": "Ford Escape Hybrid 2020-22",
+ "id": "FORD_ESCAPE_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Escape Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_ESCAPE_MK4_5|2023-2024#2": {
+ "label": "Ford Escape Hybrid 2023-24",
+ "id": "FORD_ESCAPE_MK4_5",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Escape Hybrid",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_ESCAPE_MK4|2020-2022#3": {
+ "label": "Ford Escape Plug-in Hybrid 2020-22",
+ "id": "FORD_ESCAPE_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Escape Plug-in Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_ESCAPE_MK4_5|2023-2024#3": {
+ "label": "Ford Escape Plug-in Hybrid 2023-24",
+ "id": "FORD_ESCAPE_MK4_5",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Escape Plug-in Hybrid",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_EXPEDITION_MK4|2022-2024": {
+ "label": "Ford Expedition 2022-24",
+ "id": "FORD_EXPEDITION_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Expedition",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist 2.0"
+ },
+ "FORD_EXPLORER_MK6|2020-2024": {
+ "label": "Ford Explorer 2020-24",
+ "id": "FORD_EXPLORER_MK6",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Explorer",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_EXPLORER_MK6|2020-2024#2": {
+ "label": "Ford Explorer Hybrid 2020-24",
+ "id": "FORD_EXPLORER_MK6",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Explorer Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist+"
+ },
+ "FORD_F_150_MK14|2021-2023": {
+ "label": "Ford F-150 2021-23",
+ "id": "FORD_F_150_MK14",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "F-150",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Co-Pilot360 Assist 2.0"
+ },
+ "FORD_F_150_MK14|2021-2023#2": {
+ "label": "Ford F-150 Hybrid 2021-23",
+ "id": "FORD_F_150_MK14",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "F-150 Hybrid",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Co-Pilot360 Assist 2.0"
+ },
+ "FORD_F_150_LIGHTNING_MK1|2022-2023": {
+ "label": "Ford F-150 Lightning 2022-23",
+ "id": "FORD_F_150_LIGHTNING_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "F-150 Lightning",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Co-Pilot360 Assist 2.0"
+ },
+ "FORD_FOCUS_MK4|2018": {
+ "label": "Ford Focus 2018",
+ "id": "FORD_FOCUS_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Focus",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control with Lane Centering"
+ },
+ "FORD_FOCUS_MK4|2018#2": {
+ "label": "Ford Focus Hybrid 2018",
+ "id": "FORD_FOCUS_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Focus Hybrid",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control with Lane Centering"
+ },
+ "FORD_ESCAPE_MK4|2020-2023": {
+ "label": "Ford Kuga 2020-23",
+ "id": "FORD_ESCAPE_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Kuga",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control with Lane Centering"
+ },
+ "FORD_ESCAPE_MK4|2020-2023#2": {
+ "label": "Ford Kuga Hybrid 2020-23",
+ "id": "FORD_ESCAPE_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Kuga Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control with Lane Centering"
+ },
+ "FORD_ESCAPE_MK4_5|2024": {
+ "label": "Ford Kuga Hybrid 2024",
+ "id": "FORD_ESCAPE_MK4_5",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Kuga Hybrid",
+ "yrs": [
+ "2024"
+ ],
+ "req": "All"
+ },
+ "FORD_ESCAPE_MK4|2020-2023#3": {
+ "label": "Ford Kuga Plug-in Hybrid 2020-23",
+ "id": "FORD_ESCAPE_MK4",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Kuga Plug-in Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control with Lane Centering"
+ },
+ "FORD_ESCAPE_MK4_5|2024#2": {
+ "label": "Ford Kuga Plug-in Hybrid 2024",
+ "id": "FORD_ESCAPE_MK4_5",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Kuga Plug-in Hybrid",
+ "yrs": [
+ "2024"
+ ],
+ "req": "All"
+ },
+ "FORD_MAVERICK_MK1|2022": {
+ "label": "Ford Maverick 2022",
+ "id": "FORD_MAVERICK_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Maverick",
+ "yrs": [
+ "2022"
+ ],
+ "req": "LARIAT Luxury"
+ },
+ "FORD_MAVERICK_MK1|2023-2024": {
+ "label": "Ford Maverick 2023-24",
+ "id": "FORD_MAVERICK_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Maverick",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist"
+ },
+ "FORD_MAVERICK_MK1|2022#2": {
+ "label": "Ford Maverick Hybrid 2022",
+ "id": "FORD_MAVERICK_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Maverick Hybrid",
+ "yrs": [
+ "2022"
+ ],
+ "req": "LARIAT Luxury"
+ },
+ "FORD_MAVERICK_MK1|2023-2024#2": {
+ "label": "Ford Maverick Hybrid 2023-24",
+ "id": "FORD_MAVERICK_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Maverick Hybrid",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Assist"
+ },
+ "FORD_MUSTANG_MACH_E_MK1|2021-2024": {
+ "label": "Ford Mustang Mach-E 2021-24",
+ "id": "FORD_MUSTANG_MACH_E_MK1",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Mustang Mach-E",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "FORD_RANGER_MK2|2024": {
+ "label": "Ford Ranger 2024",
+ "id": "FORD_RANGER_MK2",
+ "mk": "Ford",
+ "grp": "ford",
+ "mdl": "Ranger",
+ "yrs": [
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control with Lane Centering"
+ },
+ "GENESIS_G70|2018": {
+ "label": "Genesis G70 2018",
+ "id": "GENESIS_G70",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G70",
+ "yrs": [
+ "2018"
+ ],
+ "req": "All"
+ },
+ "GENESIS_G70_2020|2019-2021": {
+ "label": "Genesis G70 2019-21",
+ "id": "GENESIS_G70_2020",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G70",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "GENESIS_G70_2020|2022-2023": {
+ "label": "Genesis G70 2022-23",
+ "id": "GENESIS_G70_2020",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G70",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_GENESIS|2017": {
+ "label": "Genesis G80 2017",
+ "id": "HYUNDAI_GENESIS",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G80",
+ "yrs": [
+ "2017"
+ ],
+ "req": "All"
+ },
+ "GENESIS_G80|2018-2019": {
+ "label": "Genesis G80 2018-19",
+ "id": "GENESIS_G80",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G80",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "GENESIS_G80_2ND_GEN_FL|2024": {
+ "label": "Genesis G80 (2.5T Advanced Trim, with HDA II) 2024",
+ "id": "GENESIS_G80_2ND_GEN_FL",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G80 (2.5T Advanced Trim, with HDA II)",
+ "yrs": [
+ "2024"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "GENESIS_G90|2017-2020": {
+ "label": "Genesis G90 2017-20",
+ "id": "GENESIS_G90",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "G90",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "GENESIS_GV60_EV_1ST_GEN|2023": {
+ "label": "Genesis GV60 (Advanced Trim) 2023",
+ "id": "GENESIS_GV60_EV_1ST_GEN",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV60 (Advanced Trim)",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "GENESIS_GV60_EV_1ST_GEN|2022-2023": {
+ "label": "Genesis GV60 (Performance Trim) 2022-23",
+ "id": "GENESIS_GV60_EV_1ST_GEN",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV60 (Performance Trim)",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "GENESIS_GV70_1ST_GEN|2022-2024": {
+ "label": "Genesis GV70 (2.5T Trim, without HDA II) 2022-24",
+ "id": "GENESIS_GV70_1ST_GEN",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV70 (2.5T Trim, without HDA II)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "GENESIS_GV70_1ST_GEN|2022-2023": {
+ "label": "Genesis GV70 (3.5T Trim, without HDA II) 2022-23",
+ "id": "GENESIS_GV70_1ST_GEN",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV70 (3.5T Trim, without HDA II)",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "GENESIS_GV70_ELECTRIFIED_1ST_GEN|2022": {
+ "label": "Genesis GV70 Electrified (Australia Only) 2022",
+ "id": "GENESIS_GV70_ELECTRIFIED_1ST_GEN",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV70 Electrified (Australia Only)",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "GENESIS_GV70_ELECTRIFIED_1ST_GEN|2023-2024": {
+ "label": "Genesis GV70 Electrified (with HDA II) 2023-24",
+ "id": "GENESIS_GV70_ELECTRIFIED_1ST_GEN",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV70 Electrified (with HDA II)",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "GENESIS_GV80|2023": {
+ "label": "Genesis GV80 2023",
+ "id": "GENESIS_GV80",
+ "mk": "Genesis",
+ "grp": "hyundai",
+ "mdl": "GV80",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "GMC_ACADIA|2018": {
+ "label": "GMC Acadia 2018",
+ "id": "GMC_ACADIA",
+ "mk": "GMC",
+ "grp": "gm",
+ "mdl": "Acadia",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "CHEVROLET_SILVERADO|2020-2021#2": {
+ "label": "GMC Sierra 1500 2020-21",
+ "id": "CHEVROLET_SILVERADO",
+ "mk": "GMC",
+ "grp": "gm",
+ "mdl": "Sierra 1500",
+ "yrs": [
+ "2020",
+ "2021"
+ ],
+ "req": "Driver Alert Package II"
+ },
+ "HONDA_ACCORD|2018-2022": {
+ "label": "Honda Accord 2018-22",
+ "id": "HONDA_ACCORD",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Accord",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "HONDA_ACCORD_11G|2023-2025": {
+ "label": "Honda Accord 2023-25",
+ "id": "HONDA_ACCORD_11G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Accord",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "HONDA_ACCORD|2018-2022#2": {
+ "label": "Honda Accord Hybrid 2018-22",
+ "id": "HONDA_ACCORD",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Accord Hybrid",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "HONDA_ACCORD_11G|2023-2025#2": {
+ "label": "Honda Accord Hybrid 2023-25",
+ "id": "HONDA_ACCORD_11G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Accord Hybrid",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "HONDA_CITY_7G|2023": {
+ "label": "Honda City (Brazil only) 2023",
+ "id": "HONDA_CITY_7G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "City (Brazil only)",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC|2016-2018": {
+ "label": "Honda Civic 2016-18",
+ "id": "HONDA_CIVIC",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_CIVIC_BOSCH|2019-2021": {
+ "label": "Honda Civic 2019-21",
+ "id": "HONDA_CIVIC_BOSCH",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC_2022|2022-2024": {
+ "label": "Honda Civic 2022-24",
+ "id": "HONDA_CIVIC_2022",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC_BOSCH|2017-2018": {
+ "label": "Honda Civic Hatchback 2017-18",
+ "id": "HONDA_CIVIC_BOSCH",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic Hatchback",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_CIVIC_BOSCH|2019-2021#2": {
+ "label": "Honda Civic Hatchback 2019-21",
+ "id": "HONDA_CIVIC_BOSCH",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic Hatchback",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC_2022|2022-2024#2": {
+ "label": "Honda Civic Hatchback 2022-24",
+ "id": "HONDA_CIVIC_2022",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic Hatchback",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC_2022|2025-2026": {
+ "label": "Honda Civic Hatchback Hybrid 2025-26",
+ "id": "HONDA_CIVIC_2022",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic Hatchback Hybrid",
+ "yrs": [
+ "2025",
+ "2026"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC_2022|2023": {
+ "label": "Honda Civic Hatchback Hybrid (Europe only) 2023",
+ "id": "HONDA_CIVIC_2022",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic Hatchback Hybrid (Europe only)",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HONDA_CIVIC_2022|2025-2026#2": {
+ "label": "Honda Civic Hybrid 2025-26",
+ "id": "HONDA_CIVIC_2022",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Civic Hybrid",
+ "yrs": [
+ "2025",
+ "2026"
+ ],
+ "req": "All"
+ },
+ "HONDA_CLARITY|2018-2021": {
+ "label": "Honda Clarity 2018-21",
+ "id": "HONDA_CLARITY",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Clarity",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_CRV|2015-2016": {
+ "label": "Honda CR-V 2015-16",
+ "id": "HONDA_CRV",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "CR-V",
+ "yrs": [
+ "2015",
+ "2016"
+ ],
+ "req": "Touring Trim"
+ },
+ "HONDA_CRV_5G|2017-2022": {
+ "label": "Honda CR-V 2017-22",
+ "id": "HONDA_CRV_5G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "CR-V",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_CRV_6G|2023-2026": {
+ "label": "Honda CR-V 2023-26",
+ "id": "HONDA_CRV_6G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "CR-V",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025",
+ "2026"
+ ],
+ "req": "All"
+ },
+ "HONDA_CRV_HYBRID|2017-2022": {
+ "label": "Honda CR-V Hybrid 2017-22",
+ "id": "HONDA_CRV_HYBRID",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "CR-V Hybrid",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_CRV_6G|2023-2026#2": {
+ "label": "Honda CR-V Hybrid 2023-26",
+ "id": "HONDA_CRV_6G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "CR-V Hybrid",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025",
+ "2026"
+ ],
+ "req": "All"
+ },
+ "HONDA_E|2020": {
+ "label": "Honda e 2020",
+ "id": "HONDA_E",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "e",
+ "yrs": [
+ "2020"
+ ],
+ "req": "All"
+ },
+ "HONDA_FIT|2018-2020": {
+ "label": "Honda Fit 2018-20",
+ "id": "HONDA_FIT",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Fit",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_FREED|2020": {
+ "label": "Honda Freed 2020",
+ "id": "HONDA_FREED",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Freed",
+ "yrs": [
+ "2020"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_HRV|2019-2022": {
+ "label": "Honda HR-V 2019-22",
+ "id": "HONDA_HRV",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "HR-V",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_HRV_3G|2023-2025": {
+ "label": "Honda HR-V 2023-25",
+ "id": "HONDA_HRV_3G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "HR-V",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "HONDA_INSIGHT|2019-2022": {
+ "label": "Honda Insight 2019-22",
+ "id": "HONDA_INSIGHT",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Insight",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "HONDA_ACCORD|2018": {
+ "label": "Honda Inspire 2018",
+ "id": "HONDA_ACCORD",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Inspire",
+ "yrs": [
+ "2018"
+ ],
+ "req": "All"
+ },
+ "HONDA_NBOX_2G|2018": {
+ "label": "Honda N-Box 2018",
+ "id": "HONDA_NBOX_2G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "N-Box",
+ "yrs": [
+ "2018"
+ ],
+ "req": "All"
+ },
+ "HONDA_ODYSSEY|2018-2020": {
+ "label": "Honda Odyssey 2018-20",
+ "id": "HONDA_ODYSSEY",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Odyssey",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_ODYSSEY_5G_MMR|2021-2026": {
+ "label": "Honda Odyssey 2021-26",
+ "id": "HONDA_ODYSSEY_5G_MMR",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Odyssey",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025",
+ "2026"
+ ],
+ "req": "All"
+ },
+ "HONDA_ODYSSEY_TWN|2018-2019": {
+ "label": "Honda Odyssey (Taiwan) 2018-19",
+ "id": "HONDA_ODYSSEY_TWN",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Odyssey (Taiwan)",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_PILOT|2019-2025": {
+ "label": "Honda Passport 2019-25",
+ "id": "HONDA_PILOT",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Passport",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "HONDA_PASSPORT_4G|2026": {
+ "label": "Honda Passport 2026",
+ "id": "HONDA_PASSPORT_4G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Passport",
+ "yrs": [
+ "2026"
+ ],
+ "req": "All"
+ },
+ "HONDA_PILOT|2016-2022": {
+ "label": "Honda Pilot 2016-22",
+ "id": "HONDA_PILOT",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Pilot",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HONDA_PILOT_4G|2023-2025": {
+ "label": "Honda Pilot 2023-25",
+ "id": "HONDA_PILOT_4G",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Pilot",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "HONDA_RIDGELINE|2017-2025": {
+ "label": "Honda Ridgeline 2017-25",
+ "id": "HONDA_RIDGELINE",
+ "mk": "Honda",
+ "grp": "honda",
+ "mdl": "Ridgeline",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "Honda Sensing"
+ },
+ "HYUNDAI_AZERA_6TH_GEN|2022": {
+ "label": "Hyundai Azera 2022",
+ "id": "HYUNDAI_AZERA_6TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Azera",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_AZERA_HEV_6TH_GEN|2019": {
+ "label": "Hyundai Azera Hybrid 2019",
+ "id": "HYUNDAI_AZERA_HEV_6TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Azera Hybrid",
+ "yrs": [
+ "2019"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_AZERA_HEV_6TH_GEN|2020": {
+ "label": "Hyundai Azera Hybrid 2020",
+ "id": "HYUNDAI_AZERA_HEV_6TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Azera Hybrid",
+ "yrs": [
+ "2020"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_CUSTIN_1ST_GEN|2023": {
+ "label": "Hyundai Custin 2023",
+ "id": "HYUNDAI_CUSTIN_1ST_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Custin",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_ELANTRA|2017-2018": {
+ "label": "Hyundai Elantra 2017-18",
+ "id": "HYUNDAI_ELANTRA",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Elantra",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_ELANTRA|2019": {
+ "label": "Hyundai Elantra 2019",
+ "id": "HYUNDAI_ELANTRA",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Elantra",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_ELANTRA_2021|2021-2023": {
+ "label": "Hyundai Elantra 2021-23",
+ "id": "HYUNDAI_ELANTRA_2021",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Elantra",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_ELANTRA_GT_I30|2017-2020": {
+ "label": "Hyundai Elantra GT 2017-20",
+ "id": "HYUNDAI_ELANTRA_GT_I30",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Elantra GT",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_ELANTRA_HEV_2021|2021-2023": {
+ "label": "Hyundai Elantra Hybrid 2021-23",
+ "id": "HYUNDAI_ELANTRA_HEV_2021",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Elantra Hybrid",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_ELANTRA_2022_NON_SCC|2022": {
+ "label": "Hyundai Elantra Non-SCC 2022",
+ "id": "HYUNDAI_ELANTRA_2022_NON_SCC",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Elantra Non-SCC",
+ "yrs": [
+ "2022"
+ ],
+ "req": "No Smart Cruise Control (Non-SCC)"
+ },
+ "HYUNDAI_GENESIS|2015-2016": {
+ "label": "Hyundai Genesis 2015-16",
+ "id": "HYUNDAI_GENESIS",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Genesis",
+ "yrs": [
+ "2015",
+ "2016"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_ELANTRA_GT_I30|2017-2019": {
+ "label": "Hyundai i30 2017-19",
+ "id": "HYUNDAI_ELANTRA_GT_I30",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "i30",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_IONIQ_5|2022-2024": {
+ "label": "Hyundai Ioniq 5 (Southeast Asia and Europe only) 2022-24",
+ "id": "HYUNDAI_IONIQ_5",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq 5 (Southeast Asia and Europe only)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_IONIQ_5|2022-2024#2": {
+ "label": "Hyundai Ioniq 5 (with HDA II) 2022-24",
+ "id": "HYUNDAI_IONIQ_5",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq 5 (with HDA II)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "HYUNDAI_IONIQ_5|2022-2024#3": {
+ "label": "Hyundai Ioniq 5 (without HDA II) 2022-24",
+ "id": "HYUNDAI_IONIQ_5",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq 5 (without HDA II)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Highway Driving Assist"
+ },
+ "HYUNDAI_IONIQ_6|2023-2024": {
+ "label": "Hyundai Ioniq 6 (with HDA II) 2023-24",
+ "id": "HYUNDAI_IONIQ_6",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq 6 (with HDA II)",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "HYUNDAI_IONIQ_EV_LTD|2019": {
+ "label": "Hyundai Ioniq Electric 2019",
+ "id": "HYUNDAI_IONIQ_EV_LTD",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq Electric",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_IONIQ_EV_2020|2020": {
+ "label": "Hyundai Ioniq Electric 2020",
+ "id": "HYUNDAI_IONIQ_EV_2020",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq Electric",
+ "yrs": [
+ "2020"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_IONIQ|2017-2019": {
+ "label": "Hyundai Ioniq Hybrid 2017-19",
+ "id": "HYUNDAI_IONIQ",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq Hybrid",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_IONIQ_HEV_2022|2020-2022": {
+ "label": "Hyundai Ioniq Hybrid 2020-22",
+ "id": "HYUNDAI_IONIQ_HEV_2022",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_IONIQ_PHEV_2019|2019": {
+ "label": "Hyundai Ioniq Plug-in Hybrid 2019",
+ "id": "HYUNDAI_IONIQ_PHEV_2019",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq Plug-in Hybrid",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_IONIQ_PHEV|2020-2022": {
+ "label": "Hyundai Ioniq Plug-in Hybrid 2020-22",
+ "id": "HYUNDAI_IONIQ_PHEV",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Ioniq Plug-in Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_KONA|2020": {
+ "label": "Hyundai Kona 2020",
+ "id": "HYUNDAI_KONA",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona",
+ "yrs": [
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_KONA_2022|2022-2023": {
+ "label": "Hyundai Kona 2022-23",
+ "id": "HYUNDAI_KONA_2022",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_KONA_EV|2018-2021": {
+ "label": "Hyundai Kona Electric 2018-21",
+ "id": "HYUNDAI_KONA_EV",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona Electric",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_KONA_EV_2022|2022-2023": {
+ "label": "Hyundai Kona Electric 2022-23",
+ "id": "HYUNDAI_KONA_EV_2022",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona Electric",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_KONA_EV_2ND_GEN|2023": {
+ "label": "Hyundai Kona Electric (with HDA II, Korea only) 2023",
+ "id": "HYUNDAI_KONA_EV_2ND_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona Electric (with HDA II, Korea only)",
+ "yrs": [
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_KONA_EV_NON_SCC|2019": {
+ "label": "Hyundai Kona Electric Non-SCC 2019",
+ "id": "HYUNDAI_KONA_EV_NON_SCC",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona Electric Non-SCC",
+ "yrs": [
+ "2019"
+ ],
+ "req": "No Smart Cruise Control (Non-SCC)"
+ },
+ "HYUNDAI_KONA_HEV|2020": {
+ "label": "Hyundai Kona Hybrid 2020",
+ "id": "HYUNDAI_KONA_HEV",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona Hybrid",
+ "yrs": [
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_KONA_NON_SCC|2019": {
+ "label": "Hyundai Kona Non-SCC 2019",
+ "id": "HYUNDAI_KONA_NON_SCC",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Kona Non-SCC",
+ "yrs": [
+ "2019"
+ ],
+ "req": "No Smart Cruise Control (Non-SCC)"
+ },
+ "HYUNDAI_NEXO_1ST_GEN|2021": {
+ "label": "Hyundai Nexo 2021",
+ "id": "HYUNDAI_NEXO_1ST_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Nexo",
+ "yrs": [
+ "2021"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_PALISADE|2020-2022": {
+ "label": "Hyundai Palisade 2020-22",
+ "id": "HYUNDAI_PALISADE",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Palisade",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_SANTA_CRUZ_1ST_GEN|2022-2024": {
+ "label": "Hyundai Santa Cruz 2022-24",
+ "id": "HYUNDAI_SANTA_CRUZ_1ST_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Santa Cruz",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_SANTA_FE|2019-2020": {
+ "label": "Hyundai Santa Fe 2019-20",
+ "id": "HYUNDAI_SANTA_FE",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Santa Fe",
+ "yrs": [
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_SANTA_FE_2022|2021-2023": {
+ "label": "Hyundai Santa Fe 2021-23",
+ "id": "HYUNDAI_SANTA_FE_2022",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Santa Fe",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_SANTA_FE_HEV_2022|2022-2023": {
+ "label": "Hyundai Santa Fe Hybrid 2022-23",
+ "id": "HYUNDAI_SANTA_FE_HEV_2022",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Santa Fe Hybrid",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_SANTA_FE_PHEV_2022|2022-2023": {
+ "label": "Hyundai Santa Fe Plug-in Hybrid 2022-23",
+ "id": "HYUNDAI_SANTA_FE_PHEV_2022",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Santa Fe Plug-in Hybrid",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_SONATA_LF|2018-2019": {
+ "label": "Hyundai Sonata 2018-19",
+ "id": "HYUNDAI_SONATA_LF",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Sonata",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_SONATA|2020-2023": {
+ "label": "Hyundai Sonata 2020-23",
+ "id": "HYUNDAI_SONATA",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Sonata",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_SONATA_HYBRID|2020-2023": {
+ "label": "Hyundai Sonata Hybrid 2020-23",
+ "id": "HYUNDAI_SONATA_HYBRID",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Sonata Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_STARIA_4TH_GEN|2023": {
+ "label": "Hyundai Staria 2023",
+ "id": "HYUNDAI_STARIA_4TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Staria",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_TUCSON|2021": {
+ "label": "Hyundai Tucson 2021",
+ "id": "HYUNDAI_TUCSON",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Tucson",
+ "yrs": [
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_TUCSON_4TH_GEN|2022": {
+ "label": "Hyundai Tucson 2022",
+ "id": "HYUNDAI_TUCSON_4TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Tucson",
+ "yrs": [
+ "2022"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_TUCSON_4TH_GEN|2023-2024": {
+ "label": "Hyundai Tucson 2023-24",
+ "id": "HYUNDAI_TUCSON_4TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Tucson",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_TUCSON|2019": {
+ "label": "Hyundai Tucson Diesel 2019",
+ "id": "HYUNDAI_TUCSON",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Tucson Diesel",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "HYUNDAI_TUCSON_4TH_GEN|2022-2024": {
+ "label": "Hyundai Tucson Hybrid 2022-24",
+ "id": "HYUNDAI_TUCSON_4TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Tucson Hybrid",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_TUCSON_4TH_GEN|2024": {
+ "label": "Hyundai Tucson Plug-in Hybrid 2024",
+ "id": "HYUNDAI_TUCSON_4TH_GEN",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Tucson Plug-in Hybrid",
+ "yrs": [
+ "2024"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_VELOSTER|2019-2020": {
+ "label": "Hyundai Veloster 2019-20",
+ "id": "HYUNDAI_VELOSTER",
+ "mk": "Hyundai",
+ "grp": "hyundai",
+ "mdl": "Veloster",
+ "yrs": [
+ "2019",
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "JEEP_GRAND_CHEROKEE|2016-2018": {
+ "label": "Jeep Grand Cherokee 2016-18",
+ "id": "JEEP_GRAND_CHEROKEE",
+ "mk": "Jeep",
+ "grp": "chrysler",
+ "mdl": "Grand Cherokee",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "JEEP_GRAND_CHEROKEE_2019|2019-2021": {
+ "label": "Jeep Grand Cherokee 2019-21",
+ "id": "JEEP_GRAND_CHEROKEE_2019",
+ "mk": "Jeep",
+ "grp": "chrysler",
+ "mdl": "Grand Cherokee",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "KIA_CARNIVAL_4TH_GEN|2022-2024": {
+ "label": "Kia Carnival 2022-24",
+ "id": "KIA_CARNIVAL_4TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Carnival",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_CARNIVAL_4TH_GEN|2023": {
+ "label": "Kia Carnival (China only) 2023",
+ "id": "KIA_CARNIVAL_4TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Carnival (China only)",
+ "yrs": [
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_CEED|2019-2021": {
+ "label": "Kia Ceed 2019-21",
+ "id": "KIA_CEED",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Ceed",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_CEED_PHEV_2022_NON_SCC|2022": {
+ "label": "Kia Ceed Plug-in Hybrid Non-SCC 2022",
+ "id": "KIA_CEED_PHEV_2022_NON_SCC",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Ceed Plug-in Hybrid Non-SCC",
+ "yrs": [
+ "2022"
+ ],
+ "req": "No Smart Cruise Control (Non-SCC)"
+ },
+ "KIA_EV6|2022-2024": {
+ "label": "Kia EV6 (Southeast Asia only) 2022-24",
+ "id": "KIA_EV6",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "EV6 (Southeast Asia only)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "KIA_EV6|2022-2024#2": {
+ "label": "Kia EV6 (with HDA II) 2022-24",
+ "id": "KIA_EV6",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "EV6 (with HDA II)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "KIA_EV6|2022-2024#3": {
+ "label": "Kia EV6 (without HDA II) 2022-24",
+ "id": "KIA_EV6",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "EV6 (without HDA II)",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Highway Driving Assist"
+ },
+ "KIA_FORTE|2019-2021": {
+ "label": "Kia Forte 2019-21",
+ "id": "KIA_FORTE",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Forte",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_FORTE|2022-2023": {
+ "label": "Kia Forte 2022-23",
+ "id": "KIA_FORTE",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Forte",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_FORTE_2019_NON_SCC|2019": {
+ "label": "Kia Forte Non-SCC 2019",
+ "id": "KIA_FORTE_2019_NON_SCC",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Forte Non-SCC",
+ "yrs": [
+ "2019"
+ ],
+ "req": "No Smart Cruise Control (Non-SCC)"
+ },
+ "KIA_K5_2021|2021-2024": {
+ "label": "Kia K5 2021-24",
+ "id": "KIA_K5_2021",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "K5",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_K5_HEV_2020|2020-2022": {
+ "label": "Kia K5 Hybrid 2020-22",
+ "id": "KIA_K5_HEV_2020",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "K5 Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_K8_HEV_1ST_GEN|2023": {
+ "label": "Kia K8 Hybrid (with HDA II) 2023",
+ "id": "KIA_K8_HEV_1ST_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "K8 Hybrid (with HDA II)",
+ "yrs": [
+ "2023"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "KIA_NIRO_EV|2019": {
+ "label": "Kia Niro EV 2019",
+ "id": "KIA_NIRO_EV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro EV",
+ "yrs": [
+ "2019"
+ ],
+ "req": "All"
+ },
+ "KIA_NIRO_EV|2020": {
+ "label": "Kia Niro EV 2020",
+ "id": "KIA_NIRO_EV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro EV",
+ "yrs": [
+ "2020"
+ ],
+ "req": "All"
+ },
+ "KIA_NIRO_EV|2021": {
+ "label": "Kia Niro EV 2021",
+ "id": "KIA_NIRO_EV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro EV",
+ "yrs": [
+ "2021"
+ ],
+ "req": "All"
+ },
+ "KIA_NIRO_EV|2022": {
+ "label": "Kia Niro EV 2022",
+ "id": "KIA_NIRO_EV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro EV",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "KIA_NIRO_EV_2ND_GEN|2025": {
+ "label": "Kia Niro EV (with HDA II) 2025",
+ "id": "KIA_NIRO_EV_2ND_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro EV (with HDA II)",
+ "yrs": [
+ "2025"
+ ],
+ "req": "Highway Driving Assist II"
+ },
+ "KIA_NIRO_EV_2ND_GEN|2023-2025": {
+ "label": "Kia Niro EV (without HDA II) 2023-25",
+ "id": "KIA_NIRO_EV_2ND_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro EV (without HDA II)",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "KIA_NIRO_PHEV|2018": {
+ "label": "Kia Niro Hybrid 2018",
+ "id": "KIA_NIRO_PHEV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Hybrid",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_NIRO_HEV_2021|2021": {
+ "label": "Kia Niro Hybrid 2021",
+ "id": "KIA_NIRO_HEV_2021",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Hybrid",
+ "yrs": [
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_NIRO_HEV_2021|2022": {
+ "label": "Kia Niro Hybrid 2022",
+ "id": "KIA_NIRO_HEV_2021",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Hybrid",
+ "yrs": [
+ "2022"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_NIRO_HEV_2ND_GEN|2023": {
+ "label": "Kia Niro Hybrid 2023",
+ "id": "KIA_NIRO_HEV_2ND_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Hybrid",
+ "yrs": [
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_NIRO_PHEV|2018-2019": {
+ "label": "Kia Niro Plug-in Hybrid 2018-19",
+ "id": "KIA_NIRO_PHEV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Plug-in Hybrid",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "KIA_NIRO_PHEV|2020": {
+ "label": "Kia Niro Plug-in Hybrid 2020",
+ "id": "KIA_NIRO_PHEV",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Plug-in Hybrid",
+ "yrs": [
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_NIRO_PHEV_2022|2021": {
+ "label": "Kia Niro Plug-in Hybrid 2021",
+ "id": "KIA_NIRO_PHEV_2022",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Plug-in Hybrid",
+ "yrs": [
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_NIRO_PHEV_2022|2022": {
+ "label": "Kia Niro Plug-in Hybrid 2022",
+ "id": "KIA_NIRO_PHEV_2022",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Niro Plug-in Hybrid",
+ "yrs": [
+ "2022"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_OPTIMA_G4|2017": {
+ "label": "Kia Optima 2017",
+ "id": "KIA_OPTIMA_G4",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Optima",
+ "yrs": [
+ "2017"
+ ],
+ "req": "Advanced Smart Cruise Control"
+ },
+ "KIA_OPTIMA_G4_FL|2019-2020": {
+ "label": "Kia Optima 2019-20",
+ "id": "KIA_OPTIMA_G4_FL",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Optima",
+ "yrs": [
+ "2019",
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_OPTIMA_H_G4_FL|2019": {
+ "label": "Kia Optima Hybrid 2019",
+ "id": "KIA_OPTIMA_H_G4_FL",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Optima Hybrid",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_SELTOS|2021": {
+ "label": "Kia Seltos 2021",
+ "id": "KIA_SELTOS",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Seltos",
+ "yrs": [
+ "2021"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_SORENTO|2018": {
+ "label": "Kia Sorento 2018",
+ "id": "KIA_SORENTO",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sorento",
+ "yrs": [
+ "2018"
+ ],
+ "req": "Advanced Smart Cruise Control & LKAS"
+ },
+ "KIA_SORENTO|2019": {
+ "label": "Kia Sorento 2019",
+ "id": "KIA_SORENTO",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sorento",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_SORENTO_4TH_GEN|2021-2023": {
+ "label": "Kia Sorento 2021-23",
+ "id": "KIA_SORENTO_4TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sorento",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_SORENTO_HEV_4TH_GEN|2021-2023": {
+ "label": "Kia Sorento Hybrid 2021-23",
+ "id": "KIA_SORENTO_HEV_4TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sorento Hybrid",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "KIA_SORENTO_HEV_4TH_GEN|2022-2023": {
+ "label": "Kia Sorento Plug-in Hybrid 2022-23",
+ "id": "KIA_SORENTO_HEV_4TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sorento Plug-in Hybrid",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "KIA_SPORTAGE_5TH_GEN|2023-2024": {
+ "label": "Kia Sportage 2023-24",
+ "id": "KIA_SPORTAGE_5TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sportage",
+ "yrs": [
+ "2023",
+ "2024"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_SPORTAGE_5TH_GEN|2023": {
+ "label": "Kia Sportage Hybrid 2023",
+ "id": "KIA_SPORTAGE_5TH_GEN",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Sportage Hybrid",
+ "yrs": [
+ "2023"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_STINGER|2018-2020": {
+ "label": "Kia Stinger 2018-20",
+ "id": "KIA_STINGER",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Stinger",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Smart Cruise Control (SCC)"
+ },
+ "KIA_STINGER_2022|2022-2023": {
+ "label": "Kia Stinger 2022-23",
+ "id": "KIA_STINGER_2022",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Stinger",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "HYUNDAI_PALISADE|2020-2022#2": {
+ "label": "Kia Telluride 2020-22",
+ "id": "HYUNDAI_PALISADE",
+ "mk": "Kia",
+ "grp": "hyundai",
+ "mdl": "Telluride",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "LEXUS_CTH|2017-2018": {
+ "label": "Lexus CT Hybrid 2017-18",
+ "id": "LEXUS_CTH",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "CT Hybrid",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "Lexus Safety System+"
+ },
+ "LEXUS_ES|2017-2018": {
+ "label": "Lexus ES 2017-18",
+ "id": "LEXUS_ES",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "ES",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "All"
+ },
+ "LEXUS_ES_TSS2|2019-2025": {
+ "label": "Lexus ES 2019-25",
+ "id": "LEXUS_ES_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "ES",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "LEXUS_ES|2017-2018#2": {
+ "label": "Lexus ES Hybrid 2017-18",
+ "id": "LEXUS_ES",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "ES Hybrid",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "All"
+ },
+ "LEXUS_ES_TSS2|2019-2025#2": {
+ "label": "Lexus ES Hybrid 2019-25",
+ "id": "LEXUS_ES_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "ES Hybrid",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "LEXUS_GS_F|2016": {
+ "label": "Lexus GS F 2016",
+ "id": "LEXUS_GS_F",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "GS F",
+ "yrs": [
+ "2016"
+ ],
+ "req": "All"
+ },
+ "LEXUS_IS|2017-2019": {
+ "label": "Lexus IS 2017-19",
+ "id": "LEXUS_IS",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "IS",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "LEXUS_IS_TSS2|2022-2024": {
+ "label": "Lexus IS 2022-24",
+ "id": "LEXUS_IS_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "IS",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "LEXUS_LC_TSS2|2024-2025": {
+ "label": "Lexus LC 2024-25",
+ "id": "LEXUS_LC_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "LC",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "LEXUS_LS|2018": {
+ "label": "Lexus LS 2018",
+ "id": "LEXUS_LS",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "LS",
+ "yrs": [
+ "2018"
+ ],
+ "req": "All except Lexus Safety System+ A"
+ },
+ "LEXUS_NX|2018-2019": {
+ "label": "Lexus NX 2018-19",
+ "id": "LEXUS_NX",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "NX",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "LEXUS_NX_TSS2|2020-2021": {
+ "label": "Lexus NX 2020-21",
+ "id": "LEXUS_NX_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "NX",
+ "yrs": [
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "LEXUS_NX|2018-2019#2": {
+ "label": "Lexus NX Hybrid 2018-19",
+ "id": "LEXUS_NX",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "NX Hybrid",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "LEXUS_NX_TSS2|2020-2021#2": {
+ "label": "Lexus NX Hybrid 2020-21",
+ "id": "LEXUS_NX_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "NX Hybrid",
+ "yrs": [
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "LEXUS_RC|2018-2020": {
+ "label": "Lexus RC 2018-20",
+ "id": "LEXUS_RC",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RC",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "LEXUS_RC_TSS2|2023": {
+ "label": "Lexus RC 2023",
+ "id": "LEXUS_RC_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RC",
+ "yrs": [
+ "2023"
+ ],
+ "req": "All"
+ },
+ "LEXUS_RX|2016": {
+ "label": "Lexus RX 2016",
+ "id": "LEXUS_RX",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RX",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Lexus Safety System+"
+ },
+ "LEXUS_RX|2017-2019": {
+ "label": "Lexus RX 2017-19",
+ "id": "LEXUS_RX",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RX",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "LEXUS_RX_TSS2|2020-2022": {
+ "label": "Lexus RX 2020-22",
+ "id": "LEXUS_RX_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RX",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "LEXUS_RX|2016#2": {
+ "label": "Lexus RX Hybrid 2016",
+ "id": "LEXUS_RX",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RX Hybrid",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Lexus Safety System+"
+ },
+ "LEXUS_RX|2017-2019#2": {
+ "label": "Lexus RX Hybrid 2017-19",
+ "id": "LEXUS_RX",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RX Hybrid",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "LEXUS_RX_TSS2|2020-2022#2": {
+ "label": "Lexus RX Hybrid 2020-22",
+ "id": "LEXUS_RX_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "RX Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2019-2024": {
+ "label": "Lexus UX Hybrid 2019-24",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Lexus",
+ "grp": "toyota",
+ "mdl": "UX Hybrid",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "FORD_EXPLORER_MK6|2020-2024#3": {
+ "label": "Lincoln Aviator 2020-24",
+ "id": "FORD_EXPLORER_MK6",
+ "mk": "Lincoln",
+ "grp": "ford",
+ "mdl": "Aviator",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Plus"
+ },
+ "FORD_EXPLORER_MK6|2020-2024#4": {
+ "label": "Lincoln Aviator Plug-in Hybrid 2020-24",
+ "id": "FORD_EXPLORER_MK6",
+ "mk": "Lincoln",
+ "grp": "ford",
+ "mdl": "Aviator Plug-in Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Co-Pilot360 Plus"
+ },
+ "VOLKSWAGEN_CRAFTER_MK2|2020-2024": {
+ "label": "MAN eTGE 2020-24",
+ "id": "VOLKSWAGEN_CRAFTER_MK2",
+ "mk": "MAN",
+ "grp": "volkswagen",
+ "mdl": "eTGE",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_CRAFTER_MK2|2017-2024": {
+ "label": "MAN TGE 2017-24",
+ "id": "VOLKSWAGEN_CRAFTER_MK2",
+ "mk": "MAN",
+ "grp": "volkswagen",
+ "mdl": "TGE",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "MAZDA_CX5_2022|2022-2025": {
+ "label": "Mazda CX-5 2022-25",
+ "id": "MAZDA_CX5_2022",
+ "mk": "Mazda",
+ "grp": "mazda",
+ "mdl": "CX-5",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "MAZDA_CX9_2021|2021-2023": {
+ "label": "Mazda CX-9 2021-23",
+ "id": "MAZDA_CX9_2021",
+ "mk": "Mazda",
+ "grp": "mazda",
+ "mdl": "CX-9",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "NISSAN_ALTIMA|2019-2024": {
+ "label": "Nissan Altima 2019-20, 2024",
+ "id": "NISSAN_ALTIMA",
+ "mk": "Nissan",
+ "grp": "nissan",
+ "mdl": "Altima",
+ "yrs": [
+ "2019",
+ "2020",
+ "2024"
+ ],
+ "req": "ProPILOT Assist"
+ },
+ "NISSAN_LEAF|2018-2023": {
+ "label": "Nissan Leaf 2018-23",
+ "id": "NISSAN_LEAF",
+ "mk": "Nissan",
+ "grp": "nissan",
+ "mdl": "Leaf",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "ProPILOT Assist"
+ },
+ "NISSAN_ROGUE|2018-2020": {
+ "label": "Nissan Rogue 2018-20",
+ "id": "NISSAN_ROGUE",
+ "mk": "Nissan",
+ "grp": "nissan",
+ "mdl": "Rogue",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "ProPILOT Assist"
+ },
+ "NISSAN_XTRAIL|2017": {
+ "label": "Nissan X-Trail 2017",
+ "id": "NISSAN_XTRAIL",
+ "mk": "Nissan",
+ "grp": "nissan",
+ "mdl": "X-Trail",
+ "yrs": [
+ "2017"
+ ],
+ "req": "ProPILOT Assist"
+ },
+ "RAM_1500_5TH_GEN|2019-2024": {
+ "label": "Ram 1500 2019-24",
+ "id": "RAM_1500_5TH_GEN",
+ "mk": "Ram",
+ "grp": "chrysler",
+ "mdl": "1500",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "RAM_HD_5TH_GEN|2020-2024": {
+ "label": "Ram 2500 2020-24",
+ "id": "RAM_HD_5TH_GEN",
+ "mk": "Ram",
+ "grp": "chrysler",
+ "mdl": "2500",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "RAM_HD_5TH_GEN|2019-2022": {
+ "label": "Ram 3500 2019-22",
+ "id": "RAM_HD_5TH_GEN",
+ "mk": "Ram",
+ "grp": "chrysler",
+ "mdl": "3500",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC)"
+ },
+ "RIVIAN_R1_GEN1|2022-2024": {
+ "label": "Rivian R1S 2022-24",
+ "id": "RIVIAN_R1_GEN1",
+ "mk": "Rivian",
+ "grp": "rivian",
+ "mdl": "R1S",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "RIVIAN_R1_GEN1|2022-2024#2": {
+ "label": "Rivian R1T 2022-24",
+ "id": "RIVIAN_R1_GEN1",
+ "mk": "Rivian",
+ "grp": "rivian",
+ "mdl": "R1T",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "SEAT_ATECA_MK1|2016-2023": {
+ "label": "SEAT Ateca 2016-23",
+ "id": "SEAT_ATECA_MK1",
+ "mk": "SEAT",
+ "grp": "volkswagen",
+ "mdl": "Ateca",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SEAT_ATECA_MK1|2014-2020": {
+ "label": "SEAT Leon 2014-20",
+ "id": "SEAT_ATECA_MK1",
+ "mk": "SEAT",
+ "grp": "volkswagen",
+ "mdl": "Leon",
+ "yrs": [
+ "2014",
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SUBARU_ASCENT|2019-2021": {
+ "label": "Subaru Ascent 2019-21",
+ "id": "SUBARU_ASCENT",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Ascent",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "SUBARU_IMPREZA|2018-2019": {
+ "label": "Subaru Crosstrek 2018-19",
+ "id": "SUBARU_IMPREZA",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Crosstrek",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_IMPREZA_2020|2020-2023": {
+ "label": "Subaru Crosstrek 2020-23",
+ "id": "SUBARU_IMPREZA_2020",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Crosstrek",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_FORESTER_PREGLOBAL|2017-2018": {
+ "label": "Subaru Forester 2017-18",
+ "id": "SUBARU_FORESTER_PREGLOBAL",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Forester",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_FORESTER|2019-2021": {
+ "label": "Subaru Forester 2019-21",
+ "id": "SUBARU_FORESTER",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Forester",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "SUBARU_IMPREZA|2017-2019": {
+ "label": "Subaru Impreza 2017-19",
+ "id": "SUBARU_IMPREZA",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Impreza",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_IMPREZA_2020|2020-2022": {
+ "label": "Subaru Impreza 2020-22",
+ "id": "SUBARU_IMPREZA_2020",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Impreza",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_LEGACY_PREGLOBAL|2015-2018": {
+ "label": "Subaru Legacy 2015-18",
+ "id": "SUBARU_LEGACY_PREGLOBAL",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Legacy",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_LEGACY|2020-2022": {
+ "label": "Subaru Legacy 2020-22",
+ "id": "SUBARU_LEGACY",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Legacy",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "SUBARU_OUTBACK_PREGLOBAL|2015-2017": {
+ "label": "Subaru Outback 2015-17",
+ "id": "SUBARU_OUTBACK_PREGLOBAL",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Outback",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_OUTBACK_PREGLOBAL_2018|2018-2019": {
+ "label": "Subaru Outback 2018-19",
+ "id": "SUBARU_OUTBACK_PREGLOBAL_2018",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Outback",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_OUTBACK|2020-2022": {
+ "label": "Subaru Outback 2020-22",
+ "id": "SUBARU_OUTBACK",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "Outback",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "SUBARU_IMPREZA|2018-2019#2": {
+ "label": "Subaru XV 2018-19",
+ "id": "SUBARU_IMPREZA",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "XV",
+ "yrs": [
+ "2018",
+ "2019"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SUBARU_IMPREZA_2020|2020-2021": {
+ "label": "Subaru XV 2020-21",
+ "id": "SUBARU_IMPREZA_2020",
+ "mk": "Subaru",
+ "grp": "subaru",
+ "mdl": "XV",
+ "yrs": [
+ "2020",
+ "2021"
+ ],
+ "req": "EyeSight Driver Assistance"
+ },
+ "SKODA_FABIA_MK4|2022-2023": {
+ "label": "Škoda Fabia 2022-23",
+ "id": "SKODA_FABIA_MK4",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Fabia",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_KAMIQ_MK1|2021-2023": {
+ "label": "Škoda Kamiq 2021-23",
+ "id": "SKODA_KAMIQ_MK1",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Kamiq",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_KAROQ_MK1|2019-2023": {
+ "label": "Škoda Karoq 2019-23",
+ "id": "SKODA_KAROQ_MK1",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Karoq",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_KODIAQ_MK1|2017-2023": {
+ "label": "Škoda Kodiaq 2017-23",
+ "id": "SKODA_KODIAQ_MK1",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Kodiaq",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_OCTAVIA_MK3|2015-2019": {
+ "label": "Škoda Octavia 2015-19",
+ "id": "SKODA_OCTAVIA_MK3",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Octavia",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_OCTAVIA_MK3|2016": {
+ "label": "Škoda Octavia RS 2016",
+ "id": "SKODA_OCTAVIA_MK3",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Octavia RS",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_OCTAVIA_MK3|2017-2019": {
+ "label": "Škoda Octavia Scout 2017-19",
+ "id": "SKODA_OCTAVIA_MK3",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Octavia Scout",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_KAMIQ_MK1|2020-2023": {
+ "label": "Škoda Scala 2020-23",
+ "id": "SKODA_KAMIQ_MK1",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Scala",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_SUPERB_MK3|2015-2022": {
+ "label": "Škoda Superb 2015-22",
+ "id": "SKODA_SUPERB_MK3",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Superb",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "TESLA_MODEL_3|2019-2023": {
+ "label": "Tesla Model 3 (with HW3) 2019-23",
+ "id": "TESLA_MODEL_3",
+ "mk": "Tesla",
+ "grp": "tesla",
+ "mdl": "Model 3 (with HW3)",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "TESLA_MODEL_3|2024-2025": {
+ "label": "Tesla Model 3 (with HW4) 2024-25",
+ "id": "TESLA_MODEL_3",
+ "mk": "Tesla",
+ "grp": "tesla",
+ "mdl": "Model 3 (with HW4)",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "TESLA_MODEL_X|2024": {
+ "label": "Tesla Model X (with HW4) 2024",
+ "id": "TESLA_MODEL_X",
+ "mk": "Tesla",
+ "grp": "tesla",
+ "mdl": "Model X (with HW4)",
+ "yrs": [
+ "2024"
+ ],
+ "req": "All"
+ },
+ "TESLA_MODEL_Y|2020-2023": {
+ "label": "Tesla Model Y (with HW3) 2020-23",
+ "id": "TESLA_MODEL_Y",
+ "mk": "Tesla",
+ "grp": "tesla",
+ "mdl": "Model Y (with HW3)",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "TESLA_MODEL_Y|2024-2025": {
+ "label": "Tesla Model Y (with HW4) 2024-25",
+ "id": "TESLA_MODEL_Y",
+ "mk": "Tesla",
+ "grp": "tesla",
+ "mdl": "Model Y (with HW4)",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_ALPHARD_TSS2|2019-2020": {
+ "label": "Toyota Alphard 2019-20",
+ "id": "TOYOTA_ALPHARD_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Alphard",
+ "yrs": [
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_ALPHARD_TSS2|2021": {
+ "label": "Toyota Alphard Hybrid 2021",
+ "id": "TOYOTA_ALPHARD_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Alphard Hybrid",
+ "yrs": [
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_AVALON|2016": {
+ "label": "Toyota Avalon 2016",
+ "id": "TOYOTA_AVALON",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Avalon",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Toyota Safety Sense P"
+ },
+ "TOYOTA_AVALON|2017-2018": {
+ "label": "Toyota Avalon 2017-18",
+ "id": "TOYOTA_AVALON",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Avalon",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_AVALON_2019|2019-2021": {
+ "label": "Toyota Avalon 2019-21",
+ "id": "TOYOTA_AVALON_2019",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Avalon",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_AVALON_TSS2|2022": {
+ "label": "Toyota Avalon 2022",
+ "id": "TOYOTA_AVALON_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Avalon",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_AVALON_2019|2019-2021#2": {
+ "label": "Toyota Avalon Hybrid 2019-21",
+ "id": "TOYOTA_AVALON_2019",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Avalon Hybrid",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_AVALON_TSS2|2022#2": {
+ "label": "Toyota Avalon Hybrid 2022",
+ "id": "TOYOTA_AVALON_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Avalon Hybrid",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CHR|2017-2020": {
+ "label": "Toyota C-HR 2017-20",
+ "id": "TOYOTA_CHR",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "C-HR",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CHR_TSS2|2021": {
+ "label": "Toyota C-HR 2021",
+ "id": "TOYOTA_CHR_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "C-HR",
+ "yrs": [
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CHR|2017-2020#2": {
+ "label": "Toyota C-HR Hybrid 2017-20",
+ "id": "TOYOTA_CHR",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "C-HR Hybrid",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CHR_TSS2|2021-2022": {
+ "label": "Toyota C-HR Hybrid 2021-22",
+ "id": "TOYOTA_CHR_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "C-HR Hybrid",
+ "yrs": [
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CAMRY|2018-2020": {
+ "label": "Toyota Camry 2018-20",
+ "id": "TOYOTA_CAMRY",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Camry",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CAMRY_TSS2|2021-2024": {
+ "label": "Toyota Camry 2021-24",
+ "id": "TOYOTA_CAMRY_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Camry",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CAMRY|2018-2020#2": {
+ "label": "Toyota Camry Hybrid 2018-20",
+ "id": "TOYOTA_CAMRY",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Camry Hybrid",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_CAMRY_TSS2|2021-2024#2": {
+ "label": "Toyota Camry Hybrid 2021-24",
+ "id": "TOYOTA_CAMRY_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Camry Hybrid",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA|2017-2019": {
+ "label": "Toyota Corolla 2017-19",
+ "id": "TOYOTA_COROLLA",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2020-2022": {
+ "label": "Toyota Corolla 2020-22",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2020-2023": {
+ "label": "Toyota Corolla Cross (Non-US only) 2020-23",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla Cross (Non-US only)",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2020-2022#2": {
+ "label": "Toyota Corolla Cross Hybrid (Non-US only) 2020-22",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla Cross Hybrid (Non-US only)",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2019-2022": {
+ "label": "Toyota Corolla Hatchback 2019-22",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla Hatchback",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2020-2022#3": {
+ "label": "Toyota Corolla Hybrid 2020-22",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_COROLLA_TSS2|2020-2023#2": {
+ "label": "Toyota Corolla Hybrid (South America only) 2020-23",
+ "id": "TOYOTA_COROLLA_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Corolla Hybrid (South America only)",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_HIGHLANDER|2017-2019": {
+ "label": "Toyota Highlander 2017-19",
+ "id": "TOYOTA_HIGHLANDER",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Highlander",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_HIGHLANDER_TSS2|2020-2023": {
+ "label": "Toyota Highlander 2020-23",
+ "id": "TOYOTA_HIGHLANDER_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Highlander",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_HIGHLANDER|2017-2019#2": {
+ "label": "Toyota Highlander Hybrid 2017-19",
+ "id": "TOYOTA_HIGHLANDER",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Highlander Hybrid",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_HIGHLANDER_TSS2|2020-2023#2": {
+ "label": "Toyota Highlander Hybrid 2020-23",
+ "id": "TOYOTA_HIGHLANDER_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Highlander Hybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_MIRAI|2021": {
+ "label": "Toyota Mirai 2021",
+ "id": "TOYOTA_MIRAI",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Mirai",
+ "yrs": [
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_PRIUS|2016": {
+ "label": "Toyota Prius 2016",
+ "id": "TOYOTA_PRIUS",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Prius",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Toyota Safety Sense P"
+ },
+ "TOYOTA_PRIUS|2017-2020": {
+ "label": "Toyota Prius 2017-20",
+ "id": "TOYOTA_PRIUS",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Prius",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_PRIUS_TSS2|2021-2022": {
+ "label": "Toyota Prius 2021-22",
+ "id": "TOYOTA_PRIUS_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Prius",
+ "yrs": [
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_PRIUS|2017-2020#2": {
+ "label": "Toyota Prius Prime 2017-20",
+ "id": "TOYOTA_PRIUS",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Prius Prime",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_PRIUS_TSS2|2021-2022#2": {
+ "label": "Toyota Prius Prime 2021-22",
+ "id": "TOYOTA_PRIUS_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Prius Prime",
+ "yrs": [
+ "2021",
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_PRIUS_V|2017": {
+ "label": "Toyota Prius v 2017",
+ "id": "TOYOTA_PRIUS_V",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Prius v",
+ "yrs": [
+ "2017"
+ ],
+ "req": "Toyota Safety Sense P"
+ },
+ "TOYOTA_RAV4|2016": {
+ "label": "Toyota RAV4 2016",
+ "id": "TOYOTA_RAV4",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Toyota Safety Sense P"
+ },
+ "TOYOTA_RAV4|2017-2018": {
+ "label": "Toyota RAV4 2017-18",
+ "id": "TOYOTA_RAV4",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4_TSS2|2019-2021": {
+ "label": "Toyota RAV4 2019-21",
+ "id": "TOYOTA_RAV4_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4_TSS2_2022|2022": {
+ "label": "Toyota RAV4 2022",
+ "id": "TOYOTA_RAV4_TSS2_2022",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4_TSS2_2023|2023-2025": {
+ "label": "Toyota RAV4 2023-25",
+ "id": "TOYOTA_RAV4_TSS2_2023",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4H|2016": {
+ "label": "Toyota RAV4 Hybrid 2016",
+ "id": "TOYOTA_RAV4H",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4 Hybrid",
+ "yrs": [
+ "2016"
+ ],
+ "req": "Toyota Safety Sense P"
+ },
+ "TOYOTA_RAV4H|2017-2018": {
+ "label": "Toyota RAV4 Hybrid 2017-18",
+ "id": "TOYOTA_RAV4H",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4 Hybrid",
+ "yrs": [
+ "2017",
+ "2018"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4_TSS2|2019-2021#2": {
+ "label": "Toyota RAV4 Hybrid 2019-21",
+ "id": "TOYOTA_RAV4_TSS2",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4 Hybrid",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4_TSS2_2022|2022#2": {
+ "label": "Toyota RAV4 Hybrid 2022",
+ "id": "TOYOTA_RAV4_TSS2_2022",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4 Hybrid",
+ "yrs": [
+ "2022"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_RAV4_TSS2_2023|2023-2025#2": {
+ "label": "Toyota RAV4 Hybrid 2023-25",
+ "id": "TOYOTA_RAV4_TSS2_2023",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "RAV4 Hybrid",
+ "yrs": [
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_SIENNA|2018-2020": {
+ "label": "Toyota Sienna 2018-20",
+ "id": "TOYOTA_SIENNA",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Sienna",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "All"
+ },
+ "TOYOTA_SIENNA_4TH_GEN|2021-2023": {
+ "label": "Toyota Sienna 4th Gen 2021-23",
+ "id": "TOYOTA_SIENNA_4TH_GEN",
+ "mk": "Toyota",
+ "grp": "toyota",
+ "mdl": "Sienna",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "All"
+ },
+ "VOLKSWAGEN_ARTEON_MK1|2018-2023": {
+ "label": "Volkswagen Arteon 2018-23",
+ "id": "VOLKSWAGEN_ARTEON_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Arteon",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ARTEON_MK1|2020-2023": {
+ "label": "Volkswagen Arteon eHybrid 2020-23",
+ "id": "VOLKSWAGEN_ARTEON_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Arteon eHybrid",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ARTEON_MK1|2020-2023#2": {
+ "label": "Volkswagen Arteon R 2020-23",
+ "id": "VOLKSWAGEN_ARTEON_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Arteon R",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ARTEON_MK1|2020-2023#3": {
+ "label": "Volkswagen Arteon Shooting Brake 2020-23",
+ "id": "VOLKSWAGEN_ARTEON_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Arteon Shooting Brake",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ATLAS_MK1|2018-2023": {
+ "label": "Volkswagen Atlas 2018-23",
+ "id": "VOLKSWAGEN_ATLAS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Atlas",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ATLAS_MK1|2020-2022": {
+ "label": "Volkswagen Atlas Cross Sport 2020-22",
+ "id": "VOLKSWAGEN_ATLAS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Atlas Cross Sport",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TRANSPORTER_T61|2021-2023": {
+ "label": "Volkswagen California 2021-23",
+ "id": "VOLKSWAGEN_TRANSPORTER_T61",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "California",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TRANSPORTER_T61|2020": {
+ "label": "Volkswagen Caravelle 2020",
+ "id": "VOLKSWAGEN_TRANSPORTER_T61",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Caravelle",
+ "yrs": [
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ARTEON_MK1|2018-2022": {
+ "label": "Volkswagen CC 2018-22",
+ "id": "VOLKSWAGEN_ARTEON_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "CC",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_CRAFTER_MK2|2017-2024#2": {
+ "label": "Volkswagen Crafter 2017-24",
+ "id": "VOLKSWAGEN_CRAFTER_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Crafter",
+ "yrs": [
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_CRAFTER_MK2|2018-2024": {
+ "label": "Volkswagen e-Crafter 2018-24",
+ "id": "VOLKSWAGEN_CRAFTER_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "e-Crafter",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2014-2020": {
+ "label": "Volkswagen e-Golf 2014-20",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "e-Golf",
+ "yrs": [
+ "2014",
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2020": {
+ "label": "Volkswagen Golf 2015-20",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK8|2020-2025": {
+ "label": "Volkswagen Golf 2020-25",
+ "id": "VOLKSWAGEN_GOLF_MK8",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024",
+ "2025"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2019": {
+ "label": "Volkswagen Golf Alltrack 2015-19",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf Alltrack",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2020#2": {
+ "label": "Volkswagen Golf GTD 2015-20",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf GTD",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2020#3": {
+ "label": "Volkswagen Golf GTE 2015-20",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf GTE",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2021": {
+ "label": "Volkswagen Golf GTI 2015-21",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf GTI",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2019#2": {
+ "label": "Volkswagen Golf R 2015-19",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf R",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_GOLF_MK7|2015-2020#4": {
+ "label": "Volkswagen Golf SportsVan 2015-20",
+ "id": "VOLKSWAGEN_GOLF_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Golf SportsVan",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_CRAFTER_MK2|2019-2024": {
+ "label": "Volkswagen Grand California 2019-24",
+ "id": "VOLKSWAGEN_CRAFTER_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Grand California",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID3_MK1|2020-2023": {
+ "label": "Volkswagen ID.3 2020-23",
+ "id": "VOLKSWAGEN_ID3_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "ID.3",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID3_MK2|2024-2025": {
+ "label": "Volkswagen ID.3 2024-25",
+ "id": "VOLKSWAGEN_ID3_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "ID.3",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID4_MK1|2021-2023": {
+ "label": "Volkswagen ID.4 2021-23",
+ "id": "VOLKSWAGEN_ID4_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "ID.4",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID4_MK2|2024-2025": {
+ "label": "Volkswagen ID.4 2024-25",
+ "id": "VOLKSWAGEN_ID4_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "ID.4",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID4_MK1|2022-2023": {
+ "label": "Volkswagen ID.5 2022-23",
+ "id": "VOLKSWAGEN_ID4_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "ID.5",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_JETTA_MK7|2019-2023": {
+ "label": "Volkswagen Jetta 2019-23",
+ "id": "VOLKSWAGEN_JETTA_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Jetta",
+ "yrs": [
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_JETTA_MK6|2015-2018": {
+ "label": "Volkswagen Jetta MK6 2015-2018",
+ "id": "VOLKSWAGEN_JETTA_MK6",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Jetta",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_JETTA_MK7|2021-2023": {
+ "label": "Volkswagen Jetta GLI 2021-23",
+ "id": "VOLKSWAGEN_JETTA_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Jetta GLI",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_MK8|2015-2022": {
+ "label": "Volkswagen Passat 2015-22 (B8)",
+ "id": "VOLKSWAGEN_PASSAT_MK8",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_MK7|2012-2014": {
+ "label": "Volkswagen Passat 2012-2014 (NMS)",
+ "id": "VOLKSWAGEN_PASSAT_MK7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat",
+ "yrs": [
+ "2012",
+ "2013",
+ "2014"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_B7|2008-2011": {
+ "label": "Volkswagen Passat B7 2008-2011",
+ "id": "VOLKSWAGEN_PASSAT_B7",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat",
+ "yrs": [
+ "2008",
+ "2009",
+ "2010",
+ "2011"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_NMS_PLUS|2018-2022": {
+ "label": "Volkswagen Passat NMS+ 2018-22",
+ "id": "VOLKSWAGEN_PASSAT_NMS_PLUS",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_NMS|2015-2017": {
+ "label": "Volkswagen Passat NMS 2015-17",
+ "id": "VOLKSWAGEN_PASSAT_NMS",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_CADDY_MK3|2019": {
+ "label": "Volkswagen Caddy MK3 2015-22",
+ "id": "VOLKSWAGEN_CADDY_MK3",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Caddy",
+ "yrs": [
+ "2019"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SEAT_ALHAMBRA_MK1|2018-2020": {
+ "label": "SEAT Alhambra 2018-2020",
+ "id": "SEAT_ALHAMBRA_MK1",
+ "mk": "SEAT",
+ "grp": "volkswagen",
+ "mdl": "Alhambra",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_SHARAN_MK2|2018-2022": {
+ "label": "Volkswagen Sharan 2018-2022",
+ "id": "VOLKSWAGEN_SHARAN_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Sharan",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_MK8|2015-2022#2": {
+ "label": "Volkswagen Passat Alltrack 2015-22",
+ "id": "VOLKSWAGEN_PASSAT_MK8",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat Alltrack",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_ENYAQ_MK1|2021-2023": {
+ "label": "Škoda Enyaq 2021-23",
+ "id": "SKODA_ENYAQ_MK1",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Enyaq",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "SKODA_ENYAQ_MK2|2024-2025": {
+ "label": "Škoda Enyaq 2024-25",
+ "id": "SKODA_ENYAQ_MK2",
+ "mk": "Škoda",
+ "grp": "volkswagen",
+ "mdl": "Enyaq",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID3_MK1|2020-2023#2": {
+ "label": "Volkswagen MEB Gen 1 2020-23",
+ "id": "VOLKSWAGEN_ID3_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "MEB Gen 1",
+ "yrs": [
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ID3_MK2|2024-2025#2": {
+ "label": "Volkswagen MEB Gen 2 2024-25",
+ "id": "VOLKSWAGEN_ID3_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "MEB Gen 2",
+ "yrs": [
+ "2024",
+ "2025"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "CUPRA_BORN_MK1|2022-2023": {
+ "label": "CUPRA Born 2022-23",
+ "id": "CUPRA_BORN_MK1",
+ "mk": "CUPRA",
+ "grp": "volkswagen",
+ "mdl": "Born",
+ "yrs": [
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_PASSAT_MK8|2015-2022#3": {
+ "label": "Volkswagen Passat GTE 2015-22",
+ "id": "VOLKSWAGEN_PASSAT_MK8",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Passat GTE",
+ "yrs": [
+ "2015",
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_POLO_MK6|2018-2023": {
+ "label": "Volkswagen Polo 2018-23",
+ "id": "VOLKSWAGEN_POLO_MK6",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Polo",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_POLO_MK6|2018-2023#2": {
+ "label": "Volkswagen Polo GTI 2018-23",
+ "id": "VOLKSWAGEN_POLO_MK6",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Polo GTI",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TCROSS_MK1|2021": {
+ "label": "Volkswagen T-Cross 2021",
+ "id": "VOLKSWAGEN_TCROSS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "T-Cross",
+ "yrs": [
+ "2021"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TROC_MK1|2018-2023": {
+ "label": "Volkswagen T-Roc 2018-23",
+ "id": "VOLKSWAGEN_TROC_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "T-Roc",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TAOS_MK1|2022-2024": {
+ "label": "Volkswagen Taos 2022-24",
+ "id": "VOLKSWAGEN_TAOS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Taos",
+ "yrs": [
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ATLAS_MK1|2018-2022": {
+ "label": "Volkswagen Teramont 2018-22",
+ "id": "VOLKSWAGEN_ATLAS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Teramont",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ATLAS_MK1|2021-2022": {
+ "label": "Volkswagen Teramont Cross Sport 2021-22",
+ "id": "VOLKSWAGEN_ATLAS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Teramont Cross Sport",
+ "yrs": [
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_ATLAS_MK1|2021-2022#2": {
+ "label": "Volkswagen Teramont X 2021-22",
+ "id": "VOLKSWAGEN_ATLAS_MK1",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Teramont X",
+ "yrs": [
+ "2021",
+ "2022"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TIGUAN_MK2|2018-2024": {
+ "label": "Volkswagen Tiguan 2018-24",
+ "id": "VOLKSWAGEN_TIGUAN_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Tiguan",
+ "yrs": [
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023",
+ "2024"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TIGUAN_MK2|2021-2023": {
+ "label": "Volkswagen Tiguan eHybrid 2021-23",
+ "id": "VOLKSWAGEN_TIGUAN_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Tiguan eHybrid",
+ "yrs": [
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ },
+ "VOLKSWAGEN_TOURAN_MK2|2016-2023": {
+ "label": "Volkswagen Touran 2016-23",
+ "id": "VOLKSWAGEN_TOURAN_MK2",
+ "mk": "Volkswagen",
+ "grp": "volkswagen",
+ "mdl": "Touran",
+ "yrs": [
+ "2016",
+ "2017",
+ "2018",
+ "2019",
+ "2020",
+ "2021",
+ "2022",
+ "2023"
+ ],
+ "req": "Adaptive Cruise Control (ACC) & Lane Assist"
+ }
+ }
+}
\ No newline at end of file
diff --git a/iqpilot/selfdrive/car/vehicle_catalog.py b/iqpilot/selfdrive/car/vehicle_catalog.py
new file mode 100644
index 000000000..dedd79464
--- /dev/null
+++ b/iqpilot/selfdrive/car/vehicle_catalog.py
@@ -0,0 +1,85 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import json
+import os
+
+from openpilot.common.basedir import BASEDIR
+
+SCHEMA = "iqlvbs/supported-vehicles"
+REV = 1
+
+CATALOG_FILENAME = "vehicle_catalog.json"
+_CANDIDATE_PARTS = (
+ ("iqpilot", "selfdrive", "car", CATALOG_FILENAME),
+)
+
+# in-memory (car-interface) field -> on-disk compact key
+_ATTR_TO_KEY = (
+ ("platform", "id"),
+ ("make", "mk"),
+ ("brand", "grp"),
+ ("model", "mdl"),
+ ("year", "yrs"),
+ ("package", "req"),
+)
+
+
+def _reference(platform: str, years: list[str], claimed: set[str]) -> str:
+ span = f"{years[0]}-{years[-1]}" if len(years) > 1 else (years[0] if years else "na")
+ stem = f"{platform}|{span}"
+ ref, bump = stem, 2
+ while ref in claimed:
+ ref = f"{stem}#{bump}"
+ bump += 1
+ claimed.add(ref)
+ return ref
+
+
+def encode(vehicles: dict[str, dict]) -> dict:
+ records: dict[str, dict] = {}
+ claimed: set[str] = set()
+ for label, attrs in vehicles.items():
+ years = list(attrs.get("year") or [])
+ ref = _reference(attrs.get("platform", ""), years, claimed)
+ record = {"label": label}
+ for attr, key in _ATTR_TO_KEY:
+ record[key] = attrs.get(attr)
+ records[ref] = record
+ return {"catalog": SCHEMA, "rev": REV, "vehicles": records}
+
+
+def decode(envelope: dict) -> dict[str, dict]:
+ vehicles: dict[str, dict] = {}
+ for record in (envelope.get("vehicles") or {}).values():
+ attrs = {attr: record.get(key) for attr, key in _ATTR_TO_KEY}
+ vehicles[record.get("label", "")] = attrs
+ return vehicles
+
+
+def catalog_path(basedir: str = BASEDIR) -> str | None:
+ for parts in _CANDIDATE_PARTS:
+ candidate = os.path.join(basedir, *parts)
+ if os.path.isfile(candidate):
+ return candidate
+ return None
+
+
+def load_catalog(basedir: str = BASEDIR) -> dict[str, dict]:
+ path = catalog_path(basedir)
+ if path is None:
+ return {}
+ with open(path) as handle:
+ return decode(json.load(handle))
+
+
+def _write(vehicles: dict[str, dict], basedir: str = BASEDIR) -> str:
+ out = os.path.join(basedir, "iqpilot", "selfdrive", "car", CATALOG_FILENAME)
+ with open(out, "w") as handle:
+ json.dump(encode(vehicles), handle, indent=2, ensure_ascii=False)
+ return out
+
+
+if __name__ == "__main__":
+ from iqdbc.lvbs.car.car_catalog import build_car_catalog
+ print("wrote", _write(build_car_catalog()))
diff --git a/iqpilot/selfdrive/constructiond.py b/iqpilot/selfdrive/constructiond.py
new file mode 100644
index 000000000..56a3a6f89
--- /dev/null
+++ b/iqpilot/selfdrive/constructiond.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+
+constructiond: work-zone detector for Speed Limit Assist.
+
+Samples the road camera at ~2 Hz and looks for work-zone orange (barrels, drums,
+diamond signs) in the NV12 chroma plane. Sunlit yellow lane paint renders with
+nearly identical hue to barrel orange on this camera, but its red chroma (V)
+saturates below ~168 while retroreflective barrel orange reaches 170-190, so the
+V floor is the load-bearing threshold — do not lower it without re-running the
+paint/barrel separation sweep on real footage.
+"""
+from collections import deque
+
+import time
+
+import numpy as np
+
+import cereal.messaging as messaging
+from cereal import custom
+from msgq.visionipc import VisionIpcClient, VisionStreamType
+from openpilot.common.swaglog import cloudlog
+
+State = custom.IQConstructionZone.State
+
+ANALYSIS_PERIOD = 0.5
+
+# fractions of the chroma plane; excludes sky and hood
+ROI_TOP, ROI_BOTTOM = 0.40, 0.94
+ROI_LEFT, ROI_RIGHT = 0.04, 0.96
+
+V_MIN = 170 # paint tops out ~168 in every DAYLIGHT condition sampled
+CB_MIN = 16
+HUE_LO, HUE_HI = 0.65, 2.0 # (V-128)/(128-U): yellow paint ~0.4, barrel orange ~0.7-1.5, red ~3.0
+
+# Daylight-only gate: retroreflective amber markers (guardrail chevrons, object
+# markers) blaze past V_MIN under headlights at night — 137px on one chevron on
+# real footage — and there is no night work-zone ground truth to tune against.
+# Night ROI mean luma measured ~36-38, validated daytime footage 84-98.
+LUMA_MIN = 65.0
+
+# hits only accumulate at highway-approach speeds: brightly lit lots (truck
+# stops) can pass the luma gate at night with orange signage, and the clamp is
+# meaningless below it anyway. An already-active zone still holds while slowed.
+MIN_ENTER_SPEED = 13.4 # m/s (~30 mph)
+
+HIT_FRAC = 3.0e-4
+WASH_FRAC = 0.10 # more orange than this is scene lighting (sunset), not objects
+ENTER_HITS = 3
+ENTER_WINDOW = 10 # analyses (~5 s)
+HOLD_SEC = 120.0 # barrel-free stretches inside a zone last minutes; hold through them
+
+
+def orange_fraction(buf) -> tuple[float, float]:
+ """Returns (hot-orange fraction, mean luma) of the road ROI."""
+ h, w, stride, uv_off = buf.height, buf.width, buf.stride, buf.uv_offset
+ ch, cw = h // 2, w // 2
+ uv = buf.data[uv_off:uv_off + ch * stride].reshape(ch, stride)
+
+ r0, r1 = int(ROI_TOP * ch), int(ROI_BOTTOM * ch)
+ c0, c1 = int(ROI_LEFT * cw), int(ROI_RIGHT * cw)
+ step = 2 if cw > 700 else 1
+
+ u = uv[r0:r1:step, 2 * c0:2 * c1:2 * step].astype(np.int16)
+ v = uv[r0:r1:step, 2 * c0 + 1:2 * c1:2 * step].astype(np.int16)
+
+ cb = 128 - u
+ cr = v - 128
+ mask = (v >= V_MIN) & (cb >= CB_MIN) & (cr >= HUE_LO * cb) & (cr <= HUE_HI * cb)
+
+ y_plane = buf.data[:h * stride].reshape(h, stride)
+ luma = float(y_plane[2 * r0:2 * r1:4, 2 * c0:2 * c1:8].mean())
+
+ return float(mask.mean()), luma
+
+
+class ConstructionZoneDetector:
+ def __init__(self):
+ self.recent = deque(maxlen=ENTER_WINDOW)
+ self.last_hit_t: float | None = None
+ self.active = False
+ self.frac = 0.0
+
+ @property
+ def state(self):
+ if self.active:
+ return State.active
+ if any(self.recent):
+ return State.pending
+ return State.inactive
+
+ def seconds_since_hit(self, now: float) -> float:
+ if self.last_hit_t is None:
+ return -1.0
+ return now - self.last_hit_t
+
+ def update(self, frac: float, now: float, luma: float = 255.0, v_ego: float = 255.0) -> bool:
+ self.frac = frac
+ hit = (HIT_FRAC <= frac <= WASH_FRAC) and luma >= LUMA_MIN and v_ego >= MIN_ENTER_SPEED
+ self.recent.append(hit)
+ if hit:
+ self.last_hit_t = now
+
+ if self.active:
+ if self.last_hit_t is None or (now - self.last_hit_t) > HOLD_SEC:
+ self.active = False
+ self.recent.clear()
+ elif sum(self.recent) >= ENTER_HITS:
+ self.active = True
+ return self.active
+
+
+def main():
+ pm = messaging.PubMaster(["iqConstructionZone"])
+ car_state_sock = messaging.sub_sock("carState", conflate=True)
+ detector = ConstructionZoneDetector()
+ v_ego = 0.0
+
+ vipc = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_ROAD, True)
+ while not vipc.connect(False):
+ time.sleep(0.5)
+ cloudlog.info("constructiond: connected to road camera stream")
+
+ while True:
+ t0 = time.monotonic()
+ buf = vipc.recv(200)
+ if buf is None:
+ # no publish on camera stall: SLC sees us stale and releases the clamp
+ continue
+
+ cs = messaging.recv_one_or_none(car_state_sock)
+ if cs is not None:
+ v_ego = cs.carState.vEgo
+
+ frac, luma = orange_fraction(buf)
+ detector.update(frac, t0, luma, v_ego)
+
+ msg = messaging.new_message("iqConstructionZone")
+ msg.valid = True
+ cz = msg.iqConstructionZone
+ cz.state = detector.state
+ cz.active = detector.active
+ cz.orangeFraction = frac
+ cz.secondsSinceHit = detector.seconds_since_hit(t0)
+ pm.send("iqConstructionZone", msg)
+
+ time.sleep(max(0.0, ANALYSIS_PERIOD - (time.monotonic() - t0)))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/selfdrive/controls/__init__.py b/iqpilot/selfdrive/controls/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/controls/iq_controls_layer.py b/iqpilot/selfdrive/controls/iq_controls_layer.py
new file mode 100644
index 000000000..62de2892f
--- /dev/null
+++ b/iqpilot/selfdrive/controls/iq_controls_layer.py
@@ -0,0 +1,120 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot's controls-side extension layer. Controls mixes this in to gain the extra
+sub/pub services, the IQ car-control message (radar blend, SLC set-speed sync, AOL
+guidance continuity) and the lateral-engage gate, without touching stock controlsd.
+"""
+import time
+
+import cereal.messaging as messaging
+from cereal import log, custom
+
+from iqdbc.car import structs
+from openpilot.common.constants import CV
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.common.steer_delay import resolve_steer_delay
+from openpilot.iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import build_iq_control_params_from_plan
+from openpilot.iqpilot.selfdrive.iqmodeld.models.inference_state import InferenceStateBase
+from openpilot.iqpilot.selfdrive.controls.lib.helpers.blinker_pause import IQSignalPauseController
+from openpilot.iqpilot.selfdrive.controls.lib.iq_dynamic.radar_manager import RadarManager
+
+_PARAM_REFRESH_S = 3.0
+_LEAD_FIELDS = ("dRel", "yRel", "vRel", "aRel", "vLead", "dPath", "vLat", "vLeadK",
+ "aLeadK", "fcw", "status", "aLeadTau", "modelProb", "radar", "radarTrackId")
+
+
+class IQControlsLayer(InferenceStateBase):
+ def __init__(self, CP: structs.CarParams, params: Params):
+ InferenceStateBase.__init__(self)
+ self.CP = CP
+ self.params = params
+ self.blinker_pause_lateral = IQSignalPauseController()
+
+ cloudlog.info("IQ controls layer waiting for IQCarParams")
+ self.CP_IQ = messaging.log_from_bytes(params.get("IQCarParams", block=True), custom.IQCarParams)
+ cloudlog.info("IQ controls layer got IQCarParams")
+
+ self.iq_sub_services = ['radarState', 'iqState', 'iqPlan', 'iqNavState']
+ self.iq_pub_services = ['iqCarControl']
+ self.radar_manager = RadarManager(CP, params)
+
+ self._next_param_refresh = 0.0
+ self._needs_iq_lead_data = CP.brand == "hyundai"
+ self._maneuver_mode = params.get_bool("LateralManeuverMode")
+ self._sync_set_speed = self._want_set_speed_to_limit()
+ self._slc_limit_kph = None
+ self._slc_limit_pending_kph = None
+
+ def _want_set_speed_to_limit(self) -> bool:
+ try:
+ return self.params.get_bool("SLCSetSpeedToLimit")
+ except Exception:
+ return False
+
+ # --- periodic param refresh (throttled to a few Hz) --------------------------
+ def refresh_iq_params(self, sm: messaging.SubMaster) -> None:
+ now = time.monotonic()
+ if now - self._next_param_refresh <= _PARAM_REFRESH_S:
+ return
+ self.blinker_pause_lateral.get_params()
+ if self.CP.lateralTuning.which() == 'torque':
+ self.lat_delay = resolve_steer_delay(self.params, sm["liveDelay"].lateralDelay)
+ self._sync_set_speed = self._want_set_speed_to_limit()
+ self.radar_manager.read_params()
+ self._next_param_refresh = now
+
+ # --- lateral engage gate -----------------------------------------------------
+ def iq_lateral_allowed(self, sm: messaging.SubMaster) -> bool:
+ if self.blinker_pause_lateral.update(sm['carState']):
+ return False
+
+ aol = sm['iqState'].aol
+ stock_active = bool(sm['selfdriveState'].active)
+ if self._maneuver_mode:
+ return stock_active or bool(aol.available and aol.active)
+ if aol.available:
+ return bool(aol.active)
+ return stock_active
+
+ @staticmethod
+ def _lead_snapshot(ld: log.RadarState.LeadData) -> dict:
+ return {field: getattr(ld, field) for field in _LEAD_FIELDS}
+
+ # --- build + publish the IQ car-control message ------------------------------
+ def _compose_iq_carcontrol(self, sm: messaging.SubMaster) -> custom.IQCarControl:
+ CC_IQ = custom.IQCarControl.new_message()
+ lp = sm['liveParameters']
+ CC_IQ.angleOffsetDeg = float(getattr(lp, 'angleOffsetDeg', 0.0))
+ CC_IQ.aol = sm['iqState'].aol
+
+ if self._needs_iq_lead_data:
+ CC_IQ.leadOne = self._lead_snapshot(sm['radarState'].leadOne)
+ CC_IQ.leadTwo = self._lead_snapshot(sm['radarState'].leadTwo)
+
+ if self.CP.openpilotLongitudinalControl:
+ cruise = getattr(sm['carState'], 'cruiseState', None)
+ set_speed_ms = float(max(getattr(cruise, 'speedCluster', 0.0), getattr(cruise, 'speed', 0.0), 0.0))
+ set_speed_kph = set_speed_ms * CV.MS_TO_KPH
+ if self._sync_set_speed:
+ CC_IQ.params, self._slc_limit_kph, self._slc_limit_pending_kph = build_iq_control_params_from_plan(
+ self.CP, sm['iqPlan'], bool(sm['selfdriveState'].enabled), set_speed_kph,
+ self._slc_limit_kph, self._slc_limit_pending_kph)
+ else:
+ self._slc_limit_kph = self._slc_limit_pending_kph = None
+ self.radar_manager.update(CC_IQ, sm, set_speed_kph)
+ return CC_IQ
+
+ @staticmethod
+ def _emit(CC_IQ: custom.IQCarControl, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None:
+ envelope = messaging.new_message('iqCarControl')
+ envelope.valid = sm['carState'].canValid
+ envelope.iqCarControl = CC_IQ
+ pm.send('iqCarControl', envelope)
+
+ def publish_iq_state(self, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None:
+ fresh = sm.updated['iqState'] or sm.updated['iqPlan'] or (self._needs_iq_lead_data and sm.updated['radarState'])
+ if not fresh:
+ return
+ self._emit(self._compose_iq_carcontrol(sm), sm, pm)
diff --git a/iqpilot/selfdrive/controls/lib/__init__.py b/iqpilot/selfdrive/controls/lib/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/selfdrive/controls/lib/custom_stop_distance.py b/iqpilot/selfdrive/controls/lib/custom_stop_distance.py
new file mode 100644
index 000000000..2ee12dc64
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/custom_stop_distance.py
@@ -0,0 +1,111 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Original concept ("Increased Stop Distance") by SpysyWeeb (github.com/SpysyWeeb), ported to
+IQ.Pilot and made bidirectional.
+
+Custom Stop Distance: nudge how far back IQ.Pilot stops behind a stopped lead vehicle or a
+model-held stop (red light). Independent of IQ Force Stops -- works whether Force Stops is on
+or off.
+
+IQCustomStopDistance (meters, -2..2): positive stops further back, negative settles in closer.
+0 is stock.
+
+Two mechanisms share the param:
+
+- Lead stops (radard): the reported lead distance is nudged by the offset, faded back out as the
+ lead gets up to speed so normal following distance is unaffected. Works in chill and end-to-end.
+
+- Model-held stops (planner, end-to-end mode): when the model's trajectory ends at ~zero velocity
+ (it plans to remain stopped, e.g. a red light), a positive offset brakes toward a point short of
+ its predicted stop and holds there instead of creeping forward -- it only ever adds braking on
+ top of the model's own plan, never relaxes below it. A negative offset is a no-op here: there's
+ no safe way to coax the car past the model's own conservative stop point this way.
+"""
+import numpy as np
+
+from iqdbc.car.interfaces import ACCEL_MIN
+from openpilot.common.params import Params
+from openpilot.common.realtime import DT_MDL
+from openpilot.selfdrive.modeld.constants import ModelConstants
+
+CUSTOM_STOP_DISTANCE_PARAM = "IQCustomStopDistance"
+MIN_DISTANCE_M = -2
+MAX_DISTANCE_M = 2
+
+# Fade the offset back out as the lead gets up to speed
+STOPPED_DISTANCE_FADE_BP = [0., 3.] # m/s, lead speed
+MIN_ADJUSTED_D_REL = 1.0 # m
+
+E2E_STOP_PLAN_VEL_THRESHOLD = 1.0 # m/s, model plan ending below this implies a held stop
+E2E_STOP_MIN_BRAKING = -0.1 # m/s^2, only deepen braking the model has already started
+E2E_STOP_MIN_DIST = 2.0 # m, never target a stop point closer than this
+E2E_STOP_HOLD_MAX_V = 0.5 # m/s, below this the car is considered stopped
+E2E_STOP_HOLD_BUFFER = 2.0 # m, hold until the model's stop point moves beyond offset + buffer
+
+
+def get_sanitize_int_param(key, min_val, max_val, params):
+ stored = params.get(key, return_default=True)
+ bounded = min(max(stored, min_val), max_val)
+ if bounded != stored:
+ params.put(key, bounded)
+ return bounded
+
+
+class CustomStopDistance:
+ def __init__(self):
+ self.params = Params()
+ self.frame = 0
+ self.distance = 0.
+ self.read_params()
+
+ def read_params(self) -> None:
+ self.distance = float(get_sanitize_int_param(CUSTOM_STOP_DISTANCE_PARAM, MIN_DISTANCE_M, MAX_DISTANCE_M, self.params))
+
+ def update(self) -> None:
+ if self.frame % int(3 / DT_MDL) == 0:
+ self.read_params()
+ self.frame += 1
+
+ def apply_lead(self, lead_dict: dict) -> dict:
+ if self.distance == 0. or not lead_dict.get('status', False):
+ return lead_dict
+
+ offset = self.distance * float(np.interp(lead_dict['vLead'], STOPPED_DISTANCE_FADE_BP, [1., 0.]))
+ adjusted = lead_dict['dRel'] - offset
+ if self.distance > 0:
+ # stop further back: never reduce the reported distance below the floor, and never report further than reality
+ lead_dict['dRel'] = min(lead_dict['dRel'], max(adjusted, MIN_ADJUSTED_D_REL))
+ else:
+ # stop closer in: never report closer than reality
+ lead_dict['dRel'] = max(lead_dict['dRel'], adjusted)
+ return lead_dict
+
+ def adjust_e2e_stop(self, a_target: float, should_stop: bool, v_ego: float, model_msg) -> tuple[float, bool]:
+ if self.distance <= 0.:
+ return a_target, should_stop
+
+ x = model_msg.position.x
+ v = model_msg.velocity.x
+ if len(x) != ModelConstants.IDX_N or len(v) != ModelConstants.IDX_N:
+ return a_target, should_stop
+
+ # only stops the model plans to hold (red lights) can be shifted -- stop signs are left alone:
+ # forcing an early stop makes the model treat the stop as completed and roll through the sign
+ if float(v[-1]) > E2E_STOP_PLAN_VEL_THRESHOLD:
+ return a_target, should_stop
+
+ stop_distance = float(x[-1])
+
+ if v_ego < E2E_STOP_HOLD_MAX_V:
+ # stopped short of the model's stop point: hold instead of creeping up to it
+ if stop_distance <= self.distance + E2E_STOP_HOLD_BUFFER:
+ should_stop = True
+ elif a_target < E2E_STOP_MIN_BRAKING:
+ # deepen braking that has already started, targeting a stop short of the model's stop point
+ adjusted_distance = max(stop_distance - self.distance, E2E_STOP_MIN_DIST)
+ a_required = max(-(v_ego ** 2) / (2 * adjusted_distance), ACCEL_MIN)
+ if a_required < a_target:
+ a_target = float(a_required)
+
+ return a_target, should_stop
diff --git a/iqpilot/selfdrive/controls/lib/helpers/__init__.py b/iqpilot/selfdrive/controls/lib/helpers/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/selfdrive/controls/lib/helpers/blinker_pause.py b/iqpilot/selfdrive/controls/lib/helpers/blinker_pause.py
new file mode 100644
index 000000000..e8d942fab
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/blinker_pause.py
@@ -0,0 +1,82 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from cereal import car
+
+from openpilot.common.constants import CV
+from openpilot.common.params import Params
+
+
+class SignalPauseEngine:
+ _KEY_ON = "IQBlinkerPauseLateral"
+ _KEY_UNIT = "IsMetric"
+ _KEY_GATE = "IQBlinkerMinLateralSpeed"
+
+ def __init__(self):
+ self._kv = Params()
+ self._state = {"on": False, "metric": False, "gate": 0.0}
+ self.reload_setup()
+
+ @staticmethod
+ def _one_signal(cs: car.CarState) -> bool:
+ return bool(cs.leftBlinker) ^ bool(cs.rightBlinker)
+
+ @staticmethod
+ def _as_float(raw) -> float:
+ try:
+ return float(raw) if raw is not None else 0.0
+ except (TypeError, ValueError):
+ return 0.0
+
+ def _pull_setup(self) -> None:
+ self._state["on"] = self._kv.get_bool(self._KEY_ON)
+ self._state["metric"] = self._kv.get_bool(self._KEY_UNIT)
+ self._state["gate"] = self._as_float(self._kv.get(self._KEY_GATE))
+
+ def _gate_mps(self) -> float:
+ factor = CV.KPH_TO_MS if self._state["metric"] else CV.MPH_TO_MS
+ return self._state["gate"] * factor
+
+ def reload_setup(self) -> None:
+ self._pull_setup()
+
+ def heartbeat(self) -> None:
+ self._pull_setup()
+
+ def is_paused(self, cs: car.CarState) -> bool:
+ return bool(self._state["on"] and self._one_signal(cs) and cs.vEgo < self._gate_mps())
+
+ @property
+ def enabled(self):
+ return self._state["on"]
+
+ @enabled.setter
+ def enabled(self, value):
+ self._state["on"] = bool(value)
+
+ @property
+ def is_metric(self):
+ return self._state["metric"]
+
+ @is_metric.setter
+ def is_metric(self, value):
+ self._state["metric"] = bool(value)
+
+ @property
+ def min_speed(self):
+ return self._state["gate"]
+
+ @min_speed.setter
+ def min_speed(self, value):
+ self._state["gate"] = float(value)
+
+
+class IQSignalPauseController(SignalPauseEngine):
+ def __init__(self):
+ super().__init__()
+
+ def get_params(self) -> None:
+ self.reload_setup()
+
+ def update(self, cs: car.CarState) -> bool:
+ return self.is_paused(cs)
diff --git a/iqpilot/selfdrive/controls/lib/helpers/curvature.py b/iqpilot/selfdrive/controls/lib/helpers/curvature.py
new file mode 100644
index 000000000..a13b3f3cb
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/curvature.py
@@ -0,0 +1,48 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+from numpy import clip, interp
+
+from openpilot.common.realtime import DT_MDL
+from openpilot.iqpilot.selfdrive.iqmodeld.config import ModelConstants
+from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N, MAX_LATERAL_JERK, MIN_SPEED
+
+
+def _sanitize_plan(headings, curvatures):
+ valid_shape = len(headings) == CONTROL_N and len(curvatures) >= CONTROL_N
+ if valid_shape:
+ return headings, curvatures
+ placeholder = [0.0] * CONTROL_N
+ return placeholder, placeholder
+
+
+def _project_future_heading(delay_s: float, headings) -> float:
+ return float(interp(delay_s, ModelConstants.T_IDXS[:CONTROL_N], headings))
+
+
+def _convert_heading_to_curvature(projected_heading: float, speed_mps: float, current_curvature: float, delay_s: float) -> float:
+ turning_arc = projected_heading / (speed_mps * delay_s)
+ return (2.0 * turning_arc) - current_curvature
+
+
+def _limit_curvature_rate(target_curvature: float, current_curvature: float, speed_mps: float) -> float:
+ curvature_step = MAX_LATERAL_JERK / (speed_mps ** 2)
+ lower = current_curvature - (curvature_step * DT_MDL)
+ upper = current_curvature + (curvature_step * DT_MDL)
+ return float(clip(target_curvature, lower, upper))
+
+
+def solve_lag_curvature(steer_delay, v_ego, psis, curvatures):
+ headings, curvature_track = _sanitize_plan(psis, curvatures)
+ speed_mps = max(MIN_SPEED, v_ego)
+ delay_s = max(float(steer_delay), 1e-3)
+ current_curvature = float(curvature_track[0])
+ projected_heading = _project_future_heading(delay_s, headings)
+ target_curvature = _convert_heading_to_curvature(projected_heading, speed_mps, current_curvature, delay_s)
+ return _limit_curvature_rate(target_curvature, current_curvature, speed_mps)
+
+
+get_lag_adjusted_curvature = solve_lag_curvature
diff --git a/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py b/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py
new file mode 100644
index 000000000..c7c628669
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py
@@ -0,0 +1,143 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from cereal import messaging, custom
+
+from openpilot.common.params import Params
+from openpilot.common.realtime import DT_MDL
+from openpilot.iqpilot.selfdrive.selfdrived.events import IQEvents
+
+PARAM_PATH = "EndToEndAlert"
+PARAM_LEAD = "EndToEndLeadAlert"
+PARAM_STRIDE_S = 2.0
+
+SETTLE_S = 1.0
+CONFIRM_S = 0.4
+ROLL_MPS = 0.3
+
+HORIZON_TAIL = 5
+PATH_SPEED_MPS = 3.0
+
+LEAD_QUEUE_M = 12.0
+LEAD_SPEED_MPS = 1.0
+LEAD_GAP_M = 0.5
+
+
+class _Confirm:
+ def __init__(self, window_s: float):
+ self._window = window_s
+ self._held = 0.0
+ self._spent = False
+
+ def clear(self) -> None:
+ self._held = 0.0
+ self._spent = False
+
+ def poll(self, holds: bool) -> bool:
+ if self._spent:
+ return False
+ self._held = self._held + DT_MDL if holds else 0.0
+ if self._held < self._window:
+ return False
+ self._spent = True
+ return True
+
+
+class _Dwell:
+ def __init__(self):
+ self.seconds = 0.0
+ self.lead_floor = float('inf')
+
+ def clear(self) -> None:
+ self.seconds = 0.0
+ self.lead_floor = float('inf')
+
+ def tick(self, lead_range: float | None) -> None:
+ self.seconds += DT_MDL
+ if lead_range is not None:
+ self.lead_floor = min(self.lead_floor, lead_range)
+
+ @property
+ def settled(self) -> bool:
+ return self.seconds >= SETTLE_S
+
+ @property
+ def queued(self) -> bool:
+ return self.lead_floor < LEAD_QUEUE_M
+
+
+class EndToEndAlertEngine:
+ def __init__(self):
+ self._params = Params()
+ self._on = {"path": False, "lead": False}
+ self._elapsed_since_read = PARAM_STRIDE_S
+ self._dwell = _Dwell()
+ self._confirm = {"path": _Confirm(CONFIRM_S), "lead": _Confirm(CONFIRM_S)}
+ self._fired = {"path": False, "lead": False}
+
+ def _refresh_params(self) -> None:
+ self._elapsed_since_read += DT_MDL
+ if self._elapsed_since_read < PARAM_STRIDE_S:
+ return
+ self._elapsed_since_read = 0.0
+ self._on["path"] = self._params.get_bool(PARAM_PATH)
+ self._on["lead"] = self._params.get_bool(PARAM_LEAD)
+
+ @staticmethod
+ def _car_holds_long(sm: messaging.SubMaster) -> bool:
+ # AOL steers without raising selfdriveState.enabled, so the pair reads as long authority
+ return bool(sm['selfdriveState'].enabled or sm['carState'].cruiseState.enabled)
+
+ @staticmethod
+ def _halted(cs) -> bool:
+ return bool(cs.standstill) or abs(cs.vEgo) < ROLL_MPS
+
+ @staticmethod
+ def _horizon_speed(model) -> float:
+ # capnp list readers reject slices
+ samples = model.velocity.x
+ count = len(samples)
+ if count < HORIZON_TAIL:
+ return 0.0
+ return sum(samples[i] for i in range(count - HORIZON_TAIL, count)) / HORIZON_TAIL
+
+ def _rearm(self) -> None:
+ self._dwell.clear()
+ for gate in self._confirm.values():
+ gate.clear()
+
+ def update(self, sm: messaging.SubMaster, iq_events: IQEvents) -> None:
+ self._refresh_params()
+ self._fired["path"] = self._fired["lead"] = False
+
+ cs = sm['carState']
+ lead = sm['radarState'].leadOne
+ lead_range = float(lead.dRel) if lead.status else None
+
+ if not self._halted(cs) or cs.gasPressed or self._car_holds_long(sm):
+ self._rearm()
+ return
+
+ self._dwell.tick(lead_range)
+ if not self._dwell.settled:
+ return
+
+ if self._on["path"] and lead_range is None:
+ opened = self._horizon_speed(sm['modelV2']) > PATH_SPEED_MPS
+ self._fired["path"] = self._confirm["path"].poll(opened)
+
+ if self._on["lead"] and lead_range is not None and self._dwell.queued:
+ pulling = lead.vLead > LEAD_SPEED_MPS and (lead_range - self._dwell.lead_floor) > LEAD_GAP_M
+ self._fired["lead"] = self._confirm["lead"].poll(pulling)
+
+ if self._fired["path"] or self._fired["lead"]:
+ iq_events.add(custom.IQOnroadEvent.EventName.e2eChime)
+
+ @property
+ def path_alert(self) -> bool:
+ return self._fired["path"]
+
+ @property
+ def lead_alert(self) -> bool:
+ return self._fired["lead"]
diff --git a/iqpilot/selfdrive/controls/lib/helpers/lane_change.py b/iqpilot/selfdrive/controls/lib/helpers/lane_change.py
new file mode 100644
index 000000000..f0e720872
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/lane_change.py
@@ -0,0 +1,293 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from cereal import custom, log
+
+from openpilot.common.params import Params
+from openpilot.common.realtime import DT_MDL
+
+NAV_EXIT_COMMIT_DISTANCE = 500.0 # m before a route exit to begin moving into the exit lane
+_ManeuverType = custom.IQNavState.ManeuverType
+_NavDirection = custom.NavDirection
+
+
+class LaneSwapPreset:
+ DISABLED = -1
+ STEERING_NUDGE = 0
+ DIRECT = 1
+ DELAY_HALF = 2
+ DELAY_ONE = 3
+ DELAY_TWO = 4
+ DELAY_THREE = 5
+ OFF = DISABLED
+ NUDGE = STEERING_NUDGE
+ NUDGELESS = DIRECT
+ HALF_SECOND = DELAY_HALF
+ ONE_SECOND = DELAY_ONE
+ TWO_SECONDS = DELAY_TWO
+ THREE_SECONDS = DELAY_THREE
+
+
+PRESET_SECONDS = {
+ LaneSwapPreset.DISABLED: 0.0,
+ LaneSwapPreset.STEERING_NUDGE: 0.0,
+ LaneSwapPreset.DIRECT: 0.05,
+ LaneSwapPreset.DELAY_HALF: 0.5,
+ LaneSwapPreset.DELAY_ONE: 1.0,
+ LaneSwapPreset.DELAY_TWO: 2.0,
+ LaneSwapPreset.DELAY_THREE: 3.0,
+}
+
+LANE_SWAP_SECONDS = dict(PRESET_SECONDS)
+BLINDSPOT_WAIT_OFFSET = -1
+
+
+class LaneSwapEngine:
+ def __init__(self, desire_hub):
+ self._hub = desire_hub
+ self._kv = Params()
+ self._mem = {
+ "sec": 0.0,
+ "tick": 0,
+ "gate": 0.0,
+ "preset": self._kv.get("IQLaneChangeTimer", return_default=True),
+ "bsm_hold": False,
+ "braked": False,
+ "ready": False,
+ "used": False,
+ }
+ self.reload_setup()
+
+ def _pull_setup(self) -> None:
+ self._mem["bsm_hold"] = self._kv.get_bool("IQLaneChangeBsmDelay")
+ self._mem["preset"] = self._kv.get("IQLaneChangeTimer", return_default=True)
+
+ def _idle_phase(self) -> bool:
+ return (
+ self._hub.lane_change_state == log.LaneChangeState.off and
+ self._hub.lane_change_direction == log.LaneChangeDirection.none
+ )
+
+ def _seconds_for_preset(self) -> float:
+ picked = self._mem["preset"]
+ return PRESET_SECONDS.get(picked, PRESET_SECONDS[LaneSwapPreset.STEERING_NUDGE])
+
+ def _auto_preset_active(self) -> bool:
+ picked = self._mem["preset"]
+ return picked not in (LaneSwapPreset.DISABLED, LaneSwapPreset.STEERING_NUDGE)
+
+ def _advance_clock(self, blindspot_now: bool) -> None:
+ wait_s = self._seconds_for_preset()
+ self._mem["gate"] = wait_s
+ self._mem["sec"] += DT_MDL
+ if self._mem["bsm_hold"] and blindspot_now and wait_s > 0.0:
+ if wait_s == PRESET_SECONDS[LaneSwapPreset.DIRECT]:
+ self._mem["sec"] = BLINDSPOT_WAIT_OFFSET
+ else:
+ self._mem["sec"] = wait_s + BLINDSPOT_WAIT_OFFSET
+
+ def _ready_to_fire(self) -> bool:
+ return (
+ self._auto_preset_active() and
+ (not self._mem["braked"]) and
+ (not self._mem["used"]) and
+ (self._mem["sec"] > self._mem["gate"])
+ )
+
+ def reload_setup(self) -> None:
+ self._pull_setup()
+
+ def heartbeat(self) -> None:
+ if (self._mem["tick"] % 50) == 0:
+ self._pull_setup()
+ self._mem["tick"] += 1
+
+ def sample(self, blindspot_now: bool = False, brake_now: bool = False, **legacy) -> None:
+ blindspot_now = bool(legacy.get("blindspot_detected", blindspot_now))
+ brake_now = bool(legacy.get("brake_pressed", brake_now))
+ self._mem["braked"] = self._mem["braked"] or brake_now
+ self._advance_clock(blindspot_now)
+ self._mem["ready"] = self._ready_to_fire()
+
+ def finalize(self) -> None:
+ started = self._hub.lane_change_state == log.LaneChangeState.laneChangeStarting
+ self._mem["used"] = self._mem["used"] or started
+ if self._idle_phase():
+ self._mem["sec"] = 0.0
+ self._mem["braked"] = False
+ self._mem["used"] = False
+
+ @property
+ def ready(self):
+ return self._mem["ready"]
+
+ @property
+ def delay(self):
+ return self._mem["gate"]
+
+ @property
+ def elapsed(self):
+ return self._mem["sec"]
+
+ @property
+ def preset(self):
+ return self._mem["preset"]
+
+ @preset.setter
+ def preset(self, value):
+ self._mem["preset"] = value
+
+ @property
+ def bsm_hold(self):
+ return self._mem["bsm_hold"]
+
+ @bsm_hold.setter
+ def bsm_hold(self, value):
+ self._mem["bsm_hold"] = bool(value)
+
+ @property
+ def braked(self):
+ return self._mem["braked"]
+
+ @braked.setter
+ def braked(self, value):
+ self._mem["braked"] = bool(value)
+
+ @property
+ def used(self):
+ return self._mem["used"]
+
+ @used.setter
+ def used(self, value):
+ self._mem["used"] = bool(value)
+
+
+class NavExitLaneChangeController:
+ def __init__(self, enable_bsm: bool):
+ self._params = Params()
+ self._enable_bsm = bool(enable_bsm)
+ self.enabled = self._read_enabled()
+ self._tick = 0
+ self.active = False
+ self.direction = log.LaneChangeDirection.none
+ self.auto_allowed = False
+
+ def _read_enabled(self) -> bool:
+ try:
+ return self._params.get_bool("NavExitLaneChange")
+ except Exception:
+ return False
+
+ def update_params(self) -> None:
+ if self._tick % 50 == 0:
+ self.enabled = self._read_enabled()
+ self._tick += 1
+
+ @staticmethod
+ def _raw(value):
+ return getattr(value, "raw", value)
+
+ def update(self, nav_state, carstate) -> None:
+ self.active = False
+ self.direction = log.LaneChangeDirection.none
+ self.auto_allowed = False
+
+ if not self.enabled or nav_state is None or not getattr(nav_state, "active", False):
+ return
+ if not getattr(nav_state, "nextManeuverValid", False):
+ return
+ if self._raw(getattr(nav_state, "nextManeuverType", _ManeuverType.none)) != int(_ManeuverType.exit):
+ return
+ distance = float(getattr(nav_state, "nextManeuverDistance", 0.0))
+ if not 0.0 < distance <= NAV_EXIT_COMMIT_DISTANCE:
+ return
+
+ direction = self._raw(getattr(nav_state, "nextManeuverDirection", _NavDirection.none))
+ if direction == int(_NavDirection.left):
+ self.direction = log.LaneChangeDirection.left
+ elif direction == int(_NavDirection.right):
+ self.direction = log.LaneChangeDirection.right
+ else:
+ return
+
+ self.active = True
+ blindspot = carstate.leftBlindspot if self.direction == log.LaneChangeDirection.left else carstate.rightBlindspot
+ self.auto_allowed = (not blindspot) if self._enable_bsm else False
+
+
+AutoLaneChangeMode = LaneSwapPreset
+AUTO_LANE_CHANGE_TIMER = LANE_SWAP_SECONDS
+ONE_SECOND_DELAY = BLINDSPOT_WAIT_OFFSET
+
+
+class IQLaneSwapController(LaneSwapEngine):
+ def __init__(self, desire_helper):
+ super().__init__(desire_helper)
+
+ def reset(self) -> None:
+ self.finalize()
+
+ def update_params(self) -> None:
+ self.heartbeat()
+
+ def update_lane_change(self, blindspot_detected: bool, brake_pressed: bool) -> None:
+ self.sample(blindspot_now=blindspot_detected, brake_now=brake_pressed)
+
+ def update_state(self) -> None:
+ self.finalize()
+
+ @property
+ def lane_change_wait_timer(self):
+ return self.elapsed
+
+ @lane_change_wait_timer.setter
+ def lane_change_wait_timer(self, value):
+ self._mem["sec"] = float(value)
+
+ @property
+ def lane_change_delay(self):
+ return self.delay
+
+ @lane_change_delay.setter
+ def lane_change_delay(self, value):
+ self._mem["gate"] = float(value)
+
+ @property
+ def lane_change_set_timer(self):
+ return self.preset
+
+ @lane_change_set_timer.setter
+ def lane_change_set_timer(self, value):
+ self.preset = value
+
+ @property
+ def lane_change_bsm_delay(self):
+ return self.bsm_hold
+
+ @lane_change_bsm_delay.setter
+ def lane_change_bsm_delay(self, value):
+ self.bsm_hold = value
+
+ @property
+ def prev_brake_pressed(self):
+ return self.braked
+
+ @prev_brake_pressed.setter
+ def prev_brake_pressed(self, value):
+ self.braked = value
+
+ @property
+ def auto_lane_change_allowed(self):
+ return self.ready
+
+ @auto_lane_change_allowed.setter
+ def auto_lane_change_allowed(self, value):
+ self._mem["ready"] = bool(value)
+
+ @property
+ def prev_lane_change(self):
+ return self.used
+
+ @prev_lane_change.setter
+ def prev_lane_change(self, value):
+ self.used = value
diff --git a/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py b/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py
new file mode 100644
index 000000000..5ad6e2204
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py
@@ -0,0 +1,157 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+from dataclasses import dataclass
+
+from cereal import custom
+
+from openpilot.common.constants import CV
+from openpilot.common.params import Params
+
+TurnDirection = custom.IQTurnSignalDirection
+
+TURN_TRIGGER_MPS = 20 * CV.MPH_TO_MS
+TURN_SPEED_GATE_MPS = TURN_TRIGGER_MPS
+LANE_CHANGE_SPEED_MIN = TURN_SPEED_GATE_MPS
+
+
+@dataclass
+class _TurnGateState:
+ active: bool = False
+ speed_limit_mps: float = TURN_TRIGGER_MPS
+ outcome: int = TurnDirection.none
+ refresh_tick: int = 0
+
+
+def _mph_param_to_mps(raw_value) -> float:
+ try:
+ return float(raw_value) * CV.MPH_TO_MS
+ except (TypeError, ValueError):
+ return TURN_TRIGGER_MPS
+
+
+def _resolve_signal_choice(speed_mps: float,
+ speed_limit_mps: float,
+ left_signal: bool,
+ right_signal: bool,
+ left_blocked: bool,
+ right_blocked: bool) -> int:
+ if speed_mps >= speed_limit_mps:
+ return TurnDirection.none
+ if left_signal and not right_signal and not left_blocked:
+ return TurnDirection.turnLeft
+ if right_signal and not left_signal and not right_blocked:
+ return TurnDirection.turnRight
+ return TurnDirection.none
+
+
+class TurnSignalPlanner:
+ _REFRESH_STRIDE = 50
+
+ def __init__(self, desire_hub):
+ self._desire_hub = desire_hub
+ self._params = Params()
+ self._state = _TurnGateState()
+ self.reload_setup()
+
+ def _refresh_from_params(self) -> None:
+ requested_gate = _mph_param_to_mps(self._params.get("IQLaneTurnValue", return_default=True))
+ self._state.active = self._params.get_bool("IQLaneTurnDesire")
+ self._state.speed_limit_mps = min(TURN_TRIGGER_MPS, requested_gate)
+
+ def _consume_legacy_kwargs(self, **legacy) -> tuple[bool, bool, bool, bool, float]:
+ return (
+ bool(legacy.get("blindspot_left", False)),
+ bool(legacy.get("blindspot_right", False)),
+ bool(legacy.get("left_blinker", False)),
+ bool(legacy.get("right_blinker", False)),
+ float(legacy.get("v_ego", 0.0)),
+ )
+
+ def reload_setup(self):
+ self._refresh_from_params()
+
+ def heartbeat(self) -> None:
+ if self._state.refresh_tick % self._REFRESH_STRIDE == 0:
+ self._refresh_from_params()
+ self._state.refresh_tick += 1
+
+ def sample(self,
+ blocked_l: bool = False,
+ blocked_r: bool = False,
+ blink_l: bool = False,
+ blink_r: bool = False,
+ speed_mps: float = 0.0,
+ **legacy) -> None:
+ if legacy:
+ blocked_l, blocked_r, blink_l, blink_r, speed_mps = self._consume_legacy_kwargs(**legacy)
+ self._state.outcome = _resolve_signal_choice(speed_mps,
+ self._state.speed_limit_mps,
+ blink_l,
+ blink_r,
+ blocked_l,
+ blocked_r)
+
+ def output(self):
+ return self._state.outcome if self._state.active else TurnDirection.none
+
+ @property
+ def enabled(self):
+ return self._state.active
+
+ @enabled.setter
+ def enabled(self, value):
+ self._state.active = bool(value)
+
+ @property
+ def speed_gate(self):
+ return self._state.speed_limit_mps
+
+ @speed_gate.setter
+ def speed_gate(self, value):
+ self._state.speed_limit_mps = float(value)
+
+ @property
+ def turn_direction(self):
+ return self._state.outcome
+
+ @turn_direction.setter
+ def turn_direction(self, value):
+ self._state.outcome = value
+
+
+class IQNavTurnController(TurnSignalPlanner):
+ def __init__(self, desire_helper):
+ super().__init__(desire_helper)
+
+ def read_params(self):
+ self.reload_setup()
+
+ def update_params(self) -> None:
+ self.heartbeat()
+
+ def update_lane_turn(self,
+ blindspot_left: bool,
+ blindspot_right: bool,
+ left_blinker: bool,
+ right_blinker: bool,
+ v_ego: float) -> None:
+ self.sample(blocked_l=blindspot_left,
+ blocked_r=blindspot_right,
+ blink_l=left_blinker,
+ blink_r=right_blinker,
+ speed_mps=v_ego)
+
+ def get_turn_direction(self):
+ return self.output()
+
+ @property
+ def lane_turn_value(self):
+ return self.speed_gate
+
+ @lane_turn_value.setter
+ def lane_turn_value(self, value):
+ self.speed_gate = value
diff --git a/iqpilot/selfdrive/controls/lib/helpers/nav_torque_pulse.py b/iqpilot/selfdrive/controls/lib/helpers/nav_torque_pulse.py
new file mode 100644
index 000000000..f717060b4
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/nav_torque_pulse.py
@@ -0,0 +1,83 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Short, decaying steering-torque nudges that lean the car through navigation
+turns and highway exits. This is a lateral-control add-on driven by iqNavState;
+it is independent of the feed-forward model and is off by default.
+"""
+import numpy as np
+import cereal.messaging as messaging
+from cereal import custom
+
+TURN_NUDGE_TORQUE = 0.8
+EXIT_NUDGE_TORQUE = 0.6
+TURN_PULSE_FRAMES = 50
+EXIT_PULSE_FRAMES = 75
+
+# Master switch — nav torque influence is experimental and shipped off.
+IQP_NAV_TORQUE_INFLUENCE_ENABLED = False
+
+_LEFT = 1 # turnDesireDirection / lanePositioningDirection: 1 == left
+
+
+class NavTorquePulseBrain:
+ def __init__(self, lac_torque):
+ self._controller = lac_torque
+ self._nav_sm = messaging.SubMaster(["iqNavState"], poll="iqNavState")
+ self._nav_key = ""
+ self._nav_pulse_sign = 0.0
+ self._nav_pulse_frames = 0
+
+ def _lookup_nav_pulse(self):
+ if not IQP_NAV_TORQUE_INFLUENCE_ENABLED:
+ return "", 0.0, 0
+
+ self._nav_sm.update(0)
+ nav_state = self._nav_sm["iqNavState"]
+ phase = getattr(nav_state, "maneuverPhase", custom.IQNavState.ManeuverPhase.none)
+ maneuver_direction = getattr(nav_state, "maneuverDirection", custom.NavDirection.none)
+
+ # left nudges negative, otherwise positive
+ def turn(tag, direction):
+ return f"turn{tag}:{direction}", -TURN_NUDGE_TORQUE if direction == _LEFT else TURN_NUDGE_TORQUE, TURN_PULSE_FRAMES
+
+ def keep(tag, direction):
+ return f"{tag}:{direction}", -EXIT_NUDGE_TORQUE if direction == _LEFT else EXIT_NUDGE_TORQUE, EXIT_PULSE_FRAMES
+
+ if phase == custom.IQNavState.ManeuverPhase.turnActive:
+ return turn("-phase", getattr(nav_state, "turnDesireDirection", 0))
+ if phase == custom.IQNavState.ManeuverPhase.highwayCommit and maneuver_direction in (custom.NavDirection.left, custom.NavDirection.right):
+ return keep("highway-phase", getattr(nav_state, "lanePositioningDirection", 0))
+ if getattr(nav_state, "shouldSendTurnDesire", False):
+ return turn("", getattr(nav_state, "turnDesireDirection", 0))
+ if getattr(nav_state, "shouldSendLanePositioning", False):
+ return keep("keep", getattr(nav_state, "lanePositioningDirection", 0))
+ return "", 0.0, 0
+
+ def nudge_output_torque(self, active: bool, car_state, output_torque: float) -> float:
+ if not IQP_NAV_TORQUE_INFLUENCE_ENABLED:
+ self._nav_pulse_frames = 0
+ self._nav_key = ""
+ return output_torque
+
+ nav_key, pulse_sign, pulse_frames = self._lookup_nav_pulse()
+
+ if not active or getattr(car_state, "steeringPressed", False):
+ self._nav_pulse_frames = 0
+ if not nav_key:
+ self._nav_key = ""
+ return output_torque
+
+ if nav_key and nav_key != self._nav_key:
+ self._nav_key = nav_key
+ self._nav_pulse_sign = pulse_sign
+ self._nav_pulse_frames = pulse_frames
+ elif not nav_key and self._nav_pulse_frames == 0:
+ self._nav_key = ""
+
+ if self._nav_pulse_frames > 0:
+ self._nav_pulse_frames -= 1
+ steer_max = float(getattr(self._controller, "steer_max", 1.0))
+ output_torque = float(np.clip(output_torque + self._nav_pulse_sign, -steer_max, steer_max))
+
+ return output_torque
diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/__init__.py b/iqpilot/selfdrive/controls/lib/helpers/tests/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/tests/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py b/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py
new file mode 100644
index 000000000..69a1f9513
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py
@@ -0,0 +1,133 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from types import SimpleNamespace
+
+import pytest
+
+import cereal.messaging as messaging
+from cereal import custom
+from openpilot.common.realtime import DT_MDL
+from openpilot.iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import (
+ EndToEndAlertEngine, CONFIRM_S, SETTLE_S, HORIZON_TAIL, PATH_SPEED_MPS, LEAD_SPEED_MPS, LEAD_GAP_M)
+
+E2E_CHIME = custom.IQOnroadEvent.EventName.e2eChime
+
+
+class _Events(list):
+ def add(self, name):
+ self.append(name)
+
+
+def _model(horizon):
+ msg = messaging.new_message('modelV2')
+ msg.modelV2.velocity.x = [0.0] * (33 - HORIZON_TAIL) + [horizon] * HORIZON_TAIL
+ return msg.as_reader().modelV2
+
+
+def _sm(*, v_ego=0.0, standstill=True, gas=False, enabled=False, cruise=False,
+ horizon=0.0, lead=None):
+ lead = lead or SimpleNamespace(status=False, dRel=0.0, vLead=0.0)
+ return {
+ 'carState': SimpleNamespace(vEgo=v_ego, standstill=standstill, gasPressed=gas,
+ cruiseState=SimpleNamespace(enabled=cruise)),
+ 'selfdriveState': SimpleNamespace(enabled=enabled),
+ 'radarState': SimpleNamespace(leadOne=lead),
+ 'modelV2': _model(horizon),
+ }
+
+
+def _engine(path=True, lead=True):
+ engine = EndToEndAlertEngine()
+ engine._refresh_params = lambda: None
+ engine._on = {"path": path, "lead": lead}
+ return engine
+
+
+def _run(engine, sm, seconds):
+ events = _Events()
+ chimes = 0
+ for _ in range(int(seconds / DT_MDL)):
+ engine.update(sm, events)
+ chimes += events.count(E2E_CHIME)
+ events.clear()
+ return chimes
+
+
+def _lead(d_rel, v_lead=0.0):
+ return SimpleNamespace(status=True, dRel=d_rel, vLead=v_lead)
+
+
+def test_path_opens_chimes_once():
+ engine = _engine()
+ assert _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) == 0
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), 5.0) == 0
+
+
+def test_path_needs_the_settle_dwell():
+ engine = _engine()
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), SETTLE_S - 0.2) == 0
+
+
+def test_path_silent_while_openpilot_long_is_engaged():
+ engine = _engine()
+ _run(engine, _sm(horizon=0.0, enabled=True), SETTLE_S + 1.0)
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, enabled=True), 5.0) == 0
+
+
+def test_path_silent_while_stock_acc_holds_the_car():
+ engine = _engine()
+ _run(engine, _sm(horizon=0.0, cruise=True), SETTLE_S + 1.0)
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, cruise=True), 5.0) == 0
+
+
+def test_path_chimes_under_aol():
+ engine = _engine()
+ _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0)
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1
+
+
+def test_path_ignores_a_visible_lead():
+ engine = _engine(lead=False)
+ _run(engine, _sm(horizon=0.0, lead=_lead(6.0)), SETTLE_S + 1.0)
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, lead=_lead(6.0)), 5.0) == 0
+
+
+def test_lead_pullaway_chimes_once():
+ engine = _engine()
+ assert _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) == 0
+ moving = _sm(lead=_lead(6.0 + LEAD_GAP_M + 0.5, LEAD_SPEED_MPS + 1.0))
+ assert _run(engine, moving, CONFIRM_S + 1.0) == 1
+ assert _run(engine, moving, 5.0) == 0
+
+
+def test_lead_creep_inside_the_gap_stays_silent():
+ engine = _engine()
+ _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0)
+ assert _run(engine, _sm(lead=_lead(6.0 + LEAD_GAP_M / 2, LEAD_SPEED_MPS + 1.0)), 5.0) == 0
+
+
+def test_lead_far_ahead_is_not_a_queue():
+ engine = _engine()
+ _run(engine, _sm(lead=_lead(40.0)), SETTLE_S + 1.0)
+ assert _run(engine, _sm(lead=_lead(44.0, LEAD_SPEED_MPS + 1.0)), 5.0) == 0
+
+
+def test_gas_and_motion_rearm_the_dwell():
+ engine = _engine()
+ _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0)
+ _run(engine, _sm(v_ego=5.0, standstill=False, horizon=8.0), 2.0)
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), SETTLE_S - 0.2) == 0
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1
+
+
+@pytest.mark.parametrize("param_off", ["path", "lead"])
+def test_each_param_gates_only_its_own_trigger(param_off):
+ engine = _engine(path=param_off != "path", lead=param_off != "lead")
+ if param_off == "path":
+ _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0)
+ assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), 5.0) == 0
+ else:
+ _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0)
+ assert _run(engine, _sm(lead=_lead(8.0, LEAD_SPEED_MPS + 1.0)), 5.0) == 0
diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/test_nav_torque_pulse.py b/iqpilot/selfdrive/controls/lib/helpers/tests/test_nav_torque_pulse.py
new file mode 100644
index 000000000..8c4541eb2
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/helpers/tests/test_nav_torque_pulse.py
@@ -0,0 +1,105 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from types import SimpleNamespace
+
+import numpy as np
+import pytest
+
+from cereal import custom
+import openpilot.iqpilot.selfdrive.controls.lib.helpers.nav_torque_pulse as nav_pulse
+from openpilot.iqpilot.selfdrive.controls.lib.helpers.nav_torque_pulse import (
+ NavTorquePulseBrain, TURN_PULSE_FRAMES, EXIT_PULSE_FRAMES)
+
+
+@pytest.fixture
+def influence_on():
+ nav_pulse.IQP_NAV_TORQUE_INFLUENCE_ENABLED = True
+ try:
+ yield
+ finally:
+ nav_pulse.IQP_NAV_TORQUE_INFLUENCE_ENABLED = False
+
+
+def _fixed_nav_sm(**fields):
+ nav = SimpleNamespace(
+ maneuverPhase=custom.IQNavState.ManeuverPhase.none,
+ maneuverDirection=custom.NavDirection.none,
+ shouldSendTurnDesire=False,
+ turnDesireDirection=0,
+ shouldSendLanePositioning=False,
+ lanePositioningDirection=0,
+ )
+ for k, v in fields.items():
+ setattr(nav, k, v)
+
+ class SM:
+ def update(self, _):
+ return None
+
+ def __getitem__(self, _):
+ return nav
+ return SM()
+
+
+def _brain(nav_sm=None, steer_max=1.0):
+ brain = NavTorquePulseBrain(SimpleNamespace(steer_max=steer_max))
+ if nav_sm is not None:
+ brain._nav_sm = nav_sm
+ return brain
+
+
+def test_passthrough_when_disabled():
+ brain = _brain()
+ cs = SimpleNamespace(steeringPressed=False)
+ assert brain.nudge_output_torque(True, cs, 0.42) == 0.42
+
+
+class TestPulseSign:
+ @pytest.mark.parametrize("direction,expect_negative", [(1, True), (2, False)])
+ def test_turn_desire_direction(self, influence_on, direction, expect_negative):
+ brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=direction))
+ cs = SimpleNamespace(steeringPressed=False)
+ first = brain.nudge_output_torque(True, cs, 0.0)
+ assert (first < 0.0) == expect_negative
+
+ def test_turn_active_phase_uses_turn_frames(self, influence_on):
+ brain = _brain(_fixed_nav_sm(maneuverPhase=custom.IQNavState.ManeuverPhase.turnActive,
+ turnDesireDirection=1))
+ cs = SimpleNamespace(steeringPressed=False)
+ outs = [brain.nudge_output_torque(True, cs, 0.0) for _ in range(TURN_PULSE_FRAMES + 2)]
+ assert outs[TURN_PULSE_FRAMES - 1] < 0.0
+ assert outs[TURN_PULSE_FRAMES] == 0.0
+
+
+class TestPulseLifecycle:
+ def test_pulse_expires_after_its_frame_count(self, influence_on):
+ brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=1))
+ cs = SimpleNamespace(steeringPressed=False)
+ outs = [brain.nudge_output_torque(True, cs, 0.0) for _ in range(TURN_PULSE_FRAMES + 3)]
+ assert all(o < 0.0 for o in outs[:TURN_PULSE_FRAMES])
+ assert all(o == 0.0 for o in outs[TURN_PULSE_FRAMES:])
+ assert all(np.isfinite(o) for o in outs)
+
+ def test_steering_press_suppresses_pulse(self, influence_on):
+ brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=1))
+ cs = SimpleNamespace(steeringPressed=True)
+ assert brain.nudge_output_torque(True, cs, 0.4) == 0.4
+
+ def test_inactive_suppresses_pulse(self, influence_on):
+ brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=1))
+ cs = SimpleNamespace(steeringPressed=False)
+ assert brain.nudge_output_torque(False, cs, 0.4) == 0.4
+
+ def test_output_clamped_to_steer_max(self, influence_on):
+ brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=2), steer_max=0.5)
+ cs = SimpleNamespace(steeringPressed=False)
+ out = brain.nudge_output_torque(True, cs, 0.4) # 0.4 + 0.8 nudge, clamped to 0.5
+ assert out == pytest.approx(0.5)
+
+ def test_lane_positioning_uses_exit_frames(self, influence_on):
+ brain = _brain(_fixed_nav_sm(shouldSendLanePositioning=True, lanePositioningDirection=1))
+ cs = SimpleNamespace(steeringPressed=False)
+ outs = [brain.nudge_output_torque(True, cs, 0.0) for _ in range(EXIT_PULSE_FRAMES + 2)]
+ assert outs[EXIT_PULSE_FRAMES - 1] < 0.0
+ assert outs[EXIT_PULSE_FRAMES] == 0.0
diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/__init__.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/engine.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/engine.py
new file mode 100644
index 000000000..6618eb3e6
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/iq_dynamic/engine.py
@@ -0,0 +1,249 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from cereal import messaging
+from numpy import interp
+from iqdbc.car import structs
+from openpilot.common.params import Params
+from openpilot.common.realtime import DT_MDL
+from openpilot.iqpilot.selfdrive.controls.lib.iq_dynamic.imahelper import (
+ IQConstants,
+ IQFilterEngine,
+ IQModeEngine,
+ IQ_DYNAMIC_CONDITIONAL_CURVES_PARAM,
+ IQ_DYNAMIC_CONDITIONAL_LEAD_SPEED_PARAM,
+ IQ_DYNAMIC_CONDITIONAL_MODEL_STOPS_PARAM,
+ IQ_DYNAMIC_CONDITIONAL_SLC_FALLBACK_PARAM,
+ IQ_DYNAMIC_CONDITIONAL_SLOWER_LEAD_PARAM,
+ IQ_DYNAMIC_CONDITIONAL_SPEED_PARAM,
+ IQ_DYNAMIC_CONDITIONAL_STOPPED_LEAD_PARAM,
+ IQ_DYNAMIC_MODE_PARAM,
+ IQ_DYNAMIC_MINIMUM_FORCE_STOP_LENGTH_PARAM,
+ IQ_DYNAMIC_MODEL_STOP_TIME_PARAM,
+ IQ_FORCE_STOPS_PARAM,
+ compute_slowdown_need,
+)
+
+S_Y = 33
+
+
+class IQDynamicController:
+ def __init__(self, CP: structs.CarParams, mpc, params=None):
+ self.IQS = CP
+ self._mpc = mpc
+ self.IQParams = params or Params()
+
+ self.IQDynamicStatus = False
+ self.IQDynamicA = False
+ self.IQDynamicF = 0
+ self.IQDynamicU = 0.0
+ self.IQEngineManager = IQModeEngine()
+
+ self.IQFilterL = IQFilterEngine(measurement_noise=0.17, process_noise=0.04, process_decay=1.03, smoothing_floor=0.9)
+ self.IQFilterSDL = IQFilterEngine(measurement_noise=0.12, process_noise=0.098, process_decay=1.01, smoothing_floor=0.8)
+ self.IQFilterSFL = IQFilterEngine(measurement_noise=0.11, process_noise=0.06, process_decay=1.000, smoothing_floor=0.90)
+ self.IQFilterFCW = IQFilterEngine(measurement_noise=0.19, process_noise=0.11, process_decay=1.11, smoothing_floor=0.4)
+ self.IQFilterSlowLead = IQFilterEngine(measurement_noise=0.15, process_noise=0.08, process_decay=1.02, smoothing_floor=0.75)
+ self.IQFilterModelStop = IQFilterEngine(measurement_noise=0.15, process_noise=0.06, process_decay=1.01, smoothing_floor=0.7)
+
+ self.hasIQFilterLED = False
+ self.hasIQSDL = False
+ self.hasIQSFL = False
+ self.hasIQL = False
+ self.curve_detected = False
+ self.slow_lead_detected = False
+ self.stop_light_detected = False
+ self.low_speed_detected = False
+ self.low_speed_lead_detected = False
+ self.model_stopped = False
+ self.tracking_lead = False
+ self.force_stops_enabled = True
+ self.slc_experimental_mode = False
+
+ self.kph = 0.0
+ self.cruise_kph = 0.0
+ self.aeb = 0
+ self.aeb_c = 0
+ self.ss_c = 0
+ self.e_x = float('inf')
+ self.e_d = 0.0
+ self.model_length = 0.0
+ self.lead_speed = 0.0
+
+ self.conditional_curves = True
+ self.conditional_slower_lead = True
+ self.conditional_stopped_lead = True
+ self.conditional_model_stops = True
+ self.conditional_slc_fallback = True
+ self.conditional_speed = IQConstants.CONDITIONAL_SPEED_DEFAULT
+ self.conditional_lead_speed = IQConstants.CONDITIONAL_LEAD_SPEED_DEFAULT
+ self.model_stop_time = IQConstants.MODEL_STOP_TIME_DEFAULT
+ self.minimum_force_stop_length = IQConstants.MINIMUM_FORCE_STOP_LENGTH_DEFAULT
+
+ def _read_bool(self, key: str, default: bool) -> bool:
+ value = self.IQParams.get_bool(key)
+ return default if value is None else bool(value)
+
+ def _read_float(self, key: str, default: float) -> float:
+ value = self.IQParams.get(key)
+ if value is None:
+ return default
+ if isinstance(value, bytes):
+ value = value.decode('utf-8')
+ try:
+ return float(value)
+ except (TypeError, ValueError):
+ return default
+
+ def _readIQParams(self) -> None:
+ if self.IQDynamicF % int(1. / DT_MDL) != 0:
+ return
+ self.IQDynamicStatus = self._read_bool(IQ_DYNAMIC_MODE_PARAM, False)
+ self.conditional_curves = self._read_bool(IQ_DYNAMIC_CONDITIONAL_CURVES_PARAM, True)
+ self.conditional_slower_lead = self._read_bool(IQ_DYNAMIC_CONDITIONAL_SLOWER_LEAD_PARAM, True)
+ self.conditional_stopped_lead = self._read_bool(IQ_DYNAMIC_CONDITIONAL_STOPPED_LEAD_PARAM, True)
+ self.conditional_model_stops = self._read_bool(IQ_DYNAMIC_CONDITIONAL_MODEL_STOPS_PARAM, True)
+ self.conditional_slc_fallback = self._read_bool(IQ_DYNAMIC_CONDITIONAL_SLC_FALLBACK_PARAM, True)
+ self.conditional_speed = self._read_float(IQ_DYNAMIC_CONDITIONAL_SPEED_PARAM, IQConstants.CONDITIONAL_SPEED_DEFAULT)
+ self.conditional_lead_speed = self._read_float(IQ_DYNAMIC_CONDITIONAL_LEAD_SPEED_PARAM, IQConstants.CONDITIONAL_LEAD_SPEED_DEFAULT)
+ self.model_stop_time = self._read_float(IQ_DYNAMIC_MODEL_STOP_TIME_PARAM, IQConstants.MODEL_STOP_TIME_DEFAULT)
+ self.minimum_force_stop_length = self._read_float(IQ_DYNAMIC_MINIMUM_FORCE_STOP_LENGTH_PARAM, IQConstants.MINIMUM_FORCE_STOP_LENGTH_DEFAULT)
+ self.force_stops_enabled = self._read_bool(IQ_FORCE_STOPS_PARAM, True)
+
+ def set_slc_experimental_mode(self, active: bool) -> None:
+ self.slc_experimental_mode = bool(active)
+
+ def mode(self) -> str:
+ return self.IQEngineManager.get_mode()
+
+ def enabled(self) -> bool:
+ return self.IQDynamicStatus
+
+ def active(self) -> bool:
+ return self.IQDynamicA
+
+ def force_stop_requested(self) -> bool:
+ return bool(self.force_stops_enabled and self.stop_light_detected and self.model_stopped and not self.tracking_lead)
+
+ def setaeb(self) -> None:
+ self.aeb = self.aeb_c
+
+ def IQDynamicEngine(self, sm: messaging.SubMaster) -> None:
+ car_state = sm['carState']
+ radar_state = sm['radarState']
+ model = sm['modelV2']
+
+ self.kph = car_state.vEgo * 3.6
+ self.cruise_kph = car_state.vCruise
+ self.ss_c = min(20, self.ss_c + 1) if car_state.standstill else max(0, self.ss_c - 1)
+
+ lead_status = float(getattr(radar_state.leadOne, "status", False))
+ self.IQFilterL.push(lead_status)
+ self.hasIQFilterLED = (self.IQFilterL.value() or 0.0) > IQConstants.LEAD_LOCK_GATE
+ self.tracking_lead = self.hasIQFilterLED
+ self.lead_speed = float(getattr(radar_state.leadOne, "vLead", 0.0))
+
+ prev_fcw = self.IQFilterFCW.value() or 0.0
+ self.IQFilterFCW.push(float(self.aeb > 0))
+ self.hasIQL = prev_fcw > 0.5
+
+ valid_model = len(model.position.x) == S_Y and len(model.orientation.x) == S_Y
+ if valid_model:
+ self.model_length = float(model.position.x[S_Y - 1])
+ self.e_x = self.model_length
+ self.e_d = interp(self.kph, IQConstants.BRAKE_CURVE_SPEED_AXIS, IQConstants.BRAKE_CURVE_DISTANCE_AXIS)
+ need = compute_slowdown_need(self.kph, self.model_length, self.e_d)
+ else:
+ self.model_length = 0.0
+ self.e_x = float('inf')
+ self.e_d = 0.0
+ need = 0.3 if self.kph > 20.0 else 0.0
+ self.IQFilterSDL.push(need)
+ self.IQDynamicU = self.IQFilterSDL.value() or 0.0
+ self.hasIQSDL = self.IQDynamicU > (IQConstants.BRAKE_CURVE_GATE * 0.8)
+ self.curve_detected = self.hasIQSDL
+
+ if self.ss_c <= 5 and not self.hasIQSDL:
+ slowness_observed = float(self.kph <= (self.cruise_kph * IQConstants.CRUISE_LAG_RATIO_GATE))
+ self.IQFilterSFL.push(slowness_observed)
+ threshold = IQConstants.CRUISE_LAG_GATE * (0.8 if self.hasIQSFL else 1.1)
+ self.hasIQSFL = (self.IQFilterSFL.value() or 0.0) > threshold
+
+ v_ego = float(car_state.vEgo)
+ self.low_speed_detected = not self.tracking_lead and IQConstants.CRUISING_SPEED <= v_ego < self.conditional_speed
+ self.low_speed_lead_detected = self.tracking_lead and IQConstants.CRUISING_SPEED <= v_ego < self.conditional_lead_speed
+
+ if self.tracking_lead:
+ slower_lead = (v_ego - self.lead_speed) > IQConstants.CRUISING_SPEED and self.conditional_slower_lead
+ stopped_lead = self.lead_speed < 1.0 and self.conditional_stopped_lead
+ self.IQFilterSlowLead.push(float(slower_lead or stopped_lead))
+ self.slow_lead_detected = (self.IQFilterSlowLead.value() or 0.0) >= IQConstants.SLOW_LEAD_THRESHOLD
+ else:
+ self.IQFilterSlowLead.reset()
+ self.slow_lead_detected = False
+
+ should_stop = bool(getattr(getattr(model, "action", None), "shouldStop", False))
+ model_stopping = self.model_length > 0.0 and self.model_length < max(v_ego * self.model_stop_time, IQConstants.CRUISING_SPEED)
+ self.model_stopped = bool(should_stop or model_stopping)
+ self.IQFilterModelStop.push(float(self.model_stopped and not self.tracking_lead))
+ self.stop_light_detected = (self.IQFilterModelStop.value() or 0.0) >= IQConstants.MODEL_STOP_THRESHOLD
+
+ def _request_blended(self, urgency: float = 1.0, emergency: bool = False) -> None:
+ self.IQEngineManager.request('blended', urgency=urgency, emergency=emergency)
+
+ def _request_acc(self, urgency: float = 0.8) -> None:
+ self.IQEngineManager.request('acc', urgency=urgency)
+
+ def IQStateEngine(self) -> None:
+ if self.hasIQL:
+ self._request_blended(1.0, True)
+ elif self.stop_light_detected and self.conditional_model_stops:
+ self._request_blended(1.0, self.model_stopped)
+ elif self.low_speed_detected or self.low_speed_lead_detected:
+ self._request_blended(0.95)
+ elif self.slow_lead_detected:
+ self._request_blended(0.9)
+ elif self.conditional_curves and self.hasIQSDL:
+ self._request_blended(max(0.8, min(1.0, self.IQDynamicU * 1.5)))
+ elif self.conditional_slc_fallback and self.slc_experimental_mode:
+ self._request_blended(0.8)
+ elif self.ss_c > 3:
+ self._request_blended(0.9)
+ elif self.hasIQSFL and not self.hasIQSDL:
+ self._request_acc(0.8)
+ else:
+ self._request_acc(0.7)
+
+ def IQStateEngine_R(self) -> None:
+ if self.hasIQL:
+ self._request_blended(1.0, True)
+ elif self.stop_light_detected and self.conditional_model_stops:
+ self._request_blended(1.0, self.model_stopped)
+ elif self.low_speed_detected or self.low_speed_lead_detected:
+ self._request_blended(0.95)
+ elif self.slow_lead_detected:
+ self._request_blended(0.9)
+ elif self.conditional_curves and self.hasIQSDL:
+ self._request_blended(max(0.8, min(1.0, self.IQDynamicU * 1.3)))
+ elif self.conditional_slc_fallback and self.slc_experimental_mode:
+ self._request_blended(0.8)
+ elif self.hasIQFilterLED and not (self.ss_c > 3):
+ self._request_acc(1.0)
+ elif self.ss_c > 3:
+ self._request_blended(0.9)
+ elif self.hasIQSFL and not self.hasIQSDL:
+ self._request_acc(0.8)
+ else:
+ self._request_acc(0.7)
+
+ def update(self, sm: messaging.SubMaster) -> None:
+ self._readIQParams()
+ self.setaeb()
+ self.IQDynamicEngine(sm)
+ if self.IQS.radarUnavailable:
+ self.IQStateEngine()
+ else:
+ self.IQStateEngine_R()
+ self.IQEngineManager.update()
+ self.IQDynamicA = sm['selfdriveState'].experimentalMode and self.IQDynamicStatus
+ self.IQDynamicF += 1
diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/imahelper.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/imahelper.py
new file mode 100644
index 000000000..610a046d9
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/iq_dynamic/imahelper.py
@@ -0,0 +1,148 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from typing import Literal
+
+ModeType = Literal['acc', 'blended']
+IQ_DYNAMIC_MODE_PARAM = "IQDynamicMode"
+IQ_DYNAMIC_CONDITIONAL_CURVES_PARAM = "IQDynamicConditionalCurves"
+IQ_DYNAMIC_CONDITIONAL_SLOWER_LEAD_PARAM = "IQDynamicConditionalSlowerLead"
+IQ_DYNAMIC_CONDITIONAL_STOPPED_LEAD_PARAM = "IQDynamicConditionalStoppedLead"
+IQ_DYNAMIC_CONDITIONAL_MODEL_STOPS_PARAM = "IQDynamicConditionalModelStops"
+IQ_DYNAMIC_CONDITIONAL_SLC_FALLBACK_PARAM = "IQDynamicConditionalSLCFallback"
+IQ_DYNAMIC_CONDITIONAL_SPEED_PARAM = "IQDynamicConditionalSpeed"
+IQ_DYNAMIC_CONDITIONAL_LEAD_SPEED_PARAM = "IQDynamicConditionalLeadSpeed"
+IQ_DYNAMIC_MODEL_STOP_TIME_PARAM = "IQDynamicModelStopTime"
+IQ_DYNAMIC_MINIMUM_FORCE_STOP_LENGTH_PARAM = "IQDynamicMinimumForceStopLength"
+IQ_FORCE_STOPS_PARAM = "IQForceStops"
+
+
+class IQConstants:
+ CRUISING_SPEED = 3.0
+ SIGNAL_QUEUE_DEPTH = 6
+ LEAD_LOCK_GATE = 0.45
+ BRAKE_CURVE_QUEUE_DEPTH = 5
+ BRAKE_CURVE_GATE = 0.3
+ BRAKE_CURVE_SPEED_AXIS = [0., 10., 20., 30., 40., 50., 55., 60.]
+ BRAKE_CURVE_DISTANCE_AXIS = [32., 46., 64., 86., 108., 130., 145., 165.]
+ CRUISE_LAG_QUEUE_DEPTH = 10
+ CRUISE_LAG_GATE = 0.55
+ CRUISE_LAG_RATIO_GATE = 1.025
+ CONDITIONAL_SPEED_DEFAULT = 18.0
+ CONDITIONAL_LEAD_SPEED_DEFAULT = 24.0
+ MODEL_STOP_TIME_DEFAULT = 3.0
+ MODEL_STOP_THRESHOLD = 0.55
+ SLOW_LEAD_THRESHOLD = 0.55
+ FORCE_STOP_PLANNER_TIME = 3.0
+ MINIMUM_FORCE_STOP_LENGTH_DEFAULT = 0.0
+
+
+def compute_slowdown_need(kph: float, horizon_dist: float, desired_dist: float) -> float:
+ if horizon_dist >= desired_dist or desired_dist <= 0.0:
+ return 0.0
+
+ shortage = desired_dist - horizon_dist
+ shortage_ratio = shortage / desired_dist
+ need = min(1.0, shortage_ratio * 2.0)
+
+ if horizon_dist < desired_dist * 0.3:
+ need = min(1.0, need * 2.0)
+
+ if kph > 25.0:
+ need = min(1.0, need * (1.0 + (kph - 25.0) / 80.0))
+
+ return need
+
+
+class IQFilterEngine:
+ def __init__(self, initial=0.0, measurement_noise=0.1, process_noise=0.01, process_decay=1.0, smoothing_floor=0.85):
+ self._value = initial
+ self._variance = 1.0
+ self._measurement_noise = measurement_noise
+ self._process_noise = process_noise
+ self._process_decay = process_decay
+ self._smoothing_floor = smoothing_floor
+ self._initialized = False
+ self._samples = []
+ self._sample_limit = 10
+ self._confidence = 0.0
+
+ def push(self, measurement: float) -> None:
+ if len(self._samples) >= self._sample_limit:
+ self._samples.pop(0)
+ self._samples.append(measurement)
+
+ if not self._initialized:
+ self._value = measurement
+ self._initialized = True
+ self._confidence = 0.1
+ return
+
+ self._variance = self._process_decay * self._variance + self._process_noise
+ gain = self._variance / (self._variance + self._measurement_noise)
+ effective_gain = gain * (1.0 - self._smoothing_floor) + self._smoothing_floor * 0.1
+
+ innovation = measurement - self._value
+ self._value = self._value + effective_gain * innovation
+ self._variance = (1.0 - effective_gain) * self._variance
+
+ if abs(innovation) < 0.1:
+ self._confidence = min(1.0, self._confidence + 0.05)
+ else:
+ self._confidence = max(0.1, self._confidence - 0.02)
+
+ def value(self):
+ return self._value if self._initialized else None
+
+ def confidence(self) -> float:
+ return self._confidence
+
+ def reset(self) -> None:
+ self._initialized = False
+ self._samples = []
+ self._confidence = 0.0
+
+
+class IQModeEngine:
+ def __init__(self):
+ self._state: ModeType = 'acc'
+ self._scores = {'acc': 1.0, 'blended': 0.0}
+ self._switching_timer = 0
+ self._mode_age = 0
+ self._forced_takeover = False
+
+ def request(self, mode: ModeType, urgency: float = 1.0, emergency: bool = False) -> None:
+ if emergency:
+ self._forced_takeover = True
+ self._state = mode
+ self._switching_timer = 15
+ self._mode_age = 0
+ return
+
+ self._scores[mode] = min(1.0, self._scores[mode] + 0.1 * urgency)
+ for key in self._scores:
+ if key != mode:
+ self._scores[key] = max(0.0, self._scores[key] - 0.05)
+
+ if self._mode_age < 10 and not self._forced_takeover:
+ return
+
+ threshold = 0.6 if mode != self._state else 0.3
+ if self._scores[mode] > threshold and mode != self._state and self._switching_timer == 0:
+ self._switching_timer = 15
+ self._state = mode
+ self._mode_age = 0
+
+ def update(self) -> None:
+ if self._switching_timer > 0:
+ self._switching_timer -= 1
+
+ self._mode_age += 1
+ if self._forced_takeover and self._mode_age > 20:
+ self._forced_takeover = False
+
+ for key in self._scores:
+ self._scores[key] *= 0.98
+
+ def get_mode(self) -> ModeType:
+ return self._state
diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/radar_manager.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/radar_manager.py
new file mode 100644
index 000000000..97c2fe628
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/iq_dynamic/radar_manager.py
@@ -0,0 +1,68 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+
+RadarManager — IQ.Dynamics side of "Blend IQ.Pilot + Stock ACC Radar" (VW PQ only).
+
+Decides the high-level intent for the stock ACC radar and writes it onto iqCarControl for the iqdbc
+PQRadarHandler to execute on CAN. It does NOT touch CAN or read radar feedback directly: the handler
+(car process) owns the bus and the failure latch, and the carcontroller gates radar-accel passthrough
+on the live ACS_Sta_ADR. That keeps the desync guard automatic — if chill is requested but the radar
+isn't active, the carcontroller simply uses the planner's VoACC accel (standard IQ long).
+
+Intent produced:
+ radarBlendActive feature enabled + PQ + alpha long available
+ radarEngageReq want the radar's cruise engaged (engage same time long control engages)
+ radarCancelReq cancel now (1 kph stop / driver brake / long disengaged / teardown)
+ useRadarAccel chill (acc) mode + engaged -> carcontroller passes radar ACS_Sollbeschl through
+ radarSetSpeedKph OP set speed to sync the radar's ACA_V_Wunsch toward
+ radarGapBars OP follow-distance bars to mirror to the radar
+"""
+from openpilot.common.constants import CV
+
+CANCEL_CEIL_MS = 1.0 * CV.KPH_TO_MS # cancel the radar at/below 1 kph (it can still see speed -> would fault)
+
+
+class RadarManager:
+ def __init__(self, CP, params):
+ self.CP = CP
+ self.params = params
+ self.is_pq = self._detect_pq(CP)
+ self.enabled_param = False
+
+ @staticmethod
+ def _detect_pq(CP) -> bool:
+ if getattr(CP, "brand", "") != "volkswagen":
+ return False
+ try:
+ from iqdbc.car.volkswagen.values import VolkswagenFlags
+ return bool(CP.flags & VolkswagenFlags.PQ)
+ except Exception:
+ return False
+
+ def read_params(self) -> None:
+ if self.is_pq:
+ self.enabled_param = self.params.get_bool("IQDynamicBlendStockRadar")
+
+ def update(self, CC_IQ, sm, set_speed_kph: float) -> None:
+ blend = bool(self.is_pq and self.enabled_param and self.CP.openpilotLongitudinalControl)
+ CC_IQ.radarBlendActive = blend
+ if not blend:
+ return
+
+ ss = sm['selfdriveState']
+ cs = sm['carState']
+ iq = sm['iqPlan'].iqDynamic
+
+ long_engaged = bool(ss.enabled) and self.CP.openpilotLongitudinalControl
+ iq_engaged = long_engaged and bool(iq.enabled)
+ chill = iq_engaged and bool(iq.active) and (iq.state == 'acc')
+ brake = bool(cs.brakePressed)
+ v_ego = float(cs.vEgo)
+
+ # Engage the radar whenever IQ.Dynamics long is engaged; cancel on stop/brake/teardown.
+ # The handler resolves priority (cancel wins) and applies the 1->2 kph engage hysteresis.
+ CC_IQ.radarEngageReq = iq_engaged and not brake
+ CC_IQ.radarCancelReq = (not iq_engaged) or brake or (v_ego <= CANCEL_CEIL_MS)
+ CC_IQ.useRadarAccel = chill
+ CC_IQ.radarSetSpeedKph = float(max(set_speed_kph, 0.0))
+ CC_IQ.radarGapBars = int(min(3, max(1, ss.personality.raw + 1)))
diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/tests/__init__.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_planner.py b/iqpilot/selfdrive/controls/lib/longitudinal_planner.py
new file mode 100644
index 000000000..b99068b3d
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/longitudinal_planner.py
@@ -0,0 +1,256 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from datetime import datetime
+
+import numpy as np
+
+from cereal import messaging, custom
+from iqdbc.car import structs
+from openpilot.common.constants import CV
+from openpilot.common.realtime import DT_MDL
+from openpilot.selfdrive.car.cruise import V_CRUISE_MAX
+from openpilot.iqpilot.selfdrive.controls.lib.custom_stop_distance import CustomStopDistance
+from openpilot.iqpilot.selfdrive.controls.lib.iq_dynamic.engine import IQDynamicController
+from openpilot.iqpilot.selfdrive.controls.lib.iq_dynamic.imahelper import IQConstants
+from openpilot.iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import EndToEndAlertEngine
+from openpilot.iqpilot.selfdrive.controls.lib.slc_vcruise import SLCVCruise
+from openpilot.iqpilot.selfdrive.controls.lib.speed_limit_controller import LIMIT_ADAPT_ACC
+from openpilot.iqpilot.selfdrive.selfdrived.events import IQEvents
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle
+
+IQDynamicState = custom.IQPlan.IQDynamicControl.IQDynamicControlState
+LongitudinalPlanSource = custom.IQPlan.LongitudinalPlanSource
+SpeedLimitAssistState = custom.IQPlan.SpeedLimit.AssistState
+SpeedLimitSource = custom.IQPlan.SpeedLimit.Source
+NavProvider = custom.IQNavState.LongitudinalProvider
+NavLongitudinalState = custom.IQNavState.LongitudinalState
+
+class LongitudinalPlannerIQ:
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams, mpc):
+ self.events_iq = IQEvents()
+ self.iq_dynamic = IQDynamicController(CP, mpc)
+ self.custom_stop_distance = CustomStopDistance()
+ self.slimit = SLCVCruise()
+ self.generation = int(model_bundle.generation) if (model_bundle := get_active_bundle()) else None
+ self.source = LongitudinalPlanSource.cruise
+ self.e2e_alerts = EndToEndAlertEngine()
+ self.output_v_target = 0.
+ self.output_a_target = 0.
+ self.speed_limit_last = 0.
+ self.speed_limit_final_last = 0.
+ self.speed_limit_source = SpeedLimitSource.none
+ self.nav_engaged = False
+ self.nav_provider = NavProvider.none
+ self.nav_state = NavLongitudinalState.disabled
+ self.nav_speed_target = 0.
+ self.nav_accel_target = 0.
+ self.nav_valid = False
+ self.force_stop_timer = 0.0
+ self.forcing_stop = False
+ self.override_force_stop = False
+ self.override_force_stop_timer = 0.0
+ self.tracked_model_length = 0.0
+
+ def is_e2e(self, sm: messaging.SubMaster) -> bool:
+ experimental_mode = sm['selfdriveState'].experimentalMode
+ if not self.iq_dynamic.active():
+ return experimental_mode
+
+ return experimental_mode and self.iq_dynamic.mode() == "blended"
+
+ def update_targets(self, sm: messaging.SubMaster, v_ego: float, a_ego: float, v_cruise: float) -> tuple[float, float]:
+ CS = sm['carState']
+ v_cruise_cluster_kph = min(CS.vCruiseCluster, V_CRUISE_MAX)
+ v_cruise_cluster = v_cruise_cluster_kph * CV.KPH_TO_MS
+ # SLC should apply whenever IQ.Pilot is engaged, even on stock-longitudinal cars
+ # where carControl.longActive stays false.
+ slc_apply_enabled = bool(getattr(sm['selfdriveState'], "enabled", False))
+
+ nav_state = sm['iqNavState']
+ self.nav_engaged = bool(getattr(nav_state, "longitudinalEngaged", False))
+ self.nav_provider = getattr(nav_state, "longitudinalProvider", NavProvider.none)
+ self.nav_state = getattr(nav_state, "longitudinalState", NavLongitudinalState.disabled)
+ self.nav_speed_target = float(getattr(nav_state, "speedTarget", 0.0))
+ self.nav_accel_target = float(getattr(nav_state, "accelTarget", 0.0))
+ self.nav_valid = bool(getattr(nav_state, "valid", False) and self.nav_engaged)
+
+ # IQ.Pilot custom Speed Limit Controller
+ now = datetime.now()
+ if hasattr(sm, "alive"):
+ time_validated = sm.alive.get('clocks', False) and getattr(sm['clocks'], 'timeValid', False)
+ else:
+ clocks = sm.get('clocks', None) if isinstance(sm, dict) else None
+ time_validated = bool(getattr(clocks, 'timeValid', False))
+ slc_v_cruise = self.slimit.update(slc_apply_enabled, now, time_validated, v_cruise, v_ego, sm)
+ self.iq_dynamic.set_slc_experimental_mode(self.slimit.slc_experimental_mode)
+ self.iq_dynamic.update(sm)
+ # Prefer confirmed controller output for UI/planner rendering.
+ # Fall back to active (policy-resolved) target/source when confirmed is unavailable.
+ display_speed_limit = self.slimit.slc_target if self.slimit.slc_target > 0 else self.slimit.slc_active_target
+ display_source = self.slimit.slc_source if self.slimit.slc_source != "None" else self.slimit.slc_active_source
+
+ if display_speed_limit > 0:
+ self.speed_limit_last = display_speed_limit
+ self.speed_limit_final_last = display_speed_limit + self.slimit.slc_offset
+ elif display_source == "None":
+ self.speed_limit_last = 0.0
+ self.speed_limit_final_last = 0.0
+ # Respect user-defined max cruise speed when applying SLC.
+ if v_cruise_cluster > 0 and self.speed_limit_final_last > 0:
+ self.speed_limit_final_last = min(self.speed_limit_final_last, v_cruise_cluster)
+ source_map = {
+ "Dashboard": SpeedLimitSource.car,
+ "Map Data": SpeedLimitSource.map,
+ "Mapbox": SpeedLimitSource.map,
+ "None": SpeedLimitSource.none,
+ }
+ self.speed_limit_source = source_map.get(display_source, SpeedLimitSource.none)
+
+ targets = {
+ LongitudinalPlanSource.cruise: (v_cruise, a_ego),
+ LongitudinalPlanSource.speedLimitAssist: (slc_v_cruise, a_ego),
+ }
+ if self.nav_valid:
+ targets[LongitudinalPlanSource.nav] = (self.nav_speed_target, self.nav_accel_target)
+
+ self.source = min(targets, key=lambda k: targets[k][0])
+ self.output_v_target, self.output_a_target = targets[self.source]
+ self.output_v_target = self._apply_force_stop(self.output_v_target, v_ego, sm, slc_apply_enabled)
+ # envelope shaping only in Assist mode: info/warn must never change the plan
+ self._envelope_enabled = (slc_apply_enabled and bool(getattr(self.slimit, "controller_enabled", False))
+ and bool(getattr(self.slimit, "mode_assist", False)))
+ return self.output_v_target, self.output_a_target
+
+ def cruise_envelope(self, v_target: float, v_ego: float, t_idxs) -> np.ndarray:
+ """Per-timestep cruise speed over the MPC horizon: the scalar target, shaped down
+ ahead of an upcoming lower speed limit so the solver decelerates before the sign
+ instead of at it."""
+ env = np.full(len(t_idxs), max(float(v_target), 0.0))
+ if not getattr(self, "_envelope_enabled", False):
+ return env
+ slc = getattr(self.slimit, "slc", None)
+ next_limit = float(getattr(slc, "next_speed_limit", 0.0) or 0.0)
+ next_dist = float(getattr(slc, "next_speed_distance", 0.0) or 0.0)
+ if next_limit <= 0.0 or next_dist <= 0.0:
+ return env
+ next_target = max(next_limit + float(getattr(self.slimit, "slc_offset", 0.0) or 0.0), 0.0)
+ if next_target >= env[0]:
+ return env
+ travel = np.maximum(v_ego, 1.0) * np.asarray(t_idxs)
+ v_allowed = np.sqrt(np.maximum(next_target ** 2 + 2.0 * abs(LIMIT_ADAPT_ACC) * (next_dist - travel), next_target ** 2))
+ return np.minimum(env, v_allowed)
+
+ def update(self, sm: messaging.SubMaster) -> None:
+ self.events_iq.clear()
+ for event_name in getattr(self.slimit, 'pending_events', []):
+ self.events_iq.add(event_name)
+ self.custom_stop_distance.update()
+ self.e2e_alerts.update(sm, self.events_iq)
+ if bool(getattr(sm["iqCarState"], "alcOverrideAlert", False)):
+ self.events_iq.add(custom.IQOnroadEvent.EventName.steeringOverrideReengageAlc)
+
+ def apply_e2e_stop_distance(self, sm: messaging.SubMaster, v_ego: float, a_target: float, should_stop: bool) -> tuple[float, bool]:
+ if not self.is_e2e(sm):
+ return a_target, should_stop
+ return self.custom_stop_distance.adjust_e2e_stop(a_target, should_stop, v_ego, sm['modelV2'])
+
+ def _apply_force_stop(self, v_target: float, v_ego: float, sm: messaging.SubMaster, apply_enabled: bool) -> float:
+ force_stop = self.iq_dynamic.force_stop_requested() and apply_enabled and self.override_force_stop_timer <= 0.0
+ self.force_stop_timer = self.force_stop_timer + DT_MDL if force_stop else 0.0
+ force_stop_enabled = self.force_stop_timer >= 1.0
+ force_stop_ramp_time = max(float(getattr(self.iq_dynamic, "model_stop_time", IQConstants.FORCE_STOP_PLANNER_TIME)), DT_MDL)
+
+ accel_pressed = bool(getattr(sm["iqCarState"], "accelPressed", False))
+ self.override_force_stop |= sm["carState"].gasPressed or accel_pressed
+ self.override_force_stop &= force_stop_enabled
+
+ if self.override_force_stop:
+ self.override_force_stop_timer = 10.0
+ elif self.override_force_stop_timer > 0.0:
+ self.override_force_stop_timer = max(0.0, self.override_force_stop_timer - DT_MDL)
+ else:
+ self.override_force_stop = False
+
+ if force_stop_enabled and not self.override_force_stop:
+ self.forcing_stop = True
+ self.tracked_model_length = max(self.tracked_model_length - (v_ego * DT_MDL), 0.0)
+ if sm["carState"].standstill:
+ return 0.0
+ return min(self.tracked_model_length / force_stop_ramp_time, v_target)
+
+ self.forcing_stop = False
+ self.tracked_model_length = max(
+ float(getattr(self.iq_dynamic, "model_length", 0.0)),
+ float(getattr(self.iq_dynamic, "minimum_force_stop_length", 0.0)),
+ 0.0,
+ )
+ return v_target
+
+ def publish_longitudinal_plan_iq(self, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None:
+ def fill_plan(plan_msg) -> None:
+ plan_msg.longitudinalPlanSource = self.source
+ plan_msg.vTarget = float(self.output_v_target)
+ plan_msg.aTarget = float(self.output_a_target)
+ plan_msg.events = self.events_iq.to_msg()
+
+ # IQ.Dynamic control state
+ iq_dynamic = plan_msg.iqDynamic
+ iq_dynamic.state = IQDynamicState.blended if self.iq_dynamic.mode() == 'blended' else IQDynamicState.acc
+ iq_dynamic.enabled = self.iq_dynamic.enabled()
+ iq_dynamic.active = self.iq_dynamic.active()
+
+ nav_summary = plan_msg.iqNavState.nav
+ nav_summary.engaged = self.nav_engaged
+ nav_summary.provider = self.nav_provider
+ nav_summary.state = self.nav_state
+ nav_summary.speedTarget = float(self.nav_speed_target)
+ nav_summary.accelTarget = float(self.nav_accel_target)
+ nav_summary.valid = self.nav_valid
+
+ # Speed Limit
+ speedLimit = plan_msg.speedLimit
+ resolver = speedLimit.resolver
+ speed_limit = float(self.slimit.slc_target if self.slimit.slc_target > 0 else self.slimit.slc_active_target)
+ speed_limit_offset = float(self.slimit.slc_offset)
+ speed_limit_final = speed_limit + speed_limit_offset if speed_limit > 0 else 0.
+ speed_limit_valid = speed_limit > 0.
+ speed_limit_last_valid = self.speed_limit_last > 0.
+
+ resolver.speedLimit = speed_limit
+ resolver.speedLimitLast = float(self.speed_limit_last)
+ resolver.speedLimitFinal = float(speed_limit_final)
+ resolver.speedLimitFinalLast = float(self.speed_limit_final_last)
+ resolver.speedLimitValid = speed_limit_valid
+ resolver.speedLimitLastValid = speed_limit_last_valid
+ resolver.speedLimitOffset = speed_limit_offset
+ resolver.distToSpeedLimit = 0.
+ resolver.source = self.speed_limit_source
+
+ assist = speedLimit.assist
+ slc_assist_state = self.slimit.assist_state
+ assist.enabled = bool(self.slimit.slc_target > 0 or self.slimit.slc_unconfirmed > 0)
+ assist.active = self.source == LongitudinalPlanSource.speedLimitAssist and self.slimit.slc_target > 0
+ if slc_assist_state is not None:
+ assist.state = slc_assist_state
+ elif not assist.enabled:
+ assist.state = SpeedLimitAssistState.disabled
+ elif self.slimit.slc_unconfirmed > 0:
+ assist.state = SpeedLimitAssistState.preActive
+ elif assist.active:
+ assist.state = SpeedLimitAssistState.active
+ else:
+ assist.state = SpeedLimitAssistState.inactive
+ assist.vTarget = float(self.output_v_target if assist.active else 255.)
+ assist.aTarget = float(self.slimit.slc_a_target if assist.active else 0.)
+
+ e2eAlerts = plan_msg.e2eAlerts
+ e2eAlerts.pathOpen = self.e2e_alerts.path_alert
+ e2eAlerts.leadPullaway = self.e2e_alerts.lead_alert
+
+ valid = sm.all_checks(service_list=['carState', 'controlsState'])
+
+ plan_iq_send = messaging.new_message('iqPlan')
+ plan_iq_send.valid = valid
+ fill_plan(plan_iq_send.iqPlan)
+ pm.send('iqPlan', plan_iq_send)
diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/__init__.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/__init__.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_locator.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_locator.py
new file mode 100644
index 000000000..043d8b420
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_locator.py
@@ -0,0 +1,85 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Candidate-ladder selection checks for get_nn_model_path, driven by a synthetic
+model directory so the assertions don't depend on which cars ship a model.
+"""
+import json
+import os
+
+import pytest
+
+from iqdbc.car import structs
+import openpilot.selfdrive.controls.lib.latcontrol_torque as locator
+
+
+@pytest.fixture
+def model_dir(tmp_path, monkeypatch):
+ """A fake model directory with known fingerprints + a substitute table."""
+ models = tmp_path / "models"
+ models.mkdir()
+ for stem in ("HONDA_CIVIC", "HONDA_CIVIC 12345", "TOYOTA_RAV4_TSS2", "MOCK"):
+ (models / f"{stem}.json").write_text("{}")
+
+ sub = tmp_path / "substitute.toml"
+ sub.write_text('"CHEVROLET_XX" = "TOYOTA_RAV4_TSS2"\n')
+
+ monkeypatch.setattr(locator, "TORQUE_NN_MODEL_PATH", str(models))
+ monkeypatch.setattr(locator, "TORQUE_NN_MODEL_SUBSTITUTE_PATH", str(sub))
+ monkeypatch.setattr(locator, "MOCK_MODEL_PATH", str(models / "MOCK.json"))
+ return models
+
+
+def make_cp(fingerprint, eps_fw=b"", angle=False):
+ cp = structs.CarParams()
+ cp.carFingerprint = fingerprint
+ if eps_fw:
+ fw = structs.CarParams.CarFw()
+ fw.ecu = "eps"
+ fw.fwVersion = eps_fw
+ cp.carFw = [fw]
+ if angle:
+ cp.steerControlType = structs.CarParams.SteerControlType.angle
+ return cp
+
+
+def test_exact_fingerprint_match(model_dir):
+ path, name, exact = locator.get_nn_model_path(make_cp("TOYOTA_RAV4_TSS2"))
+ assert name == "TOYOTA_RAV4_TSS2"
+ assert exact is True
+
+
+def test_fingerprint_plus_eps_fw_prefers_specific_file(model_dir):
+ # eps fw steers selection toward the fw-specific file. Note the resolved match
+ # is fuzzy, not exact: fwVersion is bytes and the candidate stringifies it as
+ # b'12345', so it never scores a perfect 1.0 against the "... 12345" filename.
+ path, name, exact = locator.get_nn_model_path(make_cp("HONDA_CIVIC", eps_fw=b"12345"))
+ assert name == "HONDA_CIVIC 12345"
+ assert exact is False
+
+
+def test_fuzzy_match_flags_non_exact(model_dir):
+ # close but not identical to a shipped fingerprint
+ path, name, exact = locator.get_nn_model_path(make_cp("TOYOTA_RAV4_TSS2_XYZ"))
+ assert name == "TOYOTA_RAV4_TSS2"
+ assert exact is False
+
+
+def test_substitute_fallback(model_dir):
+ # unknown fingerprint that the substitute table redirects
+ path, name, exact = locator.get_nn_model_path(make_cp("CHEVROLET_XX"))
+ assert name == "TOYOTA_RAV4_TSS2"
+ assert exact is False
+
+
+def test_angle_steer_is_always_mock(model_dir):
+ path, name, exact = locator.get_nn_model_path(make_cp("TOYOTA_RAV4_TSS2", angle=True))
+ assert name == "MOCK"
+ assert path == locator.MOCK_MODEL_PATH
+ assert exact is False
+
+
+def test_short_eps_fw_ignored(model_dir):
+ # a 3-char-or-less fw string is not used to build the candidate
+ path, name, _ = locator.get_nn_model_path(make_cp("HONDA_CIVIC", eps_fw=b"ab"))
+ assert name == "HONDA_CIVIC"
diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_network.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_network.py
new file mode 100644
index 000000000..06704488f
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_network.py
@@ -0,0 +1,97 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Unit checks for the NNFF model loader against the shipped model files.
+"""
+import json
+import os
+
+import numpy as np
+import pytest
+
+from openpilot.selfdrive.controls.lib.latcontrol_torque import NNTorqueModel
+from openpilot.selfdrive.controls.lib.latcontrol_torque import TORQUE_NN_MODEL_PATH
+
+# A minimal valid NNFF model (Twilsonco format: column-vector mean/std, dense_N_W/b
+# layers). Used as a fallback so the loader logic is still exercised when no trained
+# models are shipped (they are removed pending retraining and re-added over time).
+_SYNTHETIC_MODEL = {
+ "input_size": 4,
+ "output_size": 1,
+ "input_mean": [[0.0], [0.0], [0.0], [0.0]],
+ "input_std": [[1.0], [1.0], [1.0], [1.0]],
+ "layers": [
+ {"dense_1_W": [[0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5]], "dense_1_b": [[0.0], [0.0]], "activation": "sigmoid"},
+ {"dense_2_W": [[2.0, 2.0]], "dense_2_b": [[-1.0]], "activation": "identity"},
+ ],
+}
+
+MODEL_FILES = sorted(f for f in os.listdir(TORQUE_NN_MODEL_PATH) if f.endswith(".json"))
+if MODEL_FILES:
+ _MODEL_DIR = TORQUE_NN_MODEL_PATH
+ _NAMES = MODEL_FILES
+else:
+ import tempfile
+ _MODEL_DIR = tempfile.mkdtemp(prefix="nnff_synthetic_")
+ with open(os.path.join(_MODEL_DIR, "SYNTHETIC.json"), "w") as _f:
+ json.dump(_SYNTHETIC_MODEL, _f)
+ _NAMES = ["SYNTHETIC.json"]
+
+SAMPLE = [f for f in ("HYUNDAI_IONIQ_5.json", "TOYOTA_RAV4_TSS2_2022.json", "MOCK.json") if f in _NAMES] \
+ or _NAMES[:3]
+
+
+def _path(name):
+ return os.path.join(_MODEL_DIR, name)
+
+
+@pytest.mark.parametrize("name", _NAMES, ids=[n[:-5] for n in _NAMES])
+def test_every_model_loads_and_is_finite(name):
+ m = NNTorqueModel(_path(name))
+ assert m.input_size >= 2
+ assert m.output_size >= 1
+ assert m.input_mean.shape == m.input_std.shape
+ out = m.evaluate([0.0] * m.input_size)
+ assert np.isfinite(out)
+ assert isinstance(m.friction_override, (bool, np.bool_))
+
+
+@pytest.mark.parametrize("name", SAMPLE, ids=[n[:-5] for n in SAMPLE])
+class TestModelBehavior:
+ def test_short_input_is_zero_padded(self, name):
+ m = NNTorqueModel(_path(name))
+ padded = m.evaluate([5.0, 1.0])
+ explicit = m.evaluate([5.0, 1.0] + [0.0] * (m.input_size - 2))
+ assert padded == explicit
+
+ def test_too_short_input_raises(self, name):
+ m = NNTorqueModel(_path(name))
+ with pytest.raises(ValueError):
+ m.evaluate([1.0])
+
+ def test_zero_bias_matches_manual_bias_removal(self, name):
+ m = NNTorqueModel(_path(name))
+ mz = NNTorqueModel(_path(name), zero_bias=True)
+ assert all(np.allclose(b, 0.0) for b in mz._biases)
+ # weights and activations are unchanged
+ assert len(mz._weights) == len(m._weights)
+
+ def test_deterministic(self, name):
+ m = NNTorqueModel(_path(name))
+ vec = [float(v) for v in np.linspace(-1.5, 1.5, m.input_size)]
+ assert m.evaluate(vec) == m.evaluate(list(vec))
+
+
+def test_activation_registry_rejects_unknown(tmp_path):
+ base = json.load(open(_path(SAMPLE[0])))
+ base["layers"][-1]["activation"] = "not_a_real_activation"
+ bad = tmp_path / "bad.json"
+ bad.write_text(json.dumps(base))
+ with pytest.raises(ValueError):
+ NNTorqueModel(str(bad))
+
+
+def test_sigmoid_identity_helpers():
+ assert NNTorqueModel.identity(3.5) == 3.5
+ assert 0.0 < float(NNTorqueModel.sigmoid(np.array([0.0]))[0]) < 1.0
+ assert abs(float(NNTorqueModel.sigmoid(np.array([0.0]))[0]) - 0.5) < 1e-6
diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_nnff_assembly.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_nnff_assembly.py
new file mode 100644
index 000000000..5c172f0b7
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_nnff_assembly.py
@@ -0,0 +1,106 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Off-device checks for the NNFF controller wiring and the nav torque pulse,
+built on lightweight fakes so they run without a car interface.
+"""
+import os
+from types import SimpleNamespace
+
+import numpy as np
+import pytest
+
+from cereal import log
+from openpilot.common.params import Params
+from openpilot.common.pid import PIDController
+from openpilot.selfdrive.modeld.constants import ModelConstants
+from openpilot.selfdrive.controls.lib.latcontrol_torque import NeuralNetworkFeedForward
+from openpilot.selfdrive.controls.lib.latcontrol_torque import TORQUE_NN_MODEL_PATH
+
+_REAL_MODEL = next((f for f in sorted(os.listdir(TORQUE_NN_MODEL_PATH))
+ if f.endswith(".json") and f != "MOCK.json"), None)
+
+# Models are shipped separately and re-added as retrained; with none present,
+# NNFF is a no-op (falls back to stock torque FF), so the assembly tests skip.
+pytestmark = pytest.mark.skipif(_REAL_MODEL is None,
+ reason="no NNFF models present (nuked pending retraining)")
+
+
+def _torque_fn():
+ def fn(inputs, tp, gravity_adjusted=False):
+ base = inputs.lateral_acceleration - (inputs.roll_compensation if gravity_adjusted else 0.0)
+ return base * 0.4
+ return fn
+
+
+class FakeCI:
+ def torque_from_lateral_accel_in_torque_space(self):
+ return _torque_fn()
+
+
+class FakeVM:
+ @staticmethod
+ def calc_curvature(angle, v, roll):
+ return angle / (max(v, 1.0) ** 2 * 0.05 + 2.0)
+
+
+def _model_v2():
+ t = np.array(ModelConstants.T_IDXS)
+ return SimpleNamespace(
+ orientation=SimpleNamespace(x=(0.02 * np.sin(t)).tolist(), y=(0.01 * np.cos(t)).tolist()),
+ acceleration=SimpleNamespace(y=(0.8 * np.sin(2.0 * t)).tolist()))
+
+
+def _make_controller(model_file):
+ Params().put_bool("NeuralNetworkFeedForward", True)
+ path = os.path.join(TORQUE_NN_MODEL_PATH, model_file)
+ cp = SimpleNamespace(steerActuatorDelay=0.15)
+ cp_iq = SimpleNamespace(iqLateralNet=SimpleNamespace(
+ model=SimpleNamespace(path=path, name=os.path.splitext(model_file)[0])))
+ lac = SimpleNamespace(steer_max=1.0, torque_params=SimpleNamespace(
+ latAccelFactor=2.5, latAccelOffset=0.0, friction=0.1, steeringAngleDeadzoneDeg=0.0))
+ return NeuralNetworkFeedForward(lac, cp, cp_iq, FakeCI())
+
+
+def _drive_once(nnff, step=1, pressed=False):
+ nnff.update_model_v2(_model_v2())
+ v = 20.0
+ dla = 1.0
+ cs = SimpleNamespace(vEgo=v, aEgo=0.2, steeringPressed=pressed, steeringRateDeg=1.0)
+ cal = SimpleNamespace(roll=0.02)
+ pose = SimpleNamespace(orientation=SimpleNamespace(pitch=0.01))
+ pid = PIDController([[1, 30], [10.0, 0.8]], 0.15, rate=100)
+ pid.set_limits(1.0, -1.0)
+ pt = log.ControlsState.LateralTorqueState.new_message()
+ return nnff.update(cs, FakeVM(), pid, cal, dla, pt, dla, 0.8 * dla, pose, 0.02 * 9.81,
+ dla, 0.8 * dla, 0.01, dla - 0.02 * 9.81, dla / v ** 2, 0.8 * dla / v ** 2, False, 0.3)
+
+
+class TestControllerWiring:
+ def test_real_model_reports_present(self):
+ nnff = _make_controller(_REAL_MODEL)
+ assert nnff.has_nn_model is True
+
+ def test_mock_model_reports_absent(self):
+ nnff = _make_controller("MOCK.json")
+ assert nnff.has_nn_model is False
+ assert nnff.model.input_size >= 2 # MOCK still loads as a valid net
+
+ def test_update_returns_finite_torque(self):
+ nnff = _make_controller(_REAL_MODEL)
+ pid_log, torque = _drive_once(nnff)
+ assert np.isfinite(torque)
+ assert np.isfinite(pid_log.error)
+
+ def test_lag_update_refreshes_future_times(self):
+ nnff = _make_controller(_REAL_MODEL)
+ before = list(nnff.nn_future_times)
+ nnff.update_lateral_lag(0.5)
+ after = list(nnff.nn_future_times)
+ assert after != before
+ assert all(a == pytest.approx(f + nnff.desired_lat_jerk_time) for a, f in zip(after, nnff.future_times, strict=True))
+
+ def test_disabled_when_model_invalid(self):
+ nnff = _make_controller(_REAL_MODEL)
+ nnff.model_valid = False
+ assert nnff._nnff_enabled is False
diff --git a/iqpilot/selfdrive/controls/lib/slc_vcruise.py b/iqpilot/selfdrive/controls/lib/slc_vcruise.py
new file mode 100644
index 000000000..da2bb08a6
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/slc_vcruise.py
@@ -0,0 +1,251 @@
+#!/usr/bin/env python3
+import time
+
+from openpilot.common.constants import CV
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.common.k3_slc_log import k3_slc_log
+from openpilot.iqpilot.selfdrive.controls.lib.speed_limit_controller import SpeedLimitController
+
+CRUISING_SPEED = 7
+
+
+class SLCVCruise:
+
+ def __init__(self):
+ self.params = Params()
+
+ self.slc = SpeedLimitController(self.params)
+ self._last_debug_log_t = 0.0
+ self._last_debug_signature = None
+
+ # Exposed SLC state (for UI/logging)
+ self.controller_enabled = False
+ self.mode_assist = False
+ self.slc_offset = 0
+ self.slc_target = 0
+ self.slc_source = "None"
+ self.slc_unconfirmed = 0
+ self.slc_overridden_speed = 0
+ self.slc_active_target = 0
+ self.slc_active_source = "None"
+ self._user_max_speed = 0.0
+ self.slc_experimental_mode = False
+ self.pending_events = []
+
+ @property
+ def assist_state(self):
+ return getattr(self.slc, 'assist_state', None)
+
+ @property
+ def slc_a_target(self):
+ return float(getattr(self.slc, 'output_a_target', 0.0))
+
+ def _maybe_log_debug(self, slc_params, apply_enabled, v_cruise, v_ego, dashboard_speed_limit, applied_target, returned_v_cruise):
+ map_speed_limit = float(getattr(self.slc, "map_speed_limit", 0.0) or 0.0)
+ mapbox_limit = float(getattr(self.slc, "mapbox_limit", 0.0) or 0.0)
+ next_speed_limit = float(getattr(self.slc, "next_speed_limit", 0.0) or 0.0)
+ gps_valid = bool(getattr(self.slc, "gps_valid", False))
+ signature = (
+ bool(slc_params["speed_limit_controller"]),
+ bool(slc_params["show_speed_limits"]),
+ self.slc.target,
+ self.slc.source,
+ self.slc.active_target,
+ self.slc.active_source,
+ map_speed_limit,
+ mapbox_limit,
+ next_speed_limit,
+ self.slc.overridden_speed,
+ bool(apply_enabled),
+ float(applied_target),
+ float(returned_v_cruise),
+ )
+ now_mono = time.monotonic()
+ if signature == self._last_debug_signature and now_mono - self._last_debug_log_t < 5.0:
+ return
+
+ self._last_debug_signature = signature
+ self._last_debug_log_t = now_mono
+
+ message = (
+ "SLC debug: "
+ f"mode={int(self.params.get('IQSpeedAssistMode', return_default=True))} "
+ f"controller={slc_params['speed_limit_controller']} "
+ f"show={slc_params['show_speed_limits']} "
+ f"apply_enabled={bool(apply_enabled)} "
+ f"dashboard={round(float(dashboard_speed_limit), 2)} "
+ f"map_data={round(map_speed_limit, 2)} "
+ f"mapbox={round(mapbox_limit, 2)} "
+ f"next_map={round(next_speed_limit, 2)} "
+ f"selected_source={self.slc.source} "
+ f"selected_target={round(float(self.slc.target), 2)} "
+ f"active_source={self.slc.active_source} "
+ f"active_target={round(float(self.slc.active_target), 2)} "
+ f"offset={round(float(self.slc_offset), 2)} "
+ f"override={round(float(self.slc.overridden_speed), 2)} "
+ f"gps_valid={gps_valid} "
+ f"applied_target={round(float(applied_target), 2)} "
+ f"returned_v_cruise={round(float(returned_v_cruise), 2)} "
+ f"v_cruise={round(float(v_cruise), 2)} "
+ f"v_ego={round(float(v_ego), 2)}"
+ )
+ cloudlog.info(message)
+ k3_slc_log(message)
+
+ def _get_slc_params(self):
+ """
+ Load SLC parameters from Params.
+
+ Returns:
+ Dictionary of SLC configuration parameters
+ """
+ def get_param_bool(key, default=False):
+ value = self.params.get_bool(key)
+ return value if value is not None else default
+
+ def get_param_float(key, default=0.0):
+ value = self.params.get(key)
+ if value is None:
+ return default
+ if isinstance(value, bytes):
+ try:
+ return float(value.decode('utf-8'))
+ except (ValueError, AttributeError):
+ return default
+ return float(value)
+
+ def get_param_str(key, default=""):
+ value = self.params.get(key)
+ if value is None:
+ return default
+ if isinstance(value, bytes):
+ return value.decode('utf-8')
+ return str(value)
+
+ slc_policy = int(get_param_str("SLCPolicy", "1"))
+
+ override_method = int(get_param_str("SLCOverrideMethod", "0"))
+ override_manual = (override_method == 0)
+ override_set_speed = (override_method == 1)
+
+ speed_limit_mode = int(get_param_str("IQSpeedAssistMode", "1")) # default: SpeedLimitMode.information
+ speed_limit_controller = get_param_bool("SpeedLimitController")
+ show_speed_limits = get_param_bool("ShowSpeedLimits")
+
+ if speed_limit_mode == 0: # SpeedLimitMode.off
+ speed_limit_controller = False
+ show_speed_limits = False
+ elif speed_limit_mode == 3: # SpeedLimitMode.control
+ speed_limit_controller = True
+ show_speed_limits = False
+ else:
+ speed_limit_controller = False
+ show_speed_limits = True
+
+ return {
+ "speed_limit_controller": speed_limit_controller,
+ "speed_limit_mode": speed_limit_mode,
+ "show_speed_limits": show_speed_limits,
+ "slc_policy": slc_policy,
+ "slc_auto_confirm": get_param_bool("SLCAutoConfirm"),
+ "speed_limit_confirmation_higher": get_param_bool("SpeedLimitConfirmationHigher"),
+ "speed_limit_confirmation_lower": get_param_bool("SpeedLimitConfirmationLower"),
+ "map_speed_lookahead_higher": get_param_float("MapSpeedLookaheadHigher", 5.0),
+ "map_speed_lookahead_lower": get_param_float("MapSpeedLookaheadLower", 5.0),
+ "slc_fallback_experimental_mode": get_param_bool("SLCFallbackExperimentalMode"),
+ "slc_fallback_set_speed": get_param_bool("SLCFallbackSetSpeed"),
+ "slc_fallback_previous_speed_limit": get_param_bool("SLCFallbackPreviousSpeedLimit"),
+ "speed_limit_controller_override_manual": override_manual,
+ "speed_limit_controller_override_set_speed": override_set_speed,
+ "slc_online_filler": get_param_bool("SLCOnlineFiller"),
+ "is_metric": get_param_bool("IsMetric"),
+ "construction_zone_assist": get_param_bool("ConstructionZoneAssist"),
+ "construction_zone_speed": get_param_float("ConstructionZoneSpeed", 60.0),
+ }
+
+ @staticmethod
+ def _allow_auto_raise(slc_params):
+ # Reuse the existing "confirm higher" toggle as the gate:
+ # disabled confirm => allow SLC to raise cruise to a higher accepted limit.
+ return not slc_params["speed_limit_confirmation_higher"]
+
+ def update(self, apply_enabled, now, time_validated, v_cruise, v_ego, sm):
+ slc_params = self._get_slc_params()
+ self.controller_enabled = bool(slc_params["speed_limit_controller"])
+ self.mode_assist = int(slc_params["speed_limit_mode"]) == 3 # SpeedLimitMode.control
+ is_metric = slc_params["is_metric"]
+ v_cruise_cluster = max(sm["carState"].vCruiseCluster * CV.KPH_TO_MS, v_cruise)
+ v_cruise_diff = v_cruise_cluster - v_cruise
+
+ v_ego_cluster = max(sm["carState"].vEgoCluster, v_ego)
+ v_ego_diff = v_ego_cluster - v_ego
+ car_state_iq = sm["iqCarState"]
+ dashboard_speed_limit = car_state_iq.speedLimit if hasattr(car_state_iq, "speedLimit") else 0
+ if apply_enabled:
+ if self._user_max_speed <= 0.0:
+ self._user_max_speed = v_cruise_cluster
+ elif v_cruise_cluster > self._user_max_speed:
+ self._user_max_speed = v_cruise_cluster
+ else:
+ self._user_max_speed = 0.0
+ if slc_params["speed_limit_controller"]:
+ self.slc.update_limits(dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm, slc_params)
+ self.pending_events = list(getattr(self.slc, 'pending_events', []))
+ self.slc.update_override(v_cruise, v_cruise_diff, v_ego, v_ego_diff, sm, slc_params, is_metric)
+
+ self.slc_offset = 0 if self.slc.source == "Construction" else self.slc.get_offset(is_metric)
+ self.slc_target = self.slc.target
+ self.slc_source = self.slc.source
+ self.slc_active_target = self.slc.active_target
+ self.slc_active_source = self.slc.active_source
+ self.slc_unconfirmed = self.slc.unconfirmed_speed_limit
+ self.slc_overridden_speed = self.slc.overridden_speed
+
+ elif slc_params["show_speed_limits"]:
+ self.slc.update_limits(dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm, slc_params)
+ self.pending_events = []
+
+ self.slc_offset = 0
+ self.slc_target = self.slc.target
+ self.slc_source = self.slc.source
+ self.slc_active_target = self.slc.active_target
+ self.slc_active_source = self.slc.active_source
+ self.slc_unconfirmed = self.slc.unconfirmed_speed_limit
+ self.slc_overridden_speed = 0
+
+ else:
+ self.pending_events = []
+ self.slc_offset = 0
+ self.slc_target = 0
+ self.slc_source = "None"
+ self.slc_active_target = 0
+ self.slc_active_source = "None"
+ self.slc_unconfirmed = 0
+ self.slc_overridden_speed = 0
+
+ self.slc_experimental_mode = bool(
+ slc_params["speed_limit_controller"] and
+ slc_params["slc_fallback_experimental_mode"] and
+ self.slc_target <= 0
+ )
+
+ applied_target = 0.0
+
+ if slc_params["speed_limit_controller"] and apply_enabled:
+ slc_target_with_offset = max(self.slc_overridden_speed, self.slc_target + self.slc_offset)
+ allow_auto_raise = self._allow_auto_raise(slc_params)
+ if self._user_max_speed > 0.0 and not allow_auto_raise:
+ slc_target_with_offset = min(slc_target_with_offset, self._user_max_speed)
+ slc_cruise_target = slc_target_with_offset - v_ego_diff
+
+ if slc_cruise_target >= CRUISING_SPEED:
+ applied_target = slc_cruise_target
+ if allow_auto_raise and self.slc_source != "Construction":
+ v_cruise = slc_cruise_target
+ else:
+ v_cruise = min(v_cruise, slc_cruise_target)
+
+ self._maybe_log_debug(slc_params, apply_enabled, v_cruise, v_ego, dashboard_speed_limit, applied_target, v_cruise)
+
+ return v_cruise
diff --git a/iqpilot/selfdrive/controls/lib/smooth_stops.py b/iqpilot/selfdrive/controls/lib/smooth_stops.py
new file mode 100644
index 000000000..c6854f378
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/smooth_stops.py
@@ -0,0 +1,73 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Original concept and implementation by SpysyWeeb (github.com/SpysyWeeb)
+"""
+from iqdbc.car.interfaces import ACCEL_MIN
+from openpilot.common.params import Params
+from openpilot.common.realtime import DT_CTRL
+
+STANDSTILL_SPEED = 0.05
+STANDSTILL_HOLD_SPEED = 0.15
+SETTLE_DECEL = 0.80
+TAPER_SPEED = 1.0
+STOP_KISS_DECEL = 0.25
+STOP_GAP_MARGIN = 3.0
+MIN_GAP_BUDGET = 0.5
+PROGRESS_EPS = 0.02
+ANTI_CREEP_RATE = 0.50
+SETTLE_JERK = 2.5
+EMERGENCY_DECEL = 3.0
+
+
+def read_smooth_stops_enabled(params: Params) -> bool:
+ return params.get_bool("IQForceStops")
+
+
+class SmoothStopController:
+ def __init__(self):
+ self.params = Params()
+ self.frame = 0
+ self.enabled = False
+ self._v_min = float("inf")
+ self._stall_s = 0.0
+ self.read_params()
+
+ def read_params(self) -> None:
+ self.enabled = read_smooth_stops_enabled(self.params)
+
+ def update(self) -> None:
+ if self.frame % int(3 / DT_CTRL) == 0:
+ self.read_params()
+ self.frame += 1
+
+ def reset(self) -> None:
+ self._v_min = float("inf")
+ self._stall_s = 0.0
+
+ def want_hold(self, should_stop: bool, v_ego: float, standstill: bool) -> bool:
+ return bool(should_stop and (v_ego <= STANDSTILL_SPEED or (standstill and v_ego <= STANDSTILL_HOLD_SPEED)))
+
+ def settle(self, a_target: float, v_ego: float, lead_distance: float, has_lead: bool, last_output: float) -> float:
+ landing = STOP_KISS_DECEL + (SETTLE_DECEL - STOP_KISS_DECEL) * min(v_ego / TAPER_SPEED, 1.0)
+ a_settle = -landing
+
+ if has_lead and lead_distance > 0.0:
+ gap = max(lead_distance - STOP_GAP_MARGIN, MIN_GAP_BUDGET)
+ a_settle = min(a_settle, -(v_ego * v_ego) / (2.0 * gap))
+
+ if v_ego < self._v_min - PROGRESS_EPS:
+ self._v_min = v_ego
+ self._stall_s = 0.0
+ else:
+ self._stall_s += DT_CTRL
+ a_settle -= ANTI_CREEP_RATE * self._stall_s
+
+ a_settle = max(a_settle, ACCEL_MIN)
+ target = min(a_settle, a_target)
+
+ if target <= -EMERGENCY_DECEL:
+ return target
+
+ step = SETTLE_JERK * DT_CTRL
+ return min(max(target, last_output - step), last_output + step)
diff --git a/iqpilot/selfdrive/controls/lib/speed_limit_controller.py b/iqpilot/selfdrive/controls/lib/speed_limit_controller.py
new file mode 100644
index 000000000..c5eed26e7
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/speed_limit_controller.py
@@ -0,0 +1,825 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+import calendar
+import json
+import math
+import time
+from concurrent.futures import ThreadPoolExecutor
+
+import numpy as np
+
+from cereal import car, custom
+from openpilot.common.constants import CV
+from openpilot.common.realtime import DT_MDL
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.common.k3_slc_log import k3_slc_log
+from openpilot.iqpilot.common.slc_utilities import calculate_bearing_offset, is_url_pingable
+from openpilot.iqpilot.common.slc_variables import FREE_MAPBOX_REQUESTS, OFFSET_MAP_IMPERIAL, OFFSET_MAP_METRIC, OFFSET_PERCENT_MAX
+
+try:
+ import requests
+except ImportError:
+ requests = None
+
+ButtonType = car.CarState.ButtonEvent.Type
+SpeedLimitAssistState = custom.IQPlan.SpeedLimit.AssistState
+EventNameIQ = custom.IQOnroadEvent.EventName
+
+LIMIT_MIN_ACC = -1.5
+LIMIT_MAX_ACC = 1.0
+LIMIT_MIN_SPEED = 8.33
+LIMIT_SPEED_OFFSET_TH = -1.0
+LIMIT_ADAPT_ACC = -1.0
+CONTROL_HORIZON = 10.0
+
+AUTO_CONFIRM_PERIOD = 5.0
+AUTO_DENY_PERIOD = 30.0
+
+POLICY_MAP_DATA_ONLY = 0
+POLICY_MAP_DATA_PRIORITY = 1
+POLICY_COMBINED = 2
+
+CONFIRM_LOWER_BUTTONS = frozenset({ButtonType.decelCruise, ButtonType.setCruise})
+CONFIRM_HIGHER_BUTTONS = frozenset({ButtonType.accelCruise, ButtonType.resumeCruise})
+
+
+class IQSpeedLimitResolver:
+ def __init__(self):
+ self.map_speed_limit = 0.0
+ self.next_speed_limit = 0.0
+ self.next_speed_distance = 0.0
+
+ @staticmethod
+ def _is_alive(sm, key):
+ if hasattr(sm, "alive"):
+ return bool(sm.alive.get(key, False))
+ return False
+
+ def update_map_data(self, v_ego, sm, lookahead_lower, lookahead_higher):
+ if not self._is_alive(sm, "iqLiveData"):
+ self.map_speed_limit = 0.0
+ self.next_speed_limit = 0.0
+ self.next_speed_distance = 0.0
+ return
+
+ map_data = sm["iqLiveData"]
+ current_limit = float(getattr(map_data, "speedLimit", 0)) if getattr(map_data, "speedLimitValid", False) else 0.0
+ ahead_limit = float(getattr(map_data, "speedLimitAhead", 0)) if getattr(map_data, "speedLimitAheadValid", False) else 0.0
+ ahead_distance = float(getattr(map_data, "speedLimitAheadDistance", 0))
+
+ self.next_speed_limit = ahead_limit
+ self.next_speed_distance = ahead_distance
+
+ if ahead_limit > 0 and ahead_distance > 0:
+ if ahead_limit < v_ego:
+ adapt_time = (ahead_limit - v_ego) / LIMIT_ADAPT_ACC # positive (LIMIT_ADAPT_ACC negative)
+ adapt_distance = v_ego * adapt_time + 0.5 * LIMIT_ADAPT_ACC * adapt_time**2
+ comfort_distance = lookahead_lower * v_ego
+ if ahead_distance <= max(adapt_distance, comfort_distance):
+ self.map_speed_limit = ahead_limit
+ return
+ elif ahead_limit > current_limit:
+ if ahead_distance <= lookahead_higher * v_ego:
+ self.map_speed_limit = ahead_limit
+ return
+
+ self.map_speed_limit = current_limit
+
+ def resolve(self, dashboard_limit, mapbox_limit, slc_params):
+ policy = slc_params.get("slc_policy", POLICY_MAP_DATA_PRIORITY)
+
+ sources = {}
+ if dashboard_limit >= LIMIT_MIN_SPEED:
+ sources["Dashboard"] = dashboard_limit
+ if mapbox_limit >= LIMIT_MIN_SPEED:
+ sources["Mapbox"] = mapbox_limit
+ if self.map_speed_limit >= LIMIT_MIN_SPEED:
+ sources["Map Data"] = self.map_speed_limit
+
+ if policy == POLICY_MAP_DATA_ONLY:
+ if "Map Data" in sources:
+ return sources["Map Data"], "Map Data"
+ return 0.0, "None"
+
+ if policy == POLICY_MAP_DATA_PRIORITY:
+ for src in ("Map Data", "Dashboard", "Mapbox"):
+ if src in sources:
+ return sources[src], src
+ return 0.0, "None"
+
+ if policy == POLICY_COMBINED:
+ if sources:
+ src = min(sources, key=sources.get)
+ return sources[src], src
+ return 0.0, "None"
+
+ return 0.0, "None"
+
+
+class IQSpeedLimitAssist:
+ def __init__(self, params):
+ self._params = params
+ self._state = SpeedLimitAssistState.inactive
+ self._prev_state = SpeedLimitAssistState.inactive
+
+ self.target = 0.0
+ self.source = "None"
+
+ self.unconfirmed_limit = 0.0
+ self.unconfirmed_source = "None"
+
+ self.previous_target = 0.0
+ self.previous_source = "None"
+ self.denied_target = 0.0
+
+ self._pre_active_timer = 0.0
+
+ self.pending_events = []
+
+ self.output_a_target = 0.0
+
+ self.just_confirmed = False
+
+ @property
+ def state(self):
+ return self._state
+
+ def update(self, enabled, v_ego, resolved_limit, resolved_source, slc_params, sm):
+ self.pending_events = []
+ self.just_confirmed = False
+ self._prev_state = self._state
+
+ if not enabled:
+ if self._state != SpeedLimitAssistState.disabled:
+ self._state = SpeedLimitAssistState.disabled
+ self._reset_confirmed()
+ self._reset_unconfirmed()
+ self.output_a_target = 0.0
+ self._fire_transition_events()
+ return
+
+ if self._state == SpeedLimitAssistState.disabled:
+ self._state = SpeedLimitAssistState.inactive
+
+ has_limit = resolved_limit >= LIMIT_MIN_SPEED
+ v_offset = self.target - v_ego if self.target > 0 else 0.0
+
+ if self._state == SpeedLimitAssistState.inactive:
+ if has_limit:
+ if self._needs_confirmation(resolved_limit, slc_params):
+ self._enter_pre_active(resolved_limit, resolved_source)
+ else:
+ self._apply_limit(resolved_limit, resolved_source, v_ego, fire_changed_event=True)
+
+ elif self._state == SpeedLimitAssistState.preActive:
+ self._pre_active_timer += DT_MDL
+ confirmed, denied = self._check_confirmation(sm, slc_params)
+
+ if denied:
+ self.denied_target = self.unconfirmed_limit
+ self.previous_source = self.unconfirmed_source
+ self.previous_target = self.unconfirmed_limit
+ self._reset_unconfirmed()
+ self._state = SpeedLimitAssistState.inactive
+ elif confirmed:
+ self._confirm(v_ego)
+ elif not has_limit:
+ self._reset_unconfirmed()
+ self._state = SpeedLimitAssistState.inactive
+
+ elif self._state in (SpeedLimitAssistState.active, SpeedLimitAssistState.adapting):
+ if not has_limit:
+ if self.target > 0:
+ self.previous_target = self.target
+ self.previous_source = self.source
+ self._reset_confirmed()
+ self._state = SpeedLimitAssistState.inactive
+ elif abs(resolved_limit - self.target) >= 1.0:
+ if self._needs_confirmation(resolved_limit, slc_params):
+ self._enter_pre_active(resolved_limit, resolved_source)
+ else:
+ self._apply_limit(resolved_limit, resolved_source, v_ego, fire_changed_event=True)
+ elif self._state == SpeedLimitAssistState.adapting:
+ if v_offset >= LIMIT_SPEED_OFFSET_TH:
+ self._state = SpeedLimitAssistState.active
+ elif self._state == SpeedLimitAssistState.active:
+ if v_offset < LIMIT_SPEED_OFFSET_TH:
+ self._state = SpeedLimitAssistState.adapting
+
+ self._update_a_target(v_ego)
+ self._fire_transition_events()
+
+ def _enter_pre_active(self, limit, source):
+ self.unconfirmed_limit = limit
+ self.unconfirmed_source = source
+ self._state = SpeedLimitAssistState.preActive
+ self._pre_active_timer = 0.0
+
+ def _confirm(self, v_ego):
+ self.target = self.unconfirmed_limit
+ self.source = self.unconfirmed_source
+ self.previous_target = self.target
+ self.previous_source = self.source
+ self.denied_target = 0.0
+ self._reset_unconfirmed()
+ self._params.put_nonblocking("PreviousSpeedLimit", float(self.target))
+ self.just_confirmed = True
+ v_offset = self.target - v_ego
+ self._state = SpeedLimitAssistState.adapting if v_offset < LIMIT_SPEED_OFFSET_TH else SpeedLimitAssistState.active
+
+ def _apply_limit(self, limit, source, v_ego, fire_changed_event=False):
+ self.target = limit
+ self.source = source
+ self.previous_target = self.target
+ self.previous_source = self.source
+ self._params.put_nonblocking("PreviousSpeedLimit", float(self.target))
+ if fire_changed_event:
+ self.pending_events.append(EventNameIQ.speedLimitChanged)
+ v_offset = self.target - v_ego
+ self._state = SpeedLimitAssistState.adapting if v_offset < LIMIT_SPEED_OFFSET_TH else SpeedLimitAssistState.active
+
+ def _needs_confirmation(self, new_limit, slc_params):
+ if new_limit < self.target:
+ return slc_params.get("speed_limit_confirmation_lower", False)
+ return slc_params.get("speed_limit_confirmation_higher", False)
+
+ def _check_confirmation(self, sm, slc_params):
+ confirmed = False
+ denied = False
+
+ if slc_params.get("slc_auto_confirm", False) and self._pre_active_timer >= AUTO_CONFIRM_PERIOD:
+ return True, False
+
+ if self._pre_active_timer >= AUTO_DENY_PERIOD:
+ return False, True
+
+ is_lower = (self.target <= 0) or (self.unconfirmed_limit <= self.target)
+ try:
+ for btn in sm["carState"].buttonEvents:
+ if btn.pressed:
+ continue
+ if is_lower and btn.type in CONFIRM_LOWER_BUTTONS:
+ confirmed = True
+ break
+ elif not is_lower and btn.type in CONFIRM_HIGHER_BUTTONS:
+ confirmed = True
+ break
+ except (AttributeError, TypeError):
+ pass
+
+ return confirmed, denied
+
+ def _update_a_target(self, v_ego):
+ if self._state in (SpeedLimitAssistState.adapting, SpeedLimitAssistState.active) and self.target > 0:
+ v_offset = self.target - v_ego
+ self.output_a_target = float(np.clip(v_offset / CONTROL_HORIZON, LIMIT_MIN_ACC, LIMIT_MAX_ACC))
+ else:
+ self.output_a_target = 0.0
+
+ def _fire_transition_events(self):
+ prev = self._prev_state
+ curr = self._state
+ if prev == curr:
+ return
+ if curr == SpeedLimitAssistState.preActive:
+ self.pending_events.append(EventNameIQ.speedLimitPreActive)
+ elif curr in (SpeedLimitAssistState.adapting, SpeedLimitAssistState.active):
+ if prev not in (SpeedLimitAssistState.adapting, SpeedLimitAssistState.active):
+ self.pending_events.append(EventNameIQ.speedLimitActive)
+
+ def _reset_confirmed(self):
+ self.target = 0.0
+ self.source = "None"
+
+ def _reset_unconfirmed(self):
+ self.unconfirmed_limit = 0.0
+ self.unconfirmed_source = "None"
+
+
+class SpeedLimitController:
+ def __init__(self, params):
+ self.params = params
+ self._resolver = IQSpeedLimitResolver()
+ self._assist = IQSpeedLimitAssist(params)
+
+ self.calling_mapbox = False
+ self.mapbox_limit = 0.0
+ self.segment_distance = 0.0
+
+ self.gps_valid = False
+ self.gps_position = {"bearing": 0, "latitude": 0, "longitude": 0}
+
+ self.override_slc = False
+ self.overridden_speed = 0.0
+
+ self._resolved_limit = 0.0
+ self._resolved_source = "None"
+ self._czone_was_limiting = False
+
+ self.pending_events = []
+
+ mapbox_requests_raw = self.params.get("MapBoxRequests")
+ if isinstance(mapbox_requests_raw, dict):
+ self.mapbox_requests = mapbox_requests_raw
+ elif mapbox_requests_raw is not None:
+ try:
+ raw = mapbox_requests_raw
+ if isinstance(raw, bytes):
+ self.mapbox_requests = json.loads(raw.decode("utf-8"))
+ elif isinstance(raw, str):
+ self.mapbox_requests = json.loads(raw)
+ else:
+ self.mapbox_requests = {}
+ except (json.JSONDecodeError, AttributeError, TypeError):
+ self.mapbox_requests = {}
+ else:
+ self.mapbox_requests = {}
+ self.mapbox_requests.setdefault("total_requests", 0)
+ self.mapbox_requests.setdefault("max_requests", FREE_MAPBOX_REQUESTS - (28 * 100))
+
+ self.mapbox_host = "https://api.mapbox.com"
+ self.mapbox_token = self.params.get("MapboxToken")
+ if self.mapbox_token is not None and isinstance(self.mapbox_token, bytes):
+ self.mapbox_token = self.mapbox_token.decode("utf-8")
+
+ previous_limit = self.params.get("PreviousSpeedLimit")
+ if previous_limit is not None:
+ try:
+ val = previous_limit
+ self._assist.previous_target = float(val.decode("utf-8") if isinstance(val, bytes) else val)
+ except (ValueError, AttributeError):
+ pass
+
+ self.executor = ThreadPoolExecutor(max_workers=1)
+ self._offset_cache = {}
+ self._offset_cache_t = 0.0
+ self._last_mapbox_log_t = 0.0
+ self._last_mapbox_diag_t = 0.0
+ self._last_mapbox_diag_message = None
+
+ self.session = requests.Session() if requests is not None else None
+ if self.session is not None:
+ self.session.headers.update({"Accept-Language": "en"})
+ self.session.headers.update({"User-Agent": "iqpilot-mapbox-speed-limit-retriever/1.0"})
+
+ self.tomtom_host = "https://api.tomtom.com"
+ self.tomtom_token = self._resolve_tomtom_token()
+ self.tomtom_limit = 0.0
+ self.tomtom_segment_distance = 0.0
+ self.calling_tomtom = False
+ self.tomtom_consecutive_failures = 0
+ self.tomtom_backoff_until = 0.0
+
+ def _resolve_tomtom_token(self) -> str:
+ try:
+ from openpilot.iqpilot.navd.runtime_common import resolve_tomtom_token
+ return resolve_tomtom_token(self.params) or ""
+ except Exception:
+ tok = self.params.get("TomTomToken")
+ return (tok.decode("utf-8") if isinstance(tok, bytes) else (tok or "")).strip()
+
+ @property
+ def target(self):
+ return self._assist.target
+
+ @property
+ def source(self):
+ return self._assist.source
+
+ @property
+ def active_target(self):
+ return self._resolved_limit
+
+ @property
+ def active_source(self):
+ return self._resolved_source
+
+ @property
+ def unconfirmed_speed_limit(self):
+ return self._assist.unconfirmed_limit
+
+ @property
+ def map_speed_limit(self):
+ return self._resolver.map_speed_limit
+
+ @property
+ def next_speed_limit(self):
+ return self._resolver.next_speed_limit
+
+ @property
+ def assist_state(self):
+ return self._assist.state
+
+ @property
+ def output_a_target(self):
+ return self._assist.output_a_target
+
+ def get_offset(self, is_metric):
+ target = self._assist.target
+ # offsets only apply to real limit sources: fallback set-speed publishes "None",
+ # construction clamps must never be inflated
+ if target <= 0 or self._assist.source in ("None", "Construction"):
+ return 0.0
+ offset_map = OFFSET_MAP_METRIC if is_metric else OFFSET_MAP_IMPERIAL
+ for low, high, offset_param in offset_map:
+ if low <= target < high:
+ percent = float(np.clip(self._get_offset_percent(offset_param), -OFFSET_PERCENT_MAX, OFFSET_PERCENT_MAX))
+ return target * percent / 100.0
+ return 0.0
+
+ def _get_offset_percent(self, offset_param):
+ now_mono = time.monotonic()
+ if now_mono - self._offset_cache_t >= 5.0:
+ self._offset_cache.clear()
+ self._offset_cache_t = now_mono
+ if offset_param not in self._offset_cache:
+ offset_value = self.params.get(offset_param)
+ try:
+ if isinstance(offset_value, bytes):
+ offset_value = offset_value.decode("utf-8")
+ self._offset_cache[offset_param] = float(offset_value) if offset_value is not None else 0.0
+ except (ValueError, TypeError):
+ self._offset_cache[offset_param] = 0.0
+ return self._offset_cache[offset_param]
+
+ @staticmethod
+ def _is_alive(sm, key):
+ if hasattr(sm, "alive"):
+ return bool(sm.alive.get(key, False))
+ return False
+
+ def update_gps(self, sm):
+ iq_loc_valid = False
+ iq_loc = None
+ if self._is_alive(sm, "iqLiveLocation"):
+ iq_loc = sm["iqLiveLocation"]
+ iq_loc_valid = bool(getattr(iq_loc, "gpsHealthy", False))
+
+ if self._is_alive(sm, "gpsLocationExternal"):
+ gps_location = sm["gpsLocationExternal"]
+ elif self._is_alive(sm, "gpsLocation"):
+ gps_location = sm["gpsLocation"]
+ else:
+ gps_location = None
+
+ gps_has_fix = False
+ if gps_location is not None:
+ gps_has_fix = bool(getattr(gps_location, "hasFix", False))
+ gps_has_fix |= bool(getattr(gps_location, "flags", 0) > 0)
+
+ if gps_location and (gps_has_fix or iq_loc_valid):
+ self.gps_valid = True
+ self.gps_position = {
+ "bearing": getattr(gps_location, "bearingDeg", 0),
+ "latitude": getattr(gps_location, "latitude", 0),
+ "longitude": getattr(gps_location, "longitude", 0),
+ }
+ elif iq_loc_valid and iq_loc is not None and getattr(iq_loc, "geodeticPosition", None) and iq_loc.geodeticPosition.isValid:
+ self.gps_valid = True
+ self.gps_position = {
+ "bearing": math.degrees(iq_loc.alignedOrientationNed.values[2]) if getattr(iq_loc, "alignedOrientationNed", None) else 0,
+ "latitude": iq_loc.geodeticPosition.values[0],
+ "longitude": iq_loc.geodeticPosition.values[1],
+ }
+ else:
+ self.gps_valid = False
+
+ def _log_mapbox_diag(self, message, force=False):
+ now_mono = time.monotonic()
+ if not force and message == self._last_mapbox_diag_message and now_mono - self._last_mapbox_diag_t < 5.0:
+ return
+ if not force and now_mono - self._last_mapbox_diag_t < 2.0:
+ return
+ self._last_mapbox_diag_t = now_mono
+ self._last_mapbox_diag_message = message
+ cloudlog.info(message)
+ k3_slc_log(message)
+
+ def get_mapbox_speed_limit(self, now, time_validated, v_ego, sm):
+ if requests is None or self.session is None:
+ self._log_mapbox_diag("SLC Mapbox skipped: requests session unavailable")
+ self.mapbox_limit = 0.0
+ self.segment_distance = 0.0
+ return
+
+ steer_angle = sm["carState"].steeringAngleDeg - sm["liveParameters"].angleOffsetDeg
+ if not self.gps_valid or not self.mapbox_token or steer_angle >= 45:
+ self._log_mapbox_diag(f"SLC Mapbox skipped: gps_valid={self.gps_valid} token={bool(self.mapbox_token)} steer_angle={round(float(steer_angle), 2)}")
+ self.mapbox_limit = 0.0
+ self.segment_distance = 0.0
+ return
+
+ if v_ego < 1:
+ return
+
+ if self.segment_distance > 0:
+ self.segment_distance -= v_ego * DT_MDL
+ return
+
+ if self.calling_mapbox:
+ self.segment_distance = v_ego
+ return
+
+ def make_request():
+ try:
+ self.calling_mapbox = True
+ successful = False
+
+ if not is_url_pingable(self.mapbox_host):
+ self._log_mapbox_diag("SLC Mapbox skipped: host not pingable", force=True)
+ self.segment_distance = 1000
+ return None
+
+ if time_validated:
+ current_month = now.month
+ if current_month != self.mapbox_requests.get("month"):
+ self.mapbox_requests.update(
+ {
+ "month": current_month,
+ "total_requests": 0,
+ "max_requests": FREE_MAPBOX_REQUESTS - calendar.monthrange(now.year, current_month)[1] * 100,
+ }
+ )
+
+ self.mapbox_requests["total_requests"] += 1
+ self.params.put_nonblocking("MapBoxRequests", self.mapbox_requests)
+
+ lat = self.gps_position.get("latitude")
+ lon = self.gps_position.get("longitude")
+ bearing = self.gps_position.get("bearing")
+ future_lat, future_lon = calculate_bearing_offset(lat, lon, bearing, v_ego)
+
+ self._log_mapbox_diag(
+ f"SLC Mapbox request: lat={round(float(lat), 6)} lon={round(float(lon), 6)} bearing={round(float(bearing), 2)} v_ego={round(float(v_ego), 2)}",
+ force=True,
+ )
+
+ url = f"{self.mapbox_host}/matching/v5/mapbox/driving/{lon},{lat};{future_lon},{future_lat}.json"
+ mapbox_params = {
+ "access_token": self.mapbox_token,
+ "annotations": "maxspeed,distance",
+ "geometries": "polyline6",
+ "overview": "full",
+ "steps": "false",
+ "radiuses": "10;10",
+ "tidy": "true",
+ }
+
+ response = self.session.get(url, params=mapbox_params, timeout=10)
+ response.raise_for_status()
+ successful = True
+ return response.json()
+ except Exception as exception:
+ now_mono = time.monotonic()
+ if now_mono - self._last_mapbox_log_t >= 5.0:
+ self._last_mapbox_log_t = now_mono
+ msg = f"SLC Mapbox request failed: {exception}"
+ cloudlog.warning(msg)
+ k3_slc_log(msg)
+ finally:
+ self.calling_mapbox = False
+ if not successful:
+ self.mapbox_limit = 0.0
+ self.segment_distance = v_ego
+
+ def complete_request(future):
+ try:
+ data = future.result()
+ if data:
+ matchings = data.get("matchings") or []
+ if not matchings:
+ self.mapbox_limit = 0.0
+ self.segment_distance = v_ego
+ return
+ legs = (matchings[0] or {}).get("legs") or []
+ if not legs:
+ self.mapbox_limit = 0.0
+ self.segment_distance = v_ego
+ return
+ annotation = legs[0].get("annotation") or {}
+ distances = annotation.get("distance") or [v_ego]
+ segment_distance = distances[0]
+ speed_data = annotation.get("maxspeed", [])
+ speed_limit_kph = 0
+ if speed_data:
+ first = speed_data[0]
+ speed_limit_kph = (first.get("speed") if first.get("speed") != "none" else 0) or 0
+ if speed_limit_kph > 0:
+ self.mapbox_limit = speed_limit_kph * CV.KPH_TO_MS
+ self.segment_distance = segment_distance
+ self._log_mapbox_diag(
+ f"SLC Mapbox callback: speed_limit_kph={round(float(speed_limit_kph), 2)} segment_distance={round(float(segment_distance), 2)}",
+ force=True,
+ )
+ return
+ self.mapbox_limit = 0.0
+ self.segment_distance = v_ego
+ except Exception as exception:
+ now_mono = time.monotonic()
+ if now_mono - self._last_mapbox_log_t >= 5.0:
+ self._last_mapbox_log_t = now_mono
+ msg = f"SLC Mapbox callback failed: {exception}"
+ cloudlog.warning(msg)
+ k3_slc_log(msg)
+ self.mapbox_limit = 0.0
+ self.segment_distance = v_ego
+
+ future = self.executor.submit(make_request)
+ future.add_done_callback(complete_request)
+
+ def get_tomtom_speed_limit(self, now, time_validated, v_ego, sm):
+ if requests is None or self.session is None or not self.tomtom_token:
+ self.tomtom_limit = 0.0
+ self.tomtom_segment_distance = 0.0
+ return
+
+ # backoff: an exhausted-quota key (HTTP 403 InsufficientFunds) otherwise gets
+ # hammered every 250 m for the rest of the drive
+ if time.monotonic() < self.tomtom_backoff_until:
+ self.tomtom_limit = 0.0
+ return
+
+ steer_angle = sm["carState"].steeringAngleDeg - sm["liveParameters"].angleOffsetDeg
+ if not self.gps_valid or steer_angle >= 45 or v_ego < 1:
+ self.tomtom_limit = 0.0
+ return
+
+ # re-query at most once per ~250 m of travel
+ if self.tomtom_segment_distance > 0:
+ self.tomtom_segment_distance -= v_ego * DT_MDL
+ return
+ if self.calling_tomtom:
+ self.tomtom_segment_distance = v_ego
+ return
+
+ lat = self.gps_position.get("latitude")
+ lon = self.gps_position.get("longitude")
+ bearing = self.gps_position.get("bearing")
+ future_lat, future_lon = calculate_bearing_offset(lat, lon, bearing, max(v_ego, 12.0) * 12.0)
+
+ def make_request():
+ successful = False
+ try:
+ self.calling_tomtom = True
+ url = f"{self.tomtom_host}/routing/1/calculateRoute/{lat},{lon}:{future_lat},{future_lon}/json"
+ self._log_mapbox_diag(
+ f"SLC TomTom request: lat={round(float(lat), 6)} lon={round(float(lon), 6)} bearing={round(float(bearing), 2)} v_ego={round(float(v_ego), 2)}",
+ force=True,
+ )
+ response = self.session.get(url, params={"key": self.tomtom_token, "sectionType": "speedLimit", "traffic": "false"}, timeout=10)
+ response.raise_for_status()
+ successful = True
+ self.tomtom_consecutive_failures = 0
+ return response.json()
+ except Exception as exception:
+ status = getattr(getattr(exception, "response", None), "status_code", None)
+ if status in (401, 403, 429):
+ # dead/exhausted key: retry hourly in case credits refill, not every 250 m
+ self.tomtom_backoff_until = time.monotonic() + 3600.0
+ else:
+ self.tomtom_consecutive_failures += 1
+ self.tomtom_backoff_until = time.monotonic() + min(600.0, 10.0 * (2 ** min(self.tomtom_consecutive_failures, 6)))
+ now_mono = time.monotonic()
+ if now_mono - self._last_mapbox_log_t >= 5.0:
+ self._last_mapbox_log_t = now_mono
+ msg = f"SLC TomTom request failed (backoff {max(0.0, self.tomtom_backoff_until - now_mono):.0f}s): {exception}"
+ cloudlog.warning(msg)
+ k3_slc_log(msg)
+ finally:
+ self.calling_tomtom = False
+ if not successful:
+ self.tomtom_limit = 0.0
+ self.tomtom_segment_distance = v_ego
+
+ def complete_request(future):
+ try:
+ data = future.result()
+ kmh = 0
+ if data:
+ sections = ((data.get("routes") or [{}])[0]).get("sections") or []
+ speed_secs = [s for s in sections if s.get("sectionType") == "SPEED_LIMIT"]
+ at_start = next((s for s in speed_secs if s.get("startPointIndex") == 0), None)
+ chosen = at_start or (speed_secs[0] if speed_secs else None)
+ if chosen:
+ kmh = chosen.get("maxSpeedLimitInKmh") or 0
+ if kmh and kmh > 0:
+ self.tomtom_limit = float(kmh) * CV.KPH_TO_MS
+ self._log_mapbox_diag(
+ f"SLC TomTom callback: speed_limit_kph={round(float(kmh), 2)}",
+ force=True,
+ )
+ else:
+ self.tomtom_limit = 0.0
+ except Exception as exception:
+ now_mono = time.monotonic()
+ if now_mono - self._last_mapbox_log_t >= 5.0:
+ self._last_mapbox_log_t = now_mono
+ cloudlog.warning(f"SLC TomTom callback failed: {exception}")
+ self.tomtom_limit = 0.0
+ finally:
+ self.tomtom_segment_distance = 250.0
+
+ future = self.executor.submit(make_request)
+ future.add_done_callback(complete_request)
+
+ def _construction_zone_limit(self, sm, slc_params):
+ if not slc_params.get("construction_zone_assist", False):
+ return 0.0
+ if not self._is_alive(sm, "iqConstructionZone"):
+ return 0.0
+ if not bool(getattr(sm["iqConstructionZone"], "active", False)):
+ return 0.0
+ speed = slc_params.get("construction_zone_speed", 60.0)
+ unit = CV.KPH_TO_MS if slc_params.get("is_metric", False) else CV.MPH_TO_MS
+ return max(float(speed), 0.0) * unit
+
+ def _maybe_reset_mapbox_quota(self, now, time_validated):
+ if time_validated:
+ current_month = now.month
+ if current_month != self.mapbox_requests.get("month"):
+ self.mapbox_requests.update(
+ {
+ "month": current_month,
+ "total_requests": 0,
+ "max_requests": FREE_MAPBOX_REQUESTS - calendar.monthrange(now.year, current_month)[1] * 100,
+ }
+ )
+ self.params.put_nonblocking("MapBoxRequests", self.mapbox_requests)
+
+ def update_limits(self, dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm, slc_params):
+ self.update_gps(sm)
+
+ lookahead_lower = slc_params.get("map_speed_lookahead_lower", 5.0)
+ lookahead_higher = slc_params.get("map_speed_lookahead_higher", 5.0)
+ self._resolver.update_map_data(v_ego, sm, lookahead_lower, lookahead_higher)
+
+ use_online = slc_params.get("slc_online_filler", False)
+ if use_online:
+ self._maybe_reset_mapbox_quota(now, time_validated)
+ if self.mapbox_requests["total_requests"] < self.mapbox_requests["max_requests"]:
+ self.get_mapbox_speed_limit(now, time_validated, v_ego, sm)
+ else:
+ self.mapbox_limit = 0.0
+ self.segment_distance = 0.0
+ self.get_tomtom_speed_limit(now, time_validated, v_ego, sm)
+ else:
+ self.mapbox_limit = 0.0
+ self.tomtom_limit = 0.0
+ self.segment_distance = 0.0
+ self.tomtom_segment_distance = 0.0
+
+ online_limit = self.tomtom_limit if self.tomtom_limit > 0 else self.mapbox_limit
+
+ dashboard_limit = float(dashboard_speed_limit) if dashboard_speed_limit else 0.0
+ resolved_limit, resolved_source = self._resolver.resolve(dashboard_limit, online_limit, slc_params)
+
+ enabled = bool(getattr(sm["selfdriveState"], "enabled", False))
+ if resolved_limit <= 0:
+ if self._assist.denied_target != self._assist.previous_target > 0 and slc_params.get("slc_fallback_previous_speed_limit", False):
+ resolved_limit = self._assist.previous_target
+ resolved_source = self._assist.previous_source
+ elif enabled and slc_params.get("slc_fallback_set_speed", False):
+ resolved_limit = v_cruise
+ resolved_source = "None"
+
+ # work-zone clamp: only ever lowers the resolved limit
+ czone_limit = self._construction_zone_limit(sm, slc_params)
+ if czone_limit > 0 and (resolved_limit <= 0 or resolved_limit > czone_limit):
+ resolved_limit = czone_limit
+ resolved_source = "Construction"
+
+ self._resolved_limit = float(resolved_limit)
+ self._resolved_source = resolved_source
+
+ self._assist.update(enabled, v_ego, resolved_limit, resolved_source, slc_params, sm)
+
+ if self._assist.just_confirmed:
+ self.overridden_speed = 0.0
+
+ self.pending_events = list(self._assist.pending_events)
+
+ czone_limiting = resolved_source == "Construction"
+ if czone_limiting and not self._czone_was_limiting:
+ self.pending_events.append(EventNameIQ.constructionZoneDetected)
+ self._czone_was_limiting = czone_limiting
+
+ def update_override(self, v_cruise, v_cruise_diff, v_ego, v_ego_diff, sm, slc_params, is_metric):
+ offset = self.get_offset(is_metric)
+ target = self._assist.target
+
+ self.override_slc = self.overridden_speed > target + offset > 0
+ self.override_slc |= sm["carState"].gasPressed and v_ego > target + offset > 0
+ self.override_slc &= bool(getattr(sm["selfdriveState"], "enabled", False))
+
+ if self.override_slc:
+ if slc_params.get("speed_limit_controller_override_manual", False):
+ if sm["carState"].gasPressed:
+ self.overridden_speed = max(v_ego + v_ego_diff, self.overridden_speed)
+ self.overridden_speed = float(np.clip(self.overridden_speed, target + offset, v_cruise + v_cruise_diff))
+ elif slc_params.get("speed_limit_controller_override_set_speed", False):
+ self.overridden_speed = v_cruise + v_cruise_diff
+ else:
+ self.overridden_speed = 0.0
diff --git a/iqpilot/selfdrive/controls/lib/tests/test_custom_stop_distance.py b/iqpilot/selfdrive/controls/lib/tests/test_custom_stop_distance.py
new file mode 100644
index 000000000..0258ae078
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/tests/test_custom_stop_distance.py
@@ -0,0 +1,118 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Original concept ("Increased Stop Distance") by SpysyWeeb (github.com/SpysyWeeb)
+"""
+from types import SimpleNamespace
+
+from iqdbc.car.interfaces import ACCEL_MIN
+from openpilot.selfdrive.modeld.constants import ModelConstants
+from openpilot.iqpilot.selfdrive.controls.lib.custom_stop_distance import (
+ CustomStopDistance,
+ MIN_ADJUSTED_D_REL,
+)
+
+
+def _build(distance):
+ c = CustomStopDistance.__new__(CustomStopDistance)
+ c.frame = 0
+ c.distance = float(distance)
+ return c
+
+
+def _model_msg(stop_distance, end_velocity):
+ x = [0.0] * (ModelConstants.IDX_N - 1) + [stop_distance]
+ v = [0.0] * (ModelConstants.IDX_N - 1) + [end_velocity]
+ return SimpleNamespace(position=SimpleNamespace(x=x), velocity=SimpleNamespace(x=v))
+
+
+def test_zero_distance_is_a_no_op():
+ c = _build(0)
+ lead = {'status': True, 'dRel': 10.0, 'vLead': 0.0}
+ assert c.apply_lead(dict(lead)) == lead
+
+
+def test_positive_distance_reduces_reported_lead_distance():
+ c = _build(2)
+ lead = {'status': True, 'dRel': 10.0, 'vLead': 0.0}
+ out = c.apply_lead(dict(lead))
+ assert out['dRel'] == 8.0
+
+
+def test_negative_distance_increases_reported_lead_distance():
+ c = _build(-2)
+ lead = {'status': True, 'dRel': 10.0, 'vLead': 0.0}
+ out = c.apply_lead(dict(lead))
+ assert out['dRel'] == 12.0
+
+
+def test_positive_distance_never_reports_below_floor():
+ c = _build(2)
+ lead = {'status': True, 'dRel': 1.5, 'vLead': 0.0}
+ out = c.apply_lead(dict(lead))
+ assert out['dRel'] == MIN_ADJUSTED_D_REL
+
+
+def test_positive_distance_never_reports_further_than_reality():
+ c = _build(2)
+ lead = {'status': True, 'dRel': 0.5, 'vLead': 0.0}
+ out = c.apply_lead(dict(lead))
+ assert out['dRel'] == 0.5
+
+
+def test_offset_fades_out_as_lead_speeds_up():
+ c = _build(2)
+ lead = {'status': True, 'dRel': 10.0, 'vLead': 3.0}
+ out = c.apply_lead(dict(lead))
+ assert out['dRel'] == 10.0
+
+
+def test_no_lead_is_untouched():
+ c = _build(2)
+ lead = {'status': False, 'dRel': 10.0, 'vLead': 0.0}
+ out = c.apply_lead(dict(lead))
+ assert out['dRel'] == 10.0
+
+
+def test_e2e_negative_distance_is_a_no_op():
+ c = _build(-2)
+ a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 0.2, _model_msg(3.0, 0.0))
+ assert (a_target, should_stop) == (-0.5, False)
+
+
+def test_e2e_zero_distance_is_a_no_op():
+ c = _build(0)
+ a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 0.2, _model_msg(3.0, 0.0))
+ assert (a_target, should_stop) == (-0.5, False)
+
+
+def test_e2e_stop_sign_plans_are_untouched():
+ c = _build(2)
+ # model plan still moving at the end -> proceeding through (stop sign), not held
+ a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 0.2, _model_msg(3.0, 5.0))
+ assert (a_target, should_stop) == (-0.5, False)
+
+
+def test_e2e_holds_short_of_model_stop_when_already_stopped():
+ c = _build(2)
+ a_target, should_stop = c.adjust_e2e_stop(0.0, False, 0.1, _model_msg(stop_distance=3.0, end_velocity=0.0))
+ assert should_stop is True
+
+
+def test_e2e_does_not_hold_once_past_offset_and_buffer():
+ c = _build(2)
+ a_target, should_stop = c.adjust_e2e_stop(0.0, False, 0.1, _model_msg(stop_distance=10.0, end_velocity=0.0))
+ assert should_stop is False
+
+
+def test_e2e_deepens_braking_already_in_progress():
+ c = _build(2)
+ a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 5.0, _model_msg(stop_distance=10.0, end_velocity=0.0))
+ assert a_target < -0.5
+ assert a_target >= ACCEL_MIN
+
+
+def test_e2e_never_relaxes_braking():
+ c = _build(2)
+ a_target, should_stop = c.adjust_e2e_stop(0.0, False, 5.0, _model_msg(stop_distance=10.0, end_velocity=0.0))
+ assert a_target == 0.0
diff --git a/iqpilot/selfdrive/controls/lib/tests/test_iq_dynamic_force_stop.py b/iqpilot/selfdrive/controls/lib/tests/test_iq_dynamic_force_stop.py
new file mode 100644
index 000000000..96b3f28c0
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/tests/test_iq_dynamic_force_stop.py
@@ -0,0 +1,62 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from types import SimpleNamespace
+
+from openpilot.common.realtime import DT_MDL
+from openpilot.iqpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlannerIQ
+
+
+class _FakeIQDynamic:
+ def __init__(self, requested=True, model_length=4.0, model_stop_time=5.0, minimum_force_stop_length=15.0):
+ self._requested = requested
+ self.model_length = model_length
+ self.model_stop_time = model_stop_time
+ self.minimum_force_stop_length = minimum_force_stop_length
+
+ def force_stop_requested(self):
+ return self._requested
+
+
+def _build_planner(iq_dynamic):
+ planner = LongitudinalPlannerIQ.__new__(LongitudinalPlannerIQ)
+ planner.iq_dynamic = iq_dynamic
+ planner.force_stop_timer = 0.0
+ planner.forcing_stop = False
+ planner.override_force_stop = False
+ planner.override_force_stop_timer = 0.0
+ planner.tracked_model_length = 0.0
+ return planner
+
+
+def _build_sm(gas_pressed=False, accel_pressed=False, standstill=False):
+ return {
+ "carState": SimpleNamespace(gasPressed=gas_pressed, standstill=standstill),
+ "iqCarState": SimpleNamespace(accelPressed=accel_pressed),
+ }
+
+
+def test_force_stop_uses_model_stop_time_as_ramp():
+ planner = _build_planner(_FakeIQDynamic(model_length=20.0, model_stop_time=5.0, minimum_force_stop_length=0.0))
+ sm = _build_sm()
+
+ output = 12.0
+ for _ in range(int(1.0 / DT_MDL)):
+ output = planner._apply_force_stop(12.0, 0.0, sm, True)
+
+ assert planner.forcing_stop
+ assert output == 4.0
+
+
+def test_force_stop_respects_minimum_force_stop_length():
+ planner = _build_planner(_FakeIQDynamic(model_length=4.0, model_stop_time=5.0, minimum_force_stop_length=15.0))
+ sm = _build_sm()
+
+ output = 12.0
+ for _ in range(int(1.0 / DT_MDL)):
+ output = planner._apply_force_stop(12.0, 0.0, sm, True)
+
+ assert planner.forcing_stop
+ assert planner.tracked_model_length == 15.0
+ assert output == 3.0
diff --git a/iqpilot/selfdrive/controls/lib/tests/test_nav_exit_lane_change.py b/iqpilot/selfdrive/controls/lib/tests/test_nav_exit_lane_change.py
new file mode 100644
index 000000000..5e0a95700
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/tests/test_nav_exit_lane_change.py
@@ -0,0 +1,96 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from cereal import custom, log
+from openpilot.selfdrive.controls.lib.desire_helper import DesireHelper, LaneChangeState
+from openpilot.iqpilot.selfdrive.controls.lib.helpers.lane_change import AutoLaneChangeMode
+
+ManeuverType = custom.IQNavState.ManeuverType
+NavDirection = custom.NavDirection
+LaneChangeDirection = log.LaneChangeDirection
+
+
+class DummyCarState:
+ def __init__(self, vEgo=25.0, leftBlinker=False, rightBlinker=False, leftBlindspot=False, rightBlindspot=False,
+ steeringPressed=False, steeringTorque=0, brakePressed=False):
+ self.vEgo = vEgo
+ self.leftBlinker = leftBlinker
+ self.rightBlinker = rightBlinker
+ self.leftBlindspot = leftBlindspot
+ self.rightBlindspot = rightBlindspot
+ self.steeringPressed = steeringPressed
+ self.steeringTorque = steeringTorque
+ self.brakePressed = brakePressed
+
+
+class DummyNavState:
+ def __init__(self, active=True, nextManeuverValid=True, nextManeuverType=int(ManeuverType.exit),
+ nextManeuverDistance=300.0, nextManeuverDirection=int(NavDirection.right)):
+ self.active = active
+ self.nextManeuverValid = nextManeuverValid
+ self.nextManeuverType = nextManeuverType
+ self.nextManeuverDistance = nextManeuverDistance
+ self.nextManeuverDirection = nextManeuverDirection
+
+
+def _make_dh(enabled: bool, enable_bsm: bool):
+ dh = DesireHelper()
+ dh.alc.lane_change_set_timer = AutoLaneChangeMode.NUDGE
+ dh.nav_exit._read_enabled = lambda: enabled # bypass the (unregistered) param in tests
+ dh.nav_exit._enable_bsm = enable_bsm
+ return dh
+
+
+def _run(dh, carstate, nav_state, n=20):
+ for _ in range(n):
+ dh.update(carstate, True, 1.0, nav_state)
+ return dh.desire
+
+
+def test_feature_off_no_exit_lane_change():
+ dh = _make_dh(enabled=False, enable_bsm=True)
+ cs = DummyCarState(rightBlindspot=False)
+ assert _run(dh, cs, DummyNavState()) == log.Desire.none
+
+
+def test_no_bsm_requires_nudge_holds_without_one():
+ # No blindspot monitor: nav exit must NOT auto-start; without a nudge it stays in preLaneChange.
+ dh = _make_dh(enabled=True, enable_bsm=False)
+ cs = DummyCarState(steeringPressed=False)
+ assert _run(dh, cs, DummyNavState()) == log.Desire.none
+ assert dh.lane_change_state == LaneChangeState.preLaneChange
+ assert dh.lane_change_direction == LaneChangeDirection.right
+
+
+def test_no_bsm_starts_on_driver_nudge():
+ # Driver nudges the wheel toward the exit (right -> negative torque) -> lane change starts.
+ dh = _make_dh(enabled=True, enable_bsm=False)
+ cs = DummyCarState(steeringPressed=True, steeringTorque=-1)
+ assert _run(dh, cs, DummyNavState()) == log.Desire.laneChangeRight
+
+
+def test_bsm_auto_starts_when_clear():
+ dh = _make_dh(enabled=True, enable_bsm=True)
+ cs = DummyCarState(rightBlindspot=False)
+ assert _run(dh, cs, DummyNavState()) == log.Desire.laneChangeRight
+
+
+def test_bsm_holds_when_blindspot_occupied():
+ dh = _make_dh(enabled=True, enable_bsm=True)
+ cs = DummyCarState(rightBlindspot=True)
+ assert _run(dh, cs, DummyNavState()) == log.Desire.none
+
+
+def test_only_exit_maneuvers_trigger():
+ # A turn maneuver (not an exit) must not trigger the exit lane change.
+ dh = _make_dh(enabled=True, enable_bsm=True)
+ cs = DummyCarState(rightBlindspot=False)
+ nav = DummyNavState(nextManeuverType=int(ManeuverType.turn))
+ assert _run(dh, cs, nav) == log.Desire.none
+
+
+def test_too_far_does_not_trigger():
+ dh = _make_dh(enabled=True, enable_bsm=True)
+ cs = DummyCarState(rightBlindspot=False)
+ nav = DummyNavState(nextManeuverDistance=900.0)
+ assert _run(dh, cs, nav) == log.Desire.none
diff --git a/iqpilot/selfdrive/controls/lib/tests/test_slc_speed_limit_control.py b/iqpilot/selfdrive/controls/lib/tests/test_slc_speed_limit_control.py
new file mode 100644
index 000000000..c6c8ddf97
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/tests/test_slc_speed_limit_control.py
@@ -0,0 +1,463 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from datetime import datetime
+from types import SimpleNamespace
+
+from openpilot.common.constants import CV
+from openpilot.iqpilot.common.slc_variables import OFFSET_MAP_IMPERIAL
+from openpilot.iqpilot.selfdrive.controls.lib.slc_vcruise import SLCVCruise, CRUISING_SPEED
+from openpilot.iqpilot.selfdrive.controls.lib.speed_limit_controller import SpeedLimitController, POLICY_MAP_DATA_PRIORITY, POLICY_COMBINED
+
+
+class FakeParams:
+ def __init__(self):
+ self.values = {}
+
+ def get(self, key, encoding=None):
+ _ = encoding
+ return self.values.get(key)
+
+ def get_bool(self, key):
+ return bool(self.values.get(key, False))
+
+ def put_nonblocking(self, key, value):
+ self.values[key] = value
+
+ def put(self, key, value):
+ self.values[key] = value
+
+
+def _build_sm(v_cruise_cluster=100.0, v_ego_cluster=27.8, gas=False, enabled=True, iq_limit=0.0):
+ # vCruiseCluster is in kph in carState.
+ return {
+ "carState": SimpleNamespace(vCruiseCluster=v_cruise_cluster, vEgoCluster=v_ego_cluster, gasPressed=gas,
+ steeringAngleDeg=0.0, buttonEvents=[]),
+ "iqCarState": SimpleNamespace(speedLimit=iq_limit, accelPressed=False, decelPressed=False),
+ "selfdriveState": SimpleNamespace(enabled=enabled),
+ "liveParameters": SimpleNamespace(angleOffsetDeg=0.0),
+ }
+
+
+class _FakeSLC:
+ def __init__(self):
+ self.target = 0.0
+ self.source = "None"
+ self.active_target = 0.0
+ self.active_source = "None"
+ self.unconfirmed_speed_limit = 0.0
+ self.overridden_speed = 0.0
+ self.pending_events = []
+ self.assist_state = None
+ self.output_a_target = 0.0
+ self.update_limits_calls = 0
+ self.update_override_calls = 0
+ self._offset = 0.0
+
+ def update_limits(self, *_args, **_kwargs):
+ self.update_limits_calls += 1
+
+ def update_override(self, *_args, **_kwargs):
+ self.update_override_calls += 1
+
+ def get_offset(self, _is_metric):
+ return self._offset
+
+
+def _base_slc_params_controller():
+ return {
+ "slc_policy": POLICY_MAP_DATA_PRIORITY,
+ "slc_auto_confirm": False,
+ "slc_fallback_previous_speed_limit": False,
+ "slc_fallback_set_speed": False,
+ "speed_limit_confirmation_higher": False,
+ "speed_limit_confirmation_lower": False,
+ "slc_online_filler": True,
+ "map_speed_lookahead_higher": 5.0,
+ "map_speed_lookahead_lower": 5.0,
+ }
+
+
+def test_speed_limit_controller_resolves_source_by_priority():
+ params = FakeParams()
+ controller = SpeedLimitController(params)
+ controller.update_gps = lambda _sm: None
+ controller._resolver.update_map_data = lambda *_args, **_kwargs: None
+ controller.get_mapbox_speed_limit = lambda *_args, **_kwargs: None
+ controller.mapbox_requests["total_requests"] = 0
+ controller.mapbox_requests["max_requests"] = 999999
+ controller.mapbox_limit = 22.0
+ controller._resolver.map_speed_limit = 18.0 # map data wins in map_data_priority policy
+
+ sm = _build_sm(iq_limit=25.0)
+ slc_params = _base_slc_params_controller()
+ slc_params["slc_policy"] = POLICY_MAP_DATA_PRIORITY
+
+ controller.update_limits(25.0, datetime.now(), True, 30.0, 27.0, sm, slc_params)
+ assert controller.active_source == "Map Data"
+ assert controller.active_target == 18.0
+
+
+def test_speed_limit_controller_combined_mode_prefers_smallest_limit():
+ params = FakeParams()
+ controller = SpeedLimitController(params)
+ controller.update_gps = lambda _sm: None
+ controller._resolver.update_map_data = lambda *_args, **_kwargs: None
+ controller.get_mapbox_speed_limit = lambda *_args, **_kwargs: None
+ controller.mapbox_requests["total_requests"] = 0
+ controller.mapbox_requests["max_requests"] = 999999
+ controller.mapbox_limit = 24.0
+ controller._resolver.map_speed_limit = 16.0 # smallest of: dashboard=28, mapbox=24, map_data=16
+
+ sm = _build_sm(iq_limit=28.0)
+ slc_params = _base_slc_params_controller()
+ slc_params["slc_policy"] = POLICY_COMBINED
+
+ controller.update_limits(28.0, datetime.now(), True, 31.0, 27.0, sm, slc_params)
+ assert controller.active_source == "Map Data"
+ assert controller.active_target == 16.0
+
+
+def test_slc_vcruise_applies_target_without_increasing_cruise():
+ slc = SLCVCruise()
+ slc.slc = _FakeSLC()
+ slc.slc.target = 23.0
+ slc.slc.source = "Dashboard"
+ slc.slc.active_target = 23.0
+ slc.slc.active_source = "Dashboard"
+ slc.slc._offset = 1.0
+
+ slc._get_slc_params = lambda: {
+ "speed_limit_controller": True,
+ "speed_limit_mode": 3,
+ "show_speed_limits": False,
+ "is_metric": True,
+ "slc_policy": POLICY_MAP_DATA_PRIORITY,
+ "slc_auto_confirm": False,
+ "speed_limit_confirmation_higher": False,
+ "speed_limit_confirmation_lower": False,
+ "map_speed_lookahead_higher": 5.0,
+ "map_speed_lookahead_lower": 5.0,
+ "slc_fallback_experimental_mode": False,
+ "slc_fallback_set_speed": False,
+ "slc_fallback_previous_speed_limit": False,
+ "speed_limit_controller_override_manual": True,
+ "speed_limit_controller_override_set_speed": False,
+ "slc_online_filler": False,
+ }
+
+ v_cruise = 30.0
+ sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=27.0, iq_limit=23.0)
+ out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=27.0, sm=sm)
+
+ assert slc.slc.update_limits_calls == 1
+ assert slc.slc.update_override_calls == 1
+ assert out <= v_cruise
+ assert out >= CRUISING_SPEED
+
+
+def test_slc_vcruise_show_only_does_not_modify_cruise():
+ slc = SLCVCruise()
+ slc.slc = _FakeSLC()
+ slc.slc.target = 21.0
+ slc.slc.source = "Map Data"
+ slc.slc.active_target = 21.0
+ slc.slc.active_source = "Map Data"
+ slc._get_slc_params = lambda: {
+ "speed_limit_controller": False,
+ "speed_limit_mode": 1,
+ "show_speed_limits": True,
+ "is_metric": True,
+ "slc_policy": POLICY_MAP_DATA_PRIORITY,
+ "slc_auto_confirm": False,
+ "speed_limit_confirmation_higher": False,
+ "speed_limit_confirmation_lower": False,
+ "map_speed_lookahead_higher": 5.0,
+ "map_speed_lookahead_lower": 5.0,
+ "slc_fallback_experimental_mode": False,
+ "slc_fallback_set_speed": False,
+ "slc_fallback_previous_speed_limit": False,
+ "speed_limit_controller_override_manual": True,
+ "speed_limit_controller_override_set_speed": False,
+ "slc_online_filler": False,
+ }
+
+ v_cruise = 29.0
+ sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=26.0, iq_limit=21.0)
+ out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=26.0, sm=sm)
+
+ assert slc.slc.update_limits_calls == 1
+ assert slc.slc.update_override_calls == 0
+ assert out == v_cruise
+
+
+def test_slc_vcruise_auto_raises_for_higher_limit_when_confirmation_disabled():
+ slc = SLCVCruise()
+ slc.slc = _FakeSLC()
+ slc.slc.target = 20.0
+ slc.slc.source = "Map Data"
+ slc.slc.active_target = 20.0
+ slc.slc.active_source = "Map Data"
+
+ slc._get_slc_params = lambda: {
+ "speed_limit_controller": True,
+ "speed_limit_mode": 3,
+ "show_speed_limits": False,
+ "is_metric": True,
+ "slc_policy": POLICY_MAP_DATA_PRIORITY,
+ "slc_auto_confirm": False,
+ "speed_limit_confirmation_higher": False,
+ "speed_limit_confirmation_lower": False,
+ "map_speed_lookahead_higher": 5.0,
+ "map_speed_lookahead_lower": 5.0,
+ "slc_fallback_experimental_mode": False,
+ "slc_fallback_set_speed": False,
+ "slc_fallback_previous_speed_limit": False,
+ "speed_limit_controller_override_manual": True,
+ "speed_limit_controller_override_set_speed": False,
+ "slc_online_filler": False,
+ }
+
+ v_cruise = 13.5
+ sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=13.5, iq_limit=20.0)
+ out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=13.5, sm=sm)
+
+ assert out > v_cruise
+ assert out == 20.0
+
+
+def test_slc_vcruise_does_not_auto_raise_when_higher_confirmation_enabled():
+ slc = SLCVCruise()
+ slc.slc = _FakeSLC()
+ slc.slc.target = 20.0
+ slc.slc.source = "Map Data"
+ slc.slc.active_target = 20.0
+ slc.slc.active_source = "Map Data"
+
+ slc._get_slc_params = lambda: {
+ "speed_limit_controller": True,
+ "speed_limit_mode": 3,
+ "show_speed_limits": False,
+ "is_metric": True,
+ "slc_policy": POLICY_MAP_DATA_PRIORITY,
+ "slc_auto_confirm": False,
+ "speed_limit_confirmation_higher": True,
+ "speed_limit_confirmation_lower": False,
+ "map_speed_lookahead_higher": 5.0,
+ "map_speed_lookahead_lower": 5.0,
+ "slc_fallback_experimental_mode": False,
+ "slc_fallback_set_speed": False,
+ "slc_fallback_previous_speed_limit": False,
+ "speed_limit_controller_override_manual": True,
+ "speed_limit_controller_override_set_speed": False,
+ "slc_online_filler": False,
+ }
+
+ v_cruise = 13.5
+ sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=13.5, iq_limit=20.0)
+ out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=13.5, sm=sm)
+
+ assert out == v_cruise
+
+
+class _FakeSM(dict):
+ def __init__(self, services, alive=None):
+ super().__init__(services)
+ self.alive = alive or {}
+
+
+def _construction_sm(active=True, alive=True, iq_limit=0.0):
+ sm = _FakeSM(_build_sm(iq_limit=iq_limit))
+ sm["iqConstructionZone"] = SimpleNamespace(active=active, orangeFraction=0.001, secondsSinceHit=1.0)
+ sm.alive = {"iqConstructionZone": alive}
+ return sm
+
+
+def _construction_controller():
+ params = FakeParams()
+ controller = SpeedLimitController(params)
+ controller.update_gps = lambda _sm: None
+ controller._resolver.update_map_data = lambda *_args, **_kwargs: None
+ controller.get_mapbox_speed_limit = lambda *_args, **_kwargs: None
+ controller.mapbox_requests["total_requests"] = 0
+ controller.mapbox_requests["max_requests"] = 999999
+ return controller
+
+
+def _construction_slc_params():
+ slc_params = _base_slc_params_controller()
+ slc_params["slc_online_filler"] = False
+ slc_params["construction_zone_assist"] = True
+ slc_params["construction_zone_speed"] = 60.0
+ slc_params["is_metric"] = False
+ return slc_params
+
+
+def test_construction_zone_clamps_higher_limit():
+ controller = _construction_controller()
+ controller._resolver.map_speed_limit = 31.3 # ~70 mph
+ sm = _construction_sm()
+
+ controller.update_limits(0.0, None, True, 33.0, 30.0, sm, _construction_slc_params())
+ assert controller.active_source == "Construction"
+ assert abs(controller.active_target - 60.0 * CV.MPH_TO_MS) < 1e-6
+
+
+def test_construction_zone_does_not_raise_lower_limit():
+ controller = _construction_controller()
+ controller._resolver.map_speed_limit = 20.0 # below the 60 mph clamp
+ sm = _construction_sm()
+
+ controller.update_limits(0.0, None, True, 33.0, 30.0, sm, _construction_slc_params())
+ assert controller.active_source == "Map Data"
+ assert controller.active_target == 20.0
+
+
+def test_construction_zone_applies_without_other_sources():
+ controller = _construction_controller()
+ controller._resolver.map_speed_limit = 0.0
+ sm = _construction_sm()
+
+ controller.update_limits(0.0, None, True, 33.0, 30.0, sm, _construction_slc_params())
+ assert controller.active_source == "Construction"
+ assert abs(controller.active_target - 60.0 * CV.MPH_TO_MS) < 1e-6
+
+
+def test_construction_zone_ignored_when_not_alive_or_inactive_or_disabled():
+ for kwargs, slc_toggle in (
+ (dict(alive=False), True),
+ (dict(active=False), True),
+ (dict(), False),
+ ):
+ controller = _construction_controller()
+ controller._resolver.map_speed_limit = 31.3
+ sm = _construction_sm(**kwargs)
+ slc_params = _construction_slc_params()
+ slc_params["construction_zone_assist"] = slc_toggle
+
+ controller.update_limits(0.0, None, True, 33.0, 30.0, sm, slc_params)
+ assert controller.active_source == "Map Data"
+ assert controller.active_target == 31.3
+
+
+def test_construction_zone_metric_speed_units():
+ controller = _construction_controller()
+ controller._resolver.map_speed_limit = 33.0
+ sm = _construction_sm()
+ slc_params = _construction_slc_params()
+ slc_params["is_metric"] = True
+ slc_params["construction_zone_speed"] = 100.0 # kph
+
+ controller.update_limits(0.0, None, True, 36.0, 33.0, sm, slc_params)
+ assert controller.active_source == "Construction"
+ assert abs(controller.active_target - 100.0 * CV.KPH_TO_MS) < 1e-6
+
+
+def test_construction_zone_never_raises_cruise_even_with_auto_raise():
+ slc = SLCVCruise()
+ slc.slc = _FakeSLC()
+ slc.slc.target = 60.0 * CV.MPH_TO_MS
+ slc.slc.source = "Construction"
+ slc.slc.active_target = slc.slc.target
+ slc.slc.active_source = "Construction"
+ slc.slc._offset = 2.0 # must be ignored for Construction
+
+ slc._get_slc_params = lambda: {
+ "speed_limit_controller": True,
+ "speed_limit_mode": 3,
+ "show_speed_limits": False,
+ "is_metric": False,
+ "slc_policy": POLICY_MAP_DATA_PRIORITY,
+ "slc_auto_confirm": False,
+ "speed_limit_confirmation_higher": False, # auto-raise allowed
+ "speed_limit_confirmation_lower": False,
+ "map_speed_lookahead_higher": 5.0,
+ "map_speed_lookahead_lower": 5.0,
+ "slc_fallback_experimental_mode": False,
+ "slc_fallback_set_speed": False,
+ "slc_fallback_previous_speed_limit": False,
+ "speed_limit_controller_override_manual": True,
+ "speed_limit_controller_override_set_speed": False,
+ "slc_online_filler": False,
+ "construction_zone_assist": True,
+ "construction_zone_speed": 60.0,
+ }
+
+ # user cruising below the construction clamp: must not be raised to it
+ v_cruise = 22.0
+ sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=22.0)
+ out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=22.0, sm=sm)
+ assert out == v_cruise
+ assert slc.slc_offset == 0
+
+ # user cruising above it: clamped down
+ v_cruise = 33.0
+ sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=33.0)
+ out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=33.0, sm=sm)
+ assert abs(out - 60.0 * CV.MPH_TO_MS) < 1e-6
+
+
+def _offset_controller(pct1=10.0, pct2=5.0, pct3=8.0):
+ params = FakeParams()
+ params.put("speed_limit_offset1", pct1)
+ params.put("speed_limit_offset2", pct2)
+ params.put("speed_limit_offset3", pct3)
+ controller = SpeedLimitController(params)
+ controller._assist.source = "Map Data"
+ return controller
+
+
+def test_get_offset_percent_per_zone():
+ controller = _offset_controller()
+
+ controller._assist.target = 6.7 # ~15 mph -> zone 1
+ assert abs(controller.get_offset(False) - 6.7 * 0.10) < 1e-9
+
+ controller._assist.target = 13.4 # ~30 mph -> zone 2
+ assert abs(controller.get_offset(False) - 13.4 * 0.05) < 1e-9
+
+ controller._assist.target = 31.3 # ~70 mph -> zone 3 (open-ended)
+ assert abs(controller.get_offset(False) - 31.3 * 0.08) < 1e-9
+
+
+def test_get_offset_zone_lower_bound_inclusive():
+ controller = _offset_controller()
+ boundary = OFFSET_MAP_IMPERIAL[1][0]
+ controller._assist.target = boundary
+ assert abs(controller.get_offset(False) - boundary * 0.05) < 1e-9
+
+
+def test_get_offset_zero_without_real_limit_source():
+ for source in ("None", "Construction"):
+ controller = _offset_controller()
+ controller._assist.source = source
+ controller._assist.target = 30.0
+ assert controller.get_offset(False) == 0.0
+
+
+def test_get_offset_percent_clamped():
+ controller = _offset_controller(pct3=500.0)
+ controller._assist.target = 30.0
+ assert abs(controller.get_offset(False) - 30.0 * 0.50) < 1e-9
+
+
+def test_construction_zone_fires_event_once_per_zone_entry():
+ from cereal import custom
+ event = custom.IQOnroadEvent.EventName.constructionZoneDetected
+
+ controller = _construction_controller()
+ controller._resolver.map_speed_limit = 31.3
+ slc_params = _construction_slc_params()
+
+ controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(), slc_params)
+ assert event in controller.pending_events
+
+ controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(), slc_params)
+ assert event not in controller.pending_events
+
+ # zone releases, then a new zone: fires again
+ controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(active=False), slc_params)
+ assert event not in controller.pending_events
+ controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(), slc_params)
+ assert event in controller.pending_events
diff --git a/iqpilot/selfdrive/controls/lib/tests/test_smooth_stops.py b/iqpilot/selfdrive/controls/lib/tests/test_smooth_stops.py
new file mode 100644
index 000000000..678763a33
--- /dev/null
+++ b/iqpilot/selfdrive/controls/lib/tests/test_smooth_stops.py
@@ -0,0 +1,100 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Original concept and implementation by SpysyWeeb (github.com/SpysyWeeb)
+"""
+from openpilot.common.realtime import DT_CTRL
+from openpilot.iqpilot.selfdrive.controls.lib.smooth_stops import (
+ SmoothStopController,
+ read_smooth_stops_enabled,
+ STANDSTILL_SPEED,
+ STANDSTILL_HOLD_SPEED,
+ SETTLE_DECEL,
+ TAPER_SPEED,
+ STOP_KISS_DECEL,
+ SETTLE_JERK,
+ EMERGENCY_DECEL,
+)
+
+JERK_STEP = SETTLE_JERK * DT_CTRL
+
+
+def _build(enabled=True):
+ c = SmoothStopController.__new__(SmoothStopController)
+ c.enabled = enabled
+ c._v_min = float("inf")
+ c._stall_s = 0.0
+ return c
+
+
+def test_unified_toggle_reads_force_stops():
+ seen = {}
+
+ class FakeParams:
+ def get_bool(self, key):
+ seen["key"] = key
+ return True
+
+ assert read_smooth_stops_enabled(FakeParams()) is True
+ assert seen["key"] == "IQForceStops"
+
+
+def test_hold_only_arms_at_standstill():
+ c = _build()
+ assert not c.want_hold(True, 0.5, False)
+ assert not c.want_hold(True, STANDSTILL_SPEED + 0.05, False)
+ assert not c.want_hold(True, 1.0, True)
+ assert not c.want_hold(True, STANDSTILL_HOLD_SPEED + 0.05, True)
+ assert c.want_hold(True, STANDSTILL_SPEED - 0.01, False)
+ assert c.want_hold(True, STANDSTILL_HOLD_SPEED - 0.01, True)
+ assert not c.want_hold(False, 0.0, True)
+
+
+def test_settle_feathers_toward_baseline():
+ c = _build()
+ out = c.settle(a_target=0.0, v_ego=1.0, lead_distance=0.0, has_lead=False, last_output=0.0)
+ assert out == -JERK_STEP
+
+
+def test_settle_never_softer_than_mpc():
+ c = _build()
+ out = c.settle(a_target=-2.0, v_ego=1.0, lead_distance=0.0, has_lead=False, last_output=-1.0)
+ assert out == -1.0 - JERK_STEP
+ assert out < -1.0
+
+
+def test_settle_emergency_bypasses_jerk_limit():
+ c = _build()
+ out = c.settle(a_target=-3.4, v_ego=2.0, lead_distance=0.0, has_lead=False, last_output=0.0)
+ assert out == -3.4
+ assert out <= -EMERGENCY_DECEL
+
+
+def test_settle_lead_firms_up_when_close():
+ c = _build()
+ assert c.settle(a_target=0.0, v_ego=1.0, lead_distance=50.0, has_lead=True, last_output=-SETTLE_DECEL) == -SETTLE_DECEL
+ c = _build()
+ assert c.settle(a_target=0.0, v_ego=1.0, lead_distance=3.0, has_lead=True, last_output=-1.0) == -1.0
+
+
+def test_settle_anti_creep_firms_up_when_not_slowing():
+ c = _build()
+ out = c.settle(a_target=0.0, v_ego=0.5, lead_distance=0.0, has_lead=False, last_output=-SETTLE_DECEL)
+ for _ in range(60):
+ out = c.settle(a_target=0.0, v_ego=0.5, lead_distance=0.0, has_lead=False, last_output=out)
+ assert out < -SETTLE_DECEL
+
+
+def test_settle_eases_off_near_stop():
+ c = _build()
+ near = c.settle(a_target=0.0, v_ego=0.1, lead_distance=0.0, has_lead=False, last_output=-0.305)
+ c = _build()
+ high = c.settle(a_target=0.0, v_ego=0.9, lead_distance=0.0, has_lead=False, last_output=-0.745)
+ assert near > high
+ assert near == -(STOP_KISS_DECEL + (SETTLE_DECEL - STOP_KISS_DECEL) * (0.1 / TAPER_SPEED))
+
+
+def test_settle_kiss_decel_at_stop():
+ c = _build()
+ out = c.settle(a_target=0.0, v_ego=0.0, lead_distance=0.0, has_lead=False, last_output=-STOP_KISS_DECEL)
+ assert out == -STOP_KISS_DECEL
diff --git a/iqpilot/selfdrive/iqlocd/__init__.py b/iqpilot/selfdrive/iqlocd/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/iqlocd/iqlocd b/iqpilot/selfdrive/iqlocd/iqlocd
new file mode 100755
index 000000000..540881014
Binary files /dev/null and b/iqpilot/selfdrive/iqlocd/iqlocd differ
diff --git a/iqpilot/selfdrive/iqlocd/models/__init__.py b/iqpilot/selfdrive/iqlocd/models/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/iqlocd/models/car_kf.py b/iqpilot/selfdrive/iqlocd/models/car_kf.py
new file mode 100755
index 000000000..4ecfbfe4e
--- /dev/null
+++ b/iqpilot/selfdrive/iqlocd/models/car_kf.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env python3
+import math
+import sys
+from typing import Any
+
+import numpy as np
+
+from openpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY
+from openpilot.iqpilot.selfdrive.iqlocd.models.constants import ObservationKind
+from openpilot.common.swaglog import cloudlog
+
+from rednose.helpers.kalmanfilter import KalmanFilter
+
+if __name__ == '__main__': # Generating sympy
+ import sympy as sp
+ from rednose.helpers.ekf_sym import gen_code
+else:
+ from rednose.helpers.ekf_sym_pyx import EKF_sym_pyx
+
+
+i = 0
+
+def _slice(n):
+ global i
+ s = slice(i, i + n)
+ i += n
+
+ return s
+
+
+class States:
+ # Vehicle model params
+ STIFFNESS = _slice(1) # [-]
+ STEER_RATIO = _slice(1) # [-]
+ ANGLE_OFFSET = _slice(1) # [rad]
+ ANGLE_OFFSET_FAST = _slice(1) # [rad]
+
+ VELOCITY = _slice(2) # (x, y) [m/s]
+ YAW_RATE = _slice(1) # [rad/s]
+ STEER_ANGLE = _slice(1) # [rad]
+ ROAD_ROLL = _slice(1) # [rad]
+
+
+class CarKalman(KalmanFilter):
+ name = 'car'
+
+ initial_x = np.array([
+ 1.0,
+ 15.0,
+ 0.0,
+ 0.0,
+
+ 10.0, 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ])
+
+ # process noise
+ Q = np.diag([
+ (.05 / 100)**2,
+ .01**2,
+ math.radians(0.02)**2,
+ math.radians(0.25)**2,
+
+ .1**2, .01**2,
+ math.radians(0.1)**2,
+ math.radians(0.1)**2,
+ math.radians(1)**2,
+ ])
+ P_initial = Q.copy()
+
+ obs_noise: dict[int, Any] = {
+ ObservationKind.STEER_ANGLE: np.atleast_2d(math.radians(0.05)**2),
+ ObservationKind.ANGLE_OFFSET_FAST: np.atleast_2d(math.radians(10.0)**2),
+ ObservationKind.ROAD_ROLL: np.atleast_2d(math.radians(1.0)**2),
+ ObservationKind.STEER_RATIO: np.atleast_2d(5.0**2),
+ ObservationKind.STIFFNESS: np.atleast_2d(0.5**2),
+ ObservationKind.ROAD_FRAME_X_SPEED: np.atleast_2d(0.1**2),
+ }
+
+ global_vars = [
+ 'mass',
+ 'rotational_inertia',
+ 'center_to_front',
+ 'center_to_rear',
+ 'stiffness_front',
+ 'stiffness_rear',
+ ]
+
+ @staticmethod
+ def generate_code(generated_dir):
+ dim_state = CarKalman.initial_x.shape[0]
+ name = CarKalman.name
+
+ # Linearized single-track lateral dynamics, equations 7.211-7.213
+ # Massimo Guiggiani, The Science of Vehicle Dynamics: Handling, Braking, and Ride of Road and Race Cars
+ # Springer Cham, 2023. doi: https://doi.org/10.1007/978-3-031-06461-6
+
+ # globals
+ global_vars = [sp.Symbol(name) for name in CarKalman.global_vars]
+ m, j, aF, aR, cF_orig, cR_orig = global_vars
+
+ # make functions and jacobians with sympy
+ # state variables
+ state_sym = sp.MatrixSymbol('state', dim_state, 1)
+ state = sp.Matrix(state_sym)
+
+ # Vehicle model constants
+ sf = state[States.STIFFNESS, :][0, 0]
+
+ cF, cR = sf * cF_orig, sf * cR_orig
+ angle_offset = state[States.ANGLE_OFFSET, :][0, 0]
+ angle_offset_fast = state[States.ANGLE_OFFSET_FAST, :][0, 0]
+ theta = state[States.ROAD_ROLL, :][0, 0]
+ sa = state[States.STEER_ANGLE, :][0, 0]
+
+ sR = state[States.STEER_RATIO, :][0, 0]
+ u, v = state[States.VELOCITY, :]
+ r = state[States.YAW_RATE, :][0, 0]
+
+ A = sp.Matrix(np.zeros((2, 2)))
+ A[0, 0] = -(cF + cR) / (m * u)
+ A[0, 1] = -(cF * aF - cR * aR) / (m * u) - u
+ A[1, 0] = -(cF * aF - cR * aR) / (j * u)
+ A[1, 1] = -(cF * aF**2 + cR * aR**2) / (j * u)
+
+ B = sp.Matrix(np.zeros((2, 1)))
+ B[0, 0] = cF / m / sR
+ B[1, 0] = (cF * aF) / j / sR
+
+ C = sp.Matrix(np.zeros((2, 1)))
+ C[0, 0] = ACCELERATION_DUE_TO_GRAVITY
+ C[1, 0] = 0
+
+ x = sp.Matrix([v, r]) # lateral velocity, yaw rate
+ x_dot = A * x + B * (sa - angle_offset - angle_offset_fast) - C * theta
+
+ dt = sp.Symbol('dt')
+ state_dot = sp.Matrix(np.zeros((dim_state, 1)))
+ state_dot[States.VELOCITY.start + 1, 0] = x_dot[0]
+ state_dot[States.YAW_RATE.start, 0] = x_dot[1]
+
+ # Basic descretization, 1st order integrator
+ # Can be pretty bad if dt is big
+ f_sym = state + dt * state_dot
+
+ #
+ # Observation functions
+ #
+ obs_eqs = [
+ [sp.Matrix([r]), ObservationKind.ROAD_FRAME_YAW_RATE, None],
+ [sp.Matrix([u, v]), ObservationKind.ROAD_FRAME_XY_SPEED, None],
+ [sp.Matrix([u]), ObservationKind.ROAD_FRAME_X_SPEED, None],
+ [sp.Matrix([sa]), ObservationKind.STEER_ANGLE, None],
+ [sp.Matrix([angle_offset_fast]), ObservationKind.ANGLE_OFFSET_FAST, None],
+ [sp.Matrix([sR]), ObservationKind.STEER_RATIO, None],
+ [sp.Matrix([sf]), ObservationKind.STIFFNESS, None],
+ [sp.Matrix([theta]), ObservationKind.ROAD_ROLL, None],
+ ]
+
+ gen_code(generated_dir, name, f_sym, dt, state_sym, obs_eqs, dim_state, dim_state, global_vars=global_vars)
+
+ def __init__(self, generated_dir):
+ dim_state, dim_state_err = CarKalman.initial_x.shape[0], CarKalman.P_initial.shape[0]
+ self.filter = EKF_sym_pyx(generated_dir, CarKalman.name, CarKalman.Q, CarKalman.initial_x, CarKalman.P_initial,
+ dim_state, dim_state_err, global_vars=CarKalman.global_vars, logger=cloudlog)
+
+ def set_globals(self, mass, rotational_inertia, center_to_front, center_to_rear, stiffness_front, stiffness_rear):
+ self.filter.set_global("mass", mass)
+ self.filter.set_global("rotational_inertia", rotational_inertia)
+ self.filter.set_global("center_to_front", center_to_front)
+ self.filter.set_global("center_to_rear", center_to_rear)
+ self.filter.set_global("stiffness_front", stiffness_front)
+ self.filter.set_global("stiffness_rear", stiffness_rear)
+
+
+if __name__ == "__main__":
+ generated_dir = sys.argv[2]
+ CarKalman.generate_code(generated_dir)
diff --git a/iqpilot/selfdrive/iqlocd/models/constants.py b/iqpilot/selfdrive/iqlocd/models/constants.py
new file mode 100644
index 000000000..6d328ce6f
--- /dev/null
+++ b/iqpilot/selfdrive/iqlocd/models/constants.py
@@ -0,0 +1,92 @@
+import os
+
+GENERATED_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'generated'))
+
+class ObservationKind:
+ UNKNOWN = 0
+ NO_OBSERVATION = 1
+ GPS_NED = 2
+ ODOMETRIC_SPEED = 3
+ PHONE_GYRO = 4
+ GPS_VEL = 5
+ PSEUDORANGE_GPS = 6
+ PSEUDORANGE_RATE_GPS = 7
+ SPEED = 8
+ NO_ROT = 9
+ PHONE_ACCEL = 10
+ ORB_POINT = 11
+ ECEF_POS = 12
+ CAMERA_ODO_TRANSLATION = 13
+ CAMERA_ODO_ROTATION = 14
+ ORB_FEATURES = 15
+ MSCKF_TEST = 16
+ FEATURE_TRACK_TEST = 17
+ LANE_PT = 18
+ IMU_FRAME = 19
+ PSEUDORANGE_GLONASS = 20
+ PSEUDORANGE_RATE_GLONASS = 21
+ PSEUDORANGE = 22
+ PSEUDORANGE_RATE = 23
+ ECEF_VEL = 35
+ ECEF_ORIENTATION_FROM_GPS = 32
+ NO_ACCEL = 33
+ ORB_FEATURES_WIDE = 34
+
+ ROAD_FRAME_XY_SPEED = 24 # (x, y) [m/s]
+ ROAD_FRAME_YAW_RATE = 25 # [rad/s]
+ STEER_ANGLE = 26 # [rad]
+ ANGLE_OFFSET_FAST = 27 # [rad]
+ STIFFNESS = 28 # [-]
+ STEER_RATIO = 29 # [-]
+ ROAD_FRAME_X_SPEED = 30 # (x) [m/s]
+ ROAD_ROLL = 31 # [rad]
+
+ names = [
+ 'Unknown',
+ 'No observation',
+ 'GPS NED',
+ 'Odometric speed',
+ 'Phone gyro',
+ 'GPS velocity',
+ 'GPS pseudorange',
+ 'GPS pseudorange rate',
+ 'Speed',
+ 'No rotation',
+ 'Phone acceleration',
+ 'ORB point',
+ 'ECEF pos',
+ 'camera odometric translation',
+ 'camera odometric rotation',
+ 'ORB features',
+ 'MSCKF test',
+ 'Feature track test',
+ 'Lane ecef point',
+ 'imu frame eulers',
+ 'GLONASS pseudorange',
+ 'GLONASS pseudorange rate',
+ 'pseudorange',
+ 'pseudorange rate',
+
+ 'Road Frame x,y speed',
+ 'Road Frame yaw rate',
+ 'Steer Angle',
+ 'Fast Angle Offset',
+ 'Stiffness',
+ 'Steer Ratio',
+ 'Road Frame x speed',
+ 'Road Roll',
+ 'ECEF orientation from GPS',
+ 'NO accel',
+ 'ORB features wide camera',
+ 'ECEF_VEL',
+ ]
+
+ @classmethod
+ def to_string(cls, kind):
+ return cls.names[kind]
+
+
+SAT_OBS = [ObservationKind.PSEUDORANGE_GPS,
+ ObservationKind.PSEUDORANGE_RATE_GPS,
+ ObservationKind.PSEUDORANGE_GLONASS,
+ ObservationKind.PSEUDORANGE_RATE_GLONASS]
diff --git a/iqpilot/selfdrive/iqlocd/models/generated/libcar.so b/iqpilot/selfdrive/iqlocd/models/generated/libcar.so
new file mode 100755
index 000000000..39b910429
Binary files /dev/null and b/iqpilot/selfdrive/iqlocd/models/generated/libcar.so differ
diff --git a/iqpilot/selfdrive/iqlocd/models/generated/liborbit.so b/iqpilot/selfdrive/iqlocd/models/generated/liborbit.so
new file mode 100755
index 000000000..dda34126a
Binary files /dev/null and b/iqpilot/selfdrive/iqlocd/models/generated/liborbit.so differ
diff --git a/iqpilot/selfdrive/iqlocd/models/orbit_kf.py b/iqpilot/selfdrive/iqlocd/models/orbit_kf.py
new file mode 100755
index 000000000..17680dde9
--- /dev/null
+++ b/iqpilot/selfdrive/iqlocd/models/orbit_kf.py
@@ -0,0 +1,242 @@
+#!/usr/bin/env python3
+
+import sys
+import os
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqlocd.models.constants import ObservationKind
+
+import sympy as sp
+import inspect
+from rednose.helpers.sympy_helpers import euler_rotate, quat_matrix_r, quat_rotate
+from rednose.helpers.ekf_sym import gen_code
+
+EARTH_GM = 3.986005e14 # m^3/s^2 (gravitational constant * mass of earth)
+
+
+def numpy2eigenstring(arr):
+ assert(len(arr.shape) == 1)
+ arr_str = np.array2string(arr, precision=20, separator=',')[1:-1].replace(' ', '').replace('\n', '')
+ return f"(Eigen::VectorXd({len(arr)}) << {arr_str}).finished()"
+
+
+class States:
+ ECEF_POS = slice(0, 3) # x, y and z in ECEF in meters
+ ECEF_ORIENTATION = slice(3, 7) # quat for pose of phone in ecef
+ ECEF_VELOCITY = slice(7, 10) # ecef velocity in m/s
+ ANGULAR_VELOCITY = slice(10, 13) # roll, pitch and yaw rates in device frame in radians/s
+ GYRO_BIAS = slice(13, 16) # roll, pitch and yaw biases
+ ACCELERATION = slice(16, 19) # Acceleration in device frame in m/s**2
+ ACC_BIAS = slice(19, 22) # Acceletometer bias in m/s**2
+
+ # Error-state has different slices because it is an ESKF
+ ECEF_POS_ERR = slice(0, 3)
+ ECEF_ORIENTATION_ERR = slice(3, 6) # euler angles for orientation error
+ ECEF_VELOCITY_ERR = slice(6, 9)
+ ANGULAR_VELOCITY_ERR = slice(9, 12)
+ GYRO_BIAS_ERR = slice(12, 15)
+ ACCELERATION_ERR = slice(15, 18)
+ ACC_BIAS_ERR = slice(18, 21)
+
+
+class OrbitScopeModel:
+ name = 'orbit'
+
+ initial_x = np.array([3.88e6, -3.37e6, 3.76e6,
+ 0.42254641, -0.31238054, -0.83602975, -0.15788347, # NED [0,0,0] -> ECEF Quat
+ 0, 0, 0,
+ 0, 0, 0,
+ 0, 0, 0,
+ 0, 0, 0,
+ 0, 0, 0])
+
+ # state covariance
+ initial_P_diag = np.array([10**2, 10**2, 10**2,
+ 0.01**2, 0.01**2, 0.01**2,
+ 10**2, 10**2, 10**2,
+ 1**2, 1**2, 1**2,
+ 1**2, 1**2, 1**2,
+ 100**2, 100**2, 100**2,
+ 0.01**2, 0.01**2, 0.01**2])
+
+ # state covariance when resetting midway in a segment
+ reset_orientation_diag = np.array([1**2, 1**2, 1**2])
+
+ # fake observation covariance, to ensure the uncertainty estimate of the filter is under control
+ fake_gps_pos_cov_diag = np.array([1000**2, 1000**2, 1000**2])
+ fake_gps_vel_cov_diag = np.array([10**2, 10**2, 10**2])
+
+ # process noise
+ Q_diag = np.array([0.03**2, 0.03**2, 0.03**2,
+ 0.001**2, 0.001**2, 0.001**2,
+ 0.01**2, 0.01**2, 0.01**2,
+ 0.1**2, 0.1**2, 0.1**2,
+ (0.005 / 100)**2, (0.005 / 100)**2, (0.005 / 100)**2,
+ 3**2, 3**2, 3**2,
+ 0.005**2, 0.005**2, 0.005**2])
+
+ obs_noise_diag = {ObservationKind.PHONE_GYRO: np.array([0.025**2, 0.025**2, 0.025**2]),
+ ObservationKind.PHONE_ACCEL: np.array([.5**2, .5**2, .5**2]),
+ ObservationKind.CAMERA_ODO_ROTATION: np.array([0.05**2, 0.05**2, 0.05**2]),
+ ObservationKind.NO_ROT: np.array([0.005**2, 0.005**2, 0.005**2]),
+ ObservationKind.NO_ACCEL: np.array([0.05**2, 0.05**2, 0.05**2]),
+ ObservationKind.ECEF_POS: np.array([5**2, 5**2, 5**2]),
+ ObservationKind.ECEF_VEL: np.array([.5**2, .5**2, .5**2]),
+ ObservationKind.ECEF_ORIENTATION_FROM_GPS: np.array([.2**2, .2**2, .2**2, .2**2])}
+
+ @staticmethod
+ def generate_code(generated_dir):
+ name = OrbitScopeModel.name
+ dim_state = OrbitScopeModel.initial_x.shape[0]
+ dim_state_err = OrbitScopeModel.initial_P_diag.shape[0]
+
+ state_sym = sp.MatrixSymbol('state', dim_state, 1)
+ state = sp.Matrix(state_sym)
+ x, y, z = state[States.ECEF_POS, :]
+ q = state[States.ECEF_ORIENTATION, :]
+ v = state[States.ECEF_VELOCITY, :]
+ vx, vy, vz = v
+ omega = state[States.ANGULAR_VELOCITY, :]
+ vroll, vpitch, vyaw = omega
+ roll_bias, pitch_bias, yaw_bias = state[States.GYRO_BIAS, :]
+ acceleration = state[States.ACCELERATION, :]
+ acc_bias = state[States.ACC_BIAS, :]
+
+ dt = sp.Symbol('dt')
+
+ # calibration and attitude rotation matrices
+ quat_rot = quat_rotate(*q)
+
+ # Got the quat predict equations from here
+ # A New Quaternion-Based Kalman Filter for
+ # Real-Time Attitude Estimation Using the Two-Step
+ # Geometrically-Intuitive Correction Algorithm
+ A = 0.5 * sp.Matrix([[0, -vroll, -vpitch, -vyaw],
+ [vroll, 0, vyaw, -vpitch],
+ [vpitch, -vyaw, 0, vroll],
+ [vyaw, vpitch, -vroll, 0]])
+ q_dot = A * q
+
+ # Time derivative of the state as a function of state
+ state_dot = sp.Matrix(np.zeros((dim_state, 1)))
+ state_dot[States.ECEF_POS, :] = v
+ state_dot[States.ECEF_ORIENTATION, :] = q_dot
+ state_dot[States.ECEF_VELOCITY, 0] = quat_rot * acceleration
+
+ # Basic descretization, 1st order intergrator
+ # Can be pretty bad if dt is big
+ f_sym = state + dt * state_dot
+
+ state_err_sym = sp.MatrixSymbol('state_err', dim_state_err, 1)
+ state_err = sp.Matrix(state_err_sym)
+ quat_err = state_err[States.ECEF_ORIENTATION_ERR, :]
+ v_err = state_err[States.ECEF_VELOCITY_ERR, :]
+ omega_err = state_err[States.ANGULAR_VELOCITY_ERR, :]
+ acceleration_err = state_err[States.ACCELERATION_ERR, :]
+
+ # Time derivative of the state error as a function of state error and state
+ quat_err_matrix = euler_rotate(quat_err[0], quat_err[1], quat_err[2])
+ q_err_dot = quat_err_matrix * quat_rot * (omega + omega_err)
+ state_err_dot = sp.Matrix(np.zeros((dim_state_err, 1)))
+ state_err_dot[States.ECEF_POS_ERR, :] = v_err
+ state_err_dot[States.ECEF_ORIENTATION_ERR, :] = q_err_dot
+ state_err_dot[States.ECEF_VELOCITY_ERR, :] = quat_err_matrix * quat_rot * (acceleration + acceleration_err)
+ f_err_sym = state_err + dt * state_err_dot
+
+ # Observation matrix modifier
+ H_mod_sym = sp.Matrix(np.zeros((dim_state, dim_state_err)))
+ H_mod_sym[States.ECEF_POS, States.ECEF_POS_ERR] = np.eye(States.ECEF_POS.stop - States.ECEF_POS.start)
+ H_mod_sym[States.ECEF_ORIENTATION, States.ECEF_ORIENTATION_ERR] = 0.5 * quat_matrix_r(state[3:7])[:, 1:]
+ H_mod_sym[States.ECEF_ORIENTATION.stop:, States.ECEF_ORIENTATION_ERR.stop:] = np.eye(dim_state - States.ECEF_ORIENTATION.stop)
+
+ # these error functions are defined so that say there
+ # is a nominal x and true x:
+ # true x = err_function(nominal x, delta x)
+ # delta x = inv_err_function(nominal x, true x)
+ nom_x = sp.MatrixSymbol('nom_x', dim_state, 1)
+ true_x = sp.MatrixSymbol('true_x', dim_state, 1)
+ delta_x = sp.MatrixSymbol('delta_x', dim_state_err, 1)
+
+ err_function_sym = sp.Matrix(np.zeros((dim_state, 1)))
+ delta_quat = sp.Matrix(np.ones(4))
+ delta_quat[1:, :] = sp.Matrix(0.5 * delta_x[States.ECEF_ORIENTATION_ERR, :])
+ err_function_sym[States.ECEF_POS, :] = sp.Matrix(nom_x[States.ECEF_POS, :] + delta_x[States.ECEF_POS_ERR, :])
+ err_function_sym[States.ECEF_ORIENTATION, 0] = quat_matrix_r(nom_x[States.ECEF_ORIENTATION, 0]) * delta_quat
+ err_function_sym[States.ECEF_ORIENTATION.stop:, :] = sp.Matrix(nom_x[States.ECEF_ORIENTATION.stop:, :] + delta_x[States.ECEF_ORIENTATION_ERR.stop:, :])
+
+ inv_err_function_sym = sp.Matrix(np.zeros((dim_state_err, 1)))
+ inv_err_function_sym[States.ECEF_POS_ERR, 0] = sp.Matrix(-nom_x[States.ECEF_POS, 0] + true_x[States.ECEF_POS, 0])
+ delta_quat = quat_matrix_r(nom_x[States.ECEF_ORIENTATION, 0]).T * true_x[States.ECEF_ORIENTATION, 0]
+ inv_err_function_sym[States.ECEF_ORIENTATION_ERR, 0] = sp.Matrix(2 * delta_quat[1:])
+ inv_err_function_sym[States.ECEF_ORIENTATION_ERR.stop:, 0] = sp.Matrix(-nom_x[States.ECEF_ORIENTATION.stop:, 0] + true_x[States.ECEF_ORIENTATION.stop:, 0])
+
+ eskf_params = [[err_function_sym, nom_x, delta_x],
+ [inv_err_function_sym, nom_x, true_x],
+ H_mod_sym, f_err_sym, state_err_sym]
+ #
+ # Observation functions
+ #
+ h_gyro_sym = sp.Matrix([
+ vroll + roll_bias,
+ vpitch + pitch_bias,
+ vyaw + yaw_bias])
+
+ pos = sp.Matrix([x, y, z])
+ gravity = quat_rot.T * ((EARTH_GM / ((x**2 + y**2 + z**2)**(3.0 / 2.0))) * pos)
+ h_acc_sym = (gravity + acceleration + acc_bias)
+ h_acc_stationary_sym = acceleration
+ h_phone_rot_sym = sp.Matrix([vroll, vpitch, vyaw])
+ h_pos_sym = sp.Matrix([x, y, z])
+ h_vel_sym = sp.Matrix([vx, vy, vz])
+ h_orientation_sym = q
+ h_relative_motion = sp.Matrix(quat_rot.T * v)
+
+ obs_eqs = [[h_gyro_sym, ObservationKind.PHONE_GYRO, None],
+ [h_phone_rot_sym, ObservationKind.NO_ROT, None],
+ [h_acc_sym, ObservationKind.PHONE_ACCEL, None],
+ [h_pos_sym, ObservationKind.ECEF_POS, None],
+ [h_vel_sym, ObservationKind.ECEF_VEL, None],
+ [h_orientation_sym, ObservationKind.ECEF_ORIENTATION_FROM_GPS, None],
+ [h_relative_motion, ObservationKind.CAMERA_ODO_TRANSLATION, None],
+ [h_phone_rot_sym, ObservationKind.CAMERA_ODO_ROTATION, None],
+ [h_acc_stationary_sym, ObservationKind.NO_ACCEL, None]]
+
+ # this returns a sympy routine for the jacobian of the observation function of the local vel
+ in_vec = sp.MatrixSymbol('in_vec', 6, 1) # roll, pitch, yaw, vx, vy, vz
+ h = euler_rotate(in_vec[0], in_vec[1], in_vec[2]).T * (sp.Matrix([in_vec[3], in_vec[4], in_vec[5]]))
+ extra_routines = [('H', h.jacobian(in_vec), [in_vec])]
+
+ gen_code(generated_dir, name, f_sym, dt, state_sym, obs_eqs, dim_state, dim_state_err, eskf_params, extra_routines=extra_routines)
+
+ # write constants to extra header file for use in cpp
+ orbit_header = "#pragma once\n\n"
+ orbit_header += "#include \n"
+ orbit_header += "#include \n\n"
+ for state, slc in inspect.getmembers(States, lambda x: isinstance(x, slice)):
+ assert(slc.step is None) # unsupported
+ orbit_header += f'#define STATE_{state}_START {slc.start}\n'
+ orbit_header += f'#define STATE_{state}_END {slc.stop}\n'
+ orbit_header += f'#define STATE_{state}_LEN {slc.stop - slc.start}\n'
+ orbit_header += "\n"
+
+ for kind, val in inspect.getmembers(ObservationKind, lambda x: isinstance(x, int)):
+ orbit_header += f'#define OBSERVATION_{kind} {val}\n'
+ orbit_header += "\n"
+
+ orbit_header += f"static const Eigen::VectorXd orbit_initial_x = {numpy2eigenstring(OrbitScopeModel.initial_x)};\n"
+ orbit_header += f"static const Eigen::VectorXd orbit_initial_P_diag = {numpy2eigenstring(OrbitScopeModel.initial_P_diag)};\n"
+ orbit_header += f"static const Eigen::VectorXd orbit_fake_gps_pos_cov_diag = {numpy2eigenstring(OrbitScopeModel.fake_gps_pos_cov_diag)};\n"
+ orbit_header += f"static const Eigen::VectorXd orbit_fake_gps_vel_cov_diag = {numpy2eigenstring(OrbitScopeModel.fake_gps_vel_cov_diag)};\n"
+ orbit_header += f"static const Eigen::VectorXd orbit_reset_orientation_diag = {numpy2eigenstring(OrbitScopeModel.reset_orientation_diag)};\n"
+ orbit_header += f"static const Eigen::VectorXd orbit_Q_diag = {numpy2eigenstring(OrbitScopeModel.Q_diag)};\n"
+ orbit_header += "static const std::unordered_map> orbit_obs_noise_diag = {\n"
+ for kind, noise in OrbitScopeModel.obs_noise_diag.items():
+ orbit_header += f" {{ {kind}, {numpy2eigenstring(noise)} }},\n"
+ orbit_header += "};\n\n"
+
+ open(os.path.join(generated_dir, "orbit_state_constants.h"), 'w').write(orbit_header)
+
+
+if __name__ == "__main__":
+ generated_dir = sys.argv[2]
+ OrbitScopeModel.generate_code(generated_dir)
diff --git a/iqpilot/selfdrive/iqlocd/tests/__init__.py b/iqpilot/selfdrive/iqlocd/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/iqlocd/tests/test_iqlocd.py b/iqpilot/selfdrive/iqlocd/tests/test_iqlocd.py
new file mode 100644
index 000000000..96fa5cb8c
--- /dev/null
+++ b/iqpilot/selfdrive/iqlocd/tests/test_iqlocd.py
@@ -0,0 +1,94 @@
+import pytest
+import platform
+import json
+import random
+import time
+import capnp
+
+import cereal.messaging as messaging
+from cereal.services import SERVICE_LIST
+from openpilot.common.params import Params
+from openpilot.common.transformations.coordinates import ecef2geodetic
+
+from openpilot.system.manager.process_config import managed_processes
+
+
+if platform.system() == 'Darwin':
+ pytest.skip("Skipping locationd test on macOS due to unsupported msgq.", allow_module_level=True)
+
+
+class TestIQLocdProc:
+ LLD_MSGS = ['gpsLocationExternal', 'cameraOdometry', 'carState', 'liveCalibration',
+ 'accelerometer', 'gyroscope', 'magnetometer']
+
+ def setup_method(self):
+ self.pm = messaging.PubMaster(self.LLD_MSGS)
+
+ self.params = Params()
+ self.params.put_bool("UbloxAvailable", True)
+ managed_processes['iqlocd'].prepare()
+ managed_processes['iqlocd'].start()
+
+ def teardown_method(self):
+ managed_processes['iqlocd'].stop()
+
+ def get_msg(self, name, t):
+ try:
+ msg = messaging.new_message(name)
+ except capnp.lib.capnp.KjException:
+ msg = messaging.new_message(name, 0)
+
+ if name == "gpsLocationExternal":
+ msg.gpsLocationExternal.flags = 1
+ msg.gpsLocationExternal.hasFix = True
+ msg.gpsLocationExternal.verticalAccuracy = 1.0
+ msg.gpsLocationExternal.speedAccuracy = 1.0
+ msg.gpsLocationExternal.bearingAccuracyDeg = 1.0
+ msg.gpsLocationExternal.vNED = [0.0, 0.0, 0.0]
+ msg.gpsLocationExternal.latitude = float(self.lat)
+ msg.gpsLocationExternal.longitude = float(self.lon)
+ msg.gpsLocationExternal.unixTimestampMillis = t * 1e6
+ msg.gpsLocationExternal.altitude = float(self.alt)
+ #if name == "gnssMeasurements":
+ # msg.gnssMeasurements.measTime = t
+ # msg.gnssMeasurements.positionECEF.value = [self.x , self.y, self.z]
+ # msg.gnssMeasurements.positionECEF.std = [0,0,0]
+ # msg.gnssMeasurements.positionECEF.valid = True
+ # msg.gnssMeasurements.velocityECEF.value = []
+ # msg.gnssMeasurements.velocityECEF.std = [0,0,0]
+ # msg.gnssMeasurements.velocityECEF.valid = True
+ elif name == 'cameraOdometry':
+ msg.cameraOdometry.rot = [0.0, 0.0, 0.0]
+ msg.cameraOdometry.rotStd = [0.0, 0.0, 0.0]
+ msg.cameraOdometry.trans = [0.0, 0.0, 0.0]
+ msg.cameraOdometry.transStd = [0.0, 0.0, 0.0]
+ msg.logMonoTime = t
+ msg.valid = True
+ return msg
+
+ def test_params_gps(self):
+ random.seed(123489234)
+ self.params.remove('LastGPSPositionIQLoc')
+
+ self.x = -2710700 + (random.random() * 1e5)
+ self.y = -4280600 + (random.random() * 1e5)
+ self.z = 3850300 + (random.random() * 1e5)
+ self.lat, self.lon, self.alt = ecef2geodetic([self.x, self.y, self.z])
+
+ # get fake messages at the correct frequency, listed in services.py
+ msgs = []
+ for sec in range(65):
+ for name in self.LLD_MSGS:
+ for j in range(int(SERVICE_LIST[name].frequency)):
+ msgs.append(self.get_msg(name, int((sec + j / SERVICE_LIST[name].frequency) * 1e9)))
+
+ for msg in sorted(msgs, key=lambda x: x.logMonoTime):
+ self.pm.send(msg.which(), msg)
+ if msg.which() == "cameraOdometry":
+ self.pm.wait_for_readers_to_update(msg.which(), 0.1, dt=0.005)
+ time.sleep(1) # wait for async params write
+
+ lastGPS = json.loads(self.params.get('LastGPSPositionIQLoc'))
+ assert lastGPS['latitude'] == pytest.approx(self.lat, abs=0.001)
+ assert lastGPS['longitude'] == pytest.approx(self.lon, abs=0.001)
+ assert lastGPS['altitude'] == pytest.approx(self.alt, abs=0.001)
diff --git a/iqpilot/selfdrive/iqmodeld/.gitignore b/iqpilot/selfdrive/iqmodeld/.gitignore
new file mode 100644
index 000000000..742d3d120
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/.gitignore
@@ -0,0 +1 @@
+*_pyx.cpp
diff --git a/iqpilot/selfdrive/iqmodeld/__init__.py b/iqpilot/selfdrive/iqmodeld/__init__.py
new file mode 100644
index 000000000..0b73f364a
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/__init__.py
@@ -0,0 +1,23 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from pathlib import Path
+
+
+def _models_dir() -> Path:
+ return Path(__file__).resolve().parent / "models"
+
+
+def _artifact_path(stem: str, suffix: str) -> Path:
+ return _models_dir() / f"{stem}{suffix}"
+
+
+MODEL_ASSETS = {
+ "onnx": _artifact_path("supercombo", ".onnx"),
+ "tinygrad": _artifact_path("supercombo", "_tinygrad.pkl"),
+ "metadata": _artifact_path("supercombo", "_metadata.pkl"),
+}
+
+MODEL_PATH = MODEL_ASSETS["onnx"]
+MODEL_PKL_PATH = MODEL_ASSETS["tinygrad"]
+METADATA_PATH = MODEL_ASSETS["metadata"]
diff --git a/iqpilot/selfdrive/iqmodeld/camera.py b/iqpilot/selfdrive/iqmodeld/camera.py
new file mode 100644
index 000000000..1f13734a1
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/camera.py
@@ -0,0 +1,68 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+import numpy as np
+
+from openpilot.common.transformations.camera import DEVICE_CAMERAS
+
+MAX_CAMERA_OFFSET_METERS = 0.35
+
+
+class _OffsetSmoother:
+ def __init__(self, blend: float = 0.1):
+ self._blend = blend
+ self._value = 0.0
+
+ def step(self, target: float) -> float:
+ self._value = ((1.0 - self._blend) * self._value) + (self._blend * float(target))
+ return self._value
+
+
+def _clamped_offset(raw_offset) -> float:
+ try:
+ parsed = float(raw_offset)
+ except (TypeError, ValueError):
+ parsed = 0.0
+ return float(np.clip(parsed, -MAX_CAMERA_OFFSET_METERS, MAX_CAMERA_OFFSET_METERS))
+
+
+def _camera_profile(sm):
+ return DEVICE_CAMERAS[(str(sm["deviceState"].deviceType), str(sm["roadCameraState"].sensor))]
+
+
+def _calibration_height(sm) -> float:
+ return sm["liveCalibration"].height[0] if sm["liveCalibration"].height else 1.22
+
+
+def _sheared_transform(model_transform, intrinsics, height: float, lateral_offset: float):
+ optical_center_y = intrinsics[1, 2]
+ projection_bias = np.eye(3, dtype=np.float32)
+ projection_bias[0, 1] = lateral_offset / height
+ projection_bias[0, 2] = -(lateral_offset / height) * optical_center_y
+ return (projection_bias @ model_transform).astype(np.float32)
+
+
+class CameraOffsetHelper:
+ def __init__(self):
+ self.camera_offset = 0.0
+ self.actual_camera_offset = 0.0
+ self._smoother = _OffsetSmoother()
+
+ @staticmethod
+ def apply_camera_offset(model_transform, intrinsics, height, offset_param):
+ return _sheared_transform(model_transform, intrinsics, height, offset_param)
+
+ def set_offset(self, offset):
+ self.camera_offset = _clamped_offset(offset)
+
+ def update(self, model_transform_main, model_transform_extra, sm, main_wide_camera, extra_uses_wide_camera=True):
+ self.actual_camera_offset = self._smoother.step(self.camera_offset)
+ camera_bundle = _camera_profile(sm)
+ camera_height = _calibration_height(sm)
+ main_intrinsics = camera_bundle.ecam.intrinsics if main_wide_camera else camera_bundle.fcam.intrinsics
+ extra_intrinsics = camera_bundle.ecam.intrinsics if extra_uses_wide_camera else camera_bundle.fcam.intrinsics
+
+ return (
+ self.apply_camera_offset(model_transform_main, main_intrinsics, camera_height, self.actual_camera_offset),
+ self.apply_camera_offset(model_transform_extra, extra_intrinsics, camera_height, self.actual_camera_offset),
+ )
diff --git a/iqpilot/selfdrive/iqmodeld/config.py b/iqpilot/selfdrive/iqmodeld/config.py
new file mode 100644
index 000000000..b7a84e9d9
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/config.py
@@ -0,0 +1,130 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from __future__ import annotations
+
+import numpy as np
+
+
+def _quadratic_series(limit: float, steps: int) -> list[float]:
+ peak_index = steps - 1
+ return [limit * ((index / peak_index) ** 2) for index in range(steps)]
+
+
+def _probability_window(*values: float) -> np.ndarray:
+ return np.asarray(values, dtype=np.float32)
+
+
+def _field_group(start: int, stop: int, stride: int) -> slice:
+ return slice(start, stop, stride)
+
+
+_IDX_COUNT = 33
+_T_AXIS = _quadratic_series(10.0, _IDX_COUNT)
+_X_AXIS = _quadratic_series(192.0, _IDX_COUNT)
+
+
+class ModelConstants:
+ IDX_N = _IDX_COUNT
+ T_IDXS = _T_AXIS
+ X_IDXS = _X_AXIS
+ LEAD_T_IDXS = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0]
+ LEAD_T_OFFSETS = [0.0, 2.0, 4.0]
+ META_T_IDXS = [2.0, 4.0, 6.0, 8.0, 10.0]
+
+ MODEL_FREQ = 20
+ FEATURE_LEN = 512
+ FULL_HISTORY_BUFFER_LEN = 99
+ HISTORY_BUFFER_LEN = FULL_HISTORY_BUFFER_LEN
+ DESIRE_LEN = 8
+ TRAFFIC_CONVENTION_LEN = 2
+ NAV_FEATURE_LEN = 256
+ NAV_INSTRUCTION_LEN = 150
+ LAT_PLANNER_STATE_LEN = 4
+ LATERAL_CONTROL_PARAMS_LEN = 2
+ PREV_DESIRED_CURV_LEN = 1
+
+ FCW_THRESHOLDS_5MS2 = _probability_window(0.05, 0.05, 0.15, 0.15, 0.15)
+ FCW_THRESHOLDS_3MS2 = _probability_window(0.7, 0.7)
+ FCW_5MS2_PROBS_WIDTH = 5
+ FCW_3MS2_PROBS_WIDTH = 2
+
+ DISENGAGE_WIDTH = 5
+ POSE_WIDTH = 6
+ WIDE_FROM_DEVICE_WIDTH = 3
+ SIM_POSE_WIDTH = 6
+ LEAD_WIDTH = 4
+ LANE_LINES_WIDTH = 2
+ ROAD_EDGES_WIDTH = 2
+ PLAN_WIDTH = 15
+ DESIRE_PRED_WIDTH = 8
+ LAT_PLANNER_SOLUTION_WIDTH = 4
+ DESIRED_CURV_WIDTH = 1
+
+ NUM_LANE_LINES = 4
+ NUM_ROAD_EDGES = 2
+ LEAD_TRAJ_LEN = 6
+ DESIRE_PRED_LEN = 4
+
+ PLAN_MHP_N = 5
+ LEAD_MHP_N = 2
+ PLAN_MHP_SELECTION = 1
+ LEAD_MHP_SELECTION = 3
+
+ FCW_THRESHOLD_5MS2_HIGH = 0.15
+ FCW_THRESHOLD_5MS2_LOW = 0.05
+ FCW_THRESHOLD_3MS2 = 0.7
+
+ CONFIDENCE_BUFFER_LEN = 5
+ RYG_GREEN = 0.01165
+ RYG_YELLOW = 0.06157
+ POLY_PATH_DEGREE = 4
+
+
+class Plan:
+ POSITION = slice(0, 3)
+ VELOCITY = slice(3, 6)
+ ACCELERATION = slice(6, 9)
+ T_FROM_CURRENT_EULER = slice(9, 12)
+ ORIENTATION_RATE = slice(12, 15)
+
+
+class Meta:
+ ENGAGED = _field_group(0, 1, 1)
+ GAS_DISENGAGE = _field_group(1, 31, 6)
+ BRAKE_DISENGAGE = _field_group(2, 31, 6)
+ STEER_OVERRIDE = _field_group(3, 31, 6)
+ HARD_BRAKE_3 = _field_group(4, 31, 6)
+ HARD_BRAKE_4 = _field_group(5, 31, 6)
+ HARD_BRAKE_5 = _field_group(6, 31, 6)
+ GAS_PRESS = _field_group(31, 55, 4)
+ BRAKE_PRESS = _field_group(32, 55, 4)
+ LEFT_BLINKER = _field_group(33, 55, 4)
+ RIGHT_BLINKER = _field_group(34, 55, 4)
+
+
+class MetaTombRaider:
+ ENGAGED = _field_group(0, 1, 1)
+ GAS_DISENGAGE = _field_group(1, 41, 8)
+ BRAKE_DISENGAGE = _field_group(2, 41, 8)
+ STEER_OVERRIDE = _field_group(3, 41, 8)
+ HARD_BRAKE_3 = _field_group(4, 41, 8)
+ HARD_BRAKE_4 = _field_group(5, 41, 8)
+ HARD_BRAKE_5 = _field_group(6, 41, 8)
+ GAS_PRESS = _field_group(7, 41, 8)
+ BRAKE_PRESS = _field_group(8, 41, 8)
+ LEFT_BLINKER = _field_group(41, 53, 2)
+ RIGHT_BLINKER = _field_group(42, 53, 2)
+
+
+class MetaSimPose:
+ ENGAGED = _field_group(0, 1, 1)
+ GAS_DISENGAGE = _field_group(1, 36, 7)
+ BRAKE_DISENGAGE = _field_group(2, 36, 7)
+ STEER_OVERRIDE = _field_group(3, 36, 7)
+ HARD_BRAKE_3 = _field_group(4, 36, 7)
+ HARD_BRAKE_4 = _field_group(5, 36, 7)
+ HARD_BRAKE_5 = _field_group(6, 36, 7)
+ GAS_PRESS = _field_group(7, 36, 7)
+ LEFT_BLINKER = _field_group(36, 48, 2)
+ RIGHT_BLINKER = _field_group(37, 48, 2)
diff --git a/iqpilot/selfdrive/iqmodeld/daemon.py b/iqpilot/selfdrive/iqmodeld/daemon.py
new file mode 100755
index 000000000..723cb214b
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/daemon.py
@@ -0,0 +1,716 @@
+#!/usr/bin/env python3
+from __future__ import annotations
+
+import time
+from dataclasses import dataclass
+from typing import Any
+
+import cereal.messaging as messaging
+import numpy as np
+
+from cereal import car, custom, log
+from cereal.messaging import PubMaster, SubMaster
+from msgq.visionipc import VisionBuf, VisionIpcClient, VisionStreamType
+from iqdbc.car.car_helpers import get_demo_car_params
+from setproctitle import setproctitle
+
+from openpilot.common.filter_simple import FirstOrderFilter
+from openpilot.common.iq_perf import PerfSample, PerfTraceEmitter, PerfTraceRing
+from openpilot.common.params import Params
+from openpilot.common.realtime import DT_MDL, config_realtime_process
+from openpilot.common.swaglog import cloudlog
+from openpilot.common.transformations.camera import DEVICE_CAMERAS
+from openpilot.common.transformations.model import get_warp_matrix
+from openpilot.selfdrive.controls.lib.desire_helper import DesireHelper
+from openpilot.selfdrive.controls.lib.drive_helpers import (
+ MODEL_SMOOTHING_MAX_TOTAL_SEC,
+ dynamic_lat_smooth_extra_seconds,
+ get_accel_from_plan,
+ smooth_value,
+)
+from openpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy
+from openpilot.system import sentry
+
+from openpilot.iqpilot.common.steer_delay import resolve_steer_delay
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle
+from openpilot.iqpilot.selfdrive.iqmodeld.models.inference_state import InferenceStateBase
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import get_model_runner
+from openpilot.iqpilot.selfdrive.iqmodeld.camera import CameraOffsetHelper
+from openpilot.iqpilot.selfdrive.iqmodeld.config import Plan
+from openpilot.iqpilot.selfdrive.iqmodeld.messaging import (
+ DrivePacketMemory,
+ pick_curvature,
+ populate_drive_messages,
+ populate_odometry_message,
+)
+from openpilot.iqpilot.selfdrive.iqmodeld.metadata import select_meta_layout
+
+try:
+ from openpilot.iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import RoadProjector, WarpContext
+except ModuleNotFoundError:
+ class WarpContext:
+ def __init__(self, *args, **kwargs):
+ raise ModuleNotFoundError("openpilot.iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx is not built")
+
+ class RoadProjector:
+ def __init__(self, *args, **kwargs):
+ raise ModuleNotFoundError("openpilot.iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx is not built")
+
+
+PROCESS_NAME = "iqpilot.selfdrive.iqmodeld.daemon"
+IQP_NAV_MODEL_INFLUENCE_ENABLED = False
+TurnDirection = custom.IQTurnSignalDirection
+IQMODEL_EVAL_WARN_US = int(DT_MDL * 1_000_000)
+IQMODEL_EVAL_ERROR_US = IQMODEL_EVAL_WARN_US * 2
+
+
+def _plan_y_std_1s(outputs: dict[str, np.ndarray]) -> float:
+ # plan_stds is (batch, IDX_N, PLAN_WIDTH); index 10 ~= 1s ahead (see ModelConstants.T_IDXS),
+ # POSITION is an (x, y, z) slice within PLAN_WIDTH so [1] picks the lateral (y) std.
+ try:
+ return float(outputs["plan_stds"][0, 10, Plan.POSITION][1])
+ except (KeyError, IndexError):
+ return 0.0
+
+
+def _model_lat_smooth_max_sec(params: Params) -> float:
+ if not params.get_bool("ModelSmoothingEnabled"):
+ return 0.0
+ try:
+ raw = params.get("ModelLatSmoothSec", return_default=True)
+ raw = 0 if raw is None else int(raw)
+ except (ValueError, TypeError):
+ raw = 0
+ return min(max(raw, 0), 30) * 0.01
+
+
+@dataclass
+class CaptureStamp:
+ frame_id: int = 0
+ timestamp_sof: int = 0
+ timestamp_eof: int = 0
+
+ @classmethod
+ def from_vipc(cls, client: VisionIpcClient) -> "CaptureStamp":
+ return cls(client.frame_id, client.timestamp_sof, client.timestamp_eof)
+
+
+@dataclass(frozen=True)
+class StreamLayout:
+ dual_camera: bool
+ main_is_wide: bool
+ primary_stream: VisionStreamType
+
+
+class ReplayLedger:
+ def __init__(self, tensor_shapes: dict[str, tuple[int, ...]], frame_inputs: list[str]):
+ self.inputs: dict[str, np.ndarray] = {}
+ self.archive: dict[str, np.ndarray] = {}
+ self.selectors: dict[str, np.ndarray] = {}
+ self._frame_inputs = set(frame_inputs)
+ self._pulse_name: str | None = None
+ self._pulse_memory: np.ndarray | None = None
+
+ feature_shape = tensor_shapes.get("features_buffer")
+ for tensor_name, tensor_shape in tensor_shapes.items():
+ if tensor_name in self._frame_inputs:
+ continue
+
+ self.inputs[tensor_name] = np.zeros(tensor_shape, dtype=np.float32)
+ if len(tensor_shape) != 3 or tensor_shape[1] <= 1:
+ continue
+
+ history_len = self._history_length(tensor_shape, feature_shape)
+ self.archive[tensor_name] = np.zeros((1, history_len, tensor_shape[2]), dtype=np.float32)
+ export_index = self._export_index(tensor_shape, history_len, feature_shape)
+ if export_index is not None:
+ self.selectors[tensor_name] = export_index
+
+ if tensor_name.startswith("desire"):
+ self._pulse_name = tensor_name
+ self._pulse_memory = np.zeros(tensor_shape[2], dtype=np.float32)
+
+ @staticmethod
+ def _history_length(tensor_shape: tuple[int, ...], feature_shape: tuple[int, ...] | None) -> int:
+ if tensor_shape[1] >= 99:
+ return tensor_shape[1]
+ if tensor_shape[1] in (24, 25) and feature_shape is not None and feature_shape[1] == 24:
+ return (feature_shape[1] + 1) * 4
+ return tensor_shape[1] * 4
+
+ @staticmethod
+ def _export_index(tensor_shape: tuple[int, ...], history_len: int,
+ feature_shape: tuple[int, ...] | None) -> np.ndarray | None:
+ if tensor_shape[1] in (24, 25) and feature_shape is not None and feature_shape[1] == 24:
+ stride = int(-history_len / tensor_shape[1])
+ return np.arange(stride, stride * (tensor_shape[1] + 1), stride)[::-1]
+ if tensor_shape[1] == 25:
+ skip = history_len // tensor_shape[1]
+ return np.arange(history_len)[-1 - (skip * (tensor_shape[1] - 1))::skip]
+ if tensor_shape[1] >= 99:
+ return np.arange(tensor_shape[1])
+ return None
+
+ @property
+ def pulse_name(self) -> str:
+ if self._pulse_name is None:
+ raise KeyError("No desire-like pulse input present in model inputs")
+ return self._pulse_name
+
+ def _shift_archive(self, tensor_name: str) -> np.ndarray:
+ history = self.archive[tensor_name]
+ history[0, :-1] = history[0, 1:]
+ return history
+
+ def inject_pulse(self, pulse_values: np.ndarray) -> None:
+ pulse = pulse_values.copy()
+ pulse[0] = 0
+ assert self._pulse_memory is not None
+ rising = np.where(pulse - self._pulse_memory > 0.99, pulse, 0)
+ self._pulse_memory[:] = pulse
+
+ history = self._shift_archive(self.pulse_name)
+ history[0, -1] = rising
+ exported_shape = self.inputs[self.pulse_name].shape
+ if history.shape[1] > exported_shape[1]:
+ stride = history.shape[1] // exported_shape[1]
+ self.inputs[self.pulse_name][:] = history[0].reshape(
+ exported_shape[0], exported_shape[1], stride, -1
+ ).max(axis=2)
+ return
+ self.inputs[self.pulse_name][:] = history[0, self.selectors[self.pulse_name]]
+
+ def merge_inputs(self, fresh_inputs: dict[str, np.ndarray]) -> None:
+ pulse_name = self.pulse_name
+ for tensor_name, tensor_value in fresh_inputs.items():
+ if tensor_name in self.inputs and tensor_name != pulse_name:
+ self.inputs[tensor_name][:] = tensor_value
+
+ def note_hidden_state(self, hidden_state: np.ndarray) -> None:
+ if "features_buffer" not in self.archive:
+ return
+ history = self._shift_archive("features_buffer")
+ history[0, -1] = hidden_state[0]
+ self.inputs["features_buffer"][:] = history[0, self.selectors["features_buffer"]]
+
+ def note_feedback(self, tensor_name: str, values: np.ndarray, zero_export: bool = False) -> None:
+ if tensor_name not in self.archive:
+ return
+ history = self._shift_archive(tensor_name)
+ history[0, -1, :] = values[0]
+ exported = history[0, self.selectors[tensor_name]]
+ self.inputs[tensor_name][:] = 0 * exported if zero_export else exported
+
+
+def _planplus_gain(vehicle_speed: float) -> float:
+ return 0.75 if vehicle_speed >= 25.0 else 1.0
+
+
+def _merged_plan(runtime_state: "NeuralEngineState", outputs: dict[str, np.ndarray], vehicle_speed: float) -> np.ndarray:
+ base_plan = outputs["plan"][0]
+ if "planplus" not in outputs:
+ return base_plan
+ return base_plan + (runtime_state.PLANPLUS_CONTROL * _planplus_gain(vehicle_speed)) * outputs["planplus"][0]
+
+
+class NeuralEngineState(InferenceStateBase):
+ frames: dict[str, RoadProjector]
+
+ def __init__(self, gpu_context: WarpContext):
+ super().__init__()
+ runner = get_model_runner()
+ bundle = get_active_bundle()
+
+ self.model_runner = runner
+ self.constants = runner.constants
+ self.generation = bundle.generation if bundle is not None else None
+
+ knob_values = {entry.key: entry.value for entry in bundle.overrides} if bundle is not None else {}
+ self.LAT_SMOOTH_SECONDS = float(knob_values.get("lat", ".0"))
+ self.LONG_SMOOTH_SECONDS = float(knob_values.get("long", ".0"))
+ self.MIN_LAT_CONTROL_SPEED = 0.3
+ self.PLANPLUS_CONTROL = 1.0
+ self.model_smoothing_max_extra_sec = 0.0
+
+ context_depth = 5 if runner.is_20hz else 2
+ self.frames = {
+ stream_name: RoadProjector(gpu_context, context_depth)
+ for stream_name in runner.vision_input_names
+ }
+
+ self._ledger = ReplayLedger(runner.input_shapes, runner.vision_input_names)
+ self.numpy_inputs = self._ledger.inputs
+ self.temporal_buffers = self._ledger.archive
+ self.temporal_idxs_map = self._ledger.selectors
+
+ @property
+ def mlsim(self) -> bool:
+ return bool(self.generation is not None and self.generation >= 11)
+
+ @property
+ def desire_key(self) -> str:
+ return self._ledger.pulse_name
+
+ def _warp_frames(self, vision_bufs: dict[str, VisionBuf],
+ transform_map: dict[str, np.ndarray]) -> dict[str, Any]:
+ return {
+ stream_name: self.frames[stream_name].stage(vision_bufs[stream_name], transform_map[stream_name].flatten())
+ for stream_name in self.model_runner.vision_input_names
+ }
+
+ def _run_split_model(self) -> dict[str, np.ndarray]:
+ if hasattr(self.model_runner, "run_vision"):
+ vision_packet = self.model_runner.run_vision()
+ self._ledger.note_hidden_state(vision_packet["hidden_state"])
+ self.model_runner.refresh_policy_features(self.numpy_inputs["features_buffer"])
+ return {**vision_packet, **self.model_runner.run_policy()}
+
+ result = self.model_runner.run_model()
+ if "hidden_state" in result:
+ self._ledger.note_hidden_state(result["hidden_state"])
+ return result
+
+ def _write_curvature_memory(self, outputs: dict[str, np.ndarray]) -> None:
+ if "desired_curvature" not in outputs:
+ return
+
+ feedback_slot = None
+ if "prev_desired_curvs" in self.numpy_inputs:
+ feedback_slot = "prev_desired_curvs"
+ elif "prev_desired_curv" in self.numpy_inputs:
+ feedback_slot = "prev_desired_curv"
+
+ if feedback_slot is not None:
+ self._ledger.note_feedback(feedback_slot, outputs["desired_curvature"], zero_export=self.mlsim)
+
+ def run(self, vision_bufs: dict[str, VisionBuf], transform_map: dict[str, np.ndarray],
+ fresh_inputs: dict[str, np.ndarray]) -> dict[str, np.ndarray] | None:
+ if not getattr(self.model_runner, "uses_opencl_warp", True):
+ return self.model_runner.run_fused(vision_bufs, transform_map, fresh_inputs)
+
+ self._ledger.inject_pulse(fresh_inputs[self.desire_key])
+ self._ledger.merge_inputs(fresh_inputs)
+ warped_frames = self._warp_frames(vision_bufs, transform_map)
+ self.model_runner.prepare_inputs(warped_frames, self.numpy_inputs, self.frames)
+
+ outputs = self._run_split_model()
+ self._write_curvature_memory(outputs)
+ return outputs
+
+ def get_action_from_model(self, outputs: dict[str, np.ndarray], previous_action: log.ModelDataV2.Action,
+ lat_action_t: float, long_action_t: float, vehicle_speed: float,
+ lat_smooth_seconds: float | None = None) -> log.ModelDataV2.Action:
+ if lat_smooth_seconds is None:
+ lat_smooth_seconds = self.LAT_SMOOTH_SECONDS
+
+ if "action" in outputs:
+ curvature_cmd = outputs["action"][0, 0] / (max(1.0, vehicle_speed)) ** 2
+ accel_cmd = outputs["action"][0, 1]
+ should_stop = bool(vehicle_speed < 0.3 and accel_cmd < 0.1)
+
+ accel_cmd = smooth_value(accel_cmd, previous_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS)
+ if vehicle_speed > self.MIN_LAT_CONTROL_SPEED:
+ curvature_cmd = smooth_value(curvature_cmd, previous_action.desiredCurvature, lat_smooth_seconds)
+ else:
+ curvature_cmd = previous_action.desiredCurvature
+
+ return log.ModelDataV2.Action(
+ desiredCurvature=float(curvature_cmd),
+ desiredAcceleration=float(accel_cmd),
+ shouldStop=should_stop,
+ )
+
+ plan_rows = _merged_plan(self, outputs, vehicle_speed)
+ accel_cmd, should_stop = get_accel_from_plan(
+ plan_rows[:, Plan.VELOCITY][:, 0],
+ plan_rows[:, Plan.ACCELERATION][:, 0],
+ self.constants.T_IDXS,
+ action_t=long_action_t,
+ )
+ accel_cmd = smooth_value(accel_cmd, previous_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS)
+
+ curvature_cmd = pick_curvature(outputs, plan_rows, vehicle_speed, lat_action_t, self.mlsim)
+ if self.generation is not None and self.generation >= 10:
+ if vehicle_speed > self.MIN_LAT_CONTROL_SPEED:
+ curvature_cmd = smooth_value(curvature_cmd, previous_action.desiredCurvature, lat_smooth_seconds)
+ else:
+ curvature_cmd = previous_action.desiredCurvature
+
+ return log.ModelDataV2.Action(
+ desiredCurvature=float(curvature_cmd),
+ desiredAcceleration=float(accel_cmd),
+ shouldStop=bool(should_stop),
+ )
+
+
+class CameraIngress:
+ def __init__(self, gpu_context: WarpContext):
+ self.layout = self._discover_layout()
+ self._primary = VisionIpcClient("camerad", self.layout.primary_stream, True, gpu_context)
+ self._secondary = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_WIDE_ROAD, False, gpu_context)
+
+ while not self._primary.connect(False):
+ time.sleep(0.1)
+ while self.layout.dual_camera and not self._secondary.connect(False):
+ time.sleep(0.1)
+
+ cloudlog.warning(
+ f"connected main cam with buffer size: {self._primary.buffer_len} ({self._primary.width} x {self._primary.height})"
+ )
+ if self.layout.dual_camera:
+ cloudlog.warning(
+ f"connected extra cam with buffer size: {self._secondary.buffer_len} ({self._secondary.width} x {self._secondary.height})"
+ )
+
+ @staticmethod
+ def _discover_layout() -> StreamLayout:
+ while True:
+ available = VisionIpcClient.available_streams("camerad", block=False)
+ if available:
+ dual_camera = (
+ VisionStreamType.VISION_STREAM_WIDE_ROAD in available
+ and VisionStreamType.VISION_STREAM_ROAD in available
+ )
+ main_is_wide = VisionStreamType.VISION_STREAM_ROAD not in available
+ primary_stream = VisionStreamType.VISION_STREAM_WIDE_ROAD if main_is_wide else VisionStreamType.VISION_STREAM_ROAD
+ cloudlog.warning(
+ f"vision stream set up, main_wide_camera: {main_is_wide}, use_extra_client: {dual_camera}"
+ )
+ return StreamLayout(dual_camera=dual_camera, main_is_wide=main_is_wide, primary_stream=primary_stream)
+ time.sleep(0.1)
+
+ def pull(self) -> tuple[VisionBuf, VisionBuf, CaptureStamp, CaptureStamp] | None:
+ main_buf = None
+ wide_buf = None
+ main_stamp = CaptureStamp()
+ wide_stamp = CaptureStamp()
+
+ while main_stamp.timestamp_sof < wide_stamp.timestamp_sof + 25000000:
+ main_buf = self._primary.recv()
+ main_stamp = CaptureStamp.from_vipc(self._primary)
+ if main_buf is None:
+ return None
+
+ if not self.layout.dual_camera:
+ return main_buf, main_buf, main_stamp, main_stamp
+
+ while True:
+ wide_buf = self._secondary.recv()
+ wide_stamp = CaptureStamp.from_vipc(self._secondary)
+ if wide_buf is None or main_stamp.timestamp_sof < wide_stamp.timestamp_sof + 25000000:
+ break
+
+ if wide_buf is None:
+ return None
+
+ if abs(main_stamp.timestamp_sof - wide_stamp.timestamp_sof) > 10000000:
+ cloudlog.error(
+ f"frames out of sync! main: {main_stamp.frame_id} ({main_stamp.timestamp_sof / 1e9:.5f}),"
+ f" extra: {wide_stamp.frame_id} ({wide_stamp.timestamp_sof / 1e9:.5f})"
+ )
+ return main_buf, wide_buf, main_stamp, wide_stamp
+
+
+class CalibrationAtlas:
+ def __init__(self):
+ self.main_warp = np.zeros((3, 3), dtype=np.float32)
+ self.extra_warp = np.zeros((3, 3), dtype=np.float32)
+ self.ready = False
+ self._offset_tuner = CameraOffsetHelper()
+
+ def set_offset(self, offset_value: Any) -> None:
+ self._offset_tuner.set_offset(offset_value)
+
+ def refresh(self, sm: SubMaster, main_is_wide: bool, dual_camera: bool) -> tuple[np.ndarray, np.ndarray, bool]:
+ if not (sm.seen["liveCalibration"] and sm.seen["roadCameraState"] and sm.seen["deviceState"]):
+ return self.main_warp, self.extra_warp, self.ready
+
+ rpy = get_calibrated_rpy(sm["liveCalibration"])
+ if rpy is None:
+ live_calib = sm["liveCalibration"]
+ if len(live_calib.rpyCalib) == 3:
+ rpy = np.array(live_calib.rpyCalib, dtype=np.float32)
+ else:
+ rpy = np.zeros(3, dtype=np.float32)
+
+ device_key = (str(sm["deviceState"].deviceType), str(sm["roadCameraState"].sensor))
+ device_camera = DEVICE_CAMERAS[device_key]
+ main_intrinsics = device_camera.ecam.intrinsics if main_is_wide else device_camera.fcam.intrinsics
+ extra_uses_wide_camera = dual_camera or main_is_wide
+ extra_intrinsics = device_camera.ecam.intrinsics if extra_uses_wide_camera else device_camera.fcam.intrinsics
+ self.main_warp = get_warp_matrix(rpy, main_intrinsics, False).astype(np.float32)
+ self.extra_warp = get_warp_matrix(rpy, extra_intrinsics, True).astype(np.float32)
+ self.main_warp, self.extra_warp = self._offset_tuner.update(
+ self.main_warp, self.extra_warp, sm, main_is_wide, extra_uses_wide_camera
+ )
+ self.ready = True
+ return self.main_warp, self.extra_warp, self.ready
+
+
+class FrameDropMeter:
+ def __init__(self, model_freq: float):
+ self._smoother = FirstOrderFilter(0.0, 10.0, 1.0 / model_freq)
+ self._warm_frames = 0
+ self._last_frame_id = 0
+
+ def sample(self, frame_id: int) -> tuple[int, float, bool]:
+ dropped = max(0, frame_id - self._last_frame_id - 1)
+ smooth = self._smoother.update(min(dropped, 10))
+ if self._warm_frames < 10:
+ self._smoother.x = 0.0
+ smooth = 0.0
+ self._warm_frames += 1
+ return dropped, smooth / (1 + smooth), dropped > 0
+
+ def commit(self, frame_id: int) -> None:
+ self._last_frame_id = frame_id
+
+
+class InferenceDaemon:
+ def __init__(self, demo: bool = False):
+ cloudlog.warning("iqmodeld init")
+ sentry.set_tag("daemon", PROCESS_NAME)
+ cloudlog.bind(daemon=PROCESS_NAME)
+ setproctitle(PROCESS_NAME)
+ config_realtime_process(7, 54)
+
+ cloudlog.warning("setting up CL context")
+ self._gpu = WarpContext()
+ cloudlog.warning("CL context ready; loading model")
+ self._runtime = NeuralEngineState(self._gpu)
+ self._meta_layout = select_meta_layout()
+ cloudlog.warning("models loaded, iqmodeld starting")
+
+ self._cameras = CameraIngress(self._gpu)
+ self._pub = PubMaster(["modelV2", "drivingModelData", "cameraOdometry", "iqDriveModelData", "iqPerfTrace"])
+ self._sub = SubMaster([
+ "deviceState", "carState", "roadCameraState", "liveCalibration",
+ "driverMonitoringState", "carControl", "liveDelay", "iqNavState", "radarState",
+ ])
+ self._message_memory = DrivePacketMemory()
+ self._params = Params()
+ self._frame_meter = FrameDropMeter(self._runtime.constants.MODEL_FREQ)
+ self._warps = CalibrationAtlas()
+ self._perf = PerfTraceEmitter("iqmodeld", pubmaster=self._pub)
+ self._perf_ring = PerfTraceRing()
+
+ self._car_params = self._load_car_params(demo)
+ self._long_action_delay = self._car_params.longitudinalActuatorDelay + self._runtime.LONG_SMOOTH_SECONDS
+ self._previous_action = log.ModelDataV2.Action()
+ self._desire_logic = DesireHelper()
+ self._lat_smooth_extra_sec = 0.0
+
+ def _load_car_params(self, demo: bool):
+ car_params = get_demo_car_params() if demo else messaging.log_from_bytes(
+ self._params.get("CarParams", block=True), car.CarParams)
+ cloudlog.info("iqmodeld got CarParams: %s", car_params.brand)
+ return car_params
+
+ def _refresh_tunables(self, tick: int) -> None:
+ if tick % 60 != 0:
+ return
+ self._runtime.lat_delay = resolve_steer_delay(self._params, self._sub["liveDelay"].lateralDelay)
+ self._runtime.PLANPLUS_CONTROL = self._params.get("PlanplusControl", return_default=True)
+ self._runtime.model_smoothing_max_extra_sec = _model_lat_smooth_max_sec(self._params)
+ self._warps.set_offset(self._params.get("CameraOffset", return_default=True))
+
+ def _traffic_side(self) -> np.ndarray:
+ traffic = np.zeros(2, dtype=np.float32)
+ traffic[int(self._sub["driverMonitoringState"].isRHD)] = 1
+ return traffic
+
+ def _desire_pulse(self) -> np.ndarray:
+ pulse = np.zeros(self._runtime.constants.DESIRE_LEN, dtype=np.float32)
+ desire_idx = self._desire_logic.desire
+ if 0 <= desire_idx < self._runtime.constants.DESIRE_LEN:
+ pulse[desire_idx] = 1
+ return pulse
+
+ def _compose_inputs(self, vehicle_speed: float, lat_horizon: float, long_horizon: float) -> dict[str, np.ndarray]:
+ inputs: dict[str, np.ndarray] = {
+ self._runtime.desire_key: self._desire_pulse(),
+ "traffic_convention": self._traffic_side(),
+ }
+ if "lateral_control_params" in self._runtime.numpy_inputs:
+ inputs["lateral_control_params"] = np.array([vehicle_speed, lat_horizon], dtype=np.float32)
+ if "action_t" in self._runtime.numpy_inputs:
+ inputs["action_t"] = np.array([lat_horizon, long_horizon], dtype=np.float32)
+ return inputs
+
+ def _publish(self, outputs: dict[str, np.ndarray], main_stamp: CaptureStamp, extra_stamp: CaptureStamp,
+ road_frame_id: int, frame_drop_ratio: float, dropped_frames: int,
+ execution_time: float, live_calib_seen: bool,
+ lat_horizon: float, long_horizon: float, vehicle_speed: float) -> None:
+ model_msg = messaging.new_message("modelV2")
+ driving_msg = messaging.new_message("drivingModelData")
+ pose_msg = messaging.new_message("cameraOdometry")
+ iq_msg = messaging.new_message("iqDriveModelData")
+
+ self._lat_smooth_extra_sec = dynamic_lat_smooth_extra_seconds(
+ _plan_y_std_1s(outputs), self._runtime.model_smoothing_max_extra_sec
+ )
+ lat_smooth_total_sec = min(self._runtime.LAT_SMOOTH_SECONDS + self._lat_smooth_extra_sec, MODEL_SMOOTHING_MAX_TOTAL_SEC)
+ action = self._runtime.get_action_from_model(
+ outputs, self._previous_action, lat_horizon, long_horizon, vehicle_speed, lat_smooth_total_sec
+ )
+ self._previous_action = action
+
+ populate_drive_messages(
+ driving_msg,
+ model_msg,
+ outputs,
+ action,
+ self._message_memory,
+ main_stamp.frame_id,
+ extra_stamp.frame_id,
+ road_frame_id,
+ frame_drop_ratio,
+ main_stamp.timestamp_eof,
+ execution_time,
+ live_calib_seen,
+ self._meta_layout,
+ )
+
+ desire_state = model_msg.modelV2.meta.desireState
+ lane_change_prob = desire_state[log.Desire.laneChangeLeft] + desire_state[log.Desire.laneChangeRight]
+ self._desire_logic.update(
+ self._sub["carState"],
+ self._sub["carControl"].latActive,
+ lane_change_prob,
+ self._sub["iqNavState"],
+ model_msg.modelV2,
+ self._sub["radarState"],
+ )
+ model_msg.modelV2.meta.laneChangeState = self._desire_logic.lane_change_state
+ model_msg.modelV2.meta.laneChangeDirection = self._desire_logic.lane_change_direction
+ driving_msg.drivingModelData.meta.laneChangeState = self._desire_logic.lane_change_state
+ driving_msg.drivingModelData.meta.laneChangeDirection = self._desire_logic.lane_change_direction
+ iq_msg.iqDriveModelData.turnSignalDirection = self._desire_logic.lane_turn_direction
+
+ populate_odometry_message(
+ pose_msg,
+ outputs,
+ main_stamp.frame_id,
+ dropped_frames,
+ main_stamp.timestamp_eof,
+ live_calib_seen,
+ )
+
+ self._pub.send("modelV2", model_msg)
+ self._pub.send("drivingModelData", driving_msg)
+ self._pub.send("cameraOdometry", pose_msg)
+ self._pub.send("iqDriveModelData", iq_msg)
+
+ def serve(self) -> None:
+ tick = 0
+ while True:
+ frame_pair = self._cameras.pull()
+ if frame_pair is None:
+ cloudlog.debug("visionipc frame missing")
+ continue
+
+ main_buf, extra_buf, main_stamp, extra_stamp = frame_pair
+ self._sub.update(0)
+ self._refresh_tunables(tick)
+
+ vehicle_speed = max(self._sub["carState"].vEgo, 0.0)
+ lat_horizon = self._runtime.lat_delay + self._runtime.LAT_SMOOTH_SECONDS + self._lat_smooth_extra_sec + DT_MDL
+ long_horizon = self._long_action_delay + DT_MDL
+
+ main_warp, extra_warp, live_calib_seen = self._warps.refresh(
+ self._sub, self._cameras.layout.main_is_wide, self._cameras.layout.dual_camera
+ )
+ dropped_frames, frame_drop_ratio, prepare_only = self._frame_meter.sample(main_stamp.frame_id)
+
+ vision_bufs = {
+ stream_name: extra_buf if "big" in stream_name else main_buf
+ for stream_name in self._runtime.model_runner.vision_input_names
+ }
+ warp_map = {
+ stream_name: extra_warp if "big" in stream_name else main_warp
+ for stream_name in self._runtime.model_runner.vision_input_names
+ }
+ fresh_inputs = self._compose_inputs(vehicle_speed, lat_horizon, long_horizon)
+
+ started_at = time.perf_counter()
+ outputs = self._runtime.run(vision_bufs, warp_map, fresh_inputs)
+ execution_time = time.perf_counter() - started_at
+ execution_us = int(execution_time * 1_000_000)
+
+ sample = PerfSample(
+ frame_id=main_stamp.frame_id,
+ model_eval_us=execution_us,
+ model_dropped_frames=dropped_frames,
+ model_backlog=max(0, dropped_frames),
+ )
+ self._perf_ring.push(sample)
+ if dropped_frames > 0 or execution_us >= IQMODEL_EVAL_WARN_US:
+ severity = "warning"
+ if dropped_frames > 0 or execution_us >= IQMODEL_EVAL_ERROR_US:
+ severity = "error"
+ self._perf.emit(
+ "iqmodeld_dropped_frames" if dropped_frames > 0 else "iqmodeld_slow_eval",
+ severity=severity,
+ frame_id=main_stamp.frame_id,
+ total_time_us=execution_us,
+ dropped_frames=dropped_frames,
+ backlog=max(0, dropped_frames),
+ samples=self._perf_ring.snapshot(),
+ detail=(
+ f"model_eval_us={execution_us} dropped_frames={dropped_frames} prepare_only={int(prepare_only)} "
+ f"road_frame_id={self._sub['roadCameraState'].frameId}"
+ ),
+ min_interval_s=0.25,
+ )
+
+ if outputs is not None:
+ self._publish(
+ outputs,
+ main_stamp,
+ extra_stamp,
+ self._sub["roadCameraState"].frameId,
+ frame_drop_ratio,
+ dropped_frames,
+ execution_time,
+ live_calib_seen,
+ lat_horizon,
+ long_horizon,
+ vehicle_speed,
+ )
+
+ self._frame_meter.commit(main_stamp.frame_id)
+ tick += 1
+
+
+def main(demo: bool = False):
+ InferenceDaemon(demo=demo).serve()
+
+
+__all__ = [
+ "PROCESS_NAME",
+ "IQP_NAV_MODEL_INFLUENCE_ENABLED",
+ "TurnDirection",
+ "CaptureStamp",
+ "ReplayLedger",
+ "NeuralEngineState",
+ "CameraIngress",
+ "CalibrationAtlas",
+ "FrameDropMeter",
+ "InferenceDaemon",
+ "main",
+]
+
+
+if __name__ == "__main__":
+ try:
+ import argparse
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--demo", action="store_true", help="Run iqmodeld in demo mode.")
+ args = parser.parse_args()
+ main(demo=args.demo)
+ except KeyboardInterrupt:
+ cloudlog.warning(f"child {PROCESS_NAME} got SIGINT")
+ except Exception:
+ sentry.capture_exception()
+ raise
diff --git a/iqpilot/selfdrive/iqmodeld/default_model/bundle.json b/iqpilot/selfdrive/iqmodeld/default_model/bundle.json
new file mode 100644
index 000000000..bbbbbe3c6
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/default_model/bundle.json
@@ -0,0 +1,62 @@
+{
+ "displayName": "Default (CD210)",
+ "environment": "development",
+ "generation": 12,
+ "index": 56,
+ "internalName": "C210M",
+ "is20hz": true,
+ "minimumSelectorVersion": 14,
+ "models": [
+ {
+ "artifact": {
+ "downloadUri": {
+ "sha256": "ba5c459412310a8c65a11e02cb1f522fe439d515589754451561268f028f4fb0",
+ "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled16/model-CD210%20Model%20%28January%2031%2C%202026%29-101/driving_policy_c210m_tinygrad.pkl"
+ },
+ "fileName": "driving_policy_c210m_tinygrad.pkl"
+ },
+ "metadata": {
+ "downloadUri": {
+ "sha256": "15c8c1ad9073424ee1101b1f7170421140ed308ebaa7c917001130fb1760420b",
+ "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled16/model-CD210%20Model%20%28January%2031%2C%202026%29-101/driving_policy_c210m_metadata.pkl"
+ },
+ "fileName": "driving_policy_c210m_metadata.pkl"
+ },
+ "type": "policy"
+ },
+ {
+ "artifact": {
+ "downloadUri": {
+ "sha256": "c6c9cfba6c618a361d474d2fe11c4d8e7a249e9311dd9bcb42b287067ef75ae7",
+ "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled16/model-CD210%20Model%20%28January%2031%2C%202026%29-101/driving_vision_c210m_tinygrad.pkl"
+ },
+ "fileName": "driving_vision_c210m_tinygrad.pkl"
+ },
+ "metadata": {
+ "downloadUri": {
+ "sha256": "a2be39088d38550e818f5ac1c6300a64605ba0bd0676a27fe7bbea9fddae90a1",
+ "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled16/model-CD210%20Model%20%28January%2031%2C%202026%29-101/driving_vision_c210m_metadata.pkl"
+ },
+ "fileName": "driving_vision_c210m_metadata.pkl"
+ },
+ "type": "vision"
+ }
+ ],
+ "overrides": [
+ {
+ "key": "folder",
+ "value": "Master Models"
+ },
+ {
+ "key": "lat",
+ "value": ".0"
+ },
+ {
+ "key": "long",
+ "value": ".3"
+ }
+ ],
+ "ref": "default",
+ "runner": "tinygrad",
+ "status": "notDownloading"
+}
diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_metadata.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_metadata.pkl
new file mode 100755
index 000000000..cd76d1c8d
Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_metadata.pkl differ
diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_tinygrad.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_tinygrad.pkl
new file mode 100755
index 000000000..cf6fd49ee
Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_tinygrad.pkl differ
diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_metadata.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_metadata.pkl
new file mode 100755
index 000000000..9aa8bf839
Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_metadata.pkl differ
diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_tinygrad.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_tinygrad.pkl
new file mode 100755
index 000000000..cb1483258
Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_tinygrad.pkl differ
diff --git a/iqpilot/selfdrive/iqmodeld/iqmodeld b/iqpilot/selfdrive/iqmodeld/iqmodeld
new file mode 100755
index 000000000..a3f9fc1fb
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/iqmodeld
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+# Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+
+set -euo pipefail
+
+script_home() {
+ cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd
+}
+
+main() {
+ local here
+ here="$(script_home)"
+ exec "$here/daemon.py" "$@"
+}
+
+main "$@"
diff --git a/iqpilot/selfdrive/iqmodeld/messaging.py b/iqpilot/selfdrive/iqmodeld/messaging.py
new file mode 100644
index 000000000..0ca636ce2
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/messaging.py
@@ -0,0 +1,269 @@
+from __future__ import annotations
+
+import os
+from dataclasses import dataclass, field
+
+import capnp
+import numpy as np
+
+from cereal import log
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import plan_x_idxs_helper
+from openpilot.iqpilot.selfdrive.iqmodeld.config import ModelConstants, Plan
+from openpilot.selfdrive.controls.lib.drive_helpers import get_curvature_from_plan
+
+SEND_RAW_PRED = os.getenv("SEND_RAW_PRED")
+ConfidenceClass = log.ModelDataV2.ConfidenceClass
+
+
+def pick_curvature(outputs: dict[str, np.ndarray], plan_rows: np.ndarray, vehicle_speed: float,
+ action_horizon: float, synthetic_lane_logic: bool) -> float:
+ direct_signal = None if synthetic_lane_logic else outputs.get("desired_curvature")
+ if direct_signal is not None:
+ return float(direct_signal[0, 0])
+
+ yaw_track = plan_rows[:, Plan.T_FROM_CURRENT_EULER][:, 2]
+ yaw_rate_track = plan_rows[:, Plan.ORIENTATION_RATE][:, 2]
+ return float(get_curvature_from_plan(yaw_track, yaw_rate_track, ModelConstants.T_IDXS, vehicle_speed, action_horizon))
+
+
+@dataclass
+class DrivePacketMemory:
+ disengage_rollup: np.ndarray = field(default_factory=lambda: np.zeros(
+ ModelConstants.CONFIDENCE_BUFFER_LEN * ModelConstants.DISENGAGE_WIDTH, dtype=np.float32))
+ brake_watch_5: np.ndarray = field(default_factory=lambda: np.zeros(
+ ModelConstants.FCW_5MS2_PROBS_WIDTH, dtype=np.float32))
+ brake_watch_3: np.ndarray = field(default_factory=lambda: np.zeros(
+ ModelConstants.FCW_3MS2_PROBS_WIDTH, dtype=np.float32))
+
+
+def _assign_xyz(builder, t_points, x_track, y_track, z_track,
+ x_std=None, y_std=None, z_std=None) -> None:
+ builder.t = t_points
+ builder.x = x_track.tolist()
+ builder.y = y_track.tolist()
+ builder.z = z_track.tolist()
+ if x_std is not None:
+ builder.xStd = x_std.tolist()
+ if y_std is not None:
+ builder.yStd = y_std.tolist()
+ if z_std is not None:
+ builder.zStd = z_std.tolist()
+
+
+def _assign_xyva(builder, t_points, x_track, y_track, v_track, a_track,
+ x_std=None, y_std=None, v_std=None, a_std=None) -> None:
+ builder.t = t_points
+ builder.x = x_track.tolist()
+ builder.y = y_track.tolist()
+ builder.v = v_track.tolist()
+ builder.a = a_track.tolist()
+ if x_std is not None:
+ builder.xStd = x_std.tolist()
+ if y_std is not None:
+ builder.yStd = y_std.tolist()
+ if v_std is not None:
+ builder.vStd = v_std.tolist()
+ if a_std is not None:
+ builder.aStd = a_std.tolist()
+
+
+def _fit_path(builder, degree: int, x_track: np.ndarray, y_track: np.ndarray, z_track: np.ndarray) -> None:
+ stacked = np.stack([x_track, y_track, z_track], axis=1)
+ coeffs = np.polynomial.polynomial.polyfit(ModelConstants.T_IDXS, stacked, deg=degree)
+ builder.xCoefficients = coeffs[:, 0].tolist()
+ builder.yCoefficients = coeffs[:, 1].tolist()
+ builder.zCoefficients = coeffs[:, 2].tolist()
+
+
+def _lane_snapshot(builder, lane_lines, lane_probs: list[float]) -> None:
+ builder.leftY = lane_lines[1].y[0]
+ builder.leftProb = lane_probs[1]
+ builder.rightY = lane_lines[2].y[0]
+ builder.rightProb = lane_probs[2]
+
+
+def _roll_brake_watch(outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout) -> bool:
+ memory.brake_watch_5[:-1] = memory.brake_watch_5[1:]
+ memory.brake_watch_5[-1] = outputs["meta"][0, meta_layout.HARD_BRAKE_5][0]
+ memory.brake_watch_3[:-1] = memory.brake_watch_3[1:]
+ memory.brake_watch_3[-1] = outputs["meta"][0, meta_layout.HARD_BRAKE_3][0]
+ return bool(
+ (memory.brake_watch_5 > ModelConstants.FCW_THRESHOLDS_5MS2).all()
+ and (memory.brake_watch_3 > ModelConstants.FCW_THRESHOLDS_3MS2).all()
+ )
+
+
+def _confidence_bucket(outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout, frame_id: int):
+ width = ModelConstants.DISENGAGE_WIDTH
+ if frame_id % (2 * ModelConstants.MODEL_FREQ) == 0:
+ brake_probs = outputs["meta"][0, meta_layout.BRAKE_DISENGAGE]
+ gas_probs = outputs["meta"][0, meta_layout.GAS_DISENGAGE]
+ steer_probs = outputs["meta"][0, meta_layout.STEER_OVERRIDE]
+ takeover_curve = 1 - ((1 - brake_probs) * (1 - gas_probs) * (1 - steer_probs))
+ independent = np.r_[takeover_curve[0], np.diff(takeover_curve) / (1 - takeover_curve[:-1])]
+ memory.disengage_rollup[:-width] = memory.disengage_rollup[width:]
+ memory.disengage_rollup[-width:] = independent
+
+ score = 0.0
+ for idx in range(width):
+ score += memory.disengage_rollup[idx * width + width - 1 - idx].item() / width
+
+ if score < ModelConstants.RYG_GREEN:
+ return ConfidenceClass.green
+ if score < ModelConstants.RYG_YELLOW:
+ return ConfidenceClass.yellow
+ return ConfidenceClass.red
+
+
+def _write_plan_family(model_packet, driving_packet, outputs: dict[str, np.ndarray]) -> None:
+ plan_rows = outputs["plan"][0]
+ plan_stds = outputs["plan_stds"][0]
+ _assign_xyz(model_packet.position, ModelConstants.T_IDXS, *plan_rows[:, Plan.POSITION].T, *plan_stds[:, Plan.POSITION].T)
+ _assign_xyz(model_packet.velocity, ModelConstants.T_IDXS, *plan_rows[:, Plan.VELOCITY].T)
+ _assign_xyz(model_packet.acceleration, ModelConstants.T_IDXS, *plan_rows[:, Plan.ACCELERATION].T)
+ _assign_xyz(model_packet.orientation, ModelConstants.T_IDXS, *plan_rows[:, Plan.T_FROM_CURRENT_EULER].T)
+ _assign_xyz(model_packet.orientationRate, ModelConstants.T_IDXS, *plan_rows[:, Plan.ORIENTATION_RATE].T)
+ _fit_path(driving_packet.path, ModelConstants.POLY_PATH_DEGREE, *plan_rows[:, Plan.POSITION].T)
+
+
+def _write_temporal_pose(model_packet, outputs: dict[str, np.ndarray]) -> None:
+ pose_packet = model_packet.temporalPoseDEPRECATED
+ if "sim_pose" in outputs:
+ half_width = ModelConstants.POSE_WIDTH // 2
+ pose_packet.trans = outputs["sim_pose"][0, :half_width].tolist()
+ pose_packet.transStd = outputs["sim_pose_stds"][0, :half_width].tolist()
+ pose_packet.rot = outputs["sim_pose"][0, half_width:].tolist()
+ pose_packet.rotStd = outputs["sim_pose_stds"][0, half_width:].tolist()
+ return
+
+ pose_packet.trans = outputs["plan"][0, 0, Plan.VELOCITY].tolist()
+ pose_packet.transStd = outputs["plan_stds"][0, 0, Plan.VELOCITY].tolist()
+ pose_packet.rot = outputs["plan"][0, 0, Plan.ORIENTATION_RATE].tolist()
+ pose_packet.rotStd = outputs["plan_stds"][0, 0, Plan.ORIENTATION_RATE].tolist()
+
+
+def _write_lane_family(model_packet, driving_packet, outputs: dict[str, np.ndarray]) -> None:
+ time_axis = plan_x_idxs_helper(ModelConstants, Plan, outputs)
+ model_packet.init("laneLines", 4)
+ for lane_idx in range(4):
+ lane_builder = model_packet.laneLines[lane_idx]
+ _assign_xyz(
+ lane_builder,
+ time_axis,
+ np.array(ModelConstants.X_IDXS),
+ outputs["lane_lines"][0, lane_idx, :, 0],
+ outputs["lane_lines"][0, lane_idx, :, 1],
+ )
+ model_packet.laneLineStds = outputs["lane_lines_stds"][0, :, 0, 0].tolist()
+ model_packet.laneLineProbs = outputs["lane_lines_prob"][0, 1::2].tolist()
+ _lane_snapshot(driving_packet.laneLineMeta, model_packet.laneLines, model_packet.laneLineProbs)
+
+ model_packet.init("roadEdges", 2)
+ for edge_idx in range(2):
+ edge_builder = model_packet.roadEdges[edge_idx]
+ _assign_xyz(
+ edge_builder,
+ time_axis,
+ np.array(ModelConstants.X_IDXS),
+ outputs["road_edges"][0, edge_idx, :, 0],
+ outputs["road_edges"][0, edge_idx, :, 1],
+ )
+ model_packet.roadEdgeStds = outputs["road_edges_stds"][0, :, 0, 0].tolist()
+
+
+def _write_leads(model_packet, outputs: dict[str, np.ndarray]) -> None:
+ model_packet.init("leadsV3", 3)
+ for lead_idx in range(3):
+ lead_builder = model_packet.leadsV3[lead_idx]
+ _assign_xyva(
+ lead_builder,
+ ModelConstants.LEAD_T_IDXS,
+ *outputs["lead"][0, lead_idx].T,
+ *outputs["lead_stds"][0, lead_idx].T,
+ )
+ lead_builder.prob = outputs["lead_prob"][0, lead_idx].tolist()
+ lead_builder.probTime = ModelConstants.LEAD_T_OFFSETS[lead_idx]
+
+
+def _write_meta(model_packet, outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout, frame_id: int) -> None:
+ meta = model_packet.meta
+ meta.desireState = outputs["desire_state"][0].reshape(-1).tolist()
+ meta.desirePrediction = outputs["desire_pred"][0].reshape(-1).tolist()
+ meta.engagedProb = outputs["meta"][0, meta_layout.ENGAGED].item()
+ meta.init("disengagePredictions")
+
+ pred = meta.disengagePredictions
+ pred.t = ModelConstants.META_T_IDXS
+ pred.brakeDisengageProbs = outputs["meta"][0, meta_layout.BRAKE_DISENGAGE].tolist()
+ pred.gasDisengageProbs = outputs["meta"][0, meta_layout.GAS_DISENGAGE].tolist()
+ pred.steerOverrideProbs = outputs["meta"][0, meta_layout.STEER_OVERRIDE].tolist()
+ pred.brake3MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_3].tolist()
+ pred.brake4MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_4].tolist()
+ pred.brake5MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_5].tolist()
+
+ if hasattr(meta_layout, "GAS_PRESS") and hasattr(meta_layout, "BRAKE_PRESS"):
+ pred.gasPressProbs = outputs["meta"][0, meta_layout.GAS_PRESS].tolist()
+ pred.brakePressProbs = outputs["meta"][0, meta_layout.BRAKE_PRESS].tolist()
+
+ meta.hardBrakePredicted = _roll_brake_watch(outputs, memory, meta_layout)
+ model_packet.confidence = _confidence_bucket(outputs, memory, meta_layout, frame_id)
+
+
+def populate_drive_messages(primary_msg: capnp._DynamicStructBuilder, extended_msg: capnp._DynamicStructBuilder,
+ outputs: dict[str, np.ndarray], action: log.ModelDataV2.Action,
+ memory: DrivePacketMemory, vipc_frame_id: int, vipc_frame_id_extra: int,
+ frame_id: int, frame_drop: float, timestamp_eof: int,
+ model_execution_time: float, valid: bool, meta_layout) -> None:
+ frame_age = frame_id - vipc_frame_id if frame_id > vipc_frame_id else 0
+ frame_drop_percent = frame_drop * 100
+ primary_msg.valid = valid
+ extended_msg.valid = valid
+
+ driving_packet = primary_msg.drivingModelData
+ driving_packet.frameId = vipc_frame_id
+ driving_packet.frameIdExtra = vipc_frame_id_extra
+ driving_packet.frameDropPerc = frame_drop_percent
+ driving_packet.modelExecutionTime = model_execution_time
+ driving_packet.action = action
+
+ model_packet = extended_msg.modelV2
+ model_packet.frameId = vipc_frame_id
+ model_packet.frameIdExtra = vipc_frame_id_extra
+ model_packet.frameAge = frame_age
+ model_packet.frameDropPerc = frame_drop_percent
+ model_packet.timestampEof = timestamp_eof
+ model_packet.modelExecutionTime = model_execution_time
+ model_packet.action = action
+
+ _write_plan_family(model_packet, driving_packet, outputs)
+ _write_temporal_pose(model_packet, outputs)
+ _write_lane_family(model_packet, driving_packet, outputs)
+ _write_leads(model_packet, outputs)
+ _write_meta(model_packet, outputs, memory, meta_layout, vipc_frame_id)
+
+ if SEND_RAW_PRED:
+ model_packet.rawPredictions = outputs["raw_pred"].tobytes()
+
+
+def populate_odometry_message(msg: capnp._DynamicStructBuilder, outputs: dict[str, np.ndarray],
+ vipc_frame_id: int, vipc_dropped_frames: int,
+ timestamp_eof: int, live_calib_seen: bool) -> None:
+ msg.valid = live_calib_seen & (vipc_dropped_frames < 1)
+ odo = msg.cameraOdometry
+ odo.frameId = vipc_frame_id
+ odo.timestampEof = timestamp_eof
+ odo.trans = outputs["pose"][0, :3].tolist()
+ odo.rot = outputs["pose"][0, 3:].tolist()
+ odo.wideFromDeviceEuler = outputs["wide_from_device_euler"][0, :].tolist()
+ odo.roadTransformTrans = outputs["road_transform"][0, :3].tolist()
+ odo.transStd = outputs["pose_stds"][0, :3].tolist()
+ odo.rotStd = outputs["pose_stds"][0, 3:].tolist()
+ odo.wideFromDeviceEulerStd = outputs["wide_from_device_euler_stds"][0, :].tolist()
+ odo.roadTransformTransStd = outputs["road_transform_stds"][0, :3].tolist()
+
+__all__ = [
+ "DrivePacketMemory",
+ "pick_curvature",
+ "populate_drive_messages",
+ "populate_odometry_message",
+]
diff --git a/iqpilot/selfdrive/iqmodeld/metadata.py b/iqpilot/selfdrive/iqmodeld/metadata.py
new file mode 100755
index 000000000..ea2ab61f8
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/metadata.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python3
+import codecs
+import pathlib
+import pickle
+import sys
+from collections.abc import Iterable
+from typing import Any
+
+from cereal import custom
+from tinygrad.nn.onnx import OnnxPBParser
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle
+from openpilot.iqpilot.selfdrive.iqmodeld.config import Meta
+
+
+ModelBundle = custom.IQModelManager.ModelBundle
+
+
+def _blank_proto_doc() -> dict[str, Any]:
+ return {"graph": {"input": [], "output": []}, "metadata_props": []}
+
+
+class TelemetryEnvelopeParser(OnnxPBParser):
+ def _parse_ModelProto(self) -> dict:
+ envelope = _blank_proto_doc()
+ for fid, wire_type in self._parse_message(self.reader.len):
+ if fid == 7:
+ envelope["graph"] = self._parse_GraphProto()
+ elif fid == 14:
+ envelope["metadata_props"].append(self._parse_StringStringEntryProto())
+ else:
+ self.reader.skip_field(wire_type)
+ return envelope
+
+
+def _shape_fingerprint(value_info: dict[str, Any]) -> tuple[str, tuple[int, ...]]:
+ resolved = []
+ for axis in value_info["parsed_type"].shape:
+ resolved.append(int(axis) if isinstance(axis, int) else 0)
+ return value_info["name"], tuple(resolved)
+
+
+def _lookup_metadata(props: Iterable[dict[str, Any]], wanted_key: str) -> str | Any:
+ for entry in props:
+ if entry["key"] == wanted_key:
+ return entry["value"]
+ return None
+
+
+class Meta20hz(Meta):
+ ENGAGED = slice(0, 1)
+ GAS_DISENGAGE = slice(1, 31, 6)
+ BRAKE_DISENGAGE = slice(2, 31, 6)
+ STEER_OVERRIDE = slice(3, 31, 6)
+ HARD_BRAKE_3 = slice(4, 31, 6)
+ HARD_BRAKE_4 = slice(5, 31, 6)
+ HARD_BRAKE_5 = slice(6, 31, 6)
+ GAS_PRESS = slice(31, 55, 4)
+ BRAKE_PRESS = slice(32, 55, 4)
+ LEFT_BLINKER = slice(33, 55, 4)
+ RIGHT_BLINKER = slice(34, 55, 4)
+
+
+def select_meta_layout():
+ active_bundle = get_active_bundle()
+ return Meta20hz if active_bundle is not None and active_bundle.is20hz else Meta
+
+
+def _decoded_slices(props: Iterable[dict[str, Any]]):
+ encoded = _lookup_metadata(props, "output_slices")
+ assert encoded is not None, "output_slices not found in metadata"
+ return pickle.loads(codecs.decode(encoded.encode(), "base64"))
+
+
+def _graph_shape_table(graph_doc: dict[str, Any], field_name: str) -> dict[str, tuple[int, ...]]:
+ return dict(_shape_fingerprint(item) for item in graph_doc[field_name])
+
+
+def build_metadata_record(model_path):
+ parsed = TelemetryEnvelopeParser(model_path).parse()
+ props = parsed["metadata_props"]
+ graph = parsed["graph"]
+ return {
+ "model_checkpoint": _lookup_metadata(props, "model_checkpoint"),
+ "output_slices": _decoded_slices(props),
+ "input_shapes": _graph_shape_table(graph, "input"),
+ "output_shapes": _graph_shape_table(graph, "output"),
+ }
+
+
+if __name__ == "__main__":
+ model_path = pathlib.Path(sys.argv[1])
+ metadata_path = model_path.parent / f"{model_path.stem}_metadata.pkl"
+ with open(metadata_path, "wb") as handle:
+ pickle.dump(build_metadata_record(model_path), handle)
+ print(f"saved metadata to {metadata_path}")
diff --git a/iqpilot/selfdrive/iqmodeld/models/__init__.py b/iqpilot/selfdrive/iqmodeld/models/__init__.py
new file mode 100644
index 000000000..c7d1e92cc
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/__init__.py
@@ -0,0 +1,3 @@
+"""
+IQ model selection and runner support that is actively used by iqmodeld.
+"""
diff --git a/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py b/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py
new file mode 100644
index 000000000..aa4a50970
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py
@@ -0,0 +1,100 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import os
+import re
+from pathlib import Path
+
+from openpilot.system.hardware.hw import Paths
+
+
+_MODEL_ROOT = Path(Paths.model_root())
+_OVERRIDE_KEYS = (
+ "combinedRuntimeArtifact",
+ "combinedSplitArtifact",
+ "iqCombinedArtifact",
+)
+_SPLIT_ROLE_PATTERN = re.compile(r"^driving_(vision|policy|off_policy|on_policy)_(.+)_tinygrad\.pkl$")
+
+
+def _bundle_models(bundle) -> list:
+ models = getattr(bundle, "models", None)
+ return list(models) if models is not None else []
+
+
+def _bundle_override_map(bundle) -> dict[str, str]:
+ result: dict[str, str] = {}
+ for override in getattr(bundle, "overrides", None) or []:
+ key = getattr(override, "key", None)
+ value = getattr(override, "value", None)
+ if key and value:
+ result[str(key)] = str(value)
+ return result
+
+
+def _artifact_name(model) -> str:
+ return getattr(getattr(model, "artifact", None), "fileName", "") or ""
+
+
+def _split_suffixes(bundle) -> list[str]:
+ suffixes: list[str] = []
+ for model in _bundle_models(bundle):
+ match = _SPLIT_ROLE_PATTERN.match(_artifact_name(model))
+ if match:
+ suffixes.append(match.group(2))
+ return suffixes
+
+
+def _derived_candidates(bundle) -> list[str]:
+ seen: set[str] = set()
+ candidates: list[str] = []
+
+ for suffix in _split_suffixes(bundle):
+ for candidate in (
+ f"driving_combined_{suffix}.pkl",
+ f"iqmodeld_combined_{suffix}.pkl",
+ ):
+ if candidate not in seen:
+ seen.add(candidate)
+ candidates.append(candidate)
+
+ ref = getattr(bundle, "ref", None)
+ if ref:
+ short_ref = str(ref)[:8]
+ for candidate in (
+ f"driving_combined_{short_ref}.pkl",
+ f"iqmodeld_combined_{short_ref}.pkl",
+ ):
+ if candidate not in seen:
+ seen.add(candidate)
+ candidates.append(candidate)
+
+ return candidates
+
+
+def combined_split_artifact_candidates(bundle) -> list[Path]:
+ explicit_env = os.getenv("IQMODEL_COMBINED_PKL")
+ if explicit_env:
+ explicit_path = Path(explicit_env)
+ return [explicit_path if explicit_path.is_absolute() else _MODEL_ROOT / explicit_path]
+
+ overrides = _bundle_override_map(bundle)
+ explicit_names = [overrides[key] for key in _OVERRIDE_KEYS if key in overrides]
+ if explicit_names:
+ return [_MODEL_ROOT / name for name in explicit_names]
+
+ return [_MODEL_ROOT / name for name in _derived_candidates(bundle)]
+
+
+def resolve_combined_split_artifact(bundle) -> Path | None:
+ for candidate in combined_split_artifact_candidates(bundle):
+ if candidate.is_file():
+ return candidate
+ return None
+
+
+def has_combined_split_artifact(bundle) -> bool:
+ return resolve_combined_split_artifact(bundle) is not None
diff --git a/iqpilot/selfdrive/iqmodeld/models/fetcher.py b/iqpilot/selfdrive/iqmodeld/models/fetcher.py
new file mode 100644
index 000000000..13fc19b90
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/fetcher.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Public entry point for the model-manifest fetcher: prefers the compiled private
+bundle, falling back to the in-tree source. The default-runner fallback lives in
+ManifestDecoder now, so no post-import patching is needed.
+"""
+from openpilot.iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module
+
+try:
+ load_private_module(__name__, "iqpilot_private.models.fetcher")
+except ProprietaryModuleMissing:
+ from iqpilot.models_private_src.fetcher import * # noqa: F403
diff --git a/iqpilot/selfdrive/iqmodeld/models/git_auth.py b/iqpilot/selfdrive/iqmodeld/models/git_auth.py
new file mode 100644
index 000000000..048ca0eee
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/git_auth.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from openpilot.iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module
+
+try:
+ load_private_module(__name__, "iqpilot_private.models.git_auth")
+except ProprietaryModuleMissing:
+ from iqpilot.models_private_src.git_auth import * # noqa: F403
diff --git a/iqpilot/selfdrive/iqmodeld/models/helpers.py b/iqpilot/selfdrive/iqmodeld/models/helpers.py
new file mode 100644
index 000000000..bc0e463e1
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/helpers.py
@@ -0,0 +1,309 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import json
+import os
+import shutil
+from pathlib import Path
+
+from cereal import custom
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module
+from openpilot.system.hardware.hw import Paths
+
+try:
+ load_private_module(__name__, "iqpilot_private.models.helpers")
+except ProprietaryModuleMissing:
+ try:
+ from iqpilot.models_private_src.helpers import * # noqa: F403
+ except ImportError:
+ pass
+
+
+ModelBundle = custom.IQModelManager.ModelBundle
+Runner = custom.IQModelManager.Runner
+_MODEL_ROOT = Path(Paths.model_root())
+_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle"
+_MODELS_CACHE_KEY = "ModelManager_ModelsCache"
+_RUNNER_CACHE_KEY = "ModelRunnerTypeCache"
+_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex"
+_PENDING_MODEL_RESTORE_FILE = "/data/k3_pending_model_restore"
+_STOCK_RUNNER = int(Runner.stock)
+_TINYGRAD_RUNNER = int(Runner.tinygrad)
+_SNPE_RUNNER = int(Runner.snpe)
+
+_DEFAULT_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model"
+_DEFAULT_BUNDLE_JSON = _DEFAULT_MODEL_DIR / "bundle.json"
+_DEFAULT_BUNDLE_REF = "default"
+
+
+def get_default_model_bundle(_bundles):
+ """Legacy compatibility hook: stock default is preinstalled, not a manifest bundle."""
+ return None
+
+
+def _coerce_runner_value(value) -> int | None:
+ raw = getattr(value, "raw", value)
+ try:
+ return int(raw)
+ except (TypeError, ValueError):
+ return None
+
+
+def _bundle_models(bundle) -> list:
+ models = getattr(bundle, "models", None)
+ return list(models) if models is not None else []
+
+
+def _bundle_needs_runtime_upgrade(bundle) -> bool:
+ if bundle is None:
+ return False
+
+ if _coerce_runner_value(getattr(bundle, "runner", None)) == _SNPE_RUNNER:
+ return True
+
+ for model in _bundle_models(bundle):
+ file_name = getattr(getattr(model, "artifact", None), "fileName", "") or ""
+ if file_name.endswith(".thneed"):
+ return True
+
+ return False
+
+
+def _load_cached_manifest_bundles(params: Params):
+ cached = params.get(_MODELS_CACHE_KEY) or {}
+ bundles = []
+ for raw_bundle in cached.get("bundles", []):
+ try:
+ min_selector_version = int(raw_bundle.get("minimumSelectorVersion", raw_bundle.get("minimum_selector_version", 0)))
+ compatibility_view = dict(raw_bundle)
+ compatibility_view["minimumSelectorVersion"] = min_selector_version
+ is_compatible = globals().get("is_bundle_version_compatible")
+ if is_compatible is not None and not is_compatible(compatibility_view):
+ continue
+
+ if "short_name" in raw_bundle:
+ from openpilot.iqpilot.selfdrive.iqmodeld.models.fetcher import ManifestDecoder
+ bundles.append(ManifestDecoder._decode_bundle(raw_bundle))
+ continue
+
+ if "internalName" in raw_bundle:
+ bundles.append(ModelBundle(**raw_bundle))
+ continue
+
+ bundle = ModelBundle()
+ bundle.index = int(raw_bundle["index"])
+ bundle.internalName = raw_bundle.get("short_name")
+ bundle.displayName = raw_bundle.get("display_name")
+ bundle.status = 0
+ bundle.generation = int(raw_bundle["generation"])
+ bundle.environment = raw_bundle["environment"]
+ bundle.runner = raw_bundle.get("runner", Runner.tinygrad)
+ bundle.is20hz = raw_bundle.get("is_20hz", False)
+ bundle.minimumSelectorVersion = int(min_selector_version)
+ bundle.ref = raw_bundle.get("ref")
+ bundle.overrides = []
+ for key, value in raw_bundle.get("overrides", {}).items():
+ override = custom.IQModelManager.Override()
+ override.key = key
+ override.value = value
+ bundle.overrides.append(override)
+
+ bundle.models = []
+ for raw_model in raw_bundle.get("models", []):
+ model = custom.IQModelManager.Model()
+ model.type = raw_model.get("type")
+ for attr_name in ("artifact", "metadata"):
+ raw_artifact = raw_model.get(attr_name)
+ if not raw_artifact:
+ continue
+ artifact = custom.IQModelManager.Artifact()
+ artifact.fileName = raw_artifact.get("file_name")
+ download_uri = custom.IQModelManager.DownloadUri()
+ download_uri.uri = raw_artifact.get("download_uri", {}).get("url")
+ download_uri.sha256 = raw_artifact.get("download_uri", {}).get("sha256")
+ artifact.downloadUri = download_uri
+ setattr(model, attr_name, artifact)
+ bundle.models.append(model)
+
+ bundles.append(bundle)
+ except Exception:
+ continue
+ return bundles
+
+
+def _bundle_match_key(bundle) -> tuple[str | None, str | None, str | None]:
+ return (
+ getattr(bundle, "ref", None),
+ getattr(bundle, "internalName", None),
+ getattr(bundle, "displayName", None),
+ )
+
+
+def _find_runtime_upgrade(bundle, params: Params, available_bundles=None):
+ if not _bundle_needs_runtime_upgrade(bundle):
+ return bundle
+
+ candidate_bundles = available_bundles if available_bundles is not None else _load_cached_manifest_bundles(params)
+ ref, internal_name, display_name = _bundle_match_key(bundle)
+
+ for candidate in candidate_bundles:
+ if getattr(candidate, "ref", None) and getattr(candidate, "ref", None) == ref:
+ return candidate
+
+ for candidate in candidate_bundles:
+ if getattr(candidate, "internalName", None) == internal_name:
+ return candidate
+
+ for candidate in candidate_bundles:
+ if getattr(candidate, "displayName", None) == display_name:
+ return candidate
+
+ return None
+
+
+def bundle_files_ready(bundle) -> bool:
+ if bundle is None:
+ return False
+
+ for model in _bundle_models(bundle):
+ artifact = getattr(model, "artifact", None)
+ metadata = getattr(model, "metadata", None)
+ for file_name in (getattr(metadata, "fileName", None), getattr(artifact, "fileName", None)):
+ if file_name and not (_MODEL_ROOT / file_name).is_file():
+ return False
+ return True
+
+
+def persist_active_bundle(params: Params, bundle) -> None:
+ params.put(_ACTIVE_BUNDLE_KEY, bundle.to_dict())
+ params.remove(_RUNNER_CACHE_KEY)
+
+
+def _load_default_bundle_dict() -> dict:
+ return json.loads(_DEFAULT_BUNDLE_JSON.read_text())
+
+
+def _default_bundle_filenames(bundle_dict: dict) -> list[str]:
+ names = []
+ for model in bundle_dict.get("models", []):
+ for artifact in (model.get("metadata"), model.get("artifact")):
+ file_name = artifact.get("fileName", "") if isinstance(artifact, dict) else ""
+ if file_name:
+ names.append(file_name)
+ return names
+
+
+def is_default_bundle(bundle) -> bool:
+ return bool(bundle is not None and getattr(bundle, "ref", None) == _DEFAULT_BUNDLE_REF)
+
+
+def ensure_default_model_files(bundle_dict: dict = None) -> None:
+ bundle_dict = bundle_dict if bundle_dict is not None else _load_default_bundle_dict()
+ try:
+ _MODEL_ROOT.mkdir(parents=True, exist_ok=True)
+ except OSError as e:
+ cloudlog.exception(f"default_model: cannot create model root: {e}")
+ return
+ for file_name in _default_bundle_filenames(bundle_dict):
+ src = _DEFAULT_MODEL_DIR / file_name
+ dst = _MODEL_ROOT / file_name
+ if not src.is_file():
+ cloudlog.error(f"default_model: shipped asset missing {src}")
+ continue
+ if dst.is_file() and dst.stat().st_size == src.stat().st_size:
+ continue
+ try:
+ shutil.copy2(src, dst)
+ cloudlog.warning(f"default_model: staged {file_name} into model root")
+ except OSError as e:
+ cloudlog.exception(f"default_model: failed staging {file_name}: {e}")
+
+
+def select_default_model(params: Params = None) -> None:
+ params = Params() if params is None else params
+ bundle_dict = _load_default_bundle_dict()
+ ensure_default_model_files(bundle_dict)
+ params.remove(_DOWNLOAD_INDEX_KEY)
+ params.put(_ACTIVE_BUNDLE_KEY, bundle_dict)
+ params.remove(_RUNNER_CACHE_KEY)
+ params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER)
+ try:
+ if os.path.isfile(_PENDING_MODEL_RESTORE_FILE):
+ os.remove(_PENDING_MODEL_RESTORE_FILE)
+ except OSError:
+ pass
+
+
+def seed_default_bundle_if_unset(params: Params = None) -> None:
+ params = Params() if params is None else params
+ if params.get(_ACTIVE_BUNDLE_KEY) or params.get(_DOWNLOAD_INDEX_KEY) is not None:
+ return
+ try:
+ select_default_model(params)
+ cloudlog.warning("default_model: seeded Default (CD210) as active bundle")
+ except Exception as e:
+ cloudlog.exception(f"default_model: failed to seed default bundle: {e}")
+
+
+def get_runtime_bundle_upgrade(bundle, params: Params = None, available_bundles=None):
+ params = Params() if params is None else params
+ return _find_runtime_upgrade(bundle, params, available_bundles)
+
+
+def get_active_bundle(params: Params = None):
+ params = Params() if params is None else params
+
+ try:
+ active_bundle = params.get(_ACTIVE_BUNDLE_KEY) or {}
+ if not active_bundle:
+ return None
+ is_compatible = globals().get("is_bundle_version_compatible")
+ if is_compatible is not None and not is_compatible(active_bundle):
+ return None
+ bundle = ModelBundle(**active_bundle)
+ except Exception:
+ return None
+
+ replacement = _find_runtime_upgrade(bundle, params)
+ if replacement is not None and replacement is not bundle and bundle_files_ready(replacement):
+ persist_active_bundle(params, replacement)
+ return replacement
+
+ return bundle
+
+
+def get_active_model_runner(params: Params = None, force_check=False):
+ params = Params() if params is None else params
+
+ active_bundle = get_active_bundle(params)
+ if not active_bundle:
+ seed_default_bundle_if_unset(params)
+ active_bundle = get_active_bundle(params)
+ if not active_bundle:
+ if params.get(_RUNNER_CACHE_KEY) != str(_TINYGRAD_RUNNER):
+ params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER)
+ return _TINYGRAD_RUNNER
+
+ cached_runner_type = params.get(_RUNNER_CACHE_KEY)
+ if cached_runner_type and not force_check and isinstance(cached_runner_type, str) and cached_runner_type.isdigit():
+ return int(cached_runner_type)
+
+ runner_type = _coerce_runner_value(active_bundle.runner)
+ if runner_type == _SNPE_RUNNER:
+ replacement = _find_runtime_upgrade(active_bundle, params)
+ if replacement is not None and replacement is not active_bundle and bundle_files_ready(replacement):
+ persist_active_bundle(params, replacement)
+ runner_type = _coerce_runner_value(replacement.runner)
+ else:
+ if replacement is not None and getattr(replacement, "index", None) is not None and params.get(_DOWNLOAD_INDEX_KEY) is None:
+ params.put(_DOWNLOAD_INDEX_KEY, int(replacement.index))
+ cloudlog.warning(f"Queued tinygrad migration for retired bundle {getattr(active_bundle, 'internalName', '')}")
+ runner_type = _TINYGRAD_RUNNER
+
+ if cached_runner_type != runner_type:
+ params.put(_RUNNER_CACHE_KEY, int(runner_type))
+
+ return runner_type
diff --git a/iqpilot/selfdrive/iqmodeld/models/inference_state.py b/iqpilot/selfdrive/iqmodeld/models/inference_state.py
new file mode 100644
index 000000000..9209d55cb
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/inference_state.py
@@ -0,0 +1,13 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Common base for the per-process inference/runtime states. It seeds the lateral
+steer delay from the cached learned value so every subclass starts with a usable
+number before its first liveDelay message arrives.
+"""
+from openpilot.iqpilot.common.steer_delay import cached_steer_delay
+
+
+class InferenceStateBase:
+ def __init__(self):
+ self.lat_delay = cached_steer_delay()
diff --git a/iqpilot/selfdrive/iqmodeld/models/manager.py b/iqpilot/selfdrive/iqmodeld/models/manager.py
new file mode 100644
index 000000000..1596d2e3d
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/manager.py
@@ -0,0 +1,391 @@
+#!/usr/bin/env python3
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import asyncio
+import hashlib
+import os
+import time
+from pathlib import Path
+
+import aiohttp
+from cereal import custom
+from openpilot.common.realtime import Ratekeeper
+from openpilot.common.time_helpers import system_time_valid
+from openpilot.iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module
+from openpilot.common.swaglog import cloudlog
+from openpilot.system.hardware.hw import Paths
+
+_TIME_SYNC_WAIT_TIMEOUT_S = 30.0
+_TIME_SYNC_POLL_S = 0.5
+
+
+def _wait_for_valid_clock(timeout: float = _TIME_SYNC_WAIT_TIMEOUT_S) -> None:
+ if system_time_valid():
+ return
+ cloudlog.warning("models_manager: system clock not yet valid, waiting for NTP before fetching")
+ deadline = time.monotonic() + timeout
+ while time.monotonic() < deadline:
+ if system_time_valid():
+ cloudlog.warning("models_manager: system clock is now valid, resuming")
+ return
+ time.sleep(_TIME_SYNC_POLL_S)
+ cloudlog.warning("models_manager: gave up waiting for a valid clock, proceeding anyway")
+
+try:
+ load_private_module(__name__, "iqpilot_private.models.manager")
+ _BaseIQModelManager = IQModelManager # noqa: F821
+except ProprietaryModuleMissing:
+ from iqpilot.models_private_src.manager import IQModelManager as _BaseIQModelManager
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.git_auth import get_aiohttp_auth
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import (
+ bundle_files_ready,
+ get_active_bundle,
+ get_runtime_bundle_upgrade,
+ is_default_bundle,
+ persist_active_bundle,
+)
+
+
+_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle"
+_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex"
+_RUNNER_CACHE_KEY = "ModelRunnerTypeCache"
+
+
+class IQModelManager(_BaseIQModelManager):
+ def __init__(self):
+ super().__init__()
+ self._validated_active_key: tuple[tuple[str, str], ...] | None = None
+ self._manifest_refresh_key: tuple[tuple[str, str], ...] | None = None
+
+ @staticmethod
+ def _bundle_index(bundle) -> int | None:
+ try:
+ return int(getattr(bundle, "index", -1))
+ except (TypeError, ValueError):
+ return None
+
+ @staticmethod
+ def _bundle_files(bundle) -> list[tuple[str, str]]:
+ files = []
+ for model in getattr(bundle, "models", []) or []:
+ for artifact in (getattr(model, "metadata", None), getattr(model, "artifact", None)):
+ filename = getattr(artifact, "fileName", "") if artifact is not None else ""
+ if not filename:
+ continue
+ download_uri = getattr(artifact, "downloadUri", None)
+ sha256 = getattr(download_uri, "sha256", "") if download_uri is not None else ""
+ files.append((filename, sha256 or ""))
+ return files
+
+ @staticmethod
+ def _safe_model_path(filename: str) -> Path | None:
+ if not filename or os.path.basename(filename) != filename:
+ cloudlog.warning(f"Ignoring unsafe model filename {filename!r}")
+ return None
+
+ root = Path(Paths.model_root()).resolve()
+ path = (root / filename).resolve()
+ try:
+ path.relative_to(root)
+ except ValueError:
+ cloudlog.warning(f"Ignoring model path outside model root {path}")
+ return None
+ return path
+
+ @staticmethod
+ def _verify_file_sync(path: Path, expected_hash: str) -> bool:
+ if not path.is_file():
+ return False
+ if not expected_hash:
+ return True
+
+ sha256_hash = hashlib.sha256()
+ with open(path, "rb") as f:
+ for chunk in iter(lambda: f.read(1024 * 1024), b""):
+ sha256_hash.update(chunk)
+ return sha256_hash.hexdigest().lower() == expected_hash.lower()
+
+ def _bundle_validation_key(self, bundle) -> tuple[tuple[str, str], ...]:
+ return tuple(self._bundle_files(bundle))
+
+ def _bundle_files_valid(self, bundle) -> bool:
+ for filename, expected_hash in self._bundle_files(bundle):
+ path = self._safe_model_path(filename)
+ if path is None or not self._verify_file_sync(path, expected_hash):
+ return False
+ return True
+
+ def _remove_bundle_files(self, bundle) -> None:
+ for filename, _expected_hash in self._bundle_files(bundle):
+ path = self._safe_model_path(filename)
+ if path is None:
+ continue
+ for candidate in (path, Path(f"{path}.download")):
+ try:
+ if candidate.is_file():
+ candidate.unlink()
+ except OSError as e:
+ cloudlog.exception(f"Failed to remove model artifact {candidate}: {e}")
+
+ def _find_available_bundle(self, target):
+ target_index = self._bundle_index(target)
+ target_ref = getattr(target, "ref", None)
+ target_internal = getattr(target, "internalName", None)
+ target_display = getattr(target, "displayName", None)
+
+ for bundle in self.available_models:
+ if target_index is not None and self._bundle_index(bundle) == target_index:
+ return bundle
+ if target_ref and getattr(bundle, "ref", None) == target_ref:
+ return bundle
+ if target_internal and getattr(bundle, "internalName", None) == target_internal:
+ return bundle
+ if target_display and getattr(bundle, "displayName", None) == target_display:
+ return bundle
+ return None
+
+ def _bundle_matches(self, left, right) -> bool:
+ if left is None or right is None:
+ return False
+
+ left_index = self._bundle_index(left)
+ right_index = self._bundle_index(right)
+ if left_index is not None and right_index is not None and left_index == right_index:
+ return True
+
+ for attr in ("ref", "internalName", "displayName"):
+ left_value = getattr(left, attr, None)
+ if left_value and left_value == getattr(right, attr, None):
+ return True
+ return False
+
+ def _clear_active_bundle(self) -> None:
+ self.params.remove(_ACTIVE_BUNDLE_KEY)
+ self.params.remove(_RUNNER_CACHE_KEY)
+ self.active_bundle = None
+ self._validated_active_key = None
+
+ def _download_request_matches(self, bundle) -> bool:
+ bundle_index = self._bundle_index(bundle)
+ return bundle_index is not None and self._download_index() == bundle_index
+
+ def _queue_active_redownload_if_invalid(self) -> None:
+ if self.active_bundle is None:
+ self._validated_active_key = None
+ return
+
+ validation_key = self._bundle_validation_key(self.active_bundle)
+ if validation_key == self._validated_active_key:
+ return
+
+ if self._bundle_files_valid(self.active_bundle):
+ self._validated_active_key = validation_key
+ return
+
+ bundle = self._find_available_bundle(self.active_bundle) or self.active_bundle
+ bundle_index = self._bundle_index(bundle)
+ cloudlog.warning(f"Active model {_display_bundle_name(self.active_bundle)} is missing or corrupt; queueing redownload")
+ self._remove_bundle_files(bundle)
+ self._clear_active_bundle()
+ if bundle_index is not None and self._download_index() is None:
+ self.params.put(_DOWNLOAD_INDEX_KEY, bundle_index)
+
+ def _find_manifest_counterpart(self, target):
+ # never match by index: indexes shift between manifest generations, and a
+ # positional match could redownload a different model than the user selected
+ for attr in ("ref", "internalName", "displayName"):
+ value = getattr(target, attr, None)
+ if not value:
+ continue
+ for bundle in self.available_models:
+ if getattr(bundle, attr, None) == value:
+ return bundle
+ return None
+
+ def _queue_active_manifest_refresh(self) -> None:
+ active = self.active_bundle
+ if active is None or is_default_bundle(active):
+ return
+ if self._download_index() is not None:
+ return
+
+ counterpart = self._find_manifest_counterpart(active)
+ if counterpart is None:
+ return
+ counterpart_index = self._bundle_index(counterpart)
+ if counterpart_index is None:
+ return
+
+ active_files = dict(self._bundle_files(active))
+ stale = False
+ for filename, sha in self._bundle_files(counterpart):
+ if not sha:
+ continue
+ active_sha = active_files.get(filename)
+ # an empty recorded hash can't prove a mismatch, so it never triggers a redownload
+ if active_sha is None or (active_sha and active_sha.lower() != sha.lower()):
+ stale = True
+ break
+ if not stale:
+ self._manifest_refresh_key = None
+ return
+
+ # the manifest may be an expired offline cache, so keep the active bundle and its
+ # files in place: the download flow replaces artifacts atomically and only persists
+ # the counterpart as active once everything landed. One attempt per bundle per run
+ # so a dead network doesn't turn the 1Hz loop into a download-retry storm.
+ key = self._bundle_validation_key(active)
+ if key == self._manifest_refresh_key:
+ return
+ self._manifest_refresh_key = key
+
+ cloudlog.warning(f"Active model {_display_bundle_name(active)} artifacts are stale vs current manifest; queueing redownload")
+ self.params.put(_DOWNLOAD_INDEX_KEY, counterpart_index)
+
+ async def _download_file(self, url: str, path: str, model) -> None:
+ temp_path = f"{path}.download"
+ self._download_start_times[model.fileName] = time.monotonic()
+
+ try:
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+
+ async with aiohttp.ClientSession(auth=get_aiohttp_auth()) as session:
+ async with session.get(url) as response:
+ response.raise_for_status()
+ total_size = int(response.headers.get("content-length", 0))
+ bytes_downloaded = 0
+
+ with open(temp_path, "wb") as f:
+ async for chunk in response.content.iter_chunked(self._chunk_size):
+ f.write(chunk)
+ bytes_downloaded += len(chunk)
+
+ if self._download_index() is None:
+ raise Exception("Download cancelled")
+
+ if total_size > 0:
+ progress = (bytes_downloaded / total_size) * 100
+ model.downloadProgress.status = custom.IQModelManager.DownloadStatus.downloading
+ model.downloadProgress.progress = progress
+ model.downloadProgress.eta = self._calculate_eta(model.fileName, progress)
+ self._report_status()
+
+ f.flush()
+ os.fsync(f.fileno())
+
+ os.replace(temp_path, path)
+
+ except Exception:
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+ raise
+
+ finally:
+ self._download_start_times.pop(model.fileName, None)
+
+ async def _download_bundle(self, model_bundle: custom.IQModelManager.ModelBundle, destination_path: str) -> None:
+ self.selected_bundle = model_bundle
+ self.selected_bundle.status = custom.IQModelManager.DownloadStatus.downloading
+ os.makedirs(destination_path, exist_ok=True)
+
+ try:
+ if not self._download_request_matches(model_bundle):
+ raise RuntimeError("Download cancelled")
+
+ tasks = [self._process_model(model, destination_path) for model in self.selected_bundle.models]
+ await asyncio.gather(*tasks)
+
+ if not self._download_request_matches(model_bundle):
+ raise RuntimeError("Download cancelled")
+
+ self.active_bundle = self.selected_bundle
+ self.active_bundle.status = custom.IQModelManager.DownloadStatus.downloaded
+ self.params.put(_ACTIVE_BUNDLE_KEY, self.active_bundle.to_dict())
+ self.params.remove(_RUNNER_CACHE_KEY)
+ self.selected_bundle = None
+
+ except Exception:
+ if self._download_request_matches(model_bundle) and self.selected_bundle is not None:
+ self.selected_bundle.status = custom.IQModelManager.DownloadStatus.failed
+ else:
+ self.selected_bundle = None
+ raise
+
+ finally:
+ self._report_status()
+
+ def download(self, model_bundle: custom.IQModelManager.ModelBundle, destination_path: str) -> None:
+ asyncio.run(self._download_bundle(model_bundle, destination_path))
+
+ def _queue_tinygrad_upgrade(self) -> None:
+ if self.active_bundle is None:
+ return
+
+ replacement = get_runtime_bundle_upgrade(self.active_bundle, self.params, self.available_models)
+ if replacement is None or replacement is self.active_bundle:
+ return
+
+ if bundle_files_ready(replacement):
+ persist_active_bundle(self.params, replacement)
+ self.active_bundle = replacement
+ return
+
+ if self._download_index() is None and getattr(replacement, "index", None) is not None:
+ self.params.put("ModelManager_DownloadIndex", int(replacement.index))
+ cloudlog.warning(f"Queued tinygrad upgrade for retired bundle {getattr(self.active_bundle, 'internalName', '')}")
+
+ def main_thread(self) -> None:
+ _wait_for_valid_clock()
+ rk = Ratekeeper(1, print_delay_threshold=None)
+
+ while True:
+ try:
+ # before NTP the TLS cert reads "not yet valid" and every fetch SSL-fails; one line, not spam
+ if not system_time_valid():
+ if not getattr(self, "_ntp_wait_logged", False):
+ cloudlog.warning("models_manager: waiting for NTP before fetching (system clock not valid)")
+ self._ntp_wait_logged = True
+ rk.keep_time()
+ continue
+ self._ntp_wait_logged = False
+
+ self.available_models = self.model_fetcher.get_available_bundles()
+ self.active_bundle = get_active_bundle(self.params)
+ self._queue_active_redownload_if_invalid()
+ self._queue_tinygrad_upgrade()
+ self._queue_active_manifest_refresh()
+
+ if (index_to_download := self._download_index()) is not None:
+ if model_to_download := next((model for model in self.available_models if model.index == index_to_download), None):
+ try:
+ self.download(model_to_download, Paths.model_root())
+ except Exception as e:
+ cloudlog.exception(e)
+ finally:
+ self.params.remove("ModelManager_DownloadIndex")
+ self.selected_bundle = None
+
+ if self.params.get("ModelManager_ClearCache"):
+ self.clear_model_cache()
+ self.params.remove("ModelManager_ClearCache")
+
+ self._report_status()
+ rk.keep_time()
+
+ except Exception as e:
+ cloudlog.exception(f"Error in main thread: {str(e)}")
+ rk.keep_time()
+
+
+def _display_bundle_name(bundle) -> str:
+ return getattr(bundle, "internalName", None) or getattr(bundle, "displayName", None) or ""
+
+
+def main():
+ IQModelManager().main_thread()
+
+if __name__ == "__main__":
+ main()
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py b/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py
new file mode 100644
index 000000000..a4189be90
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py
@@ -0,0 +1,3 @@
+"""
+Runner interfaces used by iqmodeld model execution.
+"""
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py
new file mode 100644
index 000000000..33983a783
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py
@@ -0,0 +1,207 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import os
+import pickle as _pk
+from dataclasses import dataclass, field
+from typing import TYPE_CHECKING, Any
+
+import numpy as np
+from cereal import custom
+from openpilot.system.hardware import TICI
+from openpilot.system.hardware.hw import Paths as _hw_paths
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle as _fetch_bundle
+from openpilot.iqpilot.selfdrive.iqmodeld.models.combined_artifact import has_combined_split_artifact
+
+# ---- runtime type surface (native OpenCL/frame handles resolve to Any off-device) ----
+if TYPE_CHECKING:
+ from openpilot.iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import GpuMemorySlot, RoadProjector
+else:
+ def _resolve_native_types() -> tuple[Any, Any]:
+ try:
+ from openpilot.iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import GpuMemorySlot as iq_clmem
+ from openpilot.iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import RoadProjector as iq_frame
+ return iq_clmem, iq_frame
+ except (ModuleNotFoundError, ImportError):
+ return Any, Any
+
+ GpuMemorySlot, RoadProjector = _resolve_native_types()
+
+NumpyDict = dict[str, np.ndarray]
+ShapeDict = dict[str, tuple[int, ...]]
+SliceDict = dict[str, slice]
+CLMemDict = dict[str, GpuMemorySlot]
+FrameDict = dict[str, RoadProjector]
+
+ModelType = custom.IQModelManager.Model.Type
+Model = custom.IQModelManager.Model
+
+SEND_RAW_PRED = os.getenv("SEND_RAW_PRED")
+CUSTOM_MODEL_PATH = _hw_paths.model_root()
+
+_META_FIELDS = ("input_shapes", "output_slices")
+
+USBGPU = "USBGPU" in os.environ
+
+
+def _configure_accelerator():
+ """Point tinygrad at the right backend. Must run before tinygrad is imported,
+ which is why it fires at module import."""
+ backend, extra = ("QCOM" if TICI else "CPU"), {}
+ if USBGPU:
+ backend, extra = "AMD", {"AMD_IFACE": "USB"}
+ elif TICI:
+ extra = {"QCOM_PRIORITY": "8"}
+ os.environ["DEV"] = backend
+ os.environ.update(extra)
+
+
+_configure_accelerator()
+
+
+def load_artifact_metadata(metadata_filename):
+ """Read one artifact's metadata pkl: (input shapes, output slices)."""
+ with open(os.path.join(CUSTOM_MODEL_PATH, metadata_filename), 'rb') as fh:
+ blob = _pk.load(fh)
+ return tuple(blob.get(field, {}) for field in _META_FIELDS)
+
+
+@dataclass
+class ArtifactSpec:
+ """One model of the active bundle plus its unpacked metadata."""
+ model: Any
+ metadata: Any = None
+ input_shapes: ShapeDict = field(default_factory=dict)
+ output_slices: SliceDict = field(default_factory=dict)
+
+ def __post_init__(self):
+ self.metadata = self.model.metadata
+ if self.metadata:
+ self.input_shapes, self.output_slices = load_artifact_metadata(self.metadata.fileName)
+
+
+# kept name: some runners annotate against the old alias
+ModelData = ArtifactSpec
+
+
+class RunnerRoot:
+ """Shared root of the runner hierarchy.
+
+ Both ModelRunner and the per-model parser mixins (model_types.py) inherit
+ this, so the concrete `TinygradRunner(ModelRunner, *Tinygrad)` diamond keeps
+ one consistent parser registry + slice implementation.
+ """
+
+ parser_method_dict: dict
+ _model_data: "ArtifactSpec | None"
+
+ def _slice_outputs(self, model_outputs):
+ raise NotImplementedError
+
+
+class ModelRunner(RunnerRoot):
+ """Base for the tinygrad/ONNX runners.
+
+ Owns the active bundle's ArtifactSpecs and the shared slice/parse plumbing;
+ subclasses provide input staging (prepare_inputs) and execution (_run_model).
+ """
+
+ # False for fused runners, which warp + manage temporal buffers inside the JIT
+ uses_opencl_warp = True
+
+ def __init__(self):
+ active = _fetch_bundle()
+ if not active:
+ raise ValueError("runner started without an active model bundle")
+
+ self.models = {spec.type.raw: ArtifactSpec(spec) for spec in active.models}
+ self.is_20hz_3d = False
+ self.is_20hz = active.is20hz
+ self.inputs = {}
+ self.parser_method_dict = {}
+ self._model_data = None # active spec for the current operation
+ self._parser = self._constants = None
+
+ def _active_spec(self):
+ spec = self._model_data
+ if spec is None:
+ raise ValueError("Model data is not available. Ensure the model is loaded correctly.")
+ return spec
+
+ # views proxied straight off the active artifact spec; kept out of the class
+ # body (served via __getattr__) so the read surface stays data-driven
+ _SPEC_VIEW = frozenset(("input_shapes", "output_slices"))
+
+ def __getattr__(self, name):
+ if name == "constants":
+ return self._constants
+ if name == "vision_input_names":
+ return list(self._active_spec().input_shapes)
+ if name in ModelRunner._SPEC_VIEW:
+ return getattr(self._active_spec(), name)
+ raise AttributeError(name)
+
+ def prepare_inputs(self, imgs_cl, numpy_inputs, frames):
+ """Stage image + numpy inputs for inference; implemented per backend."""
+ raise NotImplementedError
+
+ def _run_model(self):
+ """Execute inference over the staged inputs; implemented per backend."""
+ raise NotImplementedError
+
+ def run_model(self):
+ # parsing happens inside each backend's _run_model
+ return self._run_model()
+
+ def _slice_outputs(self, model_outputs):
+ """Split the flat output vector into named views per the artifact's slice table."""
+ sliced = {}
+ for tag, span in self._active_spec().output_slices.items():
+ sliced[tag] = model_outputs[np.newaxis, span]
+ if SEND_RAW_PRED:
+ sliced["raw_pred"] = model_outputs.copy()
+ return sliced
+
+
+# ---- runner selection (which backend to build for the active bundle) ----------
+
+def _single_artifact_prefix(bundle, prefix: str) -> bool:
+ return len(bundle.models) == 1 and bundle.models[0].artifact.fileName.startswith(prefix)
+
+
+def _is_fused_bundle(bundle) -> bool:
+ return _single_artifact_prefix(bundle, "driving_fused_")
+
+
+def _is_supercombo_bundle(bundle) -> bool:
+ return _single_artifact_prefix(bundle, "driving_supercombo_")
+
+
+def _is_split_bundle(bundle) -> bool:
+ present = {m.type.raw for m in bundle.models}
+ split_kinds = {ModelType.vision, ModelType.policy, ModelType.offPolicy, ModelType.onPolicy}
+ return not present.isdisjoint(split_kinds)
+
+
+def get_model_runner() -> "ModelRunner":
+ """Build the runner backend that fits the active bundle (supercombo / fused /
+ combined-split / split / single). Concrete runners are imported lazily so one
+ backend failing to load can't take down the others at import time."""
+ from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import (TinygradRunner,
+ TinygradSplitRunner)
+ bundle = _fetch_bundle()
+ if not (bundle and bundle.models):
+ return TinygradRunner(ModelType.supercombo)
+
+ if _is_supercombo_bundle(bundle):
+ from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import TinygradSupercomboRunner
+ return TinygradSupercomboRunner()
+ if _is_fused_bundle(bundle):
+ from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.fused_runner import TinygradFusedRunner
+ return TinygradFusedRunner()
+ if _is_split_bundle(bundle) and has_combined_split_artifact(bundle):
+ from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.combined_split_runner import TinygradCombinedSplitRunner
+ return TinygradCombinedSplitRunner()
+ if _is_split_bundle(bundle):
+ return TinygradSplitRunner()
+ return TinygradRunner(bundle.models[0].type.raw)
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/onnx/__init__.py b/iqpilot/selfdrive/iqmodeld/models/runners/onnx/__init__.py
new file mode 100644
index 000000000..801e27fea
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/onnx/__init__.py
@@ -0,0 +1,3 @@
+"""
+ONNX runner support for iqmodeld.
+"""
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/onnx/onnx_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/onnx/onnx_runner.py
new file mode 100644
index 000000000..120af6d57
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/onnx/onnx_runner.py
@@ -0,0 +1,57 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CLMemDict, FrameDict, ModelType, NumpyDict, ShapeDict
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner
+from openpilot.iqpilot.selfdrive.iqmodeld import MODEL_PATH
+from openpilot.iqpilot.selfdrive.iqmodeld.config import ModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import ArchiveParser
+from openpilot.iqpilot.selfdrive.iqmodeld.runtime.ort import ORT_TYPES_TO_NP_TYPES, make_onnx_cpu_runner
+
+
+def _onnx_dtype_table(session) -> dict[str, np.dtype]:
+ return {
+ tensor_info.name: ORT_TYPES_TO_NP_TYPES[tensor_info.type]
+ for tensor_info in session.get_inputs()
+ }
+
+
+class ONNXRunner(ModelRunner):
+ def __init__(self):
+ super().__init__()
+ self.runner = make_onnx_cpu_runner(MODEL_PATH)
+ self._constants = ModelConstants
+ self._model_data = self.models.get(ModelType.supercombo)
+ self._input_dtypes = _onnx_dtype_table(self.runner)
+ self._parser = ArchiveParser()
+ self.parser_method_dict[ModelType.supercombo] = self._parser.parse_outputs
+
+ @property
+ def input_shapes(self) -> ShapeDict:
+ return {tensor_info.name: tensor_info.shape for tensor_info in self.runner.get_inputs()}
+
+ def _frame_as_numpy(self, stream_name: str, imgs_cl: CLMemDict, frames: FrameDict) -> np.ndarray:
+ flattened = frames[stream_name].as_numpy(imgs_cl[stream_name])
+ shaped = flattened.reshape(self.input_shapes[stream_name])
+ return shaped.astype(self._input_dtypes[stream_name])
+
+ def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict:
+ staged_inputs = dict(numpy_inputs)
+ for stream_name in imgs_cl:
+ staged_inputs[stream_name] = self._frame_as_numpy(stream_name, imgs_cl, frames)
+ self.inputs = staged_inputs
+ return staged_inputs
+
+ def _parse_outputs(self, model_outputs: np.ndarray) -> NumpyDict:
+ if self._model_data is None:
+ raise ValueError("Model data is not available. Ensure the model is loaded correctly.")
+ return self.parser_method_dict[self._model_data.model.type.raw](self._slice_outputs(model_outputs))
+
+ def _run_model(self) -> NumpyDict:
+ combined = self.runner.run(None, self.inputs)[0].reshape(-1)
+ return self._parse_outputs(combined)
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py
new file mode 100644
index 000000000..0d071a62d
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py
@@ -0,0 +1,3 @@
+"""
+Tinygrad runner support for iqmodeld.
+"""
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py
new file mode 100644
index 000000000..9e54b32a5
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py
@@ -0,0 +1,245 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import os
+import pickle
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.combined_artifact import resolve_combined_split_artifact
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import NumpyDict, ShapeDict, SliceDict
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner
+from openpilot.iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import PhaseParser
+
+
+def _tinygrad_imports():
+ from tinygrad.device import Device
+ from tinygrad.tensor import Tensor
+ return Tensor, Device
+
+
+def _phase_roles(meta_by_role: dict[str, dict]) -> list[str]:
+ return [name for name in meta_by_role if name != "vision"]
+
+
+def _phase_desire_key(policy_shapes: dict[str, tuple[int, ...]]) -> str:
+ for key in policy_shapes:
+ if key.startswith("desire"):
+ return key
+ raise KeyError("No desire-like key found in policy inputs")
+
+
+def _phase_image_keys(vision_shapes: dict[str, tuple[int, ...]]) -> tuple[str, str]:
+ names = sorted(name for name in vision_shapes if "img" in name)
+ road_key = next((name for name in names if "big" not in name), None)
+ wide_key = next((name for name in names if "big" in name), None)
+ if road_key is None or wide_key is None:
+ raise ValueError(f"Unable to resolve road/wide image keys from {list(vision_shapes)}")
+ return road_key, wide_key
+
+
+def _base_policy_keys(policy_shapes: dict[str, tuple[int, ...]]) -> set[str]:
+ desired_key = _phase_desire_key(policy_shapes)
+ return {desired_key, "features_buffer", "traffic_convention", "action_t"}
+
+
+def _slice_map(raw_blob: np.ndarray, slices: dict[str, slice]) -> NumpyDict:
+ return {name: raw_blob[np.newaxis, section] for name, section in slices.items() if name != "pad"}
+
+
+class TinygradCombinedSplitRunner(ModelRunner):
+ uses_opencl_warp: bool = False
+
+ def __init__(self):
+ super().__init__()
+ self._constants = SplitModelConstants
+ self._parser = PhaseParser()
+ self._bundle = get_active_bundle()
+ self._artifact_path = resolve_combined_split_artifact(self._bundle)
+ if self._artifact_path is None:
+ raise FileNotFoundError("No IQ combined split artifact is available for the active bundle")
+
+ with open(self._artifact_path, "rb") as artifact:
+ runtime_package: dict[Any, Any] = pickle.load(artifact)
+
+ self._meta_by_role = runtime_package.get("meta_by_role", runtime_package.get("metadata", {}))
+ self._policy_roles = runtime_package.get("roles", _phase_roles(self._meta_by_role))
+ self._camera_programs = {
+ camera_key: spec
+ for camera_key, spec in runtime_package.items()
+ if isinstance(camera_key, tuple) and isinstance(spec, dict)
+ }
+ self._execute_bundle = runtime_package.get("execute_bundle", runtime_package.get("run_policy"))
+ self._frame_stride = int(runtime_package.get("frame_stride", runtime_package.get("frame_skip", 1)))
+
+ if "vision" not in self._meta_by_role:
+ raise ValueError("Combined split artifact is missing vision metadata")
+ if not self._policy_roles:
+ raise ValueError("Combined split artifact is missing policy roles")
+ if self._execute_bundle is None:
+ raise ValueError("Combined split artifact is missing execute_bundle")
+
+ self._vision_meta = self._meta_by_role["vision"]
+ self._primary_policy_meta = self._meta_by_role[self._policy_roles[0]]
+ self._desired_key = _phase_desire_key(self._primary_policy_meta["input_shapes"])
+ self._road_key, self._wide_key = _phase_image_keys(self._vision_meta["input_shapes"])
+ self._extra_policy_keys = [
+ key for key in self._primary_policy_meta["input_shapes"]
+ if key not in _base_policy_keys(self._primary_policy_meta["input_shapes"])
+ ]
+
+ self._queue_tensors: dict[str, Any] | None = None
+ self._numpy_state: dict[str, np.ndarray] | None = None
+ self._camera_shape: tuple[int, int] | None = None
+ self._blob_cache: dict[tuple[str, int], Any] = {}
+ self._last_desire = np.zeros(self._primary_policy_meta["input_shapes"][self._desired_key][2], dtype=np.float32)
+
+ @property
+ def vision_input_names(self) -> list[str]:
+ return [self._road_key, self._wide_key]
+
+ @property
+ def input_shapes(self) -> ShapeDict:
+ merged: ShapeDict = dict(self._vision_meta["input_shapes"])
+ for role in self._policy_roles:
+ merged.update(self._meta_by_role[role]["input_shapes"])
+ return merged
+
+ @property
+ def output_slices(self) -> SliceDict:
+ merged: SliceDict = dict(self._vision_meta["output_slices"])
+ for role in self._policy_roles:
+ merged.update(self._meta_by_role[role]["output_slices"])
+ return merged
+
+ def prepare_inputs(self, imgs_cl, numpy_inputs, frames):
+ raise RuntimeError("Combined split runner manages its own warp + queue state; use run_fused()")
+
+ def _frame_blob(self, stream_name: str, buf):
+ Tensor, Device = _tinygrad_imports()
+ raw_frame = np.frombuffer(buf.data, dtype=np.uint8)
+ cache_key = (stream_name, raw_frame.ctypes.data)
+ tensor = self._blob_cache.get(cache_key)
+ if tensor is None:
+ tensor = Tensor.from_blob(raw_frame.ctypes.data, (raw_frame.size,), dtype="uint8", device=Device.DEFAULT)
+ self._blob_cache[cache_key] = tensor
+ return tensor
+
+ def _allocate_runtime_state(self, camera_width: int, camera_height: int) -> None:
+ if self._queue_tensors is not None and self._camera_shape == (camera_width, camera_height):
+ return
+ if (camera_width, camera_height) not in self._camera_programs:
+ raise RuntimeError(f"No combined split kernels available for {camera_width}x{camera_height}")
+
+ Tensor, Device = _tinygrad_imports()
+ vision_shapes = self._vision_meta["input_shapes"]
+ policy_shapes = self._primary_policy_meta["input_shapes"]
+
+ image_shape = vision_shapes[self._road_key]
+ frame_history = image_shape[1] // 6
+ queue_depth = self._frame_stride * (frame_history - 1) + 1
+ frame_queue_shape = (queue_depth, 6, image_shape[2], image_shape[3])
+
+ feature_shape = policy_shapes["features_buffer"]
+ desired_shape = policy_shapes[self._desired_key]
+ traffic_shape = policy_shapes["traffic_convention"]
+ action_shape = policy_shapes.get("action_t", traffic_shape)
+
+ numpy_state = {
+ "tfm": np.zeros((3, 3), dtype=np.float32),
+ "big_tfm": np.zeros((3, 3), dtype=np.float32),
+ "desire": np.zeros(desired_shape[2], dtype=np.float32),
+ "traffic_convention": np.zeros(traffic_shape, dtype=np.float32),
+ "action_t": np.zeros(action_shape, dtype=np.float32),
+ }
+ for key in self._extra_policy_keys:
+ numpy_state[key] = np.zeros(policy_shapes[key], dtype=np.float32)
+
+ queue_tensors = {
+ "img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize(),
+ "big_img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize(),
+ "feat_q": Tensor(
+ np.zeros((self._frame_stride * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32),
+ device=Device.DEFAULT,
+ ).contiguous().realize(),
+ "desire_q": Tensor(
+ np.zeros((self._frame_stride * desired_shape[1], desired_shape[0], desired_shape[2]), dtype=np.float32),
+ device=Device.DEFAULT,
+ ).contiguous().realize(),
+ **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()},
+ }
+
+ self._queue_tensors = queue_tensors
+ self._numpy_state = numpy_state
+ self._camera_shape = (camera_width, camera_height)
+
+ def _policy_inputs(self) -> dict[str, Any]:
+ assert self._queue_tensors is not None
+ tensor_names = ["feat_q", "desire_q", "desire", "traffic_convention", "action_t", *self._extra_policy_keys]
+ return {name: self._queue_tensors[name] for name in tensor_names if name in self._queue_tensors}
+
+ def _merge_policy_outputs(self, raw_outputs: tuple[Any, ...]) -> NumpyDict:
+ outputs = self._parser.parse_vision_outputs(
+ _slice_map(raw_outputs[0].numpy().flatten(), self._vision_meta["output_slices"])
+ )
+
+ has_on_policy = any(role == "on_policy" for role in self._policy_roles)
+ for role_name, tensor_out in zip(self._policy_roles, raw_outputs[1:], strict=True):
+ parsed = self._parser.parse_policy_outputs(
+ _slice_map(tensor_out.numpy().flatten(), self._meta_by_role[role_name]["output_slices"])
+ )
+ if role_name == "off_policy" and has_on_policy:
+ parsed.pop("plan", None)
+ outputs.update(parsed)
+
+ if "planplus" in outputs and "plan" in outputs:
+ outputs["plan"] = outputs["plan"] + outputs["planplus"]
+ return outputs
+
+ def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict:
+ main_buf = bufs[self._road_key]
+ self._allocate_runtime_state(main_buf.width, main_buf.height)
+ assert self._queue_tensors is not None and self._numpy_state is not None and self._camera_shape is not None
+
+ self._numpy_state["tfm"][:] = transforms[self._road_key]
+ self._numpy_state["big_tfm"][:] = transforms[self._wide_key]
+
+ current_desire = numpy_inputs[self._desired_key].copy()
+ current_desire[0] = 0
+ self._numpy_state["desire"][:] = np.where(current_desire - self._last_desire > 0.99, current_desire, 0)
+ self._last_desire[:] = current_desire
+
+ if "traffic_convention" in numpy_inputs:
+ self._numpy_state["traffic_convention"][:] = numpy_inputs["traffic_convention"]
+ if "action_t" in numpy_inputs:
+ self._numpy_state["action_t"][:] = numpy_inputs["action_t"]
+ for key in self._extra_policy_keys:
+ if key in numpy_inputs:
+ self._numpy_state[key][:] = numpy_inputs[key]
+
+ stage_inputs = self._camera_programs[self._camera_shape].get("stage_inputs", self._camera_programs[self._camera_shape].get("warp_enqueue"))
+ if stage_inputs is None:
+ raise RuntimeError("Combined split artifact camera entry is missing stage_inputs")
+
+ staged_main, staged_wide = stage_inputs(
+ img_q=self._queue_tensors["img_q"],
+ big_img_q=self._queue_tensors["big_img_q"],
+ tfm=self._queue_tensors["tfm"],
+ big_tfm=self._queue_tensors["big_tfm"],
+ frame=self._frame_blob(self._road_key, bufs[self._road_key]),
+ big_frame=self._frame_blob(self._wide_key, bufs[self._wide_key]),
+ )
+ raw_outputs = self._execute_bundle(img=staged_main, big_img=staged_wide, **self._policy_inputs())
+ if not isinstance(raw_outputs, tuple):
+ raw_outputs = (raw_outputs,)
+ return self._merge_policy_outputs(raw_outputs)
+
+ def _run_model(self) -> NumpyDict:
+ raise RuntimeError("Combined split runner executes through run_fused()")
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py
new file mode 100644
index 000000000..e783ce6f8
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py
@@ -0,0 +1,169 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from __future__ import annotations
+
+import os
+import pickle
+from typing import Any
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import (
+ CUSTOM_MODEL_PATH, NumpyDict, ShapeDict, SliceDict,
+)
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner
+from openpilot.iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import PhaseParser
+
+
+def _tinygrad_imports():
+ from tinygrad.tensor import Tensor
+ from tinygrad.device import Device
+ return Tensor, Device
+
+
+WARP_DEV = os.getenv('WARP_DEV')
+
+
+class TinygradFusedRunner(ModelRunner):
+ """Runs a fused warp+vision+policy pkl. Bundle ships one `driving_fused_*` artifact."""
+
+ uses_opencl_warp: bool = False
+
+ def __init__(self):
+ super().__init__()
+
+ self._constants = SplitModelConstants
+ self._parser = PhaseParser()
+
+ if len(self.models) != 1:
+ raise ValueError(f"fused bundle must have exactly one artifact, got {list(self.models)}")
+ self._model_data = next(iter(self.models.values()))
+
+ pkl_path = os.path.join(CUSTOM_MODEL_PATH, self._model_data.model.artifact.fileName)
+ with open(pkl_path, 'rb') as f:
+ self._fused: dict[Any, Any] = pickle.load(f)
+
+ self._vision_meta = self._fused['metadata']['vision']
+ self._on_meta = self._fused['metadata']['on_policy']
+ self._off_meta = self._fused['metadata']['off_policy']
+ self._run_policy = self._fused['run_policy']
+ self._warp_jits: dict[tuple[int, int], Any] = {k: v for k, v in self._fused.items() if isinstance(k, tuple)}
+ if not self._warp_jits:
+ raise ValueError("fused pkl has no warp JITs")
+
+ self._frame_skip: int = int(self._fused.get('frame_skip', 4))
+
+ self._queues: dict[str, Any] | None = None
+ self._npy_buffers: dict[str, np.ndarray] | None = None
+ self._cam_resolution: tuple[int, int] | None = None
+ self._blob_cache: dict[tuple[str, int], Any] = {}
+
+ def _frame_tensor(self, key, buf):
+ Tensor, Device = _tinygrad_imports()
+ arr = np.frombuffer(buf.data, dtype=np.uint8)
+ ck = (key, arr.ctypes.data)
+ t = self._blob_cache.get(ck)
+ if t is None:
+ t = Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype='uint8', device=Device.DEFAULT)
+ self._blob_cache[ck] = t
+ return t
+
+ @property
+ def vision_input_names(self) -> list[str]:
+ return ['img', 'big_img']
+
+ @property
+ def input_shapes(self) -> ShapeDict:
+ return {**self._vision_meta['input_shapes'], **self._on_meta['input_shapes']}
+
+ @property
+ def output_slices(self) -> SliceDict:
+ merged: SliceDict = {}
+ for src in (self._vision_meta['output_slices'], self._on_meta['output_slices'], self._off_meta['output_slices']):
+ merged.update({k: v for k, v in src.items() if k != 'pad'})
+ return merged
+
+ def prepare_inputs(self, imgs_cl, numpy_inputs, frames):
+ raise RuntimeError("fused runner has no OpenCL path; use run_fused()")
+
+ def _ensure_queues(self, cam_w: int, cam_h: int) -> None:
+ if self._queues is not None and self._cam_resolution == (cam_w, cam_h):
+ return
+ if (cam_w, cam_h) not in self._warp_jits:
+ raise RuntimeError(f"no warp JIT for {cam_w}x{cam_h}; have {sorted(self._warp_jits)}")
+
+ Tensor, Device = _tinygrad_imports()
+ img_shape = self._vision_meta['input_shapes']['img']
+ fb = self._on_meta['input_shapes']['features_buffer']
+ dp = self._on_meta['input_shapes']['desire_pulse']
+ n_frames = img_shape[1] // 6
+ img_buf_shape = (self._frame_skip * (n_frames - 1) + 1, 6, img_shape[2], img_shape[3])
+
+ zeros_u8 = lambda shp: Tensor(np.zeros(shp, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize()
+ zeros_f32 = lambda shp: Tensor(np.zeros(shp, dtype=np.float32), device=Device.DEFAULT).contiguous().realize()
+
+ self._queues = {
+ 'img_q': zeros_u8(img_buf_shape),
+ 'big_img_q': zeros_u8(img_buf_shape),
+ 'feat_q': zeros_f32((self._frame_skip * (fb[1] - 1) + 1, fb[0], fb[2])),
+ 'desire_q': zeros_f32((self._frame_skip * dp[1], dp[0], dp[2])),
+ }
+ # shapes must match the captured run_policy JIT inputs
+ on_shapes = self._on_meta['input_shapes']
+ self._npy_buffers = {
+ 'desire': np.zeros(dp[2], dtype=np.float32),
+ 'traffic_convention': np.zeros(on_shapes['traffic_convention'], dtype=np.float32),
+ 'action_t': np.zeros(on_shapes['action_t'], dtype=np.float32),
+ 'tfm': np.zeros((3, 3), dtype=np.float32),
+ 'big_tfm': np.zeros((3, 3), dtype=np.float32),
+ }
+ self._cam_resolution = (cam_w, cam_h)
+
+ def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict:
+ """warp + vision + policy in one pass from raw NV12 bufs + transform matrices."""
+ Tensor, Device = _tinygrad_imports()
+
+ main_buf = bufs['img']
+ self._ensure_queues(main_buf.width, main_buf.height)
+ assert self._queues is not None and self._npy_buffers is not None
+
+ desire_key = next((k for k in numpy_inputs if k.startswith('desire')), None)
+ if desire_key is not None:
+ self._npy_buffers['desire'][:] = numpy_inputs[desire_key]
+ if 'traffic_convention' in numpy_inputs:
+ self._npy_buffers['traffic_convention'][:] = numpy_inputs['traffic_convention']
+ if 'action_t' in numpy_inputs:
+ self._npy_buffers['action_t'][:] = numpy_inputs['action_t']
+ self._npy_buffers['tfm'][:] = transforms['img']
+ self._npy_buffers['big_tfm'][:] = transforms['big_img']
+
+ npy = lambda key: Tensor(self._npy_buffers[key], device='NPY')
+
+ # frames go on the compute device to match the captured warp JIT
+ frame = self._frame_tensor('img', bufs['img'])
+ big_frame = self._frame_tensor('big_img', bufs['big_img'])
+
+ warp_jit = self._warp_jits[self._cam_resolution]
+ img, big_img = warp_jit(img_q=self._queues['img_q'], big_img_q=self._queues['big_img_q'],
+ tfm=npy('tfm'), big_tfm=npy('big_tfm'), frame=frame, big_frame=big_frame)
+
+ vision_out_t, on_out_t, off_out_t = self._run_policy(
+ img=img, big_img=big_img, feat_q=self._queues['feat_q'], desire_q=self._queues['desire_q'],
+ desire=npy('desire'), traffic_convention=npy('traffic_convention'), action_t=npy('action_t'))
+
+ # parse each model's output on its own sliced dict; parsing a merged dict
+ # would run parse_dynamic_outputs twice and double-parse plan/lead
+ def _slice(tensor_out, meta) -> NumpyDict:
+ flat = tensor_out.numpy().flatten()
+ return {k: flat[np.newaxis, sl] for k, sl in meta['output_slices'].items() if k != 'pad'}
+
+ parsed: NumpyDict = {}
+ parsed.update(self._parser.parse_vision_outputs(_slice(vision_out_t, self._vision_meta)))
+ parsed.update(self._parser.parse_policy_outputs(_slice(off_out_t, self._off_meta)))
+ parsed.update(self._parser.parse_policy_outputs(_slice(on_out_t, self._on_meta)))
+ return parsed
+
+ def _run_model(self) -> NumpyDict:
+ raise RuntimeError("fused path goes through run_fused(), not _run_model()")
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py
new file mode 100644
index 000000000..8c7f2d76c
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py
@@ -0,0 +1,60 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+from abc import ABC
+from collections.abc import Callable
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType, NumpyDict
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import RunnerRoot
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import ArchiveParser, PhaseParser
+
+
+class _ParserRole(RunnerRoot, ABC):
+ def _bind_parser_role(self,
+ selector: int,
+ parser_builder: Callable[[], object],
+ projector: Callable[[object, NumpyDict], NumpyDict]) -> None:
+ parser = parser_builder()
+ self.parser_method_dict[selector] = lambda model_blob: projector(parser, self._slice_outputs(model_blob))
+
+
+def _phase_policy(parser: PhaseParser, sliced_outputs: NumpyDict) -> NumpyDict:
+ return parser.parse_policy_outputs(sliced_outputs)
+
+
+def _phase_vision(parser: PhaseParser, sliced_outputs: NumpyDict) -> NumpyDict:
+ return parser.parse_vision_outputs(sliced_outputs)
+
+
+def _archive_combined(parser: ArchiveParser, sliced_outputs: NumpyDict) -> NumpyDict:
+ return parser.parse_outputs(sliced_outputs)
+
+
+class OffPolicyTinygrad(_ParserRole, ABC):
+ def __init__(self):
+ self._bind_parser_role(ModelType.offPolicy, PhaseParser, _phase_policy)
+
+
+class OnPolicyTinygrad(_ParserRole, ABC):
+ def __init__(self):
+ self._bind_parser_role(ModelType.onPolicy, PhaseParser, _phase_policy)
+
+
+class PolicyTinygrad(_ParserRole, ABC):
+ def __init__(self):
+ self._bind_parser_role(ModelType.policy, PhaseParser, _phase_policy)
+
+
+class VisionTinygrad(_ParserRole, ABC):
+ def __init__(self):
+ self._bind_parser_role(ModelType.vision, PhaseParser, _phase_vision)
+
+
+class SupercomboTinygrad(_ParserRole, ABC):
+ def __init__(self):
+ self._bind_parser_role(ModelType.supercombo, ArchiveParser, _archive_combined)
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py
new file mode 100644
index 000000000..2a49d29c1
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py
@@ -0,0 +1,344 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from __future__ import annotations
+
+import hashlib
+import math
+import os
+import pickle
+import re
+from typing import Any
+
+import numpy as np
+
+from openpilot.common.params import Params
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH, NumpyDict, ShapeDict, SliceDict
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner
+from openpilot.iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import PhaseParser
+
+
+def _tinygrad_imports():
+ from tinygrad.tensor import Tensor
+ from tinygrad.device import Device
+ return Tensor, Device
+
+
+def _captured_queue_depth(warp_jit: Any) -> int | None:
+ captured = getattr(warp_jit, "captured", None)
+ infos = getattr(captured, "expected_input_info", None)
+ if not infos or len(infos) < 2:
+ return None
+
+ view_repr = repr(infos[1][0])
+ dims = [int(val) for val in re.findall(r"arg=(\d+)", view_repr)]
+ return dims[0] if len(dims) >= 4 else None
+
+
+def _captured_devices(warp_jit: Any) -> set[str]:
+ captured = getattr(warp_jit, "captured", None)
+ infos = getattr(captured, "expected_input_info", None)
+ if not infos:
+ return set()
+
+ devices: set[str] = set()
+ for info in infos:
+ if isinstance(info, tuple) and len(info) >= 4 and isinstance(info[3], str):
+ devices.add(info[3])
+ return devices
+
+
+def _captured_expected_names(jit_obj: Any) -> list[str]:
+ captured = getattr(jit_obj, "captured", None)
+ names = getattr(captured, "expected_names", None)
+ return list(names) if names else []
+
+
+def _file_sha256(path: str) -> str:
+ digest = hashlib.sha256()
+ with open(path, "rb") as f:
+ for chunk in iter(lambda: f.read(1024 * 1024), b""):
+ digest.update(chunk)
+ return digest.hexdigest()
+
+
+def _is_jit_arg_mismatch(err: BaseException) -> bool:
+ return "args mismatch in JIT" in str(err)
+
+
+class TinygradSupercomboRunner(ModelRunner):
+ """Runs a single combined supercombo pkl. Bundle ships one `driving_supercombo_*` artifact."""
+
+ uses_opencl_warp: bool = False
+
+ def __init__(self):
+ super().__init__()
+ self._constants = SplitModelConstants
+ self._parser = PhaseParser()
+
+ if len(self.models) != 1:
+ raise ValueError(f"supercombo bundle must have exactly one artifact, got {list(self.models)}")
+ self._model_data = next(iter(self.models.values()))
+
+ pkl_path = os.path.join(CUSTOM_MODEL_PATH, self._model_data.model.artifact.fileName)
+ self._pkl_path = pkl_path
+ self._expected_sha256 = getattr(getattr(self._model_data.model.artifact, "downloadUri", None), "sha256", "") or ""
+ self._verify_artifact_file()
+ with open(pkl_path, 'rb') as f:
+ self._m: dict[Any, Any] = pickle.load(f)
+
+ self._meta = self._m['metadata']
+ self._ish = self._meta['input_shapes']
+ self._slices = {k: v for k, v in self._meta['output_slices'].items() if k != 'pad'}
+ self._hidden_slice = self._meta['output_slices']['hidden_state']
+ self._run_policy = self._m['run_policy']
+ self._warp_jits: dict[tuple[int, int], Any] = {k: v for k, v in self._m.items() if isinstance(k, tuple)}
+ if not self._warp_jits:
+ raise ValueError("supercombo pkl has no warp JITs")
+ self._frame_skip = int(self._m.get('frame_skip', 4))
+ self._validate_warp_jits(pkl_path)
+ self._validate_jit_names()
+
+ self._queues: dict[str, Any] | None = None
+ self._npy: dict[str, np.ndarray] | None = None
+ self._cam: tuple[int, int] | None = None
+ self._prev_desire = np.zeros(self._ish['desire_pulse'][2], dtype=np.float32)
+ self._blob_cache: dict[tuple[str, int], Any] = {}
+
+ def _verify_artifact_file(self) -> None:
+ if not self._expected_sha256:
+ return
+
+ actual_sha256 = _file_sha256(self._pkl_path)
+ if actual_sha256 == self._expected_sha256:
+ return
+
+ try:
+ os.remove(self._pkl_path)
+ except OSError:
+ pass
+ redownload_msg = self._schedule_active_bundle_redownload()
+
+ raise RuntimeError(
+ "supercombo artifact SHA mismatch: "
+ f"expected {self._expected_sha256}, got {actual_sha256} for {self._pkl_path}. "
+ f"Deleted the stale cached file{redownload_msg}."
+ )
+
+ def _validate_warp_jits(self, pkl_path: str) -> None:
+ img = self._ish['img']
+ n_frames = img[1] // 6
+ expected_depth = self._frame_skip * (n_frames - 1) + 1
+ expected_device = os.getenv('DEV')
+
+ mismatches: list[str] = []
+ for cam, warp_jit in sorted(self._warp_jits.items()):
+ captured_depth = _captured_queue_depth(warp_jit)
+ captured_devices = _captured_devices(warp_jit)
+ if captured_depth is not None and captured_depth != expected_depth:
+ mismatches.append(
+ f"{cam[0]}x{cam[1]} queue-depth captured={captured_depth} expected={expected_depth}"
+ )
+ if expected_device and captured_devices and expected_device not in captured_devices:
+ mismatches.append(
+ f"{cam[0]}x{cam[1]} device captured={sorted(captured_devices)} expected={expected_device}"
+ )
+
+ if mismatches:
+ details = "; ".join(mismatches)
+ raise RuntimeError(
+ "supercombo warp JIT compatibility mismatch: "
+ f"{details}. Bundle {pkl_path} was compiled with the wrong backend, frame_skip, or queue shape; "
+ "re-download or rebuild this model artifact."
+ )
+
+ def _validate_jit_names(self) -> None:
+ expected_warp_names = ['big_frame', 'big_tfm', 'frame', 'tfm']
+ expected_policy_names = ['big_img_q', 'desire_q', 'feat_q', 'img_q', 'packed_npy_inputs', 'warped']
+
+ mismatches: list[str] = []
+
+ policy_names = sorted(_captured_expected_names(self._run_policy))
+ if policy_names and policy_names != expected_policy_names:
+ mismatches.append(f"run_policy captured={policy_names} expected={expected_policy_names}")
+
+ for cam, warp_jit in sorted(self._warp_jits.items()):
+ warp_names = sorted(_captured_expected_names(warp_jit))
+ if warp_names and warp_names != expected_warp_names:
+ mismatches.append(f"{cam[0]}x{cam[1]} warp captured={warp_names} expected={expected_warp_names}")
+
+ if mismatches:
+ details = "; ".join(mismatches)
+ actual_sha = None
+ try:
+ actual_sha = _file_sha256(self._pkl_path)
+ except OSError:
+ pass
+
+ if actual_sha and self._expected_sha256 and actual_sha != self._expected_sha256:
+ try:
+ os.remove(self._pkl_path)
+ except OSError:
+ pass
+ redownload_msg = self._schedule_active_bundle_redownload()
+ raise RuntimeError(
+ "supercombo artifact contract mismatch with stale cached SHA: "
+ f"{details}. Expected SHA {self._expected_sha256}, got {actual_sha}. "
+ f"Deleted the stale cached file{redownload_msg}."
+ )
+
+ raise RuntimeError(
+ "supercombo artifact JIT argument mismatch: "
+ f"{details}. This model file does not match the current IQPilot runtime contract. "
+ "Re-download or rebuild this model artifact."
+ )
+
+ def _handle_runtime_jit_mismatch(self, err: BaseException) -> None:
+ if not _is_jit_arg_mismatch(err):
+ raise err
+
+ actual_sha = None
+ try:
+ actual_sha = _file_sha256(self._pkl_path)
+ except OSError:
+ pass
+
+ if actual_sha and self._expected_sha256 and actual_sha != self._expected_sha256:
+ try:
+ os.remove(self._pkl_path)
+ except OSError:
+ pass
+ redownload_msg = self._schedule_active_bundle_redownload()
+ raise RuntimeError(
+ "supercombo artifact runtime JIT mismatch with stale cached SHA: "
+ f"expected {self._expected_sha256}, got {actual_sha} for {self._pkl_path}. "
+ f"Deleted the stale cached file{redownload_msg}."
+ ) from err
+
+ raise RuntimeError(
+ "supercombo artifact runtime JIT mismatch: "
+ f"{err}. This model file does not match the current IQPilot runtime contract. "
+ "Re-download or rebuild this model artifact."
+ ) from err
+
+ def _schedule_active_bundle_redownload(self) -> str:
+ try:
+ params = Params()
+ active_bundle = params.get("ModelManager_ActiveBundle") or {}
+ index = active_bundle.get("index") if isinstance(active_bundle, dict) else None
+ if isinstance(index, str) and index.isdigit():
+ index = int(index)
+ if isinstance(index, int) and index >= 0:
+ params.put("ModelManager_DownloadIndex", str(index))
+ params.remove("ModelRunnerTypeCache")
+ return "; scheduled automatic re-download of the active model"
+ except Exception:
+ pass
+
+ return "; unable to schedule automatic re-download"
+
+ def _frame_tensor(self, key: str, buf):
+ Tensor, Device = _tinygrad_imports()
+ arr = np.frombuffer(buf.data, dtype=np.uint8)
+ ck = (key, arr.ctypes.data)
+ t = self._blob_cache.get(ck)
+ if t is None:
+ t = Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype='uint8', device=Device.DEFAULT)
+ self._blob_cache[ck] = t
+ return t
+
+ @property
+ def vision_input_names(self) -> list[str]:
+ return ['img', 'big_img']
+
+ @property
+ def input_shapes(self) -> ShapeDict:
+ return dict(self._ish)
+
+ @property
+ def output_slices(self) -> SliceDict:
+ return dict(self._slices)
+
+ def prepare_inputs(self, imgs_cl, numpy_inputs, frames):
+ raise RuntimeError("supercombo runner has no OpenCL path; use run_fused()")
+
+ def _ensure_queues(self, cam_w: int, cam_h: int) -> None:
+ if self._queues is not None and self._cam == (cam_w, cam_h):
+ return
+ if (cam_w, cam_h) not in self._warp_jits:
+ raise RuntimeError(f"no warp JIT for {cam_w}x{cam_h}; have {sorted(self._warp_jits)}")
+
+ Tensor, Device = _tinygrad_imports()
+ fs = self._frame_skip
+ img = self._ish['img']
+ n_frames = img[1] // 6
+ img_buf = (fs * (n_frames - 1) + 1, 6, img[2], img[3])
+ fb = self._ish['features_buffer']
+ dp = self._ish['desire_pulse']
+ tc = self._ish['traffic_convention']
+ at = self._ish['action_t']
+
+ zeros_u8 = lambda s: Tensor(np.zeros(s, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize()
+ zeros_f32 = lambda s: Tensor(np.zeros(s, dtype=np.float32), device=Device.DEFAULT).contiguous().realize()
+
+ # packed npy block (single NPY tensor, mutated in place via views): order matches run_policy.split
+ shapes = {'desire': (dp[2],), 'traffic_convention': tuple(tc), 'action_t': tuple(at), 'prev_feat': (fb[0], fb[2])}
+ sizes = [math.prod(s) for s in shapes.values()]
+ packed = np.zeros(sum(sizes), dtype=np.float32)
+ views = {k: v.reshape(s) for (k, s), v in zip(shapes.items(), np.split(packed, np.cumsum(sizes[:-1])), strict=True)}
+
+ self._npy = {'tfm': np.zeros((3, 3), dtype=np.float32), 'big_tfm': np.zeros((3, 3), dtype=np.float32), **views}
+ self._queues = {
+ 'img_q': zeros_u8(img_buf),
+ 'big_img_q': zeros_u8(img_buf),
+ 'feat_q': zeros_f32((fs * fb[1], fb[0], fb[2])),
+ 'desire_q': zeros_f32((fs * dp[1], dp[0], dp[2])),
+ 'tfm': Tensor(self._npy['tfm'], device='NPY'),
+ 'big_tfm': Tensor(self._npy['big_tfm'], device='NPY'),
+ 'packed_npy_inputs': Tensor(packed, device='NPY'),
+ }
+ self._cam = (cam_w, cam_h)
+
+ def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict:
+ Tensor, Device = _tinygrad_imports()
+ main_buf = bufs['img']
+ self._ensure_queues(main_buf.width, main_buf.height)
+ assert self._queues is not None and self._npy is not None
+
+ self._npy['tfm'][:] = transforms['img']
+ self._npy['big_tfm'][:] = transforms['big_img']
+
+ desire_key = next((k for k in numpy_inputs if k.startswith('desire')), None)
+ cur = numpy_inputs[desire_key].copy() if desire_key is not None else np.zeros_like(self._prev_desire)
+ cur[0] = 0
+ self._npy['desire'][:] = np.where(cur - self._prev_desire > .99, cur, 0)
+ self._prev_desire[:] = cur
+ if 'traffic_convention' in numpy_inputs:
+ self._npy['traffic_convention'][:] = numpy_inputs['traffic_convention']
+ if 'action_t' in numpy_inputs:
+ self._npy['action_t'][:] = numpy_inputs['action_t']
+ # self._npy['prev_feat'] holds last frame's hidden_state (zeros on the first frame)
+
+ frame = self._frame_tensor('img', bufs['img'])
+ big_frame = self._frame_tensor('big_img', bufs['big_img'])
+
+ warp = self._warp_jits[self._cam]
+ try:
+ warped = warp(tfm=self._queues['tfm'], big_tfm=self._queues['big_tfm'], frame=frame, big_frame=big_frame)
+ out, = self._run_policy(warped=warped, img_q=self._queues['img_q'], big_img_q=self._queues['big_img_q'],
+ feat_q=self._queues['feat_q'], desire_q=self._queues['desire_q'],
+ packed_npy_inputs=self._queues['packed_npy_inputs'])
+ except Exception as err:
+ self._handle_runtime_jit_mismatch(err)
+ raise
+ flat = out.numpy().flatten()
+
+ # feed hidden_state back as prev_feat for the next frame
+ self._npy['prev_feat'][:] = flat[self._hidden_slice].reshape(self._npy['prev_feat'].shape)
+
+ sliced = {k: flat[np.newaxis, sl] for k, sl in self._slices.items()}
+ return self._parser.parse_vision_outputs(sliced) # single-pass; parse_outputs double-parses a combined dict
+
+ def _run_model(self) -> NumpyDict:
+ raise RuntimeError("supercombo path goes through run_fused(), not _run_model()")
diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py
new file mode 100644
index 000000000..6fc46c271
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py
@@ -0,0 +1,186 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import pickle
+from dataclasses import dataclass
+
+import numpy as np
+from tinygrad.tensor import Tensor
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import (
+ CLMemDict,
+ CUSTOM_MODEL_PATH,
+ FrameDict,
+ ModelType,
+ NumpyDict,
+ ShapeDict,
+ SliceDict,
+)
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.model_types import (
+ OffPolicyTinygrad,
+ OnPolicyTinygrad,
+ PolicyTinygrad,
+ SupercomboTinygrad,
+ VisionTinygrad,
+)
+from openpilot.iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.config import ModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.runtime.tinygrad import qcom_tensor_from_opencl_address
+from openpilot.system.hardware import TICI
+
+
+@dataclass(frozen=True)
+class _TensorShapePlan:
+ dtype: object
+ device: str
+
+
+def _artifact_path(filename: str) -> str:
+ return f"{CUSTOM_MODEL_PATH}/{filename}"
+
+
+def _load_program_blob(filename: str):
+ with open(_artifact_path(filename), "rb") as artifact:
+ try:
+ return pickle.load(artifact)
+ except FileNotFoundError as exc:
+ assert "/dev/kgsl-3d0" not in str(exc), "Model was built on C3 or C3X, but is being loaded on PC"
+ raise
+
+
+def _compile_input_plan(captured) -> dict[str, _TensorShapePlan]:
+ plan: dict[str, _TensorShapePlan] = {}
+ for name, info in zip(captured.expected_names, captured.expected_input_info, strict=True):
+ plan[name] = _TensorShapePlan(dtype=info[2], device=info[3])
+ return plan
+
+
+def _merge_step_outputs(output_groups: list[NumpyDict]) -> NumpyDict:
+ stitched: NumpyDict = {}
+ for payload in output_groups:
+ stitched.update(payload)
+ if "planplus" in stitched and "plan" in stitched:
+ stitched["plan"] = stitched["plan"] + stitched["planplus"]
+ return stitched
+
+
+class TinygradRunner(ModelRunner, SupercomboTinygrad, PolicyTinygrad, VisionTinygrad, OffPolicyTinygrad, OnPolicyTinygrad):
+ def __init__(self, model_type: int = ModelType.supercombo):
+ ModelRunner.__init__(self)
+ for initializer in (SupercomboTinygrad, PolicyTinygrad, VisionTinygrad, OffPolicyTinygrad, OnPolicyTinygrad):
+ initializer.__init__(self)
+
+ self._constants = ModelConstants
+ self._model_data = self.models.get(model_type)
+ if self._model_data is None or self._model_data.model is None:
+ raise ValueError(f"Model data for type {model_type} not available.")
+
+ asset_name = self._model_data.model.artifact.fileName
+ assert asset_name.endswith("_tinygrad.pkl"), f"Invalid model file {asset_name} for TinygradRunner"
+
+ self.model_run = _load_program_blob(asset_name)
+ self._input_plan = _compile_input_plan(self.model_run.captured)
+ self.input_to_dtype = {name: spec.dtype for name, spec in self._input_plan.items()}
+ self.input_to_device = {name: spec.device for name, spec in self._input_plan.items()}
+
+ @property
+ def vision_input_names(self) -> list[str]:
+ return [stream_name for stream_name in self.input_shapes if "img" in stream_name]
+
+ def _attach_vision_tensor(self, stream_name: str, frame_buffers: CLMemDict, frame_views: FrameDict) -> None:
+ spec = self._input_plan[stream_name]
+ frame_buffer = frame_buffers[stream_name]
+ if TICI:
+ self.inputs[stream_name] = qcom_tensor_from_opencl_address(frame_buffer.mem_address,
+ self.input_shapes[stream_name],
+ dtype=spec.dtype)
+ return
+
+ mirrored = frame_views[stream_name].as_numpy(frame_buffer).reshape(self.input_shapes[stream_name])
+ self.inputs[stream_name] = Tensor(mirrored, device=spec.device, dtype=spec.dtype).realize()
+
+ def _attach_state_tensor(self, tensor_name: str, tensor_value: np.ndarray) -> None:
+ spec = self._input_plan[tensor_name]
+ self.inputs[tensor_name] = Tensor(tensor_value, device=spec.device, dtype=spec.dtype).realize()
+
+ def prepare_vision_inputs(self, imgs_cl: CLMemDict, frames: FrameDict):
+ for stream_name in imgs_cl:
+ if stream_name not in self.inputs or not TICI:
+ self._attach_vision_tensor(stream_name, imgs_cl, frames)
+
+ def prepare_policy_inputs(self, numpy_inputs: NumpyDict):
+ for tensor_name, tensor_value in numpy_inputs.items():
+ self._attach_state_tensor(tensor_name, tensor_value)
+
+ def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict:
+ self.prepare_vision_inputs(imgs_cl, frames)
+ self.prepare_policy_inputs(numpy_inputs)
+ return self.inputs
+
+ def _parse_outputs(self, model_outputs: np.ndarray) -> NumpyDict:
+ if self._model_data is None:
+ raise ValueError("Model data is not available. Ensure the model is loaded correctly.")
+ return self.parser_method_dict[self._model_data.model.type.raw](model_outputs)
+
+ def _run_model(self) -> NumpyDict:
+ raw_output = self.model_run(**self.inputs).numpy().reshape(-1)
+ return self._parse_outputs(raw_output)
+
+
+class TinygradSplitRunner(ModelRunner):
+ def __init__(self):
+ super().__init__()
+ self.is_20hz_3d = True
+ self._constants = SplitModelConstants
+ self.vision_runner = TinygradRunner(ModelType.vision)
+ self.policy_runner = TinygradRunner(ModelType.policy) if self.models.get(ModelType.policy) else None
+ self.off_policy_runner = TinygradRunner(ModelType.offPolicy) if self.models.get(ModelType.offPolicy) else None
+ self.on_policy_runner = TinygradRunner(ModelType.onPolicy) if self.models.get(ModelType.onPolicy) else None
+
+ def _policy_units(self) -> list[TinygradRunner]:
+ return [runner for runner in (self.policy_runner, self.off_policy_runner, self.on_policy_runner) if runner is not None]
+
+ def run_vision(self) -> NumpyDict:
+ return self.vision_runner.run_model()
+
+ def run_policy(self) -> NumpyDict:
+ return _merge_step_outputs([runner.run_model() for runner in self._policy_units()])
+
+ def refresh_policy_features(self, features_buffer: np.ndarray) -> None:
+ for runner in self._policy_units():
+ if "features_buffer" in runner._input_plan:
+ runner._attach_state_tensor("features_buffer", features_buffer)
+
+ def _run_model(self) -> NumpyDict:
+ return _merge_step_outputs([self.run_vision(), self.run_policy()])
+
+ @property
+ def vision_input_names(self) -> list[str]:
+ return list(self.vision_runner.vision_input_names)
+
+ @property
+ def input_shapes(self) -> ShapeDict:
+ composite: ShapeDict = dict(self.vision_runner.input_shapes)
+ for runner in self._policy_units():
+ composite.update(runner.input_shapes)
+ return composite
+
+ @property
+ def output_slices(self) -> SliceDict:
+ composite: SliceDict = dict(self.vision_runner.output_slices)
+ for runner in self._policy_units():
+ composite.update(runner.output_slices)
+ return composite
+
+ def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict:
+ self.vision_runner.prepare_vision_inputs(imgs_cl, frames)
+ assembled_inputs = dict(self.vision_runner.inputs)
+ for runner in self._policy_units():
+ runner.prepare_policy_inputs(numpy_inputs)
+ assembled_inputs.update(runner.inputs)
+ self.inputs = assembled_inputs
+ return assembled_inputs
diff --git a/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py b/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py
new file mode 100644
index 000000000..a088fe755
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py
@@ -0,0 +1,96 @@
+# openpilot model I/O constants (comma.ai, MIT — see LICENSE)
+import numpy as np
+
+
+def index_function(idx, max_val=192, max_idx=32):
+ return max_val * ((idx/max_idx)**2)
+
+
+class SplitModelConstants:
+ # time and distance indices
+ IDX_N = 33
+ T_IDXS = [index_function(idx, max_val=10.0) for idx in range(IDX_N)]
+ X_IDXS = [index_function(idx, max_val=192.0) for idx in range(IDX_N)]
+ LEAD_T_IDXS = [0., 2., 4., 6., 8., 10.]
+ LEAD_T_OFFSETS = [0., 2., 4.]
+ META_T_IDXS = [2., 4., 6., 8., 10.]
+
+ # split-model temporal / history run parameters
+ MODEL_FREQ = 20
+ HISTORY_FREQ = 5
+ HISTORY_LEN_SECONDS = 5
+ TEMPORAL_SKIP = MODEL_FREQ // HISTORY_FREQ
+ FULL_HISTORY_BUFFER_LEN = MODEL_FREQ * HISTORY_LEN_SECONDS
+ INPUT_HISTORY_BUFFER_LEN = HISTORY_FREQ * HISTORY_LEN_SECONDS
+
+ FEATURE_LEN = 512
+
+ DESIRE_LEN = 8
+ TRAFFIC_CONVENTION_LEN = 2
+ LAT_PLANNER_STATE_LEN = 4
+ LATERAL_CONTROL_PARAMS_LEN = 2
+ PREV_DESIRED_CURV_LEN = 1
+
+ # model outputs constants
+ FCW_THRESHOLDS_5MS2 = np.array([.05, .05, .15, .15, .15], dtype=np.float32)
+ FCW_THRESHOLDS_3MS2 = np.array([.7, .7], dtype=np.float32)
+ FCW_5MS2_PROBS_WIDTH = 5
+ FCW_3MS2_PROBS_WIDTH = 2
+
+ DISENGAGE_WIDTH = 5
+ POSE_WIDTH = 6
+ WIDE_FROM_DEVICE_WIDTH = 3
+ LEAD_WIDTH = 4
+ LANE_LINES_WIDTH = 2
+ ROAD_EDGES_WIDTH = 2
+ PLAN_WIDTH = 15
+ DESIRE_PRED_WIDTH = 8
+ LAT_PLANNER_SOLUTION_WIDTH = 4
+ DESIRED_CURV_WIDTH = 1
+ ACTION_WIDTH = 2
+
+ NUM_LANE_LINES = 4
+ NUM_ROAD_EDGES = 2
+
+ LEAD_TRAJ_LEN = 6
+ DESIRE_PRED_LEN = 4
+
+ PLAN_MHP_N = 5
+ LEAD_MHP_N = 2
+ PLAN_MHP_SELECTION = 1
+ LEAD_MHP_SELECTION = 3
+
+ FCW_THRESHOLD_5MS2_HIGH = 0.15
+ FCW_THRESHOLD_5MS2_LOW = 0.05
+ FCW_THRESHOLD_3MS2 = 0.7
+
+ CONFIDENCE_BUFFER_LEN = 5
+ RYG_GREEN = 0.01165
+ RYG_YELLOW = 0.06157
+
+ POLY_PATH_DEGREE = 4
+
+
+# model outputs slices
+class Plan:
+ POSITION = slice(0, 3)
+ VELOCITY = slice(3, 6)
+ ACCELERATION = slice(6, 9)
+ T_FROM_CURRENT_EULER = slice(9, 12)
+ ORIENTATION_RATE = slice(12, 15)
+
+
+class Meta:
+ ENGAGED = slice(0, 1)
+ # next 2, 4, 6, 8, 10 seconds
+ GAS_DISENGAGE = slice(1, 31, 6)
+ BRAKE_DISENGAGE = slice(2, 31, 6)
+ STEER_OVERRIDE = slice(3, 31, 6)
+ HARD_BRAKE_3 = slice(4, 31, 6)
+ HARD_BRAKE_4 = slice(5, 31, 6)
+ HARD_BRAKE_5 = slice(6, 31, 6)
+ # next 0, 2, 4, 6, 8, 10 seconds
+ GAS_PRESS = slice(31, 55, 4)
+ BRAKE_PRESS = slice(32, 55, 4)
+ LEFT_BLINKER = slice(33, 55, 4)
+ RIGHT_BLINKER = slice(34, 55, 4)
diff --git a/iqpilot/selfdrive/iqmodeld/native/__init__.py b/iqpilot/selfdrive/iqmodeld/native/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/native/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.so b/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.so
new file mode 100755
index 000000000..5219e7aa7
Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.so differ
diff --git a/iqpilot/selfdrive/iqmodeld/parser.py b/iqpilot/selfdrive/iqmodeld/parser.py
new file mode 100644
index 000000000..2425dd003
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/parser.py
@@ -0,0 +1,219 @@
+from __future__ import annotations
+
+from dataclasses import dataclass
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.config import ModelConstants
+
+
+def _bounded_exp(values, out=None):
+ return np.exp(np.clip(values, -np.inf, 11), out=out)
+
+
+def _sigmoid(values):
+ return 1.0 / (1.0 + _bounded_exp(-values))
+
+
+def _softmax_last(values, axis=-1):
+ values -= np.max(values, axis=axis, keepdims=True)
+ if values.dtype in (np.float32, np.float64):
+ _bounded_exp(values, out=values)
+ else:
+ values = _bounded_exp(values)
+ values /= np.sum(values, axis=axis, keepdims=True)
+ return values
+
+
+@dataclass(frozen=True)
+class _MixtureRecipe:
+ input_heads: int
+ output_heads: int
+ final_shape: tuple[int, ...]
+
+
+class _TensorKitchen:
+ def __init__(self, ignore_missing: bool = False):
+ self.ignore_missing = ignore_missing
+
+ def _grab(self, outputs: dict[str, np.ndarray], tensor_name: str) -> np.ndarray | None:
+ if tensor_name not in outputs:
+ if not self.ignore_missing:
+ raise ValueError(f"Missing output {tensor_name}")
+ return
+ return outputs[tensor_name]
+
+ def categorical(self, outputs: dict[str, np.ndarray], tensor_name: str, shape=None) -> None:
+ raw = self._grab(outputs, tensor_name)
+ if raw is None:
+ return
+ if shape is not None:
+ raw = raw.reshape((raw.shape[0],) + shape)
+ outputs[tensor_name] = _softmax_last(raw, axis=-1)
+
+ def binary(self, outputs: dict[str, np.ndarray], tensor_name: str) -> None:
+ raw = self._grab(outputs, tensor_name)
+ if raw is None:
+ return
+ outputs[tensor_name] = _sigmoid(raw)
+
+ def mixture(self, outputs: dict[str, np.ndarray], tensor_name: str, recipe: _MixtureRecipe) -> None:
+ raw = self._grab(outputs, tensor_name)
+ if raw is None:
+ return
+
+ reshaped = raw.reshape((raw.shape[0], max(recipe.input_heads, 1), -1))
+ value_count = (reshaped.shape[2] - recipe.output_heads) // 2
+ means = reshaped[:, :, :value_count]
+ stds = _bounded_exp(reshaped[:, :, value_count:2 * value_count])
+
+ if recipe.input_heads > 1:
+ weights = np.zeros((reshaped.shape[0], recipe.input_heads, recipe.output_heads), dtype=reshaped.dtype)
+ for output_idx in range(recipe.output_heads):
+ weights[:, :, output_idx - recipe.output_heads] = _softmax_last(
+ reshaped[:, :, output_idx - recipe.output_heads], axis=-1
+ )
+
+ if recipe.output_heads == 1:
+ for batch_idx in range(weights.shape[0]):
+ order = np.argsort(weights[batch_idx][:, 0])[::-1]
+ weights[batch_idx] = weights[batch_idx][order]
+ means[batch_idx] = means[batch_idx][order]
+ stds[batch_idx] = stds[batch_idx][order]
+
+ hypothesis_shape = (reshaped.shape[0], recipe.input_heads, *recipe.final_shape)
+ outputs[f"{tensor_name}_weights"] = weights
+ outputs[f"{tensor_name}_hypotheses"] = means.reshape(hypothesis_shape)
+ outputs[f"{tensor_name}_stds_hypotheses"] = stds.reshape(hypothesis_shape)
+
+ picked_means = np.zeros((reshaped.shape[0], recipe.output_heads, value_count), dtype=reshaped.dtype)
+ picked_stds = np.zeros((reshaped.shape[0], recipe.output_heads, value_count), dtype=reshaped.dtype)
+ for batch_idx in range(weights.shape[0]):
+ for output_idx in range(recipe.output_heads):
+ order = np.argsort(weights[batch_idx, :, output_idx])[::-1]
+ picked_means[batch_idx, output_idx] = means[batch_idx, order[0]]
+ picked_stds[batch_idx, output_idx] = stds[batch_idx, order[0]]
+ else:
+ picked_means = means
+ picked_stds = stds
+
+ final_shape = ((reshaped.shape[0], recipe.output_heads, *recipe.final_shape)
+ if recipe.output_heads > 1 else (reshaped.shape[0], *recipe.final_shape))
+ outputs[tensor_name] = picked_means.reshape(final_shape)
+ outputs[f"{tensor_name}_stds"] = picked_stds.reshape(final_shape)
+
+
+class ArchiveParser(_TensorKitchen):
+ def __init__(self, ignore_missing: bool = False):
+ super().__init__(ignore_missing=ignore_missing)
+ self._c = ModelConstants
+
+ def _recipes(self) -> list[tuple[str, _MixtureRecipe]]:
+ c = self._c
+ return [
+ ("plan", _MixtureRecipe(c.PLAN_MHP_N, c.PLAN_MHP_SELECTION, (c.IDX_N, c.PLAN_WIDTH))),
+ ("lane_lines", _MixtureRecipe(0, 0, (c.NUM_LANE_LINES, c.IDX_N, c.LANE_LINES_WIDTH))),
+ ("road_edges", _MixtureRecipe(0, 0, (c.NUM_ROAD_EDGES, c.IDX_N, c.LANE_LINES_WIDTH))),
+ ("pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))),
+ ("road_transform", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))),
+ ("wide_from_device_euler", _MixtureRecipe(0, 0, (c.WIDE_FROM_DEVICE_WIDTH,))),
+ ("lead", _MixtureRecipe(c.LEAD_MHP_N, c.LEAD_MHP_SELECTION, (c.LEAD_TRAJ_LEN, c.LEAD_WIDTH))),
+ ]
+
+ def parse_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
+ c = self._c
+ for tensor_name, recipe in self._recipes():
+ self.mixture(outputs, tensor_name, recipe)
+ if "sim_pose" in outputs:
+ self.mixture(outputs, "sim_pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,)))
+ if "lat_planner_solution" in outputs:
+ self.mixture(outputs, "lat_planner_solution", _MixtureRecipe(0, 0, (c.IDX_N, c.LAT_PLANNER_SOLUTION_WIDTH)))
+ if "desired_curvature" in outputs:
+ self.mixture(outputs, "desired_curvature", _MixtureRecipe(0, 0, (c.DESIRED_CURV_WIDTH,)))
+ for name in ("lead_prob", "lane_lines_prob", "meta"):
+ self.binary(outputs, name)
+ self.categorical(outputs, "desire_state", shape=(c.DESIRE_PRED_WIDTH,))
+ self.categorical(outputs, "desire_pred", shape=(c.DESIRE_PRED_LEN, c.DESIRE_PRED_WIDTH))
+ return outputs
+
+
+class PhaseParser(_TensorKitchen):
+ def __init__(self, ignore_missing: bool = False):
+ super().__init__(ignore_missing=ignore_missing)
+ self._c = SplitModelConstants
+
+ def _has_mixture_heads(self, outputs: dict[str, np.ndarray], tensor_name: str, flat_width: int) -> bool:
+ raw = self._grab(outputs, tensor_name)
+ if raw is None:
+ return False
+ return raw.shape[1] != 2 * flat_width
+
+ def _decode_dynamic_family(self, outputs: dict[str, np.ndarray]) -> None:
+ c = self._c
+ if "lead" in outputs:
+ uses_heads = self._has_mixture_heads(outputs, "lead", c.LEAD_MHP_SELECTION * c.LEAD_TRAJ_LEN * c.LEAD_WIDTH)
+ self.mixture(outputs, "lead", _MixtureRecipe(
+ c.LEAD_MHP_N if uses_heads else 0,
+ c.LEAD_MHP_SELECTION if uses_heads else 0,
+ (c.LEAD_TRAJ_LEN, c.LEAD_WIDTH) if uses_heads else (c.LEAD_MHP_SELECTION, c.LEAD_TRAJ_LEN, c.LEAD_WIDTH),
+ ))
+
+ if "plan" in outputs:
+ uses_heads = self._has_mixture_heads(outputs, "plan", c.IDX_N * c.PLAN_WIDTH)
+ self.mixture(outputs, "plan", _MixtureRecipe(
+ c.PLAN_MHP_N if uses_heads else 0,
+ c.PLAN_MHP_SELECTION if uses_heads else 0,
+ (c.IDX_N, c.PLAN_WIDTH),
+ ))
+
+ if "planplus" in outputs:
+ self.mixture(outputs, "planplus", _MixtureRecipe(0, 0, (c.IDX_N, c.PLAN_WIDTH)))
+
+ def _decode_policy_family(self, outputs: dict[str, np.ndarray]) -> None:
+ c = self._c
+ if "action" in outputs:
+ self.mixture(outputs, "action", _MixtureRecipe(0, 0, (c.ACTION_WIDTH,)))
+ if "desired_curvature" in outputs:
+ self.mixture(outputs, "desired_curvature", _MixtureRecipe(0, 0, (c.DESIRED_CURV_WIDTH,)))
+ if "desire_pred" in outputs:
+ self.categorical(outputs, "desire_pred", shape=(c.DESIRE_PRED_LEN, c.DESIRE_PRED_WIDTH))
+ if "desire_state" in outputs:
+ self.categorical(outputs, "desire_state", shape=(c.DESIRE_PRED_WIDTH,))
+ if "lane_lines" in outputs:
+ self.mixture(outputs, "lane_lines", _MixtureRecipe(0, 0, (c.NUM_LANE_LINES, c.IDX_N, c.LANE_LINES_WIDTH)))
+ if "lane_lines_prob" in outputs:
+ self.binary(outputs, "lane_lines_prob")
+ if "lead_prob" in outputs:
+ self.binary(outputs, "lead_prob")
+ if "lat_planner_solution" in outputs:
+ self.mixture(outputs, "lat_planner_solution", _MixtureRecipe(0, 0, (c.IDX_N, c.LAT_PLANNER_SOLUTION_WIDTH)))
+ if "meta" in outputs:
+ self.binary(outputs, "meta")
+ if "road_edges" in outputs:
+ self.mixture(outputs, "road_edges", _MixtureRecipe(0, 0, (c.NUM_ROAD_EDGES, c.IDX_N, c.LANE_LINES_WIDTH)))
+ if "sim_pose" in outputs:
+ self.mixture(outputs, "sim_pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,)))
+
+ def parse_vision_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
+ c = self._c
+ self.mixture(outputs, "pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,)))
+ self.mixture(outputs, "wide_from_device_euler", _MixtureRecipe(0, 0, (c.WIDE_FROM_DEVICE_WIDTH,)))
+ self.mixture(outputs, "road_transform", _MixtureRecipe(0, 0, (c.POSE_WIDTH,)))
+ self._decode_dynamic_family(outputs)
+ self._decode_policy_family(outputs)
+ return outputs
+
+ def parse_policy_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
+ self._decode_dynamic_family(outputs)
+ self._decode_policy_family(outputs)
+ return outputs
+
+ def parse_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
+ return self.parse_policy_outputs(self.parse_vision_outputs(outputs))
+
+
+__all__ = [
+ "ArchiveParser",
+ "PhaseParser",
+]
diff --git a/iqpilot/selfdrive/iqmodeld/runtime/ort.py b/iqpilot/selfdrive/iqmodeld/runtime/ort.py
new file mode 100644
index 000000000..fd2c85529
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/runtime/ort.py
@@ -0,0 +1,62 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+import itertools
+
+import numpy as np
+import onnx
+import onnxruntime as ort
+
+
+ORT_TYPES_TO_NP_TYPES = {
+ "tensor(float16)": np.float16,
+ "tensor(float)": np.float32,
+ "tensor(uint8)": np.uint8,
+}
+
+
+def _promote_raw_half_blob(attribute):
+ float32_values = np.frombuffer(attribute.raw_data, dtype=np.float16)
+ attribute.data_type = 1
+ attribute.raw_data = float32_values.astype(np.float32).tobytes()
+
+
+def _rewrite_tensor_io_types(model):
+ for value_info in itertools.chain(model.graph.input, model.graph.output):
+ if value_info.type.tensor_type.elem_type == 10:
+ value_info.type.tensor_type.elem_type = 1
+
+
+def _rewrite_cast_nodes(model):
+ for node in model.graph.node:
+ if node.op_type == "Cast" and node.attribute[0].i == 10:
+ node.attribute[0].i = 1
+ for attribute in node.attribute:
+ if hasattr(attribute, "t") and attribute.t.data_type == 10:
+ _promote_raw_half_blob(attribute.t)
+
+
+def attributeproto_fp16_to_fp32(attr):
+ _promote_raw_half_blob(attr)
+
+
+def convert_fp16_to_fp32(model):
+ for initializer in model.graph.initializer:
+ if initializer.data_type == 10:
+ _promote_raw_half_blob(initializer)
+ _rewrite_tensor_io_types(model)
+ _rewrite_cast_nodes(model)
+ return model.SerializeToString()
+
+
+def _cpu_session_options():
+ options = ort.SessionOptions()
+ options.intra_op_num_threads = 4
+ options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL
+ options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
+ return options
+
+
+def make_onnx_cpu_runner(model_path):
+ model_blob = convert_fp16_to_fp32(onnx.load(model_path))
+ return ort.InferenceSession(model_blob, _cpu_session_options(), providers=["CPUExecutionProvider"])
diff --git a/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py b/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py
new file mode 100644
index 000000000..75c7e350e
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py
@@ -0,0 +1,23 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from tinygrad.tensor import Tensor
+from tinygrad.helpers import to_mv
+
+_PTR_STRIDE = 8
+_RAW_GPU_PTR_SLOT = 20
+_RAW_GPU_PTR_VIEW_BYTES = 0x100
+
+
+def _descriptor_pointer(opencl_address: int) -> int:
+ return to_mv(opencl_address, _PTR_STRIDE).cast("Q")[0]
+
+
+def _raw_gpu_pointer(descriptor_pointer: int) -> int:
+ return to_mv(descriptor_pointer, _RAW_GPU_PTR_VIEW_BYTES).cast("Q")[_RAW_GPU_PTR_SLOT]
+
+
+def qcom_tensor_from_opencl_address(opencl_address, shape, dtype):
+ descriptor_pointer = _descriptor_pointer(opencl_address)
+ device_pointer = _raw_gpu_pointer(descriptor_pointer)
+ return Tensor.from_blob(device_pointer, shape, dtype=dtype, device="QCOM")
diff --git a/iqpilot/selfdrive/iqmodeld/tests/__init__.py b/iqpilot/selfdrive/iqmodeld/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_action_dispatch.py b/iqpilot/selfdrive/iqmodeld/tests/test_action_dispatch.py
new file mode 100644
index 000000000..d35bb7296
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_action_dispatch.py
@@ -0,0 +1,78 @@
+from __future__ import annotations
+
+from types import SimpleNamespace
+
+import numpy as np
+import pytest
+
+from cereal import log
+
+from openpilot.iqpilot.selfdrive.iqmodeld.config import Plan
+from openpilot.iqpilot.selfdrive.iqmodeld.daemon import NeuralEngineState, _merged_plan
+import openpilot.iqpilot.selfdrive.iqmodeld.daemon as iqmodeld_daemon
+from openpilot.selfdrive.controls.lib.drive_helpers import smooth_value
+
+
+def _fake_state(**overrides):
+ base = dict(
+ PLANPLUS_CONTROL=1.0,
+ LONG_SMOOTH_SECONDS=0.3,
+ LAT_SMOOTH_SECONDS=0.1,
+ MIN_LAT_CONTROL_SPEED=0.3,
+ mlsim=True,
+ generation=12,
+ constants=SimpleNamespace(T_IDXS=np.arange(100), DESIRE_LEN=8),
+ )
+ base.update(overrides)
+ return SimpleNamespace(**base)
+
+
+@pytest.mark.parametrize(
+ ("control", "vego", "factor"),
+ [
+ (0.55, 20.0, 1.0),
+ (1.0, 25.0, 0.75),
+ (1.5, 25.1, 0.75),
+ (2.0, 20.0, 1.0),
+ ],
+)
+def test_planplus_merge_matches_speed_gate(control: float, vego: float, factor: float):
+ state = _fake_state(PLANPLUS_CONTROL=control)
+ base = np.random.rand(1, 100, 15).astype(np.float32)
+ extra = np.random.rand(1, 100, 15).astype(np.float32)
+ merged = _merged_plan(state, {"plan": base, "planplus": extra}, vego)
+ expected = base[0] + (control * factor) * extra[0]
+ np.testing.assert_allclose(merged, expected, rtol=1e-6, atol=1e-6)
+
+
+def test_action_dispatch_uses_merged_plan_for_longitudinal_choice(monkeypatch: pytest.MonkeyPatch):
+ state = _fake_state()
+ previous = log.ModelDataV2.Action()
+ recorded_velocity: list[np.ndarray] = []
+
+ def fake_accel(plan_vel, plan_accel, t_idxs, action_t=0.0):
+ recorded_velocity.append(plan_vel.copy())
+ return 0.0, False
+
+ monkeypatch.setattr(iqmodeld_daemon, "get_accel_from_plan", fake_accel)
+ monkeypatch.setattr(iqmodeld_daemon, "pick_curvature", lambda *args: 0.0)
+
+ plan = np.random.rand(1, 100, 15).astype(np.float32)
+ planplus = np.random.rand(1, 100, 15).astype(np.float32)
+ outputs = {"plan": plan.copy(), "planplus": planplus.copy()}
+
+ NeuralEngineState.get_action_from_model(state, outputs, previous, 0.0, 0.0, 25.0)
+ expected = plan[0, :, Plan.VELOCITY][:, 0] + 0.75 * planplus[0, :, Plan.VELOCITY][:, 0]
+ np.testing.assert_allclose(recorded_velocity[0], expected, rtol=1e-5, atol=1e-6)
+
+
+def test_action_dispatch_honors_direct_action_outputs():
+ state = _fake_state(mlsim=False, generation=9)
+ previous = log.ModelDataV2.Action(desiredCurvature=0.0, desiredAcceleration=0.0, shouldStop=False)
+ outputs = {"action": np.array([[4.0, -0.25]], dtype=np.float32)}
+ action = NeuralEngineState.get_action_from_model(state, outputs, previous, 0.0, 0.0, 10.0)
+ expected_accel = smooth_value(-0.25, previous.desiredAcceleration, state.LONG_SMOOTH_SECONDS)
+ expected_curvature = smooth_value(0.04, previous.desiredCurvature, state.LAT_SMOOTH_SECONDS)
+ assert action.desiredAcceleration == pytest.approx(expected_accel)
+ assert action.desiredCurvature == pytest.approx(expected_curvature)
+ assert action.shouldStop is False
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_combined_split_runner.py b/iqpilot/selfdrive/iqmodeld/tests/test_combined_split_runner.py
new file mode 100644
index 000000000..e0b726e82
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_combined_split_runner.py
@@ -0,0 +1,184 @@
+from __future__ import annotations
+
+from dataclasses import dataclass
+from pathlib import Path
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.combined_artifact import resolve_combined_split_artifact
+import openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner as runner_helpers
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.combined_split_runner import TinygradCombinedSplitRunner
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad import combined_split_runner as combined_runner_mod
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import PhaseParser
+from openpilot.iqpilot.selfdrive.iqmodeld.tests.test_iqmodeld_contracts import _phase_sample
+
+
+@dataclass
+class _TypeWrap:
+ raw: int
+
+
+@dataclass
+class _Artifact:
+ fileName: str
+
+
+class _Model:
+ def __init__(self, model_type: int, artifact_name: str):
+ self.type = _TypeWrap(model_type)
+ self.artifact = _Artifact(artifact_name)
+
+
+class _Override:
+ def __init__(self, key: str, value: str):
+ self.key = key
+ self.value = value
+
+
+class _Bundle:
+ def __init__(self, models: list[_Model], overrides: list[_Override] | None = None, generation: int = 10):
+ self.models = models
+ self.overrides = overrides or []
+ self.generation = generation
+
+
+class _FakeTensor:
+ def __init__(self, values):
+ self._values = np.asarray(values, dtype=np.float32)
+
+ def numpy(self):
+ return self._values
+
+
+class _FakeVisionBuf:
+ width = 1928
+ height = 1208
+ data = memoryview(b"\x00" * 64)
+
+
+def _slice_pack(outputs: dict[str, np.ndarray]) -> tuple[np.ndarray, dict[str, slice]]:
+ chunks = []
+ slices: dict[str, slice] = {}
+ cursor = 0
+ for name, value in outputs.items():
+ flat = value.reshape(-1)
+ slices[name] = slice(cursor, cursor + flat.size)
+ chunks.append(flat)
+ cursor += flat.size
+ return np.concatenate(chunks).astype(np.float32), slices
+
+
+def test_resolve_combined_split_artifact_prefers_override(tmp_path: Path, monkeypatch):
+ bundle = _Bundle(
+ [_Model(ModelType.vision, "driving_vision_demo_tinygrad.pkl"), _Model(ModelType.policy, "driving_policy_demo_tinygrad.pkl")],
+ overrides=[_Override("combinedRuntimeArtifact", "driving_combined_demo.pkl")],
+ )
+ expected = tmp_path / "driving_combined_demo.pkl"
+ expected.write_bytes(b"iq")
+
+ monkeypatch.setattr("openpilot.iqpilot.selfdrive.iqmodeld.models.combined_artifact._MODEL_ROOT", tmp_path)
+
+ assert resolve_combined_split_artifact(bundle) == expected
+
+
+def test_get_model_runner_prefers_combined_split_artifact(monkeypatch):
+ bundle = _Bundle([
+ _Model(ModelType.vision, "driving_vision_demo_tinygrad.pkl"),
+ _Model(ModelType.policy, "driving_policy_demo_tinygrad.pkl"),
+ ], generation=11)
+
+ marker = object()
+ monkeypatch.setattr(runner_helpers, "get_active_bundle", lambda: bundle)
+ monkeypatch.setattr(runner_helpers, "has_combined_split_artifact", lambda _: True)
+ monkeypatch.setattr(combined_runner_mod, "TinygradCombinedSplitRunner", lambda: marker)
+
+ assert runner_helpers.get_model_runner() is marker
+
+
+def test_get_model_runner_keeps_split_bundle_on_existing_runner_without_combined_artifact(monkeypatch):
+ bundle = _Bundle([
+ _Model(ModelType.vision, "driving_vision_demo_tinygrad.pkl"),
+ _Model(ModelType.policy, "driving_policy_demo_tinygrad.pkl"),
+ ], generation=12)
+
+ marker = object()
+ monkeypatch.setattr(runner_helpers, "get_active_bundle", lambda: bundle)
+ monkeypatch.setattr(runner_helpers, "has_combined_split_artifact", lambda _: False)
+ monkeypatch.setattr(runner_helpers, "TinygradSplitRunner", lambda: marker)
+
+ assert runner_helpers.get_model_runner() is marker
+
+
+def test_combined_split_runner_parses_single_policy_payload(monkeypatch):
+ vision_raw = _phase_sample(np.random.default_rng(11))
+ policy_raw = _phase_sample(np.random.default_rng(17))
+ vision_blob, vision_slices = _slice_pack(vision_raw)
+ policy_blob, policy_slices = _slice_pack(policy_raw)
+
+ runner = TinygradCombinedSplitRunner.__new__(TinygradCombinedSplitRunner)
+ runner._vision_meta = {
+ "input_shapes": {"img": (1, 12, 128, 256), "big_img": (1, 12, 128, 256)},
+ "output_slices": vision_slices,
+ }
+ runner._meta_by_role = {
+ "vision": runner._vision_meta,
+ "policy": {
+ "input_shapes": {
+ "features_buffer": (1, 25, 512),
+ "desire_pulse": (1, 25, 8),
+ "traffic_convention": (1, 2),
+ "action_t": (1, 2),
+ },
+ "output_slices": policy_slices,
+ },
+ }
+ runner._policy_roles = ["policy"]
+ runner._desired_key = "desire_pulse"
+ runner._road_key = "img"
+ runner._wide_key = "big_img"
+ runner._extra_policy_keys = []
+ runner._queue_tensors = {
+ "img_q": object(),
+ "big_img_q": object(),
+ "feat_q": object(),
+ "desire_q": object(),
+ "tfm": object(),
+ "big_tfm": object(),
+ "desire": object(),
+ "traffic_convention": object(),
+ "action_t": object(),
+ }
+ runner._numpy_state = {
+ "tfm": np.zeros((3, 3), dtype=np.float32),
+ "big_tfm": np.zeros((3, 3), dtype=np.float32),
+ "desire": np.zeros(8, dtype=np.float32),
+ "traffic_convention": np.zeros((1, 2), dtype=np.float32),
+ "action_t": np.zeros((1, 2), dtype=np.float32),
+ }
+ runner._camera_shape = (1928, 1208)
+ runner._camera_programs = {
+ (1928, 1208): {"stage_inputs": lambda **kwargs: ("road", "wide")},
+ }
+ runner._execute_bundle = lambda **kwargs: (_FakeTensor(vision_blob), _FakeTensor(policy_blob))
+ runner._parser = PhaseParser()
+ runner._last_desire = np.zeros(8, dtype=np.float32)
+ runner._blob_cache = {}
+
+ monkeypatch.setattr(TinygradCombinedSplitRunner, "_allocate_runtime_state", lambda self, w, h: None)
+ monkeypatch.setattr(TinygradCombinedSplitRunner, "_frame_blob", lambda self, name, buf: object())
+
+ outputs = runner.run_fused(
+ {"img": _FakeVisionBuf(), "big_img": _FakeVisionBuf()},
+ {"img": np.eye(3, dtype=np.float32), "big_img": np.eye(3, dtype=np.float32)},
+ {
+ "desire_pulse": np.array([1, 0, 0, 0, 0, 0, 0, 0], dtype=np.float32),
+ "traffic_convention": np.zeros((1, 2), dtype=np.float32),
+ "action_t": np.zeros((1, 2), dtype=np.float32),
+ },
+ )
+
+ assert "pose" in outputs
+ assert "plan" in outputs
+ assert outputs["plan"].shape == (1, 33, 15)
+ assert outputs["action"].shape == (1, 2)
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_compile_supercombo_guards.py b/iqpilot/selfdrive/iqmodeld/tests/test_compile_supercombo_guards.py
new file mode 100644
index 000000000..0c28f4974
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_compile_supercombo_guards.py
@@ -0,0 +1,44 @@
+from __future__ import annotations
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import (
+ _captured_devices,
+ _captured_queue_depth,
+ _validate_pose_outputs,
+)
+
+
+class _Captured:
+ def __init__(self, expected_input_info):
+ self.expected_input_info = expected_input_info
+
+
+class _FakeJit:
+ def __init__(self, expected_input_info):
+ self.captured = _Captured(expected_input_info)
+
+
+def test_captured_queue_helpers_extract_depth_and_device():
+ infos = [
+ ("noop", (), "uchar", "QCOM"),
+ ("reshape(arg=None, src=(noop, stack(arg=None, src=(const(arg=5), const(arg=6), const(arg=128), const(arg=256)))))", (), "uchar", "QCOM"),
+ ("reshape(arg=None, src=(noop, const(arg=3)))", (), "float", "NPY"),
+ ]
+ fake_jit = _FakeJit(infos)
+
+ assert _captured_queue_depth(fake_jit) == 5
+ assert _captured_devices(fake_jit) == {"QCOM", "NPY"}
+
+
+def test_validate_pose_outputs_accepts_sane_odometry_payload():
+ outputs = {
+ "pose": np.array([[1.0, 0.5, 0.25, 0.1, 0.2, 0.3]], dtype=np.float32),
+ "pose_stds": np.array([[0.5, 0.4, 0.3, 0.2, 0.2, 0.2]], dtype=np.float32),
+ "wide_from_device_euler": np.array([[0.1, 0.2, 0.3]], dtype=np.float32),
+ "wide_from_device_euler_stds": np.array([[0.2, 0.2, 0.2]], dtype=np.float32),
+ "road_transform": np.array([[0.5, 0.4, 0.3, 0.2, 0.1, 0.0]], dtype=np.float32),
+ "road_transform_stds": np.array([[0.3, 0.3, 0.3, 0.2, 0.2, 0.2]], dtype=np.float32),
+ }
+
+ _validate_pose_outputs(outputs)
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_iqmodeld_contracts.py b/iqpilot/selfdrive/iqmodeld/tests/test_iqmodeld_contracts.py
new file mode 100644
index 000000000..bcbf0da4a
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_iqmodeld_contracts.py
@@ -0,0 +1,123 @@
+from __future__ import annotations
+
+import copy
+
+import cereal.messaging as messaging
+import numpy as np
+from cereal import log
+
+from openpilot.iqpilot.selfdrive.iqmodeld.config import Meta, ModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.messaging import (
+ DrivePacketMemory,
+ pick_curvature,
+ populate_drive_messages,
+ populate_odometry_message,
+)
+from openpilot.iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants
+from openpilot.iqpilot.selfdrive.iqmodeld.parser import ArchiveParser, PhaseParser
+
+
+def _archive_sample(rng: np.random.Generator) -> dict[str, np.ndarray]:
+ return {
+ "plan": rng.standard_normal((1, ModelConstants.PLAN_MHP_N * (2 * ModelConstants.IDX_N * ModelConstants.PLAN_WIDTH + ModelConstants.PLAN_MHP_SELECTION)), dtype=np.float32),
+ "lane_lines": rng.standard_normal((1, 2 * ModelConstants.NUM_LANE_LINES * ModelConstants.IDX_N * ModelConstants.LANE_LINES_WIDTH), dtype=np.float32),
+ "road_edges": rng.standard_normal((1, 2 * ModelConstants.NUM_ROAD_EDGES * ModelConstants.IDX_N * ModelConstants.LANE_LINES_WIDTH), dtype=np.float32),
+ "pose": rng.standard_normal((1, 2 * ModelConstants.POSE_WIDTH), dtype=np.float32),
+ "road_transform": rng.standard_normal((1, 2 * ModelConstants.POSE_WIDTH), dtype=np.float32),
+ "sim_pose": rng.standard_normal((1, 2 * ModelConstants.POSE_WIDTH), dtype=np.float32),
+ "wide_from_device_euler": rng.standard_normal((1, 2 * ModelConstants.WIDE_FROM_DEVICE_WIDTH), dtype=np.float32),
+ "lead": rng.standard_normal((1, ModelConstants.LEAD_MHP_N * (2 * ModelConstants.LEAD_TRAJ_LEN * ModelConstants.LEAD_WIDTH + ModelConstants.LEAD_MHP_SELECTION)), dtype=np.float32),
+ "lat_planner_solution": rng.standard_normal((1, 2 * ModelConstants.IDX_N * ModelConstants.LAT_PLANNER_SOLUTION_WIDTH), dtype=np.float32),
+ "desired_curvature": rng.standard_normal((1, 2 * ModelConstants.DESIRED_CURV_WIDTH), dtype=np.float32),
+ "lead_prob": rng.standard_normal((1, ModelConstants.LEAD_MHP_SELECTION), dtype=np.float32),
+ "lane_lines_prob": rng.standard_normal((1, ModelConstants.NUM_LANE_LINES * 2), dtype=np.float32),
+ "meta": rng.standard_normal((1, 55), dtype=np.float32),
+ "desire_state": rng.standard_normal((1, ModelConstants.DESIRE_PRED_WIDTH), dtype=np.float32),
+ "desire_pred": rng.standard_normal((1, ModelConstants.DESIRE_PRED_LEN * ModelConstants.DESIRE_PRED_WIDTH), dtype=np.float32),
+ }
+
+
+def _phase_sample(rng: np.random.Generator) -> dict[str, np.ndarray]:
+ c = SplitModelConstants
+ return {
+ "pose": rng.standard_normal((1, 2 * c.POSE_WIDTH), dtype=np.float32),
+ "wide_from_device_euler": rng.standard_normal((1, 2 * c.WIDE_FROM_DEVICE_WIDTH), dtype=np.float32),
+ "road_transform": rng.standard_normal((1, 2 * c.POSE_WIDTH), dtype=np.float32),
+ "lead": rng.standard_normal((1, c.LEAD_MHP_N * (2 * c.LEAD_TRAJ_LEN * c.LEAD_WIDTH + c.LEAD_MHP_SELECTION)), dtype=np.float32),
+ "plan": rng.standard_normal((1, c.PLAN_MHP_N * (2 * c.IDX_N * c.PLAN_WIDTH + c.PLAN_MHP_SELECTION)), dtype=np.float32),
+ "planplus": rng.standard_normal((1, 2 * c.IDX_N * c.PLAN_WIDTH), dtype=np.float32),
+ "action": rng.standard_normal((1, 2 * c.ACTION_WIDTH), dtype=np.float32),
+ "desired_curvature": rng.standard_normal((1, 2 * c.DESIRED_CURV_WIDTH), dtype=np.float32),
+ "desire_pred": rng.standard_normal((1, c.DESIRE_PRED_LEN * c.DESIRE_PRED_WIDTH), dtype=np.float32),
+ "desire_state": rng.standard_normal((1, c.DESIRE_PRED_WIDTH), dtype=np.float32),
+ "lane_lines": rng.standard_normal((1, 2 * c.NUM_LANE_LINES * c.IDX_N * c.LANE_LINES_WIDTH), dtype=np.float32),
+ "lane_lines_prob": rng.standard_normal((1, c.NUM_LANE_LINES * 2), dtype=np.float32),
+ "lead_prob": rng.standard_normal((1, c.LEAD_MHP_SELECTION), dtype=np.float32),
+ "lat_planner_solution": rng.standard_normal((1, 2 * c.IDX_N * c.LAT_PLANNER_SOLUTION_WIDTH), dtype=np.float32),
+ "meta": rng.standard_normal((1, 55), dtype=np.float32),
+ "road_edges": rng.standard_normal((1, 2 * c.NUM_ROAD_EDGES * c.IDX_N * c.LANE_LINES_WIDTH), dtype=np.float32),
+ "sim_pose": rng.standard_normal((1, 2 * c.POSE_WIDTH), dtype=np.float32),
+ }
+
+
+def test_archive_parser_contract_snapshot():
+ outputs = ArchiveParser().parse_outputs(copy.deepcopy(_archive_sample(np.random.default_rng(7))))
+
+ assert outputs["plan"].shape == (1, 33, 15)
+ assert outputs["lane_lines"].shape == (1, 4, 33, 2)
+ assert outputs["road_edges"].shape == (1, 2, 33, 2)
+ assert outputs["desire_pred"].shape == (1, 4, 8)
+
+ np.testing.assert_allclose(outputs["pose"][0, 0], 0.45617363, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(outputs["lane_lines_prob"][0, 2], 0.85733712, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(outputs["desire_state"][0, 0], 0.44964141, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(outputs["lead_prob"][0, 0], 0.21613698, rtol=1e-6, atol=1e-6)
+
+
+def test_phase_parser_contract_snapshot():
+ raw = _phase_sample(np.random.default_rng(23))
+ outputs = {**PhaseParser().parse_vision_outputs(copy.deepcopy(raw)), **PhaseParser().parse_policy_outputs(copy.deepcopy(raw))}
+
+ assert outputs["plan"].shape == (1, 33, 15)
+ assert outputs["action"].shape == (1, 2)
+ assert outputs["desired_curvature"].shape == (1, 1)
+ assert outputs["road_edges"].shape == (1, 2, 33, 2)
+
+ np.testing.assert_allclose(outputs["plan"][0, 0, 0], 0.09684439, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(outputs["action"][0, 0], 0.25458091, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(outputs["desired_curvature"][0, 0], -0.97072351, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(outputs["lane_lines_prob"][0, 0], 0.20073657, rtol=1e-6, atol=1e-6)
+
+
+def test_message_population_contract_snapshot():
+ raw = _phase_sample(np.random.default_rng(23))
+ outputs = {**PhaseParser().parse_vision_outputs(copy.deepcopy(raw)), **PhaseParser().parse_policy_outputs(copy.deepcopy(raw))}
+ action = log.ModelDataV2.Action(desiredCurvature=0.031, desiredAcceleration=-0.12, shouldStop=False)
+
+ driving_msg = messaging.new_message("drivingModelData")
+ model_msg = messaging.new_message("modelV2")
+ odometry_msg = messaging.new_message("cameraOdometry")
+ memory = DrivePacketMemory()
+
+ populate_drive_messages(
+ driving_msg, model_msg, outputs, action, memory,
+ 2468, 2470, 2480, 0.05, 123456789, 0.014, True, Meta,
+ )
+ populate_odometry_message(odometry_msg, outputs, 2468, 0, 123456789, True)
+
+ np.testing.assert_allclose(driving_msg.drivingModelData.laneLineMeta.leftY, -0.21672775, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(model_msg.modelV2.meta.engagedProb, 0.64853197, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(odometry_msg.cameraOdometry.trans[0], 0.0360266, rtol=1e-6, atol=1e-6)
+ assert int(model_msg.modelV2.confidence.raw) == 2
+
+
+def test_curvature_selection_contract_snapshot():
+ raw = _phase_sample(np.random.default_rng(23))
+ outputs = {**PhaseParser().parse_vision_outputs(copy.deepcopy(raw)), **PhaseParser().parse_policy_outputs(copy.deepcopy(raw))}
+ plan_rows = outputs["plan"][0]
+
+ direct = pick_curvature(outputs, plan_rows, 27.5, 0.8, synthetic_lane_logic=False)
+ fallback = pick_curvature(outputs, plan_rows, 27.5, 0.8, synthetic_lane_logic=True)
+
+ np.testing.assert_allclose(direct, -0.97072351, rtol=1e-6, atol=1e-6)
+ np.testing.assert_allclose(fallback, -0.0689389, rtol=1e-6, atol=1e-6)
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_manager_manifest_refresh.py b/iqpilot/selfdrive/iqmodeld/tests/test_manager_manifest_refresh.py
new file mode 100644
index 000000000..19e20afa7
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_manager_manifest_refresh.py
@@ -0,0 +1,150 @@
+"""
+Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from dataclasses import dataclass, field
+
+from openpilot.iqpilot.selfdrive.iqmodeld.models.manager import IQModelManager, _DOWNLOAD_INDEX_KEY
+
+
+@dataclass
+class _DownloadUri:
+ sha256: str = ""
+ uri: str = ""
+
+
+@dataclass
+class _Artifact:
+ fileName: str = ""
+ downloadUri: _DownloadUri = field(default_factory=_DownloadUri)
+
+
+@dataclass
+class _Model:
+ artifact: _Artifact = field(default_factory=_Artifact)
+ metadata: _Artifact | None = None
+
+
+@dataclass
+class _Bundle:
+ index: int = 0
+ ref: str = ""
+ internalName: str = ""
+ displayName: str = ""
+ models: list = field(default_factory=list)
+
+
+class _FakeParams:
+ def __init__(self):
+ self.store = {}
+
+ def get(self, key):
+ return self.store.get(key)
+
+ def put(self, key, value):
+ self.store[key] = value
+
+ def remove(self, key):
+ self.store.pop(key, None)
+
+
+def _bundle(index, name, sha, filename="driving_vision_test_tinygrad.pkl"):
+ return _Bundle(
+ index=index,
+ ref=f"ref-{name}",
+ internalName=name,
+ displayName=f"{name} display",
+ models=[_Model(artifact=_Artifact(fileName=filename, downloadUri=_DownloadUri(sha256=sha)))],
+ )
+
+
+def _manager(active, available):
+ mgr = IQModelManager.__new__(IQModelManager)
+ mgr.params = _FakeParams()
+ mgr.active_bundle = active
+ mgr.available_models = available
+ mgr._validated_active_key = None
+ mgr._manifest_refresh_key = None
+ return mgr
+
+
+def test_stale_active_bundle_queues_redownload_at_current_index():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ counterpart = _bundle(12, "WMIV12", "b" * 64)
+ mgr = _manager(active, [counterpart])
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) == 12
+ assert mgr.active_bundle is active
+
+
+def test_matching_shas_do_not_queue():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ counterpart = _bundle(12, "WMIV12", "A" * 64)
+ mgr = _manager(active, [counterpart])
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) is None
+
+
+def test_retired_bundle_is_left_alone():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ mgr = _manager(active, [_bundle(12, "OtherModel", "b" * 64)])
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) is None
+ assert mgr.active_bundle is active
+
+
+def test_default_bundle_is_never_refreshed():
+ active = _bundle(0, "Default", "a" * 64)
+ active.ref = "default"
+ mgr = _manager(active, [_bundle(0, "Default", "b" * 64)])
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) is None
+
+
+def test_pending_download_blocks_refresh():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ mgr = _manager(active, [_bundle(12, "WMIV12", "b" * 64)])
+ mgr.params.put(_DOWNLOAD_INDEX_KEY, 3)
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) == 3
+
+
+def test_empty_manifest_hash_never_triggers():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ mgr = _manager(active, [_bundle(12, "WMIV12", "")])
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) is None
+
+
+def test_refresh_queued_once_per_run():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ mgr = _manager(active, [_bundle(12, "WMIV12", "b" * 64)])
+
+ mgr._queue_active_manifest_refresh()
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) == 12
+
+ mgr.params.remove(_DOWNLOAD_INDEX_KEY)
+ mgr._queue_active_manifest_refresh()
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) is None
+
+
+def test_counterpart_matched_by_name_not_index():
+ active = _bundle(55, "WMIV12", "a" * 64)
+ imposter = _bundle(55, "OtherModel", "c" * 64)
+ counterpart = _bundle(12, "WMIV12", "b" * 64)
+ mgr = _manager(active, [imposter, counterpart])
+
+ mgr._queue_active_manifest_refresh()
+
+ assert mgr.params.get(_DOWNLOAD_INDEX_KEY) == 12
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_model_runner_smoke.py b/iqpilot/selfdrive/iqmodeld/tests/test_model_runner_smoke.py
new file mode 100644
index 000000000..917d7e45f
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_model_runner_smoke.py
@@ -0,0 +1,73 @@
+from __future__ import annotations
+
+import os
+from dataclasses import dataclass
+from pathlib import Path
+
+import numpy as np
+from tinygrad.tensor import Tensor
+
+import openpilot.iqpilot.selfdrive.iqmodeld.models.helpers as bundle_helpers
+import openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner as model_runner_mod
+import openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner as tinygrad_runner_mod
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import TinygradRunner
+
+
+LOCAL_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model"
+
+
+@dataclass
+class _TypeWrap:
+ raw: int
+
+
+@dataclass
+class _Artifact:
+ fileName: str
+
+
+class _Model:
+ def __init__(self, model_type: int, artifact_name: str, metadata_name: str):
+ self.type = _TypeWrap(model_type)
+ self.artifact = _Artifact(artifact_name)
+ self.metadata = _Artifact(metadata_name)
+
+
+class _Bundle:
+ def __init__(self, models: list[_Model], is_20hz: bool = False):
+ self.models = models
+ self.is20hz = is_20hz
+
+
+def _seed_runner_inputs(runner: TinygradRunner) -> None:
+ for name, shape in runner.input_shapes.items():
+ runner.inputs[name] = Tensor(
+ np.zeros(shape, dtype=np.float32),
+ device=runner.input_to_device[name],
+ dtype=runner.input_to_dtype[name],
+ ).realize()
+
+
+def test_local_tinygrad_models_execute(monkeypatch):
+ bundle = _Bundle([
+ _Model(ModelType.vision, "driving_vision_c210m_tinygrad.pkl", "driving_vision_c210m_metadata.pkl"),
+ _Model(ModelType.policy, "driving_policy_c210m_tinygrad.pkl", "driving_policy_c210m_metadata.pkl"),
+ ])
+
+ monkeypatch.setattr(bundle_helpers, "get_active_bundle", lambda params=None: bundle, raising=False)
+ monkeypatch.setattr(model_runner_mod, "get_active_bundle", lambda params=None: bundle, raising=False)
+ monkeypatch.setattr(tinygrad_runner_mod, "CUSTOM_MODEL_PATH", str(LOCAL_MODEL_DIR), raising=False)
+ monkeypatch.setattr(model_runner_mod, "CUSTOM_MODEL_PATH", str(LOCAL_MODEL_DIR), raising=False)
+
+ vision_runner = TinygradRunner(ModelType.vision)
+ _seed_runner_inputs(vision_runner)
+ vision_outputs = vision_runner.run_model()
+ assert "pose" in vision_outputs
+ assert "lane_lines" in vision_outputs
+
+ policy_runner = TinygradRunner(ModelType.policy)
+ _seed_runner_inputs(policy_runner)
+ policy_outputs = policy_runner.run_model()
+ assert "plan" in policy_outputs
+ assert "desire_state" in policy_outputs
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_public_surface.py b/iqpilot/selfdrive/iqmodeld/tests/test_public_surface.py
new file mode 100644
index 000000000..851861dbf
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_public_surface.py
@@ -0,0 +1,18 @@
+from openpilot.iqpilot.selfdrive.iqmodeld import metadata, messaging, parser
+from openpilot.iqpilot.selfdrive.iqmodeld.daemon import CaptureStamp, NeuralEngineState
+
+
+def test_public_module_surface():
+ assert hasattr(messaging, "DrivePacketMemory")
+ assert hasattr(messaging, "pick_curvature")
+ assert hasattr(messaging, "populate_drive_messages")
+ assert hasattr(messaging, "populate_odometry_message")
+
+ assert hasattr(parser, "ArchiveParser")
+ assert hasattr(parser, "PhaseParser")
+
+ assert hasattr(metadata, "select_meta_layout")
+ assert hasattr(metadata, "build_metadata_record")
+
+ assert CaptureStamp.__name__ == "CaptureStamp"
+ assert NeuralEngineState.__name__ == "NeuralEngineState"
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_selector_share_smoke.py b/iqpilot/selfdrive/iqmodeld/tests/test_selector_share_smoke.py
new file mode 100644
index 000000000..a6f920c28
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_selector_share_smoke.py
@@ -0,0 +1,162 @@
+from __future__ import annotations
+
+import os
+from dataclasses import dataclass
+from pathlib import Path
+
+import numpy as np
+import pytest
+from tinygrad.nn.onnx import OnnxRunner
+from tinygrad.tensor import Tensor
+
+import openpilot.iqpilot.selfdrive.iqmodeld.models.helpers as bundle_helpers
+import openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner as model_runner_mod
+import openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner as tinygrad_runner_mod
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import TinygradRunner
+
+
+SHARE_ROOT = Path(os.getenv("IQPILOT_SELECTOR_SHARE", "/Volumes/New New Vault/IQModels/models/recompiled16"))
+
+
+@dataclass
+class _TypeWrap:
+ raw: int
+
+
+@dataclass
+class _Artifact:
+ fileName: str
+
+
+class _Model:
+ def __init__(self, model_type: int, artifact_name: str, metadata_name: str):
+ self.type = _TypeWrap(model_type)
+ self.artifact = _Artifact(artifact_name)
+ self.metadata = _Artifact(metadata_name)
+
+
+class _Bundle:
+ def __init__(self, models: list[_Model], is_20hz: bool = False):
+ self.models = models
+ self.is20hz = is_20hz
+
+
+def _find_selector_dirs(limit: int = 3, require_onnx: bool = False) -> list[Path]:
+ found: list[Path] = []
+ if not SHARE_ROOT.is_dir():
+ return found
+
+ for bundle_dir in sorted(SHARE_ROOT.iterdir()):
+ if not bundle_dir.is_dir():
+ continue
+ vision = next(bundle_dir.glob("driving_vision*_tinygrad.pkl"), None)
+ policy = next(bundle_dir.glob("driving_policy*_tinygrad.pkl"), None)
+ vision_meta = next(bundle_dir.glob("driving_vision*_metadata.pkl"), None)
+ policy_meta = next(bundle_dir.glob("driving_policy*_metadata.pkl"), None)
+ has_onnx = (bundle_dir / "driving_vision.onnx").is_file() and (bundle_dir / "driving_policy.onnx").is_file()
+ if vision and policy and vision_meta and policy_meta and (has_onnx or not require_onnx):
+ found.append(bundle_dir)
+ if len(found) >= limit:
+ break
+ return found
+
+
+def _seed_runner_inputs(runner: TinygradRunner) -> None:
+ for name, shape in runner.input_shapes.items():
+ runner.inputs[name] = Tensor(
+ np.zeros(shape, dtype=np.float32),
+ device=runner.input_to_device[name],
+ dtype=runner.input_to_dtype[name],
+ ).realize()
+
+
+def _bundle_for_dir(bundle_dir: Path) -> _Bundle:
+ vision = next(bundle_dir.glob("driving_vision*_tinygrad.pkl"))
+ policy = next(bundle_dir.glob("driving_policy*_tinygrad.pkl"))
+ vision_meta = next(bundle_dir.glob("driving_vision*_metadata.pkl"))
+ policy_meta = next(bundle_dir.glob("driving_policy*_metadata.pkl"))
+ return _Bundle([
+ _Model(ModelType.vision, vision.name, vision_meta.name),
+ _Model(ModelType.policy, policy.name, policy_meta.name),
+ ])
+
+
+def _run_tinygrad_bundle(bundle_dir: Path, monkeypatch):
+ bundle = _bundle_for_dir(bundle_dir)
+ monkeypatch.setattr(bundle_helpers, "get_active_bundle", lambda params=None: bundle, raising=False)
+ monkeypatch.setattr(model_runner_mod, "get_active_bundle", lambda params=None: bundle, raising=False)
+ monkeypatch.setattr(tinygrad_runner_mod, "CUSTOM_MODEL_PATH", str(bundle_dir), raising=False)
+ monkeypatch.setattr(model_runner_mod, "CUSTOM_MODEL_PATH", str(bundle_dir), raising=False)
+
+ vision_runner = TinygradRunner(ModelType.vision)
+ _seed_runner_inputs(vision_runner)
+ vision_outputs = vision_runner.run_model()
+
+ policy_runner = TinygradRunner(ModelType.policy)
+ _seed_runner_inputs(policy_runner)
+ policy_outputs = policy_runner.run_model()
+
+ return vision_outputs, policy_outputs
+
+
+def _run_onnx_bundle(bundle_dir: Path):
+ vision_session = OnnxRunner(bundle_dir / "driving_vision.onnx")
+ policy_session = OnnxRunner(bundle_dir / "driving_policy.onnx")
+
+ def seed_inputs(session):
+ seeded = {}
+ for name, spec in session.graph_inputs.items():
+ dtype_text = str(spec.dtype).lower()
+ if "uchar" in dtype_text or "uint8" in dtype_text:
+ seeded[name] = Tensor(np.zeros(spec.shape, dtype=np.uint8))
+ elif "half" in dtype_text or "float16" in dtype_text:
+ seeded[name] = Tensor(np.zeros(spec.shape, dtype=np.float16))
+ else:
+ seeded[name] = Tensor(np.zeros(spec.shape, dtype=np.float32))
+ return seeded
+
+ return (
+ vision_session(seed_inputs(vision_session))["outputs"].numpy().flatten(),
+ policy_session(seed_inputs(policy_session))["outputs"].numpy().flatten(),
+ )
+
+
+@pytest.mark.skipif(not SHARE_ROOT.is_dir(), reason="selector model share is not mounted")
+def test_three_selector_models_parse_via_share_onnx():
+ selector_dirs = _find_selector_dirs(limit=3, require_onnx=True)
+ assert len(selector_dirs) >= 3
+
+ for bundle_dir in selector_dirs:
+ vision_raw, policy_raw = _run_onnx_bundle(bundle_dir)
+ assert vision_raw.size > 0
+ assert policy_raw.size > 0
+
+
+@pytest.mark.skipif(not SHARE_ROOT.is_dir(), reason="selector model share is not mounted")
+def test_selector_tinygrad_pkls_execute_when_host_compatible(monkeypatch):
+ selector_dirs = _find_selector_dirs(limit=10)
+ attempted = 0
+ executed = 0
+
+ for bundle_dir in selector_dirs:
+ attempted += 1
+ try:
+ vision_outputs, policy_outputs = _run_tinygrad_bundle(bundle_dir, monkeypatch)
+ except AssertionError as exc:
+ if "Model was built on C3 or C3X" in str(exc):
+ continue
+ raise
+ except FileNotFoundError as exc:
+ if "/dev/kgsl-3d0" in str(exc):
+ continue
+ raise
+
+ assert "pose" in vision_outputs
+ assert "plan" in policy_outputs
+ executed += 1
+ if executed >= 3:
+ break
+
+ if executed == 0:
+ pytest.skip(f"share tinygrad pkls are QCOM-only on this host; inspected {attempted} bundles")
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_supercombo_runner_guards.py b/iqpilot/selfdrive/iqmodeld/tests/test_supercombo_runner_guards.py
new file mode 100644
index 000000000..476ce24be
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_supercombo_runner_guards.py
@@ -0,0 +1,226 @@
+from __future__ import annotations
+
+import hashlib
+from pathlib import Path
+
+import pytest
+
+from cereal import custom
+from openpilot.iqpilot.selfdrive.iqmodeld.models import helpers as model_helpers
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad import supercombo_runner as supercombo_runner_mod
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import (
+ TinygradSupercomboRunner,
+)
+
+
+class _Captured:
+ def __init__(self, expected_names):
+ self.expected_names = expected_names
+
+
+class _FakeJit:
+ def __init__(self, expected_names):
+ self.captured = _Captured(expected_names)
+
+
+class _Boom:
+ def __init__(self, err: Exception):
+ self.err = err
+
+ def __call__(self, *args, **kwargs):
+ raise self.err
+
+
+class _FakeParams:
+ def __init__(self, active_bundle=None):
+ self.store = {}
+ if active_bundle is not None:
+ self.store["ModelManager_ActiveBundle"] = active_bundle
+
+ def get(self, key):
+ return self.store.get(key)
+
+ def put(self, key, value):
+ self.store[key] = value
+
+ def remove(self, key):
+ self.store.pop(key, None)
+
+
+def test_verify_artifact_file_deletes_stale_cached_pkl(tmp_path: Path):
+ pkl_path = tmp_path / "driving_supercombo_guard.pkl"
+ pkl_path.write_bytes(b"stale-pkl")
+
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = str(pkl_path)
+ runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest()
+
+ with pytest.raises(RuntimeError, match="SHA mismatch"):
+ runner._verify_artifact_file()
+
+ assert not pkl_path.exists()
+
+
+def test_validate_jit_names_accepts_current_runtime_contract():
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = "/tmp/does-not-matter.pkl"
+ runner._expected_sha256 = ""
+ runner._run_policy = _FakeJit(['warped', 'img_q', 'big_img_q', 'feat_q', 'desire_q', 'packed_npy_inputs'])
+ runner._warp_jits = {
+ (1344, 760): _FakeJit(['tfm', 'big_tfm', 'frame', 'big_frame']),
+ }
+
+ runner._validate_jit_names()
+
+
+def test_validate_jit_names_raises_clear_error_for_contract_mismatch():
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = "/tmp/does-not-matter.pkl"
+ runner._expected_sha256 = ""
+ runner._run_policy = _FakeJit(['img', 'big_img', 'feat_q', 'desire_q', 'desire', 'traffic_convention', 'action_t'])
+ runner._warp_jits = {
+ (1344, 760): _FakeJit(['img_q', 'big_img_q', 'tfm', 'big_tfm', 'frame', 'big_frame']),
+ }
+
+ with pytest.raises(RuntimeError, match="JIT argument mismatch"):
+ runner._validate_jit_names()
+
+
+def test_handle_runtime_jit_mismatch_deletes_stale_cached_pkl(tmp_path: Path):
+ pkl_path = tmp_path / "driving_supercombo_guard.pkl"
+ pkl_path.write_bytes(b"stale-pkl")
+
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = str(pkl_path)
+ runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest()
+
+ with pytest.raises(RuntimeError, match="runtime JIT mismatch with stale cached SHA"):
+ runner._handle_runtime_jit_mismatch(RuntimeError("args mismatch in JIT: stale bundle"))
+
+ assert not pkl_path.exists()
+
+
+def test_handle_runtime_jit_mismatch_raises_clear_error_without_sha_mismatch(tmp_path: Path):
+ pkl_path = tmp_path / "driving_supercombo_guard.pkl"
+ pkl_path.write_bytes(b"fresh-pkl")
+
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = str(pkl_path)
+ runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest()
+
+ with pytest.raises(RuntimeError, match="runtime JIT mismatch"):
+ runner._handle_runtime_jit_mismatch(RuntimeError("args mismatch in JIT: wrong contract"))
+
+
+def test_schedule_active_bundle_redownload_sets_download_index(monkeypatch: pytest.MonkeyPatch):
+ params = _FakeParams({"index": 81})
+ monkeypatch.setattr(supercombo_runner_mod, "Params", lambda: params)
+
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ msg = runner._schedule_active_bundle_redownload()
+
+ assert params.get("ModelManager_DownloadIndex") == "81"
+ assert msg == "; scheduled automatic re-download of the active model"
+
+
+def test_no_active_bundle_seeds_default_tinygrad(monkeypatch: pytest.MonkeyPatch):
+ monkeypatch.setattr(model_helpers, "ensure_default_model_files", lambda *a, **k: None)
+ params = _FakeParams()
+
+ runner = model_helpers.get_active_model_runner(params)
+
+ assert runner == custom.IQModelManager.Runner.tinygrad
+ active = params.get("ModelManager_ActiveBundle")
+ assert active is not None and active.get("ref") == "default"
+
+
+def test_select_default_model_clears_custom_download_state(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
+ pending_restore = tmp_path / "pending_model_restore"
+ pending_restore.write_text("Pop")
+ monkeypatch.setattr(model_helpers, "_PENDING_MODEL_RESTORE_FILE", str(pending_restore))
+ monkeypatch.setattr(model_helpers, "ensure_default_model_files", lambda *a, **k: None)
+
+ params = _FakeParams({"index": 81, "ref": "pop"})
+ params.put("ModelManager_DownloadIndex", "81")
+ params.put("ModelRunnerTypeCache", int(custom.IQModelManager.Runner.tinygrad))
+
+ model_helpers.select_default_model(params)
+
+ assert params.get("ModelManager_DownloadIndex") is None
+ active = params.get("ModelManager_ActiveBundle")
+ assert active is not None and active.get("ref") == "default"
+ assert int(params.get("ModelRunnerTypeCache")) == int(custom.IQModelManager.Runner.tinygrad)
+ assert not pending_restore.exists()
+
+
+def test_default_model_is_not_resolved_to_manifest_pop_bundle():
+ pop_bundle = type("Bundle", (), {"internalName": "Pop (Default)", "displayName": "Pop (Default)"})()
+
+ assert model_helpers.get_default_model_bundle([pop_bundle]) is None
+
+
+def test_verify_artifact_file_schedules_redownload_for_stale_cached_pkl(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
+ params = _FakeParams({"index": 81})
+ monkeypatch.setattr(supercombo_runner_mod, "Params", lambda: params)
+
+ pkl_path = tmp_path / "driving_supercombo_guard.pkl"
+ pkl_path.write_bytes(b"stale-pkl")
+
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = str(pkl_path)
+ runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest()
+
+ with pytest.raises(RuntimeError, match="scheduled automatic re-download"):
+ runner._verify_artifact_file()
+
+ assert params.get("ModelManager_DownloadIndex") == "81"
+ assert not pkl_path.exists()
+
+
+def test_run_fused_converts_raw_warp_jit_mismatch_to_runtime_error(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
+ pkl_path = tmp_path / "driving_supercombo_guard.pkl"
+ pkl_path.write_bytes(b"fresh-pkl")
+
+ runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner)
+ runner._pkl_path = str(pkl_path)
+ runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest()
+ runner._frame_skip = 4
+ runner._cam = (1344, 760)
+ runner._queues = {
+ "tfm": object(),
+ "big_tfm": object(),
+ "img_q": object(),
+ "big_img_q": object(),
+ "feat_q": object(),
+ "desire_q": object(),
+ "packed_npy_inputs": object(),
+ }
+ runner._npy = {
+ "tfm": [0.0],
+ "big_tfm": [0.0],
+ "desire": [0.0],
+ "prev_feat": [0.0],
+ }
+ runner._prev_desire = [0.0]
+ runner._warp_jits = {
+ (1344, 760): _Boom(RuntimeError("args mismatch in JIT: self.captured.expected_names=['big_frame'] != ['frame']")),
+ }
+ runner._run_policy = _FakeJit(["warped", "img_q", "big_img_q", "feat_q", "desire_q", "packed_npy_inputs"])
+ runner._hidden_slice = slice(0, 1)
+ runner._slices = {"out": slice(0, 1)}
+ runner._parser = type("P", (), {"parse_vision_outputs": staticmethod(lambda sliced: sliced)})()
+ runner._frame_tensor = lambda *args, **kwargs: object()
+
+ monkeypatch.setattr(TinygradSupercomboRunner, "_ensure_queues", lambda self, cam_w, cam_h: None)
+
+ class _Buf:
+ width = 1344
+ height = 760
+ data = memoryview(b"\x00")
+
+ with pytest.raises(RuntimeError, match="runtime JIT mismatch"):
+ runner.run_fused(
+ {"img": _Buf(), "big_img": _Buf()},
+ {"img": [0.0], "big_img": [0.0]},
+ {},
+ )
diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_temporal_replay.py b/iqpilot/selfdrive/iqmodeld/tests/test_temporal_replay.py
new file mode 100644
index 000000000..1f7f68754
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/test_temporal_replay.py
@@ -0,0 +1,152 @@
+from __future__ import annotations
+
+from dataclasses import dataclass
+from types import SimpleNamespace
+
+import numpy as np
+import pytest
+
+import openpilot.iqpilot.selfdrive.iqmodeld.models.helpers as bundle_helpers
+import openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner as runner_helpers
+import openpilot.iqpilot.selfdrive.iqmodeld.daemon as iqmodeld_daemon
+
+
+@dataclass
+class StubOverride:
+ key: str
+ value: str
+
+
+class StubBundle:
+ def __init__(self, generation: int = 10):
+ self.overrides = [StubOverride("lat", ".1"), StubOverride("long", ".3")]
+ self.generation = generation
+
+
+class StubRunner:
+ def __init__(self, input_shapes: dict[str, tuple[int, ...]]) -> None:
+ self.input_shapes = input_shapes
+ self.constants = SimpleNamespace(
+ FULL_HISTORY_BUFFER_LEN=100,
+ FEATURE_LEN=512,
+ DESIRE_LEN=8,
+ PREV_DESIRED_CURV_LEN=1,
+ INPUT_HISTORY_BUFFER_LEN=25,
+ TEMPORAL_SKIP=4,
+ )
+ self.vision_input_names: list[str] = []
+ self.is_20hz = input_shapes.get(next(iter(input_shapes)), (1, 0, 0))[1] == 25
+
+ def prepare_inputs(self, imgs_cl, numpy_inputs, frames):
+ return None
+
+ def run_model(self):
+ return {
+ "hidden_state": np.zeros((1, self.constants.FEATURE_LEN), dtype=np.float32),
+ "desired_curvature": np.zeros((1, 1), dtype=np.float32),
+ }
+
+
+def _install_runtime(monkeypatch: pytest.MonkeyPatch, shapes: dict[str, tuple[int, ...]], generation: int = 10):
+ bundle = StubBundle(generation=generation)
+ runner = StubRunner(shapes)
+ monkeypatch.setattr(bundle_helpers, "get_active_bundle", lambda params=None: bundle, raising=False)
+ monkeypatch.setattr(runner_helpers, "get_model_runner", lambda: runner, raising=False)
+ monkeypatch.setattr(iqmodeld_daemon, "get_active_bundle", lambda params=None: bundle, raising=False)
+ monkeypatch.setattr(iqmodeld_daemon, "get_model_runner", lambda: runner, raising=False)
+ return iqmodeld_daemon.NeuralEngineState(None), runner
+
+
+def _expected_selector_indices(shape: tuple[int, ...], mode: str) -> np.ndarray | None:
+ if mode == "split":
+ full = 100
+ return np.arange(full)[-1 - (4 * (25 - 1))::4]
+ if mode == "20hz":
+ step = int(-100 / shape[1])
+ return np.arange(step, step * (shape[1] + 1), step)[::-1]
+ if mode == "dense":
+ return np.arange(shape[1])
+ return None
+
+
+@pytest.mark.parametrize(
+ ("shapes", "mode"),
+ [
+ ({"desire": (1, 100, 8), "features_buffer": (1, 99, 512), "prev_desired_curv": (1, 100, 1)}, "dense"),
+ ({"desire": (1, 25, 8), "features_buffer": (1, 24, 512)}, "20hz"),
+ ({"desire_pulse": (1, 25, 8), "features_buffer": (1, 25, 512)}, "split"),
+ ],
+)
+def test_replay_ledger_layout_matches_expected_history(monkeypatch: pytest.MonkeyPatch,
+ shapes: dict[str, tuple[int, ...]],
+ mode: str):
+ state, _runner = _install_runtime(monkeypatch, shapes)
+
+ for tensor_name, tensor_shape in shapes.items():
+ history = state.temporal_buffers.get(tensor_name)
+ selector = state.temporal_idxs_map.get(tensor_name)
+ if history is None:
+ continue
+
+ if mode == "dense":
+ expected_shape = (1, tensor_shape[1], tensor_shape[2])
+ else:
+ expected_shape = (1, 100, tensor_shape[2])
+
+ assert history.shape == expected_shape
+ expected_selector = _expected_selector_indices(tensor_shape, mode)
+ if expected_selector is None:
+ assert selector is None or selector.size == 0
+ else:
+ assert np.array_equal(selector, expected_selector)
+
+
+def test_replay_ledger_rising_edge_and_hidden_state_updates(monkeypatch: pytest.MonkeyPatch):
+ state, runner = _install_runtime(monkeypatch, {
+ "desire": (1, 100, 8),
+ "features_buffer": (1, 99, 512),
+ "prev_desired_curv": (1, 100, 1),
+ })
+
+ pulse = np.zeros(8, dtype=np.float32)
+ pulse[3] = 1.0
+ state.run({}, {}, {"desire": pulse})
+ first_export = state.numpy_inputs["desire"].copy()
+ assert np.count_nonzero(first_export) == 1
+
+ state.run({}, {}, {"desire": pulse})
+ second_export = state.numpy_inputs["desire"].copy()
+ assert np.count_nonzero(second_export) == 1
+ assert second_export[0, -1, 3] == 0.0
+
+ hidden_value = np.arange(runner.constants.FEATURE_LEN, dtype=np.float32)
+
+ def hidden_state_run():
+ return {
+ "hidden_state": hidden_value.reshape(1, -1),
+ "desired_curvature": np.array([[0.25]], dtype=np.float32),
+ }
+
+ state.model_runner.run_model = hidden_state_run
+ state.run({}, {}, {"desire": np.zeros(8, dtype=np.float32)})
+
+ np.testing.assert_allclose(state.numpy_inputs["features_buffer"][0, -1], hidden_value, rtol=0, atol=0)
+ assert state.numpy_inputs["prev_desired_curv"][0, -1, 0] == pytest.approx(0.25)
+
+
+def test_replay_ledger_zeroes_feedback_for_mlsim_generation(monkeypatch: pytest.MonkeyPatch):
+ state, _runner = _install_runtime(monkeypatch, {
+ "desire": (1, 100, 8),
+ "features_buffer": (1, 99, 512),
+ "prev_desired_curv": (1, 100, 1),
+ }, generation=11)
+
+ def ml_run():
+ return {
+ "hidden_state": np.zeros((1, 512), dtype=np.float32),
+ "desired_curvature": np.array([[1.5]], dtype=np.float32),
+ }
+
+ state.model_runner.run_model = ml_run
+ state.run({}, {}, {"desire": np.zeros(8, dtype=np.float32)})
+ assert np.count_nonzero(state.numpy_inputs["prev_desired_curv"]) == 0
diff --git a/iqpilot/selfdrive/iqmodeld/tests/tf_test/build.sh b/iqpilot/selfdrive/iqmodeld/tests/tf_test/build.sh
new file mode 100755
index 000000000..27a80bb65
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/tf_test/build.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+# Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+
+set -euo pipefail
+
+TF_ROOT="${TF_ROOT:-/home/batman/one/external/tensorflow}"
+TF_INCLUDE_DIR="${TF_INCLUDE_DIR:-$TF_ROOT/include}"
+TF_LIB_DIR="${TF_LIB_DIR:-$TF_ROOT/lib}"
+CXX="${CXX:-clang++}"
+
+exec "$CXX" \
+ -std=c++17 \
+ -I "$TF_INCLUDE_DIR" \
+ -L "$TF_LIB_DIR" \
+ -Wl,-rpath="$TF_LIB_DIR" \
+ main.cc \
+ -ltensorflow
diff --git a/iqpilot/selfdrive/iqmodeld/tests/tf_test/pb_loader.py b/iqpilot/selfdrive/iqmodeld/tests/tf_test/pb_loader.py
new file mode 100755
index 000000000..11a78693c
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/tf_test/pb_loader.py
@@ -0,0 +1,32 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import sys
+from pathlib import Path
+
+import tensorflow as tf
+
+
+def _load_graph_bytes(graph_path: Path) -> bytes:
+ return graph_path.read_bytes()
+
+
+def _parse_graph(graph_path: Path) -> tf.compat.v1.GraphDef:
+ graph = tf.compat.v1.GraphDef()
+ graph.ParseFromString(_load_graph_bytes(graph_path))
+ return graph
+
+
+def main(argv: list[str]) -> int:
+ if len(argv) < 2:
+ print("Usage: pb_loader.py ")
+ return 1
+ _parse_graph(Path(argv[1]))
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main(sys.argv))
diff --git a/iqpilot/selfdrive/iqmodeld/tests/timing/benchmark.py b/iqpilot/selfdrive/iqmodeld/tests/timing/benchmark.py
new file mode 100755
index 000000000..35e5bff0a
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tests/timing/benchmark.py
@@ -0,0 +1,54 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import os
+import time
+
+import numpy as np
+
+import cereal.messaging as messaging
+from openpilot.system.manager.process_config import managed_processes
+
+RUN_COUNT = int(os.getenv("N", "5"))
+WINDOW_SECONDS = int(os.getenv("TIME", "30"))
+WARMUP_MESSAGES = 10
+
+
+def _collect_execution_samples(sock, duration_s: int) -> np.ndarray:
+ samples: list[float] = []
+ deadline = time.monotonic() + duration_s
+ while time.monotonic() < deadline:
+ for message in messaging.drain_sock(sock, wait_for_one=True):
+ samples.append(message.modelV2.modelExecutionTime)
+ return np.array(samples[WARMUP_MESSAGES:]) * 1000.0
+
+
+def _single_benchmark_pass(sock) -> np.ndarray:
+ os.environ["LOGPRINT"] = "debug"
+ managed_processes["modeld"].start()
+ time.sleep(5)
+ try:
+ return _collect_execution_samples(sock, WINDOW_SECONDS)
+ finally:
+ managed_processes["modeld"].stop()
+
+
+def _report_run(index: int, values_ms: np.ndarray) -> None:
+ print(
+ f"run {index}: avg={values_ms.mean():0.2f}ms "
+ f"min={values_ms.min():0.2f}ms max={values_ms.max():0.2f}ms"
+ )
+
+
+if __name__ == "__main__":
+ subscriber = messaging.sub_sock("modelV2", conflate=False, timeout=1000)
+ all_runs = [_single_benchmark_pass(subscriber) for _ in range(RUN_COUNT)]
+
+ print("\n")
+ print(f"ran modeld {RUN_COUNT} times for {WINDOW_SECONDS}s each")
+ for index, values_ms in enumerate(all_runs, start=1):
+ _report_run(index, values_ms)
+ print("\n")
diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_daemon.py b/iqpilot/selfdrive/iqmodeld/tools/compile_daemon.py
new file mode 100644
index 000000000..52242def2
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tools/compile_daemon.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+from openpilot.iqpilot.selfdrive.iqmodeld.tools.daemon_jit_compiler import main
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_split_runtime.py b/iqpilot/selfdrive/iqmodeld/tools/compile_split_runtime.py
new file mode 100644
index 000000000..b2f329a0f
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tools/compile_split_runtime.py
@@ -0,0 +1,417 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import argparse
+import atexit
+import os
+import pickle
+import time
+from dataclasses import dataclass
+from functools import partial
+
+import numpy as np
+
+
+def _patch_firmware_fetch() -> None:
+ import hashlib
+ import pathlib
+
+ import zstandard
+ from tinygrad import helpers
+
+ if not hasattr(helpers, "fetch_fw"):
+ return
+
+ original_fetch = helpers.fetch_fw
+
+ def fetch_fw(path, name, sha256):
+ archive_path = pathlib.Path(f"/lib/firmware/{path}/{name}.zst")
+ if archive_path.is_file():
+ blob = zstandard.ZstdDecompressor().stream_reader(archive_path.read_bytes()).read()
+ if hashlib.sha256(blob).hexdigest() == sha256:
+ return blob
+ return original_fetch(path, name, sha256)
+
+ helpers.fetch_fw = fetch_fw
+
+
+_patch_firmware_fetch()
+
+from tinygrad.device import Device
+from tinygrad.engine.jit import TinyJit
+from tinygrad.helpers import Context
+from tinygrad.nn.onnx import OnnxRunner
+from tinygrad.tensor import Tensor
+
+
+@dataclass(frozen=True)
+class CameraGeometry:
+ width: int
+ height: int
+ stride: int
+ y_height: int
+ uv_height: int
+ size: int
+
+
+WARP_DEVICE = os.getenv("WARP_DEV")
+
+
+def _read_shared_copy(path: str) -> str:
+ from openpilot.common.file_chunker import read_file_chunked
+ from openpilot.system.hardware.hw import Paths
+
+ shm_path = os.path.join(Paths.shm_path(), os.path.basename(path))
+ atexit.register(lambda: os.path.exists(shm_path) and os.remove(shm_path))
+ with open(shm_path, "wb") as handle:
+ handle.write(read_file_chunked(path))
+ return shm_path
+
+
+def _parse_size(text: str) -> tuple[int, int]:
+ width, height = text.lower().split("x")
+ return int(width), int(height)
+
+
+def _rand_u8_inputs(keys: list[str], shape, device=None):
+ return {key: Tensor.randint(shape, low=0, high=256, dtype="uint8", device=device).realize() for key in keys}
+
+
+def _phase_desire_key(policy_shapes: dict[str, tuple[int, ...]]) -> str:
+ for key in policy_shapes:
+ if key.startswith("desire"):
+ return key
+ raise KeyError("No desire-like key found in policy shapes")
+
+
+def _phase_image_keys(vision_shapes: dict[str, tuple[int, ...]]) -> tuple[str, str]:
+ names = sorted(name for name in vision_shapes if "img" in name)
+ road_key = next((name for name in names if "big" not in name), None)
+ wide_key = next((name for name in names if "big" in name), None)
+ if road_key is None or wide_key is None:
+ raise ValueError(f"Unable to resolve road/wide image keys from {list(vision_shapes)}")
+ return road_key, wide_key
+
+
+def _base_policy_keys(policy_shapes: dict[str, tuple[int, ...]]) -> set[str]:
+ return {
+ _phase_desire_key(policy_shapes),
+ "features_buffer",
+ "traffic_convention",
+ "action_t",
+ }
+
+
+def _common_policy_shapes(role_shapes: dict[str, dict[str, tuple[int, ...]]]) -> dict[str, tuple[int, ...]]:
+ first_role = next(iter(role_shapes))
+ baseline = role_shapes[first_role]
+ for role_name, shape_map in role_shapes.items():
+ if shape_map != baseline:
+ raise ValueError(f"Policy input shapes differ for role {role_name}")
+ return baseline
+
+
+def _phase_frame_skip(policy_shapes: dict[str, tuple[int, ...]]) -> int:
+ feature_shape = policy_shapes.get("features_buffer")
+ if feature_shape is None:
+ return 1
+ history_length = feature_shape[1]
+ return 1 if history_length >= 99 else 4
+
+
+def _project_pixels(src_flat, inverse_matrix, dst_shape, src_shape, stride_pad, border_fill_val=None):
+ dst_w, dst_h = dst_shape
+ src_h, src_w = src_shape
+
+ x_coords = Tensor.arange(dst_w, device=WARP_DEVICE).reshape(1, dst_w).expand(dst_h, dst_w).reshape(-1)
+ y_coords = Tensor.arange(dst_h, device=WARP_DEVICE).reshape(dst_h, 1).expand(dst_h, dst_w).reshape(-1)
+
+ src_x = inverse_matrix[0, 0] * x_coords + inverse_matrix[0, 1] * y_coords + inverse_matrix[0, 2]
+ src_y = inverse_matrix[1, 0] * x_coords + inverse_matrix[1, 1] * y_coords + inverse_matrix[1, 2]
+ scale = inverse_matrix[2, 0] * x_coords + inverse_matrix[2, 1] * y_coords + inverse_matrix[2, 2]
+
+ src_x = src_x / scale
+ src_y = src_y / scale
+
+ rounded_x = Tensor.round(src_x)
+ rounded_y = Tensor.round(src_y)
+ gather_x = rounded_x.clip(0, src_w - 1).cast("int")
+ gather_y = rounded_y.clip(0, src_h - 1).cast("int")
+ gather_index = gather_y * (src_w + stride_pad) + gather_x
+ sampled = src_flat[gather_index]
+
+ if border_fill_val is None:
+ return sampled
+
+ inside = ((rounded_x >= 0) & (rounded_x <= src_w - 1) & (rounded_y >= 0) & (rounded_y <= src_h - 1)).cast(sampled.dtype)
+ return sampled * inside + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - inside)
+
+
+def _pack_nv12_planes(stacked_frame):
+ y_height = (stacked_frame.shape[0] * 2) // 3
+ frame_width = stacked_frame.shape[1]
+ return Tensor.cat(
+ stacked_frame[0:y_height:2, 0::2],
+ stacked_frame[1:y_height:2, 0::2],
+ stacked_frame[0:y_height:2, 1::2],
+ stacked_frame[1:y_height:2, 1::2],
+ stacked_frame[y_height:y_height + y_height // 4].reshape((y_height // 2, frame_width // 2)),
+ stacked_frame[y_height + y_height // 4:y_height + y_height // 2].reshape((y_height // 2, frame_width // 2)),
+ dim=0,
+ ).reshape((6, y_height // 2, frame_width // 2))
+
+
+def _warp_program(camera: CameraGeometry, model_w: int, model_h: int):
+ uv_offset = camera.stride * camera.y_height
+ stride_pad = camera.stride - camera.width
+
+ def prepare_frame(nv12_blob, inverse_matrix):
+ uv_matrix = inverse_matrix * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEVICE)
+ uv_plane = nv12_blob[uv_offset:uv_offset + camera.uv_height * camera.stride].reshape(camera.uv_height, camera.stride)
+ with Context(SPLIT_REDUCEOP=0):
+ y_plane = _project_pixels(nv12_blob[:camera.height * camera.stride], inverse_matrix, (model_w, model_h), (camera.height, camera.width), stride_pad).realize()
+ u_plane = _project_pixels(uv_plane[:camera.height // 2, :camera.width:2].flatten(), uv_matrix, (model_w // 2, model_h // 2), (camera.height // 2, camera.width // 2), 0).realize()
+ v_plane = _project_pixels(uv_plane[:camera.height // 2, 1:camera.width:2].flatten(), uv_matrix, (model_w // 2, model_h // 2), (camera.height // 2, camera.width // 2), 0).realize()
+ return _pack_nv12_planes(y_plane.cat(u_plane).cat(v_plane).reshape((model_h * 3 // 2, model_w)))
+
+ return prepare_frame
+
+
+def _sample_sparse(queue_tensor, frame_stride):
+ return queue_tensor[::frame_stride].contiguous().flatten(0, 1).unsqueeze(0)
+
+
+def _sample_desire(queue_tensor, frame_stride):
+ return queue_tensor.reshape(-1, frame_stride, *queue_tensor.shape[1:]).max(1).flatten(0, 1).unsqueeze(0)
+
+
+def _roll_queue(queue_tensor, incoming, sampler):
+ queue_tensor.assign(queue_tensor[1:].cat(incoming, dim=0).contiguous())
+ return sampler(queue_tensor)
+
+
+def _vision_queue_buffers(vision_shapes: dict[str, tuple[int, ...]], frame_stride: int, device):
+ road_key, _ = _phase_image_keys(vision_shapes)
+ image_shape = vision_shapes[road_key]
+ frame_history = image_shape[1] // 6
+ queue_depth = frame_stride * (frame_history - 1) + 1
+ frame_queue_shape = (queue_depth, 6, image_shape[2], image_shape[3])
+
+ numpy_state = {
+ "tfm": np.zeros((3, 3), dtype=np.float32),
+ "big_tfm": np.zeros((3, 3), dtype=np.float32),
+ }
+ tensor_state = {
+ "img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=device).contiguous().realize(),
+ "big_img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=device).contiguous().realize(),
+ **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()},
+ }
+ return tensor_state, numpy_state
+
+
+def _policy_queue_buffers(vision_shapes: dict[str, tuple[int, ...]], policy_shapes: dict[str, tuple[int, ...]], frame_stride: int, device):
+ tensor_state, numpy_state = _vision_queue_buffers(vision_shapes, frame_stride, device)
+ desired_key = _phase_desire_key(policy_shapes)
+ feature_shape = policy_shapes["features_buffer"]
+ desired_shape = policy_shapes[desired_key]
+ traffic_shape = policy_shapes["traffic_convention"]
+ action_shape = policy_shapes.get("action_t", traffic_shape)
+
+ numpy_policy = {
+ "desire": np.zeros(desired_shape[2], dtype=np.float32),
+ "traffic_convention": np.zeros(traffic_shape, dtype=np.float32),
+ "action_t": np.zeros(action_shape, dtype=np.float32),
+ }
+ for key, shape in policy_shapes.items():
+ if key not in _base_policy_keys(policy_shapes):
+ numpy_policy[key] = np.zeros(shape, dtype=np.float32)
+
+ numpy_state.update(numpy_policy)
+ tensor_state.update({
+ "feat_q": Tensor(np.zeros((frame_stride * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32), device=device).contiguous().realize(),
+ "desire_q": Tensor(np.zeros((frame_stride * desired_shape[1], desired_shape[0], desired_shape[2]), dtype=np.float32), device=device).contiguous().realize(),
+ **{name: Tensor(value, device="NPY").realize() for name, value in numpy_policy.items()},
+ })
+ return tensor_state, numpy_state
+
+
+def _stage_program(camera: CameraGeometry, model_w: int, model_h: int, frame_stride: int):
+ prepare_frame = _warp_program(camera, model_w, model_h)
+ sparse_sampler = partial(_sample_sparse, frame_stride=frame_stride)
+
+ def stage_inputs(img_q, big_img_q, tfm, big_tfm, frame, big_frame):
+ tfm = tfm.to(WARP_DEVICE)
+ big_tfm = big_tfm.to(WARP_DEVICE)
+ Tensor.realize(tfm, big_tfm)
+ staged_main = prepare_frame(frame, tfm).unsqueeze(0).to(Device.DEFAULT)
+ staged_wide = prepare_frame(big_frame, big_tfm).unsqueeze(0).to(Device.DEFAULT)
+ return (
+ _roll_queue(img_q, staged_main, sparse_sampler),
+ _roll_queue(big_img_q, staged_wide, sparse_sampler),
+ )
+
+ return stage_inputs
+
+
+def _role_executor(model_runners: dict[str, OnnxRunner], meta_by_role: dict[str, dict], frame_stride: int):
+ desired_sampler = partial(_sample_desire, frame_stride=frame_stride)
+ sparse_sampler = partial(_sample_sparse, frame_stride=frame_stride)
+ vision_hidden_slice = meta_by_role["vision"]["output_slices"]["hidden_state"]
+ policy_roles = [name for name in meta_by_role if name != "vision"]
+ policy_shapes = _common_policy_shapes({name: meta_by_role[name]["input_shapes"] for name in policy_roles})
+ desired_key = _phase_desire_key(policy_shapes)
+ road_key, wide_key = _phase_image_keys(meta_by_role["vision"]["input_shapes"])
+ extra_keys = [key for key in policy_shapes if key not in _base_policy_keys(policy_shapes)]
+
+ def execute_bundle(img, big_img, feat_q, desire_q, desire, traffic_convention, action_t, **extra):
+ desired_tensor = desire.to(Device.DEFAULT)
+ traffic_tensor = traffic_convention.to(Device.DEFAULT)
+ action_tensor = action_t.to(Device.DEFAULT)
+ extra_tensors = {key: extra[key].to(Device.DEFAULT) for key in extra_keys if key in extra}
+ Tensor.realize(desired_tensor, traffic_tensor, action_tensor, *extra_tensors.values())
+
+ desire_buffer = _roll_queue(desire_q, desired_tensor.reshape(1, 1, -1), desired_sampler)
+ vision_output = next(iter(model_runners["vision"]({road_key: img, wide_key: big_img}).values())).cast("float32")
+ hidden_state = vision_output[:, vision_hidden_slice].reshape(1, -1).unsqueeze(0)
+ feature_buffer = _roll_queue(feat_q, hidden_state, sparse_sampler)
+
+ common_inputs = {
+ "features_buffer": feature_buffer,
+ desired_key: desire_buffer,
+ "traffic_convention": traffic_tensor,
+ "action_t": action_tensor,
+ **extra_tensors,
+ }
+
+ role_outputs = []
+ for role_name in policy_roles:
+ role_outputs.append(next(iter(model_runners[role_name](common_inputs).values())).cast("float32"))
+ return (vision_output, *role_outputs)
+
+ return execute_bundle
+
+
+def _capture_and_freeze(jit_runner, random_inputs_factory, queue_keys, queue_factory):
+ seed_value = 42
+
+ def validate(fn, baseline_outputs=None, baseline_buffers=None, expect_match=True, replay_seed=seed_value):
+ queue_tensors, numpy_values = queue_factory(Device.DEFAULT)
+ np.random.seed(replay_seed)
+ Tensor.manual_seed(replay_seed)
+
+ replay_count = 1 if (baseline_outputs is not None or baseline_buffers is not None) else 3
+ for pass_index in range(replay_count):
+ for value in numpy_values.values():
+ value[:] = np.random.randn(*value.shape).astype(value.dtype)
+ Device.default.synchronize()
+ random_inputs = random_inputs_factory()
+ start_time = time.perf_counter()
+ outputs = fn(**{name: queue_tensors[name] for name in queue_keys}, **random_inputs)
+ enqueue_time = time.perf_counter()
+ Device.default.synchronize()
+ total_time = time.perf_counter()
+ print(f" [{pass_index + 1}/{replay_count}] enqueue {(enqueue_time - start_time) * 1e3:6.2f} ms -- total {(total_time - start_time) * 1e3:6.2f} ms")
+
+ if pass_index == 0:
+ output_snapshot = [np.copy(value.numpy()) for value in outputs]
+ buffer_snapshot = [np.copy(value.numpy().copy()) for value in queue_tensors.values()]
+
+ if baseline_outputs is not None:
+ matches = all(np.array_equal(current, reference) for current, reference in zip(output_snapshot, baseline_outputs, strict=True))
+ assert matches == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline"
+ if baseline_buffers is not None:
+ matches = all(np.array_equal(current, reference) for current, reference in zip(buffer_snapshot, baseline_buffers, strict=True))
+ assert matches == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline"
+
+ return output_snapshot, buffer_snapshot
+
+ print("capture + replay")
+ baseline_outputs, baseline_buffers = validate(jit_runner)
+ print("pickle round trip")
+ frozen = pickle.loads(pickle.dumps(jit_runner))
+ validate(frozen, baseline_outputs, baseline_buffers, expect_match=True)
+ validate(frozen, baseline_outputs, baseline_buffers, expect_match=False, replay_seed=seed_value + 1)
+ return frozen
+
+
+def _arg_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--model-size", type=_parse_size, required=True, help="model input WxH")
+ parser.add_argument("--camera-resolutions", type=_parse_size, nargs="+", required=True, help="camera resolutions WxH")
+ parser.add_argument("--vision-onnx", required=True)
+ parser.add_argument("--policy-onnx")
+ parser.add_argument("--off-policy-onnx")
+ parser.add_argument("--on-policy-onnx")
+ parser.add_argument("--output", required=True)
+ parser.add_argument("--frame-skip", type=int)
+ return parser
+
+
+def main(argv: list[str] | None = None) -> int:
+ from openpilot.iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record
+ from openpilot.system.camerad.cameras.nv12_info import get_nv12_info
+
+ args = _arg_parser().parse_args(argv)
+ model_w, model_h = args.model_size
+
+ policy_specs = [
+ ("policy", args.policy_onnx),
+ ("off_policy", args.off_policy_onnx),
+ ("on_policy", args.on_policy_onnx),
+ ]
+ active_policy_specs = [(role, path) for role, path in policy_specs if path]
+ if not active_policy_specs:
+ raise SystemExit("At least one policy ONNX must be provided")
+
+ model_paths = {"vision": _read_shared_copy(args.vision_onnx)}
+ for role_name, onnx_path in active_policy_specs:
+ model_paths[role_name] = _read_shared_copy(onnx_path)
+
+ model_runners = {role_name: OnnxRunner(path) for role_name, path in model_paths.items()}
+ meta_by_role = {role_name: build_metadata_record(path) for role_name, path in model_paths.items()}
+
+ shared_policy_shapes = _common_policy_shapes({
+ role_name: meta_by_role[role_name]["input_shapes"] for role_name, _ in active_policy_specs
+ })
+ frame_stride = args.frame_skip if args.frame_skip is not None else _phase_frame_skip(shared_policy_shapes)
+
+ package: dict[Any, Any] = {
+ "meta_by_role": meta_by_role,
+ "roles": [role_name for role_name, _ in active_policy_specs],
+ "frame_stride": frame_stride,
+ }
+
+ executor_jit = TinyJit(_role_executor(model_runners, meta_by_role, frame_stride), prune=True)
+ queue_factory = partial(_policy_queue_buffers, meta_by_role["vision"]["input_shapes"], shared_policy_shapes, frame_stride)
+ image_shape = meta_by_role["vision"]["input_shapes"][_phase_image_keys(meta_by_role["vision"]["input_shapes"])[0]]
+ package["execute_bundle"] = _capture_and_freeze(
+ executor_jit,
+ partial(_rand_u8_inputs, keys=["img", "big_img"], shape=image_shape),
+ ["feat_q", "desire_q", "desire", "traffic_convention", "action_t", *[k for k in shared_policy_shapes if k not in _base_policy_keys(shared_policy_shapes)]],
+ queue_factory,
+ )
+
+ for camera_width, camera_height in args.camera_resolutions:
+ camera = CameraGeometry(camera_width, camera_height, *get_nv12_info(camera_width, camera_height))
+ stage_jit = TinyJit(_stage_program(camera, model_w, model_h, frame_stride), prune=True)
+ package[(camera_width, camera_height)] = {
+ "stage_inputs": _capture_and_freeze(
+ stage_jit,
+ partial(_rand_u8_inputs, keys=["frame", "big_frame"], shape=camera.size, device=WARP_DEVICE),
+ ["img_q", "big_img_q", "tfm", "big_tfm"],
+ partial(_vision_queue_buffers, meta_by_role["vision"]["input_shapes"], frame_stride),
+ )
+ }
+
+ with open(args.output, "wb") as handle:
+ pickle.dump(package, handle)
+ print(f"Saved combined split runtime to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)")
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py b/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py
new file mode 100644
index 000000000..0bef34c9f
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py
@@ -0,0 +1,427 @@
+#!/usr/bin/env python3
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+import argparse
+import atexit
+import math
+import os
+import pickle
+import re
+import tempfile
+import time
+from functools import partial
+from collections import namedtuple
+
+import numpy as np
+
+def _patch_tinygrad_fetch_fw():
+ import hashlib
+ import pathlib
+ import zstandard
+ from tinygrad import helpers
+ _orig = helpers.fetch_fw
+ def fetch_fw(path, name, sha256):
+ p = pathlib.Path(f"/lib/firmware/{path}/{name}.zst")
+ if p.is_file():
+ blob = zstandard.ZstdDecompressor().stream_reader(p.read_bytes()).read()
+ if hashlib.sha256(blob).hexdigest() == sha256:
+ return blob
+ return _orig(path, name, sha256)
+ helpers.fetch_fw = fetch_fw
+_patch_tinygrad_fetch_fw()
+
+from tinygrad.tensor import Tensor
+from tinygrad.helpers import Context
+from tinygrad.device import Device
+from tinygrad.engine.jit import TinyJit
+
+
+NV12Frame = namedtuple("NV12Frame", ['width', 'height', 'stride', 'y_height', 'uv_height', 'size'])
+WARP_INPUTS = ['tfm', 'big_tfm']
+POLICY_INPUTS = ['img_q', 'big_img_q', 'feat_q', 'desire_q', 'packed_npy_inputs']
+
+UV_SCALE_MATRIX = np.array([[0.5, 0, 0], [0, 0.5, 0], [0, 0, 1]], dtype=np.float32)
+UV_SCALE_MATRIX_INV = np.linalg.inv(UV_SCALE_MATRIX)
+
+WARP_DEV = os.getenv('WARP_DEV')
+
+
+def make_random_images(keys, shape, device=None):
+ return {k: Tensor.randint(shape, low=0, high=256, dtype='uint8', device=device).realize() for k in keys}
+
+
+def warp_perspective_tinygrad(src_flat, M_inv, dst_shape, src_shape, stride_pad, border_fill_val=None):
+ w_dst, h_dst = dst_shape
+ h_src, w_src = src_shape
+
+ x = Tensor.arange(w_dst).reshape(1, w_dst).expand(h_dst, w_dst).reshape(-1)
+ y = Tensor.arange(h_dst).reshape(h_dst, 1).expand(h_dst, w_dst).reshape(-1)
+
+ # inline 3x3 matmul as elementwise to avoid reduce op (enables fusion with gather)
+ src_x = M_inv[0, 0] * x + M_inv[0, 1] * y + M_inv[0, 2]
+ src_y = M_inv[1, 0] * x + M_inv[1, 1] * y + M_inv[1, 2]
+ src_w = M_inv[2, 0] * x + M_inv[2, 1] * y + M_inv[2, 2]
+
+ src_x = src_x / src_w
+ src_y = src_y / src_w
+
+ x_round = Tensor.round(src_x)
+ y_round = Tensor.round(src_y)
+ x_nn_clipped = x_round.clip(0, w_src - 1).cast('int')
+ y_nn_clipped = y_round.clip(0, h_src - 1).cast('int')
+ idx = y_nn_clipped * (w_src + stride_pad) + x_nn_clipped
+ sampled = src_flat[idx]
+
+ if border_fill_val is None:
+ return sampled
+
+ in_bounds = ((x_round >= 0) & (x_round <= w_src - 1) &
+ (y_round >= 0) & (y_round <= h_src - 1)).cast(sampled.dtype)
+ return sampled * in_bounds + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - in_bounds)
+
+
+def frames_to_tensor(frames):
+ H = (frames.shape[0] * 2) // 3
+ W = frames.shape[1]
+ in_img1 = Tensor.cat(frames[0:H:2, 0::2],
+ frames[1:H:2, 0::2],
+ frames[0:H:2, 1::2],
+ frames[1:H:2, 1::2],
+ frames[H:H+H//4].reshape((H//2, W//2)),
+ frames[H+H//4:H+H//2].reshape((H//2, W//2)), dim=0).reshape((6, H//2, W//2))
+ return in_img1
+
+
+def make_frame_prepare(nv12: NV12Frame, model_w, model_h):
+ cam_w, cam_h, stride, y_height, uv_height, _ = nv12
+ uv_offset = stride * y_height
+ stride_pad = stride - cam_w
+
+ def frame_prepare_tinygrad(input_frame, M_inv):
+ # UV_SCALE @ M_inv @ UV_SCALE_INV simplifies to elementwise scaling
+ M_inv_uv = M_inv * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEV)
+ # deinterleave NV12 UV plane (UVUV... -> separate U, V)
+ uv = input_frame[uv_offset:uv_offset + uv_height * stride].reshape(uv_height, stride)
+ with Context(SPLIT_REDUCEOP=0):
+ y = warp_perspective_tinygrad(input_frame[:cam_h*stride],
+ M_inv, (model_w, model_h),
+ (cam_h, cam_w), stride_pad).realize()
+ u = warp_perspective_tinygrad(uv[:cam_h//2, :cam_w:2].flatten(),
+ M_inv_uv, (model_w//2, model_h//2),
+ (cam_h//2, cam_w//2), 0).realize()
+ v = warp_perspective_tinygrad(uv[:cam_h//2, 1:cam_w:2].flatten(),
+ M_inv_uv, (model_w//2, model_h//2),
+ (cam_h//2, cam_w//2), 0).realize()
+ yuv = y.cat(u).cat(v).reshape((model_h * 3 // 2, model_w))
+ tensor = frames_to_tensor(yuv)
+ return tensor
+ return frame_prepare_tinygrad
+
+
+def make_warp_input_queues(vision_input_shapes, frame_skip, device):
+ img = vision_input_shapes['img'] # (1, 12, 128, 256)
+ n_frames = img[1] // 6
+ img_buf_shape = (frame_skip * (n_frames - 1) + 1, 6, img[2], img[3])
+
+ npy = {
+ 'tfm': np.zeros((3, 3), dtype=np.float32),
+ 'big_tfm': np.zeros((3, 3), dtype=np.float32),
+ }
+ input_queues = {
+ 'img_q': Tensor(np.zeros(img_buf_shape, dtype=np.uint8), device=device).contiguous().realize(),
+ 'big_img_q': Tensor(np.zeros(img_buf_shape, dtype=np.uint8), device=device).contiguous().realize(),
+ **{k: Tensor(v, device='NPY').realize() for k, v in npy.items()},
+ }
+ return input_queues, npy
+
+
+def get_policy_npy_shapes(input_shapes):
+ dp = input_shapes['desire_pulse'] # (1, 25, 8)
+ tc = input_shapes['traffic_convention'] # (1, 2)
+ at = input_shapes['action_t'] # (1, 2)
+ fb = input_shapes['features_buffer'] # (1, 24, 512)
+ # TODO prev_feat shouldn't exist and be handled inside the JIT, but corrupt on QCOM for now
+ shapes = {'desire': (dp[2],), 'traffic_convention': tuple(tc), 'action_t': tuple(at), 'prev_feat': (fb[0], fb[2])}
+ return shapes, [math.prod(s) for s in shapes.values()]
+
+
+def make_input_queues(input_shapes, frame_skip, device):
+ input_queues, npy = make_warp_input_queues(input_shapes, frame_skip, device)
+
+ fb = input_shapes['features_buffer'] # (1, 24, 512), past features only; the model appends the current frame's feature
+ dp = input_shapes['desire_pulse'] # (1, 25, 8)
+
+ shapes, sizes = get_policy_npy_shapes(input_shapes)
+ packed_npy_inputs = np.zeros(sum(sizes), dtype=np.float32)
+ # views into the packed inputs, to be refilled at runtime
+ npy.update({k: v.reshape(s) for (k, s), v in zip(shapes.items(), np.split(packed_npy_inputs, np.cumsum(sizes[:-1])), strict=True)})
+ input_queues.update({
+ 'feat_q': Tensor(np.zeros((frame_skip * fb[1], fb[0], fb[2]), dtype=np.float32), device=device).contiguous().realize(),
+ 'desire_q': Tensor(np.zeros((frame_skip * dp[1], dp[0], dp[2]), dtype=np.float32), device=device).contiguous().realize(),
+ 'packed_npy_inputs': Tensor(packed_npy_inputs, device='NPY').realize(),
+ })
+ return input_queues, npy
+
+
+def shift_and_sample(buf, new_val, sample_fn):
+ buf.assign(buf[1:].cat(new_val, dim=0).contiguous())
+ return sample_fn(buf)
+
+
+def sample_skip(buf, frame_skip):
+ return buf[::frame_skip].contiguous().flatten(0, 1).unsqueeze(0)
+
+
+def sample_desire(buf, frame_skip):
+ return buf.reshape(-1, frame_skip, *buf.shape[1:]).max(1).flatten(0, 1).unsqueeze(0)
+
+
+def make_warp(nv12, model_w, model_h, frame_skip):
+ frame_prepare = make_frame_prepare(nv12, model_w, model_h)
+
+ def warp(tfm, big_tfm, frame, big_frame):
+ tfm = tfm.to(WARP_DEV)
+ big_tfm = big_tfm.to(WARP_DEV)
+ Tensor.realize(tfm, big_tfm)
+
+ warped_frame = frame_prepare(frame, tfm).unsqueeze(0)
+ warped_big_frame = frame_prepare(big_frame, big_tfm).unsqueeze(0)
+ return Tensor.cat(warped_frame, warped_big_frame)
+
+ return warp
+
+
+def make_run_policy(model_runner, model_metadata, frame_skip):
+ sample_desire_fn = partial(sample_desire, frame_skip=frame_skip)
+ sample_skip_fn = partial(sample_skip, frame_skip=frame_skip)
+ npy_shapes, npy_sizes = get_policy_npy_shapes(model_metadata['input_shapes'])
+
+ def run_policy(warped, img_q, big_img_q, feat_q, desire_q, packed_npy_inputs):
+ packed_npy_inputs = packed_npy_inputs.to(Device.DEFAULT)
+ warped = warped.to(Device.DEFAULT)
+ Tensor.realize(packed_npy_inputs, warped)
+
+ img = shift_and_sample(img_q, warped[0:1], sample_skip_fn)
+ big_img = shift_and_sample(big_img_q, warped[1:2], sample_skip_fn)
+
+ desire, traffic_convention, action_t, prev_feat = (t.reshape(s) for t, s in zip(packed_npy_inputs.split(npy_sizes), npy_shapes.values(), strict=True))
+ desire_buf = shift_and_sample(desire_q, desire.reshape(1, 1, -1), sample_desire_fn)
+ feat_buf = shift_and_sample(feat_q, prev_feat.reshape(1, 1, -1), sample_skip_fn)
+
+ inputs = {
+ 'img': img,
+ 'big_img': big_img,
+ 'features_buffer': feat_buf,
+ 'desire_pulse': desire_buf,
+ 'traffic_convention': traffic_convention,
+ 'action_t': action_t,
+ }
+ out = next(iter(model_runner(inputs).values())).cast('float32')
+ return out,
+ return run_policy
+
+
+def compile_jit(jit, make_random_inputs, input_keys, make_queues):
+ SEED = 42
+ def random_inputs_run(fn, seed, test_val=None, test_buffers=None, expect_match=True):
+ input_queues, npy = make_queues(Device.DEFAULT)
+ np.random.seed(seed)
+ Tensor.manual_seed(seed)
+
+ testing = test_val is not None or test_buffers is not None
+ n_runs = 1 if testing else 3
+
+ for i in range(n_runs):
+ for v in npy.values():
+ v[:] = np.random.randn(*v.shape).astype(v.dtype)
+ Device.default.synchronize()
+ random_inputs = make_random_inputs()
+ st = time.perf_counter()
+ outs = fn(**{k: input_queues[k] for k in input_keys}, **random_inputs)
+ mt = time.perf_counter()
+ Device.default.synchronize()
+ et = time.perf_counter()
+ print(f" [{i+1}/{n_runs}] enqueue {(mt-st)*1e3:6.2f} ms -- total {(et-st)*1e3:6.2f} ms")
+
+ if i == 0:
+ val = [np.copy(v.numpy()) for v in outs]
+ buffers = [np.copy(v.numpy().copy()) for v in input_queues.values()]
+
+ if test_val is not None:
+ match = all(np.array_equal(a, b) for a, b in zip(val, test_val, strict=True))
+ assert match == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline (seed={seed})"
+ if test_buffers is not None:
+ match = all(np.array_equal(a, b) for a, b in zip(buffers, test_buffers, strict=True))
+ assert match == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline (seed={seed})"
+ return val, buffers
+
+ print('capture + replay')
+ test_val, test_buffers = random_inputs_run(jit, SEED)
+ print('pickle round trip')
+ jit = pickle.loads(pickle.dumps(jit))
+ random_inputs_run(jit, SEED, test_val, test_buffers, expect_match=True)
+ random_inputs_run(jit, SEED+1, test_val, test_buffers, expect_match=False)
+ return jit
+
+
+def _captured_devices(jit) -> set[str]:
+ captured = getattr(jit, 'captured', None)
+ infos = getattr(captured, 'expected_input_info', None)
+ if not infos:
+ return set()
+
+ devices: set[str] = set()
+ for info in infos:
+ if isinstance(info, tuple) and len(info) >= 4 and isinstance(info[3], str):
+ devices.add(info[3])
+ return devices
+
+
+def _slice_outputs(model_outputs: np.ndarray, output_slices: dict[str, slice]) -> dict[str, np.ndarray]:
+ return {name: model_outputs[np.newaxis, tensor_slice] for name, tensor_slice in output_slices.items() if name != 'pad'}
+
+
+def _validate_pose_outputs(parsed_outputs: dict[str, np.ndarray]) -> None:
+ from openpilot.selfdrive.locationd.locationd import MIN_STD_SANITY_CHECK, ROTATION_SANITY_CHECK, TRANS_SANITY_CHECK
+
+ required = (
+ 'pose', 'pose_stds', 'wide_from_device_euler', 'wide_from_device_euler_stds',
+ 'road_transform', 'road_transform_stds',
+ )
+ missing = [name for name in required if name not in parsed_outputs]
+ if missing:
+ raise AssertionError(f"parsed supercombo outputs missing required odometry tensors: {missing}")
+
+ for name in required:
+ values = parsed_outputs[name]
+ if not np.isfinite(values).all():
+ raise AssertionError(f"parsed supercombo output {name} contains non-finite values")
+
+ pose = parsed_outputs['pose'][0]
+ pose_stds = parsed_outputs['pose_stds'][0]
+ road_transform_stds = parsed_outputs['road_transform_stds'][0]
+ wide_stds = parsed_outputs['wide_from_device_euler_stds'][0]
+
+ if pose_stds.min() <= MIN_STD_SANITY_CHECK:
+ raise AssertionError(f"pose_stds min {pose_stds.min()} <= {MIN_STD_SANITY_CHECK}")
+ if road_transform_stds.min() <= MIN_STD_SANITY_CHECK:
+ raise AssertionError(f"road_transform_stds min {road_transform_stds.min()} <= {MIN_STD_SANITY_CHECK}")
+ if wide_stds.min() <= MIN_STD_SANITY_CHECK:
+ raise AssertionError(f"wide_from_device_euler_stds min {wide_stds.min()} <= {MIN_STD_SANITY_CHECK}")
+
+ if np.linalg.norm(pose[:3]) > TRANS_SANITY_CHECK:
+ raise AssertionError(f"pose translation norm {np.linalg.norm(pose[:3])} exceeds {TRANS_SANITY_CHECK}")
+ if np.linalg.norm(pose[3:]) > ROTATION_SANITY_CHECK:
+ raise AssertionError(f"pose rotation norm {np.linalg.norm(pose[3:])} exceeds {ROTATION_SANITY_CHECK}")
+ if np.linalg.norm(pose_stds[:3]) > 10 * TRANS_SANITY_CHECK:
+ raise AssertionError(
+ f"pose translation std norm {np.linalg.norm(pose_stds[:3])} exceeds {10 * TRANS_SANITY_CHECK}"
+ )
+ if np.linalg.norm(pose_stds[3:]) > 10 * ROTATION_SANITY_CHECK:
+ raise AssertionError(
+ f"pose rotation std norm {np.linalg.norm(pose_stds[3:])} exceeds {10 * ROTATION_SANITY_CHECK}"
+ )
+
+
+def validate_supercombo_release(run_policy_jit, model_runner, model_metadata, frame_skip, expected_device: str) -> None:
+ from openpilot.iqpilot.selfdrive.iqmodeld.parser import PhaseParser
+
+ direct_fn = make_run_policy(model_runner, model_metadata, frame_skip)
+ parser = PhaseParser()
+ queue_factory = partial(make_input_queues, model_metadata['input_shapes'], frame_skip)
+ image_shape = model_metadata['input_shapes']['img']
+
+ jit_queues, jit_npy = queue_factory(Device.DEFAULT)
+ direct_queues, direct_npy = queue_factory(Device.DEFAULT)
+
+ for payload in (jit_npy, direct_npy):
+ for name, value in payload.items():
+ value[:] = 0 if value.dtype.kind in ('i', 'u') else 0.0
+
+ zero_inputs = {
+ 'warped': Tensor(np.zeros((2, 6, *image_shape[2:]), dtype=np.uint8), device=Device.DEFAULT).realize(),
+ }
+
+ direct_outs, = direct_fn(**{k: direct_queues[k] for k in POLICY_INPUTS}, **zero_inputs)
+ jit_outs, = run_policy_jit(**{k: jit_queues[k] for k in POLICY_INPUTS}, **zero_inputs)
+
+ direct_flat = direct_outs.numpy().astype(np.float32).reshape(-1)
+ jit_flat = jit_outs.numpy().astype(np.float32).reshape(-1)
+
+ if not np.allclose(direct_flat, jit_flat, atol=1e-4, rtol=1e-4):
+ max_delta = float(np.max(np.abs(direct_flat - jit_flat)))
+ raise AssertionError(f"JIT supercombo output diverges from direct ONNX execution; max abs delta {max_delta}")
+
+ parsed = parser.parse_vision_outputs(_slice_outputs(jit_flat, model_metadata['output_slices']))
+ _validate_pose_outputs(parsed)
+
+ captured_devices = _captured_devices(run_policy_jit)
+ if expected_device and captured_devices and expected_device not in captured_devices:
+ raise AssertionError(
+ f"compiled run_policy backend mismatch: captured {sorted(captured_devices)} expected {expected_device}"
+ )
+
+
+def _parse_size(s):
+ w, h = s.lower().split('x')
+ return int(w), int(h)
+
+
+def read_file_chunked_to_shm(path):
+ from openpilot.common.file_chunker import read_file_chunked
+ from openpilot.system.hardware.hw import Paths
+ with tempfile.NamedTemporaryFile(prefix='compile_modeld_', dir=Paths.shm_path(), delete=False) as f:
+ f.write(read_file_chunked(path))
+ tmp_path = f.name
+ atexit.register(lambda: os.path.exists(tmp_path) and os.remove(tmp_path))
+ return tmp_path
+
+
+if __name__ == "__main__":
+ from tinygrad.nn.onnx import OnnxRunner
+ from openpilot.system.camerad.cameras.nv12_info import get_nv12_info
+ from openpilot.iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record
+ p = argparse.ArgumentParser()
+ p.add_argument('--model-size', type=_parse_size, required=True, help='model input WxH')
+ p.add_argument('--camera-resolutions', type=_parse_size, nargs='+', required=True,
+ help='camera resolutions WxH (one or more)')
+ p.add_argument('--onnx', required=True)
+ p.add_argument('--output', required=True)
+ p.add_argument('--frame-skip', type=int, required=True)
+ p.add_argument('--expected-device', default='QCOM', help='expected tinygrad backend baked into the JIT')
+ args = p.parse_args()
+
+ model_path = read_file_chunked_to_shm(args.onnx)
+ model_w, model_h = args.model_size
+
+ model_runner = OnnxRunner(model_path)
+ out = {
+ 'metadata': build_metadata_record(model_path),
+ 'frame_skip': args.frame_skip,
+ }
+
+ run_policy_jit = TinyJit(make_run_policy(model_runner, out['metadata'], args.frame_skip), prune=True)
+
+ make_policy_queues = partial(make_input_queues, out['metadata']['input_shapes'], args.frame_skip)
+ make_random_model_inputs = partial(make_random_images, keys=['warped'], shape=(2, 6, *out['metadata']['input_shapes']['img'][2:]))
+ out['run_policy'] = compile_jit(run_policy_jit, make_random_model_inputs, POLICY_INPUTS,
+ make_policy_queues)
+ validate_supercombo_release(out['run_policy'], model_runner, out['metadata'], args.frame_skip, args.expected_device)
+
+ for cam_w, cam_h in args.camera_resolutions:
+ nv12 = NV12Frame(cam_w, cam_h, *get_nv12_info(cam_w, cam_h))
+ make_random_warp_inputs = partial(make_random_images, keys=['frame', 'big_frame'], shape=nv12.size, device=WARP_DEV)
+ warp_enqueue = TinyJit(make_warp(nv12, model_w, model_h, args.frame_skip), prune=True)
+ make_warp_queues = partial(make_warp_input_queues, out['metadata']['input_shapes'], args.frame_skip)
+ out[(cam_w,cam_h)] = compile_jit(warp_enqueue, make_random_warp_inputs, WARP_INPUTS, make_warp_queues)
+ captured_devices = _captured_devices(out[(cam_w,cam_h)])
+ if args.expected_device and captured_devices and args.expected_device not in captured_devices:
+ raise AssertionError(
+ f"compiled warp backend mismatch for {cam_w}x{cam_h}: captured {sorted(captured_devices)} expected {args.expected_device}"
+ )
+
+ with open(args.output, "wb") as f:
+ pickle.dump(out, f)
+ print(f"Saved JITs to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)")
diff --git a/iqpilot/selfdrive/iqmodeld/tools/daemon_jit_compiler.py b/iqpilot/selfdrive/iqmodeld/tools/daemon_jit_compiler.py
new file mode 100644
index 000000000..7b224fb70
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tools/daemon_jit_compiler.py
@@ -0,0 +1,331 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import argparse
+import atexit
+import os
+import pickle
+import time
+from dataclasses import dataclass
+from functools import partial
+from pathlib import Path
+
+import numpy as np
+
+
+def _install_firmware_fetch_patch() -> None:
+ import hashlib
+ import pathlib
+
+ import zstandard
+ from tinygrad import helpers
+
+ if not hasattr(helpers, "fetch_fw"):
+ return
+
+ original_fetch = helpers.fetch_fw
+
+ def fetch_fw(path, name, sha256):
+ archive_path = pathlib.Path(f"/lib/firmware/{path}/{name}.zst")
+ if archive_path.is_file():
+ blob = zstandard.ZstdDecompressor().stream_reader(archive_path.read_bytes()).read()
+ if hashlib.sha256(blob).hexdigest() == sha256:
+ return blob
+ return original_fetch(path, name, sha256)
+
+ helpers.fetch_fw = fetch_fw
+
+
+_install_firmware_fetch_patch()
+
+from tinygrad.device import Device
+from tinygrad.engine.jit import TinyJit
+from tinygrad.helpers import Context
+from tinygrad.nn.onnx import OnnxRunner
+from tinygrad.tensor import Tensor
+
+
+@dataclass(frozen=True)
+class FrameGeometry:
+ width: int
+ height: int
+ stride: int
+ y_height: int
+ uv_height: int
+ size: int
+
+
+WARP_INPUT_NAMES = ["img_q", "big_img_q", "tfm", "big_tfm"]
+POLICY_INPUT_NAMES = ["feat_q", "desire_q", "desire", "traffic_convention", "action_t"]
+WARP_DEV = os.getenv("WARP_DEV")
+
+
+def _random_tensor_inputs(keys: list[str], shape, device=None):
+ return {key: Tensor.randint(shape, low=0, high=256, dtype="uint8", device=device).realize() for key in keys}
+
+
+def _project_frame(src_flat, inverse_matrix, dst_shape, src_shape, stride_pad, border_fill_val=None):
+ dst_w, dst_h = dst_shape
+ src_h, src_w = src_shape
+
+ x = Tensor.arange(dst_w, device=WARP_DEV).reshape(1, dst_w).expand(dst_h, dst_w).reshape(-1)
+ y = Tensor.arange(dst_h, device=WARP_DEV).reshape(dst_h, 1).expand(dst_h, dst_w).reshape(-1)
+
+ src_x = inverse_matrix[0, 0] * x + inverse_matrix[0, 1] * y + inverse_matrix[0, 2]
+ src_y = inverse_matrix[1, 0] * x + inverse_matrix[1, 1] * y + inverse_matrix[1, 2]
+ src_w_scale = inverse_matrix[2, 0] * x + inverse_matrix[2, 1] * y + inverse_matrix[2, 2]
+
+ src_x = src_x / src_w_scale
+ src_y = src_y / src_w_scale
+
+ rounded_x = Tensor.round(src_x)
+ rounded_y = Tensor.round(src_y)
+ clipped_x = rounded_x.clip(0, src_w - 1).cast("int")
+ clipped_y = rounded_y.clip(0, src_h - 1).cast("int")
+ gather_index = clipped_y * (src_w + stride_pad) + clipped_x
+ sampled = src_flat[gather_index]
+
+ if border_fill_val is None:
+ return sampled
+
+ inside = ((rounded_x >= 0) & (rounded_x <= src_w - 1) & (rounded_y >= 0) & (rounded_y <= src_h - 1)).cast(sampled.dtype)
+ return sampled * inside + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - inside)
+
+
+def _nv12_to_model_planes(yuv_frame):
+ y_height = (yuv_frame.shape[0] * 2) // 3
+ frame_width = yuv_frame.shape[1]
+ return Tensor.cat(
+ yuv_frame[0:y_height:2, 0::2],
+ yuv_frame[1:y_height:2, 0::2],
+ yuv_frame[0:y_height:2, 1::2],
+ yuv_frame[1:y_height:2, 1::2],
+ yuv_frame[y_height:y_height + y_height // 4].reshape((y_height // 2, frame_width // 2)),
+ yuv_frame[y_height + y_height // 4:y_height + y_height // 2].reshape((y_height // 2, frame_width // 2)),
+ dim=0,
+ ).reshape((6, y_height // 2, frame_width // 2))
+
+
+def _warp_kernel_factory(nv12: FrameGeometry, model_w: int, model_h: int):
+ uv_offset = nv12.stride * nv12.y_height
+ stride_pad = nv12.stride - nv12.width
+
+ def prepare_frame(nv12_blob, inverse_matrix):
+ inverse_uv = inverse_matrix * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEV)
+ uv_plane = nv12_blob[uv_offset:uv_offset + nv12.uv_height * nv12.stride].reshape(nv12.uv_height, nv12.stride)
+ with Context(SPLIT_REDUCEOP=0):
+ y_plane = _project_frame(nv12_blob[:nv12.height * nv12.stride], inverse_matrix, (model_w, model_h), (nv12.height, nv12.width), stride_pad).realize()
+ u_plane = _project_frame(uv_plane[:nv12.height // 2, :nv12.width:2].flatten(), inverse_uv, (model_w // 2, model_h // 2), (nv12.height // 2, nv12.width // 2), 0).realize()
+ v_plane = _project_frame(uv_plane[:nv12.height // 2, 1:nv12.width:2].flatten(), inverse_uv, (model_w // 2, model_h // 2), (nv12.height // 2, nv12.width // 2), 0).realize()
+ return _nv12_to_model_planes(y_plane.cat(u_plane).cat(v_plane).reshape((model_h * 3 // 2, model_w)))
+
+ return prepare_frame
+
+
+def _vision_queue_state(vision_shapes, frame_skip, device):
+ img_shape = vision_shapes["img"]
+ frame_history = img_shape[1] // 6
+ queue_shape = (frame_skip * (frame_history - 1) + 1, 6, img_shape[2], img_shape[3])
+ numpy_state = {
+ "tfm": np.zeros((3, 3), dtype=np.float32),
+ "big_tfm": np.zeros((3, 3), dtype=np.float32),
+ }
+ tensor_state = {
+ "img_q": Tensor(np.zeros(queue_shape, dtype=np.uint8), device=device).contiguous().realize(),
+ "big_img_q": Tensor(np.zeros(queue_shape, dtype=np.uint8), device=device).contiguous().realize(),
+ **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()},
+ }
+ return tensor_state, numpy_state
+
+
+def _policy_queue_state(vision_shapes, policy_shapes, frame_skip, device):
+ tensor_state, numpy_state = _vision_queue_state(vision_shapes, frame_skip, device)
+ feature_shape = policy_shapes["features_buffer"]
+ desire_shape = policy_shapes["desire_pulse"]
+ traffic_shape = policy_shapes["traffic_convention"]
+ action_shape = traffic_shape
+
+ policy_numpy = {
+ "desire": np.zeros(desire_shape[2], dtype=np.float32),
+ "traffic_convention": np.zeros(traffic_shape, dtype=np.float32),
+ "action_t": np.zeros(action_shape, dtype=np.float32),
+ }
+ numpy_state.update(policy_numpy)
+ tensor_state.update({
+ "feat_q": Tensor(np.zeros((frame_skip * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32), device=device).contiguous().realize(),
+ "desire_q": Tensor(np.zeros((frame_skip * desire_shape[1], desire_shape[0], desire_shape[2]), dtype=np.float32), device=device).contiguous().realize(),
+ **{name: Tensor(value, device="NPY").realize() for name, value in policy_numpy.items()},
+ })
+ return tensor_state, numpy_state
+
+
+def _roll_queue(queue_tensor, incoming, sampler):
+ queue_tensor.assign(queue_tensor[1:].cat(incoming, dim=0).contiguous())
+ return sampler(queue_tensor)
+
+
+def _sample_sparse(queue_tensor, frame_skip):
+ return queue_tensor[::frame_skip].contiguous().flatten(0, 1).unsqueeze(0)
+
+
+def _sample_desire(queue_tensor, frame_skip):
+ return queue_tensor.reshape(-1, frame_skip, *queue_tensor.shape[1:]).max(1).flatten(0, 1).unsqueeze(0)
+
+
+def _build_warp_enqueuer(nv12: FrameGeometry, model_w: int, model_h: int, frame_skip: int):
+ prepare_frame = _warp_kernel_factory(nv12, model_w, model_h)
+ sparse_sampler = partial(_sample_sparse, frame_skip=frame_skip)
+
+ def enqueue(img_q, big_img_q, tfm, big_tfm, frame, big_frame):
+ tfm = tfm.to(WARP_DEV)
+ big_tfm = big_tfm.to(WARP_DEV)
+ Tensor.realize(tfm, big_tfm)
+
+ warped_main = prepare_frame(frame, tfm).unsqueeze(0).to(Device.DEFAULT)
+ warped_big = prepare_frame(big_frame, big_tfm).unsqueeze(0).to(Device.DEFAULT)
+ return (
+ _roll_queue(img_q, warped_main, sparse_sampler),
+ _roll_queue(big_img_q, warped_big, sparse_sampler),
+ )
+
+ return enqueue
+
+
+def _policy_executor(model_runners, model_metadata, frame_skip):
+ desire_sampler = partial(_sample_desire, frame_skip=frame_skip)
+ sparse_sampler = partial(_sample_sparse, frame_skip=frame_skip)
+ hidden_slice = model_metadata["vision"]["output_slices"]["hidden_state"]
+
+ def execute(img, big_img, feat_q, desire_q, desire, traffic_convention, action_t):
+ desire = desire.to(Device.DEFAULT)
+ traffic_convention = traffic_convention.to(Device.DEFAULT)
+ action_t = action_t.to(Device.DEFAULT)
+ Tensor.realize(desire, traffic_convention, action_t)
+
+ desire_buffer = _roll_queue(desire_q, desire.reshape(1, 1, -1), desire_sampler)
+ vision_output = next(iter(model_runners["vision"]({"img": img, "big_img": big_img}).values())).cast("float32")
+
+ hidden_state = vision_output[:, hidden_slice].reshape(1, -1).unsqueeze(0)
+ feature_buffer = _roll_queue(feat_q, hidden_state, sparse_sampler)
+
+ on_inputs = {
+ "features_buffer": feature_buffer,
+ "desire_pulse": desire_buffer,
+ "traffic_convention": traffic_convention,
+ "action_t": action_t,
+ }
+ on_output = next(iter(model_runners["on_policy"](on_inputs).values())).cast("float32")
+ off_output = next(iter(model_runners["off_policy"](on_inputs).values())).cast("float32")
+ return vision_output, on_output, off_output
+
+ return execute
+
+
+def _replay_and_freeze(jit_runner, random_inputs_factory, queue_keys, queue_factory):
+ seed = 42
+
+ def validate(fn, seed_value, baseline_output=None, baseline_buffers=None, expect_match=True):
+ queue_tensors, numpy_values = queue_factory(Device.DEFAULT)
+ np.random.seed(seed_value)
+ Tensor.manual_seed(seed_value)
+
+ replay_count = 1 if (baseline_output is not None or baseline_buffers is not None) else 3
+ for run_index in range(replay_count):
+ for value in numpy_values.values():
+ value[:] = np.random.randn(*value.shape).astype(value.dtype)
+ Device.default.synchronize()
+ random_inputs = random_inputs_factory()
+ start = time.perf_counter()
+ outputs = fn(**{key: queue_tensors[key] for key in queue_keys}, **random_inputs)
+ enqueue_done = time.perf_counter()
+ Device.default.synchronize()
+ total_done = time.perf_counter()
+ print(f" [{run_index + 1}/{replay_count}] enqueue {(enqueue_done - start) * 1e3:6.2f} ms -- total {(total_done - start) * 1e3:6.2f} ms")
+
+ if run_index == 0:
+ output_snapshot = [np.copy(value.numpy()) for value in outputs]
+ buffer_snapshot = [np.copy(value.numpy().copy()) for value in queue_tensors.values()]
+
+ if baseline_output is not None:
+ matches = all(np.array_equal(current, reference) for current, reference in zip(output_snapshot, baseline_output, strict=True))
+ assert matches == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline (seed={seed_value})"
+ if baseline_buffers is not None:
+ matches = all(np.array_equal(current, reference) for current, reference in zip(buffer_snapshot, baseline_buffers, strict=True))
+ assert matches == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline (seed={seed_value})"
+ return output_snapshot, buffer_snapshot
+
+ print("capture + replay")
+ first_output, first_buffers = validate(jit_runner, seed)
+ print("pickle round trip")
+ frozen = pickle.loads(pickle.dumps(jit_runner))
+ validate(frozen, seed, first_output, first_buffers, expect_match=True)
+ validate(frozen, seed + 1, first_output, first_buffers, expect_match=False)
+ return frozen
+
+
+def _parse_size(text: str) -> tuple[int, int]:
+ width, height = text.lower().split("x")
+ return int(width), int(height)
+
+
+def _read_file_to_shared_memory(path: str) -> str:
+ from openpilot.common.file_chunker import read_file_chunked
+ from openpilot.system.hardware.hw import Paths
+
+ shm_path = os.path.join(Paths.shm_path(), os.path.basename(path))
+ atexit.register(lambda: os.path.exists(shm_path) and os.remove(shm_path))
+ with open(shm_path, "wb") as handle:
+ handle.write(read_file_chunked(path))
+ return shm_path
+
+
+def _arg_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--model-size", type=_parse_size, required=True, help="model input WxH")
+ parser.add_argument("--camera-resolutions", type=_parse_size, nargs="+", required=True, help="camera resolutions WxH (one or more)")
+ parser.add_argument("--vision-onnx", required=True)
+ parser.add_argument("--off-policy-onnx", required=True)
+ parser.add_argument("--on-policy-onnx", required=True)
+ parser.add_argument("--output", required=True)
+ parser.add_argument("--frame-skip", type=int, required=True)
+ return parser
+
+
+def main(argv: list[str] | None = None) -> int:
+ from openpilot.iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record
+ from openpilot.system.camerad.cameras.nv12_info import get_nv12_info
+
+ args = _arg_parser().parse_args(argv)
+ model_w, model_h = args.model_size
+
+ model_paths = {
+ "vision": _read_file_to_shared_memory(args.vision_onnx),
+ "off_policy": _read_file_to_shared_memory(args.off_policy_onnx),
+ "on_policy": _read_file_to_shared_memory(args.on_policy_onnx),
+ }
+ model_runners = {name: OnnxRunner(path) for name, path in model_paths.items()}
+ metadata = {name: build_metadata_record(path) for name, path in model_paths.items()}
+
+ assert metadata["off_policy"]["input_shapes"] == metadata["on_policy"]["input_shapes"]
+
+ output_package: dict = {"metadata": metadata}
+ policy_jit = TinyJit(_policy_executor(model_runners, metadata, args.frame_skip), prune=True)
+ policy_queue_factory = partial(_policy_queue_state, metadata["vision"]["input_shapes"], metadata["on_policy"]["input_shapes"], args.frame_skip)
+ random_model_inputs = partial(_random_tensor_inputs, keys=["img", "big_img"], shape=metadata["vision"]["input_shapes"]["img"])
+ output_package["run_policy"] = _replay_and_freeze(policy_jit, random_model_inputs, POLICY_INPUT_NAMES, policy_queue_factory)
+
+ for cam_w, cam_h in args.camera_resolutions:
+ nv12 = FrameGeometry(cam_w, cam_h, *get_nv12_info(cam_w, cam_h))
+ warp_jit = TinyJit(_build_warp_enqueuer(nv12, model_w, model_h, args.frame_skip), prune=True)
+ warp_queue_factory = partial(_vision_queue_state, metadata["vision"]["input_shapes"], args.frame_skip)
+ random_warp_inputs = partial(_random_tensor_inputs, keys=["frame", "big_frame"], shape=nv12.size, device=WARP_DEV)
+ output_package[(cam_w, cam_h)] = _replay_and_freeze(warp_jit, random_warp_inputs, WARP_INPUT_NAMES, warp_queue_factory)
+
+ output_package["frame_skip"] = args.frame_skip
+ with open(args.output, "wb") as handle:
+ pickle.dump(output_package, handle)
+ print(f"Saved JITs to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)")
+ return 0
diff --git a/iqpilot/selfdrive/iqmodeld/tools/install_models_pc.py b/iqpilot/selfdrive/iqmodeld/tools/install_models_pc.py
new file mode 100755
index 000000000..073110d8f
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/tools/install_models_pc.py
@@ -0,0 +1,128 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+
+from __future__ import annotations
+
+import base64
+import pickle
+import shutil
+import sys
+from dataclasses import dataclass
+from pathlib import Path
+
+import onnx
+
+from openpilot.system.hardware.hw import Paths
+
+_MODEL_STEMS = ("driving_off_policy", "driving_on_policy", "driving_policy", "driving_vision")
+
+
+@dataclass(frozen=True)
+class _ModelBundle:
+ stem: str
+ onnx_path: Path
+ artifact_path: Path
+ metadata_path: Path
+
+
+def _tensor_shape(value_info) -> tuple[int, ...]:
+ return tuple(int(dim.dim_value) for dim in value_info.type.tensor_type.shape.dim)
+
+
+def _metadata_property(graph_model, key: str) -> str | None:
+ for property_item in graph_model.metadata_props:
+ if property_item.key == key:
+ return property_item.value
+ return None
+
+
+def _decode_output_slices(encoded_value: str):
+ return pickle.loads(base64.b64decode(encoded_value.encode()))
+
+
+def _metadata_record(graph_model) -> dict:
+ encoded_slices = _metadata_property(graph_model, "output_slices")
+ if encoded_slices is None:
+ raise ValueError("output_slices metadata missing")
+ return {
+ "model_checkpoint": _metadata_property(graph_model, "model_checkpoint"),
+ "output_slices": _decode_output_slices(encoded_slices),
+ "input_shapes": {item.name: _tensor_shape(item) for item in graph_model.graph.input},
+ "output_shapes": {item.name: _tensor_shape(item) for item in graph_model.graph.output},
+ }
+
+
+def generate_metadata_pkl(model_path, output_path):
+ try:
+ graph_model = onnx.load(str(model_path))
+ metadata = _metadata_record(graph_model)
+ except Exception:
+ return False
+
+ with open(output_path, "wb") as handle:
+ pickle.dump(metadata, handle)
+ return True
+
+
+def _discover_model_bundles(model_dir: Path) -> list[_ModelBundle]:
+ bundles: list[_ModelBundle] = []
+ for stem in _MODEL_STEMS:
+ onnx_path = model_dir / f"{stem}.onnx"
+ if not onnx_path.exists():
+ continue
+ bundles.append(_ModelBundle(
+ stem=stem,
+ onnx_path=onnx_path,
+ artifact_path=model_dir / f"{stem}_tinygrad.pkl",
+ metadata_path=model_dir / f"{stem}_metadata.pkl",
+ ))
+ return bundles
+
+
+def _prompt_short_name(found_stems: list[str]) -> str | None:
+ try:
+ response = input(f"Found models ({', '.join(found_stems)}). Enter model short name (e.g. wmiv4): ").strip()
+ except EOFError:
+ return None
+ return response or None
+
+
+def _ensure_metadata_file(bundle: _ModelBundle) -> None:
+ if bundle.metadata_path.exists():
+ return
+ generate_metadata_pkl(bundle.onnx_path, bundle.metadata_path)
+
+
+def _install_bundle(bundle: _ModelBundle, suffix: str, destination_root: Path) -> None:
+ _ensure_metadata_file(bundle)
+ renamed_artifact = destination_root / f"{bundle.stem}_{suffix}_tinygrad.pkl"
+ renamed_metadata = destination_root / f"{bundle.stem}_{suffix}_metadata.pkl"
+ if bundle.artifact_path.exists():
+ shutil.move(str(bundle.artifact_path), str(renamed_artifact))
+ if bundle.metadata_path.exists():
+ shutil.move(str(bundle.metadata_path), str(renamed_metadata))
+
+
+def install_models(model_dir):
+ source_root = Path(model_dir)
+ bundles = _discover_model_bundles(source_root)
+ if not bundles:
+ return
+
+ short_name = _prompt_short_name([bundle.stem for bundle in bundles])
+ if short_name is None:
+ print("No name provided, skipping installation.")
+ return
+
+ destination_root = Path(Paths.model_root())
+ destination_root.mkdir(parents=True, exist_ok=True)
+ for bundle in bundles:
+ _install_bundle(bundle, short_name, destination_root)
+
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ print("Usage: install_models_pc.py ")
+ sys.exit(1)
+ install_models(sys.argv[1])
diff --git a/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl b/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl
new file mode 100644
index 000000000..810e916a2
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl
@@ -0,0 +1,57 @@
+/*
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+*/
+#define INTER_BITS 5
+#define INTER_TAB_SIZE (1 << INTER_BITS)
+#define INTER_REMAP_COEF_BITS 15
+#define INTER_REMAP_COEF_SCALE (1 << INTER_REMAP_COEF_BITS)
+
+__kernel void projectPlaneBilinear(__global const uchar * src,
+ int src_row_stride, int src_px_stride, int src_offset, int src_rows, int src_cols,
+ __global uchar * dst,
+ int dst_row_stride, int dst_offset, int dst_rows, int dst_cols,
+ __constant float * M)
+{
+ int dx = get_global_id(0);
+ int dy = get_global_id(1);
+
+ if (dx < dst_cols && dy < dst_rows) {
+ float x0 = M[0] * dx + M[1] * dy + M[2];
+ float y0 = M[3] * dx + M[4] * dy + M[5];
+ float w = M[6] * dx + M[7] * dy + M[8];
+ w = w != 0.0f ? INTER_TAB_SIZE / w : 0.0f;
+
+ int x = rint(x0 * w);
+ int y = rint(y0 * w);
+ short sx = convert_short_sat(x >> INTER_BITS);
+ short sy = convert_short_sat(y >> INTER_BITS);
+ short min_col = (short)0;
+ short max_col = convert_short_sat(src_cols - 1);
+ short min_row = (short)0;
+ short max_row = convert_short_sat(src_rows - 1);
+
+ short sx_clamp = clamp(sx, min_col, max_col);
+ short sx_p1_clamp = clamp((short)(sx + 1), min_col, max_col);
+ short sy_clamp = clamp(sy, min_row, max_row);
+ short sy_p1_clamp = clamp((short)(sy + 1), min_row, max_row);
+
+ int top_left = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_clamp * src_px_stride)]);
+ int top_right = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_p1_clamp * src_px_stride)]);
+ int bottom_left = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_clamp * src_px_stride)]);
+ int bottom_right = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_p1_clamp * src_px_stride)]);
+
+ short ay = (short)(y & (INTER_TAB_SIZE - 1));
+ short ax = (short)(x & (INTER_TAB_SIZE - 1));
+ float taby = 1.f / INTER_TAB_SIZE * ay;
+ float tabx = 1.f / INTER_TAB_SIZE * ax;
+
+ int coeff0 = convert_short_sat_rte((1.0f - taby) * (1.0f - tabx) * INTER_REMAP_COEF_SCALE);
+ int coeff1 = convert_short_sat_rte((1.0f - taby) * tabx * INTER_REMAP_COEF_SCALE);
+ int coeff2 = convert_short_sat_rte(taby * (1.0f - tabx) * INTER_REMAP_COEF_SCALE);
+ int coeff3 = convert_short_sat_rte(taby * tabx * INTER_REMAP_COEF_SCALE);
+
+ int blended = top_left * coeff0 + top_right * coeff1 + bottom_left * coeff2 + bottom_right * coeff3;
+ int dst_index = mad24(dy, dst_row_stride, dst_offset + dx);
+ dst[dst_index] = convert_uchar_sat((blended + (1 << (INTER_REMAP_COEF_BITS - 1))) >> INTER_REMAP_COEF_BITS);
+ }
+}
diff --git a/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl b/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl
new file mode 100644
index 000000000..187a98fa3
--- /dev/null
+++ b/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl
@@ -0,0 +1,46 @@
+/*
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+*/
+#define UV_SIZE ((TRANSFORMED_WIDTH/2)*(TRANSFORMED_HEIGHT/2))
+
+__kernel void packLumaHalves(__global uchar8 const * const in_luma,
+ __global uchar * out_frame,
+ int out_offset)
+{
+ const int gid = get_global_id(0);
+ const int output_index_start = gid * 8;
+ const int row = output_index_start / TRANSFORMED_WIDTH;
+ const int col = output_index_start % TRANSFORMED_WIDTH;
+ const uchar8 luma_block = in_luma[gid];
+
+ __global uchar *top_or_left;
+ __global uchar *bottom_or_right;
+ if ((row & 1) == 0) {
+ top_or_left = out_frame + out_offset;
+ bottom_or_right = out_frame + out_offset + UV_SIZE * 2;
+ } else {
+ top_or_left = out_frame + out_offset + UV_SIZE;
+ bottom_or_right = out_frame + out_offset + UV_SIZE * 3;
+ }
+
+ const int row_stride = (row / 2) * (TRANSFORMED_WIDTH / 2) + col / 2;
+ vstore4(luma_block.s0246, 0, top_or_left + row_stride);
+ vstore4(luma_block.s1357, 0, bottom_or_right + row_stride);
+}
+
+__kernel void packChromaPlane(__global uchar8 const * const in_plane,
+ __global uchar8 * out_frame,
+ int out_offset)
+{
+ const int gid = get_global_id(0);
+ out_frame[gid + out_offset / 8] = in_plane[gid];
+}
+
+__kernel void copyPlaneBytes(__global uchar8 * in_plane,
+ __global uchar8 * out_plane,
+ int in_offset,
+ int out_offset)
+{
+ const int gid = get_global_id(0);
+ out_plane[gid + out_offset / 8] = in_plane[gid + in_offset / 8];
+}
diff --git a/iqpilot/selfdrive/locationd/.gitignore b/iqpilot/selfdrive/locationd/.gitignore
new file mode 100644
index 000000000..11b9f127b
--- /dev/null
+++ b/iqpilot/selfdrive/locationd/.gitignore
@@ -0,0 +1,3 @@
+params_learner
+paramsd
+locationd
diff --git a/iqpilot/selfdrive/locationd/__init__.py b/iqpilot/selfdrive/locationd/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/selfdrived/__init__.py b/iqpilot/selfdrive/selfdrived/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/selfdrive/selfdrived/events.py b/iqpilot/selfdrive/selfdrived/events.py
new file mode 100644
index 000000000..674e551e2
--- /dev/null
+++ b/iqpilot/selfdrive/selfdrived/events.py
@@ -0,0 +1,349 @@
+import cereal.messaging as messaging
+from cereal import log, car, custom
+from openpilot.common.constants import CV
+from openpilot.iqpilot.common.atlas_alerts import EventBook as EventsBase, Tier as Priority, Tags as ET, AlertCard as Alert, \
+ NoEntryCard as NoEntryAlert, HardDisableCard as ImmediateDisableAlert, ChimeCard as EngagementAlert, \
+ BannerCard as NormalPermanentAlert, AlertFactory as AlertCallbackType, car_mode_entry_alert as wrong_car_mode_alert
+from openpilot.iqpilot.selfdrive.controls.lib.speed_limit_controller import SpeedLimitAssistState
+
+
+AlertSize = log.SelfdriveState.AlertSize
+AlertStatus = log.SelfdriveState.AlertStatus
+VisualAlert = car.CarControl.HUDControl.VisualAlert
+AudibleAlert = car.CarControl.HUDControl.AudibleAlert
+AudibleAlertIQ = custom.IQState.AudibleAlert
+EventNameIQ = custom.IQOnroadEvent.EventName
+
+
+# get event name from enum
+EVENT_NAME_IQ = {v: k for k, v in EventNameIQ.schema.enumerants.items()}
+
+
+def _get_longitudinal_plan_ext(sm: messaging.SubMaster):
+ return sm['iqPlan']
+
+
+def speed_limit_adjust_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
+ plan = _get_longitudinal_plan_ext(sm)
+ resolver = plan.speedLimit.resolver
+ assist = plan.speedLimit.assist
+ speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH
+ speed = round(resolver.speedLimit * speed_conv)
+ unit = "km/h" if metric else "mph"
+ if assist.state == SpeedLimitAssistState.adapting:
+ message = f"Speed Limit: Adjusting to {speed} {unit}"
+ else:
+ message = f"Speed Limit: Active at {speed} {unit}"
+ return Alert(
+ message,
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.LOW, VisualAlert.none, AudibleAlert.none, 4.)
+
+
+def speed_limit_pre_active_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
+ plan = _get_longitudinal_plan_ext(sm)
+ resolver = plan.speedLimit.resolver
+ speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH
+ unit = "km/h" if metric else "mph"
+ pending_speed = round(resolver.speedLimit * speed_conv)
+ last_speed = resolver.speedLimitFinalLast * speed_conv
+ is_lower = pending_speed < last_speed or last_speed <= 0
+ confirm_hint = "SET" if is_lower else "RES"
+ return Alert(
+ f"Speed Limit: {pending_speed} {unit}",
+ f"Press {confirm_hint} to apply",
+ AlertStatus.normal, AlertSize.mid,
+ Priority.LOW, VisualAlert.none, AudibleAlertIQ.promptSingleLow, .1)
+
+
+def speed_limit_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
+ resolver = _get_longitudinal_plan_ext(sm).speedLimit.resolver
+ speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH
+ speed = round(resolver.speedLimit * speed_conv)
+ unit = "km/h" if metric else "mph"
+ return Alert(
+ f"Speed Limit changed to {speed} {unit}",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.LOW, VisualAlert.none, AudibleAlertIQ.promptSingleHigh, 3.)
+
+
+def construction_zone_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
+ resolver = _get_longitudinal_plan_ext(sm).speedLimit.resolver
+ speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH
+ speed = round(resolver.speedLimit * speed_conv)
+ unit = "KM/H" if metric else "MPH"
+ return Alert(
+ f"Construction Zone Detected: Speed {speed} {unit}",
+ "",
+ AlertStatus.userPrompt, AlertSize.small,
+ Priority.MID, VisualAlert.none, AudibleAlertIQ.promptSingleHigh, 4.)
+
+
+_CAMERA_LABELS = {
+ int(custom.IQNavState.CameraType.fixedSpeed): "Speed Camera",
+ int(custom.IQNavState.CameraType.mobileSpeed): "Mobile Speed Camera",
+ int(custom.IQNavState.CameraType.sectionStart): "Average-Speed Zone",
+ int(custom.IQNavState.CameraType.sectionEnd): "Average-Speed Zone Ends",
+ int(custom.IQNavState.CameraType.averageZone): "Average-Speed Zone",
+ int(custom.IQNavState.CameraType.redLight): "Red-Light Camera",
+ int(custom.IQNavState.CameraType.bump): "Speed Bump",
+ int(custom.IQNavState.CameraType.alpr): "Flock / ALPR Camera",
+}
+
+
+def speed_camera_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
+ nav = sm['iqNavState']
+ ctype = int(getattr(nav.cameraType, "raw", nav.cameraType))
+ label = _CAMERA_LABELS.get(ctype, "Speed Camera")
+ distance = float(nav.cameraDistance)
+ # RF (BLE/WiFi) Flock detection is a live proximity hit with no meaningful
+ # distance — flockd/navd flag it with distance 0 on the alpr camera type.
+ if ctype == int(custom.IQNavState.CameraType.alpr) and distance <= 0.0:
+ return Alert(
+ "Flock Camera Detected",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.HIGH, VisualAlert.none, AudibleAlert.prompt, .2)
+ if metric:
+ dist_str = f"{distance:.0f} m" if distance < 1000.0 else f"{distance / 1000.0:.1f} km"
+ else:
+ feet = distance * 3.28084
+ dist_str = f"{int(round(feet / 10.0) * 10)} ft" if feet < 1000.0 else f"{distance * 0.000621371:.1f} mi"
+ detail = dist_str
+ if float(nav.cameraSpeedLimit) > 0.0:
+ speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH
+ unit = "km/h" if metric else "mph"
+ detail += f" • {round(float(nav.cameraSpeedLimit) * speed_conv)} {unit}"
+ return Alert(
+ f"{label} • {detail}",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.HIGH, VisualAlert.none, AudibleAlert.prompt, .2)
+
+
+class IQEvents(EventsBase):
+ def __init__(self):
+ super().__init__()
+ self.event_counters = dict.fromkeys(EVENTS_IQ.keys(), 0)
+
+ def get_events_mapping(self) -> dict[int, dict[str, Alert | AlertCallbackType]]:
+ return EVENTS_IQ
+
+ def get_event_name(self, event: int):
+ return EVENT_NAME_IQ[event]
+
+ def get_event_msg_type(self):
+ return custom.IQOnroadEvent.Event
+
+
+EVENTS_IQ_TYPE = dict[int, dict[str, Alert | AlertCallbackType]]
+
+_GUIDANCE_EVENTS: EVENTS_IQ_TYPE = {
+ EventNameIQ.speedLimitActive: {
+ ET.WARNING: speed_limit_adjust_alert,
+ },
+
+ EventNameIQ.speedLimitPreActive: {
+ ET.WARNING: speed_limit_pre_active_alert,
+ },
+
+ EventNameIQ.speedLimitChanged: {
+ ET.WARNING: speed_limit_changed_alert,
+ },
+
+ EventNameIQ.speedCameraAhead: {
+ ET.WARNING: speed_camera_alert,
+ },
+
+ EventNameIQ.constructionZoneDetected: {
+ ET.WARNING: construction_zone_alert,
+ },
+
+ EventNameIQ.navExitLeft: {
+ ET.WARNING: Alert(
+ "Navigation: Exit Maneuver",
+ "Nudge the wheel left to change lanes",
+ AlertStatus.userPrompt, AlertSize.mid,
+ Priority.MID, VisualAlert.none, AudibleAlert.prompt, 1.5),
+ },
+
+ EventNameIQ.navExitRight: {
+ ET.WARNING: Alert(
+ "Navigation: Exit Maneuver",
+ "Nudge the wheel right to change lanes",
+ AlertStatus.userPrompt, AlertSize.mid,
+ Priority.MID, VisualAlert.none, AudibleAlert.prompt, 1.5),
+ },
+
+ EventNameIQ.navTurnLeft: {
+ ET.WARNING: Alert(
+ "Navigation: Turning Left",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.MID, VisualAlert.none, AudibleAlert.none, 1.5),
+ },
+
+ EventNameIQ.navTurnRight: {
+ ET.WARNING: Alert(
+ "Navigation: Turning Right",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.MID, VisualAlert.none, AudibleAlert.none, 1.5),
+ },
+
+ EventNameIQ.modelTurnLeft: {
+ ET.WARNING: Alert(
+ "Lane Turn Left",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
+ },
+
+ EventNameIQ.modelTurnRight: {
+ ET.WARNING: Alert(
+ "Lane Turn Right",
+ "",
+ AlertStatus.normal, AlertSize.small,
+ Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
+ },
+
+}
+
+_ENGAGE_EVENTS: EVENTS_IQ_TYPE = {
+ EventNameIQ.alcEngaged: {
+ ET.ENABLE: EngagementAlert(AudibleAlert.engage),
+ },
+
+ EventNameIQ.alcEngagedSilent: {
+ ET.ENABLE: EngagementAlert(AudibleAlert.none),
+ },
+
+ EventNameIQ.alcDisengaged: {
+ ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
+ },
+
+ EventNameIQ.alcDisengagedSilent: {
+ ET.USER_DISABLE: EngagementAlert(AudibleAlert.none),
+ },
+
+ EventNameIQ.steerManually: {
+ ET.USER_DISABLE: Alert(
+ "Lane Centering Off",
+ "Steer Manually",
+ AlertStatus.normal, AlertSize.mid,
+ Priority.LOW, VisualAlert.none, AudibleAlert.disengage, 1.),
+ },
+
+ EventNameIQ.speedManually: {
+ ET.WARNING: Alert(
+ "Adaptive Cruise Off",
+ "Control Speed Manually",
+ AlertStatus.normal, AlertSize.mid,
+ Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
+ },
+
+ EventNameIQ.steeringOverrideReengageAlc: {
+ ET.WARNING: Alert(
+ "Steering Overridden By Driver",
+ "Re-Engage ALC",
+ AlertStatus.userPrompt, AlertSize.mid,
+ Priority.MID, VisualAlert.none, AudibleAlert.prompt, 2.0),
+ },
+
+ EventNameIQ.latMismatch: {
+ ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Lateral Controls Mismatch"),
+ ET.NO_ENTRY: NoEntryAlert("Lateral Controls Mismatch"),
+ },
+
+}
+
+_CABIN_BLOCK_EVENTS: EVENTS_IQ_TYPE = {
+ EventNameIQ.brakeHoldSilent: {
+ ET.WARNING: EngagementAlert(AudibleAlert.none),
+ ET.NO_ENTRY: NoEntryAlert("Brake Hold Engaged"),
+ },
+
+ EventNameIQ.gearNotDriveSilent: {
+ ET.WARNING: Alert(
+ "",
+ "",
+ AlertStatus.normal, AlertSize.none,
+ Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
+ ET.NO_ENTRY: Alert(
+ "Not in Drive",
+ "IQ.Pilot Unavailable",
+ AlertStatus.normal, AlertSize.mid,
+ Priority.LOW, VisualAlert.none, AudibleAlert.none, 0.),
+ },
+
+ EventNameIQ.parkBrakeSilent: {
+ ET.WARNING: Alert(
+ "",
+ "",
+ AlertStatus.normal, AlertSize.none,
+ Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
+ ET.NO_ENTRY: NoEntryAlert("Parking Brake On"),
+ },
+
+ EventNameIQ.doorAjarSilent: {
+ ET.WARNING: Alert(
+ "",
+ "",
+ AlertStatus.normal, AlertSize.none,
+ Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
+ ET.NO_ENTRY: NoEntryAlert("Door Ajar"),
+ },
+
+ EventNameIQ.seatbeltUnbuckledSilent: {
+ ET.WARNING: Alert(
+ "",
+ "",
+ AlertStatus.normal, AlertSize.none,
+ Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
+ ET.NO_ENTRY: NoEntryAlert("Seatbelt Unbuckled"),
+ },
+
+ EventNameIQ.reverseSilent: {
+ ET.PERMANENT: Alert(
+ "In\nReverse",
+ "",
+ AlertStatus.normal, AlertSize.full,
+ Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5),
+ ET.NO_ENTRY: NoEntryAlert("In Reverse"),
+ },
+
+}
+
+_NOTICE_EVENTS: EVENTS_IQ_TYPE = {
+ EventNameIQ.carModeMismatchNotice: {
+ ET.WARNING: wrong_car_mode_alert,
+ },
+
+ EventNameIQ.pedalHeldNotice: {
+ ET.WARNING: NoEntryAlert("Pedal Held")
+ },
+
+ EventNameIQ.experimentalToggled: {
+ ET.WARNING: NormalPermanentAlert("Experimental Mode Switched", duration=1.5)
+ },
+
+ EventNameIQ.e2eChime: {
+ ET.PERMANENT: Alert(
+ "",
+ "",
+ AlertStatus.normal, AlertSize.none,
+ Priority.MID, VisualAlert.none, AudibleAlert.prompt, 3.),
+ },
+
+ # outranks the generic processNotRunning alert so the driver sees why engagement is blocked
+ EventNameIQ.modelUpdating: {
+ ET.NO_ENTRY: NoEntryAlert("Update finishes while parked with internet",
+ alert_text_1="Driving Model Updating",
+ priority=Priority.MID),
+ },
+
+}
+
+EVENTS_IQ: EVENTS_IQ_TYPE = {**_GUIDANCE_EVENTS, **_ENGAGE_EVENTS, **_CABIN_BLOCK_EVENTS, **_NOTICE_EVENTS}
diff --git a/iqpilot/selfdrive/tests/test_constructiond.py b/iqpilot/selfdrive/tests/test_constructiond.py
new file mode 100644
index 000000000..6568a1dc5
--- /dev/null
+++ b/iqpilot/selfdrive/tests/test_constructiond.py
@@ -0,0 +1,123 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+from types import SimpleNamespace
+
+import numpy as np
+
+from openpilot.iqpilot.selfdrive.constructiond import (
+ ANALYSIS_PERIOD,
+ ENTER_HITS,
+ HIT_FRAC,
+ HOLD_SEC,
+ LUMA_MIN,
+ WASH_FRAC,
+ ConstructionZoneDetector,
+ State,
+ orange_fraction,
+)
+
+# barrel orange / yellow paint chroma as measured on-device (see module docstring)
+BARREL_U, BARREL_V = 88, 178
+PAINT_U, PAINT_V = 84, 159
+
+
+def _nv12_buf(width=1928, height=1208, patches=()):
+ stride = width
+ uv_offset = stride * height
+ data = np.full(uv_offset + stride * (height // 2), 128, dtype=np.uint8)
+ data[:uv_offset] = 120 # mid luma
+ uv = data[uv_offset:].reshape(height // 2, stride)
+ for r0, r1, c0, c1, u, v in patches:
+ uv[r0:r1, 2 * c0:2 * c1:2] = u
+ uv[r0:r1, 2 * c0 + 1:2 * c1:2] = v
+ return SimpleNamespace(data=data, width=width, height=height, stride=stride, uv_offset=uv_offset)
+
+
+def test_orange_fraction_fires_on_barrel_chroma():
+ ch, cw = 1208 // 2, 1928 // 2
+ buf = _nv12_buf(patches=[(int(0.6 * ch), int(0.6 * ch) + 20, int(0.5 * cw), int(0.5 * cw) + 20, BARREL_U, BARREL_V)])
+ assert orange_fraction(buf)[0] > HIT_FRAC
+
+
+def test_orange_fraction_rejects_yellow_paint_chroma():
+ ch, cw = 1208 // 2, 1928 // 2
+ buf = _nv12_buf(patches=[(int(0.6 * ch), int(0.9 * ch), int(0.2 * cw), int(0.4 * cw), PAINT_U, PAINT_V)])
+ assert orange_fraction(buf)[0] == 0.0
+
+
+def test_orange_fraction_ignores_sky_region():
+ buf = _nv12_buf(patches=[(0, 100, 100, 300, BARREL_U, BARREL_V)])
+ assert orange_fraction(buf)[0] == 0.0
+
+
+def test_detector_enters_after_persistent_hits_and_holds():
+ det = ConstructionZoneDetector()
+ t = 0.0
+ assert not det.update(0.0, t)
+ for _ in range(ENTER_HITS - 1):
+ t += ANALYSIS_PERIOD
+ assert not det.update(2 * HIT_FRAC, t)
+ assert det.state == State.pending
+
+ t += ANALYSIS_PERIOD
+ assert det.update(2 * HIT_FRAC, t)
+ assert det.state == State.active
+
+ # barrel-free stretch inside the zone: stays active through the hold window
+ t += HOLD_SEC - 1.0
+ assert det.update(0.0, t)
+
+ # past the hold: releases
+ t += HOLD_SEC + 1.0
+ assert not det.update(0.0, t)
+ assert det.state == State.inactive
+
+
+def test_detector_single_hit_does_not_enter():
+ det = ConstructionZoneDetector()
+ det.update(2 * HIT_FRAC, 0.0)
+ for i in range(20):
+ assert not det.update(0.0, 1.0 + i * ANALYSIS_PERIOD)
+
+
+def test_detector_ignores_global_orange_wash():
+ det = ConstructionZoneDetector()
+ for i in range(10):
+ assert not det.update(2 * WASH_FRAC, i * ANALYSIS_PERIOD)
+ assert det.state == State.inactive
+
+
+def test_orange_fraction_reports_roi_luma():
+ buf = _nv12_buf()
+ frac, luma = orange_fraction(buf)
+ assert abs(luma - 120.0) < 1.0 # _nv12_buf fills Y with 120
+
+
+def test_detector_night_luma_gates_hits():
+ det = ConstructionZoneDetector()
+ # night: retroreflective amber markers pass the chroma test but must not enter
+ for i in range(20):
+ assert not det.update(2 * HIT_FRAC, i * ANALYSIS_PERIOD, luma=LUMA_MIN - 30.0)
+ assert det.state == State.inactive
+ # same signal in daylight enters
+ for i in range(ENTER_HITS):
+ det.update(2 * HIT_FRAC, 100.0 + i * ANALYSIS_PERIOD, luma=LUMA_MIN + 30.0)
+ assert det.state == State.active
+
+
+def test_detector_low_speed_gates_entry_but_not_hold():
+ from openpilot.iqpilot.selfdrive.constructiond import MIN_ENTER_SPEED
+ det = ConstructionZoneDetector()
+ # parked/lot speeds: orange never enters
+ for i in range(20):
+ assert not det.update(2 * HIT_FRAC, i * ANALYSIS_PERIOD, luma=120.0, v_ego=3.0)
+ assert det.state == State.inactive
+ # at speed: enters
+ t = 100.0
+ for i in range(ENTER_HITS):
+ det.update(2 * HIT_FRAC, t + i * ANALYSIS_PERIOD, luma=120.0, v_ego=MIN_ENTER_SPEED + 5.0)
+ assert det.state == State.active
+ # slowing inside the zone: still held
+ assert det.update(0.0, t + 30.0, luma=120.0, v_ego=2.0)
diff --git a/iqpilot/selfdrive/ui/alert_sound_filter.py b/iqpilot/selfdrive/ui/alert_sound_filter.py
new file mode 100644
index 000000000..37f5041cd
--- /dev/null
+++ b/iqpilot/selfdrive/ui/alert_sound_filter.py
@@ -0,0 +1,35 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Sound-suppression policy for Soundd. The driver's "IQAlertSilence" param, when set,
+mutes routine chimes and keeps only a named allow-list of safety-critical cues
+audible. The param is re-sampled on a fixed poll interval rather than every frame.
+"""
+from cereal import car
+from openpilot.common.params import Params
+
+# policy expressed as data: names resolved against the enum at construction so the
+# allow-list reads as configuration instead of a hardcoded wall of enum accesses
+_KEEP_AUDIBLE_WHEN_QUIET = ("warningSoft", "warningImmediate", "promptDistracted", "promptRepeat")
+_SUPPRESS_PARAM = "IQAlertSilence"
+_POLL_INTERVAL = 50
+
+
+class AlertSoundFilter:
+ def __init__(self):
+ self._store = Params()
+ self._cue = car.CarControl.HUDControl.AudibleAlert
+ self._allow_when_quiet = frozenset(getattr(self._cue, n) for n in _KEEP_AUDIBLE_WHEN_QUIET)
+ self._suppressing = self._store.get_bool(_SUPPRESS_PARAM)
+ self._poll = 0
+
+ def refresh(self) -> None:
+ self._poll = (self._poll + 1) % _POLL_INTERVAL
+ if self._poll == 0:
+ self._suppressing = self._store.get_bool(_SUPPRESS_PARAM)
+
+ def permits(self, alert) -> bool:
+ has_cue = alert != self._cue.none
+ if not self._suppressing:
+ return has_cue
+ return has_cue and alert in self._allow_when_quiet
diff --git a/iqpilot/system/hardware/c3/agnos.json b/iqpilot/system/hardware/c3/agnos.json
new file mode 100644
index 000000000..941a4956b
--- /dev/null
+++ b/iqpilot/system/hardware/c3/agnos.json
@@ -0,0 +1,84 @@
+[
+ {
+ "name": "xbl",
+ "url": "https://commadist.azureedge.net/agnosupdate/xbl-effa23294138e2297b85a5b482a885184c437b5ab25d74f2a62d4fce4e68f63b.img.xz",
+ "hash": "effa23294138e2297b85a5b482a885184c437b5ab25d74f2a62d4fce4e68f63b",
+ "hash_raw": "effa23294138e2297b85a5b482a885184c437b5ab25d74f2a62d4fce4e68f63b",
+ "size": 3282256,
+ "sparse": false,
+ "full_check": true,
+ "has_ab": true,
+ "ondevice_hash": "ed61a650bea0c56652dd0fc68465d8fc722a4e6489dc8f257630c42c6adcdc89"
+ },
+ {
+ "name": "xbl_config",
+ "url": "https://commadist.azureedge.net/agnosupdate/xbl_config-63d019efed684601f145ef37628e62c8da73f5053a8e51d7de09e72b8b11f97c.img.xz",
+ "hash": "63d019efed684601f145ef37628e62c8da73f5053a8e51d7de09e72b8b11f97c",
+ "hash_raw": "63d019efed684601f145ef37628e62c8da73f5053a8e51d7de09e72b8b11f97c",
+ "size": 98124,
+ "sparse": false,
+ "full_check": true,
+ "has_ab": true,
+ "ondevice_hash": "b12801ffaa81e58e3cef914488d3b447e35483ba549b28c6cd9deb4814c3265f"
+ },
+ {
+ "name": "abl",
+ "url": "https://commadist.azureedge.net/agnosupdate/abl-32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6.img.xz",
+ "hash": "32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6",
+ "hash_raw": "32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6",
+ "size": 274432,
+ "sparse": false,
+ "full_check": true,
+ "has_ab": true,
+ "ondevice_hash": "32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6"
+ },
+ {
+ "name": "aop",
+ "url": "https://commadist.azureedge.net/agnosupdate/aop-21370172e590bd4ea907a558bcd6df20dc7a6c7d38b8e62fdde18f4a512ba9e9.img.xz",
+ "hash": "21370172e590bd4ea907a558bcd6df20dc7a6c7d38b8e62fdde18f4a512ba9e9",
+ "hash_raw": "21370172e590bd4ea907a558bcd6df20dc7a6c7d38b8e62fdde18f4a512ba9e9",
+ "size": 184364,
+ "sparse": false,
+ "full_check": true,
+ "has_ab": true,
+ "ondevice_hash": "c1be2f4aac5b3af49b904b027faec418d05efd7bd5144eb4fdfcba602bcf2180"
+ },
+ {
+ "name": "devcfg",
+ "url": "https://commadist.azureedge.net/agnosupdate/devcfg-d7d7e52963bbedbbf8a7e66847579ca106a0a729ce2cf60f4b8d8ea4b535d620.img.xz",
+ "hash": "d7d7e52963bbedbbf8a7e66847579ca106a0a729ce2cf60f4b8d8ea4b535d620",
+ "hash_raw": "d7d7e52963bbedbbf8a7e66847579ca106a0a729ce2cf60f4b8d8ea4b535d620",
+ "size": 40336,
+ "sparse": false,
+ "full_check": true,
+ "has_ab": true,
+ "ondevice_hash": "17b229668b20305ff8fa3cd5f94716a3aaa1e5bf9d1c24117eff7f2f81ae719f"
+ },
+ {
+ "name": "boot",
+ "url": "https://commadist.azureedge.net/agnosupdate/boot-0191529aa97d90d1fa04b472d80230b777606459e1e1e9e2323c9519839827b4.img.xz",
+ "hash": "0191529aa97d90d1fa04b472d80230b777606459e1e1e9e2323c9519839827b4",
+ "hash_raw": "0191529aa97d90d1fa04b472d80230b777606459e1e1e9e2323c9519839827b4",
+ "size": 18515968,
+ "sparse": false,
+ "full_check": true,
+ "has_ab": true,
+ "ondevice_hash": "492ae27f569e8db457c79d0e358a7a6297d1a1c685c2b1ae6deba7315d3a6cb0"
+ },
+ {
+ "name": "system",
+ "url": "https://commadist.azureedge.net/agnosupdate/system-e0007afa5d1026671c1943d44bb7f7ad26259f673392dd00a03073a2870df087.img.xz",
+ "hash": "1468d50b7ad0fda0f04074755d21e786e3b1b6ca5dd5b17eb2608202025e6126",
+ "hash_raw": "e0007afa5d1026671c1943d44bb7f7ad26259f673392dd00a03073a2870df087",
+ "size": 5368709120,
+ "sparse": true,
+ "full_check": false,
+ "has_ab": true,
+ "ondevice_hash": "242aa5adad1c04e1398e00e2440d1babf962022eb12b89adf2e60ee3068946e7",
+ "alt": {
+ "hash": "e0007afa5d1026671c1943d44bb7f7ad26259f673392dd00a03073a2870df087",
+ "url": "https://commadist.azureedge.net/agnosupdate/system-e0007afa5d1026671c1943d44bb7f7ad26259f673392dd00a03073a2870df087.img",
+ "size": 5368709120
+ }
+ }
+]
\ No newline at end of file
diff --git a/iqpilot/system/hardware/c3/launch_chffrplus.sh b/iqpilot/system/hardware/c3/launch_chffrplus.sh
new file mode 100755
index 000000000..b0544b8c9
--- /dev/null
+++ b/iqpilot/system/hardware/c3/launch_chffrplus.sh
@@ -0,0 +1,165 @@
+#!/usr/bin/env bash
+
+IQ_C3_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
+DIR="$( cd "$IQ_C3_DIR/../../../.." >/dev/null 2>&1 && pwd )"
+
+source "$IQ_C3_DIR/launch_env.sh"
+
+function agnos_version_allowed {
+ local current_version="$1"
+ local expected_version="$2"
+ local compat_version
+
+ if [ "$current_version" = "$expected_version" ] || [[ "$current_version" = "$expected_version"-* ]]; then
+ return 0
+ fi
+
+ IFS=',' read -r -a compat_versions <<< "${AGNOS_COMPAT_VERSIONS:-}"
+ for compat_version in "${compat_versions[@]}"; do
+ compat_version="${compat_version// /}"
+ if [ -n "$compat_version" ] && [ "$current_version" = "$compat_version" ]; then
+ return 0
+ fi
+ done
+
+ return 1
+}
+
+function agnos_init {
+ # TODO: move this to agnos
+ sudo rm -f /data/etc/NetworkManager/system-connections/*.nmmeta
+
+ # set success flag for current boot slot
+ sudo abctl --set_success
+
+ # TODO: do this without udev in AGNOS
+ # udev does this, but sometimes we startup faster
+ sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
+ sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
+
+ # iptables-nft fails on this kernel (no nf_tables module), breaking NM hotspot NAT rules
+ if [ "$(readlink /etc/alternatives/iptables)" != "/usr/sbin/iptables-legacy" ]; then
+ sudo mount -o remount,rw /
+ sudo ln -sf /usr/sbin/iptables-legacy /etc/alternatives/iptables
+ sudo ln -sf /usr/sbin/iptables-legacy-restore /etc/alternatives/iptables-restore
+ sudo ln -sf /usr/sbin/iptables-legacy-save /etc/alternatives/iptables-save
+ sudo mount -o remount,ro /
+ fi
+
+
+ CURRENT_AGNOS_VERSION=$(< /VERSION)
+ if ! agnos_version_allowed "$CURRENT_AGNOS_VERSION" "$AGNOS_VERSION"; then
+ AGNOS_PY="$DIR/system/hardware/tici/agnos.py"
+ MANIFEST="$IQ_C3_DIR/agnos.json"
+ if $AGNOS_PY --verify $MANIFEST; then
+ sudo reboot
+ fi
+ $DIR/system/hardware/tici/updater $AGNOS_PY $MANIFEST
+ fi
+}
+
+function launch {
+ # Remove orphaned git lock if it exists on boot
+ [ -f "$DIR/.git/index.lock" ] && rm -f $DIR/.git/index.lock
+
+ # Check to see if there's a valid overlay-based update available. Conditions
+ # are as follows:
+ #
+ # 1. The DIR init file has to exist, with a newer modtime than anything in
+ # the DIR Git repo. This checks for local development work or the user
+ # switching branches/forks, which should not be overwritten.
+ # 2. The FINALIZED consistent file has to exist, indicating there's an update
+ # that completed successfully and synced to disk.
+
+ if [ -f "${DIR}/.overlay_init" ]; then
+ find ${DIR}/.git -newer ${DIR}/.overlay_init | grep -q '.' 2> /dev/null
+ if [ $? -eq 0 ]; then
+ echo "${DIR} has been modified, skipping overlay update installation"
+ else
+ if [ -f "${STAGING_ROOT}/finalized/.overlay_consistent" ]; then
+ if [ ! -d /data/safe_staging/old_openpilot ]; then
+ echo "Valid overlay update found, installing"
+ LAUNCHER_LOCATION="${BASH_SOURCE[0]}"
+
+ mv $DIR /data/safe_staging/old_openpilot
+ mv "${STAGING_ROOT}/finalized" $DIR
+ cd $DIR
+
+ echo "Restarting launch script ${LAUNCHER_LOCATION}"
+ unset AGNOS_VERSION
+ exec "${LAUNCHER_LOCATION}"
+ else
+ echo "openpilot backup found, not updating"
+ # TODO: restore backup? This means the updater didn't start after swapping
+ fi
+ fi
+ fi
+ fi
+
+ # Install/update proprietary runtime bundles.
+ if [ -f "$DIR/artifacts/runtime/ensure_private_installed.sh" ]; then
+ bash "$DIR/artifacts/runtime/ensure_private_installed.sh" || true
+ elif [ -x "$DIR/scripts/iqpilot/ensure_navd_private_installed.sh" ]; then
+ # Backward-compat fallback for older trees.
+ "$DIR/scripts/iqpilot/ensure_navd_private_installed.sh" || true
+ fi
+
+ ln -sfn $(pwd) /data/pythonpath
+ export IQPILOT_SOURCE_ROOT="${IQPILOT_SOURCE_ROOT:-$PWD/openpilot}"
+ export PYTHONPATH="$PWD"
+
+ # Install independent systemd services BEFORE build so they run even
+ # when openpilot fails to compile — SSH/BLE/hephaestusd must always
+ # be reachable for device recovery.
+ for service_name in hephaestusd ble-transportd; do
+ service_src="$DIR/system/${service_name}.service"
+ service_dst="/etc/systemd/system/${service_name}.service"
+ service_lib="/lib/systemd/system/${service_name}.service"
+ if [ -f "$service_lib" ] && grep -q "/usr/libexec/iqpilot/iqpilot_bundle_runner" "$service_lib"; then
+ if [ -f "$service_dst" ]; then
+ sudo mount -o remount,rw /
+ sudo rm -f "$service_dst"
+ sudo systemctl daemon-reload
+ sudo mount -o remount,ro /
+ fi
+ sudo systemctl enable "${service_name}.service"
+ if systemctl is-active --quiet "${service_name}.service"; then
+ sudo systemctl restart "${service_name}.service"
+ else
+ sudo systemctl start "${service_name}.service"
+ fi
+ elif [ -f "$service_src" ]; then
+ if [ ! -f "$service_dst" ] || ! cmp -s "$service_src" "$service_dst"; then
+ sudo mount -o remount,rw /
+ sudo cp "$service_src" "$service_dst"
+ sudo systemctl daemon-reload
+ sudo systemctl enable "${service_name}.service"
+ sudo mount -o remount,ro /
+ sudo systemctl restart "${service_name}.service"
+ elif ! systemctl is-active --quiet "${service_name}.service"; then
+ sudo systemctl start "${service_name}.service"
+ fi
+ fi
+ done
+
+ # hardware specific init
+ if [ -f /AGNOS ]; then
+ agnos_init
+ fi
+
+ # write tmux scrollback to a file
+ tmux capture-pane -pq -S-1000 > /tmp/launch_log
+
+ # start manager
+ cd $DIR/system/manager
+ if [ ! -f $DIR/prebuilt ]; then
+ ./build.py
+ fi
+
+ ./manager.py
+
+ # if broken, keep on screen error
+ while true; do sleep 1; done
+}
+
+launch
diff --git a/iqpilot/system/hardware/c3/launch_env.sh b/iqpilot/system/hardware/c3/launch_env.sh
new file mode 100755
index 000000000..945a832c2
--- /dev/null
+++ b/iqpilot/system/hardware/c3/launch_env.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+export OMP_NUM_THREADS=1
+export MKL_NUM_THREADS=1
+export NUMEXPR_NUM_THREADS=1
+export OPENBLAS_NUM_THREADS=1
+export VECLIB_MAXIMUM_THREADS=1
+
+if [ -z "$AGNOS_VERSION" ]; then
+ export AGNOS_VERSION="15.1"
+fi
+
+export STAGING_ROOT="/data/safe_staging"
diff --git a/iqpilot/tests/test_auto_units.py b/iqpilot/tests/test_auto_units.py
new file mode 100644
index 000000000..c9fd94ca8
--- /dev/null
+++ b/iqpilot/tests/test_auto_units.py
@@ -0,0 +1,91 @@
+from openpilot.common.params import Params
+from openpilot.iqpilot.common.auto_units import CONFIRMATIONS, AutoUnits
+
+SEATTLE = (47.6062, -122.3321)
+BERLIN = (52.5200, 13.4050)
+LONDON = (51.5074, -0.1278)
+
+
+class StubAutoUnits(AutoUnits):
+ def __init__(self, params):
+ super().__init__(params)
+ self.position = (0.0, 0.0, False)
+
+ def _position(self):
+ return self.position
+
+
+def settle(auto_units, position, count=CONFIRMATIONS, start=0.0):
+ auto_units.position = position
+ for i in range(count):
+ auto_units.update(now=start + i * 100.0)
+ return start + count * 100.0
+
+
+class TestAutoUnits:
+ def setup_method(self):
+ self.params = Params()
+ self.params.put_bool("IQAutoUnits", True)
+ self.params.remove("IQAutoUnitsRegion")
+ self.params.put_bool("IsMetric", False)
+ self.auto_units = StubAutoUnits(self.params)
+
+ def test_no_fix_does_nothing(self):
+ settle(self.auto_units, (0.0, 0.0, False))
+ assert self.params.get("IQAutoUnitsRegion") is None
+ assert not self.params.get_bool("IsMetric")
+
+ def test_disabled_does_nothing(self):
+ self.params.put_bool("IQAutoUnits", False)
+ settle(self.auto_units, (*BERLIN, True))
+ assert self.params.get("IQAutoUnitsRegion") is None
+ assert not self.params.get_bool("IsMetric")
+
+ def test_metric_region_switches_to_metric(self):
+ settle(self.auto_units, (*BERLIN, True))
+ assert self.params.get("IQAutoUnitsRegion") == "METRIC"
+ assert self.params.get_bool("IsMetric")
+
+ def test_mph_region_stays_imperial(self):
+ settle(self.auto_units, (*SEATTLE, True))
+ assert self.params.get("IQAutoUnitsRegion") == "US"
+ assert not self.params.get_bool("IsMetric")
+
+ def test_uk_stays_imperial(self):
+ self.params.put_bool("IsMetric", True)
+ settle(self.auto_units, (*LONDON, True))
+ assert self.params.get("IQAutoUnitsRegion") == "GB"
+ assert not self.params.get_bool("IsMetric")
+
+ def test_border_crossing_switches_units(self):
+ now = settle(self.auto_units, (*SEATTLE, True))
+ assert not self.params.get_bool("IsMetric")
+
+ settle(self.auto_units, (*BERLIN, True), start=now)
+ assert self.params.get("IQAutoUnitsRegion") == "METRIC"
+ assert self.params.get_bool("IsMetric")
+
+ def test_manual_override_is_kept_within_a_region(self):
+ now = settle(self.auto_units, (*SEATTLE, True))
+ self.params.put_bool("IsMetric", True)
+
+ settle(self.auto_units, (*SEATTLE, True), start=now)
+ assert self.params.get_bool("IsMetric")
+
+ def test_unconfirmed_region_is_not_applied(self):
+ settle(self.auto_units, (*BERLIN, True), count=CONFIRMATIONS - 1)
+ assert self.params.get("IQAutoUnitsRegion") is None
+ assert not self.params.get_bool("IsMetric")
+
+ def test_flapping_region_resets_confirmations(self):
+ now = 0.0
+ for position in (BERLIN, SEATTLE, BERLIN, SEATTLE):
+ now = settle(self.auto_units, (*position, True), count=1, start=now)
+ assert self.params.get("IQAutoUnitsRegion") is None
+ assert not self.params.get_bool("IsMetric")
+
+ def test_rate_limited(self):
+ self.auto_units.position = (*BERLIN, True)
+ for _ in range(CONFIRMATIONS * 4):
+ self.auto_units.update(now=1.0)
+ assert self.params.get("IQAutoUnitsRegion") is None
diff --git a/iqpilot/tests/test_geo_regions.py b/iqpilot/tests/test_geo_regions.py
new file mode 100644
index 000000000..ef9ba30eb
--- /dev/null
+++ b/iqpilot/tests/test_geo_regions.py
@@ -0,0 +1,165 @@
+import pytest
+
+from openpilot.iqpilot.common.geo_regions import METRIC_REGION, UNKNOWN_REGION, region_for_position, region_is_metric
+
+US_POINTS = [
+ (47.6062, -122.3321, "Seattle"),
+ (42.3314, -83.0458, "Detroit"),
+ (42.8864, -78.8784, "Buffalo"),
+ (25.7617, -80.1918, "Miami"),
+ (29.7604, -95.3698, "Houston"),
+ (32.7157, -117.1611, "San Diego"),
+ (34.0522, -118.2437, "Los Angeles"),
+ (61.2181, -149.9003, "Anchorage"),
+ (58.3019, -134.4197, "Juneau"),
+ (64.8378, -147.7164, "Fairbanks"),
+ (21.3069, -157.8583, "Honolulu"),
+ (18.4655, -66.1057, "San Juan"),
+ (13.4757, 144.7489, "Guam"),
+ (44.9778, -93.2650, "Minneapolis"),
+ (40.7128, -74.0060, "New York"),
+ (41.8781, -87.6298, "Chicago"),
+ (31.7900, -106.4300, "El Paso"),
+ (26.2034, -98.2300, "McAllen"),
+ (44.8016, -68.7712, "Bangor"),
+ (48.7519, -122.4787, "Bellingham"),
+ (46.8772, -96.7898, "Fargo"),
+ (48.6023, -93.4093, "International Falls"),
+ (46.4953, -84.3453, "Sault Ste. Marie MI"),
+ (47.1211, -88.5694, "Houghton"),
+ (41.6528, -83.5379, "Toledo"),
+ (42.1370, -83.1930, "Trenton MI"),
+ (39.7392, -104.9903, "Denver"),
+ (33.4484, -112.0740, "Phoenix"),
+ (30.3322, -81.6557, "Jacksonville"),
+ (42.3601, -71.0589, "Boston"),
+ (38.9072, -77.0369, "Washington DC"),
+]
+
+GB_POINTS = [
+ (51.5074, -0.1278, "London"),
+ (54.5973, -5.9301, "Belfast"),
+ (55.8642, -4.2518, "Glasgow"),
+ (51.4816, -3.1791, "Cardiff"),
+ (51.4545, -2.5879, "Bristol"),
+ (53.4084, -2.9916, "Liverpool"),
+ (53.4808, -2.2426, "Manchester"),
+ (55.9533, -3.1883, "Edinburgh"),
+ (52.4862, -1.8904, "Birmingham"),
+ (53.8008, -1.5491, "Leeds"),
+ (57.4778, -4.2247, "Inverness"),
+ (57.1497, -2.0943, "Aberdeen"),
+ (56.4620, -2.9707, "Dundee"),
+ (58.6373, -3.0689, "John o' Groats"),
+ (54.1509, -4.4814, "Douglas"),
+ (49.1858, -2.1064, "St Helier"),
+ (55.0000, -7.3200, "Derry"),
+ (54.3438, -7.6315, "Enniskillen"),
+ (54.1751, -6.3402, "Newry"),
+ (54.4783, -8.0906, "Belleek"),
+ (54.5973, -7.3095, "Omagh"),
+ (55.2053, -6.6570, "Portrush"),
+ (58.2090, -6.3890, "Stornoway"),
+ (58.9809, -2.9605, "Kirkwall"),
+ (60.1546, -1.1494, "Lerwick"),
+ (50.7184, -3.5339, "Exeter"),
+ (50.3755, -4.1427, "Plymouth"),
+ (52.6309, 1.2974, "Norwich"),
+ (54.9783, -1.6178, "Newcastle"),
+ (51.8642, -2.2382, "Gloucester"),
+ (52.4140, -4.0810, "Aberystwyth"),
+ (51.6214, -3.9436, "Swansea"),
+ (50.6938, -1.3040, "Newport IoW"),
+]
+
+LR_POINTS = [
+ (6.3005, -10.7969, "Monrovia"),
+ (4.3750, -7.7169, "Harper"),
+ (6.9956, -9.4722, "Gbarnga"),
+ (6.0667, -8.1333, "Zwedru"),
+ (8.4219, -9.7478, "Voinjama"),
+ (5.8808, -10.0467, "Buchanan"),
+ (5.0100, -9.0400, "Greenville"),
+ (7.3500, -8.7200, "Ganta"),
+]
+
+METRIC_POINTS = [
+ (49.2827, -123.1207, "Vancouver"),
+ (48.4284, -123.3656, "Victoria"),
+ (43.6532, -79.3832, "Toronto"),
+ (42.3149, -83.0364, "Windsor"),
+ (46.5136, -84.3358, "Sault Ste. Marie ON"),
+ (42.9745, -82.4066, "Sarnia"),
+ (43.2557, -79.8711, "Hamilton"),
+ (42.9849, -81.2453, "London ON"),
+ (45.5019, -73.5674, "Montreal"),
+ (45.4765, -75.7013, "Gatineau"),
+ (46.8139, -71.2080, "Quebec City"),
+ (46.0878, -64.7782, "Moncton"),
+ (44.6488, -63.5752, "Halifax"),
+ (49.8951, -97.1384, "Winnipeg"),
+ (51.0447, -114.0719, "Calgary"),
+ (53.5461, -113.4938, "Edmonton"),
+ (52.1332, -106.6700, "Saskatoon"),
+ (50.6745, -120.3273, "Kamloops"),
+ (32.5149, -117.0382, "Tijuana"),
+ (31.7000, -106.4700, "Ciudad Juarez"),
+ (25.6866, -100.3161, "Monterrey"),
+ (27.5060, -99.5075, "Nuevo Laredo"),
+ (19.4326, -99.1332, "Mexico City"),
+ (53.3498, -6.2603, "Dublin"),
+ (51.8985, -8.4756, "Cork"),
+ (53.2707, -9.0568, "Galway"),
+ (54.9503, -7.7345, "Letterkenny"),
+ (54.0000, -6.4000, "Dundalk"),
+ (54.2489, -6.9683, "Monaghan"),
+ (54.2766, -8.4761, "Sligo"),
+ (54.6538, -8.1096, "Donegal"),
+ (52.5200, 13.4050, "Berlin"),
+ (52.2297, 21.0122, "Warsaw"),
+ (48.8566, 2.3522, "Paris"),
+ (60.1699, 24.9384, "Helsinki"),
+ (50.4501, 30.5234, "Kyiv"),
+ (-33.8688, 151.2093, "Sydney"),
+ (35.6762, 139.6503, "Tokyo"),
+ (8.4844, -13.2299, "Freetown"),
+ (7.8767, -11.1875, "Kenema"),
+ (8.2783, -10.5733, "Kailahun"),
+ (9.6412, -13.5784, "Conakry"),
+ (7.7562, -8.8179, "Nzerekore"),
+ (7.4125, -7.5539, "Man"),
+ (5.3600, -4.0083, "Abidjan"),
+]
+
+
+@pytest.mark.parametrize("lat, lon, name", US_POINTS)
+def test_us_positions(lat, lon, name):
+ assert region_for_position(lat, lon) == "US", name
+
+
+@pytest.mark.parametrize("lat, lon, name", GB_POINTS)
+def test_gb_positions(lat, lon, name):
+ assert region_for_position(lat, lon) == "GB", name
+
+
+@pytest.mark.parametrize("lat, lon, name", LR_POINTS)
+def test_lr_positions(lat, lon, name):
+ assert region_for_position(lat, lon) == "LR", name
+
+
+@pytest.mark.parametrize("lat, lon, name", METRIC_POINTS)
+def test_metric_positions(lat, lon, name):
+ assert region_for_position(lat, lon) == METRIC_REGION, name
+
+
+@pytest.mark.parametrize("lat, lon", [(0.0, 0.0), (0.0, 0.00001), (91.0, 10.0), (10.0, 181.0)])
+def test_invalid_positions(lat, lon):
+ assert region_for_position(lat, lon) == UNKNOWN_REGION
+
+
+def test_region_is_metric():
+ assert not region_is_metric("US")
+ assert not region_is_metric("GB")
+ assert not region_is_metric("LR")
+ assert region_is_metric(METRIC_REGION)
+ assert not region_is_metric(UNKNOWN_REGION)
diff --git a/iqpilot/tests/test_proprietary_loader.py b/iqpilot/tests/test_proprietary_loader.py
new file mode 100644
index 000000000..234e498d3
--- /dev/null
+++ b/iqpilot/tests/test_proprietary_loader.py
@@ -0,0 +1,206 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+
+import base64
+import hashlib
+import json
+import sys
+from pathlib import Path
+
+import pytest
+
+from openpilot.iqpilot import _proprietary_loader as loader
+
+
+def _write(path: Path, content: str = "") -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_text(content)
+
+
+def _write_bytes(path: Path, content: bytes) -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_bytes(content)
+
+
+def test_module_root_for_name_prefers_matching_bundle(tmp_path, monkeypatch):
+ repo_root = tmp_path / "repo"
+ model_root = repo_root / "artifacts" / "iqpilot_model_selector_private" / "python"
+ hepha_root = repo_root / "artifacts" / "iqpilot_hephaestusd_private" / "python"
+
+ _write(model_root / "iqpilot_private" / "__init__.py")
+ _write(model_root / "iqpilot_private" / "models" / "__init__.py")
+ _write(model_root / "iqpilot_private" / "models" / "manager.py", "VALUE = 'models'\n")
+
+ _write(hepha_root / "iqpilot_private" / "__init__.py")
+ _write(hepha_root / "iqpilot_private" / "konn3kt" / "__init__.py")
+ _write(hepha_root / "iqpilot_private" / "konn3kt" / "hephaestus" / "__init__.py")
+ _write(hepha_root / "iqpilot_private" / "konn3kt" / "hephaestus" / "hephaestusd.py", "VALUE = 'hepha'\n")
+
+ monkeypatch.setattr(loader, "__file__", str(repo_root / "iqpilot" / "_proprietary_loader.py"))
+
+ resolved = loader._module_root_for_name("iqpilot_private.konn3kt.hephaestus.hephaestusd")
+ assert resolved == hepha_root
+
+
+def test_load_private_module_uses_matching_bundle(tmp_path, monkeypatch):
+ repo_root = tmp_path / "repo"
+ model_root = repo_root / "artifacts" / "iqpilot_model_selector_private" / "python"
+ hepha_root = repo_root / "artifacts" / "iqpilot_hephaestusd_private" / "python"
+
+ _write(model_root / "iqpilot_private" / "__init__.py")
+ _write(model_root / "iqpilot_private" / "models" / "__init__.py")
+ _write(model_root / "iqpilot_private" / "models" / "manager.py", "VALUE = 'models'\n")
+
+ _write(hepha_root / "iqpilot_private" / "__init__.py")
+ _write(hepha_root / "iqpilot_private" / "konn3kt" / "__init__.py")
+ _write(hepha_root / "iqpilot_private" / "konn3kt" / "hephaestus" / "__init__.py")
+ _write(hepha_root / "iqpilot_private" / "konn3kt" / "hephaestus" / "hephaestusd.py", "VALUE = 'hepha'\n")
+
+ monkeypatch.setattr(loader, "__file__", str(repo_root / "iqpilot" / "_proprietary_loader.py"))
+ monkeypatch.setenv("IQPILOT_PROPRIETARY_ROOT", "")
+
+ old_sys_path = list(sys.path)
+ for key in [k for k in sys.modules if k.startswith("iqpilot_private") or k == "test_public_module"]:
+ sys.modules.pop(key, None)
+
+ try:
+ sys.modules["test_public_module"] = type(sys)("test_public_module")
+ private_module = loader.load_private_module("test_public_module", "iqpilot_private.konn3kt.hephaestus.hephaestusd")
+ assert private_module.VALUE == "hepha"
+ assert sys.modules["test_public_module"].VALUE == "hepha"
+ finally:
+ sys.path[:] = old_sys_path
+ for key in [k for k in sys.modules if k.startswith("iqpilot_private") or k == "test_public_module"]:
+ sys.modules.pop(key, None)
+
+
+@pytest.fixture
+def sig_keypair():
+ pytest.importorskip("cryptography")
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
+
+ private_key = Ed25519PrivateKey.generate()
+ public_key = private_key.public_key()
+ return (
+ private_key.private_bytes_raw(),
+ public_key.public_bytes_raw(),
+ )
+
+
+def _sign_file(private_key_bytes: bytes, file_path: Path) -> bytes:
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
+
+ private_key = Ed25519PrivateKey.from_private_bytes(private_key_bytes)
+ digest = hashlib.sha256(file_path.read_bytes()).digest()
+ return private_key.sign(digest)
+
+
+def test_signature_valid_passes(tmp_path, monkeypatch, sig_keypair):
+ priv, pub = sig_keypair
+ monkeypatch.setattr(loader, "_IQPILOT_PUBLIC_KEY", pub)
+ monkeypatch.setattr(loader, "_verified_roots", set())
+ monkeypatch.setenv("IQPILOT_SKIP_SIGNATURE_VERIFY", "")
+
+ bundle_root = tmp_path / "bundle"
+ python_root = bundle_root / "python"
+ python_root.mkdir(parents=True)
+ (python_root / "iqpilot_private").mkdir()
+
+ so_path = python_root / "dummy.so"
+ _write_bytes(so_path, b"VALID SO CONTENT")
+
+ sig = _sign_file(priv, so_path)
+ manifest = {
+ "python/dummy.so": {"sha256": hashlib.sha256(so_path.read_bytes()).hexdigest(), "size": so_path.stat().st_size, "mode": 0o644},
+ "signatures": {"python/dummy.so": base64.b64encode(sig).decode("ascii")},
+ }
+ (bundle_root / "manifest.json").write_text(json.dumps(manifest), encoding="utf-8")
+
+ loader._verify_bundle_signatures(python_root)
+
+
+def test_signature_tampered_raises(tmp_path, monkeypatch, sig_keypair):
+ priv, pub = sig_keypair
+ monkeypatch.setattr(loader, "_IQPILOT_PUBLIC_KEY", pub)
+ monkeypatch.setattr(loader, "_verified_roots", set())
+ monkeypatch.setenv("IQPILOT_SKIP_SIGNATURE_VERIFY", "")
+
+ bundle_root = tmp_path / "bundle"
+ python_root = bundle_root / "python"
+ python_root.mkdir(parents=True)
+ (python_root / "iqpilot_private").mkdir()
+
+ so_path = python_root / "dummy.so"
+ _write_bytes(so_path, b"VALID SO CONTENT")
+
+ sig = _sign_file(priv, so_path)
+
+ so_path.write_bytes(b"TAMPERED CONTENT")
+
+ manifest = {
+ "python/dummy.so": {"sha256": hashlib.sha256(b"VALID SO CONTENT").hexdigest(), "size": 16, "mode": 0o644},
+ "signatures": {"python/dummy.so": base64.b64encode(sig).decode("ascii")},
+ }
+ (bundle_root / "manifest.json").write_text(json.dumps(manifest), encoding="utf-8")
+
+ with pytest.raises(loader.ProprietaryModuleIntegrityError):
+ loader._verify_bundle_signatures(python_root)
+
+
+def test_signature_skip_env_warns(tmp_path, monkeypatch, sig_keypair):
+ priv, pub = sig_keypair
+ monkeypatch.setattr(loader, "_IQPILOT_PUBLIC_KEY", pub)
+ monkeypatch.setattr(loader, "_verified_roots", set())
+ monkeypatch.setenv("IQPILOT_SKIP_SIGNATURE_VERIFY", "1")
+
+ bundle_root = tmp_path / "bundle"
+ python_root = bundle_root / "python"
+ python_root.mkdir(parents=True)
+ (python_root / "iqpilot_private").mkdir()
+
+ so_path = python_root / "dummy.so"
+ _write_bytes(so_path, b"ANY CONTENT")
+
+ sig = _sign_file(priv, so_path)
+ manifest = {
+ "python/dummy.so": {"sha256": hashlib.sha256(so_path.read_bytes()).hexdigest(), "size": so_path.stat().st_size, "mode": 0o644},
+ "signatures": {"python/dummy.so": base64.b64encode(sig).decode("ascii")},
+ }
+ (bundle_root / "manifest.json").write_text(json.dumps(manifest), encoding="utf-8")
+
+ import warnings
+
+ with pytest.warns(RuntimeWarning, match="Skipping signature verification"):
+ loader._verify_bundle_signatures(python_root)
+
+
+def test_signature_no_manifest_backward_compat(tmp_path, monkeypatch):
+ """Bundles built before signing support should load without error."""
+ monkeypatch.setattr(loader, "_verified_roots", set())
+ monkeypatch.setenv("IQPILOT_SKIP_SIGNATURE_VERIFY", "")
+
+ bundle_root = tmp_path / "bundle"
+ python_root = bundle_root / "python"
+ python_root.mkdir(parents=True)
+ (python_root / "iqpilot_private").mkdir()
+
+ loader._verify_bundle_signatures(python_root)
+
+
+def test_signature_manifest_without_signatures_backward_compat(tmp_path, monkeypatch):
+ """Manifests without a 'signatures' key should load without error."""
+ monkeypatch.setattr(loader, "_verified_roots", set())
+ monkeypatch.setenv("IQPILOT_SKIP_SIGNATURE_VERIFY", "")
+
+ bundle_root = tmp_path / "bundle"
+ python_root = bundle_root / "python"
+ python_root.mkdir(parents=True)
+ (python_root / "iqpilot_private").mkdir()
+
+ manifest = {
+ "python/dummy.py": {"sha256": "abc", "size": 3, "mode": 0o644},
+ }
+ (bundle_root / "manifest.json").write_text(json.dumps(manifest), encoding="utf-8")
+
+ loader._verify_bundle_signatures(python_root)
diff --git a/iqpilot/ui/__init__.py b/iqpilot/ui/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/ui/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/ui/layouts/__init__.py b/iqpilot/ui/layouts/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/ui/layouts/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/ui/layouts/settings/__init__.py b/iqpilot/ui/layouts/settings/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/ui/layouts/settings/drive_history.py b/iqpilot/ui/layouts/settings/drive_history.py
new file mode 100644
index 000000000..13aef7937
--- /dev/null
+++ b/iqpilot/ui/layouts/settings/drive_history.py
@@ -0,0 +1,158 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import requests
+import threading
+import time
+import pyray as rl
+
+from openpilot.common.api import api_get
+from openpilot.common.constants import CV
+from openpilot.common.params import Params
+from openpilot.common.swaglog import cloudlog
+from openpilot.common.time_helpers import system_time_valid
+from openpilot.selfdrive.ui.lib.api_helpers import get_token
+from openpilot.selfdrive.ui.ui_state import ui_state, device
+from openpilot.iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID
+from openpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE
+from openpilot.system.ui.lib.multilang import tr
+from openpilot.system.ui.lib.text_measure import measure_text_cached
+from openpilot.system.ui.widgets import Widget
+
+_STATS_PARAM = "ApiCache_DriveStats"
+_POLL_SECONDS = 30
+
+
+class _DriveStatsSource:
+ """Owns the konn3kt drive-stats fetch. Seeds from the cached param, then keeps it fresh on a
+ background poll while the device is offroad and awake. Read `snapshot` for the latest data."""
+
+ def __init__(self):
+ self._params = Params()
+ self._http = requests.Session()
+ self.snapshot = self._params.get(_STATS_PARAM) or {}
+ self._alive = True
+ self._worker = threading.Thread(target=self._poll, daemon=True)
+ self._worker.start()
+
+ def close(self) -> None:
+ self._alive = False
+ try:
+ if self._worker.is_alive():
+ self._worker.join(timeout=1.0)
+ except Exception:
+ pass
+
+ def _poll(self) -> None:
+ while self._alive:
+ if not ui_state.started and device._awake:
+ self._pull_once()
+ time.sleep(_POLL_SECONDS)
+
+ def _pull_once(self) -> None:
+ try:
+ dongle_id = self._params.get("DongleId")
+ if not dongle_id or dongle_id == UNREGISTERED_DONGLE_ID:
+ return
+ # at boot the clock isn't NTP-synced, so the token can't be minted yet — skip quietly
+ if not system_time_valid():
+ return
+ resp = api_get(f"v1.1/devices/{dongle_id}/stats", access_token=get_token(dongle_id), session=self._http)
+ if resp.status_code == 200:
+ payload = resp.json()
+ self.snapshot = payload
+ self._params.put(_STATS_PARAM, payload)
+ except Exception as e:
+ cloudlog.error(f"Failed to fetch drive stats: {e}")
+
+
+class TripsLayout(Widget):
+ PARAM_KEY = _STATS_PARAM # retained for external references
+ UPDATE_INTERVAL = _POLL_SECONDS
+
+ _CARD_FILL = rl.Color(38, 40, 46, 255)
+ _CARD_EDGE = rl.Color(255, 255, 255, 18)
+ _ACCENT = rl.Color(30, 200, 168, 255)
+ _ACCENT_DIM = rl.Color(93, 202, 165, 255)
+ _UNIT = rl.Color(138, 139, 144, 255)
+ _RULE = rl.Color(255, 255, 255, 16)
+
+ def __init__(self):
+ super().__init__()
+ self._params = Params()
+ self._source = _DriveStatsSource()
+ # one shared height so the three columns line up; tinted teal at draw time
+ self._ic_drives = gui_app.texture("icons_mici/wheel.png", 64, 64, keep_aspect_ratio=True)
+ self._ic_distance = gui_app.texture("icons/road.png", 88, 64, keep_aspect_ratio=True)
+ self._ic_hours = gui_app.texture("../../iqpilot/selfdrive/assets/icons/clock.png", 64, 64, keep_aspect_ratio=True)
+
+ def __del__(self):
+ self._source.close()
+
+ def _columns(self, bucket: dict, is_metric: bool):
+ routes = int(bucket.get("routes", 0))
+ distance = bucket.get("distance", 0)
+ distance_val = int(distance * CV.MPH_TO_KPH) if is_metric else int(distance)
+ hours = int(bucket.get("minutes", 0) / 60)
+ dist_unit = tr("KM") if is_metric else tr("Miles")
+ return (
+ (self._ic_drives, str(routes), tr("Drives")),
+ (self._ic_distance, str(distance_val), dist_unit),
+ (self._ic_hours, str(hours), tr("Hours")),
+ )
+
+ def _paint_card(self, x, y, width, height, title, columns) -> None:
+ card = rl.Rectangle(x, y, width, height)
+ rl.draw_rectangle_rounded(card, 0.10, 20, self._CARD_FILL)
+ rl.draw_rectangle_rounded_lines_ex(card, 0.10, 20, 2, self._CARD_EDGE)
+
+ # heading: teal tick + muted-teal caption
+ pad = 44
+ label_y = y + 36
+ tick_h = 30
+ title_size = 34 * FONT_SCALE
+ rl.draw_rectangle_rounded(rl.Rectangle(x + pad, label_y, 6, tick_h), 0.5, 6, self._ACCENT)
+ rl.draw_text_ex(gui_app.font(FontWeight.BOLD), title,
+ rl.Vector2(x + pad + 22, label_y + (tick_h - title_size) / 2), title_size, 4, self._ACCENT_DIM)
+
+ col_width = width / 3
+ content_top = label_y + tick_h + 20
+ content_bottom = y + height - 30
+
+ number_font = gui_app.font(FontWeight.BOLD)
+ unit_font = gui_app.font(FontWeight.MEDIUM)
+ number_size = 84 * FONT_SCALE
+ unit_size = 30 * FONT_SCALE
+ unit_spacing = 2.0
+ icon_gap = 16
+ num_gap = 14
+
+ # vertical rules between the three columns
+ for i in (1, 2):
+ dx = x + col_width * i
+ rl.draw_line_ex(rl.Vector2(dx, content_top + 4), rl.Vector2(dx, content_bottom - 4), 1, self._RULE)
+
+ for idx, (icon, value, unit) in enumerate(columns):
+ center_x = x + col_width * idx + col_width / 2
+ unit = unit.upper()
+ val_w = measure_text_cached(number_font, value, int(number_size)).x
+ unit_w = measure_text_cached(unit_font, unit, int(unit_size)).x + unit_spacing * max(0, len(unit) - 1)
+ block_h = icon.height + icon_gap + number_size + num_gap + unit_size
+ start_y = content_top + max(0.0, (content_bottom - content_top - block_h) / 2)
+ rl.draw_texture(icon, int(center_x - icon.width / 2), int(start_y), self._ACCENT)
+ num_y = start_y + icon.height + icon_gap
+ rl.draw_text_ex(number_font, value, rl.Vector2(center_x - val_w / 2, num_y), number_size, 0, rl.WHITE)
+ unit_y = num_y + number_size + num_gap
+ rl.draw_text_ex(unit_font, unit, rl.Vector2(center_x - unit_w / 2, unit_y), unit_size, unit_spacing, self._UNIT)
+
+ def _render(self, rect: rl.Rectangle):
+ is_metric = self._params.get_bool("IsMetric")
+ stats = self._source.snapshot
+ spacing = 28
+ card_height = (rect.height - spacing) / 2
+
+ self._paint_card(rect.x, rect.y, rect.width, card_height, tr("ALL TIME"),
+ self._columns(stats.get("all", {}), is_metric))
+ self._paint_card(rect.x, rect.y + card_height + spacing, rect.width, card_height, tr("PAST WEEK"),
+ self._columns(stats.get("week", {}), is_metric))
+ return -1
diff --git a/iqpilot/ui/layouts/settings/iq_dynamic.py b/iqpilot/ui/layouts/settings/iq_dynamic.py
new file mode 100644
index 000000000..88d5478f9
--- /dev/null
+++ b/iqpilot/ui/layouts/settings/iq_dynamic.py
@@ -0,0 +1,202 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from collections.abc import Callable
+
+import pyray as rl
+
+from openpilot.common.params import Params
+from openpilot.selfdrive.ui.ui_state import ui_state
+from openpilot.system.ui.lib.multilang import tr
+from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, IQToggleAction, SafeIQToggleAction
+from openpilot.system.ui.iqwidgets.widgets.list_view import OptionControl
+from openpilot.system.ui.widgets import Widget
+from openpilot.system.ui.widgets.network import NavButton
+from openpilot.system.ui.widgets.scroller_tici import Scroller
+from iqdbc.car.volkswagen.values import CAR, VolkswagenFlags
+
+
+def _toggle_item(title: str, description: str, param: str) -> IQListItem:
+ return IQListItem(
+ title=lambda t=title: tr(t),
+ description=lambda d=description: tr(d),
+ action_item=IQToggleAction(
+ initial_state=Params().get_bool(param),
+ callback=lambda state, p=param: Params().put_bool(p, state),
+ param=param,
+ ),
+ )
+
+
+def _safe_toggle_item(title: str, description: str, param: str, default_on: bool = True) -> IQListItem:
+ return IQListItem(
+ title=lambda t=title: tr(t),
+ description=lambda d=description: tr(d),
+ action_item=SafeIQToggleAction(
+ param=param,
+ default_on=default_on,
+ ),
+ )
+
+
+def _option_item(title: str, description: str, param: str, minimum: int, maximum: int,
+ step: int = 1, label_callback=None, use_float_scaling: bool = False) -> IQListItem:
+ return IQListItem(
+ title=lambda t=title: tr(t),
+ description=lambda d=description: tr(d),
+ action_item=OptionControl(
+ param=param,
+ min_value=minimum,
+ max_value=maximum,
+ value_change_step=step,
+ use_float_scaling=use_float_scaling,
+ label_callback=label_callback,
+ ),
+ )
+
+
+class IQDynamicLayout(Widget):
+ def __init__(self, back_btn_callback: Callable):
+ super().__init__()
+ self._params = Params()
+ self._back_button = NavButton(tr("Back"))
+ self._back_button.set_click_callback(back_btn_callback)
+
+ items = self._initialize_items()
+ self._scroller = Scroller(items, line_separator=True, spacing=0)
+
+ @staticmethod
+ def _is_pq() -> bool:
+ bundle = ui_state.params.get("CarPlatformBundle")
+ if bundle:
+ platform = bundle.get("platform")
+ if platform:
+ try:
+ return bool(CAR[platform].config.flags & VolkswagenFlags.PQ)
+ except (KeyError, AttributeError):
+ return False
+ elif ui_state.CP:
+ return bool(ui_state.CP.flags & VolkswagenFlags.PQ)
+ return False
+
+ def _initialize_items(self):
+ ms_to_mph = 2.23694
+
+ def speed_label(value: float | int) -> str:
+ try:
+ speed_ms = float(value)
+ except (TypeError, ValueError):
+ return "-- mph"
+ return f"{int(round(speed_ms * ms_to_mph))} mph"
+
+ def distance_label(value: float | int) -> str:
+ try:
+ distance_m = float(value)
+ except (TypeError, ValueError):
+ return "-- m"
+ if self._params.get_bool("IsMetric"):
+ return f"{distance_m:.1f} m"
+ return f"{distance_m * 3.28084:.0f} ft"
+
+ def seconds_label(value: float | int) -> str:
+ try:
+ seconds = float(value)
+ except (TypeError, ValueError):
+ return "--.-s"
+ return f"{seconds:.1f}s"
+
+ self._blend_radar_toggle = _toggle_item(
+ "Blend IQ.Pilot + Stock ACC Radar",
+ "VW PQ only. Keep the factory ACC radar engaged and use its acceleration as IQ.Dynamic's ACC "
+ "(chill) command, while IQ.Pilot still owns blended/e2e control for low speed, stops, and traffic.",
+ "IQDynamicBlendStockRadar",
+ )
+ self._pq_only_items = [self._blend_radar_toggle]
+
+ return [
+ self._blend_radar_toggle,
+ _toggle_item(
+ "IQ.Dynamic Curves",
+ "Allow IQ.Dynamic to enter blended control for curves and strong vision slowdown cues.",
+ "IQDynamicConditionalCurves",
+ ),
+ _toggle_item(
+ "IQ.Dynamic Slower Lead",
+ "Allow IQ.Dynamic to switch toward blended control when a slower lead vehicle is detected.",
+ "IQDynamicConditionalSlowerLead",
+ ),
+ _toggle_item(
+ "IQ.Dynamic Stopped Lead",
+ "Allow IQ.Dynamic to react more aggressively when a lead vehicle is nearly stopped.",
+ "IQDynamicConditionalStoppedLead",
+ ),
+ _toggle_item(
+ "IQ.Dynamic Model Stops",
+ "Allow IQ.Dynamic to switch toward blended control for stop-sign and stop-light style vision stops.",
+ "IQDynamicConditionalModelStops",
+ ),
+ _toggle_item(
+ "IQ.Dynamic SLC Fallback",
+ "Allow IQ.Dynamic to request blended control when Speed Limit Controller has no usable target.",
+ "IQDynamicConditionalSLCFallback",
+ ),
+ _option_item(
+ "IQ.Dynamic Low Speed",
+ "Below this speed, IQ.Dynamic prefers blended control when no lead is present.",
+ "IQDynamicConditionalSpeed",
+ 500, 3500, step=50,
+ use_float_scaling=True,
+ label_callback=speed_label,
+ ),
+ _toggle_item(
+ "IQ Force Stops",
+ "Bring the car to a complete stop for stop signs and stop lights, and feather the brake in the final meters of "
+ "every stop so it settles gently instead of rocking on its suspension. Yields full braking authority when a lead "
+ "is close. Override with the accelerator.",
+ "IQForceStops",
+ ),
+ _option_item(
+ "IQ.Dynamic Lead Speed",
+ "Below this speed, IQ.Dynamic prefers blended control even with a tracked lead.",
+ "IQDynamicConditionalLeadSpeed",
+ 500, 4000, step=50,
+ use_float_scaling=True,
+ label_callback=speed_label,
+ ),
+ _option_item(
+ "IQ.Dynamic Model Stop Time",
+ "Sets the vision stop prediction time horizon used by IQ.Dynamic and IQ Force Stops. Shorter values react later. Longer values react earlier.",
+ "IQDynamicModelStopTime",
+ 100, 600,
+ step=25,
+ use_float_scaling=True,
+ label_callback=seconds_label,
+ ),
+ _option_item(
+ "IQ.Dynamic Min Force Stop Length",
+ "When IQ Force Stops is enabled, keep at least this much stopping distance in the force-stop ramp. Set to 0 to disable the minimum.",
+ "IQDynamicMinimumForceStopLength",
+ 0, 5000,
+ step=50,
+ use_float_scaling=True,
+ label_callback=distance_label,
+ ),
+ ]
+
+ def _render(self, rect: rl.Rectangle):
+ is_pq = self._is_pq()
+ for item in self._pq_only_items:
+ item.set_visible(is_pq)
+
+ self._back_button.set_position(self._rect.x, self._rect.y + 20)
+ self._back_button.render()
+ content_rect = rl.Rectangle(
+ rect.x,
+ rect.y + self._back_button.rect.height + 40,
+ rect.width,
+ rect.height - self._back_button.rect.height - 40,
+ )
+ self._scroller.render(content_rect)
+
+ def show_event(self):
+ self._scroller.show_event()
diff --git a/iqpilot/ui/layouts/settings/iq_panels.py b/iqpilot/ui/layouts/settings/iq_panels.py
new file mode 100644
index 000000000..529efd877
--- /dev/null
+++ b/iqpilot/ui/layouts/settings/iq_panels.py
@@ -0,0 +1,2703 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Consolidated IQ.Pilot settings panels (display, visuals, network, maps, steering
+and its lane-change / steering-assist sub-panels) in one module.
+"""
+from cereal import car
+from collections.abc import Callable
+from enum import Enum
+from enum import IntEnum
+from openpilot.common.constants import CV
+from openpilot.common.params import Params
+from openpilot.selfdrive.ui.ui_state import OnroadBrightness
+from openpilot.common.swaglog import cloudlog
+from openpilot.iqpilot.selfdrive.controls.lib.helpers.lane_change import AutoLaneChangeMode
+from openpilot.iqpilot.ui.onroad.offline_tiles import offline_map_root
+from openpilot.selfdrive.ui.layouts.settings.software import time_ago
+from openpilot.selfdrive.ui.ui_state import device, ui_state
+from openpilot.selfdrive.ui.ui_state import ui_state
+from openpilot.system.hardware.hw import Paths
+from openpilot.system.ui.iqwidgets.lib.styles import style
+from openpilot.system.ui.iqwidgets.lib.utils import WideButtonAction
+from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, toggle_item
+from openpilot.system.ui.iqwidgets.widgets.list_view import OptionControl
+from openpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item, toggle_item
+from openpilot.system.ui.iqwidgets.widgets.list_view import option_item, toggle_item, ToggleAction
+from openpilot.system.ui.iqwidgets.widgets.list_view import progress_item
+from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, multiple_button_item, IQListItem, IQLineSeparator
+from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, option_item, IQLineSeparator
+from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, simple_button_item, option_item, IQLineSeparator
+from openpilot.system.ui.iqwidgets.widgets.list_view import PickerGroup, PickerItem, PickerDialog
+from openpilot.system.ui.lib.application import gui_app
+from openpilot.system.ui.lib.multilang import tr
+from openpilot.system.ui.lib.multilang import tr, tr_noop
+from openpilot.system.ui.widgets import DialogResult, Widget
+from openpilot.system.ui.widgets import Widget
+from openpilot.system.ui.widgets.button import Button, ButtonStyle
+from openpilot.system.ui.widgets.confirm_dialog import ConfirmDialog
+from openpilot.system.ui.widgets.list_view import text_item
+from openpilot.system.ui.widgets.network import NavButton
+from openpilot.system.ui.widgets.network import NetworkUI, PanelType as NetworkPanelType, TEAL
+from openpilot.system.ui.widgets.scroller_tici import Scroller
+from pathlib import Path
+from time import monotonic
+import datetime
+import os
+import platform
+import pyray as rl
+import requests
+import shutil
+import threading
+import time
+
+
+from cereal import custom
+from dataclasses import dataclass
+from openpilot.iqpilot.selfdrive.car.vehicle_catalog import load_catalog
+from openpilot.iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle
+from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH
+from openpilot.selfdrive.ui.layouts.settings import settings as OP
+from openpilot.selfdrive.ui.layouts.settings.toggles import TogglesLayout
+from openpilot.system.hardware import HARDWARE
+from openpilot.system.ui.iqwidgets.lib.styles import metrics
+from openpilot.system.ui.iqwidgets.widgets.list_view import (
+ option_item as option_item,
+ multiple_button_item as multiple_button_item,
+ button_item as button_item,
+ dual_button_item as dual_button_item,
+ NavSectionButton,
+ Spacer,
+)
+from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem
+from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, IQMultipleButtonAction, IQToggleAction, IQLineSeparator
+from openpilot.system.ui.iqwidgets.widgets.list_view import button_item, toggle_item
+from openpilot.system.ui.iqwidgets.widgets.list_view import NoticeModal
+from openpilot.system.ui.iqwidgets.widgets.list_view import PickerDialog, PickerItem, PickerGroup
+from openpilot.system.ui.lib.application import gui_app, MousePos
+from openpilot.system.ui.lib.multilang import tr_noop
+from openpilot.system.ui.lib.text_measure import measure_text_cached
+from openpilot.system.ui.lib.wifi_manager import WifiManager
+from openpilot.system.ui.widgets import DialogResult
+from openpilot.system.ui.widgets.button import ButtonStyle
+from openpilot.system.ui.widgets.confirm_dialog import alert_dialog, ConfirmDialog
+from openpilot.system.ui.widgets.list_view import button_item
+from openpilot.system.ui.widgets.option_dialog import MultiOptionDialog
+from openpilot.system.ui.widgets.scroller_tici import LineSeparator
+from openpilot.system.ui.widgets.toggle import ON_COLOR
+import re
+
+from openpilot.selfdrive.ui.layouts.settings.developer import DeveloperLayout
+from openpilot.selfdrive.ui.layouts.settings.device import DeviceLayout
+from openpilot.selfdrive.ui.layouts.settings.software import SoftwareLayout, time_ago
+
+from functools import partial
+from iqdbc.car.hyundai.values import CAR, CANFD_UNSUPPORTED_LONGITUDINAL_CAR, UNSUPPORTED_LONGITUDINAL_CAR
+from iqdbc.car.subaru.values import CAR, SubaruFlags
+from iqdbc.car.volkswagen.values import CAR, VolkswagenFlags
+from openpilot.common.basedir import BASEDIR
+from openpilot.system.ui.iqwidgets.lib.styles import ink
+from openpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item
+from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item
+from openpilot.system.ui.lib.application import gui_app, FontWeight
+from openpilot.system.ui.widgets.list_view import ButtonAction
+import json
+
+# ===== display =====
+
+ONROAD_BRIGHTNESS_TIMER_VALUES = {0: 15, 1: 30, **{i: (i - 1) * 60 for i in range(2, 12)}}
+
+
+
+
+def _fmt_seconds(value) -> str:
+ return f"{value} s" if value < 60 else f"{int(value / 60)} m"
+
+
+def onroad_brightness_label(val) -> str:
+ if val == OnroadBrightness.AUTO:
+ return tr("Auto")
+ if val == OnroadBrightness.AUTO_DARK:
+ return tr("Auto — Dim")
+ return f"{(val - 1) * 5} %"
+
+
+class DisplayLayout(Widget):
+ def __init__(self):
+ super().__init__()
+ self._params = Params()
+ self._scroller = Scroller(self._build_rows(), line_separator=True, spacing=0)
+
+ def _build_rows(self):
+ self._force_mici_ui = toggle_item(
+ title=lambda: tr("Force Mici UI"),
+ description=lambda: tr("Run the compact comma 4 (mici) interface on this device") if self._params.get_bool("ForceSmallUI") else "",
+ param="ForceSmallUI",
+ )
+ self._brightness_row = option_item(
+ param="Brightness", title=lambda: tr("Display Brightness"), description="",
+ min_value=0, max_value=100, value_change_step=5,
+ label_callback=lambda v: tr("Default") if v == 0 else f"{v} %", inline=True,
+ )
+ self._onroad_brightness_row = option_item(
+ param="OnroadScreenOffBrightness", title=lambda: tr("Driving Brightness"), description="",
+ min_value=0, max_value=21, value_change_step=1,
+ label_callback=onroad_brightness_label, inline=True,
+ )
+ self._dim_delay_row = option_item(
+ param="OnroadScreenOffTimer", title=lambda: tr("Dim Delay"), description="",
+ min_value=0, max_value=11, value_change_step=1,
+ value_map=ONROAD_BRIGHTNESS_TIMER_VALUES, label_callback=_fmt_seconds, inline=True,
+ )
+ self._idle_close_row = option_item(
+ param="InteractivityTimeout", title=lambda: tr("Auto-Close Settings"),
+ description=lambda: tr("How long the settings screen may sit untouched before it closes itself."),
+ min_value=0, max_value=120, value_change_step=10,
+ label_callback=lambda v: tr("Default") if not v else _fmt_seconds(v), inline=True,
+ )
+ return [
+ self._force_mici_ui,
+ self._brightness_row,
+ self._onroad_brightness_row,
+ self._dim_delay_row,
+ self._idle_close_row,
+ ]
+
+ # kept name: visuals.py and ui_state historically called through this
+ update_onroad_brightness = staticmethod(onroad_brightness_label)
+
+ def _update_state(self):
+ super()._update_state()
+ for row in self._scroller._items:
+ action = row.action_item
+ if isinstance(action, ToggleAction) and action.toggle.param_key is not None:
+ action.set_state(self._params.get_bool(action.toggle.param_key))
+ elif isinstance(action, OptionControl) and action.param_key is not None:
+ action.set_value(self._params.get(action.param_key, return_default=True))
+
+ mode = self._params.get("OnroadScreenOffBrightness", return_default=True)
+ self._dim_delay_row.action_item.set_enabled(mode not in (OnroadBrightness.AUTO, OnroadBrightness.AUTO_DARK))
+
+ def _render(self, rect):
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._scroller.show_event()
+
+# ===== visuals =====
+
+CHEVRON_INFO_DESCRIPTION = {
+ "enabled": tr_noop("Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car ahead. "
+ "Needs IQ.Pilot to be the one controlling gas and brake."),
+ "disabled": tr_noop("Unavailable — IQ.Pilot longitudinal control is not active on this car."),
+}
+
+# param key -> (title fn, description fn)
+_HUD_TOGGLES = {
+ "IQBlindSpotAlerts": (
+ lambda: tr("Blind Spot Alerts"),
+ lambda: tr("Flashes a side warning whenever the car reports something sitting in your blind spot (BSM-equipped cars only)."),
+ ),
+ "IQExpandedStatus": (
+ lambda: tr("Expanded Status Bar"),
+ lambda: tr("Bring back the classic UI's wide offroad status strip: temperature, vehicle, and Konn3kt state at a glance."),
+ ),
+ "IQSteerEffortArc": (
+ lambda: tr("Steering Effort Arc"),
+ lambda: tr("Trace an arc over the road view showing how much steering IQ.Pilot is applying while lateral control runs."),
+ ),
+ "IQRoadNameOverlay": (
+ lambda: tr("Road Name Overlay"),
+ lambda: tr("Show the current road's name over the driving view."
+ " Requires offline map data for your region to be installed."),
+ ),
+ "IQBlinkerIndicators": (
+ lambda: tr("Blinker Indicators"),
+ lambda: tr("Mirror the car's blinkers as arrows on the driving screen."),
+ ),
+ "IQAccelMeter": (
+ lambda: tr("Acceleration Meter"),
+ lambda: tr("Draw a bar along the left edge tracking measured acceleration and braking — what the car is actually "
+ "doing right now, not the planner's request."),
+ ),
+}
+
+_SECTION_TITLE_COLOR = rl.Color(16, 185, 169, 255)
+
+
+class VisualsLayout(Widget):
+ def __init__(self):
+ super().__init__()
+ self._params = Params()
+ self._display_layout = DisplayLayout()
+ self._scroller = Scroller(self._build_rows(), line_separator=True, spacing=0)
+
+ def _build_rows(self):
+ self._toggles = {
+ key: toggle_item(title=title, description=desc, param=key,
+ initial_state=ui_state.params.get_bool(key))
+ for key, (title, desc) in _HUD_TOGGLES.items()
+ }
+
+ self._chevron_info = multiple_button_item(
+ title=lambda: tr("Lead Vehicle Readouts"),
+ description="",
+ buttons=[lambda: tr("Off"), lambda: tr("Distance"), lambda: tr("Speed"), lambda: tr("Time"), lambda: tr("All")],
+ param="IQLeadReadouts",
+ inline=False,
+ )
+ self._dev_ui_info = toggle_item(
+ title=lambda: tr("Onroad Developer UI"),
+ description=lambda: tr("Overlay a bar of live control metrics (steering, lateral accel, lead data) while driving."),
+ initial_state=bool(int(ui_state.params.get("IQDevUIInfo", return_default=True))),
+ callback=lambda on: ui_state.params.put("IQDevUIInfo", 3 if on else 0),
+ )
+
+ # Display rows are shared with DisplayLayout (its row 0, Force Mici UI, stays there)
+ display_rows = self._display_layout._scroller._items[1:]
+
+ return [
+ IQListItem(title=lambda: tr("Display"), description="", action_item=None, inline=True,
+ title_color=_SECTION_TITLE_COLOR),
+ IQLineSeparator(20),
+ *display_rows,
+ IQLineSeparator(60),
+ *self._toggles.values(),
+ self._chevron_info,
+ self._dev_ui_info,
+ ]
+
+ def _sync_chevron_row(self):
+ if ui_state.has_longitudinal_control:
+ self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["enabled"]))
+ self._chevron_info.action_item.set_selected_button(ui_state.params.get("IQLeadReadouts", return_default=True))
+ self._chevron_info.action_item.set_enabled(True)
+ else:
+ self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["disabled"]))
+ self._chevron_info.action_item.set_enabled(False)
+ ui_state.params.put("IQLeadReadouts", 0)
+
+ def _update_state(self):
+ super()._update_state()
+ for key, row in self._toggles.items():
+ row.action_item.set_state(self._params.get_bool(key))
+ self._dev_ui_info.action_item.set_state(bool(int(ui_state.params.get("IQDevUIInfo", return_default=True))))
+ self._sync_chevron_row()
+
+ def _render(self, rect):
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._display_layout.show_event()
+ self._scroller.show_event()
+ if not ui_state.has_longitudinal_control:
+ self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["disabled"]))
+ self._chevron_info.show_description(True)
+
+# ===== network =====
+
+_IDLE_BG = rl.Color(52, 55, 62, 255)
+
+
+class ScanPhase(Enum):
+ IDLE = 0
+ RUNNING = 1
+ FAILED = 2
+
+
+class IQNetworkUI(NetworkUI):
+ """Stock network panel plus a manual wifi rescan button."""
+
+ def __init__(self, wifi_manager):
+ super().__init__(wifi_manager)
+ self._phase = ScanPhase.IDLE
+ self.scan_button = Button(tr("Scan"), self._start_scan, button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT,
+ font_size=60, border_radius=30)
+ self.scan_button.set_rect(rl.Rectangle(0, 0, 400, 100))
+ self._wifi_manager.add_callbacks(networks_updated=self._on_networks_updated)
+
+ def _set_phase(self, phase: ScanPhase):
+ self._phase = phase
+ running = phase == ScanPhase.RUNNING
+ self.scan_button.set_text(tr("Searching...") if running else tr("Scan"))
+ self.scan_button.set_enabled(not running)
+ # keep the manager's spinner in step with the button, not just the quick scan call
+ self._wifi_manager._scanning = running
+
+ def _start_scan(self):
+ self._set_phase(ScanPhase.RUNNING)
+ threading.Thread(target=self._scan_worker, daemon=True).start()
+
+ def _scan_worker(self):
+ try:
+ self._wifi_manager._update_networks()
+ self._wifi_manager._request_scan()
+ self._wifi_manager._last_network_update = time.monotonic()
+ except Exception:
+ cloudlog.exception("IQNetworkUI scan failed")
+ self._phase = ScanPhase.FAILED
+
+ def _on_networks_updated(self, networks):
+ if self._phase == ScanPhase.RUNNING:
+ self._set_phase(ScanPhase.IDLE)
+
+ def _render(self, rect: rl.Rectangle):
+ super()._render(rect)
+
+ if self._phase == ScanPhase.FAILED:
+ self._set_phase(ScanPhase.IDLE)
+
+ if self._current_panel == NetworkPanelType.WIFI:
+ self.scan_button.set_position(self._rect.x, self._rect.y + 20)
+ r = self.scan_button.rect
+ bg = TEAL if self.scan_button.enabled else _IDLE_BG
+ rl.draw_rectangle_rounded(r, 30 / (min(r.width, r.height) / 2), 10, bg)
+ self.scan_button.render()
+
+# ===== iq_maps =====
+
+MAP_PATH = Path(Paths.mapd_root()) / "offline"
+OFFLINE_TILES_PATH = offline_map_root() / "regions"
+
+_BOUNDS_BASE_URL = "https://raw.githubusercontent.com/pfeiferj/openpilot-mapd/main/"
+_REGION_PARAMS = ("OsmDownloadedDate", "OsmLocal", "OsmLocationName", "OsmLocationTitle", "OsmStateName", "OsmStateTitle")
+
+
+def _fmt_bytes(n: int) -> str:
+ return f"{n / 1024 ** 2:.2f} MB" if n < 1024 ** 3 else f"{n / 1024 ** 3:.2f} GB"
+
+
+def _tree_size(*roots: Path) -> int:
+ total = 0
+ pending = [p for p in roots if p.exists()]
+ while pending:
+ try:
+ for entry in os.scandir(pending.pop()):
+ if entry.is_file():
+ total += entry.stat().st_size
+ elif entry.is_dir():
+ pending.append(entry.path)
+ except OSError:
+ pass
+ return total
+
+
+class IQMapsLayout(Widget):
+ def __init__(self):
+ super().__init__()
+ self._current_percent = 0
+ self._last_sync = 0
+ self._mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else ui_state.params
+ self._build_rows()
+ self._refresh_disk_usage()
+ self._progress.set_visible(False)
+ self._tile_progress.set_visible(False)
+ self._state_btn.set_visible(False)
+ self._mapd_version.action_item.set_text(ui_state.params.get("MapdVersion") or "Loading...")
+ self._scroller = Scroller(self.items, line_separator=True, spacing=0)
+
+ def _build_rows(self):
+ self._mapd_version = text_item(tr("Routing Engine Version"), lambda: ui_state.params.get("MapdVersion") or "Loading...")
+ self._online_maps_toggle = toggle_item(
+ tr("Online On-Screen Maps"),
+ tr("Pull live Mapbox tiles for the on-screen map whenever the device has internet."),
+ param="OnlineOSMaps",
+ )
+ self._offline_maps_toggle = toggle_item(
+ tr("Offline On-Screen Maps"),
+ tr("Draw the on-screen map from tiles stored on the device. Combined with Online, stored tiles "
+ "take over the moment connectivity drops. Tiles come down with your selected region."),
+ param="OfflineOSMaps",
+ )
+ self._delete_maps_btn = IQListItem(tr("Stored Maps"), action_item=WideButtonAction(tr("DELETE"), enabled=True),
+ callback=self._confirm_wipe)
+ self._progress = progress_item(tr("Fetching Map"))
+ self._tile_progress = progress_item(tr("Downloading Map Tiles"))
+ self._update_btn = IQListItem(tr("Map Database"), action_item=WideButtonAction(tr("CHECK"), enabled=True),
+ callback=self._confirm_db_refresh)
+ self._country_btn = IQListItem(tr("Country"), action_item=WideButtonAction(tr("SELECT"), enabled=True),
+ callback=lambda: self._open_region_picker("Country"))
+ self._state_btn = IQListItem(tr("State"), action_item=WideButtonAction(tr("SELECT"), enabled=True),
+ callback=lambda: self._open_region_picker("State"))
+
+ self.items = [self._mapd_version, self._online_maps_toggle, self._offline_maps_toggle, self._delete_maps_btn,
+ self._progress, self._tile_progress, self._update_btn, self._country_btn, self._state_btn]
+
+ # -- disk usage ---------------------------------------------------------------
+ def _refresh_disk_usage(self):
+ def worker():
+ self._delete_maps_btn.action_item.set_value(_fmt_bytes(_tree_size(MAP_PATH, OFFLINE_TILES_PATH)))
+ threading.Thread(target=worker, daemon=True).start()
+
+ # -- wipe ---------------------------------------------------------------------
+ def _confirm_wipe(self):
+ self._ask(tr("This will delete ALL downloaded maps\n\nAre you sure you want to delete all maps?"),
+ tr("Yes, delete all maps"), self._start_wipe)
+
+ def _start_wipe(self):
+ self._delete_maps_btn.action_item.set_enabled(False)
+ self._delete_maps_btn.action_item.set_text(tr("REMOVING..."))
+ threading.Thread(target=self._wipe_worker, daemon=True).start()
+
+ def _wipe_worker(self):
+ for root in (MAP_PATH, OFFLINE_TILES_PATH):
+ if root.exists():
+ shutil.rmtree(root)
+ for param in _REGION_PARAMS:
+ ui_state.params.remove(param)
+ self._delete_maps_btn.action_item.set_enabled(True)
+ self._delete_maps_btn.action_item.set_text(tr("DELETE"))
+ self._refresh_disk_usage()
+
+ # -- database download ----------------------------------------------------------
+ @staticmethod
+ def _ask(msg, confirm_text, then):
+ gui_app.set_modal_overlay(ConfirmDialog(msg, confirm_text),
+ lambda res: then() if res == DialogResult.CONFIRM else None)
+
+ def _confirm_db_refresh(self):
+ self._ask(tr("This will start the download process and it might take a while to complete."),
+ tr("Start Download"), self._request_db_download)
+
+ def _request_db_download(self):
+ ui_state.params.put_bool("OsmDbUpdatesCheck", True)
+ nations = [c] if (c := ui_state.params.get("OsmLocationName") or "") else []
+ states = [s] if (s := ui_state.params.get("OsmStateName") or "") else []
+ if "US" in nations and states:
+ # a state list replaces the whole-US download; "All" is just the marker for every state
+ if any(x.lower() == "all" for x in states):
+ states = [x for x in states if x.lower() != "all"]
+ else:
+ nations.remove("US")
+ self._mem_params.put("OSMDownloadLocations", {"nations": nations, "states": states})
+
+ # -- region picker ---------------------------------------------------------------
+ def _open_region_picker(self, region_type):
+ btn = self._country_btn if region_type == "Country" else self._state_btn
+ btn.action_item.set_enabled(False)
+ btn.action_item.set_text(tr("LOADING..."))
+ threading.Thread(target=self._region_picker_worker, args=(region_type, btn), daemon=True).start()
+
+ @staticmethod
+ def _fetch_regions(region_type):
+ url = _BOUNDS_BASE_URL + ("nation_bounding_boxes.json" if region_type == "Country" else "us_states_bounding_boxes.json")
+ try:
+ data = requests.get(url, timeout=10).json()
+ return sorted((PickerItem(ref=k, data={'display_name': v['full_name']}) for k, v in data.items()),
+ key=lambda n: n.data['display_name'])
+ except Exception:
+ return []
+
+ def _region_picker_worker(self, region_type, btn):
+ locations = self._fetch_regions(region_type)
+ if region_type == "State":
+ locations.insert(0, PickerItem(ref="All", data={'display_name': tr("All states (~6.0 GB)")}))
+
+ btn.action_item.set_enabled(True)
+ btn.action_item.set_text(tr("SELECT"))
+
+ key = "OsmLocation" if region_type == "Country" else "OsmState"
+ current = ui_state.params.get(f"{key}Name") or ""
+ dialog = PickerDialog(tr(f"Select {region_type}"), [PickerGroup(folder="", nodes=locations)],
+ current_ref=current, search_prompt=tr("Perform a search"))
+ done = lambda res: self._on_region_picked(region_type, locations, key, res, dialog.selection_ref) # noqa: E731
+ dialog.on_exit = done
+ gui_app.set_modal_overlay(dialog, callback=done)
+
+ def _on_region_picked(self, region_type, locations, key, res, ref):
+ if res != DialogResult.CONFIRM or not ref:
+ # cancelling the state picker right after choosing US leaves a half-configured selection — undo it
+ if region_type == "State" and res == DialogResult.CANCEL:
+ if ui_state.params.get("OsmLocationName") == "US" and not ui_state.params.get("OsmStateName"):
+ for param in ("OsmLocationName", "OsmLocationTitle", "OsmLocal"):
+ ui_state.params.remove(param)
+ self._sync_rows()
+ return
+
+ if region_type == "Country":
+ ui_state.params.put_bool("OsmLocal", True)
+ ui_state.params.remove("OsmStateName")
+ ui_state.params.remove("OsmStateTitle")
+
+ ui_state.params.put(f"{key}Name", ref)
+ title = next((n.data['display_name'] for n in locations if n.ref == ref), ref)
+ ui_state.params.put(f"{key}Title", title)
+
+ if ref == "US" and region_type == "Country":
+ self._open_region_picker("State")
+ else:
+ self._confirm_db_refresh()
+
+ # -- progress sync -----------------------------------------------------------------
+ def _sync_tile_progress(self):
+ if not self._mem_params.get("OfflineTilesDownloadRequest"):
+ self._tile_progress.set_visible(False)
+ return
+ device._reset_interactive_timeout()
+ self._refresh_disk_usage()
+ self._tile_progress.set_visible(True)
+ progress = self._mem_params.get("OfflineTilesDownloadProgress") or {}
+ total = progress.get("total_bytes", 0)
+ done = progress.get("downloaded_bytes", 0)
+ if total > 0:
+ pct = max(0.0, min(100.0, done / total * 100.0))
+ self._tile_progress.action_item.update(pct, f"{int(pct)}% - Downloading Map Tiles", show_progress=True)
+ else:
+ self._tile_progress.action_item.update(0.0, tr("Preparing Map Tiles..."), show_progress=False)
+
+ def _sync_db_progress(self, downloading: bool):
+ self._progress.set_visible(True)
+ progress = ui_state.params.get("OSMDownloadProgress") or {}
+ total = progress.get('total_files', 0)
+ done = progress.get('downloaded_files', 0)
+ failed = total > 0 and not downloading and done < total
+
+ if failed:
+ self._current_percent = 0.0
+ bar_text, btn_text = "0% - Downloading Maps", tr("Download failed — try again.")
+ elif total > 0 and downloading:
+ self._current_percent = max(0.0, min(100.0, done / total * 100.0))
+ pct = int(self._current_percent)
+ bar_text, btn_text = f"{pct}% - Downloading Maps", f"{done}/{total} ({pct}%)"
+ else:
+ self._current_percent = 0.0
+ bar_text, btn_text = "0% - Downloading Maps", tr("Fetching Maps...")
+
+ self._progress.action_item.update(self._current_percent, bar_text,
+ show_progress=total > 0 and downloading and not failed)
+ self._update_btn.action_item.set_value(btn_text)
+
+ def _set_rows_busy(self, busy: bool):
+ for row in (self._update_btn, self._country_btn, self._state_btn, self._delete_maps_btn):
+ row.action_item.set_enabled(not busy)
+
+ def _sync_rows(self):
+ downloading = bool(self._mem_params.get("OSMDownloadLocations"))
+ self._sync_tile_progress()
+ self._country_btn.set_enabled(not downloading)
+ self._state_btn.set_enabled(not downloading)
+ self._state_btn.set_visible(ui_state.params.get("OsmLocationName") == "US")
+ self._update_btn.set_visible(bool(ui_state.params.get("OsmLocationName")))
+ self._country_btn.action_item.set_value(ui_state.params.get("OsmLocationTitle") or "")
+ self._state_btn.action_item.set_value(ui_state.params.get("OsmStateTitle") or "")
+
+ if downloading or ui_state.params.get_bool("OsmDbUpdatesCheck"):
+ if downloading:
+ device._reset_interactive_timeout()
+ self._refresh_disk_usage()
+ self._sync_db_progress(downloading)
+ self._set_rows_busy(downloading) # TODO-IQ: introduce CANCEL database download with mapd
+ return
+
+ self._progress.set_visible(False)
+ self._set_rows_busy(False)
+
+ dt = None
+ if ts := ui_state.params.get("OsmDownloadedDate"):
+ try:
+ if float(ts) > 0:
+ dt = datetime.datetime.fromtimestamp(float(ts), tz=datetime.UTC)
+ except (ValueError, TypeError):
+ dt = None
+ self._update_btn.action_item.set_value(tr("Checked {}").format(time_ago(dt)))
+
+ def _update_state(self):
+ now = monotonic()
+ if now - self._last_sync >= 1.0:
+ self._last_sync = now
+ self._sync_rows()
+
+ def _render(self, rect):
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._scroller.show_event()
+
+# ===== lane_change_settings =====
+
+_TIMER_LABELS = {
+ -1: lambda: tr("Off"),
+ 0: lambda: tr("Nudge"),
+ 1: lambda: tr("No Nudge"),
+ 2: lambda: f"0.5 {tr('s')}",
+ 3: lambda: f"1 {tr('s')}",
+ 4: lambda: f"2 {tr('s')}",
+ 5: lambda: f"3 {tr('s')}",
+}
+
+
+class LaneChangeSettingsLayout(Widget):
+ def __init__(self, back_btn_callback: Callable):
+ super().__init__()
+ self._back_button = NavButton(tr("Back"))
+ self._back_button.set_click_callback(back_btn_callback)
+ self._scroller = Scroller(self._build_rows(), line_separator=False, spacing=0)
+
+ def _build_rows(self):
+ self._lane_change_timer = option_item(
+ title=lambda: tr("Blinker-Initiated Lane Change"),
+ param="IQLaneChangeTimer",
+ description=lambda: tr("Delay before a blinker-triggered lane change starts on its own — no wheel nudge "
+ "needed once a delay is set (default is Nudge). Use the blinker for this only "
+ "when traffic and the road actually allow the maneuver."),
+ min_value=-1, max_value=5, value_change_step=1,
+ label_callback=lambda x: _TIMER_LABELS[int(x)](),
+ )
+ self._bsm_delay = toggle_item(
+ param="IQLaneChangeBsmDelay",
+ title=lambda: tr("Hold Lane Change for Blind Spot"),
+ description=lambda: tr("Hold the automatic lane change while blind spot monitoring reports a car in the "
+ "target lane, releasing it once the lane is clear."),
+ )
+ self._continuous = toggle_item(
+ param="LaneChangeContinuous",
+ title=lambda: tr("Auto Lane Change: Continuous Changes"),
+ description=lambda: tr("Normally one maneuver ends the lane change even with the blinker held. Turn this on "
+ "to chain further changes while the blinker stays on — each follow-up still wants a "
+ "wheel nudge."),
+ )
+ return [
+ self._lane_change_timer,
+ IQLineSeparator(40),
+ self._bsm_delay,
+ IQLineSeparator(40),
+ self._continuous,
+ ]
+
+ def _update_state(self):
+ super()._update_state()
+ has_bsm = bool(ui_state.CP and ui_state.CP.enableBsm)
+ if not has_bsm and ui_state.params.get_bool("IQLaneChangeBsmDelay"):
+ ui_state.params.remove("IQLaneChangeBsmDelay")
+ timer_armed = ui_state.params.get("IQLaneChangeTimer", return_default=True) > AutoLaneChangeMode.NUDGE
+ self._bsm_delay.action_item.set_enabled(has_bsm and timer_armed)
+
+ def _render(self, rect):
+ self._back_button.set_position(self._rect.x, self._rect.y + 20)
+ self._back_button.render()
+ below_button = self._back_button.rect.height + 40
+ self._scroller.render(rl.Rectangle(rect.x, rect.y + below_button, rect.width, rect.height - below_button))
+
+ def show_event(self):
+ self._scroller.show_event()
+
+# ===== sab_settings =====
+
+# (segment label, explanation) — order matches the AolSteeringMode param values
+SAB_BRAKE_RESPONSE_OPTIONS = [
+ (tr("Stay Engaged"), tr_noop("Remain Active: braking never interrupts steering assistance.")),
+ (tr("Standby"), tr_noop("Standby: braking parks steering assistance; it rejoins once you're off the pedal.")),
+ (tr("Disengage"), tr_noop("Disengage: braking shuts steering assistance off entirely.")),
+]
+
+_MODE_DISENGAGE = 2
+_MODE_STANDBY = 1
+
+SAB_AVAILABILITY_DESC = tr("Note: on cars lacking an LFA/LKAS button, turning this off keeps steering assistance "
+ "from arming as cruise availability flips.")
+SAB_DRIVER_INTERVENTION_DESC = tr("Pick what a brake-pedal press does to steering assistance.")
+DEFAULT_TO_OFF = tr("Locked OFF on this platform; the vehicle can't support other choices.")
+STATUS_DISENGAGE_ONLY = tr("This platform is limited to Disengage mode.")
+
+
+class SabSettingsLayout(Widget):
+ def __init__(self, back_btn_callback: Callable):
+ super().__init__()
+ self._back_button = NavButton(tr("Back"))
+ self._back_button.set_click_callback(back_btn_callback)
+ self._scroller = Scroller(self._build_rows(), line_separator=True, spacing=0)
+
+ def _build_rows(self):
+ self._main_cruise_toggle = toggle_item(
+ title=lambda: tr("Availability While Cruise Changes"),
+ description=SAB_AVAILABILITY_DESC,
+ param="AolMainCruiseAllowed",
+ )
+ self._disengage_on_brake_toggle = toggle_item(
+ title=lambda: tr("Driver Intervention Handling"),
+ description=SAB_DRIVER_INTERVENTION_DESC,
+ initial_state=False,
+ callback=self._on_brake_shortcut_toggled,
+ )
+ self._steering_mode = multiple_button_item(
+ param="AolSteeringMode",
+ title=lambda: tr("Brake Response Mode"),
+ description="",
+ buttons=[label for label, _ in SAB_BRAKE_RESPONSE_OPTIONS],
+ inline=False,
+ button_width=350,
+ callback=self._refresh_mode_description,
+ )
+ return [self._main_cruise_toggle, self._disengage_on_brake_toggle, self._steering_mode]
+
+ # -- platform capability ----------------------------------------------------
+ @staticmethod
+ def _has_limited_sab_options() -> bool:
+ brand = ""
+ if ui_state.is_offroad():
+ if bundle := ui_state.params.get("CarPlatformBundle"):
+ brand = bundle.get("brand", "")
+ if not brand and ui_state.CP:
+ brand = ui_state.CP.brand
+ return brand == "rivian"
+
+ # -- interactions -------------------------------------------------------------
+ def _on_brake_shortcut_toggled(self, enabled: bool):
+ """The 'Driver Intervention' toggle is a shortcut between Disengage and Standby."""
+ current = int(ui_state.params.get("AolSteeringMode", return_default=True))
+ if enabled:
+ target = _MODE_DISENGAGE
+ elif current == _MODE_DISENGAGE:
+ target = _MODE_STANDBY
+ else:
+ return
+ ui_state.params.put("AolSteeringMode", target)
+ self._steering_mode.action_item.set_selected_button(target)
+
+ def _refresh_mode_description(self, selected: int):
+ lines = [tr("Pick how steering assistance reacts once the driver brakes in IQ.Pilot."), ""]
+ for i, (_, blurb) in enumerate(SAB_BRAKE_RESPONSE_OPTIONS):
+ text = tr(blurb)
+ lines.append(f"{text} " if i == selected else text)
+ self._steering_mode.set_description(" ".join(lines))
+ self._steering_mode.show_description(True)
+
+ # -- state sync ---------------------------------------------------------------
+ def _apply_limited_platform(self):
+ ui_state.params.remove("AolMainCruiseAllowed")
+ ui_state.params.put_bool("AolUnifiedEngagementMode", True)
+ ui_state.params.put("AolSteeringMode", _MODE_DISENGAGE)
+
+ self._main_cruise_toggle.action_item.set_enabled(False)
+ self._main_cruise_toggle.action_item.set_state(False)
+ self._main_cruise_toggle.set_description(f"{DEFAULT_TO_OFF} {SAB_AVAILABILITY_DESC}")
+
+ self._disengage_on_brake_toggle.action_item.set_enabled(False)
+ self._disengage_on_brake_toggle.action_item.set_state(True)
+ self._disengage_on_brake_toggle.set_description(STATUS_DISENGAGE_ONLY)
+
+ self._steering_mode.action_item.set_enabled(False)
+ self._steering_mode.set_description(STATUS_DISENGAGE_ONLY)
+ self._steering_mode.action_item.set_selected_button(_MODE_DISENGAGE)
+
+ def _apply_full_platform(self):
+ self._main_cruise_toggle.action_item.set_enabled(True)
+ self._main_cruise_toggle.set_description(SAB_AVAILABILITY_DESC)
+ self._disengage_on_brake_toggle.action_item.set_enabled(True)
+ self._disengage_on_brake_toggle.set_description(SAB_DRIVER_INTERVENTION_DESC)
+ self._steering_mode.action_item.set_enabled(True)
+
+ def _update_state(self):
+ super()._update_state()
+ if ui_state.params.get_bool("AolEnabled"):
+ ui_state.params.put_bool("AolUnifiedEngagementMode", True)
+
+ current = int(ui_state.params.get("AolSteeringMode", return_default=True))
+ self._disengage_on_brake_toggle.action_item.set_state(current == _MODE_DISENGAGE)
+ self._refresh_mode_description(self._steering_mode.action_item.get_selected_button())
+
+ if self._has_limited_sab_options():
+ self._apply_limited_platform()
+ else:
+ self._apply_full_platform()
+
+ def _render(self, rect):
+ self._back_button.set_position(self._rect.x, self._rect.y + 20)
+ self._back_button.render()
+ below_button = self._back_button.rect.height + 40
+ self._scroller.render(rl.Rectangle(rect.x, rect.y + below_button, rect.width, rect.height - below_button))
+
+ def show_event(self):
+ self._scroller.show_event()
+
+# ===== steering =====
+
+class PanelType(IntEnum):
+ STEERING = 0
+ SAB = 1
+ LANE_CHANGE = 2
+
+
+class SteeringLayout(Widget):
+ def __init__(self):
+ super().__init__()
+
+ self._current_panel = PanelType.STEERING
+ self._lane_change_settings_layout = LaneChangeSettingsLayout(lambda: self._set_current_panel(PanelType.STEERING))
+ self._sab_settings_layout = SabSettingsLayout(lambda: self._set_current_panel(PanelType.STEERING))
+
+ items = self._initialize_items()
+ self._scroller = Scroller(items, line_separator=False, spacing=0)
+
+ for ctrl, key in [(self._lane_turn_value_control, "IQLaneTurnValue"), (self._delay_control, "IQSoftwareSteerDelay")]:
+ ctrl.action_item.set_value(int(float(ui_state.params.get(key, return_default=True)) * 100))
+
+ def _initialize_items(self):
+ self._aol_base_desc = tr("Enable Always on Lateral (AOL). Disable this toggle to return to stock IQ.Pilot steering engagement behavior.")
+ self._sab_limited_desc = tr("This platform supports a limited set of steering assistance behavior options.")
+ self._sab_full_desc = tr("This platform supports the full steering assistance behavior configuration.")
+ self._sab_check_compat_desc = tr("Start the vehicle to check steering assistance behavior compatibility.")
+
+ self._aol_toggle = toggle_item(
+ param="AolEnabled",
+ title=lambda: tr("Always on Lateral (AOL)"),
+ description=self._aol_base_desc,
+ )
+ self._aol_settings_button = simple_button_item(
+ button_text=lambda: tr("Steering Assistance Behavior"),
+ button_width=800,
+ callback=lambda: self._set_current_panel(PanelType.SAB)
+ )
+ self._lane_change_settings_button = simple_button_item(
+ button_text=lambda: tr("Lane Change Options"),
+ button_width=800,
+ callback=lambda: self._set_current_panel(PanelType.LANE_CHANGE)
+ )
+ self._nnff_toggle = toggle_item(
+ param="NeuralNetworkFeedForward",
+ title=lambda: tr("Neural Network Feed Forward (NNFF)"),
+ description=""
+ )
+ self._lane_turn_desire_toggle = toggle_item(
+ tr("Low-Speed Turn Planning"),
+ tr("If you're driving at 20 mph (32 km/h) or below and have your blinker on,"
+ " the car will plan a turn in that direction at the nearest drivable path."
+ " This prevents situations (like at red lights) where the car might plan the wrong turn direction."),
+ param="IQLaneTurnDesire"
+ )
+ self._lane_turn_value_control = option_item(
+ tr("Adjust Lane Turn Desire Speed"), "IQLaneTurnValue", 500, 2000,
+ tr("Sets the speed threshold used by Lane Turn Desires. Below this value, turn desires can plan into the nearest drivable turn path. Default is 19 mph."),
+ int(round(100 / CV.MPH_TO_KPH)), None, True, "", style.BUTTON_ACTION_WIDTH, None, True,
+ lambda v: f"{int(round(v * (CV.MPH_TO_KPH if ui_state.is_metric else 1)))}"
+ f" {'km/h' if ui_state.is_metric else 'mph'}"
+ )
+ self._steer_delay_toggle = toggle_item(tr("Self-Tuning Steer Delay"), "", param="IQLiveSteerDelay")
+ self._delay_control = option_item(
+ tr("Manual Delay Offset"), "IQSoftwareSteerDelay", 5, 50,
+ tr("How much lead time to add on top of the car's own steering rack delay while self-tuning is off. Default is 0.2 s."),
+ 1, None, True, "", style.BUTTON_ACTION_WIDTH, None, True, lambda v: f"{float(v):.2f}s"
+ )
+
+ items = [
+ self._aol_toggle,
+ self._nnff_toggle,
+ IQLineSeparator(40),
+ self._aol_settings_button,
+ IQLineSeparator(40),
+ self._lane_change_settings_button,
+ IQLineSeparator(40),
+ self._lane_turn_desire_toggle,
+ self._lane_turn_value_control,
+ IQLineSeparator(40),
+ self._steer_delay_toggle,
+ self._delay_control,
+ ]
+ return items
+
+ def _set_current_panel(self, panel: PanelType):
+ self._current_panel = panel
+
+ def _update_state(self):
+ super()._update_state()
+
+ steering_supported = True
+ if ui_state.CP is not None:
+ sab_desc = self._sab_limited_desc if self._sab_settings_layout._has_limited_sab_options() else self._sab_full_desc
+ self._aol_toggle.set_description(f"{sab_desc} {self._aol_base_desc}")
+
+ if ui_state.CP.steerControlType == car.CarParams.SteerControlType.angle:
+ ui_state.params.remove("NeuralNetworkFeedForward")
+ steering_supported = False
+ else:
+ self._aol_toggle.set_description(f"{self._sab_check_compat_desc} {self._aol_base_desc}")
+ ui_state.params.remove("NeuralNetworkFeedForward")
+ steering_supported = False
+
+ self._aol_toggle.action_item.set_enabled(ui_state.is_offroad())
+ self._aol_settings_button.action_item.set_enabled(ui_state.is_offroad() and self._aol_toggle.action_item.get_state())
+ self._nnff_toggle.action_item.set_enabled(ui_state.is_offroad() and steering_supported)
+
+ turn_desire = ui_state.params.get_bool("IQLaneTurnDesire")
+ live_delay = ui_state.params.get_bool("IQLiveSteerDelay")
+ self._lane_turn_desire_toggle.action_item.set_state(turn_desire)
+ self._lane_turn_value_control.set_visible(turn_desire)
+ self._steer_delay_toggle.action_item.set_state(live_delay)
+ self._delay_control.set_visible(not live_delay)
+ new_step = int(round(100 / CV.MPH_TO_KPH)) if ui_state.is_metric else 100
+ if self._lane_turn_value_control.action_item.value_change_step != new_step:
+ self._lane_turn_value_control.action_item.value_change_step = new_step
+ delay_desc = tr("Let IQ.Pilot measure how long your steering takes to respond and keep that figure up to date. "
+ "Switch it off to pin the timing yourself.")
+ if live_delay:
+ delay_desc += f" {tr('Measured:')} {ui_state.sm['liveDelay'].lateralDelay:.3f} s"
+ elif ui_state.CP:
+ sw = float(ui_state.params.get("IQSoftwareSteerDelay", "0.2"))
+ cp = ui_state.CP.steerActuatorDelay
+ delay_desc += f" {tr('Rack:')} {cp:.2f} s + {tr('Offset:')} {sw:.2f} s = {tr('Total:')} {cp + sw:.2f} s"
+ self._steer_delay_toggle.set_description(delay_desc)
+
+ def _render(self, rect):
+ if self._current_panel == PanelType.LANE_CHANGE:
+ self._lane_change_settings_layout.render(rect)
+ elif self._current_panel == PanelType.SAB:
+ self._sab_settings_layout.render(rect)
+ else:
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._set_current_panel(PanelType.STEERING)
+ self._scroller.show_event()
+
+
+# ===== cruise =====
+
+class CruiseLayout(Widget):
+ def __init__(self):
+ super().__init__()
+ self._params = Params()
+ self._scroller = Scroller(self._initialize_items(), line_separator=True, spacing=0)
+
+ @staticmethod
+ def _toggle_item(title: str, description: str, param: str):
+ return IQListItem(
+ title=lambda: tr(title),
+ description=lambda: tr(description),
+ action_item=IQToggleAction(initial_state=Params().get_bool(param), callback=lambda state: Params().put_bool(param, state), param=param),
+ )
+
+ @staticmethod
+ def _mode_item(title: str, description: str, param: str, labels: list[str], width: int, inline: bool = False):
+ return IQListItem(
+ title=lambda: tr(title),
+ description=lambda: tr(description),
+ action_item=IQMultipleButtonAction(buttons=[lambda s=s: tr(s) for s in labels], button_width=width, param=param),
+ inline=inline,
+ )
+
+ @staticmethod
+ def _option_item(title: str, description: str, param: str, minimum: int, maximum: int, step: int = 1,
+ label_callback=None, use_float_scaling: bool = False):
+ return IQListItem(
+ title=lambda: tr(title),
+ description=lambda: tr(description),
+ action_item=OptionControl(
+ param=param,
+ min_value=minimum,
+ max_value=maximum,
+ value_change_step=step,
+ use_float_scaling=use_float_scaling,
+ label_callback=label_callback,
+ ),
+ )
+
+ def _initialize_items(self):
+ ms_to_mph = 2.23694
+
+ def speed_label(value: float | int) -> str:
+ return f"{int(round(value * ms_to_mph))} mph"
+
+ def seconds_label(value: float | int) -> str:
+ return f"{float(value):.1f}s"
+
+ def distance_label(value: float | int) -> str:
+ value = int(value)
+ return "Stock" if value == 0 else f"{value:+d} m"
+
+ items = [
+ IQListItem(title=lambda: tr("Speed Limit Control"), description="", action_item=None, inline=True,
+ title_color=rl.Color(16, 185, 169, 255)),
+ IQLineSeparator(20),
+ self._mode_item(
+ "IQ Speed Limit Mode",
+ "Choose how IQ.Pilot handles speed limit data. Control adjusts cruise speed. Warning only highlights overspeed.",
+ "IQSpeedAssistMode",
+ ["Off", "Info", "Warn", "Control"],
+ 180,
+ ),
+ self._mode_item(
+ "IQ SLC Policy",
+ "Select how IQ.Pilot resolves conflicting speed limit sources.",
+ "SLCPolicy",
+ ["Map", "Priority", "Combined"],
+ 180,
+ ),
+ self._toggle_item(
+ "IQ SLC Confirm Higher",
+ "Require confirmation before IQ.Pilot accepts a higher detected speed limit.",
+ "SpeedLimitConfirmationHigher",
+ ),
+ self._toggle_item(
+ "IQ SLC Confirm Lower",
+ "Require confirmation before IQ.Pilot accepts a lower detected speed limit.",
+ "SpeedLimitConfirmationLower",
+ ),
+ self._toggle_item(
+ "IQ SLC Auto Confirm",
+ "Automatically accept speed limit changes after a 5-second timeout without requiring a cruise button press.",
+ "SLCAutoConfirm",
+ ),
+ self._toggle_item(
+ "IQ SLC Fallback Set Speed",
+ "If no speed limit is available, use the current set speed as the controller target.",
+ "SLCFallbackSetSpeed",
+ ),
+ self._toggle_item(
+ "IQ SLC Fallback Previous",
+ "If a new limit is denied, reuse the previous accepted speed limit when possible.",
+ "SLCFallbackPreviousSpeedLimit",
+ ),
+ self._toggle_item(
+ "IQ SLC Fallback Experimental",
+ "When no speed limit is available, let IQ.Dynamic request experimental longitudinal behavior.",
+ "SLCFallbackExperimentalMode",
+ ),
+ self._toggle_item(
+ "IQ SLC Online Filler",
+ "Use online sources (TomTom + Mapbox) to fill in missing speed limits when local map data is unavailable.",
+ "SLCOnlineFiller",
+ ),
+ self._option_item(
+ "IQ Map Lookahead Higher",
+ "How far ahead IQ.Pilot should apply an upcoming higher map speed limit before the limit changes.",
+ "MapSpeedLookaheadHigher",
+ 100,
+ 1000,
+ step=50,
+ use_float_scaling=True,
+ label_callback=seconds_label,
+ ),
+ self._option_item(
+ "IQ Map Lookahead Lower",
+ "How far ahead IQ.Pilot should apply an upcoming lower map speed limit before the limit changes.",
+ "MapSpeedLookaheadLower",
+ 100,
+ 1000,
+ step=50,
+ use_float_scaling=True,
+ label_callback=seconds_label,
+ ),
+ IQLineSeparator(60),
+ IQListItem(title=lambda: tr("IQ.Dynamic"), description="", action_item=None, inline=True,
+ title_color=rl.Color(16, 185, 169, 255)),
+ IQLineSeparator(20),
+ self._toggle_item(
+ "IQ.Dynamic Curves",
+ "Allow IQ.Dynamic to enter blended control for curves and strong vision slowdown cues.",
+ "IQDynamicConditionalCurves",
+ ),
+ self._toggle_item(
+ "IQ.Dynamic Slower Lead",
+ "Allow IQ.Dynamic to switch toward blended control when a slower lead vehicle is detected.",
+ "IQDynamicConditionalSlowerLead",
+ ),
+ self._toggle_item(
+ "IQ.Dynamic Stopped Lead",
+ "Allow IQ.Dynamic to react more aggressively when a lead vehicle is nearly stopped.",
+ "IQDynamicConditionalStoppedLead",
+ ),
+ self._toggle_item(
+ "IQ.Dynamic Model Stops",
+ "Allow IQ.Dynamic to switch toward blended control for stop-sign and stop-light style vision stops.",
+ "IQDynamicConditionalModelStops",
+ ),
+ self._toggle_item(
+ "IQ.Dynamic SLC Fallback",
+ "Allow IQ.Dynamic to request blended control when Speed Limit Controller has no usable target.",
+ "IQDynamicConditionalSLCFallback",
+ ),
+ self._option_item(
+ "IQ.Dynamic Low Speed",
+ "Below this speed, IQ.Dynamic prefers blended control when no lead is present.",
+ "IQDynamicConditionalSpeed",
+ 500,
+ 3500,
+ step=50,
+ use_float_scaling=True,
+ label_callback=speed_label,
+ ),
+ self._option_item(
+ "IQ.Dynamic Lead Speed",
+ "Below this speed, IQ.Dynamic prefers blended control even with a tracked lead.",
+ "IQDynamicConditionalLeadSpeed",
+ 500,
+ 4000,
+ step=50,
+ use_float_scaling=True,
+ label_callback=speed_label,
+ ),
+ self._option_item(
+ "IQ.Dynamic Model Stop Time",
+ "Sets the vision stop prediction time horizon used by IQ.Dynamic and IQ Force Stops. Shorter values react later. Longer values react earlier.",
+ "IQDynamicModelStopTime",
+ 100,
+ 600,
+ step=25,
+ use_float_scaling=True,
+ label_callback=seconds_label,
+ ),
+ self._toggle_item(
+ "IQ Force Stops",
+ "Bring the car to a complete stop for stop signs and stop lights, and feather the brake in the final meters of "
+ "every stop so it settles gently instead of rocking on its suspension. Yields full braking authority when a lead "
+ "is close. Override with the accelerator.",
+ "IQForceStops",
+ ),
+ self._option_item(
+ "IQ Custom Stop Distance",
+ "Nudge how far back IQ.Pilot stops behind a stopped lead vehicle or a model-held stop (red light). Positive "
+ "stops further back, negative settles in closer. Works whether IQ Force Stops is on or off.",
+ "IQCustomStopDistance",
+ -2,
+ 2,
+ step=1,
+ label_callback=distance_label,
+ ),
+ ]
+ return items
+
+ def _render(self, rect):
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._scroller.show_event()
+
+
+# ===== developer =====
+
+class IQDeveloperLayout(DeveloperLayout):
+ def __init__(self):
+ super().__init__()
+ self.error_log_path = os.path.join(Paths.crash_log_root(), "error.log")
+ self._is_release_branch: bool = self._is_release or ui_state.params.get_bool("IsReleaseIqBranch")
+ self._is_development_branch: bool = ui_state.params.get_bool("IsTestedBranch") or ui_state.params.get_bool("IsDevelopmentBranch")
+ self._initialize_items()
+
+ for item in self.items:
+ self._scroller.add_widget(item)
+
+ def _initialize_items(self):
+ self.error_log_btn = button_item(tr("Crash Log"), tr("VIEW"), tr("View the error log for IQ.Pilot crashes."), callback=self._on_error_log_clicked)
+
+ self.items: list = [self.error_log_btn]
+
+ def _on_delete_confirm(self, result):
+ if result == DialogResult.CONFIRM:
+ if os.path.exists(self.error_log_path):
+ os.remove(self.error_log_path)
+
+ def _on_error_log_closed(self, result, log_exists):
+ if result == DialogResult.CONFIRM and log_exists:
+ dialog2 = ConfirmDialog(tr("Delete this log?"), tr("Yes"), tr("No"), rich=False)
+ gui_app.set_modal_overlay(dialog2, callback=self._on_delete_confirm)
+
+ def _on_error_log_clicked(self):
+ text = ""
+ if os.path.exists(self.error_log_path):
+ text = f"{datetime.datetime.fromtimestamp(os.path.getmtime(self.error_log_path)).strftime('%d-%b-%Y %H:%M:%S').upper()} "
+ try:
+ with open(self.error_log_path) as file:
+ text += file.read()
+ except Exception:
+ pass
+ dialog = NoticeModal(text=text, callback=lambda result: self._on_error_log_closed(result, os.path.exists(self.error_log_path)))
+ gui_app.set_modal_overlay(dialog)
+
+ def _update_state(self):
+ self.error_log_btn.set_visible(not self._is_release_branch)
+
+
+# ===== software =====
+
+UPDATES_DESCRIPTIONS = {
+ 'disable_updates_offroad': tr_noop(
+ "Turns off over-the-air update checks entirely.Reboot for this to take effect. "
+ ),
+ 'disable_updates_onroad': tr_noop(
+ "Put the device in Always Offroad, or shut the car down, before touching these."
+ ),
+ 'install_mode_offroad': tr_noop(
+ "Pick whether a ready update just waits for your go-ahead, or downloads and installs on its own."
+ ),
+ 'install_mode_onroad': tr_noop(
+ "Put the device in Always Offroad, or shut the car down, before changing how updates install."
+ )
+}
+
+INSTALL_MODE_DOWNLOAD_ONLY = "download_only"
+INSTALL_MODE_DOWNLOAD_AND_INSTALL = "download_and_install"
+INSTALL_MODE_OPTIONS = [
+ INSTALL_MODE_DOWNLOAD_ONLY,
+ INSTALL_MODE_DOWNLOAD_AND_INSTALL,
+]
+INSTALL_MODE_LABELS = {
+ INSTALL_MODE_DOWNLOAD_ONLY: tr_noop("Predownload Only"),
+ INSTALL_MODE_DOWNLOAD_AND_INSTALL: tr_noop("Predownload + Preinstall"),
+}
+
+
+class IQSoftwareLayout(SoftwareLayout):
+ def __init__(self):
+ super().__init__()
+ self.disable_updates_toggle = toggle_item(
+ lambda: tr("Pause Updates"),
+ description="",
+ initial_state=ui_state.params.get_bool("DisableUpdates"),
+ callback=self._on_disable_updates_toggled,
+ )
+ install_mode = ui_state.params.get("UpdaterInstallMode") or INSTALL_MODE_DOWNLOAD_AND_INSTALL
+ if install_mode not in INSTALL_MODE_OPTIONS:
+ install_mode = INSTALL_MODE_DOWNLOAD_AND_INSTALL
+ self._install_mode_dialog = None
+ self.install_mode_btn = button_item(
+ lambda: tr("Update Install Mode"),
+ lambda: tr("CHANGE"),
+ description="",
+ callback=self._on_change_install_mode,
+ )
+ self.install_mode_btn.action_item.set_value(tr(INSTALL_MODE_LABELS[install_mode]))
+ try:
+ os_version = HARDWARE.get_os_version() or "unknown"
+ except Exception:
+ os_version = "unknown"
+ self.iqos_version_item = text_item(lambda: tr("IQ.OS Version"), os_version)
+ self._scroller.add_widget(self.iqos_version_item)
+ self._scroller.add_widget(self.disable_updates_toggle)
+ self._scroller.add_widget(self.install_mode_btn)
+
+ def _handle_reboot(self, result):
+ if result == DialogResult.CONFIRM:
+ ui_state.params.put_bool("DisableUpdates", self.disable_updates_toggle.action_item.get_state())
+ ui_state.params.put_bool("DoReboot", True)
+ else:
+ self.disable_updates_toggle.action_item.set_state(ui_state.params.get_bool("DisableUpdates"))
+
+ def _on_disable_updates_toggled(self, enabled):
+ dialog = ConfirmDialog(tr("This needs a reboot to apply. Restart now?"), tr("Reboot"))
+ gui_app.set_modal_overlay(dialog, callback=self._handle_reboot)
+
+ def _on_change_install_mode(self):
+ current_mode = ui_state.params.get("UpdaterInstallMode") or INSTALL_MODE_DOWNLOAD_AND_INSTALL
+ if current_mode not in INSTALL_MODE_OPTIONS:
+ current_mode = INSTALL_MODE_DOWNLOAD_AND_INSTALL
+
+ labels = [tr(INSTALL_MODE_LABELS[mode]) for mode in INSTALL_MODE_OPTIONS]
+ current_label = tr(INSTALL_MODE_LABELS[current_mode])
+ self._install_mode_dialog = MultiOptionDialog(tr("Update Install Mode"), labels, current_label)
+
+ def handle_selection(result):
+ if result == DialogResult.CONFIRM and self._install_mode_dialog is not None and self._install_mode_dialog.selection:
+ selected_label = self._install_mode_dialog.selection
+ for mode in INSTALL_MODE_OPTIONS:
+ if selected_label == tr(INSTALL_MODE_LABELS[mode]):
+ ui_state.params.put("UpdaterInstallMode", mode)
+ self.install_mode_btn.action_item.set_value(selected_label)
+ break
+ self._install_mode_dialog = None
+
+ gui_app.set_modal_overlay(self._install_mode_dialog, callback=handle_selection)
+
+ def _on_uninstall(self):
+ def handle_uninstall_confirmation(result):
+ if result == DialogResult.CONFIRM:
+ ui_state.params.put_bool("DoUninstall", True)
+ gui_app.request_close()
+
+ dialog = ConfirmDialog(tr("Are you sure you want to uninstall?"), tr("Uninstall"))
+ gui_app.set_modal_overlay(dialog, callback=handle_uninstall_confirmation)
+
+ def _on_select_branch(self):
+ current_git_branch = ui_state.params.get("GitBranch") or ""
+ branches_str = ui_state.params.get("UpdaterAvailableBranches") or ""
+ branches = [b for b in branches_str.split(",") if b]
+ current_target = ui_state.params.get("UpdaterTargetBranch") or ""
+ top_level_branches = [current_git_branch, "release-mici", "release-tizi", "staging", "dev", "master"]
+
+ if HARDWARE.get_device_type() == "tici":
+ top_level_branches = ["release-new", "release-tici", "staging-tici"]
+ branches = [b for b in branches if b in ("release-new", "beta") or b.endswith("-tici")]
+
+ # single flat list: pinned branches first, then the rest alphabetically.
+ # prebuilt ("-prebuilt") branches are internal build outputs, not user-selectable.
+ pinned_nodes = [PickerItem(b, {'display_name': b}) for b in top_level_branches if b in branches]
+ other_nodes = [PickerItem(b, {'display_name': b}) for b in sorted(branches)
+ if b not in top_level_branches and not b.endswith("-prebuilt")]
+
+ folders = [PickerGroup("", pinned_nodes + other_nodes)]
+
+ def _on_branch_selected(result):
+ if result == DialogResult.CONFIRM and self._branch_dialog is not None:
+ selection = self._branch_dialog.selection_ref
+ if selection:
+ ui_state.params.put("UpdaterTargetBranch", selection)
+ self._branch_btn.action_item.set_value(selection)
+ os.system("pkill -SIGUSR1 -f system.updated.updated")
+ self._branch_dialog = None
+
+ self._branch_dialog = PickerDialog(tr("Select a branch"), folders, current_target, "",
+ on_exit=_on_branch_selected)
+
+ gui_app.set_modal_overlay(self._branch_dialog, callback=_on_branch_selected)
+
+ def _update_state(self):
+ super()._update_state()
+ self.disable_updates_toggle.action_item.set_enabled(ui_state.is_offroad())
+ self.disable_updates_toggle.set_visible(True)
+ self.install_mode_btn.action_item.set_enabled(ui_state.is_offroad())
+ self.install_mode_btn.set_visible(True)
+
+ disable_updates_desc = tr(UPDATES_DESCRIPTIONS["disable_updates_offroad"] if ui_state.is_offroad() else UPDATES_DESCRIPTIONS["disable_updates_onroad"])
+ self.disable_updates_toggle.set_description(disable_updates_desc)
+ install_mode_desc = tr(UPDATES_DESCRIPTIONS["install_mode_offroad"] if ui_state.is_offroad() else UPDATES_DESCRIPTIONS["install_mode_onroad"])
+ self.install_mode_btn.set_description(install_mode_desc)
+
+ install_mode = ui_state.params.get("UpdaterInstallMode") or INSTALL_MODE_DOWNLOAD_AND_INSTALL
+ if install_mode not in INSTALL_MODE_OPTIONS:
+ install_mode = INSTALL_MODE_DOWNLOAD_AND_INSTALL
+ self.install_mode_btn.action_item.set_value(tr(INSTALL_MODE_LABELS[install_mode]))
+
+ # While we've asked the updater to check but it hasn't responded yet, show an inline spinner
+ # instead of a stale value with a dead greyed-out button.
+ waiting = getattr(self, "_waiting_for_updater", False)
+ self._download_btn.action_item.set_loading(waiting)
+ if waiting:
+ self._download_btn.action_item.set_enabled(False)
+
+
+# ===== device =====
+
+# minutes the device may sit offroad before auto-shutdown, indexed by slider step
+_OFFROAD_SHUTDOWN_MINUTES = (0, 5, 10, 15, 30, 60, 120, 180, 300, 600, 1440, 1800)
+offroad_time_options = dict(enumerate(_OFFROAD_SHUTDOWN_MINUTES))
+
+FORCE_ONROAD_DURATION_SEC = 10 * 60
+FORCE_ONROAD_PARAM = "ForceOnroadUntil"
+
+
+class IQDeviceLayout(DeviceLayout):
+ MENU_ROOT = 0
+ MENU_SYSTEM = 1
+ MENU_MAINTENANCE = 2
+
+ def __init__(self):
+ DeviceLayout.__init__(self)
+ self._scroller._line_separator = None
+ self._submenu = self.MENU_ROOT
+
+ def _initialize_items(self):
+ DeviceLayout._initialize_items(self)
+
+ # Using dual button with no right button for better alignment
+ self._always_offroad_btn = self._left_button(lambda: tr("Keep Device Offroad"), self._handle_always_offroad)
+ self._force_onroad_btn = self._left_button(lambda: tr("Force On-Road (10 min)"), self._handle_force_onroad)
+
+ self._max_time_offroad = option_item(
+ title=lambda: tr("Offroad Shutdown Timer"),
+ description=lambda: tr("Powers the device down once it has sat this long with the engine off.\n(30h by default)"),
+ param="MaxTimeOffroad",
+ min_value=0,
+ max_value=11,
+ value_change_step=1,
+ on_value_changed=None,
+ enabled=True,
+ icon="",
+ value_map=offroad_time_options,
+ label_width=360,
+ use_float_scaling=False,
+ inline=True,
+ label_callback=self._update_max_time_offroad_label
+ )
+
+ self._device_wake_mode = multiple_button_item(
+ title=lambda: tr("Boot State"),
+ description=self.wake_mode_description,
+ param="DeviceBootMode",
+ buttons=[lambda: tr("Default"), lambda: tr("Offroad")],
+ button_width=364,
+ callback=None,
+ inline=True,
+ )
+ self._change_language_btn = button_item(lambda: tr("Change Language"), lambda: tr("CHANGE"), callback=self._show_language_dialog)
+
+ # Silent Mode moved to the settings-hub top bar (bell bubble); this is just the dcam preview now.
+ self._driver_camera_btn = button_item(lambda: tr("Driver Camera Check"), lambda: tr("PREVIEW"),
+ callback=self._show_driver_camera)
+
+ self._reg_and_training = dual_button_item(
+ left_text=lambda: tr("Regulatory"),
+ left_callback=self._on_regulatory,
+ right_text=lambda: tr("Training Guide"),
+ right_callback=self._on_review_training_guide
+ )
+ self._reg_and_training.action_item.right_button.set_button_style(ButtonStyle.NORMAL)
+
+ self._onroad_uploads_and_reset_settings = dual_button_item(
+ left_text=lambda: tr("Upload While Driving"),
+ left_callback=lambda: ui_state.params.put_bool("OnroadUploads", not ui_state.params.get_bool("OnroadUploads")),
+ right_text=lambda: tr("Restore Defaults"),
+ right_callback=self._reset_settings
+ )
+
+ self._power_buttons = dual_button_item(
+ left_text=lambda: tr("Reboot"),
+ right_text=lambda: tr("Power Off"),
+ left_callback=self._reboot_prompt,
+ right_callback=self._power_off_prompt
+ )
+
+ self._submenu_system_btn = self._section_button(lambda: tr("System"), "icons/iq/sec_system.png", self.MENU_SYSTEM)
+ self._submenu_maintenance_btn = self._section_button(lambda: tr("Maintenance"), "icons/iq/sec_maintenance.png", self.MENU_MAINTENANCE)
+ self._submenu_back_btn = self._left_button(lambda: tr("Back"), self._go_back)
+
+ self._submenu_top_separator = LineSeparator(height=10)
+ self._submenu_gap = Spacer(10)
+ self._submenu_bottom_separator = LineSeparator(height=10)
+ self._system_sep_a = LineSeparator()
+ self._system_sep_b = LineSeparator()
+ self._system_sep_c = LineSeparator()
+ self._system_sep_d = LineSeparator()
+
+ items = [
+ text_item(lambda: tr("Dongle ID"), self._params.get("DongleId") or (lambda: tr("N/A"))),
+ LineSeparator(),
+ text_item(lambda: tr("Serial"), self._params.get("HardwareSerial") or (lambda: tr("N/A"))),
+ self._system_sep_a,
+ self._reset_calib_btn,
+ self._system_sep_b,
+ self._change_language_btn,
+ self._system_sep_c,
+ self._device_wake_mode,
+ self._system_sep_d,
+ self._max_time_offroad,
+ self._submenu_top_separator,
+ self._submenu_system_btn,
+ self._submenu_maintenance_btn,
+ self._submenu_back_btn,
+ self._driver_camera_btn,
+ self._reg_and_training,
+ self._onroad_uploads_and_reset_settings,
+ self._submenu_gap,
+ self._submenu_bottom_separator,
+ self._power_buttons,
+ ]
+
+ return items
+
+ def _left_button(self, text, callback):
+ item = dual_button_item(left_text=text, left_callback=callback, right_text="", right_callback=None)
+ item.action_item.right_button.set_visible(False)
+ return item
+
+ def _section_button(self, text, icon, submenu):
+ item = self._left_button(text, lambda: self._set_submenu(submenu))
+ item.action_item.left_button = NavSectionButton(text, icon, lambda: self._set_submenu(submenu))
+ return item
+
+ def _set_submenu(self, submenu: int):
+ self._submenu = submenu
+ # Reset scroll so switching menus doesn't keep a now-invalid offset (which jumps the view).
+ self._scroller.scroll_panel.set_offset(0)
+
+ def _go_back(self):
+ self._set_submenu(self.MENU_ROOT)
+
+ def _offroad_transition(self):
+ self._power_buttons.action_item.right_button.set_visible(ui_state.is_offroad())
+
+ @staticmethod
+ def wake_mode_description() -> str:
+ def_str = tr("Default: comes up ready to drive, engagement available straight away.")
+ offrd_str = tr("Offroad: lands in Always Offroad every time it boots or wakes.")
+ header = tr("Sets which state the device settles into after a boot or a wake from sleep.")
+
+ return f"{header}\n\n{def_str}\n{offrd_str}"
+
+ @staticmethod
+ def _reset_settings():
+ def _do_reset(result: int):
+ if result == DialogResult.CONFIRM:
+ for _key in ui_state.params.all_keys():
+ ui_state.params.remove(_key)
+ HARDWARE.reboot()
+
+ def _second_confirm(result: int):
+ if result == DialogResult.CONFIRM:
+ gui_app.set_modal_overlay(ConfirmDialog(
+ text=tr("There's no undo once this runs — last chance to back out."),
+ confirm_text=tr("Confirm")
+ ), callback=_do_reset)
+
+ gui_app.set_modal_overlay(ConfirmDialog(
+ text=tr("Are you sure you want to reset all IQ.Pilot settings to default? Once the settings are reset, there is no going back."),
+ confirm_text=tr("Reset")
+ ), callback=_second_confirm)
+
+ @staticmethod
+ def _handle_always_offroad():
+ if ui_state.engaged:
+ gui_app.set_modal_overlay(alert_dialog(tr("Disengage before forcing offroad")))
+ return
+
+ _offroad_mode_state = ui_state.params.get_bool("IQAlwaysOffroad")
+ _offroad_mode_str = tr("Leave Always Offroad mode now?") if _offroad_mode_state else \
+ tr("Switch the device into Always Offroad mode?")
+
+ def _set_always_offroad(result: int):
+ if result == DialogResult.CONFIRM and not ui_state.engaged:
+ if _offroad_mode_state:
+ ui_state.params.put(FORCE_ONROAD_PARAM, 0)
+ ui_state.params.put_bool("IQAlwaysOffroad", not _offroad_mode_state)
+
+ gui_app.set_modal_overlay(ConfirmDialog(_offroad_mode_str, tr("Confirm")), callback=lambda result: _set_always_offroad(result))
+
+ @staticmethod
+ def _handle_force_onroad():
+ if ui_state.engaged:
+ gui_app.set_modal_overlay(alert_dialog(tr("Disengage before forcing on-road")))
+ return
+
+ if not ui_state.is_offroad():
+ gui_app.set_modal_overlay(alert_dialog(tr("Force On-Road can only be started while offroad")))
+ return
+
+ now = int(time.time())
+ force_onroad_until = ui_state.params.get(FORCE_ONROAD_PARAM, return_default=True)
+ is_active = force_onroad_until > now
+ if is_active:
+ prompt = tr("Force On-Road is already active. Reset the timer to 10 minutes?")
+ else:
+ prompt = tr("Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled automatically and it will return to offroad after the timer.")
+
+ def _set_force_onroad(result: int):
+ if result == DialogResult.CONFIRM and not ui_state.engaged:
+ # Force On-Road relies on Always Offroad being active so expiry returns to offroad.
+ ui_state.params.put_bool("IQAlwaysOffroad", True)
+ ui_state.params.put(FORCE_ONROAD_PARAM, int(time.time()) + FORCE_ONROAD_DURATION_SEC)
+
+ gui_app.set_modal_overlay(ConfirmDialog(prompt, tr("Confirm")), callback=_set_force_onroad)
+
+ @staticmethod
+ def _update_max_time_offroad_label(value: int) -> str:
+ label = tr("Never Sleep") if value == 0 else f"{value}" + tr("m") if value < 60 else f"{value // 60}" + tr("h")
+ label += tr(" (Default)") if value == 1800 else ""
+ return label
+
+ def _update_state(self):
+ super()._update_state()
+
+ # Handle Always Offroad button
+ always_offroad = ui_state.params.get_bool("IQAlwaysOffroad")
+ now = int(time.time())
+ force_onroad_until = ui_state.params.get(FORCE_ONROAD_PARAM, return_default=True)
+ force_onroad_active = force_onroad_until > now
+
+ # Text & Color
+ offroad_mode_btn_text = tr("Exit Offroad Mode") if always_offroad else tr("Keep Device Offroad")
+ offroad_mode_btn_style = ButtonStyle.PRIMARY if always_offroad else ButtonStyle.DANGER
+ self._always_offroad_btn.action_item.left_button.set_text(offroad_mode_btn_text)
+ self._always_offroad_btn.action_item.left_button.set_button_style(offroad_mode_btn_style)
+
+ # Position
+ if self._scroller._items.__contains__(self._always_offroad_btn):
+ self._scroller._items.remove(self._always_offroad_btn)
+ if ui_state.is_offroad() and not always_offroad:
+ self._scroller._items.insert(len(self._scroller._items) - 1, self._always_offroad_btn)
+ else:
+ self._scroller._items.insert(0, self._always_offroad_btn)
+
+ # Force On-Road button is always shown directly under Always Offroad in System menu.
+ if self._scroller._items.__contains__(self._force_onroad_btn):
+ self._scroller._items.remove(self._force_onroad_btn)
+ self._scroller._items.insert(self._scroller._items.index(self._always_offroad_btn) + 1, self._force_onroad_btn)
+
+ if force_onroad_active:
+ remaining = force_onroad_until - now
+ minutes = remaining // 60
+ seconds = remaining % 60
+ force_onroad_text = f"{tr('Forced On-Road Active')} ({minutes}:{seconds:02d})"
+ force_onroad_style = ButtonStyle.PRIMARY
+ else:
+ force_onroad_text = tr("Force On-Road (10 min)")
+ force_onroad_style = ButtonStyle.NORMAL
+ self._force_onroad_btn.action_item.left_button.set_text(force_onroad_text)
+ self._force_onroad_btn.action_item.left_button.set_button_style(force_onroad_style)
+ self._force_onroad_btn.action_item.left_button.set_enabled(ui_state.is_offroad())
+
+ # Onroad Uploads
+ self._onroad_uploads_and_reset_settings.action_item.left_button.set_button_style(
+ ButtonStyle.PRIMARY if ui_state.params.get_bool("OnroadUploads") else ButtonStyle.NORMAL
+ )
+
+ # Offroad only buttons
+ self._driver_camera_btn.set_enabled(ui_state.is_offroad())
+ self._reg_and_training.action_item.left_button.set_enabled(ui_state.is_offroad())
+ self._reg_and_training.action_item.right_button.set_enabled(ui_state.is_offroad())
+ self._onroad_uploads_and_reset_settings.action_item.right_button.set_enabled(ui_state.is_offroad())
+
+ # Group advanced actions under submenu buttons.
+ root_menu = self._submenu == self.MENU_ROOT
+ system_menu = self._submenu == self.MENU_SYSTEM
+ maintenance_menu = self._submenu == self.MENU_MAINTENANCE
+
+ self._submenu_system_btn.set_visible(root_menu)
+ self._submenu_maintenance_btn.set_visible(root_menu)
+ self._submenu_back_btn.set_visible(not root_menu)
+
+ self._always_offroad_btn.set_visible(system_menu)
+ self._force_onroad_btn.set_visible(system_menu)
+ self._reset_calib_btn.set_visible(system_menu)
+ self._change_language_btn.set_visible(system_menu)
+ self._system_sep_a.set_visible(system_menu)
+ self._system_sep_b.set_visible(system_menu)
+ self._system_sep_c.set_visible(system_menu)
+ self._system_sep_d.set_visible(system_menu)
+ self._device_wake_mode.set_visible(system_menu)
+ self._max_time_offroad.set_visible(system_menu)
+ self._driver_camera_btn.set_visible(system_menu)
+ self._reg_and_training.set_visible(system_menu)
+
+ self._onroad_uploads_and_reset_settings.set_visible(maintenance_menu)
+ self._submenu_gap.set_visible(maintenance_menu)
+ self._submenu_bottom_separator.set_visible(maintenance_menu)
+ self._power_buttons.set_visible(maintenance_menu)
+
+ self._submenu_top_separator.set_visible(root_menu or system_menu or maintenance_menu)
+
+
+# ===== models =====
+
+if gui_app.iqpilot_ui():
+ from openpilot.system.ui.iqwidgets.widgets.list_view import button_item as button_item
+
+_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle"
+_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex"
+_RUNNER_CACHE_KEY = "ModelRunnerTypeCache"
+
+
+class ModelsLayout(Widget):
+ def __init__(self):
+ super().__init__()
+ self.model_manager = None
+ self._refreshing = False
+ self._refresh_start = 0.0
+ self.download_status = None
+ self.prev_download_status = None
+ self.model_dialog = None
+ self.last_cache_calc_time = 0
+
+ self._initialize_items()
+
+ self.clear_cache_item.action_item.set_value(f"{self._calculate_cache_size():.2f} MB")
+ self._scroller = Scroller(self.items, line_separator=True, spacing=0)
+
+ def _initialize_items(self):
+ self.current_model_item = IQListItem(
+ title=tr("Active Model"),
+ description="",
+ action_item=WideButtonAction(tr("SELECT")),
+ callback=self._handle_current_model_clicked
+ )
+
+ self.supercombo_label = progress_item(tr("Combined Model"))
+ self.vision_label = progress_item(tr("Vision Weights"))
+ self.policy_label = progress_item(tr("Policy Weights"))
+
+ self.refresh_item = button_item(tr("Reload Model List"), tr("REFRESH"), "", self._on_refresh_models)
+
+ self.clear_cache_item = IQListItem(
+ title=tr("Purge Model Cache"),
+ description="",
+ action_item=WideButtonAction(tr("CLEAR")),
+ callback=self._clear_cache
+ )
+
+ self.redownload_item = button_item(tr("Redownload Current Model"), tr("REDOWNLOAD"), "", self._redownload_model)
+ self.cancel_download_item = button_item(tr("Stop Download"), tr("Cancel"), "", self._cancel_model_request)
+
+ self.items = [self.current_model_item, self.cancel_download_item, self.supercombo_label, self.vision_label,
+ self.policy_label, self.redownload_item, self.refresh_item, self.clear_cache_item]
+
+ def _is_downloading(self):
+ return (self.model_manager and self.model_manager.selectedBundle and
+ self.model_manager.selectedBundle.status == custom.IQModelManager.DownloadStatus.downloading)
+
+ @staticmethod
+ def _has_download_request() -> bool:
+ try:
+ return int(ui_state.params.get(_DOWNLOAD_INDEX_KEY)) >= 0
+ except (TypeError, ValueError):
+ return False
+
+ @staticmethod
+ def _has_active_bundle_param() -> bool:
+ return bool(ui_state.params.get(_ACTIVE_BUNDLE_KEY))
+
+ def _has_model_request(self) -> bool:
+ return self._has_download_request()
+
+ @staticmethod
+ def _calculate_cache_size():
+ cache_size = 0.0
+ if os.path.exists(CUSTOM_MODEL_PATH):
+ cache_size = sum(os.path.getsize(os.path.join(CUSTOM_MODEL_PATH, file)) for file in os.listdir(CUSTOM_MODEL_PATH)) / (1024**2)
+ return cache_size
+
+ @staticmethod
+ def _bundle_index(bundle) -> int | None:
+ try:
+ return int(getattr(bundle, "index", -1))
+ except (TypeError, ValueError):
+ return None
+
+ @classmethod
+ def _bundle_matches(cls, left, right) -> bool:
+ if left is None or right is None:
+ return False
+
+ left_index = cls._bundle_index(left)
+ right_index = cls._bundle_index(right)
+ if left_index is not None and right_index is not None and left_index == right_index:
+ return True
+
+ for attr in ("ref", "internalName", "displayName"):
+ left_value = getattr(left, attr, None)
+ if left_value and left_value == getattr(right, attr, None):
+ return True
+ return False
+
+ @staticmethod
+ def _safe_model_path(filename: str) -> str | None:
+ if not filename or os.path.basename(filename) != filename:
+ return None
+
+ root = os.path.realpath(CUSTOM_MODEL_PATH)
+ path = os.path.realpath(os.path.join(root, filename))
+ try:
+ if os.path.commonpath([root, path]) != root:
+ return None
+ except ValueError:
+ return None
+ return path
+
+ def _remove_bundle_files(self, bundle) -> None:
+ for model in getattr(bundle, "models", []) or []:
+ for artifact in (getattr(model, "metadata", None), getattr(model, "artifact", None)):
+ filename = getattr(artifact, "fileName", "") if artifact is not None else ""
+ path = self._safe_model_path(filename)
+ if path is None:
+ continue
+ for candidate in (path, f"{path}.download"):
+ try:
+ if os.path.isfile(candidate):
+ os.remove(candidate)
+ except OSError:
+ pass
+
+ def _clear_cache(self):
+ def _callback(response):
+ if response == DialogResult.CONFIRM:
+ ui_state.params.put_bool("ModelManager_ClearCache", True)
+ self.clear_cache_item.action_item.set_value(f"{self._calculate_cache_size():.2f} MB")
+
+ gui_app.set_modal_overlay(ConfirmDialog(tr("This will delete ALL downloaded models from the cache except the currently active model. Are you sure?"),
+ tr("Clear Cache")), callback=_callback)
+
+ def _redownload_target_bundle(self):
+ if not self.model_manager:
+ return None
+ selected = self.model_manager.selectedBundle
+ if selected and selected.status == custom.IQModelManager.DownloadStatus.failed:
+ return selected
+ active = self.model_manager.activeBundle
+ if self._has_active_bundle_param() and active and active.ref:
+ return active
+ return None
+
+ def _redownload_target_index(self) -> int | None:
+ target = self._redownload_target_bundle()
+ if not target:
+ return None
+ try:
+ return int(target.index)
+ except (TypeError, ValueError):
+ pass
+
+ for bundle in self.model_manager.availableBundles:
+ if bundle.ref and bundle.ref == target.ref:
+ return int(bundle.index)
+ if bundle.internalName and bundle.internalName == target.internalName:
+ return int(bundle.index)
+ return None
+
+ def _can_redownload(self) -> bool:
+ return bool(ui_state.is_offroad() and not self._is_downloading() and not self._has_model_request() and self._redownload_target_index() is not None)
+
+ def _cancel_model_request(self):
+ ui_state.params.remove(_DOWNLOAD_INDEX_KEY)
+
+ def _redownload_model(self):
+ index = self._redownload_target_index()
+ if index is None:
+ return
+
+ def _callback(response):
+ if response == DialogResult.CONFIRM:
+ target = self._redownload_target_bundle()
+ if target is not None:
+ self._remove_bundle_files(target)
+ if self._bundle_matches(getattr(self.model_manager, "activeBundle", None), target):
+ ui_state.params.remove(_ACTIVE_BUNDLE_KEY)
+ ui_state.params.remove(_RUNNER_CACHE_KEY)
+ ui_state.params.put(_DOWNLOAD_INDEX_KEY, index)
+
+ gui_app.set_modal_overlay(ConfirmDialog(tr("Clear the selected model cache and download it again?"),
+ tr("Redownload")), callback=_callback)
+
+ def _handle_bundle_download_progress(self):
+ labels = {custom.IQModelManager.Model.Type.supercombo: self.supercombo_label,
+ custom.IQModelManager.Model.Type.vision: self.vision_label,
+ custom.IQModelManager.Model.Type.policy: self.policy_label}
+ for label in labels.values():
+ label.set_visible(False)
+ self.cancel_download_item.set_visible(False)
+
+ if not self.model_manager or (not self.model_manager.selectedBundle and (not self._has_active_bundle_param() or not self.model_manager.activeBundle)):
+ return
+
+ bundle = self.model_manager.selectedBundle if self._is_downloading() or (
+ self.model_manager.selectedBundle and self.model_manager.selectedBundle.status == custom.IQModelManager.DownloadStatus.failed
+ ) else (self.model_manager.activeBundle if self._has_active_bundle_param() else None)
+ if not bundle:
+ return
+
+ self.download_status = bundle.status
+ status_changed = self.prev_download_status != self.download_status
+ self.prev_download_status = self.download_status
+
+ self.cancel_download_item.set_visible(bool(self.model_manager.selectedBundle) and self._has_download_request())
+
+ if (current_time := time.monotonic()) - self.last_cache_calc_time > 0.5:
+ self.last_cache_calc_time = current_time
+ self.clear_cache_item.action_item.set_value(f"{self._calculate_cache_size():.2f} MB")
+
+ if self.download_status == custom.IQModelManager.DownloadStatus.downloading:
+ device._reset_interactive_timeout()
+
+ DS = custom.IQModelManager.DownloadStatus
+ bundle_downloading = bundle.status == DS.downloading
+ for model in bundle.models:
+ label = labels.get(getattr(model.type, 'raw', model.type))
+ if label is None:
+ continue
+ label.set_visible(True)
+ p = model.artifact.downloadProgress
+ text, show, color, indeterminate = self._model_label_state(p, bundle, bundle_downloading, status_changed)
+ label.action_item.update(p.progress, text, show, color, indeterminate=indeterminate)
+
+ def _model_label_state(self, p, bundle, bundle_downloading, status_changed):
+ # RL/supercombo weights are served without a content-length, so their per-artifact
+ # progress never updates; show a live bar whenever the bundle itself is downloading.
+ DS = custom.IQModelManager.DownloadStatus
+ name = bundle.displayName
+ live = p.status == DS.downloading or (bundle_downloading and p.status not in (DS.downloaded, DS.cached, DS.failed))
+ if live:
+ if p.progress > 0:
+ return f"{int(p.progress)}% - {name}", True, rl.GRAY, False
+ return f"{tr('downloading')} - {name}", True, rl.GRAY, True
+ if p.status in (DS.downloaded, DS.cached):
+ status_text = tr("from cache" if p.status == DS.cached else "downloaded")
+ return f"{name} - {status_text if status_changed else tr('ready')}", False, ON_COLOR, False
+ if p.status == DS.failed:
+ return f"download failed - {name}", False, rl.RED, False
+ return f"pending - {name}", False, rl.GRAY, False
+
+ @staticmethod
+ def _show_reset_params_dialog():
+ def _callback(response):
+ if response == DialogResult.CONFIRM:
+ ui_state.params.remove("CalibrationParams")
+ ui_state.params.remove("LiveTorqueParameters")
+ msg = tr("The selected model changed. We suggest resetting calibration. Would you like to do that now?")
+ gui_app.set_modal_overlay(ConfirmDialog(msg, tr("Reset Calibration")), callback=_callback)
+
+ def _on_model_selected(self, result):
+ if result != DialogResult.CONFIRM:
+ return
+ selected_ref = self.model_dialog.selection_ref
+ if selected_ref == "Default":
+ active = self.model_manager.activeBundle if self.model_manager else None
+ had_custom_model = bool(active and active.ref and not is_default_bundle(active))
+ select_default_model(ui_state.params)
+ if had_custom_model:
+ self._show_reset_params_dialog()
+ elif selected_bundle := next((bundle for bundle in self.model_manager.availableBundles if bundle.ref == selected_ref), None):
+ ui_state.params.put(_DOWNLOAD_INDEX_KEY, selected_bundle.index)
+ if self.model_manager.activeBundle and selected_bundle.generation != self.model_manager.activeBundle.generation:
+ self._show_reset_params_dialog()
+ self.model_dialog = None
+
+ @staticmethod
+ def _bundle_to_node(bundle):
+ return PickerItem(bundle.ref, {'display_name': bundle.displayName, 'short_name': bundle.internalName})
+
+ def _get_folders(self, favorites):
+ bundles = self.model_manager.availableBundles
+ folders = {}
+ for bundle in bundles:
+ folders.setdefault(next((ov_ride.value for ov_ride in bundle.overrides if ov_ride.key == "folder"), ""), []).append(bundle)
+
+ folders_list = [PickerGroup("", [PickerItem("Default", {'display_name': tr("Default (CD210)"), 'short_name': "Default"})])]
+ for folder, folder_bundles in sorted(folders.items(), key=lambda x: max((bundle.index for bundle in x[1]), default=-1), reverse=True):
+ folder_bundles.sort(key=lambda bundle: bundle.index, reverse=True)
+ name = folder + (f" - (Updated: {m.group(1)})" if folder_bundles and (m := re.search(r'\(([^)]*)\)[^(]*$', folder_bundles[0].displayName)) else "")
+ folders_list.append(PickerGroup(name, [self._bundle_to_node(bundle) for bundle in folder_bundles]))
+
+ if favorites and (fav_bundles := [bundle for bundle in bundles if bundle.ref in favorites]):
+ folders_list.insert(1, PickerGroup("Favorites", [self._bundle_to_node(bundle) for bundle in fav_bundles]))
+ return folders_list
+
+ def _handle_current_model_clicked(self):
+ favs = ui_state.params.get("IQModelFavorites")
+ favorites = set(favs.split(';')) if favs else set()
+ folders_list = self._get_folders(favorites)
+
+ active_ref = self.model_manager.activeBundle.ref if self._has_active_bundle_param() and self.model_manager.activeBundle else "Default"
+ self.model_dialog = PickerDialog(tr("Choose a Model"), folders_list, active_ref, "IQModelFavorites",
+ get_folders_fn=self._get_folders, on_exit=self._on_model_selected)
+ gui_app.set_modal_overlay(self.model_dialog, callback=self._on_model_selected)
+
+ def _on_refresh_models(self):
+ # Trigger a re-sync and show inline loading instead of a blocking dialog
+ ui_state.params.put("ModelManager_LastSyncTime", 0)
+ self._refreshing = True
+ self._refresh_start = time.monotonic()
+ self.refresh_item.action_item.set_enabled(False)
+
+ def _update_refresh_state(self):
+ if not self._refreshing:
+ return
+ try:
+ last_sync = int(ui_state.params.get("ModelManager_LastSyncTime", return_default=True) or 0)
+ except (TypeError, ValueError):
+ last_sync = 0
+ elapsed = time.monotonic() - self._refresh_start
+ if (last_sync > 0 and elapsed > 1.0) or elapsed > 20.0:
+ self._refreshing = False
+ self.refresh_item.action_item.set_loading(False)
+ self.refresh_item.action_item.set_enabled(True)
+ else:
+ self.refresh_item.action_item.set_loading(True)
+ self.refresh_item.action_item.set_enabled(False)
+
+ def _update_state(self):
+ self._update_refresh_state()
+ self.model_manager = ui_state.sm["iqModelManager"]
+ self._handle_bundle_download_progress()
+ active = self.model_manager.activeBundle if self.model_manager else None
+ if is_default_bundle(active):
+ active_name = active.displayName or tr("Default (CD210)")
+ elif self._has_active_bundle_param() and active and active.ref:
+ active_name = active.internalName
+ else:
+ active_name = tr("Default (CD210)")
+ self.current_model_item.action_item.set_value(active_name)
+ self.redownload_item.action_item.set_enabled(self._can_redownload())
+ target = self._redownload_target_bundle()
+ self.redownload_item.action_item.set_value(target.internalName if target else "")
+
+ if not ui_state.is_offroad():
+ self.current_model_item.action_item.set_enabled(False)
+ self.current_model_item.set_description(tr("Reachable only with the car switched off or Always Offroad turned on."))
+ else:
+ self.current_model_item.action_item.set_enabled(True)
+ self.current_model_item.set_description("")
+
+ def _render(self, rect):
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._scroller.show_event()
+
+
+# ===== settings =====
+
+OP.PANEL_COLOR = rl.Color(10, 10, 10, 255)
+ICON_SIZE = 70
+
+OP.PanelType = IntEnum(
+ "PanelType",
+ [es.name for es in OP.PanelType] + [
+ "MODELS",
+ "CRUISE",
+ "STEERING",
+ "VISUALS",
+ "NAVIGATION",
+ "VEHICLE",
+ ],
+ start=0,
+)
+
+
+@dataclass
+class PanelInfo(OP.PanelInfo):
+ icon: str = ""
+
+
+class SidebarEntry(Widget):
+ """One sidebar row: optional icon + label, with a rounded pill behind the active panel."""
+
+ def __init__(self, hub, panel_type, panel_info):
+ super().__init__()
+ self._hub = hub
+ self.panel_type = panel_type
+ self.panel_info = panel_info
+
+ @staticmethod
+ def _draw_active_pill(rect: rl.Rectangle, left_x: float):
+ pill = rl.Rectangle(left_x - 50, rect.y, OP.SIDEBAR_WIDTH - 50, OP.NAV_BTN_HEIGHT)
+ rl.draw_rectangle_rounded(pill, 0.2, 5, OP.CLOSE_BTN_COLOR)
+
+ def _render(self, rect):
+ active = self.panel_type == self._hub._current_panel
+ x = rect.x + 90
+ if active:
+ self._draw_active_pill(rect, x)
+
+ if self.panel_info.icon:
+ icon = gui_app.texture(self.panel_info.icon, ICON_SIZE, ICON_SIZE, keep_aspect_ratio=True)
+ rl.draw_texture(icon, int(x), int(rect.y + (OP.NAV_BTN_HEIGHT - icon.height) / 2), rl.WHITE)
+ x += ICON_SIZE + 20
+
+ label_h = measure_text_cached(self._hub._font_medium, self.panel_info.name, 65).y
+ rl.draw_text_ex(self._hub._font_medium, self.panel_info.name,
+ rl.Vector2(x, rect.y + (OP.NAV_BTN_HEIGHT - label_h) / 2), 55, 0,
+ OP.TEXT_SELECTED if active else OP.TEXT_NORMAL)
+
+ # remembered for the hub's release-hit-testing
+ self.panel_info.button_rect = rect
+
+
+class IQSettingsLayout(OP.SettingsLayout):
+ def __init__(self):
+ OP.SettingsLayout.__init__(self)
+ self._nav_items: list[Widget] = []
+ self._sidebar_scroller = Scroller([], spacing=0, line_separator=False, pad_end=False)
+
+ wifi_manager = WifiManager()
+ wifi_manager.set_active(False)
+
+ iq_asset = "../../iqpilot/selfdrive/assets/offroad"
+ self._panels = {
+ OP.PanelType.DEVICE: PanelInfo(tr_noop("Device"), IQDeviceLayout(), icon=f"{iq_asset}/icon_home.png"),
+ OP.PanelType.NETWORK: PanelInfo(tr_noop("Network"), IQNetworkUI(wifi_manager), icon="icons/network.png"),
+ OP.PanelType.TOGGLES: PanelInfo(tr_noop("Toggles"), TogglesLayout(), icon=f"{iq_asset}/icon_toggle.png"),
+ OP.PanelType.SOFTWARE: PanelInfo(tr_noop("Software"), IQSoftwareLayout(), icon=f"{iq_asset}/icon_software.png"),
+ OP.PanelType.MODELS: PanelInfo(tr_noop("Models"), ModelsLayout(), icon=f"{iq_asset}/icon_models.png"),
+ OP.PanelType.CRUISE: PanelInfo(tr_noop("Cruise"), CruiseLayout(), icon=f"{iq_asset}/icon_longitudinal.png"),
+ OP.PanelType.STEERING: PanelInfo(tr_noop("Steering"), SteeringLayout(), icon="icons_mici/wheel.png"),
+ OP.PanelType.VISUALS: PanelInfo(tr_noop("Visuals"), VisualsLayout(), icon=f"{iq_asset}/icon_visuals.png"),
+ OP.PanelType.VEHICLE: PanelInfo(tr_noop("Vehicle"), VehicleLayout(), icon=f"{iq_asset}/icon_vehicle.png"),
+ OP.PanelType.DEVELOPER: PanelInfo(tr_noop("Developer"), IQDeveloperLayout(), icon="icons/shell.png"),
+ }
+
+ # Cruise is reachable only via double-click on IQ.Dynamic in Toggles
+ self._hidden_from_sidebar = {OP.PanelType.CRUISE}
+ self._panels[OP.PanelType.TOGGLES].instance.set_cruise_panel_callback(
+ lambda: self.set_current_panel(OP.PanelType.CRUISE)
+ )
+
+ def _sidebar_entries(self):
+ for panel_type, panel_info in self._panels.items():
+ if panel_type not in self._hidden_from_sidebar:
+ yield panel_type, panel_info
+
+ def _populate_sidebar(self, rect: rl.Rectangle):
+ for panel_type, panel_info in self._sidebar_entries():
+ entry = SidebarEntry(self, panel_type, panel_info)
+ entry.rect.width = rect.width - 100
+ entry.rect.height = OP.NAV_BTN_HEIGHT
+ self._nav_items.append(entry)
+ self._sidebar_scroller.add_widget(entry)
+
+ def _draw_close_button(self, rect: rl.Rectangle) -> rl.Rectangle:
+ btn = rl.Rectangle(rect.x + metrics.GUTTER * 3, rect.y + metrics.GUTTER * 2,
+ metrics.CLOSE_BTN, metrics.CLOSE_BTN)
+ pressed = (rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) and
+ rl.check_collision_point_rec(rl.get_mouse_position(), btn))
+ rl.draw_rectangle_rounded(btn, 1.0, 20, OP.CLOSE_BTN_PRESSED if pressed else OP.CLOSE_BTN_COLOR)
+
+ icon = self._close_icon
+ dest = rl.Rectangle(btn.x + (btn.width - icon.width) / 2, btn.y + (btn.height - icon.height) / 2,
+ icon.width, icon.height)
+ tint = rl.Color(220, 220, 220, 255) if pressed else rl.WHITE
+ rl.draw_texture_pro(icon, rl.Rectangle(0, 0, icon.width, icon.height), dest, rl.Vector2(0, 0), 0, tint)
+ return btn
+
+ def _draw_sidebar(self, rect: rl.Rectangle):
+ rl.draw_rectangle_rec(rect, OP.SIDEBAR_COLOR)
+ self._close_btn_rect = self._draw_close_button(rect)
+
+ if not self._nav_items:
+ self._populate_sidebar(rect)
+
+ nav_rect = rl.Rectangle(rect.x, self._close_btn_rect.height + metrics.GUTTER * 4,
+ rect.width, rect.height - 300)
+ self._sidebar_scroller.render(nav_rect)
+
+ def _handle_mouse_release(self, mouse_pos: MousePos) -> bool:
+ if rl.check_collision_point_rec(mouse_pos, self._close_btn_rect):
+ if self._close_callback:
+ self._close_callback()
+ return True
+
+ if self._sidebar_scroller.scroll_panel.is_touch_valid():
+ for panel_type, panel_info in self._sidebar_entries():
+ if rl.check_collision_point_rec(mouse_pos, panel_info.button_rect):
+ self.set_current_panel(panel_type)
+ return True
+ return False
+
+ def show_event(self):
+ super().show_event()
+ self._panels[self._current_panel].instance.show_event()
+ self._sidebar_scroller.show_event()
+
+
+# ===== vehicle_brands_base =====
+
+class BrandPanel:
+ """Per-brand extra settings rows; brands without any simply don't register."""
+
+ def __init__(self):
+ self.items: list = []
+
+ def update_settings(self) -> None:
+ pass
+
+
+# ===== vehicle_brands_hyundai =====
+
+_TUNING_BLURBS = (
+ lambda: tr("Factory-default longitudinal tuning."),
+ lambda: tr("Dynamic tuning: livelier gas/brake response."),
+ lambda: tr("Predictive tuning: anticipates and smooths accel changes."),
+)
+
+
+class HyundaiSettings(BrandPanel):
+ def __init__(self):
+ super().__init__()
+ self.alpha_long_available = False
+ self.longitudinal_tuning_item = multiple_button_item(
+ tr("Longitudinal Tune Profile"), "",
+ [tr("Off"), tr("Dynamic"), tr("Predictive")],
+ button_width=300, param="IQHyundaiLongTune", inline=False,
+ callback=lambda index: ui_state.params.put("IQHyundaiLongTune", index))
+ self.items = [self.longitudinal_tuning_item]
+
+ def _alpha_long_supported(self) -> bool:
+ if bundle := ui_state.params.get("CarPlatformBundle"):
+ return CAR[bundle.get("platform")] not in (UNSUPPORTED_LONGITUDINAL_CAR | CANFD_UNSUPPORTED_LONGITUDINAL_CAR)
+ if ui_state.CP:
+ return ui_state.CP.alphaLongitudinalAvailable
+ return False
+
+ def update_settings(self):
+ self.alpha_long_available = self._alpha_long_supported()
+ selected = int(ui_state.params.get("IQHyundaiLongTune") or "0")
+
+ if not ui_state.is_offroad():
+ desc, usable = tr("Unavailable while the car is onroad."), False
+ elif not ui_state.has_longitudinal_control:
+ desc, usable = tr("Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled."), False
+ else:
+ blurb = _TUNING_BLURBS[selected] if selected < len(_TUNING_BLURBS) else _TUNING_BLURBS[0]
+ desc, usable = blurb(), True
+
+ row = self.longitudinal_tuning_item
+ row.action_item.set_enabled(usable)
+ row.set_description(desc)
+ row.show_description(True)
+ row.action_item.set_selected_button(selected)
+ row.set_visible(self.alpha_long_available)
+
+
+# ===== vehicle_brands_subaru =====
+
+_UNSUPPORTED_FLAGS = SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID
+
+
+class SubaruSettings(BrandPanel):
+ def __init__(self):
+ super().__init__()
+ self._supported = False
+ self.stop_and_go_toggle = toggle_item(tr("Creep from Standstill (Beta)"), "", param="IQSubaruCreepAssist",
+ callback=lambda _: self.update_settings())
+ self.stop_and_go_manual_parking_brake_toggle = toggle_item(
+ tr("Creep from Standstill — Manual Handbrake (Beta)"), "",
+ param="IQSubaruCreepAssistManualBrake", callback=lambda _: self.update_settings())
+ self.items = [self.stop_and_go_toggle, self.stop_and_go_manual_parking_brake_toggle]
+
+ def _platform_flags(self) -> int:
+ if bundle := ui_state.params.get("CarPlatformBundle"):
+ return CAR[bundle.get("platform")].config.flags
+ if ui_state.CP:
+ return ui_state.CP.flags
+ return 0
+
+ def _blocker_text(self) -> str:
+ if not self._supported:
+ return tr("Not available on this Subaru platform.")
+ if not ui_state.is_offroad():
+ return tr("Flip on Always Offroad from the Device panel, or power the car down, to change this.")
+ return ""
+
+ def update_settings(self):
+ self._supported = not (self._platform_flags() & _UNSUPPORTED_FLAGS)
+ blocker = self._blocker_text()
+ usable = self._supported and ui_state.is_offroad()
+
+ rows = (
+ (self.stop_and_go_toggle,
+ tr("Automatically resume from a stop while following traffic, on Subaru platforms where "
+ "the beta implementation applies.")),
+ (self.stop_and_go_manual_parking_brake_toggle,
+ tr("Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave this off on "
+ "cars with an electric parking brake. Thanks to martinl for this implementation!")),
+ )
+ for row, body in rows:
+ row.action_item.set_enabled(usable)
+ row.set_description(f"{blocker} {body}" if blocker else body)
+
+
+# ===== vehicle_brands_tesla =====
+
+COOP_STEERING_MIN_KMH = 23
+OEM_STEERING_MIN_KMH = 48
+KM_TO_MILE = 0.621371
+
+
+def _speed_text(kmh: int) -> str:
+ if ui_state.is_metric:
+ return f"{kmh} km/h"
+ return f"{round(kmh * KM_TO_MILE)} mph"
+
+
+class TeslaSettings(BrandPanel):
+ def __init__(self):
+ super().__init__()
+ self.torque_blend_toggle = toggle_item(tr("VTB (Virtual Torque Blending)"), "", param="IQTeslaTorqueBlend")
+ self.items = [self.torque_blend_toggle]
+
+ def update_settings(self):
+ caution = tr("Warning: steering may oscillate in turns below {}; turn this off if you feel it.").format(
+ _speed_text(OEM_STEERING_MIN_KMH))
+ body = (f"{caution} "
+ f"{tr('Lets you nudge the wheel while engaged without fully disengaging steering.')} "
+ f"{tr('Active above {} only.').format(_speed_text(COOP_STEERING_MIN_KMH))}")
+
+ if not ui_state.is_offroad():
+ blocker = tr("Flip on Always Offroad from the Device panel, or power the car down, to change this.")
+ body = f"{blocker} {body}"
+
+ self.torque_blend_toggle.set_description(body)
+ self.torque_blend_toggle.action_item.set_enabled(ui_state.is_offroad())
+
+
+# ===== vehicle_brands_toyota =====
+
+class ToyotaSettings(BrandPanel):
+ def __init__(self):
+ super().__init__()
+ self.enforce_stock_longitudinal = toggle_item(
+ lambda: tr("Keep Factory Gas and Brake"),
+ description=lambda: tr("Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only."),
+ initial_state=ui_state.params.get_bool("IQToyotaFactoryLong"),
+ callback=self._on_toggled,
+ enabled=lambda: not ui_state.engaged,
+ )
+ self.items = [self.enforce_stock_longitudinal]
+
+ @staticmethod
+ def _apply(enabled: bool):
+ ui_state.params.put_bool("IQToyotaFactoryLong", enabled)
+ if enabled and ui_state.params.get_bool("AlphaLongitudinalEnabled"):
+ ui_state.params.put_bool("AlphaLongitudinalEnabled", False)
+ ui_state.params.put_bool("OnroadCycleRequested", True)
+
+ def _on_toggled(self, state: bool):
+ if not state:
+ self._apply(False)
+ return
+
+ def after_confirm(result: int):
+ if result == DialogResult.CONFIRM:
+ self._apply(True)
+ else:
+ self.enforce_stock_longitudinal.action_item.set_state(False)
+
+ row = self.enforce_stock_longitudinal
+ prompt = f"{row.title} {row.description}
"
+ gui_app.set_modal_overlay(ConfirmDialog(prompt, tr("Enable"), rich=True), callback=after_confirm)
+
+
+# ===== vehicle_brands_volkswagen =====
+
+DESCRIPTIONS = {
+ 'pqhca5or7Toggle': tr_noop(
+ 'Use HCA Status 7 instead of Status 5 for steering control on PQ platform vehicles. '
+ 'This may help with compatibility on some older Volkswagen models.'
+ ),
+ 'AllowLateralWhenLongUnavailable': tr_noop(
+ 'Allow lateral control (steering) to remain active even when longitudinal control (gas/brake) '
+ 'is temporarily unavailable due to a cruise control fault.'
+ ),
+ 'iqMqbAccResume': tr_noop(
+ 'Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended Hold without Auto Resume Volkswagen MQB vehicles.'
+ ),
+ 'iqMqbSteeringLockout': tr_noop(
+ 'Enable MQB steering lockout handling on Volkswagen MQB vehicles with low speed LKAS faults.'
+ ),
+}
+
+
+class VolkswagenSettings(BrandPanel):
+ def __init__(self):
+ super().__init__()
+
+ self.pq_hca_toggle = toggle_item(
+ lambda: tr("PQ HCA Status 7 Mode"),
+ description=lambda: tr(DESCRIPTIONS["pqhca5or7Toggle"]),
+ initial_state=ui_state.params.get_bool("pqhca5or7Toggle"),
+ callback=self._on_pq_hca_toggle,
+ enabled=lambda: not ui_state.engaged,
+ )
+
+ self.lateral_when_long_unavailable = toggle_item(
+ lambda: tr("Lateral Control When Cruise Faulted"),
+ description=lambda: tr(DESCRIPTIONS["AllowLateralWhenLongUnavailable"]),
+ initial_state=ui_state.params.get_bool("AllowLateralWhenLongUnavailable"),
+ callback=self._on_lateral_when_long_unavailable,
+ enabled=lambda: not ui_state.engaged,
+ )
+
+ self.mqb_acc_resume = toggle_item(
+ lambda: tr("MQB ACC Resume"),
+ description=lambda: tr(DESCRIPTIONS["iqMqbAccResume"]),
+ initial_state=ui_state.params.get_bool("iqMqbAccResume"),
+ callback=self._on_mqb_acc_resume,
+ enabled=lambda: not ui_state.engaged,
+ )
+
+ self.mqb_steering_lockout = toggle_item(
+ lambda: tr("MQB Steering Lockout"),
+ description=lambda: tr(DESCRIPTIONS["iqMqbSteeringLockout"]),
+ initial_state=ui_state.params.get_bool("iqMqbSteeringLockout"),
+ callback=self._on_mqb_steering_lockout,
+ enabled=lambda: not ui_state.engaged,
+ )
+
+ self.items = [self.pq_hca_toggle, self.lateral_when_long_unavailable, self.mqb_acc_resume, self.mqb_steering_lockout]
+
+ def _flags(self) -> VolkswagenFlags:
+ bundle = ui_state.params.get("CarPlatformBundle")
+ if bundle:
+ platform = bundle.get("platform")
+ if platform:
+ try:
+ return CAR[platform].config.flags
+ except (KeyError, AttributeError):
+ return VolkswagenFlags(0)
+ elif ui_state.CP:
+ return ui_state.CP.flags
+ return VolkswagenFlags(0)
+
+ def _is_pq(self) -> bool:
+ return bool(self._flags() & VolkswagenFlags.PQ)
+
+ def _is_mqb(self) -> bool:
+ flags = self._flags()
+ return not bool(flags & (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO))
+
+ def _supports_lateral_when_faulted(self) -> bool:
+ return not bool(self._flags() & VolkswagenFlags.MLB)
+
+ def _on_pq_hca_toggle(self, state: bool):
+ ui_state.params.put_bool("pqhca5or7Toggle", state)
+
+ def _on_lateral_when_long_unavailable(self, state: bool):
+ ui_state.params.put_bool("AllowLateralWhenLongUnavailable", state)
+
+ def _on_mqb_acc_resume(self, state: bool):
+ ui_state.params.put_bool("iqMqbAccResume", state)
+
+ def _on_mqb_steering_lockout(self, state: bool):
+ ui_state.params.put_bool("iqMqbSteeringLockout", state)
+
+ def update_settings(self):
+ self.pq_hca_toggle.set_visible(self._is_pq())
+ self.lateral_when_long_unavailable.set_visible(self._supports_lateral_when_faulted())
+ is_mqb = self._is_mqb()
+ self.mqb_acc_resume.set_visible(is_mqb)
+ self.mqb_steering_lockout.set_visible(is_mqb)
+
+
+# ===== vehicle_brands_factory =====
+
+# Only brands that actually ship extra rows appear here; every other brand gets None.
+_REGISTRY: dict[str, type[BrandPanel]] = {
+ "hyundai": HyundaiSettings,
+ "subaru": SubaruSettings,
+ "tesla": TeslaSettings,
+ "toyota": ToyotaSettings,
+ "volkswagen": VolkswagenSettings,
+}
+
+
+def brand_settings_for(brand: str) -> BrandPanel | None:
+ cls = _REGISTRY.get(brand)
+ return cls() if cls else None
+
+
+class BrandPanelFactory:
+ """Legacy shim for callers using the old factory name."""
+
+ create_brand_settings = staticmethod(brand_settings_for)
+
+
+# ===== vehicle_platform_selector =====
+
+
+class FingerprintStatus(IntEnum):
+ NONE = 0 # nothing identified, nothing forced
+ AUTO = 1 # car identified itself over CAN
+ FORCED = 2 # user pinned a platform manually
+
+
+STATUS_COLORS = {
+ FingerprintStatus.NONE: ink.STATUS_WARN,
+ FingerprintStatus.AUTO: ink.STATUS_GOOD,
+ FingerprintStatus.FORCED: ink.STATUS_INFO,
+}
+
+
+class VehicleSelection:
+ """Owns the car list and the CarPlatformBundle param; widgets render from this."""
+
+ def __init__(self):
+ self.platforms: dict = load_catalog()
+
+ @staticmethod
+ def forced_bundle():
+ return ui_state.params.get("CarPlatformBundle")
+
+ def status(self) -> FingerprintStatus:
+ if self.forced_bundle():
+ return FingerprintStatus.FORCED
+ if ui_state.CP and ui_state.CP.carFingerprint != "MOCK":
+ return FingerprintStatus.AUTO
+ return FingerprintStatus.NONE
+
+ def display_name(self) -> str:
+ if bundle := self.forced_bundle():
+ return bundle.get("name", "")
+ if ui_state.CP and ui_state.CP.carFingerprint != "MOCK":
+ return ui_state.CP.carFingerprint
+ return tr("No vehicle set")
+
+ def force(self, platform_name: str) -> bool:
+ data = self.platforms.get(platform_name)
+ if not data:
+ return False
+ ui_state.params.put("CarPlatformBundle", {**data, "name": platform_name})
+ return True
+
+ @staticmethod
+ def clear():
+ ui_state.params.remove("CarPlatformBundle")
+
+ def picker_folders(self) -> list[PickerGroup]:
+ def node_for(name: str) -> PickerItem:
+ info = self.platforms[name]
+ years = ' '.join(map(str, info.get('year', [])))
+ return PickerItem(name, {
+ 'display_name': name,
+ 'search_tags': f"{name} {info.get('make')} {years} {info.get('model', name)}",
+ })
+
+ names = sorted(self.platforms)
+ makes = sorted({self.platforms[n].get('make') for n in names})
+ return [PickerGroup(make, [node_for(n) for n in names if self.platforms[n].get('make') == make])
+ for make in makes]
+
+
+class VehiclePicker(Button):
+ """Row button that either clears a forced platform or opens the vehicle picker."""
+
+ def __init__(self, on_platform_change: Callable[[], None] | None = None):
+ super().__init__(tr("Vehicle"), self._on_clicked, button_style=ButtonStyle.NORMAL)
+ self.set_rect(rl.Rectangle(0, 0, 0, 120))
+ self.selection = VehicleSelection()
+ self._on_platform_change = on_platform_change
+ self.refresh()
+
+ @property
+ def text(self):
+ return self._label._text
+
+ @property
+ def status(self) -> FingerprintStatus:
+ return self.selection.status()
+
+ @property
+ def color(self) -> rl.Color:
+ return STATUS_COLORS[self.status]
+
+ def set_parent_rect(self, parent_rect):
+ super().set_parent_rect(parent_rect)
+ self._rect.width = parent_rect.width
+
+ def refresh(self):
+ self.set_text(self.selection.display_name())
+ self.set_enabled(True)
+
+ def _notify(self):
+ self.refresh()
+ if self._on_platform_change:
+ self._on_platform_change()
+
+ def _on_clicked(self):
+ if self.selection.forced_bundle():
+ self.selection.clear()
+ self._notify()
+ else:
+ self._open_picker()
+
+ def _open_picker(self):
+ dialog = PickerDialog(
+ tr("Pick your vehicle"),
+ self.selection.picker_folders(),
+ search_prompt=tr("Search make or model"),
+ search_title=tr("Find your vehicle"),
+ search_subtitle=tr("Type a year then a model — for example, 2021 Toyota Corolla:"),
+ search_funcs=[lambda node: node.data.get('display_name', ''), lambda node: node.data.get('search_tags', '')],
+ )
+ done = partial(self._on_picked, dialog)
+ dialog.on_exit = done
+ gui_app.set_modal_overlay(dialog, callback=done)
+
+ def _on_picked(self, dialog, res):
+ if res != DialogResult.CONFIRM or not dialog.selection_ref:
+ return
+ when = tr("Applies right away.") if ui_state.is_offroad else \
+ tr("Applies the next time the device goes offroad.")
+
+ def confirm(result):
+ if result == DialogResult.CONFIRM and self.selection.force(dialog.selection_ref):
+ self._notify()
+
+ gui_app.set_modal_overlay(ConfirmDialog(when, tr("Confirm")), callback=confirm)
+
+
+_LEGEND = (
+ (FingerprintStatus.AUTO, lambda: tr("Detected automatically")),
+ (FingerprintStatus.FORCED, lambda: tr("Chosen manually")),
+ (FingerprintStatus.NONE, lambda: tr("Undetected and unset")),
+)
+
+
+class LegendWidget(Widget):
+ """Explains the fingerprint status colours; the active row is highlighted."""
+
+ def __init__(self, platform_selector: VehiclePicker):
+ super().__init__()
+ self.set_rect(rl.Rectangle(0, 0, 0, 350))
+ self._selector = platform_selector
+ self._font = gui_app.font(FontWeight.NORMAL)
+ self._bold_font = gui_app.font(FontWeight.BOLD)
+
+ def _render(self, rect):
+ x = rect.x + 20
+ y = rect.y + 20
+ rl.draw_text_ex(self._font, tr("Pin a vehicle to skip auto-detection."), rl.Vector2(x, y), 40, 0, ink.CAPTION)
+ y += 80
+ rl.draw_text_ex(self._font, tr("Colour key for fingerprint state:"), rl.Vector2(x, y), 40, 0, ink.CAPTION)
+ y += 80
+
+ active = self._selector.status
+ for status, label in _LEGEND:
+ font = self._bold_font if status == active else self._font
+ text_color = rl.WHITE if status == active else ink.CAPTION
+ text = f"- {label()}"
+ ts = measure_text_cached(font, text, 40)
+ chip_cy = (y - 7) + ts.y / 2
+ rl.draw_rectangle_rounded(rl.Rectangle(x, chip_cy - 18, 36, 36), 0.45, 10, STATUS_COLORS[status])
+ rl.draw_text_ex(font, text, rl.Vector2(x + 56, y - 7), 40, 0, text_color)
+ y += 50
+
+
+# ===== vehicle___init__ =====
+
+_STATUS_BADGES = {
+ FingerprintStatus.AUTO: lambda: tr("AUTO"),
+ FingerprintStatus.FORCED: lambda: tr("MANUAL"),
+ FingerprintStatus.NONE: lambda: tr("NONE"),
+}
+
+
+class VehicleLayout(Widget):
+ def __init__(self):
+ super().__init__()
+ self._brand_settings = None
+ self._current_brand = None
+ self._platform_selector = VehiclePicker(self._on_vehicle_changed)
+ self._vehicle_item = IQListItem(title=self._platform_selector.text, action_item=ButtonAction(text=tr("SELECT")),
+ callback=self._platform_selector._on_clicked)
+ self._legend_widget = LegendWidget(self._platform_selector)
+ self._refresh_vehicle_row()
+
+ self.items = [self._vehicle_item, self._legend_widget]
+ self._scroller = Scroller(self.items, line_separator=True, spacing=0)
+
+ @staticmethod
+ def get_brand():
+ bundle = ui_state.params.get("CarPlatformBundle")
+ if bundle:
+ return bundle.get("brand", "")
+ fingerprinted = ui_state.CP and ui_state.CP.carFingerprint != "MOCK"
+ return ui_state.CP.brand if fingerprinted else ""
+
+ def _refresh_vehicle_row(self):
+ # White name for legibility; the fingerprint status lives in a coloured chip beside it.
+ status = self._platform_selector.status
+ self._vehicle_item._title = self._platform_selector.text
+ self._vehicle_item.title_color = rl.WHITE
+ self._vehicle_item.title_badge = (_STATUS_BADGES[status](), STATUS_COLORS[status])
+ forced = ui_state.params.get("CarPlatformBundle") is not None
+ self._vehicle_item.action_item.set_text(tr("REMOVE") if forced else tr("SELECT"))
+
+ def _sync_brand_panel(self):
+ brand = self.get_brand()
+ if brand == self._current_brand:
+ return
+ self._current_brand = brand
+ self._brand_settings = brand_settings_for(brand)
+ brand_rows = self._brand_settings.items if self._brand_settings else []
+ self.items = [self._vehicle_item, self._legend_widget, *brand_rows]
+ self._scroller = Scroller(self.items, line_separator=True, spacing=0)
+
+ def _on_vehicle_changed(self):
+ self._refresh_vehicle_row()
+ self._sync_brand_panel()
+
+ def _update_state(self):
+ self._on_vehicle_changed()
+ if self._brand_settings:
+ self._brand_settings.update_settings()
+ self._platform_selector.refresh()
+
+ def _render(self, rect):
+ self._scroller.render(rect)
+
+ def show_event(self):
+ self._scroller.show_event()
diff --git a/iqpilot/ui/mici/__init__.py b/iqpilot/ui/mici/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/ui/mici/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/ui/mici/onroad/__init__.py b/iqpilot/ui/mici/onroad/__init__.py
new file mode 100644
index 000000000..297dca9e1
--- /dev/null
+++ b/iqpilot/ui/mici/onroad/__init__.py
@@ -0,0 +1,3 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
diff --git a/iqpilot/ui/mici/onroad/confidence_ball.py b/iqpilot/ui/mici/onroad/confidence_ball.py
new file mode 100644
index 000000000..faf630d58
--- /dev/null
+++ b/iqpilot/ui/mici/onroad/confidence_ball.py
@@ -0,0 +1,31 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import pyray as rl
+from openpilot.selfdrive.ui.ui_state import ui_state, UIStatus
+
+
+ACTIVE_CONFIDENCE_TOP = rl.Color(0x22, 0xB8, 0xB9, 0xFF)
+ACTIVE_CONFIDENCE_BOTTOM = rl.Color(0x0C, 0x94, 0x96, 0xFF)
+MEDIUM_CONFIDENCE_TOP = rl.Color(255, 200, 0, 255)
+MEDIUM_CONFIDENCE_BOTTOM = rl.Color(255, 115, 0, 255)
+LOW_CONFIDENCE_TOP = rl.Color(255, 0, 21, 255)
+LOW_CONFIDENCE_BOTTOM = rl.Color(255, 0, 89, 255)
+
+
+class IQConfidenceBall:
+ @staticmethod
+ def get_animate_status_probs():
+ if ui_state.status == UIStatus.LAT_ONLY:
+ return ui_state.sm['modelV2'].meta.disengagePredictions.steerOverrideProbs
+
+ # UIStatus.LONG_ONLY
+ return ui_state.sm['modelV2'].meta.disengagePredictions.brakeDisengageProbs
+
+ @staticmethod
+ def get_lat_long_dot_colors(confidence: float) -> tuple[rl.Color, rl.Color]:
+ if confidence > 0.5:
+ return ACTIVE_CONFIDENCE_TOP, ACTIVE_CONFIDENCE_BOTTOM
+ if confidence > 0.2:
+ return MEDIUM_CONFIDENCE_TOP, MEDIUM_CONFIDENCE_BOTTOM
+ return LOW_CONFIDENCE_TOP, LOW_CONFIDENCE_BOTTOM
diff --git a/iqpilot/ui/mici/onroad/hud_renderer.py b/iqpilot/ui/mici/onroad/hud_renderer.py
new file mode 100644
index 000000000..e0806409d
--- /dev/null
+++ b/iqpilot/ui/mici/onroad/hud_renderer.py
@@ -0,0 +1,32 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import pyray as rl
+
+from openpilot.selfdrive.ui.mici.onroad.hud_renderer import HudRenderer
+from openpilot.iqpilot.ui.onroad.hud_overlays import IQBlindSpotOverlay
+
+
+class IQMiciHudRenderer(HudRenderer):
+ """Stock Mici HUD extended with IQ.Pilot's own onroad overlays.
+
+ Overlays live in a list so the renderer stays overlay-agnostic — each just needs
+ update()/render(rect); blind-spot state is surfaced by any overlay that exposes it.
+ """
+
+ def __init__(self):
+ super().__init__()
+ self._overlays = [IQBlindSpotOverlay()]
+
+ def _update_state(self) -> None:
+ super()._update_state()
+ for overlay in self._overlays:
+ overlay.update()
+
+ def _render(self, rect: rl.Rectangle) -> None:
+ super()._render(rect)
+ for overlay in self._overlays:
+ overlay.render(rect)
+
+ def _has_blind_spot_detected(self) -> bool:
+ return any(getattr(overlay, "detected", False) for overlay in self._overlays)
diff --git a/iqpilot/ui/mici/onroad/model_renderer.py b/iqpilot/ui/mici/onroad/model_renderer.py
new file mode 100644
index 000000000..b971e99c5
--- /dev/null
+++ b/iqpilot/ui/mici/onroad/model_renderer.py
@@ -0,0 +1,10 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import pyray as rl
+from openpilot.selfdrive.ui.ui_state import UIStatus
+
+IQ_LANE_LINE_COLORS = {
+ UIStatus.LAT_ONLY: rl.Color(0x0C, 0x94, 0x96, 0xFF),
+ UIStatus.LONG_ONLY: rl.Color(0x0C, 0x94, 0x96, 0xFF),
+}
diff --git a/iqpilot/ui/mici/onroad/road_label.py b/iqpilot/ui/mici/onroad/road_label.py
new file mode 100644
index 000000000..2576dbe4e
--- /dev/null
+++ b/iqpilot/ui/mici/onroad/road_label.py
@@ -0,0 +1,20 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
+"""
+from openpilot.iqpilot.ui.onroad.hud_overlays import RoadNameBanner
+
+
+class RoadNameRendererMici(RoadNameBanner):
+ """Compact capsule tuned for the mici's small panel."""
+
+ TYPE_SIZE = 28
+ FLOOR_WIDTH = 120
+ SIDE_PAD = 28
+ MARGIN = 200
+ DROP = 8
+ BAR_H = TYPE_SIZE + 14
+ CURVE = 0.35
+ SEGS = 8
+ BACKDROP_A = 140
+ INK_A = 210
+ INNER_PAD = 16
diff --git a/iqpilot/ui/onroad/__init__.py b/iqpilot/ui/onroad/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/ui/onroad/augmented_road_view.py b/iqpilot/ui/onroad/augmented_road_view.py
new file mode 100644
index 000000000..59204a89f
--- /dev/null
+++ b/iqpilot/ui/onroad/augmented_road_view.py
@@ -0,0 +1,18 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import pyray as rl
+from openpilot.selfdrive.ui.ui_state import UIStatus
+
+BORDER_COLORS_IQ = {
+ UIStatus.LAT_ONLY: rl.Color(0x0C, 0x94, 0x96, 0xFF),
+ UIStatus.LONG_ONLY: rl.Color(0x96, 0x1C, 0xA8, 0xFF), # Purple for longitudinal-only state
+}
+
+
+class AugmentedRoadViewIQ:
+ def __init__(self):
+ pass
+
+ def update_fade_out_bottom_overlay(self, _content_rect):
+ pass
diff --git a/iqpilot/ui/onroad/driver_state.py b/iqpilot/ui/onroad/driver_state.py
new file mode 100644
index 000000000..1f3a93d16
--- /dev/null
+++ b/iqpilot/ui/onroad/driver_state.py
@@ -0,0 +1,162 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import time
+import numpy as np
+import pyray as rl
+
+from openpilot.common.params import Params
+from openpilot.selfdrive.ui import UI_BORDER_SIZE
+from openpilot.selfdrive.ui.onroad.driver_state import DriverStateRenderer, BTN_SIZE, ARC_LENGTH
+from openpilot.iqpilot.ui.onroad.hud_overlays import IQDevMetricsOverlay
+from openpilot.system.ui.lib.application import gui_app, FontWeight
+from openpilot.system.ui.lib.text_measure import measure_text_cached
+
+# LongitudinalPersonality ordinals (matches cereal enum: relaxed=0, standard=1, aggressive=2)
+_PERSONALITY_RELAXED = 0
+_PERSONALITY_STANDARD = 1
+_PERSONALITY_AGGRESSIVE = 2
+
+PERSONALITY_COLORS = {
+ _PERSONALITY_RELAXED: rl.Color(0x17, 0xC9, 0x64, 0xFF), # green
+ _PERSONALITY_STANDARD: rl.Color(0x0C, 0x94, 0x96, 0xFF), # teal
+ _PERSONALITY_AGGRESSIVE: rl.Color(0xE8, 0x2C, 0x2C, 0xFF), # red
+}
+
+PERSONALITY_NAMES = {
+ _PERSONALITY_RELAXED: "Relaxed",
+ _PERSONALITY_STANDARD: "Standard",
+ _PERSONALITY_AGGRESSIVE: "Aggressive",
+}
+
+_TOAST_DURATION = 2.0 # seconds
+_TOAST_FONT_SIZE = 52
+_TOAST_PAD_X = 52
+_TOAST_PAD_Y = 22
+_TOAST_BOTTOM_MARGIN = UI_BORDER_SIZE + 36
+_TOAST_RADIUS = 0.45
+_TOAST_FADE = 0.25 # fade-in / fade-out window
+
+
+class DriverStateRendererIQ(DriverStateRenderer):
+ def __init__(self):
+ super().__init__()
+ self._params = Params()
+ self._personality: int = _PERSONALITY_STANDARD
+ self._personality_color: rl.Color = PERSONALITY_COLORS[_PERSONALITY_STANDARD]
+
+ self._toast_end_time: float = 0.0
+ self._toast_text: str = ""
+ self._toast_color: rl.Color = rl.WHITE
+ self._font = gui_app.font(FontWeight.SEMI_BOLD)
+
+ self.dev_ui_offset = IQDevMetricsOverlay.get_bottom_dev_ui_offset()
+ self._dm_background = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_background.png", BTN_SIZE, BTN_SIZE)
+ self._dm_person = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_person.png", 118, 118)
+ self._dm_cone = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_cone.png", 118, 118)
+
+ def _update_state(self):
+ super()._update_state()
+ personality = self._params.get("LongitudinalPersonality", return_default=True)
+ if personality is not None:
+ self._personality = int(personality)
+ self._personality_color = PERSONALITY_COLORS.get(self._personality, PERSONALITY_COLORS[_PERSONALITY_STANDARD])
+
+ def cycle_personality(self):
+ next_p = (self._personality + 1) % 3
+ self._params.put_nonblocking("LongitudinalPersonality", next_p)
+ self._personality = next_p
+ self._personality_color = PERSONALITY_COLORS[next_p]
+ self._toast_text = PERSONALITY_NAMES[next_p]
+ self._toast_color = PERSONALITY_COLORS[next_p]
+ self._toast_end_time = time.monotonic() + _TOAST_DURATION
+
+ def _render(self, _):
+ fade = max(0.35, 1.0 - self.dm_fade_state)
+ alpha = int(255 * fade)
+ pc = self._personality_color
+
+ rl.draw_texture(
+ self._dm_background,
+ int(self.position_x - self._dm_background.width / 2),
+ int(self.position_y - self._dm_background.height / 2),
+ rl.Color(pc.r, pc.g, pc.b, alpha),
+ )
+
+ rl.draw_texture(
+ self._dm_person,
+ int(self.position_x - self._dm_person.width / 2),
+ int(self.position_y - self._dm_person.height / 2),
+ rl.Color(255, 255, 255, int(alpha * 0.9)),
+ )
+
+ if self.is_active:
+ dest_rect = rl.Rectangle(self.position_x, self.position_y, self._dm_cone.width, self._dm_cone.height)
+ rl.draw_texture_pro(
+ self._dm_cone,
+ rl.Rectangle(0, 0, self._dm_cone.width, self._dm_cone.height),
+ dest_rect,
+ rl.Vector2(dest_rect.width / 2, dest_rect.height / 2),
+ 180.0,
+ rl.Color(pc.r, pc.g, pc.b, alpha),
+ )
+ else:
+ rl.draw_circle(int(self.position_x), int(self.position_y), 14, rl.Color(255, 255, 255, alpha))
+
+ self._draw_personality_toast()
+
+ def _draw_personality_toast(self):
+ now = time.monotonic()
+ remaining = self._toast_end_time - now
+ if remaining <= 0 or not self._toast_text:
+ return
+
+ elapsed = _TOAST_DURATION - remaining
+ fade_in = min(1.0, elapsed / _TOAST_FADE)
+ fade_out = min(1.0, remaining / _TOAST_FADE)
+ a = int(255 * fade_in * fade_out)
+
+ text_size = measure_text_cached(self._font, self._toast_text, _TOAST_FONT_SIZE)
+ toast_w = text_size.x + _TOAST_PAD_X * 2
+ toast_h = text_size.y + _TOAST_PAD_Y * 2
+
+ cx = self._rect.x + self._rect.width / 2
+ toast_x = cx - toast_w / 2
+ toast_y = self._rect.y + self._rect.height - _TOAST_BOTTOM_MARGIN - toast_h
+
+ tc = self._toast_color
+ toast_rect = rl.Rectangle(toast_x, toast_y, toast_w, toast_h)
+ rl.draw_rectangle_rounded(toast_rect, _TOAST_RADIUS, 10, rl.Color(tc.r, tc.g, tc.b, a))
+ rl.draw_text_ex(
+ self._font, self._toast_text,
+ rl.Vector2(toast_x + _TOAST_PAD_X, toast_y + _TOAST_PAD_Y),
+ _TOAST_FONT_SIZE, 0,
+ rl.Color(255, 255, 255, a),
+ )
+
+ def _pre_calculate_drawing_elements(self):
+ """Pre-calculate all drawing elements based on the current rectangle"""
+ width, height = self._rect.width, self._rect.height
+ offset = UI_BORDER_SIZE + BTN_SIZE // 2
+ self.position_x = self._rect.x + (width - offset if self.is_rhd else offset)
+ self.position_y = self._rect.y + height - offset - self.dev_ui_offset
+
+ positioned_keypoints = self.face_keypoints_transformed + np.array([self.position_x, self.position_y])
+ for i in range(len(positioned_keypoints)):
+ self.face_lines[i].x = positioned_keypoints[i][0]
+ self.face_lines[i].y = positioned_keypoints[i][1]
+
+ delta_x = -self.driver_pose_sins[1] * ARC_LENGTH / 2.0
+ delta_y = -self.driver_pose_sins[0] * ARC_LENGTH / 2.0
+
+ h_width = abs(delta_x)
+ self.h_arc_data = self._calculate_arc_data(
+ delta_x, h_width, self.position_x, self.position_y - ARC_LENGTH / 2,
+ self.driver_pose_sins[1], self.driver_pose_diff[1], is_horizontal=True
+ )
+
+ v_height = abs(delta_y)
+ self.v_arc_data = self._calculate_arc_data(
+ delta_y, v_height, self.position_x - ARC_LENGTH / 2, self.position_y,
+ self.driver_pose_sins[0], self.driver_pose_diff[0], is_horizontal=False
+ )
diff --git a/iqpilot/ui/onroad/hud_overlays.py b/iqpilot/ui/onroad/hud_overlays.py
new file mode 100644
index 000000000..33598f667
--- /dev/null
+++ b/iqpilot/ui/onroad/hud_overlays.py
@@ -0,0 +1,1024 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+Consolidated IQ.Pilot onroad overlays. Every HUD widget that decorates the
+driving view — the accel strip, blind-spot flags, speed readout, road-name
+capsule, turn indicators, nav-provider badge and lead chevron labels — lives
+here and paints through the shared canvas facade. Grouping them keeps one
+import surface and one drawing vocabulary for the whole overlay layer.
+"""
+import math
+import time
+
+import numpy as np
+import pyray as rl
+
+from cereal import car, custom
+from openpilot.common.constants import CV
+from openpilot.common.filter_simple import FirstOrderFilter
+from openpilot.selfdrive.ui.ui_state import ui_state
+from openpilot.selfdrive.ui.onroad.hud_renderer import COLORS, FONT_SIZES, UI_CONFIG
+from openpilot.selfdrive.ui.mici.onroad.alert_renderer import IconSide, TURN_SIGNAL_BLINK_PERIOD
+from openpilot.system.ui.lib.application import gui_app, FontWeight
+from openpilot.system.ui.lib.multilang import tr
+from openpilot.system.ui.widgets import Widget
+from openpilot.system.ui.iqwidgets.lib import canvas
+from iqdbc.car.volkswagen.values import VolkswagenFlags
+
+
+# --- shared state access -----------------------------------------------------
+
+def _feed():
+ return ui_state.sm
+
+
+def _speed_scale() -> float:
+ return CV.MS_TO_KPH if ui_state.is_metric else CV.MS_TO_MPH
+
+
+# ============================================================================
+# Accel strip
+# ============================================================================
+_STRIP_WIDTH = 28
+_STRIP_INSET = 14
+_STRIP_CEILING = 0.85
+_STRIP_EMA = 5.0
+_STRIP_ARC_SEGMENTS = 24
+_STRIP_ACCEL = (33, 112, 115)
+_STRIP_ACCEL_NEON = (94, 232, 236)
+_STRIP_DECEL = (255, 0, 247)
+_STRIP_DECEL_NEON = (255, 145, 251)
+_STRIP_TIP_ALPHA = 235
+_STRIP_ROOT_ALPHA = 55
+_STRIP_CORE_DEPTH = 7.0
+_STRIP_CORE_LAYERS = 8
+_STRIP_CORE_ALPHA = 0.15
+_STRIP_CORE_FLOOR = 0.3
+_STRIP_CORE_TAIL = 22.0
+_STRIP_HALO_SPREAD = 11.0
+_STRIP_HALO_LAYERS = 11
+_STRIP_HALO_ALPHA = 0.095
+_STRIP_HALO_TAIL = 34.0
+_STRIP_NEON_FULL = 2.0 # m/s^2 at which the edges reach full brightness
+
+
+class IQAccelBar:
+ def __init__(self):
+ self._eased = 0.0
+
+ def _reach(self) -> float:
+ mag = abs(self._eased)
+ return 0.0 if mag == 0.0 else max(0.0, _STRIP_CEILING - 0.1 / mag)
+
+ @staticmethod
+ def _tint(fill, frac: float):
+ return canvas.shade(*fill, int(_STRIP_TIP_ALPHA + (_STRIP_ROOT_ALPHA - _STRIP_TIP_ALPHA) * frac))
+
+ @staticmethod
+ def _halo(center, cap: float, up: bool, neon, heat: float, tail: float) -> None:
+ step = int(255 * _STRIP_HALO_ALPHA * heat)
+ if step < 1:
+ return
+ start, end = (180.0, 360.0) if up else (0.0, 180.0)
+ tint = canvas.shade(*neon, step)
+ faded = canvas.shade(*neon, 0)
+ top, bottom = (tint, faded) if up else (faded, tint)
+ for i in range(_STRIP_HALO_LAYERS):
+ spread = _STRIP_HALO_SPREAD * (1.0 - i / _STRIP_HALO_LAYERS)
+ if spread <= 0.0:
+ continue
+ canvas.annulus(center, cap, cap + spread, start, end, _STRIP_ARC_SEGMENTS, tint)
+ if tail <= 0.0:
+ continue
+ run = min(tail, _STRIP_HALO_TAIL)
+ y = center.y if up else center.y - run
+ canvas.v_sweep(center.x - cap - spread, y, spread, run, top, bottom)
+ canvas.v_sweep(center.x + cap, y, spread, run, top, bottom)
+
+ @staticmethod
+ def _cap(center, cap: float, up: bool, fill, neon, heat: float, tail: float) -> None:
+ start, end = (180.0, 360.0) if up else (0.0, 180.0)
+ canvas.annulus(center, 0.0, cap, start, end, _STRIP_ARC_SEGMENTS, fill)
+ IQAccelBar._halo(center, cap, up, neon, heat, tail)
+ lit = _STRIP_CORE_FLOOR + (1.0 - _STRIP_CORE_FLOOR) * heat
+ core = canvas.shade(*neon, max(1, int(255 * _STRIP_CORE_ALPHA * lit)))
+ faded = canvas.shade(*neon, 0)
+ top, bottom = (core, faded) if up else (faded, core)
+ run = min(tail, _STRIP_CORE_TAIL)
+ for i in range(_STRIP_CORE_LAYERS):
+ depth = _STRIP_CORE_DEPTH * (1.0 - i / _STRIP_CORE_LAYERS)
+ if depth <= 0.0:
+ continue
+ canvas.annulus(center, max(0.0, cap - depth), cap, start, end, _STRIP_ARC_SEGMENTS, core)
+ if run <= 0.0:
+ continue
+ y = center.y if up else center.y - run
+ canvas.v_sweep(center.x - cap, y, depth, run, top, bottom)
+ canvas.v_sweep(center.x + cap - depth, y, depth, run, top, bottom)
+
+ def render(self, rect, sm) -> None:
+ if not ui_state.rocket_fuel:
+ return
+ self._eased += (sm['carState'].aEgo - self._eased) / _STRIP_EMA
+ reach = self._reach() * rect.height / 2.0
+ if reach <= 0.0:
+ return
+ accelerating = self._eased > 0.0
+ mid = rect.y + rect.height / 2.0
+ top = mid - reach if accelerating else mid
+ x = rect.x + _STRIP_INSET
+ cap = min(_STRIP_WIDTH / 2.0, reach / 2.0)
+ fill, neon = (_STRIP_ACCEL, _STRIP_ACCEL_NEON) if accelerating else (_STRIP_DECEL, _STRIP_DECEL_NEON)
+ near = cap / reach
+ frac_top, frac_bottom = (near, 1.0 - near) if accelerating else (1.0 - near, near)
+ heat = min(abs(self._eased) / _STRIP_NEON_FULL, 1.0)
+
+ canvas.v_sweep(x, top + cap, cap * 2.0, reach - cap * 2.0,
+ self._tint(fill, frac_top), self._tint(fill, frac_bottom))
+ tail = max(0.0, reach / 2.0 - cap)
+ self._cap(canvas.Pt(x + cap, top + cap), cap, True, self._tint(fill, frac_top), neon, heat, tail)
+ self._cap(canvas.Pt(x + cap, top + reach - cap), cap, False, self._tint(fill, frac_bottom), neon, heat, tail)
+
+
+# ============================================================================
+# Blind-spot flags
+# ============================================================================
+_BS_INSET = 20
+_BS_DROP = 100
+_BS_MIN = 0.01
+
+
+class _BlindSide:
+ def __init__(self, name: str):
+ self.texture = gui_app.texture(f'icons_mici/onroad/blind_spot_{name}.png', 108, 128)
+ self.glow = FirstOrderFilter(0, 0.15, 1 / gui_app.target_fps)
+ self.on_left = name == "left"
+
+ def feed(self, present: bool):
+ self.glow.update(1.0 if present else 0.0)
+
+ def lit(self) -> bool:
+ return self.glow.x > _BS_MIN
+
+ def place(self, rect):
+ tex = self.texture
+ x = rect.x + _BS_INSET if self.on_left else rect.x + rect.width - _BS_INSET - tex.width
+ canvas.stamp(tex, x, rect.y + _BS_DROP, canvas.shade(255, 255, 255, int(255 * self.glow.x)))
+
+
+class IQBlindSpotOverlay:
+ def __init__(self):
+ self._left = _BlindSide("left")
+ self._right = _BlindSide("right")
+
+ def update(self) -> None:
+ cs = _feed()['carState']
+ self._left.feed(cs.leftBlindspot)
+ self._right.feed(cs.rightBlindspot)
+
+ @property
+ def detected(self) -> bool:
+ return self._left.lit() or self._right.lit()
+
+ def render(self, rect) -> None:
+ if not ui_state.blindspot:
+ return
+ for side in (self._left, self._right):
+ if side.lit():
+ side.place(rect)
+
+
+# ============================================================================
+# Speed readout
+# ============================================================================
+_MQB_CLUSTER_EXEMPT = (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB |
+ VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO)
+
+
+class IQSpeedOverlay:
+ def __init__(self):
+ self.speed: float = 0.0
+ self._cluster_ever_live: bool = False
+ self._heavy = gui_app.font(FontWeight.BOLD)
+ self._mid = gui_app.font(FontWeight.MEDIUM)
+
+ def _source_speed(self, cs) -> float:
+ cp = ui_state.CP
+ if cp is not None and cp.brand == "volkswagen" and not (cp.flags & _MQB_CLUSTER_EXEMPT):
+ return cs.vEgoCluster
+ self._cluster_ever_live = self._cluster_ever_live or cs.vEgoCluster != 0.0
+ return cs.vEgoCluster if self._cluster_ever_live else cs.vEgo
+
+ def update(self) -> None:
+ self.speed = max(0.0, self._source_speed(_feed()['carState']) * _speed_scale())
+
+ def _stack(self, face, text: str, size: int, rect, top: float, color) -> float:
+ extent = canvas.span(face, text, size)
+ canvas.glyphs(face, text, canvas.Pt(rect.x + (rect.width - extent.x) / 2, top), size, color)
+ return extent.y
+
+ def render(self, rect) -> None:
+ top = rect.y + 52
+ number_h = self._stack(self._heavy, str(round(self.speed)), FONT_SIZES.current_speed, rect, top, COLORS.WHITE)
+ unit = tr("km/h") if ui_state.is_metric else tr("mph")
+ self._stack(self._mid, unit, FONT_SIZES.speed_unit, rect, top + number_h - 10, COLORS.WHITE_TRANSLUCENT)
+
+
+# ============================================================================
+# Road-name capsule
+# ============================================================================
+def clip_to_width(font, words: str, size: int, limit: float) -> str:
+ if canvas.span(font, words, size).x <= limit:
+ return words
+ trimmed = words
+ while len(trimmed) > 3 and canvas.span(font, trimmed + "...", size).x > limit:
+ trimmed = trimmed[:-1]
+ return trimmed + "..."
+
+
+class RoadNameBanner(Widget):
+ TYPE_SIZE = 46
+ FLOOR_WIDTH = 200
+ SIDE_PAD = 40
+ MARGIN = 40
+ DROP = -4
+ BAR_H = 60
+ CURVE = 0.2
+ SEGS = 10
+ BACKDROP_A = 120
+ INK_A = 200
+ INNER_PAD = 20
+
+ def __init__(self):
+ super().__init__()
+ self.road_name = ""
+ self._face = gui_app.font(FontWeight.SEMI_BOLD)
+
+ def update(self):
+ sm = _feed()
+ if sm.recv_frame["carState"] < ui_state.started_frame:
+ return
+ if sm.updated["iqLiveData"]:
+ self.road_name = sm["iqLiveData"].roadName
+
+ def _render(self, rect):
+ if not self.road_name or not ui_state.road_name_toggle:
+ return
+ natural = canvas.span(self._face, self.road_name, self.TYPE_SIZE).x
+ bar_w = max(self.FLOOR_WIDTH, min(natural + self.SIDE_PAD, rect.width - self.MARGIN))
+ bar = canvas.Box(rect.x + (rect.width - bar_w) / 2, rect.y + self.DROP, bar_w, self.BAR_H)
+ canvas.panel(bar, self.CURVE, self.SEGS, canvas.shade(0, 0, 0, self.BACKDROP_A))
+ label = clip_to_width(self._face, self.road_name, self.TYPE_SIZE, bar.width - self.INNER_PAD)
+ extent = canvas.span(self._face, label, self.TYPE_SIZE)
+ canvas.glyphs(self._face, label,
+ canvas.Pt(bar.x + (bar.width - extent.x) / 2, bar.y + (bar.height - extent.y) / 2),
+ self.TYPE_SIZE, canvas.shade(255, 255, 255, self.INK_A))
+
+
+RoadNameRenderer = RoadNameBanner
+ellipsize = clip_to_width
+
+
+# ============================================================================
+# Turn indicators
+# ============================================================================
+from dataclasses import dataclass, field
+
+_ARROW = 'signal'
+_WARN = 'blind_spot'
+
+
+@dataclass(frozen=True)
+class TurnSignalConfig:
+ left_x: int = 80
+ left_y: int = 190
+ right_x: int = 80
+ right_y: int = 190
+ size: int = 150
+
+
+class _IndicatorLamp(Widget):
+ def __init__(self, direction: IconSide):
+ super().__init__()
+ self.mode: str | None = None
+ self._epoch = 0.0
+ self._glow = FirstOrderFilter(0.0, 0.3, 1 / gui_app.target_fps)
+ self._art = {
+ _ARROW: gui_app.texture(f'icons_mici/onroad/turn_signal_{direction}.png', 120, 109),
+ _WARN: gui_app.texture(f'icons_mici/onroad/blind_spot_{direction}.png', 120, 109),
+ }
+
+ def set_mode(self, mode: str | None):
+ if mode != self.mode or mode is None:
+ self._epoch = 0.0
+ self.mode = mode
+
+ def _pulse(self) -> int:
+ # onroad/offroad run at different target_fps (set_target_fps only takes effect after this
+ # widget is constructed at offroad startup), so re-derive dt each frame instead of trusting
+ # the fps baked in at __init__ — otherwise the glow decays ~3x too slowly onroad and never
+ # visibly dims before the next reset, reading as a static-on arrow instead of a blink.
+ self._glow.dt = 1 / gui_app.target_fps
+ self._glow.update_alpha(0.3)
+ if time.monotonic() - self._epoch > TURN_SIGNAL_BLINK_PERIOD:
+ self._epoch = time.monotonic()
+ self._glow.x = 255 * 2
+ else:
+ self._glow.update(255 * 0.2)
+ return int(min(self._glow.x, 255))
+
+ def _render(self, _):
+ if self.mode is None:
+ return
+ alpha = self._pulse() if self.mode == _ARROW else 255
+ tex = self._art[self.mode]
+ canvas.stamp(tex, self._rect.x + (self._rect.width - tex.width) / 2,
+ self._rect.y + (self._rect.height - tex.height) / 2, canvas.shade(255, 255, 255, alpha))
+
+
+def _lamp_modes(event_name: str, cs, remembered):
+ if event_name == 'preLaneChangeLeft':
+ return _ARROW, None, IconSide.left
+ if event_name == 'preLaneChangeRight':
+ return None, _ARROW, IconSide.right
+ if event_name == 'laneChange':
+ if remembered == IconSide.left:
+ return _ARROW, None, remembered
+ if remembered == IconSide.right:
+ return None, _ARROW, remembered
+ return None, None, remembered
+ if event_name == 'laneChangeBlocked':
+ side = IconSide.left if cs.leftBlinker else IconSide.right if cs.rightBlinker else remembered
+ if side == IconSide.left:
+ return _WARN, None, remembered
+ if side == IconSide.right:
+ return None, _WARN, remembered
+ return None, None, remembered
+ left = _WARN if cs.leftBlindspot else _ARROW if cs.leftBlinker else None
+ right = _WARN if cs.rightBlindspot else _ARROW if cs.rightBlinker else None
+ return left, right, None
+
+
+class IQTurnSignalOverlay:
+ def __init__(self, config: TurnSignalConfig | None = None):
+ self._config = config or TurnSignalConfig()
+ self._lamps = {IconSide.left: _IndicatorLamp(IconSide.left),
+ IconSide.right: _IndicatorLamp(IconSide.right)}
+ self._remembered: IconSide | None = None
+
+ def update(self):
+ sm = _feed()
+ alert = sm['selfdriveState'].alertType
+ event_name = alert.split('/')[0] if alert else ''
+ left, right, self._remembered = _lamp_modes(event_name, sm['carState'], self._remembered)
+ self._lamps[IconSide.left].set_mode(left)
+ self._lamps[IconSide.right].set_mode(right)
+
+ def render(self, rect):
+ if not ui_state.turn_signals:
+ return
+ c = self._config
+ mid_x = rect.x + rect.width / 2
+ spots = {
+ IconSide.left: canvas.Box(mid_x - c.left_x - c.size, rect.y + c.left_y, c.size, c.size),
+ IconSide.right: canvas.Box(mid_x + c.right_x, rect.y + c.right_y, c.size, c.size),
+ }
+ for side, lamp in self._lamps.items():
+ if lamp.mode is not None:
+ lamp.render(spots[side])
+
+ @property
+ def config(self) -> TurnSignalConfig:
+ return self._config
+
+ @config.setter
+ def config(self, new_config: TurnSignalConfig):
+ self._config = new_config
+
+
+# ============================================================================
+# Nav-influence provider badge
+# ============================================================================
+_PROVIDER_TAGS = {0: "", 1: "NAV", 2: "MBX", 3: "VIS", 4: "OSM"}
+_NAV_TEX_W, _NAV_TEX_H = 256, 128
+_NAV_BADGE_W = 160
+_NAV_FONT = 36
+_NAV_SHIFT = -260
+
+
+class NavInfluenceRenderer(Widget):
+ def __init__(self):
+ super().__init__()
+ self.engaged = False
+ self.valid = False
+ self.provider = 0
+ self.long_override = False
+ self._streak = 0
+ self.font = gui_app.font(FontWeight.BOLD)
+ self._offscreen = rl.load_render_texture(_NAV_TEX_W, _NAV_TEX_H)
+
+ def update(self):
+ sm = _feed()
+ if sm.updated["iqPlan"]:
+ nav = sm["iqPlan"].iqNavState.nav
+ self.engaged = nav.engaged
+ self.valid = nav.valid
+ self.provider = getattr(nav.provider, "raw", nav.provider)
+ if sm.updated["carControl"]:
+ self.long_override = sm["carControl"].cruiseControl.override
+ self._streak = self._streak + 1 if (self.engaged and self.valid) else 0
+
+ def _blinked_off(self) -> bool:
+ fps = gui_app.target_fps
+ return self.engaged and (self._streak % fps) < (fps / 2.5)
+
+ def _bake(self, label: str):
+ extent = canvas.span(self.font, label, _NAV_FONT)
+ badge = canvas.Box((_NAV_TEX_W - _NAV_BADGE_W) // 2, (_NAV_TEX_H - extent.y - 10) // 2,
+ _NAV_BADGE_W, int(extent.y + 10))
+ rl.begin_texture_mode(self._offscreen)
+ rl.clear_background(canvas.CLEAR)
+ canvas.panel(badge, 0.2, 10, COLORS.OVERRIDE if self.long_override else canvas.shade(0, 255, 0, 255))
+ rl.rl_set_blend_factors(rl.RL_ZERO, rl.RL_ONE_MINUS_SRC_ALPHA, 0x8006)
+ rl.rl_set_blend_mode(rl.BLEND_CUSTOM)
+ canvas.glyphs(self.font, label,
+ canvas.Pt(badge.x + (badge.width - extent.x) / 2, badge.y + (badge.height - extent.y) / 2),
+ _NAV_FONT, canvas.WHITE)
+ rl.rl_set_blend_mode(rl.BLEND_ALPHA)
+ rl.end_texture_mode()
+
+ def _render(self, rect):
+ if not self.valid or self._blinked_off():
+ return
+ label = _PROVIDER_TAGS.get(int(self.provider), "NAV")
+ if not label:
+ return
+ self._bake(label)
+ ax = rect.x + rect.width / 2 + _NAV_SHIFT - _NAV_TEX_W / 2
+ ay = (rect.height / 4 - 40) - _NAV_TEX_H / 2
+ canvas.stamp_scaled(self._offscreen.texture, canvas.Box(0, 0, _NAV_TEX_W, -_NAV_TEX_H),
+ canvas.Box(ax, ay, _NAV_TEX_W, _NAV_TEX_H), canvas.Pt(0, 0), 0, canvas.WHITE)
+
+
+# ============================================================================
+# Lead chevron labels
+# ============================================================================
+class ChevronOptions:
+ OFF = 0
+ DISTANCE_ONLY = 1
+ SPEED_ONLY = 2
+ TTC_ONLY = 3
+ ALL = 4
+
+
+_CH_FONT = 40
+_CH_LINE = 50
+_CH_MARGIN = 20
+_CH_FADE_DOWN = 0.05
+_CH_FADE_UP = 0.1
+_CH_DEDUP = 3.0
+
+
+def _gap_label(d_rel: float, _v_abs: float) -> str:
+ val = max(0.0, d_rel)
+ return f"{val:.0f} m" if ui_state.is_metric else f"{val * 3.28084:.0f} ft"
+
+
+def _pace_label(_d_rel: float, v_abs: float) -> str:
+ unit = "km/h" if ui_state.is_metric else "mph"
+ return f"{max(0.0, v_abs * _speed_scale()):.0f} {unit}"
+
+
+def _ttc_label(d_rel: float, _v_abs: float, v_ego: float) -> str:
+ ttc = (d_rel / v_ego) if (d_rel > 0 and v_ego > 0) else 0.0
+ return f"{ttc:.1f} s" if 0 < ttc < 200 else "---"
+
+
+_CH_METRICS = (
+ ((ChevronOptions.DISTANCE_ONLY, ChevronOptions.ALL), lambda d, va, ve: _gap_label(d, va)),
+ ((ChevronOptions.SPEED_ONLY, ChevronOptions.ALL), lambda d, va, ve: _pace_label(d, va)),
+ ((ChevronOptions.TTC_ONLY, ChevronOptions.ALL), _ttc_label),
+)
+
+
+class ChevronMetrics:
+ def __init__(self):
+ self._alpha: float = 0.0
+ self._font = gui_app.font(FontWeight.SEMI_BOLD)
+
+ def update_alpha(self, has_lead: bool):
+ self._alpha = float(np.clip(self._alpha + (_CH_FADE_UP if has_lead else -_CH_FADE_DOWN), 0.0, 1.0))
+
+ def should_render(self) -> bool:
+ return ui_state.chevron_metrics != ChevronOptions.OFF and self._alpha > 0.0
+
+ @staticmethod
+ def _marker_size(d_rel: float) -> float:
+ return float(np.clip((25 * 30) / (d_rel / 3 + 30), 15.0, 30.0)) * 2.35
+
+ def _labels(self, d_rel: float, v_rel: float, v_ego: float) -> list[str]:
+ mode = ui_state.chevron_metrics
+ return [fn(d_rel, v_rel + v_ego, v_ego) for modes, fn in _CH_METRICS if mode in modes]
+
+ def _top_y(self, anchor_y: float, size: float, n: int, rect) -> float:
+ y = anchor_y + size + 15
+ block = n * _CH_LINE
+ floor = rect.y + rect.height - _CH_MARGIN
+ if y + block > floor:
+ y = max(rect.y + _CH_MARGIN, min(anchor_y, floor) - 15 - block)
+ return y
+
+ def _stack(self, lines, cx: float, top: float, rect):
+ a = self._alpha
+ fg = canvas.shade(255, 255, 255, int(255 * a))
+ shadow = canvas.shade(0, 0, 0, int(200 * a))
+ floor = rect.y + rect.height - _CH_MARGIN
+ for i, line in enumerate(lines):
+ y = int(top + i * _CH_LINE)
+ if y + _CH_LINE > floor:
+ break
+ w = canvas.span(self._font, line, _CH_FONT).x
+ x = int(np.clip(cx - w / 2, rect.x + _CH_MARGIN, rect.x + rect.width - w - _CH_MARGIN))
+ canvas.glyphs(self._font, line, canvas.Pt(x + 2, y + 2), _CH_FONT, shadow)
+ canvas.glyphs(self._font, line, canvas.Pt(x, y), _CH_FONT, fg)
+
+ def _one_lead(self, lead, marker, v_ego: float, rect):
+ if not self.should_render() or marker.center is None:
+ return
+ lines = self._labels(lead.dRel, lead.vRel, v_ego)
+ if not lines:
+ return
+ self._stack(lines, marker.center[0], self._top_y(marker.center[1], self._marker_size(lead.dRel), len(lines), rect), rect)
+
+ @staticmethod
+ def _active_leads(radar_state, markers):
+ """Yield (lead, marker) for tracked leads with a projected marker, dropping a
+ second lead that sits within the dedup band of the first."""
+ tracked = []
+ for lead, marker in zip((radar_state.leadOne, radar_state.leadTwo), markers, strict=False):
+ if lead and lead.status and marker.center is not None:
+ tracked.append((lead, marker))
+ if len(tracked) == 2 and abs(tracked[0][0].dRel - tracked[1][0].dRel) <= _CH_DEDUP:
+ tracked.pop()
+ return tracked
+
+ def draw_lead_status(self, sm, radar_state, rect, lead_vehicles):
+ present = [radar_state.leadOne, radar_state.leadTwo]
+ self.update_alpha(any(bool(x) and x.status for x in present))
+ if not self.should_render():
+ return
+ v_ego = sm['carState'].vEgo
+ for lead, marker in self._active_leads(radar_state, lead_vehicles):
+ self._one_lead(lead, marker, v_ego, rect)
+
+
+# ============================================================================
+# Developer telemetry bar
+# ============================================================================
+
+_TEAL = canvas.shade(0x0C, 0x94, 0x96, 0xFF)
+_AMBER = canvas.shade(255, 188, 0, 255)
+_GREEN = canvas.shade(0, 255, 0, 255)
+_GREY = canvas.shade(145, 155, 149, 255)
+_G = 9.81
+_BAR_FONT = 38
+_ANGLE_TYPES = (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED)
+
+
+@dataclass
+class Readout:
+ """One bar cell: 'TAG value unit', with each part pre-measured for layout."""
+ tag: str
+ value: str
+ unit: str = ""
+ color: object = field(default_factory=lambda: canvas.WHITE)
+ tag_text: str = ""
+ value_text: str = ""
+ unit_text: str = ""
+ tag_w: float = 0.0
+ value_w: float = 0.0
+ unit_w: float = 0.0
+ span: float = 0.0
+
+ def size_up(self, font, px: int):
+ self.tag_text = f"{self.tag} "
+ self.value_text = self.value
+ self.unit_text = f" {self.unit}" if self.unit else ""
+ self.tag_w = canvas.span(font, self.tag_text, px, 0).x
+ self.value_w = canvas.span(font, self.value_text, px, 0).x
+ self.unit_w = canvas.span(font, self.unit_text, px, 0).x if self.unit else 0
+ self.span = self.tag_w + self.value_w + self.unit_w
+
+ # kept for external callers that used the old field/method names
+ @property
+ def total_width(self):
+ return self.span
+
+ def measure(self, font, px):
+ self.size_up(font, px)
+
+
+UiElement = Readout
+
+
+# --- grading -----------------------------------------------------------------
+
+def _banded(magnitude, warn, crit, ok):
+ if magnitude > crit:
+ return canvas.RED
+ return _AMBER if magnitude > warn else ok
+
+
+def _closing(v_rel):
+ return _banded(-v_rel if v_rel < 0 else 0.0, 0.0, 4.4704, canvas.WHITE)
+
+
+def _following(d_rel):
+ if d_rel < 5:
+ return canvas.RED
+ return _AMBER if d_rel < 15 else canvas.WHITE
+
+
+def _steer_tint(sm):
+ if not sm['carControl'].latActive:
+ return canvas.WHITE
+ return _GREY if sm['carState'].steeringPressed else _TEAL
+
+
+def _angle_tint(sm, deg):
+ floor = _steer_tint(sm) if sm['carControl'].latActive else canvas.WHITE
+ return _banded(abs(deg), 90.0, 180.0, floor)
+
+
+def _yaw_offset(sm):
+ return sm['liveParameters'].angleOffsetAverageDeg if sm.valid['liveParameters'] else 0.0
+
+
+def _bank(sm):
+ return sm['liveParameters'].roll if sm.valid['liveParameters'] else 0.0
+
+
+def _units(is_metric):
+ return (CV.MS_TO_KPH, "km/h") if is_metric else (CV.MS_TO_MPH, "mph")
+
+
+def _fix(sm):
+ for svc in ('gpsLocationExternal', 'gpsLocation'):
+ if sm.valid[svc]:
+ return sm[svc], svc
+ return None, None
+
+
+# --- probes (sm, is_metric) -> Readout ---------------------------------------
+
+def steering_angle(sm, is_metric):
+ deg = sm['carState'].steeringAngleDeg - _yaw_offset(sm)
+ return Readout("R.S.", f"{deg:.1f}°", color=_angle_tint(sm, deg))
+
+
+def desired_steering_angle(sm, is_metric):
+ live = sm['carControl'].latActive
+ off = _yaw_offset(sm)
+ lat = sm['controlsState'].lateralControlState
+ if lat.which() == 'angleState':
+ want = lat.angleState.steeringAngleDesiredDeg - off
+ else:
+ want = sm['carControl'].actuators.steeringAngleDeg - off
+ seen = sm['carState'].steeringAngleDeg - off
+ tint = _banded(abs(seen), 90.0, 180.0, _TEAL) if live else canvas.WHITE
+ return Readout("D.S.", f"{want:.1f}°" if live else "-", color=tint)
+
+
+def desired_steering_pid(sm, is_metric):
+ live = sm['carControl'].latActive
+ off = _yaw_offset(sm)
+ want = sm['controlsState'].lateralControlState.pidState.steeringAngleDesiredDeg - off
+ seen = sm['carState'].steeringAngleDeg - off
+ tint = _banded(abs(seen), 90.0, 180.0, _TEAL) if live else canvas.WHITE
+ return Readout("D.S.", f"{want:.1f}°" if live else "-", color=tint)
+
+
+def actual_lat_accel(sm, is_metric):
+ a = sm['controlsState'].curvature * sm['carState'].vEgo ** 2 - _bank(sm) * _G
+ return Readout("A.L.A.", f"{a:.2f}", "m/s^2", _steer_tint(sm))
+
+
+def desired_lat_accel(sm, is_metric):
+ live = sm['carControl'].latActive
+ a = sm['controlsState'].desiredCurvature * sm['carState'].vEgo ** 2 - _bank(sm) * _G
+ return Readout("D.L.A.", f"{a:.2f}" if live else "-", "m/s^2", _steer_tint(sm))
+
+
+def a_ego(sm, is_metric):
+ return Readout("L.ACC.", f"{sm['carState'].aEgo:.1f}", "m/s^2")
+
+
+def lead_distance(sm, is_metric):
+ lead = sm['radarState'].leadOne
+ return Readout("REL DIST", "-", "m") if not lead.status else Readout("REL DIST", f"{lead.dRel:.0f}", "m", _following(lead.dRel))
+
+
+def lead_rel_speed(sm, is_metric):
+ lead = sm['radarState'].leadOne
+ k, unit = _units(is_metric)
+ return Readout("REL SPEED", "-", unit) if not lead.status else Readout("REL SPEED", f"{lead.vRel * k:.0f}", unit, _closing(lead.vRel))
+
+
+def lead_speed(sm, is_metric):
+ lead = sm['radarState'].leadOne
+ k, unit = _units(is_metric)
+ if not lead.status:
+ return Readout("L.S.", "-", unit)
+ return Readout("L.S.", f"{(lead.vRel + sm['carState'].vEgo) * k:.0f}", unit, _closing(lead.vRel))
+
+
+def friction_coefficient(sm, is_metric):
+ ltp = sm['liveTorqueParameters']
+ return Readout("FRIC.", f"{ltp.frictionCoefficientFiltered:.3f}", color=_GREEN if ltp.liveValid else canvas.WHITE)
+
+
+def lat_accel_factor(sm, is_metric):
+ ltp = sm['liveTorqueParameters']
+ return Readout("L.A.F.", f"{ltp.latAccelFactorFiltered:.3f}", color=_GREEN if ltp.liveValid else canvas.WHITE)
+
+
+def eps_torque(sm, is_metric):
+ return Readout("E.T.", f"{abs(sm['carState'].steeringTorqueEps):.1f}", "N·dm")
+
+
+_COMPASS = ("N", "NE", "E", "SE", "S", "SW", "W", "NW")
+
+
+def bearing(sm, is_metric):
+ fix, _ = _fix(sm)
+ if fix is None or fix.bearingAccuracyDeg == 180.0:
+ return Readout("B.D.", "OFF | -")
+ heading = _COMPASS[int(((fix.bearingDeg + 22.5) % 360) // 45)]
+ return Readout("B.D.", f"{heading} | {fix.bearingDeg:.0f}°")
+
+
+def altitude(sm, is_metric):
+ fix, svc = _fix(sm)
+ if fix is None:
+ return Readout("ALT.", "-", "m")
+ acc = fix.horizontalAccuracy if svc == 'gpsLocationExternal' else 1.0
+ return Readout("ALT.", f"{fix.altitude:.1f}" if acc != 0.0 else "-", "m")
+
+
+def _desired_probe(sm):
+ """The 'desired' cell tracks whichever lateral controller is live."""
+ if sm['controlsState'].lateralControlState.which() == 'angleState':
+ return desired_steering_angle
+ if ui_state.CP is not None and ui_state.CP.steerControlType in _ANGLE_TYPES:
+ return desired_steering_angle
+ if sm['controlsState'].lateralControlState.which() == 'pidState':
+ return desired_steering_pid
+ return desired_lat_accel
+
+
+class IQDevMetricsOverlay(Widget):
+ DEV_UI_OFF = 0
+ DEV_UI_RIGHT = 1
+ DEV_UI_BOTTOM = 2
+ DEV_UI_BOTH = 3
+ BOTTOM_BAR_HEIGHT = 61
+
+ def __init__(self):
+ super().__init__()
+ self._face = gui_app.font(FontWeight.BOLD)
+ self.dev_ui_mode = self.DEV_UI_OFF
+
+ @staticmethod
+ def get_bottom_dev_ui_offset():
+ return IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT if ui_state.developer_ui != IQDevMetricsOverlay.DEV_UI_OFF else 0
+
+ def _update_state(self) -> None:
+ self.dev_ui_mode = ui_state.developer_ui
+
+ def _render(self, rect) -> None:
+ if self.dev_ui_mode == self.DEV_UI_OFF:
+ return
+ sm = ui_state.sm
+ if sm.recv_frame["carState"] < ui_state.started_frame:
+ return
+ self._paint_bar(rect)
+
+ def _gather(self, sm):
+ probes = (_desired_probe(sm), actual_lat_accel, steering_angle, a_ego, lead_speed)
+ cells = [probe(sm, ui_state.is_metric) for probe in probes]
+ for cell in cells:
+ cell.size_up(self._face, _BAR_FONT)
+ return cells
+
+ def _paint_bar(self, rect) -> None:
+ height = self.BOTTOM_BAR_HEIGHT
+ top = int(rect.y + rect.height - height)
+ canvas.slab(rect.x, top, rect.width, height, canvas.shade(0, 0, 0, 100))
+
+ cells = self._gather(ui_state.sm)
+ slack = (rect.width - sum(c.span for c in cells)) / (len(cells) + 1)
+ baseline = top + height // 2 - _BAR_FONT // 2
+
+ cursor = rect.x + slack
+ for cell in cells:
+ self._paint_cell(cursor, baseline, cell)
+ cursor += cell.span + slack
+
+ def _paint_cell(self, x, y, cell) -> None:
+ canvas.glyphs(self._face, cell.tag_text, canvas.Pt(x, y), _BAR_FONT, canvas.WHITE)
+ canvas.glyphs(self._face, cell.value_text, canvas.Pt(x + cell.tag_w, y), _BAR_FONT, cell.color)
+ if cell.unit:
+ canvas.glyphs(self._face, cell.unit_text, canvas.Pt(x + cell.tag_w + cell.value_w, y), _BAR_FONT, canvas.WHITE)
+
+
+# ============================================================================
+# Speed-limit sign (Vienna / MUTCD) + limit-ahead preview + assist arrows
+# ============================================================================
+_SL_M_TO_FT = 3.28084
+_SL_M_TO_MI = 0.000621371
+_SL_AHEAD_STEPS = 5
+_SL_ASSIST = custom.IQPlan.SpeedLimit.AssistState
+_SL_SOURCE = custom.IQPlan.SpeedLimit.Source
+_SL_GREY = canvas.shade(145, 155, 149, 255)
+_SL_DARK = canvas.shade(77, 77, 77, 255)
+_SL_PANEL_BG = canvas.shade(0, 0, 0, 180)
+_SL_PANEL_EDGE = canvas.shade(255, 255, 255, 100)
+
+
+def _dim(color, alpha: float):
+ return canvas.with_opacity(color, 255 * alpha)
+
+
+class IQSpeedLimitOverlay(Widget):
+ """Regulatory sign, upcoming-limit preview and pre-active nudge arrows."""
+
+ def __init__(self):
+ super().__init__()
+ self.speed_limit = 0.0
+ self.speed_limit_last = 0.0
+ self.speed_limit_offset = 0.0
+ self.speed_limit_valid = False
+ self.speed_limit_last_valid = False
+ self.speed_limit_final_last = 0.0
+ self.speed_limit_source = _SL_SOURCE.none
+ self.assist_state = _SL_ASSIST.disabled
+
+ self.ahead_limit = 0.0
+ self.ahead_dist = 0.0
+ self._ahead_prev = 0.0
+ self.ahead_valid = False
+ self._ahead_streak = 0
+
+ self.assist_frame = 0
+ self.speed = 0.0
+ self.set_speed = 0.0
+
+ self._bold = gui_app.font(FontWeight.BOLD)
+ self._demi = gui_app.font(FontWeight.SEMI_BOLD)
+ self._norm = gui_app.font(FontWeight.NORMAL)
+ self._pulse_ema = FirstOrderFilter(1.0, 0.5, 1 / gui_app.target_fps)
+
+ px = 90
+ self._up = gui_app.texture("../../iqpilot/selfdrive/assets/img_plus_arrow_up.png", px, px)
+ self._down = gui_app.texture("../../iqpilot/selfdrive/assets/img_minus_arrow_down.png", px, px)
+
+ @property
+ def speed_limit_assist_state(self):
+ return self.assist_state
+
+ @property
+ def _scale(self):
+ return CV.MS_TO_KPH if ui_state.is_metric else CV.MS_TO_MPH
+
+ def _take_plan(self, lp_iq):
+ k = self._scale
+ r = lp_iq.speedLimit.resolver
+ self.speed_limit = r.speedLimit * k
+ self.speed_limit_last = r.speedLimitLast * k
+ self.speed_limit_offset = r.speedLimitOffset * k
+ self.speed_limit_valid = r.speedLimitValid
+ self.speed_limit_last_valid = r.speedLimitLastValid
+ self.speed_limit_final_last = r.speedLimitFinalLast * k
+ self.speed_limit_source = r.source
+ self.assist_state = lp_iq.speedLimit.assist.state
+
+ def _take_ahead(self, lmd):
+ self.ahead_valid = lmd.speedLimitAheadValid
+ self.ahead_limit = lmd.speedLimitAhead * self._scale
+ self.ahead_dist = lmd.speedLimitAheadDistance
+ if self.ahead_dist < self._ahead_prev:
+ self._ahead_streak = min(_SL_AHEAD_STEPS, self._ahead_streak + 1)
+ elif self.ahead_dist > self._ahead_prev:
+ self._ahead_streak = max(0, self._ahead_streak - 1)
+ self._ahead_prev = self.ahead_dist
+
+ def update(self):
+ sm = _feed()
+ if sm.recv_frame["carState"] < ui_state.started_frame:
+ return
+ if sm.updated["iqPlan"]:
+ self._take_plan(sm["iqPlan"])
+ if sm.updated["iqLiveData"]:
+ self._take_ahead(sm["iqLiveData"])
+ cs = sm["carState"]
+ self.set_speed = cs.cruiseState.speed * self._scale
+ v_ego = cs.vEgoCluster if cs.vEgoCluster != 0.0 else cs.vEgo
+ self.speed = max(0.0, v_ego * self._scale)
+
+ def _spec(self):
+ has_limit = self.speed_limit_valid or self.speed_limit_last_valid
+ value = str(round(self.speed_limit_last)) if has_limit else "---"
+ badge = ""
+ if self.speed_limit_offset != 0:
+ badge = f"{'' if self.speed_limit_offset > 0 else '-'}{round(abs(self.speed_limit_offset))}"
+ warn = ui_state.speed_limit_mode >= 2 # SpeedLimitMode.warning
+ over = has_limit and round(self.speed_limit_final_last) < round(self.speed)
+ tint = canvas.RED if (warn and over) else (_SL_GREY if not self.speed_limit_valid else canvas.BLACK)
+ return value, badge, tint, has_limit
+
+ def _render(self, rect):
+ if ui_state.speed_limit_mode == 0: # SpeedLimitMode.off
+ return
+ w = UI_CONFIG.set_speed_width_metric if ui_state.is_metric else UI_CONFIG.set_speed_width_imperial
+ sign = canvas.Box(rect.x + 60 - 6, rect.y + 45 + UI_CONFIG.set_speed_height + 12, w + 12, 160)
+ if self.assist_state == _SL_ASSIST.preActive:
+ self.assist_frame += 1
+ pulse = 0.65 + 0.35 * math.sin(self.assist_frame * math.pi / gui_app.target_fps)
+ self._sign(sign, self._pulse_ema.update(pulse))
+ self._nudge_arrow(sign)
+ else:
+ self.assist_frame = 0
+ self._pulse_ema.update(1.0)
+ self._sign(sign)
+ self._ahead(sign)
+
+ def _sign(self, rect, alpha=1.0):
+ value, badge, tint, has_limit = self._spec()
+ (self._vienna if ui_state.is_metric else self._mutcd)(rect, value, badge, tint, has_limit, alpha)
+
+ def _nudge_arrow(self, sign):
+ delta = round(self.speed_limit_final_last) - round(self.set_speed)
+ if delta == 0:
+ return
+ arrow = self._up if delta > 0 else self._down
+ bounce = int(20 * math.sin(self.assist_frame * 2.0 * math.pi / (gui_app.target_fps * 2.5)))
+ x = sign.x + (sign.width - arrow.width) / 2
+ y = sign.y + (sign.height - arrow.height) / 2 + (bounce if delta > 0 else -bounce)
+ canvas.stamp(arrow, x, y, canvas.WHITE)
+
+ def _vienna(self, rect, value, badge, tint, has_limit, alpha=1.0):
+ hub = canvas.Pt(rect.x + rect.width / 2, rect.y + rect.height / 2)
+ radius = (rect.width + 18) / 2
+ canvas.disc_at(hub, radius, _dim(canvas.WHITE, alpha))
+ canvas.annulus(hub, radius * 0.80, radius, 0, 360, 36, _dim(canvas.RED, alpha))
+ canvas.glyphs_centered(self._bold, value, 70 if len(value) >= 3 else 85, hub, _dim(tint, alpha))
+ if badge and has_limit:
+ br = radius * 0.4
+ bc = canvas.Pt(rect.x + rect.width - br / 2, rect.y + br / 2)
+ canvas.disc_at(bc, br, _dim(canvas.BLACK, alpha))
+ canvas.annulus(bc, br - 3, br, 0, 360, 36, _dim(_SL_DARK, alpha))
+ canvas.glyphs_centered(self._bold, badge, int(br * 2 * (0.5 if len(badge) < 3 else 0.45)), bc, _dim(canvas.WHITE, alpha))
+
+ def _mutcd(self, rect, value, badge, tint, has_limit, alpha=1.0):
+ canvas.panel(rect, 0.35, 10, _dim(canvas.WHITE, alpha))
+ inner = canvas.Box(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20)
+ canvas.panel_outline(inner, 0.35, 10, 4, _dim(canvas.BLACK, alpha))
+ mid = rect.x + rect.width / 2
+ canvas.glyphs_centered(self._demi, "SPEED", 40, canvas.Pt(mid, rect.y + 40), _dim(canvas.BLACK, alpha))
+ canvas.glyphs_centered(self._demi, "LIMIT", 40, canvas.Pt(mid, rect.y + 80), _dim(canvas.BLACK, alpha))
+ canvas.glyphs_centered(self._bold, value, 90, canvas.Pt(mid, rect.y + 150), _dim(tint, alpha))
+ if badge and has_limit:
+ side = rect.width * 0.3
+ overlap = side * 0.2
+ chip = canvas.Box(rect.x + rect.width - side / 1.5 + overlap, rect.y - side / 1.25 + overlap, side, side)
+ canvas.panel(chip, 0.35, 10, _dim(canvas.BLACK, alpha))
+ canvas.panel_outline(chip, 0.35, 10, 6, _dim(_SL_DARK, alpha))
+ canvas.glyphs_centered(self._bold, badge, int(side * (0.6 if len(badge) < 3 else 0.475)),
+ canvas.Pt(chip.x + side / 2, chip.y + side / 2), _dim(canvas.WHITE, alpha))
+
+ def _ahead(self, sign):
+ if not (self.ahead_valid and self.ahead_limit > 0 and self.ahead_limit != self.speed_limit_last and self._ahead_streak > 0):
+ return
+ panel = canvas.Box(sign.x + (sign.width - 170) / 2, sign.y + sign.height + 10, 170, 160)
+ canvas.panel(panel, 0.35, 10, _SL_PANEL_BG)
+ canvas.panel_outline(panel, 0.35, 10, 3, _SL_PANEL_EDGE)
+ mid = panel.x + panel.width / 2
+ canvas.glyphs_centered(self._demi, "AHEAD", 40, canvas.Pt(mid, panel.y + 28), _SL_GREY)
+ canvas.glyphs_centered(self._bold, str(round(self.ahead_limit)), 70, canvas.Pt(mid, panel.y + 82), canvas.WHITE)
+ canvas.glyphs_centered(self._norm, self._dist(self.ahead_dist), 36, canvas.Pt(mid, panel.y + 134), _SL_GREY)
+
+ @staticmethod
+ def _dist(d):
+ if ui_state.is_metric:
+ if d < 50:
+ return tr("Near")
+ if d >= 1000:
+ return f"{d / 1000:.1f} km"
+ return f"{int(round(d, -1) if d < 200 else round(d, -2))} m"
+ ft = d * _SL_M_TO_FT
+ if ft < 100:
+ return tr("Near")
+ if ft >= 900:
+ return f"{d * _SL_M_TO_MI:.1f} mi"
+ step = 50 if ft < 500 else 100
+ return f"{int(round(ft / step) * step)} ft"
diff --git a/iqpilot/ui/onroad/hud_renderer.py b/iqpilot/ui/onroad/hud_renderer.py
new file mode 100644
index 000000000..a329ae6d3
--- /dev/null
+++ b/iqpilot/ui/onroad/hud_renderer.py
@@ -0,0 +1,90 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot road-view HUD: extends the stock renderer and layers on the IQ overlays
+(developer bar, nav map, road name, speed + speed-limit, turn signals, rocket-fuel
+accel bar, soft warnings, steering arc).
+"""
+import pyray as rl
+
+from openpilot.selfdrive.ui.mici.onroad.torque_bar import TorqueBar
+from openpilot.selfdrive.ui.ui_state import ui_state
+from openpilot.selfdrive.ui.onroad.hud_renderer import HudRenderer
+from openpilot.iqpilot.ui.onroad.hud_overlays import (
+ IQDevMetricsOverlay,
+ RoadNameRenderer,
+ IQAccelBar,
+ IQSpeedLimitOverlay,
+ IQTurnSignalOverlay,
+ IQSpeedOverlay,
+)
+from openpilot.iqpilot.ui.onroad.nav_map_panel import NavMapPanel
+from openpilot.iqpilot.ui.onroad.soft_warning import SoftWarningRenderer
+
+ENABLE_FLOATING_NAV_MAP_PANEL = False
+ENABLE_SPLIT_NAV_MAP_PANEL = True
+
+
+class IQHudRenderer(HudRenderer):
+ def __init__(self):
+ super().__init__()
+ self.developer_ui = IQDevMetricsOverlay()
+ self.nav_map_panel = NavMapPanel()
+ self.road_name_renderer = RoadNameRenderer()
+ self.rocket_fuel = IQAccelBar()
+ self.speed_limit_renderer = IQSpeedLimitOverlay()
+ self.turn_signal_controller = IQTurnSignalOverlay()
+ self.speed_renderer = IQSpeedOverlay()
+ self.soft_warning_renderer = SoftWarningRenderer()
+ self._torque_bar = TorqueBar(scale=3.0, always=True)
+
+ def _update_state(self) -> None:
+ super()._update_state()
+ if ENABLE_FLOATING_NAV_MAP_PANEL or ENABLE_SPLIT_NAV_MAP_PANEL:
+ self.nav_map_panel.update()
+ self.road_name_renderer.update()
+ self.speed_limit_renderer.update()
+ has_limit = self.speed_limit_renderer.speed_limit_valid or self.speed_limit_renderer.speed_limit_last_valid
+ self.limit_available = has_limit
+ self.limit_speed_text = str(round(self.speed_limit_renderer.speed_limit_last)) if has_limit else "---"
+ offset = round(self.speed_limit_renderer.speed_limit_offset)
+ self.limit_offset_text = f"{offset:+d}" if has_limit and offset != 0 else ""
+ self.turn_signal_controller.update()
+ self.speed_renderer.update()
+ self.soft_warning_renderer.update()
+
+ def _draw_current_speed(self, rect: rl.Rectangle) -> None:
+ self.speed_renderer.render(rect)
+
+ def _render(self, rect: rl.Rectangle) -> None:
+ super()._render(rect)
+
+ if ui_state.torque_bar:
+ torque_rect = rect
+ if ui_state.developer_ui in (IQDevMetricsOverlay.DEV_UI_BOTTOM, IQDevMetricsOverlay.DEV_UI_BOTH):
+ torque_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height - IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT)
+ self._torque_bar.render(torque_rect)
+
+ if not self.split_nav_enabled():
+ self.developer_ui.render(rect)
+ if ENABLE_FLOATING_NAV_MAP_PANEL:
+ self.nav_map_panel.render(rect)
+ self.road_name_renderer.render(rect)
+ self.turn_signal_controller.render(rect)
+ self.soft_warning_renderer.render(rect)
+ self.rocket_fuel.render(rect, ui_state.sm)
+
+ def split_nav_enabled(self) -> bool:
+ if not ENABLE_SPLIT_NAV_MAP_PANEL:
+ return False
+ if hasattr(self.nav_map_panel, "maps_enabled"):
+ return bool(self.nav_map_panel.maps_enabled())
+ return bool(getattr(self.nav_map_panel, "_maps_enabled", False))
+
+ def render_split_nav(self, rect: rl.Rectangle) -> None:
+ if self.split_nav_enabled():
+ self.nav_map_panel.render_split(rect)
+
+ def render_full_width_overlays(self, rect: rl.Rectangle) -> None:
+ if self.split_nav_enabled():
+ self.developer_ui.render(rect)
diff --git a/iqpilot/ui/onroad/lead_confidence.py b/iqpilot/ui/onroad/lead_confidence.py
new file mode 100644
index 000000000..e2bb7fd9c
--- /dev/null
+++ b/iqpilot/ui/onroad/lead_confidence.py
@@ -0,0 +1,70 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import pyray as rl
+from openpilot.common.filter_simple import FirstOrderFilter
+from openpilot.selfdrive.ui.ui_state import ui_state, UIStatus
+from openpilot.system.ui.lib.application import gui_app
+
+ACTIVE_TOP = rl.Color(0x22, 0xB8, 0xB9, 255)
+ACTIVE_BOTTOM = rl.Color(0x0C, 0x94, 0x96, 255)
+MEDIUM_TOP = rl.Color(255, 200, 0, 255)
+MEDIUM_BOTTOM = rl.Color(255, 115, 0, 255)
+LOW_TOP = rl.Color(255, 0, 21, 255)
+LOW_BOTTOM = rl.Color(255, 0, 89, 255)
+OVERRIDE_TOP = rl.Color(255, 255, 255, 255)
+OVERRIDE_BOTTOM = rl.Color(82, 82, 82, 255)
+IDLE_TOP = rl.Color(120, 120, 120, 255)
+IDLE_BOTTOM = rl.Color(60, 60, 60, 255)
+
+
+def _zone_colors(confidence: float) -> tuple[rl.Color, rl.Color]:
+ if confidence > 0.5:
+ return ACTIVE_TOP, ACTIVE_BOTTOM
+ if confidence > 0.2:
+ return MEDIUM_TOP, MEDIUM_BOTTOM
+ return LOW_TOP, LOW_BOTTOM
+
+
+class DrivingConfidence:
+ def __init__(self):
+ self._filter = FirstOrderFilter(-0.5, 0.5, 1 / gui_app.target_fps)
+ self._last_frame = -1
+
+ def update(self) -> None:
+ frame = ui_state.sm.frame
+ if frame == self._last_frame:
+ return
+ self._last_frame = frame
+ try:
+ predictions = ui_state.sm['modelV2'].meta.disengagePredictions
+ except Exception:
+ return
+
+ if ui_state.status == UIStatus.DISENGAGED:
+ value = -0.5
+ elif ui_state.status == UIStatus.LAT_ONLY:
+ value = 1 - max(predictions.steerOverrideProbs or [1])
+ elif ui_state.status == UIStatus.LONG_ONLY:
+ value = 1 - max(predictions.brakeDisengageProbs or [1])
+ else:
+ value = (1 - max(predictions.brakeDisengageProbs or [1])) * (1 - max(predictions.steerOverrideProbs or [1]))
+
+ self._filter.update(value)
+
+ @property
+ def value(self) -> float:
+ return self._filter.x
+
+ def colors(self, demo: bool = False) -> tuple[rl.Color, rl.Color]:
+ confidence = self._filter.x
+ if ui_state.status == UIStatus.ENGAGED or demo:
+ return _zone_colors(confidence)
+ if ui_state.status in (UIStatus.LAT_ONLY, UIStatus.LONG_ONLY):
+ return _zone_colors(confidence)
+ if ui_state.status == UIStatus.OVERRIDE:
+ return OVERRIDE_TOP, OVERRIDE_BOTTOM
+ return IDLE_TOP, IDLE_BOTTOM
+
+
+driving_confidence = DrivingConfidence()
diff --git a/iqpilot/ui/onroad/nav_map_panel.py b/iqpilot/ui/onroad/nav_map_panel.py
new file mode 100644
index 000000000..478ebb995
--- /dev/null
+++ b/iqpilot/ui/onroad/nav_map_panel.py
@@ -0,0 +1,1800 @@
+import os
+import math
+import threading
+import time
+from typing import Any
+from pathlib import Path
+
+try:
+ import sqlite3
+except Exception:
+ sqlite3 = None # type: ignore[assignment]
+
+import pyray as rl
+import requests
+
+from openpilot.common.basedir import BASEDIR
+from openpilot.common.iq_perf import PerfSample, PerfTraceEmitter
+from openpilot.common.params import Params, UnknownKeyName
+from openpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position, resolve_mapbox_token
+from openpilot.selfdrive.ui.lib.local_routes import utc_offset_hours
+from openpilot.iqpilot.ui.onroad.offline_tiles import (
+ find_offline_mbtiles_path,
+ find_offline_xyz_root,
+ load_raster_tile_blob,
+ load_raster_xyz_tile_blob,
+ mbtiles_is_raster,
+ mbtiles_zoom_bounds,
+ open_mbtiles,
+ xyz_zoom_bounds,
+)
+from openpilot.iqpilot.ui.onroad.nav_map_utils import (
+ build_mapbox_tile_url,
+ choose_nav_camera,
+ mercator_world_px_at_zoom,
+ project_nav_point,
+ project_nav_polyline,
+ solar_elevation_deg,
+)
+from openpilot.selfdrive.ui.ui_state import ui_state
+from openpilot.system.ui.lib.application import gui_app, FontWeight
+from openpilot.system.ui.lib.text_measure import measure_text_cached
+from openpilot.system.ui.lib.wrap_text import wrap_text
+from openpilot.system.ui.widgets import Widget
+
+PANEL_WIDTH = 560
+PANEL_HEIGHT = 600
+PANEL_MARGIN_RIGHT = 28
+PANEL_MARGIN_TOP = 92
+CARD_RADIUS = 0.055
+MAP_HEIGHT = 392
+SPLIT_HEADER_HEIGHT = 160
+SPLIT_FOOTER_HEIGHT = 112
+# parents[4] pointed one level above the repo (stock selfdrive/assets has no nav icons),
+# so the maneuver arrow never loaded anywhere — anchor to BASEDIR instead
+ICON_ASSET_DIR = Path(BASEDIR) / "iqpilot" / "selfdrive" / "assets" / "navigation"
+STAT_GAP = 10
+TILE_SIZE = 256
+# env-overridable GPU-texture footprint levers; CACHE_LIMIT must stay >= the keep-set (~(visible + 2*margin)^2)
+TILE_SCALE = int(os.getenv("IQPILOT_NAV_TILE_SCALE", "2"))
+# Downscale each decoded tile before uploading to the GPU. Mapbox only serves integer-retina
+# tiles (@2x = 512px), which cost ~1MB of dmabuf each; the resident cache of these is the bulk
+# of the map's memory floor. Resizing the crisp @2x source down to TILE_SIZE*this (1.75 -> 448px,
+# ~768KB) reclaims GPU memory while staying sharper than a native @1x (256px) fetch would be.
+# Only ever downsamples — sources already at/under the target (e.g. native 256px offline tiles)
+# are left untouched. Set to TILE_SCALE to keep full @2x resolution.
+TILE_TEXTURE_SCALE = float(os.getenv("IQPILOT_NAV_TILE_TEXTURE_SCALE", "1.75"))
+MAX_INFLIGHT_TILES = 8
+CAMERA_SMOOTHING = 0.18
+# The onroad corner panel is immediate-mode redrawn (rounded rects + every glyph + tile blits)
+# every UI frame at 20Hz, which measured at ~52% of a CPU core on a comma 3x and starved radard.
+# Cache the whole panel in a persistent RenderTexture and only re-render it a few times a second;
+# every frame just blits the cached texture. A corner map panning at 12Hz is visually seamless.
+PANEL_RENDER_FPS = max(1, int(os.getenv("IQPILOT_NAV_PANEL_FPS", "12")))
+PANEL_RENDER_INTERVAL = 1.0 / PANEL_RENDER_FPS
+# The drop-shadow is drawn a few px past the panel bounds; pad the render target so it isn't clipped.
+PANEL_SHADOW_PAD = 16
+# Chrome (badge + info-panel text/chips) only changes when nav values change, so it's cached in its
+# own texture regenerated on a content-key change. This cap forces a refresh at least every 0.5s so a
+# missed key field can never freeze the readout.
+CHROME_MAX_INTERVAL = 0.5
+CACHE_MARGIN_TILES = int(os.getenv("IQPILOT_NAV_CACHE_MARGIN", "2"))
+CACHE_LIMIT = int(os.getenv("IQPILOT_NAV_CACHE_LIMIT", "96"))
+# The corner panel's viewport (560x392) keeps ~(3+2*margin)x(2+2*margin) = 42 tiles on
+# screen+margin; 96 was sized for the full-screen interactive map and doubles the panel's
+# resident GPU footprint for tiles that can never be drawn.
+PANEL_CACHE_LIMIT = int(os.getenv("IQPILOT_NAV_PANEL_CACHE_LIMIT", "48"))
+# How long mapbox must stay healthy before the offline fallback's tile cache is freed.
+OFFLINE_RELEASE_AFTER_S = 60.0
+PARAMS_REFRESH_S = 0.5
+MAP_PROVIDER_UPDATE_S = 0.25
+# Offline decode now runs off the render thread (worker pattern, same as mapbox), so when
+# offline is the engaged provider it updates at the same cadence as the online one.
+OFFLINE_PROVIDER_UPDATE_S = MAP_PROVIDER_UPDATE_S
+ROUTE_PROJECTION_UPDATE_S = 0.15
+TILE_CACHE_ROOT = Path(
+ os.getenv(
+ "IQPILOT_NAV_TILE_CACHE",
+ "/data/iqpilot_nav_tiles" if Path("/data").exists() else "/tmp/iqpilot_nav_tiles",
+ )
+)
+MAPBOX_PROVIDER_DISABLED = os.getenv("IQPILOT_DISABLE_MAPBOX_PROVIDER", "0") == "1"
+MAPBOX_CACHE_DISABLED = os.getenv("IQPILOT_DISABLE_MAPBOX_CACHE", "0") == "1"
+SQLITE_ERRORS = (sqlite3.Error,) if sqlite3 is not None else (Exception,)
+NAV_TEXTURE_WARN_US = 20_000
+NAV_TILE_OP_WARN_US = 10_000
+NAV_PRUNE_WARN_US = 10_000
+NAV_BURST_WARN_TILES = 4
+NAV_PERF = PerfTraceEmitter("ui.nav")
+
+
+def _downscale_tile_image(image) -> None:
+ """Shrink a decoded tile image in place to the configured texture footprint.
+
+ Downsample-only: leaves images already at/under the target size alone so native low-DPI
+ (e.g. 256px offline) tiles are never upscaled. The resize is a CPU (stb) bicubic pass, so
+ it must run OFF the render thread (in the fetch worker) — doing it inline in _consume_pending
+ stalled the UI loop for several ms per tile and caused visible map lag on tile bursts."""
+ target = int(round(TILE_SIZE * TILE_TEXTURE_SCALE))
+ if target > 0 and image.width > target:
+ rl.image_resize(image, target, target)
+
+
+def _decode_tile_image(payload: bytes):
+ """Decode a raw tile payload to an rl.Image and downscale it, on the calling thread.
+
+ Pure CPU (stb) work — no GL context needed — so it is safe to run from a fetch worker
+ thread. The returned Image is uploaded to a GPU texture later on the render thread.
+
+ Raises ValueError on undecodable payloads: stb returns a 0x0 image instead of failing
+ (e.g. webp, which stb can't read), and uploading that produces an invisible texture the
+ cache then counts as content — the map draws blank while the badge claims tiles."""
+ image = rl.load_image_from_memory(MapboxTileProvider._image_ext(payload), payload, len(payload))
+ if image.width <= 0 or image.height <= 0:
+ rl.unload_image(image)
+ raise ValueError("undecodable tile payload")
+ _downscale_tile_image(image)
+ # pooled textures are refilled in place; contents must be RGBA8 regardless of source format
+ rl.image_format(image, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)
+ return image
+
+
+def _emit_nav_perf(event_class: str, *, frame_id: int = 0, total_time_us: int = 0,
+ batch_size: int = 0, severity: str = "warning", detail: str = "",
+ sample: PerfSample | None = None, min_interval_s: float = 0.5) -> None:
+ NAV_PERF.emit(
+ event_class,
+ severity=severity,
+ frame_id=frame_id,
+ total_time_us=total_time_us,
+ batch_size=batch_size,
+ samples=[sample] if sample is not None else None,
+ detail=detail,
+ min_interval_s=min_interval_s,
+ )
+
+
+class TexturePool:
+ """Recycles GL texture objects between tiles of identical size/format.
+
+ Creating/destroying thousands of texture objects per drive ratchets the GL
+ driver's CPU-side pools (measured: hundreds of MB of driver-owned anon memory
+ on both Adreno and Mac). Refilling an existing texture via rl.update_texture
+ allocates nothing at steady state. Render thread only."""
+
+ def __init__(self, max_free: int):
+ self._max_free = max_free
+ self._free: dict[tuple[int, int], list[Any]] = {}
+
+ def acquire(self, image) -> Any:
+ bucket = self._free.get((image.width, image.height))
+ if bucket:
+ texture = bucket.pop()
+ rl.update_texture(texture, image.data)
+ return texture
+ texture = rl.load_texture_from_image(image)
+ rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR)
+ rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP)
+ return texture
+
+ def release(self, texture) -> None:
+ bucket = self._free.setdefault((texture.width, texture.height), [])
+ if len(bucket) < self._max_free:
+ bucket.append(texture)
+ else:
+ rl.unload_texture(texture)
+
+ def drain(self) -> None:
+ for bucket in self._free.values():
+ for texture in bucket:
+ rl.unload_texture(texture)
+ self._free.clear()
+
+
+class MapboxTileProvider:
+ def __init__(self, cache_limit: int = CACHE_LIMIT):
+ self._cache_limit = cache_limit
+ self._pool = TexturePool(cache_limit)
+ self._params = Params()
+ self._session = requests.Session()
+ # Decoded, downscaled rl.Images ready for GPU upload. Decoding + resizing happens off the
+ # render thread (fetch worker) and is drained by _consume_pending, which only uploads.
+ self._pending_tiles: dict[tuple[int, int, int], Any] = {}
+ self._inflight: set[tuple[int, int, int]] = set()
+ self._textures: dict[tuple[int, int, int], rl.Texture] = {}
+ self._lock = threading.Lock()
+ self._status = "idle"
+ self._viewport_complete = False
+ self._cache_root = TILE_CACHE_ROOT
+ self._cache_root.mkdir(parents=True, exist_ok=True)
+ self._provider_disabled = MAPBOX_PROVIDER_DISABLED
+ self._cache_disabled = MAPBOX_CACHE_DISABLED
+ self._day_mode = False
+ self._style = "navigation-night-v1"
+ self._rotated = False
+ self._keep_margin = CACHE_MARGIN_TILES
+
+ def set_day_mode(self, day: bool) -> None:
+ """Switch between the day/night Mapbox styles. Frees the tile cache on a change —
+ the resident textures are the wrong palette. Render-thread only (release touches GL)."""
+ if day == self._day_mode:
+ return
+ self._day_mode = day
+ self._style = "navigation-day-v1" if day else "navigation-night-v1"
+ self.release()
+
+ def _token(self) -> str:
+ return resolve_mapbox_token(self._params)
+
+ def _fetch_worker(self, tile_key: tuple[int, int, int], token: str) -> None:
+ z, x, y = tile_key
+ url = build_mapbox_tile_url(z, x, y, tile_size=TILE_SIZE, scale=TILE_SCALE, style=self._style)
+ try:
+ response = self._session.get(url, params={"access_token": token}, timeout=1.5)
+ fallback_style = "light-v11" if self._day_mode else "dark-v11"
+ if response.status_code == 401 and self._style != fallback_style:
+ # some tokens can't access the navigation styles ("Direct access not allowed")
+ self._style = fallback_style
+ url = build_mapbox_tile_url(z, x, y, tile_size=TILE_SIZE, scale=TILE_SCALE, style=self._style)
+ response = self._session.get(url, params={"access_token": token}, timeout=3.0)
+ response.raise_for_status()
+ if not self._cache_disabled:
+ cache_path = self._cache_path(tile_key)
+ cache_path.parent.mkdir(parents=True, exist_ok=True)
+ cache_path.write_bytes(response.content)
+ # Decode + downscale here on the worker thread (pure CPU/stb, no GL), so the render
+ # thread only pays the cheap GPU upload in _consume_pending.
+ self._stash_pending(tile_key, _decode_tile_image(response.content))
+ self._status = "ready"
+ except (requests.RequestException, ValueError):
+ if not self._queue_cached_tile(tile_key, inline=True):
+ self._status = "error"
+ finally:
+ self._inflight.discard(tile_key)
+
+ def _cache_path(self, tile_key: tuple[int, int, int]) -> Path:
+ z, x, y = tile_key
+ # style-keyed: day and night tiles must never mix in the disk cache
+ return self._cache_root / self._style / str(z) / str(x) / f"{y}@{TILE_SCALE}x.png"
+
+ def _queue_cached_tile(self, tile_key: tuple[int, int, int], inline: bool = False) -> bool:
+ if self._cache_disabled:
+ return False
+ if tile_key in self._textures or tile_key in self._pending_tiles:
+ return True
+ # The render-thread path defers when the tile is already being fetched/decoded; the inline
+ # (network-error fallback) path owns its own _inflight entry, so it must not short-circuit here.
+ if not inline and tile_key in self._inflight:
+ return True
+
+ cache_path = self._cache_path(tile_key)
+ if not cache_path.exists():
+ return False
+
+ if inline:
+ # Already on a worker thread (network-error fallback) — decode here directly.
+ try:
+ payload = cache_path.read_bytes()
+ self._stash_pending(tile_key, _decode_tile_image(payload))
+ except (OSError, ValueError):
+ return False
+ self._status = "offline_cache"
+ return True
+
+ # Called from the render thread: offload the disk read + decode + resize to a worker so the
+ # UI loop never stalls, even when a whole screen of tiles is served from cache. Bounded by
+ # MAX_INFLIGHT (shared with network fetches); over the cap we defer to a later frame.
+ if len(self._inflight) >= MAX_INFLIGHT_TILES:
+ return True
+ self._inflight.add(tile_key)
+ self._status = "offline_cache"
+ threading.Thread(target=self._cache_decode_worker, args=(tile_key, cache_path), daemon=True).start()
+ return True
+
+ def _cache_decode_worker(self, tile_key: tuple[int, int, int], cache_path: Path) -> None:
+ try:
+ payload = cache_path.read_bytes()
+ self._stash_pending(tile_key, _decode_tile_image(payload))
+ except (OSError, ValueError):
+ pass
+ finally:
+ self._inflight.discard(tile_key)
+
+ def _stash_pending(self, tile_key: tuple[int, int, int], image) -> None:
+ """Store a decoded tile Image for upload, unloading any Image it displaces.
+
+ Safe to call from a fetch worker thread; only the render thread uploads/unloads textures."""
+ with self._lock:
+ displaced = self._pending_tiles.get(tile_key)
+ self._pending_tiles[tile_key] = image
+ if displaced is not None:
+ rl.unload_image(displaced)
+
+ def _consume_pending(self) -> None:
+ with self._lock:
+ pending = list(self._pending_tiles.items())
+ self._pending_tiles.clear()
+
+ decode_us = 0
+ upload_us = 0
+ unload_us = 0
+ unload_count = 0
+ payload_bytes = 0
+ cache_before = len(self._textures)
+ for tile_key, image in pending:
+ # Images arrive already decoded + downscaled from the fetch worker; the render thread
+ # only uploads to a GPU texture here (decode cost is off-thread, so decode_us stays ~0).
+ started_ns = time.monotonic_ns()
+ texture = self._pool.acquire(image)
+ upload_us += (time.monotonic_ns() - started_ns) // 1000
+ rl.unload_image(image)
+ old_texture = self._textures.get(tile_key)
+ if old_texture is not None:
+ started_ns = time.monotonic_ns()
+ self._pool.release(old_texture)
+ unload_us += (time.monotonic_ns() - started_ns) // 1000
+ unload_count += 1
+ self._textures[tile_key] = texture
+
+ total_us = decode_us + upload_us + unload_us
+ if pending and (
+ total_us >= NAV_TEXTURE_WARN_US
+ or decode_us >= NAV_TILE_OP_WARN_US
+ or upload_us >= NAV_TILE_OP_WARN_US
+ or len(pending) >= NAV_BURST_WARN_TILES
+ ):
+ sample = PerfSample(
+ texture_decode_us=int(decode_us),
+ texture_upload_us=int(upload_us),
+ texture_unload_us=int(unload_us),
+ texture_consume_us=int(total_us),
+ texture_batch_size=len(pending),
+ texture_bytes=payload_bytes,
+ texture_cache_before=cache_before,
+ texture_cache_after=len(self._textures),
+ texture_unloaded=unload_count,
+ )
+ _emit_nav_perf(
+ "nav_texture_burst",
+ total_time_us=int(total_us),
+ batch_size=len(pending),
+ detail=(
+ f"provider=mapbox decode_us={decode_us} upload_us={upload_us} unload_us={unload_us} "
+ + f"tiles={len(pending)} bytes={payload_bytes} cache_before={cache_before} cache_after={len(self._textures)}"
+ ),
+ sample=sample,
+ )
+
+ def _visible_tile_keys(
+ self, latitude: float, longitude: float, zoom: float, width: float, height: float
+ ) -> tuple[int, float, float, float, list[tuple[int, int, int]]]:
+ if self._rotated:
+ # rotation coverage = bounding circle; keep_margin=1 keeps resident set under cache_limit
+ width = height = math.hypot(width, height)
+ z = max(0, min(22, int(round(zoom))))
+ scale = 2.0 ** (zoom - z)
+ center_x, center_y = mercator_world_px_at_zoom(latitude, longitude, z, tile_size=TILE_SIZE)
+ world_half_width = (width * 0.5) / max(scale, 1e-6)
+ world_half_height = (height * 0.5) / max(scale, 1e-6)
+ min_tile_x = int(math.floor((center_x - world_half_width) / TILE_SIZE)) - 1
+ max_tile_x = int(math.floor((center_x + world_half_width) / TILE_SIZE)) + 1
+ min_tile_y = int(math.floor((center_y - world_half_height) / TILE_SIZE)) - 1
+ max_tile_y = int(math.floor((center_y + world_half_height) / TILE_SIZE)) + 1
+
+ tile_count = 2 ** z
+ visible = []
+ for tile_y in range(max(0, min_tile_y), min(tile_count - 1, max_tile_y) + 1):
+ for tile_x in range(min_tile_x, max_tile_x + 1):
+ visible.append((z, tile_x % tile_count, tile_y))
+ return z, scale, center_x, center_y, visible
+
+ def set_rotated(self, rotated: bool) -> None:
+ self._rotated = rotated
+ self._keep_margin = 1 if rotated else CACHE_MARGIN_TILES
+
+ @staticmethod
+ def _image_ext(payload: bytes) -> str:
+ if payload.startswith(b"\xff\xd8\xff"):
+ return ".jpg"
+ if payload.startswith(b"RIFF") and b"WEBP" in payload[:16]:
+ return ".webp"
+ return ".png"
+
+ def _prune_cache(self, keep_tiles: set[tuple[int, int, int]]) -> None:
+ if len(self._textures) <= self._cache_limit:
+ return
+
+ cache_before = len(self._textures)
+ unload_count = 0
+ started_ns = time.monotonic_ns()
+ for tile_key in list(self._textures):
+ if tile_key in keep_tiles:
+ continue
+ self._pool.release(self._textures.pop(tile_key))
+ unload_count += 1
+ if len(self._textures) <= self._cache_limit:
+ break
+ prune_us = (time.monotonic_ns() - started_ns) // 1000
+ if prune_us >= NAV_PRUNE_WARN_US or unload_count >= NAV_BURST_WARN_TILES:
+ sample = PerfSample(
+ texture_prune_us=int(prune_us),
+ texture_cache_before=cache_before,
+ texture_cache_after=len(self._textures),
+ texture_unloaded=unload_count,
+ )
+ _emit_nav_perf(
+ "nav_texture_prune",
+ total_time_us=int(prune_us),
+ batch_size=unload_count,
+ detail=f"provider=mapbox prune_us={prune_us} cache_before={cache_before} cache_after={len(self._textures)} unload_count={unload_count}",
+ sample=sample,
+ )
+
+ def update(self, latitude: float, longitude: float, zoom: float, width: float, height: float):
+ if self._provider_disabled:
+ self._status = "disabled"
+ return
+
+ self._consume_pending()
+
+ z, scale, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, width, height)
+ center_tile_x = center_x / TILE_SIZE
+ center_tile_y = center_y / TILE_SIZE
+ token = self._token()
+
+ for tile_key in visible_tiles:
+ self._queue_cached_tile(tile_key)
+
+ missing_tiles = [
+ tile_key for tile_key in visible_tiles
+ if tile_key not in self._textures and tile_key not in self._inflight
+ ]
+ missing_tiles.sort(key=lambda tile_key: abs(tile_key[1] - center_tile_x) + abs(tile_key[2] - center_tile_y))
+ if token:
+ launch_count = max(0, MAX_INFLIGHT_TILES - len(self._inflight))
+ for tile_key in missing_tiles[:launch_count]:
+ self._inflight.add(tile_key)
+ self._status = "loading"
+ thread = threading.Thread(target=self._fetch_worker, args=(tile_key, token), daemon=True)
+ thread.start()
+ elif not self._textures:
+ self._status = "token_missing"
+
+ visible_set = set(visible_tiles)
+ self._viewport_complete = bool(visible_set) and all(tile_key in self._textures for tile_key in visible_set)
+ if self._viewport_complete:
+ self._status = "ready" if token else "offline_cache"
+ elif self._inflight:
+ self._status = "loading"
+ elif self._textures:
+ self._status = "offline_cache"
+
+ tile_count = 2 ** z
+ keep_tiles = set()
+ for tile_key in visible_tiles:
+ _, tile_x, tile_y = tile_key
+ for dx in range(-self._keep_margin, self._keep_margin + 1):
+ for dy in range(-self._keep_margin, self._keep_margin + 1):
+ keep_y = tile_y + dy
+ if 0 <= keep_y < tile_count:
+ keep_tiles.add((z, (tile_x + dx) % tile_count, keep_y))
+ self._prune_cache(keep_tiles)
+
+ def draw(self, rect: rl.Rectangle, latitude: float, longitude: float, zoom: float) -> bool:
+ if self._provider_disabled:
+ return False
+ z, scale, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, rect.width, rect.height)
+ drew_any = False
+ half_width = rect.width * 0.5
+ half_height = rect.height * 0.5
+
+ for tile_key in visible_tiles:
+ texture = self._textures.get(tile_key)
+ if texture is None:
+ continue
+ _, tile_x, tile_y = tile_key
+ tile_left = rect.x + half_width + ((tile_x * TILE_SIZE) - center_x) * scale
+ tile_top = rect.y + half_height + ((tile_y * TILE_SIZE) - center_y) * scale
+ dst = rl.Rectangle(tile_left, tile_top, TILE_SIZE * scale, TILE_SIZE * scale)
+ src = rl.Rectangle(0, 0, float(texture.width), float(texture.height))
+ rl.draw_texture_pro(texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE)
+ drew_any = True
+
+ return drew_any
+
+ def status(self) -> str:
+ return self._status
+
+ def has_content(self) -> bool:
+ return bool(self._textures)
+
+ def viewport_complete(self) -> bool:
+ """True when every tile of the last update() viewport has a resident texture."""
+ return self._viewport_complete
+
+ def release(self) -> None:
+ """Free all GPU tile textures and drop pending decodes.
+
+ Called when the map panel goes inactive (offroad / maps disabled) so the tile
+ cache — up to CACHE_LIMIT textures of dmabuf-backed GPU memory — isn't held
+ resident while nothing is drawing it. Safe to call from the UI thread only
+ (raylib GL context); update()/_consume_pending() already run here."""
+ for texture in self._textures.values():
+ rl.unload_texture(texture)
+ self._textures.clear()
+ self._pool.drain()
+ with self._lock:
+ pending_images = list(self._pending_tiles.values())
+ self._pending_tiles.clear()
+ for image in pending_images:
+ rl.unload_image(image)
+ self._status = "idle"
+ self._viewport_complete = False
+
+
+class OsmOfflineProvider:
+ def __init__(self, cache_limit: int = CACHE_LIMIT):
+ self._cache_limit = cache_limit
+ self._pool = TexturePool(cache_limit)
+ self._conn: Any | None = None
+ # Serializes sqlite access + source swaps: blob reads run on fetch worker threads against a
+ # single shared read-only connection, and _refresh_source may close/reopen it under them.
+ self._db_lock = threading.Lock()
+ self._mbtiles_path: Path | None = None
+ self._xyz_root: Path | None = None
+ # Decoded, downscaled rl.Images ready for GPU upload — same off-render-thread pattern as
+ # MapboxTileProvider: workers read the blob + decode + resize, _consume_pending only uploads.
+ self._pending_tiles: dict[tuple[int, int, int], Any] = {}
+ self._inflight: set[tuple[int, int, int]] = set()
+ self._lock = threading.Lock()
+ self._textures: dict[tuple[int, int, int], rl.Texture] = {}
+ self._status = "offline_missing"
+ self._min_zoom: int | None = None
+ self._max_zoom: int | None = None
+ self._day_mode = False
+ self._rotated = False
+ self._keep_margin = CACHE_MARGIN_TILES
+
+ def set_day_mode(self, day: bool) -> None:
+ self._day_mode = day
+
+ def set_rotated(self, rotated: bool) -> None:
+ self._rotated = rotated
+ self._keep_margin = 1 if rotated else CACHE_MARGIN_TILES
+
+ def _close_conn_locked(self) -> None:
+ if self._conn is not None:
+ self._conn.close()
+ self._conn = None
+
+ def _drop_pending(self) -> None:
+ with self._lock:
+ pending_images = list(self._pending_tiles.values())
+ self._pending_tiles.clear()
+ for image in pending_images:
+ rl.unload_image(image)
+
+ def _refresh_source(self, latitude: float, longitude: float) -> None:
+ mbtiles_path = find_offline_mbtiles_path(latitude, longitude, day=self._day_mode)
+ xyz_root = find_offline_xyz_root(latitude, longitude)
+
+ if self._mbtiles_path == mbtiles_path and self._xyz_root == xyz_root:
+ return
+
+ self._mbtiles_path = mbtiles_path
+ self._xyz_root = xyz_root
+ self._min_zoom = None
+ self._max_zoom = None
+
+ for texture in self._textures.values():
+ rl.unload_texture(texture)
+ self._textures.clear()
+ self._drop_pending()
+
+ with self._db_lock:
+ self._close_conn_locked()
+ if self._mbtiles_path is not None:
+ try:
+ self._conn = open_mbtiles(self._mbtiles_path)
+ if mbtiles_is_raster(self._conn):
+ self._min_zoom, self._max_zoom = mbtiles_zoom_bounds(self._conn)
+ self._status = "offline_ready"
+ else:
+ self._status = "offline_invalid"
+ except SQLITE_ERRORS:
+ self._conn = None
+ self._status = "offline_invalid"
+ elif self._xyz_root is not None:
+ self._min_zoom, self._max_zoom = xyz_zoom_bounds(self._xyz_root)
+ self._status = "offline_ready"
+ else:
+ self._status = "offline_missing"
+
+ def _source_tile_for_request(self, tile_key: tuple[int, int, int]) -> tuple[tuple[int, int, int], int]:
+ z, x, y = tile_key
+ source_z = z
+ if self._max_zoom is not None and z > self._max_zoom:
+ source_z = self._max_zoom
+ elif self._min_zoom is not None and z < self._min_zoom:
+ source_z = self._min_zoom
+
+ delta = z - source_z
+ if delta <= 0:
+ return (source_z, x, y), 0
+
+ return (source_z, x >> delta, y >> delta), delta
+
+ def _stash_pending(self, tile_key: tuple[int, int, int], image) -> None:
+ """Store a decoded tile Image for upload, unloading any Image it displaces.
+
+ Safe to call from a fetch worker thread; only the render thread uploads/unloads textures."""
+ with self._lock:
+ displaced = self._pending_tiles.get(tile_key)
+ self._pending_tiles[tile_key] = image
+ if displaced is not None:
+ rl.unload_image(displaced)
+
+ def _load_decode_worker(self, tile_key: tuple[int, int, int]) -> None:
+ """Read a tile blob from disk and decode + downscale it, entirely off the render thread.
+
+ Mirrors MapboxTileProvider._fetch_worker: the render loop must never pay the sqlite/file
+ read or the stb decode — with offline as the primary provider, an inline decode of a
+ screenful of tiles was a visible render-loop hitch."""
+ try:
+ payload = self._load_blob(tile_key)
+ if payload is not None:
+ self._stash_pending(tile_key, _decode_tile_image(payload))
+ except Exception:
+ pass
+ finally:
+ self._inflight.discard(tile_key)
+
+ def _consume_pending(self) -> None:
+ with self._lock:
+ pending = list(self._pending_tiles.items())
+ self._pending_tiles.clear()
+
+ upload_us = 0
+ unload_us = 0
+ unload_count = 0
+ cache_before = len(self._textures)
+ for tile_key, image in pending:
+ # Images arrive already decoded + downscaled from the worker; only the GPU upload runs here.
+ started_ns = time.monotonic_ns()
+ texture = self._pool.acquire(image)
+ upload_us += (time.monotonic_ns() - started_ns) // 1000
+ rl.unload_image(image)
+ old_texture = self._textures.get(tile_key)
+ if old_texture is not None:
+ started_ns = time.monotonic_ns()
+ self._pool.release(old_texture)
+ unload_us += (time.monotonic_ns() - started_ns) // 1000
+ unload_count += 1
+ self._textures[tile_key] = texture
+
+ total_us = upload_us + unload_us
+ if pending and (
+ total_us >= NAV_TEXTURE_WARN_US
+ or upload_us >= NAV_TILE_OP_WARN_US
+ or len(pending) >= NAV_BURST_WARN_TILES
+ ):
+ sample = PerfSample(
+ texture_upload_us=int(upload_us),
+ texture_unload_us=int(unload_us),
+ texture_consume_us=int(total_us),
+ texture_batch_size=len(pending),
+ texture_cache_before=cache_before,
+ texture_cache_after=len(self._textures),
+ texture_unloaded=unload_count,
+ )
+ _emit_nav_perf(
+ "nav_texture_burst",
+ total_time_us=int(total_us),
+ batch_size=len(pending),
+ detail=(
+ f"provider=offline upload_us={upload_us} unload_us={unload_us} "
+ + f"tiles={len(pending)} cache_before={cache_before} cache_after={len(self._textures)}"
+ ),
+ sample=sample,
+ )
+
+ def _prune_cache(self, keep_tiles: set[tuple[int, int, int]]) -> None:
+ if len(self._textures) <= self._cache_limit:
+ return
+
+ cache_before = len(self._textures)
+ unload_count = 0
+ started_ns = time.monotonic_ns()
+ for tile_key in list(self._textures):
+ if tile_key in keep_tiles:
+ continue
+ self._pool.release(self._textures.pop(tile_key))
+ unload_count += 1
+ if len(self._textures) <= self._cache_limit:
+ break
+ prune_us = (time.monotonic_ns() - started_ns) // 1000
+ if prune_us >= NAV_PRUNE_WARN_US or unload_count >= NAV_BURST_WARN_TILES:
+ sample = PerfSample(
+ texture_prune_us=int(prune_us),
+ texture_cache_before=cache_before,
+ texture_cache_after=len(self._textures),
+ texture_unloaded=unload_count,
+ )
+ _emit_nav_perf(
+ "nav_texture_prune",
+ total_time_us=int(prune_us),
+ batch_size=unload_count,
+ detail=f"provider=offline prune_us={prune_us} cache_before={cache_before} cache_after={len(self._textures)} unload_count={unload_count}",
+ sample=sample,
+ )
+
+ def _visible_tile_keys(
+ self, latitude: float, longitude: float, zoom: float, width: float, height: float
+ ) -> tuple[int, float, float, float, list[tuple[int, int, int]]]:
+ if self._rotated:
+ width = height = math.hypot(width, height)
+ z = max(0, min(22, int(round(zoom))))
+ scale = 2.0 ** (zoom - z)
+ center_x, center_y = mercator_world_px_at_zoom(latitude, longitude, z, tile_size=TILE_SIZE)
+ world_half_width = (width * 0.5) / max(scale, 1e-6)
+ world_half_height = (height * 0.5) / max(scale, 1e-6)
+ min_tile_x = int(math.floor((center_x - world_half_width) / TILE_SIZE)) - 1
+ max_tile_x = int(math.floor((center_x + world_half_width) / TILE_SIZE)) + 1
+ min_tile_y = int(math.floor((center_y - world_half_height) / TILE_SIZE)) - 1
+ max_tile_y = int(math.floor((center_y + world_half_height) / TILE_SIZE)) + 1
+
+ tile_count = 2 ** z
+ visible = []
+ for tile_y in range(max(0, min_tile_y), min(tile_count - 1, max_tile_y) + 1):
+ for tile_x in range(min_tile_x, max_tile_x + 1):
+ visible.append((z, tile_x % tile_count, tile_y))
+ return z, scale, center_x, center_y, visible
+
+ def _load_blob(self, tile_key: tuple[int, int, int]) -> bytes | None:
+ z, x, y = tile_key
+ # Runs on worker threads: the shared read-only sqlite connection is not safe for
+ # concurrent queries, and _refresh_source may swap it — serialize via _db_lock.
+ with self._db_lock:
+ if self._conn is not None and self._status == "offline_ready":
+ try:
+ return load_raster_tile_blob(self._conn, z, x, y)
+ except SQLITE_ERRORS:
+ self._status = "offline_invalid"
+ return None
+ xyz_root = self._xyz_root
+ if xyz_root is not None:
+ return load_raster_xyz_tile_blob(xyz_root, z, x, y)
+ return None
+
+ def update(self, latitude: float, longitude: float, zoom: float, width: float, height: float) -> None:
+ self._refresh_source(latitude, longitude)
+ if self._status != "offline_ready":
+ return
+
+ self._consume_pending()
+
+ z, _, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, width, height)
+ # Map requested tiles to their on-disk source tiles (overzoom clamps to the stored range).
+ visible_source: list[tuple[int, int, int]] = []
+ seen: set[tuple[int, int, int]] = set()
+ for requested_tile in visible_tiles:
+ source_tile, _ = self._source_tile_for_request(requested_tile)
+ if source_tile not in seen:
+ seen.add(source_tile)
+ visible_source.append(source_tile)
+
+ missing_tiles = [
+ tile_key for tile_key in visible_source
+ if tile_key not in self._textures and tile_key not in self._inflight
+ ]
+
+ def _center_distance(tile_key: tuple[int, int, int]) -> float:
+ source_z, tile_x, tile_y = tile_key
+ zoom_scale = 2.0 ** (z - source_z)
+ return (
+ abs(tile_x + 0.5 - (center_x / TILE_SIZE) / zoom_scale)
+ + abs(tile_y + 0.5 - (center_y / TILE_SIZE) / zoom_scale)
+ )
+
+ missing_tiles.sort(key=_center_distance)
+ launch_count = max(0, MAX_INFLIGHT_TILES - len(self._inflight))
+ for tile_key in missing_tiles[:launch_count]:
+ self._inflight.add(tile_key)
+ threading.Thread(target=self._load_decode_worker, args=(tile_key,), daemon=True).start()
+
+ # Keep a margin ring around the visible source tiles so panning doesn't churn re-decodes;
+ # the cache limit bounds the resident GPU footprint exactly like the mapbox provider.
+ keep_tiles: set[tuple[int, int, int]] = set()
+ for source_z, tile_x, tile_y in visible_source:
+ tile_count = 2 ** source_z
+ for dx in range(-self._keep_margin, self._keep_margin + 1):
+ for dy in range(-self._keep_margin, self._keep_margin + 1):
+ keep_y = tile_y + dy
+ if 0 <= keep_y < tile_count:
+ keep_tiles.add((source_z, (tile_x + dx) % tile_count, keep_y))
+ self._prune_cache(keep_tiles)
+
+ def draw(self, rect: rl.Rectangle, latitude: float, longitude: float, zoom: float) -> bool:
+ if self._status != "offline_ready":
+ return False
+
+ z, scale, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, rect.width, rect.height)
+ drew_any = False
+ half_width = rect.width * 0.5
+ half_height = rect.height * 0.5
+
+ for requested_tile in visible_tiles:
+ source_tile, delta = self._source_tile_for_request(requested_tile)
+ texture = self._textures.get(source_tile)
+ if texture is None:
+ continue
+ _, tile_x, tile_y = requested_tile
+ tile_left = rect.x + half_width + ((tile_x * TILE_SIZE) - center_x) * scale
+ tile_top = rect.y + half_height + ((tile_y * TILE_SIZE) - center_y) * scale
+ dst = rl.Rectangle(tile_left, tile_top, TILE_SIZE * scale, TILE_SIZE * scale)
+ if delta == 0:
+ src = rl.Rectangle(0, 0, float(texture.width), float(texture.height))
+ else:
+ subdivisions = 2 ** delta
+ src_width = float(texture.width) / subdivisions
+ src_height = float(texture.height) / subdivisions
+ src_x = float(tile_x % subdivisions) * src_width
+ src_y = float(tile_y % subdivisions) * src_height
+ src = rl.Rectangle(src_x, src_y, src_width, src_height)
+ rl.draw_texture_pro(texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE)
+ drew_any = True
+
+ return drew_any
+
+ def status(self) -> str:
+ return self._status
+
+ def has_content(self) -> bool:
+ return bool(self._textures)
+
+ def release(self) -> None:
+ """Free all GPU tile textures and drop pending decodes. See MapboxTileProvider.release()."""
+ for texture in self._textures.values():
+ rl.unload_texture(texture)
+ self._textures.clear()
+ self._pool.drain()
+ self._drop_pending()
+
+
+class NavMapPanel(Widget):
+ def __init__(self, force_visible: bool = False):
+ super().__init__()
+ self._params = Params()
+ self._force_visible = force_visible
+ self.active = False
+ self._maps_enabled = False
+ self.current_latitude = 0.0
+ self.current_longitude = 0.0
+ self.bearing_deg = 0.0
+ self.zoom_hint = 16.0
+ self.destination_latitude = 0.0
+ self.destination_longitude = 0.0
+ self.render_center_latitude = 0.0
+ self.render_center_longitude = 0.0
+ self.render_zoom = 16.0
+ self.display_center_latitude = 0.0
+ self.display_center_longitude = 0.0
+ self.display_zoom = 16.0
+ self.route_points = []
+ self.next_distance = 0.0
+ self.next_description = ""
+ self.next_direction = 0
+ self.next_type = 0
+ self.next_valid = False
+ self.nav_active = False
+ self.destination_name = ""
+ self.time_remaining = 0.0
+ self.distance_remaining = 0.0
+ self.road_name = ""
+ self._has_render_fix = False
+ self._route_ahead_index = 0
+ self._projected_route_points: list[tuple[float, float]] = []
+ self._projected_route_key: tuple | None = None
+ self._map_viewport_width: float = PANEL_WIDTH - 24
+ self._map_viewport_height: float = MAP_HEIGHT
+ self._mapbox = MapboxTileProvider(cache_limit=PANEL_CACHE_LIMIT)
+ self._offline = OsmOfflineProvider(cache_limit=PANEL_CACHE_LIMIT)
+ self._offline_idle_since = 0.0
+ # OnlineOSMaps/OfflineOSMaps pick the tile sources: both on = online primary with offline
+ # filling in whenever mapbox is unhealthy; online only = mapbox alone (stock behavior);
+ # offline only = local tiles alone, mapbox never fetched (no network threads at all).
+ self._online_maps_enabled = True
+ self._offline_maps_enabled = False
+ self._mapbox_mode_released = False
+ # Day/night map styling, Apple/Google-style: solar elevation drives it once a GPS fix
+ # exists (hysteresis: day above 0 deg, night below -6 deg / civil dusk); the local clock
+ # seeds the first frame. OSMapsStyleMode param forces day(1)/night(2), 0 = auto.
+ self._day_mode = 6 <= time.localtime().tm_hour < 20
+ self._style_mode = 0
+ self._last_daynight_check = 0.0
+ self._heading_up = True
+ self.display_bearing = 0.0
+ self._title_font = gui_app.font(FontWeight.BOLD)
+ self._body_font = gui_app.font(FontWeight.MEDIUM)
+ self._micro_font = gui_app.font(FontWeight.SEMI_BOLD)
+ self._icon_textures: dict[str, rl.Texture] = {}
+ self._last_params_refresh = 0.0
+ self._last_mapbox_update = 0.0
+ self._last_offline_update = 0.0
+ self._released = False
+ self._last_projection_update = 0.0
+ # Memoizes _fit_text_size: the fit loop measures the same (font, text, width) tuples every
+ # frame at 20Hz across ~a dozen text elements. The result only depends on those inputs, so
+ # cache it and skip the descending measure loop entirely on repeats.
+ self._fit_size_cache: dict[tuple, int] = {}
+ # Split RenderTexture caches for the onroad panel (lazily created on the render thread, which
+ # owns the GL context). The map layer (tiles/route/ego) pans, so it refreshes at
+ # PANEL_RENDER_FPS; the chrome layer (badge + info text) only refreshes on a value change.
+ self._map_rt: Any = None
+ self._chrome_rt: Any = None
+ self._last_map_render = 0.0
+ self._last_chrome_render = 0.0
+ self._chrome_key: Any = None
+
+ @staticmethod
+ def _enum_value(value) -> int:
+ return int(getattr(value, "raw", value))
+
+ def _release_providers(self) -> None:
+ """Free tile textures once when the panel transitions to inactive.
+
+ Latched so it runs on the offroad/maps-off transition rather than every idle
+ frame. force_visible (offroad NAV screen) keeps its own panel active, so this
+ only fires for the onroad panel when it stops drawing."""
+ if self._released:
+ return
+ self._mapbox.release()
+ self._offline.release()
+ for attr in ("_map_rt", "_chrome_rt"):
+ rt = getattr(self, attr)
+ if rt is not None:
+ rl.unload_render_texture(rt)
+ setattr(self, attr, None)
+ self._last_map_render = 0.0
+ self._last_chrome_render = 0.0
+ self._chrome_key = None
+ self._released = True
+
+ def _route_ahead_points(self):
+ if len(self.route_points) < 2:
+ self._route_ahead_index = 0
+ return self.route_points
+
+ best_idx = 0
+ best_score = None
+ for idx, point in enumerate(self.route_points):
+ dlat = float(point.latitude) - self.current_latitude
+ dlon = float(point.longitude) - self.current_longitude
+ score = dlat * dlat + dlon * dlon
+ if best_score is None or score < best_score:
+ best_score = score
+ best_idx = idx
+
+ self._route_ahead_index = best_idx
+ return self.route_points[best_idx:]
+
+ def _refresh_route_projection(self, force: bool = False) -> None:
+ route_points = self.route_points[self._route_ahead_index:]
+ if len(route_points) < 2:
+ self._projected_route_points = []
+ self._projected_route_key = None
+ return
+
+ projection_key = (
+ self._route_ahead_index,
+ len(self.route_points),
+ round(self.display_center_latitude, 5),
+ round(self.display_center_longitude, 5),
+ round(self.display_zoom, 2),
+ round(self._map_viewport_width, 0),
+ round(self._map_viewport_height, 0),
+ )
+ if not force and projection_key == self._projected_route_key:
+ return
+
+ started = time.monotonic()
+ self._projected_route_points = project_nav_polyline(
+ route_points,
+ self.display_center_latitude,
+ self.display_center_longitude,
+ self.display_zoom,
+ 0.0,
+ self._map_viewport_width,
+ self._map_viewport_height,
+ )
+ self._projected_route_key = projection_key
+
+ project_us = int((time.monotonic() - started) * 1_000_000)
+ if project_us > 3_000:
+ sample = PerfSample(texture_consume_us=project_us, texture_batch_size=len(route_points))
+ _emit_nav_perf(
+ "nav_map_projection_slow",
+ total_time_us=project_us,
+ batch_size=len(route_points),
+ detail=f"project_us={project_us} points={len(route_points)} active={int(self.active)}",
+ sample=sample,
+ )
+
+ def _icon_asset_name(self) -> str | None:
+ if not self._display_next_valid():
+ return None
+ dir_left = self._display_direction_is_left()
+ if self.next_type == 1:
+ return "direction_turn_left.png" if dir_left else "direction_turn_right.png"
+ if self.next_type == 2:
+ return "direction_off_ramp_left.png" if dir_left else "direction_off_ramp_right.png"
+ if self.next_type == 3:
+ return "direction_merge_left.png" if dir_left else "direction_merge_right.png"
+ if self.next_type == 4:
+ return "direction_fork_left.png" if dir_left else "direction_fork_right.png"
+ if self.next_type == 6:
+ return "direction_arrive.png"
+ return "direction_continue_left.png" if dir_left else "direction_continue_right.png"
+
+ def _display_next_valid(self) -> bool:
+ return bool(
+ self.next_valid and (
+ self.next_distance > 1.0
+ or bool(self.next_description)
+ or self.next_type == 6
+ )
+ )
+
+ def _display_direction_is_left(self) -> bool:
+ description = f" {self.next_description.lower()} "
+ if " left " in description and " right " not in description:
+ return True
+ if " right " in description and " left " not in description:
+ return False
+ return self.next_direction == 1
+
+ def _display_route_active(self) -> bool:
+ return bool(
+ self.nav_active and (
+ self.distance_remaining > 1.0
+ or self.time_remaining > 1.0
+ or bool(self.destination_name)
+ or self._display_next_valid()
+ or len(self.route_points) >= 2
+ )
+ )
+
+ def _icon_texture(self):
+ name = self._icon_asset_name()
+ if name is None:
+ return None
+ if name in self._icon_textures:
+ return self._icon_textures[name]
+
+ path = ICON_ASSET_DIR / name
+ if not path.exists():
+ return None
+
+ texture = rl.load_texture(path.as_posix())
+ rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR)
+ rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP)
+ self._icon_textures[name] = texture
+ return texture
+
+ def _destination_texture(self):
+ name = "direction_flag.png"
+ if name in self._icon_textures:
+ return self._icon_textures[name]
+
+ path = ICON_ASSET_DIR / name
+ if not path.exists():
+ return None
+
+ texture = rl.load_texture(path.as_posix())
+ rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR)
+ rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP)
+ self._icon_textures[name] = texture
+ return texture
+
+ def _fit_text_size(self, font: rl.Font, text: str, max_width: float, max_size: int, min_size: int) -> int:
+ key = (id(font), text, round(max_width), max_size, min_size)
+ cached = self._fit_size_cache.get(key)
+ if cached is not None:
+ return cached
+ fitted = min_size
+ for size in range(max_size, min_size - 1, -1):
+ if measure_text_cached(font, text, size).x <= max_width:
+ fitted = size
+ break
+ # Bound the cache: distances/ETA strings churn, but the working set per frame is tiny.
+ if len(self._fit_size_cache) > 512:
+ self._fit_size_cache.clear()
+ self._fit_size_cache[key] = fitted
+ return fitted
+
+ @staticmethod
+ def _lerp(start: float, end: float, alpha: float) -> float:
+ return start + (end - start) * alpha
+
+ @staticmethod
+ def _lerp_angle(current: float, target: float, alpha: float) -> float:
+ delta = ((target - current + 180.0) % 360.0) - 180.0
+ return (current + delta * alpha) % 360.0
+
+ def _refresh_position_from_fallback(self) -> bool:
+ lat, lon, bearing, have_fix = current_or_last_gps_position()
+ if not have_fix:
+ return False
+
+ self.current_latitude = lat
+ self.current_longitude = lon
+ self.bearing_deg = bearing
+ self.zoom_hint = self.zoom_hint if self.zoom_hint > 0.0 else 16.0
+ self.render_center_latitude, self.render_center_longitude, self.render_zoom = choose_nav_camera(
+ self.current_latitude,
+ self.current_longitude,
+ self.bearing_deg,
+ self._route_ahead_points(),
+ self._map_viewport_width,
+ self._map_viewport_height,
+ self.zoom_hint,
+ )
+ if self.display_center_latitude == 0.0 and self.display_center_longitude == 0.0:
+ self.display_center_latitude = self.render_center_latitude
+ self.display_center_longitude = self.render_center_longitude
+ self.display_zoom = self.render_zoom
+ self._has_render_fix = True
+ self.active = True
+ return True
+
+ def _refresh_params(self, now: float) -> None:
+ if now - self._last_params_refresh < PARAMS_REFRESH_S:
+ return
+ try:
+ self._maps_enabled = self._force_visible or self._params.get_bool("OnScreenNavigation")
+ except UnknownKeyName:
+ # If the param doesn't exist in this build, default to disabled unless explicitly embedded.
+ self._maps_enabled = self._force_visible
+ try:
+ self._online_maps_enabled = self._params.get_bool("OnlineOSMaps")
+ self._offline_maps_enabled = self._params.get_bool("OfflineOSMaps")
+ except UnknownKeyName:
+ # Builds whose compiled params predate the toggles keep the legacy behavior:
+ # online primary with the offline fallback armed.
+ self._online_maps_enabled = True
+ self._offline_maps_enabled = True
+ try:
+ self._style_mode = int(self._params.get("OSMapsStyleMode") or 0)
+ except (UnknownKeyName, ValueError):
+ self._style_mode = 0
+ try:
+ self._heading_up = self._params.get_bool("OSMapsHeadingUp")
+ except UnknownKeyName:
+ self._heading_up = True
+ self._last_params_refresh = now
+
+ def _refresh_day_mode(self, now: float) -> None:
+ if self._style_mode in (1, 2):
+ self._day_mode = self._style_mode == 1
+ return
+ if now - self._last_daynight_check < 60.0:
+ return
+ self._last_daynight_check = now
+ if abs(self.current_latitude) > 0.01 or abs(self.current_longitude) > 0.01:
+ elevation = solar_elevation_deg(self.current_latitude, self.current_longitude, time.time()) # noqa: TID251
+ if elevation > 0.0:
+ self._day_mode = True
+ elif elevation < -6.0:
+ self._day_mode = False
+ # between 0 and -6 deg (twilight): keep the current style, no flapping
+
+ def update(self):
+ now = time.monotonic()
+ self._refresh_params(now)
+
+ if not gui_app.big_ui() and not self._force_visible:
+ self.active = False
+ self._release_providers()
+ return
+ if not self._maps_enabled:
+ self.active = False
+ self._release_providers()
+ return
+
+ # We're onroad with maps enabled — tiles may load again, so re-arm the release latch.
+ self._released = False
+
+ sm = ui_state.sm
+ render_updated = False
+ if sm.updated["iqNavRenderState"]:
+ render_updated = True
+ rs = sm["iqNavRenderState"]
+ rs_lat = float(rs.currentLatitude)
+ rs_lon = float(rs.currentLongitude)
+ has_fix = abs(rs_lat) > 0.001 and abs(rs_lon) > 0.001
+ if has_fix:
+ self.current_latitude = rs_lat
+ self.current_longitude = rs_lon
+ self.bearing_deg = float(rs.bearingDeg)
+ self.zoom_hint = float(rs.zoomHint) if float(rs.zoomHint) > 0.0 else 16.0
+ self._has_render_fix = True
+ route_points = list(rs.routePolylineSimplified) if len(rs.routePolylineSimplified) > 0 else list(rs.routePolyline)
+ if route_points:
+ self.route_points = route_points
+ self._projected_route_key = None
+ self.next_distance = float(rs.nextManeuverDistance)
+ self.next_direction = self._enum_value(rs.nextManeuverDirection)
+ self.next_type = self._enum_value(rs.nextManeuverType)
+ if self._has_render_fix:
+ self.render_center_latitude, self.render_center_longitude, self.render_zoom = choose_nav_camera(
+ self.current_latitude,
+ self.current_longitude,
+ self.bearing_deg,
+ self._route_ahead_points(),
+ self._map_viewport_width,
+ self._map_viewport_height,
+ self.zoom_hint,
+ )
+ self.destination_latitude = float(rs.destinationLatitude)
+ self.destination_longitude = float(rs.destinationLongitude)
+ if self.display_center_latitude == 0.0 and self.display_center_longitude == 0.0:
+ self.display_center_latitude = self.render_center_latitude
+ self.display_center_longitude = self.render_center_longitude
+ self.display_zoom = self.render_zoom
+ self.active = bool(rs.active) or self._has_render_fix or bool(self.route_points)
+
+ if self._force_visible and (not render_updated or not self.active):
+ self._refresh_position_from_fallback()
+
+ if sm.updated["iqNavState"]:
+ nav = sm["iqNavState"]
+ self.nav_active = bool(nav.active)
+ self.next_valid = bool(nav.nextManeuverValid)
+ self.destination_name = str(nav.destinationName or "")
+ self.next_description = nav.nextManeuverDescription if nav.nextManeuverValid else ""
+ self.time_remaining = float(nav.timeRemaining)
+ self.distance_remaining = float(nav.distanceRemaining)
+ self.next_direction = self._enum_value(nav.nextManeuverDirection) if nav.nextManeuverValid else self.next_direction
+ self.next_type = self._enum_value(nav.nextManeuverType) if nav.nextManeuverValid else self.next_type
+
+ if sm.updated["iqLiveData"]:
+ self.road_name = sm["iqLiveData"].roadName
+
+ if self.active:
+ self.display_center_latitude = self._lerp(self.display_center_latitude, self.render_center_latitude, CAMERA_SMOOTHING)
+ self.display_center_longitude = self._lerp(self.display_center_longitude, self.render_center_longitude, CAMERA_SMOOTHING)
+ self.display_zoom = self._lerp(self.display_zoom, self.render_zoom, CAMERA_SMOOTHING)
+ if now - self._last_projection_update >= ROUTE_PROJECTION_UPDATE_S:
+ self._refresh_route_projection()
+ self._last_projection_update = now
+
+ self._refresh_day_mode(now)
+ self._mapbox.set_day_mode(self._day_mode)
+ self._offline.set_day_mode(self._day_mode)
+
+ rotate = self._heading_up and self._has_render_fix
+ self._mapbox.set_rotated(rotate)
+ self._offline.set_rotated(rotate)
+ target_bearing = self.bearing_deg if rotate else 0.0
+ self.display_bearing = self._lerp_angle(self.display_bearing, target_bearing, 0.15)
+
+ if self._online_maps_enabled:
+ self._mapbox_mode_released = False
+ if now - self._last_mapbox_update >= MAP_PROVIDER_UPDATE_S:
+ self._mapbox.update(
+ self.display_center_latitude,
+ self.display_center_longitude,
+ self.display_zoom,
+ self._map_viewport_width,
+ self._map_viewport_height,
+ )
+ self._last_mapbox_update = now
+ elif not self._mapbox_mode_released:
+ # Online maps toggled off: free the mapbox tile cache once. No update() means no fetch
+ # threads and no network traffic while offline-only mode is selected.
+ self._mapbox.release()
+ self._mapbox_mode_released = True
+
+ if self._offline_maps_enabled:
+ if self._online_maps_enabled:
+ # Both sources on: offline engages only while mapbox can't cover the screen.
+ mapbox_status = self._mapbox.status()
+ offline_engaged = mapbox_status in {"disabled", "token_missing", "error"} or not self._mapbox.has_content()
+ else:
+ offline_engaged = True
+ else:
+ offline_engaged = False
+
+ if offline_engaged:
+ if now - self._last_offline_update >= OFFLINE_PROVIDER_UPDATE_S:
+ self._offline.update(
+ self.display_center_latitude,
+ self.display_center_longitude,
+ self.display_zoom,
+ self._map_viewport_width,
+ self._map_viewport_height,
+ )
+ self._last_offline_update = now
+ self._offline_idle_since = 0.0
+ elif self._offline.has_content():
+ if not self._offline_maps_enabled:
+ # Offline maps toggled off mid-drive: free its tile cache immediately.
+ self._offline.release()
+ self._offline_idle_since = 0.0
+ # Mapbox recovered: the offline fill-in cache (up to CACHE_LIMIT tiles of GPU
+ # memory) would otherwise stay resident until the panel deactivates — one LTE
+ # dropout per drive made it a permanent +tile-cache floor. It refills from the
+ # on-disk cache in a few frames when needed, so free it after a healthy minute.
+ elif self._offline_idle_since == 0.0:
+ self._offline_idle_since = now
+ elif now - self._offline_idle_since >= OFFLINE_RELEASE_AFTER_S:
+ self._offline.release()
+ self._offline_idle_since = 0.0
+
+ def maps_enabled(self) -> bool:
+ if self._force_visible:
+ return True
+ self._refresh_params(time.monotonic())
+ return bool(self._maps_enabled)
+
+ def warm_up_tiles(self, timeout_s: float = 30.0) -> bool:
+ """Block until the online provider covers the current viewport. For offline rendering
+ (tools/clip), where frames aren't wall-clock paced and async tile fetches would lag the
+ output. Pumps update() with the provider throttle bypassed; needs the panel active (a nav
+ fix already fed through sm) and a resolvable Mapbox token. Render thread only."""
+ if not (self._maps_enabled and self.active and self._online_maps_enabled):
+ return False
+ if not resolve_mapbox_token(self._params):
+ return False
+ deadline = time.monotonic() + timeout_s
+ while True:
+ self._last_mapbox_update = 0.0
+ self.update()
+ if self._mapbox.viewport_complete():
+ return True
+ if time.monotonic() >= deadline:
+ return False
+ time.sleep(0.05)
+
+ @staticmethod
+ def _draw_card(rect: rl.Rectangle):
+ shadow = rl.Rectangle(rect.x + 8, rect.y + 12, rect.width, rect.height)
+ rl.draw_rectangle_rounded(shadow, CARD_RADIUS, 18, rl.Color(4, 8, 14, 110))
+ rl.draw_rectangle_rounded(rect, CARD_RADIUS, 18, rl.Color(9, 18, 28, 246))
+ rl.draw_rectangle_rounded_lines(rect, CARD_RADIUS, 18, rl.Color(255, 255, 255, 35))
+
+ @staticmethod
+ def _draw_fallback_background(rect: rl.Rectangle, draw_grid: bool = True):
+ rl.draw_rectangle_rounded(rect, 0.04, 14, rl.Color(20, 27, 37, 255))
+ # The decorative grid is only visible in the no-map placeholder state; once tiles are drawn
+ # they paint over it opaquely, so the ~20 draw_line calls/frame are pure wasted overdraw.
+ if not draw_grid:
+ return
+ spacing = 44
+ line_color = rl.Color(90, 104, 123, 86)
+ x = rect.x
+ while x < rect.x + rect.width:
+ rl.draw_line(int(x), int(rect.y), int(x), int(rect.y + rect.height), line_color)
+ x += spacing
+ y = rect.y
+ while y < rect.y + rect.height:
+ rl.draw_line(int(rect.x), int(y), int(rect.x + rect.width), int(y), line_color)
+ y += spacing
+
+ @staticmethod
+ def _draw_ego_arrow(center_x: float, center_y: float, bearing_deg: float):
+ rl.draw_circle_v(rl.Vector2(center_x, center_y + 8), 21.0, rl.Color(0, 0, 0, 120))
+ heading = math.radians(bearing_deg)
+
+ def rotate(px: float, py: float) -> rl.Vector2:
+ rx = (px * math.cos(heading)) - (py * math.sin(heading))
+ ry = (px * math.sin(heading)) + (py * math.cos(heading))
+ return rl.Vector2(center_x + rx, center_y + ry)
+
+ nose = rotate(0.0, -25.0)
+ left = rotate(-16.0, 19.0)
+ right = rotate(16.0, 19.0)
+ rl.draw_triangle(nose, left, right, rl.Color(255, 255, 255, 245))
+
+ def _draw_provider_badge(self, map_rect: rl.Rectangle):
+ status = self._mapbox.status()
+ offline_status = self._offline.status()
+ base = self.road_name or "Navigation"
+ if not self._online_maps_enabled and not self._offline_maps_enabled:
+ label = "Map sources disabled"
+ elif not self._online_maps_enabled:
+ # Offline-only mode: local tiles are the primary (and only) source.
+ if offline_status == "offline_ready" and self._offline.has_content():
+ label = f"{base} (offline)"
+ else:
+ label = {
+ "offline_missing": "Offline maps missing",
+ "offline_invalid": "Offline maps invalid",
+ }.get(offline_status, "Loading offline map")
+ elif status == "offline_cache":
+ label = f"{base} (Mapbox cached)"
+ elif status == "ready" or self._mapbox.has_content():
+ label = base
+ elif self._offline_maps_enabled and offline_status == "offline_ready" and self._offline.has_content():
+ label = f"{base} (offline)"
+ else:
+ label = {
+ "disabled": "Mapbox disabled",
+ "token_missing": "Mapbox token missing",
+ "loading": "Loading live map",
+ "error": "Mapbox unavailable",
+ "offline_cache": "Mapbox cached",
+ }.get(status, base)
+ if self._offline_maps_enabled and status in {"token_missing", "error"}:
+ if offline_status == "offline_missing":
+ label = "Offline maps missing"
+ elif offline_status == "offline_invalid":
+ label = "Offline maps invalid"
+
+ badge = rl.Rectangle(map_rect.x + 16, map_rect.y + 16, min(280.0, map_rect.width - 32), 38)
+ rl.draw_rectangle_rounded(badge, 0.28, 10, rl.Color(7, 12, 18, 175))
+ rl.draw_text_ex(self._micro_font, label, rl.Vector2(badge.x + 14, badge.y + 9), 20, 0, rl.Color(238, 243, 247, 240))
+
+ @staticmethod
+ def _draw_panel_shell(rect: rl.Rectangle):
+ rl.draw_rectangle_rounded(rect, 0.03, 12, rl.Color(9, 18, 28, 248))
+ rl.draw_rectangle_rounded_lines(rect, 0.03, 12, rl.Color(255, 255, 255, 26))
+
+ @staticmethod
+ def _draw_glass_band(rect: rl.Rectangle, alpha: int = 220):
+ rl.draw_rectangle_rounded(rect, 0.02, 10, rl.Color(7, 12, 18, alpha))
+
+ def _format_next_distance(self) -> str:
+ if not self._display_next_valid() or self.next_distance <= 0.0:
+ return "--"
+ if ui_state.is_metric:
+ if self.next_distance >= 1000.0:
+ return f"{self.next_distance / 1000.0:.1f} km"
+ return f"{self.next_distance:.0f} m"
+
+ feet = self.next_distance * 3.28084
+ if feet >= 900.0:
+ return f"{self.next_distance * 0.000621371:.1f} mi"
+ if feet < 500.0:
+ return f"{int(round(feet / 50) * 50)} ft"
+ return f"{int(round(feet / 100) * 100)} ft"
+
+ def _format_remaining_distance(self) -> str:
+ if not self._display_route_active() or self.distance_remaining <= 0.0:
+ return "--"
+ if ui_state.is_metric:
+ return f"{self.distance_remaining / 1000.0:.1f} km"
+ return f"{self.distance_remaining * 0.000621371:.1f} mi"
+
+ def _format_eta_clock(self) -> str:
+ if not self._display_route_active() or self.time_remaining <= 0.0:
+ return "--"
+ eta_epoch = time.time() + self.time_remaining + utc_offset_hours() * 3600
+ eta_time = time.gmtime(eta_epoch)
+ if ui_state.is_metric:
+ return time.strftime("%H:%M", eta_time)
+ return time.strftime("%-I:%M %p", eta_time).lower()
+
+ def _draw_map_surface(self, map_rect: rl.Rectangle, draw_fade: bool = True) -> None:
+ rl.begin_scissor_mode(int(map_rect.x), int(map_rect.y), int(map_rect.width), int(map_rect.height))
+ # Skip the placeholder grid whenever a provider has tiles to paint over it.
+ has_tiles = self._mapbox.has_content() or self._offline.has_content()
+ self._draw_fallback_background(map_rect, draw_grid=not has_tiles)
+ # heading-up: one modelview rotation about the map center covers tiles + route + pin
+ rotation = self.display_bearing % 360.0
+ rotated = min(rotation, 360.0 - rotation) > 0.2
+ if rotated:
+ rl.rl_push_matrix()
+ rl.rl_translatef(map_rect.x + map_rect.width * 0.5, map_rect.y + map_rect.height * 0.5, 0.0)
+ rl.rl_rotatef(-self.display_bearing, 0.0, 0.0, 1.0)
+ rl.rl_translatef(-(map_rect.x + map_rect.width * 0.5), -(map_rect.y + map_rect.height * 0.5), 0.0)
+ if self._online_maps_enabled:
+ if self._offline_maps_enabled and self._offline.has_content():
+ # Offline underlay fills any tiles mapbox is missing; it only holds content while
+ # mapbox is degraded (released ~60s after recovery), so this is a no-op when healthy.
+ self._offline.draw(map_rect, self.display_center_latitude, self.display_center_longitude, self.display_zoom)
+ self._mapbox.draw(map_rect, self.display_center_latitude, self.display_center_longitude, self.display_zoom)
+ elif self._offline_maps_enabled:
+ self._offline.draw(map_rect, self.display_center_latitude, self.display_center_longitude, self.display_zoom)
+ self._draw_route_overlay(map_rect)
+ if rotated:
+ rl.rl_pop_matrix()
+ if draw_fade:
+ fade = rl.Rectangle(map_rect.x, map_rect.y + map_rect.height - 128, map_rect.width, 128)
+ rl.draw_rectangle_gradient_v(int(fade.x), int(fade.y), int(fade.width), int(fade.height), rl.Color(0, 0, 0, 0), rl.Color(4, 10, 16, 170))
+ rl.end_scissor_mode()
+
+ def _draw_route_overlay(self, map_rect: rl.Rectangle):
+ if len(self._projected_route_points) >= 2:
+ for idx in range(len(self._projected_route_points) - 1):
+ x1, y1 = self._projected_route_points[idx]
+ x2, y2 = self._projected_route_points[idx + 1]
+ p1 = rl.Vector2(map_rect.x + x1, map_rect.y + y1)
+ p2 = rl.Vector2(map_rect.x + x2, map_rect.y + y2)
+ rl.draw_line_ex(p1, p2, 16.0, rl.Color(8, 18, 30, 220))
+ rl.draw_line_ex(p1, p2, 10.0, rl.Color(255, 255, 255, 210))
+ rl.draw_line_ex(p1, p2, 6.0, rl.Color(58, 164, 255, 255))
+
+ if abs(self.destination_latitude) > 0.001 and abs(self.destination_longitude) > 0.001:
+ dest_x, dest_y = project_nav_point(
+ self.destination_latitude,
+ self.destination_longitude,
+ self.display_center_latitude,
+ self.display_center_longitude,
+ self.display_zoom,
+ 0.0,
+ map_rect.width,
+ map_rect.height,
+ )
+ center = rl.Vector2(map_rect.x + dest_x, map_rect.y + dest_y)
+ rl.draw_circle_v(center, 12.0, rl.Color(7, 18, 26, 235))
+ rl.draw_circle_lines(int(center.x), int(center.y), 12.0, rl.Color(255, 255, 255, 150))
+ texture = self._destination_texture()
+ if texture is not None:
+ src = rl.Rectangle(0, 0, float(texture.width), float(texture.height))
+ # counter-rotate about its own center so the flag stays upright in heading-up
+ dst = rl.Rectangle(center.x, center.y, 18, 22)
+ rl.draw_texture_pro(texture, src, dst, rl.Vector2(9, 11), self.display_bearing, rl.WHITE)
+
+ ego_x, ego_y = project_nav_point(
+ self.current_latitude,
+ self.current_longitude,
+ self.display_center_latitude,
+ self.display_center_longitude,
+ self.display_zoom,
+ 0.0,
+ map_rect.width,
+ map_rect.height,
+ )
+ self._draw_ego_arrow(map_rect.x + ego_x, map_rect.y + ego_y, self.bearing_deg)
+
+ def _draw_maneuver_icon(self, tile: rl.Rectangle):
+ display_next_valid = self._display_next_valid()
+ texture = self._icon_texture()
+ if texture is not None and display_next_valid:
+ src = rl.Rectangle(0, 0, float(texture.width), float(texture.height))
+ icon_side = min(tile.width, tile.height - 32)
+ dst = rl.Rectangle(tile.x + (tile.width - icon_side) * 0.5, tile.y, icon_side, icon_side)
+ rl.draw_texture_pro(texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE)
+
+ distance_text = f"{self.next_distance:.0f} m" if display_next_valid and self.next_distance > 0 else "--"
+ distance_size = self._fit_text_size(self._micro_font, distance_text, tile.width - 22, 22, 16)
+ dist_width = measure_text_cached(self._micro_font, distance_text, distance_size).x
+ distance_color = rl.WHITE if display_next_valid else rl.Color(150, 163, 176, 200)
+ rl.draw_text_ex(
+ self._micro_font,
+ distance_text,
+ rl.Vector2(tile.x + (tile.width - dist_width) * 0.5, tile.y + tile.height - 30),
+ distance_size,
+ 0,
+ distance_color,
+ )
+
+ def _draw_split_header(self, rect: rl.Rectangle):
+ header_rect = rl.Rectangle(rect.x + 14, rect.y + 14, rect.width - 28, SPLIT_HEADER_HEIGHT - 20)
+ self._draw_glass_band(header_rect, 214)
+
+ icon_tile = rl.Rectangle(header_rect.x + 18, header_rect.y + 18, 112, 112)
+ self._draw_maneuver_icon(icon_tile)
+
+ display_next_valid = self._display_next_valid()
+ display_route_active = self._display_route_active()
+ distance_text = self._format_next_distance()
+ if display_next_valid and self.next_description:
+ title = self.next_description
+ elif display_route_active and self.destination_name:
+ title = self.destination_name
+ elif display_route_active:
+ title = "Route guidance"
+ else:
+ title = self.road_name or "Navigation"
+
+ if display_next_valid and self.road_name:
+ sublabel = self.road_name
+ elif display_route_active:
+ sublabel = "Route active"
+ else:
+ sublabel = self.road_name or "Navigation standby"
+
+ text_x = icon_tile.x + icon_tile.width + 22
+ right_x = header_rect.x + header_rect.width - 22
+ distance_size = self._fit_text_size(self._title_font, distance_text, 140, 42, 22)
+ distance_width = measure_text_cached(self._title_font, distance_text, distance_size).x
+ rl.draw_text_ex(self._title_font, distance_text, rl.Vector2(right_x - distance_width, header_rect.y + 22), distance_size, 0, rl.WHITE)
+
+ title_max_width = max(160.0, right_x - text_x - 10)
+ title_size = self._fit_text_size(self._title_font, title, title_max_width, 34, 22)
+ title_lines = wrap_text(self._title_font, title, title_size, int(title_max_width))[:2]
+ for idx, line in enumerate(title_lines):
+ rl.draw_text_ex(self._title_font, line, rl.Vector2(text_x, header_rect.y + 24 + idx * (title_size + 2)), title_size, 0, rl.WHITE)
+
+ sub_size = self._fit_text_size(self._micro_font, sublabel, title_max_width, 22, 18)
+ sub_y = header_rect.y + 30 + len(title_lines) * (title_size + 2)
+ rl.draw_text_ex(self._micro_font, sublabel, rl.Vector2(text_x, sub_y), sub_size, 0, rl.Color(179, 188, 201, 240))
+
+ def _draw_split_footer(self, rect: rl.Rectangle):
+ footer_rect = rl.Rectangle(rect.x + 14, rect.y + rect.height - SPLIT_FOOTER_HEIGHT - 14, rect.width - 28, SPLIT_FOOTER_HEIGHT)
+ self._draw_glass_band(footer_rect, 222)
+
+ chips_y = footer_rect.y + 20
+ chips_x = footer_rect.x + 20
+ chips_gap = 12
+ chip_width = (footer_rect.width - 40 - chips_gap * 2) / 3.0
+ self._draw_stat_chip(rl.Rectangle(chips_x, chips_y, chip_width, 54), self._format_eta_clock(), "eta")
+ minutes_text = f"{self.time_remaining / 60.0:.1f} min" if self._display_route_active() and self.time_remaining > 0.0 else "--"
+ self._draw_stat_chip(rl.Rectangle(chips_x + chip_width + chips_gap, chips_y, chip_width, 54), minutes_text, "time")
+ self._draw_stat_chip(rl.Rectangle(chips_x + (chip_width + chips_gap) * 2, chips_y, chip_width, 54), self._format_remaining_distance(), "left")
+
+ def _draw_info_panel(self, panel_rect: rl.Rectangle):
+ info_rect = rl.Rectangle(panel_rect.x + 14, panel_rect.y + MAP_HEIGHT + 26, panel_rect.width - 28, panel_rect.height - MAP_HEIGHT - 40)
+ rl.draw_rectangle_rounded(info_rect, 0.08, 12, rl.Color(8, 14, 20, 225))
+
+ icon_tile = rl.Rectangle(info_rect.x + 16, info_rect.y + 16, 124, 124)
+ self._draw_maneuver_icon(icon_tile)
+
+ display_next_valid = self._display_next_valid()
+ display_route_active = self._display_route_active()
+
+ if display_next_valid and self.next_description:
+ title = self.next_description
+ elif display_route_active and self.destination_name:
+ title = self.destination_name
+ elif display_route_active:
+ title = "Route guidance"
+ else:
+ title = self.road_name or "Navigation"
+ title_x = info_rect.x + 162
+ title_max_width = info_rect.width - 178
+ title_size = self._fit_text_size(self._title_font, title, title_max_width, 34, 24)
+ title_lines = wrap_text(self._title_font, title, title_size, int(title_max_width))[:2]
+ for idx, line in enumerate(title_lines):
+ rl.draw_text_ex(self._title_font, line, rl.Vector2(title_x, info_rect.y + 18 + idx * (title_size + 2)), title_size, 0, rl.WHITE)
+
+ if display_next_valid and self.road_name:
+ road_label = self.road_name
+ elif display_route_active:
+ road_label = "Route active"
+ else:
+ road_label = self.road_name or "No active route"
+ road_size = self._fit_text_size(self._micro_font, road_label, title_max_width, 22, 18)
+ road_y = info_rect.y + 18 + len(title_lines) * (title_size + 2) + 8
+ rl.draw_text_ex(self._micro_font, road_label, rl.Vector2(title_x, road_y), road_size, 0, rl.Color(171, 184, 196, 240))
+
+ eta_text = f"{(self.time_remaining / 60.0):.1f} min" if display_route_active and self.time_remaining > 0 else "--"
+ remaining_text = f"{(self.distance_remaining / 1000.0):.1f} km" if display_route_active and self.distance_remaining > 0 else "--"
+ next_text = f"{self.next_distance:.0f} m" if display_next_valid and self.next_distance > 0 else "--"
+
+ stat_y = info_rect.y + info_rect.height - 58
+ available_width = info_rect.width - 178
+ chip_width = (available_width - STAT_GAP * 2) / 3.0
+ self._draw_stat_chip(rl.Rectangle(title_x, stat_y, chip_width, 50), next_text, "next")
+ self._draw_stat_chip(rl.Rectangle(title_x + chip_width + STAT_GAP, stat_y, chip_width, 50), eta_text, "eta")
+ self._draw_stat_chip(rl.Rectangle(title_x + (chip_width + STAT_GAP) * 2, stat_y, chip_width, 50), remaining_text, "left")
+
+ def _draw_stat_chip(self, rect: rl.Rectangle, value: str, label: str):
+ rl.draw_rectangle_rounded(rect, 0.24, 10, rl.Color(18, 30, 42, 255))
+ value_size = self._fit_text_size(self._body_font, value, rect.width - 16, 25, 17)
+ label_size = self._fit_text_size(self._micro_font, label.upper(), rect.width - 16, 12, 9)
+ value_width = measure_text_cached(self._body_font, value, value_size).x
+ label_width = measure_text_cached(self._micro_font, label.upper(), label_size).x
+ rl.draw_text_ex(
+ self._body_font,
+ value,
+ rl.Vector2(rect.x + (rect.width - value_width) * 0.5, rect.y + 3),
+ value_size,
+ 0,
+ rl.WHITE,
+ )
+ rl.draw_text_ex(
+ self._micro_font,
+ label.upper(),
+ rl.Vector2(rect.x + (rect.width - label_width) * 0.5, rect.y + 33),
+ label_size,
+ 0,
+ rl.Color(122, 205, 161, 255),
+ )
+
+ def _draw_panel_contents(self, panel_rect: rl.Rectangle) -> None:
+ """Draw the full onroad panel into the given rect. Rect origin is (0,0) when rendering into
+ the cache texture, or the real screen position on the direct-draw fallback."""
+ self._draw_card(panel_rect)
+
+ map_rect = rl.Rectangle(panel_rect.x + 12, panel_rect.y + 12, panel_rect.width - 24, MAP_HEIGHT)
+ self._map_viewport_width = map_rect.width
+ self._map_viewport_height = map_rect.height
+ self._draw_map_surface(map_rect)
+
+ self._draw_provider_badge(map_rect)
+ self._draw_info_panel(panel_rect)
+
+ def _ensure_rt(self, attr: str, width: int, height: int):
+ rt = getattr(self, attr)
+ if rt is None:
+ try:
+ rt = rl.load_render_texture(width, height)
+ rl.set_texture_filter(rt.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR)
+ setattr(self, attr, rt)
+ except Exception:
+ setattr(self, attr, None)
+ return None
+ return rt
+
+ def _chrome_content_key(self):
+ # Every piece of state that _draw_provider_badge + _draw_info_panel turn into pixels.
+ return (
+ round(self.next_distance), self.next_direction, self.next_type, bool(self.next_valid),
+ self.next_description, self.destination_name,
+ round(self.time_remaining), round(self.distance_remaining),
+ bool(self.nav_active), self.road_name, len(self.route_points),
+ self._mapbox.status(), self._offline.status(),
+ self._mapbox.has_content(), self._offline.has_content(),
+ self._online_maps_enabled, self._offline_maps_enabled, self._day_mode,
+ bool(ui_state.is_metric),
+ )
+
+ @staticmethod
+ def _blit_rt(rt, x: float, y: float) -> None:
+ # RenderTexture color buffers are stored bottom-up, so flip vertically via negative src height.
+ tex = rt.texture
+ src = rl.Rectangle(0, 0, float(tex.width), -float(tex.height))
+ dst = rl.Rectangle(float(x), float(y), float(tex.width), float(tex.height))
+ rl.draw_texture_pro(tex, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE)
+
+ def _render(self, rect: rl.Rectangle):
+ if not self.active or not gui_app.big_ui():
+ return
+
+ panel_x = rect.x + rect.width - PANEL_WIDTH - PANEL_MARGIN_RIGHT
+ panel_y = rect.y + PANEL_MARGIN_TOP
+ map_w = float(PANEL_WIDTH - 24)
+ map_h = float(MAP_HEIGHT)
+
+ map_rt = self._ensure_rt("_map_rt", int(map_w), int(map_h))
+ chrome_rt = self._ensure_rt("_chrome_rt", int(PANEL_WIDTH + PANEL_SHADOW_PAD), int(PANEL_HEIGHT + PANEL_SHADOW_PAD))
+ if map_rt is None or chrome_rt is None:
+ # RenderTexture unavailable — fall back to direct per-frame draw (previous behavior).
+ self._draw_panel_contents(rl.Rectangle(panel_x, panel_y, PANEL_WIDTH, PANEL_HEIGHT))
+ return
+
+ now = time.monotonic()
+ self._map_viewport_width = map_w
+ self._map_viewport_height = map_h
+
+ # LIVE map layer: tiles/route/ego pan continuously -> refresh at PANEL_RENDER_FPS.
+ if now - self._last_map_render >= PANEL_RENDER_INTERVAL:
+ self._last_map_render = now
+ rl.begin_texture_mode(map_rt)
+ rl.clear_background(rl.Color(0, 0, 0, 0))
+ self._draw_map_surface(rl.Rectangle(0.0, 0.0, map_w, map_h))
+ rl.end_texture_mode()
+
+ # CHROME layer: badge + info text only change on value updates. Regenerate on a content-key
+ # change, with a safety cap so a missed key field can't freeze the readout.
+ key = self._chrome_content_key()
+ if key != self._chrome_key or now - self._last_chrome_render >= CHROME_MAX_INTERVAL:
+ self._chrome_key = key
+ self._last_chrome_render = now
+ rl.begin_texture_mode(chrome_rt)
+ rl.clear_background(rl.Color(0, 0, 0, 0))
+ self._draw_provider_badge(rl.Rectangle(12.0, 12.0, map_w, map_h))
+ self._draw_info_panel(rl.Rectangle(0.0, 0.0, PANEL_WIDTH, PANEL_HEIGHT))
+ rl.end_texture_mode()
+
+ # Composite: static card backdrop -> live map -> chrome text overlay.
+ self._draw_card(rl.Rectangle(panel_x, panel_y, PANEL_WIDTH, PANEL_HEIGHT))
+ self._blit_rt(map_rt, panel_x + 12, panel_y + 12)
+ self._blit_rt(chrome_rt, panel_x, panel_y)
+
+ def render_split_direct(self, rect: rl.Rectangle) -> None:
+ local_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height)
+ map_rect = rl.Rectangle(rect.x + 8, rect.y + 8, rect.width - 16, rect.height - 16)
+ self._map_viewport_width = map_rect.width
+ self._map_viewport_height = map_rect.height
+ self._draw_panel_shell(local_rect)
+ self._draw_map_surface(map_rect, draw_fade=False)
+ self._draw_provider_badge(map_rect)
+ self._draw_split_header(local_rect)
+ self._draw_split_footer(local_rect)
+
+ def render_split(self, rect: rl.Rectangle) -> None:
+ self.render_split_direct(rect)
diff --git a/iqpilot/ui/onroad/nav_map_utils.py b/iqpilot/ui/onroad/nav_map_utils.py
new file mode 100644
index 000000000..2872d65fd
--- /dev/null
+++ b/iqpilot/ui/onroad/nav_map_utils.py
@@ -0,0 +1,189 @@
+import math
+from urllib.parse import quote
+
+EARTH_RADIUS_M = 6378137.0
+TILE_SIZE = 256.0
+
+# Shift the whole driving zoom window closer in. The route-ahead fit (fit_zoom_for_points)
+# still zooms out for distant turns and in for straight roads; this just biases the baseline
+# so the route line + ego marker are easier to read while driving.
+NAV_DRIVE_ZOOM_BOOST = 1.0
+
+
+def _mercator_normalized(latitude: float, longitude: float) -> tuple[float, float]:
+ x = (longitude + 180.0) / 360.0
+ siny = min(max(math.sin(math.radians(latitude)), -0.9999), 0.9999)
+ y = 0.5 - math.log((1.0 + siny) / (1.0 - siny)) / (4.0 * math.pi)
+ return x, y
+
+
+def mercator_world_px(latitude: float, longitude: float, zoom: float) -> tuple[float, float]:
+ world_size = TILE_SIZE * (2.0 ** zoom)
+ nx, ny = _mercator_normalized(latitude, longitude)
+ x = nx * world_size
+ y = ny * world_size
+ return x, y
+
+
+def destination_point(latitude: float, longitude: float, bearing_deg: float, distance_m: float) -> tuple[float, float]:
+ if abs(distance_m) < 1e-3:
+ return latitude, longitude
+
+ angular_distance = distance_m / EARTH_RADIUS_M
+ bearing = math.radians(bearing_deg)
+ lat1 = math.radians(latitude)
+ lon1 = math.radians(longitude)
+
+ sin_lat1 = math.sin(lat1)
+ cos_lat1 = math.cos(lat1)
+ sin_ad = math.sin(angular_distance)
+ cos_ad = math.cos(angular_distance)
+
+ lat2 = math.asin(sin_lat1 * cos_ad + cos_lat1 * sin_ad * math.cos(bearing))
+ lon2 = lon1 + math.atan2(
+ math.sin(bearing) * sin_ad * cos_lat1,
+ cos_ad - sin_lat1 * math.sin(lat2),
+ )
+ return math.degrees(lat2), math.degrees(lon2)
+
+
+def fit_zoom_for_points(points, width: float, height: float, max_zoom: float = 17.6,
+ min_zoom: float = 12.8, padding: float = 56.0) -> float:
+ coords = [(float(point.latitude), float(point.longitude)) for point in points if point is not None]
+ if len(coords) < 2:
+ return max_zoom
+
+ xs, ys = zip(*[_mercator_normalized(lat, lon) for lat, lon in coords])
+ span_x = max(max(xs) - min(xs), 1e-6)
+ span_y = max(max(ys) - min(ys), 1e-6)
+
+ usable_width = max(width - 2.0 * padding, 32.0)
+ usable_height = max(height - 2.0 * padding, 32.0)
+ zoom_x = math.log2(usable_width / (TILE_SIZE * span_x))
+ zoom_y = math.log2(usable_height / (TILE_SIZE * span_y))
+ return max(min(min(zoom_x, zoom_y), max_zoom), min_zoom)
+
+
+def choose_nav_camera(current_latitude: float, current_longitude: float, bearing_deg: float, points,
+ width: float, height: float, preferred_zoom: float) -> tuple[float, float, float]:
+ preferred_zoom += NAV_DRIVE_ZOOM_BOOST
+ zoom = preferred_zoom
+ if points:
+ zoom = fit_zoom_for_points(points, width, height * 0.78, max_zoom=preferred_zoom + 0.6)
+ zoom = min(max(zoom, preferred_zoom - 1.2), preferred_zoom + 0.6)
+
+ meters_per_pixel = 156543.03392 * math.cos(math.radians(current_latitude)) / (2.0 ** zoom)
+ lookahead_pixels = height * 0.16
+ lookahead_m = max(lookahead_pixels * meters_per_pixel, 12.0)
+ center_latitude, center_longitude = destination_point(current_latitude, current_longitude, bearing_deg, lookahead_m)
+ return center_latitude, center_longitude, zoom
+
+
+def build_mapbox_static_url(latitude: float, longitude: float, zoom: float, bearing: float,
+ width: int, height: int, points=None) -> str:
+ overlay = ""
+ if points:
+ overlay = f"path-7+34d17a-0.85({encode_polyline(points)})/"
+
+ return (
+ f"https://api.mapbox.com/styles/v1/mapbox/navigation-night-v1/static/"
+ f"{overlay}{longitude:.6f},{latitude:.6f},{zoom:.2f},{bearing:.1f},0/{width}x{height}@2x"
+ )
+
+
+def build_mapbox_tile_url(z: int, x: int, y: int, tile_size: int = 256, scale: int = 2,
+ style: str = "navigation-night-v1") -> str:
+ suffix = f"@{scale}x" if scale > 1 else ""
+ return (
+ f"https://api.mapbox.com/styles/v1/mapbox/{style}/tiles/"
+ f"{tile_size}/{z}/{x}/{y}{suffix}"
+ )
+
+
+def tile_world_size(z: int, tile_size: int = 256) -> int:
+ return tile_size * (2 ** z)
+
+
+def mercator_world_px_at_zoom(latitude: float, longitude: float, z: int, tile_size: int = 256) -> tuple[float, float]:
+ world_size = tile_world_size(z, tile_size)
+ nx, ny = _mercator_normalized(latitude, longitude)
+ return nx * world_size, ny * world_size
+
+
+def encode_polyline(points) -> str:
+ result = []
+ last_lat = 0
+ last_lon = 0
+
+ for point in points:
+ lat = int(round(float(point.latitude if hasattr(point, "latitude") else point[0]) * 1e5))
+ lon = int(round(float(point.longitude if hasattr(point, "longitude") else point[1]) * 1e5))
+
+ for value in (lat - last_lat, lon - last_lon):
+ shifted = ~(value << 1) if value < 0 else (value << 1)
+ while shifted >= 0x20:
+ result.append(chr((0x20 | (shifted & 0x1f)) + 63))
+ shifted >>= 5
+ result.append(chr(shifted + 63))
+
+ last_lat = lat
+ last_lon = lon
+
+ return quote("".join(result), safe="")
+
+
+def project_nav_point(latitude: float, longitude: float, center_latitude: float, center_longitude: float,
+ zoom: float, bearing_deg: float, width: float, height: float,
+ anchor_x: float = 0.5, anchor_y: float = 0.5) -> tuple[float, float]:
+ px, py = mercator_world_px(latitude, longitude, zoom)
+ cx, cy = mercator_world_px(center_latitude, center_longitude, zoom)
+ dx = px - cx
+ dy = py - cy
+
+ theta = math.radians(bearing_deg)
+ cos_theta = math.cos(theta)
+ sin_theta = math.sin(theta)
+ rx = dx * cos_theta + dy * sin_theta
+ ry = -dx * sin_theta + dy * cos_theta
+ return width * anchor_x + rx, height * anchor_y + ry
+
+
+def project_nav_polyline(points, center_latitude: float, center_longitude: float, zoom: float, bearing_deg: float,
+ width: float, height: float, anchor_x: float = 0.5, anchor_y: float = 0.5) -> list[tuple[float, float]]:
+ projected = []
+ for point in points:
+ projected.append(
+ project_nav_point(
+ float(point.latitude),
+ float(point.longitude),
+ center_latitude,
+ center_longitude,
+ zoom,
+ bearing_deg,
+ width,
+ height,
+ anchor_x=anchor_x,
+ anchor_y=anchor_y,
+ )
+ )
+ return projected
+
+
+def solar_elevation_deg(latitude: float, longitude: float, unix_time: float) -> float:
+ """Approximate solar elevation (NOAA-style, good to ~0.5 deg) for day/night map styling."""
+ days = unix_time / 86400.0 - 10957.5 # days since J2000 epoch
+ mean_longitude = math.radians((280.460 + 0.9856474 * days) % 360.0)
+ mean_anomaly = math.radians((357.528 + 0.9856003 * days) % 360.0)
+ ecliptic_longitude = mean_longitude + math.radians(1.915) * math.sin(mean_anomaly) \
+ + math.radians(0.020) * math.sin(2.0 * mean_anomaly)
+ obliquity = math.radians(23.439 - 0.0000004 * days)
+ declination = math.asin(math.sin(obliquity) * math.sin(ecliptic_longitude))
+ right_ascension = math.atan2(math.cos(obliquity) * math.sin(ecliptic_longitude), math.cos(ecliptic_longitude))
+ gmst_deg = (280.46061837 + 360.98564736629 * days) % 360.0
+ hour_angle = math.radians(gmst_deg) + math.radians(longitude) - right_ascension
+ lat_rad = math.radians(latitude)
+ elevation = math.asin(
+ math.sin(lat_rad) * math.sin(declination)
+ + math.cos(lat_rad) * math.cos(declination) * math.cos(hour_angle)
+ )
+ return math.degrees(elevation)
diff --git a/iqpilot/ui/onroad/offline_tiles.py b/iqpilot/ui/onroad/offline_tiles.py
new file mode 100644
index 000000000..8b9dc9ef5
--- /dev/null
+++ b/iqpilot/ui/onroad/offline_tiles.py
@@ -0,0 +1,288 @@
+import os
+import json
+import time
+from typing import Any
+from pathlib import Path
+
+try:
+ import sqlite3
+except Exception:
+ sqlite3 = None # type: ignore[assignment]
+
+
+OFFLINE_MBTILES_ENV = "IQPILOT_OFFLINE_MBTILES"
+OFFLINE_TILE_ROOT_ENV = "IQPILOT_OFFLINE_TILE_ROOT"
+DEFAULT_OFFLINE_TILE_ROOT = Path("/data/offline_maps/tiles" if Path("/data").exists() else "/tmp/offline_maps/tiles")
+DEFAULT_OFFLINE_MAP_ROOT = Path("/data/offline_maps" if Path("/data").exists() else "/tmp/offline_maps")
+SQLITE_ERRORS = (sqlite3.Error,) if sqlite3 is not None else (Exception,)
+SQLiteConnection = Any
+
+
+def offline_tile_root() -> Path:
+ override = os.getenv(OFFLINE_TILE_ROOT_ENV)
+ return Path(override) if override else DEFAULT_OFFLINE_TILE_ROOT
+
+
+def offline_map_root() -> Path:
+ root = offline_tile_root()
+ if root.name == "tiles":
+ return root.parent
+ if root.name == "xyz":
+ return root.parent.parent if root.parent.name == "tiles" else root.parent
+ return DEFAULT_OFFLINE_MAP_ROOT
+
+
+def _parse_bounds(bounds: str) -> tuple[float, float, float, float] | None:
+ try:
+ min_lon, min_lat, max_lon, max_lat = [float(part) for part in bounds.split(",")]
+ except (ValueError, AttributeError):
+ return None
+ return min_lat, min_lon, max_lat, max_lon
+
+
+def _bounds_contains(bounds: tuple[float, float, float, float], latitude: float, longitude: float) -> bool:
+ min_lat, min_lon, max_lat, max_lon = bounds
+ return min_lat <= latitude <= max_lat and min_lon <= longitude <= max_lon
+
+
+def _bounds_area(bounds: tuple[float, float, float, float]) -> float:
+ min_lat, min_lon, max_lat, max_lon = bounds
+ return max(max_lat - min_lat, 0.0) * max(max_lon - min_lon, 0.0)
+
+
+# Manual cache that only stores hits: caching a None (manifest not written yet — e.g. a
+# bundle download in flight) would otherwise pin the miss for the life of the process.
+_region_bounds_cache: dict[Path, tuple[float, float, float, float]] = {}
+
+
+def _load_region_bounds(region_root: Path) -> tuple[float, float, float, float] | None:
+ cached = _region_bounds_cache.get(region_root)
+ if cached is not None:
+ return cached
+ bounds = _load_region_bounds_uncached(region_root)
+ if bounds is not None:
+ if len(_region_bounds_cache) > 64:
+ _region_bounds_cache.clear()
+ _region_bounds_cache[region_root] = bounds
+ return bounds
+
+
+def _load_region_bounds_uncached(region_root: Path) -> tuple[float, float, float, float] | None:
+ manifest_path = region_root / "manifest.json"
+ if manifest_path.exists():
+ try:
+ manifest = json.loads(manifest_path.read_text())
+ bounds = manifest.get("mbtiles", {}).get("bounds")
+ parsed = _parse_bounds(bounds) if bounds else None
+ if parsed is not None:
+ return parsed
+ except (OSError, json.JSONDecodeError):
+ pass
+
+ mbtiles_path = region_root / "tiles" / "offline.mbtiles"
+ if not mbtiles_path.exists():
+ return None
+
+ try:
+ conn = open_mbtiles(mbtiles_path)
+ row = conn.execute("SELECT value FROM metadata WHERE name = 'bounds'").fetchone()
+ conn.close()
+ except SQLITE_ERRORS:
+ return None
+
+ return _parse_bounds(row["value"]) if row is not None else None
+
+
+# Short-TTL cache instead of lru_cache: region bundles can be downloaded while the UI is
+# running, and a forever-cached candidate list would hide them until the process restarts.
+_REGION_ROOTS_TTL_S = 15.0
+_region_roots_cache: tuple[float, Path, tuple[Path, ...]] | None = None
+
+
+def _candidate_region_roots() -> tuple[Path, ...]:
+ global _region_roots_cache
+ root = offline_map_root()
+ now = time.monotonic()
+ if _region_roots_cache is not None:
+ cached_at, cached_root, cached = _region_roots_cache
+ if cached_root == root and now - cached_at < _REGION_ROOTS_TTL_S:
+ return cached
+
+ candidates: list[Path] = []
+ if (root / "tiles").exists():
+ candidates.append(root)
+
+ regions_root = root / "regions"
+ if regions_root.exists():
+ for child in sorted(regions_root.iterdir()):
+ if child.is_dir() and (child / "tiles").exists():
+ candidates.append(child)
+
+ result = tuple(candidates)
+ _region_roots_cache = (now, root, result)
+ return result
+
+
+def _region_covers_point(region_root: Path, latitude: float, longitude: float) -> bool:
+ mb = region_root / "tiles" / "offline.mbtiles"
+ if not mb.exists():
+ return True # xyz-only / unknown layout: don't second-guess the bbox match
+ try:
+ conn = open_mbtiles(mb)
+ try:
+ _, max_zoom = mbtiles_zoom_bounds(conn)
+ z = max_zoom if max_zoom is not None else 14
+ import math
+ n = 2 ** z
+ lat_r = math.radians(max(min(latitude, 85.05112878), -85.05112878))
+ x = int((longitude + 180.0) / 360.0 * n)
+ y = int((1.0 - math.asinh(math.tan(lat_r)) / math.pi) / 2.0 * n)
+ # 3x3 cluster: tolerate an empty sub-tile at the exact point (a z15 child with no road)
+ # while still rejecting a neighbor whose coverage doesn't reach this area at all.
+ for dx in (-1, 0, 1):
+ for dy in (-1, 0, 1):
+ if load_raster_tile_blob(conn, z, x + dx, y + dy) is not None:
+ return True
+ return False
+ finally:
+ conn.close()
+ except SQLITE_ERRORS:
+ return True
+
+
+def find_offline_region_root(latitude: float | None = None, longitude: float | None = None) -> Path | None:
+ candidates = _candidate_region_roots()
+ if not candidates:
+ return None
+
+ if latitude is None or longitude is None:
+ return candidates[0]
+
+ bounded: list[tuple[float, Path]] = []
+ for candidate in candidates:
+ bounds = _load_region_bounds(candidate)
+ if bounds is None:
+ continue
+ if _bounds_contains(bounds, latitude, longitude):
+ bounded.append((_bounds_area(bounds), candidate))
+
+ if bounded:
+ if len(bounded) == 1:
+ return bounded[0][1]
+ # multiple bboxes overlap this point (border zone): prefer the smallest-area region that
+ # ACTUALLY has tiles here, so we don't pick a neighbor whose bundle is empty at the border.
+ bounded.sort(key=lambda item: item[0])
+ for _, candidate in bounded:
+ if _region_covers_point(candidate, latitude, longitude):
+ return candidate
+ return bounded[0][1]
+
+ return candidates[0]
+
+
+def find_offline_mbtiles_path(latitude: float | None = None, longitude: float | None = None,
+ day: bool = False) -> Path | None:
+ explicit = os.getenv(OFFLINE_MBTILES_ENV)
+ if explicit:
+ path = Path(explicit)
+ if day:
+ day_path = path.with_name("offline_day.mbtiles")
+ if day_path.exists():
+ return day_path
+ return path if path.exists() else None
+
+ region_root = find_offline_region_root(latitude, longitude)
+ if region_root is None:
+ return None
+
+ # day variant is optional: regions built before the day palette fall back to the night set
+ if day:
+ day_preferred = region_root / "tiles" / "offline_day.mbtiles"
+ if day_preferred.exists():
+ return day_preferred
+
+ preferred = region_root / "tiles" / "offline.mbtiles"
+ if preferred.exists():
+ return preferred
+
+ matches = sorted(p for p in (region_root / "tiles").glob("*.mbtiles") if "_day" not in p.name or day)
+ return matches[0] if matches else None
+
+
+def find_offline_xyz_root(latitude: float | None = None, longitude: float | None = None) -> Path | None:
+ root = offline_tile_root()
+ if not root.exists():
+ region_root = find_offline_region_root(latitude, longitude)
+ if region_root is None:
+ return None
+ root = region_root / "tiles"
+
+ if any(child.is_dir() and child.name.isdigit() for child in root.iterdir()):
+ return root
+
+ xyz_dir = root / "xyz"
+ if xyz_dir.exists() and any(child.is_dir() and child.name.isdigit() for child in xyz_dir.iterdir()):
+ return xyz_dir
+
+ return None
+
+
+def xyz_to_tms_y(z: int, y: int) -> int:
+ return (2 ** z - 1) - y
+
+
+def open_mbtiles(path: Path) -> SQLiteConnection:
+ if sqlite3 is None:
+ raise RuntimeError("sqlite3 unavailable")
+ conn = sqlite3.connect(f"file:{path}?mode=ro", uri=True, check_same_thread=False)
+ conn.row_factory = sqlite3.Row
+ return conn
+
+
+def mbtiles_is_raster(conn: SQLiteConnection) -> bool:
+ row = conn.execute("SELECT value FROM metadata WHERE name = 'format'").fetchone()
+ if row is None:
+ return False
+ return row["value"] in {"png", "jpg", "jpeg", "webp"}
+
+
+def mbtiles_zoom_bounds(conn: SQLiteConnection) -> tuple[int | None, int | None]:
+ rows = {
+ row["name"]: row["value"]
+ for row in conn.execute("SELECT name, value FROM metadata WHERE name IN ('minzoom', 'maxzoom')")
+ }
+ min_zoom = int(rows["minzoom"]) if "minzoom" in rows else None
+ max_zoom = int(rows["maxzoom"]) if "maxzoom" in rows else None
+ return min_zoom, max_zoom
+
+
+def xyz_zoom_bounds(root: Path) -> tuple[int | None, int | None]:
+ zoom_dirs = sorted(
+ int(child.name)
+ for child in root.iterdir()
+ if child.is_dir() and child.name.isdigit()
+ )
+ if not zoom_dirs:
+ return None, None
+ return zoom_dirs[0], zoom_dirs[-1]
+
+
+def load_raster_tile_blob(conn: SQLiteConnection, z: int, x: int, y: int) -> bytes | None:
+ row = conn.execute(
+ """
+ SELECT tile_data
+ FROM tiles
+ WHERE zoom_level = ? AND tile_column = ? AND tile_row = ?
+ """,
+ (z, x, xyz_to_tms_y(z, y)),
+ ).fetchone()
+ return bytes(row["tile_data"]) if row is not None else None
+
+
+def load_raster_xyz_tile_blob(root: Path, z: int, x: int, y: int) -> bytes | None:
+ for suffix in ("png", "webp", "jpg", "jpeg"):
+ for filename in (f"{y}.{suffix}", f"{y}@2x.{suffix}"):
+ tile_path = root / str(z) / str(x) / filename
+ if tile_path.exists():
+ return tile_path.read_bytes()
+ return None
diff --git a/iqpilot/ui/onroad/soft_warning.py b/iqpilot/ui/onroad/soft_warning.py
new file mode 100644
index 000000000..74fc4721d
--- /dev/null
+++ b/iqpilot/ui/onroad/soft_warning.py
@@ -0,0 +1,60 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+import pyray as rl
+from cereal import log
+
+from openpilot.selfdrive.ui import UI_BORDER_SIZE
+from openpilot.selfdrive.ui.ui_state import ui_state
+from openpilot.selfdrive.ui.onroad.driver_state import BTN_SIZE
+from openpilot.system.ui.lib.application import gui_app
+
+EventName = log.OnroadEvent.EventName
+
+# Events that trigger the soft warning triangle instead of a disruptive alert
+SOFT_WARNING_EVENTS = {
+ EventName.commIssue,
+ EventName.commIssueAvgFreq,
+ EventName.selfdrivedLagging,
+}
+
+ICON_SIZE = 96
+
+# Speed box geometry (mirrors hud_renderer._draw_set_speed)
+_SPEED_BOX_X_OFFSET = 60
+_SPEED_BOX_Y_OFFSET = 45
+_SPEED_BOX_WIDTH = 180 # midpoint between metric (186) and imperial (174)
+_SPEED_BOX_HEIGHT = 228
+
+_DM_OFFSET = UI_BORDER_SIZE + BTN_SIZE // 2 # = 126
+
+
+class SoftWarningRenderer:
+ def __init__(self):
+ self._icon = gui_app.texture("icons_mici/offroad_alerts/orange_warning.png", ICON_SIZE, ICON_SIZE)
+ self._active = False
+
+ def update(self) -> None:
+ sm = ui_state.sm
+ self._active = any(e.name in SOFT_WARNING_EVENTS for e in sm['onroadEvents'])
+
+ def render(self, rect: rl.Rectangle) -> None:
+ if not self._active:
+ return
+
+ # Centre of speed box (top-left of screen)
+ speed_cx = rect.x + _SPEED_BOX_X_OFFSET + _SPEED_BOX_WIDTH / 2
+ speed_cy = rect.y + _SPEED_BOX_Y_OFFSET + _SPEED_BOX_HEIGHT / 2
+
+ # Centre of driver monitoring icon (bottom-left of screen, LHD)
+ dm_cx = rect.x + _DM_OFFSET
+ dm_cy = rect.y + rect.height - _DM_OFFSET
+
+ # Midpoint between the two
+ mid_x = (speed_cx + dm_cx) / 2
+ mid_y = (speed_cy + dm_cy) / 2
+
+ draw_x = int(mid_x - ICON_SIZE / 2)
+ draw_y = int(mid_y - ICON_SIZE / 2)
+
+ rl.draw_texture(self._icon, draw_x, draw_y, rl.WHITE)
diff --git a/iqpilot/ui/theme.py b/iqpilot/ui/theme.py
new file mode 100644
index 000000000..0ce9fbf61
--- /dev/null
+++ b/iqpilot/ui/theme.py
@@ -0,0 +1,161 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+
+IQ.Pilot UI Theme — NeonTheme singleton
+========================================
+Stores the active accent/neon color as a hex string in Params["UIAccentColor"].
+This allows:
+ - hephaestusd to write the color via BLE/RPC from the Konn3kt companion app
+ - Konn3kt-set themes to be reflected on-device in real time
+ - Future per-driver theme profiles via Konn3kt
+
+Default accent: #00FFF5 (cyan neon — the IQ.Pilot signature color)
+
+Any UI component that wants the accent color calls:
+ NeonTheme.glow() -> rl.Color (full brightness, inner ring)
+ NeonTheme.glow_mid() -> rl.Color (60% alpha, mid ring)
+ NeonTheme.glow_outer() -> rl.Color (25% alpha, soft halo)
+ NeonTheme.bg() -> rl.Color (darkened tint of accent for card bg)
+
+Konn3kt / hephaestusd write interface:
+ Params().put("UIAccentColor", "#00FFF5") # any CSS hex string
+
+The theme refreshes from Params every REFRESH_INTERVAL seconds so changes
+propagate without a restart.
+"""
+
+import time
+import pyray as rl
+
+try:
+ from openpilot.common.params import Params
+except ImportError:
+ Params = None
+
+# How often (seconds) to re-read the accent color from Params
+REFRESH_INTERVAL = 2.0
+
+# IQ.Pilot default signature neon cyan
+DEFAULT_ACCENT_HEX = "#00FFF5"
+
+
+def _hex_to_rgb(hex_str: str) -> tuple[int, int, int]:
+ """Parse a CSS hex color string like '#00FFF5' or '00FFF5' to (r, g, b)."""
+ h = hex_str.strip().lstrip("#")
+ if len(h) == 3:
+ h = h[0] * 2 + h[1] * 2 + h[2] * 2
+ if len(h) != 6:
+ return (0x00, 0xFF, 0xF5) # fallback to default
+ try:
+ return (int(h[0:2], 16), int(h[2:4], 16), int(h[4:6], 16))
+ except ValueError:
+ return (0x00, 0xFF, 0xF5)
+
+
+def _darken(r: int, g: int, b: int, factor: float = 0.08) -> tuple[int, int, int]:
+ """Mix the accent toward black to create a card bg tint."""
+ return (int(r * factor), int(g * factor), int(b * factor))
+
+
+class _NeonTheme:
+ """
+ Singleton that holds and lazily refreshes the active neon accent color.
+ All color properties are rl.Color objects ready for use in Raylib draw calls.
+ """
+
+ def __init__(self):
+ self._params = Params() if Params else None
+ self._last_refresh: float = 0.0
+ self._hex: str = DEFAULT_ACCENT_HEX
+ self._r, self._g, self._b = _hex_to_rgb(DEFAULT_ACCENT_HEX)
+ self._refresh()
+
+ # ------------------------------------------------------------------
+ # Internal
+ # ------------------------------------------------------------------
+
+ def _refresh(self):
+ self._last_refresh = time.monotonic()
+ if self._params is None:
+ return
+ try:
+ stored = self._params.get("UIAccentColor")
+ if stored and isinstance(stored, str) and stored.strip():
+ self._hex = stored.strip()
+ self._r, self._g, self._b = _hex_to_rgb(self._hex)
+ except Exception:
+ pass # keep previous value on any error
+
+ def _maybe_refresh(self):
+ if time.monotonic() - self._last_refresh >= REFRESH_INTERVAL:
+ self._refresh()
+
+ # ------------------------------------------------------------------
+ # Public color accessors
+ # ------------------------------------------------------------------
+
+ def glow(self, alpha: int = 255) -> rl.Color:
+ """Full-brightness inner glow / border color."""
+ self._maybe_refresh()
+ return rl.Color(self._r, self._g, self._b, alpha)
+
+ def glow_mid(self, alpha: int = 130) -> rl.Color:
+ """Mid-brightness second ring."""
+ self._maybe_refresh()
+ return rl.Color(self._r, self._g, self._b, alpha)
+
+ def glow_outer(self, alpha: int = 45) -> rl.Color:
+ """Soft outer halo."""
+ self._maybe_refresh()
+ return rl.Color(self._r, self._g, self._b, alpha)
+
+ def bg(self) -> rl.Color:
+ """Dark card background tinted with the accent color."""
+ self._maybe_refresh()
+ dr, dg, db = _darken(self._r, self._g, self._b, 0.08)
+ # minimum darkness so the card is always readable
+ dr = max(dr, 0x0A)
+ dg = max(dg, 0x0A)
+ db = max(db, 0x0A)
+ return rl.Color(dr, dg, db, 255)
+
+ def bg_pressed(self) -> rl.Color:
+ """Slightly lighter card background for press state."""
+ self._maybe_refresh()
+ dr, dg, db = _darken(self._r, self._g, self._b, 0.13)
+ dr = max(dr, 0x0D)
+ dg = max(dg, 0x0D)
+ db = max(db, 0x0D)
+ return rl.Color(dr, dg, db, 255)
+
+ @property
+ def hex(self) -> str:
+ """Current accent color as hex string, e.g. '#00FFF5'."""
+ self._maybe_refresh()
+ return self._hex
+
+ # ------------------------------------------------------------------
+ # Write interface (called by hephaestusd / Konn3kt theme handler)
+ # ------------------------------------------------------------------
+
+ def set_accent(self, hex_color: str):
+ """
+ Set a new accent color immediately and persist it to Params.
+ hephaestusd / Konn3kt companion app should call this.
+
+ Args:
+ hex_color: CSS hex string, e.g. '#FF6B00' or '8B5CF6'
+ """
+ r, g, b = _hex_to_rgb(hex_color)
+ self._r, self._g, self._b = r, g, b
+ self._hex = "#" + hex_color.strip().lstrip("#").upper()
+ self._last_refresh = time.monotonic()
+ if self._params:
+ try:
+ self._params.put_nonblocking("UIAccentColor", self._hex)
+ except Exception:
+ pass
+
+
+# Global singleton — import this everywhere
+NeonTheme = _NeonTheme()
diff --git a/iqpilot/vehicle/__init__.py b/iqpilot/vehicle/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/iqpilot/vehicle/vehicle.py b/iqpilot/vehicle/vehicle.py
new file mode 100644
index 000000000..c0c56369a
--- /dev/null
+++ b/iqpilot/vehicle/vehicle.py
@@ -0,0 +1,59 @@
+"""
+Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
+"""
+from cereal import log
+from iqdbc.car import structs
+from iqdbc.car.chrysler.values import RAM_DT
+from openpilot.selfdrive.selfdrived.events import Events
+from openpilot.iqpilot.selfdrive.selfdrived.events import IQEvents
+
+_E = log.OnroadEvent.EventName
+_GEAR = structs.CarState.GearShifter
+
+# RAM_DT trucks with an enable floor at/above this need the gear-gated steer-floor latch
+_RAM_STEER_FLOOR_MS = 14.5
+
+
+class VehicleEvents:
+ """Brand-specific corrections layered onto the generic onroad event set.
+
+ openpilot's shared event path doesn't cover a couple of platform quirks: RAM_DT owns its
+ own low-speed steering floor, and a gas-interceptor Toyota can creep off a stop without the
+ stock resume prompt. Each supported brand gets a small handler that edits the live event set.
+ """
+
+ def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams):
+ self.CP = CP
+ self.CP_IQ = CP_IQ
+ self._steer_floor_held = False
+
+ def update(self, CS: structs.CarState, events: Events) -> IQEvents:
+ handler = self._BRAND_HANDLERS.get(self.CP.brand)
+ if handler is not None:
+ handler(self, CS, events)
+ return IQEvents()
+
+ def _ram_steer_floor(self, CS: structs.CarState, events: Events) -> None:
+ if self.CP.carFingerprint in RAM_DT:
+ # RAM_DT drives its own steer floor, so drop openpilot's generic alert and latch ours instead.
+ # Two independent gates on purpose: clearing above the enable floor, then re-latching when
+ # parked out of Drive — the latch wins when both hold at once.
+ events.remove(_E.belowSteerSpeed)
+ if CS.vEgo >= self.CP.minEnableSpeed:
+ self._steer_floor_held = False
+ if self.CP.minEnableSpeed >= _RAM_STEER_FLOOR_MS and CS.gearShifter != _GEAR.drive:
+ self._steer_floor_held = True
+ if self._steer_floor_held:
+ events.add(_E.belowSteerSpeed)
+
+ def _toyota_interceptor_resume(self, CS: structs.CarState, events: Events) -> None:
+ if not self.CP.openpilotLongitudinalControl:
+ return
+ stopped_and_coasting = CS.cruiseState.standstill and not CS.brakePressed
+ if stopped_and_coasting and self.CP_IQ.enableGasInterceptor:
+ events.remove(_E.resumeRequired)
+
+ _BRAND_HANDLERS = {
+ 'chrysler': _ram_steer_floor,
+ 'toyota': _toyota_interceptor_resume,
+ }
diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh
new file mode 100755
index 000000000..f91579158
--- /dev/null
+++ b/launch_chffrplus.sh
@@ -0,0 +1,231 @@
+#!/usr/bin/env bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
+
+source "$DIR/launch_env.sh"
+
+function agnos_version_allowed {
+ local current_version="$1"
+ local expected_version="$2"
+ local compat_version
+
+ if [ "$current_version" = "$expected_version" ] || [[ "$current_version" = "$expected_version"-* ]]; then
+ return 0
+ fi
+
+ IFS=',' read -r -a compat_versions <<< "${AGNOS_COMPAT_VERSIONS:-}"
+ for compat_version in "${compat_versions[@]}"; do
+ compat_version="${compat_version// /}"
+ if [ -n "$compat_version" ] && [ "$current_version" = "$compat_version" ]; then
+ return 0
+ fi
+ done
+
+ return 1
+}
+
+function set_lite_hw() {
+ # Detect mr.one C3 Lite: tici platform without a cellular modem at i2c 0x10
+ if grep -q "tici" /sys/firmware/devicetree/base/model 2>/dev/null; then
+ output=$(i2cget -y 0 0x10 0x00 2>/dev/null)
+ if [ -z "$output" ]; then
+ echo "C3 Lite hardware detected"
+ export LITE=1
+ echo "1" > /tmp/lite_hw
+ fi
+ fi
+}
+
+function agnos_init {
+ # TODO: move this to agnos
+ sudo rm -f /data/etc/NetworkManager/system-connections/*.nmmeta
+
+ # set success flag for current boot slot
+ sudo abctl --set_success
+
+ # TODO: do this without udev in AGNOS
+ # udev does this, but sometimes we startup faster
+ sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
+ sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
+
+ # iptables-nft fails on this kernel (no nf_tables module), breaking NM hotspot NAT rules
+ if [ "$(readlink /etc/alternatives/iptables)" != "/usr/sbin/iptables-legacy" ]; then
+ sudo mount -o remount,rw /
+ sudo ln -sf /usr/sbin/iptables-legacy /etc/alternatives/iptables
+ sudo ln -sf /usr/sbin/iptables-legacy-restore /etc/alternatives/iptables-restore
+ sudo ln -sf /usr/sbin/iptables-legacy-save /etc/alternatives/iptables-save
+ sudo mount -o remount,ro /
+ fi
+
+ # Check if AGNOS update is required
+ CURRENT_AGNOS_VERSION=$(< /VERSION)
+ if ! agnos_version_allowed "$CURRENT_AGNOS_VERSION" "$AGNOS_VERSION"; then
+ AGNOS_PY="$DIR/system/hardware/tici/agnos.py"
+ MANIFEST="$DIR/system/hardware/tici/agnos.json"
+ if [ -f /sys/firmware/devicetree/base/model ]; then
+ DEVICE_MODEL="$(tr -d '\0' the updater picks updater_magic (DRM), which renders the on-screen
+ # progress prompt fine, so fall through and keep it. This mirrors the updater's own weston check.
+ if systemctl is-active --quiet weston-ready; then
+ if $AGNOS_PY --swap $MANIFEST; then
+ sudo reboot
+ fi
+ fi
+ $DIR/system/hardware/tici/updater $AGNOS_PY $MANIFEST
+ fi
+}
+
+function launch {
+ # Remove orphaned git lock if it exists on boot
+ [ -f "$DIR/.git/index.lock" ] && rm -f $DIR/.git/index.lock
+
+ # Check to see if there's a valid overlay-based update available. Conditions
+ # are as follows:
+ #
+ # 1. The DIR init file has to exist, with a newer modtime than anything in
+ # the DIR Git repo. This checks for local development work or the user
+ # switching branches/forks, which should not be overwritten.
+ # 2. The FINALIZED consistent file has to exist, indicating there's an update
+ # that completed successfully and synced to disk.
+
+ if [ -f "${DIR}/.overlay_init" ]; then
+ find ${DIR}/.git -newer ${DIR}/.overlay_init | grep -q '.' 2> /dev/null
+ if [ $? -eq 0 ]; then
+ echo "${DIR} has been modified, skipping overlay update installation"
+ else
+ if [ -f "${STAGING_ROOT}/finalized/.overlay_consistent" ]; then
+ if [ ! -d /data/safe_staging/old_openpilot ]; then
+ echo "Valid overlay update found, installing"
+ LAUNCHER_LOCATION="${BASH_SOURCE[0]}"
+
+ mv $DIR /data/safe_staging/old_openpilot
+ mv "${STAGING_ROOT}/finalized" $DIR
+ cd $DIR
+
+ echo "Restarting launch script ${LAUNCHER_LOCATION}"
+ unset AGNOS_VERSION
+ exec "${LAUNCHER_LOCATION}"
+ else
+ echo "openpilot backup found, not updating"
+ # TODO: restore backup? This means the updater didn't start after swapping
+ fi
+ fi
+ fi
+ fi
+
+ # Best-effort: install the verified runtime before anything starts the services that
+ # need it. This only succeeds on a tree that has built _verified_import.so, so on a
+ # prebuilt release install it is a no-op -- there the runtime arrives with the IQ.OS
+ # flash, whose image bakes it in. What actually fixes the 20+ minute first-install hang
+ # is --no-block on the service starts below: hephaestusd/ble-transportd/flockd each
+ # ExecStartPre-wait up to 600s for /usr/libexec/iqpilot/iqpilot_bundle_runner.
+ if [ -x "$DIR/system/proprietary_runtime/install_verified_runtime.sh" ]; then
+ "$DIR/system/proprietary_runtime/install_verified_runtime.sh" || true
+ fi
+
+ # Install/update proprietary runtime bundles.
+ if [ -f "$DIR/artifacts/runtime/ensure_private_installed.sh" ]; then
+ bash "$DIR/artifacts/runtime/ensure_private_installed.sh" || true
+ elif [ -x "$DIR/scripts/iqpilot/ensure_navd_private_installed.sh" ]; then
+ # Backward-compat fallback for older trees.
+ "$DIR/scripts/iqpilot/ensure_navd_private_installed.sh" || true
+ fi
+
+ ln -sfn $(pwd) /data/pythonpath
+ export IQPILOT_SOURCE_ROOT="${IQPILOT_SOURCE_ROOT:-$PWD/openpilot}"
+ export PYTHONSAFEPATH=1
+ VERIFIED_PYTHON_ROOT="/usr/libexec/iqpilot/python"
+ if [ -d "$VERIFIED_PYTHON_ROOT" ]; then
+ export PYTHONPATH="$VERIFIED_PYTHON_ROOT:$PWD"
+ else
+ export PYTHONPATH="$PWD"
+ fi
+
+ # Install independent systemd services BEFORE build so they run even
+ # when openpilot fails to compile — SSH/BLE/hephaestusd must always
+ # be reachable for device recovery.
+ for service_name in hephaestusd ble-transportd; do
+ service_src="$DIR/system/${service_name}.service"
+ service_dst="/etc/systemd/system/${service_name}.service"
+ service_lib="/lib/systemd/system/${service_name}.service"
+ if [ -f "$service_lib" ] && grep -q "/usr/libexec/iqpilot/iqpilot_bundle_runner" "$service_lib"; then
+ if [ -f "$service_dst" ]; then
+ sudo mount -o remount,rw /
+ sudo rm -f "$service_dst"
+ sudo systemctl daemon-reload
+ sudo mount -o remount,ro /
+ fi
+ sudo systemctl enable "${service_name}.service"
+ # --no-block: these units ExecStartPre-wait for the verified runtime. Blocking here
+ # made a missing runner stall the whole install for the unit's 600s timeout (x3 units).
+ if systemctl is-active --quiet "${service_name}.service"; then
+ sudo systemctl restart --no-block "${service_name}.service"
+ else
+ sudo systemctl start --no-block "${service_name}.service"
+ fi
+ elif [ -f "$service_src" ]; then
+ if [ ! -f "$service_dst" ] || ! cmp -s "$service_src" "$service_dst"; then
+ sudo mount -o remount,rw /
+ sudo cp "$service_src" "$service_dst"
+ sudo systemctl daemon-reload
+ sudo systemctl enable "${service_name}.service"
+ sudo mount -o remount,ro /
+ sudo systemctl restart --no-block "${service_name}.service"
+ elif ! systemctl is-active --quiet "${service_name}.service"; then
+ sudo systemctl start --no-block "${service_name}.service"
+ fi
+ fi
+ done
+
+ # detect mr.one C3 Lite hardware
+ set_lite_hw
+
+ # hardware specific init
+ if [ -f /AGNOS ]; then
+ agnos_init
+
+ sudo "$DIR/system/hardware/tici/zram_setup.sh" || true
+ fi
+
+ if [ -f "$DIR/artifacts/runtime/apply_boot_branding.py" ]; then
+ sudo python3 "$DIR/artifacts/runtime/apply_boot_branding.py" || true
+ fi
+
+ # /home is an ephemeral overlay (resets each boot); re-inject the source line. best-effort
+ if [ -f "$DIR/tools/iqpilot/git-pretty.sh" ] && [ -w "$HOME/.bashrc" ]; then
+ grep -q 'iqpilot/git-pretty.sh' "$HOME/.bashrc" 2>/dev/null || \
+ echo "[ -f $DIR/tools/iqpilot/git-pretty.sh ] && source $DIR/tools/iqpilot/git-pretty.sh" >> "$HOME/.bashrc" || true
+ fi
+
+ # write tmux scrollback to a file
+ tmux capture-pane -pq -S-1000 > /tmp/launch_log
+
+ # start manager
+ cd system/manager
+ if [ ! -f $DIR/prebuilt ]; then
+ if pkill -f /tmp/installer 2>/dev/null; then sleep 1; fi
+ /usr/local/venv/bin/python3 ./build.py
+ fi
+
+ /usr/local/venv/bin/python3 ./manager.py
+
+ # if broken, keep on screen error
+ while true; do sleep 1; done
+}
+
+launch
diff --git a/launch_env.sh b/launch_env.sh
new file mode 100755
index 000000000..6bd779620
--- /dev/null
+++ b/launch_env.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+export OMP_NUM_THREADS=1
+export MKL_NUM_THREADS=1
+export NUMEXPR_NUM_THREADS=1
+export OPENBLAS_NUM_THREADS=1
+export VECLIB_MAXIMUM_THREADS=1
+
+# models get lower priority than ui
+# - ui is ~5ms
+# - modeld is 20ms
+# - DM is 10ms
+# in order to run ui at 60fps (16.67ms), we need to allow
+# it to preempt the model workloads. we have enough
+# headroom for this until ui is moved to the CPU.
+export QCOM_PRIORITY=12
+
+if [ -z "$AGNOS_VERSION" ]; then
+ DEVICE_MODEL=""
+ if [ -f /sys/firmware/devicetree/base/model ]; then
+ DEVICE_MODEL="$(tr -d '\0' ...` logging
+ - skips # Print "skip" (i.e. no files matched)
+
+test:
+ parallel: true
+ commands:
+ # *** static analysis ***
+ ruff:
+ run: ruff check .
+ ty:
+ run: ty check .
+ codespell:
+ run: codespell {files} -L ned,stdio,master --builtin clear,rare,informal,usage,code,names,en-GB_to_en-US -S uv.lock,*_pyx.cpp,catch2*
+ files: git ls-tree -r HEAD --name-only
+ cppcheck:
+ run: cppcheck --error-exitcode=1 --inline-suppr --language=c++ --force --quiet -j4 --check-level=exhaustive $(git ls-files '*.cc' | grep -v -E '(msgq_tests|test_runner)\.cc')
+ cpplint:
+ run: cpplint --exclude=msgq/catch2/ --exclude=msgq/ipc_pyx.cpp --exclude=msgq/visionipc/visionipc_pyx.cpp --recursive --quiet --counting=detailed --linelength=240 --filter=-build,-legal,-readability,-runtime,-whitespace,+build/include_subdir,+build/forward_decl,+build/include_what_you_use,+build/deprecated,+whitespace/comma,+whitespace/line_length,+whitespace/empty_if_body,+whitespace/empty_loop_body,+whitespace/empty_conditional_body,+whitespace/forcolon,+whitespace/parens,+whitespace/semicolon,+whitespace/tab,+readability/braces msgq/
+
+ # *** tests ***
+ test_runner:
+ run: msgq/test_runner
+ pytest:
+ run: pytest
diff --git a/msgq_repo/msgq/.gitignore b/msgq_repo/msgq/.gitignore
new file mode 100644
index 000000000..6bd751773
--- /dev/null
+++ b/msgq_repo/msgq/.gitignore
@@ -0,0 +1 @@
+ipc_pyx.cpp
diff --git a/msgq_repo/msgq/__init__.py b/msgq_repo/msgq/__init__.py
new file mode 100644
index 000000000..b47b3db12
--- /dev/null
+++ b/msgq_repo/msgq/__init__.py
@@ -0,0 +1,63 @@
+# must be built with scons
+from msgq.ipc_pyx import Context, Poller, SubSocket, PubSocket, SocketEventHandle, toggle_fake_events, \
+ set_fake_prefix, get_fake_prefix, delete_fake_prefix, wait_for_one_event, \
+ context_is_zmq
+from msgq.ipc_pyx import MultiplePublishersError, IpcError
+
+from typing import Optional, List, Union
+
+assert MultiplePublishersError
+assert IpcError
+assert toggle_fake_events
+assert set_fake_prefix
+assert get_fake_prefix
+assert delete_fake_prefix
+assert wait_for_one_event
+assert context_is_zmq
+
+NO_TRAVERSAL_LIMIT = 2**64-1
+
+context = Context()
+
+
+def fake_event_handle(endpoint: str, identifier: Optional[Union[str, bytes]] = None, override: bool = True, enable: bool = False) -> SocketEventHandle:
+ ident = identifier if identifier is not None else get_fake_prefix()
+ handle = SocketEventHandle(endpoint, ident, override)
+ if override:
+ handle.enabled = enable
+
+ return handle
+
+def pub_sock(endpoint: str, segment_size: int = 0) -> PubSocket:
+ sock = PubSocket()
+ sock.connect(context, endpoint, segment_size)
+ return sock
+
+
+def sub_sock(endpoint: str, poller: Optional[Poller] = None, addr: str = "127.0.0.1",
+ conflate: bool = False, timeout: Optional[int] = None, segment_size: int = 0) -> SubSocket:
+ sock = SubSocket()
+ sock.connect(context, endpoint, addr.encode('utf8'), conflate, segment_size)
+
+ if timeout is not None:
+ sock.setTimeout(timeout)
+
+ if poller is not None:
+ poller.registerSocket(sock)
+ return sock
+
+def drain_sock_raw(sock: SubSocket, wait_for_one: bool = False) -> List[bytes]:
+ """Receive all message currently available on the queue"""
+ ret: List[bytes] = []
+ while 1:
+ if wait_for_one and len(ret) == 0:
+ dat = sock.receive()
+ else:
+ dat = sock.receive(non_blocking=True)
+
+ if dat is None:
+ break
+
+ ret.append(dat)
+
+ return ret
diff --git a/msgq_repo/msgq/conftest.py b/msgq_repo/msgq/conftest.py
new file mode 100644
index 000000000..bfd77925c
--- /dev/null
+++ b/msgq_repo/msgq/conftest.py
@@ -0,0 +1,14 @@
+import os
+import pytest
+import msgq
+
+@pytest.fixture(params=[False, True], ids=["msgq", "zmq"], autouse=True)
+def zmq_mode(request):
+ if request.param:
+ os.environ["ZMQ"] = "1"
+ else:
+ os.environ.pop("ZMQ", None)
+ msgq.context = msgq.Context()
+ assert msgq.context_is_zmq() == request.param
+ yield request.param
+ os.environ.pop("ZMQ", None)
diff --git a/msgq_repo/msgq/ipc_pyx.so b/msgq_repo/msgq/ipc_pyx.so
new file mode 100755
index 000000000..10c857110
Binary files /dev/null and b/msgq_repo/msgq/ipc_pyx.so differ
diff --git a/msgq_repo/msgq/tests/__init__.py b/msgq_repo/msgq/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/msgq_repo/msgq/tests/test_fake.py b/msgq_repo/msgq/tests/test_fake.py
new file mode 100644
index 000000000..4513973b2
--- /dev/null
+++ b/msgq_repo/msgq/tests/test_fake.py
@@ -0,0 +1,189 @@
+import pytest
+import os
+import multiprocessing
+import platform
+import msgq
+from parameterized import parameterized_class
+from typing import Optional
+
+WAIT_TIMEOUT = 5
+
+
+@pytest.mark.skipif(condition=platform.system() == "Darwin", reason="Events not supported on macOS")
+class TestEvents:
+
+ def test_mutation(self):
+ handle = msgq.fake_event_handle("carState")
+ event = handle.recv_called_event
+
+ assert not event.peek()
+ event.set()
+ assert event.peek()
+ event.clear()
+ assert not event.peek()
+
+ del event
+
+ def test_wait(self):
+ handle = msgq.fake_event_handle("carState")
+ event = handle.recv_called_event
+
+ event.set()
+ try:
+ event.wait(WAIT_TIMEOUT)
+ assert event.peek()
+ except RuntimeError:
+ pytest.fail("event.wait() timed out")
+
+ def test_wait_multiprocess(self):
+ handle = msgq.fake_event_handle("carState")
+ event = handle.recv_called_event
+
+ def set_event_run():
+ event.set()
+
+ try:
+ p = multiprocessing.Process(target=set_event_run)
+ p.start()
+ event.wait(WAIT_TIMEOUT)
+ assert event.peek()
+ except RuntimeError:
+ pytest.fail("event.wait() timed out")
+
+ p.kill()
+
+ def test_wait_zero_timeout(self):
+ handle = msgq.fake_event_handle("carState")
+ event = handle.recv_called_event
+
+ try:
+ event.wait(0)
+ pytest.fail("event.wait() did not time out")
+ except RuntimeError:
+ assert not event.peek()
+
+
+@pytest.mark.skipif(condition=platform.system() == "Darwin", reason="FakeSockets not supported on macOS")
+@parameterized_class([{"prefix": None}, {"prefix": "test"}])
+class TestFakeSockets:
+ prefix: Optional[str] = None
+
+ def setup_method(self):
+ if "ZMQ" in os.environ:
+ pytest.skip("FakeSockets not supported on ZMQ")
+ msgq.toggle_fake_events(True)
+ if self.prefix is not None:
+ msgq.set_fake_prefix(self.prefix)
+ else:
+ msgq.delete_fake_prefix()
+
+ def teardown_method(self):
+ msgq.toggle_fake_events(False)
+ msgq.delete_fake_prefix()
+
+ def test_event_handle_init(self):
+ handle = msgq.fake_event_handle("controlsState", override=True)
+
+ assert not handle.enabled
+ assert handle.recv_called_event.fd >= 0
+ assert handle.recv_ready_event.fd >= 0
+
+ def test_non_managed_socket_state(self):
+ # non managed socket should have zero state
+ _ = msgq.pub_sock("ubloxGnss")
+
+ handle = msgq.fake_event_handle("ubloxGnss", override=False)
+
+ assert not handle.enabled
+ assert handle.recv_called_event.fd == 0
+ assert handle.recv_ready_event.fd == 0
+
+ def test_managed_socket_state(self):
+ # managed socket should not change anything about the state
+ handle = msgq.fake_event_handle("ubloxGnss")
+ handle.enabled = True
+
+ expected_enabled = handle.enabled
+ expected_recv_called_fd = handle.recv_called_event.fd
+ expected_recv_ready_fd = handle.recv_ready_event.fd
+
+ _ = msgq.pub_sock("ubloxGnss")
+
+ assert handle.enabled == expected_enabled
+ assert handle.recv_called_event.fd == expected_recv_called_fd
+ assert handle.recv_ready_event.fd == expected_recv_ready_fd
+
+ def test_sockets_enable_disable(self):
+ carState_handle = msgq.fake_event_handle("ubloxGnss", enable=True)
+ recv_called = carState_handle.recv_called_event
+ recv_ready = carState_handle.recv_ready_event
+
+ pub_sock = msgq.pub_sock("ubloxGnss")
+ sub_sock = msgq.sub_sock("ubloxGnss")
+
+ try:
+ carState_handle.enabled = True
+ recv_ready.set()
+ pub_sock.send(b"test")
+ _ = sub_sock.receive()
+ assert recv_called.peek()
+ recv_called.clear()
+
+ carState_handle.enabled = False
+ recv_ready.set()
+ pub_sock.send(b"test")
+ _ = sub_sock.receive()
+ assert not recv_called.peek()
+ except RuntimeError:
+ pytest.fail("event.wait() timed out")
+
+ def test_synced_pub_sub(self):
+ def daemon_repub_process_run():
+ pub_sock = msgq.pub_sock("ubloxGnss")
+ sub_sock = msgq.sub_sock("carState")
+
+ frame = -1
+ while True:
+ frame += 1
+ msg = sub_sock.receive(non_blocking=True)
+ if msg is None:
+ print("none received")
+ continue
+
+ bts = frame.to_bytes(8, 'little')
+ pub_sock.send(bts)
+
+ carState_handle = msgq.fake_event_handle("carState", enable=True)
+ recv_called = carState_handle.recv_called_event
+ recv_ready = carState_handle.recv_ready_event
+
+ p = multiprocessing.Process(target=daemon_repub_process_run)
+ p.start()
+
+ pub_sock = msgq.pub_sock("carState")
+ sub_sock = msgq.sub_sock("ubloxGnss")
+
+ try:
+ for i in range(10):
+ recv_called.wait(WAIT_TIMEOUT)
+ recv_called.clear()
+
+ if i == 0:
+ sub_sock.receive(non_blocking=True)
+
+ bts = i.to_bytes(8, 'little')
+ pub_sock.send(bts)
+
+ recv_ready.set()
+ recv_called.wait(WAIT_TIMEOUT)
+
+ msg = sub_sock.receive(non_blocking=True)
+ assert msg is not None
+ assert len(msg) == 8
+
+ frame = int.from_bytes(msg, 'little')
+ assert frame == i
+ except RuntimeError:
+ pytest.fail("event.wait() timed out")
+ finally:
+ p.kill()
diff --git a/msgq_repo/msgq/tests/test_messaging.py b/msgq_repo/msgq/tests/test_messaging.py
new file mode 100644
index 000000000..1f439234d
--- /dev/null
+++ b/msgq_repo/msgq/tests/test_messaging.py
@@ -0,0 +1,70 @@
+import os
+import random
+import time
+import string
+import msgq
+import pytest
+
+def random_sock():
+ return ''.join(random.choices(string.ascii_uppercase + string.digits, k=10))
+
+def random_bytes(length=1000):
+ return bytes([random.randrange(0xFF) for _ in range(length)])
+
+def zmq_sleep(t=1):
+ if "ZMQ" in os.environ:
+ time.sleep(t)
+
+class TestPubSubSockets:
+
+ def setup_method(self):
+ # ZMQ pub socket takes too long to die
+ # sleep to prevent multiple publishers error between tests
+ zmq_sleep()
+
+ def test_pub_sub(self):
+ sock = random_sock()
+ pub_sock = msgq.pub_sock(sock)
+ sub_sock = msgq.sub_sock(sock, conflate=False, timeout=None)
+ zmq_sleep(3)
+
+ for _ in range(1000):
+ msg = random_bytes()
+ pub_sock.send(msg)
+ recvd = sub_sock.receive()
+ assert msg == recvd
+
+ def test_conflate(self):
+ sock = random_sock()
+ pub_sock = msgq.pub_sock(sock)
+ for conflate in [True, False]:
+ num_msgs = random.randint(3, 10)
+ sub_sock = msgq.sub_sock(sock, conflate=conflate, timeout=None)
+ zmq_sleep()
+
+ sent_msgs = []
+ for __ in range(num_msgs):
+ msg = random_bytes()
+ pub_sock.send(msg)
+ sent_msgs.append(msg)
+ time.sleep(0.1)
+ recvd_msgs = msgq.drain_sock_raw(sub_sock)
+ if conflate:
+ assert len(recvd_msgs) == 1
+ assert recvd_msgs[0] == sent_msgs[-1]
+ else:
+ assert len(recvd_msgs) == len(sent_msgs)
+ for rec_msg, sent_msg in zip(recvd_msgs, sent_msgs):
+ assert rec_msg == sent_msg
+
+ @pytest.mark.flaky(retries=3, delay=1)
+ def test_receive_timeout(self):
+ sock = random_sock()
+ timeout = random.randrange(200)
+ sub_sock = msgq.sub_sock(sock, timeout=timeout)
+ zmq_sleep()
+
+ start_time = time.monotonic()
+ recvd = sub_sock.receive()
+ assert (time.monotonic() - start_time) < (timeout + 0.1)
+ assert recvd is None
diff --git a/msgq_repo/msgq/tests/test_poller.py b/msgq_repo/msgq/tests/test_poller.py
new file mode 100644
index 000000000..6ef2c0423
--- /dev/null
+++ b/msgq_repo/msgq/tests/test_poller.py
@@ -0,0 +1,138 @@
+import pytest
+import time
+import msgq
+import concurrent.futures
+
+SERVICE_NAME = 'myService'
+
+def poller():
+ context = msgq.Context()
+
+ p = msgq.Poller()
+
+ sub = msgq.SubSocket()
+ sub.connect(context, SERVICE_NAME)
+ p.registerSocket(sub)
+
+ socks = p.poll(10000)
+ r = [s.receive(non_blocking=True) for s in socks]
+
+ return r
+
+
+class TestPoller:
+ def test_poll_once(self):
+ context = msgq.Context()
+
+ pub = msgq.PubSocket()
+ pub.connect(context, SERVICE_NAME)
+
+ with concurrent.futures.ThreadPoolExecutor() as e:
+ poll = e.submit(poller)
+
+ time.sleep(0.1) # Slow joiner syndrome
+
+ # Send message
+ pub.send(b"a")
+
+ # Wait for poll result
+ result = poll.result()
+
+ del pub
+ context.term()
+
+ assert result == [b"a"]
+
+ def test_poll_and_create_many_subscribers(self):
+ context = msgq.Context()
+
+ pub = msgq.PubSocket()
+ pub.connect(context, SERVICE_NAME)
+
+ with concurrent.futures.ThreadPoolExecutor() as e:
+ poll = e.submit(poller)
+
+ time.sleep(0.1) # Slow joiner syndrome
+ c = msgq.Context()
+ for _ in range(10):
+ msgq.SubSocket().connect(c, SERVICE_NAME)
+
+ time.sleep(0.1)
+
+ # Send message
+ pub.send(b"a")
+
+ # Wait for poll result
+ result = poll.result()
+
+ del pub
+ context.term()
+
+ assert result == [b"a"]
+
+ def test_multiple_publishers_exception(self):
+ context = msgq.Context()
+
+ with pytest.raises(msgq.MultiplePublishersError):
+ pub1 = msgq.PubSocket()
+ pub1.connect(context, SERVICE_NAME)
+
+ pub2 = msgq.PubSocket()
+ pub2.connect(context, SERVICE_NAME)
+
+ pub1.send(b"a")
+
+ del pub1
+ del pub2
+ context.term()
+
+ def test_multiple_messages(self):
+ context = msgq.Context()
+
+ pub = msgq.PubSocket()
+ pub.connect(context, SERVICE_NAME)
+
+ sub = msgq.SubSocket()
+ sub.connect(context, SERVICE_NAME)
+
+ time.sleep(0.1) # Slow joiner
+
+ for i in range(1, 100):
+ pub.send(b'a'*i)
+
+ msg_seen = False
+ i = 1
+ while True:
+ r = sub.receive(non_blocking=True)
+
+ if r is not None:
+ assert b'a'*i == r
+
+ msg_seen = True
+ i += 1
+
+ if r is None and msg_seen: # ZMQ sometimes receives nothing on the first receive
+ break
+
+ del pub
+ del sub
+ context.term()
+
+ def test_conflate(self):
+ context = msgq.Context()
+
+ pub = msgq.PubSocket()
+ pub.connect(context, SERVICE_NAME)
+
+ sub = msgq.SubSocket()
+ sub.connect(context, SERVICE_NAME, conflate=True)
+
+ time.sleep(0.1) # Slow joiner
+ pub.send(b'a')
+ pub.send(b'b')
+
+ assert b'b' == sub.receive()
+
+ del pub
+ del sub
+ context.term()
diff --git a/msgq_repo/msgq/visionipc/.gitignore b/msgq_repo/msgq/visionipc/.gitignore
new file mode 100644
index 000000000..fa5a2b9f3
--- /dev/null
+++ b/msgq_repo/msgq/visionipc/.gitignore
@@ -0,0 +1,2 @@
+visionipc_pyx.cpp
+*.so
diff --git a/msgq_repo/msgq/visionipc/__init__.py b/msgq_repo/msgq/visionipc/__init__.py
new file mode 100644
index 000000000..57011537e
--- /dev/null
+++ b/msgq_repo/msgq/visionipc/__init__.py
@@ -0,0 +1,6 @@
+from msgq.visionipc.visionipc_pyx import VisionBuf, VisionIpcClient, VisionIpcServer, VisionStreamType, get_endpoint_name
+assert VisionBuf
+assert VisionIpcClient
+assert VisionIpcServer
+assert VisionStreamType
+assert get_endpoint_name
diff --git a/msgq_repo/msgq/visionipc/tests/__init__.py b/msgq_repo/msgq/visionipc/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/msgq_repo/msgq/visionipc/tests/test_visionipc.py b/msgq_repo/msgq/visionipc/tests/test_visionipc.py
new file mode 100644
index 000000000..374dfcf8b
--- /dev/null
+++ b/msgq_repo/msgq/visionipc/tests/test_visionipc.py
@@ -0,0 +1,107 @@
+import os
+import time
+import random
+from typing import Optional
+import numpy as np
+from msgq.visionipc import VisionIpcServer, VisionIpcClient, VisionStreamType
+
+def zmq_sleep(t=1):
+ if "ZMQ" in os.environ:
+ time.sleep(t)
+
+
+class TestVisionIpc:
+ server: VisionIpcServer
+ client: Optional[VisionIpcClient]
+
+ def setup_vipc(self, name, *stream_types, num_buffers=1, width=100, height=100, conflate=False):
+ self.server = VisionIpcServer(name)
+ for stream_type in stream_types:
+ self.server.create_buffers(stream_type, num_buffers, width, height)
+ self.server.start_listener()
+
+ if len(stream_types):
+ self.client = VisionIpcClient(name, stream_types[0], conflate)
+ assert self.client.connect(True)
+ else:
+ self.client = None
+
+ zmq_sleep()
+ return self.server, self.client
+
+ def test_connect(self):
+ self.setup_vipc("camerad", VisionStreamType.VISION_STREAM_ROAD)
+ assert self.client is not None
+ assert self.client.is_connected
+ del self.client
+ del self.server
+
+ def test_available_streams(self):
+ for k in range(4):
+ stream_types = set(random.choices([x.value for x in VisionStreamType], k=k))
+ self.setup_vipc("camerad", *stream_types)
+ available_streams = VisionIpcClient.available_streams("camerad", True)
+ assert available_streams == stream_types
+ del self.client
+ del self.server
+
+ def test_buffers(self):
+ width, height, num_buffers = 100, 200, 5
+ self.setup_vipc("camerad", VisionStreamType.VISION_STREAM_ROAD, num_buffers=num_buffers, width=width, height=height)
+ assert self.client is not None
+ assert self.client.width == width
+ assert self.client.height == height
+ assert self.client.buffer_len is not None and self.client.buffer_len > 0
+ assert self.client.num_buffers == num_buffers
+ del self.client
+ del self.server
+
+ def test_send_single_buffer(self):
+ self.setup_vipc("camerad", VisionStreamType.VISION_STREAM_ROAD)
+ assert self.client is not None
+ assert self.client.buffer_len is not None
+ buf = np.zeros(self.client.buffer_len, dtype=np.uint8)
+ buf.view('=3.11,<3.13"
+license = {text = "MIT"}
+authors = [{name = "comma.ai"}]
+classifiers = [
+ "Natural Language :: English",
+ "Programming Language :: Python :: 3",
+ "Topic :: System :: Hardware",
+]
+dependencies = [
+ "setuptools", # for distutils
+ "Cython",
+ "scons",
+ "ruff",
+ "parameterized",
+ "coverage",
+ "numpy",
+ "pytest",
+ "pytest-retry",
+ "cppcheck",
+ "cpplint",
+ "codespell",
+ "ty",
+ "lefthook",
+]
+
+# https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml
+[tool.ruff]
+lint.select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF100", "A"]
+lint.ignore = ["W292", "E741", "E402", "C408", "ISC003"]
+lint.flake8-implicit-str-concat.allow-multiline=false
+
+line-length = 160
+target-version="py311"
+
+[tool.ruff.lint.flake8-tidy-imports.banned-api]
+"pytest.main".msg = "pytest.main requires special handling that is easy to mess up!"
+"unittest".msg = "Use pytest"
+
+[tool.ty.src]
+exclude = ["site_scons/"]
+
+[tool.ty.rules]
+# Cython modules are compiled at build time, not available for static analysis
+unresolved-import = "ignore"
+
+[tool.pytest.ini_options]
+addopts = "--durations=10"
+testpaths = [
+ "msgq/tests",
+ "msgq/visionipc/tests",
+]
diff --git a/msgq_repo/setup.sh b/msgq_repo/setup.sh
new file mode 100755
index 000000000..f674859f3
--- /dev/null
+++ b/msgq_repo/setup.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+PLATFORM=$(uname -s)
+
+echo "installing dependencies"
+if [[ $PLATFORM == "Darwin" ]]; then
+ if ! command -v python3 &>/dev/null || ! pkg-config --exists libzmq 2>/dev/null; then
+ export HOMEBREW_NO_AUTO_UPDATE=1
+ brew install python3 zeromq
+ fi
+elif [[ $PLATFORM == "Linux" ]]; then
+ # for AGNOS since we clear the apt lists
+ if [[ ! -d /"var/lib/apt/" ]]; then
+ sudo apt update
+ fi
+
+ sudo apt-get install -y --no-install-recommends \
+ curl ca-certificates \
+ libzmq3-dev \
+ ocl-icd-opencl-dev opencl-headers \
+ python3-dev python3-pip python3-venv
+else
+ echo "WARNING: unsupported platform. skipping apt/brew install."
+fi
+
+# catch2
+if [ ! -d $DIR/msgq/catch2/ ]; then
+ rm -rf /tmp/catch2/ $DIR/msgq/catch2/
+ git clone -b v2.x --depth 1 https://github.com/catchorg/Catch2.git /tmp/catch2
+ pushd /tmp/catch2
+ mv single_include/* $DIR/msgq/
+ popd
+fi
+
+if ! command -v uv &>/dev/null; then
+ echo "'uv' is not installed. Installing 'uv'..."
+ curl -LsSf https://astral.sh/uv/install.sh | sh
+
+ # doesn't require sourcing on all platforms
+ set +e
+ source $HOME/.local/bin/env
+ set -e
+fi
+
+export UV_PROJECT_ENVIRONMENT="$DIR/.venv"
+uv sync --all-extras
+source "$DIR/.venv/bin/activate"
diff --git a/msgq_repo/site_scons/site_tools/cython.py b/msgq_repo/site_scons/site_tools/cython.py
new file mode 100644
index 000000000..c29147553
--- /dev/null
+++ b/msgq_repo/site_scons/site_tools/cython.py
@@ -0,0 +1,72 @@
+import re
+import SCons
+from SCons.Action import Action
+from SCons.Scanner import Scanner
+
+pyx_from_import_re = re.compile(r'^from\s+(\S+)\s+cimport', re.M)
+pyx_import_re = re.compile(r'^cimport\s+(\S+)', re.M)
+cdef_import_re = re.compile(r'^cdef extern from\s+.(\S+).:', re.M)
+
+
+def pyx_scan(node, env, path, arg=None):
+ contents = node.get_text_contents()
+
+ # from cimport ...
+ matches = pyx_from_import_re.findall(contents)
+ # cimport
+ matches += pyx_import_re.findall(contents)
+
+ # Modules can be either .pxd or .pyx files
+ files = [m.replace('.', '/') + '.pxd' for m in matches]
+ files += [m.replace('.', '/') + '.pyx' for m in matches]
+
+ # cdef extern from
+ files += cdef_import_re.findall(contents)
+
+ # Handle relative imports
+ cur_dir = str(node.get_dir())
+ files = [cur_dir + f if f.startswith('/') else f for f in files]
+
+ # Filter out non-existing files (probably system imports)
+ files = [f for f in files if env.File(f).exists()]
+ return env.File(files)
+
+
+pyxscanner = Scanner(function=pyx_scan, skeys=['.pyx', '.pxd'], recursive=True)
+cythonAction = Action("$CYTHONCOM")
+
+
+def create_builder(env):
+ try:
+ cython = env['BUILDERS']['Cython']
+ except KeyError:
+ cython = SCons.Builder.Builder(
+ action=cythonAction,
+ emitter={},
+ suffix=cython_suffix_emitter,
+ single_source=1
+ )
+ env.Append(SCANNERS=pyxscanner)
+ env['BUILDERS']['Cython'] = cython
+ return cython
+
+def cython_suffix_emitter(env, source):
+ return "$CYTHONCFILESUFFIX"
+
+def generate(env):
+ env["CYTHON"] = "cythonize"
+ env["CYTHONCOM"] = "$CYTHON $CYTHONFLAGS $SOURCE"
+ env["CYTHONCFILESUFFIX"] = ".cpp"
+
+ c_file, _ = SCons.Tool.createCFileBuilders(env)
+
+ c_file.suffix['.pyx'] = cython_suffix_emitter
+ c_file.add_action('.pyx', cythonAction)
+
+ c_file.suffix['.py'] = cython_suffix_emitter
+ c_file.add_action('.py', cythonAction)
+
+ create_builder(env)
+
+def exists(env):
+ return True
diff --git a/msgq_repo/test.sh b/msgq_repo/test.sh
new file mode 100755
index 000000000..d91afb035
--- /dev/null
+++ b/msgq_repo/test.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+source ./setup.sh
+
+# *** build ***
+scons -j8
+
+# *** lint + test ***
+lefthook run test
+
+# *** all done ***
+GREEN='\033[0;32m'
+NC='\033[0m'
+printf "\n${GREEN}All good!${NC} Finished build, lint, and test in ${SECONDS}s\n"
diff --git a/openpilot/__init__.py b/openpilot/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/openpilot/common b/openpilot/common
new file mode 120000
index 000000000..60d3b0a6a
--- /dev/null
+++ b/openpilot/common
@@ -0,0 +1 @@
+../common
\ No newline at end of file
diff --git a/openpilot/iqpilot b/openpilot/iqpilot
new file mode 120000
index 000000000..f33d1496b
--- /dev/null
+++ b/openpilot/iqpilot
@@ -0,0 +1 @@
+../iqpilot
\ No newline at end of file
diff --git a/openpilot/selfdrive b/openpilot/selfdrive
new file mode 120000
index 000000000..e005fd0d0
--- /dev/null
+++ b/openpilot/selfdrive
@@ -0,0 +1 @@
+../selfdrive/
\ No newline at end of file
diff --git a/openpilot/system b/openpilot/system
new file mode 120000
index 000000000..16f8cc2b2
--- /dev/null
+++ b/openpilot/system
@@ -0,0 +1 @@
+../system/
\ No newline at end of file
diff --git a/openpilot/third_party b/openpilot/third_party
new file mode 120000
index 000000000..d838c05a8
--- /dev/null
+++ b/openpilot/third_party
@@ -0,0 +1 @@
+../third_party
\ No newline at end of file
diff --git a/openpilot/tools b/openpilot/tools
new file mode 120000
index 000000000..4887d6e0c
--- /dev/null
+++ b/openpilot/tools
@@ -0,0 +1 @@
+../tools
\ No newline at end of file
diff --git a/panda/.gitignore b/panda/.gitignore
new file mode 100644
index 000000000..612b14f74
--- /dev/null
+++ b/panda/.gitignore
@@ -0,0 +1,39 @@
+.venv
+*.tmp
+*.pyc
+.*.swp
+.*.swo
+*.o
+*.so
+*.os
+*.d
+*.dump
+a.out
+*~
+.#*
+dist/
+build/
+pandacan.egg-info/
+obj/
+examples/output.csv
+.DS_Store
+.vscode*
+nosetests.xml
+.mypy_cache/
+.sconsign.dblite
+uv.lock
+compile_commands.json
+
+# CTU info files generated by Cppcheck
+*.*.ctu-info
+cppcheck-addon-ctu-file-list
+
+# safety coverage-related files
+*.gcda
+*.gcno
+tests/safety/coverage-out
+tests/safety/coverage.info
+
+*.profraw
+*.profdata
+mull.yml
diff --git a/panda/Dockerfile b/panda/Dockerfile
new file mode 100644
index 000000000..0ac07a6cb
--- /dev/null
+++ b/panda/Dockerfile
@@ -0,0 +1,19 @@
+FROM ubuntu:24.04
+
+ENV WORKDIR=/tmp/panda/
+ENV PYTHONUNBUFFERED=1
+ENV PATH="$WORKDIR/.venv/bin:$PATH"
+
+WORKDIR $WORKDIR
+
+# deps install
+COPY pyproject.toml __init__.py setup.sh $WORKDIR
+RUN mkdir -p $WORKDIR/python/ && touch $WORKDIR/__init__.py
+RUN apt-get update && apt-get install -y --no-install-recommends sudo && DEBIAN_FRONTEND=noninteractive $WORKDIR/setup.sh
+
+# second pass for the iqdbc moving tag
+ARG CACHEBUST=1
+RUN DEBIAN_FRONTEND=noninteractive $WORKDIR/setup.sh
+
+RUN git config --global --add safe.directory $WORKDIR/panda
+COPY . $WORKDIR
diff --git a/panda/Jenkinsfile b/panda/Jenkinsfile
new file mode 100644
index 000000000..e2dea7fe2
--- /dev/null
+++ b/panda/Jenkinsfile
@@ -0,0 +1,144 @@
+def docker_run(String step_label, int timeout_mins, String cmd) {
+ timeout(time: timeout_mins, unit: 'MINUTES') {
+ sh script: "docker run --rm --privileged \
+ --env PYTHONWARNINGS=error \
+ --volume /dev/bus/usb:/dev/bus/usb \
+ --volume /var/run/dbus:/var/run/dbus \
+ --net host \
+ ${env.DOCKER_IMAGE_TAG} \
+ bash -c 'scons -j8 && ${cmd}'", \
+ label: step_label
+ }
+}
+
+
+def phone(String ip, String step_label, String cmd) {
+ withCredentials([file(credentialsId: 'id_rsa', variable: 'key_file')]) {
+ def ssh_cmd = """
+ssh -tt -o StrictHostKeyChecking=no -i ${key_file} 'comma@${ip}' /usr/bin/bash <<'END'
+
+set -e
+
+
+source ~/.bash_profile
+if [ -f /etc/profile ]; then
+ source /etc/profile
+fi
+
+export CI=1
+export TEST_DIR=${env.TEST_DIR}
+export SOURCE_DIR=${env.SOURCE_DIR}
+export GIT_BRANCH=${env.GIT_BRANCH}
+export GIT_COMMIT=${env.GIT_COMMIT}
+export PYTHONPATH=${env.TEST_DIR}/../
+export PYTHONWARNINGS=error
+export LOGLEVEL=debug
+ln -sf /data/openpilot/iqdbc_repo/iqdbc /data/iqdbc
+
+# TODO: this is an agnos issue
+export PYTEST_ADDOPTS="-p no:asyncio"
+
+cd ${env.TEST_DIR} || true
+${cmd}
+exit 0
+
+END"""
+
+ sh script: ssh_cmd, label: step_label
+ }
+}
+
+def phone_steps(String device_type, steps) {
+ lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
+ timeout(time: 20, unit: 'MINUTES') {
+ phone(device_ip, "git checkout", readFile("tests/setup_device_ci.sh"),)
+ steps.each { item ->
+ phone(device_ip, item[0], item[1])
+ }
+ }
+ }
+}
+
+
+
+pipeline {
+ agent any
+ environment {
+ CI = "1"
+ PYTHONWARNINGS= "error"
+ DOCKER_IMAGE_TAG = "panda:build-${env.GIT_COMMIT}"
+
+ TEST_DIR = "/data/panda"
+ SOURCE_DIR = "/data/panda_source/"
+ }
+ options {
+ timeout(time: 3, unit: 'HOURS')
+ disableConcurrentBuilds(abortPrevious: env.BRANCH_NAME != 'master')
+ }
+
+ stages {
+ stage ('Acquire resource locks') {
+ options {
+ lock(resource: "pandas")
+ }
+ stages {
+ stage('Build Docker Image') {
+ steps {
+ timeout(time: 20, unit: 'MINUTES') {
+ script {
+ dockerImage = docker.build("${env.DOCKER_IMAGE_TAG}", "--build-arg CACHEBUST=${env.GIT_COMMIT} .")
+ }
+ }
+ }
+ }
+ stage('jungle tests') {
+ steps {
+ script {
+ retry (3) {
+ docker_run("reset hardware", 3, "python3 ./tests/hitl/reset_jungles.py")
+ }
+ }
+ }
+ }
+
+ stage('parallel tests') {
+ parallel {
+ stage('test cuatro') {
+ agent { docker { image 'ghcr.io/commaai/alpine-ssh'; args '--user=root' } }
+ steps {
+ phone_steps("panda-cuatro", [
+ ["build", "scons -j4"],
+ ["flash", "cd scripts/ && ./reflash_internal_panda.py"],
+ ["flash jungle", "cd board/jungle && ./flash.py --all"],
+ ["test", "cd tests/hitl && pytest --durations=0 2*.py [5-9]*.py"],
+ ])
+ }
+ }
+
+ stage('test tres') {
+ agent { docker { image 'ghcr.io/commaai/alpine-ssh'; args '--user=root' } }
+ steps {
+ phone_steps("panda-tres", [
+ ["build", "scons -j4"],
+ ["flash", "cd scripts/ && ./reflash_internal_panda.py"],
+ ["flash jungle", "cd board/jungle && ./flash.py --all"],
+ ["test", "cd tests/hitl && pytest --durations=0 2*.py [5-9]*.py"],
+ ])
+ }
+ }
+
+ /*
+ stage('bootkick tests') {
+ steps {
+ script {
+ docker_run("test", 10, "pytest ./tests/som/test_bootkick.py")
+ }
+ }
+ }
+ */
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/panda/LICENSE b/panda/LICENSE
new file mode 100644
index 000000000..8a6c6976b
--- /dev/null
+++ b/panda/LICENSE
@@ -0,0 +1,7 @@
+Copyright (c) 2016, Comma.ai, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/panda/LICENSE.md b/panda/LICENSE.md
new file mode 100644
index 000000000..d3ef425fa
--- /dev/null
+++ b/panda/LICENSE.md
@@ -0,0 +1,98 @@
+# IQ.Lvbs (Panda) License v0.1a
+
+Copyright (c) 2026 IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. All Rights Reserved.
+
+DEFINITIONS
+
+"Software" refers to IQ.Pilot, konn3kt, and all associated source code,
+documentation, and assets owned by the Copyright Holder.
+
+"Open Components" refers to portions of the Software explicitly marked as
+open source.
+
+"Proprietary Components" refers to all portions of the Software not made
+available to the public in source form.
+
+"Copyright Holder" refers to IQ.Lvbs LLC, a part of Project Teal Lvbs Inc.
+
+GRANT OF LICENSE
+
+Subject to the terms of this license, you are granted a limited,
+non-exclusive, revocable license to:
+
+1. View, study, and learn from the Open Components
+2. Modify the Open Components for personal, internal, or open-source public use
+3. Run the Software for personal, non-commercial purposes
+
+RESTRICTIONS
+
+You may NOT:
+
+1. Claim ownership of any part of the Software, excluding your own
+ modifications that do not incorporate Proprietary Components.
+
+2. Reverse engineer, decompile, disassemble, or in any way attempt to
+ circumvent the obfuscation of the Proprietary Components.
+
+3. Use the Software or any derivative for commercial purposes without
+ explicit written permission from the Copyright Holder.
+
+4. Remove or alter any copyright notices or this license.
+
+5. Sublicense, sell, or transfer rights to the Software.
+
+6. Use the Software and/or its source code to compete with or create a
+ substantially similar product.
+
+7. Use the Software in closed source software not licensed by IQ.Lvbs LLC.
+
+CONSEQUENCES OF VIOLATION
+
+In the event any Restriction is violated, any product created using inspiration from, or source code from, IQ.Pilot or Konn3kt shall be subject to a licensing fee determined solely by the Copyright Holder. Additionally, the violating party hereby grants IQ.Lvbs LLC an exclusive, irrevocable, worldwide, royalty-free license to use any and all assets from the infringing product on IQ.Lvbs webpages, advertising materials, and in any other manner IQ.Lvbs sees fit.
+
+OWNERSHIP
+
+All rights, title, and interest in the Software remain exclusively with the
+Copyright Holder. Any modifications, improvements, or derivative works you
+create based on the Software are owned by the Copyright Holder. By
+contributing modifications, you irrevocably assign all rights to the
+Copyright Holder.
+
+PROPRIETARY COMPONENTS
+
+The Proprietary Components are provided in binary or obfuscated form only.
+Reverse engineering, decompilation, or disassembly of Proprietary Components
+is strictly prohibited. Violation of this provision entitles IQ.Lvbs LLC to
+pursue all available legal remedies to protect its intellectual property and
+trade secrets.
+
+NO WARRANTY
+
+THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT
+HOLDER DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+NON-INFRINGEMENT.
+
+LIMITATION OF LIABILITY
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR
+OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE. THE USER ACCEPTS FULL
+RESPONSIBILITY FOR ANY AND ALL LIABILITIES WHEN USING IQ.LVBS SOFTWARE.
+
+TERMINATION
+
+This license terminates automatically if you violate any of its terms. Upon
+termination, you must destroy all copies of the Software in your possession.
+
+The Copyright Holder reserves the right to revoke this license at any time
+for any reason.
+
+GOVERNING LAW
+
+This license shall be governed by the laws of the State of Illinois, United
+States of America. Any disputes arising under this license shall be subject
+to the exclusive jurisdiction of the courts located in Henry County, Illinois.
+
+---
+
+For commercial licensing inquiries, contact: support@iqlvbs.com
diff --git a/panda/__init__.py b/panda/__init__.py
new file mode 100644
index 000000000..99a94c68d
--- /dev/null
+++ b/panda/__init__.py
@@ -0,0 +1,13 @@
+from .python.constants import McuType, BASEDIR, FW_PATH, USBPACKET_MAX_SIZE # noqa: F401
+from .python.spi import PandaSpiException, PandaProtocolMismatch, STBootloaderSPIHandle # noqa: F401
+from .python.serial import PandaSerial # noqa: F401
+from .python.utils import logger # noqa: F401
+from .python import (Panda, PandaDFU, # noqa: F401
+ pack_can_buffer, unpack_can_buffer, calculate_checksum,
+ DLC_TO_LEN, LEN_TO_DLC, CANPACKET_HEAD_SIZE)
+
+# panda jungle
+from .board.jungle import PandaJungle, PandaJungleDFU # noqa: F401
+
+# panda body
+from .board.body import PandaBody # noqa: F401
diff --git a/panda/board/README.md b/panda/board/README.md
new file mode 100644
index 000000000..558beae78
--- /dev/null
+++ b/panda/board/README.md
@@ -0,0 +1,20 @@
+## Programming
+
+```
+./flash.py # flash application
+./recover.py # flash bootstub
+```
+
+## Debugging
+
+To print out the serial console from the STM32, run `tests/debug_console.py`
+
+Troubleshooting
+----
+
+If your panda will not flash and green LED is on, use `recover.py`.
+If panda is blinking fast with green LED, use `flash.py`.
+
+Otherwise if LED is off and panda can't be seen with `lsusb` command, use [panda paw](https://comma.ai/shop/products/panda-paw) to go into DFU mode.
+
+If your device has an internal panda and none of the above works, try running `../scripts/reflash_internal_panda.py`.
diff --git a/panda/board/__init__.py b/panda/board/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/panda/board/body/__init__.py b/panda/board/body/__init__.py
new file mode 100644
index 000000000..fd5e6fbbd
--- /dev/null
+++ b/panda/board/body/__init__.py
@@ -0,0 +1,42 @@
+# python helpers for the body panda
+import struct
+
+from panda import Panda
+
+class PandaBody(Panda):
+
+ MOTOR_LEFT: int = 1
+ MOTOR_RIGHT: int = 2
+
+ # ****************** Motor Control *****************
+ @staticmethod
+ def _ensure_valid_motor(motor: int) -> None:
+ if motor not in (PandaBody.MOTOR_LEFT, PandaBody.MOTOR_RIGHT):
+ raise ValueError("motor must be MOTOR_LEFT or MOTOR_RIGHT")
+
+ def motor_set_speed(self, motor: int, speed: int) -> None:
+ self._ensure_valid_motor(motor)
+ assert -100 <= speed <= 100, "speed must be between -100 and 100"
+ speed_param = speed if speed >= 0 else (256 + speed)
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe0, motor, speed_param, b'')
+
+ def motor_set_target_rpm(self, motor: int, rpm: float) -> None:
+ self._ensure_valid_motor(motor)
+ target_deci_rpm = int(round(rpm * 10.0))
+ assert -32768 <= target_deci_rpm <= 32767, "target rpm out of range (-3276.8 to 3276.7)"
+ target_param = target_deci_rpm if target_deci_rpm >= 0 else (target_deci_rpm + (1 << 16))
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe4, motor, target_param, b'')
+
+ def motor_stop(self, motor: int) -> None:
+ self._ensure_valid_motor(motor)
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe1, motor, 0, b'')
+
+ def motor_get_encoder_state(self, motor: int) -> tuple[int, float]:
+ self._ensure_valid_motor(motor)
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xe2, motor, 0, 8)
+ position, rpm_milli = struct.unpack(" None:
+ self._ensure_valid_motor(motor)
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe3, motor, 0, b'')
diff --git a/panda/board/body/flash.py b/panda/board/body/flash.py
new file mode 100644
index 000000000..8f820ce97
--- /dev/null
+++ b/panda/board/body/flash.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+import argparse
+import os
+import subprocess
+
+from panda import Panda
+
+BODY_DIR = os.path.dirname(os.path.realpath(__file__))
+BOARD_DIR = os.path.abspath(os.path.join(BODY_DIR, ".."))
+REPO_ROOT = os.path.abspath(os.path.join(BOARD_DIR, ".."))
+DEFAULT_FIRMWARE = os.path.join(BOARD_DIR, "obj", "body_h7.bin.signed")
+
+
+def build_body() -> None:
+ subprocess.check_call(
+ f"scons -C {REPO_ROOT} -j$(nproc) board/obj/body_h7.bin.signed",
+ shell=True,
+ )
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("firmware", nargs="?", help="Optional path to firmware binary to flash")
+ parser.add_argument("--all", action="store_true", help="Flash all Panda devices")
+ parser.add_argument(
+ "--wait-usb",
+ action="store_true",
+ help="Wait for the panda to reconnect over USB after flashing (defaults to skipping reconnect).",
+ )
+ args = parser.parse_args()
+
+ firmware_path = os.path.abspath(args.firmware) if args.firmware is not None else DEFAULT_FIRMWARE
+
+ build_body()
+
+ if not os.path.isfile(firmware_path):
+ parser.error(f"firmware file not found: {firmware_path}")
+
+ if args.all:
+ serials = Panda.list()
+ print(f"found {len(serials)} panda(s) - {serials}")
+ else:
+ serials = [None]
+
+ for s in serials:
+ with Panda(serial=s) as p:
+ print("flashing", p.get_usb_serial())
+ p.flash(firmware_path, reconnect=args.wait_usb)
+ exit(1 if len(serials) == 0 else 0)
diff --git a/panda/board/debug/README.md b/panda/board/debug/README.md
new file mode 100644
index 000000000..f6a7826a3
--- /dev/null
+++ b/panda/board/debug/README.md
@@ -0,0 +1,24 @@
+# In-circuit debugging using openocd and gdb
+
+## Hardware
+Connect an ST-Link V2 programmer to the SWD pins on the board. The pins that need to be connected are:
+- GND
+- VTref
+- SWDIO
+- SWCLK
+- NRST
+
+Make sure you're using a genuine one for boards that do not have a 3.3V panda power rail. For example, the tres runs at 1.8V, which is not supported by the clones.
+
+## Openocd
+Install openocd. For Ubuntu 24.04, the one in the package manager works fine: `sudo apt install openocd`.
+
+## GDB
+You need `gdb-multiarch`.
+
+Once openocd is running, you can connect from gdb as follows:
+```
+$ gdb-multiarch
+(gdb) target ext :3333
+```
+To reset and break, use `monitor reset halt`.
diff --git a/panda/board/debug/debug_h7.sh b/panda/board/debug/debug_h7.sh
new file mode 100755
index 000000000..126a9c378
--- /dev/null
+++ b/panda/board/debug/debug_h7.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -e
+
+sudo openocd -f "interface/stlink.cfg" -c "transport select hla_swd" -f "target/stm32h7x.cfg" -c "init"
diff --git a/panda/board/debug/dfu_util_h7.sh b/panda/board/debug/dfu_util_h7.sh
new file mode 100755
index 000000000..c39a24ec7
--- /dev/null
+++ b/panda/board/debug/dfu_util_h7.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env sh
+set -e
+
+DFU_UTIL="dfu-util"
+
+scons -u -j$(nproc)
+
+PYTHONPATH=.. python3 -c "from python import Panda; Panda().reset(enter_bootstub=True); Panda().reset(enter_bootloader=True)" || true
+sleep 1
+$DFU_UTIL -d 0483:df11 -a 0 -s 0x08020000 -D obj/panda_h7.bin.signed
+$DFU_UTIL -d 0483:df11 -a 0 -s 0x08000000:leave -D obj/bootstub.panda_h7.bin
diff --git a/panda/board/debug/gdb.sh b/panda/board/debug/gdb.sh
new file mode 100755
index 000000000..aa695d6ab
--- /dev/null
+++ b/panda/board/debug/gdb.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+gdb-multiarch --eval-command="target extended-remote localhost:3333"
diff --git a/panda/board/flash.py b/panda/board/flash.py
new file mode 100755
index 000000000..394381462
--- /dev/null
+++ b/panda/board/flash.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import os
+import subprocess
+import argparse
+
+from panda import Panda
+
+board_path = os.path.dirname(os.path.realpath(__file__))
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--all", action="store_true", help="Recover all Panda devices")
+ args = parser.parse_args()
+
+ subprocess.check_call(f"scons -C {board_path}/.. -j$(nproc) {board_path}", shell=True)
+
+ if args.all:
+ serials = Panda.list()
+ print(f"found {len(serials)} panda(s) - {serials}")
+ else:
+ serials = [None]
+
+ for s in serials:
+ with Panda(serial=s) as p:
+ print("flashing", p.get_usb_serial())
+ p.flash()
+ exit(1 if len(serials) == 0 else 0)
diff --git a/panda/board/jungle/README.md b/panda/board/jungle/README.md
new file mode 100644
index 000000000..3fc645ad2
--- /dev/null
+++ b/panda/board/jungle/README.md
@@ -0,0 +1,26 @@
+Welcome to the jungle
+======
+
+Firmware for the Panda Jungle testing board.
+Available for purchase at the [comma shop](https://comma.ai/shop/panda-jungle).
+
+## udev rules
+
+To make the jungle usable without root permissions, you might need to setup udev rules for it.
+On ubuntu, this should do the trick:
+``` bash
+sudo tee /etc/udev/rules.d/12-panda_jungle.rules < bool:
+ dfu_serial = self.get_dfu_serial()
+
+ if reset:
+ self.reset(enter_bootstub=True)
+ self.reset(enter_bootloader=True)
+
+ if not self.wait_for_dfu(dfu_serial, timeout=timeout):
+ return False
+
+ dfu = PandaJungleDFU(dfu_serial)
+ dfu.recover()
+
+ # reflash after recover
+ self.connect(True, True)
+ self.flash()
+ return True
+
+ def get_mcu_type(self) -> McuType:
+ hw_type = self.get_type()
+ if hw_type in PandaJungle.H7_DEVICES:
+ return McuType.H7
+ raise ValueError(f"unknown HW type: {hw_type}")
+
+ def up_to_date(self, fn=None) -> bool:
+ if fn is None:
+ fn = os.path.join(FW_PATH, self.get_mcu_type().config.app_fn.replace("panda", "panda_jungle"))
+ return super().up_to_date(fn=fn)
+
+ # ******************* health *******************
+
+ @ensure_jungle_health_packet_version
+ def health(self):
+ dat = self._handle.controlRead(PandaJungle.REQUEST_IN, 0xd2, 0, 0, self.HEALTH_STRUCT.size)
+ a = self.HEALTH_STRUCT.unpack(dat)
+ return {
+ "uptime": a[0],
+ "ch1_power": a[1],
+ "ch2_power": a[2],
+ "ch3_power": a[3],
+ "ch4_power": a[4],
+ "ch5_power": a[5],
+ "ch6_power": a[6],
+ "ch1_sbu1_voltage": a[7] / 1000.0,
+ "ch1_sbu2_voltage": a[8] / 1000.0,
+ "ch2_sbu1_voltage": a[9] / 1000.0,
+ "ch2_sbu2_voltage": a[10] / 1000.0,
+ "ch3_sbu1_voltage": a[11] / 1000.0,
+ "ch3_sbu2_voltage": a[12] / 1000.0,
+ "ch4_sbu1_voltage": a[13] / 1000.0,
+ "ch4_sbu2_voltage": a[14] / 1000.0,
+ "ch5_sbu1_voltage": a[15] / 1000.0,
+ "ch5_sbu2_voltage": a[16] / 1000.0,
+ "ch6_sbu1_voltage": a[17] / 1000.0,
+ "ch6_sbu2_voltage": a[18] / 1000.0,
+ }
+
+ # ******************* control *******************
+
+ # Returns tuple with health packet version and CAN packet/USB packet version
+ def get_packets_versions(self):
+ dat = self._handle.controlRead(PandaJungle.REQUEST_IN, 0xdd, 0, 0, 3)
+ if dat and len(dat) == 3:
+ a = struct.unpack("BBB", dat)
+ return (a[0], a[1], a[2])
+ return (-1, -1, -1)
+
+ # ******************* jungle stuff *******************
+
+ def set_panda_power(self, enabled):
+ self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa0, int(enabled), 0, b'')
+
+ def set_panda_individual_power(self, port, enabled):
+ self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa3, int(port), int(enabled), b'')
+
+ def set_harness_orientation(self, mode):
+ self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa1, int(mode), 0, b'')
+
+ def set_ignition(self, enabled):
+ self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa2, int(enabled), 0, b'')
+
+ def set_can_silent(self, silent):
+ self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xf5, int(silent), 0, b'')
+
+ def set_generated_can(self, enabled):
+ self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa4, int(enabled), 0, b'')
+
+ # ******************* serial *******************
+
+ def debug_read(self):
+ ret = []
+ while 1:
+ lret = bytes(self._handle.controlRead(PandaJungle.REQUEST_IN, 0xe0, 0, 0, 0x40))
+ if len(lret) == 0:
+ break
+ ret.append(lret)
+ return b''.join(ret)
+
+ # ******************* header pins *******************
+
+ def set_header_pin(self, pin_num, enabled):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf7, int(pin_num), int(enabled), b'')
diff --git a/panda/board/jungle/flash.py b/panda/board/jungle/flash.py
new file mode 100755
index 000000000..6f60f70b1
--- /dev/null
+++ b/panda/board/jungle/flash.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import os
+import subprocess
+import argparse
+
+from panda import PandaJungle
+
+board_path = os.path.dirname(os.path.realpath(__file__))
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--all", action="store_true", help="Recover all panda jungle devices")
+ args = parser.parse_args()
+
+ subprocess.check_call(f"scons -C {board_path}/.. -u -j$(nproc) .", shell=True)
+
+ if args.all:
+ serials = PandaJungle.list()
+ print(f"found {len(serials)} panda jungles(s) - {serials}")
+ else:
+ serials = [None]
+
+ for s in serials:
+ with PandaJungle(serial=s) as p:
+ print("flashing", p.get_usb_serial())
+ p.flash()
+ exit(1 if len(serials) == 0 else 0)
diff --git a/panda/board/jungle/recover.py b/panda/board/jungle/recover.py
new file mode 100755
index 000000000..228f0c561
--- /dev/null
+++ b/panda/board/jungle/recover.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python3
+import os
+import time
+import subprocess
+import argparse
+
+from panda import PandaJungle, PandaJungleDFU
+
+board_path = os.path.dirname(os.path.realpath(__file__))
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--all", action="store_true", help="Recover all panda jungle devices")
+ args = parser.parse_args()
+
+ subprocess.check_call(f"scons -C {board_path}/.. -u -j$(nproc) .", shell=True)
+
+ serials = PandaJungle.list() if args.all else [None]
+ for s in serials:
+ with PandaJungle(serial=s) as p:
+ print(f"putting {p.get_usb_serial()} in DFU mode")
+ p.reset(enter_bootstub=True)
+ p.reset(enter_bootloader=True)
+
+ # wait for reset panda jungles to come back up
+ time.sleep(1)
+
+ dfu_serials = PandaJungleDFU.list()
+ print(f"found {len(dfu_serials)} panda jungle(s) in DFU - {dfu_serials}")
+ for s in dfu_serials:
+ print("flashing", s)
+ PandaJungleDFU(s).recover()
+ exit(1 if len(dfu_serials) == 0 else 0)
diff --git a/panda/board/jungle/scripts/can_health.py b/panda/board/jungle/scripts/can_health.py
new file mode 100755
index 000000000..47efbb2e6
--- /dev/null
+++ b/panda/board/jungle/scripts/can_health.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+import time
+import re
+from panda import PandaJungle
+
+RED = '\033[91m'
+GREEN = '\033[92m'
+
+def colorize_errors(value):
+ if isinstance(value, str):
+ if re.search(r'(?i)No error', value):
+ return f'{GREEN}{value}\033[0m'
+ elif re.search(r'(?i)(? 0.1:
+ dd = chr(27) + "[2J"
+ dd += "%5.2f\n" % (sec_since_boot() - start)
+ for (addr, bus), dat_log in sorted(all_msgs.items()):
+ dd += "%d: %s(%6d): %s\n" % (bus, "%04X(%4d)" % (addr, addr), len(dat_log), binascii.hexlify(dat_log[-1]).decode())
+ print(dd)
+ lp = sec_since_boot()
+
+if __name__ == "__main__":
+ can_printer()
diff --git a/panda/board/jungle/scripts/debug_console.py b/panda/board/jungle/scripts/debug_console.py
new file mode 100755
index 000000000..f35388796
--- /dev/null
+++ b/panda/board/jungle/scripts/debug_console.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+import os
+import sys
+import time
+
+from panda import PandaJungle
+
+setcolor = ["\033[1;32;40m", "\033[1;31;40m"]
+unsetcolor = "\033[00m"
+
+if __name__ == "__main__":
+ while True:
+ try:
+ claim = os.getenv("CLAIM") is not None
+
+ serials = PandaJungle.list()
+ if os.getenv("SERIAL"):
+ serials = [x for x in serials if x==os.getenv("SERIAL")]
+
+ panda_jungles = [PandaJungle(x, claim=claim) for x in serials]
+
+ if not len(panda_jungles):
+ sys.exit("no panda jungles found")
+
+ while True:
+ for i, panda_jungle in enumerate(panda_jungles):
+ while True:
+ ret = panda_jungle.debug_read()
+ if len(ret) > 0:
+ sys.stdout.write(setcolor[i] + ret.decode('ascii') + unsetcolor)
+ sys.stdout.flush()
+ else:
+ break
+ time.sleep(0.01)
+ except Exception as e:
+ print(e)
+ print("panda jungle disconnected!")
+ time.sleep(0.5)
diff --git a/panda/board/jungle/scripts/echo_loopback_test.py b/panda/board/jungle/scripts/echo_loopback_test.py
new file mode 100755
index 000000000..2cc523c8f
--- /dev/null
+++ b/panda/board/jungle/scripts/echo_loopback_test.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+import os
+import time
+import contextlib
+import random
+from termcolor import cprint
+
+from panda import PandaJungle
+
+# This script is intended to be used in conjunction with the echo.py test script from panda.
+# It sends messages on bus 0, 1, 2 and checks for a reversed response to be sent back.
+
+#################################################################
+############################# UTILS #############################
+#################################################################
+def print_colored(text, color):
+ cprint(text + " "*40, color, end="\r")
+
+def get_test_string():
+ return b"test"+os.urandom(4)
+
+#################################################################
+############################# TEST ##############################
+#################################################################
+
+def test_loopback():
+ for bus in range(3):
+ # Clear can
+ jungle.can_clear(bus)
+ # Send a random message
+ address = random.randint(1, 2000)
+ data = get_test_string()
+ jungle.can_send(address, data, bus)
+ time.sleep(0.1)
+
+ # Make sure it comes back reversed
+ incoming = jungle.can_recv()
+ found = False
+ for message in incoming:
+ incomingAddress, incomingData, incomingBus = message
+ if incomingAddress == address and incomingData == data[::-1] and incomingBus == bus:
+ found = True
+ break
+ if not found:
+ cprint("\nFAILED", "red")
+ raise AssertionError
+
+#################################################################
+############################# MAIN ##############################
+#################################################################
+jungle = None
+counter = 0
+
+if __name__ == "__main__":
+ # Connect to jungle silently
+ print_colored("Connecting to jungle", "blue")
+ with open(os.devnull, "w") as devnull:
+ with contextlib.redirect_stdout(devnull):
+ jungle = PandaJungle()
+ jungle.set_panda_power(True)
+ jungle.set_ignition(False)
+
+ # Run test
+ while True:
+ jungle.can_clear(0xFFFF)
+ test_loopback()
+ counter += 1
+ print_colored(str(counter) + " loopback cycles complete", "blue")
diff --git a/panda/board/jungle/scripts/get_version.py b/panda/board/jungle/scripts/get_version.py
new file mode 100755
index 000000000..4fc9d30be
--- /dev/null
+++ b/panda/board/jungle/scripts/get_version.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python3
+from panda import PandaJungle
+
+if __name__ == "__main__":
+ for p in PandaJungle.list():
+ pp = PandaJungle(p)
+ print(f"{pp.get_serial()[0]}: {pp.get_version()}")
+
+
diff --git a/panda/board/jungle/scripts/health_test.py b/panda/board/jungle/scripts/health_test.py
new file mode 100755
index 000000000..039f840e0
--- /dev/null
+++ b/panda/board/jungle/scripts/health_test.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+import time
+from pprint import pprint
+
+from panda import PandaJungle
+
+if __name__ == "__main__":
+ i = 0
+ pi = 0
+
+ pj = PandaJungle()
+ while True:
+ st = time.monotonic()
+ while time.monotonic() - st < 1:
+ pj.health()
+ pj.can_health(0)
+ i += 1
+ pprint(pj.health())
+ print(f"Speed: {i - pi}Hz")
+ pi = i
+
diff --git a/panda/board/jungle/scripts/loopback_test.py b/panda/board/jungle/scripts/loopback_test.py
new file mode 100755
index 000000000..18bd40437
--- /dev/null
+++ b/panda/board/jungle/scripts/loopback_test.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python3
+import os
+import time
+import contextlib
+import random
+from termcolor import cprint
+
+from iqdbc.car.structs import CarParams
+from panda import Panda, PandaJungle
+
+NUM_PANDAS_PER_TEST = 1
+FOR_RELEASE_BUILDS = os.getenv("RELEASE") is not None # Release builds do not have ALLOUTPUT mode
+
+BUS_SPEEDS = [125, 500, 1000]
+
+#################################################################
+############################# UTILS #############################
+#################################################################
+# To suppress the connection text
+def silent_panda_connect(serial):
+ with open(os.devnull, "w") as devnull:
+ with contextlib.redirect_stdout(devnull):
+ panda = Panda(serial)
+ return panda
+
+def print_colored(text, color):
+ cprint(text + " "*40, color, end="\r")
+
+def connect_to_pandas():
+ print_colored("Connecting to pandas", "blue")
+ # Connect to pandas
+ pandas = []
+ for serial in panda_serials:
+ pandas.append(silent_panda_connect(serial))
+ print_colored("Connected", "blue")
+
+def start_with_orientation(orientation):
+ print_colored("Restarting pandas with orientation " + str(orientation), "blue")
+ jungle.set_panda_power(False)
+ jungle.set_harness_orientation(orientation)
+ time.sleep(4)
+ jungle.set_panda_power(True)
+ time.sleep(2)
+ connect_to_pandas()
+
+def can_loopback(sender):
+ receivers = list(filter((lambda p: (p != sender)), [jungle] + pandas))
+
+ for bus in range(4):
+ obd = False
+ if bus == 3:
+ obd = True
+ bus = 1
+
+ # Clear buses
+ for receiver in receivers:
+ receiver.set_obd(obd)
+ receiver.can_clear(bus) # TX
+ receiver.can_clear(0xFFFF) # RX
+
+ # Send a random string
+ addr = 0x18DB33F1 if FOR_RELEASE_BUILDS else random.randint(1, 2000)
+ string = b"test"+os.urandom(4)
+ sender.set_obd(obd)
+ time.sleep(0.2)
+ sender.can_send(addr, string, bus)
+ time.sleep(0.2)
+
+ # Check if all receivers have indeed received them in their receiving buffers
+ for receiver in receivers:
+ content = receiver.can_recv()
+
+ # Check amount of messages
+ if len(content) != 1:
+ raise Exception("Amount of received CAN messages (" + str(len(content)) + ") does not equal 1. Bus: " + str(bus) +" OBD: " + str(obd))
+
+ # Check content
+ if content[0][0] != addr or content[0][1] != string:
+ raise Exception("Received CAN message content or address does not match")
+
+ # Check bus
+ if content[0][2] != bus:
+ raise Exception("Received CAN message bus does not match")
+
+#################################################################
+############################# TEST ##############################
+#################################################################
+
+def test_loopback():
+ # disable safety modes
+ for panda in pandas:
+ panda.set_safety_mode(CarParams.SafetyModel.elm327 if FOR_RELEASE_BUILDS else CarParams.SafetyModel.allOutput)
+
+ # perform loopback with jungle as a sender
+ can_loopback(jungle)
+
+ # perform loopback with each possible panda as a sender
+ for panda in pandas:
+ can_loopback(panda)
+
+ # enable safety modes
+ for panda in pandas:
+ panda.set_safety_mode(CarParams.SafetyModel.silent)
+
+#################################################################
+############################# MAIN ##############################
+#################################################################
+jungle = None
+pandas = [] # type: ignore
+panda_serials = []
+counter = 0
+
+if __name__ == "__main__":
+ # Connect to jungle silently
+ print_colored("Connecting to jungle", "blue")
+ with open(os.devnull, "w") as devnull:
+ with contextlib.redirect_stdout(devnull):
+ jungle = PandaJungle()
+ jungle.set_panda_power(True)
+ jungle.set_ignition(False)
+
+ # Connect to new pandas before starting tests
+ print_colored("Waiting for " + str(NUM_PANDAS_PER_TEST) + " pandas to be connected", "yellow")
+ while True:
+ connected_serials = Panda.list()
+ if len(connected_serials) == NUM_PANDAS_PER_TEST:
+ panda_serials = connected_serials
+ break
+
+ start_with_orientation(PandaJungle.HARNESS_ORIENTATION_1)
+
+ # Set bus speeds
+ for device in pandas + [jungle]:
+ for bus in range(len(BUS_SPEEDS)):
+ device.set_can_speed_kbps(bus, BUS_SPEEDS[bus])
+
+ # Run test
+ while True:
+ test_loopback()
+ counter += 1
+ print_colored(str(counter) + " loopback cycles complete", "blue")
diff --git a/panda/board/jungle/scripts/spam_can.py b/panda/board/jungle/scripts/spam_can.py
new file mode 100755
index 000000000..f4334552a
--- /dev/null
+++ b/panda/board/jungle/scripts/spam_can.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+import os
+import random
+from iqdbc.car.structs import CarParams
+from panda import PandaJungle
+
+def get_test_string():
+ return b"test" + os.urandom(10)
+
+if __name__ == "__main__":
+ p = PandaJungle()
+
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ print("Spamming all buses...")
+ while True:
+ at = random.randint(1, 2000)
+ st = get_test_string()[0:8]
+ bus = random.randint(0, 2)
+ p.can_send(at, st, bus)
+ # print("Sent message on bus: ", bus)
diff --git a/panda/board/jungle/scripts/start.py b/panda/board/jungle/scripts/start.py
new file mode 100755
index 000000000..76afd14ac
--- /dev/null
+++ b/panda/board/jungle/scripts/start.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+import sys
+
+from panda import PandaJungle
+
+if __name__ == "__main__":
+ jungle = PandaJungle()
+
+ # If first argument specified, it sets the ignition (0 or 1)
+ if len(sys.argv) > 1:
+ if sys.argv[1] == '1':
+ jungle.set_ignition(True)
+ else:
+ jungle.set_ignition(False)
+ jungle.set_harness_orientation(1)
+ jungle.set_panda_power(True)
+
+
diff --git a/panda/board/obj/.placeholder b/panda/board/obj/.placeholder
new file mode 100644
index 000000000..e69de29bb
diff --git a/panda/board/obj/body_h7.bin.signed b/panda/board/obj/body_h7.bin.signed
new file mode 100644
index 000000000..288aea00e
Binary files /dev/null and b/panda/board/obj/body_h7.bin.signed differ
diff --git a/panda/board/obj/body_h7/bootstub.elf b/panda/board/obj/body_h7/bootstub.elf
new file mode 100755
index 000000000..c694777c3
Binary files /dev/null and b/panda/board/obj/body_h7/bootstub.elf differ
diff --git a/panda/board/obj/body_h7/main.bin b/panda/board/obj/body_h7/main.bin
new file mode 100755
index 000000000..5034a811c
Binary files /dev/null and b/panda/board/obj/body_h7/main.bin differ
diff --git a/panda/board/obj/body_h7/main.elf b/panda/board/obj/body_h7/main.elf
new file mode 100755
index 000000000..280582c65
Binary files /dev/null and b/panda/board/obj/body_h7/main.elf differ
diff --git a/panda/board/obj/bootstub.body_h7.bin b/panda/board/obj/bootstub.body_h7.bin
new file mode 100755
index 000000000..d109a7541
Binary files /dev/null and b/panda/board/obj/bootstub.body_h7.bin differ
diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin
new file mode 100755
index 000000000..87320da81
Binary files /dev/null and b/panda/board/obj/bootstub.panda.bin differ
diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin
new file mode 100755
index 000000000..baecc6323
Binary files /dev/null and b/panda/board/obj/bootstub.panda_h7.bin differ
diff --git a/panda/board/obj/bootstub.panda_jungle_h7.bin b/panda/board/obj/bootstub.panda_jungle_h7.bin
new file mode 100755
index 000000000..af79b1f29
Binary files /dev/null and b/panda/board/obj/bootstub.panda_jungle_h7.bin differ
diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed
new file mode 100644
index 000000000..e4415edf7
Binary files /dev/null and b/panda/board/obj/panda.bin.signed differ
diff --git a/panda/board/obj/panda/bootstub.elf b/panda/board/obj/panda/bootstub.elf
new file mode 100755
index 000000000..b57ea70d2
Binary files /dev/null and b/panda/board/obj/panda/bootstub.elf differ
diff --git a/panda/board/obj/panda/main.bin b/panda/board/obj/panda/main.bin
new file mode 100755
index 000000000..52543f300
Binary files /dev/null and b/panda/board/obj/panda/main.bin differ
diff --git a/panda/board/obj/panda/main.elf b/panda/board/obj/panda/main.elf
new file mode 100755
index 000000000..d4d4c7433
Binary files /dev/null and b/panda/board/obj/panda/main.elf differ
diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed
new file mode 100644
index 000000000..efc2386ec
Binary files /dev/null and b/panda/board/obj/panda_h7.bin.signed differ
diff --git a/panda/board/obj/panda_h7/bootstub.elf b/panda/board/obj/panda_h7/bootstub.elf
new file mode 100755
index 000000000..3489a8321
Binary files /dev/null and b/panda/board/obj/panda_h7/bootstub.elf differ
diff --git a/panda/board/obj/panda_h7/main.bin b/panda/board/obj/panda_h7/main.bin
new file mode 100755
index 000000000..093f127fd
Binary files /dev/null and b/panda/board/obj/panda_h7/main.bin differ
diff --git a/panda/board/obj/panda_h7/main.elf b/panda/board/obj/panda_h7/main.elf
new file mode 100755
index 000000000..88b60e328
Binary files /dev/null and b/panda/board/obj/panda_h7/main.elf differ
diff --git a/panda/board/obj/panda_jungle_h7.bin.signed b/panda/board/obj/panda_jungle_h7.bin.signed
new file mode 100644
index 000000000..b4d1f5f0c
Binary files /dev/null and b/panda/board/obj/panda_jungle_h7.bin.signed differ
diff --git a/panda/board/obj/panda_jungle_h7/bootstub.elf b/panda/board/obj/panda_jungle_h7/bootstub.elf
new file mode 100755
index 000000000..3861923d0
Binary files /dev/null and b/panda/board/obj/panda_jungle_h7/bootstub.elf differ
diff --git a/panda/board/obj/panda_jungle_h7/main.bin b/panda/board/obj/panda_jungle_h7/main.bin
new file mode 100755
index 000000000..acc619fd0
Binary files /dev/null and b/panda/board/obj/panda_jungle_h7/main.bin differ
diff --git a/panda/board/obj/panda_jungle_h7/main.elf b/panda/board/obj/panda_jungle_h7/main.elf
new file mode 100755
index 000000000..54f503b55
Binary files /dev/null and b/panda/board/obj/panda_jungle_h7/main.elf differ
diff --git a/panda/board/obj/version b/panda/board/obj/version
new file mode 100644
index 000000000..83f4ba194
--- /dev/null
+++ b/panda/board/obj/version
@@ -0,0 +1 @@
+DEV-34a11299-DEBUG
\ No newline at end of file
diff --git a/panda/board/recover.py b/panda/board/recover.py
new file mode 100755
index 000000000..6268a07d9
--- /dev/null
+++ b/panda/board/recover.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import os
+import time
+import subprocess
+
+from panda import Panda, PandaDFU
+
+board_path = os.path.dirname(os.path.realpath(__file__))
+
+if __name__ == "__main__":
+ subprocess.check_call(f"scons -C {board_path}/.. -j$(nproc) {board_path}", shell=True)
+
+ for s in Panda.list():
+ with Panda(serial=s) as p:
+ print(f"putting {p.get_usb_serial()} in DFU mode")
+ p.reset(enter_bootstub=True)
+ p.reset(enter_bootloader=True)
+
+ # wait for reset pandas to come back up
+ time.sleep(1)
+
+ dfu_serials = PandaDFU.list()
+ print(f"found {len(dfu_serials)} panda(s) in DFU - {dfu_serials}")
+ for s in dfu_serials:
+ print("flashing", s)
+ PandaDFU(s).recover()
+ exit(1 if len(dfu_serials) == 0 else 0)
diff --git a/panda/board/stm32f4/startup_stm32f413xx.s b/panda/board/stm32f4/startup_stm32f413xx.s
new file mode 100644
index 000000000..6e6fb5ffa
--- /dev/null
+++ b/panda/board/stm32f4/startup_stm32f413xx.s
@@ -0,0 +1,583 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32f413xx.s
+ * @author MCD Application Team
+ * @version V2.6.0
+ * @date 04-November-2016
+ * @brief STM32F413xx Devices vector table for GCC based toolchains.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * © COPYRIGHT 2016 STMicroelectronics
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
+
+/**
+ * @brief This is the code that gets called when the processor first
+ * starts execution following a reset event. Only the absolutely
+ * necessary set is performed, after which the application
+ * supplied main() routine is called.
+ * @param None
+ * @retval : None
+*/
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr sp, =_estack /* set stack pointer */
+ bl __initialize_hardware_early
+
+/* Copy the data segment initializers from flash to SRAM */
+ movs r1, #0
+ b LoopCopyDataInit
+
+CopyDataInit:
+ ldr r3, =_sidata
+ ldr r3, [r3, r1]
+ str r3, [r0, r1]
+ adds r1, r1, #4
+
+LoopCopyDataInit:
+ ldr r0, =_sdata
+ ldr r3, =_edata
+ adds r2, r0, r1
+ cmp r2, r3
+ bcc CopyDataInit
+ ldr r2, =_sbss
+ b LoopFillZerobss
+/* Zero fill the bss segment. */
+FillZerobss:
+ movs r3, #0
+ str r3, [r2], #4
+
+LoopFillZerobss:
+ ldr r3, = _ebss
+ cmp r2, r3
+ bcc FillZerobss
+
+/* Call the clock system intitialization function.*/
+ /* bl SystemInit */
+/* Call static constructors */
+ /* bl __libc_init_array */
+/* Call the application's entry point.*/
+ bl main
+ bx lr
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex M3. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+*******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+
+ /* External Interrupts */
+ .word WWDG_IRQHandler /* Window WatchDog */
+ .word PVD_IRQHandler /* PVD through EXTI Line detection */
+ .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
+ .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
+ .word FLASH_IRQHandler /* FLASH */
+ .word RCC_IRQHandler /* RCC */
+ .word EXTI0_IRQHandler /* EXTI Line0 */
+ .word EXTI1_IRQHandler /* EXTI Line1 */
+ .word EXTI2_IRQHandler /* EXTI Line2 */
+ .word EXTI3_IRQHandler /* EXTI Line3 */
+ .word EXTI4_IRQHandler /* EXTI Line4 */
+ .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
+ .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
+ .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
+ .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
+ .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
+ .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
+ .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
+ .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
+ .word CAN1_TX_IRQHandler /* CAN1 TX */
+ .word CAN1_RX0_IRQHandler /* CAN1 RX0 */
+ .word CAN1_RX1_IRQHandler /* CAN1 RX1 */
+ .word CAN1_SCE_IRQHandler /* CAN1 SCE */
+ .word EXTI9_5_IRQHandler /* External Line[9:5]s */
+ .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
+ .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
+ .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
+ .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
+ .word TIM2_IRQHandler /* TIM2 */
+ .word TIM3_IRQHandler /* TIM3 */
+ .word TIM4_IRQHandler /* TIM4 */
+ .word I2C1_EV_IRQHandler /* I2C1 Event */
+ .word I2C1_ER_IRQHandler /* I2C1 Error */
+ .word I2C2_EV_IRQHandler /* I2C2 Event */
+ .word I2C2_ER_IRQHandler /* I2C2 Error */
+ .word SPI1_IRQHandler /* SPI1 */
+ .word SPI2_IRQHandler /* SPI2 */
+ .word USART1_IRQHandler /* USART1 */
+ .word USART2_IRQHandler /* USART2 */
+ .word USART3_IRQHandler /* USART3 */
+ .word EXTI15_10_IRQHandler /* External Line[15:10]s */
+ .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
+ .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
+ .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
+ .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
+ .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
+ .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
+ .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
+ .word FSMC_IRQHandler /* FSMC */
+ .word SDIO_IRQHandler /* SDIO */
+ .word TIM5_IRQHandler /* TIM5 */
+ .word SPI3_IRQHandler /* SPI3 */
+ .word UART4_IRQHandler /* UART4 */
+ .word UART5_IRQHandler /* UART5 */
+ .word TIM6_DAC_IRQHandler /* TIM6, DAC1 and DAC2 */
+ .word TIM7_IRQHandler /* TIM7 */
+ .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
+ .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
+ .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
+ .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
+ .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
+ .word DFSDM1_FLT0_IRQHandler /* DFSDM1 Filter0 */
+ .word DFSDM1_FLT1_IRQHandler /* DFSDM1 Filter1 */
+ .word CAN2_TX_IRQHandler /* CAN2 TX */
+ .word CAN2_RX0_IRQHandler /* CAN2 RX0 */
+ .word CAN2_RX1_IRQHandler /* CAN2 RX1 */
+ .word CAN2_SCE_IRQHandler /* CAN2 SCE */
+ .word OTG_FS_IRQHandler /* USB OTG FS */
+ .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
+ .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
+ .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
+ .word USART6_IRQHandler /* USART6 */
+ .word I2C3_EV_IRQHandler /* I2C3 event */
+ .word I2C3_ER_IRQHandler /* I2C3 error */
+ .word CAN3_TX_IRQHandler /* CAN3 TX */
+ .word CAN3_RX0_IRQHandler /* CAN3 RX0 */
+ .word CAN3_RX1_IRQHandler /* CAN3 RX1 */
+ .word CAN3_SCE_IRQHandler /* CAN3 SCE */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word RNG_IRQHandler /* RNG */
+ .word FPU_IRQHandler /* FPU */
+ .word UART7_IRQHandler /* UART7 */
+ .word UART8_IRQHandler /* UART8 */
+ .word SPI4_IRQHandler /* SPI4 */
+ .word SPI5_IRQHandler /* SPI5 */
+ .word 0 /* Reserved */
+ .word SAI1_IRQHandler /* SAI1 */
+ .word UART9_IRQHandler /* UART9 */
+ .word UART10_IRQHandler /* UART10 */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word QUADSPI_IRQHandler /* QuadSPI */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word FMPI2C1_EV_IRQHandler /* FMPI2C1 Event */
+ .word FMPI2C1_ER_IRQHandler /* FMPI2C1 Error */
+ .word LPTIM1_IRQHandler /* LPTIM1 */
+ .word DFSDM2_FLT0_IRQHandler /* DFSDM2 Filter0 */
+ .word DFSDM2_FLT1_IRQHandler /* DFSDM2 Filter1 */
+ .word DFSDM2_FLT2_IRQHandler /* DFSDM2 Filter2 */
+ .word DFSDM2_FLT3_IRQHandler /* DFSDM2 Filter3 */
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_IRQHandler
+ .thumb_set PVD_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_IRQHandler
+ .thumb_set TAMP_STAMP_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream0_IRQHandler
+ .thumb_set DMA1_Stream0_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream1_IRQHandler
+ .thumb_set DMA1_Stream1_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream2_IRQHandler
+ .thumb_set DMA1_Stream2_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream3_IRQHandler
+ .thumb_set DMA1_Stream3_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream4_IRQHandler
+ .thumb_set DMA1_Stream4_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream5_IRQHandler
+ .thumb_set DMA1_Stream5_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream6_IRQHandler
+ .thumb_set DMA1_Stream6_IRQHandler,Default_Handler
+
+ .weak ADC_IRQHandler
+ .thumb_set ADC_IRQHandler,Default_Handler
+
+ .weak CAN1_TX_IRQHandler
+ .thumb_set CAN1_TX_IRQHandler,Default_Handler
+
+ .weak CAN1_RX0_IRQHandler
+ .thumb_set CAN1_RX0_IRQHandler,Default_Handler
+
+ .weak CAN1_RX1_IRQHandler
+ .thumb_set CAN1_RX1_IRQHandler,Default_Handler
+
+ .weak CAN1_SCE_IRQHandler
+ .thumb_set CAN1_SCE_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_TIM9_IRQHandler
+ .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM10_IRQHandler
+ .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM11_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak TIM3_IRQHandler
+ .thumb_set TIM3_IRQHandler,Default_Handler
+
+ .weak TIM4_IRQHandler
+ .thumb_set TIM4_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C2_EV_IRQHandler
+ .thumb_set I2C2_EV_IRQHandler,Default_Handler
+
+ .weak I2C2_ER_IRQHandler
+ .thumb_set I2C2_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak USART2_IRQHandler
+ .thumb_set USART2_IRQHandler,Default_Handler
+
+ .weak USART3_IRQHandler
+ .thumb_set USART3_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak OTG_FS_WKUP_IRQHandler
+ .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
+
+ .weak TIM8_BRK_TIM12_IRQHandler
+ .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
+
+ .weak TIM8_UP_TIM13_IRQHandler
+ .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
+
+ .weak TIM8_TRG_COM_TIM14_IRQHandler
+ .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
+
+ .weak TIM8_CC_IRQHandler
+ .thumb_set TIM8_CC_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream7_IRQHandler
+ .thumb_set DMA1_Stream7_IRQHandler,Default_Handler
+
+ .weak FSMC_IRQHandler
+ .thumb_set FSMC_IRQHandler,Default_Handler
+
+ .weak SDIO_IRQHandler
+ .thumb_set SDIO_IRQHandler,Default_Handler
+
+ .weak TIM5_IRQHandler
+ .thumb_set TIM5_IRQHandler,Default_Handler
+
+ .weak SPI3_IRQHandler
+ .thumb_set SPI3_IRQHandler,Default_Handler
+
+ .weak UART4_IRQHandler
+ .thumb_set UART4_IRQHandler,Default_Handler
+
+ .weak UART5_IRQHandler
+ .thumb_set UART5_IRQHandler,Default_Handler
+
+ .weak TIM6_DAC_IRQHandler
+ .thumb_set TIM6_DAC_IRQHandler,Default_Handler
+
+ .weak TIM7_IRQHandler
+ .thumb_set TIM7_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream0_IRQHandler
+ .thumb_set DMA2_Stream0_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream1_IRQHandler
+ .thumb_set DMA2_Stream1_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream2_IRQHandler
+ .thumb_set DMA2_Stream2_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream3_IRQHandler
+ .thumb_set DMA2_Stream3_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream4_IRQHandler
+ .thumb_set DMA2_Stream4_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT0_IRQHandler
+ .thumb_set DFSDM1_FLT0_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT1_IRQHandler
+ .thumb_set DFSDM1_FLT1_IRQHandler,Default_Handler
+
+ .weak CAN2_TX_IRQHandler
+ .thumb_set CAN2_TX_IRQHandler,Default_Handler
+
+ .weak CAN2_RX0_IRQHandler
+ .thumb_set CAN2_RX0_IRQHandler,Default_Handler
+
+ .weak CAN2_RX1_IRQHandler
+ .thumb_set CAN2_RX1_IRQHandler,Default_Handler
+
+ .weak CAN2_SCE_IRQHandler
+ .thumb_set CAN2_SCE_IRQHandler,Default_Handler
+
+ .weak OTG_FS_IRQHandler
+ .thumb_set OTG_FS_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream5_IRQHandler
+ .thumb_set DMA2_Stream5_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream6_IRQHandler
+ .thumb_set DMA2_Stream6_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream7_IRQHandler
+ .thumb_set DMA2_Stream7_IRQHandler,Default_Handler
+
+ .weak USART6_IRQHandler
+ .thumb_set USART6_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak CAN3_TX_IRQHandler
+ .thumb_set CAN3_TX_IRQHandler,Default_Handler
+
+ .weak CAN3_RX0_IRQHandler
+ .thumb_set CAN3_RX0_IRQHandler,Default_Handler
+
+ .weak CAN3_RX1_IRQHandler
+ .thumb_set CAN3_RX1_IRQHandler,Default_Handler
+
+ .weak CAN3_SCE_IRQHandler
+ .thumb_set CAN3_SCE_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak UART7_IRQHandler
+ .thumb_set UART7_IRQHandler,Default_Handler
+
+ .weak UART8_IRQHandler
+ .thumb_set UART8_IRQHandler,Default_Handler
+
+ .weak SPI4_IRQHandler
+ .thumb_set SPI4_IRQHandler,Default_Handler
+
+ .weak SPI5_IRQHandler
+ .thumb_set SPI5_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak UART9_IRQHandler
+ .thumb_set UART9_IRQHandler,Default_Handler
+
+ .weak UART10_IRQHandler
+ .thumb_set UART10_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak FMPI2C1_EV_IRQHandler
+ .thumb_set FMPI2C1_EV_IRQHandler,Default_Handler
+
+ .weak FMPI2C1_ER_IRQHandler
+ .thumb_set FMPI2C1_ER_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak DFSDM2_FLT0_IRQHandler
+ .thumb_set DFSDM2_FLT0_IRQHandler,Default_Handler
+
+ .weak DFSDM2_FLT1_IRQHandler
+ .thumb_set DFSDM2_FLT1_IRQHandler,Default_Handler
+
+ .weak DFSDM2_FLT2_IRQHandler
+ .thumb_set DFSDM2_FLT2_IRQHandler,Default_Handler
+
+ .weak DFSDM2_FLT3_IRQHandler
+ .thumb_set DFSDM2_FLT3_IRQHandler,Default_Handler
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/panda/board/stm32f4/stm32f4_flash.ld b/panda/board/stm32f4/stm32f4_flash.ld
new file mode 100644
index 000000000..a601c1f60
--- /dev/null
+++ b/panda/board/stm32f4/stm32f4_flash.ld
@@ -0,0 +1,166 @@
+/*
+*****************************************************************************
+**
+** File : stm32f4_flash.ld
+**
+** Abstract : Linker script for STM32F407VG Device with
+** 1024KByte FLASH, 192KByte RAM
+**
+** Set heap size, stack size and stack location according
+** to application requirements.
+**
+** Set memory bank area and size if external memory is used.
+**
+** Target : STMicroelectronics STM32
+**
+** Environment : Atollic TrueSTUDIO(R)
+**
+** Distribution: The file is distributed "as is," without any warranty
+** of any kind.
+**
+** (c)Copyright Atollic AB.
+** You may use this file as-is or modify it according to the needs of your
+** project. Distribution of this file (unmodified or modified) is not
+** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
+** rights to distribute the assembled, compiled & linked contents of this
+** file as part of an application binary file, provided that it is built
+** using the Atollic TrueSTUDIO(R) toolchain.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+enter_bootloader_mode = 0x2001FFFC;
+_estack = 0x2001FFFC; /* end of 128K RAM on AHB bus*/
+_app_start = 0x08004000; /* Reserve Sector 0(16K) for bootloader */
+
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0; /* required amount of heap */
+_Min_Stack_Size = 0x400; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
+ RAM2 (xrw) : ORIGIN = 0x20040000, LENGTH = 64K
+ MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ _exit = .;
+ } >FLASH
+
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(.fini_array*))
+ KEEP (*(SORT(.fini_array.*)))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = .;
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data : AT ( _sidata )
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(4);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(4);
+ } >RAM
+
+ /* MEMORY_bank1 section, code must be located here explicitly */
+ /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
+ .memory_b1_text :
+ {
+ *(.mb1text) /* .mb1text sections (code) */
+ *(.mb1text*) /* .mb1text* sections (code) */
+ *(.mb1rodata) /* read-only data (constants) */
+ *(.mb1rodata*)
+ } >MEMORY_B1
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+}
diff --git a/panda/board/stm32h7/startup_stm32h7x5xx.s b/panda/board/stm32h7/startup_stm32h7x5xx.s
new file mode 100644
index 000000000..77849b914
--- /dev/null
+++ b/panda/board/stm32h7/startup_stm32h7x5xx.s
@@ -0,0 +1,767 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32h735xx.s
+ * @author MCD Application Team
+ * @brief STM32H735xx Devices vector table for GCC based toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * © Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m7
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
+
+/**
+ * @brief This is the code that gets called when the processor first
+ * starts execution following a reset event. Only the absolutely
+ * necessary set is performed, after which the application
+ * supplied main() routine is called.
+ * @param None
+ * @retval : None
+*/
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr sp, =_estack /* set stack pointer */
+ bl __initialize_hardware_early
+
+/* Copy the data segment initializers from flash to SRAM */
+ ldr r0, =_sdata
+ ldr r1, =_edata
+ ldr r2, =_sidata
+ movs r3, #0
+ b LoopCopyDataInit
+
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+/* Zero fill the bss segment. */
+ ldr r2, =_sbss
+ ldr r4, =_ebss
+ movs r3, #0
+ b LoopFillZerobss
+
+FillZerobss:
+ str r3, [r2]
+ adds r2, r2, #4
+
+LoopFillZerobss:
+ cmp r2, r4
+ bcc FillZerobss
+
+/* Call the clock system intitialization function.*/
+ /* bl SystemInit */
+/* Call static constructors */
+ /* bl __libc_init_array */
+/* Call the application's entry point.*/
+ bl main
+ bx lr
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex M. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+*******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+
+ /* External Interrupts */
+ .word WWDG_IRQHandler /* Window WatchDog */
+ .word PVD_AVD_IRQHandler /* PVD/AVD through EXTI Line detection */
+ .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
+ .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
+ .word FLASH_IRQHandler /* FLASH */
+ .word RCC_IRQHandler /* RCC */
+ .word EXTI0_IRQHandler /* EXTI Line0 */
+ .word EXTI1_IRQHandler /* EXTI Line1 */
+ .word EXTI2_IRQHandler /* EXTI Line2 */
+ .word EXTI3_IRQHandler /* EXTI Line3 */
+ .word EXTI4_IRQHandler /* EXTI Line4 */
+ .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
+ .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
+ .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
+ .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
+ .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
+ .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
+ .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
+ .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
+ .word FDCAN1_IT0_IRQHandler /* FDCAN1 interrupt line 0 */
+ .word FDCAN2_IT0_IRQHandler /* FDCAN2 interrupt line 0 */
+ .word FDCAN1_IT1_IRQHandler /* FDCAN1 interrupt line 1 */
+ .word FDCAN2_IT1_IRQHandler /* FDCAN2 interrupt line 1 */
+ .word EXTI9_5_IRQHandler /* External Line[9:5]s */
+ .word TIM1_BRK_IRQHandler /* TIM1 Break interrupt */
+ .word TIM1_UP_IRQHandler /* TIM1 Update interrupt */
+ .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation interrupt */
+ .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
+ .word TIM2_IRQHandler /* TIM2 */
+ .word TIM3_IRQHandler /* TIM3 */
+ .word TIM4_IRQHandler /* TIM4 */
+ .word I2C1_EV_IRQHandler /* I2C1 Event */
+ .word I2C1_ER_IRQHandler /* I2C1 Error */
+ .word I2C2_EV_IRQHandler /* I2C2 Event */
+ .word I2C2_ER_IRQHandler /* I2C2 Error */
+ .word SPI1_IRQHandler /* SPI1 */
+ .word SPI2_IRQHandler /* SPI2 */
+ .word USART1_IRQHandler /* USART1 */
+ .word USART2_IRQHandler /* USART2 */
+ .word USART3_IRQHandler /* USART3 */
+ .word EXTI15_10_IRQHandler /* External Line[15:10]s */
+ .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
+ .word 0 /* Reserved */
+ .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
+ .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
+ .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
+ .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
+ .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
+ .word FMC_IRQHandler /* FMC */
+ .word SDMMC1_IRQHandler /* SDMMC1 */
+ .word TIM5_IRQHandler /* TIM5 */
+ .word SPI3_IRQHandler /* SPI3 */
+ .word UART4_IRQHandler /* UART4 */
+ .word UART5_IRQHandler /* UART5 */
+ .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
+ .word TIM7_IRQHandler /* TIM7 */
+ .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
+ .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
+ .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
+ .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
+ .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
+ .word ETH_IRQHandler /* Ethernet */
+ .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */
+ .word FDCAN_CAL_IRQHandler /* FDCAN calibration unit interrupt*/
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
+ .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
+ .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
+ .word USART6_IRQHandler /* USART6 */
+ .word I2C3_EV_IRQHandler /* I2C3 event */
+ .word I2C3_ER_IRQHandler /* I2C3 error */
+ .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
+ .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
+ .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
+ .word OTG_HS_IRQHandler /* USB OTG HS */
+ .word DCMI_PSSI_IRQHandler /* DCMI, PSSI */
+ .word CRYP_IRQHandler /* CRYP */
+ .word HASH_RNG_IRQHandler /* Hash and Rng */
+ .word FPU_IRQHandler /* FPU */
+ .word UART7_IRQHandler /* UART7 */
+ .word UART8_IRQHandler /* UART8 */
+ .word SPI4_IRQHandler /* SPI4 */
+ .word SPI5_IRQHandler /* SPI5 */
+ .word SPI6_IRQHandler /* SPI6 */
+ .word SAI1_IRQHandler /* SAI1 */
+ .word LTDC_IRQHandler /* LTDC */
+ .word LTDC_ER_IRQHandler /* LTDC error */
+ .word DMA2D_IRQHandler /* DMA2D */
+ .word 0 /* Reserved */
+ .word OCTOSPI1_IRQHandler /* OCTOSPI1 */
+ .word LPTIM1_IRQHandler /* LPTIM1 */
+ .word CEC_IRQHandler /* HDMI_CEC */
+ .word I2C4_EV_IRQHandler /* I2C4 Event */
+ .word I2C4_ER_IRQHandler /* I2C4 Error */
+ .word SPDIF_RX_IRQHandler /* SPDIF_RX */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word DMAMUX1_OVR_IRQHandler /* DMAMUX1 Overrun interrupt */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word DFSDM1_FLT0_IRQHandler /* DFSDM Filter0 Interrupt */
+ .word DFSDM1_FLT1_IRQHandler /* DFSDM Filter1 Interrupt */
+ .word DFSDM1_FLT2_IRQHandler /* DFSDM Filter2 Interrupt */
+ .word DFSDM1_FLT3_IRQHandler /* DFSDM Filter3 Interrupt */
+ .word 0 /* Reserved */
+ .word SWPMI1_IRQHandler /* Serial Wire Interface 1 global interrupt */
+ .word TIM15_IRQHandler /* TIM15 global Interrupt */
+ .word TIM16_IRQHandler /* TIM16 global Interrupt */
+ .word TIM17_IRQHandler /* TIM17 global Interrupt */
+ .word MDIOS_WKUP_IRQHandler /* MDIOS Wakeup Interrupt */
+ .word MDIOS_IRQHandler /* MDIOS global Interrupt */
+ .word 0 /* Reserved */
+ .word MDMA_IRQHandler /* MDMA global Interrupt */
+ .word 0 /* Reserved */
+ .word SDMMC2_IRQHandler /* SDMMC2 global Interrupt */
+ .word HSEM1_IRQHandler /* HSEM1 global Interrupt */
+ .word 0 /* Reserved */
+ .word ADC3_IRQHandler /* ADC3 global Interrupt */
+ .word DMAMUX2_OVR_IRQHandler /* DMAMUX Overrun interrupt */
+ .word BDMA_Channel0_IRQHandler /* BDMA Channel 0 global Interrupt */
+ .word BDMA_Channel1_IRQHandler /* BDMA Channel 1 global Interrupt */
+ .word BDMA_Channel2_IRQHandler /* BDMA Channel 2 global Interrupt */
+ .word BDMA_Channel3_IRQHandler /* BDMA Channel 3 global Interrupt */
+ .word BDMA_Channel4_IRQHandler /* BDMA Channel 4 global Interrupt */
+ .word BDMA_Channel5_IRQHandler /* BDMA Channel 5 global Interrupt */
+ .word BDMA_Channel6_IRQHandler /* BDMA Channel 6 global Interrupt */
+ .word BDMA_Channel7_IRQHandler /* BDMA Channel 7 global Interrupt */
+ .word COMP1_IRQHandler /* COMP1 global Interrupt */
+ .word LPTIM2_IRQHandler /* LP TIM2 global interrupt */
+ .word LPTIM3_IRQHandler /* LP TIM3 global interrupt */
+ .word LPTIM4_IRQHandler /* LP TIM4 global interrupt */
+ .word LPTIM5_IRQHandler /* LP TIM5 global interrupt */
+ .word LPUART1_IRQHandler /* LP UART1 interrupt */
+ .word 0 /* Reserved */
+ .word CRS_IRQHandler /* Clock Recovery Global Interrupt */
+ .word ECC_IRQHandler /* ECC diagnostic Global Interrupt */
+ .word SAI4_IRQHandler /* SAI4 global interrupt */
+ .word DTS_IRQHandler /* Digital Temperature Sensor interrupt */
+ .word 0 /* Reserved */
+ .word WAKEUP_PIN_IRQHandler /* Interrupt for all 6 wake-up pins */
+ .word OCTOSPI2_IRQHandler /* OCTOSPI2 Interrupt */
+ .word OTFDEC1_IRQHandler /* OTFDEC1 Interrupt */
+ .word OTFDEC2_IRQHandler /* OTFDEC2 Interrupt */
+ .word FMAC_IRQHandler /* FMAC Interrupt */
+ .word CORDIC_IRQHandler /* CORDIC Interrupt */
+ .word UART9_IRQHandler /* UART9 Interrupt */
+ .word USART10_IRQHandler /* UART10 Interrupt */
+ .word I2C5_EV_IRQHandler /* I2C5 Event Interrupt */
+ .word I2C5_ER_IRQHandler /* I2C5 Error Interrupt */
+ .word FDCAN3_IT0_IRQHandler /* FDCAN3 interrupt line 0 */
+ .word FDCAN3_IT1_IRQHandler /* FDCAN3 interrupt line 1 */
+ .word TIM23_IRQHandler /* TIM23 global interrupt */
+ .word TIM24_IRQHandler /* TIM24 global interrupt */
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_AVD_IRQHandler
+ .thumb_set PVD_AVD_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_IRQHandler
+ .thumb_set TAMP_STAMP_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream0_IRQHandler
+ .thumb_set DMA1_Stream0_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream1_IRQHandler
+ .thumb_set DMA1_Stream1_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream2_IRQHandler
+ .thumb_set DMA1_Stream2_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream3_IRQHandler
+ .thumb_set DMA1_Stream3_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream4_IRQHandler
+ .thumb_set DMA1_Stream4_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream5_IRQHandler
+ .thumb_set DMA1_Stream5_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream6_IRQHandler
+ .thumb_set DMA1_Stream6_IRQHandler,Default_Handler
+
+ .weak ADC_IRQHandler
+ .thumb_set ADC_IRQHandler,Default_Handler
+
+ .weak FDCAN1_IT0_IRQHandler
+ .thumb_set FDCAN1_IT0_IRQHandler,Default_Handler
+
+ .weak FDCAN2_IT0_IRQHandler
+ .thumb_set FDCAN2_IT0_IRQHandler,Default_Handler
+
+ .weak FDCAN1_IT1_IRQHandler
+ .thumb_set FDCAN1_IT1_IRQHandler,Default_Handler
+
+ .weak FDCAN2_IT1_IRQHandler
+ .thumb_set FDCAN2_IT1_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_IRQHandler
+ .thumb_set TIM1_UP_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_IRQHandler
+ .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak TIM3_IRQHandler
+ .thumb_set TIM3_IRQHandler,Default_Handler
+
+ .weak TIM4_IRQHandler
+ .thumb_set TIM4_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C2_EV_IRQHandler
+ .thumb_set I2C2_EV_IRQHandler,Default_Handler
+
+ .weak I2C2_ER_IRQHandler
+ .thumb_set I2C2_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak USART2_IRQHandler
+ .thumb_set USART2_IRQHandler,Default_Handler
+
+ .weak USART3_IRQHandler
+ .thumb_set USART3_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak TIM8_BRK_TIM12_IRQHandler
+ .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
+
+ .weak TIM8_UP_TIM13_IRQHandler
+ .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
+
+ .weak TIM8_TRG_COM_TIM14_IRQHandler
+ .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
+
+ .weak TIM8_CC_IRQHandler
+ .thumb_set TIM8_CC_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream7_IRQHandler
+ .thumb_set DMA1_Stream7_IRQHandler,Default_Handler
+
+ .weak FMC_IRQHandler
+ .thumb_set FMC_IRQHandler,Default_Handler
+
+ .weak SDMMC1_IRQHandler
+ .thumb_set SDMMC1_IRQHandler,Default_Handler
+
+ .weak TIM5_IRQHandler
+ .thumb_set TIM5_IRQHandler,Default_Handler
+
+ .weak SPI3_IRQHandler
+ .thumb_set SPI3_IRQHandler,Default_Handler
+
+ .weak UART4_IRQHandler
+ .thumb_set UART4_IRQHandler,Default_Handler
+
+ .weak UART5_IRQHandler
+ .thumb_set UART5_IRQHandler,Default_Handler
+
+ .weak TIM6_DAC_IRQHandler
+ .thumb_set TIM6_DAC_IRQHandler,Default_Handler
+
+ .weak TIM7_IRQHandler
+ .thumb_set TIM7_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream0_IRQHandler
+ .thumb_set DMA2_Stream0_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream1_IRQHandler
+ .thumb_set DMA2_Stream1_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream2_IRQHandler
+ .thumb_set DMA2_Stream2_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream3_IRQHandler
+ .thumb_set DMA2_Stream3_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream4_IRQHandler
+ .thumb_set DMA2_Stream4_IRQHandler,Default_Handler
+
+ .weak ETH_IRQHandler
+ .thumb_set ETH_IRQHandler,Default_Handler
+
+ .weak ETH_WKUP_IRQHandler
+ .thumb_set ETH_WKUP_IRQHandler,Default_Handler
+
+ .weak FDCAN_CAL_IRQHandler
+ .thumb_set FDCAN_CAL_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream5_IRQHandler
+ .thumb_set DMA2_Stream5_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream6_IRQHandler
+ .thumb_set DMA2_Stream6_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream7_IRQHandler
+ .thumb_set DMA2_Stream7_IRQHandler,Default_Handler
+
+ .weak USART6_IRQHandler
+ .thumb_set USART6_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak OTG_HS_EP1_OUT_IRQHandler
+ .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
+
+ .weak OTG_HS_EP1_IN_IRQHandler
+ .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
+
+ .weak OTG_HS_WKUP_IRQHandler
+ .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
+
+ .weak OTG_HS_IRQHandler
+ .thumb_set OTG_HS_IRQHandler,Default_Handler
+
+ .weak DCMI_PSSI_IRQHandler
+ .thumb_set DCMI_PSSI_IRQHandler,Default_Handler
+
+ .weak CRYP_IRQHandler
+ .thumb_set CRYP_IRQHandler,Default_Handler
+
+ .weak HASH_RNG_IRQHandler
+ .thumb_set HASH_RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak UART7_IRQHandler
+ .thumb_set UART7_IRQHandler,Default_Handler
+
+ .weak UART8_IRQHandler
+ .thumb_set UART8_IRQHandler,Default_Handler
+
+ .weak SPI4_IRQHandler
+ .thumb_set SPI4_IRQHandler,Default_Handler
+
+ .weak SPI5_IRQHandler
+ .thumb_set SPI5_IRQHandler,Default_Handler
+
+ .weak SPI6_IRQHandler
+ .thumb_set SPI6_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak LTDC_IRQHandler
+ .thumb_set LTDC_IRQHandler,Default_Handler
+
+ .weak LTDC_ER_IRQHandler
+ .thumb_set LTDC_ER_IRQHandler,Default_Handler
+
+ .weak DMA2D_IRQHandler
+ .thumb_set DMA2D_IRQHandler,Default_Handler
+
+ .weak OCTOSPI1_IRQHandler
+ .thumb_set OCTOSPI1_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak CEC_IRQHandler
+ .thumb_set CEC_IRQHandler,Default_Handler
+
+ .weak I2C4_EV_IRQHandler
+ .thumb_set I2C4_EV_IRQHandler,Default_Handler
+
+ .weak I2C4_ER_IRQHandler
+ .thumb_set I2C4_ER_IRQHandler,Default_Handler
+
+ .weak SPDIF_RX_IRQHandler
+ .thumb_set SPDIF_RX_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT0_IRQHandler
+ .thumb_set DFSDM1_FLT0_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT1_IRQHandler
+ .thumb_set DFSDM1_FLT1_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT2_IRQHandler
+ .thumb_set DFSDM1_FLT2_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT3_IRQHandler
+ .thumb_set DFSDM1_FLT3_IRQHandler,Default_Handler
+
+ .weak SWPMI1_IRQHandler
+ .thumb_set SWPMI1_IRQHandler,Default_Handler
+
+ .weak TIM15_IRQHandler
+ .thumb_set TIM15_IRQHandler,Default_Handler
+
+ .weak TIM16_IRQHandler
+ .thumb_set TIM16_IRQHandler,Default_Handler
+
+ .weak TIM17_IRQHandler
+ .thumb_set TIM17_IRQHandler,Default_Handler
+
+ .weak MDIOS_WKUP_IRQHandler
+ .thumb_set MDIOS_WKUP_IRQHandler,Default_Handler
+
+ .weak MDIOS_IRQHandler
+ .thumb_set MDIOS_IRQHandler,Default_Handler
+
+ .weak MDMA_IRQHandler
+ .thumb_set MDMA_IRQHandler,Default_Handler
+
+ .weak SDMMC2_IRQHandler
+ .thumb_set SDMMC2_IRQHandler,Default_Handler
+
+ .weak HSEM1_IRQHandler
+ .thumb_set HSEM1_IRQHandler,Default_Handler
+
+ .weak ADC3_IRQHandler
+ .thumb_set ADC3_IRQHandler,Default_Handler
+
+ .weak DMAMUX2_OVR_IRQHandler
+ .thumb_set DMAMUX2_OVR_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel0_IRQHandler
+ .thumb_set BDMA_Channel0_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel1_IRQHandler
+ .thumb_set BDMA_Channel1_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel2_IRQHandler
+ .thumb_set BDMA_Channel2_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel3_IRQHandler
+ .thumb_set BDMA_Channel3_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel4_IRQHandler
+ .thumb_set BDMA_Channel4_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel5_IRQHandler
+ .thumb_set BDMA_Channel5_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel6_IRQHandler
+ .thumb_set BDMA_Channel6_IRQHandler,Default_Handler
+
+ .weak BDMA_Channel7_IRQHandler
+ .thumb_set BDMA_Channel7_IRQHandler,Default_Handler
+
+ .weak COMP1_IRQHandler
+ .thumb_set COMP1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LPTIM3_IRQHandler
+ .thumb_set LPTIM3_IRQHandler,Default_Handler
+
+ .weak LPTIM4_IRQHandler
+ .thumb_set LPTIM4_IRQHandler,Default_Handler
+
+ .weak LPTIM5_IRQHandler
+ .thumb_set LPTIM5_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak ECC_IRQHandler
+ .thumb_set ECC_IRQHandler,Default_Handler
+
+ .weak SAI4_IRQHandler
+ .thumb_set SAI4_IRQHandler,Default_Handler
+
+ .weak DTS_IRQHandler
+ .thumb_set DTS_IRQHandler,Default_Handler
+
+ .weak WAKEUP_PIN_IRQHandler
+ .thumb_set WAKEUP_PIN_IRQHandler,Default_Handler
+
+ .weak OCTOSPI2_IRQHandler
+ .thumb_set OCTOSPI2_IRQHandler,Default_Handler
+
+ .weak OTFDEC1_IRQHandler
+ .thumb_set OTFDEC1_IRQHandler,Default_Handler
+
+ .weak OTFDEC2_IRQHandler
+ .thumb_set OTFDEC2_IRQHandler,Default_Handler
+
+ .weak FMAC_IRQHandler
+ .thumb_set FMAC_IRQHandler,Default_Handler
+
+ .weak CORDIC_IRQHandler
+ .thumb_set CORDIC_IRQHandler,Default_Handler
+
+ .weak UART9_IRQHandler
+ .thumb_set UART9_IRQHandler,Default_Handler
+
+ .weak USART10_IRQHandler
+ .thumb_set USART10_IRQHandler,Default_Handler
+
+ .weak I2C5_EV_IRQHandler
+ .thumb_set I2C5_EV_IRQHandler,Default_Handler
+
+ .weak I2C5_ER_IRQHandler
+ .thumb_set I2C5_ER_IRQHandler,Default_Handler
+
+ .weak FDCAN3_IT0_IRQHandler
+ .thumb_set FDCAN3_IT0_IRQHandler,Default_Handler
+
+ .weak FDCAN3_IT1_IRQHandler
+ .thumb_set FDCAN3_IT1_IRQHandler,Default_Handler
+
+ .weak TIM23_IRQHandler
+ .thumb_set TIM23_IRQHandler,Default_Handler
+
+ .weak TIM24_IRQHandler
+ .thumb_set TIM24_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/panda/board/stm32h7/stm32h7x5_flash.ld b/panda/board/stm32h7/stm32h7x5_flash.ld
new file mode 100644
index 000000000..2c0c19d09
--- /dev/null
+++ b/panda/board/stm32h7/stm32h7x5_flash.ld
@@ -0,0 +1,221 @@
+/*
+******************************************************************************
+**
+
+** File : LinkerScript.ld
+**
+** Author : Auto-generated by System Workbench for STM32
+**
+** Abstract : Linker script for STM32H735ZGTx series
+** 1024Kbytes FLASH and 560Kbytes RAM
+**
+** Set heap size, stack size and stack location according
+** to application requirements.
+**
+** Set memory bank area and size if external memory is used.
+**
+** Target : STMicroelectronics STM32
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+** @attention
+**
+** © COPYRIGHT(c) 2019 STMicroelectronics
+**
+** Redistribution and use in source and binary forms, with or without modification,
+** are permitted provided that the following conditions are met:
+** 1. Redistributions of source code must retain the above copyright notice,
+** this list of conditions and the following disclaimer.
+** 2. Redistributions in binary form must reproduce the above copyright notice,
+** this list of conditions and the following disclaimer in the documentation
+** and/or other materials provided with the distribution.
+** 3. Neither the name of STMicroelectronics nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+enter_bootloader_mode = 0x38001FFC;
+_estack = 0x20020000; /* end of RAM */
+_app_start = 0x08020000; /* Reserve Sector 0(128K) for bootloader */
+
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x200; /* required amount of heap */
+_Min_Stack_Size = 0x400; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+/* RAM */
+BACKUP_SRAM (xrw) : ORIGIN = 0x38800000, LENGTH = 4K /* Backup SRAM(4kb) */
+SRAM4 (xrw) : ORIGIN = 0x38000000, LENGTH = 16K /* SRAM4(16kb) best for BDMA and SDMMC1*/
+SRAM12 (xrw) : ORIGIN = 0x30000000, LENGTH = 32K /* SRAM1(16kb) + SRAM2(16kb), not for BDMA or SDMMC1 */
+AXISRAM (xrw) : ORIGIN = 0x24000000, LENGTH = 320K /* AXI SRAM */
+DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K /* DTCM */
+
+/* Code */
+SYSTEM (rx) : ORIGIN = 0x1FF00000, LENGTH = 128K /* System memory */
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
+ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >DTCMRAM AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >DTCMRAM
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >DTCMRAM
+
+ .itcmram (NOLOAD) :
+ {
+ . = ALIGN(4);
+ *(.itcmram*)
+ } >ITCMRAM
+
+ .axisram (NOLOAD) :
+ {
+ . = ALIGN(4);
+ *(.axisram*)
+ } >AXISRAM
+
+ .sram12 (NOLOAD) :
+ {
+ . = ALIGN(4);
+ *(.sram12*)
+ } >SRAM12
+
+ .sram4 (NOLOAD) :
+ {
+ . = ALIGN(4);
+ *(.sram4*)
+ } >SRAM4
+
+ .backup_sram (NOLOAD) :
+ {
+ . = ALIGN(4);
+ *(.backup_sram*)
+ } >BACKUP_SRAM
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+}
+
+
diff --git a/panda/certs/debug b/panda/certs/debug
new file mode 100644
index 000000000..39864b6b1
--- /dev/null
+++ b/panda/certs/debug
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC948lnRo4x44Rd7Y8bQAML4aKDC4XRx958fHV8K6+FbCaP1Z42
+U2kX0yygak0LjoDutpgObmGHZA+Iz3HeUD6VGjr/teN24vPk+A95cRsjt8rgmGQ9
+6HNjaNgjR+gl1F9XxFimMzir82Xpl1ekTueJNXa7ia5HVH1nFdiksOKHGQIDAQAB
+AoGAQuPw2I6EHJLW1/eNB75e1FqhUqRGeYV8nEGDaUBCTi+wzc4kM2LijF/5QnDv
+vvht9qkfm0XK2VSoHDtnEzcVM/l1ksb68n4R/1nUooAWY6cQI7dCSk/A6yS1EJFg
+BXsgGbT/65khw9pzBW2zVtMVcVNWFayqfCO1I9WcDdA1x1kCQQDfrhoZTZNoDEUE
+JKM4fiUdWr1h3Aw8KLJFFexSWeGDwo+qqnujYcKWkHa9qaH1RG5x8Kir9s9Oi4Js
+mzKwov8fAkEA2VPJPWxJ4vVQpXle6wC1nyoL7s739yxMWFcabvkzDDhlIVBNdVJd
+gZKsFWV7QnVNdDMjn9D27FwKu3i2D+kKxwJBANp1SMojqO765MEKI1t+YDNONx6H
+cm+i85Fjuv4nCIjOEdCGVuCYDxtMFpxgO2y3HAMuHx5sm8XDnWsDHLvFRdMCQD7V
+XqWHnYUk8AAnqy2+ssQl3/VXmZG5GQmhhV74Za3u0C5ljT+SZL6FrYMyKAT67T3f
+WzllrT6BDglNyTWoZxkCQQCt0XSoGM3603GGYNt6AUlGSgtXSo/2Px7odGUtQoKA
+FH9q6FVMYpQJ38spZxIGufZJmLP8LLg6YIWJj1F+akxr
+-----END RSA PRIVATE KEY-----
diff --git a/panda/certs/debug.pub b/panda/certs/debug.pub
new file mode 100644
index 000000000..00e219d7b
--- /dev/null
+++ b/panda/certs/debug.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC948lnRo4x44Rd7Y8bQAML4aKDC4XRx958fHV8K6+FbCaP1Z42U2kX0yygak0LjoDutpgObmGHZA+Iz3HeUD6VGjr/teN24vPk+A95cRsjt8rgmGQ96HNjaNgjR+gl1F9XxFimMzir82Xpl1ekTueJNXa7ia5HVH1nFdiksOKHGQ== batman@y840
diff --git a/panda/certs/release.pub b/panda/certs/release.pub
new file mode 100644
index 000000000..19066e29a
--- /dev/null
+++ b/panda/certs/release.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDGN9GU2nOc0kKq6vdZI5qUMzHt234ngqofrgCFFxL0D2Whex0zACp9gar0HZp+bvtpoSgU/Ev8wexNKr+A9QTradljiuxi5ctrOra9k+wxqNj63Wrcu4+wU5UnJEVf/buV4jCOFffMT8z3PO4imt8LzHuEIC/m/ASKVYyvuvBRQQ== batman@y840
diff --git a/panda/crypto/sign.py b/panda/crypto/sign.py
new file mode 100755
index 000000000..daea38630
--- /dev/null
+++ b/panda/crypto/sign.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+import os
+import sys
+import struct
+import hashlib
+from Crypto.PublicKey import RSA
+import binascii
+
+# increment this to make new hardware not run old versions
+VERSION = 2
+
+if __name__ == "__main__":
+ with open(sys.argv[3]) as k:
+ rsa = RSA.importKey(k.read())
+
+ with open(sys.argv[1], "rb") as f:
+ dat = f.read()
+
+ print("signing", len(dat), "bytes")
+
+ with open(sys.argv[2], "wb") as f:
+ if os.getenv("SETLEN") is not None:
+ # add the version at the end
+ dat += b"VERS" + struct.pack("I", VERSION)
+ # add the length at the beginning
+ x = struct.pack("I", len(dat)) + dat[4:]
+ # mock signature of dat[4:]
+ dd = hashlib.sha1(dat[4:]).digest()
+ else:
+ x = dat
+ dd = hashlib.sha1(dat).digest()
+
+ print("hash:", str(binascii.hexlify(dd), "utf-8"))
+ dd = b"\x00\x01" + b"\xff" * 0x69 + b"\x00" + dd
+ rsa_out = pow(int.from_bytes(dd, byteorder='big', signed=False), rsa.d, rsa.n)
+ sig = (hex(rsa_out)[2:].rjust(0x100, '0'))
+ x += binascii.unhexlify(sig)
+ f.write(x)
diff --git a/panda/docs/CANPacket_structure.png b/panda/docs/CANPacket_structure.png
new file mode 100644
index 000000000..7dd134316
Binary files /dev/null and b/panda/docs/CANPacket_structure.png differ
diff --git a/panda/docs/USB_packet_structure.png b/panda/docs/USB_packet_structure.png
new file mode 100644
index 000000000..30e848c3f
Binary files /dev/null and b/panda/docs/USB_packet_structure.png differ
diff --git a/panda/drivers/spi/.gitignore b/panda/drivers/spi/.gitignore
new file mode 100644
index 000000000..49dc09d89
--- /dev/null
+++ b/panda/drivers/spi/.gitignore
@@ -0,0 +1,7 @@
+spidev.c
+*.ko
+*.cmd
+*.mod
+*.symvers
+*.order
+*.mod.c
diff --git a/panda/drivers/spi/Makefile b/panda/drivers/spi/Makefile
new file mode 100644
index 000000000..9a2a0abf6
--- /dev/null
+++ b/panda/drivers/spi/Makefile
@@ -0,0 +1,14 @@
+obj-m += spidev_panda.o
+
+KDIR := /lib/modules/$(shell uname -r)/build
+PWD := $(shell pwd)
+
+# GCC9 bug, apply kernel patch instead?
+# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0b999ae3614d09d97a1575936bcee884f912b10e
+ccflags-y := -Wno-missing-attributes
+
+default:
+ $(MAKE) -C $(KDIR) M=$(PWD) modules
+
+clean:
+ $(MAKE) -C $(KDIR) M=$(PWD) clean
diff --git a/panda/drivers/spi/load.sh b/panda/drivers/spi/load.sh
new file mode 100755
index 000000000..910ac8728
--- /dev/null
+++ b/panda/drivers/spi/load.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+make -j8
+
+sudo su -c "echo spi0.0 > /sys/bus/spi/drivers/spidev/unbind" || true
+
+sudo dmesg -C
+
+#sudo rmmod -f spidev_panda
+sudo rmmod spidev_panda || true
+sudo insmod spidev_panda.ko
+
+sudo su -c "echo 'file $DIR/spidev_panda.c +p' > /sys/kernel/debug/dynamic_debug/control"
+sudo su -c "echo 'file $DIR/spi_panda.h +p' > /sys/kernel/debug/dynamic_debug/control"
+
+sudo lsmod
+
+echo "loaded"
+ls -la /dev/spi*
+sudo chmod 666 /dev/spi*
+ipython -c "from panda import Panda; print(Panda.list())"
+KERN=1 ipython -c "from panda import Panda; print(Panda.list())"
+dmesg
diff --git a/panda/drivers/spi/patch b/panda/drivers/spi/patch
new file mode 100644
index 000000000..a14630342
--- /dev/null
+++ b/panda/drivers/spi/patch
@@ -0,0 +1,33 @@
+53c53,54
+< #define SPIDEV_MAJOR 153 /* assigned */
+---
+> int SPIDEV_MAJOR = 0;
+> //#define SPIDEV_MAJOR 153 /* assigned */
+354a356,358
+>
+> #include "spi_panda.h"
+>
+413,414c417,419
+< retval = __put_user((spi->mode & SPI_LSB_FIRST) ? 1 : 0,
+< (__u8 __user *)arg);
+---
+> retval = panda_transfer(spidev, spi, arg);
+> //retval = __put_user((spi->mode & SPI_LSB_FIRST) ? 1 : 0,
+> // (__u8 __user *)arg);
+697,698d701
+< { .compatible = "rohm,dh2228fv" },
+< { .compatible = "lineartechnology,ltc2488" },
+831c834
+< .name = "spidev",
+---
+> .name = "spidev_panda",
+856c859
+< status = register_chrdev(SPIDEV_MAJOR, "spi", &spidev_fops);
+---
+> status = register_chrdev(0, "spi", &spidev_fops);
+860c863,865
+< spidev_class = class_create(THIS_MODULE, "spidev");
+---
+> SPIDEV_MAJOR = status;
+>
+> spidev_class = class_create(THIS_MODULE, "spidev_panda");
diff --git a/panda/drivers/spi/pull-src.sh b/panda/drivers/spi/pull-src.sh
new file mode 100755
index 000000000..64dac9bca
--- /dev/null
+++ b/panda/drivers/spi/pull-src.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+rm -f spidev.c
+wget https://raw.githubusercontent.com/commaai/agnos-kernel-sdm845/master/drivers/spi/spidev.c
+
+# diff spidev.c spidev_panda.c > patch
+# git diff --no-index spidev.c spidev_panda.c
+patch -o spidev_panda.c spidev.c -i patch
diff --git a/panda/examples/__init__.py b/panda/examples/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/panda/examples/can_bit_transition.md b/panda/examples/can_bit_transition.md
new file mode 100644
index 000000000..fa0a6c6bb
--- /dev/null
+++ b/panda/examples/can_bit_transition.md
@@ -0,0 +1,25 @@
+# How to use can_bit_transition.py to reverse engineer a single bit field
+
+Let's say our goal is to find a brake pedal signal (caused by your foot pressing the brake pedal vs adaptive cruise control braking).
+
+The following process will allow you to quickly find bits that are always 0 during a period of time (when you know you were not pressing the brake with your foot) and always 1 in a different period of time (when you know you were pressing the brake with your foot).
+
+Open up a drive in cabana where you can find a place you used the brake pedal and another place where you did not use the brake pedal (and you can identify when you were on the brake pedal and when you were not). You may want to go out for a drive and put something in front of the camera after you put your foot on the brake and take it away before you take your foot off the brake so you can easily identify exactly when you had your foot on the brake based on the video in cabana. This is critical because this script needs the brake signal to always be high the entire time for one of the time frames. A 10 second time frame worked well for me.
+
+I found a drive where I knew I was not pressing the brake between timestamp 50.0 thru 65.0 and I was pressing the brake between timestamp 69.0 thru 79.0. Determine what the timestamps are in cabana by plotting any message and putting your mouse over the plot at the location you want to discover the timestamp. The tool tip on mouse hover has the format: timestamp: value
+
+Now download the log from cabana (Save Log button) and run the script passing in the timestamps
+(replace csv file name with cabana log you downloaded and time ranges with your own)
+```
+./can_bit_transition.py ./honda_crv_ex_2017_can-1520354796875.csv 50.0-65.0 69.0-79.0
+```
+
+The script will output bits that were always low in the first time range and always high in the second time range (and vice versa)
+```
+id 17c 0 -> 1 at byte 4 bitmask 1
+id 17c 0 -> 1 at byte 6 bitmask 32
+id 221 1 -> 0 at byte 0 bitmask 4
+id 1be 0 -> 1 at byte 0 bitmask 16
+```
+
+Now I go back to cabana and graph the above bits by searching for the message by id, double clicking on the appropriate bit, and then selecting "show plot". I already knew that message id 0x17c is both user brake and adaptive cruise control braking combined, so I plotted one of those signals along side 0x221 and 0x1be. By replaying a drive I could see that 0x221 was not a brake signal (when high at random times that did not correspond to braking). Next I looked at 0x1be and I found it was the brake pedal signal I was looking for (went high whenever I pressed the brake pedal and did not go high when adaptive cruise control was braking).
\ No newline at end of file
diff --git a/panda/examples/can_bit_transition.py b/panda/examples/can_bit_transition.py
new file mode 100755
index 000000000..1e7bad54e
--- /dev/null
+++ b/panda/examples/can_bit_transition.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+import csv
+import sys
+
+CSV_KEYS = {
+ "logger": {
+ "time": "Time",
+ "message_id": "MessageID",
+ "data": "Message",
+ "bus": "Bus"
+ },
+ "cabana": {
+ "time": "time",
+ "message_id": "addr",
+ "data": "data",
+ "bus": "bus"
+ }
+}
+
+
+class Message():
+ """Details about a specific message ID."""
+
+ def __init__(self, message_id):
+ self.message_id = message_id
+ self.ones = [0] * 64 # bit set if 1 is always seen
+ self.zeros = [0] * 64 # bit set if 0 is always seen
+
+ def printBitDiff(self, other):
+ """Prints bits that transition from always zero to always 1 and vice versa."""
+ for i in range(len(self.ones)):
+ zero_to_one = other.zeros[i] & self.ones[i]
+ if zero_to_one:
+ print('id %s 0 -> 1 at byte %d bitmask %d' % (self.message_id, i, zero_to_one))
+ one_to_zero = other.ones[i] & self.zeros[i]
+ if one_to_zero:
+ print('id %s 1 -> 0 at byte %d bitmask %d' % (self.message_id, i, one_to_zero))
+
+
+class Info():
+ """A collection of Messages."""
+
+ def __init__(self):
+ self.messages = {} # keyed by MessageID
+
+ def load(self, filename, start, end):
+ """Given a CSV file, adds information about message IDs and their values."""
+ with open(filename, newline='') as inp:
+ reader = csv.DictReader(inp)
+ dtype = None
+ for row in reader:
+ if not len(row):
+ continue
+ if dtype is None:
+ dtype = "logger" if "Bus" in row else "cabana"
+
+ time = float(row[CSV_KEYS[dtype]["time"]])
+ bus = int(row[CSV_KEYS[dtype]["bus"]])
+ if time < start or bus > 127:
+ continue
+ elif time > end:
+ break
+
+ message_id = row[CSV_KEYS[dtype]["message_id"]]
+ if message_id.startswith('0x'):
+ message_id = message_id[2:] # remove leading '0x'
+ else:
+ message_id = hex(int(message_id))[2:] # old message IDs are in decimal
+ message_id = f'{bus}:{message_id}'
+
+ data = row[CSV_KEYS[dtype]["data"]]
+ if data.startswith('0x'):
+ data = data[2:] # remove leading '0x'
+ else:
+ data = data
+ new_message = False
+ if message_id not in self.messages:
+ self.messages[message_id] = Message(message_id)
+ new_message = True
+ message = self.messages[message_id]
+ bts = bytearray.fromhex(data)
+ for i in range(len(bts)):
+ ones = int(bts[i])
+ message.ones[i] = ones if new_message else message.ones[i] & ones
+ # Inverts the data and masks it to a byte to get the zeros as ones.
+ zeros = (~int(bts[i])) & 0xff
+ message.zeros[i] = zeros if new_message else message.zeros[i] & zeros
+
+def PrintUnique(log_file, low_range, high_range):
+ # find messages with bits that are always low
+ start, end = list(map(float, low_range.split('-')))
+ low = Info()
+ low.load(log_file, start, end)
+ # find messages with bits that are always high
+ start, end = list(map(float, high_range.split('-')))
+ high = Info()
+ high.load(log_file, start, end)
+ # print messages that go from low to high
+ found = False
+ for message_id in sorted(high.messages, key=lambda x: int(x.split(':')[1], 16)):
+ if message_id in low.messages:
+ high.messages[message_id].printBitDiff(low.messages[message_id])
+ found = True
+ if not found:
+ print('No messages that transition from always low to always high found!')
+
+if __name__ == "__main__":
+ if len(sys.argv) < 4:
+ print('Usage:\n%s log.csv - -' % sys.argv[0])
+ sys.exit(0)
+ PrintUnique(sys.argv[1], sys.argv[2], sys.argv[3])
diff --git a/panda/examples/can_logger.py b/panda/examples/can_logger.py
new file mode 100755
index 000000000..2bf4359ca
--- /dev/null
+++ b/panda/examples/can_logger.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+
+import csv
+import time
+from panda import Panda
+
+def can_logger():
+ p = Panda()
+
+ try:
+ outputfile = open('output.csv', 'w')
+ csvwriter = csv.writer(outputfile)
+ # Write Header
+ csvwriter.writerow(['Bus', 'MessageID', 'Message', 'MessageLength', 'Time'])
+ print("Writing csv file output.csv. Press Ctrl-C to exit...\n")
+
+ bus0_msg_cnt = 0
+ bus1_msg_cnt = 0
+ bus2_msg_cnt = 0
+
+ start_time = time.time()
+ while True:
+ can_recv = p.can_recv()
+
+ for address, dat, src in can_recv:
+ csvwriter.writerow(
+ [str(src), str(hex(address)), f"0x{dat.hex()}", len(dat), str(time.time() - start_time)])
+
+ if src == 0:
+ bus0_msg_cnt += 1
+ elif src == 1:
+ bus1_msg_cnt += 1
+ elif src == 2:
+ bus2_msg_cnt += 1
+
+ print(f"Message Counts... Bus 0: {bus0_msg_cnt} Bus 1: {bus1_msg_cnt} Bus 2: {bus2_msg_cnt}", end='\r')
+
+ except KeyboardInterrupt:
+ print(f"\nNow exiting. Final message Counts... Bus 0: {bus0_msg_cnt} Bus 1: {bus1_msg_cnt} Bus 2: {bus2_msg_cnt}")
+ outputfile.close()
+
+if __name__ == "__main__":
+ can_logger()
diff --git a/panda/examples/can_unique.md b/panda/examples/can_unique.md
new file mode 100644
index 000000000..4d8ac460e
--- /dev/null
+++ b/panda/examples/can_unique.md
@@ -0,0 +1,103 @@
+# How to use can_unique.py to reverse engineer a single bit field
+
+Let's say our goal is to find the CAN message indicating that the driver's door is either open or closed.
+The following process is great for simple single-bit messages.
+However for frequently changing values, such as RPM or speed, Cabana's graphical plots are probably better to use.
+
+
+First record a few minutes of background CAN messages with all the doors closed and save it in background.csv:
+```
+./can_logger.py
+mv output.csv background.csv
+```
+Then run can_logger.py for a few seconds while performing the action you're interested, such as opening and then closing the
+front-left door and save it as door-fl-1.csv
+Repeat the process and save it as door-f1-2.csv to have an easy way to confirm any suspicions.
+
+Now we'll use can_unique.py to look for unique bits:
+```
+$ ./can_unique.py door-fl-1.csv background*
+id 820 new one at byte 2 bitmask 2
+id 520 new one at byte 3 bitmask 7
+id 520 new zero at byte 3 bitmask 8
+id 520 new one at byte 5 bitmask 6
+id 520 new zero at byte 5 bitmask 9
+id 559 new zero at byte 6 bitmask 4
+id 804 new one at byte 5 bitmask 2
+id 804 new zero at byte 5 bitmask 1
+
+$ ./can_unique.py door-fl-2.csv background*
+id 672 new one at byte 3 bitmask 3
+id 820 new one at byte 2 bitmask 2
+id 520 new one at byte 3 bitmask 7
+id 520 new zero at byte 3 bitmask 8
+id 520 new one at byte 5 bitmask 6
+id 520 new zero at byte 5 bitmask 9
+id 559 new zero at byte 6 bitmask 4
+```
+
+One of these bits hopefully indicates that the driver's door is open.
+Let's go through each message ID to figure out which one is correct.
+We expect any correct bits to have changed in both runs.
+We can rule out 804 because it only occurred in the first run.
+We can rule out 672 because it only occurred in the second run.
+That leaves us with these message IDs: 820, 520, 559. Let's take a closer look at each one.
+
+```
+$ fgrep ,559, door-fl-1.csv |head
+0,559,00ff0000000024f0
+0,559,00ff000000004464
+0,559,00ff0000000054a9
+0,559,00ff0000000064e3
+0,559,00ff00000000742e
+0,559,00ff000000008451
+0,559,00ff00000000949c
+0,559,00ff00000000a4d6
+0,559,00ff00000000b41b
+0,559,00ff00000000c442
+```
+Message ID 559 looks like an incrementing value, so it's not what we're looking for.
+
+```
+$ fgrep ,520, door-fl-2.csv
+0,520,26ff00f8a1890000
+0,520,26ff00f8a2890000
+0,520,26ff00f8a2890000
+0,520,26ff00f8a1890000
+0,520,26ff00f8a2890000
+0,520,26ff00f8a1890000
+0,520,26ff00f8a2890000
+0,520,26ff00f8a1890000
+0,520,26ff00f8a2890000
+0,520,26ff00f8a1890000
+0,520,26ff00f8a2890000
+0,520,26ff00f8a1890000
+```
+Message ID 520 oscillates between two values. However I only opened and closed the door once, so this is probably not it.
+
+```
+$ fgrep ,820, door-fl-1.csv
+0,820,44000100a500c802
+0,820,44000100a500c803
+0,820,44000300a500c803
+0,820,44000300a500c802
+0,820,44000300a500c802
+0,820,44000300a500c802
+0,820,44000100a500c802
+0,820,44000100a500c802
+0,820,44000100a500c802
+```
+Message ID 820 looks promising! It starts off at 44000100a500c802 when the door is closed.
+When the door is open it goes to 44000300a500c802.
+Then when the door is closed again, it goes back to 44000100a500c802.
+Let's confirm by looking at the data from our other run:
+```
+$ fgrep ,820, door-fl-2.csv
+0,820,44000100a500c802
+0,820,44000300a500c802
+0,820,44000100a500c802
+```
+Perfect! We now know that message id 820 at byte 2 bitmask 2 is set if the driver's door is open.
+If we repeat the process with the front passenger's door,
+then we'll find that message id 820 at byte 2 bitmask 4 is set if the front-right door is open.
+This confirms our finding because it's common for similar signals to be near each other.
diff --git a/panda/examples/can_unique.py b/panda/examples/can_unique.py
new file mode 100755
index 000000000..05977afb0
--- /dev/null
+++ b/panda/examples/can_unique.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+
+# Given an interesting CSV file of CAN messages and a list of background CAN
+# messages, print which bits in the interesting file have never appeared
+# in the background files.
+
+# Expects the CSV file to be in one of the following formats:
+
+# can_logger.py
+# Bus,MessageID,Message,MessageLength
+# 0,0x292,0x040000001068,6
+
+# The old can_logger.py format is also supported:
+# Bus,MessageID,Message
+# 0,344,c000c00000000000
+
+# Cabana "Save Log" format
+# time,addr,bus,data
+# 240.47911496100002,53,0,0acc0ade0074bf9e
+
+
+import csv
+import sys
+
+class Message():
+ """Details about a specific message ID."""
+
+ def __init__(self, message_id):
+ self.message_id = message_id
+ self.data = {} # keyed by hex string encoded message data
+ self.ones = [0] * 64 # bit set if 1 is seen
+ self.zeros = [0] * 64 # bit set if 0 has been seen
+
+ def printBitDiff(self, other):
+ """Prints bits that are set or cleared compared to other background."""
+ for i in range(len(self.ones)):
+ new_ones = ((~other.ones[i]) & 0xff) & self.ones[i]
+ if new_ones:
+ print('id %s new one at byte %d bitmask %d' % (
+ self.message_id, i, new_ones))
+ new_zeros = ((~other.zeros[i]) & 0xff) & self.zeros[i]
+ if new_zeros:
+ print('id %s new zero at byte %d bitmask %d' % (
+ self.message_id, i, new_zeros))
+
+
+class Info():
+ """A collection of Messages."""
+
+ def __init__(self):
+ self.messages = {} # keyed by MessageID
+
+ def load(self, filename):
+ """Given a CSV file, adds information about message IDs and their values."""
+ with open(filename) as inp:
+ reader = csv.reader(inp)
+ header = next(reader, None)
+ if header[0] == 'time':
+ self.cabana(reader)
+ else:
+ self.logger(reader)
+
+ def cabana(self, reader):
+ for row in reader:
+ bus = row[2]
+ message_id = hex(int(row[1]))[2:]
+ message_id = f'{bus}:{message_id}'
+ data = row[3]
+ self.store(message_id, data)
+
+ def logger(self, reader):
+ for row in reader:
+ bus = row[0]
+ if row[1].startswith('0x'):
+ message_id = row[1][2:] # remove leading '0x'
+ else:
+ message_id = hex(int(row[1]))[2:] # old message IDs are in decimal
+ message_id = f'{bus}:{message_id}'
+ if row[1].startswith('0x'):
+ data = row[2][2:] # remove leading '0x'
+ else:
+ data = row[2]
+ self.store(message_id, data)
+
+ def store(self, message_id, data):
+ if message_id not in self.messages:
+ self.messages[message_id] = Message(message_id)
+ message = self.messages[message_id]
+ if data not in self.messages[message_id].data:
+ message.data[data] = True
+ bts = bytearray.fromhex(data)
+ for i in range(len(bts)):
+ message.ones[i] = message.ones[i] | int(bts[i])
+ # Inverts the data and masks it to a byte to get the zeros as ones.
+ message.zeros[i] = message.zeros[i] | ((~int(bts[i])) & 0xff)
+
+
+def PrintUnique(interesting_file, background_files):
+ background = Info()
+ for background_file in background_files:
+ background.load(background_file)
+ interesting = Info()
+ interesting.load(interesting_file)
+ for message_id in sorted(interesting.messages):
+ if message_id not in background.messages:
+ print('New message_id: %s' % message_id)
+ else:
+ interesting.messages[message_id].printBitDiff(
+ background.messages[message_id])
+
+
+if __name__ == "__main__":
+ if len(sys.argv) < 3:
+ print('Usage:\n%s interesting.csv background*.csv' % sys.argv[0])
+ sys.exit(0)
+ PrintUnique(sys.argv[1], sys.argv[2:])
diff --git a/panda/examples/query_fw_versions.py b/panda/examples/query_fw_versions.py
new file mode 100755
index 000000000..cde0e4f0b
--- /dev/null
+++ b/panda/examples/query_fw_versions.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+import argparse
+from tqdm import tqdm
+from iqdbc.car.carlog import carlog
+from iqdbc.car.uds import UdsClient, MessageTimeoutError, NegativeResponseError, InvalidSubAddressError, \
+ SESSION_TYPE, DATA_IDENTIFIER_TYPE
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--rxoffset", default="")
+ parser.add_argument("--nonstandard", action="store_true")
+ parser.add_argument("--no-obd", action="store_true", help="Bus 1 will not be multiplexed to the OBD-II port")
+ parser.add_argument("--no-29bit", action="store_true", help="29 bit addresses will not be queried")
+ parser.add_argument("--debug", action="store_true")
+ parser.add_argument("--addr")
+ parser.add_argument("--sub_addr", "--subaddr", help="A hex sub-address or `scan` to scan the full sub-address range")
+ parser.add_argument("--bus")
+ parser.add_argument('-s', '--serial', help="Serial number of panda to use")
+ args = parser.parse_args()
+
+ if args.debug:
+ carlog.setLevel('DEBUG')
+
+ if args.addr:
+ addrs = [int(args.addr, base=16)]
+ else:
+ addrs = [0x700 + i for i in range(256)]
+ if not args.no_29bit:
+ addrs += [0x18da0000 + (i << 8) + 0xf1 for i in range(256)]
+ results = {}
+
+ sub_addrs: list[int | None] = [None]
+ if args.sub_addr:
+ if args.sub_addr == "scan":
+ sub_addrs = list(range(0xff + 1))
+ else:
+ sub_addrs = [int(args.sub_addr, base=16)]
+ if sub_addrs[0] > 0xff: # type: ignore
+ print(f"Invalid sub-address: 0x{sub_addrs[0]:X}, needs to be in range 0x0 to 0xff")
+ parser.print_help()
+ exit()
+
+ uds_data_ids = {}
+ for std_id in DATA_IDENTIFIER_TYPE:
+ uds_data_ids[std_id.value] = std_id.name
+ if args.nonstandard:
+ for uds_id in range(0xf100, 0xf180):
+ uds_data_ids[uds_id] = "IDENTIFICATION_OPTION_VEHICLE_MANUFACTURER_SPECIFIC_DATA_IDENTIFIER"
+ for uds_id in range(0xf1a0, 0xf1f0):
+ uds_data_ids[uds_id] = "IDENTIFICATION_OPTION_VEHICLE_MANUFACTURER_SPECIFIC"
+ for uds_id in range(0xf1f0, 0xf200):
+ uds_data_ids[uds_id] = "IDENTIFICATION_OPTION_SYSTEM_SUPPLIER_SPECIFIC"
+
+ panda_serials = Panda.list()
+ if args.serial is None and len(panda_serials) > 1:
+ print("\nMultiple pandas found, choose one:")
+ for serial in panda_serials:
+ with Panda(serial) as panda:
+ print(f" {serial}: internal={panda.is_internal()}")
+ print()
+ parser.print_help()
+ exit()
+
+ panda = Panda(serial=args.serial)
+ panda.set_safety_mode(CarParams.SafetyModel.elm327, 1 if args.no_obd else 0)
+ print("querying addresses ...")
+ with tqdm(addrs) as t:
+ for addr in t:
+ # skip functional broadcast addrs
+ if addr == 0x7df or addr == 0x18db33f1:
+ continue
+
+ if args.bus:
+ bus = int(args.bus)
+ else:
+ bus = 1
+ rx_addr = addr + int(args.rxoffset, base=16) if args.rxoffset else None
+
+ # Try all sub-addresses for addr. By default, this is None
+ for sub_addr in sub_addrs:
+ sub_addr_str = hex(sub_addr) if sub_addr is not None else None
+ t.set_description(f"{hex(addr)}, {sub_addr_str}")
+ uds_client = UdsClient(panda, addr, rx_addr, bus, sub_addr=sub_addr, timeout=0.2)
+ # Check for anything alive at this address, and switch to the highest
+ # available diagnostic session without security access
+ try:
+ uds_client.tester_present()
+ uds_client.diagnostic_session_control(SESSION_TYPE.DEFAULT)
+ uds_client.diagnostic_session_control(SESSION_TYPE.EXTENDED_DIAGNOSTIC)
+ except NegativeResponseError:
+ pass
+ except MessageTimeoutError:
+ continue
+ except InvalidSubAddressError as e:
+ print(f'*** Skipping address {hex(addr)}: {e}')
+ break
+
+ # Run queries against all standard UDS data identifiers, plus selected
+ # non-standardized identifier ranges if requested
+ resp = {}
+ for uds_data_id in sorted(uds_data_ids):
+ try:
+ data = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE(uds_data_id))
+ if data:
+ resp[uds_data_id] = data
+ except (NegativeResponseError, MessageTimeoutError, InvalidSubAddressError):
+ pass
+
+ if resp.keys():
+ results[(addr, sub_addr)] = resp
+
+ if len(results.items()):
+ for (addr, sub_addr), resp in results.items():
+ sub_addr_str = f", sub-address 0x{sub_addr:X}" if sub_addr is not None else ""
+ print(f"\n\n*** Results for address 0x{addr:X}{sub_addr_str} ***\n\n")
+ for rid, dat in resp.items():
+ print(f"0x{rid:02X} {uds_data_ids[rid]}: {dat}")
+ else:
+ print("no fw versions found!")
diff --git a/panda/examples/query_vin_and_stats.py b/panda/examples/query_vin_and_stats.py
new file mode 100755
index 000000000..0477db096
--- /dev/null
+++ b/panda/examples/query_vin_and_stats.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+import time
+import struct
+from iqdbc.car.structs import CarParams
+from panda import Panda
+from hexdump import hexdump
+from iqdbc.car.isotp import isotp_send, isotp_recv
+
+# 0x7e0 = Toyota
+# 0x18DB33F1 for Honda?
+
+
+def get_current_data_for_pid(pid):
+ # 01 xx = Show current data
+ isotp_send(panda, b"\x01" + bytes([pid]), 0x7e0)
+ return isotp_recv(panda, 0x7e8)
+
+def get_supported_pids():
+ ret = []
+ pid = 0
+ while 1:
+ supported = struct.unpack(">I", get_current_data_for_pid(pid)[2:])[0]
+ for i in range(1 + pid, 0x21 + pid):
+ if supported & 0x80000000:
+ ret.append(i)
+ supported <<= 1
+ pid += 0x20
+ if pid not in ret:
+ break
+ return ret
+
+if __name__ == "__main__":
+ panda = Panda()
+ panda.set_safety_mode(CarParams.SafetyModel.elm327)
+ panda.can_clear(0)
+
+ # 09 02 = Get VIN
+ isotp_send(panda, b"\x09\x02", 0x7df)
+ ret = isotp_recv(panda, 0x7e8)
+ hexdump(ret)
+ print("VIN: %s" % "".join(map(chr, ret[:2])))
+
+ # 03 = get DTCS
+ isotp_send(panda, b"\x03", 0x7e0)
+ dtcs = isotp_recv(panda, 0x7e8)
+ print("DTCs:", "".join(map(chr, dtcs[:2])))
+
+ supported_pids = get_supported_pids()
+ print("Supported PIDs:", supported_pids)
+
+ while 1:
+ speed = struct.unpack(">B", get_current_data_for_pid(13)[2:])[0] # kph
+ rpm = struct.unpack(">H", get_current_data_for_pid(12)[2:])[0] / 4.0 # revs
+ throttle = struct.unpack(">B", get_current_data_for_pid(17)[2:])[0] / 255.0 * 100 # percent
+ temp = struct.unpack(">B", get_current_data_for_pid(5)[2:])[0] - 40 # degrees C
+ load = struct.unpack(">B", get_current_data_for_pid(4)[2:])[0] / 255.0 * 100 # percent
+ print("%d KPH, %d RPM, %.1f%% Throttle, %d deg C, %.1f%% load" % (speed, rpm, throttle, temp, load))
+ time.sleep(0.2)
diff --git a/panda/examples/tesla_tester.py b/panda/examples/tesla_tester.py
new file mode 100755
index 000000000..28e63ba51
--- /dev/null
+++ b/panda/examples/tesla_tester.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+
+import binascii
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+def tesla_tester():
+ p = Panda()
+
+ body_bus_speed = 125 # Tesla Body busses (B, BF) are 125kbps, rest are 500kbps
+ body_bus_num = 1 # My TDC to OBD adapter has PT on bus0 BDY on bus1 and CH on bus2
+ p.set_can_speed_kbps(body_bus_num, body_bus_speed)
+
+ # Now set the panda from its default of SAFETY_SILENT (read only) to SAFETY_ALLOUTPUT
+ # Careful, as this will let us send any CAN messages we want (which could be very bad!)
+ print("Setting Panda to output mode...")
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ # BDY 0x248 is the MCU_commands message, which includes folding mirrors, opening the trunk, frunk, setting the cars lock state and more.
+ # For our test, we will edit the 3rd byte, which is MCU_lockRequest. 0x01 will lock, 0x02 will unlock:
+ print("Unlocking Tesla...")
+ p.can_send(0x248, b"\x00\x00\x02\x00\x00\x00\x00\x00", body_bus_num)
+
+ #Or, we can set the first byte, MCU_frontHoodCommand + MCU_liftgateSwitch, to 0x01 to pop the frunk, or 0x04 to open/close the trunk (0x05 should open both)
+ print("Opening Frunk...")
+ p.can_send(0x248, b"\x01\x00\x00\x00\x00\x00\x00\x00", body_bus_num)
+
+ #Back to safety...
+ print("Disabling output on Panda...")
+ p.set_safety_mode(CarParams.SafetyModel.silent)
+
+ print("Reading VIN from 0x568. This is painfully slow and can take up to 3 minutes (1 minute per message; 3 messages needed for full VIN)...")
+
+ vin = {}
+ while True:
+ #Read the VIN
+ can_recv = p.can_recv()
+ for address, dat, src in can_recv:
+ if src == body_bus_num:
+ if address == 1384: # 0x568 is VIN
+ vin_index = int(binascii.hexlify(dat)[:2]) # first byte is the index, 00, 01, 02
+ vin_string = binascii.hexlify(dat)[2:] # rest of the string is the actual VIN data
+ vin[vin_index] = vin_string.decode("hex")
+ print("Got VIN index " + str(vin_index) + " data " + vin[vin_index])
+ #if we have all 3 parts of the VIN, print it and break out of our while loop
+ if 0 in vin and 1 in vin and 2 in vin:
+ print("VIN: " + vin[0] + vin[1] + vin[2][:3])
+ break
+
+if __name__ == "__main__":
+ tesla_tester()
diff --git a/panda/pyproject.toml b/panda/pyproject.toml
new file mode 100644
index 000000000..9eb79a8ed
--- /dev/null
+++ b/panda/pyproject.toml
@@ -0,0 +1,75 @@
+[project]
+name = "pandacan"
+version = "0.0.10"
+description = "Code powering the comma.ai panda"
+readme = "README.md"
+requires-python = ">=3.11,<3.13" # macOS doesn't work with 3.13 due to pycapnp from iqdbc
+license = {text = "MIT"}
+authors = [{name = "comma.ai"}]
+classifiers = [
+ "Natural Language :: English",
+ "Programming Language :: Python :: 3",
+ "Topic :: System :: Hardware",
+]
+dependencies = [
+ "libusb1",
+ "iqdbc @ git+https://git.konn3kt.com/teal/iqdbc.git@master#egg=iqdbc",
+]
+
+[project.optional-dependencies]
+dev = [
+ "scons",
+ "pycryptodome >= 3.9.8",
+ "cffi",
+ "flaky",
+ "pytest",
+ "pytest-mock",
+ "pytest-timeout",
+ "pytest-randomly",
+ "ruff",
+ "mypy",
+ "setuptools",
+ "spidev; platform_system == 'Linux'",
+]
+
+[build-system]
+requires = ["setuptools>=61", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[tool.setuptools]
+packages = ["panda"]
+
+[tool.setuptools.package-dir]
+panda = "."
+
+[tool.mypy]
+# third-party packages
+ignore_missing_imports = true
+
+# helpful warnings
+warn_redundant_casts = true
+warn_unreachable = true
+warn_unused_ignores = true
+
+# restrict dynamic typing
+warn_return_any = true
+
+# https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml
+[tool.ruff]
+line-length = 160
+target-version="py311"
+
+[tool.ruff.lint]
+select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF100", "A"]
+ignore = ["W292", "E741", "E402", "C408", "ISC003"]
+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!"
+
+[tool.pytest.ini_options]
+addopts = "-Werror --strict-config --strict-markers --durations=10 --ignore-glob='*.sh' --ignore=tests/misra --ignore=tests/som --ignore=tests/hitl"
+python_files = "test_*.py"
+testpaths = [
+ "tests/"
+]
diff --git a/panda/python/__init__.py b/panda/python/__init__.py
new file mode 100644
index 000000000..a28b8b879
--- /dev/null
+++ b/panda/python/__init__.py
@@ -0,0 +1,847 @@
+# python library to interface with panda
+import os
+import sys
+import time
+import usb1
+import struct
+import hashlib
+import binascii
+from functools import wraps, partial
+from itertools import accumulate
+
+from iqdbc.car.structs import CarParams
+
+from .base import BaseHandle
+from .constants import FW_PATH, McuType
+from .dfu import PandaDFU
+from .spi import PandaSpiHandle, PandaSpiException, PandaProtocolMismatch
+from .usb import PandaUsbHandle
+from .utils import logger
+
+__version__ = '0.0.10'
+
+CANPACKET_HEAD_SIZE = 0x6
+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)}
+PANDA_CAN_CNT = 3
+
+
+def calculate_checksum(data):
+ res = 0
+ for b in data:
+ res ^= b
+ return res
+
+def pack_can_buffer(arr, chunk=False, fd=False):
+ snds = [bytearray(), ]
+ for address, dat, bus in arr:
+ extended = 1 if address >= 0x800 else 0
+ data_len_code = LEN_TO_DLC[len(dat)]
+ header = bytearray(CANPACKET_HEAD_SIZE)
+ word_4b = (address << 3) | (extended << 2)
+ header[0] = (data_len_code << 4) | (bus << 1) | int(fd)
+ header[1] = word_4b & 0xFF
+ header[2] = (word_4b >> 8) & 0xFF
+ header[3] = (word_4b >> 16) & 0xFF
+ header[4] = (word_4b >> 24) & 0xFF
+ header[5] = calculate_checksum(header[:5] + dat)
+
+ snds[-1].extend(header)
+ snds[-1].extend(dat)
+ if chunk and len(snds[-1]) > 256:
+ snds.append(bytearray())
+
+ return snds
+
+def unpack_can_buffer(dat):
+ ret = []
+
+ while len(dat) >= CANPACKET_HEAD_SIZE:
+ data_len = DLC_TO_LEN[(dat[0]>>4)]
+
+ header = dat[:CANPACKET_HEAD_SIZE]
+
+ bus = (header[0] >> 1) & 0x7
+ address = (header[4] << 24 | header[3] << 16 | header[2] << 8 | header[1]) >> 3
+
+ if (header[1] >> 1) & 0x1:
+ # returned
+ bus += 128
+ if header[1] & 0x1:
+ # rejected
+ bus += 192
+
+ # we need more from the next transfer
+ if data_len > len(dat) - CANPACKET_HEAD_SIZE:
+ break
+
+ assert calculate_checksum(dat[:(CANPACKET_HEAD_SIZE+data_len)]) == 0, "CAN packet checksum incorrect"
+
+ data = dat[CANPACKET_HEAD_SIZE:(CANPACKET_HEAD_SIZE+data_len)]
+ dat = dat[(CANPACKET_HEAD_SIZE+data_len):]
+
+ ret.append((address, data, bus))
+
+ return (ret, dat)
+
+
+def ensure_version(desc, lib_field, panda_field, fn):
+ @wraps(fn)
+ def wrapper(self, *args, **kwargs):
+ lib_version = getattr(self, lib_field)
+ panda_version = getattr(self, panda_field)
+ if lib_version != panda_version:
+ raise RuntimeError(f"{desc} packet version mismatch: panda's firmware v{panda_version}, library v{lib_version}. Reflash panda.")
+ return fn(self, *args, **kwargs)
+ return wrapper
+ensure_can_packet_version = partial(ensure_version, "CAN", "CAN_PACKET_VERSION", "can_version")
+ensure_can_health_packet_version = partial(ensure_version, "CAN health", "CAN_HEALTH_PACKET_VERSION", "can_health_version")
+ensure_health_packet_version = partial(ensure_version, "health", "HEALTH_PACKET_VERSION", "health_version")
+
+
+def _is_lite_hw() -> bool:
+ return os.environ.get('LITE') == '1' or os.path.exists('/tmp/lite_hw')
+
+
+class Panda:
+
+ SERIAL_DEBUG = 0
+ SERIAL_SOM_DEBUG = 4
+
+ USB_VIDS = (0xbbaa, 0x3801) # 0x3801 is comma's registered VID
+ USB_PIDS = (0xddee, 0xddcc)
+ REQUEST_IN = usb1.ENDPOINT_IN | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE
+ REQUEST_OUT = usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE
+
+ # from https://github.com/commaai/openpilot/blob/103b4df18cbc38f4129555ab8b15824d1a672bdf/cereal/log.capnp#L648
+ HW_TYPE_UNKNOWN = b'\x00'
+ HW_TYPE_WHITE = b'\x01'
+ HW_TYPE_GREY_PANDA = b'\x02'
+ HW_TYPE_BLACK = b'\x03'
+ HW_TYPE_PEDAL = b'\x04'
+ HW_TYPE_UNO = b'\x05'
+ HW_TYPE_DOS = b'\x06'
+ HW_TYPE_RED_PANDA = b'\x07'
+ HW_TYPE_RED_PANDA_V2 = b'\x08'
+ HW_TYPE_TRES = b'\x09'
+ HW_TYPE_CUATRO = b'\x0a'
+ HW_TYPE_BODY = b'\xb1'
+
+ CAN_PACKET_VERSION = 4
+ HEALTH_PACKET_VERSION = 17
+ CAN_HEALTH_PACKET_VERSION = 5
+ HEALTH_STRUCT = struct.Struct(" 0:
+ print("INFO: some attached pandas are in DFU mode.")
+
+ pandas = self.list()
+ if len(pandas) == 0:
+ print("INFO: panda not available")
+ return None
+ if len(pandas) == 1:
+ print(f"INFO: connecting to panda {pandas[0]}")
+ return pandas[0]
+ while True:
+ print("Multiple pandas available:")
+ pandas.sort()
+ for idx, serial in enumerate(pandas):
+ print(f"{[idx]}: {serial}")
+ try:
+ choice = int(input("Choose serial [0]:") or "0")
+ return pandas[choice]
+ except (ValueError, IndexError):
+ print("Enter a valid index.")
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
+ def close(self):
+ if self._handle_open:
+ self._handle.close()
+ self._handle_open = False
+ if self._context is not None:
+ self._context.close()
+
+ def connect(self, claim=True, wait=False):
+ self.close()
+
+ self._handle = None
+ while self._handle is None:
+ # try USB first, then SPI
+ self._context, self._handle, serial, self.bootstub, bcd = self.usb_connect(self._connect_serial, claim=claim, no_error=wait)
+ if self._handle is None:
+ self._context, self._handle, serial, self.bootstub, bcd = self.spi_connect(self._connect_serial)
+ if not wait:
+ break
+
+ if self._handle is None:
+ raise Exception("failed to connect to panda")
+
+ self._bcd_hw_type = None
+ ret = self._handle.controlRead(Panda.REQUEST_IN, 0xc1, 0, 0, 0x40)
+ missing_hw_type_endpoint = self.bootstub and ret.startswith(b'\xff\x00\xc1\x3e\xde\xad\xd0\x0d')
+ if missing_hw_type_endpoint and bcd is not None:
+ self._bcd_hw_type = bcd
+
+ self._assume_f4_mcu = (self._bcd_hw_type is None) and missing_hw_type_endpoint
+
+ self._serial = serial
+ self._connect_serial = serial
+ self._handle_open = True
+ self._mcu_type = self.get_mcu_type()
+ self.health_version, self.can_version, self.can_health_version = self.get_packets_versions()
+ logger.debug("connected")
+
+ hw_type = self.get_type()
+ if hw_type not in self.SUPPORTED_DEVICES:
+ print("WARNING: Using deprecated HW")
+
+ # disable openpilot's heartbeat checks
+ if self._disable_checks:
+ self.set_heartbeat_disabled()
+ self.set_power_save(0)
+
+ # reset comms
+ self.can_reset_communications()
+
+ # disable automatic CAN-FD switching
+ for bus in range(PANDA_CAN_CNT):
+ self.set_canfd_auto(bus, False)
+
+ # set CAN speed
+ for bus in range(PANDA_CAN_CNT):
+ self.set_can_speed_kbps(bus, self._can_speed_kbps)
+
+ @property
+ def spi(self) -> bool:
+ return isinstance(self._handle, PandaSpiHandle)
+
+ @classmethod
+ def spi_connect(cls, serial, ignore_version=False):
+ try:
+ handle = PandaSpiHandle()
+ dat = handle.get_protocol_version()
+ except PandaSpiException:
+ return None, None, None, False, None
+
+ spi_serial = binascii.hexlify(dat[:12]).decode()
+ pid = dat[13]
+ if pid not in (0xcc, 0xee):
+ raise PandaProtocolMismatch(f"invalid bootstub status ({pid=}). reflash panda")
+ bootstub = pid == 0xee
+ spi_version = dat[14]
+
+ # did we get the right panda?
+ if serial is not None and spi_serial != serial:
+ return None, None, None, False, None
+
+ # ensure our protocol version matches the panda
+ if (not ignore_version) and spi_version != handle.PROTOCOL_VERSION:
+ raise PandaProtocolMismatch(f"panda protocol mismatch: expected {handle.PROTOCOL_VERSION}, got {spi_version}. reflash panda")
+
+ # got a device and all good
+ return None, handle, spi_serial, bootstub, None
+
+ @classmethod
+ def usb_connect(cls, serial, claim=True, no_error=False):
+ handle, usb_serial, bootstub, bcd = None, None, None, None
+ context = usb1.USBContext()
+ context.open()
+ try:
+ for device in context.getDeviceList(skip_on_error=True):
+ if device.getVendorID() in cls.USB_VIDS and device.getProductID() in cls.USB_PIDS:
+ try:
+ this_serial = device.getSerialNumber()
+ except Exception:
+ # Allow to ignore errors on reconnect. USB hubs need some time to initialize after panda reset
+ if not no_error:
+ logger.exception("failed to get serial number of panda")
+ continue
+
+ if serial is None or this_serial == serial:
+ logger.debug("opening device %s %s", this_serial, hex(device.getProductID()))
+
+ usb_serial = this_serial
+ bootstub = (device.getProductID() & 0xF0) == 0xe0
+ handle = device.open()
+ if sys.platform not in ("win32", "cygwin", "msys", "darwin"):
+ handle.setAutoDetachKernelDriver(True)
+ if claim:
+ handle.claimInterface(0)
+ # handle.setInterfaceAltSetting(0, 0) # Issue in USB stack
+
+ this_bcd = device.getbcdDevice()
+ if this_bcd is not None and this_bcd != 0x2300:
+ bcd = bytearray([this_bcd >> 8, ])
+
+ break
+ except Exception:
+ logger.exception("USB connect error")
+
+ usb_handle = None
+ if handle is not None:
+ usb_handle = PandaUsbHandle(handle)
+ else:
+ context.close()
+
+ return context, usb_handle, usb_serial, bootstub, bcd
+
+ def is_connected_spi(self):
+ return isinstance(self._handle, PandaSpiHandle)
+
+ def is_connected_usb(self):
+ return isinstance(self._handle, PandaUsbHandle)
+
+ @classmethod
+ def list(cls, usb_only: bool = False):
+ ret = cls.usb_list()
+ if not usb_only:
+ ret += cls.spi_list()
+ return list(set(ret))
+
+ @classmethod
+ def usb_list(cls):
+ ret = []
+ try:
+ with usb1.USBContext() as context:
+ for device in context.getDeviceList(skip_on_error=True):
+ if device.getVendorID() in cls.USB_VIDS and device.getProductID() in cls.USB_PIDS:
+ try:
+ serial = device.getSerialNumber()
+ if len(serial) == 24:
+ ret.append(serial)
+ else:
+ logger.warning(f"found device with panda descriptors but invalid serial: {serial}", RuntimeWarning)
+ except Exception:
+ logger.exception("error connecting to panda")
+ except Exception:
+ logger.exception("exception while listing pandas")
+ return ret
+
+ @classmethod
+ def spi_list(cls):
+ _, _, serial, _, _ = cls.spi_connect(None, ignore_version=True)
+ if serial is not None:
+ return [serial, ]
+ return []
+
+ def reset(self, enter_bootstub=False, enter_bootloader=False, reconnect=True):
+ # no response is expected since it resets right away
+ timeout = 5000 if isinstance(self._handle, PandaSpiHandle) else 15000
+ try:
+ if enter_bootloader:
+ self._handle.controlWrite(Panda.REQUEST_IN, 0xd1, 0, 0, b'', timeout=timeout, expect_disconnect=True)
+ else:
+ if enter_bootstub:
+ self._handle.controlWrite(Panda.REQUEST_IN, 0xd1, 1, 0, b'', timeout=timeout, expect_disconnect=True)
+ else:
+ self._handle.controlWrite(Panda.REQUEST_IN, 0xd8, 0, 0, b'', timeout=timeout, expect_disconnect=True)
+ except Exception:
+ pass
+
+ self.close()
+ if not enter_bootloader and reconnect:
+ self.reconnect()
+
+ @property
+ def connected(self) -> bool:
+ return self._handle_open
+
+ def reconnect(self):
+ if self._handle_open:
+ self.close()
+
+ success = False
+ # wait up to 15 seconds
+ for _ in range(15*10):
+ try:
+ self.connect(claim=False, wait=True)
+ success = True
+ break
+ except Exception:
+ pass
+ time.sleep(0.1)
+ if not success:
+ raise Exception("reconnect failed")
+
+ @staticmethod
+ def flasher_present(handle: BaseHandle) -> bool:
+ fr = handle.controlRead(Panda.REQUEST_IN, 0xb0, 0, 0, 0xc)
+ return fr[4:8] == b"\xde\xad\xd0\x0d"
+
+ @staticmethod
+ def flash_static(handle, code, mcu_type):
+ assert mcu_type is not None, "must set valid mcu_type to flash"
+
+ # confirm flasher is present
+ assert Panda.flasher_present(handle)
+
+ # determine sectors to erase
+ apps_sectors_cumsum = accumulate(mcu_type.config.sector_sizes[1:])
+ last_sector = next((i + 1 for i, v in enumerate(apps_sectors_cumsum) if v > len(code)), -1)
+ assert last_sector >= 1, "Binary too small? No sector to erase."
+ assert last_sector < 7, "Binary too large! Risk of overwriting provisioning chunk."
+
+ # unlock flash
+ logger.info("flash: unlocking")
+ handle.controlWrite(Panda.REQUEST_IN, 0xb1, 0, 0, b'')
+
+ # erase sectors
+ logger.info(f"flash: erasing sectors 1 - {last_sector}")
+ for i in range(1, last_sector + 1):
+ handle.controlWrite(Panda.REQUEST_IN, 0xb2, i, 0, b'')
+
+ # flash over EP2
+ STEP = 0x200
+ logger.info("flash: flashing")
+ for i in range(0, len(code), STEP):
+ handle.bulkWrite(2, code[i:i + STEP])
+
+ # reset
+ logger.info("flash: resetting")
+ try:
+ handle.controlWrite(Panda.REQUEST_IN, 0xd8, 0, 0, b'', expect_disconnect=True)
+ except Exception:
+ pass
+
+ def flash(self, fn=None, code=None, reconnect=True):
+ if self.up_to_date(fn=fn):
+ logger.info("flash: already up to date")
+ return
+
+ hw_type = self.get_type()
+ if hw_type not in self.SUPPORTED_DEVICES:
+ if not (hw_type == Panda.HW_TYPE_UNKNOWN and _is_lite_hw()):
+ raise RuntimeError(f"HW type {hw_type.hex()} is deprecated and can no longer be flashed.")
+
+ if not fn:
+ fn = os.path.join(FW_PATH, self._mcu_type.config.app_fn)
+ assert os.path.isfile(fn)
+ logger.debug("flash: main version is %s", self.get_version())
+ if not self.bootstub:
+ self.reset(enter_bootstub=True)
+ assert(self.bootstub)
+
+ if code is None:
+ with open(fn, "rb") as f:
+ code = f.read()
+
+ # get version
+ logger.debug("flash: bootstub version is %s", self.get_version())
+
+ # do flash
+ Panda.flash_static(self._handle, code, mcu_type=self._mcu_type)
+
+ # reconnect
+ if reconnect:
+ self.reconnect()
+
+ def recover(self, timeout: int | None = 60, reset: bool = True) -> bool:
+ dfu_serial = self.get_dfu_serial()
+
+ if reset:
+ self.reset(enter_bootstub=True)
+ self.reset(enter_bootloader=True)
+
+ if not self.wait_for_dfu(dfu_serial, timeout=timeout):
+ return False
+
+ dfu = PandaDFU(dfu_serial)
+ dfu.recover()
+
+ # reflash after recover
+ self.connect(True, True)
+ self.flash()
+ return True
+
+ @staticmethod
+ def wait_for_dfu(dfu_serial: str | None, timeout: int | None = None) -> bool:
+ t_start = time.monotonic()
+ dfu_list = PandaDFU.list()
+ while (dfu_serial is None and len(dfu_list) == 0) or (dfu_serial is not None and dfu_serial not in dfu_list):
+ logger.debug("waiting for DFU...")
+ time.sleep(0.1)
+ if timeout is not None and (time.monotonic() - t_start) > timeout:
+ return False
+ dfu_list = PandaDFU.list()
+ return True
+
+ @classmethod
+ def wait_for_panda(cls, serial: str | None, timeout: int) -> bool:
+ t_start = time.monotonic()
+ serials = cls.list()
+ while (serial is None and len(serials) == 0) or (serial is not None and serial not in serials):
+ logger.debug("waiting for panda...")
+ time.sleep(0.1)
+ if timeout is not None and (time.monotonic() - t_start) > timeout:
+ return False
+ serials = cls.list()
+ return True
+
+ def up_to_date(self, fn=None) -> bool:
+ current = self.get_signature()
+ if fn is None:
+ fn = os.path.join(FW_PATH, self.get_mcu_type().config.app_fn)
+ expected = Panda.get_signature_from_firmware(fn)
+ return (current == expected)
+
+ def call_control_api(self, msg):
+ self._handle.controlWrite(Panda.REQUEST_OUT, msg, 0, 0, b'')
+
+ # ******************* health *******************
+
+ @ensure_health_packet_version
+ def health(self):
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd2, 0, 0, self.HEALTH_STRUCT.size)
+ a = self.HEALTH_STRUCT.unpack(dat)
+ return {
+ "uptime": a[0],
+ "voltage": a[1],
+ "current": a[2],
+ "safety_tx_blocked": a[3],
+ "safety_rx_invalid": a[4],
+ "tx_buffer_overflow": a[5],
+ "rx_buffer_overflow": a[6],
+ "faults": a[7],
+ "ignition_line": a[8],
+ "ignition_can": a[9],
+ "controls_allowed": a[10],
+ "car_harness_status": a[11],
+ "safety_mode": a[12],
+ "safety_param": a[13],
+ "fault_status": a[14],
+ "power_save_enabled": a[15],
+ "heartbeat_lost": a[16],
+ "alternative_experience": a[17],
+ "interrupt_load": a[18],
+ "fan_power": a[19],
+ "safety_rx_checks_invalid": a[20],
+ "spi_error_count": a[21],
+ "sbu1_voltage_mV": a[22],
+ "sbu2_voltage_mV": a[23],
+ "som_reset_triggered": a[24],
+ }
+
+ @ensure_can_health_packet_version
+ def can_health(self, can_number):
+ LEC_ERROR_CODE = {
+ 0: "No error",
+ 1: "Stuff error",
+ 2: "Form error",
+ 3: "AckError",
+ 4: "Bit1Error",
+ 5: "Bit0Error",
+ 6: "CRCError",
+ 7: "NoChange",
+ }
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc2, int(can_number), 0, self.CAN_HEALTH_STRUCT.size)
+ a = self.CAN_HEALTH_STRUCT.unpack(dat)
+ return {
+ "bus_off": a[0],
+ "bus_off_cnt": a[1],
+ "error_warning": a[2],
+ "error_passive": a[3],
+ "last_error": LEC_ERROR_CODE[a[4]],
+ "last_stored_error": LEC_ERROR_CODE[a[5]],
+ "last_data_error": LEC_ERROR_CODE[a[6]],
+ "last_data_stored_error": LEC_ERROR_CODE[a[7]],
+ "receive_error_cnt": a[8],
+ "transmit_error_cnt": a[9],
+ "total_error_cnt": a[10],
+ "total_tx_lost_cnt": a[11],
+ "total_rx_lost_cnt": a[12],
+ "total_tx_cnt": a[13],
+ "total_rx_cnt": a[14],
+ "total_fwd_cnt": a[15],
+ "total_tx_checksum_error_cnt": a[16],
+ "can_speed": a[17],
+ "can_data_speed": a[18],
+ "canfd_enabled": a[19],
+ "brs_enabled": a[20],
+ "canfd_non_iso": a[21],
+ "irq0_call_rate": a[22],
+ "irq1_call_rate": a[23],
+ "irq2_call_rate": a[24],
+ "can_core_reset_count": a[25],
+ }
+
+ # ******************* control *******************
+
+ def get_version(self):
+ return self._handle.controlRead(Panda.REQUEST_IN, 0xd6, 0, 0, 0x40).decode('utf8')
+
+ @staticmethod
+ def get_signature_from_firmware(fn) -> bytes:
+ with open(fn, 'rb') as f:
+ f.seek(-128, 2) # Seek from end of file
+ return f.read(128)
+
+ def get_signature(self) -> bytes:
+ part_1 = self._handle.controlRead(Panda.REQUEST_IN, 0xd3, 0, 0, 0x40)
+ part_2 = self._handle.controlRead(Panda.REQUEST_IN, 0xd4, 0, 0, 0x40)
+ return bytes(part_1 + part_2)
+
+ def get_type(self):
+ ret = self._handle.controlRead(Panda.REQUEST_IN, 0xc1, 0, 0, 0x40)
+
+ if self._bcd_hw_type is not None and (ret is None or len(ret) != 1):
+ ret = self._bcd_hw_type
+
+ return ret
+
+ # Returns tuple with health packet version and CAN packet/USB packet version
+ def get_packets_versions(self):
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xdd, 0, 0, 3)
+ if dat and len(dat) == 3:
+ a = struct.unpack("BBB", dat)
+ return (a[0], a[1], a[2])
+ else:
+ return (0, 0, 0)
+
+ def get_mcu_type(self) -> McuType:
+ hw_type = self.get_type()
+ if hw_type in Panda.F4_DEVICES:
+ return McuType.F4
+ elif hw_type in Panda.H7_DEVICES:
+ return McuType.H7
+ else:
+ if self._assume_f4_mcu:
+ return McuType.F4
+ # C3 Lite (mr.one clone): panda has STM32F4 MCU (16-sector DFU layout = DOS board)
+ if hw_type == Panda.HW_TYPE_UNKNOWN and _is_lite_hw():
+ return McuType.F4
+ raise ValueError(f"unknown HW type: {hw_type}")
+
+ def is_internal(self):
+ hw_type = self.get_type()
+ if hw_type in Panda.INTERNAL_DEVICES:
+ return True
+ if hw_type == Panda.HW_TYPE_UNKNOWN and _is_lite_hw():
+ return True
+ return False
+
+ def get_serial(self):
+ """
+ Returns the comma-issued dongle ID from our provisioning
+ """
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 0, 0, 0x20)
+ hashsig, calc_hash = dat[0x1c:], hashlib.sha1(dat[0:0x1c]).digest()[0:4]
+ assert(hashsig == calc_hash)
+ return [dat[0:0x10].decode("utf8"), dat[0x10:0x10 + 10].decode("utf8")]
+
+ def get_usb_serial(self):
+ """
+ Returns the serial number reported from the USB descriptor;
+ matches the MCU UID
+ """
+ return self._serial
+
+ def get_dfu_serial(self):
+ return PandaDFU.st_serial_to_dfu_serial(self._serial, self._mcu_type)
+
+ def get_uid(self):
+ """
+ Returns the UID from the MCU
+ """
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc3, 0, 0, 12)
+ return binascii.hexlify(dat).decode()
+
+ def get_secret(self):
+ return self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 1, 0, 0x10)
+
+ def get_interrupt_call_rate(self, irqnum):
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc4, int(irqnum), 0, 4)
+ return struct.unpack("I", dat)[0]
+
+ # ******************* configuration *******************
+
+ def set_alternative_experience(self, alternative_experience, safety_param_iq=0):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xdf, int(alternative_experience), int(safety_param_iq), b'')
+
+ def set_power_save(self, power_save_enabled=0):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe7, int(power_save_enabled), 0, b'')
+
+ def set_safety_mode(self, mode=CarParams.SafetyModel.silent, param=0):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xdc, mode, param, b'')
+
+ def set_obd(self, obd):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xdb, int(obd), 0, b'')
+
+ def set_can_loopback(self, enable):
+ # set can loopback mode for all buses
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe5, int(enable), 0, b'')
+
+ def set_can_enable(self, bus_num, enable):
+ # sets the can transceiver enable pin
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf4, int(bus_num), int(enable), b'')
+
+ def set_can_speed_kbps(self, bus, speed):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xde, bus, int(speed * 10), b'')
+
+ def set_can_data_speed_kbps(self, bus, speed):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf9, bus, int(speed * 10), b'')
+
+ def set_canfd_non_iso(self, bus, non_iso):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xfc, bus, int(non_iso), b'')
+
+ def set_canfd_auto(self, bus, auto):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe8, bus, int(auto), b'')
+
+ def set_uart_baud(self, uart, rate):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe4, uart, int(rate / 300), b'')
+
+ def set_uart_parity(self, uart, parity):
+ # parity, 0=off, 1=even, 2=odd
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe2, uart, parity, b'')
+
+ def set_uart_callback(self, uart, install):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe3, uart, int(install), b'')
+
+ # ******************* can *******************
+
+ # The panda will NAK CAN writes when there is CAN congestion.
+ # libusb will try to send it again, with a max timeout.
+ # Timeout is in ms. If set to 0, the timeout is infinite.
+ CAN_SEND_TIMEOUT_MS = 10
+
+ def can_reset_communications(self):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xc0, 0, 0, b'')
+
+ @ensure_can_packet_version
+ def can_send_many(self, arr, *, fd=False, timeout=CAN_SEND_TIMEOUT_MS):
+ snds = pack_can_buffer(arr, chunk=(not self.spi), fd=fd)
+ for tx in snds:
+ while len(tx) > 0:
+ bs = self._handle.bulkWrite(3, tx, timeout=timeout)
+ tx = tx[bs:]
+
+ def can_send(self, addr, dat, bus, *, fd=False, timeout=CAN_SEND_TIMEOUT_MS):
+ self.can_send_many([[addr, dat, bus]], fd=fd, timeout=timeout)
+
+ @ensure_can_packet_version
+ def can_recv(self):
+ dat = bytearray()
+ while True:
+ try:
+ dat = self._handle.bulkRead(1, 16384) # Max receive batch size + 2 extra reserve frames
+ break
+ except (usb1.USBErrorIO, usb1.USBErrorOverflow):
+ logger.error("CAN: BAD RECV, RETRYING")
+ time.sleep(0.1)
+ msgs, self.can_rx_overflow_buffer = unpack_can_buffer(self.can_rx_overflow_buffer + dat)
+ return msgs
+
+ def can_clear(self, bus):
+ """Clears all messages from the specified internal CAN ringbuffer as
+ though it were drained.
+
+ Args:
+ bus (int): can bus number to clear a tx queue, or 0xFFFF to clear the
+ global can rx queue.
+
+ """
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf1, bus, 0, b'')
+
+ # ******************* serial *******************
+
+ def serial_read(self, port_number, maxlen=1024):
+ ret = b''
+ while 1:
+ r = bytes(self._handle.controlRead(Panda.REQUEST_IN, 0xe0, port_number, 0, 0x40))
+ if len(r) == 0 or len(ret) >= maxlen:
+ break
+ ret += r
+ return ret
+
+ def serial_write(self, port_number, ln):
+ ret = 0
+ if isinstance(ln, str):
+ ln = bytes(ln, 'utf-8')
+ for i in range(0, len(ln), 0x20):
+ ret += self._handle.bulkWrite(2, struct.pack("B", port_number) + ln[i:i + 0x20])
+ return ret
+
+ def send_heartbeat(self, engaged=True, engaged_aol=True):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf3, engaged, engaged_aol, b'')
+
+ # disable heartbeat checks for use outside of openpilot
+ # sending a heartbeat will reenable the checks
+ def set_heartbeat_disabled(self):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf8, 0, 0, b'')
+
+ # ****************** Timer *****************
+ def get_microsecond_timer(self):
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xa8, 0, 0, 4)
+ return struct.unpack("I", dat)[0]
+
+ # ******************* IR *******************
+ def set_ir_power(self, percentage):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xb0, int(percentage), 0, b'')
+
+ # ******************* Fan ******************
+ def set_fan_power(self, percentage):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xb1, int(percentage), 0, b'')
+
+ def get_fan_rpm(self):
+ dat = self._handle.controlRead(Panda.REQUEST_IN, 0xb2, 0, 0, 2)
+ a = struct.unpack("H", dat)
+ return a[0]
+
+ # ****************** Siren *****************
+ def set_siren(self, enabled):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xf6, int(enabled), 0, b'')
+
+ # ****************** Debug *****************
+
+ # arr: timer period
+ # ccrN: channel N pulse length
+ def set_clock_source_timer_params(self, arr, ccr1, ccr2, ccr3):
+ param1 = ((ccr1 & 0xFF) << 8) | (ccr2 & 0xFF)
+ param2 = ((ccr3 & 0xFF) << 8) | (arr & 0xFF)
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xe6, param1, param2, b'')
+
+ def force_relay_drive(self, intercept_relay_drive, ignition_relay_drive):
+ self._handle.controlWrite(Panda.REQUEST_OUT, 0xc5, (int(intercept_relay_drive) | int(ignition_relay_drive) << 1), 0, b'')
+
+ def read_som_gpio(self) -> bool:
+ r = self._handle.controlRead(Panda.REQUEST_IN, 0xc6, 0, 0, 1)
+ return r[0] == 1
diff --git a/panda/python/base.py b/panda/python/base.py
new file mode 100644
index 000000000..ffe9353d6
--- /dev/null
+++ b/panda/python/base.py
@@ -0,0 +1,61 @@
+from abc import ABC, abstractmethod
+
+from .constants import McuType
+
+TIMEOUT = int(15 * 1e3) # default timeout, in milliseconds
+
+class BaseHandle(ABC):
+ """
+ A handle to talk to a panda.
+ Borrows heavily from the libusb1 handle API.
+ """
+
+ @abstractmethod
+ def close(self) -> None:
+ ...
+
+ @abstractmethod
+ def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False):
+ ...
+
+ @abstractmethod
+ def controlRead(self, request_type: int, request: int, value: int, index: int, length: int, timeout: int = TIMEOUT) -> bytes:
+ ...
+
+ @abstractmethod
+ def bulkWrite(self, endpoint: int, data: bytes, timeout: int = TIMEOUT) -> int:
+ ...
+
+ @abstractmethod
+ def bulkRead(self, endpoint: int, length: int, timeout: int = TIMEOUT) -> bytes:
+ ...
+
+
+class BaseSTBootloaderHandle(ABC):
+ """
+ A handle to talk to a panda while it's in the STM32 bootloader.
+ """
+
+ @abstractmethod
+ def get_mcu_type(self) -> McuType:
+ ...
+
+ @abstractmethod
+ def close(self) -> None:
+ ...
+
+ @abstractmethod
+ def clear_status(self) -> None:
+ ...
+
+ @abstractmethod
+ def program(self, address: int, dat: bytes) -> None:
+ ...
+
+ @abstractmethod
+ def erase_sector(self, sector: int) -> None:
+ ...
+
+ @abstractmethod
+ def jump(self, address: int) -> None:
+ ...
diff --git a/panda/python/constants.py b/panda/python/constants.py
new file mode 100644
index 000000000..0858bfd28
--- /dev/null
+++ b/panda/python/constants.py
@@ -0,0 +1,67 @@
+import os
+import enum
+from typing import NamedTuple
+
+BASEDIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../")
+FW_PATH = os.path.join(BASEDIR, "board/obj/")
+
+USBPACKET_MAX_SIZE = 0x40
+
+class McuConfig(NamedTuple):
+ mcu: str
+ mcu_idcode: int
+ sector_sizes: list[int]
+ sector_count: int # total sector count, used for MCU identification in DFU mode
+ uid_address: int
+ block_size: int
+ serial_number_address: int
+ app_address: int
+ app_fn: str
+ bootstub_address: int
+ bootstub_fn: str
+
+ def sector_address(self, i):
+ # assume bootstub is in sector 0
+ return self.bootstub_address + sum(self.sector_sizes[:i])
+
+
+F4Config = McuConfig(
+ "STM32F4",
+ 0x463,
+ [0x4000 for _ in range(4)] + [0x10000] + [0x20000 for _ in range(11)],
+ 16,
+ 0x1FFF7A10,
+ 0x800,
+ 0x1FFF79C0,
+ 0x8004000,
+ "panda.bin.signed",
+ 0x8000000,
+ "bootstub.panda.bin",
+)
+
+
+H7Config = McuConfig(
+ "STM32H7",
+ 0x483,
+ [0x20000 for _ in range(7)],
+ 8,
+ 0x1FF1E800,
+ 0x400,
+ # there is an 8th sector, but we use that for the provisioning chunk, so don't program over that!
+ 0x080FFFC0,
+ 0x8020000,
+ "panda_h7.bin.signed",
+ 0x8000000,
+ "bootstub.panda_h7.bin",
+)
+
+@enum.unique
+class McuType(enum.Enum):
+ F4 = F4Config
+ H7 = H7Config
+
+ @property
+ def config(self):
+ return self.value
+
+MCU_TYPE_BY_IDCODE = {m.config.mcu_idcode: m for m in McuType}
diff --git a/panda/python/dfu.py b/panda/python/dfu.py
new file mode 100644
index 000000000..624530cb2
--- /dev/null
+++ b/panda/python/dfu.py
@@ -0,0 +1,137 @@
+import os
+import usb1
+import struct
+import binascii
+
+from .base import BaseSTBootloaderHandle
+from .spi import STBootloaderSPIHandle, PandaSpiException
+from .usb import STBootloaderUSBHandle
+from .constants import FW_PATH, McuType
+
+
+class PandaDFU:
+ def __init__(self, dfu_serial: str | None):
+ # try USB, then SPI
+ handle: BaseSTBootloaderHandle | None
+ self._context, handle = PandaDFU.usb_connect(dfu_serial)
+ if handle is None:
+ self._context, handle = PandaDFU.spi_connect(dfu_serial)
+
+ if handle is None:
+ raise Exception(f"failed to open DFU device {dfu_serial}")
+
+ self._handle: BaseSTBootloaderHandle = handle
+ self._mcu_type: McuType = self._handle.get_mcu_type()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
+ def close(self):
+ if self._handle is not None:
+ self._handle.close()
+ self._handle = None
+ if self._context is not None:
+ self._context.close()
+
+ @staticmethod
+ def usb_connect(dfu_serial: str | None):
+ handle = None
+ context = usb1.USBContext()
+ context.open()
+ for device in context.getDeviceList(skip_on_error=True):
+ if device.getVendorID() == 0x0483 and device.getProductID() == 0xdf11:
+ try:
+ this_dfu_serial = device.open().getASCIIStringDescriptor(3)
+ except Exception:
+ continue
+
+ if this_dfu_serial == dfu_serial or dfu_serial is None:
+ handle = STBootloaderUSBHandle(device, device.open())
+ break
+
+ return context, handle
+
+ @staticmethod
+ def spi_connect(dfu_serial: str | None):
+ handle = None
+ this_dfu_serial = None
+
+ try:
+ handle = STBootloaderSPIHandle()
+ this_dfu_serial = PandaDFU.st_serial_to_dfu_serial(handle.get_uid(), handle.get_mcu_type())
+ except PandaSpiException:
+ handle = None
+
+ if dfu_serial is not None and dfu_serial != this_dfu_serial:
+ handle = None
+
+ return None, handle
+
+ @staticmethod
+ def usb_list() -> list[str]:
+ dfu_serials = []
+ try:
+ with usb1.USBContext() as context:
+ for device in context.getDeviceList(skip_on_error=True):
+ if device.getVendorID() == 0x0483 and device.getProductID() == 0xdf11:
+ try:
+ dfu_serials.append(device.open().getASCIIStringDescriptor(3))
+ except Exception:
+ pass
+ except Exception:
+ pass
+ return dfu_serials
+
+ @staticmethod
+ def spi_list() -> list[str]:
+ try:
+ _, h = PandaDFU.spi_connect(None)
+ if h is not None:
+ dfu_serial = PandaDFU.st_serial_to_dfu_serial(h.get_uid(), h.get_mcu_type())
+ return [dfu_serial, ]
+ except PandaSpiException:
+ pass
+ return []
+
+ @staticmethod
+ def st_serial_to_dfu_serial(st: str, mcu_type: McuType = McuType.H7):
+ if st is None or st == "none":
+ return None
+ try:
+ uid_base = struct.unpack("H" * 6, bytes.fromhex(st))
+ if mcu_type == McuType.H7:
+ return binascii.hexlify(struct.pack("!HHH", uid_base[1] + uid_base[5], uid_base[0] + uid_base[4], uid_base[3])).upper().decode("utf-8")
+ except struct.error:
+ return None
+
+ def get_mcu_type(self) -> McuType:
+ return self._mcu_type
+
+ def reset(self):
+ self._handle.jump(self._mcu_type.config.bootstub_address)
+
+ def program_bootstub(self, code_bootstub):
+ self._handle.clear_status()
+
+ # erase bootstub + app sectors
+ for i in (0, 1):
+ self._handle.erase_sector(i)
+
+ # write bootstub
+ self._handle.program(self._mcu_type.config.bootstub_address, code_bootstub)
+
+ def recover(self):
+ fn = os.path.join(FW_PATH, self._mcu_type.config.bootstub_fn)
+ with open(fn, "rb") as f:
+ code = f.read()
+ self.program_bootstub(code)
+ self.reset()
+
+ @staticmethod
+ def list() -> list[str]:
+ ret = PandaDFU.usb_list()
+ ret += PandaDFU.spi_list()
+ return list(set(ret))
diff --git a/panda/python/serial.py b/panda/python/serial.py
new file mode 100644
index 000000000..c2e965b76
--- /dev/null
+++ b/panda/python/serial.py
@@ -0,0 +1,35 @@
+# mimic a python serial port
+class PandaSerial:
+ def __init__(self, panda, port, baud):
+ self.panda = panda
+ self.port = port
+ self.panda.set_uart_parity(self.port, 0)
+ self._baudrate = baud
+ self.panda.set_uart_baud(self.port, baud)
+ self.buf = b""
+
+ def read(self, l=1):
+ tt = self.panda.serial_read(self.port)
+ if len(tt) > 0:
+ self.buf += tt
+ ret = self.buf[0:l]
+ self.buf = self.buf[l:]
+ return ret
+
+ def write(self, dat):
+ return self.panda.serial_write(self.port, dat)
+
+ def close(self):
+ pass
+
+ def flush(self):
+ pass
+
+ @property
+ def baudrate(self):
+ return self._baudrate
+
+ @baudrate.setter
+ def baudrate(self, value):
+ self.panda.set_uart_baud(self.port, value)
+ self._baudrate = value
diff --git a/panda/python/socketpanda.py b/panda/python/socketpanda.py
new file mode 100644
index 000000000..464ea8ecc
--- /dev/null
+++ b/panda/python/socketpanda.py
@@ -0,0 +1,123 @@
+import socket
+import struct
+import time
+
+# /**
+# * struct canfd_frame - CAN flexible data rate frame structure
+# * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
+# * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN)
+# * @flags: additional flags for CAN FD
+# * @__res0: reserved / padding
+# * @__res1: reserved / padding
+# * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte)
+# */
+# struct canfd_frame {
+# canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
+# __u8 len; /* frame payload length in byte */
+# __u8 flags; /* additional flags for CAN FD */
+# __u8 __res0; /* reserved / padding */
+# __u8 __res1; /* reserved / padding */
+# __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
+# };
+CAN_HEADER_FMT = "=IBB2x"
+CAN_HEADER_LEN = struct.calcsize(CAN_HEADER_FMT)
+CAN_MAX_DLEN = 8
+CANFD_MAX_DLEN = 64
+
+CAN_CONFIRM_FLAG = 0x800
+CAN_EFF_FLAG = 0x80000000
+
+CANFD_BRS = 0x01 # bit rate switch (second bitrate for payload data)
+CANFD_FDF = 0x04 # mark CAN FD for dual use of struct canfd_frame
+
+# socket.SO_RXQ_OVFL is missing
+# https://github.com/torvalds/linux/blob/47ac09b91befbb6a235ab620c32af719f8208399/include/uapi/asm-generic/socket.h#L61
+SO_RXQ_OVFL = 40
+
+import typing
+@typing.no_type_check # mypy struggles with macOS here...
+def create_socketcan(interface:str, recv_buffer_size:int) -> socket.socket:
+ # settings mostly from https://github.com/linux-can/can-utils/blob/master/candump.c
+ socketcan = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
+ socketcan.setblocking(False)
+ socketcan.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FD_FRAMES, 1)
+ socketcan.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_RECV_OWN_MSGS, 1)
+ socketcan.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, recv_buffer_size)
+ # TODO: why is it always 2x the requested size?
+ assert socketcan.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) == recv_buffer_size * 2
+ # TODO: how to dectect and alert on buffer overflow?
+ socketcan.setsockopt(socket.SOL_SOCKET, SO_RXQ_OVFL, 1)
+ socketcan.bind((interface,))
+ return socketcan
+
+# Panda class substitute for socketcan device (to support using the uds/iso-tp/xcp/ccp library)
+class SocketPanda():
+ def __init__(self, interface:str="can0", recv_buffer_size:int=212992) -> None:
+ self.interface = interface
+ self.recv_buffer_size = recv_buffer_size
+ self.socket = create_socketcan(interface, recv_buffer_size)
+
+ def __del__(self):
+ self.socket.close()
+
+ def get_serial(self) -> tuple[int, int]:
+ return (0, 0)
+
+ def get_version(self) -> int:
+ return 0
+
+ def can_clear(self, bus:int) -> None:
+ self.socket.close()
+ self.socket = create_socketcan(self.interface, self.recv_buffer_size)
+
+ def set_safety_mode(self, mode:int, param=0) -> None:
+ pass
+
+ def can_send_many(self, arr, *, fd=False, timeout=0) -> None:
+ for msg in arr:
+ self.can_send(*msg, fd=fd, timeout=timeout)
+
+ def can_send(self, addr, dat, bus, *, fd=False, timeout=0) -> None:
+ # Even if the CANFD_FDF flag is not set, the data still must be 8 bytes for classic CAN frames.
+ data_len = CANFD_MAX_DLEN if fd else CAN_MAX_DLEN
+ msg_len = len(dat)
+ msg_dat = dat.ljust(data_len, b'\x00')
+
+ # Set extended ID flag
+ if addr > 0x7ff:
+ addr |= CAN_EFF_FLAG
+
+ # Set FD flags
+ flags = CANFD_BRS | CANFD_FDF if fd else 0
+
+ can_frame = struct.pack(CAN_HEADER_FMT, addr, msg_len, flags) + msg_dat
+
+ # Try to send until timeout. sendto might block if the TX buffer is full.
+ # TX buffer size can also be adjusted through `ip link set can0 txqueuelen ` if needed
+ start_t = time.monotonic()
+ while (time.monotonic() - start_t < (timeout / 1000)) or (timeout == 0):
+ try:
+ self.socket.sendto(can_frame, (self.interface,))
+ break
+ except (BlockingIOError, OSError):
+ continue
+ else:
+ raise TimeoutError
+
+
+ def can_recv(self) -> list[tuple[int, bytes, int]]:
+ msgs = list()
+ while True:
+ try:
+ dat, _, msg_flags, _ = self.socket.recvmsg(self.recv_buffer_size)
+ assert len(dat) >= CAN_HEADER_LEN, f"ERROR: received {len(dat)} bytes"
+
+ can_id, msg_len, _ = struct.unpack(CAN_HEADER_FMT, dat[:CAN_HEADER_LEN])
+ assert len(dat) >= CAN_HEADER_LEN + msg_len, f"ERROR: received {len(dat)} bytes, expected at least {CAN_HEADER_LEN + msg_len} bytes"
+
+ msg_dat = dat[CAN_HEADER_LEN:CAN_HEADER_LEN+msg_len]
+ bus = 128 if (msg_flags & CAN_CONFIRM_FLAG) else 0
+ msgs.append((can_id, msg_dat, bus))
+ except BlockingIOError:
+ break # buffered data exhausted
+ return msgs
diff --git a/panda/python/spi.py b/panda/python/spi.py
new file mode 100644
index 000000000..4275017ed
--- /dev/null
+++ b/panda/python/spi.py
@@ -0,0 +1,417 @@
+import binascii
+import os
+import fcntl
+import math
+import time
+import struct
+import threading
+from contextlib import contextmanager
+from functools import reduce
+
+from .base import BaseHandle, BaseSTBootloaderHandle, TIMEOUT
+from .constants import McuType, MCU_TYPE_BY_IDCODE, USBPACKET_MAX_SIZE
+from .utils import logger
+
+try:
+ import spidev
+except ImportError:
+ spidev = None
+
+# Constants
+SYNC = 0x5A
+HACK = 0x79
+DACK = 0x85
+NACK = 0x1F
+CHECKSUM_START = 0xAB
+
+MIN_ACK_TIMEOUT_MS = 100
+MAX_XFER_RETRY_COUNT = 5
+
+SPI_BUF_SIZE = 4096 # from panda/board/drivers/spi.h
+XFER_SIZE = SPI_BUF_SIZE - 0x40 # give some room for SPI protocol overhead
+
+DEV_PATH = "/dev/spidev0.0"
+
+
+def crc8(data):
+ crc = 0xFF # standard init value
+ poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1
+ size = len(data)
+ for i in range(size - 1, -1, -1):
+ crc ^= data[i]
+ for _ in range(8):
+ if ((crc & 0x80) != 0):
+ crc = ((crc << 1) ^ poly) & 0xFF
+ else:
+ crc <<= 1
+ return crc
+
+
+class PandaSpiException(Exception):
+ pass
+
+class PandaProtocolMismatch(PandaSpiException):
+ pass
+
+class PandaSpiUnavailable(PandaSpiException):
+ pass
+
+class PandaSpiNackResponse(PandaSpiException):
+ pass
+
+class PandaSpiMissingAck(PandaSpiException):
+ pass
+
+class PandaSpiBadChecksum(PandaSpiException):
+ pass
+
+class PandaSpiTransferFailed(PandaSpiException):
+ pass
+
+
+SPI_LOCK = threading.Lock()
+SPI_DEVICES = {}
+class SpiDevice:
+ """
+ Provides locked, thread-safe access to a panda's SPI interface.
+ """
+
+ MAX_SPEED = 50000000 # max of the SDM845
+
+ def __init__(self, speed=MAX_SPEED):
+ assert speed <= self.MAX_SPEED
+
+ if not os.path.exists(DEV_PATH):
+ raise PandaSpiUnavailable(f"SPI device not found: {DEV_PATH}")
+ if spidev is None:
+ raise PandaSpiUnavailable("spidev is not installed")
+
+ with SPI_LOCK:
+ if speed not in SPI_DEVICES:
+ SPI_DEVICES[speed] = spidev.SpiDev()
+ SPI_DEVICES[speed].open(0, 0)
+ SPI_DEVICES[speed].max_speed_hz = speed
+ self._spidev = SPI_DEVICES[speed]
+
+ @contextmanager
+ def acquire(self):
+ try:
+ SPI_LOCK.acquire()
+ fcntl.flock(self._spidev, fcntl.LOCK_EX)
+ yield self._spidev
+ finally:
+ fcntl.flock(self._spidev, fcntl.LOCK_UN)
+ SPI_LOCK.release()
+
+ def close(self):
+ pass
+
+
+class PandaSpiHandle(BaseHandle):
+ """
+ A class that mimics a libusb1 handle for panda SPI communications.
+ """
+
+ PROTOCOL_VERSION = 2
+ HEADER = struct.Struct(" None:
+ self.dev = SpiDevice()
+ self.no_retry = "NO_RETRY" in os.environ
+
+ # helpers
+ def _calc_checksum(self, data: bytes) -> int:
+ cksum = CHECKSUM_START
+ for b in data:
+ cksum ^= b
+ return cksum
+
+ def _wait_for_ack(self, spi, ack_val: int, timeout: int, tx: int, length: int = 1) -> bytes:
+ timeout_s = max(MIN_ACK_TIMEOUT_MS, timeout) * 1e-3
+
+ start = time.monotonic()
+ while (timeout == 0) or ((time.monotonic() - start) < timeout_s):
+ dat = spi.xfer2([tx, ] * length)
+ if dat[0] == ack_val:
+ return bytes(dat)
+ elif dat[0] == NACK:
+ raise PandaSpiNackResponse
+
+ raise PandaSpiMissingAck
+
+ def _transfer_spidev(self, spi, endpoint: int, data, timeout: int, max_rx_len: int = 1000, expect_disconnect: bool = False) -> bytes:
+ max_rx_len = max(USBPACKET_MAX_SIZE, max_rx_len)
+
+ logger.debug("- send header")
+ packet = self.HEADER.pack(SYNC, endpoint, len(data), max_rx_len)
+ packet += bytes([self._calc_checksum(packet), ])
+ spi.xfer2(packet)
+
+ logger.debug("- waiting for header ACK")
+ self._wait_for_ack(spi, HACK, MIN_ACK_TIMEOUT_MS, 0x11)
+
+ logger.debug("- sending data")
+ packet = bytes([*data, self._calc_checksum(data)])
+ spi.xfer2(packet)
+
+ if expect_disconnect:
+ logger.debug("- expecting disconnect, returning")
+ return b""
+ else:
+ logger.debug("- waiting for data ACK")
+ preread_len = USBPACKET_MAX_SIZE + 1 # read enough for a controlRead
+ dat = self._wait_for_ack(spi, DACK, timeout, 0x13, length=3 + preread_len)
+
+ # get response length, then response
+ response_len = struct.unpack(" max_rx_len:
+ raise PandaSpiException(f"response length greater than max ({max_rx_len} {response_len})")
+
+ # read rest
+ remaining = (response_len + 1) - preread_len
+ if remaining > 0:
+ dat += bytes(spi.readbytes(remaining))
+
+ dat = dat[:3 + response_len + 1]
+ if self._calc_checksum(dat) != 0:
+ raise PandaSpiBadChecksum
+
+ return dat[3:-1]
+
+ def _transfer(self, endpoint: int, data, timeout: int, max_rx_len: int = 1000, expect_disconnect: bool = False) -> bytes:
+ logger.debug("starting transfer: endpoint=%d, max_rx_len=%d", endpoint, max_rx_len)
+ logger.debug("==============================================")
+
+ n = 0
+ start_time = time.monotonic()
+ exc = PandaSpiException()
+ while (timeout == 0) or (time.monotonic() - start_time) < timeout*1e-3:
+ n += 1
+ logger.debug("\ntry #%d", n)
+ with self.dev.acquire() as spi:
+ try:
+ return self._transfer_spidev(spi, endpoint, data, timeout, max_rx_len, expect_disconnect)
+ except PandaSpiException as e:
+ exc = e
+ logger.debug("SPI transfer failed, retrying", exc_info=True)
+ if self.no_retry:
+ break
+
+ # ensure slave is in a consistent state and ready for the next transfer
+ # (e.g. slave TX buffer isn't stuck full)
+ nack_cnt = 0
+ attempts = 5
+ while (nack_cnt <= 3) and (attempts > 0):
+ attempts -= 1
+ try:
+ self._wait_for_ack(spi, NACK, MIN_ACK_TIMEOUT_MS, 0x11, length=XFER_SIZE//2)
+ nack_cnt += 1
+ except PandaSpiException:
+ nack_cnt = 0
+
+ raise exc
+
+ def get_protocol_version(self) -> bytes:
+ vers_str = b"VERSION"
+ def _get_version(spi) -> bytes:
+ spi.writebytes(vers_str)
+
+ logger.debug("- waiting for echo")
+ start = time.monotonic()
+ while True:
+ version_bytes = spi.readbytes(len(vers_str) + 2)
+ if bytes(version_bytes).startswith(vers_str):
+ break
+ if (time.monotonic() - start) > 0.001:
+ raise PandaSpiMissingAck
+
+ rlen = struct.unpack(" 1000:
+ raise PandaSpiException("response length greater than max")
+
+ # get response
+ dat = spi.readbytes(rlen + 1)
+ resp = dat[:-1]
+ calculated_crc = crc8(bytes(version_bytes + resp))
+ if calculated_crc != dat[-1]:
+ raise PandaSpiBadChecksum
+ return bytes(resp)
+
+ exc = PandaSpiException()
+ with self.dev.acquire() as spi:
+ for _ in range(10):
+ try:
+ return _get_version(spi)
+ except PandaSpiException as e:
+ exc = e
+ logger.debug("SPI get protocol version failed, retrying", exc_info=True)
+ raise exc
+
+ # libusb1 functions
+ def close(self):
+ self.dev.close()
+
+ def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False):
+ return self._transfer(0, struct.pack(" int:
+ mv = memoryview(data)
+ for x in range(math.ceil(len(data) / XFER_SIZE)):
+ self._transfer(endpoint, mv[XFER_SIZE*x:XFER_SIZE*(x+1)], timeout)
+ return len(data)
+
+ def bulkRead(self, endpoint: int, length: int, timeout: int = TIMEOUT) -> bytes:
+ ret = b""
+ for _ in range(math.ceil(length / XFER_SIZE)):
+ d = self._transfer(endpoint, [], timeout, max_rx_len=XFER_SIZE)
+ ret += d
+ if len(d) < XFER_SIZE:
+ break
+ return ret
+
+
+class STBootloaderSPIHandle(BaseSTBootloaderHandle):
+ """
+ Implementation of the STM32 SPI bootloader protocol described in:
+ https://www.st.com/resource/en/application_note/an4286-spi-protocol-used-in-the-stm32-bootloader-stmicroelectronics.pdf
+
+ NOTE: the bootloader's state machine is fragile and immediately gets into a bad state when
+ sending any junk, e.g. when using the panda SPI protocol.
+ """
+
+ SYNC = 0x5A
+ ACK = 0x79
+ NACK = 0x1F
+
+ def __init__(self):
+ self.dev = SpiDevice(speed=1000000)
+
+ # say hello
+ try:
+ with self.dev.acquire() as spi:
+ spi.xfer([self.SYNC, ])
+ try:
+ self._get_ack(spi, 0.1)
+ except (PandaSpiNackResponse, PandaSpiMissingAck):
+ # NACK ok here, will only ACK the first time
+ pass
+
+ self._mcu_type = MCU_TYPE_BY_IDCODE[self.get_chip_id()]
+ except PandaSpiException:
+ raise PandaSpiException("failed to connect to panda") from None
+
+ def _get_ack(self, spi, timeout=1.0):
+ data = 0x00
+ start_time = time.monotonic()
+ while data not in (self.ACK, self.NACK) and (time.monotonic() - start_time < timeout):
+ data = spi.xfer([0x00, ])[0]
+ time.sleep(0)
+ spi.xfer([self.ACK, ])
+
+ if data == self.NACK:
+ raise PandaSpiNackResponse
+ elif data != self.ACK:
+ raise PandaSpiMissingAck
+
+ def _cmd_no_retry(self, cmd: int, data: list[bytes] | None = None, read_bytes: int = 0, predata=None) -> bytes:
+ ret = b""
+ with self.dev.acquire() as spi:
+ # sync + command
+ spi.xfer([self.SYNC, ])
+ spi.xfer([cmd, cmd ^ 0xFF])
+ self._get_ack(spi, timeout=0.01)
+
+ # "predata" - for commands that send the first data without a checksum
+ if predata is not None:
+ spi.xfer(predata)
+ self._get_ack(spi)
+
+ # send data
+ if data is not None:
+ for d in data:
+ if predata is not None:
+ spi.xfer(d + self._checksum(predata + d))
+ else:
+ spi.xfer(d + self._checksum(d))
+ self._get_ack(spi, timeout=20)
+
+ # receive
+ if read_bytes > 0:
+ ret = spi.xfer([0x00, ]*(read_bytes + 1))[1:]
+ if data is None or len(data) == 0:
+ self._get_ack(spi)
+
+ return bytes(ret)
+
+ def _cmd(self, cmd: int, data: list[bytes] | None = None, read_bytes: int = 0, predata=None) -> bytes:
+ exc = PandaSpiException()
+ for n in range(MAX_XFER_RETRY_COUNT):
+ try:
+ return self._cmd_no_retry(cmd, data, read_bytes, predata)
+ except PandaSpiException as e:
+ exc = e
+ logger.debug("SPI transfer failed, %d retries left", MAX_XFER_RETRY_COUNT - n - 1, exc_info=True)
+ raise exc
+
+ def _checksum(self, data: bytes) -> bytes:
+ if len(data) == 1:
+ ret = data[0] ^ 0xFF
+ else:
+ ret = reduce(lambda a, b: a ^ b, data)
+ return bytes([ret, ])
+
+ # *** Bootloader commands ***
+
+ def read(self, address: int, length: int):
+ data = [struct.pack('>I', address), struct.pack('B', length - 1)]
+ return self._cmd(0x11, data=data, read_bytes=length)
+
+ def get_bootloader_id(self):
+ return self.read(0x1FF1E7FE, 1)
+
+ def get_chip_id(self) -> int:
+ r = self._cmd(0x02, read_bytes=3)
+ if r[0] != 1: # response length - 1
+ raise PandaSpiException("incorrect response length")
+ return ((r[1] << 8) + r[2])
+
+ def go_cmd(self, address: int) -> None:
+ self._cmd(0x21, data=[struct.pack('>I', address), ])
+
+ # *** helpers ***
+
+ def get_uid(self):
+ dat = self.read(McuType.H7.config.uid_address, 12)
+ return binascii.hexlify(dat).decode()
+
+ def erase_sector(self, sector: int):
+ p = struct.pack('>H', 0) # number of sectors to erase
+ d = struct.pack('>H', sector)
+ self._cmd(0x44, data=[d, ], predata=p)
+
+ # *** PandaDFU API ***
+
+ def get_mcu_type(self):
+ return self._mcu_type
+
+ def clear_status(self):
+ pass
+
+ def close(self):
+ self.dev.close()
+
+ def program(self, address, dat):
+ bs = 256 # max block size for writing to flash over SPI
+ dat += b"\xFF" * ((bs - len(dat)) % bs)
+ for i in range(len(dat) // bs):
+ block = dat[i * bs:(i + 1) * bs]
+ self._cmd(0x31, data=[
+ struct.pack('>I', address + i*bs),
+ bytes([len(block) - 1]) + block,
+ ])
+
+ def jump(self, address):
+ self.go_cmd(self._mcu_type.config.bootstub_address)
diff --git a/panda/python/usb.py b/panda/python/usb.py
new file mode 100644
index 000000000..0a012896b
--- /dev/null
+++ b/panda/python/usb.py
@@ -0,0 +1,98 @@
+import struct
+
+from .base import BaseHandle, BaseSTBootloaderHandle, TIMEOUT
+from .constants import McuType
+
+class PandaUsbHandle(BaseHandle):
+ def __init__(self, libusb_handle):
+ self._libusb_handle = libusb_handle
+
+ def close(self):
+ self._libusb_handle.close()
+
+ def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False):
+ return self._libusb_handle.controlWrite(request_type, request, value, index, data, timeout)
+
+ def controlRead(self, request_type: int, request: int, value: int, index: int, length: int, timeout: int = TIMEOUT):
+ return self._libusb_handle.controlRead(request_type, request, value, index, length, timeout)
+
+ def bulkWrite(self, endpoint: int, data: bytes, timeout: int = TIMEOUT) -> int:
+ return self._libusb_handle.bulkWrite(endpoint, data, timeout) # type: ignore
+
+ def bulkRead(self, endpoint: int, length: int, timeout: int = TIMEOUT) -> bytes:
+ return self._libusb_handle.bulkRead(endpoint, length, timeout) # type: ignore
+
+
+
+class STBootloaderUSBHandle(BaseSTBootloaderHandle):
+ DFU_DNLOAD = 1
+ DFU_UPLOAD = 2
+ DFU_GETSTATUS = 3
+ DFU_CLRSTATUS = 4
+ DFU_ABORT = 6
+
+ def __init__(self, libusb_device, libusb_handle):
+ self._libusb_handle = libusb_handle
+
+ # example from F4: lsusb -v | grep Flash
+ # iInterface 4 @Internal Flash /0x08000000/04*016Kg,01*064Kg,011*128Kg
+ for i in range(20):
+ desc = libusb_handle.getStringDescriptor(i, 0)
+ if desc is not None and desc.startswith("@Internal Flash"):
+ sector_count = sum([int(s.split('*')[0]) for s in desc.split('/')[-1].split(',')])
+ break
+ mcu_by_sector_count = {m.config.sector_count: m for m in McuType}
+ assert sector_count in mcu_by_sector_count, f"Unkown MCU: {sector_count=}"
+ self._mcu_type = mcu_by_sector_count[sector_count]
+
+ def _status(self) -> None:
+ while 1:
+ dat = self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6)
+ if dat[1] == 0:
+ break
+
+ def _erase_page_address(self, address: int) -> None:
+ self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 0, 0, b"\x41" + struct.pack("I", address))
+ self._status()
+
+ def get_mcu_type(self):
+ return self._mcu_type
+
+ def erase_sector(self, sector: int):
+ self._erase_page_address(self._mcu_type.config.sector_address(sector))
+
+ def clear_status(self):
+ # Clear status
+ stat = self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6)
+ if stat[4] == 0xa:
+ self._libusb_handle.controlRead(0x21, self.DFU_CLRSTATUS, 0, 0, 0)
+ elif stat[4] == 0x9:
+ self._libusb_handle.controlWrite(0x21, self.DFU_ABORT, 0, 0, b"")
+ self._status()
+ stat = str(self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6))
+
+ def close(self):
+ self._libusb_handle.close()
+
+ def program(self, address, dat):
+ # Set Address Pointer
+ self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 0, 0, b"\x21" + struct.pack("I", address))
+ self._status()
+
+ # Program
+ bs = min(len(dat), self._mcu_type.config.block_size)
+ dat += b"\xFF" * ((bs - len(dat)) % bs)
+ for i in range(len(dat) // bs):
+ ldat = dat[i * bs:(i + 1) * bs]
+ print("programming %d with length %d" % (i, len(ldat)))
+ self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 2 + i, 0, ldat)
+ self._status()
+
+ def jump(self, address):
+ self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 0, 0, b"\x21" + struct.pack("I", address))
+ self._status()
+ try:
+ self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 2, 0, b"")
+ _ = str(self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6))
+ except Exception:
+ pass
diff --git a/panda/python/utils.py b/panda/python/utils.py
new file mode 100644
index 000000000..55181e08b
--- /dev/null
+++ b/panda/python/utils.py
@@ -0,0 +1,11 @@
+import os
+import logging
+
+# set up logging
+LOGLEVEL = os.environ.get('LOGLEVEL', 'INFO').upper()
+logger = logging.getLogger('panda')
+logger.setLevel(LOGLEVEL)
+
+handler = logging.StreamHandler()
+handler.setFormatter(logging.Formatter('%(message)s'))
+logger.addHandler(handler)
diff --git a/panda/scripts/benchmark.py b/panda/scripts/benchmark.py
new file mode 100755
index 000000000..606338047
--- /dev/null
+++ b/panda/scripts/benchmark.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+import io
+import os
+import time
+import pstats
+import cProfile
+from contextlib import contextmanager
+
+from panda import Panda, PandaDFU
+from panda.tests.hitl.helpers import get_random_can_messages
+
+
+PROFILE = "PROFILE" in os.environ
+
+@contextmanager
+def print_time(desc):
+ if PROFILE:
+ pr = cProfile.Profile()
+ pr.enable()
+ start = time.perf_counter()
+ yield
+ end = time.perf_counter()
+ print(f"{end - start:.3f}s - {desc}")
+ if PROFILE:
+ pr.disable()
+ s = io.StringIO()
+ ps = pstats.Stats(pr, stream=s).sort_stats("cumtime")
+ ps.print_stats()
+ print(s.getvalue())
+
+
+if __name__ == "__main__":
+ with print_time("Panda()"):
+ p = Panda()
+
+ with print_time("PandaDFU.list()"):
+ PandaDFU.list()
+
+ fxn = [
+ 'reset',
+ 'reconnect',
+ 'up_to_date',
+ 'health',
+ #'flash',
+ ]
+ for f in fxn:
+ with print_time(f"Panda.{f}()"):
+ getattr(p, f)()
+
+ p.set_can_loopback(True)
+
+ for n in range(6):
+ msgs = get_random_can_messages(int(10**n))
+ with print_time(f"Panda.can_send_many() - {len(msgs)} msgs"):
+ p.can_send_many(msgs)
+
+ with print_time("Panda.can_recv()"):
+ m = p.can_recv()
diff --git a/panda/scripts/bulk_write_test.py b/panda/scripts/bulk_write_test.py
new file mode 100755
index 000000000..07fc9c8cf
--- /dev/null
+++ b/panda/scripts/bulk_write_test.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+import os
+import time
+import threading
+from typing import Any
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+JUNGLE = "JUNGLE" in os.environ
+if JUNGLE:
+ from panda import PandaJungle
+
+# The TX buffers on pandas is 0x100 in length.
+NUM_MESSAGES_PER_BUS = 10000
+
+def flood_tx(panda):
+ print('Sending!')
+ msg = b"\xaa" * 4
+ packet = [[0xaa, msg, 0], [0xaa, msg, 1], [0xaa, msg, 2]] * NUM_MESSAGES_PER_BUS
+ panda.can_send_many(packet, timeout=10000)
+ print(f"Done sending {3*NUM_MESSAGES_PER_BUS} messages!")
+
+if __name__ == "__main__":
+ serials = Panda.list()
+ if JUNGLE:
+ sender = Panda()
+ receiver = PandaJungle()
+ else:
+ if len(serials) != 2:
+ raise Exception("Connect two pandas to perform this test!")
+ sender = Panda(serials[0])
+ receiver = Panda(serials[1]) # type: ignore
+ receiver.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ sender.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ # Start transmisson
+ threading.Thread(target=flood_tx, args=(sender,)).start()
+
+ # Receive as much as we can in a few second time period
+ rx: list[Any] = []
+ old_len = 0
+ start_time = time.time()
+ while time.time() - start_time < 3 or len(rx) > old_len:
+ old_len = len(rx)
+ print(old_len)
+ rx.extend(receiver.can_recv())
+ print(f"Received {len(rx)} messages")
diff --git a/panda/scripts/can_health.py b/panda/scripts/can_health.py
new file mode 100755
index 000000000..26de9cdab
--- /dev/null
+++ b/panda/scripts/can_health.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+import time
+import re
+from panda import Panda
+
+RED = '\033[91m'
+GREEN = '\033[92m'
+
+def colorize_errors(value):
+ if isinstance(value, str):
+ if re.search(r'(?i)No error', value):
+ return f'{GREEN}{value}\033[0m'
+ elif re.search(r'(?i)(? 0.1:
+ dd = chr(27) + "[2J"
+ dd += "%5.2f\n" % (sec_since_boot() - start)
+ for (addr, bus), dat_log in sorted(all_msgs.items()):
+ dd += "%d: %s(%6d): %s\n" % (bus, "%04X(%4d)" % (addr, addr), len(dat_log), binascii.hexlify(dat_log[-1]).decode())
+ print(dd)
+ lp = sec_since_boot()
+
+if __name__ == "__main__":
+ can_printer()
diff --git a/panda/scripts/check_fw_size.py b/panda/scripts/check_fw_size.py
new file mode 100755
index 000000000..fced1eebd
--- /dev/null
+++ b/panda/scripts/check_fw_size.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+import subprocess
+from collections import defaultdict
+
+
+def check_space(file, mcu):
+ MCUS = {
+ "H7": {
+ ".flash": 1024*1024, # FLASH
+ ".dtcmram": 128*1024, # DTCMRAM
+ ".itcmram": 64*1024, # ITCMRAM
+ ".axisram": 320*1024, # AXI SRAM
+ ".sram12": 32*1024, # SRAM1(16kb) + SRAM2(16kb)
+ ".sram4": 16*1024, # SRAM4
+ ".backup_sram": 4*1024, # SRAM4
+ },
+ }
+ IGNORE_LIST = [
+ ".ARM.attributes",
+ ".comment",
+ ".debug_line",
+ ".debug_info",
+ ".debug_abbrev",
+ ".debug_aranges",
+ ".debug_str",
+ ".debug_ranges",
+ ".debug_loc",
+ ".debug_frame",
+ ".debug_line_str",
+ ".debug_rnglists",
+ ".debug_loclists",
+ ]
+ FLASH = [
+ ".isr_vector",
+ ".text",
+ ".rodata",
+ ".data"
+ ]
+ RAM = [
+ ".data",
+ ".bss",
+ "._user_heap_stack" # _user_heap_stack considered free?
+ ]
+
+ result = {}
+ calcs = defaultdict(int)
+
+ output = str(subprocess.check_output(f"arm-none-eabi-size -x --format=sysv {file}", shell=True), 'utf-8')
+
+ for row in output.split('\n'):
+ pop = False
+ line = row.split()
+ if len(line) == 3 and line[0].startswith('.'):
+ if line[0] in IGNORE_LIST:
+ continue
+ result[line[0]] = [line[1], line[2]]
+ if line[0] in FLASH:
+ calcs[".flash"] += int(line[1], 16)
+ pop = True
+ if line[0] in RAM:
+ calcs[".dtcmram"] += int(line[1], 16)
+ pop = True
+ if pop:
+ result.pop(line[0])
+
+ if len(result):
+ for line in result:
+ calcs[line] += int(result[line][0], 16)
+
+ print(f"=======SUMMARY FOR {mcu} FILE {file}=======")
+ for line in calcs:
+ if line in MCUS[mcu]:
+ used_percent = (100 - (MCUS[mcu][line] - calcs[line]) / MCUS[mcu][line] * 100)
+ print(f"SECTION: {line} size: {MCUS[mcu][line]} USED: {calcs[line]}({used_percent:.2f}%) FREE: {MCUS[mcu][line] - calcs[line]}")
+ else:
+ print(line, calcs[line])
+ print()
+
+
+if __name__ == "__main__":
+ # panda
+ check_space("../board/obj/panda_h7/bootstub.elf", "H7")
+ check_space("../board/obj/panda_h7/main.elf", "H7")
+ # jungle v2
+ check_space("../board/obj/panda_jungle_h7/bootstub.elf", "H7")
+ check_space("../board/obj/panda_jungle_h7/main.elf", "H7")
+ # body
+ check_space("../board/obj/body_h7/bootstub.elf", "H7")
+ check_space("../board/obj/body_h7/main.elf", "H7")
diff --git a/panda/scripts/debug_console.py b/panda/scripts/debug_console.py
new file mode 100755
index 000000000..8755be149
--- /dev/null
+++ b/panda/scripts/debug_console.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+import time
+import select
+import codecs
+
+from panda import Panda
+
+setcolor = ["\033[1;32;40m", "\033[1;31;40m"]
+unsetcolor = "\033[00m"
+
+port_number = int(os.getenv("PORT", "0"))
+claim = os.getenv("CLAIM") is not None
+no_color = os.getenv("NO_COLOR") is not None
+no_reconnect = os.getenv("NO_RECONNECT") is not None
+
+if __name__ == "__main__":
+ while True:
+ try:
+ serials = Panda.list()
+ if os.getenv("SERIAL"):
+ serials = [x for x in serials if x == os.getenv("SERIAL")]
+
+ pandas = [Panda(x, claim=claim) for x in serials]
+ decoders = [codecs.getincrementaldecoder('utf-8')() for _ in pandas]
+
+ if not len(pandas):
+ print("no pandas found")
+ if no_reconnect:
+ sys.exit(0)
+ time.sleep(1)
+ continue
+
+ if os.getenv("BAUD") is not None:
+ for panda in pandas:
+ panda.set_uart_baud(port_number, int(os.getenv("BAUD"))) # type: ignore
+
+ while True:
+ for i, panda in enumerate(pandas):
+ while True:
+ ret = panda.serial_read(port_number)
+ if len(ret) > 0:
+ decoded = decoders[i].decode(ret)
+ if no_color:
+ sys.stdout.write(decoded)
+ else:
+ sys.stdout.write(setcolor[i] + decoded + unsetcolor)
+ sys.stdout.flush()
+ else:
+ break
+ if select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):
+ ln = sys.stdin.readline()
+ if claim:
+ panda.serial_write(port_number, ln)
+ time.sleep(0.01)
+ except KeyboardInterrupt:
+ break
+ except Exception:
+ print("panda disconnected!")
+ time.sleep(0.5)
diff --git a/panda/scripts/development/register_hashmap_spread.py b/panda/scripts/development/register_hashmap_spread.py
new file mode 100755
index 000000000..854ddd140
--- /dev/null
+++ b/panda/scripts/development/register_hashmap_spread.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+import matplotlib.pyplot as plt
+
+HASHING_PRIME = 23
+REGISTER_MAP_SIZE = 0x3FF
+BYTES_PER_REG = 4
+
+# From ST32F413 datasheet
+REGISTER_ADDRESS_REGIONS = [
+ (0x40000000, 0x40007FFF),
+ (0x40010000, 0x400107FF),
+ (0x40011000, 0x400123FF),
+ (0x40012C00, 0x40014BFF),
+ (0x40015000, 0x400153FF),
+ (0x40015800, 0x40015BFF),
+ (0x40016000, 0x400167FF),
+ (0x40020000, 0x40021FFF),
+ (0x40023000, 0x400233FF),
+ (0x40023800, 0x40023FFF),
+ (0x40026000, 0x400267FF),
+ (0x50000000, 0x5003FFFF),
+ (0x50060000, 0x500603FF),
+ (0x50060800, 0x50060BFF),
+ (0x50060800, 0x50060BFF),
+ (0xE0000000, 0xE00FFFFF)
+]
+
+def _hash(reg_addr):
+ return (((reg_addr >> 16) ^ ((((reg_addr + 1) & 0xFFFF) * HASHING_PRIME) & 0xFFFF)) & REGISTER_MAP_SIZE)
+
+# Calculate hash for each address
+hashes = []
+double_hashes = []
+for (start_addr, stop_addr) in REGISTER_ADDRESS_REGIONS:
+ for addr in range(start_addr, stop_addr + 1, BYTES_PER_REG):
+ h = _hash(addr)
+ hashes.append(h)
+ double_hashes.append(_hash(h))
+
+# Make histograms
+plt.subplot(2, 1, 1)
+plt.hist(hashes, bins=REGISTER_MAP_SIZE)
+plt.title("Number of collisions per _hash")
+plt.xlabel("Address")
+
+plt.subplot(2, 1, 2)
+plt.hist(double_hashes, bins=REGISTER_MAP_SIZE)
+plt.title("Number of collisions per double _hash")
+plt.xlabel("Address")
+plt.show()
diff --git a/panda/scripts/echo.py b/panda/scripts/echo.py
new file mode 100755
index 000000000..c67802c4c
--- /dev/null
+++ b/panda/scripts/echo.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python3
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+# This script is intended to be used in conjunction with the echo_loopback_test.py test script from panda jungle.
+# It sends a reversed response back for every message received containing b"test".
+if __name__ == "__main__":
+ p = Panda()
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ p.set_power_save(False)
+
+ while True:
+ incoming = p.can_recv()
+ for message in incoming:
+ address, data, bus = message
+ if b'test' in data:
+ p.can_send(address, data[::-1], bus)
diff --git a/panda/scripts/fan/fan_test.py b/panda/scripts/fan/fan_test.py
new file mode 100755
index 000000000..a3872f5c2
--- /dev/null
+++ b/panda/scripts/fan/fan_test.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python
+import time
+
+from panda import Panda
+
+if __name__ == "__main__":
+ p = Panda()
+ power = 0
+ while True:
+ p.set_fan_power(power)
+ time.sleep(5)
+ print("Power: ", power, "RPM:", str(p.get_fan_rpm()))
+ power += 10
+ power %= 110
diff --git a/panda/scripts/get_version.py b/panda/scripts/get_version.py
new file mode 100755
index 000000000..a0138122b
--- /dev/null
+++ b/panda/scripts/get_version.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+from panda import Panda
+
+if __name__ == "__main__":
+ for p in Panda.list():
+ pp = Panda(p)
+ print(f"{pp.get_serial()[0]}: {pp.get_version()}")
diff --git a/panda/scripts/ir_test.py b/panda/scripts/ir_test.py
new file mode 100755
index 000000000..e41decf25
--- /dev/null
+++ b/panda/scripts/ir_test.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+import time
+
+from panda import Panda
+
+power = 0
+if __name__ == "__main__":
+ p = Panda()
+ while True:
+ p.set_ir_power(power)
+ print("Power: ", str(power))
+ time.sleep(1)
+ power += 10
+ power %= 100
diff --git a/panda/scripts/loopback_test.py b/panda/scripts/loopback_test.py
new file mode 100755
index 000000000..1a01cc1f1
--- /dev/null
+++ b/panda/scripts/loopback_test.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python3
+
+import os
+import time
+import random
+import argparse
+from itertools import permutations
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+def get_test_string():
+ return b"test" + os.urandom(10)
+
+def run_test(sleep_duration):
+ pandas = Panda.list()
+ print(pandas)
+
+ if len(pandas) < 2:
+ raise Exception("Minimum two pandas are needed for test")
+
+ run_test_w_pandas(pandas, sleep_duration)
+
+def run_test_w_pandas(pandas, sleep_duration):
+ h = [Panda(x) for x in pandas]
+ print("H", h)
+
+ for hh in h:
+ hh.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ # test both directions
+ for ho in permutations(list(range(len(h))), r=2):
+ print("***************** TESTING", ho)
+
+ panda0, panda1 = h[ho[0]], h[ho[1]]
+
+ # **** test health packet ****
+ print("health", ho[0], h[ho[0]].health())
+
+ # **** test can line loopback ****
+ for bus, obd in [(0, False), (1, False), (2, False), (1, True), (2, True)]:
+ print("\ntest can", bus)
+ # flush
+ cans_echo = panda0.can_recv()
+ cans_loop = panda1.can_recv()
+
+ panda0.set_obd(None)
+ panda1.set_obd(None)
+
+ if obd is True:
+ panda0.set_obd(bus)
+ panda1.set_obd(bus)
+ bus = 3
+
+ # send the characters
+ at = random.randint(1, 2000)
+ st = get_test_string()[0:8]
+ panda0.can_send(at, st, bus)
+ time.sleep(0.1)
+
+ # check for receive
+ cans_echo = panda0.can_recv()
+ cans_loop = panda1.can_recv()
+
+ print("Bus", bus, "echo", cans_echo, "loop", cans_loop)
+
+ assert len(cans_echo) == 1
+ assert len(cans_loop) == 1
+
+ assert cans_echo[0][0] == at
+ assert cans_loop[0][0] == at
+
+ assert cans_echo[0][1] == st
+ assert cans_loop[0][1] == st
+
+ assert cans_echo[0][2] == 0x80 | bus
+ if cans_loop[0][2] != bus:
+ print("EXPECTED %d GOT %d" % (bus, cans_loop[0][2]))
+ assert cans_loop[0][2] == bus
+
+ print("CAN pass", bus, ho)
+ time.sleep(sleep_duration)
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-n", type=int, help="Number of test iterations to run")
+ parser.add_argument("-sleep", type=int, help="Sleep time between tests", default=0)
+ args = parser.parse_args()
+
+ if args.n is None:
+ while True:
+ run_test(sleep_duration=args.sleep)
+ else:
+ for _ in range(args.n):
+ run_test(sleep_duration=args.sleep)
diff --git a/panda/scripts/make_release.sh b/panda/scripts/make_release.sh
new file mode 100755
index 000000000..cfecac3a1
--- /dev/null
+++ b/panda/scripts/make_release.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+export CERT=/home/batman/xx/pandaextra/certs/release
+
+if [ ! -f "$CERT" ]; then
+ echo "No release cert found, cannot build release."
+ echo "You probably aren't looking to do this anyway."
+ exit
+fi
+
+export RELEASE=1
+export BUILDER=DEV
+
+cd $DIR/../board
+scons -u -c
+rm obj/*
+scons -u
+cd obj
+RELEASE_NAME=$(awk '{print $1}' version)
+zip -j ../../release/panda-$RELEASE_NAME.zip version panda.bin.signed bootstub.panda.bin panda_h7.bin.signed bootstub.panda_h7.bin
diff --git a/panda/scripts/message_drop_test.py b/panda/scripts/message_drop_test.py
new file mode 100755
index 000000000..76d0f7824
--- /dev/null
+++ b/panda/scripts/message_drop_test.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+import os
+import usb1
+import time
+import struct
+import itertools
+import threading
+from typing import Any
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+JUNGLE = "JUNGLE" in os.environ
+if JUNGLE:
+ from panda import PandaJungle
+
+# Generate unique messages
+NUM_MESSAGES_PER_BUS = 10000
+messages = [bytes(struct.pack("Q", i)) for i in range(NUM_MESSAGES_PER_BUS)]
+tx_messages = list(itertools.chain.from_iterable([[0xaa, msg, 0], [0xaa, msg, 1], [0xaa, msg, 2]] for msg in messages))
+
+def flood_tx(panda):
+ print('Sending!')
+ transferred = 0
+ while True:
+ try:
+ print(f"Sending block {transferred}-{len(tx_messages)}: ", end="")
+ panda.can_send_many(tx_messages[transferred:], timeout=10)
+ print("OK")
+ break
+ except usb1.USBErrorTimeout as e:
+ transferred += (e.transferred // 16)
+ print("timeout, transferred: ", transferred)
+
+ print(f"Done sending {3*NUM_MESSAGES_PER_BUS} messages!")
+
+if __name__ == "__main__":
+ serials = Panda.list()
+ receiver: Panda | PandaJungle
+ if JUNGLE:
+ sender = Panda()
+ receiver = PandaJungle()
+ else:
+ if len(serials) != 2:
+ raise Exception("Connect two pandas to perform this test!")
+ sender = Panda(serials[0])
+ receiver = Panda(serials[1])
+ receiver.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ sender.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ # Start transmisson
+ threading.Thread(target=flood_tx, args=(sender,)).start()
+
+ # Receive as much as we can, and stop when there hasn't been anything for a second
+ rx: list[Any] = []
+ old_len = 0
+ last_change = time.monotonic()
+ while time.monotonic() - last_change < 1:
+ if old_len < len(rx):
+ last_change = time.monotonic()
+ old_len = len(rx)
+
+ rx.extend(receiver.can_recv())
+ print(f"Received {len(rx)} messages")
+
+ # Check if we received everything
+ for bus in range(3):
+ received_msgs = {bytes(m[1]) for m in filter(lambda m, b=bus: m[2] == b, rx)} # type: ignore
+ dropped_msgs = set(messages).difference(received_msgs)
+ print(f"Bus {bus} dropped msgs: {len(list(dropped_msgs))} / {len(messages)}")
diff --git a/panda/scripts/read_flash_spi.py b/panda/scripts/read_flash_spi.py
new file mode 100755
index 000000000..133062be7
--- /dev/null
+++ b/panda/scripts/read_flash_spi.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+from panda import Panda, PandaDFU
+
+if __name__ == "__main__":
+ try:
+ from openpilot.system.hardware import HARDWARE
+ HARDWARE.recover_internal_panda()
+ Panda.wait_for_dfu(None, 5)
+ except Exception:
+ pass
+
+ p = PandaDFU(None)
+ cfg = p.get_mcu_type().config
+
+ def readmem(addr, length, fn):
+ print(f"reading {hex(addr)} {hex(length)} bytes to {fn}")
+ max_size = 255
+ with open(fn, "wb") as f:
+ to_read = length
+ while to_read > 0:
+ l = min(to_read, max_size)
+ dat = p._handle.read(addr, l)
+ assert len(dat) == l
+ f.write(dat)
+
+ to_read -= len(dat)
+ addr += len(dat)
+
+ addr = cfg.bootstub_address
+ for i, sector_size in enumerate(cfg.sector_sizes):
+ readmem(addr, sector_size, f"sector_{i}.bin")
+ addr += sector_size
diff --git a/panda/scripts/read_st_flash.sh b/panda/scripts/read_st_flash.sh
new file mode 100755
index 000000000..65b0709f6
--- /dev/null
+++ b/panda/scripts/read_st_flash.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+rm -f /tmp/dump_bootstub
+rm -f /tmp/dump_main
+dfu-util -a 0 -s 0x08000000 -U /tmp/dump_bootstub
+dfu-util -a 0 -s 0x08004000 -U /tmp/dump_main
+
diff --git a/panda/scripts/reflash_internal_panda.py b/panda/scripts/reflash_internal_panda.py
new file mode 100755
index 000000000..e892faf87
--- /dev/null
+++ b/panda/scripts/reflash_internal_panda.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+import time
+from panda import Panda, PandaDFU
+
+class GPIO:
+ STM_RST_N = 124
+ STM_BOOT0 = 134
+
+
+def gpio_init(pin, output):
+ with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f:
+ f.write(b"out" if output else b"in")
+
+def gpio_set(pin, high):
+ with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f:
+ f.write(b"1" if high else b"0")
+
+
+if __name__ == "__main__":
+ for pin in (GPIO.STM_RST_N, GPIO.STM_BOOT0):
+ gpio_init(pin, True)
+
+ # flash bootstub
+ print("resetting into DFU")
+ gpio_set(GPIO.STM_RST_N, 1)
+ gpio_set(GPIO.STM_BOOT0, 1)
+ time.sleep(0.2)
+ gpio_set(GPIO.STM_RST_N, 0)
+ gpio_set(GPIO.STM_BOOT0, 0)
+
+ # bootstub flash takes 2s and is limited by the 255 byte flashing chunk size
+ print("flashing bootstub")
+ assert Panda.wait_for_dfu(None, 5)
+ PandaDFU(None).recover()
+
+ print("flashing app")
+ assert Panda.wait_for_panda(None, 5)
+ p = Panda()
+ assert p.bootstub
+ p.flash()
diff --git a/panda/scripts/relay_test.py b/panda/scripts/relay_test.py
new file mode 100755
index 000000000..0ee111f91
--- /dev/null
+++ b/panda/scripts/relay_test.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+import time
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+p = Panda()
+
+while True:
+ p.set_safety_mode(CarParams.SafetyModel.toyota)
+ p.send_heartbeat()
+ print("ON")
+ time.sleep(1)
+ p.set_safety_mode(CarParams.SafetyModel.noOutput)
+ p.send_heartbeat()
+ print("OFF")
+ time.sleep(1)
+
diff --git a/panda/scripts/restore_flash_spi.py b/panda/scripts/restore_flash_spi.py
new file mode 100755
index 000000000..c23b29828
--- /dev/null
+++ b/panda/scripts/restore_flash_spi.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+from panda import Panda, PandaDFU, STBootloaderSPIHandle
+
+if __name__ == "__main__":
+ try:
+ from openpilot.system.hardware import HARDWARE
+ HARDWARE.recover_internal_panda()
+ Panda.wait_for_dfu(None, 5)
+ except Exception:
+ pass
+
+ p = PandaDFU(None)
+ assert isinstance(p._handle, STBootloaderSPIHandle)
+ cfg = p.get_mcu_type().config
+
+ print("restoring from backup...")
+ addr = cfg.bootstub_address
+ for i, sector_size in enumerate(cfg.sector_sizes):
+ print(f"- sector #{i}")
+ p._handle.erase_sector(i)
+ with open(f"sector_{i}.bin", "rb") as f:
+ dat = f.read()
+ assert len(dat) == sector_size
+ p._handle.program(addr, dat)
+ addr += len(dat)
+
+ p.reset()
diff --git a/panda/scripts/som_debug.sh b/panda/scripts/som_debug.sh
new file mode 100755
index 000000000..6f0a86537
--- /dev/null
+++ b/panda/scripts/som_debug.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+PYTHONUNBUFFERED=1 NO_COLOR=1 CLAIM=1 PORT=4 ./debug_console.py
diff --git a/panda/scripts/spam_can.py b/panda/scripts/spam_can.py
new file mode 100755
index 000000000..2025650ec
--- /dev/null
+++ b/panda/scripts/spam_can.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+import os
+import random
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+def get_test_string():
+ return b"test" + os.urandom(10)
+
+if __name__ == "__main__":
+ p = Panda()
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ print("Spamming all buses...")
+ while True:
+ at = random.randint(1, 2000)
+ st = get_test_string()[0:8]
+ bus = random.randint(0, 2)
+ p.can_send(at, st, bus)
+ # print("Sent message on bus: ", bus)
diff --git a/panda/scripts/spi_test.py b/panda/scripts/spi_test.py
new file mode 100755
index 000000000..14bc6e39e
--- /dev/null
+++ b/panda/scripts/spi_test.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+import os
+import sys
+import time
+from datetime import datetime
+from collections import defaultdict, deque
+
+os.environ['NO_RETRY'] = '1' # no spi retries
+from panda import Panda, PandaSpiException
+
+
+if __name__ == "__main__":
+ s = defaultdict(lambda: deque(maxlen=30))
+ def avg(k):
+ return sum(s[k])/len(s[k])
+
+ #core = 6
+ #from openpilot.common.realtime import config_realtime_process
+ #config_realtime_process(core, 10)
+ #os.system(f"echo {core} | sudo tee /proc/irq/10/smp_affinity_list")
+ #os.system("sudo chrt -f -p 1 $(pgrep -f spi0)")
+ #print(f"sudo taskset -pc {core} $(pgrep -f spi0)")
+ #os.system(f"sudo taskset -pc {core} $(pgrep -f spi0)")
+
+ p = Panda()
+ p.reset()
+ start = datetime.now()
+ le = p.health()['spi_error_count']
+ while True:
+ cnt = 0
+ st = time.monotonic()
+ while time.monotonic() - st < 1:
+ try:
+ p.get_type() # get_type has no processing on panda side
+ except PandaSpiException:
+ print(f"ERROR after {datetime.now() - start}\n\n")
+ sys.stdout.write("\033[1;32;40m" + p.serial_read(0).decode('utf8') + "\033[00m" + "\n")
+ sys.stdout.flush()
+ sys.exit()
+ cnt += 1
+ s['hz'].append(cnt)
+
+ err = p.health()['spi_error_count']
+ s['err'].append((err - le) & 0xFFFFFFFF)
+ le = err
+
+ print(
+ f"{avg('hz'):04.0f}Hz {avg('err'):04.0f} errors [{cnt:04d}Hz {s['err'][-1]:04d} errors] {datetime.now() - start}"
+ )
+
diff --git a/panda/scripts/standalone_test.py b/panda/scripts/standalone_test.py
new file mode 100755
index 000000000..d73c5381a
--- /dev/null
+++ b/panda/scripts/standalone_test.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python3
+import struct
+import time
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+if __name__ == "__main__":
+ p = Panda()
+ print(p.get_serial())
+ print(p.health())
+
+ t1 = time.time()
+ for _ in range(100):
+ p.get_serial()
+ t2 = time.time()
+ print("100 requests took %.2f ms" % ((t2 - t1) * 1000))
+
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ a = 0
+ while True:
+ # flood
+ msg = b"\xaa" * 4 + struct.pack("I", a)
+ p.can_send(0xaa, msg, 0)
+ p.can_send(0xaa, msg, 1)
+ p.can_send(0xaa, msg, 4)
+ time.sleep(0.01)
+
+ dat = p.can_recv()
+ if len(dat) > 0:
+ print(dat)
+ a += 1
diff --git a/panda/scripts/test_canfd.py b/panda/scripts/test_canfd.py
new file mode 100755
index 000000000..d2080698f
--- /dev/null
+++ b/panda/scripts/test_canfd.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python3
+import os
+import time
+import random
+from collections import defaultdict
+from iqdbc.car.structs import CarParams
+from panda import Panda, calculate_checksum, DLC_TO_LEN
+from panda import PandaJungle
+from panda.tests.hitl.helpers import time_many_sends
+
+H7_HW_TYPES = [Panda.HW_TYPE_RED_PANDA, Panda.HW_TYPE_RED_PANDA_V2]
+JUNGLE_SERIAL = os.getenv("JUNGLE")
+H7_PANDAS_EXCLUDE = [] # type: ignore
+if os.getenv("H7_PANDAS_EXCLUDE"):
+ H7_PANDAS_EXCLUDE = os.getenv("H7_PANDAS_EXCLUDE").strip().split(" ") # type: ignore
+
+def panda_reset():
+ panda_serials = []
+
+ panda_jungle = PandaJungle(JUNGLE_SERIAL)
+ panda_jungle.set_can_silent(True)
+ panda_jungle.set_panda_power(False)
+ time.sleep(1)
+ panda_jungle.set_panda_power(True)
+ time.sleep(4)
+
+ for serial in Panda.list():
+ if serial not in H7_PANDAS_EXCLUDE:
+ with Panda(serial=serial) as p:
+ if p.get_type() in H7_HW_TYPES:
+ p.reset()
+ panda_serials.append(serial)
+
+ print("test pandas", panda_serials)
+ assert len(panda_serials) == 2, "Two H7 pandas required"
+
+ return panda_serials
+
+def panda_init(serial, enable_canfd=False, enable_non_iso=False):
+ p = Panda(serial=serial)
+ p.set_power_save(False)
+ for bus in range(3):
+ p.set_can_speed_kbps(0, 500)
+ if enable_canfd:
+ p.set_can_data_speed_kbps(bus, 2000)
+ if enable_non_iso:
+ p.set_canfd_non_iso(bus, True)
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ return p
+
+def test_canfd_throughput(p, p_recv=None):
+ two_pandas = p_recv is not None
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ if two_pandas:
+ p_recv.set_safety_mode(CarParams.SafetyModel.allOutput)
+ # enable output mode
+ else:
+ p.set_can_loopback(True)
+
+ tests = [
+ [500, 1000, 2000], # speeds
+ [93, 87, 78], # saturation thresholds
+ ]
+
+ for i in range(len(tests[0])):
+ # set bus 0 data speed to speed
+ p.set_can_data_speed_kbps(0, tests[0][i])
+ if p_recv is not None:
+ p_recv.set_can_data_speed_kbps(0, tests[0][i])
+ time.sleep(0.05)
+
+ comp_kbps = time_many_sends(p, 0, p_recv=p_recv, msg_count=400, two_pandas=two_pandas, msg_len=64)
+
+ # bit count from https://en.wikipedia.org/wiki/CAN_bus
+ saturation_pct = (comp_kbps / tests[0][i]) * 100.0
+ assert saturation_pct > tests[1][i]
+ assert saturation_pct < 100
+
+def canfd_test(p_send, p_recv):
+ for n in range(100):
+ sent_msgs = defaultdict(set)
+ to_send = []
+ for _ in range(200):
+ bus = random.randrange(3)
+ for dlc in range(len(DLC_TO_LEN)):
+ address = random.randrange(1, 1<<29)
+ data = bytearray(random.getrandbits(8) for _ in range(DLC_TO_LEN[dlc]))
+ if len(data) >= 2:
+ data[0] = calculate_checksum(data[1:] + bytes(str(address), encoding="utf-8"))
+ to_send.append([address, data, bus])
+ sent_msgs[bus].add((address, bytes(data)))
+
+ p_send.can_send_many(to_send, timeout=0)
+
+ start_time = time.monotonic()
+ while (time.monotonic() - start_time < 1) and any(len(x) > 0 for x in sent_msgs.values()):
+ incoming = p_recv.can_recv()
+ for msg in incoming:
+ address, data, bus = msg
+ if len(data) >= 2:
+ assert calculate_checksum(data[1:] + bytes(str(address), encoding="utf-8")) == data[0]
+ k = (address, bytes(data))
+ assert k in sent_msgs[bus], f"message {k} was never sent on bus {bus}"
+ sent_msgs[bus].discard(k)
+
+ for bus in range(3):
+ assert not len(sent_msgs[bus]), f"loop {n}: bus {bus} missing {len(sent_msgs[bus])} messages"
+
+def setup_test(enable_non_iso=False):
+ panda_serials = panda_reset()
+
+ p_send = panda_init(panda_serials[0], enable_canfd=False, enable_non_iso=enable_non_iso)
+ p_recv = panda_init(panda_serials[1], enable_canfd=True, enable_non_iso=enable_non_iso)
+
+ # Check that sending panda CAN FD and BRS are turned off
+ for bus in range(3):
+ health = p_send.can_health(bus)
+ assert not health["canfd_enabled"]
+ assert not health["brs_enabled"]
+ assert health["canfd_non_iso"] == enable_non_iso
+
+ # Receiving panda sends dummy CAN FD message that should enable CAN FD on sender side
+ for bus in range(3):
+ p_recv.can_send(0x200, b"dummymessage", bus)
+ p_recv.can_recv()
+ p_send.can_recv()
+
+ # Check if all tested buses on sending panda have swithed to CAN FD with BRS
+ for bus in range(3):
+ health = p_send.can_health(bus)
+ assert health["canfd_enabled"]
+ assert health["brs_enabled"]
+ assert health["canfd_non_iso"] == enable_non_iso
+
+ return p_send, p_recv
+
+def main():
+ print("[TEST CAN-FD]")
+ p_send, p_recv = setup_test()
+ canfd_test(p_send, p_recv)
+
+ print("[TEST CAN-FD non-ISO]")
+ p_send, p_recv = setup_test(enable_non_iso=True)
+ canfd_test(p_send, p_recv)
+
+ print("[TEST CAN-FD THROUGHPUT]")
+ panda_serials = panda_reset()
+ p_send = panda_init(panda_serials[0], enable_canfd=True)
+ p_recv = panda_init(panda_serials[1], enable_canfd=True)
+ test_canfd_throughput(p_send, p_recv)
+
+if __name__ == "__main__":
+ main()
diff --git a/panda/setup.sh b/panda/setup.sh
new file mode 100755
index 000000000..042b4978a
--- /dev/null
+++ b/panda/setup.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+PLATFORM=$(uname -s)
+
+echo "installing dependencies"
+if [[ $PLATFORM == "Darwin" ]]; then
+ export HOMEBREW_NO_AUTO_UPDATE=1
+ brew install --cask gcc-arm-embedded
+ brew install python3 gcc@13
+elif [[ $PLATFORM == "Linux" ]]; then
+ # for AGNOS since we clear the apt lists
+ if [[ ! -d /"var/lib/apt/" ]]; then
+ sudo apt update
+ fi
+
+ sudo apt-get install -y --no-install-recommends \
+ curl ca-certificates \
+ make g++ git libnewlib-arm-none-eabi \
+ libusb-1.0-0 \
+ gcc-arm-none-eabi \
+ python3-dev python3-pip python3-venv
+else
+ echo "WARNING: unsupported platform. skipping apt/brew install."
+fi
+
+if ! command -v uv &>/dev/null; then
+ echo "'uv' is not installed. Installing 'uv'..."
+ curl -LsSf https://astral.sh/uv/install.sh | sh
+
+ # doesn't require sourcing on all platforms
+ set +e
+ source $HOME/.local/bin/env
+ set -e
+fi
+
+export UV_PROJECT_ENVIRONMENT="$DIR/.venv"
+uv sync --all-extras --upgrade
+source "$DIR/.venv/bin/activate"
diff --git a/panda/test.sh b/panda/test.sh
new file mode 100755
index 000000000..6412ce74b
--- /dev/null
+++ b/panda/test.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd $DIR
+
+# *** env setup ***
+source ./setup.sh
+
+# *** build ***
+scons -j8
+
+# *** lint ***
+ruff check .
+mypy python/
+
+
+# *** test ***
+
+# TODO: make randomly work
+pytest --randomly-dont-reorganize tests/
diff --git a/panda/tests/hitl/1_program.py b/panda/tests/hitl/1_program.py
new file mode 100644
index 000000000..09c8b8674
--- /dev/null
+++ b/panda/tests/hitl/1_program.py
@@ -0,0 +1,95 @@
+import os
+import time
+import pytest
+
+from panda import Panda, PandaDFU, McuType, BASEDIR
+
+
+def check_signature(p):
+ assert not p.bootstub, "Flashed firmware not booting. Stuck in bootstub."
+ assert p.up_to_date()
+
+
+def test_dfu(p):
+ app_mcu_type = p.get_mcu_type()
+ dfu_serial = p.get_dfu_serial()
+
+ p.reset(enter_bootstub=True)
+ p.reset(enter_bootloader=True)
+ assert Panda.wait_for_dfu(dfu_serial, timeout=19), "failed to enter DFU"
+
+ dfu = PandaDFU(dfu_serial)
+ assert dfu.get_mcu_type() == app_mcu_type
+
+ assert dfu_serial in PandaDFU.list()
+
+ dfu._handle.clear_status()
+ dfu.reset()
+ p.reconnect()
+
+# TODO: make more comprehensive bootstub tests and run on a few production ones + current
+# TODO: also test release-signed app
+@pytest.mark.timeout(30)
+def test_known_bootstub(p):
+ """
+ Test that compiled app can work with known production bootstub
+ """
+ known_bootstubs = {
+ McuType.H7: ["bootstub.panda_h7.bin"],
+ }
+
+ for kb in known_bootstubs[p.get_mcu_type()]:
+ app_ids = (p.get_mcu_type(), p.get_usb_serial())
+ assert None not in app_ids
+
+ p.reset(enter_bootstub=True)
+ p.reset(enter_bootloader=True)
+
+ dfu_serial = p.get_dfu_serial()
+ assert Panda.wait_for_dfu(dfu_serial, timeout=30)
+
+ dfu = PandaDFU(dfu_serial)
+ with open(os.path.join(BASEDIR, "tests/hitl/known_bootstub", kb), "rb") as f:
+ code = f.read()
+
+ dfu.program_bootstub(code)
+ dfu.reset()
+
+ p.connect(claim=False, wait=True)
+
+ # check for MCU or serial mismatch
+ with Panda(p._serial, claim=False) as np:
+ bootstub_ids = (np.get_mcu_type(), np.get_usb_serial())
+ assert app_ids == bootstub_ids
+
+ # ensure we can flash app and it jumps to app
+ p.flash()
+ check_signature(p)
+ assert not p.bootstub
+
+@pytest.mark.timeout(25)
+def test_recover(p):
+ assert p.recover(timeout=30)
+ check_signature(p)
+
+@pytest.mark.timeout(25)
+def test_flash(p):
+ # test flash from bootstub
+ serial = p._serial
+ assert serial is not None
+ p.reset(enter_bootstub=True)
+ p.close()
+ time.sleep(2)
+
+ with Panda(serial) as np:
+ assert np.bootstub
+ assert np._serial == serial
+ np.flash()
+
+ p.reconnect()
+ p.reset()
+ check_signature(p)
+
+ # test flash from app
+ p.flash()
+ check_signature(p)
diff --git a/panda/tests/hitl/2_health.py b/panda/tests/hitl/2_health.py
new file mode 100644
index 000000000..eaa5212c6
--- /dev/null
+++ b/panda/tests/hitl/2_health.py
@@ -0,0 +1,65 @@
+import time
+
+from iqdbc.car.hyundai.values import HyundaiSafetyFlags
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+
+def test_voltage(p):
+ for _ in range(10):
+ voltage = p.health()['voltage']
+ assert ((voltage > 11000) and (voltage < 13000))
+ time.sleep(0.1)
+
+def test_hw_type(p):
+ """
+ hw type should be same in bootstub as application
+ """
+
+ hw_type = p.get_type()
+ mcu_type = p.get_mcu_type()
+ assert mcu_type is not None
+
+ app_uid = p.get_uid()
+ usb_serial = p.get_usb_serial()
+ assert app_uid == usb_serial
+
+ p.reset(enter_bootstub=True, reconnect=True)
+ p.close()
+ time.sleep(3)
+ with Panda(p.get_usb_serial()) as pp:
+ assert pp.bootstub
+ assert pp.get_type() == hw_type, "Bootstub and app hw type mismatch"
+ assert pp.get_mcu_type() == mcu_type, "Bootstub and app MCU type mismatch"
+ assert pp.get_uid() == app_uid
+
+def test_heartbeat(p, panda_jungle):
+ panda_jungle.set_ignition(True)
+ # TODO: add more cases here once the tests aren't super slow
+ p.set_safety_mode(mode=CarParams.SafetyModel.hyundai, param=HyundaiSafetyFlags.LONG)
+ p.send_heartbeat()
+ assert p.health()['safety_mode'] == CarParams.SafetyModel.hyundai
+ assert p.health()['safety_param'] == HyundaiSafetyFlags.LONG
+
+ # shouldn't do anything once we're in a car safety mode
+ p.set_heartbeat_disabled()
+
+ time.sleep(6.)
+
+ h = p.health()
+ assert h['heartbeat_lost']
+ assert h['safety_mode'] == CarParams.SafetyModel.silent
+ assert h['safety_param'] == 0
+ assert h['controls_allowed'] == 0
+
+def test_microsecond_timer(p):
+ start_time = p.get_microsecond_timer()
+ time.sleep(1)
+ end_time = p.get_microsecond_timer()
+
+ # account for uint32 overflow
+ if end_time < start_time:
+ end_time += 2**32
+
+ time_diff = (end_time - start_time) / 1e6
+ assert 0.98 < time_diff < 1.02, f"Timer not running at the correct speed! (got {time_diff:.2f}s instead of 1.0s)"
diff --git a/panda/tests/hitl/3_usb.py b/panda/tests/hitl/3_usb.py
new file mode 100644
index 000000000..841718a26
--- /dev/null
+++ b/panda/tests/hitl/3_usb.py
@@ -0,0 +1,92 @@
+import time
+import pytest
+from flaky import flaky
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+from panda.tests.hitl.helpers import time_many_sends
+
+pytestmark = [
+ pytest.mark.test_panda_types((Panda.HW_TYPE_RED_PANDA, ))
+]
+
+def test_can_loopback(p):
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ p.set_can_loopback(True)
+
+ for bus in (0, 1, 2):
+ # set bus 0 speed to 5000
+ p.set_can_speed_kbps(bus, 500)
+
+ # send a message on bus 0
+ p.can_send(0x1aa, b"message", bus)
+
+ # confirm receive both on loopback and send receipt
+ time.sleep(0.05)
+ r = p.can_recv()
+ sr = [x for x in r if x[2] == 0x80 | bus]
+ lb = [x for x in r if x[2] == bus]
+ assert len(sr) == 1
+ assert len(lb) == 1
+
+ # confirm data is correct
+ assert 0x1aa == sr[0][0] == lb[0][0]
+ assert b"message" == sr[0][1] == lb[0][1]
+
+def test_reliability(p):
+ MSG_COUNT = 100
+
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ p.set_can_loopback(True)
+ p.set_can_speed_kbps(0, 1000)
+
+ addrs = list(range(100, 100 + MSG_COUNT))
+ ts = [(j, b"\xaa" * 8, 0) for j in addrs]
+
+ for _ in range(100):
+ st = time.monotonic()
+
+ p.can_send_many(ts)
+
+ r = []
+ while len(r) < 200 and (time.monotonic() - st) < 0.5:
+ r.extend(p.can_recv())
+
+ sent_echo = [x for x in r if x[2] == 0x80]
+ loopback_resp = [x for x in r if x[2] == 0]
+
+ assert sorted([x[0] for x in loopback_resp]) == addrs
+ assert sorted([x[0] for x in sent_echo]) == addrs
+ assert len(r) == 200
+
+ # take sub 20ms
+ et = (time.monotonic() - st) * 1000.0
+ assert et < 20
+
+@flaky(max_runs=6, min_passes=1)
+def test_throughput(p):
+ # enable output mode
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+
+ # enable CAN loopback mode
+ p.set_can_loopback(True)
+
+ for speed in [10, 20, 50, 100, 125, 250, 500, 1000]:
+ # set bus 0 speed to speed
+ p.set_can_speed_kbps(0, speed)
+ time.sleep(0.05)
+
+ comp_kbps = time_many_sends(p, 0)
+
+ # bit count from https://en.wikipedia.org/wiki/CAN_bus
+ saturation_pct = (comp_kbps / speed) * 100.0
+ assert saturation_pct > 80
+ assert saturation_pct < 100
+
+ print("loopback 100 messages at speed %d, comp speed is %.2f, percent %.2f" % (speed, comp_kbps, saturation_pct))
+
+# this will fail if you have hardware serial connected
+def test_serial_debug(p):
+ _ = p.serial_read(Panda.SERIAL_DEBUG) # junk
+ p.call_control_api(0x01)
+ assert p.serial_read(Panda.SERIAL_DEBUG).startswith(b"NO HANDLER")
diff --git a/panda/tests/hitl/4_can_loopback.py b/panda/tests/hitl/4_can_loopback.py
new file mode 100644
index 000000000..ed469662f
--- /dev/null
+++ b/panda/tests/hitl/4_can_loopback.py
@@ -0,0 +1,200 @@
+import os
+import time
+import pytest
+import random
+import threading
+from flaky import flaky
+from collections import defaultdict
+
+from iqdbc.car.structs import CarParams
+from panda.tests.hitl.helpers import time_many_sends, get_random_can_messages, clear_can_buffers
+
+@flaky(max_runs=3, min_passes=1)
+@pytest.mark.timeout(35)
+def test_send_recv(p, panda_jungle):
+ def test(p_send, p_recv):
+ for bus in (0, 1, 2):
+ for speed in (10, 20, 50, 100, 125, 250, 500, 1000):
+ clear_can_buffers(p_send, speed)
+ clear_can_buffers(p_recv, speed)
+
+ comp_kbps = time_many_sends(p_send, bus, p_recv, two_pandas=True)
+
+ saturation_pct = (comp_kbps / speed) * 100.0
+ assert 80 < saturation_pct < 100
+
+ print(f"two pandas bus {bus}, 100 messages at speed {speed:4d}, comp speed is {comp_kbps:7.2f}, {saturation_pct:6.2f}%")
+
+ # Run tests in both directions
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ test(p, panda_jungle)
+ test(panda_jungle, p)
+
+
+@flaky(max_runs=6, min_passes=1)
+@pytest.mark.timeout(30)
+def test_latency(p, panda_jungle):
+ def test(p_send, p_recv):
+ for bus in (0, 1, 2):
+ for speed in (10, 20, 50, 100, 125, 250, 500, 1000):
+ clear_can_buffers(p_send, speed)
+ clear_can_buffers(p_recv, speed)
+
+ latencies = []
+ comp_kbps_list = []
+ saturation_pcts = []
+
+ num_messages = 100
+
+ for _ in range(num_messages):
+ st = time.monotonic()
+ p_send.can_send(0x1ab, b"message", bus)
+ r = []
+ while len(r) < 1 and (time.monotonic() - st) < 5:
+ r = p_recv.can_recv()
+ et = time.monotonic()
+ r_echo = []
+ while len(r_echo) < 1 and (time.monotonic() - st) < 10:
+ r_echo = p_send.can_recv()
+
+ if len(r) == 0 or len(r_echo) == 0:
+ print(f"r: {r}, r_echo: {r_echo}")
+
+ assert len(r) == 1
+ assert len(r_echo) == 1
+
+ et = (et - st) * 1000.0
+ comp_kbps = (1 + 11 + 1 + 1 + 1 + 4 + 8 * 8 + 15 + 1 + 1 + 1 + 7) / et
+ latency = et - ((1 + 11 + 1 + 1 + 1 + 4 + 8 * 8 + 15 + 1 + 1 + 1 + 7) / speed)
+
+ assert latency < 5.0
+
+ saturation_pct = (comp_kbps / speed) * 100.0
+ latencies.append(latency)
+ comp_kbps_list.append(comp_kbps)
+ saturation_pcts.append(saturation_pct)
+
+ average_latency = sum(latencies) / num_messages
+ assert average_latency < 1.0
+ average_comp_kbps = sum(comp_kbps_list) / num_messages
+ average_saturation_pct = sum(saturation_pcts) / num_messages
+
+ print("two pandas bus {}, {} message average at speed {:4d}, latency is {:5.3f}ms, comp speed is {:7.2f}, percent {:6.2f}"
+ .format(bus, num_messages, speed, average_latency, average_comp_kbps, average_saturation_pct))
+
+ # Run tests in both directions
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ test(p, panda_jungle)
+ test(panda_jungle, p)
+
+
+@pytest.mark.panda_expect_can_error
+def test_gen2_loopback(p, panda_jungle):
+ def test(p_send, p_recv, address=None):
+ for bus in range(4):
+ obd = False
+ if bus == 3:
+ obd = True
+ bus = 1
+
+ # Clear buses
+ clear_can_buffers(p_send)
+ clear_can_buffers(p_recv)
+
+ # Send a random string
+ addr = address if address else random.randint(1, 2000)
+ string = b"test" + os.urandom(4)
+ p_send.set_obd(obd)
+ p_recv.set_obd(obd)
+ time.sleep(0.2)
+ p_send.can_send(addr, string, bus)
+ time.sleep(0.2)
+
+ content = p_recv.can_recv()
+
+ # Check amount of messages
+ assert len(content) == 1
+
+ # Check content
+ assert content[0][0] == addr and content[0][1] == string
+
+ # Check bus
+ assert content[0][2] == bus
+
+ print("Bus:", bus, "address:", addr, "OBD:", obd, "OK")
+
+ # Run tests in both directions
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ test(p, panda_jungle)
+ test(panda_jungle, p)
+
+ # Test extended frame address with ELM327 mode
+ p.set_safety_mode(CarParams.SafetyModel.elm327)
+ test(p, panda_jungle, 0x18DB33F1)
+ test(panda_jungle, p, 0x18DB33F1)
+
+ # TODO: why it's not being reset by fixtures reinit?
+ p.set_obd(False)
+ panda_jungle.set_obd(False)
+
+def test_bulk_write(p, panda_jungle):
+ # The TX buffers on pandas is 0x100 in length.
+ NUM_MESSAGES_PER_BUS = 10000
+
+ def flood_tx(panda):
+ print('Sending!')
+ msg = b"\xaa" * 8
+ packet = []
+ # start with many messages on a single bus (higher contention for single TX ring buffer)
+ packet += [[0xaa, msg, 0]] * NUM_MESSAGES_PER_BUS
+ # end with many messages on multiple buses
+ packet += [[0xaa, msg, 0], [0xaa, msg, 1], [0xaa, msg, 2]] * NUM_MESSAGES_PER_BUS
+
+ # Disable timeout
+ panda.set_safety_mode(CarParams.SafetyModel.allOutput)
+ panda.can_send_many(packet, timeout=0)
+ print(f"Done sending {4 * NUM_MESSAGES_PER_BUS} messages!", time.monotonic())
+ print(panda.health())
+
+ # Start transmisson
+ threading.Thread(target=flood_tx, args=(p,)).start()
+
+ # Receive as much as we can in a few second time period
+ rx = []
+ old_len = 0
+ start_time = time.monotonic()
+ while time.monotonic() - start_time < 5 or len(rx) > old_len:
+ old_len = len(rx)
+ rx.extend(panda_jungle.can_recv())
+ print(f"Received {len(rx)} messages", time.monotonic())
+
+ # All messages should have been received
+ if len(rx) != 4 * NUM_MESSAGES_PER_BUS:
+ raise Exception("Did not receive all messages!")
+
+def test_message_integrity(p):
+ p.set_safety_mode(CarParams.SafetyModel.allOutput)
+ p.set_can_loopback(True)
+ for i in range(250):
+ sent_msgs = defaultdict(set)
+ for _ in range(random.randrange(10)):
+ to_send = get_random_can_messages(random.randrange(100))
+ for m in to_send:
+ sent_msgs[m[2]].add((m[0], m[1]))
+ p.can_send_many(to_send, timeout=0)
+
+ start_time = time.monotonic()
+ while time.monotonic() - start_time < 2 and any(len(sent_msgs[bus]) for bus in range(3)):
+ recvd = p.can_recv()
+ for msg in recvd:
+ if msg[2] >= 128:
+ k = (msg[0], bytes(msg[1]))
+ bus = msg[2]-128
+ assert k in sent_msgs[bus], f"message {k} was never sent on bus {bus}"
+ sent_msgs[msg[2]-128].discard(k)
+
+ # if a set isn't empty, messages got dropped
+ for bus in range(3):
+ assert not len(sent_msgs[bus]), f"loop {i}: bus {bus} missing {len(sent_msgs[bus])} messages"
+
+ print("Got all messages intact")
diff --git a/panda/tests/hitl/5_spi.py b/panda/tests/hitl/5_spi.py
new file mode 100644
index 000000000..106a1c7d4
--- /dev/null
+++ b/panda/tests/hitl/5_spi.py
@@ -0,0 +1,81 @@
+import binascii
+import pytest
+import random
+from unittest.mock import patch
+
+from panda import Panda
+from panda.python.spi import PandaProtocolMismatch, PandaSpiNackResponse
+
+
+class TestSpi:
+ def _ping(self, mocker, panda):
+ # should work with no retries
+ spy = mocker.spy(panda._handle, '_wait_for_ack')
+ panda.health()
+ assert spy.call_count == 2
+ mocker.stop(spy)
+
+ def test_protocol_version_check(self, p):
+ for bootstub in (False, True):
+ p.reset(enter_bootstub=bootstub)
+ with patch('panda.python.spi.PandaSpiHandle.PROTOCOL_VERSION', return_value="abc"):
+ # list should still work with wrong version
+ assert p._serial in Panda.list()
+
+ # connect but raise protocol error
+ with pytest.raises(PandaProtocolMismatch):
+ Panda(p._serial)
+
+ def test_protocol_version_data(self, p):
+ for bootstub in (False, True):
+ p.reset(enter_bootstub=bootstub)
+ v = p._handle.get_protocol_version()
+
+ uid = binascii.hexlify(v[:12]).decode()
+ assert uid == p.get_uid()
+
+ hwtype = v[12]
+ assert hwtype == ord(p.get_type())
+
+ bstub = v[13]
+ assert bstub == (0xEE if bootstub else 0xCC)
+
+ def test_all_comm_types(self, mocker, p):
+ spy = mocker.spy(p._handle, '_wait_for_ack')
+
+ # controlRead + controlWrite
+ p.health()
+ p.can_clear(0)
+ assert spy.call_count == 2*2
+
+ # bulkRead + bulkWrite
+ p.can_recv()
+ p.can_send(0x123, b"somedata", 0)
+ assert spy.call_count == 2*4
+
+ def test_bad_header(self, mocker, p):
+ with patch('panda.python.spi.SYNC', return_value=0):
+ with pytest.raises(PandaSpiNackResponse):
+ p._handle.controlRead(Panda.REQUEST_IN, 0xd2, 0, 0, p.HEALTH_STRUCT.size, timeout=50)
+ self._ping(mocker, p)
+
+ def test_bad_checksum(self, mocker, p):
+ cnt = p.health()['spi_error_count']
+ with patch('panda.python.spi.PandaSpiHandle._calc_checksum', return_value=0):
+ with pytest.raises(PandaSpiNackResponse):
+ p._handle.controlRead(Panda.REQUEST_IN, 0xd2, 0, 0, p.HEALTH_STRUCT.size, timeout=50)
+ self._ping(mocker, p)
+ assert (p.health()['spi_error_count'] - cnt) > 0
+
+ def test_non_existent_endpoint(self, mocker, p):
+ for _ in range(10):
+ ep = random.randint(4, 20)
+ with pytest.raises(PandaSpiNackResponse):
+ p._handle.bulkRead(ep, random.randint(1, 1000), timeout=50)
+
+ self._ping(mocker, p)
+
+ with pytest.raises(PandaSpiNackResponse):
+ p._handle.bulkWrite(ep, b"abc", timeout=50)
+
+ self._ping(mocker, p)
diff --git a/panda/tests/hitl/6_safety.py b/panda/tests/hitl/6_safety.py
new file mode 100644
index 000000000..ec697b1bc
--- /dev/null
+++ b/panda/tests/hitl/6_safety.py
@@ -0,0 +1,18 @@
+import time
+
+from iqdbc.car.structs import CarParams
+
+
+def test_safety_nooutput(p):
+ p.set_safety_mode(CarParams.SafetyModel.silent)
+ p.set_can_loopback(True)
+
+ # send a message on bus 0
+ p.can_send(0x1aa, b"message", 0)
+
+ # confirm receive nothing
+ time.sleep(0.05)
+ r = p.can_recv()
+ # bus 192 is messages blocked by TX safety hook on bus 0
+ assert len([x for x in r if x[2] != 192]) == 0
+ assert len([x for x in r if x[2] == 192]) == 1
diff --git a/panda/tests/hitl/7_internal.py b/panda/tests/hitl/7_internal.py
new file mode 100644
index 000000000..a7012ebc6
--- /dev/null
+++ b/panda/tests/hitl/7_internal.py
@@ -0,0 +1,41 @@
+import time
+import pytest
+
+from panda import Panda
+
+pytestmark = [
+ pytest.mark.test_panda_types(Panda.INTERNAL_DEVICES),
+]
+
+MAX_RPM = 5000
+
+@pytest.mark.timeout(2*60)
+def test_fan_curve(p):
+ # ensure fan curve is (roughly) linear
+
+ rpms = []
+ for power in (30, 70, 100):
+ # wait until fan spins up
+ p.set_fan_power(power)
+ for _ in range(20):
+ time.sleep(1)
+ if p.get_fan_rpm() > 1000:
+ break
+ time.sleep(2) # wait for RPM to converge
+ rpms.append(p.get_fan_rpm())
+
+ print(rpms)
+ diffs = [b - a for a, b in zip(rpms, rpms[1:])]
+ assert all(x > 0 for x in diffs), f"Fan RPMs not strictly increasing: {rpms=}"
+ assert rpms[-1] > (0.75*MAX_RPM)
+
+
+def test_fan_cooldown(p):
+ # if the fan cooldown doesn't work, we get high frequency noise on the tach line
+ # while the rotor spins down. this makes sure it never goes beyond the expected max RPM
+ p.set_fan_power(100)
+ time.sleep(3)
+ p.set_fan_power(0)
+ for _ in range(5):
+ assert p.get_fan_rpm() <= MAX_RPM*2
+ time.sleep(0.5)
diff --git a/panda/tests/hitl/8_misc.py b/panda/tests/hitl/8_misc.py
new file mode 100644
index 000000000..3c47ed492
--- /dev/null
+++ b/panda/tests/hitl/8_misc.py
@@ -0,0 +1,13 @@
+import time
+
+from panda import Panda
+
+def test_boot_time(p):
+ # boot time should be instant
+ st = time.monotonic()
+ p.reset(reconnect=False)
+ assert Panda.wait_for_panda(p.get_usb_serial(), timeout=3.0)
+
+ # USB enumeration is slow, so SPI is faster
+ assert time.monotonic() - st < (1.0 if p.spi else 5.0)
+
diff --git a/panda/tests/hitl/9_harness.py b/panda/tests/hitl/9_harness.py
new file mode 100644
index 000000000..3981e3b71
--- /dev/null
+++ b/panda/tests/hitl/9_harness.py
@@ -0,0 +1,76 @@
+import time
+import pytest
+import itertools
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+# TODO: test relay
+
+@pytest.mark.panda_expect_can_error
+def test_harness_status(p, panda_jungle):
+ # map from jungle orientations to panda orientations
+ orientation_map = {
+ Panda.HARNESS_STATUS_NC: Panda.HARNESS_STATUS_NC,
+ }
+
+ # this shouldn't be parameterized since we don't want the panda to be reset
+ # between the tests.
+ for ignition, orientation in itertools.product([True, False], [Panda.HARNESS_STATUS_NC, Panda.HARNESS_STATUS_NORMAL, Panda.HARNESS_STATUS_FLIPPED]):
+ print()
+ p.set_safety_mode(CarParams.SafetyModel.elm327)
+ panda_jungle.set_harness_orientation(orientation)
+ panda_jungle.set_ignition(ignition)
+
+ # wait for orientation detection
+ time.sleep(0.25)
+
+ health = p.health()
+ detected_orientation = health['car_harness_status']
+ print(f"orientation set: {orientation} detected: {detected_orientation}")
+
+ if detected_orientation not in orientation_map:
+ assert detected_orientation != Panda.HARNESS_STATUS_NC
+ other = {Panda.HARNESS_STATUS_NORMAL: Panda.HARNESS_STATUS_FLIPPED, Panda.HARNESS_STATUS_FLIPPED: Panda.HARNESS_STATUS_NORMAL}
+ orientation_map.update({
+ orientation: detected_orientation,
+ other[orientation]: other[detected_orientation],
+ })
+
+ # Orientation
+ assert orientation_map[detected_orientation] == orientation
+
+ # Line ignition
+ assert health['ignition_line'] == (False if orientation == Panda.HARNESS_STATUS_NC else ignition)
+
+ # CAN traffic
+ if orientation != Panda.HARNESS_STATUS_NC:
+ for bus in range(3):
+ panda_jungle.can_send(0x123, f"{bus}".encode(), bus)
+ time.sleep(0.5)
+
+ msgs = p.can_recv()
+ buses = {int(dat): bus for _, dat, bus in msgs if bus <= 3}
+ print(msgs)
+
+ # jungle doesn't actually switch buses when switching orientation
+ flipped = orientation == Panda.HARNESS_STATUS_FLIPPED
+ assert buses[0] == (2 if flipped else 0)
+ assert buses[2] == (0 if flipped else 2)
+
+ # SBU voltages
+ supply_voltage_mV = 1800 if p.get_type() in [Panda.HW_TYPE_TRES, Panda.HW_TYPE_CUATRO] else 3300
+
+ if orientation == Panda.HARNESS_STATUS_NC:
+ assert health['sbu1_voltage_mV'] > 0.9 * supply_voltage_mV
+ assert health['sbu2_voltage_mV'] > 0.9 * supply_voltage_mV
+ else:
+ relay_line = 'sbu1_voltage_mV' if (detected_orientation == Panda.HARNESS_STATUS_FLIPPED) else 'sbu2_voltage_mV'
+ ignition_line = 'sbu2_voltage_mV' if (detected_orientation == Panda.HARNESS_STATUS_FLIPPED) else 'sbu1_voltage_mV'
+
+ assert health[relay_line] < 0.1 * supply_voltage_mV
+ assert health[ignition_line] > health[relay_line]
+ if ignition:
+ assert health[ignition_line] < 0.3 * supply_voltage_mV
+ else:
+ assert health[ignition_line] > 0.9 * supply_voltage_mV
diff --git a/panda/tests/hitl/__init__.py b/panda/tests/hitl/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/panda/tests/hitl/conftest.py b/panda/tests/hitl/conftest.py
new file mode 100644
index 000000000..ecc3a455c
--- /dev/null
+++ b/panda/tests/hitl/conftest.py
@@ -0,0 +1,165 @@
+import os
+import pytest
+
+from panda import Panda, PandaDFU, PandaJungle
+from panda.tests.hitl.helpers import clear_can_buffers
+
+SPEED_NORMAL = 500
+BUS_SPEEDS = [(0, SPEED_NORMAL), (1, SPEED_NORMAL), (2, SPEED_NORMAL)]
+
+# test options
+NO_JUNGLE = os.environ.get("NO_JUNGLE", "0") == "1"
+
+# Find all pandas connected
+_panda_jungle = None
+_panda_type = None
+_panda_serial = None
+def init_devices():
+ if not NO_JUNGLE:
+ global _panda_jungle
+ _panda_jungle = PandaJungle()
+ _panda_jungle.set_panda_power(True)
+
+ with Panda(serial=None, claim=False) as p:
+ global _panda_type
+ global _panda_serial
+ _panda_serial = p.get_usb_serial()
+ _panda_type = bytes(p.get_type())
+ assert _panda_serial is not None, "No panda found!"
+init_devices()
+
+def init_jungle():
+ if _panda_jungle is None:
+ return
+ clear_can_buffers(_panda_jungle)
+ _panda_jungle.set_panda_power(True)
+ _panda_jungle.set_can_loopback(False)
+ _panda_jungle.set_obd(False)
+ _panda_jungle.set_harness_orientation(PandaJungle.HARNESS_ORIENTATION_1)
+ for bus, speed in BUS_SPEEDS:
+ _panda_jungle.set_can_speed_kbps(bus, speed)
+
+ # ensure FW hasn't changed
+ assert _panda_jungle.up_to_date()
+
+
+def pytest_configure(config):
+ config.addinivalue_line(
+ "markers", "test_panda_types(name): whitelist a test for specific panda types"
+ )
+ config.addinivalue_line(
+ "markers", "skip_panda_types(name): blacklist panda types from a test"
+ )
+ config.addinivalue_line(
+ "markers", "panda_expect_can_error: mark test to ignore CAN health errors"
+ )
+
+@pytest.hookimpl(tryfirst=True)
+def pytest_collection_modifyitems(items):
+ for item in items:
+ if item.get_closest_marker('timeout') is None:
+ item.add_marker(pytest.mark.timeout(60))
+
+ needs_jungle = "panda_jungle" in item.fixturenames
+ if needs_jungle and NO_JUNGLE:
+ item.add_marker(pytest.mark.skip(reason="skipping tests that requires a jungle"))
+
+@pytest.fixture(name='panda_jungle', scope='function')
+def fixture_panda_jungle(request):
+ init_jungle()
+ return _panda_jungle
+
+@pytest.fixture(name='p', scope='function')
+def func_fixture_panda(request, module_panda):
+ # *** Setup ***
+
+ p = module_panda
+
+ # Check if test is applicable to this panda
+ mark = request.node.get_closest_marker('test_panda_types')
+ if mark:
+ assert len(mark.args) > 0, "Missing panda types argument in mark"
+ test_types = mark.args[0]
+ if _panda_type not in test_types:
+ pytest.skip(f"Not applicable, {test_types} pandas only")
+
+ mark = request.node.get_closest_marker('skip_panda_types')
+ if mark:
+ assert len(mark.args) > 0, "Missing panda types argument in mark"
+ skip_types = mark.args[0]
+ if _panda_type in skip_types:
+ pytest.skip(f"Not applicable to {skip_types}")
+
+ # this is 2+ seconds on USB pandas due to slow
+ # enumeration on the host side
+ p.reset()
+
+ # ensure FW hasn't changed
+ assert p.up_to_date()
+
+ # *** Run test ***
+ yield p
+
+ # *** Teardown ***
+
+ # reconnect
+ if p.get_dfu_serial() in PandaDFU.list():
+ PandaDFU(p.get_dfu_serial()).reset()
+ p.reconnect()
+ if not p.connected:
+ p.reconnect()
+ if p.bootstub:
+ p.reset()
+
+ assert not p.bootstub
+
+ # TODO: would be nice to make these common checks in the teardown
+ # show up as failed tests instead of "errors"
+
+ # Check for faults
+ assert p.health()['faults'] == 0
+ assert p.health()['fault_status'] == 0
+
+ # Check for SPI errors
+ #assert p.health()['spi_error_count'] == 0
+
+ # Check health of each CAN core after test, normal to fail for test_gen2_loopback on OBD bus, so skipping
+ mark = request.node.get_closest_marker('panda_expect_can_error')
+ expect_can_error = mark is not None
+ if not expect_can_error:
+ for i in range(3):
+ can_health = p.can_health(i)
+ assert can_health['bus_off_cnt'] == 0
+ assert can_health['receive_error_cnt'] < 127
+ assert can_health['transmit_error_cnt'] < 255
+ assert can_health['error_passive'] == 0
+ assert can_health['error_warning'] == 0
+ assert can_health['total_rx_lost_cnt'] == 0
+ assert can_health['total_tx_lost_cnt'] == 0
+ assert can_health['total_error_cnt'] == 0
+ assert can_health['total_tx_checksum_error_cnt'] == 0
+
+@pytest.fixture(name='module_panda', scope='module')
+def fixture_panda_setup(request):
+ """
+ Clean up panda + jungle and return the panda under test.
+ """
+ # init jungle
+ init_jungle()
+
+ # init panda
+ p = Panda(serial=_panda_serial)
+ p.reset(reconnect=True)
+
+ p.set_can_loopback(False)
+ p.set_power_save(False)
+ for bus, speed in BUS_SPEEDS:
+ p.set_can_speed_kbps(bus, speed)
+ clear_can_buffers(p)
+ p.set_power_save(False)
+
+ # run test
+ yield p
+
+ # teardown
+ p.close()
diff --git a/panda/tests/hitl/helpers.py b/panda/tests/hitl/helpers.py
new file mode 100644
index 000000000..d46567130
--- /dev/null
+++ b/panda/tests/hitl/helpers.py
@@ -0,0 +1,71 @@
+import time
+import random
+
+
+def get_random_can_messages(n):
+ m = []
+ for _ in range(n):
+ bus = random.randrange(3)
+ addr = random.randrange(1 << 29)
+ dat = bytes([random.getrandbits(8) for _ in range(random.randrange(1, 9))])
+ m.append([addr, dat, bus])
+ return m
+
+
+def time_many_sends(p, bus, p_recv=None, msg_count=100, two_pandas=False, msg_len=8):
+ if p_recv is None:
+ p_recv = p
+ if p == p_recv and two_pandas:
+ raise ValueError("Cannot have two pandas that are the same panda")
+
+ msg_id = random.randint(0x100, 0x200)
+ to_send = [(msg_id, b"\xaa" * msg_len, bus)] * msg_count
+
+ start_time = time.monotonic()
+ p.can_send_many(to_send)
+ r = []
+ r_echo = []
+ r_len_expected = msg_count if two_pandas else msg_count * 2
+ r_echo_len_exected = msg_count if two_pandas else 0
+
+ while len(r) < r_len_expected and (time.monotonic() - start_time) < 5:
+ r.extend(p_recv.can_recv())
+ end_time = time.monotonic()
+ if two_pandas:
+ while len(r_echo) < r_echo_len_exected and (time.monotonic() - start_time) < 10:
+ r_echo.extend(p.can_recv())
+
+ sent_echo = [x for x in r if x[2] == 0x80 | bus and x[0] == msg_id]
+ sent_echo.extend([x for x in r_echo if x[2] == 0x80 | bus and x[0] == msg_id])
+ resp = [x for x in r if x[2] == bus and x[0] == msg_id]
+
+ leftovers = [x for x in r if (x[2] != 0x80 | bus and x[2] != bus) or x[0] != msg_id]
+ assert len(leftovers) == 0
+
+ assert len(resp) == msg_count
+ assert len(sent_echo) == msg_count
+
+ end_time = (end_time - start_time) * 1000.0
+ comp_kbps = (1 + 11 + 1 + 1 + 1 + 4 + (msg_len * 8) + 15 + 1 + 1 + 1 + 7) * msg_count / end_time
+
+ return comp_kbps
+
+
+def clear_can_buffers(panda, speed: int | None = None):
+ if speed is not None:
+ for bus in range(3):
+ panda.set_can_speed_kbps(bus, speed)
+
+ # clear tx buffers
+ for i in range(4):
+ panda.can_clear(i)
+
+ # clear rx buffers
+ panda.can_clear(0xFFFF)
+ r = [1]
+ st = time.monotonic()
+ while len(r) > 0:
+ r = panda.can_recv()
+ time.sleep(0.05)
+ if (time.monotonic() - st) > 10:
+ raise Exception("Unable to clear can buffers for panda ", panda.get_serial())
diff --git a/panda/tests/hitl/known_bootstub/bootstub.panda_h7.bin b/panda/tests/hitl/known_bootstub/bootstub.panda_h7.bin
new file mode 100755
index 000000000..a6d856bd2
Binary files /dev/null and b/panda/tests/hitl/known_bootstub/bootstub.panda_h7.bin differ
diff --git a/panda/tests/hitl/reset_jungles.py b/panda/tests/hitl/reset_jungles.py
new file mode 100755
index 000000000..09bd04ad9
--- /dev/null
+++ b/panda/tests/hitl/reset_jungles.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+import concurrent.futures
+
+from panda import PandaJungle, PandaJungleDFU, McuType
+from panda.tests.libs.resetter import Resetter
+
+SERIALS = {
+ '180019001451313236343430', # jungle v2
+}
+
+def recover(s):
+ with PandaJungleDFU(s) as pd:
+ pd.recover()
+
+def flash(s):
+ with PandaJungle(s) as p:
+ p.flash()
+ return p.get_mcu_type()
+
+# Reset + flash all CI hardware to get it into a consistent state
+# * port 1: jungles-under-test
+# * port 2: USB hubs
+# * port 3: HITL pandas and their jungles
+if __name__ == "__main__":
+ with Resetter() as r:
+ # everything off
+ for i in range(1, 4):
+ r.enable_power(i, 0)
+ r.cycle_power(ports=[1, 2], dfu=True)
+ for s in SERIALS:
+ assert PandaJungle.wait_for_dfu(PandaJungleDFU.st_serial_to_dfu_serial(s, McuType.H7), timeout=10)
+ dfu_serials = PandaJungleDFU.list()
+ assert len(dfu_serials) == len(SERIALS)
+
+ with concurrent.futures.ProcessPoolExecutor(max_workers=len(dfu_serials)) as exc:
+ list(exc.map(recover, dfu_serials, timeout=30))
+
+ # power cycle for H7 bootloader bug
+ r.cycle_power(ports=[1, 2])
+
+ # wait for them to come back up
+ for s in SERIALS:
+ assert PandaJungle.wait_for_panda(s, timeout=10)
+ assert set(PandaJungle.list()) >= SERIALS
+ mcu_types = list(exc.map(flash, SERIALS, timeout=20))
+ assert set(mcu_types) == {McuType.H7, }
diff --git a/panda/tests/libpanda/libpanda_py.py b/panda/tests/libpanda/libpanda_py.py
new file mode 100644
index 000000000..eef722c06
--- /dev/null
+++ b/panda/tests/libpanda/libpanda_py.py
@@ -0,0 +1,87 @@
+import os
+from cffi import FFI
+from typing import Any, Protocol
+
+from panda import LEN_TO_DLC
+
+libpanda_dir = os.path.dirname(os.path.abspath(__file__))
+libpanda_fn = os.path.join(libpanda_dir, "libpanda.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("""
+int set_safety_hooks(uint16_t mode, uint16_t param);
+""")
+
+ffi.cdef("""
+typedef struct {
+ volatile uint32_t w_ptr;
+ volatile uint32_t r_ptr;
+ uint32_t fifo_size;
+ CANPacket_t *elems;
+} can_ring;
+
+extern can_ring *rx_q;
+extern can_ring *tx1_q;
+extern can_ring *tx2_q;
+extern can_ring *tx3_q;
+
+bool can_pop(can_ring *q, CANPacket_t *elem);
+bool can_push(can_ring *q, CANPacket_t *elem);
+void can_set_checksum(CANPacket_t *packet);
+int comms_can_read(uint8_t *data, uint32_t max_len);
+void comms_can_write(uint8_t *data, uint32_t len);
+void comms_can_reset(void);
+uint32_t can_slots_empty(can_ring *q);
+""")
+
+class CANPacket:
+ reserved: int
+ bus: int
+ data_len_code: int
+ rejected: int
+ returned: int
+ extended: int
+ addr: int
+ data: list[int]
+
+class Panda(Protocol):
+ # CAN
+ tx1_q: Any
+ tx2_q: Any
+ tx3_q: Any
+ def can_set_checksum(self, p: CANPacket) -> None: ...
+
+ # safety
+ def set_safety_hooks(self, mode: int, param: int) -> int: ...
+
+
+libpanda: Panda = ffi.dlopen(libpanda_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)
+ libpanda.can_set_checksum(ret)
+
+ return ret
diff --git a/panda/tests/libs/resetter.py b/panda/tests/libs/resetter.py
new file mode 100644
index 000000000..52c44e424
--- /dev/null
+++ b/panda/tests/libs/resetter.py
@@ -0,0 +1,58 @@
+import time
+import usb1
+
+
+class Resetter():
+ def __init__(self):
+ self._handle = None
+ self.connect()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
+ def close(self):
+ self._handle.close()
+ self._context.close()
+ self._handle = None
+
+ def connect(self):
+ if self._handle:
+ self.close()
+
+ self._handle = None
+
+ self._context = usb1.USBContext()
+ self._context.open()
+ for device in self._context.getDeviceList(skip_on_error=True):
+ if device.getVendorID() == 0xbbaa and device.getProductID() == 0xddc0:
+ try:
+ self._handle = device.open()
+ self._handle.claimInterface(0)
+ break
+ except Exception as e:
+ print(e)
+ assert self._handle
+
+ def enable_power(self, port, enabled):
+ self._handle.controlWrite((usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE), 0xff, port, enabled, b'')
+
+ def enable_boot(self, enabled):
+ self._handle.controlWrite((usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE), 0xff, 0, enabled, b'')
+
+ def cycle_power(self, dfu=False, ports=None):
+ if ports is None:
+ ports = [1, 2, 3]
+
+ self.enable_boot(dfu)
+ for port in ports:
+ self.enable_power(port, False)
+ time.sleep(0.05)
+
+ for port in ports:
+ self.enable_power(port, True)
+ time.sleep(0.05)
+ self.enable_boot(False)
+ time.sleep(0.12) # takes the kernel this long to detect the disconnect
diff --git a/panda/tests/misra/.gitignore b/panda/tests/misra/.gitignore
new file mode 100644
index 000000000..fc9ac228c
--- /dev/null
+++ b/panda/tests/misra/.gitignore
@@ -0,0 +1,5 @@
+*.pdf
+*.txt
+.output.log
+new_table
+cppcheck/
diff --git a/panda/tests/misra/checkers.txt b/panda/tests/misra/checkers.txt
new file mode 100644
index 000000000..44e6aa13f
--- /dev/null
+++ b/panda/tests/misra/checkers.txt
@@ -0,0 +1,456 @@
+Cppcheck checkers list from test_misra.sh:
+
+
+
+
+
+TEST variant options:
+--enable=all --disable=unusedFunction --addon=misra -DSTM32H7 -DSTM32H725xx -I /board/stm32h7/inc/ /board/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/panda/tests/misra/coverage_table b/panda/tests/misra/coverage_table
new file mode 100644
index 000000000..0395aba0d
--- /dev/null
+++ b/panda/tests/misra/coverage_table
@@ -0,0 +1,156 @@
+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/panda/tests/misra/install.sh b/panda/tests/misra/install.sh
new file mode 100755
index 000000000..9c8fd385c
--- /dev/null
+++ b/panda/tests/misra/install.sh
@@ -0,0 +1,18 @@
+#!/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/panda/tests/misra/suppressions.txt b/panda/tests/misra/suppressions.txt
new file mode 100644
index 000000000..0fb0377dc
--- /dev/null
+++ b/panda/tests/misra/suppressions.txt
@@ -0,0 +1,22 @@
+# 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?
+misra-c2012-12.2:*/gpio.h # Suppress 12.2 for any file named gpio.h
diff --git a/panda/tests/misra/test_misra.sh b/panda/tests/misra/test_misra.sh
new file mode 100755
index 000000000..447cd11e9
--- /dev/null
+++ b/panda/tests/misra/test_misra.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+set -e
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+PANDA_DIR=$(realpath $DIR/../../)
+OPENDBC_ROOT=$(python3 -c "import iqdbc; print(iqdbc.INCLUDE_PATH)")
+
+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
+cd $DIR
+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 $PANDA_DIR
+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 -UPANDA_JUNGLE -UBOOTSTUB"
+
+ # 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 ""${@//$PANDA_DIR/}"\n\n" >> $CHECKLIST # (absolute path removed)
+
+ $CPPCHECK_DIR/cppcheck --inline-suppr \
+ -I $PANDA_DIR \
+ -I "$(arm-none-eabi-gcc -print-file-name=include)" \
+ -I $OPENDBC_ROOT \
+ --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 --addon=misra"
+
+printf "\n${GREEN}** PANDA H7 CODE **${NC}\n"
+cppcheck $PANDA_OPTS -DSTM32H7 -DSTM32H725xx -I $PANDA_DIR/board/stm32h7/inc/ $PANDA_DIR/board/main.c
+
+# unused needs to run globally
+#printf "\n${GREEN}** UNUSED ALL CODE **${NC}\n"
+#cppcheck --enable=unusedFunction --quiet $PANDA_DIR/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/panda/tests/misra/test_mutation.py b/panda/tests/misra/test_mutation.py
new file mode 100755
index 000000000..c0d804863
--- /dev/null
+++ b/panda/tests/misra/test_mutation.py
@@ -0,0 +1,78 @@
+#!/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 = (
+ 'board/obj',
+ 'board/jungle',
+ 'board/body',
+ 'board/stm32h7/inc',
+ 'board/fake_stm.h',
+
+ # bootstub only files
+ 'board/flasher.h',
+ 'board/bootstub.c',
+ 'board/bootstub_declarations.h',
+ 'board/stm32h7/llflash.h',
+)
+
+mutations = [
+ (None, None, False), # no mods, should pass
+ ("board/stm32h7/llfdcan.h", "s/return ret;/if (true) { return ret; } else { return false; }/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('board/**', 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) > 50, all(d in files for d in ('board/main.c', 'board/stm32h7/llfdcan.h'))
+
+for p in patterns:
+ mutations.append((random.choice(files), p, True))
+
+# TODO: remove sampling once test_misra.sh is faster
+mutations = random.sample(mutations, 2)
+
+@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 + "/panda", dirs_exist_ok=True)
+
+ # apply patch
+ if fn is not None:
+ r = os.system(f"cd {tmp}/panda && sed -i '{patch}' {fn}")
+ assert r == 0
+
+ # run test
+ r = subprocess.run("SKIP_TABLES_DIFF=1 panda/tests/misra/test_misra.sh", cwd=tmp, shell=True)
+ failed = r.returncode != 0
+ assert failed == should_fail
diff --git a/panda/tests/safety/aol_common.py b/panda/tests/safety/aol_common.py
new file mode 100644
index 000000000..379c0e6c8
--- /dev/null
+++ b/panda/tests/safety/aol_common.py
@@ -0,0 +1,417 @@
+import unittest
+from abc import abstractmethod
+
+
+class AolCommonBase(unittest.TestCase):
+ @abstractmethod
+ def _lkas_button_msg(self, enabled):
+ raise NotImplementedError
+
+ @abstractmethod
+ def _acc_state_msg(self, enabled):
+ raise NotImplementedError
+
+ def _set_aol_button_press(self, state):
+ if hasattr(self.safety, "set_aol_button_press"):
+ self.safety.set_aol_button_press(state)
+ else:
+ legacy_prefix = "".join(chr(c) for c in (109, 97, 100, 115))
+ getattr(self.safety, f"set_{legacy_prefix}_button_press")(state)
+
+ def _get_aol_button_press(self):
+ if hasattr(self.safety, "get_aol_button_press"):
+ return self.safety.get_aol_button_press()
+ legacy_prefix = "".join(chr(c) for c in (109, 97, 100, 115))
+ return getattr(self.safety, f"get_{legacy_prefix}_button_press")()
+
+ def _set_aol_params(self, enabled, disengage_lateral_on_brake):
+ if hasattr(self.safety, "set_aol_params"):
+ self.safety.set_aol_params(enabled, disengage_lateral_on_brake)
+ else:
+ legacy_prefix = "".join(chr(c) for c in (109, 97, 100, 115))
+ getattr(self.safety, f"set_{legacy_prefix}_params")(enabled, disengage_lateral_on_brake)
+
+ def _get_enable_aol(self):
+ if hasattr(self.safety, "get_enable_aol"):
+ return self.safety.get_enable_aol()
+ legacy_prefix = "".join(chr(c) for c in (109, 97, 100, 115))
+ return getattr(self.safety, f"get_enable_{legacy_prefix}")()
+
+ def _aol_states_cleanup(self):
+ self._set_aol_button_press(-1)
+ self.safety.set_controls_allowed_lat(False)
+ self.safety.set_controls_requested_lat(False)
+ self.safety.set_acc_main_on(False)
+ self._set_aol_params(False, False)
+ self.safety.set_heartbeat_engaged_aol(True)
+
+ def test_enable_control_allowed_with_aol_button(self):
+ """Toggle AOL with AOL button"""
+ try:
+ self._lkas_button_msg(False)
+ except NotImplementedError:
+ raise unittest.SkipTest("Skipping test because AOL button is not supported")
+
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+ self.assertEqual(enable_aol, self._get_enable_aol())
+
+ self._rx(self._lkas_button_msg(True))
+ self._rx(self._speed_msg(0))
+ self._rx(self._lkas_button_msg(False))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_enable_control_allowed_with_manual_acc_main_on_state(self):
+ try:
+ self._acc_state_msg(False)
+ except NotImplementedError:
+ self._aol_states_cleanup()
+ raise unittest.SkipTest("Skipping test because _acc_state_msg is not implemented for this car")
+
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+ self._rx(self._acc_state_msg(True))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_enable_control_allowed_with_manual_aol_button_state(self):
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ for aol_button_press in (-1, 0, 1):
+ with self.subTest("aol_button_press", button_state=aol_button_press):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+
+ self._set_aol_button_press(aol_button_press)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol and aol_button_press == 1, self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_enable_control_allowed_from_acc_main_on(self):
+ """Test that lateral controls are allowed when ACC main is enabled and disabled when ACC main is disabled"""
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ for acc_main_on in (True, False):
+ with self.subTest("initial_acc_main", initial_acc_main=acc_main_on):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+
+ # Set initial state
+ self.safety.set_acc_main_on(acc_main_on)
+ self._rx(self._speed_msg(0))
+ expected_lat = enable_aol and acc_main_on
+ self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(),
+ f"Expected lat: [{expected_lat}] when acc_main_on goes to [{acc_main_on}]")
+
+ # Test transition to opposite state
+ self.safety.set_acc_main_on(not acc_main_on)
+ self._rx(self._speed_msg(0))
+ expected_lat = enable_aol and not acc_main_on
+ self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(),
+ f"Expected lat: [{expected_lat}] when acc_main_on goes from [{acc_main_on}] to [{not acc_main_on}]")
+
+ # Test transition back to initial state
+ self.safety.set_acc_main_on(acc_main_on)
+ self._rx(self._speed_msg(0))
+ expected_lat = enable_aol and acc_main_on
+ self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(),
+ f"Expected lat: [{expected_lat}] when acc_main_on goes from [{not acc_main_on}] to [{acc_main_on}]")
+ finally:
+ self._aol_states_cleanup()
+
+ def test_aol_with_acc_main_on(self):
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", aol_enabled=enable_aol):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+
+ self.safety.set_acc_main_on(True)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ self.safety.set_acc_main_on(False)
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_disengage_lateral_on_brake_setup(self):
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ for disengage_on_brake in (True, False):
+ with self.subTest("disengage on brake", disengage_on_brake=disengage_on_brake):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, disengage_on_brake)
+ self.assertEqual(enable_aol and disengage_on_brake, self.safety.get_disengage_lateral_on_brake())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_disengage_lateral_on_brake(self):
+ try:
+ self._aol_states_cleanup()
+ self._set_aol_params(True, True)
+
+ self._rx(self._user_brake_msg(False))
+ self.safety.set_controls_requested_lat(True)
+ self.safety.set_controls_allowed_lat(True)
+
+ self._rx(self._user_brake_msg(True))
+ # Test we pause lateral
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ # Make sure we can re-gain lateral actuation
+ self._rx(self._user_brake_msg(False))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_no_disengage_lateral_on_brake(self):
+ try:
+ self._aol_states_cleanup()
+ self._set_aol_params(True, False)
+
+ self._rx(self._user_brake_msg(False))
+ self.safety.set_controls_requested_lat(True)
+ self.safety.set_controls_allowed_lat(True)
+
+ self._rx(self._user_brake_msg(True))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_engage_with_brake_pressed(self):
+ try:
+ self._lkas_button_msg(False)
+ except NotImplementedError:
+ raise unittest.SkipTest("Skipping test because AOL button is not supported")
+
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ for disengage_lateral_on_brake in (True, False):
+ with self.subTest("disengage_lateral_on_brake", disengage_lateral_on_brake=disengage_lateral_on_brake):
+ with self.subTest("aol_button"):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, disengage_lateral_on_brake)
+
+ # Brake press rising edge
+ self._rx(self._user_brake_msg(True))
+ self._rx(self._lkas_button_msg(True))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ # Continuous braking after the first frame of brake press rising edge
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+ for _ in range(400):
+ self._rx(self._user_brake_msg(True))
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ with self.subTest("acc_main_on"):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, disengage_lateral_on_brake)
+
+ # Brake press rising edge
+ self._rx(self._user_brake_msg(True))
+ self.safety.set_acc_main_on(True)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ # Continuous braking after the first frame of brake press rising edge
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+ for _ in range(400):
+ self._rx(self._user_brake_msg(True))
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_disengage_lateral_on_brake_with_pressed_and_released(self):
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ for disengage_lateral_on_brake in (True, False):
+ with self.subTest("disengage_lateral_on_brake", disengage_lateral_on_brake=disengage_lateral_on_brake):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, disengage_lateral_on_brake)
+
+ # Set controls_allowed_lat rising edge
+ self.safety.set_controls_requested_lat(True)
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ # User brake press, validate controls_allowed_lat is false
+ self._rx(self._user_brake_msg(True))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol and not disengage_lateral_on_brake, self.safety.get_controls_allowed_lat())
+
+ # User brake release, validate controls_allowed_lat is true
+ self._rx(self._user_brake_msg(False))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_disengage_lateral_on_brake_persistent_control_allowed_off(self):
+ try:
+ self._aol_states_cleanup()
+ self._set_aol_params(True, True)
+
+ self.safety.set_controls_requested_lat(True)
+
+ # Vehicle moving, validate controls_allowed_lat is true
+ for _ in range(10):
+ self._rx(self._speed_msg(10))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # User braked, vehicle slowed down in 10 frames, then stopped for 10 frames
+ # Validate controls_allowed_lat is false
+ self._rx(self._user_brake_msg(True))
+ for _ in range(10):
+ self._rx(self._speed_msg(5))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ for _ in range(10):
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_enable_lateral_control_with_controls_allowed_rising_edge(self):
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+
+ self.safety.set_controls_allowed(False)
+ self._rx(self._speed_msg(0))
+ self.safety.set_controls_allowed(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_enable_control_allowed_with_aol_button_and_disable_with_main_cruise(self):
+ """Tests main cruise and AOL button state transitions.
+
+ Sequence:
+ 1. Main cruise off -> on
+ 2. AOL button engage
+ 3. Main cruise off
+
+ """
+ try:
+ self._lkas_button_msg(False)
+ except NotImplementedError:
+ raise unittest.SkipTest("Skipping test because AOL button is not supported")
+
+ try:
+ self._acc_state_msg(False)
+ except NotImplementedError:
+ raise unittest.SkipTest("Skipping test because _acc_state_msg is not implemented for this car")
+
+ try:
+ for enable_aol in (True, False):
+ with self.subTest("enable_aol", enable_aol=enable_aol):
+ self._aol_states_cleanup()
+ self._set_aol_params(enable_aol, False)
+
+ self._rx(self._lkas_button_msg(True))
+ self._rx(self._speed_msg(0))
+ self._rx(self._lkas_button_msg(False))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ self._rx(self._acc_state_msg(True))
+ self._rx(self._speed_msg(0))
+ self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
+
+ self._rx(self._acc_state_msg(False))
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+ finally:
+ self._aol_states_cleanup()
+
+ def test_brake_disengage_with_control_request(self):
+ """Tests behavior when controls are requested while brake is engaged
+
+ Sequence:
+ 1. Enable AOL with disengage on brake
+ 2. Brake to disengage lateral control
+ 3. Set control request while braking
+ 4. Release brake
+ 5. Verify controls become allowed
+ """
+ try:
+ self._aol_states_cleanup()
+ self._set_aol_params(True, True) # enable AOL with disengage on brake
+
+ # Initial state
+ self.safety.set_controls_allowed_lat(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # Brake press disengages lateral
+ self._rx(self._user_brake_msg(True))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Request controls while braking
+ self.safety.set_controls_requested_lat(True)
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Release brake - should enable since controls were requested
+ self._rx(self._user_brake_msg(False))
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ finally:
+ self._aol_states_cleanup()
+
+ def test_brake_disengage_with_acc_main_off(self):
+ """Tests behavior when ACC main is turned off while brake is engaged
+
+ Sequence:
+ 1. Enable AOL with disengage on brake
+ 2. Brake to disengage lateral control
+ 3. Turn ACC main off while braking
+ 4. Release brake
+ 5. Verify controls remain disengaged
+ """
+ try:
+ self._aol_states_cleanup()
+ self._set_aol_params(True, True) # enable AOL with disengage on brake
+
+ # Initial state - enable with ACC main
+ self.safety.set_acc_main_on(True)
+ self._rx(self._speed_msg(0))
+ self.assertTrue(self.safety.get_controls_allowed_lat())
+
+ # Brake press disengages lateral
+ self._rx(self._user_brake_msg(True))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Turn ACC main off while braking
+ self.safety.set_acc_main_on(False)
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ # Release brake - should remain disabled since ACC main is off
+ self._rx(self._user_brake_msg(False))
+ self._rx(self._speed_msg(0))
+ self.assertFalse(self.safety.get_controls_allowed_lat())
+
+ finally:
+ self._aol_states_cleanup()
diff --git a/panda/tests/setup_device_ci.sh b/panda/tests/setup_device_ci.sh
new file mode 100755
index 000000000..fe28b8612
--- /dev/null
+++ b/panda/tests/setup_device_ci.sh
@@ -0,0 +1,76 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [ -z "$SOURCE_DIR" ]; then
+ echo "SOURCE_DIR must be set"
+ exit 1
+fi
+
+if [ -z "$GIT_COMMIT" ]; then
+ echo "GIT_COMMIT must be set"
+ exit 1
+fi
+
+if [ -z "$TEST_DIR" ]; then
+ echo "TEST_DIR must be set"
+ exit 1
+fi
+
+CONTINUE_PATH="/data/continue.sh"
+tee $CONTINUE_PATH << EOF
+#!/usr/bin/env bash
+
+sudo abctl --set_success
+
+# patch sshd config
+sudo mount -o rw,remount /
+sudo sed -i "s,/data/params/d/GithubSshKeys,/usr/comma/setup_keys," /etc/ssh/sshd_config
+sudo systemctl daemon-reload
+sudo systemctl restart ssh
+sudo systemctl disable ssh-param-watcher.path
+sudo systemctl disable ssh-param-watcher.service
+sudo mount -o ro,remount /
+
+sudo systemctl stop power_monitor
+
+while true; do
+ if ! sudo systemctl is-active -q ssh; then
+ sudo systemctl start ssh
+ fi
+ sleep 5s
+done
+
+sleep infinity
+EOF
+chmod +x $CONTINUE_PATH
+
+
+# set up environment
+if [ ! -d "$SOURCE_DIR" ]; then
+ git clone https://github.com/commaai/panda.git $SOURCE_DIR
+fi
+
+# setup device/SOM state
+SOM_ST_IO=49
+echo $SOM_ST_IO > /sys/class/gpio/export || true
+echo out > /sys/class/gpio/gpio${SOM_ST_IO}/direction
+echo 1 > /sys/class/gpio/gpio${SOM_ST_IO}/value
+
+# checkout panda commit
+cd $SOURCE_DIR
+
+rm -f .git/index.lock
+git reset --hard
+git fetch --no-tags --no-recurse-submodules -j4 --verbose --depth 1 origin $GIT_COMMIT
+find . -maxdepth 1 -not -path './.git' -not -name '.' -not -name '..' -exec rm -rf '{}' \;
+git reset --hard $GIT_COMMIT
+git checkout $GIT_COMMIT
+git clean -xdff
+
+echo "git checkout done, t=$SECONDS"
+du -hs $SOURCE_DIR $SOURCE_DIR/.git
+
+rsync -a --delete $SOURCE_DIR $TEST_DIR
+
+echo "$TEST_DIR synced with $GIT_COMMIT, t=$SECONDS"
diff --git a/panda/tests/som/on-device.py b/panda/tests/som/on-device.py
new file mode 100755
index 000000000..fc21084fe
--- /dev/null
+++ b/panda/tests/som/on-device.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+import os
+import time
+
+from iqdbc.car.structs import CarParams
+from panda import Panda
+
+
+if __name__ == "__main__":
+ flag_set = False
+ while True:
+ try:
+ with Panda(disable_checks=False) as p:
+ if not flag_set:
+ p.set_heartbeat_disabled()
+ p.set_safety_mode(CarParams.SafetyModel.elm327, 30)
+ flag_set = True
+
+ # shutdown when told
+ ch = p.can_health(0)
+ if ch['can_data_speed'] == 1000:
+ os.system("sudo poweroff")
+ except Exception as e:
+ print(str(e))
+ time.sleep(0.5)
diff --git a/panda/tests/som/test_bootkick.py b/panda/tests/som/test_bootkick.py
new file mode 100644
index 000000000..1e10e2370
--- /dev/null
+++ b/panda/tests/som/test_bootkick.py
@@ -0,0 +1,154 @@
+import time
+import pytest
+
+from iqdbc.car.structs import CarParams
+from panda import Panda, PandaJungle
+
+PANDA_SERIAL = "300008001851333037333932"
+JUNGLE_SERIAL = "26001c001451313236343430"
+
+OBDC_PORT = 1
+
+@pytest.fixture(autouse=True, scope="function")
+def pj():
+ jungle = PandaJungle(JUNGLE_SERIAL)
+ jungle.flash()
+
+ jungle.reset()
+ jungle.set_ignition(False)
+
+ yield jungle
+
+ #jungle.set_panda_power(False)
+ jungle.close()
+
+@pytest.fixture(scope="function")
+def p(pj):
+ # note that the 3X's panda lib isn't updated, which
+ # shold be fine since it only uses stable APIs
+ pj.set_panda_power(True)
+ assert Panda.wait_for_panda(PANDA_SERIAL, 10)
+ p = Panda(PANDA_SERIAL)
+ p.flash()
+ p.reset()
+ yield p
+ p.close()
+
+def setup_state(panda, jungle, state):
+ jungle.set_panda_power(0)
+
+ if state == "off":
+ wait_for_full_poweroff(jungle)
+ elif state == "normal boot":
+ jungle.set_panda_individual_power(OBDC_PORT, 1)
+ elif state == "QDL":
+ time.sleep(0.5)
+ jungle.set_panda_individual_power(OBDC_PORT, 1)
+ elif state == "ready to bootkick":
+ wait_for_full_poweroff(jungle)
+ jungle.set_panda_individual_power(OBDC_PORT, 1)
+ wait_for_boot(panda, jungle)
+ set_som_shutdown_flag(panda)
+ panda.set_safety_mode(CarParams.SafetyModel.silent)
+ panda.send_heartbeat()
+ wait_for_som_shutdown(panda, jungle)
+ else:
+ raise ValueError(f"unkown state: {state}")
+
+
+def wait_for_som_shutdown(panda, jungle):
+ st = time.monotonic()
+ while panda.read_som_gpio():
+ # can take a while for the SOM to fully shutdown
+ if time.monotonic() - st > 120:
+ raise Exception("SOM didn't shutdown in time")
+ if check_som_boot_flag(panda):
+ raise Exception(f"SOM rebooted instead of shutdown: {time.monotonic() - st}s")
+ time.sleep(0.5)
+ dt = time.monotonic() - st
+ print("waiting for shutdown", round(dt))
+ dt = time.monotonic() - st
+ print(f"took {dt:.2f}s for SOM to shutdown")
+
+def wait_for_full_poweroff(jungle, timeout=30):
+ st = time.monotonic()
+
+ time.sleep(15)
+ while PANDA_SERIAL in Panda.list():
+ if time.monotonic() - st > timeout:
+ raise Exception("took too long for device to turn off")
+
+ health = jungle.health()
+ assert all(health[f"ch{i}_power"] < 0.1 for i in range(1, 7))
+
+def check_som_boot_flag(panda):
+ h = panda.health()
+ return h['safety_mode'] == CarParams.SafetyModel.elm327 and h['safety_param'] == 30
+
+def set_som_shutdown_flag(panda):
+ panda.set_can_data_speed_kbps(0, 1000)
+
+def wait_for_boot(panda, jungle, reset_expected=False, bootkick=False, timeout=120):
+ st = time.monotonic()
+
+ Panda.wait_for_panda(PANDA_SERIAL, timeout)
+ panda.reconnect()
+ if bootkick:
+ assert panda.health()['uptime'] > 20
+ else:
+ assert panda.health()['uptime'] < 3
+
+ for i in range(3):
+ assert not check_som_boot_flag(panda)
+ time.sleep(1)
+
+ # wait for SOM to bootup
+ while not check_som_boot_flag(panda):
+ if time.monotonic() - st > timeout:
+ raise Exception("SOM didn't boot in time")
+ time.sleep(1.0)
+
+ assert panda.health()['som_reset_triggered'] == reset_expected
+
+def test_cold_boot(p, pj):
+ setup_state(p, pj, "off")
+ setup_state(p, pj, "normal boot")
+ wait_for_boot(p, pj)
+
+def test_bootkick_ignition_line(p, pj):
+ setup_state(p, pj, "ready to bootkick")
+ pj.set_ignition(True)
+ wait_for_boot(p, pj, bootkick=True)
+
+@pytest.mark.skip("test isn't reliable yet")
+def test_bootkick_can_ignition(p, pj):
+ setup_state(p, pj, "ready to bootkick")
+ for _ in range(10):
+ # Mazda ignition signal
+ pj.can_send(0x9E, b'\xc0\x00\x00\x00\x00\x00\x00\x00', 0)
+ time.sleep(0.5)
+ wait_for_boot(p, pj, bootkick=True)
+
+def test_recovery_from_qdl(p, pj):
+ setup_state(p, pj, "ready to bootkick")
+
+ # put into QDL using the FORCE_USB_BOOT pin
+ for i in range(10):
+ pj.set_header_pin(i, 1)
+
+ # try to boot
+ time.sleep(1)
+ pj.set_ignition(True)
+ time.sleep(3)
+
+ # release FORCE_USB_BOOT
+ for i in range(10):
+ pj.set_header_pin(i, 0)
+
+ # normally, this GPIO is set immediately since it's first enabled in the ABL
+ for i in range(17):
+ assert not p.read_som_gpio()
+ time.sleep(1)
+
+ # should boot after 45s
+ wait_for_boot(p, pj, reset_expected=True, bootkick=True, timeout=120)
diff --git a/panda/tests/usbprotocol/test_comms.py b/panda/tests/usbprotocol/test_comms.py
new file mode 100755
index 000000000..f17aa6663
--- /dev/null
+++ b/panda/tests/usbprotocol/test_comms.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+import random
+import unittest
+
+from iqdbc.car.structs import CarParams
+from panda import DLC_TO_LEN, USBPACKET_MAX_SIZE, pack_can_buffer, unpack_can_buffer
+from panda.tests.libpanda import libpanda_py
+
+lpp = libpanda_py.libpanda
+
+CHUNK_SIZE = USBPACKET_MAX_SIZE
+TX_QUEUES = (lpp.tx1_q, lpp.tx2_q, lpp.tx3_q)
+
+
+def unpackage_can_msg(pkt):
+ dat_len = DLC_TO_LEN[pkt[0].data_len_code]
+ dat = bytes(pkt[0].data[0:dat_len])
+ return pkt[0].addr, dat, pkt[0].bus
+
+
+def random_can_messages(n, bus=None):
+ msgs = []
+ for _ in range(n):
+ if bus is None:
+ bus = random.randint(0, 3)
+ address = random.randint(1, (1 << 29) - 1)
+ data = bytes([random.getrandbits(8) for _ in range(DLC_TO_LEN[random.randrange(0, len(DLC_TO_LEN))])])
+ msgs.append((address, data, bus))
+ return msgs
+
+
+class TestPandaComms(unittest.TestCase):
+ def setUp(self):
+ lpp.comms_can_reset()
+
+ def test_tx_queues(self):
+ for bus in range(len(TX_QUEUES)):
+ message = (0x100, b"test", bus)
+
+ can_pkt_tx = libpanda_py.make_CANPacket(message[0], message[2], message[1])
+ can_pkt_rx = libpanda_py.ffi.new('CANPacket_t *')
+
+ assert lpp.can_push(TX_QUEUES[bus], can_pkt_tx), "CAN push failed"
+ assert lpp.can_pop(TX_QUEUES[bus], can_pkt_rx), "CAN pop failed"
+
+ assert unpackage_can_msg(can_pkt_rx) == message
+
+ def test_comms_reset_rx(self):
+ # store some test messages in the queue
+ test_msg = (0x100, b"test", 0)
+ for _ in range(100):
+ can_pkt_tx = libpanda_py.make_CANPacket(test_msg[0], test_msg[2], test_msg[1])
+ lpp.can_push(lpp.rx_q, can_pkt_tx)
+
+ # read a small chunk such that we have some overflow
+ TINY_CHUNK_SIZE = 6
+ dat = libpanda_py.ffi.new(f"uint8_t[{TINY_CHUNK_SIZE}]")
+ rx_len = lpp.comms_can_read(dat, TINY_CHUNK_SIZE)
+ assert rx_len == TINY_CHUNK_SIZE, "comms_can_read returned too little data"
+
+ _, overflow = unpack_can_buffer(bytes(dat))
+ assert len(overflow) > 0, "overflow buffer should not be empty"
+
+ # reset the comms to clear the overflow buffer on the panda side
+ lpp.comms_can_reset()
+
+ # read a large chunk, which should now contain valid messages
+ LARGE_CHUNK_SIZE = 512
+ dat = libpanda_py.ffi.new(f"uint8_t[{LARGE_CHUNK_SIZE}]")
+ rx_len = lpp.comms_can_read(dat, LARGE_CHUNK_SIZE)
+ assert rx_len == LARGE_CHUNK_SIZE, "comms_can_read returned too little data"
+
+ msgs, _ = unpack_can_buffer(bytes(dat))
+ assert len(msgs) > 0, "message buffer should not be empty"
+ for m in msgs:
+ assert m == test_msg, "message buffer should contain valid test messages"
+
+ def test_comms_reset_tx(self):
+ # store some test messages in the queue
+ test_msg = (0x100, b"test", 0)
+ packed = pack_can_buffer([test_msg for _ in range(100)], chunk=True)
+
+ # write a small chunk such that we have some overflow
+ TINY_CHUNK_SIZE = 6
+ lpp.comms_can_write(bytes(packed[0][:TINY_CHUNK_SIZE]), TINY_CHUNK_SIZE)
+
+ # reset the comms to clear the overflow buffer on the panda side
+ lpp.comms_can_reset()
+
+ # write a full valid chunk, which should now contain valid messages
+ lpp.comms_can_write(bytes(packed[1]), len(packed[1]))
+
+ # read the messages from the queue and make sure they're valid
+ queue_msgs = []
+ pkt = libpanda_py.ffi.new('CANPacket_t *')
+ while lpp.can_pop(TX_QUEUES[0], pkt):
+ queue_msgs.append(unpackage_can_msg(pkt))
+
+ assert len(queue_msgs) > 0, "message buffer should not be empty"
+ for m in queue_msgs:
+ assert m == test_msg, "message buffer should contain valid test messages"
+
+
+ def test_can_send_usb(self):
+ lpp.set_safety_hooks(CarParams.SafetyModel.allOutput, 0)
+
+ for bus in range(3):
+ with self.subTest(bus=bus):
+ for _ in range(100):
+ msgs = random_can_messages(200, bus=bus)
+ packed = pack_can_buffer(msgs)
+
+ # Simulate USB bulk chunks
+ for buf in packed:
+ for i in range(0, len(buf), CHUNK_SIZE):
+ chunk_len = min(CHUNK_SIZE, len(buf) - i)
+ lpp.comms_can_write(bytes(buf[i:i+chunk_len]), chunk_len)
+
+ # Check that they ended up in the right buffers
+ queue_msgs = []
+ pkt = libpanda_py.ffi.new('CANPacket_t *')
+ while lpp.can_pop(TX_QUEUES[bus], pkt):
+ queue_msgs.append(unpackage_can_msg(pkt))
+
+ self.assertEqual(len(queue_msgs), len(msgs))
+ self.assertEqual(queue_msgs, msgs)
+
+ def test_can_receive_usb(self):
+ msgs = random_can_messages(50000)
+ packets = [libpanda_py.make_CANPacket(m[0], m[2], m[1]) for m in msgs]
+
+ rx_msgs = []
+ overflow_buf = b""
+ while len(packets) > 0:
+ # Push into queue
+ while lpp.can_slots_empty(lpp.rx_q) > 0 and len(packets) > 0:
+ lpp.can_push(lpp.rx_q, packets.pop(0))
+
+ # Simulate USB bulk IN chunks
+ MAX_TRANSFER_SIZE = 16384
+ dat = libpanda_py.ffi.new(f"uint8_t[{CHUNK_SIZE}]")
+ while True:
+ buf = b""
+ while len(buf) < MAX_TRANSFER_SIZE:
+ max_size = min(CHUNK_SIZE, MAX_TRANSFER_SIZE - len(buf))
+ rx_len = lpp.comms_can_read(dat, max_size)
+ buf += bytes(dat[0:rx_len])
+ if rx_len < max_size:
+ break
+
+ if len(buf) == 0:
+ break
+ unpacked_msgs, overflow_buf = unpack_can_buffer(overflow_buf + buf)
+ rx_msgs.extend(unpacked_msgs)
+
+ self.assertEqual(len(rx_msgs), len(msgs))
+ self.assertEqual(rx_msgs, msgs)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/panda/tests/usbprotocol/test_pandalib.py b/panda/tests/usbprotocol/test_pandalib.py
new file mode 100755
index 000000000..ef725948c
--- /dev/null
+++ b/panda/tests/usbprotocol/test_pandalib.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+import random
+import unittest
+
+from panda import pack_can_buffer, unpack_can_buffer, DLC_TO_LEN
+
+class PandaTestPackUnpack(unittest.TestCase):
+ def test_panda_lib_pack_unpack(self):
+ overflow_buf = b''
+
+ to_pack = []
+ for _ in range(10000):
+ address = random.randint(1, (1 << 29) - 1)
+ data = bytes([random.getrandbits(8) for _ in range(DLC_TO_LEN[random.randrange(0, len(DLC_TO_LEN))])])
+ to_pack.append((address, data, 0))
+
+ packed = pack_can_buffer(to_pack)
+ unpacked = []
+ for dat in packed:
+ msgs, overflow_buf = unpack_can_buffer(overflow_buf + dat)
+ unpacked.extend(msgs)
+
+ self.assertEqual(unpacked, to_pack)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/prebuilt b/prebuilt
new file mode 100644
index 000000000..e69de29bb
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..48308354c
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,259 @@
+[project]
+name = "openpilot"
+requires-python = ">= 3.12.3, < 3.13"
+license = {text = "Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos"}
+version = "0.1.0"
+description = "an open source driver assistance system"
+authors = [
+ {name = "Vehicle Researcher", email="user@comma.ai"}
+]
+
+dependencies = [
+ # multiple users
+ "sounddevice", # micd + soundd
+ "pyserial", # pigeond + qcomgpsd
+ "requests", # many one-off uses
+ "sympy", # rednose + friends
+ "crcmod-plus", # cars + qcomgpsd
+ "tqdm", # cars (fw_versions.py) on start + many one-off uses
+
+ # core
+ "cffi",
+ "scons",
+ "pycapnp==2.1.0",
+ "Cython",
+ "setuptools",
+ "numpy >=2.0",
+
+ # body / webrtcd
+ "aiohttp",
+ "aiortc",
+ "libdatachannel-py>=2026.1.0.dev2",
+ # aiortc does not put an upper bound on pyopenssl and is now incompatible
+ # with the latest release
+ "pyopenssl < 24.3.0",
+ "pyaudio",
+
+ # panda
+ "libusb1",
+ "spidev; platform_system == 'Linux'",
+
+ # modeld
+ "onnx >= 1.14.0",
+
+ # logging
+ "pyzmq",
+ "sentry-sdk",
+ "xattr ; sys_platform != 'win32'", # used in place of 'os.getxattr' for macOS compatibility
+
+ # athena
+ "PyJWT",
+ "json-rpc",
+ "websocket_client",
+
+ # acados deps
+ "casadi >=3.6.6", # 3.12 fixed in 3.6.6
+
+ # joystickd
+ "inputs",
+
+ # these should be removed
+ "psutil",
+ "pycryptodome", # used in updated/casync, panda, body, and a test
+ "cryptography", # proprietary bundle signing / verification
+ "setproctitle",
+
+ # logreader
+ "zstandard",
+
+ # ui
+ "raylib > 5.5.0.3",
+ "pyzbar @ git+https://github.com/greatgitsby/op-dependencies.git@release-pyzbar#subdirectory=pyzbar ; sys_platform == 'linux'",
+ "qrcode",
+ "mapbox-earcut",
+ "jeepney",
+]
+
+[project.optional-dependencies]
+docs = [
+ "Jinja2",
+ "mkdocs",
+]
+
+testing = [
+ "coverage",
+ "hypothesis ==6.47.*",
+ "ty",
+ "pytest",
+ "pytest-cpp",
+ "pytest-subtests",
+ # https://github.com/pytest-dev/pytest-xdist/pull/1229
+ "pytest-xdist @ git+https://github.com/sshane/pytest-xdist@2b4372bd62699fb412c4fe2f95bf9f01bd2018da",
+ "pytest-timeout",
+ "pytest-asyncio",
+ "pytest-mock",
+ "pytest-repeat",
+ "ruff",
+ "codespell",
+ "pre-commit-hooks",
+]
+
+dev = [
+ "av",
+ "azure-identity",
+ "azure-storage-blob",
+ "dictdiffer",
+ "matplotlib",
+ "opencv-python-headless",
+ "parameterized >=0.8, <0.9",
+ "pyautogui",
+ "pywinctl",
+ "tabulate",
+]
+
+tools = [
+ "metadrive-simulator @ https://github.com/commaai/metadrive/releases/download/MetaDrive-minimal-0.4.2.4/metadrive_simulator-0.4.2.4-py3-none-any.whl ; (platform_machine != 'aarch64')",
+ "imgui @ git+https://git.konn3kt.com/IQ.Lvbs/dependencies.git@release-imgui#subdirectory=imgui",
+ "libusb @ git+https://git.konn3kt.com/IQ.Lvbs/dependencies.git@release-libusb#subdirectory=libusb",
+]
+
+[project.urls]
+Homepage = "https://github.com/commaai/openpilot"
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.hatch.build.targets.wheel]
+packages = [ "." ]
+
+[tool.hatch.metadata]
+allow-direct-references = true
+
+[tool.pytest.ini_options]
+minversion = "6.0"
+addopts = "--ignore=openpilot/ --ignore=iqdbc/ --ignore=panda/ --ignore=rednose_repo/ --ignore=tinygrad_repo/ --ignore=teleoprtc_repo/ --ignore=msgq/ -Werror --strict-config --strict-markers --durations=10 -n auto --dist=loadgroup"
+cpp_files = "test_*"
+cpp_harness = "selfdrive/test/cpp_harness.py"
+python_files = "test_*.py"
+asyncio_default_fixture_loop_scope = "function"
+#timeout = "30" # you get this long by default
+markers = [
+ "slow: tests that take awhile to run and can be skipped with -m 'not slow'",
+ "tici: tests that are only meant to run on the C3/C3X",
+ "skip_tici_setup: mark test to skip tici setup fixture"
+]
+testpaths = [
+ "common",
+ "selfdrive",
+ "system",
+ "tools",
+ "cereal",
+ "iqpilot",
+]
+
+[tool.codespell]
+quiet-level = 3
+# if you've got a short variable name that's getting flagged, add it here
+ignore-words-list = "bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints,whit,indexIn,ws,uint,grey,deque,stdio,amin,BA,LITE,atEnd,UIs,errorString,arange,FocusIn,od,tim,relA,hist,copyable,jupyter,thead,TGE,abl,lite"
+builtin = "clear,rare,informal,code,names,en-GB_to_en-US"
+skip = "./third_party/*, ./tinygrad/*, ./tinygrad_repo/*, ./msgq/*, ./panda/*, ./iqdbc/*, ./iqdbc_repo/*, ./rednose/*, ./rednose_repo/*, ./teleoprtc/*, ./teleoprtc_repo/*, *.po, uv.lock, *.onnx, ./cereal/gen/*, */c_generated_code/*, docs/assets/*, tools/plotjuggler/layouts/*, selfdrive/assets/offroad/mici_fcc.html"
+
+# https://docs.astral.sh/ruff/configuration/#using-pyprojecttoml
+[tool.ruff]
+indent-width = 2
+lint.select = [
+ "E", "F", "W", "PIE", "C4", "ISC", "A", "B",
+ "NPY", # numpy
+ "UP", # pyupgrade
+ "TRY203", "TRY400", "TRY401", # try/excepts
+ "RUF008", "RUF100",
+ "TID251",
+ "PLE", "PLR1704",
+]
+lint.ignore = [
+ "E741",
+ "E402",
+ "C408",
+ "ISC003",
+ "B027",
+ "B024",
+ "NPY002", # new numpy random syntax is worse
+ "UP045", "UP007", # these don't play nice with raylib atm
+]
+line-length = 160
+target-version ="py311"
+exclude = [
+ "body",
+ "cereal",
+ "panda",
+ "iqdbc",
+ "iqdbc_repo",
+ "rednose_repo",
+ "tinygrad_repo",
+ "teleoprtc",
+ "teleoprtc_repo",
+ "third_party",
+ "*.ipynb",
+ "generated",
+]
+lint.flake8-implicit-str-concat.allow-multiline = false
+
+[tool.ruff.lint.flake8-tidy-imports.banned-api]
+"selfdrive".msg = "Use openpilot.selfdrive"
+"common".msg = "Use openpilot.common"
+"system".msg = "Use openpilot.system"
+"third_party".msg = "Use openpilot.third_party"
+"tools".msg = "Use openpilot.tools"
+"pytest.main".msg = "pytest.main requires special handling that is easy to mess up!"
+"unittest".msg = "Use pytest"
+"time.time".msg = "Use time.monotonic"
+
+# raylib banned APIs
+"pyray.measure_text_ex".msg = "Use openpilot.system.ui.lib.text_measure"
+"pyray.is_mouse_button_pressed".msg = "This can miss events. Use Widget._handle_mouse_press"
+"pyray.is_mouse_button_released".msg = "This can miss events. Use Widget._handle_mouse_release"
+"pyray.draw_text".msg = "Use a function (such as rl.draw_font_ex) that takes font as an argument"
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.ty.src]
+exclude = [
+ "cereal/",
+ "msgq/",
+ "msgq_repo/",
+ "iqdbc/",
+ "iqdbc_repo/",
+ "panda/",
+ "rednose/",
+ "rednose_repo/",
+ "tinygrad/",
+ "tinygrad_repo/",
+ "teleoprtc/",
+ "teleoprtc_repo/",
+ "third_party/",
+]
+
+[tool.ty.rules]
+# Ignore unresolved imports for Cython-compiled modules (.pyx)
+unresolved-import = "ignore"
+# Ignore unresolved attributes - many from capnp and Cython modules
+unresolved-attribute = "ignore"
+# Ignore invalid method overrides - signature variance issues
+invalid-method-override = "ignore"
+# Ignore possibly-missing-attribute - too many false positives
+possibly-missing-attribute = "ignore"
+# Ignore invalid assignment - often intentional monkey-patching
+invalid-assignment = "ignore"
+# Ignore no-matching-overload - numpy/ctypes overload matching issues
+no-matching-overload = "ignore"
+# Ignore invalid-argument-type - many false positives from raylib, ctypes, numpy
+invalid-argument-type = "ignore"
+# Ignore call-non-callable - false positives from dynamic types
+call-non-callable = "ignore"
+# Ignore unsupported-operator - false positives from dynamic types
+unsupported-operator = "ignore"
+# Ignore not-subscriptable - false positives from dynamic types
+not-subscriptable = "ignore"
+# not-iterable errors are now fixed
diff --git a/rednose b/rednose
new file mode 120000
index 000000000..674cfec35
--- /dev/null
+++ b/rednose
@@ -0,0 +1 @@
+rednose_repo/rednose
\ No newline at end of file
diff --git a/rednose_repo/.dockerignore b/rednose_repo/.dockerignore
new file mode 100644
index 000000000..5b2d46270
--- /dev/null
+++ b/rednose_repo/.dockerignore
@@ -0,0 +1 @@
+.sconsign.dblite
diff --git a/rednose_repo/.editorconfig b/rednose_repo/.editorconfig
new file mode 100644
index 000000000..e0da06102
--- /dev/null
+++ b/rednose_repo/.editorconfig
@@ -0,0 +1,11 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[{*.py, *.pyx, *pxd}]
+charset = utf-8
+indent_style = space
+indent_size = 2
diff --git a/rednose_repo/.github/workflows/tests.yml b/rednose_repo/.github/workflows/tests.yml
new file mode 100644
index 000000000..9b0f82dc3
--- /dev/null
+++ b/rednose_repo/.github/workflows/tests.yml
@@ -0,0 +1,34 @@
+name: tests
+
+on: [push, pull_request]
+
+env:
+ REGISTRY: ghcr.io/commaai
+ BUILD: docker buildx build --pull --load --cache-to type=inline --cache-from $REGISTRY/rednose:latest -t rednose -f Dockerfile .
+ RUN: docker run rednose bash -c
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Build docker image
+ run: eval ${{ env.BUILD }}
+ - name: Static analysis
+ run: ${{ env.RUN }} "git init && git add -A && pre-commit run --all"
+ - name: Unit Tests
+ run: ${{ env.RUN }} "pytest"
+
+ docker_push:
+ name: docker push
+ runs-on: ubuntu-latest
+ if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/rednose'
+ steps:
+ - uses: actions/checkout@v4
+ - name: Build Docker image
+ run: eval ${{ env.BUILD }}
+ - name: Push to dockerhub
+ run: |
+ docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }}
+ docker tag rednose ${{ env.REGISTRY }}/rednose:latest
+ docker push ${{ env.REGISTRY }}/rednose:latest
diff --git a/rednose_repo/.gitignore b/rednose_repo/.gitignore
new file mode 100644
index 000000000..bf2b50d22
--- /dev/null
+++ b/rednose_repo/.gitignore
@@ -0,0 +1,151 @@
+generated/
+.sconsign.dblite
+*.swp
+*.tmp
+
+# Cython intermediates
+*_pyx.cpp
+*_pyx.h
+*_pyx_api.h
+*.os
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.a
+*.o
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
diff --git a/rednose_repo/.pre-commit-config.yaml b/rednose_repo/.pre-commit-config.yaml
new file mode 100644
index 000000000..b908de296
--- /dev/null
+++ b/rednose_repo/.pre-commit-config.yaml
@@ -0,0 +1,21 @@
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.0.1
+ hooks:
+ - id: check-ast
+ - id: check-json
+ - id: check-xml
+ - id: check-yaml
+ - id: check-merge-conflict
+ - id: check-symlinks
+ - id: check-executables-have-shebangs
+ - id: check-shebang-scripts-are-executable
+- repo: https://github.com/pre-commit/mirrors-mypy
+ rev: v1.4.0
+ hooks:
+ - id: mypy
+ additional_dependencies: ['numpy']
+- repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.2.2
+ hooks:
+ - id: ruff
diff --git a/rednose_repo/Dockerfile b/rednose_repo/Dockerfile
new file mode 100644
index 000000000..57bd4c1ea
--- /dev/null
+++ b/rednose_repo/Dockerfile
@@ -0,0 +1,14 @@
+FROM ubuntu:24.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update && apt-get install -y capnproto libcapnp-dev clang wget git autoconf libtool curl make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl libeigen3-dev python3-pip python3-dev
+
+WORKDIR /project
+
+ENV PYTHONPATH=/project
+
+COPY . .
+RUN rm -rf .git
+RUN pip3 install --break-system-packages --no-cache-dir -r requirements.txt
+RUN python3 setup.py install
+RUN scons -c && scons -j$(nproc)
diff --git a/rednose_repo/LICENSE b/rednose_repo/LICENSE
new file mode 100644
index 000000000..6f1774f1d
--- /dev/null
+++ b/rednose_repo/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 comma.ai
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/rednose_repo/README.md b/rednose_repo/README.md
new file mode 100644
index 000000000..264958bfc
--- /dev/null
+++ b/rednose_repo/README.md
@@ -0,0 +1,51 @@
+## Introduction
+The kalman filter framework described here is an incredibly powerful tool for any optimization problem,
+but particularly for visual odometry, sensor fusion localization or SLAM. It is designed to provide very
+accurate results, work online or offline, be fairly computationally efficient, be easy to design filters with in
+python.
+
+
+
+
+## Feature walkthrough
+
+### Extended Kalman Filter with symbolic Jacobian computation
+Most dynamic systems can be described as a Hidden Markov Process. To estimate the state of such a system with noisy
+measurements one can use a Recursive Bayesian estimator. For a linear Markov Process a regular linear Kalman filter is optimal.
+Unfortunately, a lot of systems are non-linear. Extended Kalman Filters can model systems by linearizing the non-linear
+system at every step, this provides a close to optimal estimator when the linearization is good enough. If the linearization
+introduces too much noise, one can use an Iterated Extended Kalman Filter, Unscented Kalman Filter or a Particle Filter. For
+most applications those estimators are overkill. They add a lot of complexity and require a lot of additional compute.
+
+Conventionally Extended Kalman Filters are implemented by writing the system's dynamic equations and then manually symbolically
+calculating the Jacobians for the linearization. For complex systems this is time consuming and very prone to calculation errors.
+This library symbolically computes the Jacobians using sympy to simplify the system's definition and remove the possibility of introducing calculation errors.
+
+### Error State Kalman Filter
+3D localization algorithms usually also require estimating orientation of an object in 3D. Orientation is generally represented
+with euler angles or quaternions.
+
+Euler angles have several problems, there are multiple ways to represent the same orientation,
+gimbal lock can cause the loss of a degree of freedom and lastly their behaviour is very non-linear when errors are large.
+Quaternions with one strictly positive dimension don't suffer from these issues, but have another set of problems.
+Quaternions need to be normalized otherwise they will grow unbounded, but this cannot be cleanly enforced in a kalman filter.
+Most importantly though a quaternion has 4 dimensions, but only represents 3 degrees of freedom, so there is one redundant dimension.
+
+Kalman filters are designed to minimize the error of the system's state. It is possible to have a kalman filter where state and the error of the state are represented in a different space. As long as there is an error function that can compute the error based on the true state and estimated state. It is problematic to have redundant dimensions in the error of the kalman filter, but not in the state. A good compromise then, is to use the quaternion to represent the system's attitude state and use euler angles to describe the error in attitude. This library supports and defining an arbitrary error that is in a different space than the state. [Joan Solà](https://arxiv.org/abs/1711.02508) has written a comprehensive description of using ESKFs for robust 3D orientation estimation.
+
+### Multi-State Constraint Kalman Filter
+How do you integrate feature-based visual odometry with a Kalman filter? The problem is that one cannot write an observation equation for 2D feature observations in image space for a localization kalman filter. One needs to give the feature observation a depth so it has a 3D position, then one can write an obvervation equation in the kalman filter. This is possible by tracking the feature across frames and then estimating the depth. However, the solution is not that simple, the depth estimated by tracking the feature across frames depends on the location of the camera at those frames, and thus the state of the kalman filter. This creates a positive feedback loop where the kalman filter wrongly gains confidence in it's position because the feature position updates reinforce it.
+
+The solution is to use an [MSCKF](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.437.1085&rep=rep1&type=pdf), which this library fully supports.
+
+### Rauch–Tung–Striebel smoothing
+When doing offline estimation with a kalman filter there can be an initialization period where states are badly estimated.
+Global estimators don't suffer from this, to make our kalman filter competitive with global optimizers we can run the filter
+backwards using an RTS smoother. Those combined with potentially multiple forward and backwards passes of the data should make
+performance very close to global optimization.
+
+### Mahalanobis distance outlier rejector
+A lot of measurements do not come from a Gaussian distribution and as such have outliers that do not fit the statistical model
+of the Kalman filter. This can cause a lot of performance issues if not dealt with. This library allows the use of a mahalanobis
+distance statistical test on the incoming measurements to deal with this. Note that good initialization is critical to prevent
+good measurements from being rejected.
diff --git a/rednose_repo/examples/__init__.py b/rednose_repo/examples/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/rednose_repo/examples/kinematic_kf.png b/rednose_repo/examples/kinematic_kf.png
new file mode 100644
index 000000000..acb0e442c
Binary files /dev/null and b/rednose_repo/examples/kinematic_kf.png differ
diff --git a/rednose_repo/examples/kinematic_kf.py b/rednose_repo/examples/kinematic_kf.py
new file mode 100755
index 000000000..29049a7b9
--- /dev/null
+++ b/rednose_repo/examples/kinematic_kf.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+import sys
+
+import numpy as np
+import sympy as sp
+
+from rednose.helpers.kalmanfilter import KalmanFilter
+
+if __name__ == '__main__': # generating sympy code
+ from rednose.helpers.ekf_sym import gen_code
+else:
+ from rednose.helpers.ekf_sym_pyx import EKF_sym_pyx # pylint: disable=no-name-in-module
+
+
+class ObservationKind():
+ UNKNOWN = 0
+ NO_OBSERVATION = 1
+ POSITION = 1
+
+ names = [
+ 'Unknown',
+ 'No observation',
+ 'Position'
+ ]
+
+ @classmethod
+ def to_string(cls, kind):
+ return cls.names[kind]
+
+
+class States():
+ POSITION = slice(0, 1)
+ VELOCITY = slice(1, 2)
+
+
+class KinematicKalman(KalmanFilter):
+ name = 'kinematic'
+
+ initial_x = np.array([0.5, 0.0])
+
+ # state covariance
+ initial_P_diag = np.array([1.0**2, 1.0**2])
+
+ # process noise
+ Q = np.diag([0.1**2, 2.0**2])
+
+ obs_noise = {ObservationKind.POSITION: np.atleast_2d(0.1**2)}
+
+ @staticmethod
+ def generate_code(generated_dir):
+ name = KinematicKalman.name
+ dim_state = KinematicKalman.initial_x.shape[0]
+
+ state_sym = sp.MatrixSymbol('state', dim_state, 1)
+ state = sp.Matrix(state_sym)
+
+ position = state[States.POSITION, :][0,:]
+ velocity = state[States.VELOCITY, :][0,:]
+
+ dt = sp.Symbol('dt')
+ state_dot = sp.Matrix(np.zeros((dim_state, 1)))
+ state_dot[States.POSITION.start, 0] = velocity
+ f_sym = state + dt * state_dot
+
+ obs_eqs = [
+ [sp.Matrix([position]), ObservationKind.POSITION, None],
+ ]
+
+ gen_code(generated_dir, name, f_sym, dt, state_sym, obs_eqs, dim_state, dim_state)
+
+ def __init__(self, generated_dir):
+ dim_state = self.initial_x.shape[0]
+ dim_state_err = self.initial_P_diag.shape[0]
+
+ # init filter
+ self.filter = EKF_sym_pyx(generated_dir, self.name, self.Q, self.initial_x, np.diag(self.initial_P_diag), dim_state, dim_state_err)
+
+
+if __name__ == "__main__":
+ generated_dir = sys.argv[2]
+ KinematicKalman.generate_code(generated_dir)
diff --git a/rednose_repo/examples/live_kf.py b/rednose_repo/examples/live_kf.py
new file mode 100755
index 000000000..6e3c21d93
--- /dev/null
+++ b/rednose_repo/examples/live_kf.py
@@ -0,0 +1,342 @@
+#!/usr/bin/env python3
+import sys
+import numpy as np
+
+from rednose.helpers import KalmanError
+
+if __name__ == '__main__': # Generating sympy
+ import sympy as sp
+ from rednose.helpers.sympy_helpers import euler_rotate, quat_matrix_r, quat_rotate
+ from rednose.helpers.ekf_sym import gen_code
+else:
+ from rednose.helpers.ekf_sym_pyx import EKF_sym_pyx # pylint: disable=no-name-in-module
+
+EARTH_GM = 3.986005e14 # m^3/s^2 (gravitational constant * mass of earth)
+
+
+class ObservationKind():
+ UNKNOWN = 0
+ NO_OBSERVATION = 1
+ GPS_NED = 2
+ ODOMETRIC_SPEED = 3
+ PHONE_GYRO = 4
+ GPS_VEL = 5
+ PSEUDORANGE_GPS = 6
+ PSEUDORANGE_RATE_GPS = 7
+ SPEED = 8
+ NO_ROT = 9
+ PHONE_ACCEL = 10
+ ORB_POINT = 11
+ ECEF_POS = 12
+ CAMERA_ODO_TRANSLATION = 13
+ CAMERA_ODO_ROTATION = 14
+ ORB_FEATURES = 15
+ MSCKF_TEST = 16
+ FEATURE_TRACK_TEST = 17
+ LANE_PT = 18
+ IMU_FRAME = 19
+ PSEUDORANGE_GLONASS = 20
+ PSEUDORANGE_RATE_GLONASS = 21
+ PSEUDORANGE = 22
+ PSEUDORANGE_RATE = 23
+
+ names = [
+ 'Unknown',
+ 'No observation',
+ 'GPS NED',
+ 'Odometric speed',
+ 'Phone gyro',
+ 'GPS velocity',
+ 'GPS pseudorange',
+ 'GPS pseudorange rate',
+ 'Speed',
+ 'No rotation',
+ 'Phone acceleration',
+ 'ORB point',
+ 'ECEF pos',
+ 'camera odometric translation',
+ 'camera odometric rotation',
+ 'ORB features',
+ 'MSCKF test',
+ 'Feature track test',
+ 'Lane ecef point',
+ 'imu frame eulers',
+ 'GLONASS pseudorange',
+ 'GLONASS pseudorange rate',
+ ]
+
+ @classmethod
+ def to_string(cls, kind):
+ return cls.names[kind]
+
+
+class States():
+ ECEF_POS = slice(0, 3) # x, y and z in ECEF in meters
+ ECEF_ORIENTATION = slice(3, 7) # quat for pose of phone in ecef
+ ECEF_VELOCITY = slice(7, 10) # ecef velocity in m/s
+ ANGULAR_VELOCITY = slice(10, 13) # roll, pitch and yaw rates in device frame in radians/s
+ GYRO_BIAS = slice(13, 16) # roll, pitch and yaw biases
+ ODO_SCALE = slice(16, 17) # odometer scale
+ ACCELERATION = slice(17, 20) # Acceleration in device frame in m/s**2
+ IMU_OFFSET = slice(20, 23) # imu offset angles in radians
+
+ # Error-state has different slices because it is an ESKF
+ ECEF_POS_ERR = slice(0, 3)
+ ECEF_ORIENTATION_ERR = slice(3, 6) # euler angles for orientation error
+ ECEF_VELOCITY_ERR = slice(6, 9)
+ ANGULAR_VELOCITY_ERR = slice(9, 12)
+ GYRO_BIAS_ERR = slice(12, 15)
+ ODO_SCALE_ERR = slice(15, 16)
+ ACCELERATION_ERR = slice(16, 19)
+ IMU_OFFSET_ERR = slice(19, 22)
+
+
+class LiveKalman():
+ name = 'live'
+
+ initial_x = np.array([-2.7e6, 4.2e6, 3.8e6,
+ 1, 0, 0, 0,
+ 0, 0, 0,
+ 0, 0, 0,
+ 0, 0, 0,
+ 1,
+ 0, 0, 0,
+ 0, 0, 0])
+
+ # state covariance
+ initial_P_diag = np.array([10000**2, 10000**2, 10000**2,
+ 10**2, 10**2, 10**2,
+ 10**2, 10**2, 10**2,
+ 1**2, 1**2, 1**2,
+ 0.05**2, 0.05**2, 0.05**2,
+ 0.02**2,
+ 1**2, 1**2, 1**2,
+ (0.01)**2, (0.01)**2, (0.01)**2])
+
+ # process noise
+ Q = np.diag([0.03**2, 0.03**2, 0.03**2,
+ 0.0**2, 0.0**2, 0.0**2,
+ 0.0**2, 0.0**2, 0.0**2,
+ 0.1**2, 0.1**2, 0.1**2,
+ (0.005 / 100)**2, (0.005 / 100)**2, (0.005 / 100)**2,
+ (0.02 / 100)**2,
+ 3**2, 3**2, 3**2,
+ (0.05 / 60)**2, (0.05 / 60)**2, (0.05 / 60)**2])
+
+ @staticmethod
+ def generate_code(generated_dir):
+ name = LiveKalman.name
+ dim_state = LiveKalman.initial_x.shape[0]
+ dim_state_err = LiveKalman.initial_P_diag.shape[0]
+
+ state_sym = sp.MatrixSymbol('state', dim_state, 1)
+ state = sp.Matrix(state_sym)
+ x, y, z = state[States.ECEF_POS, :]
+ q = state[States.ECEF_ORIENTATION, :]
+ v = state[States.ECEF_VELOCITY, :]
+ vx, vy, vz = v
+ omega = state[States.ANGULAR_VELOCITY, :]
+ vroll, vpitch, vyaw = omega
+ roll_bias, pitch_bias, yaw_bias = state[States.GYRO_BIAS, :]
+ odo_scale = state[States.ODO_SCALE, :][0,:]
+ acceleration = state[States.ACCELERATION, :]
+ imu_angles = state[States.IMU_OFFSET, :]
+
+ dt = sp.Symbol('dt')
+
+ # calibration and attitude rotation matrices
+ quat_rot = quat_rotate(*q)
+
+ # Got the quat predict equations from here
+ # A New Quaternion-Based Kalman Filter for
+ # Real-Time Attitude Estimation Using the Two-Step
+ # Geometrically-Intuitive Correction Algorithm
+ A = 0.5 * sp.Matrix([[0, -vroll, -vpitch, -vyaw],
+ [vroll, 0, vyaw, -vpitch],
+ [vpitch, -vyaw, 0, vroll],
+ [vyaw, vpitch, -vroll, 0]])
+ q_dot = A * q
+
+ # Time derivative of the state as a function of state
+ state_dot = sp.Matrix(np.zeros((dim_state, 1)))
+ state_dot[States.ECEF_POS, :] = v
+ state_dot[States.ECEF_ORIENTATION, :] = q_dot
+ state_dot[States.ECEF_VELOCITY, 0] = quat_rot * acceleration
+
+ # Basic descretization, 1st order intergrator
+ # Can be pretty bad if dt is big
+ f_sym = state + dt * state_dot
+
+ state_err_sym = sp.MatrixSymbol('state_err', dim_state_err, 1)
+ state_err = sp.Matrix(state_err_sym)
+ quat_err = state_err[States.ECEF_ORIENTATION_ERR, :]
+ v_err = state_err[States.ECEF_VELOCITY_ERR, :]
+ omega_err = state_err[States.ANGULAR_VELOCITY_ERR, :]
+ acceleration_err = state_err[States.ACCELERATION_ERR, :]
+
+ # Time derivative of the state error as a function of state error and state
+ quat_err_matrix = euler_rotate(quat_err[0], quat_err[1], quat_err[2])
+ q_err_dot = quat_err_matrix * quat_rot * (omega + omega_err)
+ state_err_dot = sp.Matrix(np.zeros((dim_state_err, 1)))
+ state_err_dot[States.ECEF_POS_ERR, :] = v_err
+ state_err_dot[States.ECEF_ORIENTATION_ERR, :] = q_err_dot
+ state_err_dot[States.ECEF_VELOCITY_ERR, :] = quat_err_matrix * quat_rot * (acceleration + acceleration_err)
+ f_err_sym = state_err + dt * state_err_dot
+
+ # Observation matrix modifier
+ H_mod_sym = sp.Matrix(np.zeros((dim_state, dim_state_err)))
+ H_mod_sym[States.ECEF_POS, States.ECEF_POS_ERR] = np.eye(States.ECEF_POS.stop - States.ECEF_POS.start)
+ H_mod_sym[States.ECEF_ORIENTATION, States.ECEF_ORIENTATION_ERR] = 0.5 * quat_matrix_r(state[3:7])[:, 1:]
+ H_mod_sym[States.ECEF_ORIENTATION.stop:, States.ECEF_ORIENTATION_ERR.stop:] = np.eye(dim_state - States.ECEF_ORIENTATION.stop)
+
+ # these error functions are defined so that say there
+ # is a nominal x and true x:
+ # true x = err_function(nominal x, delta x)
+ # delta x = inv_err_function(nominal x, true x)
+ nom_x = sp.MatrixSymbol('nom_x', dim_state, 1)
+ true_x = sp.MatrixSymbol('true_x', dim_state, 1)
+ delta_x = sp.MatrixSymbol('delta_x', dim_state_err, 1)
+
+ err_function_sym = sp.Matrix(np.zeros((dim_state, 1)))
+ delta_quat = sp.Matrix(np.ones(4))
+ delta_quat[1:, :] = sp.Matrix(0.5 * delta_x[States.ECEF_ORIENTATION_ERR, :])
+ err_function_sym[States.ECEF_POS, :] = sp.Matrix(nom_x[States.ECEF_POS, :] + delta_x[States.ECEF_POS_ERR, :])
+ err_function_sym[States.ECEF_ORIENTATION, 0] = quat_matrix_r(nom_x[States.ECEF_ORIENTATION, 0]) * delta_quat
+ err_function_sym[States.ECEF_ORIENTATION.stop:, :] = sp.Matrix(nom_x[States.ECEF_ORIENTATION.stop:, :] + delta_x[States.ECEF_ORIENTATION_ERR.stop:, :])
+
+ inv_err_function_sym = sp.Matrix(np.zeros((dim_state_err, 1)))
+ inv_err_function_sym[States.ECEF_POS_ERR, 0] = sp.Matrix(-nom_x[States.ECEF_POS, 0] + true_x[States.ECEF_POS, 0])
+ delta_quat = quat_matrix_r(nom_x[States.ECEF_ORIENTATION, 0]).T * true_x[States.ECEF_ORIENTATION, 0]
+ inv_err_function_sym[States.ECEF_ORIENTATION_ERR, 0] = sp.Matrix(2 * delta_quat[1:])
+ inv_err_function_sym[States.ECEF_ORIENTATION_ERR.stop:, 0] = sp.Matrix(-nom_x[States.ECEF_ORIENTATION.stop:, 0] + true_x[States.ECEF_ORIENTATION.stop:, 0])
+
+ eskf_params = [[err_function_sym, nom_x, delta_x],
+ [inv_err_function_sym, nom_x, true_x],
+ H_mod_sym, f_err_sym, state_err_sym]
+ #
+ # Observation functions
+ #
+ imu_rot = euler_rotate(*imu_angles)
+ h_gyro_sym = imu_rot * sp.Matrix([vroll + roll_bias,
+ vpitch + pitch_bias,
+ vyaw + yaw_bias])
+
+ pos = sp.Matrix([x, y, z])
+ gravity = quat_rot.T * ((EARTH_GM / ((x**2 + y**2 + z**2)**(3.0 / 2.0))) * pos)
+ h_acc_sym = imu_rot * (gravity + acceleration)
+ h_phone_rot_sym = sp.Matrix([vroll, vpitch, vyaw])
+
+ speed = sp.sqrt(vx**2 + vy**2 + vz**2)
+ h_speed_sym = sp.Matrix([speed * odo_scale])
+
+ h_pos_sym = sp.Matrix([x, y, z])
+ h_imu_frame_sym = sp.Matrix(imu_angles)
+
+ h_relative_motion = sp.Matrix(quat_rot.T * v)
+
+ obs_eqs = [[h_speed_sym, ObservationKind.ODOMETRIC_SPEED, None],
+ [h_gyro_sym, ObservationKind.PHONE_GYRO, None],
+ [h_phone_rot_sym, ObservationKind.NO_ROT, None],
+ [h_acc_sym, ObservationKind.PHONE_ACCEL, None],
+ [h_pos_sym, ObservationKind.ECEF_POS, None],
+ [h_relative_motion, ObservationKind.CAMERA_ODO_TRANSLATION, None],
+ [h_phone_rot_sym, ObservationKind.CAMERA_ODO_ROTATION, None],
+ [h_imu_frame_sym, ObservationKind.IMU_FRAME, None]]
+
+ gen_code(generated_dir, name, f_sym, dt, state_sym, obs_eqs, dim_state, dim_state_err, eskf_params)
+
+ def __init__(self, generated_dir):
+ self.dim_state = self.initial_x.shape[0]
+ self.dim_state_err = self.initial_P_diag.shape[0]
+
+ self.obs_noise = {ObservationKind.ODOMETRIC_SPEED: np.atleast_2d(0.2**2),
+ ObservationKind.PHONE_GYRO: np.diag([0.025**2, 0.025**2, 0.025**2]),
+ ObservationKind.PHONE_ACCEL: np.diag([.5**2, .5**2, .5**2]),
+ ObservationKind.CAMERA_ODO_ROTATION: np.diag([0.05**2, 0.05**2, 0.05**2]),
+ ObservationKind.IMU_FRAME: np.diag([0.05**2, 0.05**2, 0.05**2]),
+ ObservationKind.NO_ROT: np.diag([0.00025**2, 0.00025**2, 0.00025**2]),
+ ObservationKind.ECEF_POS: np.diag([5**2, 5**2, 5**2])}
+
+ # init filter
+ self.filter = EKF_sym_pyx(generated_dir, self.name, self.Q, self.initial_x, np.diag(self.initial_P_diag), self.dim_state, self.dim_state_err)
+
+ @property
+ def x(self):
+ return self.filter.state()
+
+ @property
+ def t(self):
+ return self.filter.filter_time
+
+ @property
+ def P(self):
+ return self.filter.covs()
+
+ def rts_smooth(self, estimates):
+ return self.filter.rts_smooth(estimates, norm_quats=True)
+
+ def init_state(self, state, covs_diag=None, covs=None, filter_time=None):
+ if covs_diag is not None:
+ P = np.diag(covs_diag)
+ elif covs is not None:
+ P = covs
+ else:
+ P = self.filter.covs()
+ self.filter.init_state(state, P, filter_time)
+
+ def predict_and_observe(self, t, kind, data):
+ if len(data) > 0:
+ data = np.atleast_2d(data)
+ if kind == ObservationKind.CAMERA_ODO_TRANSLATION:
+ r = self.predict_and_update_odo_trans(data, t, kind)
+ elif kind == ObservationKind.CAMERA_ODO_ROTATION:
+ r = self.predict_and_update_odo_rot(data, t, kind)
+ elif kind == ObservationKind.ODOMETRIC_SPEED:
+ r = self.predict_and_update_odo_speed(data, t, kind)
+ else:
+ r = self.filter.predict_and_update_batch(t, kind, data, self.get_R(kind, len(data)))
+
+ # Normalize quats
+ quat_norm = np.linalg.norm(self.filter.x[3:7, 0])
+
+ # Should not continue if the quats behave this weirdly
+ if not (0.1 < quat_norm < 10):
+ raise KalmanError("Kalman filter quaternions unstable")
+
+ self.filter.x[States.ECEF_ORIENTATION, 0] = self.filter.x[States.ECEF_ORIENTATION, 0] / quat_norm
+
+ return r
+
+ def get_R(self, kind, n):
+ obs_noise = self.obs_noise[kind]
+ dim = obs_noise.shape[0]
+ R = np.zeros((n, dim, dim))
+ for i in range(n):
+ R[i, :, :] = obs_noise
+ return R
+
+ def predict_and_update_odo_speed(self, speed, t, kind):
+ z = np.array(speed)
+ R = np.zeros((len(speed), 1, 1))
+ for i, _ in enumerate(z):
+ R[i, :, :] = np.diag([0.2**2])
+ return self.filter.predict_and_update_batch(t, kind, z, R)
+
+ def predict_and_update_odo_trans(self, trans, t, kind):
+ z = trans[:, :3]
+ R = np.zeros((len(trans), 3, 3))
+ for i, _ in enumerate(z):
+ R[i, :, :] = np.diag(trans[i, 3:]**2)
+ return self.filter.predict_and_update_batch(t, kind, z, R)
+
+ def predict_and_update_odo_rot(self, rot, t, kind):
+ z = rot[:, :3]
+ R = np.zeros((len(rot), 3, 3))
+ for i, _ in enumerate(z):
+ R[i, :, :] = np.diag(rot[i, 3:]**2)
+ return self.filter.predict_and_update_batch(t, kind, z, R)
+
+
+if __name__ == "__main__":
+ generated_dir = sys.argv[2]
+ LiveKalman.generate_code(generated_dir)
diff --git a/rednose_repo/examples/test_compare.py b/rednose_repo/examples/test_compare.py
new file mode 100755
index 000000000..291f29e82
--- /dev/null
+++ b/rednose_repo/examples/test_compare.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+import pytest
+import os
+import sys
+import sympy as sp
+import numpy as np
+
+if __name__ == '__main__': # generating sympy code
+ from rednose.helpers.ekf_sym import gen_code
+else:
+ from rednose.helpers.ekf_sym_pyx import EKF_sym_pyx # pylint: disable=no-name-in-module
+ from rednose.helpers.ekf_sym import EKF_sym as EKF_sym2
+
+
+GENERATED_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'generated'))
+
+
+class ObservationKind:
+ UNKNOWN = 0
+ NO_OBSERVATION = 1
+ POSITION = 1
+
+ names = [
+ 'Unknown',
+ 'No observation',
+ 'Position'
+ ]
+
+ @classmethod
+ def to_string(cls, kind):
+ return cls.names[kind]
+
+
+class States:
+ POSITION = slice(0, 1)
+ VELOCITY = slice(1, 2)
+
+
+class CompareFilter:
+ name = "compare"
+
+ initial_x = np.array([0.5, 0.0])
+ initial_P_diag = np.array([1.0**2, 1.0**2])
+ Q = np.diag([0.1**2, 2.0**2])
+ obs_noise = {ObservationKind.POSITION: np.atleast_2d(0.1**2)}
+
+ @staticmethod
+ def generate_code(generated_dir):
+ name = CompareFilter.name
+ dim_state = CompareFilter.initial_x.shape[0]
+
+ state_sym = sp.MatrixSymbol('state', dim_state, 1)
+ state = sp.Matrix(state_sym)
+
+ position = state[States.POSITION, :][0,:]
+ velocity = state[States.VELOCITY, :][0,:]
+
+ dt = sp.Symbol('dt')
+ state_dot = sp.Matrix(np.zeros((dim_state, 1)))
+ state_dot[States.POSITION.start, 0] = velocity
+ f_sym = state + dt * state_dot
+
+ obs_eqs = [
+ [sp.Matrix([position]), ObservationKind.POSITION, None],
+ ]
+
+ gen_code(generated_dir, name, f_sym, dt, state_sym, obs_eqs, dim_state, dim_state)
+
+ def __init__(self, generated_dir):
+ dim_state = self.initial_x.shape[0]
+ dim_state_err = self.initial_P_diag.shape[0]
+
+ # init filter
+ self.filter_py = EKF_sym_pyx(generated_dir, self.name, self.Q, self.initial_x, np.diag(self.initial_P_diag), dim_state, dim_state_err)
+ self.filter_pyx = EKF_sym2(generated_dir, self.name, self.Q, self.initial_x, np.diag(self.initial_P_diag), dim_state, dim_state_err)
+
+ def get_R(self, kind, n):
+ obs_noise = self.obs_noise[kind]
+ dim = obs_noise.shape[0]
+ R = np.zeros((n, dim, dim))
+ for i in range(n):
+ R[i, :, :] = obs_noise
+ return R
+
+
+class TestCompare:
+ def test_compare(self):
+ np.random.seed(0)
+
+ kf = CompareFilter(GENERATED_DIR)
+
+ # Simple simulation
+ dt = 0.01
+ ts = np.arange(0, 5, step=dt)
+ xs = np.empty(ts.shape)
+
+ # Simulate
+ x = 0.0
+ for i, v in enumerate(np.sin(ts * 5)):
+ xs[i] = x
+ x += v * dt
+
+ # insert late observation
+ switch = (20, 40)
+ ts[switch[0]], ts[switch[1]] = ts[switch[1]], ts[switch[0]]
+ xs[switch[0]], xs[switch[1]] = xs[switch[1]], xs[switch[0]]
+
+ for t, x in zip(ts, xs):
+ # get measurement
+ meas = np.random.normal(x, 0.1)
+ z = np.array([[meas]])
+ R = kf.get_R(ObservationKind.POSITION, 1)
+
+ # Update kf
+ kf.filter_py.predict_and_update_batch(t, ObservationKind.POSITION, z, R)
+ kf.filter_pyx.predict_and_update_batch(t, ObservationKind.POSITION, z, R)
+
+ assert kf.filter_py.get_filter_time() == pytest.approx(kf.filter_pyx.get_filter_time())
+ assert np.allclose(kf.filter_py.state(), kf.filter_pyx.state())
+ assert np.allclose(kf.filter_py.covs(), kf.filter_pyx.covs())
+
+
+if __name__ == "__main__":
+ generated_dir = sys.argv[2]
+ CompareFilter.generate_code(generated_dir)
diff --git a/rednose_repo/examples/test_kinematic_kf.py b/rednose_repo/examples/test_kinematic_kf.py
new file mode 100644
index 000000000..05d4d3efd
--- /dev/null
+++ b/rednose_repo/examples/test_kinematic_kf.py
@@ -0,0 +1,82 @@
+import pytest
+import os
+import numpy as np
+
+from .kinematic_kf import KinematicKalman, ObservationKind, States
+
+GENERATED_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'generated'))
+
+class TestKinematic:
+ def test_kinematic_kf(self):
+ np.random.seed(0)
+
+ kf = KinematicKalman(GENERATED_DIR)
+
+ # Simple simulation
+ dt = 0.01
+ ts = np.arange(0, 5, step=dt)
+ vs = np.sin(ts * 5)
+
+ x = 0.0
+ xs = []
+
+ xs_meas = []
+
+ xs_kf = []
+ vs_kf = []
+
+ xs_kf_std = []
+ vs_kf_std = []
+
+ for t, v in zip(ts, vs):
+ xs.append(x)
+
+ # Update kf
+ meas = np.random.normal(x, 0.1)
+ xs_meas.append(meas)
+ kf.predict_and_observe(t, ObservationKind.POSITION, [meas])
+
+ # Retrieve kf values
+ state = kf.x
+ xs_kf.append(float(state[States.POSITION].item()))
+ vs_kf.append(float(state[States.VELOCITY].item()))
+ std = np.sqrt(kf.P)
+ xs_kf_std.append(float(std[States.POSITION, States.POSITION].item()))
+ vs_kf_std.append(float(std[States.VELOCITY, States.VELOCITY].item()))
+
+ # Update simulation
+ x += v * dt
+
+ xs, xs_meas, xs_kf, vs_kf, xs_kf_std, vs_kf_std = (np.asarray(a) for a in (xs, xs_meas, xs_kf, vs_kf, xs_kf_std, vs_kf_std))
+
+ assert xs_kf[-1] == pytest.approx(-0.010866289677966417)
+ assert xs_kf_std[-1] == pytest.approx(0.04477103863330089)
+ assert vs_kf[-1] == pytest.approx(-0.8553720537261753)
+ assert vs_kf_std[-1] == pytest.approx(0.6695762270974388)
+
+ if "PLOT" in os.environ:
+ import matplotlib.pyplot as plt # pylint: disable=import-error
+ plt.figure()
+ plt.subplot(2, 1, 1)
+ plt.plot(ts, xs, 'k', label='Simulation')
+ plt.plot(ts, xs_meas, 'k.', label='Measurements')
+ plt.plot(ts, xs_kf, label='KF')
+ ax = plt.gca()
+ ax.fill_between(ts, xs_kf - xs_kf_std, xs_kf + xs_kf_std, alpha=.2, color='C0')
+
+ plt.xlabel("Time [s]")
+ plt.ylabel("Position [m]")
+ plt.legend()
+
+ plt.subplot(2, 1, 2)
+ plt.plot(ts, vs, 'k', label='Simulation')
+ plt.plot(ts, vs_kf, label='KF')
+
+ ax = plt.gca()
+ ax.fill_between(ts, vs_kf - vs_kf_std, vs_kf + vs_kf_std, alpha=.2, color='C0')
+
+ plt.xlabel("Time [s]")
+ plt.ylabel("Velocity [m/s]")
+ plt.legend()
+
+ plt.show()
diff --git a/rednose_repo/pyproject.toml b/rednose_repo/pyproject.toml
new file mode 100644
index 000000000..fa6ae11d1
--- /dev/null
+++ b/rednose_repo/pyproject.toml
@@ -0,0 +1,16 @@
+# https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml
+[tool.ruff]
+line-length = 160
+target-version="py311"
+
+[tool.ruff.lint]
+select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF100", "A"]
+ignore = ["W292", "E741", "E402", "C408", "ISC003"]
+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!"
+"unittest".msg = "Use pytest"
+
+[tool.pytest.ini_options]
+addopts = "--durations=10 -n auto"
diff --git a/rednose_repo/rednose/.gitignore b/rednose_repo/rednose/.gitignore
new file mode 100644
index 000000000..d771ae601
--- /dev/null
+++ b/rednose_repo/rednose/.gitignore
@@ -0,0 +1,5 @@
+# Cython intermediates
+*_pyx.cpp
+*_pyx.h
+*_pyx_api.h
+*.os
diff --git a/rednose_repo/rednose/__init__.py b/rednose_repo/rednose/__init__.py
new file mode 100644
index 000000000..4287ca861
--- /dev/null
+++ b/rednose_repo/rednose/__init__.py
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/rednose_repo/rednose/helpers/__init__.py b/rednose_repo/rednose/helpers/__init__.py
new file mode 100644
index 000000000..3acc14aff
--- /dev/null
+++ b/rednose_repo/rednose/helpers/__init__.py
@@ -0,0 +1,35 @@
+import os
+import platform
+from cffi import FFI
+
+TEMPLATE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'templates'))
+
+
+def write_code(folder, name, code, header):
+ if not os.path.exists(folder):
+ os.mkdir(folder)
+
+ with open(os.path.join(folder, f"{name}.cpp"), 'w', encoding='utf-8') as f:
+ f.write(code)
+ with open(os.path.join(folder, f"{name}.h"), 'w', encoding='utf-8') as f:
+ f.write(header)
+
+
+def load_code(folder, name):
+ shared_ext = "dylib" if platform.system() == "Darwin" else "so"
+ shared_fn = os.path.join(folder, f"lib{name}.{shared_ext}")
+ header_fn = os.path.join(folder, f"{name}.h")
+
+ with open(header_fn, encoding='utf-8') as f:
+ header = f.read()
+
+ # is the only thing that can be parsed by cffi
+ header = "\n".join([line for line in header.split("\n") if line.startswith("void ")])
+
+ ffi = FFI()
+ ffi.cdef(header)
+ return (ffi, ffi.dlopen(shared_fn))
+
+
+class KalmanError(Exception):
+ pass
diff --git a/rednose_repo/rednose/helpers/chi2_lookup.py b/rednose_repo/rednose/helpers/chi2_lookup.py
new file mode 100644
index 000000000..e22cc9729
--- /dev/null
+++ b/rednose_repo/rednose/helpers/chi2_lookup.py
@@ -0,0 +1,22 @@
+import os
+
+import numpy as np
+
+
+def gen_chi2_ppf_lookup(max_dim=200):
+ from scipy.stats import chi2
+ table = np.zeros((max_dim, 98))
+ for dim in range(1, max_dim):
+ table[dim] = chi2.ppf(np.arange(.01, .99, .01), dim)
+
+ np.save('chi2_lookup_table', table)
+
+
+def chi2_ppf(p, dim):
+ table = np.load(os.path.dirname(os.path.realpath(__file__)) + '/chi2_lookup_table.npy')
+ result = np.interp(p, np.arange(.01, .99, .01), table[dim])
+ return result
+
+
+if __name__ == "__main__":
+ gen_chi2_ppf_lookup()
diff --git a/rednose_repo/rednose/helpers/chi2_lookup_table.npy b/rednose_repo/rednose/helpers/chi2_lookup_table.npy
new file mode 100644
index 000000000..6f1bd959c
Binary files /dev/null and b/rednose_repo/rednose/helpers/chi2_lookup_table.npy differ
diff --git a/rednose_repo/rednose/helpers/ekf_sym.py b/rednose_repo/rednose/helpers/ekf_sym.py
new file mode 100644
index 000000000..9dffe50e1
--- /dev/null
+++ b/rednose_repo/rednose/helpers/ekf_sym.py
@@ -0,0 +1,690 @@
+import os
+import logging
+from bisect import bisect_right
+
+import numpy as np
+import sympy as sp
+from numpy import dot
+
+from rednose.helpers.sympy_helpers import sympy_into_c
+from rednose.helpers import TEMPLATE_DIR, load_code
+from rednose.helpers.chi2_lookup import chi2_ppf
+
+
+def solve(a, b):
+ if a.shape[0] == 1 and a.shape[1] == 1:
+ return b / a[0][0]
+ else:
+ return np.linalg.solve(a, b)
+
+
+def null(H, eps=1e-12):
+ _, s, vh = np.linalg.svd(H)
+ padding = max(0, np.shape(H)[1] - np.shape(s)[0])
+ null_mask = np.concatenate(((s <= eps), np.ones((padding,), dtype=bool)), axis=0)
+ null_space = np.compress(null_mask, vh, axis=0)
+ return np.transpose(null_space)
+
+
+def gen_code(folder, name, f_sym, dt_sym, x_sym, obs_eqs, dim_x, dim_err, eskf_params=None, msckf_params=None, # pylint: disable=dangerous-default-value
+ maha_test_kinds=[], quaternion_idxs=[], global_vars=None, extra_routines=[]):
+ # optional state transition matrix, H modifier
+ # and err_function if an error-state kalman filter (ESKF)
+ # is desired. Best described in "Quaternion kinematics
+ # for the error-state Kalman filter" by Joan Sola
+
+ if eskf_params:
+ err_eqs = eskf_params[0]
+ inv_err_eqs = eskf_params[1]
+ H_mod_sym = eskf_params[2]
+ f_err_sym = eskf_params[3]
+ x_err_sym = eskf_params[4]
+ else:
+ nom_x = sp.MatrixSymbol('nom_x', dim_x, 1)
+ true_x = sp.MatrixSymbol('true_x', dim_x, 1)
+ delta_x = sp.MatrixSymbol('delta_x', dim_x, 1)
+ err_function_sym = sp.Matrix(nom_x + delta_x)
+ inv_err_function_sym = sp.Matrix(true_x - nom_x)
+ err_eqs = [err_function_sym, nom_x, delta_x]
+ inv_err_eqs = [inv_err_function_sym, nom_x, true_x]
+
+ H_mod_sym = sp.Matrix(np.eye(dim_x))
+ f_err_sym = f_sym
+ x_err_sym = x_sym
+
+ # This configures the multi-state augmentation
+ # needed for EKF-SLAM with MSCKF (Mourikis et al 2007)
+ if msckf_params:
+ msckf = True
+ dim_main = msckf_params[0] # size of the main state
+ dim_augment = msckf_params[1] # size of one augment state chunk
+ dim_main_err = msckf_params[2]
+ dim_augment_err = msckf_params[3]
+ N = msckf_params[4]
+ feature_track_kinds = msckf_params[5]
+ assert dim_main + dim_augment * N == dim_x
+ assert dim_main_err + dim_augment_err * N == dim_err
+ else:
+ msckf = False
+ dim_main = dim_x
+ dim_augment = 0
+ dim_main_err = dim_err
+ dim_augment_err = 0
+ N = 0
+
+ # linearize with jacobians
+ F_sym = f_err_sym.jacobian(x_err_sym)
+
+ if eskf_params:
+ for sym in x_err_sym:
+ F_sym = F_sym.subs(sym, 0)
+
+ assert dt_sym in F_sym.free_symbols
+
+ for i in range(len(obs_eqs)):
+ obs_eqs[i].append(obs_eqs[i][0].jacobian(x_sym))
+ if msckf and obs_eqs[i][1] in feature_track_kinds:
+ obs_eqs[i].append(obs_eqs[i][0].jacobian(obs_eqs[i][2]))
+ else:
+ obs_eqs[i].append(None)
+
+ # collect sympy functions
+ sympy_functions = []
+
+ # extra routines
+ sympy_functions += extra_routines
+
+ # error functions
+ sympy_functions.append(('err_fun', err_eqs[0], [err_eqs[1], err_eqs[2]]))
+ sympy_functions.append(('inv_err_fun', inv_err_eqs[0], [inv_err_eqs[1], inv_err_eqs[2]]))
+
+ # H modifier for ESKF updates
+ sympy_functions.append(('H_mod_fun', H_mod_sym, [x_sym]))
+
+ # state propagation function
+ sympy_functions.append(('f_fun', f_sym, [x_sym, dt_sym]))
+ sympy_functions.append(('F_fun', F_sym, [x_sym, dt_sym]))
+
+ # observation functions
+ for h_sym, kind, ea_sym, H_sym, He_sym in obs_eqs:
+ sympy_functions.append(('h_%d' % kind, h_sym, [x_sym, ea_sym]))
+ sympy_functions.append(('H_%d' % kind, H_sym, [x_sym, ea_sym]))
+ if msckf and kind in feature_track_kinds:
+ sympy_functions.append(('He_%d' % kind, He_sym, [x_sym, ea_sym]))
+
+ # Generate and wrap all th c code
+ sympy_header, code = sympy_into_c(sympy_functions, global_vars)
+
+ header = "#pragma once\n"
+ header += "#include \"rednose/helpers/ekf.h\"\n"
+ header += "extern \"C\" {\n"
+
+ pre_code = f"#include \"{name}.h\"\n"
+ pre_code += "\nnamespace {\n"
+ pre_code += "#define DIM %d\n" % dim_x
+ pre_code += "#define EDIM %d\n" % dim_err
+ pre_code += "#define MEDIM %d\n" % dim_main_err
+ pre_code += "typedef void (*Hfun)(double *, double *, double *);\n"
+
+ if global_vars is not None:
+ for var in global_vars:
+ pre_code += f"\ndouble {var.name};\n"
+ pre_code += f"\nvoid set_{var.name}(double x){{ {var.name} = x;}}\n"
+
+ post_code = "\n}\n" # namespace
+ post_code += "extern \"C\" {\n\n"
+
+ for h_sym, kind, ea_sym, H_sym, He_sym in obs_eqs:
+ if msckf and kind in feature_track_kinds:
+ He_str = 'He_%d' % kind
+ # ea_dim = ea_sym.shape[0]
+ else:
+ He_str = 'NULL'
+ # ea_dim = 1 # not really dim of ea but makes c function work
+ maha_thresh = chi2_ppf(0.95, int(h_sym.shape[0])) # mahalanobis distance for outlier detection
+ maha_test = kind in maha_test_kinds
+
+ pre_code += f"const static double MAHA_THRESH_{kind} = {maha_thresh};\n"
+
+ header += f"void {name}_update_{kind}(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);\n"
+ post_code += f"void {name}_update_{kind}(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {{\n"
+ post_code += f" update<{h_sym.shape[0]}, 3, {int(maha_test)}>(in_x, in_P, h_{kind}, H_{kind}, {He_str}, in_z, in_R, in_ea, MAHA_THRESH_{kind});\n"
+ post_code += "}\n"
+
+ # For ffi loading of specific functions
+ for line in sympy_header.split("\n"):
+ if line.startswith("void "): # sympy functions
+ func_call = line[5: line.index(')') + 1]
+ header += f"void {name}_{func_call};\n"
+ post_code += f"void {name}_{func_call} {{\n"
+ post_code += f" {func_call.replace('double *', '').replace('double', '')};\n"
+ post_code += "}\n"
+ header += f"void {name}_predict(double *in_x, double *in_P, double *in_Q, double dt);\n"
+ post_code += f"void {name}_predict(double *in_x, double *in_P, double *in_Q, double dt) {{\n"
+ post_code += " predict(in_x, in_P, in_Q, dt);\n"
+ post_code += "}\n"
+ if global_vars is not None:
+ for var in global_vars:
+ header += f"void {name}_set_{var.name}(double x);\n"
+ post_code += f"void {name}_set_{var.name}(double x) {{\n"
+ post_code += f" set_{var.name}(x);\n"
+ post_code += "}\n"
+
+ post_code += "}\n\n" # extern c
+
+ funcs = ['f_fun', 'F_fun', 'err_fun', 'inv_err_fun', 'H_mod_fun', 'predict']
+ func_lists = {
+ 'h': [kind for _, kind, _, _, _ in obs_eqs],
+ 'H': [kind for _, kind, _, _, _ in obs_eqs],
+ 'update': [kind for _, kind, _, _, _ in obs_eqs],
+ 'He': [kind for _, kind, _, _, _ in obs_eqs if msckf and kind in feature_track_kinds],
+ 'set': [var.name for var in global_vars] if global_vars is not None else [],
+ }
+ func_extra = [x[0] for x in extra_routines]
+
+ # For dynamic loading of specific functions
+ post_code += f"const EKF {name} = {{\n"
+ post_code += f" .name = \"{name}\",\n"
+ post_code += f" .kinds = {{ {', '.join([str(kind) for _, kind, _, _, _ in obs_eqs])} }},\n"
+ post_code += f" .feature_kinds = {{ {', '.join([str(kind) for _, kind, _, _, _ in obs_eqs if msckf and kind in feature_track_kinds])} }},\n"
+ for func in funcs:
+ post_code += f" .{func} = {name}_{func},\n"
+ for group, kinds in func_lists.items():
+ post_code += f" .{group}s = {{\n"
+ for kind in kinds:
+ str_kind = f"\"{kind}\"" if isinstance(kind, str) else kind
+ post_code += f" {{ {str_kind}, {name}_{group}_{kind} }},\n"
+ post_code += " },\n"
+ post_code += " .extra_routines = {\n"
+ for f in func_extra:
+ post_code += f" {{ \"{f}\", {name}_{f} }},\n"
+ post_code += " },\n"
+ post_code += "};\n\n"
+ post_code += f"ekf_lib_init({name})\n"
+
+ # merge code blocks
+ header += "}"
+ with open(os.path.join(TEMPLATE_DIR, "ekf_c.c"), encoding='utf-8') as f:
+ code = "\n".join([pre_code, code, f.read(), post_code])
+
+ # write to file
+ if not os.path.exists(folder):
+ os.mkdir(folder)
+
+ with open(os.path.join(folder, f"{name}.h"), 'w', encoding='utf-8') as f:
+ f.write(header) # header is used for ffi import
+ with open(os.path.join(folder, f"{name}.cpp"), 'w', encoding='utf-8') as f:
+ f.write(code)
+
+
+class EKF_sym():
+ def __init__(self, folder, name, Q, x_initial, P_initial, dim_main, dim_main_err, # pylint: disable=dangerous-default-value
+ N=0, dim_augment=0, dim_augment_err=0, maha_test_kinds=[], quaternion_idxs=[], global_vars=None, max_rewind_age=1.0, logger=logging):
+ """Generates process function and all observation functions for the kalman filter."""
+ self.msckf = N > 0
+ self.N = N
+ self.dim_augment = dim_augment
+ self.dim_augment_err = dim_augment_err
+ self.dim_main = dim_main
+ self.dim_main_err = dim_main_err
+
+ self.logger = logger
+
+ # state
+ x_initial = x_initial.reshape((-1, 1))
+ self.dim_x = x_initial.shape[0]
+ self.dim_err = P_initial.shape[0]
+ assert dim_main + dim_augment * N == self.dim_x
+ assert dim_main_err + dim_augment_err * N == self.dim_err
+ assert Q.shape == P_initial.shape
+
+ # kinds that should get mahalanobis distance
+ # tested for outlier rejection
+ self.maha_test_kinds = maha_test_kinds
+
+ # quaternions need normalization
+ self.quaternion_idxs = quaternion_idxs
+
+ # process noise
+ self.Q = Q
+
+ # rewind stuff
+ self.max_rewind_age = max_rewind_age
+ self.rewind_t = []
+ self.rewind_states = []
+ self.rewind_obscache = []
+ self.init_state(x_initial, P_initial, None)
+
+ ffi, lib = load_code(folder, name)
+ kinds, self.feature_track_kinds = [], []
+ for func in dir(lib):
+ if func[:len(name) + 3] == f'{name}_h_':
+ kinds.append(int(func[len(name) + 3:]))
+ if func[:len(name) + 4] == f'{name}_He_':
+ self.feature_track_kinds.append(int(func[len(name) + 4:]))
+
+ # wrap all the sympy functions
+ def wrap_1lists(func_name):
+ func = eval(f"lib.{name}_{func_name}", {"lib": lib}) # pylint: disable=eval-used
+
+ def ret(lst1, out):
+ func(ffi.cast("double *", lst1.ctypes.data),
+ ffi.cast("double *", out.ctypes.data))
+ return ret
+
+ def wrap_2lists(func_name):
+ func = eval(f"lib.{name}_{func_name}", {"lib": lib}) # pylint: disable=eval-used
+
+ def ret(lst1, lst2, out):
+ func(ffi.cast("double *", lst1.ctypes.data),
+ ffi.cast("double *", lst2.ctypes.data),
+ ffi.cast("double *", out.ctypes.data))
+ return ret
+
+ def wrap_1list_1float(func_name):
+ func = eval(f"lib.{name}_{func_name}", {"lib": lib}) # pylint: disable=eval-used
+
+ def ret(lst1, fl, out):
+ func(ffi.cast("double *", lst1.ctypes.data),
+ ffi.cast("double", fl),
+ ffi.cast("double *", out.ctypes.data))
+ return ret
+
+ self.f = wrap_1list_1float("f_fun")
+ self.F = wrap_1list_1float("F_fun")
+
+ self.err_function = wrap_2lists("err_fun")
+ self.inv_err_function = wrap_2lists("inv_err_fun")
+ self.H_mod = wrap_1lists("H_mod_fun")
+
+ self.hs, self.Hs, self.Hes = {}, {}, {}
+ for kind in kinds:
+ self.hs[kind] = wrap_2lists(f"h_{kind}")
+ self.Hs[kind] = wrap_2lists(f"H_{kind}")
+ if self.msckf and kind in self.feature_track_kinds:
+ self.Hes[kind] = wrap_2lists(f"He_{kind}")
+
+ self.set_globals = {}
+ if global_vars is not None:
+ for global_var in global_vars:
+ self.set_globals[global_var] = getattr(lib, f"{name}_set_{global_var}")
+
+ # wrap the C++ predict function
+ def _predict_blas(x, P, dt):
+ func = eval(f"lib.{name}_predict", {"lib": lib}) # pylint: disable=eval-used
+ func(ffi.cast("double *", x.ctypes.data),
+ ffi.cast("double *", P.ctypes.data),
+ ffi.cast("double *", self.Q.ctypes.data),
+ ffi.cast("double", dt))
+ return x, P
+
+ # wrap the C++ update function
+ def fun_wrapper(f, kind):
+ f = eval(f"lib.{name}_{f}", {"lib": lib}) # pylint: disable=eval-used
+
+ def _update_inner_blas(x, P, z, R, extra_args):
+ f(ffi.cast("double *", x.ctypes.data),
+ ffi.cast("double *", P.ctypes.data),
+ ffi.cast("double *", z.ctypes.data),
+ ffi.cast("double *", R.ctypes.data),
+ ffi.cast("double *", extra_args.ctypes.data))
+ if self.msckf and kind in self.feature_track_kinds:
+ y = z[:-len(extra_args)]
+ else:
+ y = z
+ return x, P, y
+ return _update_inner_blas
+
+ self._updates = {}
+ for kind in kinds:
+ self._updates[kind] = fun_wrapper("update_%d" % kind, kind)
+
+ def _update_blas(x, P, kind, z, R, extra_args=[]): # pylint: disable=dangerous-default-value
+ return self._updates[kind](x, P, z, R, extra_args)
+
+ # assign the functions
+ self._predict = _predict_blas
+ # self._predict = self._predict_python
+ self._update = _update_blas
+ # self._update = self._update_python
+
+ def init_state(self, state, covs, filter_time):
+ self.x = np.array(state.reshape((-1, 1))).astype(np.float64)
+ self.P = np.array(covs).astype(np.float64)
+ self.filter_time = filter_time
+ self.augment_times = [0] * self.N
+ self.rewind_obscache = []
+ self.rewind_t = []
+ self.rewind_states = []
+
+ def reset_rewind(self):
+ self.rewind_obscache = []
+ self.rewind_t = []
+ self.rewind_states = []
+
+ def augment(self):
+ # TODO this is not a generalized way of doing this and implies that the augmented states
+ # are simply the first (dim_augment_state) elements of the main state.
+ assert self.msckf
+ d1 = self.dim_main
+ d2 = self.dim_main_err
+ d3 = self.dim_augment
+ d4 = self.dim_augment_err
+
+ # push through augmented states
+ self.x[d1:-d3] = self.x[d1 + d3:]
+ self.x[-d3:] = self.x[:d3]
+ assert self.x.shape == (self.dim_x, 1)
+
+ # push through augmented covs
+ assert self.P.shape == (self.dim_err, self.dim_err)
+ P_reduced = self.P
+ P_reduced = np.delete(P_reduced, np.s_[d2:d2 + d4], axis=1)
+ P_reduced = np.delete(P_reduced, np.s_[d2:d2 + d4], axis=0)
+ assert P_reduced.shape == (self.dim_err - d4, self.dim_err - d4)
+ to_mult = np.zeros((self.dim_err, self.dim_err - d4))
+ to_mult[:-d4, :] = np.eye(self.dim_err - d4)
+ to_mult[-d4:, :d4] = np.eye(d4)
+ self.P = to_mult.dot(P_reduced.dot(to_mult.T))
+ self.augment_times = self.augment_times[1:]
+ self.augment_times.append(self.filter_time)
+ assert self.P.shape == (self.dim_err, self.dim_err)
+
+ def state(self):
+ return np.array(self.x).flatten()
+
+ def covs(self):
+ return self.P
+
+ def set_filter_time(self, t):
+ self.filter_time = t
+
+ def get_filter_time(self):
+ return self.filter_time
+
+ def normalize_quaternions(self):
+ for idx in self.quaternion_idxs:
+ self.normalize_slice(idx, idx+4)
+
+ def normalize_slice(self, slice_start, slice_end_ex):
+ self.x[slice_start:slice_end_ex] /= np.linalg.norm(self.x[slice_start:slice_end_ex])
+
+ def get_augment_times(self):
+ return self.augment_times
+
+ def set_global(self, global_var, val):
+ self.set_globals[global_var](val)
+
+ def rewind(self, t):
+ # find where we are rewinding to
+ idx = bisect_right(self.rewind_t, t)
+ assert self.rewind_t[idx - 1] <= t
+ assert self.rewind_t[idx] > t # must be true, or rewind wouldn't be called
+
+ # set the state to the time right before that
+ self.filter_time = self.rewind_t[idx - 1]
+ self.x[:] = self.rewind_states[idx - 1][0]
+ self.P[:] = self.rewind_states[idx - 1][1]
+
+ # return the observations we rewound over for fast forwarding
+ ret = self.rewind_obscache[idx:]
+
+ # throw away the old future
+ # TODO: is this making a copy?
+ self.rewind_t = self.rewind_t[:idx]
+ self.rewind_states = self.rewind_states[:idx]
+ self.rewind_obscache = self.rewind_obscache[:idx]
+
+ return ret
+
+ def checkpoint(self, obs):
+ # push to rewinder
+ self.rewind_t.append(self.filter_time)
+ self.rewind_states.append((np.copy(self.x), np.copy(self.P)))
+ self.rewind_obscache.append(obs)
+
+ # only keep a certain number around
+ REWIND_TO_KEEP = 512
+ self.rewind_t = self.rewind_t[-REWIND_TO_KEEP:]
+ self.rewind_states = self.rewind_states[-REWIND_TO_KEEP:]
+ self.rewind_obscache = self.rewind_obscache[-REWIND_TO_KEEP:]
+
+ def predict(self, t):
+ # initialize time
+ if self.filter_time is None:
+ self.filter_time = t
+
+ # predict
+ dt = t - self.filter_time
+ assert dt >= 0
+ self.x, self.P = self._predict(self.x, self.P, dt)
+ self.normalize_quaternions()
+ self.filter_time = t
+
+ def predict_and_update_batch(self, t, kind, z, R, extra_args=[[]], augment=False): # pylint: disable=dangerous-default-value
+ # TODO handle rewinding at this level"
+
+ # rewind
+ if self.filter_time is not None and t < self.filter_time:
+ if len(self.rewind_t) == 0 or t < self.rewind_t[0] or t < self.rewind_t[-1] - self.max_rewind_age:
+ self.logger.error(f"observation too old at {t:.3f} with filter at {self.filter_time:.3f}, ignoring")
+ return None
+ rewound = self.rewind(t)
+ else:
+ rewound = []
+
+ ret = self._predict_and_update_batch(t, kind, z, R, extra_args, augment)
+
+ # optional fast forward
+ for r in rewound:
+ self._predict_and_update_batch(*r)
+
+ return ret
+
+ def _predict_and_update_batch(self, t, kind, z, R, extra_args, augment=False):
+ """The main kalman filter function
+ Predicts the state and then updates a batch of observations
+ dim_x: dimensionality of the state space
+ dim_z: dimensionality of the observation and depends on kind
+ n: number of observations
+ Args:
+ t (float): Time of observation
+ kind (int): Type of observation
+ z (vec [n,dim_z]): Measurements
+ R (mat [n,dim_z, dim_z]): Measurement Noise
+ extra_args (list, [n]): Values used in H computations
+ """
+ assert z.shape[0] == R.shape[0]
+ assert z.shape[1] == R.shape[1]
+ assert z.shape[1] == R.shape[2]
+
+ # initialize time
+ if self.filter_time is None:
+ self.filter_time = t
+
+ # predict
+ dt = t - self.filter_time
+ assert dt >= 0
+ self.x, self.P = self._predict(self.x, self.P, dt)
+ self.filter_time = t
+ xk_km1, Pk_km1 = np.copy(self.x).flatten(), np.copy(self.P)
+
+ # update batch
+ y = []
+ for i in range(len(z)):
+ # these are from the user, so we canonicalize them
+ z_i = np.array(z[i], dtype=np.float64, order='F')
+ R_i = np.array(R[i], dtype=np.float64, order='F')
+ extra_args_i = np.array(extra_args[i], dtype=np.float64, order='F')
+ # update
+ self.x, self.P, y_i = self._update(self.x, self.P, kind, z_i, R_i, extra_args=extra_args_i)
+ self.normalize_quaternions()
+ y.append(y_i)
+ xk_k, Pk_k = np.copy(self.x).flatten(), np.copy(self.P)
+
+ if augment:
+ self.augment()
+
+ # checkpoint
+ self.checkpoint((t, kind, z, R, extra_args))
+
+ return xk_km1, xk_k, Pk_km1, Pk_k, t, kind, y, z, extra_args
+
+ def _predict_python(self, x, P, dt):
+ x_new = np.zeros(x.shape, dtype=np.float64)
+ self.f(x, dt, x_new)
+
+ F = np.zeros(P.shape, dtype=np.float64)
+ self.F(x, dt, F)
+
+ if not self.msckf:
+ P = dot(dot(F, P), F.T)
+ else:
+ # Update the predicted state covariance:
+ # Pk+1|k = |F*Pii*FT + Q*dt F*Pij |
+ # |PijT*FT Pjj |
+ # Where F is the jacobian of the main state
+ # predict function, Pii is the main state's
+ # covariance and Q its process noise. Pij
+ # is the covariance between the augmented
+ # states and the main state.
+ #
+ d2 = self.dim_main_err # known at compile time
+ F_curr = F[:d2, :d2]
+ P[:d2, :d2] = (F_curr.dot(P[:d2, :d2])).dot(F_curr.T)
+ P[:d2, d2:] = F_curr.dot(P[:d2, d2:])
+ P[d2:, :d2] = P[d2:, :d2].dot(F_curr.T)
+
+ P += dt * self.Q
+ return x_new, P
+
+ def _update_python(self, x, P, kind, z, R, extra_args=[]): # pylint: disable=dangerous-default-value
+ # init vars
+ z = z.reshape((-1, 1))
+ h = np.zeros(z.shape, dtype=np.float64)
+ H = np.zeros((z.shape[0], self.dim_x), dtype=np.float64)
+
+ # C functions
+ self.hs[kind](x, extra_args, h)
+ self.Hs[kind](x, extra_args, H)
+
+ # y is the "loss"
+ y = z - h
+
+ # *** same above this line ***
+
+ if self.msckf and kind in self.Hes:
+ # Do some algebraic magic to decorrelate
+ He = np.zeros((z.shape[0], len(extra_args)), dtype=np.float64)
+ self.Hes[kind](x, extra_args, He)
+
+ # TODO: Don't call a function here, do projection locally
+ A = null(He.T)
+
+ y = A.T.dot(y)
+ H = A.T.dot(H)
+ R = A.T.dot(R.dot(A))
+
+ # TODO If nullspace isn't the dimension we want
+ if A.shape[1] + He.shape[1] != A.shape[0]:
+ self.logger.warning('Warning: null space projection failed, measurement ignored')
+ return x, P, np.zeros(A.shape[0] - He.shape[1])
+
+ # if using eskf
+ H_mod = np.zeros((x.shape[0], P.shape[0]), dtype=np.float64)
+ self.H_mod(x, H_mod)
+ H = H.dot(H_mod)
+
+ # Do mahalobis distance test
+ # currently just runs on msckf observations
+ # could run on anything if needed
+ if self.msckf and kind in self.maha_test_kinds:
+ a = np.linalg.inv(H.dot(P).dot(H.T) + R)
+ maha_dist = y.T.dot(a.dot(y))
+ if maha_dist > chi2_ppf(0.95, y.shape[0]):
+ R = 10e16 * R
+
+ # *** same below this line ***
+
+ # Outlier resilient weighting as described in:
+ # "A Kalman Filter for Robust Outlier Detection - Jo-Anne Ting, ..."
+ weight = 1 # (1.5)/(1 + np.sum(y**2)/np.sum(R))
+
+ S = dot(dot(H, P), H.T) + R / weight
+ K = solve(S, dot(H, P.T)).T
+ I_KH = np.eye(P.shape[0]) - dot(K, H)
+
+ # update actual state
+ delta_x = dot(K, y)
+ P = dot(dot(I_KH, P), I_KH.T) + dot(dot(K, R), K.T)
+
+ # inject observed error into state
+ x_new = np.zeros(x.shape, dtype=np.float64)
+ self.err_function(x, delta_x, x_new)
+ return x_new, P, y.flatten()
+
+ def maha_test(self, x, P, kind, z, R, extra_args=[], maha_thresh=0.95): # pylint: disable=dangerous-default-value
+ # init vars
+ z = z.reshape((-1, 1))
+ h = np.zeros(z.shape, dtype=np.float64)
+ H = np.zeros((z.shape[0], self.dim_x), dtype=np.float64)
+
+ # C functions
+ self.hs[kind](x, extra_args, h)
+ self.Hs[kind](x, extra_args, H)
+
+ # y is the "loss"
+ y = z - h
+
+ # if using eskf
+ H_mod = np.zeros((x.shape[0], P.shape[0]), dtype=np.float64)
+ self.H_mod(x, H_mod)
+ H = H.dot(H_mod)
+
+ a = np.linalg.inv(H.dot(P).dot(H.T) + R)
+ maha_dist = y.T.dot(a.dot(y))
+ if maha_dist > chi2_ppf(maha_thresh, y.shape[0]):
+ return False
+ else:
+ return True
+
+ def rts_smooth(self, estimates, norm_quats=False):
+ '''
+ Returns rts smoothed results of
+ kalman filter estimates
+ If the kalman state is augmented with
+ old states only the main state is smoothed
+ '''
+ xk_n = estimates[-1][0]
+ Pk_n = estimates[-1][2]
+ Fk_1 = np.zeros(Pk_n.shape, dtype=np.float64)
+
+ states_smoothed = [xk_n]
+ covs_smoothed = [Pk_n]
+ for k in range(len(estimates) - 2, -1, -1):
+ xk1_n = xk_n
+ if norm_quats:
+ xk1_n[3:7] /= np.linalg.norm(xk1_n[3:7])
+ Pk1_n = Pk_n
+
+ xk1_k, _, Pk1_k, _, t2, _, _, _, _ = estimates[k + 1]
+ _, xk_k, _, Pk_k, t1, _, _, _, _ = estimates[k]
+ dt = t2 - t1
+ self.F(xk_k, dt, Fk_1)
+
+ d1 = self.dim_main
+ d2 = self.dim_main_err
+ Ck = np.linalg.solve(Pk1_k[:d2, :d2], Fk_1[:d2, :d2].dot(Pk_k[:d2, :d2].T)).T
+ xk_n = xk_k
+ delta_x = np.zeros((Pk_n.shape[0], 1), dtype=np.float64)
+ self.inv_err_function(xk1_k, xk1_n, delta_x)
+ delta_x[:d2] = Ck.dot(delta_x[:d2])
+ x_new = np.zeros((xk_n.shape[0], 1), dtype=np.float64)
+ self.err_function(xk_k, delta_x, x_new)
+ xk_n[:d1] = x_new[:d1, 0]
+ Pk_n = Pk_k
+ Pk_n[:d2, :d2] = Pk_k[:d2, :d2] + Ck.dot(Pk1_n[:d2, :d2] - Pk1_k[:d2, :d2]).dot(Ck.T)
+ states_smoothed.append(xk_n)
+ covs_smoothed.append(Pk_n)
+
+ return np.flipud(np.vstack(states_smoothed)), np.stack(covs_smoothed, 0)[::-1]
diff --git a/rednose_repo/rednose/helpers/ekf_sym_pyx.so b/rednose_repo/rednose/helpers/ekf_sym_pyx.so
new file mode 100755
index 000000000..4f8273614
Binary files /dev/null and b/rednose_repo/rednose/helpers/ekf_sym_pyx.so differ
diff --git a/rednose_repo/rednose/helpers/kalmanfilter.py b/rednose_repo/rednose/helpers/kalmanfilter.py
new file mode 100644
index 000000000..fc9fd2bf3
--- /dev/null
+++ b/rednose_repo/rednose/helpers/kalmanfilter.py
@@ -0,0 +1,52 @@
+from typing import Any
+
+import numpy as np
+
+
+class KalmanFilter:
+ name = ""
+ initial_x = np.zeros((0, 0))
+ initial_P_diag = np.zeros((0, 0))
+ Q = np.zeros((0, 0))
+ obs_noise: dict[int, Any] = {}
+
+ # Should be initialized when initializating a KalmanFilter implementation
+ filter = None
+
+ @property
+ def x(self):
+ return self.filter.state()
+
+ @property
+ def t(self):
+ return self.filter.get_filter_time()
+
+ @property
+ def P(self):
+ return self.filter.covs()
+
+ def init_state(self, state, covs_diag=None, covs=None, filter_time=None):
+ if covs_diag is not None:
+ P = np.diag(covs_diag)
+ elif covs is not None:
+ P = covs
+ else:
+ P = self.filter.covs()
+ self.filter.init_state(state, P, filter_time)
+
+ def get_R(self, kind, n):
+ obs_noise = self.obs_noise[kind]
+ dim = obs_noise.shape[0]
+ R = np.zeros((n, dim, dim))
+ for i in range(n):
+ R[i, :, :] = obs_noise
+ return R
+
+ def predict_and_observe(self, t, kind, data, R=None):
+ if len(data) > 0:
+ data = np.atleast_2d(data)
+
+ if R is None:
+ R = self.get_R(kind, len(data))
+
+ self.filter.predict_and_update_batch(t, kind, data, R)
diff --git a/rednose_repo/rednose/helpers/sympy_helpers.py b/rednose_repo/rednose/helpers/sympy_helpers.py
new file mode 100644
index 000000000..7f8813e8a
--- /dev/null
+++ b/rednose_repo/rednose/helpers/sympy_helpers.py
@@ -0,0 +1,162 @@
+import sympy as sp
+import numpy as np
+
+# TODO: remove code duplication between openpilot.common.orientation
+def quat2rot(quats):
+ quats = np.array(quats)
+ input_shape = quats.shape
+ quats = np.atleast_2d(quats)
+ Rs = np.zeros((quats.shape[0], 3, 3))
+ q0 = quats[:, 0]
+ q1 = quats[:, 1]
+ q2 = quats[:, 2]
+ q3 = quats[:, 3]
+ Rs[:, 0, 0] = q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3
+ Rs[:, 0, 1] = 2 * (q1 * q2 - q0 * q3)
+ Rs[:, 0, 2] = 2 * (q0 * q2 + q1 * q3)
+ Rs[:, 1, 0] = 2 * (q1 * q2 + q0 * q3)
+ Rs[:, 1, 1] = q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3
+ Rs[:, 1, 2] = 2 * (q2 * q3 - q0 * q1)
+ Rs[:, 2, 0] = 2 * (q1 * q3 - q0 * q2)
+ Rs[:, 2, 1] = 2 * (q0 * q1 + q2 * q3)
+ Rs[:, 2, 2] = q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3
+
+ if len(input_shape) < 2:
+ return Rs[0]
+ else:
+ return Rs
+
+
+def euler2quat(eulers):
+ eulers = np.array(eulers)
+ if len(eulers.shape) > 1:
+ output_shape = (-1,4)
+ else:
+ output_shape = (4,)
+ eulers = np.atleast_2d(eulers)
+ gamma, theta, psi = eulers[:,0], eulers[:,1], eulers[:,2]
+
+ q0 = np.cos(gamma / 2) * np.cos(theta / 2) * np.cos(psi / 2) + \
+ np.sin(gamma / 2) * np.sin(theta / 2) * np.sin(psi / 2)
+ q1 = np.sin(gamma / 2) * np.cos(theta / 2) * np.cos(psi / 2) - \
+ np.cos(gamma / 2) * np.sin(theta / 2) * np.sin(psi / 2)
+ q2 = np.cos(gamma / 2) * np.sin(theta / 2) * np.cos(psi / 2) + \
+ np.sin(gamma / 2) * np.cos(theta / 2) * np.sin(psi / 2)
+ q3 = np.cos(gamma / 2) * np.cos(theta / 2) * np.sin(psi / 2) - \
+ np.sin(gamma / 2) * np.sin(theta / 2) * np.cos(psi / 2)
+
+ quats = np.array([q0, q1, q2, q3]).T
+ for i in range(len(quats)):
+ if quats[i,0] < 0: # pylint: disable=unsubscriptable-object
+ quats[i] = -quats[i] # pylint: disable=unsupported-assignment-operation,unsubscriptable-object
+ return quats.reshape(output_shape)
+
+
+def euler2rot(eulers):
+ return quat2rot(euler2quat(eulers))
+
+
+rotations_from_quats = quat2rot
+
+
+def cross(x):
+ ret = sp.Matrix(np.zeros((3, 3)))
+ ret[0, 1], ret[0, 2] = -x[2], x[1]
+ ret[1, 0], ret[1, 2] = x[2], -x[0]
+ ret[2, 0], ret[2, 1] = -x[1], x[0]
+ return ret
+
+
+def rot_to_euler(R):
+ gamma = sp.atan2(R[2, 1], R[2, 2])
+ theta = sp.asin(-R[2, 0])
+ psi = sp.atan2(R[1, 0], R[0, 0])
+ return sp.Matrix([gamma, theta, psi])
+
+
+def rot_matrix(roll, pitch, yaw):
+ cr, sr = np.cos(roll), np.sin(roll)
+ cp, sp = np.cos(pitch), np.sin(pitch)
+ cy, sy = np.cos(yaw), np.sin(yaw)
+ rr = np.array([[1,0,0],[0, cr,-sr],[0, sr, cr]])
+ rp = np.array([[cp,0,sp],[0, 1,0],[-sp, 0, cp]])
+ ry = np.array([[cy,-sy,0],[sy, cy,0],[0, 0, 1]])
+ return ry.dot(rp.dot(rr))
+
+
+def euler_rotate(roll, pitch, yaw):
+ # make symbolic rotation matrix from eulers
+ matrix_roll = sp.Matrix([[1, 0, 0],
+ [0, sp.cos(roll), -sp.sin(roll)],
+ [0, sp.sin(roll), sp.cos(roll)]])
+ matrix_pitch = sp.Matrix([[sp.cos(pitch), 0, sp.sin(pitch)],
+ [0, 1, 0],
+ [-sp.sin(pitch), 0, sp.cos(pitch)]])
+ matrix_yaw = sp.Matrix([[sp.cos(yaw), -sp.sin(yaw), 0],
+ [sp.sin(yaw), sp.cos(yaw), 0],
+ [0, 0, 1]])
+ return matrix_yaw * matrix_pitch * matrix_roll
+
+
+def quat_rotate(q0, q1, q2, q3):
+ # make symbolic rotation matrix from quat
+ return sp.Matrix([[q0**2 + q1**2 - q2**2 - q3**2, 2 * (q1 * q2 + q0 * q3), 2 * (q1 * q3 - q0 * q2)],
+ [2 * (q1 * q2 - q0 * q3), q0**2 - q1**2 + q2**2 - q3**2, 2 * (q2 * q3 + q0 * q1)],
+ [2 * (q1 * q3 + q0 * q2), 2 * (q2 * q3 - q0 * q1), q0**2 - q1**2 - q2**2 + q3**2]]).T
+
+
+def quat_matrix_l(p):
+ return sp.Matrix([[p[0], -p[1], -p[2], -p[3]],
+ [p[1], p[0], -p[3], p[2]],
+ [p[2], p[3], p[0], -p[1]],
+ [p[3], -p[2], p[1], p[0]]])
+
+
+def quat_matrix_r(p):
+ return sp.Matrix([[p[0], -p[1], -p[2], -p[3]],
+ [p[1], p[0], p[3], -p[2]],
+ [p[2], -p[3], p[0], p[1]],
+ [p[3], p[2], -p[1], p[0]]])
+
+
+def sympy_into_c(sympy_functions, global_vars=None):
+ from sympy.utilities import codegen
+ routines = []
+ for name, expr, args in sympy_functions:
+ r = codegen.make_routine(name, expr, language="C99", global_vars=global_vars)
+
+ # argument ordering input to sympy is broken with function with output arguments
+ nargs = []
+
+ # reorder the input arguments
+ for aa in args:
+ if aa is None:
+ nargs.append(codegen.InputArgument(sp.Symbol('unused'), dimensions=[1, 1]))
+ continue
+ found = False
+ for a in r.arguments:
+ if str(aa.name) == str(a.name):
+ nargs.append(a)
+ found = True
+ break
+ if not found:
+ # [1,1] is a hack for Matrices
+ nargs.append(codegen.InputArgument(aa, dimensions=[1, 1]))
+
+ # add the output arguments
+ for a in r.arguments:
+ if type(a) == codegen.OutputArgument:
+ nargs.append(a)
+
+ # assert len(r.arguments) == len(args)+1
+ r.arguments = nargs
+
+ # add routine to list
+ routines.append(r)
+
+ [(_, c_code), (_, c_header)] = codegen.get_code_generator('C', 'ekf', 'C99').write(routines, "ekf")
+ c_header = '\n'.join(x for x in c_header.split("\n") if len(x) > 0 and x[0] != '#')
+
+ c_code = '\n'.join(x for x in c_code.split("\n") if len(x) > 0 and x[0] != '#')
+
+ return c_header, c_code
diff --git a/rednose_repo/requirements.txt b/rednose_repo/requirements.txt
new file mode 100644
index 000000000..3077a329a
--- /dev/null
+++ b/rednose_repo/requirements.txt
@@ -0,0 +1,10 @@
+ruff
+sympy
+numpy
+scipy
+cffi
+scons
+pre-commit
+Cython
+pytest
+pytest-xdist
diff --git a/rednose_repo/setup.py b/rednose_repo/setup.py
new file mode 100644
index 000000000..4157104e1
--- /dev/null
+++ b/rednose_repo/setup.py
@@ -0,0 +1,29 @@
+import os
+from setuptools import setup, find_packages
+
+here = os.path.abspath(os.path.dirname(__file__))
+
+setup(
+ name='rednose',
+ version='0.0.1',
+ url='https://github.com/commaai/rednose',
+ author='comma.ai',
+ author_email='harald@comma.ai',
+ packages=find_packages(),
+ platforms='any',
+ license='MIT',
+ package_data={'': ['helpers/chi2_lookup_table.npy', 'templates/*']},
+ install_requires=[
+ 'numpy',
+ 'cffi',
+ 'sympy',
+ ],
+ extras_require={
+ 'dev': [
+ 'scipy',
+ ],
+ },
+ ext_modules=[],
+ description="Kalman filter library",
+ long_description='See https://github.com/commaai/rednose',
+)
diff --git a/rednose_repo/site_scons/site_tools/cython.py b/rednose_repo/site_scons/site_tools/cython.py
new file mode 100644
index 000000000..c29147553
--- /dev/null
+++ b/rednose_repo/site_scons/site_tools/cython.py
@@ -0,0 +1,72 @@
+import re
+import SCons
+from SCons.Action import Action
+from SCons.Scanner import Scanner
+
+pyx_from_import_re = re.compile(r'^from\s+(\S+)\s+cimport', re.M)
+pyx_import_re = re.compile(r'^cimport\s+(\S+)', re.M)
+cdef_import_re = re.compile(r'^cdef extern from\s+.(\S+).:', re.M)
+
+
+def pyx_scan(node, env, path, arg=None):
+ contents = node.get_text_contents()
+
+ # from cimport ...
+ matches = pyx_from_import_re.findall(contents)
+ # cimport
+ matches += pyx_import_re.findall(contents)
+
+ # Modules can be either .pxd or .pyx files
+ files = [m.replace('.', '/') + '.pxd' for m in matches]
+ files += [m.replace('.', '/') + '.pyx' for m in matches]
+
+ # cdef extern from
+ files += cdef_import_re.findall(contents)
+
+ # Handle relative imports
+ cur_dir = str(node.get_dir())
+ files = [cur_dir + f if f.startswith('/') else f for f in files]
+
+ # Filter out non-existing files (probably system imports)
+ files = [f for f in files if env.File(f).exists()]
+ return env.File(files)
+
+
+pyxscanner = Scanner(function=pyx_scan, skeys=['.pyx', '.pxd'], recursive=True)
+cythonAction = Action("$CYTHONCOM")
+
+
+def create_builder(env):
+ try:
+ cython = env['BUILDERS']['Cython']
+ except KeyError:
+ cython = SCons.Builder.Builder(
+ action=cythonAction,
+ emitter={},
+ suffix=cython_suffix_emitter,
+ single_source=1
+ )
+ env.Append(SCANNERS=pyxscanner)
+ env['BUILDERS']['Cython'] = cython
+ return cython
+
+def cython_suffix_emitter(env, source):
+ return "$CYTHONCFILESUFFIX"
+
+def generate(env):
+ env["CYTHON"] = "cythonize"
+ env["CYTHONCOM"] = "$CYTHON $CYTHONFLAGS $SOURCE"
+ env["CYTHONCFILESUFFIX"] = ".cpp"
+
+ c_file, _ = SCons.Tool.createCFileBuilders(env)
+
+ c_file.suffix['.pyx'] = cython_suffix_emitter
+ c_file.add_action('.pyx', cythonAction)
+
+ c_file.suffix['.py'] = cython_suffix_emitter
+ c_file.add_action('.py', cythonAction)
+
+ create_builder(env)
+
+def exists(env):
+ return True
diff --git a/rednose_repo/site_scons/site_tools/rednose_filter.py b/rednose_repo/site_scons/site_tools/rednose_filter.py
new file mode 100644
index 000000000..e5b048822
--- /dev/null
+++ b/rednose_repo/site_scons/site_tools/rednose_filter.py
@@ -0,0 +1,51 @@
+import platform
+
+from SCons.Script import Dir, File
+
+
+def compile_single_filter(env, target, filter_gen_script, output_dir, extra_gen_artifacts, script_deps):
+ generated_src_files = [File(f) for f in [f'{output_dir}/{target}.cpp', f'{output_dir}/{target}.h']]
+ extra_generated_files = [File(f'{output_dir}/{x}') for x in extra_gen_artifacts]
+ generator_file = File(filter_gen_script)
+
+ action = f"{File(generator_file).relpath} {target} {Dir(output_dir).relpath}"
+ if hasattr(env, 'PrettyAction'): # short colored line when the top-level pretty tool is present
+ action = env.PrettyAction(action, 'GEN')
+ env.Command(generated_src_files + extra_generated_files,
+ [generator_file] + script_deps, action)
+
+ generated_cc_file = File(generated_src_files[:1])
+
+ return generated_cc_file
+
+
+class BaseRednoseCompileMethod:
+ def __init__(self, base_py_deps, base_cc_deps):
+ self.base_py_deps = base_py_deps
+ self.base_cc_deps = base_cc_deps
+
+
+class CompileFilterMethod(BaseRednoseCompileMethod):
+ def __call__(self, env, target, filter_gen_script, output_dir, extra_gen_artifacts=[], gen_script_deps=[]):
+ objects = compile_single_filter(env, target, filter_gen_script, output_dir, extra_gen_artifacts, self.base_py_deps + gen_script_deps)
+ linker_flags = env.get("LINKFLAGS", [])
+ if platform.system() == "Darwin":
+ linker_flags = ["-undefined", "dynamic_lookup"]
+ lib_target = env.SharedLibrary(f'{output_dir}/{target}', [self.base_cc_deps, objects], LINKFLAGS=linker_flags)
+
+ return lib_target
+
+
+def generate(env):
+ templates = env.Glob("$REDNOSE_ROOT/rednose/templates/*")
+ sympy_helpers = env.File("$REDNOSE_ROOT/rednose/helpers/sympy_helpers.py")
+ ekf_sym = env.File("$REDNOSE_ROOT/rednose/helpers/ekf_sym.py")
+
+ gen_script_deps = templates + [sympy_helpers, ekf_sym]
+ filter_lib_deps = []
+
+ env.AddMethod(CompileFilterMethod(gen_script_deps, filter_lib_deps), "RednoseCompileFilter")
+
+
+def exists(env):
+ return True
diff --git a/selfdrive/__init__.py b/selfdrive/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/selfdrive/assets/.gitattributes b/selfdrive/assets/.gitattributes
new file mode 100644
index 000000000..2ea5aa365
--- /dev/null
+++ b/selfdrive/assets/.gitattributes
@@ -0,0 +1,10 @@
+*.png -filter -diff -merge -text
+**/*.png -filter -diff -merge -text
+*.svg -filter -diff -merge text eol=lf
+**/*.svg -filter -diff -merge text eol=lf
+*.jpg -filter -diff -merge -text
+**/*.jpg -filter -diff -merge -text
+*.jpeg -filter -diff -merge -text
+**/*.jpeg -filter -diff -merge -text
+*.webp -filter -diff -merge -text
+**/*.webp -filter -diff -merge -text
diff --git a/selfdrive/assets/.gitignore b/selfdrive/assets/.gitignore
new file mode 100644
index 000000000..fffd4b4ed
--- /dev/null
+++ b/selfdrive/assets/.gitignore
@@ -0,0 +1,4 @@
+*.cc
+fonts/*.fnt
+fonts/*.png
+translations_assets.qrc
diff --git a/selfdrive/assets/assets.qrc b/selfdrive/assets/assets.qrc
new file mode 100644
index 000000000..26a7d998e
--- /dev/null
+++ b/selfdrive/assets/assets.qrc
@@ -0,0 +1,20 @@
+
+
+ ../../third_party/bootstrap/bootstrap-icons.svg
+ images/button_continue_triangle.svg
+ icons/circled_check.svg
+ icons/circled_slash.svg
+ icons/eye_open.svg
+ icons/eye_closed.svg
+ icons/close.svg
+ icons/lock_closed.svg
+ icons/checkmark.svg
+ icons/warning.png
+ icons/wifi_strength_low.svg
+ icons/wifi_strength_medium.svg
+ icons/wifi_strength_high.svg
+ icons/wifi_strength_full.svg
+
+ ../ui/translations/languages.json
+
+
diff --git a/selfdrive/assets/body/awake.gif b/selfdrive/assets/body/awake.gif
new file mode 100644
index 000000000..7ec67055d
Binary files /dev/null and b/selfdrive/assets/body/awake.gif differ
diff --git a/selfdrive/assets/body/sleep.gif b/selfdrive/assets/body/sleep.gif
new file mode 100644
index 000000000..469cc8033
Binary files /dev/null and b/selfdrive/assets/body/sleep.gif differ
diff --git a/selfdrive/assets/compress-images.sh b/selfdrive/assets/compress-images.sh
new file mode 100755
index 000000000..de59099bd
--- /dev/null
+++ b/selfdrive/assets/compress-images.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "compressing training guide images"
+optipng -o7 -strip all training/*
+
+# This can sometimes provide smaller images
+# mogrify -quality 100 -format jpg training/*
diff --git a/selfdrive/assets/fonts/Audiowide-Regular.fnt b/selfdrive/assets/fonts/Audiowide-Regular.fnt
new file mode 100644
index 000000000..afad3d2c6
--- /dev/null
+++ b/selfdrive/assets/fonts/Audiowide-Regular.fnt
@@ -0,0 +1,231 @@
+info face="Audiowide-Regular" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=2048 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Audiowide-Regular.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=51 height=200 xoffset=0 yoffset=0 xadvance=51 page=0 chnl=15
+char id=33 x=81 y=6 width=24 height=110 xoffset=8 yoffset=45 xadvance=40 page=0 chnl=15
+char id=34 x=117 y=6 width=46 height=40 xoffset=7 yoffset=49 xadvance=59 page=0 chnl=15
+char id=35 x=175 y=6 width=104 height=106 xoffset=5 yoffset=49 xadvance=114 page=0 chnl=15
+char id=36 x=291 y=6 width=73 height=110 xoffset=5 yoffset=45 xadvance=83 page=0 chnl=15
+char id=37 x=376 y=6 width=124 height=100 xoffset=6 yoffset=55 xadvance=135 page=0 chnl=15
+char id=38 x=512 y=6 width=91 height=100 xoffset=9 yoffset=55 xadvance=105 page=0 chnl=15
+char id=39 x=615 y=6 width=20 height=40 xoffset=7 yoffset=49 xadvance=33 page=0 chnl=15
+char id=40 x=647 y=6 width=61 height=144 xoffset=5 yoffset=28 xadvance=67 page=0 chnl=15
+char id=41 x=720 y=6 width=61 height=144 xoffset=1 yoffset=28 xadvance=67 page=0 chnl=15
+char id=42 x=793 y=6 width=66 height=71 xoffset=10 yoffset=45 xadvance=85 page=0 chnl=15
+char id=43 x=871 y=6 width=73 height=73 xoffset=6 yoffset=64 xadvance=84 page=0 chnl=15
+char id=44 x=956 y=6 width=27 height=40 xoffset=3 yoffset=130 xadvance=35 page=0 chnl=15
+char id=45 x=995 y=6 width=73 height=19 xoffset=8 yoffset=91 xadvance=89 page=0 chnl=15
+char id=46 x=1080 y=6 width=20 height=20 xoffset=6 yoffset=135 xadvance=32 page=0 chnl=15
+char id=47 x=1112 y=6 width=92 height=110 xoffset=6 yoffset=45 xadvance=103 page=0 chnl=15
+char id=48 x=1216 y=6 width=129 height=110 xoffset=8 yoffset=45 xadvance=145 page=0 chnl=15
+char id=49 x=1357 y=6 width=39 height=110 xoffset=5 yoffset=45 xadvance=55 page=0 chnl=15
+char id=50 x=1408 y=6 width=102 height=110 xoffset=8 yoffset=45 xadvance=118 page=0 chnl=15
+char id=51 x=1522 y=6 width=93 height=110 xoffset=10 yoffset=45 xadvance=112 page=0 chnl=15
+char id=52 x=1627 y=6 width=102 height=110 xoffset=8 yoffset=45 xadvance=121 page=0 chnl=15
+char id=53 x=1741 y=6 width=102 height=110 xoffset=9 yoffset=45 xadvance=117 page=0 chnl=15
+char id=54 x=1855 y=6 width=102 height=110 xoffset=9 yoffset=45 xadvance=116 page=0 chnl=15
+char id=55 x=6 y=218 width=92 height=110 xoffset=5 yoffset=45 xadvance=100 page=0 chnl=15
+char id=56 x=110 y=218 width=102 height=110 xoffset=8 yoffset=45 xadvance=117 page=0 chnl=15
+char id=57 x=224 y=218 width=102 height=110 xoffset=6 yoffset=45 xadvance=116 page=0 chnl=15
+char id=58 x=338 y=218 width=20 height=83 xoffset=9 yoffset=72 xadvance=38 page=0 chnl=15
+char id=59 x=370 y=218 width=27 height=98 xoffset=4 yoffset=72 xadvance=39 page=0 chnl=15
+char id=60 x=409 y=218 width=70 height=81 xoffset=5 yoffset=59 xadvance=82 page=0 chnl=15
+char id=61 x=491 y=218 width=73 height=55 xoffset=10 yoffset=73 xadvance=92 page=0 chnl=15
+char id=62 x=576 y=218 width=70 height=81 xoffset=7 yoffset=59 xadvance=82 page=0 chnl=15
+char id=63 x=658 y=218 width=92 height=110 xoffset=6 yoffset=45 xadvance=104 page=0 chnl=15
+char id=64 x=762 y=218 width=87 height=87 xoffset=9 yoffset=69 xadvance=103 page=0 chnl=15
+char id=65 x=861 y=218 width=111 height=110 xoffset=9 yoffset=45 xadvance=130 page=0 chnl=15
+char id=66 x=984 y=218 width=111 height=110 xoffset=11 yoffset=45 xadvance=126 page=0 chnl=15
+char id=67 x=1107 y=218 width=100 height=110 xoffset=10 yoffset=45 xadvance=117 page=0 chnl=15
+char id=68 x=1219 y=218 width=111 height=110 xoffset=11 yoffset=45 xadvance=129 page=0 chnl=15
+char id=69 x=1342 y=218 width=100 height=110 xoffset=11 yoffset=45 xadvance=118 page=0 chnl=15
+char id=70 x=1454 y=218 width=101 height=110 xoffset=11 yoffset=45 xadvance=115 page=0 chnl=15
+char id=71 x=1567 y=218 width=110 height=110 xoffset=10 yoffset=45 xadvance=129 page=0 chnl=15
+char id=72 x=1689 y=218 width=111 height=110 xoffset=11 yoffset=45 xadvance=133 page=0 chnl=15
+char id=73 x=1812 y=218 width=21 height=110 xoffset=11 yoffset=45 xadvance=43 page=0 chnl=15
+char id=74 x=1845 y=218 width=101 height=110 xoffset=3 yoffset=45 xadvance=115 page=0 chnl=15
+char id=75 x=6 y=430 width=116 height=110 xoffset=11 yoffset=45 xadvance=127 page=0 chnl=15
+char id=76 x=134 y=430 width=102 height=110 xoffset=11 yoffset=45 xadvance=115 page=0 chnl=15
+char id=77 x=248 y=430 width=129 height=114 xoffset=11 yoffset=43 xadvance=150 page=0 chnl=15
+char id=78 x=389 y=430 width=111 height=114 xoffset=11 yoffset=43 xadvance=132 page=0 chnl=15
+char id=79 x=512 y=430 width=119 height=114 xoffset=8 yoffset=43 xadvance=134 page=0 chnl=15
+char id=80 x=643 y=430 width=111 height=110 xoffset=11 yoffset=45 xadvance=126 page=0 chnl=15
+char id=81 x=766 y=430 width=119 height=129 xoffset=8 yoffset=43 xadvance=134 page=0 chnl=15
+char id=82 x=897 y=430 width=116 height=110 xoffset=11 yoffset=45 xadvance=129 page=0 chnl=15
+char id=83 x=1025 y=430 width=111 height=110 xoffset=7 yoffset=45 xadvance=122 page=0 chnl=15
+char id=84 x=1148 y=430 width=108 height=110 xoffset=3 yoffset=45 xadvance=113 page=0 chnl=15
+char id=85 x=1268 y=430 width=111 height=110 xoffset=9 yoffset=45 xadvance=130 page=0 chnl=15
+char id=86 x=1391 y=430 width=123 height=112 xoffset=-1 yoffset=45 xadvance=121 page=0 chnl=15
+char id=87 x=1526 y=430 width=147 height=112 xoffset=5 yoffset=45 xadvance=157 page=0 chnl=15
+char id=88 x=1685 y=430 width=122 height=110 xoffset=1 yoffset=45 xadvance=123 page=0 chnl=15
+char id=89 x=1819 y=430 width=111 height=110 xoffset=6 yoffset=45 xadvance=122 page=0 chnl=15
+char id=90 x=6 y=642 width=102 height=110 xoffset=5 yoffset=45 xadvance=111 page=0 chnl=15
+char id=91 x=120 y=642 width=42 height=147 xoffset=10 yoffset=27 xadvance=57 page=0 chnl=15
+char id=92 x=174 y=642 width=91 height=110 xoffset=6 yoffset=45 xadvance=103 page=0 chnl=15
+char id=93 x=277 y=642 width=43 height=147 xoffset=5 yoffset=27 xadvance=57 page=0 chnl=15
+char id=94 x=332 y=642 width=64 height=57 xoffset=2 yoffset=45 xadvance=67 page=0 chnl=15
+char id=95 x=408 y=642 width=89 height=18 xoffset=9 yoffset=164 xadvance=106 page=0 chnl=15
+char id=96 x=509 y=642 width=46 height=34 xoffset=15 yoffset=33 xadvance=87 page=0 chnl=15
+char id=97 x=567 y=642 width=91 height=83 xoffset=4 yoffset=72 xadvance=102 page=0 chnl=15
+char id=98 x=670 y=642 width=93 height=118 xoffset=8 yoffset=37 xadvance=108 page=0 chnl=15
+char id=99 x=775 y=642 width=83 height=83 xoffset=7 yoffset=72 xadvance=96 page=0 chnl=15
+char id=100 x=870 y=642 width=93 height=118 xoffset=8 yoffset=37 xadvance=109 page=0 chnl=15
+char id=101 x=975 y=642 width=92 height=83 xoffset=7 yoffset=72 xadvance=102 page=0 chnl=15
+char id=102 x=1079 y=642 width=74 height=119 xoffset=9 yoffset=36 xadvance=86 page=0 chnl=15
+char id=103 x=1165 y=642 width=93 height=119 xoffset=7 yoffset=72 xadvance=108 page=0 chnl=15
+char id=104 x=1270 y=642 width=93 height=118 xoffset=9 yoffset=37 xadvance=110 page=0 chnl=15
+char id=105 x=1375 y=642 width=21 height=118 xoffset=9 yoffset=37 xadvance=39 page=0 chnl=15
+char id=106 x=1408 y=642 width=65 height=154 xoffset=-35 yoffset=37 xadvance=39 page=0 chnl=15
+char id=107 x=1485 y=642 width=98 height=118 xoffset=9 yoffset=37 xadvance=108 page=0 chnl=15
+char id=108 x=1595 y=642 width=38 height=118 xoffset=8 yoffset=37 xadvance=49 page=0 chnl=15
+char id=109 x=1645 y=642 width=120 height=83 xoffset=9 yoffset=72 xadvance=137 page=0 chnl=15
+char id=110 x=1777 y=642 width=93 height=83 xoffset=9 yoffset=72 xadvance=109 page=0 chnl=15
+char id=111 x=1882 y=642 width=93 height=83 xoffset=7 yoffset=72 xadvance=107 page=0 chnl=15
+char id=112 x=6 y=854 width=93 height=109 xoffset=8 yoffset=72 xadvance=108 page=0 chnl=15
+char id=113 x=111 y=854 width=93 height=109 xoffset=7 yoffset=72 xadvance=108 page=0 chnl=15
+char id=114 x=216 y=854 width=74 height=83 xoffset=8 yoffset=72 xadvance=85 page=0 chnl=15
+char id=115 x=302 y=854 width=84 height=83 xoffset=6 yoffset=72 xadvance=93 page=0 chnl=15
+char id=116 x=398 y=854 width=82 height=110 xoffset=3 yoffset=45 xadvance=88 page=0 chnl=15
+char id=117 x=492 y=854 width=92 height=83 xoffset=8 yoffset=72 xadvance=109 page=0 chnl=15
+char id=118 x=596 y=854 width=100 height=84 xoffset=9 yoffset=72 xadvance=105 page=0 chnl=15
+char id=119 x=708 y=854 width=137 height=84 xoffset=9 yoffset=71 xadvance=143 page=0 chnl=15
+char id=120 x=857 y=854 width=109 height=83 xoffset=0 yoffset=72 xadvance=109 page=0 chnl=15
+char id=121 x=978 y=854 width=93 height=119 xoffset=8 yoffset=72 xadvance=110 page=0 chnl=15
+char id=122 x=1083 y=854 width=85 height=83 xoffset=5 yoffset=72 xadvance=94 page=0 chnl=15
+char id=123 x=1180 y=854 width=61 height=147 xoffset=1 yoffset=27 xadvance=66 page=0 chnl=15
+char id=124 x=1253 y=854 width=21 height=147 xoffset=10 yoffset=27 xadvance=40 page=0 chnl=15
+char id=125 x=1286 y=854 width=60 height=147 xoffset=5 yoffset=27 xadvance=66 page=0 chnl=15
+char id=126 x=1358 y=854 width=84 height=29 xoffset=8 yoffset=88 xadvance=99 page=0 chnl=15
+char id=163 x=1454 y=854 width=127 height=110 xoffset=5 yoffset=45 xadvance=137 page=0 chnl=15
+char id=165 x=1593 y=854 width=110 height=110 xoffset=8 yoffset=45 xadvance=126 page=0 chnl=15
+char id=167 x=1715 y=854 width=110 height=147 xoffset=9 yoffset=27 xadvance=126 page=0 chnl=15
+char id=171 x=1837 y=854 width=99 height=63 xoffset=4 yoffset=82 xadvance=109 page=0 chnl=15
+char id=176 x=1948 y=854 width=46 height=46 xoffset=5 yoffset=49 xadvance=55 page=0 chnl=15
+char id=187 x=6 y=1066 width=99 height=63 xoffset=6 yoffset=82 xadvance=109 page=0 chnl=15
+char id=191 x=117 y=1066 width=92 height=111 xoffset=6 yoffset=76 xadvance=103 page=0 chnl=15
+char id=192 x=221 y=1066 width=111 height=154 xoffset=9 yoffset=1 xadvance=130 page=0 chnl=15
+char id=193 x=344 y=1066 width=111 height=154 xoffset=9 yoffset=1 xadvance=130 page=0 chnl=15
+char id=195 x=467 y=1066 width=111 height=148 xoffset=9 yoffset=7 xadvance=130 page=0 chnl=15
+char id=196 x=590 y=1066 width=111 height=143 xoffset=9 yoffset=12 xadvance=130 page=0 chnl=15
+char id=199 x=713 y=1066 width=100 height=145 xoffset=10 yoffset=45 xadvance=117 page=0 chnl=15
+char id=201 x=825 y=1066 width=100 height=154 xoffset=11 yoffset=1 xadvance=118 page=0 chnl=15
+char id=202 x=937 y=1066 width=100 height=154 xoffset=11 yoffset=1 xadvance=118 page=0 chnl=15
+char id=205 x=1049 y=1066 width=51 height=154 xoffset=11 yoffset=1 xadvance=43 page=0 chnl=15
+char id=209 x=1112 y=1066 width=111 height=144 xoffset=11 yoffset=13 xadvance=132 page=0 chnl=15
+char id=211 x=1235 y=1066 width=119 height=156 xoffset=8 yoffset=1 xadvance=134 page=0 chnl=15
+char id=212 x=1366 y=1066 width=119 height=156 xoffset=8 yoffset=1 xadvance=134 page=0 chnl=15
+char id=214 x=1497 y=1066 width=119 height=145 xoffset=8 yoffset=12 xadvance=134 page=0 chnl=15
+char id=215 x=1628 y=1066 width=77 height=55 xoffset=7 yoffset=73 xadvance=90 page=0 chnl=15
+char id=220 x=1717 y=1066 width=111 height=137 xoffset=9 yoffset=18 xadvance=130 page=0 chnl=15
+char id=223 x=1840 y=1066 width=110 height=119 xoffset=9 yoffset=36 xadvance=122 page=0 chnl=15
+char id=224 x=6 y=1278 width=91 height=127 xoffset=4 yoffset=28 xadvance=102 page=0 chnl=15
+char id=225 x=109 y=1278 width=91 height=127 xoffset=4 yoffset=28 xadvance=102 page=0 chnl=15
+char id=226 x=212 y=1278 width=91 height=127 xoffset=4 yoffset=28 xadvance=102 page=0 chnl=15
+char id=227 x=315 y=1278 width=91 height=121 xoffset=4 yoffset=34 xadvance=102 page=0 chnl=15
+char id=228 x=418 y=1278 width=91 height=116 xoffset=4 yoffset=39 xadvance=102 page=0 chnl=15
+char id=231 x=521 y=1278 width=83 height=118 xoffset=7 yoffset=72 xadvance=96 page=0 chnl=15
+char id=232 x=616 y=1278 width=92 height=127 xoffset=7 yoffset=28 xadvance=102 page=0 chnl=15
+char id=233 x=720 y=1278 width=92 height=127 xoffset=7 yoffset=28 xadvance=102 page=0 chnl=15
+char id=234 x=824 y=1278 width=92 height=127 xoffset=7 yoffset=28 xadvance=102 page=0 chnl=15
+char id=237 x=928 y=1278 width=52 height=127 xoffset=9 yoffset=28 xadvance=39 page=0 chnl=15
+char id=238 x=992 y=1278 width=73 height=123 xoffset=-17 yoffset=32 xadvance=39 page=0 chnl=15
+char id=241 x=1077 y=1278 width=93 height=121 xoffset=9 yoffset=34 xadvance=109 page=0 chnl=15
+char id=243 x=1182 y=1278 width=93 height=127 xoffset=7 yoffset=28 xadvance=107 page=0 chnl=15
+char id=244 x=1287 y=1278 width=93 height=127 xoffset=7 yoffset=28 xadvance=107 page=0 chnl=15
+char id=245 x=1392 y=1278 width=93 height=121 xoffset=7 yoffset=34 xadvance=107 page=0 chnl=15
+char id=246 x=1497 y=1278 width=93 height=116 xoffset=7 yoffset=39 xadvance=107 page=0 chnl=15
+char id=249 x=1602 y=1278 width=92 height=122 xoffset=8 yoffset=33 xadvance=109 page=0 chnl=15
+char id=250 x=1706 y=1278 width=92 height=122 xoffset=8 yoffset=33 xadvance=109 page=0 chnl=15
+char id=251 x=1810 y=1278 width=92 height=127 xoffset=8 yoffset=28 xadvance=109 page=0 chnl=15
+char id=252 x=1914 y=1278 width=92 height=116 xoffset=8 yoffset=39 xadvance=109 page=0 chnl=15
+char id=286 x=6 y=1490 width=110 height=146 xoffset=10 yoffset=9 xadvance=129 page=0 chnl=15
+char id=287 x=128 y=1490 width=93 height=155 xoffset=7 yoffset=36 xadvance=108 page=0 chnl=15
+char id=304 x=233 y=1490 width=21 height=138 xoffset=11 yoffset=17 xadvance=43 page=0 chnl=15
+char id=305 x=266 y=1490 width=21 height=83 xoffset=9 yoffset=72 xadvance=39 page=0 chnl=15
+char id=339 x=299 y=1490 width=165 height=83 xoffset=7 yoffset=72 xadvance=174 page=0 chnl=15
+char id=350 x=476 y=1490 width=111 height=145 xoffset=7 yoffset=45 xadvance=122 page=0 chnl=15
+char id=351 x=599 y=1490 width=84 height=118 xoffset=6 yoffset=72 xadvance=93 page=0 chnl=15
+char id=1028 x=695 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1030 x=707 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1040 x=719 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1041 x=731 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1042 x=743 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1043 x=755 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1044 x=767 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1045 x=779 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1046 x=791 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1047 x=803 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1048 x=815 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1049 x=827 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1050 x=839 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1051 x=851 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1052 x=863 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1053 x=875 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1054 x=887 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1055 x=899 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1056 x=911 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1057 x=923 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1058 x=935 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1059 x=947 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1060 x=959 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1062 x=971 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1063 x=983 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1065 x=995 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1068 x=1007 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1070 x=1019 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1071 x=1031 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1072 x=1043 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1073 x=1055 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1074 x=1067 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1075 x=1079 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1076 x=1091 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1077 x=1103 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1078 x=1115 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1079 x=1127 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1080 x=1139 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1081 x=1151 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1082 x=1163 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1083 x=1175 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1084 x=1187 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1085 x=1199 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1086 x=1211 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1087 x=1223 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1088 x=1235 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1089 x=1247 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1090 x=1259 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1091 x=1271 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1092 x=1283 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1093 x=1295 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1094 x=1307 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1095 x=1319 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1096 x=1331 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1097 x=1343 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1100 x=1355 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1102 x=1367 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1103 x=1379 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1108 x=1391 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1110 x=1403 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1111 x=1415 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8209 x=1427 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8211 x=1439 y=1490 width=64 height=19 xoffset=8 yoffset=91 xadvance=80 page=0 chnl=15
+char id=8220 x=1515 y=1490 width=56 height=40 xoffset=4 yoffset=49 xadvance=64 page=0 chnl=15
+char id=8222 x=1583 y=1490 width=55 height=40 xoffset=3 yoffset=130 xadvance=63 page=0 chnl=15
+char id=8226 x=1650 y=1490 width=32 height=32 xoffset=10 yoffset=83 xadvance=52 page=0 chnl=15
+char id=8364 x=1694 y=1490 width=127 height=110 xoffset=7 yoffset=45 xadvance=142 page=0 chnl=15
+char id=8627 x=1833 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8679 x=1845 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9003 x=1857 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9251 x=1869 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9654 x=1881 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9664 x=1893 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9675 x=1905 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9679 x=1917 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9881 x=1929 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=1941 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10004 x=1953 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=1965 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=1977 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=1989 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=2001 y=1490 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Audiowide-Regular.png b/selfdrive/assets/fonts/Audiowide-Regular.png
new file mode 100644
index 000000000..6f3ff92a7
Binary files /dev/null and b/selfdrive/assets/fonts/Audiowide-Regular.png differ
diff --git a/selfdrive/assets/fonts/Audiowide-Regular.ttf b/selfdrive/assets/fonts/Audiowide-Regular.ttf
new file mode 100644
index 000000000..348817d57
Binary files /dev/null and b/selfdrive/assets/fonts/Audiowide-Regular.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-Black.fnt b/selfdrive/assets/fonts/Inter-Black.fnt
new file mode 100644
index 000000000..ab707e43c
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-Black.fnt
@@ -0,0 +1,231 @@
+info face="Inter-Black" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-Black.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=32 height=200 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15
+char id=33 x=62 y=6 width=34 height=123 xoffset=12 yoffset=39 xadvance=58 page=0 chnl=15
+char id=34 x=108 y=6 width=53 height=50 xoffset=5 yoffset=39 xadvance=63 page=0 chnl=15
+char id=35 x=173 y=6 width=109 height=121 xoffset=0 yoffset=39 xadvance=109 page=0 chnl=15
+char id=36 x=294 y=6 width=102 height=152 xoffset=4 yoffset=24 xadvance=110 page=0 chnl=15
+char id=37 x=408 y=6 width=121 height=133 xoffset=13 yoffset=33 xadvance=147 page=0 chnl=15
+char id=38 x=541 y=6 width=112 height=125 xoffset=5 yoffset=37 xadvance=115 page=0 chnl=15
+char id=39 x=665 y=6 width=22 height=50 xoffset=5 yoffset=39 xadvance=33 page=0 chnl=15
+char id=40 x=699 y=6 width=57 height=149 xoffset=14 yoffset=39 xadvance=72 page=0 chnl=15
+char id=41 x=768 y=6 width=57 height=149 xoffset=2 yoffset=39 xadvance=72 page=0 chnl=15
+char id=42 x=837 y=6 width=69 height=69 xoffset=16 yoffset=39 xadvance=100 page=0 chnl=15
+char id=43 x=918 y=6 width=88 height=88 xoffset=13 yoffset=67 xadvance=114 page=0 chnl=15
+char id=44 x=1018 y=6 width=33 height=47 xoffset=7 yoffset=143 xadvance=52 page=0 chnl=15
+char id=45 x=1063 y=6 width=57 height=26 xoffset=11 yoffset=99 xadvance=78 page=0 chnl=15
+char id=46 x=1132 y=6 width=34 height=33 xoffset=9 yoffset=129 xadvance=51 page=0 chnl=15
+char id=47 x=1178 y=6 width=68 height=145 xoffset=0 yoffset=34 xadvance=68 page=0 chnl=15
+char id=48 x=1258 y=6 width=107 height=126 xoffset=7 yoffset=38 xadvance=120 page=0 chnl=15
+char id=49 x=1377 y=6 width=60 height=121 xoffset=7 yoffset=39 xadvance=83 page=0 chnl=15
+char id=50 x=1449 y=6 width=96 height=122 xoffset=5 yoffset=38 xadvance=106 page=0 chnl=15
+char id=51 x=1557 y=6 width=100 height=124 xoffset=6 yoffset=38 xadvance=111 page=0 chnl=15
+char id=52 x=1669 y=6 width=105 height=121 xoffset=6 yoffset=39 xadvance=115 page=0 chnl=15
+char id=53 x=1786 y=6 width=97 height=123 xoffset=8 yoffset=39 xadvance=110 page=0 chnl=15
+char id=54 x=1895 y=6 width=101 height=125 xoffset=6 yoffset=37 xadvance=113 page=0 chnl=15
+char id=55 x=2008 y=6 width=90 height=121 xoffset=5 yoffset=39 xadvance=100 page=0 chnl=15
+char id=56 x=2110 y=6 width=102 height=124 xoffset=6 yoffset=38 xadvance=114 page=0 chnl=15
+char id=57 x=2224 y=6 width=102 height=125 xoffset=6 yoffset=37 xadvance=113 page=0 chnl=15
+char id=58 x=2338 y=6 width=34 height=94 xoffset=9 yoffset=68 xadvance=51 page=0 chnl=15
+char id=59 x=2384 y=6 width=38 height=122 xoffset=7 yoffset=68 xadvance=52 page=0 chnl=15
+char id=60 x=2434 y=6 width=88 height=99 xoffset=13 yoffset=62 xadvance=114 page=0 chnl=15
+char id=61 x=2534 y=6 width=88 height=69 xoffset=13 yoffset=77 xadvance=114 page=0 chnl=15
+char id=62 x=2634 y=6 width=88 height=99 xoffset=13 yoffset=62 xadvance=114 page=0 chnl=15
+char id=63 x=2734 y=6 width=86 height=124 xoffset=6 yoffset=38 xadvance=99 page=0 chnl=15
+char id=64 x=2832 y=6 width=164 height=160 xoffset=11 yoffset=37 xadvance=180 page=0 chnl=15
+char id=65 x=3008 y=6 width=125 height=121 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15
+char id=66 x=3145 y=6 width=100 height=121 xoffset=7 yoffset=39 xadvance=110 page=0 chnl=15
+char id=67 x=3257 y=6 width=113 height=124 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15
+char id=68 x=3382 y=6 width=107 height=121 xoffset=7 yoffset=39 xadvance=121 page=0 chnl=15
+char id=69 x=3501 y=6 width=88 height=121 xoffset=7 yoffset=39 xadvance=102 page=0 chnl=15
+char id=70 x=3601 y=6 width=86 height=121 xoffset=7 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3699 y=6 width=114 height=124 xoffset=7 yoffset=38 xadvance=127 page=0 chnl=15
+char id=72 x=3825 y=6 width=110 height=121 xoffset=7 yoffset=39 xadvance=123 page=0 chnl=15
+char id=73 x=3947 y=6 width=34 height=121 xoffset=7 yoffset=39 xadvance=48 page=0 chnl=15
+char id=74 x=3993 y=6 width=89 height=123 xoffset=1 yoffset=39 xadvance=97 page=0 chnl=15
+char id=75 x=6 y=218 width=111 height=121 xoffset=7 yoffset=39 xadvance=118 page=0 chnl=15
+char id=76 x=129 y=218 width=82 height=121 xoffset=7 yoffset=39 xadvance=94 page=0 chnl=15
+char id=77 x=223 y=218 width=140 height=121 xoffset=7 yoffset=39 xadvance=153 page=0 chnl=15
+char id=78 x=375 y=218 width=105 height=121 xoffset=7 yoffset=39 xadvance=119 page=0 chnl=15
+char id=79 x=492 y=218 width=118 height=124 xoffset=7 yoffset=38 xadvance=131 page=0 chnl=15
+char id=80 x=622 y=218 width=98 height=121 xoffset=7 yoffset=39 xadvance=108 page=0 chnl=15
+char id=81 x=732 y=218 width=118 height=131 xoffset=7 yoffset=38 xadvance=131 page=0 chnl=15
+char id=82 x=862 y=218 width=102 height=121 xoffset=7 yoffset=39 xadvance=110 page=0 chnl=15
+char id=83 x=976 y=218 width=102 height=124 xoffset=4 yoffset=38 xadvance=110 page=0 chnl=15
+char id=84 x=1090 y=218 width=105 height=121 xoffset=4 yoffset=39 xadvance=113 page=0 chnl=15
+char id=85 x=1207 y=218 width=105 height=123 xoffset=7 yoffset=39 xadvance=119 page=0 chnl=15
+char id=86 x=1324 y=218 width=125 height=121 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15
+char id=87 x=1461 y=218 width=176 height=121 xoffset=2 yoffset=39 xadvance=180 page=0 chnl=15
+char id=88 x=1649 y=218 width=118 height=121 xoffset=4 yoffset=39 xadvance=126 page=0 chnl=15
+char id=89 x=1779 y=218 width=122 height=121 xoffset=2 yoffset=39 xadvance=126 page=0 chnl=15
+char id=90 x=1913 y=218 width=99 height=121 xoffset=8 yoffset=39 xadvance=114 page=0 chnl=15
+char id=91 x=2024 y=218 width=55 height=149 xoffset=16 yoffset=39 xadvance=72 page=0 chnl=15
+char id=92 x=2091 y=218 width=68 height=145 xoffset=0 yoffset=34 xadvance=68 page=0 chnl=15
+char id=93 x=2171 y=218 width=55 height=149 xoffset=2 yoffset=39 xadvance=72 page=0 chnl=15
+char id=94 x=2238 y=218 width=74 height=54 xoffset=4 yoffset=41 xadvance=82 page=0 chnl=15
+char id=95 x=2324 y=218 width=82 height=24 xoffset=0 yoffset=160 xadvance=81 page=0 chnl=15
+char id=96 x=2418 y=218 width=40 height=27 xoffset=21 yoffset=32 xadvance=82 page=0 chnl=15
+char id=97 x=2470 y=218 width=88 height=94 xoffset=3 yoffset=68 xadvance=97 page=0 chnl=15
+char id=98 x=2570 y=218 width=95 height=123 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15
+char id=99 x=2677 y=218 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15
+char id=100 x=2781 y=218 width=94 height=123 xoffset=5 yoffset=39 xadvance=106 page=0 chnl=15
+char id=101 x=2887 y=218 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15
+char id=102 x=2991 y=218 width=66 height=126 xoffset=1 yoffset=34 xadvance=66 page=0 chnl=15
+char id=103 x=3069 y=218 width=95 height=127 xoffset=5 yoffset=68 xadvance=107 page=0 chnl=15
+char id=104 x=3176 y=218 width=92 height=121 xoffset=8 yoffset=39 xadvance=106 page=0 chnl=15
+char id=105 x=3280 y=218 width=33 height=130 xoffset=8 yoffset=30 xadvance=48 page=0 chnl=15
+char id=106 x=3325 y=218 width=47 height=164 xoffset=-6 yoffset=30 xadvance=48 page=0 chnl=15
+char id=107 x=3384 y=218 width=93 height=121 xoffset=8 yoffset=39 xadvance=100 page=0 chnl=15
+char id=108 x=3489 y=218 width=33 height=121 xoffset=8 yoffset=39 xadvance=48 page=0 chnl=15
+char id=109 x=3534 y=218 width=140 height=92 xoffset=8 yoffset=68 xadvance=155 page=0 chnl=15
+char id=110 x=3686 y=218 width=92 height=92 xoffset=8 yoffset=68 xadvance=106 page=0 chnl=15
+char id=111 x=3790 y=218 width=95 height=94 xoffset=4 yoffset=68 xadvance=103 page=0 chnl=15
+char id=112 x=3897 y=218 width=94 height=126 xoffset=8 yoffset=68 xadvance=107 page=0 chnl=15
+char id=113 x=6 y=430 width=94 height=126 xoffset=5 yoffset=68 xadvance=107 page=0 chnl=15
+char id=114 x=112 y=430 width=62 height=92 xoffset=8 yoffset=68 xadvance=71 page=0 chnl=15
+char id=115 x=186 y=430 width=89 height=94 xoffset=4 yoffset=68 xadvance=97 page=0 chnl=15
+char id=116 x=287 y=430 width=62 height=114 xoffset=2 yoffset=48 xadvance=66 page=0 chnl=15
+char id=117 x=361 y=430 width=92 height=93 xoffset=8 yoffset=69 xadvance=107 page=0 chnl=15
+char id=118 x=465 y=430 width=100 height=91 xoffset=0 yoffset=69 xadvance=100 page=0 chnl=15
+char id=119 x=577 y=430 width=142 height=91 xoffset=1 yoffset=69 xadvance=144 page=0 chnl=15
+char id=120 x=731 y=430 width=95 height=91 xoffset=2 yoffset=69 xadvance=98 page=0 chnl=15
+char id=121 x=838 y=430 width=100 height=125 xoffset=0 yoffset=69 xadvance=100 page=0 chnl=15
+char id=122 x=950 y=430 width=80 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15
+char id=123 x=1042 y=430 width=67 height=149 xoffset=4 yoffset=39 xadvance=72 page=0 chnl=15
+char id=124 x=1121 y=430 width=33 height=198 xoffset=17 yoffset=1 xadvance=66 page=0 chnl=15
+char id=125 x=1166 y=430 width=67 height=149 xoffset=2 yoffset=39 xadvance=72 page=0 chnl=15
+char id=126 x=1245 y=430 width=93 height=43 xoffset=11 yoffset=90 xadvance=114 page=0 chnl=15
+char id=163 x=1350 y=430 width=94 height=122 xoffset=11 yoffset=38 xadvance=115 page=0 chnl=15
+char id=165 x=1456 y=430 width=93 height=121 xoffset=2 yoffset=39 xadvance=97 page=0 chnl=15
+char id=167 x=1561 y=430 width=85 height=147 xoffset=9 yoffset=38 xadvance=102 page=0 chnl=15
+char id=171 x=1658 y=430 width=99 height=73 xoffset=8 yoffset=75 xadvance=112 page=0 chnl=15
+char id=176 x=1769 y=430 width=61 height=61 xoffset=8 yoffset=39 xadvance=76 page=0 chnl=15
+char id=187 x=1842 y=430 width=100 height=73 xoffset=6 yoffset=75 xadvance=113 page=0 chnl=15
+char id=191 x=1954 y=430 width=86 height=125 xoffset=7 yoffset=69 xadvance=99 page=0 chnl=15
+char id=192 x=2052 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15
+char id=193 x=2189 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15
+char id=195 x=2326 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15
+char id=196 x=2463 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15
+char id=199 x=2600 y=430 width=113 height=162 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15
+char id=201 x=2725 y=430 width=88 height=158 xoffset=7 yoffset=2 xadvance=102 page=0 chnl=15
+char id=202 x=2825 y=430 width=88 height=159 xoffset=7 yoffset=1 xadvance=102 page=0 chnl=15
+char id=205 x=2925 y=430 width=46 height=158 xoffset=7 yoffset=2 xadvance=48 page=0 chnl=15
+char id=209 x=2983 y=430 width=105 height=157 xoffset=7 yoffset=3 xadvance=119 page=0 chnl=15
+char id=211 x=3100 y=430 width=118 height=160 xoffset=7 yoffset=2 xadvance=131 page=0 chnl=15
+char id=212 x=3230 y=430 width=118 height=161 xoffset=7 yoffset=1 xadvance=131 page=0 chnl=15
+char id=214 x=3360 y=430 width=118 height=160 xoffset=7 yoffset=2 xadvance=131 page=0 chnl=15
+char id=215 x=3490 y=430 width=93 height=94 xoffset=11 yoffset=64 xadvance=114 page=0 chnl=15
+char id=220 x=3595 y=430 width=105 height=160 xoffset=7 yoffset=2 xadvance=119 page=0 chnl=15
+char id=223 x=3712 y=430 width=104 height=122 xoffset=7 yoffset=38 xadvance=115 page=0 chnl=15
+char id=224 x=3828 y=430 width=88 height=130 xoffset=3 yoffset=32 xadvance=97 page=0 chnl=15
+char id=225 x=3928 y=430 width=88 height=130 xoffset=3 yoffset=32 xadvance=97 page=0 chnl=15
+char id=226 x=6 y=642 width=88 height=131 xoffset=3 yoffset=31 xadvance=97 page=0 chnl=15
+char id=227 x=106 y=642 width=88 height=129 xoffset=3 yoffset=33 xadvance=97 page=0 chnl=15
+char id=228 x=206 y=642 width=88 height=130 xoffset=3 yoffset=32 xadvance=97 page=0 chnl=15
+char id=231 x=306 y=642 width=92 height=132 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15
+char id=232 x=410 y=642 width=92 height=130 xoffset=4 yoffset=32 xadvance=100 page=0 chnl=15
+char id=233 x=514 y=642 width=92 height=130 xoffset=4 yoffset=32 xadvance=100 page=0 chnl=15
+char id=234 x=618 y=642 width=92 height=131 xoffset=4 yoffset=31 xadvance=100 page=0 chnl=15
+char id=237 x=722 y=642 width=45 height=128 xoffset=8 yoffset=32 xadvance=48 page=0 chnl=15
+char id=238 x=779 y=642 width=77 height=129 xoffset=-14 yoffset=31 xadvance=48 page=0 chnl=15
+char id=241 x=868 y=642 width=92 height=127 xoffset=8 yoffset=33 xadvance=106 page=0 chnl=15
+char id=243 x=972 y=642 width=95 height=130 xoffset=4 yoffset=32 xadvance=103 page=0 chnl=15
+char id=244 x=1079 y=642 width=95 height=131 xoffset=4 yoffset=31 xadvance=103 page=0 chnl=15
+char id=245 x=1186 y=642 width=95 height=129 xoffset=4 yoffset=33 xadvance=103 page=0 chnl=15
+char id=246 x=1293 y=642 width=95 height=130 xoffset=4 yoffset=32 xadvance=103 page=0 chnl=15
+char id=249 x=1400 y=642 width=92 height=130 xoffset=8 yoffset=32 xadvance=107 page=0 chnl=15
+char id=250 x=1504 y=642 width=92 height=130 xoffset=8 yoffset=32 xadvance=107 page=0 chnl=15
+char id=251 x=1608 y=642 width=92 height=131 xoffset=8 yoffset=31 xadvance=107 page=0 chnl=15
+char id=252 x=1712 y=642 width=92 height=130 xoffset=8 yoffset=32 xadvance=107 page=0 chnl=15
+char id=286 x=1816 y=642 width=114 height=155 xoffset=7 yoffset=7 xadvance=127 page=0 chnl=15
+char id=287 x=1942 y=642 width=95 height=158 xoffset=5 yoffset=37 xadvance=107 page=0 chnl=15
+char id=304 x=2049 y=642 width=34 height=160 xoffset=7 yoffset=0 xadvance=48 page=0 chnl=15
+char id=305 x=2095 y=642 width=33 height=91 xoffset=8 yoffset=69 xadvance=48 page=0 chnl=15
+char id=339 x=2140 y=642 width=154 height=94 xoffset=5 yoffset=68 xadvance=159 page=0 chnl=15
+char id=350 x=2306 y=642 width=102 height=162 xoffset=4 yoffset=38 xadvance=110 page=0 chnl=15
+char id=351 x=2420 y=642 width=89 height=132 xoffset=4 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1028 x=2521 y=642 width=105 height=124 xoffset=7 yoffset=38 xadvance=118 page=0 chnl=15
+char id=1030 x=2638 y=642 width=34 height=121 xoffset=7 yoffset=39 xadvance=48 page=0 chnl=15
+char id=1040 x=2684 y=642 width=125 height=121 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15
+char id=1041 x=2821 y=642 width=97 height=121 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1042 x=2930 y=642 width=100 height=121 xoffset=7 yoffset=39 xadvance=110 page=0 chnl=15
+char id=1043 x=3042 y=642 width=86 height=121 xoffset=7 yoffset=39 xadvance=96 page=0 chnl=15
+char id=1044 x=3140 y=642 width=128 height=150 xoffset=3 yoffset=39 xadvance=134 page=0 chnl=15
+char id=1045 x=3280 y=642 width=88 height=121 xoffset=7 yoffset=39 xadvance=102 page=0 chnl=15
+char id=1046 x=3380 y=642 width=186 height=121 xoffset=4 yoffset=39 xadvance=194 page=0 chnl=15
+char id=1047 x=3578 y=642 width=100 height=124 xoffset=6 yoffset=38 xadvance=111 page=0 chnl=15
+char id=1048 x=3690 y=642 width=105 height=121 xoffset=7 yoffset=39 xadvance=119 page=0 chnl=15
+char id=1049 x=3807 y=642 width=105 height=153 xoffset=7 yoffset=7 xadvance=119 page=0 chnl=15
+char id=1050 x=3924 y=642 width=124 height=121 xoffset=7 yoffset=39 xadvance=131 page=0 chnl=15
+char id=1051 x=6 y=854 width=112 height=121 xoffset=3 yoffset=39 xadvance=122 page=0 chnl=15
+char id=1052 x=130 y=854 width=140 height=121 xoffset=7 yoffset=39 xadvance=153 page=0 chnl=15
+char id=1053 x=282 y=854 width=110 height=121 xoffset=7 yoffset=39 xadvance=123 page=0 chnl=15
+char id=1054 x=404 y=854 width=118 height=124 xoffset=7 yoffset=38 xadvance=131 page=0 chnl=15
+char id=1055 x=534 y=854 width=106 height=121 xoffset=13 yoffset=39 xadvance=131 page=0 chnl=15
+char id=1056 x=652 y=854 width=98 height=121 xoffset=7 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1057 x=762 y=854 width=113 height=124 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15
+char id=1058 x=887 y=854 width=105 height=121 xoffset=4 yoffset=39 xadvance=113 page=0 chnl=15
+char id=1059 x=1004 y=854 width=112 height=123 xoffset=2 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1060 x=1128 y=854 width=137 height=128 xoffset=7 yoffset=37 xadvance=150 page=0 chnl=15
+char id=1062 x=1277 y=854 width=126 height=150 xoffset=7 yoffset=39 xadvance=135 page=0 chnl=15
+char id=1063 x=1415 y=854 width=103 height=121 xoffset=15 yoffset=39 xadvance=131 page=0 chnl=15
+char id=1065 x=1530 y=854 width=168 height=150 xoffset=15 yoffset=39 xadvance=185 page=0 chnl=15
+char id=1068 x=1710 y=854 width=96 height=121 xoffset=8 yoffset=39 xadvance=114 page=0 chnl=15
+char id=1070 x=1818 y=854 width=166 height=124 xoffset=7 yoffset=38 xadvance=164 page=0 chnl=15
+char id=1071 x=1996 y=854 width=101 height=121 xoffset=2 yoffset=39 xadvance=110 page=0 chnl=15
+char id=1072 x=2109 y=854 width=88 height=94 xoffset=3 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1073 x=2209 y=854 width=94 height=125 xoffset=5 yoffset=37 xadvance=104 page=0 chnl=15
+char id=1074 x=2315 y=854 width=85 height=91 xoffset=8 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1075 x=2412 y=854 width=66 height=91 xoffset=8 yoffset=69 xadvance=77 page=0 chnl=15
+char id=1076 x=2490 y=854 width=111 height=118 xoffset=2 yoffset=69 xadvance=115 page=0 chnl=15
+char id=1077 x=2613 y=854 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15
+char id=1078 x=2717 y=854 width=147 height=91 xoffset=2 yoffset=69 xadvance=150 page=0 chnl=15
+char id=1079 x=2876 y=854 width=83 height=94 xoffset=4 yoffset=68 xadvance=90 page=0 chnl=15
+char id=1080 x=2971 y=854 width=87 height=91 xoffset=8 yoffset=69 xadvance=102 page=0 chnl=15
+char id=1081 x=3070 y=854 width=87 height=123 xoffset=8 yoffset=37 xadvance=102 page=0 chnl=15
+char id=1082 x=3169 y=854 width=95 height=91 xoffset=8 yoffset=69 xadvance=102 page=0 chnl=15
+char id=1083 x=3276 y=854 width=91 height=91 xoffset=4 yoffset=69 xadvance=101 page=0 chnl=15
+char id=1084 x=3379 y=854 width=114 height=91 xoffset=8 yoffset=69 xadvance=128 page=0 chnl=15
+char id=1085 x=3505 y=854 width=84 height=91 xoffset=8 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1086 x=3601 y=854 width=95 height=94 xoffset=4 yoffset=68 xadvance=103 page=0 chnl=15
+char id=1087 x=3708 y=854 width=85 height=91 xoffset=8 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1088 x=3805 y=854 width=94 height=126 xoffset=8 yoffset=68 xadvance=107 page=0 chnl=15
+char id=1089 x=3911 y=854 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15
+char id=1090 x=6 y=1066 width=89 height=91 xoffset=3 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1091 x=107 y=1066 width=100 height=125 xoffset=0 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1092 x=219 y=1066 width=135 height=152 xoffset=4 yoffset=39 xadvance=143 page=0 chnl=15
+char id=1093 x=366 y=1066 width=95 height=91 xoffset=2 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1094 x=473 y=1066 width=116 height=120 xoffset=8 yoffset=69 xadvance=126 page=0 chnl=15
+char id=1095 x=601 y=1066 width=85 height=91 xoffset=8 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1096 x=698 y=1066 width=132 height=91 xoffset=8 yoffset=69 xadvance=146 page=0 chnl=15
+char id=1097 x=842 y=1066 width=155 height=117 xoffset=8 yoffset=69 xadvance=165 page=0 chnl=15
+char id=1100 x=1009 y=1066 width=88 height=91 xoffset=8 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1102 x=1109 y=1066 width=131 height=94 xoffset=4 yoffset=68 xadvance=139 page=0 chnl=15
+char id=1103 x=1252 y=1066 width=87 height=91 xoffset=4 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1108 x=1351 y=1066 width=90 height=94 xoffset=7 yoffset=68 xadvance=100 page=0 chnl=15
+char id=1110 x=1453 y=1066 width=33 height=130 xoffset=8 yoffset=30 xadvance=48 page=0 chnl=15
+char id=1111 x=1498 y=1066 width=67 height=128 xoffset=-9 yoffset=32 xadvance=48 page=0 chnl=15
+char id=8209 x=1577 y=1066 width=57 height=26 xoffset=18 yoffset=99 xadvance=88 page=0 chnl=15
+char id=8211 x=1646 y=1066 width=83 height=26 xoffset=0 yoffset=99 xadvance=82 page=0 chnl=15
+char id=8220 x=1741 y=1066 width=60 height=45 xoffset=9 yoffset=33 xadvance=74 page=0 chnl=15
+char id=8222 x=1813 y=1066 width=59 height=46 xoffset=5 yoffset=144 xadvance=73 page=0 chnl=15
+char id=8226 x=1884 y=1066 width=52 height=52 xoffset=7 yoffset=86 xadvance=65 page=0 chnl=15
+char id=8364 x=1948 y=1066 width=103 height=124 xoffset=5 yoffset=38 xadvance=115 page=0 chnl=15
+char id=8627 x=2063 y=1066 width=139 height=112 xoffset=16 yoffset=39 xadvance=170 page=0 chnl=15
+char id=8679 x=2214 y=1066 width=170 height=130 xoffset=11 yoffset=30 xadvance=191 page=0 chnl=15
+char id=9003 x=2396 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=2581 y=1066 width=110 height=41 xoffset=10 yoffset=148 xadvance=130 page=0 chnl=15
+char id=9654 x=2703 y=1066 width=135 height=152 xoffset=18 yoffset=24 xadvance=162 page=0 chnl=15
+char id=9664 x=2850 y=1066 width=135 height=152 xoffset=9 yoffset=24 xadvance=162 page=0 chnl=15
+char id=9675 x=2997 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=3134 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=3271 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=3283 y=1066 width=127 height=101 xoffset=14 yoffset=57 xadvance=145 page=0 chnl=15
+char id=10004 x=3422 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=3434 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=3446 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=3458 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=3470 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-Black.png b/selfdrive/assets/fonts/Inter-Black.png
new file mode 100644
index 000000000..954688fec
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Black.png differ
diff --git a/selfdrive/assets/fonts/Inter-Black.ttf b/selfdrive/assets/fonts/Inter-Black.ttf
new file mode 100644
index 000000000..565375773
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Black.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-Bold.fnt b/selfdrive/assets/fonts/Inter-Bold.fnt
new file mode 100644
index 000000000..9bb51fd59
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-Bold.fnt
@@ -0,0 +1,231 @@
+info face="Inter-Bold" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-Bold.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=38 height=200 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15
+char id=33 x=68 y=6 width=29 height=123 xoffset=12 yoffset=39 xadvance=53 page=0 chnl=15
+char id=34 x=109 y=6 width=49 height=47 xoffset=8 yoffset=39 xadvance=64 page=0 chnl=15
+char id=35 x=170 y=6 width=105 height=121 xoffset=1 yoffset=39 xadvance=107 page=0 chnl=15
+char id=36 x=287 y=6 width=96 height=152 xoffset=6 yoffset=24 xadvance=108 page=0 chnl=15
+char id=37 x=395 y=6 width=116 height=130 xoffset=13 yoffset=35 xadvance=142 page=0 chnl=15
+char id=38 x=523 y=6 width=105 height=124 xoffset=6 yoffset=38 xadvance=111 page=0 chnl=15
+char id=39 x=640 y=6 width=19 height=47 xoffset=8 yoffset=39 xadvance=34 page=0 chnl=15
+char id=40 x=671 y=6 width=49 height=150 xoffset=15 yoffset=37 xadvance=67 page=0 chnl=15
+char id=41 x=732 y=6 width=49 height=150 xoffset=4 yoffset=37 xadvance=67 page=0 chnl=15
+char id=42 x=793 y=6 width=67 height=69 xoffset=13 yoffset=39 xadvance=93 page=0 chnl=15
+char id=43 x=872 y=6 width=84 height=84 xoffset=14 yoffset=70 xadvance=112 page=0 chnl=15
+char id=44 x=968 y=6 width=29 height=47 xoffset=9 yoffset=143 xadvance=50 page=0 chnl=15
+char id=45 x=1009 y=6 width=56 height=21 xoffset=11 yoffset=100 xadvance=77 page=0 chnl=15
+char id=46 x=1077 y=6 width=29 height=29 xoffset=10 yoffset=133 xadvance=49 page=0 chnl=15
+char id=47 x=1118 y=6 width=61 height=145 xoffset=2 yoffset=34 xadvance=64 page=0 chnl=15
+char id=48 x=1191 y=6 width=98 height=125 xoffset=8 yoffset=38 xadvance=113 page=0 chnl=15
+char id=49 x=1301 y=6 width=55 height=121 xoffset=8 yoffset=39 xadvance=80 page=0 chnl=15
+char id=50 x=1368 y=6 width=88 height=122 xoffset=8 yoffset=38 xadvance=104 page=0 chnl=15
+char id=51 x=1468 y=6 width=93 height=124 xoffset=8 yoffset=38 xadvance=108 page=0 chnl=15
+char id=52 x=1573 y=6 width=98 height=121 xoffset=7 yoffset=39 xadvance=112 page=0 chnl=15
+char id=53 x=1683 y=6 width=89 height=123 xoffset=10 yoffset=39 xadvance=106 page=0 chnl=15
+char id=54 x=1784 y=6 width=94 height=125 xoffset=7 yoffset=37 xadvance=109 page=0 chnl=15
+char id=55 x=1890 y=6 width=85 height=121 xoffset=6 yoffset=39 xadvance=98 page=0 chnl=15
+char id=56 x=1987 y=6 width=95 height=124 xoffset=7 yoffset=38 xadvance=109 page=0 chnl=15
+char id=57 x=2094 y=6 width=94 height=125 xoffset=8 yoffset=37 xadvance=109 page=0 chnl=15
+char id=58 x=2200 y=6 width=29 height=92 xoffset=10 yoffset=70 xadvance=49 page=0 chnl=15
+char id=59 x=2241 y=6 width=32 height=120 xoffset=9 yoffset=70 xadvance=49 page=0 chnl=15
+char id=60 x=2285 y=6 width=84 height=94 xoffset=14 yoffset=65 xadvance=112 page=0 chnl=15
+char id=61 x=2381 y=6 width=82 height=60 xoffset=15 yoffset=82 xadvance=112 page=0 chnl=15
+char id=62 x=2475 y=6 width=84 height=94 xoffset=14 yoffset=65 xadvance=112 page=0 chnl=15
+char id=63 x=2571 y=6 width=80 height=124 xoffset=6 yoffset=38 xadvance=92 page=0 chnl=15
+char id=64 x=2663 y=6 width=155 height=155 xoffset=9 yoffset=40 xadvance=170 page=0 chnl=15
+char id=65 x=2830 y=6 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15
+char id=66 x=2959 y=6 width=94 height=121 xoffset=10 yoffset=39 xadvance=109 page=0 chnl=15
+char id=67 x=3065 y=6 width=109 height=124 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15
+char id=68 x=3186 y=6 width=102 height=121 xoffset=10 yoffset=39 xadvance=120 page=0 chnl=15
+char id=69 x=3300 y=6 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15
+char id=70 x=3394 y=6 width=81 height=121 xoffset=10 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3487 y=6 width=110 height=124 xoffset=8 yoffset=38 xadvance=125 page=0 chnl=15
+char id=72 x=3609 y=6 width=103 height=121 xoffset=10 yoffset=39 xadvance=123 page=0 chnl=15
+char id=73 x=3724 y=6 width=26 height=121 xoffset=10 yoffset=39 xadvance=46 page=0 chnl=15
+char id=74 x=3762 y=6 width=81 height=123 xoffset=3 yoffset=39 xadvance=94 page=0 chnl=15
+char id=75 x=3855 y=6 width=102 height=121 xoffset=10 yoffset=39 xadvance=113 page=0 chnl=15
+char id=76 x=3969 y=6 width=78 height=121 xoffset=10 yoffset=39 xadvance=93 page=0 chnl=15
+char id=77 x=6 y=218 width=131 height=121 xoffset=10 yoffset=39 xadvance=151 page=0 chnl=15
+char id=78 x=149 y=218 width=101 height=121 xoffset=10 yoffset=39 xadvance=121 page=0 chnl=15
+char id=79 x=262 y=218 width=113 height=124 xoffset=8 yoffset=38 xadvance=129 page=0 chnl=15
+char id=80 x=387 y=218 width=91 height=121 xoffset=10 yoffset=39 xadvance=107 page=0 chnl=15
+char id=81 x=490 y=218 width=113 height=132 xoffset=8 yoffset=38 xadvance=129 page=0 chnl=15
+char id=82 x=615 y=218 width=96 height=121 xoffset=10 yoffset=39 xadvance=108 page=0 chnl=15
+char id=83 x=723 y=218 width=96 height=124 xoffset=6 yoffset=38 xadvance=108 page=0 chnl=15
+char id=84 x=831 y=218 width=100 height=121 xoffset=5 yoffset=39 xadvance=110 page=0 chnl=15
+char id=85 x=943 y=218 width=101 height=123 xoffset=10 yoffset=39 xadvance=120 page=0 chnl=15
+char id=86 x=1056 y=218 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15
+char id=87 x=1185 y=218 width=166 height=121 xoffset=3 yoffset=39 xadvance=171 page=0 chnl=15
+char id=88 x=1363 y=218 width=110 height=121 xoffset=4 yoffset=39 xadvance=118 page=0 chnl=15
+char id=89 x=1485 y=218 width=114 height=121 xoffset=3 yoffset=39 xadvance=119 page=0 chnl=15
+char id=90 x=1611 y=218 width=93 height=121 xoffset=9 yoffset=39 xadvance=110 page=0 chnl=15
+char id=91 x=1716 y=218 width=47 height=150 xoffset=17 yoffset=37 xadvance=67 page=0 chnl=15
+char id=92 x=1775 y=218 width=61 height=145 xoffset=2 yoffset=34 xadvance=64 page=0 chnl=15
+char id=93 x=1848 y=218 width=48 height=150 xoffset=3 yoffset=37 xadvance=67 page=0 chnl=15
+char id=94 x=1908 y=218 width=71 height=53 xoffset=5 yoffset=42 xadvance=80 page=0 chnl=15
+char id=95 x=1991 y=218 width=80 height=19 xoffset=-1 yoffset=160 xadvance=78 page=0 chnl=15
+char id=96 x=2083 y=218 width=36 height=28 xoffset=23 yoffset=31 xadvance=82 page=0 chnl=15
+char id=97 x=2131 y=218 width=82 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15
+char id=98 x=2225 y=218 width=89 height=123 xoffset=10 yoffset=39 xadvance=104 page=0 chnl=15
+char id=99 x=2326 y=218 width=85 height=94 xoffset=6 yoffset=68 xadvance=97 page=0 chnl=15
+char id=100 x=2423 y=218 width=89 height=123 xoffset=6 yoffset=39 xadvance=104 page=0 chnl=15
+char id=101 x=2524 y=218 width=87 height=94 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15
+char id=102 x=2623 y=218 width=61 height=126 xoffset=2 yoffset=34 xadvance=63 page=0 chnl=15
+char id=103 x=2696 y=218 width=89 height=128 xoffset=6 yoffset=68 xadvance=104 page=0 chnl=15
+char id=104 x=2797 y=218 width=85 height=121 xoffset=9 yoffset=39 xadvance=103 page=0 chnl=15
+char id=105 x=2894 y=218 width=28 height=128 xoffset=9 yoffset=32 xadvance=44 page=0 chnl=15
+char id=106 x=2934 y=218 width=41 height=162 xoffset=-5 yoffset=32 xadvance=44 page=0 chnl=15
+char id=107 x=2987 y=218 width=87 height=121 xoffset=9 yoffset=39 xadvance=96 page=0 chnl=15
+char id=108 x=3086 y=218 width=26 height=121 xoffset=9 yoffset=39 xadvance=44 page=0 chnl=15
+char id=109 x=3124 y=218 width=132 height=92 xoffset=9 yoffset=68 xadvance=150 page=0 chnl=15
+char id=110 x=3268 y=218 width=85 height=92 xoffset=9 yoffset=68 xadvance=102 page=0 chnl=15
+char id=111 x=3365 y=218 width=90 height=94 xoffset=6 yoffset=68 xadvance=101 page=0 chnl=15
+char id=112 x=3467 y=218 width=89 height=126 xoffset=9 yoffset=68 xadvance=104 page=0 chnl=15
+char id=113 x=3568 y=218 width=89 height=126 xoffset=6 yoffset=68 xadvance=104 page=0 chnl=15
+char id=114 x=3669 y=218 width=56 height=92 xoffset=9 yoffset=68 xadvance=67 page=0 chnl=15
+char id=115 x=3737 y=218 width=83 height=94 xoffset=5 yoffset=68 xadvance=92 page=0 chnl=15
+char id=116 x=3832 y=218 width=57 height=114 xoffset=3 yoffset=48 xadvance=64 page=0 chnl=15
+char id=117 x=3901 y=218 width=84 height=93 xoffset=9 yoffset=69 xadvance=102 page=0 chnl=15
+char id=118 x=6 y=430 width=93 height=91 xoffset=2 yoffset=69 xadvance=96 page=0 chnl=15
+char id=119 x=111 y=430 width=135 height=91 xoffset=3 yoffset=69 xadvance=140 page=0 chnl=15
+char id=120 x=258 y=430 width=87 height=91 xoffset=4 yoffset=69 xadvance=94 page=0 chnl=15
+char id=121 x=357 y=430 width=93 height=125 xoffset=2 yoffset=69 xadvance=96 page=0 chnl=15
+char id=122 x=462 y=430 width=77 height=91 xoffset=9 yoffset=69 xadvance=94 page=0 chnl=15
+char id=123 x=551 y=430 width=59 height=150 xoffset=5 yoffset=37 xadvance=67 page=0 chnl=15
+char id=124 x=622 y=430 width=24 height=198 xoffset=19 yoffset=1 xadvance=61 page=0 chnl=15
+char id=125 x=658 y=430 width=60 height=150 xoffset=3 yoffset=37 xadvance=67 page=0 chnl=15
+char id=126 x=730 y=430 width=89 height=38 xoffset=12 yoffset=93 xadvance=112 page=0 chnl=15
+char id=163 x=831 y=430 width=89 height=122 xoffset=11 yoffset=38 xadvance=110 page=0 chnl=15
+char id=165 x=932 y=430 width=91 height=121 xoffset=2 yoffset=39 xadvance=94 page=0 chnl=15
+char id=167 x=1035 y=430 width=82 height=147 xoffset=8 yoffset=38 xadvance=98 page=0 chnl=15
+char id=171 x=1129 y=430 width=86 height=73 xoffset=9 yoffset=75 xadvance=103 page=0 chnl=15
+char id=176 x=1227 y=430 width=58 height=59 xoffset=9 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=1297 y=430 width=86 height=73 xoffset=8 yoffset=75 xadvance=103 page=0 chnl=15
+char id=191 x=1395 y=430 width=80 height=124 xoffset=7 yoffset=69 xadvance=92 page=0 chnl=15
+char id=192 x=1487 y=430 width=117 height=159 xoffset=3 yoffset=1 xadvance=123 page=0 chnl=15
+char id=193 x=1616 y=430 width=117 height=159 xoffset=3 yoffset=1 xadvance=123 page=0 chnl=15
+char id=195 x=1745 y=430 width=117 height=156 xoffset=3 yoffset=4 xadvance=123 page=0 chnl=15
+char id=196 x=1874 y=430 width=117 height=157 xoffset=3 yoffset=3 xadvance=123 page=0 chnl=15
+char id=199 x=2003 y=430 width=109 height=161 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15
+char id=201 x=2124 y=430 width=82 height=159 xoffset=10 yoffset=1 xadvance=101 page=0 chnl=15
+char id=202 x=2218 y=430 width=82 height=158 xoffset=10 yoffset=2 xadvance=101 page=0 chnl=15
+char id=205 x=2312 y=430 width=40 height=159 xoffset=10 yoffset=1 xadvance=46 page=0 chnl=15
+char id=209 x=2364 y=430 width=101 height=155 xoffset=10 yoffset=5 xadvance=121 page=0 chnl=15
+char id=211 x=2477 y=430 width=113 height=161 xoffset=8 yoffset=1 xadvance=129 page=0 chnl=15
+char id=212 x=2602 y=430 width=113 height=160 xoffset=8 yoffset=2 xadvance=129 page=0 chnl=15
+char id=214 x=2727 y=430 width=113 height=159 xoffset=8 yoffset=3 xadvance=129 page=0 chnl=15
+char id=215 x=2852 y=430 width=86 height=86 xoffset=13 yoffset=69 xadvance=112 page=0 chnl=15
+char id=220 x=2950 y=430 width=101 height=159 xoffset=10 yoffset=3 xadvance=120 page=0 chnl=15
+char id=223 x=3063 y=430 width=93 height=122 xoffset=10 yoffset=38 xadvance=109 page=0 chnl=15
+char id=224 x=3168 y=430 width=82 height=131 xoffset=5 yoffset=31 xadvance=95 page=0 chnl=15
+char id=225 x=3262 y=430 width=82 height=131 xoffset=5 yoffset=31 xadvance=95 page=0 chnl=15
+char id=226 x=3356 y=430 width=82 height=130 xoffset=5 yoffset=32 xadvance=95 page=0 chnl=15
+char id=227 x=3450 y=430 width=82 height=127 xoffset=5 yoffset=35 xadvance=95 page=0 chnl=15
+char id=228 x=3544 y=430 width=82 height=129 xoffset=5 yoffset=33 xadvance=95 page=0 chnl=15
+char id=231 x=3638 y=430 width=85 height=131 xoffset=6 yoffset=68 xadvance=97 page=0 chnl=15
+char id=232 x=3735 y=430 width=87 height=131 xoffset=6 yoffset=31 xadvance=98 page=0 chnl=15
+char id=233 x=3834 y=430 width=87 height=131 xoffset=6 yoffset=31 xadvance=98 page=0 chnl=15
+char id=234 x=3933 y=430 width=87 height=130 xoffset=6 yoffset=32 xadvance=98 page=0 chnl=15
+char id=237 x=4032 y=430 width=41 height=129 xoffset=9 yoffset=31 xadvance=44 page=0 chnl=15
+char id=238 x=6 y=642 width=67 height=128 xoffset=-11 yoffset=32 xadvance=44 page=0 chnl=15
+char id=241 x=85 y=642 width=85 height=125 xoffset=9 yoffset=35 xadvance=102 page=0 chnl=15
+char id=243 x=182 y=642 width=90 height=131 xoffset=6 yoffset=31 xadvance=101 page=0 chnl=15
+char id=244 x=284 y=642 width=90 height=130 xoffset=6 yoffset=32 xadvance=101 page=0 chnl=15
+char id=245 x=386 y=642 width=90 height=127 xoffset=6 yoffset=35 xadvance=101 page=0 chnl=15
+char id=246 x=488 y=642 width=90 height=129 xoffset=6 yoffset=33 xadvance=101 page=0 chnl=15
+char id=249 x=590 y=642 width=84 height=131 xoffset=9 yoffset=31 xadvance=102 page=0 chnl=15
+char id=250 x=686 y=642 width=84 height=131 xoffset=9 yoffset=31 xadvance=102 page=0 chnl=15
+char id=251 x=782 y=642 width=84 height=130 xoffset=9 yoffset=32 xadvance=102 page=0 chnl=15
+char id=252 x=878 y=642 width=84 height=129 xoffset=9 yoffset=33 xadvance=102 page=0 chnl=15
+char id=286 x=974 y=642 width=110 height=154 xoffset=8 yoffset=8 xadvance=125 page=0 chnl=15
+char id=287 x=1096 y=642 width=89 height=158 xoffset=6 yoffset=38 xadvance=104 page=0 chnl=15
+char id=304 x=1197 y=642 width=28 height=158 xoffset=9 yoffset=2 xadvance=46 page=0 chnl=15
+char id=305 x=1237 y=642 width=26 height=91 xoffset=9 yoffset=69 xadvance=44 page=0 chnl=15
+char id=339 x=1275 y=642 width=152 height=94 xoffset=6 yoffset=68 xadvance=161 page=0 chnl=15
+char id=350 x=1439 y=642 width=96 height=161 xoffset=6 yoffset=38 xadvance=108 page=0 chnl=15
+char id=351 x=1547 y=642 width=83 height=131 xoffset=5 yoffset=68 xadvance=92 page=0 chnl=15
+char id=1028 x=1642 y=642 width=100 height=124 xoffset=8 yoffset=38 xadvance=115 page=0 chnl=15
+char id=1030 x=1754 y=642 width=26 height=121 xoffset=10 yoffset=39 xadvance=46 page=0 chnl=15
+char id=1040 x=1792 y=642 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15
+char id=1041 x=1921 y=642 width=92 height=121 xoffset=10 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1042 x=2025 y=642 width=94 height=121 xoffset=10 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1043 x=2131 y=642 width=81 height=121 xoffset=10 yoffset=39 xadvance=96 page=0 chnl=15
+char id=1044 x=2224 y=642 width=123 height=150 xoffset=3 yoffset=39 xadvance=130 page=0 chnl=15
+char id=1045 x=2359 y=642 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15
+char id=1046 x=2453 y=642 width=171 height=121 xoffset=4 yoffset=39 xadvance=179 page=0 chnl=15
+char id=1047 x=2636 y=642 width=93 height=124 xoffset=8 yoffset=38 xadvance=108 page=0 chnl=15
+char id=1048 x=2741 y=642 width=101 height=121 xoffset=10 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1049 x=2854 y=642 width=101 height=152 xoffset=10 yoffset=8 xadvance=121 page=0 chnl=15
+char id=1050 x=2967 y=642 width=109 height=121 xoffset=10 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1051 x=3088 y=642 width=108 height=121 xoffset=3 yoffset=39 xadvance=120 page=0 chnl=15
+char id=1052 x=3208 y=642 width=131 height=121 xoffset=10 yoffset=39 xadvance=151 page=0 chnl=15
+char id=1053 x=3351 y=642 width=103 height=121 xoffset=10 yoffset=39 xadvance=123 page=0 chnl=15
+char id=1054 x=3466 y=642 width=113 height=124 xoffset=8 yoffset=38 xadvance=129 page=0 chnl=15
+char id=1055 x=3591 y=642 width=100 height=121 xoffset=13 yoffset=39 xadvance=126 page=0 chnl=15
+char id=1056 x=3703 y=642 width=91 height=121 xoffset=10 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1057 x=3806 y=642 width=109 height=124 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15
+char id=1058 x=3927 y=642 width=100 height=121 xoffset=5 yoffset=39 xadvance=110 page=0 chnl=15
+char id=1059 x=6 y=854 width=105 height=123 xoffset=3 yoffset=39 xadvance=110 page=0 chnl=15
+char id=1060 x=123 y=854 width=127 height=128 xoffset=8 yoffset=37 xadvance=142 page=0 chnl=15
+char id=1062 x=262 y=854 width=117 height=150 xoffset=10 yoffset=39 xadvance=131 page=0 chnl=15
+char id=1063 x=391 y=854 width=97 height=121 xoffset=15 yoffset=39 xadvance=126 page=0 chnl=15
+char id=1065 x=500 y=854 width=157 height=150 xoffset=15 yoffset=39 xadvance=176 page=0 chnl=15
+char id=1068 x=669 y=854 width=93 height=121 xoffset=10 yoffset=39 xadvance=111 page=0 chnl=15
+char id=1070 x=774 y=854 width=157 height=124 xoffset=10 yoffset=38 xadvance=165 page=0 chnl=15
+char id=1071 x=943 y=854 width=96 height=121 xoffset=3 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1072 x=1051 y=854 width=82 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1073 x=1145 y=854 width=89 height=126 xoffset=6 yoffset=36 xadvance=101 page=0 chnl=15
+char id=1074 x=1246 y=854 width=81 height=91 xoffset=9 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1075 x=1339 y=854 width=63 height=91 xoffset=9 yoffset=69 xadvance=76 page=0 chnl=15
+char id=1076 x=1414 y=854 width=105 height=118 xoffset=2 yoffset=69 xadvance=110 page=0 chnl=15
+char id=1077 x=1531 y=854 width=87 height=94 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15
+char id=1078 x=1630 y=854 width=137 height=91 xoffset=4 yoffset=69 xadvance=145 page=0 chnl=15
+char id=1079 x=1779 y=854 width=77 height=94 xoffset=5 yoffset=68 xadvance=87 page=0 chnl=15
+char id=1080 x=1868 y=854 width=82 height=91 xoffset=9 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1081 x=1962 y=854 width=82 height=122 xoffset=9 yoffset=38 xadvance=100 page=0 chnl=15
+char id=1082 x=2056 y=854 width=88 height=91 xoffset=9 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1083 x=2156 y=854 width=87 height=91 xoffset=4 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1084 x=2255 y=854 width=109 height=91 xoffset=9 yoffset=69 xadvance=126 page=0 chnl=15
+char id=1085 x=2376 y=854 width=80 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1086 x=2468 y=854 width=90 height=94 xoffset=6 yoffset=68 xadvance=101 page=0 chnl=15
+char id=1087 x=2570 y=854 width=80 height=91 xoffset=9 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1088 x=2662 y=854 width=89 height=126 xoffset=9 yoffset=68 xadvance=104 page=0 chnl=15
+char id=1089 x=2763 y=854 width=85 height=94 xoffset=6 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1090 x=2860 y=854 width=82 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1091 x=2954 y=854 width=93 height=125 xoffset=2 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1092 x=3059 y=854 width=119 height=152 xoffset=6 yoffset=39 xadvance=131 page=0 chnl=15
+char id=1093 x=3190 y=854 width=87 height=91 xoffset=4 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1094 x=3289 y=854 width=105 height=120 xoffset=9 yoffset=69 xadvance=118 page=0 chnl=15
+char id=1095 x=3406 y=854 width=80 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1096 x=3498 y=854 width=124 height=91 xoffset=9 yoffset=69 xadvance=141 page=0 chnl=15
+char id=1097 x=3634 y=854 width=143 height=117 xoffset=9 yoffset=69 xadvance=156 page=0 chnl=15
+char id=1100 x=3789 y=854 width=82 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1102 x=3883 y=854 width=126 height=94 xoffset=5 yoffset=68 xadvance=137 page=0 chnl=15
+char id=1103 x=6 y=1066 width=82 height=91 xoffset=5 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1108 x=100 y=1066 width=85 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1110 x=197 y=1066 width=28 height=128 xoffset=9 yoffset=32 xadvance=44 page=0 chnl=15
+char id=1111 x=237 y=1066 width=61 height=127 xoffset=-8 yoffset=33 xadvance=44 page=0 chnl=15
+char id=8209 x=310 y=1066 width=56 height=21 xoffset=12 yoffset=100 xadvance=76 page=0 chnl=15
+char id=8211 x=378 y=1066 width=83 height=21 xoffset=0 yoffset=100 xadvance=82 page=0 chnl=15
+char id=8220 x=473 y=1066 width=56 height=44 xoffset=9 yoffset=34 xadvance=69 page=0 chnl=15
+char id=8222 x=541 y=1066 width=57 height=44 xoffset=4 yoffset=144 xadvance=69 page=0 chnl=15
+char id=8226 x=610 y=1066 width=53 height=52 xoffset=12 yoffset=86 xadvance=76 page=0 chnl=15
+char id=8364 x=675 y=1066 width=101 height=124 xoffset=4 yoffset=38 xadvance=113 page=0 chnl=15
+char id=8627 x=788 y=1066 width=136 height=109 xoffset=16 yoffset=39 xadvance=167 page=0 chnl=15
+char id=8679 x=936 y=1066 width=158 height=130 xoffset=12 yoffset=30 xadvance=182 page=0 chnl=15
+char id=9003 x=1106 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=1291 y=1066 width=104 height=40 xoffset=11 yoffset=148 xadvance=126 page=0 chnl=15
+char id=9654 x=1407 y=1066 width=132 height=152 xoffset=17 yoffset=24 xadvance=157 page=0 chnl=15
+char id=9664 x=1551 y=1066 width=132 height=152 xoffset=9 yoffset=24 xadvance=157 page=0 chnl=15
+char id=9675 x=1695 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=1832 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=1969 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=1981 y=1066 width=122 height=94 xoffset=15 yoffset=59 xadvance=145 page=0 chnl=15
+char id=10004 x=2115 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=2127 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=2139 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=2151 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=2163 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-Bold.png b/selfdrive/assets/fonts/Inter-Bold.png
new file mode 100644
index 000000000..cf7623b3a
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Bold.png differ
diff --git a/selfdrive/assets/fonts/Inter-Bold.ttf b/selfdrive/assets/fonts/Inter-Bold.ttf
new file mode 100644
index 000000000..e98b84ce8
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Bold.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-ExtraBold.fnt b/selfdrive/assets/fonts/Inter-ExtraBold.fnt
new file mode 100644
index 000000000..60072f285
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-ExtraBold.fnt
@@ -0,0 +1,231 @@
+info face="Inter-ExtraBold" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-ExtraBold.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=35 height=200 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=15
+char id=33 x=65 y=6 width=32 height=123 xoffset=12 yoffset=39 xadvance=56 page=0 chnl=15
+char id=34 x=109 y=6 width=50 height=48 xoffset=7 yoffset=39 xadvance=64 page=0 chnl=15
+char id=35 x=171 y=6 width=107 height=121 xoffset=1 yoffset=39 xadvance=108 page=0 chnl=15
+char id=36 x=290 y=6 width=99 height=152 xoffset=5 yoffset=24 xadvance=109 page=0 chnl=15
+char id=37 x=401 y=6 width=119 height=132 xoffset=13 yoffset=34 xadvance=144 page=0 chnl=15
+char id=38 x=532 y=6 width=109 height=124 xoffset=5 yoffset=38 xadvance=113 page=0 chnl=15
+char id=39 x=653 y=6 width=20 height=48 xoffset=7 yoffset=39 xadvance=33 page=0 chnl=15
+char id=40 x=685 y=6 width=53 height=149 xoffset=14 yoffset=38 xadvance=70 page=0 chnl=15
+char id=41 x=750 y=6 width=53 height=149 xoffset=3 yoffset=38 xadvance=70 page=0 chnl=15
+char id=42 x=815 y=6 width=69 height=69 xoffset=14 yoffset=39 xadvance=96 page=0 chnl=15
+char id=43 x=896 y=6 width=86 height=86 xoffset=14 yoffset=69 xadvance=113 page=0 chnl=15
+char id=44 x=994 y=6 width=31 height=47 xoffset=8 yoffset=143 xadvance=51 page=0 chnl=15
+char id=45 x=1037 y=6 width=56 height=23 xoffset=11 yoffset=100 xadvance=77 page=0 chnl=15
+char id=46 x=1105 y=6 width=32 height=31 xoffset=9 yoffset=131 xadvance=50 page=0 chnl=15
+char id=47 x=1149 y=6 width=64 height=145 xoffset=1 yoffset=34 xadvance=66 page=0 chnl=15
+char id=48 x=1225 y=6 width=103 height=125 xoffset=7 yoffset=38 xadvance=117 page=0 chnl=15
+char id=49 x=1340 y=6 width=58 height=121 xoffset=7 yoffset=39 xadvance=82 page=0 chnl=15
+char id=50 x=1410 y=6 width=91 height=122 xoffset=7 yoffset=38 xadvance=105 page=0 chnl=15
+char id=51 x=1513 y=6 width=96 height=124 xoffset=7 yoffset=38 xadvance=110 page=0 chnl=15
+char id=52 x=1621 y=6 width=101 height=121 xoffset=7 yoffset=39 xadvance=113 page=0 chnl=15
+char id=53 x=1734 y=6 width=93 height=123 xoffset=9 yoffset=39 xadvance=108 page=0 chnl=15
+char id=54 x=1839 y=6 width=98 height=125 xoffset=6 yoffset=37 xadvance=111 page=0 chnl=15
+char id=55 x=1949 y=6 width=88 height=121 xoffset=5 yoffset=39 xadvance=99 page=0 chnl=15
+char id=56 x=2049 y=6 width=98 height=124 xoffset=7 yoffset=38 xadvance=111 page=0 chnl=15
+char id=57 x=2159 y=6 width=98 height=125 xoffset=7 yoffset=37 xadvance=111 page=0 chnl=15
+char id=58 x=2269 y=6 width=32 height=93 xoffset=9 yoffset=69 xadvance=50 page=0 chnl=15
+char id=59 x=2313 y=6 width=35 height=121 xoffset=8 yoffset=69 xadvance=50 page=0 chnl=15
+char id=60 x=2360 y=6 width=86 height=97 xoffset=14 yoffset=63 xadvance=113 page=0 chnl=15
+char id=61 x=2458 y=6 width=85 height=65 xoffset=14 yoffset=79 xadvance=113 page=0 chnl=15
+char id=62 x=2555 y=6 width=86 height=97 xoffset=14 yoffset=63 xadvance=113 page=0 chnl=15
+char id=63 x=2653 y=6 width=83 height=124 xoffset=6 yoffset=38 xadvance=96 page=0 chnl=15
+char id=64 x=2748 y=6 width=160 height=158 xoffset=10 yoffset=38 xadvance=175 page=0 chnl=15
+char id=65 x=2920 y=6 width=121 height=121 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15
+char id=66 x=3053 y=6 width=96 height=121 xoffset=9 yoffset=39 xadvance=109 page=0 chnl=15
+char id=67 x=3161 y=6 width=112 height=124 xoffset=7 yoffset=38 xadvance=125 page=0 chnl=15
+char id=68 x=3285 y=6 width=104 height=121 xoffset=9 yoffset=39 xadvance=120 page=0 chnl=15
+char id=69 x=3401 y=6 width=84 height=121 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15
+char id=70 x=3497 y=6 width=83 height=121 xoffset=9 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3592 y=6 width=112 height=124 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15
+char id=72 x=3716 y=6 width=106 height=121 xoffset=9 yoffset=39 xadvance=123 page=0 chnl=15
+char id=73 x=3834 y=6 width=30 height=121 xoffset=9 yoffset=39 xadvance=47 page=0 chnl=15
+char id=74 x=3876 y=6 width=85 height=123 xoffset=2 yoffset=39 xadvance=95 page=0 chnl=15
+char id=75 x=3973 y=6 width=106 height=121 xoffset=9 yoffset=39 xadvance=116 page=0 chnl=15
+char id=76 x=6 y=218 width=80 height=121 xoffset=9 yoffset=39 xadvance=94 page=0 chnl=15
+char id=77 x=98 y=218 width=135 height=121 xoffset=9 yoffset=39 xadvance=152 page=0 chnl=15
+char id=78 x=245 y=218 width=103 height=121 xoffset=9 yoffset=39 xadvance=120 page=0 chnl=15
+char id=79 x=360 y=218 width=116 height=124 xoffset=7 yoffset=38 xadvance=130 page=0 chnl=15
+char id=80 x=488 y=218 width=94 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15
+char id=81 x=594 y=218 width=116 height=132 xoffset=7 yoffset=38 xadvance=130 page=0 chnl=15
+char id=82 x=722 y=218 width=98 height=121 xoffset=9 yoffset=39 xadvance=109 page=0 chnl=15
+char id=83 x=832 y=218 width=99 height=124 xoffset=5 yoffset=38 xadvance=109 page=0 chnl=15
+char id=84 x=943 y=218 width=102 height=121 xoffset=5 yoffset=39 xadvance=111 page=0 chnl=15
+char id=85 x=1057 y=218 width=102 height=123 xoffset=9 yoffset=39 xadvance=119 page=0 chnl=15
+char id=86 x=1171 y=218 width=121 height=121 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15
+char id=87 x=1304 y=218 width=172 height=121 xoffset=2 yoffset=39 xadvance=175 page=0 chnl=15
+char id=88 x=1488 y=218 width=114 height=121 xoffset=4 yoffset=39 xadvance=122 page=0 chnl=15
+char id=89 x=1614 y=218 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15
+char id=90 x=1743 y=218 width=96 height=121 xoffset=8 yoffset=39 xadvance=112 page=0 chnl=15
+char id=91 x=1851 y=218 width=52 height=149 xoffset=16 yoffset=38 xadvance=70 page=0 chnl=15
+char id=92 x=1915 y=218 width=64 height=145 xoffset=1 yoffset=34 xadvance=66 page=0 chnl=15
+char id=93 x=1991 y=218 width=51 height=149 xoffset=3 yoffset=38 xadvance=70 page=0 chnl=15
+char id=94 x=2054 y=218 width=72 height=53 xoffset=5 yoffset=42 xadvance=81 page=0 chnl=15
+char id=95 x=2138 y=218 width=82 height=22 xoffset=-1 yoffset=160 xadvance=80 page=0 chnl=15
+char id=96 x=2232 y=218 width=38 height=28 xoffset=22 yoffset=31 xadvance=82 page=0 chnl=15
+char id=97 x=2282 y=218 width=85 height=94 xoffset=4 yoffset=68 xadvance=96 page=0 chnl=15
+char id=98 x=2379 y=218 width=91 height=123 xoffset=9 yoffset=39 xadvance=105 page=0 chnl=15
+char id=99 x=2482 y=218 width=89 height=94 xoffset=5 yoffset=68 xadvance=98 page=0 chnl=15
+char id=100 x=2583 y=218 width=92 height=123 xoffset=5 yoffset=39 xadvance=105 page=0 chnl=15
+char id=101 x=2687 y=218 width=90 height=94 xoffset=5 yoffset=68 xadvance=99 page=0 chnl=15
+char id=102 x=2789 y=218 width=63 height=126 xoffset=2 yoffset=34 xadvance=65 page=0 chnl=15
+char id=103 x=2864 y=218 width=92 height=127 xoffset=5 yoffset=68 xadvance=105 page=0 chnl=15
+char id=104 x=2968 y=218 width=88 height=121 xoffset=9 yoffset=39 xadvance=104 page=0 chnl=15
+char id=105 x=3068 y=218 width=31 height=129 xoffset=8 yoffset=31 xadvance=46 page=0 chnl=15
+char id=106 x=3111 y=218 width=44 height=163 xoffset=-5 yoffset=31 xadvance=46 page=0 chnl=15
+char id=107 x=3167 y=218 width=90 height=121 xoffset=9 yoffset=39 xadvance=98 page=0 chnl=15
+char id=108 x=3269 y=218 width=29 height=121 xoffset=9 yoffset=39 xadvance=46 page=0 chnl=15
+char id=109 x=3310 y=218 width=136 height=92 xoffset=9 yoffset=68 xadvance=153 page=0 chnl=15
+char id=110 x=3458 y=218 width=88 height=92 xoffset=9 yoffset=68 xadvance=104 page=0 chnl=15
+char id=111 x=3558 y=218 width=92 height=94 xoffset=5 yoffset=68 xadvance=102 page=0 chnl=15
+char id=112 x=3662 y=218 width=91 height=126 xoffset=9 yoffset=68 xadvance=105 page=0 chnl=15
+char id=113 x=3765 y=218 width=92 height=126 xoffset=5 yoffset=68 xadvance=105 page=0 chnl=15
+char id=114 x=3869 y=218 width=58 height=92 xoffset=9 yoffset=68 xadvance=69 page=0 chnl=15
+char id=115 x=3939 y=218 width=86 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15
+char id=116 x=6 y=430 width=59 height=114 xoffset=3 yoffset=48 xadvance=65 page=0 chnl=15
+char id=117 x=77 y=430 width=87 height=93 xoffset=9 yoffset=69 xadvance=105 page=0 chnl=15
+char id=118 x=176 y=430 width=96 height=91 xoffset=1 yoffset=69 xadvance=98 page=0 chnl=15
+char id=119 x=284 y=430 width=139 height=91 xoffset=2 yoffset=69 xadvance=142 page=0 chnl=15
+char id=120 x=435 y=430 width=91 height=91 xoffset=3 yoffset=69 xadvance=96 page=0 chnl=15
+char id=121 x=538 y=430 width=96 height=125 xoffset=1 yoffset=69 xadvance=98 page=0 chnl=15
+char id=122 x=646 y=430 width=78 height=91 xoffset=9 yoffset=69 xadvance=96 page=0 chnl=15
+char id=123 x=736 y=430 width=64 height=149 xoffset=4 yoffset=38 xadvance=70 page=0 chnl=15
+char id=124 x=812 y=430 width=29 height=198 xoffset=18 yoffset=1 xadvance=64 page=0 chnl=15
+char id=125 x=853 y=430 width=63 height=149 xoffset=3 yoffset=38 xadvance=70 page=0 chnl=15
+char id=126 x=928 y=430 width=91 height=41 xoffset=11 yoffset=91 xadvance=113 page=0 chnl=15
+char id=163 x=1031 y=430 width=91 height=122 xoffset=11 yoffset=38 xadvance=113 page=0 chnl=15
+char id=165 x=1134 y=430 width=92 height=121 xoffset=2 yoffset=39 xadvance=95 page=0 chnl=15
+char id=167 x=1238 y=430 width=83 height=147 xoffset=9 yoffset=38 xadvance=100 page=0 chnl=15
+char id=171 x=1333 y=430 width=92 height=73 xoffset=9 yoffset=75 xadvance=108 page=0 chnl=15
+char id=176 x=1437 y=430 width=60 height=59 xoffset=8 yoffset=39 xadvance=76 page=0 chnl=15
+char id=187 x=1509 y=430 width=93 height=73 xoffset=7 yoffset=75 xadvance=108 page=0 chnl=15
+char id=191 x=1614 y=430 width=83 height=125 xoffset=7 yoffset=69 xadvance=96 page=0 chnl=15
+char id=192 x=1709 y=430 width=121 height=159 xoffset=3 yoffset=1 xadvance=127 page=0 chnl=15
+char id=193 x=1842 y=430 width=121 height=159 xoffset=3 yoffset=1 xadvance=127 page=0 chnl=15
+char id=195 x=1975 y=430 width=121 height=157 xoffset=3 yoffset=3 xadvance=127 page=0 chnl=15
+char id=196 x=2108 y=430 width=121 height=158 xoffset=3 yoffset=2 xadvance=127 page=0 chnl=15
+char id=199 x=2241 y=430 width=112 height=161 xoffset=7 yoffset=38 xadvance=125 page=0 chnl=15
+char id=201 x=2365 y=430 width=84 height=159 xoffset=9 yoffset=1 xadvance=101 page=0 chnl=15
+char id=202 x=2461 y=430 width=84 height=158 xoffset=9 yoffset=2 xadvance=101 page=0 chnl=15
+char id=205 x=2557 y=430 width=43 height=159 xoffset=9 yoffset=1 xadvance=47 page=0 chnl=15
+char id=209 x=2612 y=430 width=103 height=156 xoffset=9 yoffset=4 xadvance=120 page=0 chnl=15
+char id=211 x=2727 y=430 width=116 height=161 xoffset=7 yoffset=1 xadvance=130 page=0 chnl=15
+char id=212 x=2855 y=430 width=116 height=160 xoffset=7 yoffset=2 xadvance=130 page=0 chnl=15
+char id=214 x=2983 y=430 width=116 height=160 xoffset=7 yoffset=2 xadvance=130 page=0 chnl=15
+char id=215 x=3111 y=430 width=90 height=90 xoffset=12 yoffset=67 xadvance=113 page=0 chnl=15
+char id=220 x=3213 y=430 width=102 height=160 xoffset=9 yoffset=2 xadvance=119 page=0 chnl=15
+char id=223 x=3327 y=430 width=98 height=122 xoffset=9 yoffset=38 xadvance=112 page=0 chnl=15
+char id=224 x=3437 y=430 width=85 height=131 xoffset=4 yoffset=31 xadvance=96 page=0 chnl=15
+char id=225 x=3534 y=430 width=85 height=131 xoffset=4 yoffset=31 xadvance=96 page=0 chnl=15
+char id=226 x=3631 y=430 width=85 height=130 xoffset=4 yoffset=32 xadvance=96 page=0 chnl=15
+char id=227 x=3728 y=430 width=85 height=128 xoffset=4 yoffset=34 xadvance=96 page=0 chnl=15
+char id=228 x=3825 y=430 width=85 height=130 xoffset=4 yoffset=32 xadvance=96 page=0 chnl=15
+char id=231 x=3922 y=430 width=89 height=131 xoffset=5 yoffset=68 xadvance=98 page=0 chnl=15
+char id=232 x=6 y=642 width=90 height=131 xoffset=5 yoffset=31 xadvance=99 page=0 chnl=15
+char id=233 x=108 y=642 width=90 height=131 xoffset=5 yoffset=31 xadvance=99 page=0 chnl=15
+char id=234 x=210 y=642 width=90 height=130 xoffset=5 yoffset=32 xadvance=99 page=0 chnl=15
+char id=237 x=312 y=642 width=42 height=129 xoffset=9 yoffset=31 xadvance=46 page=0 chnl=15
+char id=238 x=366 y=642 width=73 height=128 xoffset=-13 yoffset=32 xadvance=46 page=0 chnl=15
+char id=241 x=451 y=642 width=88 height=126 xoffset=9 yoffset=34 xadvance=104 page=0 chnl=15
+char id=243 x=551 y=642 width=92 height=131 xoffset=5 yoffset=31 xadvance=102 page=0 chnl=15
+char id=244 x=655 y=642 width=92 height=130 xoffset=5 yoffset=32 xadvance=102 page=0 chnl=15
+char id=245 x=759 y=642 width=92 height=128 xoffset=5 yoffset=34 xadvance=102 page=0 chnl=15
+char id=246 x=863 y=642 width=92 height=130 xoffset=5 yoffset=32 xadvance=102 page=0 chnl=15
+char id=249 x=967 y=642 width=87 height=131 xoffset=9 yoffset=31 xadvance=105 page=0 chnl=15
+char id=250 x=1066 y=642 width=87 height=131 xoffset=9 yoffset=31 xadvance=105 page=0 chnl=15
+char id=251 x=1165 y=642 width=87 height=130 xoffset=9 yoffset=32 xadvance=105 page=0 chnl=15
+char id=252 x=1264 y=642 width=87 height=130 xoffset=9 yoffset=32 xadvance=105 page=0 chnl=15
+char id=286 x=1363 y=642 width=112 height=155 xoffset=7 yoffset=7 xadvance=126 page=0 chnl=15
+char id=287 x=1487 y=642 width=92 height=158 xoffset=5 yoffset=37 xadvance=105 page=0 chnl=15
+char id=304 x=1591 y=642 width=31 height=159 xoffset=8 yoffset=1 xadvance=47 page=0 chnl=15
+char id=305 x=1634 y=642 width=29 height=91 xoffset=9 yoffset=69 xadvance=46 page=0 chnl=15
+char id=339 x=1675 y=642 width=153 height=94 xoffset=5 yoffset=68 xadvance=160 page=0 chnl=15
+char id=350 x=1840 y=642 width=99 height=161 xoffset=5 yoffset=38 xadvance=109 page=0 chnl=15
+char id=351 x=1951 y=642 width=86 height=131 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1028 x=2049 y=642 width=103 height=124 xoffset=7 yoffset=38 xadvance=117 page=0 chnl=15
+char id=1030 x=2164 y=642 width=30 height=121 xoffset=9 yoffset=39 xadvance=47 page=0 chnl=15
+char id=1040 x=2206 y=642 width=121 height=121 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15
+char id=1041 x=2339 y=642 width=94 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1042 x=2445 y=642 width=96 height=121 xoffset=9 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1043 x=2553 y=642 width=83 height=121 xoffset=9 yoffset=39 xadvance=96 page=0 chnl=15
+char id=1044 x=2648 y=642 width=126 height=150 xoffset=3 yoffset=39 xadvance=132 page=0 chnl=15
+char id=1045 x=2786 y=642 width=84 height=121 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15
+char id=1046 x=2882 y=642 width=179 height=121 xoffset=4 yoffset=39 xadvance=186 page=0 chnl=15
+char id=1047 x=3073 y=642 width=96 height=124 xoffset=7 yoffset=38 xadvance=110 page=0 chnl=15
+char id=1048 x=3181 y=642 width=103 height=121 xoffset=9 yoffset=39 xadvance=120 page=0 chnl=15
+char id=1049 x=3296 y=642 width=103 height=153 xoffset=9 yoffset=7 xadvance=120 page=0 chnl=15
+char id=1050 x=3411 y=642 width=116 height=121 xoffset=9 yoffset=39 xadvance=126 page=0 chnl=15
+char id=1051 x=3539 y=642 width=110 height=121 xoffset=3 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1052 x=3661 y=642 width=135 height=121 xoffset=9 yoffset=39 xadvance=152 page=0 chnl=15
+char id=1053 x=3808 y=642 width=106 height=121 xoffset=9 yoffset=39 xadvance=123 page=0 chnl=15
+char id=1054 x=3926 y=642 width=116 height=124 xoffset=7 yoffset=38 xadvance=130 page=0 chnl=15
+char id=1055 x=6 y=854 width=103 height=121 xoffset=13 yoffset=39 xadvance=128 page=0 chnl=15
+char id=1056 x=121 y=854 width=94 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1057 x=227 y=854 width=112 height=124 xoffset=7 yoffset=38 xadvance=125 page=0 chnl=15
+char id=1058 x=351 y=854 width=102 height=121 xoffset=5 yoffset=39 xadvance=111 page=0 chnl=15
+char id=1059 x=465 y=854 width=108 height=123 xoffset=3 yoffset=39 xadvance=113 page=0 chnl=15
+char id=1060 x=585 y=854 width=132 height=128 xoffset=7 yoffset=37 xadvance=146 page=0 chnl=15
+char id=1062 x=729 y=854 width=121 height=150 xoffset=9 yoffset=39 xadvance=133 page=0 chnl=15
+char id=1063 x=862 y=854 width=100 height=121 xoffset=15 yoffset=39 xadvance=129 page=0 chnl=15
+char id=1065 x=974 y=854 width=162 height=150 xoffset=15 yoffset=39 xadvance=180 page=0 chnl=15
+char id=1068 x=1148 y=854 width=94 height=121 xoffset=9 yoffset=39 xadvance=113 page=0 chnl=15
+char id=1070 x=1254 y=854 width=161 height=124 xoffset=9 yoffset=38 xadvance=164 page=0 chnl=15
+char id=1071 x=1427 y=854 width=99 height=121 xoffset=2 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1072 x=1538 y=854 width=85 height=94 xoffset=4 yoffset=68 xadvance=96 page=0 chnl=15
+char id=1073 x=1635 y=854 width=92 height=126 xoffset=5 yoffset=36 xadvance=102 page=0 chnl=15
+char id=1074 x=1739 y=854 width=83 height=91 xoffset=9 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1075 x=1834 y=854 width=64 height=91 xoffset=9 yoffset=69 xadvance=77 page=0 chnl=15
+char id=1076 x=1910 y=854 width=108 height=118 xoffset=2 yoffset=69 xadvance=113 page=0 chnl=15
+char id=1077 x=2030 y=854 width=90 height=94 xoffset=5 yoffset=68 xadvance=99 page=0 chnl=15
+char id=1078 x=2132 y=854 width=142 height=91 xoffset=3 yoffset=69 xadvance=147 page=0 chnl=15
+char id=1079 x=2286 y=854 width=80 height=94 xoffset=4 yoffset=68 xadvance=88 page=0 chnl=15
+char id=1080 x=2378 y=854 width=84 height=91 xoffset=9 yoffset=69 xadvance=101 page=0 chnl=15
+char id=1081 x=2474 y=854 width=84 height=123 xoffset=9 yoffset=37 xadvance=101 page=0 chnl=15
+char id=1082 x=2570 y=854 width=91 height=91 xoffset=9 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1083 x=2673 y=854 width=89 height=91 xoffset=4 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1084 x=2774 y=854 width=111 height=91 xoffset=9 yoffset=69 xadvance=127 page=0 chnl=15
+char id=1085 x=2897 y=854 width=81 height=91 xoffset=9 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1086 x=2990 y=854 width=92 height=94 xoffset=5 yoffset=68 xadvance=102 page=0 chnl=15
+char id=1087 x=3094 y=854 width=82 height=91 xoffset=9 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1088 x=3188 y=854 width=91 height=126 xoffset=9 yoffset=68 xadvance=105 page=0 chnl=15
+char id=1089 x=3291 y=854 width=89 height=94 xoffset=5 yoffset=68 xadvance=98 page=0 chnl=15
+char id=1090 x=3392 y=854 width=86 height=91 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15
+char id=1091 x=3490 y=854 width=96 height=125 xoffset=1 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1092 x=3598 y=854 width=127 height=152 xoffset=5 yoffset=39 xadvance=137 page=0 chnl=15
+char id=1093 x=3737 y=854 width=91 height=91 xoffset=3 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1094 x=3840 y=854 width=110 height=120 xoffset=9 yoffset=69 xadvance=122 page=0 chnl=15
+char id=1095 x=3962 y=854 width=82 height=91 xoffset=9 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1096 x=6 y=1066 width=127 height=91 xoffset=9 yoffset=69 xadvance=144 page=0 chnl=15
+char id=1097 x=145 y=1066 width=148 height=117 xoffset=9 yoffset=69 xadvance=161 page=0 chnl=15
+char id=1100 x=305 y=1066 width=85 height=91 xoffset=9 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1102 x=402 y=1066 width=129 height=94 xoffset=4 yoffset=68 xadvance=138 page=0 chnl=15
+char id=1103 x=543 y=1066 width=84 height=91 xoffset=5 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1108 x=639 y=1066 width=87 height=94 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15
+char id=1110 x=738 y=1066 width=31 height=129 xoffset=8 yoffset=31 xadvance=46 page=0 chnl=15
+char id=1111 x=781 y=1066 width=65 height=128 xoffset=-9 yoffset=32 xadvance=46 page=0 chnl=15
+char id=8209 x=858 y=1066 width=57 height=23 xoffset=15 yoffset=100 xadvance=82 page=0 chnl=15
+char id=8211 x=927 y=1066 width=83 height=23 xoffset=0 yoffset=100 xadvance=82 page=0 chnl=15
+char id=8220 x=1022 y=1066 width=58 height=45 xoffset=9 yoffset=33 xadvance=71 page=0 chnl=15
+char id=8222 x=1092 y=1066 width=57 height=45 xoffset=5 yoffset=144 xadvance=71 page=0 chnl=15
+char id=8226 x=1161 y=1066 width=53 height=52 xoffset=9 yoffset=86 xadvance=71 page=0 chnl=15
+char id=8364 x=1226 y=1066 width=102 height=124 xoffset=4 yoffset=38 xadvance=114 page=0 chnl=15
+char id=8627 x=1340 y=1066 width=137 height=110 xoffset=16 yoffset=39 xadvance=169 page=0 chnl=15
+char id=8679 x=1489 y=1066 width=163 height=130 xoffset=12 yoffset=30 xadvance=187 page=0 chnl=15
+char id=9003 x=1664 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=1849 y=1066 width=107 height=41 xoffset=11 yoffset=148 xadvance=128 page=0 chnl=15
+char id=9654 x=1968 y=1066 width=134 height=152 xoffset=17 yoffset=24 xadvance=160 page=0 chnl=15
+char id=9664 x=2114 y=1066 width=134 height=152 xoffset=9 yoffset=24 xadvance=160 page=0 chnl=15
+char id=9675 x=2260 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=2397 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=2534 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=2546 y=1066 width=124 height=98 xoffset=15 yoffset=58 xadvance=145 page=0 chnl=15
+char id=10004 x=2682 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=2694 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=2706 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=2718 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=2730 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-ExtraBold.png b/selfdrive/assets/fonts/Inter-ExtraBold.png
new file mode 100644
index 000000000..6bba74b02
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-ExtraBold.png differ
diff --git a/selfdrive/assets/fonts/Inter-ExtraBold.ttf b/selfdrive/assets/fonts/Inter-ExtraBold.ttf
new file mode 100644
index 000000000..7f16a0f0f
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-ExtraBold.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-ExtraLight.fnt b/selfdrive/assets/fonts/Inter-ExtraLight.fnt
new file mode 100644
index 000000000..b786815ea
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-ExtraLight.fnt
@@ -0,0 +1,231 @@
+info face="Inter-ExtraLight" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-ExtraLight.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15
+char id=33 x=76 y=6 width=14 height=122 xoffset=15 yoffset=39 xadvance=44 page=0 chnl=15
+char id=34 x=102 y=6 width=33 height=40 xoffset=13 yoffset=39 xadvance=59 page=0 chnl=15
+char id=35 x=147 y=6 width=99 height=121 xoffset=3 yoffset=39 xadvance=104 page=0 chnl=15
+char id=36 x=258 y=6 width=81 height=152 xoffset=11 yoffset=24 xadvance=102 page=0 chnl=15
+char id=37 x=351 y=6 width=104 height=124 xoffset=13 yoffset=38 xadvance=129 page=0 chnl=15
+char id=38 x=467 y=6 width=88 height=124 xoffset=9 yoffset=38 xadvance=99 page=0 chnl=15
+char id=39 x=567 y=6 width=8 height=40 xoffset=13 yoffset=39 xadvance=34 page=0 chnl=15
+char id=40 x=587 y=6 width=27 height=151 xoffset=18 yoffset=34 xadvance=54 page=0 chnl=15
+char id=41 x=626 y=6 width=26 height=151 xoffset=10 yoffset=34 xadvance=54 page=0 chnl=15
+char id=42 x=664 y=6 width=63 height=69 xoffset=10 yoffset=39 xadvance=82 page=0 chnl=15
+char id=43 x=739 y=6 width=72 height=72 xoffset=17 yoffset=77 xadvance=106 page=0 chnl=15
+char id=44 x=823 y=6 width=16 height=47 xoffset=13 yoffset=143 xadvance=43 page=0 chnl=15
+char id=45 x=851 y=6 width=48 height=7 xoffset=13 yoffset=105 xadvance=73 page=0 chnl=15
+char id=46 x=911 y=6 width=13 height=13 xoffset=15 yoffset=148 xadvance=43 page=0 chnl=15
+char id=47 x=936 y=6 width=47 height=145 xoffset=4 yoffset=34 xadvance=55 page=0 chnl=15
+char id=48 x=995 y=6 width=78 height=124 xoffset=11 yoffset=38 xadvance=99 page=0 chnl=15
+char id=49 x=1085 y=6 width=36 height=121 xoffset=11 yoffset=39 xadvance=70 page=0 chnl=15
+char id=50 x=1133 y=6 width=74 height=122 xoffset=14 yoffset=38 xadvance=101 page=0 chnl=15
+char id=51 x=1219 y=6 width=76 height=124 xoffset=14 yoffset=38 xadvance=102 page=0 chnl=15
+char id=52 x=1307 y=6 width=79 height=121 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15
+char id=53 x=1398 y=6 width=72 height=123 xoffset=13 yoffset=39 xadvance=96 page=0 chnl=15
+char id=54 x=1482 y=6 width=75 height=124 xoffset=12 yoffset=38 xadvance=98 page=0 chnl=15
+char id=55 x=1569 y=6 width=73 height=121 xoffset=9 yoffset=39 xadvance=91 page=0 chnl=15
+char id=56 x=1654 y=6 width=78 height=124 xoffset=11 yoffset=38 xadvance=100 page=0 chnl=15
+char id=57 x=1744 y=6 width=75 height=125 xoffset=12 yoffset=37 xadvance=98 page=0 chnl=15
+char id=58 x=1831 y=6 width=13 height=77 xoffset=15 yoffset=78 xadvance=43 page=0 chnl=15
+char id=59 x=1856 y=6 width=17 height=112 xoffset=13 yoffset=78 xadvance=43 page=0 chnl=15
+char id=60 x=1885 y=6 width=69 height=88 xoffset=19 yoffset=69 xadvance=106 page=0 chnl=15
+char id=61 x=1966 y=6 width=62 height=40 xoffset=22 yoffset=93 xadvance=106 page=0 chnl=15
+char id=62 x=2040 y=6 width=69 height=88 xoffset=19 yoffset=69 xadvance=106 page=0 chnl=15
+char id=63 x=2121 y=6 width=65 height=123 xoffset=7 yoffset=38 xadvance=80 page=0 chnl=15
+char id=64 x=2198 y=6 width=139 height=148 xoffset=8 yoffset=44 xadvance=154 page=0 chnl=15
+char id=65 x=2349 y=6 width=97 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15
+char id=66 x=2458 y=6 width=78 height=121 xoffset=17 yoffset=39 xadvance=106 page=0 chnl=15
+char id=67 x=2548 y=6 width=98 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15
+char id=68 x=2658 y=6 width=91 height=121 xoffset=17 yoffset=39 xadvance=118 page=0 chnl=15
+char id=69 x=2761 y=6 width=69 height=121 xoffset=17 yoffset=39 xadvance=97 page=0 chnl=15
+char id=70 x=2842 y=6 width=68 height=121 xoffset=17 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=2922 y=6 width=99 height=124 xoffset=11 yoffset=38 xadvance=122 page=0 chnl=15
+char id=72 x=3033 y=6 width=88 height=121 xoffset=17 yoffset=39 xadvance=121 page=0 chnl=15
+char id=73 x=3133 y=6 width=8 height=121 xoffset=17 yoffset=39 xadvance=42 page=0 chnl=15
+char id=74 x=3153 y=6 width=62 height=123 xoffset=8 yoffset=39 xadvance=87 page=0 chnl=15
+char id=75 x=3227 y=6 width=82 height=121 xoffset=17 yoffset=39 xadvance=103 page=0 chnl=15
+char id=76 x=3321 y=6 width=67 height=121 xoffset=17 yoffset=39 xadvance=92 page=0 chnl=15
+char id=77 x=3400 y=6 width=110 height=121 xoffset=17 yoffset=39 xadvance=144 page=0 chnl=15
+char id=78 x=3522 y=6 width=93 height=121 xoffset=17 yoffset=39 xadvance=126 page=0 chnl=15
+char id=79 x=3627 y=6 width=102 height=124 xoffset=11 yoffset=38 xadvance=124 page=0 chnl=15
+char id=80 x=3741 y=6 width=75 height=121 xoffset=17 yoffset=39 xadvance=101 page=0 chnl=15
+char id=81 x=3828 y=6 width=102 height=134 xoffset=11 yoffset=38 xadvance=124 page=0 chnl=15
+char id=82 x=3942 y=6 width=80 height=121 xoffset=17 yoffset=39 xadvance=102 page=0 chnl=15
+char id=83 x=6 y=218 width=81 height=125 xoffset=11 yoffset=37 xadvance=102 page=0 chnl=15
+char id=84 x=99 y=218 width=85 height=121 xoffset=9 yoffset=39 xadvance=102 page=0 chnl=15
+char id=85 x=196 y=218 width=90 height=123 xoffset=17 yoffset=39 xadvance=123 page=0 chnl=15
+char id=86 x=298 y=218 width=97 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15
+char id=87 x=407 y=218 width=143 height=121 xoffset=4 yoffset=39 xadvance=150 page=0 chnl=15
+char id=88 x=562 y=218 width=90 height=121 xoffset=5 yoffset=39 xadvance=99 page=0 chnl=15
+char id=89 x=664 y=218 width=95 height=121 xoffset=5 yoffset=39 xadvance=104 page=0 chnl=15
+char id=90 x=771 y=218 width=79 height=121 xoffset=11 yoffset=39 xadvance=101 page=0 chnl=15
+char id=91 x=862 y=218 width=26 height=151 xoffset=20 yoffset=34 xadvance=54 page=0 chnl=15
+char id=92 x=900 y=218 width=47 height=145 xoffset=4 yoffset=34 xadvance=55 page=0 chnl=15
+char id=93 x=959 y=218 width=26 height=151 xoffset=9 yoffset=34 xadvance=54 page=0 chnl=15
+char id=94 x=997 y=218 width=56 height=52 xoffset=7 yoffset=43 xadvance=69 page=0 chnl=15
+char id=95 x=1065 y=218 width=74 height=7 xoffset=-1 yoffset=160 xadvance=71 page=0 chnl=15
+char id=96 x=1151 y=218 width=25 height=27 xoffset=28 yoffset=31 xadvance=82 page=0 chnl=15
+char id=97 x=1188 y=218 width=66 height=94 xoffset=10 yoffset=68 xadvance=90 page=0 chnl=15
+char id=98 x=1266 y=218 width=74 height=123 xoffset=17 yoffset=39 xadvance=100 page=0 chnl=15
+char id=99 x=1352 y=218 width=74 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=100 x=1438 y=218 width=74 height=123 xoffset=9 yoffset=39 xadvance=100 page=0 chnl=15
+char id=101 x=1524 y=218 width=77 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15
+char id=102 x=1613 y=218 width=46 height=125 xoffset=8 yoffset=35 xadvance=56 page=0 chnl=15
+char id=103 x=1671 y=218 width=74 height=128 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15
+char id=104 x=1757 y=218 width=67 height=121 xoffset=14 yoffset=39 xadvance=95 page=0 chnl=15
+char id=105 x=1836 y=218 width=13 height=118 xoffset=12 yoffset=42 xadvance=37 page=0 chnl=15
+char id=106 x=1861 y=218 width=28 height=152 xoffset=-3 yoffset=42 xadvance=37 page=0 chnl=15
+char id=107 x=1901 y=218 width=66 height=121 xoffset=14 yoffset=39 xadvance=83 page=0 chnl=15
+char id=108 x=1979 y=218 width=9 height=121 xoffset=14 yoffset=39 xadvance=36 page=0 chnl=15
+char id=109 x=2000 y=218 width=112 height=92 xoffset=14 yoffset=68 xadvance=139 page=0 chnl=15
+char id=110 x=2124 y=218 width=66 height=92 xoffset=14 yoffset=68 xadvance=94 page=0 chnl=15
+char id=111 x=2202 y=218 width=78 height=94 xoffset=9 yoffset=68 xadvance=96 page=0 chnl=15
+char id=112 x=2292 y=218 width=74 height=126 xoffset=14 yoffset=68 xadvance=97 page=0 chnl=15
+char id=113 x=2378 y=218 width=74 height=126 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15
+char id=114 x=2464 y=218 width=38 height=92 xoffset=14 yoffset=68 xadvance=56 page=0 chnl=15
+char id=115 x=2514 y=218 width=64 height=94 xoffset=10 yoffset=68 xadvance=83 page=0 chnl=15
+char id=116 x=2590 y=218 width=44 height=114 xoffset=7 yoffset=48 xadvance=58 page=0 chnl=15
+char id=117 x=2646 y=218 width=66 height=93 xoffset=14 yoffset=69 xadvance=94 page=0 chnl=15
+char id=118 x=2724 y=218 width=74 height=91 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15
+char id=119 x=2810 y=218 width=118 height=91 xoffset=7 yoffset=69 xadvance=131 page=0 chnl=15
+char id=120 x=2940 y=218 width=67 height=91 xoffset=9 yoffset=69 xadvance=84 page=0 chnl=15
+char id=121 x=3019 y=218 width=74 height=125 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15
+char id=122 x=3105 y=218 width=66 height=91 xoffset=11 yoffset=69 xadvance=85 page=0 chnl=15
+char id=123 x=3183 y=218 width=43 height=151 xoffset=9 yoffset=34 xadvance=54 page=0 chnl=15
+char id=124 x=3238 y=218 width=8 height=198 xoffset=20 yoffset=1 xadvance=48 page=0 chnl=15
+char id=125 x=3258 y=218 width=43 height=151 xoffset=3 yoffset=34 xadvance=54 page=0 chnl=15
+char id=126 x=3313 y=218 width=78 height=23 xoffset=14 yoffset=101 xadvance=106 page=0 chnl=15
+char id=163 x=3403 y=218 width=79 height=122 xoffset=12 yoffset=38 xadvance=104 page=0 chnl=15
+char id=165 x=3494 y=218 width=82 height=121 xoffset=3 yoffset=39 xadvance=87 page=0 chnl=15
+char id=167 x=3588 y=218 width=69 height=147 xoffset=10 yoffset=38 xadvance=88 page=0 chnl=15
+char id=171 x=3669 y=218 width=62 height=73 xoffset=12 yoffset=75 xadvance=87 page=0 chnl=15
+char id=176 x=3743 y=218 width=51 height=51 xoffset=12 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=3806 y=218 width=63 height=73 xoffset=13 yoffset=75 xadvance=88 page=0 chnl=15
+char id=191 x=3881 y=218 width=66 height=124 xoffset=8 yoffset=68 xadvance=80 page=0 chnl=15
+char id=192 x=3959 y=218 width=97 height=159 xoffset=4 yoffset=1 xadvance=105 page=0 chnl=15
+char id=193 x=6 y=430 width=97 height=159 xoffset=4 yoffset=1 xadvance=105 page=0 chnl=15
+char id=195 x=115 y=430 width=97 height=152 xoffset=4 yoffset=8 xadvance=105 page=0 chnl=15
+char id=196 x=224 y=430 width=97 height=148 xoffset=4 yoffset=12 xadvance=105 page=0 chnl=15
+char id=199 x=333 y=430 width=98 height=155 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15
+char id=201 x=443 y=430 width=69 height=159 xoffset=17 yoffset=1 xadvance=97 page=0 chnl=15
+char id=202 x=524 y=430 width=69 height=154 xoffset=17 yoffset=6 xadvance=97 page=0 chnl=15
+char id=205 x=605 y=430 width=25 height=159 xoffset=17 yoffset=1 xadvance=42 page=0 chnl=15
+char id=209 x=642 y=430 width=93 height=150 xoffset=17 yoffset=10 xadvance=126 page=0 chnl=15
+char id=211 x=747 y=430 width=102 height=161 xoffset=11 yoffset=1 xadvance=124 page=0 chnl=15
+char id=212 x=861 y=430 width=102 height=156 xoffset=11 yoffset=6 xadvance=124 page=0 chnl=15
+char id=214 x=975 y=430 width=102 height=150 xoffset=11 yoffset=12 xadvance=124 page=0 chnl=15
+char id=215 x=1089 y=430 width=72 height=72 xoffset=17 yoffset=77 xadvance=106 page=0 chnl=15
+char id=220 x=1173 y=430 width=90 height=150 xoffset=17 yoffset=12 xadvance=123 page=0 chnl=15
+char id=223 x=1275 y=430 width=69 height=122 xoffset=17 yoffset=38 xadvance=96 page=0 chnl=15
+char id=224 x=1356 y=430 width=66 height=131 xoffset=10 yoffset=31 xadvance=90 page=0 chnl=15
+char id=225 x=1434 y=430 width=66 height=131 xoffset=10 yoffset=31 xadvance=90 page=0 chnl=15
+char id=226 x=1512 y=430 width=66 height=126 xoffset=10 yoffset=36 xadvance=90 page=0 chnl=15
+char id=227 x=1590 y=430 width=66 height=122 xoffset=10 yoffset=40 xadvance=90 page=0 chnl=15
+char id=228 x=1668 y=430 width=66 height=120 xoffset=10 yoffset=42 xadvance=90 page=0 chnl=15
+char id=231 x=1746 y=430 width=74 height=124 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=232 x=1832 y=430 width=77 height=131 xoffset=9 yoffset=31 xadvance=95 page=0 chnl=15
+char id=233 x=1921 y=430 width=77 height=131 xoffset=9 yoffset=31 xadvance=95 page=0 chnl=15
+char id=234 x=2010 y=430 width=77 height=126 xoffset=9 yoffset=36 xadvance=95 page=0 chnl=15
+char id=237 x=2099 y=430 width=25 height=129 xoffset=15 yoffset=31 xadvance=37 page=0 chnl=15
+char id=238 x=2136 y=430 width=47 height=124 xoffset=-5 yoffset=36 xadvance=37 page=0 chnl=15
+char id=241 x=2195 y=430 width=66 height=120 xoffset=14 yoffset=40 xadvance=94 page=0 chnl=15
+char id=243 x=2273 y=430 width=78 height=131 xoffset=9 yoffset=31 xadvance=96 page=0 chnl=15
+char id=244 x=2363 y=430 width=78 height=126 xoffset=9 yoffset=36 xadvance=96 page=0 chnl=15
+char id=245 x=2453 y=430 width=78 height=122 xoffset=9 yoffset=40 xadvance=96 page=0 chnl=15
+char id=246 x=2543 y=430 width=78 height=120 xoffset=9 yoffset=42 xadvance=96 page=0 chnl=15
+char id=249 x=2633 y=430 width=66 height=131 xoffset=14 yoffset=31 xadvance=94 page=0 chnl=15
+char id=250 x=2711 y=430 width=66 height=131 xoffset=14 yoffset=31 xadvance=94 page=0 chnl=15
+char id=251 x=2789 y=430 width=66 height=126 xoffset=14 yoffset=36 xadvance=94 page=0 chnl=15
+char id=252 x=2867 y=430 width=66 height=120 xoffset=14 yoffset=42 xadvance=94 page=0 chnl=15
+char id=286 x=2945 y=430 width=99 height=153 xoffset=11 yoffset=9 xadvance=122 page=0 chnl=15
+char id=287 x=3056 y=430 width=74 height=157 xoffset=9 yoffset=39 xadvance=97 page=0 chnl=15
+char id=304 x=3142 y=430 width=12 height=148 xoffset=15 yoffset=12 xadvance=42 page=0 chnl=15
+char id=305 x=3166 y=430 width=8 height=91 xoffset=15 yoffset=69 xadvance=37 page=0 chnl=15
+char id=339 x=3186 y=430 width=147 height=94 xoffset=9 yoffset=68 xadvance=165 page=0 chnl=15
+char id=350 x=3345 y=430 width=81 height=155 xoffset=11 yoffset=37 xadvance=102 page=0 chnl=15
+char id=351 x=3438 y=430 width=64 height=124 xoffset=10 yoffset=68 xadvance=83 page=0 chnl=15
+char id=1028 x=3514 y=430 width=81 height=52 xoffset=13 yoffset=74 xadvance=107 page=0 chnl=15
+char id=1030 x=3607 y=430 width=8 height=121 xoffset=17 yoffset=39 xadvance=42 page=0 chnl=15
+char id=1040 x=3627 y=430 width=97 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15
+char id=1041 x=3736 y=430 width=82 height=121 xoffset=17 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1042 x=3830 y=430 width=78 height=121 xoffset=17 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1043 x=3920 y=430 width=69 height=121 xoffset=17 yoffset=39 xadvance=94 page=0 chnl=15
+char id=1044 x=6 y=642 width=108 height=151 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15
+char id=1045 x=126 y=642 width=69 height=121 xoffset=17 yoffset=39 xadvance=97 page=0 chnl=15
+char id=1046 x=207 y=642 width=140 height=121 xoffset=1 yoffset=39 xadvance=141 page=0 chnl=15
+char id=1047 x=359 y=642 width=76 height=124 xoffset=14 yoffset=38 xadvance=102 page=0 chnl=15
+char id=1048 x=447 y=642 width=93 height=121 xoffset=17 yoffset=39 xadvance=126 page=0 chnl=15
+char id=1049 x=552 y=642 width=93 height=151 xoffset=17 yoffset=9 xadvance=126 page=0 chnl=15
+char id=1050 x=657 y=642 width=78 height=121 xoffset=17 yoffset=39 xadvance=100 page=0 chnl=15
+char id=1051 x=747 y=642 width=96 height=121 xoffset=4 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1052 x=855 y=642 width=110 height=121 xoffset=17 yoffset=39 xadvance=144 page=0 chnl=15
+char id=1053 x=977 y=642 width=88 height=121 xoffset=17 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1054 x=1077 y=642 width=102 height=124 xoffset=11 yoffset=38 xadvance=124 page=0 chnl=15
+char id=1055 x=1191 y=642 width=85 height=121 xoffset=15 yoffset=39 xadvance=114 page=0 chnl=15
+char id=1056 x=1288 y=642 width=75 height=121 xoffset=17 yoffset=39 xadvance=101 page=0 chnl=15
+char id=1057 x=1375 y=642 width=98 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15
+char id=1058 x=1485 y=642 width=85 height=121 xoffset=9 yoffset=39 xadvance=102 page=0 chnl=15
+char id=1059 x=1582 y=642 width=88 height=123 xoffset=5 yoffset=39 xadvance=97 page=0 chnl=15
+char id=1060 x=1682 y=642 width=102 height=128 xoffset=11 yoffset=37 xadvance=123 page=0 chnl=15
+char id=1062 x=1796 y=642 width=93 height=150 xoffset=17 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1063 x=1901 y=642 width=82 height=121 xoffset=16 yoffset=39 xadvance=114 page=0 chnl=15
+char id=1065 x=1995 y=642 width=127 height=150 xoffset=17 yoffset=39 xadvance=151 page=0 chnl=15
+char id=1068 x=2134 y=642 width=82 height=121 xoffset=17 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1070 x=2228 y=642 width=135 height=124 xoffset=17 yoffset=38 xadvance=168 page=0 chnl=15
+char id=1071 x=2375 y=642 width=80 height=121 xoffset=6 yoffset=39 xadvance=102 page=0 chnl=15
+char id=1072 x=2467 y=642 width=66 height=94 xoffset=10 yoffset=68 xadvance=90 page=0 chnl=15
+char id=1073 x=2545 y=642 width=77 height=126 xoffset=9 yoffset=36 xadvance=95 page=0 chnl=15
+char id=1074 x=2634 y=642 width=68 height=91 xoffset=14 yoffset=69 xadvance=91 page=0 chnl=15
+char id=1075 x=2714 y=642 width=53 height=91 xoffset=14 yoffset=69 xadvance=75 page=0 chnl=15
+char id=1076 x=2779 y=642 width=89 height=117 xoffset=3 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1077 x=2880 y=642 width=77 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1078 x=2969 y=642 width=115 height=91 xoffset=9 yoffset=69 xadvance=132 page=0 chnl=15
+char id=1079 x=3096 y=642 width=65 height=94 xoffset=8 yoffset=68 xadvance=80 page=0 chnl=15
+char id=1080 x=3173 y=642 width=69 height=91 xoffset=14 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1081 x=3254 y=642 width=69 height=121 xoffset=14 yoffset=39 xadvance=97 page=0 chnl=15
+char id=1082 x=3335 y=642 width=64 height=91 xoffset=14 yoffset=69 xadvance=81 page=0 chnl=15
+char id=1083 x=3411 y=642 width=77 height=91 xoffset=5 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1084 x=3500 y=642 width=91 height=91 xoffset=14 yoffset=69 xadvance=120 page=0 chnl=15
+char id=1085 x=3603 y=642 width=68 height=91 xoffset=14 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1086 x=3683 y=642 width=78 height=94 xoffset=9 yoffset=68 xadvance=96 page=0 chnl=15
+char id=1087 x=3773 y=642 width=66 height=91 xoffset=15 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1088 x=3851 y=642 width=74 height=126 xoffset=14 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1089 x=3937 y=642 width=74 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=1090 x=6 y=854 width=68 height=91 xoffset=9 yoffset=69 xadvance=85 page=0 chnl=15
+char id=1091 x=86 y=854 width=74 height=125 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15
+char id=1092 x=172 y=854 width=98 height=152 xoffset=9 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1093 x=282 y=854 width=67 height=91 xoffset=9 yoffset=69 xadvance=84 page=0 chnl=15
+char id=1094 x=361 y=854 width=73 height=121 xoffset=15 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1095 x=446 y=854 width=65 height=91 xoffset=14 yoffset=69 xadvance=93 page=0 chnl=15
+char id=1096 x=523 y=854 width=102 height=91 xoffset=14 yoffset=69 xadvance=131 page=0 chnl=15
+char id=1097 x=637 y=854 width=111 height=117 xoffset=14 yoffset=69 xadvance=132 page=0 chnl=15
+char id=1100 x=760 y=854 width=65 height=91 xoffset=14 yoffset=69 xadvance=87 page=0 chnl=15
+char id=1102 x=837 y=854 width=115 height=94 xoffset=6 yoffset=68 xadvance=132 page=0 chnl=15
+char id=1103 x=964 y=854 width=69 height=91 xoffset=7 yoffset=69 xadvance=91 page=0 chnl=15
+char id=1108 x=1045 y=854 width=71 height=94 xoffset=2 yoffset=68 xadvance=80 page=0 chnl=15
+char id=1110 x=1128 y=854 width=13 height=118 xoffset=12 yoffset=42 xadvance=37 page=0 chnl=15
+char id=1111 x=1153 y=854 width=38 height=118 xoffset=0 yoffset=42 xadvance=37 page=0 chnl=15
+char id=8209 x=1203 y=854 width=48 height=7 xoffset=-2 yoffset=105 xadvance=47 page=0 chnl=15
+char id=8211 x=1263 y=854 width=83 height=7 xoffset=0 yoffset=105 xadvance=82 page=0 chnl=15
+char id=8220 x=1358 y=854 width=44 height=41 xoffset=8 yoffset=37 xadvance=54 page=0 chnl=15
+char id=8222 x=1414 y=854 width=44 height=42 xoffset=3 yoffset=144 xadvance=54 page=0 chnl=15
+char id=8226 x=1470 y=854 width=39 height=38 xoffset=27 yoffset=93 xadvance=92 page=0 chnl=15
+char id=8364 x=1521 y=854 width=95 height=124 xoffset=5 yoffset=38 xadvance=111 page=0 chnl=15
+char id=8627 x=1628 y=854 width=125 height=100 xoffset=16 yoffset=39 xadvance=156 page=0 chnl=15
+char id=8679 x=1765 y=854 width=122 height=130 xoffset=15 yoffset=30 xadvance=151 page=0 chnl=15
+char id=9003 x=1899 y=854 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=2084 y=854 width=36 height=34 xoffset=39 yoffset=148 xadvance=114 page=0 chnl=15
+char id=9654 x=2132 y=854 width=126 height=152 xoffset=14 yoffset=24 xadvance=146 page=0 chnl=15
+char id=9664 x=2270 y=854 width=126 height=152 xoffset=7 yoffset=24 xadvance=146 page=0 chnl=15
+char id=9675 x=2408 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=2545 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=2682 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=2694 y=854 width=110 height=77 xoffset=18 yoffset=65 xadvance=145 page=0 chnl=15
+char id=10004 x=2816 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=2828 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=2840 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=2852 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=2864 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-ExtraLight.png b/selfdrive/assets/fonts/Inter-ExtraLight.png
new file mode 100644
index 000000000..a51c37109
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-ExtraLight.png differ
diff --git a/selfdrive/assets/fonts/Inter-ExtraLight.ttf b/selfdrive/assets/fonts/Inter-ExtraLight.ttf
new file mode 100644
index 000000000..69426a3eb
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-ExtraLight.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-Light.fnt b/selfdrive/assets/fonts/Inter-Light.fnt
new file mode 100644
index 000000000..f587ec3c2
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-Light.fnt
@@ -0,0 +1,231 @@
+info face="Inter-Light" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-Light.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15
+char id=33 x=76 y=6 width=17 height=122 xoffset=14 yoffset=39 xadvance=45 page=0 chnl=15
+char id=34 x=105 y=6 width=39 height=41 xoffset=12 yoffset=39 xadvance=63 page=0 chnl=15
+char id=35 x=156 y=6 width=99 height=121 xoffset=3 yoffset=39 xadvance=104 page=0 chnl=15
+char id=36 x=267 y=6 width=84 height=152 xoffset=10 yoffset=24 xadvance=103 page=0 chnl=15
+char id=37 x=363 y=6 width=106 height=124 xoffset=13 yoffset=38 xadvance=132 page=0 chnl=15
+char id=38 x=481 y=6 width=91 height=124 xoffset=9 yoffset=38 xadvance=102 page=0 chnl=15
+char id=39 x=584 y=6 width=11 height=41 xoffset=12 yoffset=39 xadvance=35 page=0 chnl=15
+char id=40 x=607 y=6 width=31 height=151 xoffset=18 yoffset=34 xadvance=57 page=0 chnl=15
+char id=41 x=650 y=6 width=32 height=151 xoffset=8 yoffset=34 xadvance=57 page=0 chnl=15
+char id=42 x=694 y=6 width=64 height=69 xoffset=9 yoffset=39 xadvance=82 page=0 chnl=15
+char id=43 x=770 y=6 width=76 height=76 xoffset=16 yoffset=75 xadvance=107 page=0 chnl=15
+char id=44 x=858 y=6 width=20 height=47 xoffset=12 yoffset=143 xadvance=44 page=0 chnl=15
+char id=45 x=890 y=6 width=51 height=11 xoffset=12 yoffset=103 xadvance=74 page=0 chnl=15
+char id=46 x=953 y=6 width=18 height=18 xoffset=13 yoffset=143 xadvance=44 page=0 chnl=15
+char id=47 x=983 y=6 width=49 height=145 xoffset=4 yoffset=34 xadvance=57 page=0 chnl=15
+char id=48 x=1044 y=6 width=81 height=124 xoffset=10 yoffset=38 xadvance=101 page=0 chnl=15
+char id=49 x=1137 y=6 width=41 height=121 xoffset=10 yoffset=39 xadvance=73 page=0 chnl=15
+char id=50 x=1190 y=6 width=76 height=122 xoffset=13 yoffset=38 xadvance=100 page=0 chnl=15
+char id=51 x=1278 y=6 width=79 height=124 xoffset=13 yoffset=38 xadvance=103 page=0 chnl=15
+char id=52 x=1369 y=6 width=84 height=121 xoffset=10 yoffset=39 xadvance=103 page=0 chnl=15
+char id=53 x=1465 y=6 width=74 height=123 xoffset=13 yoffset=39 xadvance=98 page=0 chnl=15
+char id=54 x=1551 y=6 width=79 height=125 xoffset=11 yoffset=37 xadvance=100 page=0 chnl=15
+char id=55 x=1642 y=6 width=76 height=121 xoffset=8 yoffset=39 xadvance=93 page=0 chnl=15
+char id=56 x=1730 y=6 width=81 height=124 xoffset=10 yoffset=38 xadvance=101 page=0 chnl=15
+char id=57 x=1823 y=6 width=79 height=125 xoffset=11 yoffset=37 xadvance=100 page=0 chnl=15
+char id=58 x=1914 y=6 width=18 height=83 xoffset=13 yoffset=75 xadvance=44 page=0 chnl=15
+char id=59 x=1944 y=6 width=21 height=115 xoffset=12 yoffset=75 xadvance=45 page=0 chnl=15
+char id=60 x=1977 y=6 width=73 height=88 xoffset=17 yoffset=69 xadvance=107 page=0 chnl=15
+char id=61 x=2062 y=6 width=68 height=44 xoffset=20 yoffset=91 xadvance=107 page=0 chnl=15
+char id=62 x=2142 y=6 width=73 height=88 xoffset=17 yoffset=69 xadvance=107 page=0 chnl=15
+char id=63 x=2227 y=6 width=68 height=123 xoffset=6 yoffset=38 xadvance=82 page=0 chnl=15
+char id=64 x=2307 y=6 width=139 height=148 xoffset=8 yoffset=44 xadvance=154 page=0 chnl=15
+char id=65 x=2458 y=6 width=100 height=121 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15
+char id=66 x=2570 y=6 width=82 height=121 xoffset=15 yoffset=39 xadvance=106 page=0 chnl=15
+char id=67 x=2664 y=6 width=101 height=124 xoffset=10 yoffset=38 xadvance=119 page=0 chnl=15
+char id=68 x=2777 y=6 width=93 height=121 xoffset=15 yoffset=39 xadvance=118 page=0 chnl=15
+char id=69 x=2882 y=6 width=72 height=121 xoffset=15 yoffset=39 xadvance=98 page=0 chnl=15
+char id=70 x=2966 y=6 width=71 height=121 xoffset=15 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3049 y=6 width=102 height=124 xoffset=10 yoffset=38 xadvance=122 page=0 chnl=15
+char id=72 x=3163 y=6 width=92 height=121 xoffset=15 yoffset=39 xadvance=122 page=0 chnl=15
+char id=73 x=3267 y=6 width=12 height=121 xoffset=15 yoffset=39 xadvance=42 page=0 chnl=15
+char id=74 x=3291 y=6 width=66 height=123 xoffset=7 yoffset=39 xadvance=88 page=0 chnl=15
+char id=75 x=3369 y=6 width=87 height=121 xoffset=15 yoffset=39 xadvance=105 page=0 chnl=15
+char id=76 x=3468 y=6 width=70 height=121 xoffset=15 yoffset=39 xadvance=92 page=0 chnl=15
+char id=77 x=3550 y=6 width=115 height=121 xoffset=15 yoffset=39 xadvance=145 page=0 chnl=15
+char id=78 x=3677 y=6 width=95 height=121 xoffset=15 yoffset=39 xadvance=125 page=0 chnl=15
+char id=79 x=3784 y=6 width=105 height=124 xoffset=10 yoffset=38 xadvance=125 page=0 chnl=15
+char id=80 x=3901 y=6 width=79 height=121 xoffset=15 yoffset=39 xadvance=103 page=0 chnl=15
+char id=81 x=6 y=218 width=105 height=134 xoffset=10 yoffset=38 xadvance=125 page=0 chnl=15
+char id=82 x=123 y=218 width=84 height=121 xoffset=15 yoffset=39 xadvance=104 page=0 chnl=15
+char id=83 x=219 y=218 width=84 height=125 xoffset=10 yoffset=38 xadvance=103 page=0 chnl=15
+char id=84 x=315 y=218 width=88 height=121 xoffset=8 yoffset=39 xadvance=104 page=0 chnl=15
+char id=85 x=415 y=218 width=93 height=124 xoffset=15 yoffset=39 xadvance=123 page=0 chnl=15
+char id=86 x=520 y=218 width=100 height=121 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15
+char id=87 x=632 y=218 width=147 height=121 xoffset=3 yoffset=39 xadvance=153 page=0 chnl=15
+char id=88 x=791 y=218 width=95 height=121 xoffset=4 yoffset=39 xadvance=102 page=0 chnl=15
+char id=89 x=898 y=218 width=99 height=121 xoffset=4 yoffset=39 xadvance=107 page=0 chnl=15
+char id=90 x=1009 y=218 width=82 height=121 xoffset=10 yoffset=39 xadvance=102 page=0 chnl=15
+char id=91 x=1103 y=218 width=31 height=151 xoffset=19 yoffset=34 xadvance=57 page=0 chnl=15
+char id=92 x=1146 y=218 width=49 height=145 xoffset=4 yoffset=34 xadvance=57 page=0 chnl=15
+char id=93 x=1207 y=218 width=31 height=151 xoffset=7 yoffset=34 xadvance=57 page=0 chnl=15
+char id=94 x=1250 y=218 width=61 height=52 xoffset=6 yoffset=43 xadvance=73 page=0 chnl=15
+char id=95 x=1323 y=218 width=75 height=10 xoffset=-1 yoffset=160 xadvance=73 page=0 chnl=15
+char id=96 x=1410 y=218 width=28 height=28 xoffset=27 yoffset=30 xadvance=82 page=0 chnl=15
+char id=97 x=1450 y=218 width=69 height=95 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=98 x=1531 y=218 width=78 height=123 xoffset=15 yoffset=39 xadvance=101 page=0 chnl=15
+char id=99 x=1621 y=218 width=75 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=100 x=1708 y=218 width=77 height=123 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15
+char id=101 x=1797 y=218 width=78 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15
+char id=102 x=1887 y=218 width=50 height=126 xoffset=6 yoffset=34 xadvance=57 page=0 chnl=15
+char id=103 x=1949 y=218 width=77 height=128 xoffset=9 yoffset=68 xadvance=99 page=0 chnl=15
+char id=104 x=2038 y=218 width=70 height=121 xoffset=13 yoffset=39 xadvance=96 page=0 chnl=15
+char id=105 x=2120 y=218 width=17 height=121 xoffset=11 yoffset=39 xadvance=38 page=0 chnl=15
+char id=106 x=2149 y=218 width=30 height=155 xoffset=-3 yoffset=39 xadvance=38 page=0 chnl=15
+char id=107 x=2191 y=218 width=71 height=121 xoffset=13 yoffset=39 xadvance=86 page=0 chnl=15
+char id=108 x=2274 y=218 width=12 height=121 xoffset=13 yoffset=39 xadvance=38 page=0 chnl=15
+char id=109 x=2298 y=218 width=115 height=92 xoffset=13 yoffset=68 xadvance=141 page=0 chnl=15
+char id=110 x=2425 y=218 width=69 height=92 xoffset=13 yoffset=68 xadvance=95 page=0 chnl=15
+char id=111 x=2506 y=218 width=80 height=94 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15
+char id=112 x=2598 y=218 width=77 height=126 xoffset=13 yoffset=68 xadvance=99 page=0 chnl=15
+char id=113 x=2687 y=218 width=77 height=126 xoffset=9 yoffset=68 xadvance=99 page=0 chnl=15
+char id=114 x=2776 y=218 width=42 height=92 xoffset=13 yoffset=68 xadvance=58 page=0 chnl=15
+char id=115 x=2830 y=218 width=67 height=94 xoffset=9 yoffset=68 xadvance=84 page=0 chnl=15
+char id=116 x=2909 y=218 width=47 height=114 xoffset=6 yoffset=48 xadvance=59 page=0 chnl=15
+char id=117 x=2968 y=218 width=69 height=93 xoffset=13 yoffset=69 xadvance=95 page=0 chnl=15
+char id=118 x=3049 y=218 width=78 height=91 xoffset=6 yoffset=69 xadvance=90 page=0 chnl=15
+char id=119 x=3139 y=218 width=121 height=91 xoffset=6 yoffset=69 xadvance=133 page=0 chnl=15
+char id=120 x=3272 y=218 width=71 height=91 xoffset=8 yoffset=69 xadvance=87 page=0 chnl=15
+char id=121 x=3355 y=218 width=78 height=125 xoffset=6 yoffset=69 xadvance=90 page=0 chnl=15
+char id=122 x=3445 y=218 width=69 height=91 xoffset=10 yoffset=69 xadvance=87 page=0 chnl=15
+char id=123 x=3526 y=218 width=46 height=151 xoffset=7 yoffset=34 xadvance=57 page=0 chnl=15
+char id=124 x=3584 y=218 width=11 height=198 xoffset=20 yoffset=1 xadvance=50 page=0 chnl=15
+char id=125 x=3607 y=218 width=46 height=151 xoffset=4 yoffset=34 xadvance=57 page=0 chnl=15
+char id=126 x=3665 y=218 width=80 height=27 xoffset=14 yoffset=99 xadvance=107 page=0 chnl=15
+char id=163 x=3757 y=218 width=82 height=122 xoffset=11 yoffset=38 xadvance=104 page=0 chnl=15
+char id=165 x=3851 y=218 width=85 height=121 xoffset=2 yoffset=39 xadvance=89 page=0 chnl=15
+char id=167 x=3948 y=218 width=72 height=147 xoffset=9 yoffset=38 xadvance=89 page=0 chnl=15
+char id=171 x=6 y=430 width=65 height=73 xoffset=11 yoffset=75 xadvance=88 page=0 chnl=15
+char id=176 x=83 y=430 width=53 height=53 xoffset=11 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=148 y=430 width=65 height=73 xoffset=12 yoffset=75 xadvance=88 page=0 chnl=15
+char id=191 x=225 y=430 width=68 height=124 xoffset=8 yoffset=68 xadvance=82 page=0 chnl=15
+char id=192 x=305 y=430 width=100 height=160 xoffset=4 yoffset=0 xadvance=108 page=0 chnl=15
+char id=193 x=417 y=430 width=100 height=160 xoffset=4 yoffset=0 xadvance=108 page=0 chnl=15
+char id=195 x=529 y=430 width=100 height=153 xoffset=4 yoffset=7 xadvance=108 page=0 chnl=15
+char id=196 x=641 y=430 width=100 height=151 xoffset=4 yoffset=9 xadvance=108 page=0 chnl=15
+char id=199 x=753 y=430 width=101 height=157 xoffset=10 yoffset=38 xadvance=119 page=0 chnl=15
+char id=201 x=866 y=430 width=72 height=160 xoffset=15 yoffset=0 xadvance=98 page=0 chnl=15
+char id=202 x=950 y=430 width=72 height=155 xoffset=15 yoffset=5 xadvance=98 page=0 chnl=15
+char id=205 x=1034 y=430 width=29 height=160 xoffset=15 yoffset=0 xadvance=42 page=0 chnl=15
+char id=209 x=1075 y=430 width=95 height=152 xoffset=15 yoffset=8 xadvance=125 page=0 chnl=15
+char id=211 x=1182 y=430 width=105 height=162 xoffset=10 yoffset=0 xadvance=125 page=0 chnl=15
+char id=212 x=1299 y=430 width=105 height=157 xoffset=10 yoffset=5 xadvance=125 page=0 chnl=15
+char id=214 x=1416 y=430 width=105 height=153 xoffset=10 yoffset=9 xadvance=125 page=0 chnl=15
+char id=215 x=1533 y=430 width=74 height=74 xoffset=17 yoffset=76 xadvance=107 page=0 chnl=15
+char id=220 x=1619 y=430 width=93 height=154 xoffset=15 yoffset=9 xadvance=123 page=0 chnl=15
+char id=223 x=1724 y=430 width=74 height=122 xoffset=15 yoffset=38 xadvance=98 page=0 chnl=15
+char id=224 x=1810 y=430 width=69 height=133 xoffset=9 yoffset=30 xadvance=91 page=0 chnl=15
+char id=225 x=1891 y=430 width=69 height=133 xoffset=9 yoffset=30 xadvance=91 page=0 chnl=15
+char id=226 x=1972 y=430 width=69 height=128 xoffset=9 yoffset=35 xadvance=91 page=0 chnl=15
+char id=227 x=2053 y=430 width=69 height=125 xoffset=9 yoffset=38 xadvance=91 page=0 chnl=15
+char id=228 x=2134 y=430 width=69 height=124 xoffset=9 yoffset=39 xadvance=91 page=0 chnl=15
+char id=231 x=2215 y=430 width=75 height=126 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=232 x=2302 y=430 width=78 height=132 xoffset=9 yoffset=30 xadvance=95 page=0 chnl=15
+char id=233 x=2392 y=430 width=78 height=132 xoffset=9 yoffset=30 xadvance=95 page=0 chnl=15
+char id=234 x=2482 y=430 width=78 height=127 xoffset=9 yoffset=35 xadvance=95 page=0 chnl=15
+char id=237 x=2572 y=430 width=29 height=130 xoffset=13 yoffset=30 xadvance=38 page=0 chnl=15
+char id=238 x=2613 y=430 width=49 height=125 xoffset=-5 yoffset=35 xadvance=38 page=0 chnl=15
+char id=241 x=2674 y=430 width=69 height=122 xoffset=13 yoffset=38 xadvance=95 page=0 chnl=15
+char id=243 x=2755 y=430 width=80 height=132 xoffset=9 yoffset=30 xadvance=97 page=0 chnl=15
+char id=244 x=2847 y=430 width=80 height=127 xoffset=9 yoffset=35 xadvance=97 page=0 chnl=15
+char id=245 x=2939 y=430 width=80 height=124 xoffset=9 yoffset=38 xadvance=97 page=0 chnl=15
+char id=246 x=3031 y=430 width=80 height=123 xoffset=9 yoffset=39 xadvance=97 page=0 chnl=15
+char id=249 x=3123 y=430 width=69 height=132 xoffset=13 yoffset=30 xadvance=95 page=0 chnl=15
+char id=250 x=3204 y=430 width=69 height=132 xoffset=13 yoffset=30 xadvance=95 page=0 chnl=15
+char id=251 x=3285 y=430 width=69 height=127 xoffset=13 yoffset=35 xadvance=95 page=0 chnl=15
+char id=252 x=3366 y=430 width=69 height=123 xoffset=13 yoffset=39 xadvance=95 page=0 chnl=15
+char id=286 x=3447 y=430 width=102 height=153 xoffset=10 yoffset=9 xadvance=122 page=0 chnl=15
+char id=287 x=3561 y=430 width=77 height=157 xoffset=9 yoffset=39 xadvance=99 page=0 chnl=15
+char id=304 x=3650 y=430 width=17 height=151 xoffset=13 yoffset=9 xadvance=42 page=0 chnl=15
+char id=305 x=3679 y=430 width=12 height=91 xoffset=13 yoffset=69 xadvance=38 page=0 chnl=15
+char id=339 x=3703 y=430 width=147 height=94 xoffset=9 yoffset=68 xadvance=164 page=0 chnl=15
+char id=350 x=3862 y=430 width=84 height=156 xoffset=10 yoffset=38 xadvance=103 page=0 chnl=15
+char id=351 x=3958 y=430 width=67 height=126 xoffset=9 yoffset=68 xadvance=84 page=0 chnl=15
+char id=1028 x=6 y=642 width=87 height=44 xoffset=11 yoffset=78 xadvance=108 page=0 chnl=15
+char id=1030 x=105 y=642 width=12 height=121 xoffset=15 yoffset=39 xadvance=42 page=0 chnl=15
+char id=1040 x=129 y=642 width=100 height=121 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1041 x=241 y=642 width=84 height=121 xoffset=15 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1042 x=337 y=642 width=82 height=121 xoffset=15 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1043 x=431 y=642 width=72 height=121 xoffset=15 yoffset=39 xadvance=94 page=0 chnl=15
+char id=1044 x=515 y=642 width=111 height=151 xoffset=4 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1045 x=638 y=642 width=72 height=121 xoffset=15 yoffset=39 xadvance=98 page=0 chnl=15
+char id=1046 x=722 y=642 width=145 height=121 xoffset=2 yoffset=39 xadvance=149 page=0 chnl=15
+char id=1047 x=879 y=642 width=79 height=124 xoffset=13 yoffset=38 xadvance=103 page=0 chnl=15
+char id=1048 x=970 y=642 width=95 height=121 xoffset=15 yoffset=39 xadvance=125 page=0 chnl=15
+char id=1049 x=1077 y=642 width=95 height=151 xoffset=15 yoffset=9 xadvance=125 page=0 chnl=15
+char id=1050 x=1184 y=642 width=84 height=121 xoffset=15 yoffset=39 xadvance=103 page=0 chnl=15
+char id=1051 x=1280 y=642 width=98 height=121 xoffset=4 yoffset=39 xadvance=117 page=0 chnl=15
+char id=1052 x=1390 y=642 width=115 height=121 xoffset=15 yoffset=39 xadvance=145 page=0 chnl=15
+char id=1053 x=1517 y=642 width=92 height=121 xoffset=15 yoffset=39 xadvance=122 page=0 chnl=15
+char id=1054 x=1621 y=642 width=105 height=124 xoffset=10 yoffset=38 xadvance=125 page=0 chnl=15
+char id=1055 x=1738 y=642 width=87 height=121 xoffset=15 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1056 x=1837 y=642 width=79 height=121 xoffset=15 yoffset=39 xadvance=103 page=0 chnl=15
+char id=1057 x=1928 y=642 width=101 height=124 xoffset=10 yoffset=38 xadvance=119 page=0 chnl=15
+char id=1058 x=2041 y=642 width=88 height=121 xoffset=8 yoffset=39 xadvance=104 page=0 chnl=15
+char id=1059 x=2141 y=642 width=92 height=123 xoffset=4 yoffset=39 xadvance=100 page=0 chnl=15
+char id=1060 x=2245 y=642 width=107 height=128 xoffset=10 yoffset=37 xadvance=127 page=0 chnl=15
+char id=1062 x=2364 y=642 width=98 height=150 xoffset=15 yoffset=39 xadvance=120 page=0 chnl=15
+char id=1063 x=2474 y=642 width=86 height=121 xoffset=15 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1065 x=2572 y=642 width=134 height=150 xoffset=15 yoffset=39 xadvance=156 page=0 chnl=15
+char id=1068 x=2718 y=642 width=84 height=121 xoffset=15 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1070 x=2814 y=642 width=140 height=124 xoffset=15 yoffset=38 xadvance=167 page=0 chnl=15
+char id=1071 x=2966 y=642 width=84 height=121 xoffset=5 yoffset=39 xadvance=104 page=0 chnl=15
+char id=1072 x=3062 y=642 width=69 height=95 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=1073 x=3143 y=642 width=79 height=126 xoffset=9 yoffset=36 xadvance=96 page=0 chnl=15
+char id=1074 x=3234 y=642 width=71 height=91 xoffset=13 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1075 x=3317 y=642 width=55 height=91 xoffset=13 yoffset=69 xadvance=75 page=0 chnl=15
+char id=1076 x=3384 y=642 width=92 height=117 xoffset=3 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1077 x=3488 y=642 width=78 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1078 x=3578 y=642 width=119 height=91 xoffset=8 yoffset=69 xadvance=134 page=0 chnl=15
+char id=1079 x=3709 y=642 width=67 height=94 xoffset=7 yoffset=68 xadvance=81 page=0 chnl=15
+char id=1080 x=3788 y=642 width=72 height=91 xoffset=13 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1081 x=3872 y=642 width=72 height=121 xoffset=13 yoffset=39 xadvance=98 page=0 chnl=15
+char id=1082 x=3956 y=642 width=69 height=91 xoffset=13 yoffset=69 xadvance=85 page=0 chnl=15
+char id=1083 x=6 y=854 width=80 height=91 xoffset=4 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1084 x=98 y=854 width=96 height=91 xoffset=13 yoffset=69 xadvance=122 page=0 chnl=15
+char id=1085 x=206 y=854 width=70 height=91 xoffset=13 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1086 x=288 y=854 width=80 height=94 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1087 x=380 y=854 width=70 height=91 xoffset=13 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1088 x=462 y=854 width=77 height=126 xoffset=13 yoffset=68 xadvance=99 page=0 chnl=15
+char id=1089 x=551 y=854 width=75 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15
+char id=1090 x=638 y=854 width=71 height=91 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15
+char id=1091 x=721 y=854 width=78 height=125 xoffset=6 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1092 x=811 y=854 width=97 height=152 xoffset=9 yoffset=39 xadvance=114 page=0 chnl=15
+char id=1093 x=920 y=854 width=71 height=91 xoffset=8 yoffset=69 xadvance=87 page=0 chnl=15
+char id=1094 x=1003 y=854 width=80 height=121 xoffset=13 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1095 x=1095 y=854 width=68 height=91 xoffset=13 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1096 x=1175 y=854 width=107 height=91 xoffset=13 yoffset=69 xadvance=133 page=0 chnl=15
+char id=1097 x=1294 y=854 width=118 height=117 xoffset=13 yoffset=69 xadvance=137 page=0 chnl=15
+char id=1100 x=1424 y=854 width=68 height=91 xoffset=13 yoffset=69 xadvance=89 page=0 chnl=15
+char id=1102 x=1504 y=854 width=117 height=94 xoffset=6 yoffset=68 xadvance=133 page=0 chnl=15
+char id=1103 x=1633 y=854 width=71 height=91 xoffset=7 yoffset=69 xadvance=91 page=0 chnl=15
+char id=1108 x=1716 y=854 width=74 height=94 xoffset=2 yoffset=68 xadvance=85 page=0 chnl=15
+char id=1110 x=1802 y=854 width=17 height=121 xoffset=11 yoffset=39 xadvance=38 page=0 chnl=15
+char id=1111 x=1831 y=854 width=46 height=121 xoffset=-4 yoffset=39 xadvance=38 page=0 chnl=15
+char id=8209 x=1889 y=854 width=51 height=11 xoffset=0 yoffset=103 xadvance=53 page=0 chnl=15
+char id=8211 x=1952 y=854 width=83 height=11 xoffset=0 yoffset=103 xadvance=82 page=0 chnl=15
+char id=8220 x=2047 y=854 width=49 height=41 xoffset=8 yoffset=37 xadvance=58 page=0 chnl=15
+char id=8222 x=2108 y=854 width=49 height=42 xoffset=2 yoffset=144 xadvance=58 page=0 chnl=15
+char id=8226 x=2169 y=854 width=45 height=46 xoffset=24 yoffset=89 xadvance=92 page=0 chnl=15
+char id=8364 x=2226 y=854 width=96 height=124 xoffset=4 yoffset=38 xadvance=110 page=0 chnl=15
+char id=8627 x=2334 y=854 width=128 height=102 xoffset=16 yoffset=39 xadvance=159 page=0 chnl=15
+char id=8679 x=2474 y=854 width=131 height=130 xoffset=15 yoffset=30 xadvance=160 page=0 chnl=15
+char id=9003 x=2617 y=854 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=2802 y=854 width=38 height=36 xoffset=39 yoffset=148 xadvance=116 page=0 chnl=15
+char id=9654 x=2852 y=854 width=128 height=152 xoffset=14 yoffset=24 xadvance=148 page=0 chnl=15
+char id=9664 x=2992 y=854 width=128 height=152 xoffset=7 yoffset=24 xadvance=148 page=0 chnl=15
+char id=9675 x=3132 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=3269 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=3406 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=3418 y=854 width=112 height=80 xoffset=18 yoffset=64 xadvance=145 page=0 chnl=15
+char id=10004 x=3542 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=3554 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=3566 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=3578 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=3590 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-Light.png b/selfdrive/assets/fonts/Inter-Light.png
new file mode 100644
index 000000000..633e75cc7
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Light.png differ
diff --git a/selfdrive/assets/fonts/Inter-Light.ttf b/selfdrive/assets/fonts/Inter-Light.ttf
new file mode 100644
index 000000000..a5f073690
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Light.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-Medium.fnt b/selfdrive/assets/fonts/Inter-Medium.fnt
new file mode 100644
index 000000000..c48d1697c
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-Medium.fnt
@@ -0,0 +1,231 @@
+info face="Inter-Medium" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-Medium.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=43 height=200 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15
+char id=33 x=73 y=6 width=25 height=123 xoffset=12 yoffset=39 xadvance=48 page=0 chnl=15
+char id=34 x=110 y=6 width=46 height=44 xoffset=10 yoffset=39 xadvance=66 page=0 chnl=15
+char id=35 x=168 y=6 width=101 height=121 xoffset=2 yoffset=39 xadvance=105 page=0 chnl=15
+char id=36 x=281 y=6 width=90 height=152 xoffset=8 yoffset=24 xadvance=106 page=0 chnl=15
+char id=37 x=383 y=6 width=111 height=126 xoffset=13 yoffset=37 xadvance=136 page=0 chnl=15
+char id=38 x=506 y=6 width=99 height=124 xoffset=7 yoffset=38 xadvance=107 page=0 chnl=15
+char id=39 x=617 y=6 width=16 height=44 xoffset=10 yoffset=39 xadvance=35 page=0 chnl=15
+char id=40 x=645 y=6 width=40 height=150 xoffset=16 yoffset=35 xadvance=62 page=0 chnl=15
+char id=41 x=697 y=6 width=40 height=150 xoffset=6 yoffset=35 xadvance=62 page=0 chnl=15
+char id=42 x=749 y=6 width=66 height=69 xoffset=10 yoffset=39 xadvance=86 page=0 chnl=15
+char id=43 x=827 y=6 width=80 height=80 xoffset=15 yoffset=73 xadvance=110 page=0 chnl=15
+char id=44 x=919 y=6 width=25 height=47 xoffset=10 yoffset=143 xadvance=47 page=0 chnl=15
+char id=45 x=956 y=6 width=54 height=16 xoffset=11 yoffset=101 xadvance=76 page=0 chnl=15
+char id=46 x=1022 y=6 width=25 height=25 xoffset=11 yoffset=137 xadvance=46 page=0 chnl=15
+char id=47 x=1059 y=6 width=55 height=145 xoffset=3 yoffset=34 xadvance=60 page=0 chnl=15
+char id=48 x=1126 y=6 width=89 height=124 xoffset=9 yoffset=38 xadvance=106 page=0 chnl=15
+char id=49 x=1227 y=6 width=49 height=121 xoffset=9 yoffset=39 xadvance=78 page=0 chnl=15
+char id=50 x=1288 y=6 width=80 height=122 xoffset=11 yoffset=38 xadvance=101 page=0 chnl=15
+char id=51 x=1380 y=6 width=86 height=124 xoffset=10 yoffset=38 xadvance=106 page=0 chnl=15
+char id=52 x=1478 y=6 width=91 height=121 xoffset=9 yoffset=39 xadvance=108 page=0 chnl=15
+char id=53 x=1581 y=6 width=82 height=123 xoffset=11 yoffset=39 xadvance=102 page=0 chnl=15
+char id=54 x=1675 y=6 width=87 height=125 xoffset=9 yoffset=37 xadvance=105 page=0 chnl=15
+char id=55 x=1774 y=6 width=80 height=121 xoffset=7 yoffset=39 xadvance=95 page=0 chnl=15
+char id=56 x=1866 y=6 width=86 height=124 xoffset=9 yoffset=38 xadvance=104 page=0 chnl=15
+char id=57 x=1964 y=6 width=87 height=125 xoffset=9 yoffset=37 xadvance=105 page=0 chnl=15
+char id=58 x=2063 y=6 width=25 height=90 xoffset=11 yoffset=72 xadvance=46 page=0 chnl=15
+char id=59 x=2100 y=6 width=28 height=118 xoffset=10 yoffset=72 xadvance=47 page=0 chnl=15
+char id=60 x=2140 y=6 width=79 height=90 xoffset=16 yoffset=68 xadvance=110 page=0 chnl=15
+char id=61 x=2231 y=6 width=76 height=53 xoffset=17 yoffset=86 xadvance=110 page=0 chnl=15
+char id=62 x=2319 y=6 width=79 height=90 xoffset=16 yoffset=68 xadvance=110 page=0 chnl=15
+char id=63 x=2410 y=6 width=73 height=124 xoffset=6 yoffset=38 xadvance=86 page=0 chnl=15
+char id=64 x=2495 y=6 width=145 height=151 xoffset=8 yoffset=42 xadvance=159 page=0 chnl=15
+char id=65 x=2652 y=6 width=108 height=121 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15
+char id=66 x=2772 y=6 width=87 height=121 xoffset=13 yoffset=39 xadvance=108 page=0 chnl=15
+char id=67 x=2871 y=6 width=105 height=124 xoffset=9 yoffset=38 xadvance=121 page=0 chnl=15
+char id=68 x=2988 y=6 width=97 height=121 xoffset=13 yoffset=39 xadvance=119 page=0 chnl=15
+char id=69 x=3097 y=6 width=77 height=121 xoffset=13 yoffset=39 xadvance=99 page=0 chnl=15
+char id=70 x=3186 y=6 width=75 height=121 xoffset=13 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3273 y=6 width=105 height=124 xoffset=9 yoffset=38 xadvance=123 page=0 chnl=15
+char id=72 x=3390 y=6 width=97 height=121 xoffset=13 yoffset=39 xadvance=122 page=0 chnl=15
+char id=73 x=3499 y=6 width=19 height=121 xoffset=13 yoffset=39 xadvance=44 page=0 chnl=15
+char id=74 x=3530 y=6 width=73 height=123 xoffset=5 yoffset=39 xadvance=91 page=0 chnl=15
+char id=75 x=3615 y=6 width=94 height=121 xoffset=13 yoffset=39 xadvance=109 page=0 chnl=15
+char id=76 x=3721 y=6 width=73 height=121 xoffset=13 yoffset=39 xadvance=93 page=0 chnl=15
+char id=77 x=3806 y=6 width=123 height=121 xoffset=13 yoffset=39 xadvance=148 page=0 chnl=15
+char id=78 x=3941 y=6 width=98 height=121 xoffset=13 yoffset=39 xadvance=123 page=0 chnl=15
+char id=79 x=6 y=218 width=109 height=124 xoffset=9 yoffset=38 xadvance=126 page=0 chnl=15
+char id=80 x=127 y=218 width=85 height=121 xoffset=13 yoffset=39 xadvance=105 page=0 chnl=15
+char id=81 x=224 y=218 width=109 height=133 xoffset=9 yoffset=38 xadvance=126 page=0 chnl=15
+char id=82 x=345 y=218 width=90 height=121 xoffset=13 yoffset=39 xadvance=106 page=0 chnl=15
+char id=83 x=447 y=218 width=90 height=124 xoffset=8 yoffset=38 xadvance=106 page=0 chnl=15
+char id=84 x=549 y=218 width=94 height=121 xoffset=7 yoffset=39 xadvance=107 page=0 chnl=15
+char id=85 x=655 y=218 width=96 height=123 xoffset=13 yoffset=39 xadvance=121 page=0 chnl=15
+char id=86 x=763 y=218 width=108 height=121 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15
+char id=87 x=883 y=218 width=156 height=121 xoffset=3 yoffset=39 xadvance=161 page=0 chnl=15
+char id=88 x=1051 y=218 width=102 height=121 xoffset=4 yoffset=39 xadvance=110 page=0 chnl=15
+char id=89 x=1165 y=218 width=107 height=121 xoffset=3 yoffset=39 xadvance=113 page=0 chnl=15
+char id=90 x=1284 y=218 width=88 height=121 xoffset=9 yoffset=39 xadvance=105 page=0 chnl=15
+char id=91 x=1384 y=218 width=40 height=150 xoffset=18 yoffset=35 xadvance=62 page=0 chnl=15
+char id=92 x=1436 y=218 width=55 height=145 xoffset=3 yoffset=34 xadvance=60 page=0 chnl=15
+char id=93 x=1503 y=218 width=39 height=150 xoffset=5 yoffset=35 xadvance=62 page=0 chnl=15
+char id=94 x=1554 y=218 width=67 height=52 xoffset=6 yoffset=43 xadvance=78 page=0 chnl=15
+char id=95 x=1633 y=218 width=78 height=15 xoffset=-1 yoffset=160 xadvance=75 page=0 chnl=15
+char id=96 x=1723 y=218 width=33 height=28 xoffset=25 yoffset=30 xadvance=82 page=0 chnl=15
+char id=97 x=1768 y=218 width=76 height=94 xoffset=7 yoffset=68 xadvance=94 page=0 chnl=15
+char id=98 x=1856 y=218 width=83 height=123 xoffset=13 yoffset=39 xadvance=103 page=0 chnl=15
+char id=99 x=1951 y=218 width=80 height=94 xoffset=7 yoffset=68 xadvance=93 page=0 chnl=15
+char id=100 x=2043 y=218 width=84 height=123 xoffset=7 yoffset=39 xadvance=103 page=0 chnl=15
+char id=101 x=2139 y=218 width=83 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15
+char id=102 x=2234 y=218 width=57 height=126 xoffset=3 yoffset=34 xadvance=60 page=0 chnl=15
+char id=103 x=2303 y=218 width=84 height=128 xoffset=7 yoffset=68 xadvance=101 page=0 chnl=15
+char id=104 x=2399 y=218 width=77 height=121 xoffset=11 yoffset=39 xadvance=99 page=0 chnl=15
+char id=105 x=2488 y=218 width=23 height=125 xoffset=9 yoffset=35 xadvance=41 page=0 chnl=15
+char id=106 x=2523 y=218 width=35 height=159 xoffset=-3 yoffset=35 xadvance=41 page=0 chnl=15
+char id=107 x=2570 y=218 width=80 height=121 xoffset=11 yoffset=39 xadvance=91 page=0 chnl=15
+char id=108 x=2662 y=218 width=19 height=121 xoffset=11 yoffset=39 xadvance=41 page=0 chnl=15
+char id=109 x=2693 y=218 width=124 height=92 xoffset=11 yoffset=68 xadvance=146 page=0 chnl=15
+char id=110 x=2829 y=218 width=77 height=92 xoffset=11 yoffset=68 xadvance=98 page=0 chnl=15
+char id=111 x=2918 y=218 width=85 height=94 xoffset=7 yoffset=68 xadvance=99 page=0 chnl=15
+char id=112 x=3015 y=218 width=84 height=126 xoffset=11 yoffset=68 xadvance=101 page=0 chnl=15
+char id=113 x=3111 y=218 width=84 height=126 xoffset=7 yoffset=68 xadvance=101 page=0 chnl=15
+char id=114 x=3207 y=218 width=50 height=92 xoffset=11 yoffset=68 xadvance=63 page=0 chnl=15
+char id=115 x=3269 y=218 width=75 height=94 xoffset=7 yoffset=68 xadvance=88 page=0 chnl=15
+char id=116 x=3356 y=218 width=52 height=114 xoffset=4 yoffset=48 xadvance=61 page=0 chnl=15
+char id=117 x=3420 y=218 width=76 height=93 xoffset=11 yoffset=69 xadvance=98 page=0 chnl=15
+char id=118 x=3508 y=218 width=85 height=91 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15
+char id=119 x=3605 y=218 width=128 height=91 xoffset=4 yoffset=69 xadvance=136 page=0 chnl=15
+char id=120 x=3745 y=218 width=80 height=91 xoffset=6 yoffset=69 xadvance=91 page=0 chnl=15
+char id=121 x=3837 y=218 width=86 height=125 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15
+char id=122 x=3935 y=218 width=74 height=91 xoffset=9 yoffset=69 xadvance=91 page=0 chnl=15
+char id=123 x=4021 y=218 width=53 height=150 xoffset=5 yoffset=35 xadvance=62 page=0 chnl=15
+char id=124 x=6 y=430 width=17 height=198 xoffset=20 yoffset=1 xadvance=56 page=0 chnl=15
+char id=125 x=35 y=430 width=52 height=150 xoffset=5 yoffset=35 xadvance=62 page=0 chnl=15
+char id=126 x=99 y=430 width=85 height=34 xoffset=13 yoffset=95 xadvance=110 page=0 chnl=15
+char id=163 x=196 y=430 width=86 height=122 xoffset=10 yoffset=38 xadvance=106 page=0 chnl=15
+char id=165 x=294 y=430 width=88 height=121 xoffset=2 yoffset=39 xadvance=91 page=0 chnl=15
+char id=167 x=394 y=430 width=77 height=147 xoffset=8 yoffset=38 xadvance=93 page=0 chnl=15
+char id=171 x=483 y=430 width=73 height=73 xoffset=10 yoffset=75 xadvance=93 page=0 chnl=15
+char id=176 x=568 y=430 width=56 height=57 xoffset=10 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=636 y=430 width=73 height=73 xoffset=10 yoffset=75 xadvance=94 page=0 chnl=15
+char id=191 x=721 y=430 width=73 height=124 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15
+char id=192 x=806 y=430 width=108 height=160 xoffset=4 yoffset=0 xadvance=115 page=0 chnl=15
+char id=193 x=926 y=430 width=108 height=160 xoffset=4 yoffset=0 xadvance=115 page=0 chnl=15
+char id=195 x=1046 y=430 width=108 height=155 xoffset=4 yoffset=5 xadvance=115 page=0 chnl=15
+char id=196 x=1166 y=430 width=108 height=155 xoffset=4 yoffset=5 xadvance=115 page=0 chnl=15
+char id=199 x=1286 y=430 width=105 height=159 xoffset=9 yoffset=38 xadvance=121 page=0 chnl=15
+char id=201 x=1403 y=430 width=77 height=160 xoffset=13 yoffset=0 xadvance=99 page=0 chnl=15
+char id=202 x=1492 y=430 width=77 height=157 xoffset=13 yoffset=3 xadvance=99 page=0 chnl=15
+char id=205 x=1581 y=430 width=35 height=160 xoffset=13 yoffset=0 xadvance=44 page=0 chnl=15
+char id=209 x=1628 y=430 width=98 height=154 xoffset=13 yoffset=6 xadvance=123 page=0 chnl=15
+char id=211 x=1738 y=430 width=109 height=162 xoffset=9 yoffset=0 xadvance=126 page=0 chnl=15
+char id=212 x=1859 y=430 width=109 height=159 xoffset=9 yoffset=3 xadvance=126 page=0 chnl=15
+char id=214 x=1980 y=430 width=109 height=157 xoffset=9 yoffset=5 xadvance=126 page=0 chnl=15
+char id=215 x=2101 y=430 width=80 height=79 xoffset=15 yoffset=73 xadvance=110 page=0 chnl=15
+char id=220 x=2193 y=430 width=96 height=157 xoffset=13 yoffset=5 xadvance=121 page=0 chnl=15
+char id=223 x=2301 y=430 width=83 height=122 xoffset=13 yoffset=38 xadvance=103 page=0 chnl=15
+char id=224 x=2396 y=430 width=76 height=132 xoffset=7 yoffset=30 xadvance=94 page=0 chnl=15
+char id=225 x=2484 y=430 width=76 height=132 xoffset=7 yoffset=30 xadvance=94 page=0 chnl=15
+char id=226 x=2572 y=430 width=76 height=129 xoffset=7 yoffset=33 xadvance=94 page=0 chnl=15
+char id=227 x=2660 y=430 width=76 height=126 xoffset=7 yoffset=36 xadvance=94 page=0 chnl=15
+char id=228 x=2748 y=430 width=76 height=127 xoffset=7 yoffset=35 xadvance=94 page=0 chnl=15
+char id=231 x=2836 y=430 width=80 height=129 xoffset=7 yoffset=68 xadvance=93 page=0 chnl=15
+char id=232 x=2928 y=430 width=83 height=132 xoffset=7 yoffset=30 xadvance=97 page=0 chnl=15
+char id=233 x=3023 y=430 width=83 height=132 xoffset=7 yoffset=30 xadvance=97 page=0 chnl=15
+char id=234 x=3118 y=430 width=83 height=129 xoffset=7 yoffset=33 xadvance=97 page=0 chnl=15
+char id=237 x=3213 y=430 width=35 height=130 xoffset=11 yoffset=30 xadvance=41 page=0 chnl=15
+char id=238 x=3260 y=430 width=57 height=127 xoffset=-8 yoffset=33 xadvance=41 page=0 chnl=15
+char id=241 x=3329 y=430 width=77 height=124 xoffset=11 yoffset=36 xadvance=98 page=0 chnl=15
+char id=243 x=3418 y=430 width=85 height=132 xoffset=7 yoffset=30 xadvance=99 page=0 chnl=15
+char id=244 x=3515 y=430 width=85 height=129 xoffset=7 yoffset=33 xadvance=99 page=0 chnl=15
+char id=245 x=3612 y=430 width=85 height=126 xoffset=7 yoffset=36 xadvance=99 page=0 chnl=15
+char id=246 x=3709 y=430 width=85 height=127 xoffset=7 yoffset=35 xadvance=99 page=0 chnl=15
+char id=249 x=3806 y=430 width=76 height=132 xoffset=11 yoffset=30 xadvance=98 page=0 chnl=15
+char id=250 x=3894 y=430 width=76 height=132 xoffset=11 yoffset=30 xadvance=98 page=0 chnl=15
+char id=251 x=3982 y=430 width=76 height=129 xoffset=11 yoffset=33 xadvance=98 page=0 chnl=15
+char id=252 x=6 y=642 width=76 height=127 xoffset=11 yoffset=35 xadvance=98 page=0 chnl=15
+char id=286 x=94 y=642 width=105 height=153 xoffset=9 yoffset=9 xadvance=123 page=0 chnl=15
+char id=287 x=211 y=642 width=84 height=157 xoffset=7 yoffset=39 xadvance=101 page=0 chnl=15
+char id=304 x=307 y=642 width=23 height=156 xoffset=11 yoffset=4 xadvance=44 page=0 chnl=15
+char id=305 x=342 y=642 width=19 height=91 xoffset=11 yoffset=69 xadvance=41 page=0 chnl=15
+char id=339 x=373 y=642 width=150 height=94 xoffset=7 yoffset=68 xadvance=162 page=0 chnl=15
+char id=350 x=535 y=642 width=90 height=159 xoffset=8 yoffset=38 xadvance=106 page=0 chnl=15
+char id=351 x=637 y=642 width=75 height=129 xoffset=7 yoffset=68 xadvance=88 page=0 chnl=15
+char id=1028 x=724 y=642 width=95 height=124 xoffset=9 yoffset=38 xadvance=111 page=0 chnl=15
+char id=1030 x=831 y=642 width=19 height=121 xoffset=13 yoffset=39 xadvance=44 page=0 chnl=15
+char id=1040 x=862 y=642 width=108 height=121 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15
+char id=1041 x=982 y=642 width=88 height=121 xoffset=13 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1042 x=1082 y=642 width=87 height=121 xoffset=13 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1043 x=1181 y=642 width=76 height=121 xoffset=13 yoffset=39 xadvance=95 page=0 chnl=15
+char id=1044 x=1269 y=642 width=116 height=151 xoffset=4 yoffset=39 xadvance=126 page=0 chnl=15
+char id=1045 x=1397 y=642 width=77 height=121 xoffset=13 yoffset=39 xadvance=99 page=0 chnl=15
+char id=1046 x=1486 y=642 width=156 height=121 xoffset=4 yoffset=39 xadvance=164 page=0 chnl=15
+char id=1047 x=1654 y=642 width=86 height=124 xoffset=10 yoffset=38 xadvance=106 page=0 chnl=15
+char id=1048 x=1752 y=642 width=98 height=121 xoffset=13 yoffset=39 xadvance=123 page=0 chnl=15
+char id=1049 x=1862 y=642 width=98 height=151 xoffset=13 yoffset=9 xadvance=123 page=0 chnl=15
+char id=1050 x=1972 y=642 width=94 height=121 xoffset=13 yoffset=39 xadvance=111 page=0 chnl=15
+char id=1051 x=2078 y=642 width=102 height=121 xoffset=4 yoffset=39 xadvance=118 page=0 chnl=15
+char id=1052 x=2192 y=642 width=123 height=121 xoffset=13 yoffset=39 xadvance=148 page=0 chnl=15
+char id=1053 x=2327 y=642 width=97 height=121 xoffset=13 yoffset=39 xadvance=122 page=0 chnl=15
+char id=1054 x=2436 y=642 width=109 height=124 xoffset=9 yoffset=38 xadvance=126 page=0 chnl=15
+char id=1055 x=2557 y=642 width=94 height=121 xoffset=14 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1056 x=2663 y=642 width=85 height=121 xoffset=13 yoffset=39 xadvance=105 page=0 chnl=15
+char id=1057 x=2760 y=642 width=105 height=124 xoffset=9 yoffset=38 xadvance=121 page=0 chnl=15
+char id=1058 x=2877 y=642 width=94 height=121 xoffset=7 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1059 x=2983 y=642 width=99 height=123 xoffset=3 yoffset=39 xadvance=105 page=0 chnl=15
+char id=1060 x=3094 y=642 width=117 height=128 xoffset=9 yoffset=37 xadvance=134 page=0 chnl=15
+char id=1062 x=3223 y=642 width=107 height=150 xoffset=13 yoffset=39 xadvance=126 page=0 chnl=15
+char id=1063 x=3342 y=642 width=92 height=121 xoffset=15 yoffset=39 xadvance=120 page=0 chnl=15
+char id=1065 x=3446 y=642 width=146 height=150 xoffset=14 yoffset=39 xadvance=166 page=0 chnl=15
+char id=1068 x=3604 y=642 width=88 height=121 xoffset=13 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1070 x=3704 y=642 width=148 height=124 xoffset=13 yoffset=38 xadvance=166 page=0 chnl=15
+char id=1071 x=3864 y=642 width=90 height=121 xoffset=4 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1072 x=3966 y=642 width=76 height=94 xoffset=7 yoffset=68 xadvance=94 page=0 chnl=15
+char id=1073 x=6 y=854 width=84 height=126 xoffset=7 yoffset=36 xadvance=98 page=0 chnl=15
+char id=1074 x=102 y=854 width=76 height=91 xoffset=11 yoffset=69 xadvance=93 page=0 chnl=15
+char id=1075 x=190 y=854 width=59 height=91 xoffset=11 yoffset=69 xadvance=76 page=0 chnl=15
+char id=1076 x=261 y=854 width=99 height=117 xoffset=2 yoffset=69 xadvance=105 page=0 chnl=15
+char id=1077 x=372 y=854 width=83 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1078 x=467 y=854 width=128 height=91 xoffset=6 yoffset=69 xadvance=139 page=0 chnl=15
+char id=1079 x=607 y=854 width=72 height=94 xoffset=6 yoffset=68 xadvance=83 page=0 chnl=15
+char id=1080 x=691 y=854 width=77 height=91 xoffset=11 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1081 x=780 y=854 width=77 height=121 xoffset=11 yoffset=39 xadvance=99 page=0 chnl=15
+char id=1082 x=869 y=854 width=79 height=91 xoffset=11 yoffset=69 xadvance=91 page=0 chnl=15
+char id=1083 x=960 y=854 width=83 height=91 xoffset=4 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1084 x=1055 y=854 width=103 height=91 xoffset=11 yoffset=69 xadvance=124 page=0 chnl=15
+char id=1085 x=1170 y=854 width=75 height=91 xoffset=11 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1086 x=1257 y=854 width=85 height=94 xoffset=7 yoffset=68 xadvance=99 page=0 chnl=15
+char id=1087 x=1354 y=854 width=75 height=91 xoffset=11 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1088 x=1441 y=854 width=84 height=126 xoffset=11 yoffset=68 xadvance=101 page=0 chnl=15
+char id=1089 x=1537 y=854 width=80 height=94 xoffset=7 yoffset=68 xadvance=93 page=0 chnl=15
+char id=1090 x=1629 y=854 width=77 height=91 xoffset=6 yoffset=69 xadvance=89 page=0 chnl=15
+char id=1091 x=1718 y=854 width=86 height=125 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15
+char id=1092 x=1816 y=854 width=104 height=152 xoffset=7 yoffset=39 xadvance=118 page=0 chnl=15
+char id=1093 x=1932 y=854 width=80 height=91 xoffset=6 yoffset=69 xadvance=91 page=0 chnl=15
+char id=1094 x=2024 y=854 width=92 height=121 xoffset=11 yoffset=69 xadvance=109 page=0 chnl=15
+char id=1095 x=2128 y=854 width=74 height=91 xoffset=11 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1096 x=2214 y=854 width=115 height=91 xoffset=11 yoffset=69 xadvance=137 page=0 chnl=15
+char id=1097 x=2341 y=854 width=130 height=117 xoffset=11 yoffset=69 xadvance=147 page=0 chnl=15
+char id=1100 x=2483 y=854 width=75 height=91 xoffset=11 yoffset=69 xadvance=93 page=0 chnl=15
+char id=1102 x=2570 y=854 width=122 height=94 xoffset=5 yoffset=68 xadvance=135 page=0 chnl=15
+char id=1103 x=2704 y=854 width=77 height=91 xoffset=6 yoffset=69 xadvance=93 page=0 chnl=15
+char id=1108 x=2793 y=854 width=80 height=94 xoffset=3 yoffset=68 xadvance=91 page=0 chnl=15
+char id=1110 x=2885 y=854 width=23 height=125 xoffset=9 yoffset=35 xadvance=41 page=0 chnl=15
+char id=1111 x=2920 y=854 width=56 height=125 xoffset=-7 yoffset=35 xadvance=41 page=0 chnl=15
+char id=8209 x=2988 y=854 width=54 height=16 xoffset=6 yoffset=101 xadvance=65 page=0 chnl=15
+char id=8211 x=3054 y=854 width=83 height=16 xoffset=0 yoffset=101 xadvance=82 page=0 chnl=15
+char id=8220 x=3149 y=854 width=54 height=42 xoffset=8 yoffset=36 xadvance=65 page=0 chnl=15
+char id=8222 x=3215 y=854 width=54 height=42 xoffset=3 yoffset=144 xadvance=65 page=0 chnl=15
+char id=8226 x=3281 y=854 width=53 height=52 xoffset=17 yoffset=86 xadvance=87 page=0 chnl=15
+char id=8364 x=3346 y=854 width=98 height=124 xoffset=4 yoffset=38 xadvance=111 page=0 chnl=15
+char id=8627 x=3456 y=854 width=133 height=105 xoffset=16 yoffset=39 xadvance=164 page=0 chnl=15
+char id=8679 x=3601 y=854 width=146 height=130 xoffset=14 yoffset=30 xadvance=173 page=0 chnl=15
+char id=9003 x=3759 y=854 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=3944 y=854 width=99 height=39 xoffset=11 yoffset=148 xadvance=121 page=0 chnl=15
+char id=9654 x=6 y=1066 width=130 height=152 xoffset=16 yoffset=24 xadvance=153 page=0 chnl=15
+char id=9664 x=148 y=1066 width=130 height=152 xoffset=8 yoffset=24 xadvance=153 page=0 chnl=15
+char id=9675 x=290 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=427 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=564 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=576 y=1066 width=116 height=86 xoffset=17 yoffset=62 xadvance=145 page=0 chnl=15
+char id=10004 x=704 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=716 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=728 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=740 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=752 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-Medium.png b/selfdrive/assets/fonts/Inter-Medium.png
new file mode 100644
index 000000000..b2ebf1c9d
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Medium.png differ
diff --git a/selfdrive/assets/fonts/Inter-Medium.ttf b/selfdrive/assets/fonts/Inter-Medium.ttf
new file mode 100644
index 000000000..721147d83
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Medium.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-Regular.fnt b/selfdrive/assets/fonts/Inter-Regular.fnt
new file mode 100644
index 000000000..d3f88efe2
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-Regular.fnt
@@ -0,0 +1,231 @@
+info face="Inter-Regular" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-Regular.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15
+char id=33 x=76 y=6 width=22 height=122 xoffset=12 yoffset=39 xadvance=46 page=0 chnl=15
+char id=34 x=110 y=6 width=44 height=43 xoffset=11 yoffset=39 xadvance=66 page=0 chnl=15
+char id=35 x=166 y=6 width=100 height=121 xoffset=2 yoffset=39 xadvance=104 page=0 chnl=15
+char id=36 x=278 y=6 width=88 height=152 xoffset=9 yoffset=24 xadvance=105 page=0 chnl=15
+char id=37 x=378 y=6 width=108 height=124 xoffset=13 yoffset=38 xadvance=134 page=0 chnl=15
+char id=38 x=498 y=6 width=96 height=124 xoffset=8 yoffset=38 xadvance=105 page=0 chnl=15
+char id=39 x=606 y=6 width=14 height=43 xoffset=11 yoffset=39 xadvance=36 page=0 chnl=15
+char id=40 x=632 y=6 width=36 height=151 xoffset=17 yoffset=34 xadvance=59 page=0 chnl=15
+char id=41 x=680 y=6 width=36 height=151 xoffset=7 yoffset=34 xadvance=59 page=0 chnl=15
+char id=42 x=728 y=6 width=65 height=69 xoffset=9 yoffset=39 xadvance=82 page=0 chnl=15
+char id=43 x=805 y=6 width=79 height=78 xoffset=15 yoffset=74 xadvance=108 page=0 chnl=15
+char id=44 x=896 y=6 width=23 height=47 xoffset=11 yoffset=143 xadvance=46 page=0 chnl=15
+char id=45 x=931 y=6 width=54 height=13 xoffset=11 yoffset=102 xadvance=76 page=0 chnl=15
+char id=46 x=997 y=6 width=22 height=22 xoffset=12 yoffset=139 xadvance=45 page=0 chnl=15
+char id=47 x=1031 y=6 width=53 height=145 xoffset=3 yoffset=34 xadvance=58 page=0 chnl=15
+char id=48 x=1096 y=6 width=85 height=124 xoffset=9 yoffset=38 xadvance=103 page=0 chnl=15
+char id=49 x=1193 y=6 width=45 height=121 xoffset=10 yoffset=39 xadvance=76 page=0 chnl=15
+char id=50 x=1250 y=6 width=77 height=122 xoffset=12 yoffset=38 xadvance=100 page=0 chnl=15
+char id=51 x=1339 y=6 width=82 height=124 xoffset=12 yoffset=38 xadvance=105 page=0 chnl=15
+char id=52 x=1433 y=6 width=88 height=121 xoffset=9 yoffset=39 xadvance=106 page=0 chnl=15
+char id=53 x=1533 y=6 width=78 height=123 xoffset=12 yoffset=39 xadvance=100 page=0 chnl=15
+char id=54 x=1623 y=6 width=83 height=125 xoffset=10 yoffset=37 xadvance=103 page=0 chnl=15
+char id=55 x=1718 y=6 width=78 height=121 xoffset=7 yoffset=39 xadvance=94 page=0 chnl=15
+char id=56 x=1808 y=6 width=82 height=124 xoffset=10 yoffset=38 xadvance=101 page=0 chnl=15
+char id=57 x=1902 y=6 width=83 height=125 xoffset=10 yoffset=37 xadvance=103 page=0 chnl=15
+char id=58 x=1997 y=6 width=22 height=89 xoffset=12 yoffset=72 xadvance=45 page=0 chnl=15
+char id=59 x=2031 y=6 width=25 height=118 xoffset=11 yoffset=72 xadvance=46 page=0 chnl=15
+char id=60 x=2068 y=6 width=77 height=88 xoffset=16 yoffset=69 xadvance=108 page=0 chnl=15
+char id=61 x=2157 y=6 width=73 height=48 xoffset=18 yoffset=89 xadvance=108 page=0 chnl=15
+char id=62 x=2242 y=6 width=77 height=88 xoffset=16 yoffset=69 xadvance=108 page=0 chnl=15
+char id=63 x=2331 y=6 width=70 height=123 xoffset=6 yoffset=38 xadvance=83 page=0 chnl=15
+char id=64 x=2413 y=6 width=140 height=148 xoffset=7 yoffset=44 xadvance=154 page=0 chnl=15
+char id=65 x=2565 y=6 width=104 height=121 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15
+char id=66 x=2681 y=6 width=85 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15
+char id=67 x=2778 y=6 width=103 height=124 xoffset=9 yoffset=38 xadvance=120 page=0 chnl=15
+char id=68 x=2893 y=6 width=95 height=121 xoffset=14 yoffset=39 xadvance=118 page=0 chnl=15
+char id=69 x=3000 y=6 width=75 height=121 xoffset=14 yoffset=39 xadvance=98 page=0 chnl=15
+char id=70 x=3087 y=6 width=73 height=121 xoffset=14 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3172 y=6 width=104 height=124 xoffset=9 yoffset=38 xadvance=122 page=0 chnl=15
+char id=72 x=3288 y=6 width=94 height=121 xoffset=14 yoffset=39 xadvance=122 page=0 chnl=15
+char id=73 x=3394 y=6 width=16 height=121 xoffset=14 yoffset=39 xadvance=43 page=0 chnl=15
+char id=74 x=3422 y=6 width=70 height=123 xoffset=6 yoffset=39 xadvance=89 page=0 chnl=15
+char id=75 x=3504 y=6 width=90 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15
+char id=76 x=3606 y=6 width=71 height=121 xoffset=14 yoffset=39 xadvance=92 page=0 chnl=15
+char id=77 x=3689 y=6 width=119 height=121 xoffset=14 yoffset=39 xadvance=146 page=0 chnl=15
+char id=78 x=3820 y=6 width=96 height=121 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15
+char id=79 x=3928 y=6 width=107 height=124 xoffset=9 yoffset=38 xadvance=125 page=0 chnl=15
+char id=80 x=6 y=218 width=83 height=121 xoffset=14 yoffset=39 xadvance=104 page=0 chnl=15
+char id=81 x=101 y=218 width=107 height=134 xoffset=9 yoffset=38 xadvance=125 page=0 chnl=15
+char id=82 x=220 y=218 width=87 height=121 xoffset=14 yoffset=39 xadvance=105 page=0 chnl=15
+char id=83 x=319 y=218 width=88 height=125 xoffset=9 yoffset=38 xadvance=105 page=0 chnl=15
+char id=84 x=419 y=218 width=92 height=121 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15
+char id=85 x=523 y=218 width=94 height=124 xoffset=14 yoffset=39 xadvance=122 page=0 chnl=15
+char id=86 x=629 y=218 width=104 height=121 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15
+char id=87 x=745 y=218 width=151 height=121 xoffset=3 yoffset=39 xadvance=156 page=0 chnl=15
+char id=88 x=908 y=218 width=98 height=121 xoffset=4 yoffset=39 xadvance=106 page=0 chnl=15
+char id=89 x=1018 y=218 width=102 height=121 xoffset=4 yoffset=39 xadvance=109 page=0 chnl=15
+char id=90 x=1132 y=218 width=85 height=121 xoffset=9 yoffset=39 xadvance=103 page=0 chnl=15
+char id=91 x=1229 y=218 width=36 height=151 xoffset=19 yoffset=34 xadvance=59 page=0 chnl=15
+char id=92 x=1277 y=218 width=53 height=145 xoffset=3 yoffset=34 xadvance=58 page=0 chnl=15
+char id=93 x=1342 y=218 width=36 height=151 xoffset=5 yoffset=34 xadvance=59 page=0 chnl=15
+char id=94 x=1390 y=218 width=65 height=52 xoffset=6 yoffset=43 xadvance=77 page=0 chnl=15
+char id=95 x=1467 y=218 width=76 height=13 xoffset=-1 yoffset=160 xadvance=74 page=0 chnl=15
+char id=96 x=1555 y=218 width=32 height=28 xoffset=25 yoffset=30 xadvance=82 page=0 chnl=15
+char id=97 x=1599 y=218 width=73 height=95 xoffset=8 yoffset=68 xadvance=93 page=0 chnl=15
+char id=98 x=1684 y=218 width=81 height=123 xoffset=14 yoffset=39 xadvance=102 page=0 chnl=15
+char id=99 x=1777 y=218 width=77 height=94 xoffset=8 yoffset=68 xadvance=92 page=0 chnl=15
+char id=100 x=1866 y=218 width=81 height=123 xoffset=8 yoffset=39 xadvance=102 page=0 chnl=15
+char id=101 x=1959 y=218 width=80 height=94 xoffset=8 yoffset=68 xadvance=96 page=0 chnl=15
+char id=102 x=2051 y=218 width=54 height=126 xoffset=4 yoffset=34 xadvance=59 page=0 chnl=15
+char id=103 x=2117 y=218 width=81 height=128 xoffset=8 yoffset=68 xadvance=100 page=0 chnl=15
+char id=104 x=2210 y=218 width=73 height=121 xoffset=12 yoffset=39 xadvance=97 page=0 chnl=15
+char id=105 x=2295 y=218 width=21 height=124 xoffset=9 yoffset=36 xadvance=39 page=0 chnl=15
+char id=106 x=2328 y=218 width=33 height=158 xoffset=-3 yoffset=36 xadvance=39 page=0 chnl=15
+char id=107 x=2373 y=218 width=76 height=121 xoffset=12 yoffset=39 xadvance=89 page=0 chnl=15
+char id=108 x=2461 y=218 width=15 height=121 xoffset=12 yoffset=39 xadvance=39 page=0 chnl=15
+char id=109 x=2488 y=218 width=119 height=92 xoffset=12 yoffset=68 xadvance=143 page=0 chnl=15
+char id=110 x=2619 y=218 width=73 height=92 xoffset=12 yoffset=68 xadvance=96 page=0 chnl=15
+char id=111 x=2704 y=218 width=83 height=94 xoffset=8 yoffset=68 xadvance=98 page=0 chnl=15
+char id=112 x=2799 y=218 width=81 height=126 xoffset=12 yoffset=68 xadvance=100 page=0 chnl=15
+char id=113 x=2892 y=218 width=81 height=126 xoffset=8 yoffset=68 xadvance=100 page=0 chnl=15
+char id=114 x=2985 y=218 width=46 height=92 xoffset=12 yoffset=68 xadvance=61 page=0 chnl=15
+char id=115 x=3043 y=218 width=71 height=94 xoffset=8 yoffset=68 xadvance=86 page=0 chnl=15
+char id=116 x=3126 y=218 width=49 height=114 xoffset=5 yoffset=48 xadvance=60 page=0 chnl=15
+char id=117 x=3187 y=218 width=72 height=93 xoffset=12 yoffset=69 xadvance=96 page=0 chnl=15
+char id=118 x=3271 y=218 width=82 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15
+char id=119 x=3365 y=218 width=124 height=91 xoffset=5 yoffset=69 xadvance=134 page=0 chnl=15
+char id=120 x=3501 y=218 width=76 height=91 xoffset=7 yoffset=69 xadvance=89 page=0 chnl=15
+char id=121 x=3589 y=218 width=82 height=125 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15
+char id=122 x=3683 y=218 width=71 height=91 xoffset=10 yoffset=69 xadvance=89 page=0 chnl=15
+char id=123 x=3766 y=218 width=49 height=151 xoffset=6 yoffset=34 xadvance=59 page=0 chnl=15
+char id=124 x=3827 y=218 width=12 height=198 xoffset=21 yoffset=1 xadvance=53 page=0 chnl=15
+char id=125 x=3851 y=218 width=49 height=151 xoffset=5 yoffset=34 xadvance=59 page=0 chnl=15
+char id=126 x=3912 y=218 width=83 height=31 xoffset=13 yoffset=97 xadvance=108 page=0 chnl=15
+char id=163 x=6 y=430 width=84 height=122 xoffset=10 yoffset=38 xadvance=104 page=0 chnl=15
+char id=165 x=102 y=430 width=87 height=121 xoffset=2 yoffset=39 xadvance=90 page=0 chnl=15
+char id=167 x=201 y=430 width=75 height=147 xoffset=8 yoffset=38 xadvance=91 page=0 chnl=15
+char id=171 x=288 y=430 width=66 height=73 xoffset=11 yoffset=75 xadvance=89 page=0 chnl=15
+char id=176 x=366 y=430 width=55 height=55 xoffset=10 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=433 y=430 width=66 height=73 xoffset=11 yoffset=75 xadvance=89 page=0 chnl=15
+char id=191 x=511 y=430 width=70 height=123 xoffset=8 yoffset=69 xadvance=83 page=0 chnl=15
+char id=192 x=593 y=430 width=104 height=160 xoffset=4 yoffset=0 xadvance=111 page=0 chnl=15
+char id=193 x=709 y=430 width=104 height=160 xoffset=4 yoffset=0 xadvance=111 page=0 chnl=15
+char id=195 x=825 y=430 width=104 height=155 xoffset=4 yoffset=5 xadvance=111 page=0 chnl=15
+char id=196 x=941 y=430 width=104 height=154 xoffset=4 yoffset=6 xadvance=111 page=0 chnl=15
+char id=199 x=1057 y=430 width=103 height=159 xoffset=9 yoffset=38 xadvance=120 page=0 chnl=15
+char id=201 x=1172 y=430 width=75 height=160 xoffset=14 yoffset=0 xadvance=98 page=0 chnl=15
+char id=202 x=1259 y=430 width=75 height=157 xoffset=14 yoffset=3 xadvance=98 page=0 chnl=15
+char id=205 x=1346 y=430 width=33 height=160 xoffset=14 yoffset=0 xadvance=43 page=0 chnl=15
+char id=209 x=1391 y=430 width=96 height=154 xoffset=14 yoffset=6 xadvance=124 page=0 chnl=15
+char id=211 x=1499 y=430 width=107 height=162 xoffset=9 yoffset=0 xadvance=125 page=0 chnl=15
+char id=212 x=1618 y=430 width=107 height=159 xoffset=9 yoffset=3 xadvance=125 page=0 chnl=15
+char id=214 x=1737 y=430 width=107 height=156 xoffset=9 yoffset=6 xadvance=125 page=0 chnl=15
+char id=215 x=1856 y=430 width=77 height=76 xoffset=16 yoffset=75 xadvance=108 page=0 chnl=15
+char id=220 x=1945 y=430 width=94 height=157 xoffset=14 yoffset=6 xadvance=122 page=0 chnl=15
+char id=223 x=2051 y=430 width=78 height=122 xoffset=14 yoffset=38 xadvance=100 page=0 chnl=15
+char id=224 x=2141 y=430 width=73 height=133 xoffset=8 yoffset=30 xadvance=93 page=0 chnl=15
+char id=225 x=2226 y=430 width=73 height=133 xoffset=8 yoffset=30 xadvance=93 page=0 chnl=15
+char id=226 x=2311 y=430 width=73 height=130 xoffset=8 yoffset=33 xadvance=93 page=0 chnl=15
+char id=227 x=2396 y=430 width=73 height=127 xoffset=8 yoffset=36 xadvance=93 page=0 chnl=15
+char id=228 x=2481 y=430 width=73 height=127 xoffset=8 yoffset=36 xadvance=93 page=0 chnl=15
+char id=231 x=2566 y=430 width=77 height=128 xoffset=8 yoffset=68 xadvance=92 page=0 chnl=15
+char id=232 x=2655 y=430 width=80 height=132 xoffset=8 yoffset=30 xadvance=96 page=0 chnl=15
+char id=233 x=2747 y=430 width=80 height=132 xoffset=8 yoffset=30 xadvance=96 page=0 chnl=15
+char id=234 x=2839 y=430 width=80 height=129 xoffset=8 yoffset=33 xadvance=96 page=0 chnl=15
+char id=237 x=2931 y=430 width=32 height=130 xoffset=12 yoffset=30 xadvance=39 page=0 chnl=15
+char id=238 x=2975 y=430 width=52 height=127 xoffset=-6 yoffset=33 xadvance=39 page=0 chnl=15
+char id=241 x=3039 y=430 width=73 height=124 xoffset=12 yoffset=36 xadvance=96 page=0 chnl=15
+char id=243 x=3124 y=430 width=83 height=132 xoffset=8 yoffset=30 xadvance=98 page=0 chnl=15
+char id=244 x=3219 y=430 width=83 height=129 xoffset=8 yoffset=33 xadvance=98 page=0 chnl=15
+char id=245 x=3314 y=430 width=83 height=126 xoffset=8 yoffset=36 xadvance=98 page=0 chnl=15
+char id=246 x=3409 y=430 width=83 height=126 xoffset=8 yoffset=36 xadvance=98 page=0 chnl=15
+char id=249 x=3504 y=430 width=72 height=132 xoffset=12 yoffset=30 xadvance=96 page=0 chnl=15
+char id=250 x=3588 y=430 width=72 height=132 xoffset=12 yoffset=30 xadvance=96 page=0 chnl=15
+char id=251 x=3672 y=430 width=72 height=129 xoffset=12 yoffset=33 xadvance=96 page=0 chnl=15
+char id=252 x=3756 y=430 width=72 height=126 xoffset=12 yoffset=36 xadvance=96 page=0 chnl=15
+char id=286 x=3840 y=430 width=104 height=153 xoffset=9 yoffset=9 xadvance=122 page=0 chnl=15
+char id=287 x=3956 y=430 width=81 height=157 xoffset=8 yoffset=39 xadvance=100 page=0 chnl=15
+char id=304 x=4049 y=430 width=21 height=154 xoffset=11 yoffset=6 xadvance=43 page=0 chnl=15
+char id=305 x=6 y=642 width=15 height=91 xoffset=12 yoffset=69 xadvance=39 page=0 chnl=15
+char id=339 x=33 y=642 width=148 height=94 xoffset=8 yoffset=68 xadvance=163 page=0 chnl=15
+char id=350 x=193 y=642 width=88 height=158 xoffset=9 yoffset=38 xadvance=105 page=0 chnl=15
+char id=351 x=293 y=642 width=71 height=128 xoffset=8 yoffset=68 xadvance=86 page=0 chnl=15
+char id=1028 x=376 y=642 width=92 height=124 xoffset=9 yoffset=38 xadvance=109 page=0 chnl=15
+char id=1030 x=480 y=642 width=16 height=121 xoffset=14 yoffset=39 xadvance=43 page=0 chnl=15
+char id=1040 x=508 y=642 width=104 height=121 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15
+char id=1041 x=624 y=642 width=86 height=121 xoffset=14 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1042 x=722 y=642 width=85 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1043 x=819 y=642 width=74 height=121 xoffset=14 yoffset=39 xadvance=95 page=0 chnl=15
+char id=1044 x=905 y=642 width=113 height=151 xoffset=4 yoffset=39 xadvance=124 page=0 chnl=15
+char id=1045 x=1030 y=642 width=75 height=121 xoffset=14 yoffset=39 xadvance=98 page=0 chnl=15
+char id=1046 x=1117 y=642 width=149 height=121 xoffset=4 yoffset=39 xadvance=156 page=0 chnl=15
+char id=1047 x=1278 y=642 width=82 height=124 xoffset=12 yoffset=38 xadvance=105 page=0 chnl=15
+char id=1048 x=1372 y=642 width=96 height=121 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15
+char id=1049 x=1480 y=642 width=96 height=151 xoffset=14 yoffset=9 xadvance=124 page=0 chnl=15
+char id=1050 x=1588 y=642 width=89 height=121 xoffset=14 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1051 x=1689 y=642 width=100 height=121 xoffset=4 yoffset=39 xadvance=117 page=0 chnl=15
+char id=1052 x=1801 y=642 width=119 height=121 xoffset=14 yoffset=39 xadvance=146 page=0 chnl=15
+char id=1053 x=1932 y=642 width=94 height=121 xoffset=14 yoffset=39 xadvance=122 page=0 chnl=15
+char id=1054 x=2038 y=642 width=107 height=124 xoffset=9 yoffset=38 xadvance=125 page=0 chnl=15
+char id=1055 x=2157 y=642 width=91 height=121 xoffset=14 yoffset=39 xadvance=119 page=0 chnl=15
+char id=1056 x=2260 y=642 width=83 height=121 xoffset=14 yoffset=39 xadvance=104 page=0 chnl=15
+char id=1057 x=2355 y=642 width=103 height=124 xoffset=9 yoffset=38 xadvance=120 page=0 chnl=15
+char id=1058 x=2470 y=642 width=92 height=121 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1059 x=2574 y=642 width=95 height=123 xoffset=4 yoffset=39 xadvance=103 page=0 chnl=15
+char id=1060 x=2681 y=642 width=112 height=128 xoffset=9 yoffset=37 xadvance=130 page=0 chnl=15
+char id=1062 x=2805 y=642 width=103 height=150 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15
+char id=1063 x=2920 y=642 width=89 height=121 xoffset=15 yoffset=39 xadvance=118 page=0 chnl=15
+char id=1065 x=3021 y=642 width=141 height=150 xoffset=14 yoffset=39 xadvance=161 page=0 chnl=15
+char id=1068 x=3174 y=642 width=86 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1070 x=3272 y=642 width=144 height=124 xoffset=14 yoffset=38 xadvance=167 page=0 chnl=15
+char id=1071 x=3428 y=642 width=88 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15
+char id=1072 x=3528 y=642 width=73 height=95 xoffset=8 yoffset=68 xadvance=93 page=0 chnl=15
+char id=1073 x=3613 y=642 width=81 height=126 xoffset=8 yoffset=36 xadvance=97 page=0 chnl=15
+char id=1074 x=3706 y=642 width=73 height=91 xoffset=12 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1075 x=3791 y=642 width=57 height=91 xoffset=12 yoffset=69 xadvance=75 page=0 chnl=15
+char id=1076 x=3860 y=642 width=95 height=117 xoffset=3 yoffset=69 xadvance=103 page=0 chnl=15
+char id=1077 x=3967 y=642 width=80 height=94 xoffset=8 yoffset=68 xadvance=96 page=0 chnl=15
+char id=1078 x=6 y=854 width=123 height=91 xoffset=7 yoffset=69 xadvance=136 page=0 chnl=15
+char id=1079 x=141 y=854 width=68 height=94 xoffset=7 yoffset=68 xadvance=81 page=0 chnl=15
+char id=1080 x=221 y=854 width=74 height=91 xoffset=12 yoffset=69 xadvance=98 page=0 chnl=15
+char id=1081 x=307 y=854 width=74 height=121 xoffset=12 yoffset=39 xadvance=98 page=0 chnl=15
+char id=1082 x=393 y=854 width=75 height=91 xoffset=12 yoffset=69 xadvance=88 page=0 chnl=15
+char id=1083 x=480 y=854 width=81 height=91 xoffset=4 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1084 x=573 y=854 width=100 height=91 xoffset=12 yoffset=69 xadvance=123 page=0 chnl=15
+char id=1085 x=685 y=854 width=72 height=91 xoffset=12 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1086 x=769 y=854 width=83 height=94 xoffset=8 yoffset=68 xadvance=98 page=0 chnl=15
+char id=1087 x=864 y=854 width=72 height=91 xoffset=12 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1088 x=948 y=854 width=81 height=126 xoffset=12 yoffset=68 xadvance=100 page=0 chnl=15
+char id=1089 x=1041 y=854 width=77 height=94 xoffset=8 yoffset=68 xadvance=92 page=0 chnl=15
+char id=1090 x=1130 y=854 width=74 height=91 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15
+char id=1091 x=1216 y=854 width=82 height=125 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1092 x=1310 y=854 width=96 height=152 xoffset=8 yoffset=39 xadvance=112 page=0 chnl=15
+char id=1093 x=1418 y=854 width=76 height=91 xoffset=7 yoffset=69 xadvance=89 page=0 chnl=15
+char id=1094 x=1506 y=854 width=86 height=121 xoffset=12 yoffset=69 xadvance=104 page=0 chnl=15
+char id=1095 x=1604 y=854 width=71 height=91 xoffset=12 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1096 x=1687 y=854 width=111 height=91 xoffset=12 yoffset=69 xadvance=134 page=0 chnl=15
+char id=1097 x=1810 y=854 width=124 height=117 xoffset=12 yoffset=69 xadvance=143 page=0 chnl=15
+char id=1100 x=1946 y=854 width=72 height=91 xoffset=12 yoffset=69 xadvance=91 page=0 chnl=15
+char id=1102 x=2030 y=854 width=119 height=94 xoffset=6 yoffset=68 xadvance=134 page=0 chnl=15
+char id=1103 x=2161 y=854 width=75 height=91 xoffset=6 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1108 x=2248 y=854 width=77 height=94 xoffset=2 yoffset=68 xadvance=89 page=0 chnl=15
+char id=1110 x=2337 y=854 width=21 height=124 xoffset=9 yoffset=36 xadvance=39 page=0 chnl=15
+char id=1111 x=2370 y=854 width=54 height=124 xoffset=-7 yoffset=36 xadvance=39 page=0 chnl=15
+char id=8209 x=2436 y=854 width=53 height=13 xoffset=3 yoffset=102 xadvance=59 page=0 chnl=15
+char id=8211 x=2501 y=854 width=83 height=13 xoffset=0 yoffset=102 xadvance=82 page=0 chnl=15
+char id=8220 x=2596 y=854 width=54 height=41 xoffset=7 yoffset=37 xadvance=62 page=0 chnl=15
+char id=8222 x=2662 y=854 width=53 height=42 xoffset=2 yoffset=144 xadvance=62 page=0 chnl=15
+char id=8226 x=2727 y=854 width=53 height=52 xoffset=20 yoffset=86 xadvance=92 page=0 chnl=15
+char id=8364 x=2792 y=854 width=96 height=124 xoffset=4 yoffset=38 xadvance=109 page=0 chnl=15
+char id=8627 x=2900 y=854 width=131 height=104 xoffset=16 yoffset=39 xadvance=162 page=0 chnl=15
+char id=8679 x=3043 y=854 width=139 height=130 xoffset=15 yoffset=30 xadvance=169 page=0 chnl=15
+char id=9003 x=3194 y=854 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=3379 y=854 width=96 height=38 xoffset=12 yoffset=148 xadvance=119 page=0 chnl=15
+char id=9654 x=3487 y=854 width=129 height=152 xoffset=15 yoffset=24 xadvance=151 page=0 chnl=15
+char id=9664 x=3628 y=854 width=129 height=152 xoffset=7 yoffset=24 xadvance=151 page=0 chnl=15
+char id=9675 x=3769 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=3906 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=4043 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=6 y=1066 width=114 height=83 xoffset=17 yoffset=63 xadvance=145 page=0 chnl=15
+char id=10004 x=132 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=144 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=156 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=168 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=180 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-Regular.png b/selfdrive/assets/fonts/Inter-Regular.png
new file mode 100644
index 000000000..366bf01cf
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Regular.png differ
diff --git a/selfdrive/assets/fonts/Inter-Regular.ttf b/selfdrive/assets/fonts/Inter-Regular.ttf
new file mode 100644
index 000000000..96fd6a12d
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Regular.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-SemiBold.fnt b/selfdrive/assets/fonts/Inter-SemiBold.fnt
new file mode 100644
index 000000000..81607bea9
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-SemiBold.fnt
@@ -0,0 +1,231 @@
+info face="Inter-SemiBold" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-SemiBold.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=41 height=200 xoffset=0 yoffset=0 xadvance=41 page=0 chnl=15
+char id=33 x=71 y=6 width=27 height=123 xoffset=12 yoffset=39 xadvance=51 page=0 chnl=15
+char id=34 x=110 y=6 width=47 height=46 xoffset=9 yoffset=39 xadvance=65 page=0 chnl=15
+char id=35 x=169 y=6 width=103 height=121 xoffset=2 yoffset=39 xadvance=106 page=0 chnl=15
+char id=36 x=284 y=6 width=93 height=152 xoffset=7 yoffset=24 xadvance=107 page=0 chnl=15
+char id=37 x=389 y=6 width=113 height=128 xoffset=13 yoffset=36 xadvance=139 page=0 chnl=15
+char id=38 x=514 y=6 width=102 height=124 xoffset=7 yoffset=38 xadvance=109 page=0 chnl=15
+char id=39 x=628 y=6 width=17 height=46 xoffset=9 yoffset=39 xadvance=35 page=0 chnl=15
+char id=40 x=657 y=6 width=44 height=150 xoffset=16 yoffset=36 xadvance=65 page=0 chnl=15
+char id=41 x=713 y=6 width=44 height=150 xoffset=5 yoffset=36 xadvance=65 page=0 chnl=15
+char id=42 x=769 y=6 width=67 height=69 xoffset=11 yoffset=39 xadvance=89 page=0 chnl=15
+char id=43 x=848 y=6 width=83 height=82 xoffset=14 yoffset=71 xadvance=111 page=0 chnl=15
+char id=44 x=943 y=6 width=27 height=47 xoffset=9 yoffset=143 xadvance=48 page=0 chnl=15
+char id=45 x=982 y=6 width=55 height=18 xoffset=11 yoffset=101 xadvance=76 page=0 chnl=15
+char id=46 x=1049 y=6 width=26 height=27 xoffset=11 yoffset=135 xadvance=48 page=0 chnl=15
+char id=47 x=1087 y=6 width=58 height=145 xoffset=2 yoffset=34 xadvance=62 page=0 chnl=15
+char id=48 x=1157 y=6 width=94 height=125 xoffset=8 yoffset=38 xadvance=110 page=0 chnl=15
+char id=49 x=1263 y=6 width=52 height=121 xoffset=8 yoffset=39 xadvance=79 page=0 chnl=15
+char id=50 x=1327 y=6 width=85 height=122 xoffset=9 yoffset=38 xadvance=102 page=0 chnl=15
+char id=51 x=1424 y=6 width=90 height=124 xoffset=9 yoffset=38 xadvance=107 page=0 chnl=15
+char id=52 x=1526 y=6 width=94 height=121 xoffset=8 yoffset=39 xadvance=110 page=0 chnl=15
+char id=53 x=1632 y=6 width=86 height=123 xoffset=10 yoffset=39 xadvance=104 page=0 chnl=15
+char id=54 x=1730 y=6 width=91 height=125 xoffset=8 yoffset=37 xadvance=107 page=0 chnl=15
+char id=55 x=1833 y=6 width=83 height=121 xoffset=6 yoffset=39 xadvance=97 page=0 chnl=15
+char id=56 x=1928 y=6 width=91 height=124 xoffset=8 yoffset=38 xadvance=106 page=0 chnl=15
+char id=57 x=2031 y=6 width=90 height=125 xoffset=9 yoffset=37 xadvance=107 page=0 chnl=15
+char id=58 x=2133 y=6 width=26 height=91 xoffset=11 yoffset=71 xadvance=48 page=0 chnl=15
+char id=59 x=2171 y=6 width=31 height=119 xoffset=9 yoffset=71 xadvance=48 page=0 chnl=15
+char id=60 x=2214 y=6 width=81 height=92 xoffset=15 yoffset=66 xadvance=111 page=0 chnl=15
+char id=61 x=2307 y=6 width=79 height=57 xoffset=16 yoffset=84 xadvance=111 page=0 chnl=15
+char id=62 x=2398 y=6 width=81 height=92 xoffset=15 yoffset=66 xadvance=111 page=0 chnl=15
+char id=63 x=2491 y=6 width=77 height=124 xoffset=6 yoffset=38 xadvance=89 page=0 chnl=15
+char id=64 x=2580 y=6 width=149 height=153 xoffset=9 yoffset=41 xadvance=165 page=0 chnl=15
+char id=65 x=2741 y=6 width=112 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15
+char id=66 x=2865 y=6 width=91 height=121 xoffset=11 yoffset=39 xadvance=108 page=0 chnl=15
+char id=67 x=2968 y=6 width=107 height=124 xoffset=8 yoffset=38 xadvance=122 page=0 chnl=15
+char id=68 x=3087 y=6 width=100 height=121 xoffset=11 yoffset=39 xadvance=119 page=0 chnl=15
+char id=69 x=3199 y=6 width=80 height=121 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15
+char id=70 x=3291 y=6 width=78 height=121 xoffset=11 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=3381 y=6 width=108 height=124 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15
+char id=72 x=3501 y=6 width=101 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15
+char id=73 x=3614 y=6 width=23 height=121 xoffset=11 yoffset=39 xadvance=45 page=0 chnl=15
+char id=74 x=3649 y=6 width=77 height=123 xoffset=4 yoffset=39 xadvance=92 page=0 chnl=15
+char id=75 x=3738 y=6 width=98 height=121 xoffset=11 yoffset=39 xadvance=111 page=0 chnl=15
+char id=76 x=3848 y=6 width=76 height=121 xoffset=11 yoffset=39 xadvance=93 page=0 chnl=15
+char id=77 x=3936 y=6 width=127 height=121 xoffset=11 yoffset=39 xadvance=149 page=0 chnl=15
+char id=78 x=6 y=218 width=100 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15
+char id=79 x=118 y=218 width=112 height=124 xoffset=8 yoffset=38 xadvance=128 page=0 chnl=15
+char id=80 x=242 y=218 width=89 height=121 xoffset=11 yoffset=39 xadvance=106 page=0 chnl=15
+char id=81 x=343 y=218 width=112 height=133 xoffset=8 yoffset=38 xadvance=128 page=0 chnl=15
+char id=82 x=467 y=218 width=93 height=121 xoffset=11 yoffset=39 xadvance=107 page=0 chnl=15
+char id=83 x=572 y=218 width=93 height=124 xoffset=7 yoffset=38 xadvance=107 page=0 chnl=15
+char id=84 x=677 y=218 width=97 height=121 xoffset=6 yoffset=39 xadvance=109 page=0 chnl=15
+char id=85 x=786 y=218 width=99 height=123 xoffset=11 yoffset=39 xadvance=121 page=0 chnl=15
+char id=86 x=897 y=218 width=112 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15
+char id=87 x=1021 y=218 width=161 height=121 xoffset=3 yoffset=39 xadvance=166 page=0 chnl=15
+char id=88 x=1194 y=218 width=106 height=121 xoffset=4 yoffset=39 xadvance=114 page=0 chnl=15
+char id=89 x=1312 y=218 width=110 height=121 xoffset=3 yoffset=39 xadvance=116 page=0 chnl=15
+char id=90 x=1434 y=218 width=90 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15
+char id=91 x=1536 y=218 width=43 height=150 xoffset=18 yoffset=36 xadvance=65 page=0 chnl=15
+char id=92 x=1591 y=218 width=58 height=145 xoffset=2 yoffset=34 xadvance=62 page=0 chnl=15
+char id=93 x=1661 y=218 width=43 height=150 xoffset=4 yoffset=36 xadvance=65 page=0 chnl=15
+char id=94 x=1716 y=218 width=69 height=53 xoffset=5 yoffset=42 xadvance=79 page=0 chnl=15
+char id=95 x=1797 y=218 width=79 height=17 xoffset=-1 yoffset=160 xadvance=77 page=0 chnl=15
+char id=96 x=1888 y=218 width=35 height=28 xoffset=24 yoffset=31 xadvance=82 page=0 chnl=15
+char id=97 x=1935 y=218 width=79 height=94 xoffset=6 yoffset=68 xadvance=94 page=0 chnl=15
+char id=98 x=2026 y=218 width=86 height=123 xoffset=11 yoffset=39 xadvance=104 page=0 chnl=15
+char id=99 x=2124 y=218 width=82 height=94 xoffset=7 yoffset=68 xadvance=95 page=0 chnl=15
+char id=100 x=2218 y=218 width=86 height=123 xoffset=7 yoffset=39 xadvance=104 page=0 chnl=15
+char id=101 x=2316 y=218 width=84 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15
+char id=102 x=2412 y=218 width=58 height=126 xoffset=3 yoffset=34 xadvance=62 page=0 chnl=15
+char id=103 x=2482 y=218 width=86 height=128 xoffset=7 yoffset=68 xadvance=103 page=0 chnl=15
+char id=104 x=2580 y=218 width=81 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15
+char id=105 x=2673 y=218 width=25 height=126 xoffset=9 yoffset=34 xadvance=43 page=0 chnl=15
+char id=106 x=2710 y=218 width=38 height=160 xoffset=-4 yoffset=34 xadvance=43 page=0 chnl=15
+char id=107 x=2760 y=218 width=83 height=121 xoffset=10 yoffset=39 xadvance=94 page=0 chnl=15
+char id=108 x=2855 y=218 width=23 height=121 xoffset=10 yoffset=39 xadvance=43 page=0 chnl=15
+char id=109 x=2890 y=218 width=128 height=92 xoffset=10 yoffset=68 xadvance=148 page=0 chnl=15
+char id=110 x=3030 y=218 width=81 height=92 xoffset=10 yoffset=68 xadvance=100 page=0 chnl=15
+char id=111 x=3123 y=218 width=87 height=94 xoffset=7 yoffset=68 xadvance=100 page=0 chnl=15
+char id=112 x=3222 y=218 width=87 height=126 xoffset=10 yoffset=68 xadvance=103 page=0 chnl=15
+char id=113 x=3321 y=218 width=86 height=126 xoffset=7 yoffset=68 xadvance=103 page=0 chnl=15
+char id=114 x=3419 y=218 width=53 height=92 xoffset=10 yoffset=68 xadvance=65 page=0 chnl=15
+char id=115 x=3484 y=218 width=79 height=94 xoffset=6 yoffset=68 xadvance=90 page=0 chnl=15
+char id=116 x=3575 y=218 width=54 height=114 xoffset=4 yoffset=48 xadvance=62 page=0 chnl=15
+char id=117 x=3641 y=218 width=80 height=93 xoffset=10 yoffset=69 xadvance=100 page=0 chnl=15
+char id=118 x=3733 y=218 width=89 height=91 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15
+char id=119 x=3834 y=218 width=131 height=91 xoffset=4 yoffset=69 xadvance=138 page=0 chnl=15
+char id=120 x=3977 y=218 width=83 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15
+char id=121 x=6 y=430 width=89 height=125 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15
+char id=122 x=107 y=430 width=75 height=91 xoffset=9 yoffset=69 xadvance=92 page=0 chnl=15
+char id=123 x=194 y=430 width=56 height=150 xoffset=5 yoffset=36 xadvance=65 page=0 chnl=15
+char id=124 x=262 y=430 width=21 height=198 xoffset=19 yoffset=1 xadvance=59 page=0 chnl=15
+char id=125 x=295 y=430 width=56 height=150 xoffset=4 yoffset=36 xadvance=65 page=0 chnl=15
+char id=126 x=363 y=430 width=87 height=36 xoffset=12 yoffset=94 xadvance=111 page=0 chnl=15
+char id=163 x=462 y=430 width=88 height=122 xoffset=10 yoffset=38 xadvance=108 page=0 chnl=15
+char id=165 x=562 y=430 width=89 height=121 xoffset=2 yoffset=39 xadvance=93 page=0 chnl=15
+char id=167 x=663 y=430 width=80 height=147 xoffset=8 yoffset=38 xadvance=95 page=0 chnl=15
+char id=171 x=755 y=430 width=79 height=73 xoffset=10 yoffset=75 xadvance=98 page=0 chnl=15
+char id=176 x=846 y=430 width=58 height=58 xoffset=9 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=916 y=430 width=80 height=73 xoffset=9 yoffset=75 xadvance=99 page=0 chnl=15
+char id=191 x=1008 y=430 width=77 height=124 xoffset=7 yoffset=69 xadvance=89 page=0 chnl=15
+char id=192 x=1097 y=430 width=112 height=159 xoffset=4 yoffset=1 xadvance=119 page=0 chnl=15
+char id=193 x=1221 y=430 width=112 height=159 xoffset=4 yoffset=1 xadvance=119 page=0 chnl=15
+char id=195 x=1345 y=430 width=112 height=156 xoffset=4 yoffset=4 xadvance=119 page=0 chnl=15
+char id=196 x=1469 y=430 width=112 height=156 xoffset=4 yoffset=4 xadvance=119 page=0 chnl=15
+char id=199 x=1593 y=430 width=107 height=160 xoffset=8 yoffset=38 xadvance=122 page=0 chnl=15
+char id=201 x=1712 y=430 width=80 height=159 xoffset=11 yoffset=1 xadvance=100 page=0 chnl=15
+char id=202 x=1804 y=430 width=80 height=158 xoffset=11 yoffset=2 xadvance=100 page=0 chnl=15
+char id=205 x=1896 y=430 width=38 height=159 xoffset=11 yoffset=1 xadvance=45 page=0 chnl=15
+char id=209 x=1946 y=430 width=100 height=155 xoffset=11 yoffset=5 xadvance=122 page=0 chnl=15
+char id=211 x=2058 y=430 width=112 height=161 xoffset=8 yoffset=1 xadvance=128 page=0 chnl=15
+char id=212 x=2182 y=430 width=112 height=160 xoffset=8 yoffset=2 xadvance=128 page=0 chnl=15
+char id=214 x=2306 y=430 width=112 height=158 xoffset=8 yoffset=4 xadvance=128 page=0 chnl=15
+char id=215 x=2430 y=430 width=83 height=83 xoffset=14 yoffset=71 xadvance=111 page=0 chnl=15
+char id=220 x=2525 y=430 width=99 height=158 xoffset=11 yoffset=4 xadvance=121 page=0 chnl=15
+char id=223 x=2636 y=430 width=89 height=122 xoffset=11 yoffset=38 xadvance=106 page=0 chnl=15
+char id=224 x=2737 y=430 width=79 height=131 xoffset=6 yoffset=31 xadvance=94 page=0 chnl=15
+char id=225 x=2828 y=430 width=79 height=131 xoffset=6 yoffset=31 xadvance=94 page=0 chnl=15
+char id=226 x=2919 y=430 width=79 height=130 xoffset=6 yoffset=32 xadvance=94 page=0 chnl=15
+char id=227 x=3010 y=430 width=79 height=127 xoffset=6 yoffset=35 xadvance=94 page=0 chnl=15
+char id=228 x=3101 y=430 width=79 height=128 xoffset=6 yoffset=34 xadvance=94 page=0 chnl=15
+char id=231 x=3192 y=430 width=82 height=130 xoffset=7 yoffset=68 xadvance=95 page=0 chnl=15
+char id=232 x=3286 y=430 width=84 height=131 xoffset=7 yoffset=31 xadvance=97 page=0 chnl=15
+char id=233 x=3382 y=430 width=84 height=131 xoffset=7 yoffset=31 xadvance=97 page=0 chnl=15
+char id=234 x=3478 y=430 width=84 height=130 xoffset=7 yoffset=32 xadvance=97 page=0 chnl=15
+char id=237 x=3574 y=430 width=38 height=129 xoffset=10 yoffset=31 xadvance=43 page=0 chnl=15
+char id=238 x=3624 y=430 width=62 height=128 xoffset=-9 yoffset=32 xadvance=43 page=0 chnl=15
+char id=241 x=3698 y=430 width=81 height=125 xoffset=10 yoffset=35 xadvance=100 page=0 chnl=15
+char id=243 x=3791 y=430 width=87 height=131 xoffset=7 yoffset=31 xadvance=100 page=0 chnl=15
+char id=244 x=3890 y=430 width=87 height=130 xoffset=7 yoffset=32 xadvance=100 page=0 chnl=15
+char id=245 x=3989 y=430 width=87 height=127 xoffset=7 yoffset=35 xadvance=100 page=0 chnl=15
+char id=246 x=6 y=642 width=87 height=128 xoffset=7 yoffset=34 xadvance=100 page=0 chnl=15
+char id=249 x=105 y=642 width=80 height=131 xoffset=10 yoffset=31 xadvance=100 page=0 chnl=15
+char id=250 x=197 y=642 width=80 height=131 xoffset=10 yoffset=31 xadvance=100 page=0 chnl=15
+char id=251 x=289 y=642 width=80 height=130 xoffset=10 yoffset=32 xadvance=100 page=0 chnl=15
+char id=252 x=381 y=642 width=80 height=128 xoffset=10 yoffset=34 xadvance=100 page=0 chnl=15
+char id=286 x=473 y=642 width=108 height=154 xoffset=8 yoffset=8 xadvance=124 page=0 chnl=15
+char id=287 x=593 y=642 width=86 height=158 xoffset=7 yoffset=38 xadvance=103 page=0 chnl=15
+char id=304 x=691 y=642 width=26 height=157 xoffset=10 yoffset=3 xadvance=45 page=0 chnl=15
+char id=305 x=729 y=642 width=23 height=91 xoffset=10 yoffset=69 xadvance=43 page=0 chnl=15
+char id=339 x=764 y=642 width=150 height=94 xoffset=7 yoffset=68 xadvance=162 page=0 chnl=15
+char id=350 x=926 y=642 width=93 height=160 xoffset=7 yoffset=38 xadvance=107 page=0 chnl=15
+char id=351 x=1031 y=642 width=79 height=130 xoffset=6 yoffset=68 xadvance=90 page=0 chnl=15
+char id=1028 x=1122 y=642 width=98 height=124 xoffset=8 yoffset=38 xadvance=113 page=0 chnl=15
+char id=1030 x=1232 y=642 width=23 height=121 xoffset=11 yoffset=39 xadvance=45 page=0 chnl=15
+char id=1040 x=1267 y=642 width=112 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15
+char id=1041 x=1391 y=642 width=90 height=121 xoffset=11 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1042 x=1493 y=642 width=91 height=121 xoffset=11 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1043 x=1596 y=642 width=79 height=121 xoffset=11 yoffset=39 xadvance=95 page=0 chnl=15
+char id=1044 x=1687 y=642 width=119 height=150 xoffset=4 yoffset=39 xadvance=128 page=0 chnl=15
+char id=1045 x=1818 y=642 width=80 height=121 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15
+char id=1046 x=1910 y=642 width=164 height=121 xoffset=4 yoffset=39 xadvance=171 page=0 chnl=15
+char id=1047 x=2086 y=642 width=90 height=124 xoffset=9 yoffset=38 xadvance=107 page=0 chnl=15
+char id=1048 x=2188 y=642 width=100 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15
+char id=1049 x=2300 y=642 width=100 height=152 xoffset=11 yoffset=8 xadvance=122 page=0 chnl=15
+char id=1050 x=2412 y=642 width=102 height=121 xoffset=11 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1051 x=2526 y=642 width=104 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15
+char id=1052 x=2642 y=642 width=127 height=121 xoffset=11 yoffset=39 xadvance=149 page=0 chnl=15
+char id=1053 x=2781 y=642 width=101 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15
+char id=1054 x=2894 y=642 width=112 height=124 xoffset=8 yoffset=38 xadvance=128 page=0 chnl=15
+char id=1055 x=3018 y=642 width=96 height=121 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15
+char id=1056 x=3126 y=642 width=89 height=121 xoffset=11 yoffset=39 xadvance=106 page=0 chnl=15
+char id=1057 x=3227 y=642 width=107 height=124 xoffset=8 yoffset=38 xadvance=122 page=0 chnl=15
+char id=1058 x=3346 y=642 width=97 height=121 xoffset=6 yoffset=39 xadvance=109 page=0 chnl=15
+char id=1059 x=3455 y=642 width=102 height=123 xoffset=3 yoffset=39 xadvance=108 page=0 chnl=15
+char id=1060 x=3569 y=642 width=122 height=128 xoffset=8 yoffset=37 xadvance=138 page=0 chnl=15
+char id=1062 x=3703 y=642 width=113 height=150 xoffset=11 yoffset=39 xadvance=128 page=0 chnl=15
+char id=1063 x=3828 y=642 width=94 height=121 xoffset=15 yoffset=39 xadvance=123 page=0 chnl=15
+char id=1065 x=6 y=854 width=151 height=150 xoffset=15 yoffset=39 xadvance=171 page=0 chnl=15
+char id=1068 x=169 y=854 width=90 height=121 xoffset=12 yoffset=39 xadvance=110 page=0 chnl=15
+char id=1070 x=271 y=854 width=153 height=124 xoffset=11 yoffset=38 xadvance=166 page=0 chnl=15
+char id=1071 x=436 y=854 width=93 height=121 xoffset=3 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1072 x=541 y=854 width=79 height=94 xoffset=6 yoffset=68 xadvance=94 page=0 chnl=15
+char id=1073 x=632 y=854 width=86 height=126 xoffset=7 yoffset=36 xadvance=100 page=0 chnl=15
+char id=1074 x=730 y=854 width=78 height=91 xoffset=10 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1075 x=820 y=854 width=61 height=91 xoffset=10 yoffset=69 xadvance=76 page=0 chnl=15
+char id=1076 x=893 y=854 width=102 height=118 xoffset=2 yoffset=69 xadvance=108 page=0 chnl=15
+char id=1077 x=1007 y=854 width=84 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15
+char id=1078 x=1103 y=854 width=133 height=91 xoffset=5 yoffset=69 xadvance=142 page=0 chnl=15
+char id=1079 x=1248 y=854 width=75 height=94 xoffset=5 yoffset=68 xadvance=85 page=0 chnl=15
+char id=1080 x=1335 y=854 width=80 height=91 xoffset=10 yoffset=69 xadvance=100 page=0 chnl=15
+char id=1081 x=1427 y=854 width=80 height=122 xoffset=10 yoffset=38 xadvance=100 page=0 chnl=15
+char id=1082 x=1519 y=854 width=83 height=91 xoffset=10 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1083 x=1614 y=854 width=85 height=91 xoffset=4 yoffset=69 xadvance=99 page=0 chnl=15
+char id=1084 x=1711 y=854 width=106 height=91 xoffset=10 yoffset=69 xadvance=125 page=0 chnl=15
+char id=1085 x=1829 y=854 width=77 height=91 xoffset=10 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1086 x=1918 y=854 width=87 height=94 xoffset=7 yoffset=68 xadvance=100 page=0 chnl=15
+char id=1087 x=2017 y=854 width=78 height=91 xoffset=10 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1088 x=2107 y=854 width=87 height=126 xoffset=10 yoffset=68 xadvance=103 page=0 chnl=15
+char id=1089 x=2206 y=854 width=82 height=94 xoffset=7 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1090 x=2300 y=854 width=80 height=91 xoffset=5 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1091 x=2392 y=854 width=89 height=125 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1092 x=2493 y=854 width=111 height=152 xoffset=7 yoffset=39 xadvance=124 page=0 chnl=15
+char id=1093 x=2616 y=854 width=83 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1094 x=2711 y=854 width=98 height=120 xoffset=10 yoffset=69 xadvance=113 page=0 chnl=15
+char id=1095 x=2821 y=854 width=77 height=91 xoffset=10 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1096 x=2910 y=854 width=120 height=91 xoffset=10 yoffset=69 xadvance=139 page=0 chnl=15
+char id=1097 x=3042 y=854 width=137 height=117 xoffset=10 yoffset=69 xadvance=152 page=0 chnl=15
+char id=1100 x=3191 y=854 width=79 height=91 xoffset=10 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1102 x=3282 y=854 width=124 height=94 xoffset=5 yoffset=68 xadvance=136 page=0 chnl=15
+char id=1103 x=3418 y=854 width=80 height=91 xoffset=5 yoffset=69 xadvance=94 page=0 chnl=15
+char id=1108 x=3510 y=854 width=82 height=94 xoffset=4 yoffset=68 xadvance=93 page=0 chnl=15
+char id=1110 x=3604 y=854 width=25 height=126 xoffset=9 yoffset=34 xadvance=43 page=0 chnl=15
+char id=1111 x=3641 y=854 width=59 height=126 xoffset=-8 yoffset=34 xadvance=43 page=0 chnl=15
+char id=8209 x=3712 y=854 width=55 height=18 xoffset=9 yoffset=101 xadvance=70 page=0 chnl=15
+char id=8211 x=3779 y=854 width=83 height=18 xoffset=0 yoffset=101 xadvance=82 page=0 chnl=15
+char id=8220 x=3874 y=854 width=56 height=43 xoffset=8 yoffset=35 xadvance=67 page=0 chnl=15
+char id=8222 x=3942 y=854 width=56 height=43 xoffset=3 yoffset=144 xadvance=67 page=0 chnl=15
+char id=8226 x=4010 y=854 width=52 height=52 xoffset=15 yoffset=86 xadvance=82 page=0 chnl=15
+char id=8364 x=6 y=1066 width=99 height=124 xoffset=4 yoffset=38 xadvance=112 page=0 chnl=15
+char id=8627 x=117 y=1066 width=134 height=107 xoffset=16 yoffset=39 xadvance=165 page=0 chnl=15
+char id=8679 x=263 y=1066 width=152 height=130 xoffset=13 yoffset=30 xadvance=178 page=0 chnl=15
+char id=9003 x=427 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=612 y=1066 width=102 height=39 xoffset=11 yoffset=148 xadvance=123 page=0 chnl=15
+char id=9654 x=726 y=1066 width=131 height=152 xoffset=16 yoffset=24 xadvance=155 page=0 chnl=15
+char id=9664 x=869 y=1066 width=131 height=152 xoffset=8 yoffset=24 xadvance=155 page=0 chnl=15
+char id=9675 x=1012 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=1149 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=1286 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=1298 y=1066 width=119 height=91 xoffset=16 yoffset=60 xadvance=145 page=0 chnl=15
+char id=10004 x=1429 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=1441 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=1453 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=1465 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=1477 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-SemiBold.png b/selfdrive/assets/fonts/Inter-SemiBold.png
new file mode 100644
index 000000000..ae4f523a2
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-SemiBold.png differ
diff --git a/selfdrive/assets/fonts/Inter-SemiBold.ttf b/selfdrive/assets/fonts/Inter-SemiBold.ttf
new file mode 100644
index 000000000..ddb279290
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-SemiBold.ttf differ
diff --git a/selfdrive/assets/fonts/Inter-Thin.fnt b/selfdrive/assets/fonts/Inter-Thin.fnt
new file mode 100644
index 000000000..810073992
--- /dev/null
+++ b/selfdrive/assets/fonts/Inter-Thin.fnt
@@ -0,0 +1,231 @@
+info face="Inter-Thin" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Inter-Thin.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15
+char id=33 x=76 y=6 width=9 height=122 xoffset=17 yoffset=39 xadvance=43 page=0 chnl=15
+char id=34 x=97 y=6 width=27 height=39 xoffset=15 yoffset=39 xadvance=56 page=0 chnl=15
+char id=35 x=136 y=6 width=98 height=121 xoffset=3 yoffset=39 xadvance=104 page=0 chnl=15
+char id=36 x=246 y=6 width=77 height=152 xoffset=12 yoffset=24 xadvance=101 page=0 chnl=15
+char id=37 x=335 y=6 width=102 height=124 xoffset=13 yoffset=38 xadvance=127 page=0 chnl=15
+char id=38 x=449 y=6 width=84 height=124 xoffset=10 yoffset=38 xadvance=96 page=0 chnl=15
+char id=39 x=545 y=6 width=4 height=39 xoffset=15 yoffset=39 xadvance=33 page=0 chnl=15
+char id=40 x=561 y=6 width=22 height=151 xoffset=19 yoffset=34 xadvance=52 page=0 chnl=15
+char id=41 x=595 y=6 width=22 height=151 xoffset=11 yoffset=34 xadvance=52 page=0 chnl=15
+char id=42 x=629 y=6 width=61 height=69 xoffset=11 yoffset=39 xadvance=82 page=0 chnl=15
+char id=43 x=702 y=6 width=69 height=69 xoffset=18 yoffset=79 xadvance=105 page=0 chnl=15
+char id=44 x=783 y=6 width=13 height=47 xoffset=14 yoffset=143 xadvance=42 page=0 chnl=15
+char id=45 x=808 y=6 width=46 height=5 xoffset=13 yoffset=106 xadvance=72 page=0 chnl=15
+char id=46 x=866 y=6 width=10 height=9 xoffset=16 yoffset=152 xadvance=41 page=0 chnl=15
+char id=47 x=888 y=6 width=44 height=145 xoffset=5 yoffset=34 xadvance=53 page=0 chnl=15
+char id=48 x=944 y=6 width=75 height=124 xoffset=11 yoffset=38 xadvance=97 page=0 chnl=15
+char id=49 x=1031 y=6 width=32 height=121 xoffset=11 yoffset=39 xadvance=67 page=0 chnl=15
+char id=50 x=1075 y=6 width=73 height=122 xoffset=15 yoffset=38 xadvance=102 page=0 chnl=15
+char id=51 x=1160 y=6 width=72 height=124 xoffset=15 yoffset=38 xadvance=101 page=0 chnl=15
+char id=52 x=1244 y=6 width=75 height=121 xoffset=12 yoffset=39 xadvance=98 page=0 chnl=15
+char id=53 x=1331 y=6 width=69 height=123 xoffset=13 yoffset=39 xadvance=94 page=0 chnl=15
+char id=54 x=1412 y=6 width=70 height=124 xoffset=13 yoffset=38 xadvance=96 page=0 chnl=15
+char id=55 x=1494 y=6 width=71 height=121 xoffset=9 yoffset=39 xadvance=90 page=0 chnl=15
+char id=56 x=1577 y=6 width=76 height=124 xoffset=12 yoffset=38 xadvance=99 page=0 chnl=15
+char id=57 x=1665 y=6 width=70 height=125 xoffset=13 yoffset=37 xadvance=96 page=0 chnl=15
+char id=58 x=1747 y=6 width=10 height=71 xoffset=16 yoffset=81 xadvance=41 page=0 chnl=15
+char id=59 x=1769 y=6 width=14 height=109 xoffset=14 yoffset=81 xadvance=42 page=0 chnl=15
+char id=60 x=1795 y=6 width=65 height=88 xoffset=20 yoffset=69 xadvance=105 page=0 chnl=15
+char id=61 x=1872 y=6 width=57 height=36 xoffset=24 yoffset=95 xadvance=105 page=0 chnl=15
+char id=62 x=1941 y=6 width=65 height=88 xoffset=20 yoffset=69 xadvance=105 page=0 chnl=15
+char id=63 x=2018 y=6 width=63 height=123 xoffset=7 yoffset=38 xadvance=79 page=0 chnl=15
+char id=64 x=2093 y=6 width=139 height=148 xoffset=8 yoffset=44 xadvance=154 page=0 chnl=15
+char id=65 x=2244 y=6 width=92 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15
+char id=66 x=2348 y=6 width=76 height=121 xoffset=18 yoffset=39 xadvance=105 page=0 chnl=15
+char id=67 x=2436 y=6 width=97 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15
+char id=68 x=2545 y=6 width=89 height=121 xoffset=18 yoffset=39 xadvance=118 page=0 chnl=15
+char id=69 x=2646 y=6 width=67 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15
+char id=70 x=2725 y=6 width=66 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15
+char id=71 x=2803 y=6 width=98 height=124 xoffset=11 yoffset=38 xadvance=122 page=0 chnl=15
+char id=72 x=2913 y=6 width=85 height=121 xoffset=18 yoffset=39 xadvance=121 page=0 chnl=15
+char id=73 x=3010 y=6 width=5 height=121 xoffset=18 yoffset=39 xadvance=41 page=0 chnl=15
+char id=74 x=3027 y=6 width=60 height=123 xoffset=8 yoffset=39 xadvance=85 page=0 chnl=15
+char id=75 x=3099 y=6 width=79 height=121 xoffset=18 yoffset=39 xadvance=101 page=0 chnl=15
+char id=76 x=3190 y=6 width=65 height=121 xoffset=18 yoffset=39 xadvance=92 page=0 chnl=15
+char id=77 x=3267 y=6 width=106 height=121 xoffset=18 yoffset=39 xadvance=142 page=0 chnl=15
+char id=78 x=3385 y=6 width=91 height=121 xoffset=18 yoffset=39 xadvance=127 page=0 chnl=15
+char id=79 x=3488 y=6 width=101 height=124 xoffset=11 yoffset=38 xadvance=123 page=0 chnl=15
+char id=80 x=3601 y=6 width=71 height=121 xoffset=18 yoffset=39 xadvance=100 page=0 chnl=15
+char id=81 x=3684 y=6 width=101 height=134 xoffset=11 yoffset=38 xadvance=123 page=0 chnl=15
+char id=82 x=3797 y=6 width=77 height=121 xoffset=18 yoffset=39 xadvance=101 page=0 chnl=15
+char id=83 x=3886 y=6 width=77 height=125 xoffset=12 yoffset=37 xadvance=101 page=0 chnl=15
+char id=84 x=3975 y=6 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15
+char id=85 x=6 y=218 width=88 height=123 xoffset=18 yoffset=39 xadvance=123 page=0 chnl=15
+char id=86 x=106 y=218 width=92 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15
+char id=87 x=210 y=218 width=139 height=121 xoffset=4 yoffset=39 xadvance=147 page=0 chnl=15
+char id=88 x=361 y=218 width=87 height=121 xoffset=5 yoffset=39 xadvance=96 page=0 chnl=15
+char id=89 x=460 y=218 width=91 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15
+char id=90 x=563 y=218 width=77 height=121 xoffset=12 yoffset=39 xadvance=100 page=0 chnl=15
+char id=91 x=652 y=218 width=22 height=151 xoffset=20 yoffset=34 xadvance=52 page=0 chnl=15
+char id=92 x=686 y=218 width=44 height=145 xoffset=5 yoffset=34 xadvance=53 page=0 chnl=15
+char id=93 x=742 y=218 width=22 height=151 xoffset=10 yoffset=34 xadvance=52 page=0 chnl=15
+char id=94 x=776 y=218 width=52 height=52 xoffset=7 yoffset=43 xadvance=66 page=0 chnl=15
+char id=95 x=840 y=218 width=72 height=4 xoffset=-1 yoffset=160 xadvance=70 page=0 chnl=15
+char id=96 x=924 y=218 width=22 height=26 xoffset=29 yoffset=31 xadvance=82 page=0 chnl=15
+char id=97 x=958 y=218 width=63 height=94 xoffset=11 yoffset=68 xadvance=89 page=0 chnl=15
+char id=98 x=1033 y=218 width=71 height=123 xoffset=18 yoffset=39 xadvance=98 page=0 chnl=15
+char id=99 x=1116 y=218 width=71 height=94 xoffset=10 yoffset=68 xadvance=91 page=0 chnl=15
+char id=100 x=1199 y=218 width=71 height=123 xoffset=10 yoffset=39 xadvance=98 page=0 chnl=15
+char id=101 x=1282 y=218 width=75 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15
+char id=102 x=1369 y=218 width=41 height=124 xoffset=11 yoffset=36 xadvance=54 page=0 chnl=15
+char id=103 x=1422 y=218 width=71 height=128 xoffset=10 yoffset=68 xadvance=96 page=0 chnl=15
+char id=104 x=1505 y=218 width=63 height=121 xoffset=15 yoffset=39 xadvance=93 page=0 chnl=15
+char id=105 x=1580 y=218 width=9 height=115 xoffset=14 yoffset=45 xadvance=36 page=0 chnl=15
+char id=106 x=1601 y=218 width=26 height=149 xoffset=-3 yoffset=45 xadvance=36 page=0 chnl=15
+char id=107 x=1639 y=218 width=60 height=121 xoffset=15 yoffset=39 xadvance=80 page=0 chnl=15
+char id=108 x=1711 y=218 width=5 height=121 xoffset=15 yoffset=39 xadvance=35 page=0 chnl=15
+char id=109 x=1728 y=218 width=108 height=92 xoffset=15 yoffset=68 xadvance=138 page=0 chnl=15
+char id=110 x=1848 y=218 width=63 height=92 xoffset=15 yoffset=68 xadvance=93 page=0 chnl=15
+char id=111 x=1923 y=218 width=76 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15
+char id=112 x=2011 y=218 width=70 height=126 xoffset=15 yoffset=68 xadvance=95 page=0 chnl=15
+char id=113 x=2093 y=218 width=71 height=126 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15
+char id=114 x=2176 y=218 width=35 height=92 xoffset=15 yoffset=68 xadvance=53 page=0 chnl=15
+char id=115 x=2223 y=218 width=60 height=94 xoffset=11 yoffset=68 xadvance=81 page=0 chnl=15
+char id=116 x=2295 y=218 width=42 height=114 xoffset=8 yoffset=48 xadvance=57 page=0 chnl=15
+char id=117 x=2349 y=218 width=63 height=93 xoffset=15 yoffset=69 xadvance=93 page=0 chnl=15
+char id=118 x=2424 y=218 width=70 height=91 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15
+char id=119 x=2506 y=218 width=115 height=91 xoffset=8 yoffset=69 xadvance=130 page=0 chnl=15
+char id=120 x=2633 y=218 width=63 height=91 xoffset=10 yoffset=69 xadvance=82 page=0 chnl=15
+char id=121 x=2708 y=218 width=70 height=126 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15
+char id=122 x=2790 y=218 width=62 height=91 xoffset=12 yoffset=69 xadvance=84 page=0 chnl=15
+char id=123 x=2864 y=218 width=40 height=151 xoffset=10 yoffset=34 xadvance=52 page=0 chnl=15
+char id=124 x=2916 y=218 width=5 height=198 xoffset=20 yoffset=1 xadvance=45 page=0 chnl=15
+char id=125 x=2933 y=218 width=40 height=151 xoffset=2 yoffset=34 xadvance=52 page=0 chnl=15
+char id=126 x=2985 y=218 width=75 height=18 xoffset=15 yoffset=104 xadvance=105 page=0 chnl=15
+char id=163 x=3072 y=218 width=77 height=122 xoffset=13 yoffset=38 xadvance=104 page=0 chnl=15
+char id=165 x=3161 y=218 width=80 height=121 xoffset=3 yoffset=39 xadvance=86 page=0 chnl=15
+char id=167 x=3253 y=218 width=67 height=147 xoffset=10 yoffset=38 xadvance=87 page=0 chnl=15
+char id=171 x=3332 y=218 width=59 height=73 xoffset=13 yoffset=75 xadvance=86 page=0 chnl=15
+char id=176 x=3403 y=218 width=49 height=49 xoffset=13 yoffset=38 xadvance=75 page=0 chnl=15
+char id=187 x=3464 y=218 width=60 height=73 xoffset=15 yoffset=75 xadvance=88 page=0 chnl=15
+char id=191 x=3536 y=218 width=63 height=123 xoffset=9 yoffset=68 xadvance=79 page=0 chnl=15
+char id=192 x=3611 y=218 width=92 height=159 xoffset=5 yoffset=1 xadvance=101 page=0 chnl=15
+char id=193 x=3715 y=218 width=92 height=159 xoffset=5 yoffset=1 xadvance=101 page=0 chnl=15
+char id=195 x=3819 y=218 width=92 height=151 xoffset=5 yoffset=9 xadvance=101 page=0 chnl=15
+char id=196 x=3923 y=218 width=92 height=145 xoffset=5 yoffset=15 xadvance=101 page=0 chnl=15
+char id=199 x=6 y=430 width=97 height=153 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15
+char id=201 x=115 y=430 width=67 height=159 xoffset=18 yoffset=1 xadvance=96 page=0 chnl=15
+char id=202 x=194 y=430 width=67 height=153 xoffset=18 yoffset=7 xadvance=96 page=0 chnl=15
+char id=205 x=273 y=430 width=22 height=159 xoffset=18 yoffset=1 xadvance=41 page=0 chnl=15
+char id=209 x=307 y=430 width=91 height=149 xoffset=18 yoffset=11 xadvance=127 page=0 chnl=15
+char id=211 x=410 y=430 width=101 height=161 xoffset=11 yoffset=1 xadvance=123 page=0 chnl=15
+char id=212 x=523 y=430 width=101 height=155 xoffset=11 yoffset=7 xadvance=123 page=0 chnl=15
+char id=214 x=636 y=430 width=101 height=147 xoffset=11 yoffset=15 xadvance=123 page=0 chnl=15
+char id=215 x=749 y=430 width=70 height=70 xoffset=18 yoffset=78 xadvance=105 page=0 chnl=15
+char id=220 x=831 y=430 width=88 height=147 xoffset=18 yoffset=15 xadvance=123 page=0 chnl=15
+char id=223 x=931 y=430 width=65 height=122 xoffset=18 yoffset=38 xadvance=94 page=0 chnl=15
+char id=224 x=1008 y=430 width=63 height=131 xoffset=11 yoffset=31 xadvance=89 page=0 chnl=15
+char id=225 x=1083 y=430 width=63 height=131 xoffset=11 yoffset=31 xadvance=89 page=0 chnl=15
+char id=226 x=1158 y=430 width=63 height=125 xoffset=11 yoffset=37 xadvance=89 page=0 chnl=15
+char id=227 x=1233 y=430 width=63 height=121 xoffset=11 yoffset=41 xadvance=89 page=0 chnl=15
+char id=228 x=1308 y=430 width=63 height=117 xoffset=11 yoffset=45 xadvance=89 page=0 chnl=15
+char id=231 x=1383 y=430 width=71 height=123 xoffset=10 yoffset=68 xadvance=91 page=0 chnl=15
+char id=232 x=1466 y=430 width=75 height=131 xoffset=10 yoffset=31 xadvance=95 page=0 chnl=15
+char id=233 x=1553 y=430 width=75 height=131 xoffset=10 yoffset=31 xadvance=95 page=0 chnl=15
+char id=234 x=1640 y=430 width=75 height=125 xoffset=10 yoffset=37 xadvance=95 page=0 chnl=15
+char id=237 x=1727 y=430 width=22 height=129 xoffset=16 yoffset=31 xadvance=36 page=0 chnl=15
+char id=238 x=1761 y=430 width=45 height=123 xoffset=-4 yoffset=37 xadvance=36 page=0 chnl=15
+char id=241 x=1818 y=430 width=63 height=119 xoffset=15 yoffset=41 xadvance=93 page=0 chnl=15
+char id=243 x=1893 y=430 width=76 height=131 xoffset=10 yoffset=31 xadvance=95 page=0 chnl=15
+char id=244 x=1981 y=430 width=76 height=125 xoffset=10 yoffset=37 xadvance=95 page=0 chnl=15
+char id=245 x=2069 y=430 width=76 height=121 xoffset=10 yoffset=41 xadvance=95 page=0 chnl=15
+char id=246 x=2157 y=430 width=76 height=117 xoffset=10 yoffset=45 xadvance=95 page=0 chnl=15
+char id=249 x=2245 y=430 width=63 height=131 xoffset=15 yoffset=31 xadvance=93 page=0 chnl=15
+char id=250 x=2320 y=430 width=63 height=131 xoffset=15 yoffset=31 xadvance=93 page=0 chnl=15
+char id=251 x=2395 y=430 width=63 height=125 xoffset=15 yoffset=37 xadvance=93 page=0 chnl=15
+char id=252 x=2470 y=430 width=63 height=117 xoffset=15 yoffset=45 xadvance=93 page=0 chnl=15
+char id=286 x=2545 y=430 width=98 height=153 xoffset=11 yoffset=9 xadvance=122 page=0 chnl=15
+char id=287 x=2655 y=430 width=71 height=157 xoffset=10 yoffset=39 xadvance=96 page=0 chnl=15
+char id=304 x=2738 y=430 width=9 height=145 xoffset=16 yoffset=15 xadvance=41 page=0 chnl=15
+char id=305 x=2759 y=430 width=5 height=91 xoffset=16 yoffset=69 xadvance=36 page=0 chnl=15
+char id=339 x=2776 y=430 width=146 height=94 xoffset=10 yoffset=68 xadvance=165 page=0 chnl=15
+char id=350 x=2934 y=430 width=77 height=154 xoffset=12 yoffset=37 xadvance=101 page=0 chnl=15
+char id=351 x=3023 y=430 width=60 height=123 xoffset=11 yoffset=68 xadvance=81 page=0 chnl=15
+char id=1028 x=3095 y=430 width=84 height=124 xoffset=11 yoffset=38 xadvance=105 page=0 chnl=15
+char id=1030 x=3191 y=430 width=5 height=121 xoffset=18 yoffset=39 xadvance=41 page=0 chnl=15
+char id=1040 x=3208 y=430 width=92 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15
+char id=1041 x=3312 y=430 width=80 height=121 xoffset=18 yoffset=39 xadvance=110 page=0 chnl=15
+char id=1042 x=3404 y=430 width=76 height=121 xoffset=18 yoffset=39 xadvance=105 page=0 chnl=15
+char id=1043 x=3492 y=430 width=67 height=121 xoffset=18 yoffset=39 xadvance=94 page=0 chnl=15
+char id=1044 x=3571 y=430 width=105 height=151 xoffset=5 yoffset=39 xadvance=117 page=0 chnl=15
+char id=1045 x=3688 y=430 width=67 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15
+char id=1046 x=3767 y=430 width=135 height=121 xoffset=0 yoffset=39 xadvance=134 page=0 chnl=15
+char id=1047 x=3914 y=430 width=72 height=124 xoffset=15 yoffset=38 xadvance=101 page=0 chnl=15
+char id=1048 x=6 y=642 width=91 height=121 xoffset=18 yoffset=39 xadvance=127 page=0 chnl=15
+char id=1049 x=109 y=642 width=91 height=151 xoffset=18 yoffset=9 xadvance=127 page=0 chnl=15
+char id=1050 x=212 y=642 width=74 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15
+char id=1051 x=298 y=642 width=93 height=121 xoffset=5 yoffset=39 xadvance=116 page=0 chnl=15
+char id=1052 x=403 y=642 width=106 height=121 xoffset=18 yoffset=39 xadvance=142 page=0 chnl=15
+char id=1053 x=521 y=642 width=85 height=121 xoffset=18 yoffset=39 xadvance=121 page=0 chnl=15
+char id=1054 x=618 y=642 width=101 height=124 xoffset=11 yoffset=38 xadvance=123 page=0 chnl=15
+char id=1055 x=731 y=642 width=82 height=121 xoffset=15 yoffset=39 xadvance=112 page=0 chnl=15
+char id=1056 x=825 y=642 width=71 height=121 xoffset=18 yoffset=39 xadvance=100 page=0 chnl=15
+char id=1057 x=908 y=642 width=97 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15
+char id=1058 x=1017 y=642 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15
+char id=1059 x=1111 y=642 width=85 height=123 xoffset=5 yoffset=39 xadvance=94 page=0 chnl=15
+char id=1060 x=1208 y=642 width=98 height=128 xoffset=11 yoffset=37 xadvance=119 page=0 chnl=15
+char id=1062 x=1318 y=642 width=88 height=150 xoffset=18 yoffset=39 xadvance=113 page=0 chnl=15
+char id=1063 x=1418 y=642 width=79 height=121 xoffset=16 yoffset=39 xadvance=113 page=0 chnl=15
+char id=1065 x=1509 y=642 width=120 height=150 xoffset=18 yoffset=39 xadvance=145 page=0 chnl=15
+char id=1068 x=1641 y=642 width=80 height=121 xoffset=18 yoffset=39 xadvance=107 page=0 chnl=15
+char id=1070 x=1733 y=642 width=131 height=124 xoffset=18 yoffset=38 xadvance=168 page=0 chnl=15
+char id=1071 x=1876 y=642 width=76 height=121 xoffset=7 yoffset=39 xadvance=101 page=0 chnl=15
+char id=1072 x=1964 y=642 width=63 height=94 xoffset=11 yoffset=68 xadvance=89 page=0 chnl=15
+char id=1073 x=2039 y=642 width=74 height=126 xoffset=10 yoffset=36 xadvance=94 page=0 chnl=15
+char id=1074 x=2125 y=642 width=66 height=91 xoffset=15 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1075 x=2203 y=642 width=51 height=91 xoffset=15 yoffset=69 xadvance=75 page=0 chnl=15
+char id=1076 x=2266 y=642 width=86 height=117 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1077 x=2364 y=642 width=75 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1078 x=2451 y=642 width=110 height=91 xoffset=10 yoffset=69 xadvance=130 page=0 chnl=15
+char id=1079 x=2573 y=642 width=62 height=94 xoffset=9 yoffset=68 xadvance=80 page=0 chnl=15
+char id=1080 x=2647 y=642 width=67 height=91 xoffset=15 yoffset=69 xadvance=97 page=0 chnl=15
+char id=1081 x=2726 y=642 width=67 height=121 xoffset=15 yoffset=39 xadvance=97 page=0 chnl=15
+char id=1082 x=2805 y=642 width=58 height=91 xoffset=15 yoffset=69 xadvance=78 page=0 chnl=15
+char id=1083 x=2875 y=642 width=75 height=91 xoffset=5 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1084 x=2962 y=642 width=87 height=91 xoffset=15 yoffset=69 xadvance=118 page=0 chnl=15
+char id=1085 x=3061 y=642 width=65 height=91 xoffset=15 yoffset=69 xadvance=96 page=0 chnl=15
+char id=1086 x=3138 y=642 width=76 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1087 x=3226 y=642 width=64 height=91 xoffset=16 yoffset=69 xadvance=95 page=0 chnl=15
+char id=1088 x=3302 y=642 width=70 height=126 xoffset=15 yoffset=68 xadvance=95 page=0 chnl=15
+char id=1089 x=3384 y=642 width=71 height=94 xoffset=10 yoffset=68 xadvance=91 page=0 chnl=15
+char id=1090 x=3467 y=642 width=66 height=91 xoffset=9 yoffset=69 xadvance=84 page=0 chnl=15
+char id=1091 x=3545 y=642 width=70 height=126 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15
+char id=1092 x=3627 y=642 width=98 height=152 xoffset=10 yoffset=39 xadvance=117 page=0 chnl=15
+char id=1093 x=3737 y=642 width=63 height=91 xoffset=10 yoffset=69 xadvance=82 page=0 chnl=15
+char id=1094 x=3812 y=642 width=67 height=121 xoffset=16 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1095 x=3891 y=642 width=62 height=91 xoffset=15 yoffset=69 xadvance=92 page=0 chnl=15
+char id=1096 x=3965 y=642 width=98 height=91 xoffset=15 yoffset=69 xadvance=129 page=0 chnl=15
+char id=1097 x=6 y=854 width=105 height=118 xoffset=15 yoffset=69 xadvance=127 page=0 chnl=15
+char id=1100 x=123 y=854 width=61 height=91 xoffset=15 yoffset=69 xadvance=86 page=0 chnl=15
+char id=1102 x=196 y=854 width=112 height=94 xoffset=7 yoffset=68 xadvance=131 page=0 chnl=15
+char id=1103 x=320 y=854 width=66 height=91 xoffset=8 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1108 x=398 y=854 width=67 height=94 xoffset=2 yoffset=68 xadvance=76 page=0 chnl=15
+char id=1110 x=477 y=854 width=9 height=115 xoffset=14 yoffset=45 xadvance=36 page=0 chnl=15
+char id=1111 x=498 y=854 width=31 height=115 xoffset=3 yoffset=45 xadvance=36 page=0 chnl=15
+char id=8209 x=541 y=854 width=46 height=5 xoffset=-5 yoffset=106 xadvance=41 page=0 chnl=15
+char id=8211 x=599 y=854 width=83 height=5 xoffset=0 yoffset=106 xadvance=82 page=0 chnl=15
+char id=8220 x=694 y=854 width=40 height=41 xoffset=8 yoffset=37 xadvance=50 page=0 chnl=15
+char id=8222 x=746 y=854 width=40 height=42 xoffset=3 yoffset=144 xadvance=50 page=0 chnl=15
+char id=8226 x=798 y=854 width=31 height=31 xoffset=31 yoffset=97 xadvance=92 page=0 chnl=15
+char id=8364 x=841 y=854 width=95 height=124 xoffset=5 yoffset=38 xadvance=112 page=0 chnl=15
+char id=8627 x=948 y=854 width=122 height=98 xoffset=16 yoffset=39 xadvance=153 page=0 chnl=15
+char id=8679 x=1082 y=854 width=113 height=130 xoffset=15 yoffset=30 xadvance=142 page=0 chnl=15
+char id=9003 x=1207 y=854 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15
+char id=9251 x=1392 y=854 width=87 height=36 xoffset=13 yoffset=148 xadvance=112 page=0 chnl=15
+char id=9654 x=1491 y=854 width=125 height=152 xoffset=13 yoffset=24 xadvance=144 page=0 chnl=15
+char id=9664 x=1628 y=854 width=125 height=152 xoffset=6 yoffset=24 xadvance=144 page=0 chnl=15
+char id=9675 x=1765 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9679 x=1902 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15
+char id=9881 x=2039 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=2051 y=854 width=108 height=73 xoffset=19 yoffset=66 xadvance=145 page=0 chnl=15
+char id=10004 x=2171 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=2183 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=2195 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=2207 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=2219 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Inter-Thin.png b/selfdrive/assets/fonts/Inter-Thin.png
new file mode 100644
index 000000000..5f11327fd
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Thin.png differ
diff --git a/selfdrive/assets/fonts/Inter-Thin.ttf b/selfdrive/assets/fonts/Inter-Thin.ttf
new file mode 100644
index 000000000..76be6252b
Binary files /dev/null and b/selfdrive/assets/fonts/Inter-Thin.ttf differ
diff --git a/selfdrive/assets/fonts/JetBrainsMono-Medium.fnt b/selfdrive/assets/fonts/JetBrainsMono-Medium.fnt
new file mode 100644
index 000000000..5379462ae
--- /dev/null
+++ b/selfdrive/assets/fonts/JetBrainsMono-Medium.fnt
@@ -0,0 +1,231 @@
+info face="JetBrainsMono-Medium" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="JetBrainsMono-Medium.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=90 height=200 xoffset=0 yoffset=0 xadvance=90 page=0 chnl=15
+char id=33 x=120 y=6 width=25 height=112 xoffset=33 yoffset=43 xadvance=90 page=0 chnl=15
+char id=34 x=157 y=6 width=49 height=46 xoffset=21 yoffset=43 xadvance=90 page=0 chnl=15
+char id=35 x=218 y=6 width=81 height=111 xoffset=5 yoffset=43 xadvance=90 page=0 chnl=15
+char id=36 x=311 y=6 width=71 height=154 xoffset=10 yoffset=22 xadvance=90 page=0 chnl=15
+char id=37 x=394 y=6 width=89 height=113 xoffset=1 yoffset=42 xadvance=90 page=0 chnl=15
+char id=38 x=495 y=6 width=80 height=115 xoffset=7 yoffset=41 xadvance=90 page=0 chnl=15
+char id=39 x=587 y=6 width=17 height=46 xoffset=36 yoffset=43 xadvance=90 page=0 chnl=15
+char id=40 x=616 y=6 width=47 height=147 xoffset=27 yoffset=26 xadvance=90 page=0 chnl=15
+char id=41 x=675 y=6 width=47 height=147 xoffset=17 yoffset=26 xadvance=90 page=0 chnl=15
+char id=42 x=734 y=6 width=81 height=80 xoffset=5 yoffset=61 xadvance=90 page=0 chnl=15
+char id=43 x=827 y=6 width=73 height=72 xoffset=9 yoffset=68 xadvance=90 page=0 chnl=15
+char id=44 x=912 y=6 width=34 height=48 xoffset=24 yoffset=131 xadvance=90 page=0 chnl=15
+char id=45 x=958 y=6 width=49 height=14 xoffset=21 yoffset=97 xadvance=90 page=0 chnl=15
+char id=46 x=1019 y=6 width=27 height=27 xoffset=32 yoffset=129 xadvance=90 page=0 chnl=15
+char id=47 x=1058 y=6 width=71 height=143 xoffset=10 yoffset=28 xadvance=90 page=0 chnl=15
+char id=48 x=1141 y=6 width=69 height=115 xoffset=11 yoffset=41 xadvance=90 page=0 chnl=15
+char id=49 x=1222 y=6 width=70 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=50 x=1304 y=6 width=70 height=113 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15
+char id=51 x=1386 y=6 width=69 height=113 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15
+char id=52 x=1467 y=6 width=65 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15
+char id=53 x=1544 y=6 width=67 height=113 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15
+char id=54 x=1623 y=6 width=73 height=113 xoffset=9 yoffset=43 xadvance=90 page=0 chnl=15
+char id=55 x=1708 y=6 width=73 height=111 xoffset=11 yoffset=43 xadvance=90 page=0 chnl=15
+char id=56 x=1793 y=6 width=73 height=115 xoffset=9 yoffset=41 xadvance=90 page=0 chnl=15
+char id=57 x=1878 y=6 width=73 height=113 xoffset=9 yoffset=41 xadvance=90 page=0 chnl=15
+char id=58 x=1963 y=6 width=27 height=87 xoffset=32 yoffset=69 xadvance=90 page=0 chnl=15
+char id=59 x=2002 y=6 width=34 height=110 xoffset=25 yoffset=69 xadvance=90 page=0 chnl=15
+char id=60 x=2048 y=6 width=67 height=82 xoffset=12 yoffset=63 xadvance=90 page=0 chnl=15
+char id=61 x=2127 y=6 width=67 height=50 xoffset=12 yoffset=79 xadvance=90 page=0 chnl=15
+char id=62 x=2206 y=6 width=67 height=82 xoffset=12 yoffset=63 xadvance=90 page=0 chnl=15
+char id=63 x=2285 y=6 width=56 height=112 xoffset=19 yoffset=43 xadvance=90 page=0 chnl=15
+char id=64 x=2353 y=6 width=80 height=141 xoffset=6 yoffset=41 xadvance=90 page=0 chnl=15
+char id=65 x=2445 y=6 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15
+char id=66 x=2535 y=6 width=69 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=67 x=2616 y=6 width=68 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15
+char id=68 x=2696 y=6 width=66 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=69 x=2774 y=6 width=66 height=111 xoffset=14 yoffset=43 xadvance=90 page=0 chnl=15
+char id=70 x=2852 y=6 width=67 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=71 x=2931 y=6 width=68 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15
+char id=72 x=3011 y=6 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=73 x=3088 y=6 width=61 height=111 xoffset=15 yoffset=43 xadvance=90 page=0 chnl=15
+char id=74 x=3161 y=6 width=70 height=113 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15
+char id=75 x=3243 y=6 width=73 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=76 x=3328 y=6 width=65 height=111 xoffset=19 yoffset=43 xadvance=90 page=0 chnl=15
+char id=77 x=3405 y=6 width=71 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15
+char id=78 x=3488 y=6 width=66 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=79 x=3566 y=6 width=67 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15
+char id=80 x=3645 y=6 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=81 x=3728 y=6 width=70 height=141 xoffset=11 yoffset=41 xadvance=90 page=0 chnl=15
+char id=82 x=3810 y=6 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=83 x=3893 y=6 width=71 height=115 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15
+char id=84 x=3976 y=6 width=75 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15
+char id=85 x=6 y=218 width=66 height=113 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=86 x=84 y=218 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15
+char id=87 x=174 y=218 width=85 height=111 xoffset=3 yoffset=43 xadvance=90 page=0 chnl=15
+char id=88 x=271 y=218 width=81 height=111 xoffset=5 yoffset=43 xadvance=90 page=0 chnl=15
+char id=89 x=364 y=218 width=83 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15
+char id=90 x=459 y=218 width=67 height=111 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15
+char id=91 x=538 y=218 width=39 height=143 xoffset=30 yoffset=28 xadvance=90 page=0 chnl=15
+char id=92 x=589 y=218 width=71 height=143 xoffset=10 yoffset=28 xadvance=90 page=0 chnl=15
+char id=93 x=672 y=218 width=39 height=143 xoffset=22 yoffset=28 xadvance=90 page=0 chnl=15
+char id=94 x=723 y=218 width=69 height=60 xoffset=11 yoffset=43 xadvance=90 page=0 chnl=15
+char id=95 x=804 y=218 width=73 height=14 xoffset=9 yoffset=157 xadvance=90 page=0 chnl=15
+char id=96 x=889 y=218 width=34 height=22 xoffset=23 yoffset=35 xadvance=90 page=0 chnl=15
+char id=97 x=935 y=218 width=69 height=87 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15
+char id=98 x=1016 y=218 width=66 height=113 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=99 x=1094 y=218 width=68 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=100 x=1174 y=218 width=66 height=113 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15
+char id=101 x=1252 y=218 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=102 x=1331 y=218 width=74 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15
+char id=103 x=1417 y=218 width=66 height=113 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=104 x=1495 y=218 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=105 x=1572 y=218 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=106 x=1657 y=218 width=60 height=147 xoffset=10 yoffset=35 xadvance=90 page=0 chnl=15
+char id=107 x=1729 y=218 width=72 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=108 x=1813 y=218 width=80 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15
+char id=109 x=1905 y=218 width=75 height=85 xoffset=8 yoffset=69 xadvance=90 page=0 chnl=15
+char id=110 x=1992 y=218 width=65 height=85 xoffset=13 yoffset=69 xadvance=90 page=0 chnl=15
+char id=111 x=2069 y=218 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=112 x=2148 y=218 width=66 height=113 xoffset=13 yoffset=69 xadvance=90 page=0 chnl=15
+char id=113 x=2226 y=218 width=66 height=113 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=114 x=2304 y=218 width=67 height=85 xoffset=15 yoffset=69 xadvance=90 page=0 chnl=15
+char id=115 x=2383 y=218 width=68 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=116 x=2463 y=218 width=73 height=107 xoffset=7 yoffset=47 xadvance=90 page=0 chnl=15
+char id=117 x=2548 y=218 width=65 height=86 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=118 x=2625 y=218 width=79 height=84 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15
+char id=119 x=2716 y=218 width=83 height=84 xoffset=4 yoffset=70 xadvance=90 page=0 chnl=15
+char id=120 x=2811 y=218 width=78 height=84 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15
+char id=121 x=2901 y=218 width=79 height=112 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15
+char id=122 x=2992 y=218 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=123 x=3069 y=218 width=66 height=143 xoffset=11 yoffset=28 xadvance=90 page=0 chnl=15
+char id=124 x=3147 y=218 width=16 height=143 xoffset=38 yoffset=28 xadvance=90 page=0 chnl=15
+char id=125 x=3175 y=218 width=66 height=143 xoffset=14 yoffset=28 xadvance=90 page=0 chnl=15
+char id=126 x=3253 y=218 width=72 height=33 xoffset=10 yoffset=84 xadvance=90 page=0 chnl=15
+char id=163 x=3337 y=218 width=71 height=113 xoffset=11 yoffset=41 xadvance=90 page=0 chnl=15
+char id=165 x=3420 y=218 width=83 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15
+char id=167 x=3515 y=218 width=70 height=137 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15
+char id=171 x=3597 y=218 width=83 height=73 xoffset=4 yoffset=75 xadvance=90 page=0 chnl=15
+char id=176 x=3692 y=218 width=47 height=45 xoffset=22 yoffset=41 xadvance=90 page=0 chnl=15
+char id=187 x=3751 y=218 width=83 height=73 xoffset=4 yoffset=75 xadvance=90 page=0 chnl=15
+char id=191 x=3846 y=218 width=55 height=111 xoffset=16 yoffset=69 xadvance=90 page=0 chnl=15
+char id=192 x=3913 y=218 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15
+char id=193 x=4003 y=218 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15
+char id=195 x=6 y=430 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15
+char id=196 x=96 y=430 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15
+char id=199 x=186 y=430 width=68 height=145 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15
+char id=201 x=266 y=430 width=66 height=144 xoffset=14 yoffset=10 xadvance=90 page=0 chnl=15
+char id=202 x=344 y=430 width=66 height=144 xoffset=14 yoffset=10 xadvance=90 page=0 chnl=15
+char id=205 x=422 y=430 width=61 height=144 xoffset=15 yoffset=10 xadvance=90 page=0 chnl=15
+char id=209 x=495 y=430 width=66 height=144 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15
+char id=211 x=573 y=430 width=67 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15
+char id=212 x=652 y=430 width=67 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15
+char id=214 x=731 y=430 width=67 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15
+char id=215 x=810 y=430 width=61 height=62 xoffset=15 yoffset=73 xadvance=90 page=0 chnl=15
+char id=220 x=883 y=430 width=66 height=146 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15
+char id=223 x=961 y=430 width=69 height=113 xoffset=13 yoffset=41 xadvance=90 page=0 chnl=15
+char id=224 x=1042 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15
+char id=225 x=1123 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15
+char id=226 x=1204 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15
+char id=227 x=1285 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15
+char id=228 x=1366 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15
+char id=231 x=1447 y=430 width=68 height=117 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=232 x=1527 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=233 x=1606 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=234 x=1685 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=237 x=1764 y=430 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=238 x=1849 y=430 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=241 x=1934 y=430 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15
+char id=243 x=2011 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=244 x=2090 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=245 x=2169 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=246 x=2248 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=249 x=2327 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15
+char id=250 x=2404 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15
+char id=251 x=2481 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15
+char id=252 x=2558 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15
+char id=286 x=2635 y=430 width=68 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15
+char id=287 x=2715 y=430 width=66 height=147 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=304 x=2793 y=430 width=61 height=144 xoffset=15 yoffset=10 xadvance=90 page=0 chnl=15
+char id=305 x=2866 y=430 width=73 height=84 xoffset=12 yoffset=70 xadvance=90 page=0 chnl=15
+char id=339 x=2951 y=430 width=81 height=87 xoffset=5 yoffset=69 xadvance=90 page=0 chnl=15
+char id=350 x=3044 y=430 width=71 height=145 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15
+char id=351 x=3127 y=430 width=68 height=117 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1028 x=3207 y=430 width=66 height=115 xoffset=13 yoffset=41 xadvance=90 page=0 chnl=15
+char id=1030 x=3285 y=430 width=61 height=111 xoffset=15 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1040 x=3358 y=430 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1041 x=3448 y=430 width=69 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1042 x=3529 y=430 width=69 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1043 x=3610 y=430 width=66 height=111 xoffset=19 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1044 x=3688 y=430 width=85 height=133 xoffset=3 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1045 x=3785 y=430 width=66 height=111 xoffset=14 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1046 x=3863 y=430 width=89 height=111 xoffset=1 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1047 x=3964 y=430 width=74 height=115 xoffset=7 yoffset=41 xadvance=90 page=0 chnl=15
+char id=1048 x=6 y=642 width=66 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1049 x=84 y=642 width=66 height=144 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15
+char id=1050 x=162 y=642 width=73 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1051 x=247 y=642 width=76 height=112 xoffset=2 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1052 x=335 y=642 width=71 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1053 x=418 y=642 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1054 x=495 y=642 width=67 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15
+char id=1055 x=574 y=642 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1056 x=651 y=642 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1057 x=734 y=642 width=68 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15
+char id=1058 x=814 y=642 width=75 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1059 x=901 y=642 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1060 x=991 y=642 width=77 height=121 xoffset=7 yoffset=37 xadvance=90 page=0 chnl=15
+char id=1062 x=1080 y=642 width=73 height=133 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1063 x=1165 y=642 width=68 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1065 x=1245 y=642 width=79 height=133 xoffset=9 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1068 x=1336 y=642 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1070 x=1419 y=642 width=78 height=115 xoffset=8 yoffset=41 xadvance=90 page=0 chnl=15
+char id=1071 x=1509 y=642 width=70 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1072 x=1591 y=642 width=69 height=87 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1073 x=1672 y=642 width=67 height=113 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1074 x=1751 y=642 width=68 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1075 x=1831 y=642 width=61 height=84 xoffset=19 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1076 x=1904 y=642 width=82 height=106 xoffset=4 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1077 x=1998 y=642 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1078 x=2077 y=642 width=87 height=84 xoffset=2 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1079 x=2176 y=642 width=71 height=87 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1080 x=2259 y=642 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1081 x=2336 y=642 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15
+char id=1082 x=2413 y=642 width=72 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1083 x=2497 y=642 width=75 height=86 xoffset=3 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1084 x=2584 y=642 width=71 height=84 xoffset=10 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1085 x=2667 y=642 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1086 x=2744 y=642 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1087 x=2823 y=642 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1088 x=2900 y=642 width=66 height=113 xoffset=13 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1089 x=2978 y=642 width=68 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1090 x=3058 y=642 width=75 height=84 xoffset=8 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1091 x=3145 y=642 width=79 height=112 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1092 x=3236 y=642 width=77 height=139 xoffset=7 yoffset=43 xadvance=90 page=0 chnl=15
+char id=1093 x=3325 y=642 width=78 height=84 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1094 x=3415 y=642 width=73 height=106 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1095 x=3500 y=642 width=66 height=84 xoffset=11 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1096 x=3578 y=642 width=75 height=84 xoffset=8 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1097 x=3665 y=642 width=80 height=106 xoffset=8 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1100 x=3757 y=642 width=70 height=84 xoffset=14 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1102 x=3839 y=642 width=78 height=87 xoffset=8 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1103 x=3929 y=642 width=69 height=84 xoffset=9 yoffset=70 xadvance=90 page=0 chnl=15
+char id=1108 x=4010 y=642 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15
+char id=1110 x=6 y=854 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=1111 x=91 y=854 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15
+char id=8209 x=176 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8211 x=188 y=854 width=68 height=14 xoffset=11 yoffset=97 xadvance=90 page=0 chnl=15
+char id=8220 x=268 y=854 width=69 height=48 xoffset=10 yoffset=36 xadvance=90 page=0 chnl=15
+char id=8222 x=349 y=854 width=70 height=48 xoffset=11 yoffset=131 xadvance=90 page=0 chnl=15
+char id=8226 x=431 y=854 width=38 height=38 xoffset=26 yoffset=80 xadvance=90 page=0 chnl=15
+char id=8364 x=481 y=854 width=81 height=113 xoffset=2 yoffset=43 xadvance=90 page=0 chnl=15
+char id=8627 x=574 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8679 x=586 y=854 width=87 height=115 xoffset=2 yoffset=39 xadvance=90 page=0 chnl=15
+char id=9003 x=685 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9251 x=697 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9654 x=709 y=854 width=93 height=95 xoffset=0 yoffset=52 xadvance=90 page=0 chnl=15
+char id=9664 x=814 y=854 width=93 height=95 xoffset=-2 yoffset=52 xadvance=90 page=0 chnl=15
+char id=9675 x=919 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9679 x=931 y=854 width=95 height=95 xoffset=-2 yoffset=52 xadvance=90 page=0 chnl=15
+char id=9881 x=1038 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=1050 y=854 width=81 height=79 xoffset=5 yoffset=59 xadvance=90 page=0 chnl=15
+char id=10004 x=1143 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=1155 y=854 width=73 height=73 xoffset=9 yoffset=67 xadvance=90 page=0 chnl=15
+char id=65039 x=1240 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=1252 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=1264 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/JetBrainsMono-Medium.png b/selfdrive/assets/fonts/JetBrainsMono-Medium.png
new file mode 100644
index 000000000..332b061e2
Binary files /dev/null and b/selfdrive/assets/fonts/JetBrainsMono-Medium.png differ
diff --git a/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf b/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf
new file mode 100644
index 000000000..a6ba5529a
Binary files /dev/null and b/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf differ
diff --git a/selfdrive/assets/fonts/NotoColorEmoji.ttf b/selfdrive/assets/fonts/NotoColorEmoji.ttf
new file mode 100644
index 000000000..d94a23d77
Binary files /dev/null and b/selfdrive/assets/fonts/NotoColorEmoji.ttf differ
diff --git a/selfdrive/assets/fonts/Syncopate-Regular.fnt b/selfdrive/assets/fonts/Syncopate-Regular.fnt
new file mode 100644
index 000000000..31e0cb97a
--- /dev/null
+++ b/selfdrive/assets/fonts/Syncopate-Regular.fnt
@@ -0,0 +1,231 @@
+info face="Syncopate-Regular" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=206 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Syncopate-Regular.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=77 height=200 xoffset=0 yoffset=0 xadvance=77 page=0 chnl=15
+char id=33 x=107 y=6 width=17 height=139 xoffset=20 yoffset=18 xadvance=56 page=0 chnl=15
+char id=34 x=136 y=6 width=46 height=42 xoffset=7 yoffset=18 xadvance=59 page=0 chnl=15
+char id=35 x=194 y=6 width=125 height=139 xoffset=10 yoffset=18 xadvance=144 page=0 chnl=15
+char id=36 x=331 y=6 width=126 height=161 xoffset=16 yoffset=7 xadvance=158 page=0 chnl=15
+char id=37 x=469 y=6 width=177 height=145 xoffset=10 yoffset=15 xadvance=205 page=0 chnl=15
+char id=38 x=658 y=6 width=164 height=145 xoffset=15 yoffset=15 xadvance=191 page=0 chnl=15
+char id=39 x=834 y=6 width=15 height=42 xoffset=7 yoffset=18 xadvance=28 page=0 chnl=15
+char id=40 x=861 y=6 width=51 height=168 xoffset=16 yoffset=4 xadvance=86 page=0 chnl=15
+char id=41 x=924 y=6 width=51 height=168 xoffset=20 yoffset=4 xadvance=86 page=0 chnl=15
+char id=42 x=987 y=6 width=80 height=81 xoffset=12 yoffset=18 xadvance=104 page=0 chnl=15
+char id=43 x=1079 y=6 width=97 height=98 xoffset=17 yoffset=39 xadvance=131 page=0 chnl=15
+char id=44 x=1188 y=6 width=26 height=43 xoffset=4 yoffset=135 xadvance=38 page=0 chnl=15
+char id=45 x=1226 y=6 width=80 height=13 xoffset=16 yoffset=81 xadvance=111 page=0 chnl=15
+char id=46 x=1318 y=6 width=18 height=22 xoffset=10 yoffset=135 xadvance=38 page=0 chnl=15
+char id=47 x=1348 y=6 width=81 height=150 xoffset=11 yoffset=12 xadvance=103 page=0 chnl=15
+char id=48 x=1441 y=6 width=148 height=145 xoffset=12 yoffset=15 xadvance=172 page=0 chnl=15
+char id=49 x=1601 y=6 width=46 height=139 xoffset=0 yoffset=18 xadvance=70 page=0 chnl=15
+char id=50 x=1659 y=6 width=131 height=142 xoffset=8 yoffset=15 xadvance=150 page=0 chnl=15
+char id=51 x=1802 y=6 width=128 height=145 xoffset=8 yoffset=15 xadvance=150 page=0 chnl=15
+char id=52 x=1942 y=6 width=147 height=139 xoffset=6 yoffset=18 xadvance=158 page=0 chnl=15
+char id=53 x=2101 y=6 width=129 height=142 xoffset=12 yoffset=18 xadvance=152 page=0 chnl=15
+char id=54 x=2242 y=6 width=139 height=145 xoffset=13 yoffset=15 xadvance=159 page=0 chnl=15
+char id=55 x=2393 y=6 width=133 height=139 xoffset=0 yoffset=18 xadvance=138 page=0 chnl=15
+char id=56 x=2538 y=6 width=142 height=145 xoffset=11 yoffset=15 xadvance=164 page=0 chnl=15
+char id=57 x=2692 y=6 width=139 height=145 xoffset=9 yoffset=15 xadvance=160 page=0 chnl=15
+char id=58 x=2843 y=6 width=19 height=97 xoffset=16 yoffset=60 xadvance=50 page=0 chnl=15
+char id=59 x=2874 y=6 width=26 height=118 xoffset=9 yoffset=60 xadvance=48 page=0 chnl=15
+char id=60 x=2912 y=6 width=100 height=99 xoffset=15 yoffset=38 xadvance=131 page=0 chnl=15
+char id=61 x=3024 y=6 width=97 height=50 xoffset=17 yoffset=63 xadvance=131 page=0 chnl=15
+char id=62 x=3133 y=6 width=99 height=99 xoffset=17 yoffset=38 xadvance=131 page=0 chnl=15
+char id=63 x=3244 y=6 width=92 height=142 xoffset=12 yoffset=15 xadvance=117 page=0 chnl=15
+char id=64 x=3348 y=6 width=180 height=146 xoffset=15 yoffset=14 xadvance=209 page=0 chnl=15
+char id=65 x=3540 y=6 width=161 height=139 xoffset=4 yoffset=18 xadvance=168 page=0 chnl=15
+char id=66 x=3713 y=6 width=138 height=139 xoffset=23 yoffset=18 xadvance=172 page=0 chnl=15
+char id=67 x=3863 y=6 width=153 height=145 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15
+char id=68 x=6 y=218 width=152 height=139 xoffset=23 yoffset=18 xadvance=188 page=0 chnl=15
+char id=69 x=170 y=218 width=118 height=139 xoffset=23 yoffset=18 xadvance=156 page=0 chnl=15
+char id=70 x=300 y=218 width=111 height=139 xoffset=23 yoffset=18 xadvance=142 page=0 chnl=15
+char id=71 x=423 y=218 width=159 height=145 xoffset=13 yoffset=15 xadvance=188 page=0 chnl=15
+char id=72 x=594 y=218 width=150 height=139 xoffset=23 yoffset=18 xadvance=196 page=0 chnl=15
+char id=73 x=756 y=218 width=13 height=139 xoffset=23 yoffset=18 xadvance=59 page=0 chnl=15
+char id=74 x=781 y=218 width=100 height=141 xoffset=0 yoffset=18 xadvance=122 page=0 chnl=15
+char id=75 x=893 y=218 width=141 height=139 xoffset=23 yoffset=18 xadvance=166 page=0 chnl=15
+char id=76 x=1046 y=218 width=115 height=139 xoffset=23 yoffset=18 xadvance=144 page=0 chnl=15
+char id=77 x=1173 y=218 width=190 height=139 xoffset=23 yoffset=18 xadvance=235 page=0 chnl=15
+char id=78 x=1375 y=218 width=148 height=139 xoffset=23 yoffset=18 xadvance=193 page=0 chnl=15
+char id=79 x=1535 y=218 width=177 height=145 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15
+char id=80 x=1724 y=218 width=136 height=139 xoffset=23 yoffset=18 xadvance=169 page=0 chnl=15
+char id=81 x=1872 y=218 width=190 height=147 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15
+char id=82 x=2074 y=218 width=142 height=139 xoffset=23 yoffset=18 xadvance=172 page=0 chnl=15
+char id=83 x=2228 y=218 width=131 height=145 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15
+char id=84 x=2371 y=218 width=140 height=139 xoffset=3 yoffset=18 xadvance=146 page=0 chnl=15
+char id=85 x=2523 y=218 width=141 height=142 xoffset=22 yoffset=18 xadvance=184 page=0 chnl=15
+char id=86 x=2676 y=218 width=159 height=139 xoffset=5 yoffset=18 xadvance=169 page=0 chnl=15
+char id=87 x=2847 y=218 width=247 height=139 xoffset=7 yoffset=18 xadvance=261 page=0 chnl=15
+char id=88 x=3106 y=218 width=152 height=139 xoffset=9 yoffset=18 xadvance=169 page=0 chnl=15
+char id=89 x=3270 y=218 width=144 height=139 xoffset=7 yoffset=18 xadvance=157 page=0 chnl=15
+char id=90 x=3426 y=218 width=124 height=139 xoffset=14 yoffset=18 xadvance=150 page=0 chnl=15
+char id=91 x=3562 y=218 width=49 height=164 xoffset=26 yoffset=6 xadvance=84 page=0 chnl=15
+char id=92 x=3623 y=218 width=81 height=150 xoffset=11 yoffset=12 xadvance=103 page=0 chnl=15
+char id=93 x=3716 y=218 width=49 height=164 xoffset=10 yoffset=6 xadvance=84 page=0 chnl=15
+char id=94 x=3777 y=218 width=83 height=60 xoffset=6 yoffset=18 xadvance=95 page=0 chnl=15
+char id=95 x=3872 y=218 width=104 height=13 xoffset=0 yoffset=170 xadvance=103 page=0 chnl=15
+char id=96 x=3988 y=218 width=50 height=31 xoffset=18 yoffset=12 xadvance=109 page=0 chnl=15
+char id=97 x=6 y=430 width=150 height=145 xoffset=12 yoffset=15 xadvance=183 page=0 chnl=15
+char id=98 x=168 y=430 width=138 height=139 xoffset=23 yoffset=18 xadvance=172 page=0 chnl=15
+char id=99 x=318 y=430 width=153 height=145 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15
+char id=100 x=483 y=430 width=152 height=139 xoffset=23 yoffset=18 xadvance=188 page=0 chnl=15
+char id=101 x=647 y=430 width=162 height=144 xoffset=13 yoffset=16 xadvance=188 page=0 chnl=15
+char id=102 x=821 y=430 width=134 height=139 xoffset=23 yoffset=18 xadvance=169 page=0 chnl=15
+char id=103 x=967 y=430 width=159 height=145 xoffset=13 yoffset=15 xadvance=188 page=0 chnl=15
+char id=104 x=1138 y=430 width=150 height=139 xoffset=23 yoffset=18 xadvance=196 page=0 chnl=15
+char id=105 x=1300 y=430 width=13 height=139 xoffset=23 yoffset=18 xadvance=59 page=0 chnl=15
+char id=106 x=1325 y=430 width=100 height=141 xoffset=0 yoffset=18 xadvance=122 page=0 chnl=15
+char id=107 x=1437 y=430 width=144 height=139 xoffset=23 yoffset=18 xadvance=179 page=0 chnl=15
+char id=108 x=1593 y=430 width=122 height=139 xoffset=23 yoffset=18 xadvance=146 page=0 chnl=15
+char id=109 x=1727 y=430 width=212 height=142 xoffset=23 yoffset=15 xadvance=257 page=0 chnl=15
+char id=110 x=1951 y=430 width=148 height=142 xoffset=23 yoffset=15 xadvance=192 page=0 chnl=15
+char id=111 x=2111 y=430 width=177 height=145 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15
+char id=112 x=2300 y=430 width=136 height=139 xoffset=23 yoffset=18 xadvance=169 page=0 chnl=15
+char id=113 x=2448 y=430 width=189 height=146 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15
+char id=114 x=2649 y=430 width=104 height=143 xoffset=23 yoffset=14 xadvance=126 page=0 chnl=15
+char id=115 x=2765 y=430 width=131 height=145 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15
+char id=116 x=2908 y=430 width=140 height=139 xoffset=3 yoffset=18 xadvance=146 page=0 chnl=15
+char id=117 x=3060 y=430 width=148 height=143 xoffset=22 yoffset=18 xadvance=192 page=0 chnl=15
+char id=118 x=3220 y=430 width=159 height=139 xoffset=5 yoffset=18 xadvance=169 page=0 chnl=15
+char id=119 x=3391 y=430 width=247 height=139 xoffset=7 yoffset=18 xadvance=261 page=0 chnl=15
+char id=120 x=3650 y=430 width=152 height=139 xoffset=9 yoffset=18 xadvance=169 page=0 chnl=15
+char id=121 x=3814 y=430 width=147 height=142 xoffset=18 yoffset=18 xadvance=188 page=0 chnl=15
+char id=122 x=6 y=642 width=124 height=139 xoffset=14 yoffset=18 xadvance=150 page=0 chnl=15
+char id=123 x=142 y=642 width=64 height=164 xoffset=6 yoffset=6 xadvance=79 page=0 chnl=15
+char id=124 x=218 y=642 width=14 height=207 xoffset=20 yoffset=-1 xadvance=53 page=0 chnl=15
+char id=125 x=244 y=642 width=64 height=164 xoffset=10 yoffset=6 xadvance=79 page=0 chnl=15
+char id=126 x=320 y=642 width=101 height=24 xoffset=15 yoffset=76 xadvance=131 page=0 chnl=15
+char id=163 x=433 y=642 width=140 height=145 xoffset=12 yoffset=15 xadvance=163 page=0 chnl=15
+char id=165 x=585 y=642 width=144 height=139 xoffset=12 yoffset=18 xadvance=167 page=0 chnl=15
+char id=167 x=741 y=642 width=79 height=144 xoffset=12 yoffset=16 xadvance=103 page=0 chnl=15
+char id=171 x=832 y=642 width=75 height=78 xoffset=8 yoffset=49 xadvance=91 page=0 chnl=15
+char id=176 x=919 y=642 width=51 height=51 xoffset=13 yoffset=18 xadvance=77 page=0 chnl=15
+char id=187 x=982 y=642 width=75 height=78 xoffset=8 yoffset=49 xadvance=91 page=0 chnl=15
+char id=191 x=1069 y=642 width=92 height=142 xoffset=14 yoffset=18 xadvance=117 page=0 chnl=15
+char id=192 x=1173 y=642 width=161 height=181 xoffset=4 yoffset=-24 xadvance=168 page=0 chnl=15
+char id=193 x=1346 y=642 width=161 height=181 xoffset=4 yoffset=-24 xadvance=168 page=0 chnl=15
+char id=195 x=1519 y=642 width=161 height=175 xoffset=4 yoffset=-18 xadvance=168 page=0 chnl=15
+char id=196 x=1692 y=642 width=161 height=169 xoffset=4 yoffset=-12 xadvance=168 page=0 chnl=15
+char id=199 x=1865 y=642 width=153 height=183 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15
+char id=201 x=2030 y=642 width=118 height=181 xoffset=23 yoffset=-24 xadvance=156 page=0 chnl=15
+char id=202 x=2160 y=642 width=118 height=181 xoffset=23 yoffset=-24 xadvance=156 page=0 chnl=15
+char id=205 x=2290 y=642 width=49 height=181 xoffset=17 yoffset=-24 xadvance=59 page=0 chnl=15
+char id=209 x=2351 y=642 width=148 height=175 xoffset=23 yoffset=-18 xadvance=193 page=0 chnl=15
+char id=211 x=2511 y=642 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15
+char id=212 x=2700 y=642 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15
+char id=214 x=2889 y=642 width=177 height=172 xoffset=13 yoffset=-12 xadvance=203 page=0 chnl=15
+char id=215 x=3078 y=642 width=87 height=86 xoffset=22 yoffset=45 xadvance=131 page=0 chnl=15
+char id=220 x=3177 y=642 width=141 height=172 xoffset=22 yoffset=-12 xadvance=184 page=0 chnl=15
+char id=223 x=3330 y=642 width=148 height=146 xoffset=19 yoffset=14 xadvance=178 page=0 chnl=15
+char id=224 x=3490 y=642 width=150 height=184 xoffset=12 yoffset=-24 xadvance=183 page=0 chnl=15
+char id=225 x=3652 y=642 width=150 height=184 xoffset=12 yoffset=-24 xadvance=183 page=0 chnl=15
+char id=226 x=3814 y=642 width=150 height=184 xoffset=12 yoffset=-24 xadvance=183 page=0 chnl=15
+char id=227 x=6 y=854 width=150 height=178 xoffset=12 yoffset=-18 xadvance=183 page=0 chnl=15
+char id=228 x=168 y=854 width=150 height=172 xoffset=12 yoffset=-12 xadvance=183 page=0 chnl=15
+char id=231 x=330 y=854 width=153 height=183 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15
+char id=232 x=495 y=854 width=162 height=184 xoffset=13 yoffset=-24 xadvance=188 page=0 chnl=15
+char id=233 x=669 y=854 width=162 height=184 xoffset=13 yoffset=-24 xadvance=188 page=0 chnl=15
+char id=234 x=843 y=854 width=162 height=184 xoffset=13 yoffset=-24 xadvance=188 page=0 chnl=15
+char id=237 x=1017 y=854 width=49 height=181 xoffset=17 yoffset=-24 xadvance=59 page=0 chnl=15
+char id=238 x=1078 y=854 width=79 height=181 xoffset=-10 yoffset=-24 xadvance=59 page=0 chnl=15
+char id=241 x=1169 y=854 width=148 height=175 xoffset=23 yoffset=-18 xadvance=192 page=0 chnl=15
+char id=243 x=1329 y=854 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15
+char id=244 x=1518 y=854 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15
+char id=245 x=1707 y=854 width=177 height=178 xoffset=13 yoffset=-18 xadvance=203 page=0 chnl=15
+char id=246 x=1896 y=854 width=177 height=172 xoffset=13 yoffset=-12 xadvance=203 page=0 chnl=15
+char id=249 x=2085 y=854 width=148 height=185 xoffset=22 yoffset=-24 xadvance=192 page=0 chnl=15
+char id=250 x=2245 y=854 width=148 height=185 xoffset=22 yoffset=-24 xadvance=192 page=0 chnl=15
+char id=251 x=2405 y=854 width=148 height=185 xoffset=22 yoffset=-24 xadvance=192 page=0 chnl=15
+char id=252 x=2565 y=854 width=148 height=173 xoffset=22 yoffset=-12 xadvance=192 page=0 chnl=15
+char id=286 x=2725 y=854 width=159 height=180 xoffset=13 yoffset=-20 xadvance=188 page=0 chnl=15
+char id=287 x=2896 y=854 width=159 height=180 xoffset=13 yoffset=-20 xadvance=188 page=0 chnl=15
+char id=304 x=3067 y=854 width=17 height=170 xoffset=21 yoffset=-13 xadvance=59 page=0 chnl=15
+char id=305 x=3096 y=854 width=13 height=139 xoffset=23 yoffset=18 xadvance=59 page=0 chnl=15
+char id=339 x=3121 y=854 width=325 height=145 xoffset=13 yoffset=15 xadvance=349 page=0 chnl=15
+char id=350 x=3458 y=854 width=131 height=183 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15
+char id=351 x=3601 y=854 width=131 height=183 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15
+char id=1028 x=3744 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1030 x=3756 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1040 x=3768 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1041 x=3780 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1042 x=3792 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1043 x=3804 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1044 x=3816 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1045 x=3828 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1046 x=3840 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1047 x=3852 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1048 x=3864 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1049 x=3876 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1050 x=3888 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1051 x=3900 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1052 x=3912 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1053 x=3924 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1054 x=3936 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1055 x=3948 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1056 x=3960 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1057 x=3972 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1058 x=3984 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1059 x=3996 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1060 x=4008 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1062 x=4020 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1063 x=4032 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1065 x=4044 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1068 x=4056 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1070 x=4068 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1071 x=4080 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1072 x=6 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1073 x=18 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1074 x=30 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1075 x=42 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1076 x=54 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1077 x=66 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1078 x=78 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1079 x=90 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1080 x=102 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1081 x=114 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1082 x=126 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1083 x=138 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1084 x=150 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1085 x=162 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1086 x=174 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1087 x=186 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1088 x=198 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1089 x=210 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1090 x=222 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1091 x=234 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1092 x=246 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1093 x=258 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1094 x=270 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1095 x=282 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1096 x=294 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1097 x=306 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1100 x=318 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1102 x=330 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1103 x=342 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1108 x=354 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1110 x=366 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1111 x=378 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8209 x=390 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8211 x=402 y=1066 width=79 height=12 xoffset=4 yoffset=82 xadvance=86 page=0 chnl=15
+char id=8220 x=493 y=1066 width=51 height=37 xoffset=6 yoffset=18 xadvance=62 page=0 chnl=15
+char id=8222 x=556 y=1066 width=51 height=37 xoffset=6 yoffset=139 xadvance=62 page=0 chnl=15
+char id=8226 x=619 y=1066 width=41 height=41 xoffset=16 yoffset=65 xadvance=72 page=0 chnl=15
+char id=8364 x=672 y=1066 width=152 height=145 xoffset=5 yoffset=15 xadvance=172 page=0 chnl=15
+char id=8627 x=836 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8679 x=848 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9003 x=860 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9251 x=872 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9654 x=884 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9664 x=896 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9675 x=908 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9679 x=920 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9881 x=932 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=944 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10004 x=956 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=968 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=980 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=992 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=1004 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Syncopate-Regular.png b/selfdrive/assets/fonts/Syncopate-Regular.png
new file mode 100644
index 000000000..fe790ef3f
Binary files /dev/null and b/selfdrive/assets/fonts/Syncopate-Regular.png differ
diff --git a/selfdrive/assets/fonts/Syncopate-Regular.ttf b/selfdrive/assets/fonts/Syncopate-Regular.ttf
new file mode 100644
index 000000000..a1fbf3f34
Binary files /dev/null and b/selfdrive/assets/fonts/Syncopate-Regular.ttf differ
diff --git a/selfdrive/assets/fonts/Tektur-Variable.fnt b/selfdrive/assets/fonts/Tektur-Variable.fnt
new file mode 100644
index 000000000..4bc9c4d1d
--- /dev/null
+++ b/selfdrive/assets/fonts/Tektur-Variable.fnt
@@ -0,0 +1,231 @@
+info face="Tektur-Variable" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="Tektur-Variable.png"
+chars count=227
+char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=32 x=18 y=6 width=40 height=200 xoffset=0 yoffset=0 xadvance=40 page=0 chnl=15
+char id=33 x=70 y=6 width=17 height=108 xoffset=12 yoffset=45 xadvance=41 page=0 chnl=15
+char id=34 x=99 y=6 width=44 height=38 xoffset=9 yoffset=45 xadvance=61 page=0 chnl=15
+char id=35 x=155 y=6 width=108 height=108 xoffset=9 yoffset=45 xadvance=126 page=0 chnl=15
+char id=36 x=275 y=6 width=84 height=127 xoffset=9 yoffset=36 xadvance=101 page=0 chnl=15
+char id=37 x=371 y=6 width=84 height=108 xoffset=4 yoffset=45 xadvance=92 page=0 chnl=15
+char id=38 x=467 y=6 width=102 height=108 xoffset=8 yoffset=45 xadvance=113 page=0 chnl=15
+char id=39 x=581 y=6 width=16 height=38 xoffset=9 yoffset=45 xadvance=33 page=0 chnl=15
+char id=40 x=609 y=6 width=41 height=138 xoffset=9 yoffset=37 xadvance=52 page=0 chnl=15
+char id=41 x=662 y=6 width=41 height=138 xoffset=3 yoffset=37 xadvance=52 page=0 chnl=15
+char id=42 x=715 y=6 width=72 height=72 xoffset=4 yoffset=45 xadvance=80 page=0 chnl=15
+char id=43 x=799 y=6 width=81 height=81 xoffset=6 yoffset=63 xadvance=92 page=0 chnl=15
+char id=44 x=892 y=6 width=25 height=38 xoffset=4 yoffset=137 xadvance=38 page=0 chnl=15
+char id=45 x=929 y=6 width=41 height=15 xoffset=6 yoffset=96 xadvance=52 page=0 chnl=15
+char id=46 x=982 y=6 width=15 height=16 xoffset=12 yoffset=137 xadvance=38 page=0 chnl=15
+char id=47 x=1009 y=6 width=66 height=108 xoffset=1 yoffset=45 xadvance=67 page=0 chnl=15
+char id=48 x=1087 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=49 x=1181 y=6 width=54 height=109 xoffset=6 yoffset=45 xadvance=66 page=0 chnl=15
+char id=50 x=1247 y=6 width=84 height=108 xoffset=9 yoffset=45 xadvance=101 page=0 chnl=15
+char id=51 x=1343 y=6 width=84 height=108 xoffset=4 yoffset=45 xadvance=93 page=0 chnl=15
+char id=52 x=1439 y=6 width=84 height=108 xoffset=6 yoffset=45 xadvance=98 page=0 chnl=15
+char id=53 x=1535 y=6 width=84 height=108 xoffset=9 yoffset=45 xadvance=101 page=0 chnl=15
+char id=54 x=1631 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=55 x=1725 y=6 width=84 height=108 xoffset=6 yoffset=45 xadvance=95 page=0 chnl=15
+char id=56 x=1821 y=6 width=89 height=108 xoffset=7 yoffset=45 xadvance=103 page=0 chnl=15
+char id=57 x=1922 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=58 x=2016 y=6 width=15 height=71 xoffset=12 yoffset=82 xadvance=38 page=0 chnl=15
+char id=59 x=2043 y=6 width=25 height=93 xoffset=2 yoffset=82 xadvance=38 page=0 chnl=15
+char id=60 x=2080 y=6 width=83 height=87 xoffset=4 yoffset=66 xadvance=92 page=0 chnl=15
+char id=61 x=2175 y=6 width=81 height=46 xoffset=6 yoffset=81 xadvance=92 page=0 chnl=15
+char id=62 x=2268 y=6 width=82 height=87 xoffset=6 yoffset=66 xadvance=92 page=0 chnl=15
+char id=63 x=2362 y=6 width=81 height=108 xoffset=2 yoffset=45 xadvance=84 page=0 chnl=15
+char id=64 x=2455 y=6 width=105 height=130 xoffset=9 yoffset=45 xadvance=123 page=0 chnl=15
+char id=65 x=2572 y=6 width=94 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15
+char id=66 x=2678 y=6 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=67 x=2774 y=6 width=71 height=108 xoffset=9 yoffset=45 xadvance=84 page=0 chnl=15
+char id=68 x=2857 y=6 width=80 height=108 xoffset=9 yoffset=45 xadvance=97 page=0 chnl=15
+char id=69 x=2949 y=6 width=76 height=108 xoffset=9 yoffset=45 xadvance=89 page=0 chnl=15
+char id=70 x=3037 y=6 width=75 height=108 xoffset=9 yoffset=45 xadvance=87 page=0 chnl=15
+char id=71 x=3124 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=72 x=3218 y=6 width=85 height=108 xoffset=9 yoffset=45 xadvance=103 page=0 chnl=15
+char id=73 x=3315 y=6 width=54 height=110 xoffset=6 yoffset=44 xadvance=66 page=0 chnl=15
+char id=74 x=3381 y=6 width=78 height=108 xoffset=6 yoffset=45 xadvance=92 page=0 chnl=15
+char id=75 x=3471 y=6 width=87 height=108 xoffset=9 yoffset=45 xadvance=96 page=0 chnl=15
+char id=76 x=3570 y=6 width=79 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15
+char id=77 x=3661 y=6 width=102 height=108 xoffset=9 yoffset=45 xadvance=120 page=0 chnl=15
+char id=78 x=3775 y=6 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15
+char id=79 x=3874 y=6 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15
+char id=80 x=3973 y=6 width=81 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15
+char id=81 x=6 y=218 width=93 height=122 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15
+char id=82 x=111 y=218 width=91 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=83 x=214 y=218 width=81 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=84 x=307 y=218 width=81 height=108 xoffset=3 yoffset=45 xadvance=86 page=0 chnl=15
+char id=85 x=400 y=218 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=86 x=494 y=218 width=94 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15
+char id=87 x=600 y=218 width=127 height=108 xoffset=3 yoffset=45 xadvance=132 page=0 chnl=15
+char id=88 x=739 y=218 width=96 height=108 xoffset=3 yoffset=45 xadvance=101 page=0 chnl=15
+char id=89 x=847 y=218 width=92 height=108 xoffset=3 yoffset=45 xadvance=98 page=0 chnl=15
+char id=90 x=951 y=218 width=72 height=108 xoffset=7 yoffset=45 xadvance=86 page=0 chnl=15
+char id=91 x=1035 y=218 width=41 height=138 xoffset=9 yoffset=37 xadvance=52 page=0 chnl=15
+char id=92 x=1088 y=218 width=66 height=108 xoffset=1 yoffset=45 xadvance=67 page=0 chnl=15
+char id=93 x=1166 y=218 width=41 height=138 xoffset=3 yoffset=37 xadvance=52 page=0 chnl=15
+char id=94 x=1219 y=218 width=73 height=55 xoffset=2 yoffset=45 xadvance=76 page=0 chnl=15
+char id=95 x=1304 y=218 width=81 height=13 xoffset=6 yoffset=153 xadvance=92 page=0 chnl=15
+char id=96 x=1397 y=218 width=51 height=14 xoffset=333 yoffset=41 xadvance=378 page=0 chnl=15
+char id=97 x=1460 y=218 width=77 height=87 xoffset=7 yoffset=66 xadvance=92 page=0 chnl=15
+char id=98 x=1549 y=218 width=78 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15
+char id=99 x=1639 y=218 width=72 height=87 xoffset=8 yoffset=66 xadvance=83 page=0 chnl=15
+char id=100 x=1723 y=218 width=79 height=108 xoffset=8 yoffset=45 xadvance=95 page=0 chnl=15
+char id=101 x=1814 y=218 width=75 height=87 xoffset=8 yoffset=66 xadvance=90 page=0 chnl=15
+char id=102 x=1901 y=218 width=52 height=108 xoffset=9 yoffset=45 xadvance=63 page=0 chnl=15
+char id=103 x=1965 y=218 width=77 height=109 xoffset=8 yoffset=66 xadvance=93 page=0 chnl=15
+char id=104 x=2054 y=218 width=78 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15
+char id=105 x=2144 y=218 width=15 height=110 xoffset=9 yoffset=43 xadvance=32 page=0 chnl=15
+char id=106 x=2171 y=218 width=15 height=132 xoffset=9 yoffset=43 xadvance=32 page=0 chnl=15
+char id=107 x=2198 y=218 width=82 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15
+char id=108 x=2292 y=218 width=15 height=108 xoffset=9 yoffset=45 xadvance=32 page=0 chnl=15
+char id=109 x=2319 y=218 width=124 height=87 xoffset=9 yoffset=66 xadvance=141 page=0 chnl=15
+char id=110 x=2455 y=218 width=78 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15
+char id=111 x=2545 y=218 width=76 height=87 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15
+char id=112 x=2633 y=218 width=78 height=109 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15
+char id=113 x=2723 y=218 width=79 height=109 xoffset=8 yoffset=66 xadvance=95 page=0 chnl=15
+char id=114 x=2814 y=218 width=61 height=87 xoffset=9 yoffset=66 xadvance=72 page=0 chnl=15
+char id=115 x=2887 y=218 width=76 height=87 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15
+char id=116 x=2975 y=218 width=55 height=108 xoffset=9 yoffset=45 xadvance=66 page=0 chnl=15
+char id=117 x=3042 y=218 width=78 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15
+char id=118 x=3132 y=218 width=87 height=87 xoffset=1 yoffset=66 xadvance=89 page=0 chnl=15
+char id=119 x=3231 y=218 width=118 height=87 xoffset=6 yoffset=66 xadvance=129 page=0 chnl=15
+char id=120 x=3361 y=218 width=91 height=87 xoffset=3 yoffset=66 xadvance=96 page=0 chnl=15
+char id=121 x=3464 y=218 width=90 height=109 xoffset=1 yoffset=66 xadvance=92 page=0 chnl=15
+char id=122 x=3566 y=218 width=73 height=87 xoffset=4 yoffset=66 xadvance=81 page=0 chnl=15
+char id=123 x=3651 y=218 width=56 height=138 xoffset=3 yoffset=37 xadvance=61 page=0 chnl=15
+char id=124 x=3719 y=218 width=15 height=139 xoffset=9 yoffset=36 xadvance=32 page=0 chnl=15
+char id=125 x=3746 y=218 width=56 height=138 xoffset=3 yoffset=37 xadvance=61 page=0 chnl=15
+char id=126 x=3814 y=218 width=87 height=35 xoffset=3 yoffset=85 xadvance=92 page=0 chnl=15
+char id=163 x=3913 y=218 width=92 height=108 xoffset=4 yoffset=45 xadvance=100 page=0 chnl=15
+char id=165 x=6 y=430 width=92 height=108 xoffset=3 yoffset=45 xadvance=98 page=0 chnl=15
+char id=167 x=110 y=430 width=82 height=123 xoffset=8 yoffset=45 xadvance=98 page=0 chnl=15
+char id=171 x=204 y=430 width=99 height=87 xoffset=3 yoffset=66 xadvance=106 page=0 chnl=15
+char id=176 x=315 y=430 width=44 height=44 xoffset=3 yoffset=45 xadvance=49 page=0 chnl=15
+char id=187 x=371 y=430 width=100 height=87 xoffset=4 yoffset=66 xadvance=106 page=0 chnl=15
+char id=191 x=483 y=430 width=81 height=109 xoffset=2 yoffset=66 xadvance=84 page=0 chnl=15
+char id=192 x=576 y=430 width=94 height=134 xoffset=3 yoffset=19 xadvance=100 page=0 chnl=15
+char id=193 x=682 y=430 width=94 height=134 xoffset=3 yoffset=19 xadvance=100 page=0 chnl=15
+char id=195 x=788 y=430 width=94 height=138 xoffset=3 yoffset=15 xadvance=100 page=0 chnl=15
+char id=196 x=894 y=430 width=94 height=131 xoffset=3 yoffset=22 xadvance=100 page=0 chnl=15
+char id=199 x=1000 y=430 width=71 height=139 xoffset=9 yoffset=45 xadvance=84 page=0 chnl=15
+char id=201 x=1083 y=430 width=76 height=134 xoffset=9 yoffset=19 xadvance=89 page=0 chnl=15
+char id=202 x=1171 y=430 width=76 height=140 xoffset=9 yoffset=13 xadvance=89 page=0 chnl=15
+char id=205 x=1259 y=430 width=57 height=135 xoffset=6 yoffset=19 xadvance=66 page=0 chnl=15
+char id=209 x=1328 y=430 width=87 height=138 xoffset=9 yoffset=15 xadvance=104 page=0 chnl=15
+char id=211 x=1427 y=430 width=87 height=134 xoffset=9 yoffset=19 xadvance=104 page=0 chnl=15
+char id=212 x=1526 y=430 width=87 height=140 xoffset=9 yoffset=13 xadvance=104 page=0 chnl=15
+char id=214 x=1625 y=430 width=87 height=131 xoffset=9 yoffset=22 xadvance=104 page=0 chnl=15
+char id=215 x=1724 y=430 width=75 height=75 xoffset=9 yoffset=66 xadvance=92 page=0 chnl=15
+char id=220 x=1811 y=430 width=82 height=131 xoffset=9 yoffset=22 xadvance=100 page=0 chnl=15
+char id=223 x=1905 y=430 width=82 height=108 xoffset=9 yoffset=45 xadvance=96 page=0 chnl=15
+char id=224 x=1999 y=430 width=77 height=112 xoffset=7 yoffset=41 xadvance=92 page=0 chnl=15
+char id=225 x=2088 y=430 width=77 height=112 xoffset=7 yoffset=41 xadvance=92 page=0 chnl=15
+char id=226 x=2177 y=430 width=77 height=118 xoffset=7 yoffset=35 xadvance=92 page=0 chnl=15
+char id=227 x=2266 y=430 width=77 height=117 xoffset=7 yoffset=36 xadvance=92 page=0 chnl=15
+char id=228 x=2355 y=430 width=77 height=110 xoffset=7 yoffset=43 xadvance=92 page=0 chnl=15
+char id=231 x=2444 y=430 width=72 height=118 xoffset=8 yoffset=66 xadvance=83 page=0 chnl=15
+char id=232 x=2528 y=430 width=75 height=112 xoffset=8 yoffset=41 xadvance=90 page=0 chnl=15
+char id=233 x=2615 y=430 width=75 height=112 xoffset=8 yoffset=41 xadvance=90 page=0 chnl=15
+char id=234 x=2702 y=430 width=75 height=118 xoffset=8 yoffset=35 xadvance=90 page=0 chnl=15
+char id=237 x=2789 y=430 width=26 height=112 xoffset=6 yoffset=41 xadvance=32 page=0 chnl=15
+char id=238 x=2827 y=430 width=60 height=118 xoffset=-14 yoffset=35 xadvance=32 page=0 chnl=15
+char id=241 x=2899 y=430 width=78 height=117 xoffset=9 yoffset=36 xadvance=95 page=0 chnl=15
+char id=243 x=2989 y=430 width=76 height=112 xoffset=8 yoffset=41 xadvance=92 page=0 chnl=15
+char id=244 x=3077 y=430 width=76 height=118 xoffset=8 yoffset=35 xadvance=92 page=0 chnl=15
+char id=245 x=3165 y=430 width=76 height=117 xoffset=8 yoffset=36 xadvance=92 page=0 chnl=15
+char id=246 x=3253 y=430 width=76 height=110 xoffset=8 yoffset=43 xadvance=92 page=0 chnl=15
+char id=249 x=3341 y=430 width=78 height=112 xoffset=9 yoffset=41 xadvance=95 page=0 chnl=15
+char id=250 x=3431 y=430 width=78 height=112 xoffset=9 yoffset=41 xadvance=95 page=0 chnl=15
+char id=251 x=3521 y=430 width=78 height=118 xoffset=9 yoffset=35 xadvance=95 page=0 chnl=15
+char id=252 x=3611 y=430 width=78 height=110 xoffset=9 yoffset=43 xadvance=95 page=0 chnl=15
+char id=286 x=3701 y=430 width=82 height=137 xoffset=9 yoffset=16 xadvance=100 page=0 chnl=15
+char id=287 x=3795 y=430 width=77 height=138 xoffset=8 yoffset=37 xadvance=93 page=0 chnl=15
+char id=304 x=3884 y=430 width=54 height=132 xoffset=6 yoffset=22 xadvance=66 page=0 chnl=15
+char id=305 x=3950 y=430 width=15 height=87 xoffset=9 yoffset=66 xadvance=32 page=0 chnl=15
+char id=339 x=6 y=642 width=127 height=87 xoffset=8 yoffset=66 xadvance=143 page=0 chnl=15
+char id=350 x=145 y=642 width=81 height=139 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=351 x=238 y=642 width=76 height=118 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15
+char id=1028 x=326 y=642 width=79 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15
+char id=1030 x=417 y=642 width=54 height=110 xoffset=6 yoffset=44 xadvance=66 page=0 chnl=15
+char id=1040 x=483 y=642 width=94 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15
+char id=1041 x=589 y=642 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=1042 x=685 y=642 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=1043 x=781 y=642 width=68 height=108 xoffset=9 yoffset=45 xadvance=78 page=0 chnl=15
+char id=1044 x=861 y=642 width=107 height=130 xoffset=2 yoffset=45 xadvance=110 page=0 chnl=15
+char id=1045 x=980 y=642 width=76 height=108 xoffset=9 yoffset=45 xadvance=89 page=0 chnl=15
+char id=1046 x=1068 y=642 width=138 height=108 xoffset=0 yoffset=45 xadvance=138 page=0 chnl=15
+char id=1047 x=1218 y=642 width=85 height=108 xoffset=3 yoffset=45 xadvance=93 page=0 chnl=15
+char id=1048 x=1315 y=642 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15
+char id=1049 x=1414 y=642 width=87 height=137 xoffset=9 yoffset=16 xadvance=104 page=0 chnl=15
+char id=1050 x=1513 y=642 width=87 height=108 xoffset=9 yoffset=45 xadvance=96 page=0 chnl=15
+char id=1051 x=1612 y=642 width=91 height=108 xoffset=3 yoffset=45 xadvance=103 page=0 chnl=15
+char id=1052 x=1715 y=642 width=102 height=108 xoffset=9 yoffset=45 xadvance=120 page=0 chnl=15
+char id=1053 x=1829 y=642 width=85 height=108 xoffset=9 yoffset=45 xadvance=103 page=0 chnl=15
+char id=1054 x=1926 y=642 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15
+char id=1055 x=2025 y=642 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15
+char id=1056 x=2119 y=642 width=81 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15
+char id=1057 x=2212 y=642 width=71 height=108 xoffset=9 yoffset=45 xadvance=84 page=0 chnl=15
+char id=1058 x=2295 y=642 width=81 height=108 xoffset=3 yoffset=45 xadvance=86 page=0 chnl=15
+char id=1059 x=2388 y=642 width=90 height=108 xoffset=1 yoffset=45 xadvance=92 page=0 chnl=15
+char id=1060 x=2490 y=642 width=105 height=108 xoffset=9 yoffset=45 xadvance=123 page=0 chnl=15
+char id=1062 x=2607 y=642 width=92 height=130 xoffset=9 yoffset=45 xadvance=101 page=0 chnl=15
+char id=1063 x=2711 y=642 width=81 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=1065 x=2804 y=642 width=135 height=130 xoffset=9 yoffset=45 xadvance=144 page=0 chnl=15
+char id=1068 x=2951 y=642 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15
+char id=1070 x=3047 y=642 width=128 height=108 xoffset=9 yoffset=45 xadvance=146 page=0 chnl=15
+char id=1071 x=3187 y=642 width=91 height=108 xoffset=0 yoffset=45 xadvance=100 page=0 chnl=15
+char id=1072 x=3290 y=642 width=77 height=87 xoffset=7 yoffset=66 xadvance=92 page=0 chnl=15
+char id=1073 x=3379 y=642 width=78 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15
+char id=1074 x=3469 y=642 width=78 height=87 xoffset=9 yoffset=66 xadvance=93 page=0 chnl=15
+char id=1075 x=3559 y=642 width=61 height=87 xoffset=9 yoffset=66 xadvance=72 page=0 chnl=15
+char id=1076 x=3632 y=642 width=77 height=109 xoffset=8 yoffset=66 xadvance=93 page=0 chnl=15
+char id=1077 x=3721 y=642 width=75 height=87 xoffset=8 yoffset=66 xadvance=90 page=0 chnl=15
+char id=1078 x=3808 y=642 width=144 height=87 xoffset=1 yoffset=66 xadvance=146 page=0 chnl=15
+char id=1079 x=3964 y=642 width=78 height=87 xoffset=5 yoffset=66 xadvance=90 page=0 chnl=15
+char id=1080 x=6 y=854 width=82 height=87 xoffset=9 yoffset=66 xadvance=100 page=0 chnl=15
+char id=1081 x=100 y=854 width=82 height=116 xoffset=9 yoffset=37 xadvance=100 page=0 chnl=15
+char id=1082 x=194 y=854 width=85 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15
+char id=1083 x=291 y=854 width=85 height=87 xoffset=2 yoffset=66 xadvance=95 page=0 chnl=15
+char id=1084 x=388 y=854 width=93 height=87 xoffset=9 yoffset=66 xadvance=110 page=0 chnl=15
+char id=1085 x=493 y=854 width=78 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15
+char id=1086 x=583 y=854 width=76 height=87 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15
+char id=1087 x=671 y=854 width=77 height=87 xoffset=10 yoffset=66 xadvance=96 page=0 chnl=15
+char id=1088 x=760 y=854 width=78 height=109 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15
+char id=1089 x=850 y=854 width=72 height=87 xoffset=8 yoffset=66 xadvance=83 page=0 chnl=15
+char id=1090 x=934 y=854 width=81 height=87 xoffset=3 yoffset=66 xadvance=86 page=0 chnl=15
+char id=1091 x=1027 y=854 width=90 height=109 xoffset=1 yoffset=66 xadvance=92 page=0 chnl=15
+char id=1092 x=1129 y=854 width=105 height=130 xoffset=9 yoffset=45 xadvance=123 page=0 chnl=15
+char id=1093 x=1246 y=854 width=91 height=87 xoffset=3 yoffset=66 xadvance=96 page=0 chnl=15
+char id=1094 x=1349 y=854 width=88 height=109 xoffset=9 yoffset=66 xadvance=98 page=0 chnl=15
+char id=1095 x=1449 y=854 width=78 height=87 xoffset=8 yoffset=66 xadvance=94 page=0 chnl=15
+char id=1096 x=1539 y=854 width=119 height=87 xoffset=9 yoffset=66 xadvance=136 page=0 chnl=15
+char id=1097 x=1670 y=854 width=129 height=109 xoffset=9 yoffset=66 xadvance=138 page=0 chnl=15
+char id=1100 x=1811 y=854 width=78 height=87 xoffset=9 yoffset=66 xadvance=93 page=0 chnl=15
+char id=1102 x=1901 y=854 width=108 height=87 xoffset=9 yoffset=66 xadvance=124 page=0 chnl=15
+char id=1103 x=2021 y=854 width=82 height=87 xoffset=2 yoffset=66 xadvance=92 page=0 chnl=15
+char id=1108 x=2115 y=854 width=73 height=87 xoffset=8 yoffset=66 xadvance=86 page=0 chnl=15
+char id=1110 x=2200 y=854 width=15 height=110 xoffset=9 yoffset=43 xadvance=32 page=0 chnl=15
+char id=1111 x=2227 y=854 width=40 height=110 xoffset=-4 yoffset=43 xadvance=32 page=0 chnl=15
+char id=8209 x=2279 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8211 x=2291 y=854 width=50 height=13 xoffset=6 yoffset=97 xadvance=61 page=0 chnl=15
+char id=8220 x=2353 y=854 width=50 height=38 xoffset=10 yoffset=45 xadvance=64 page=0 chnl=15
+char id=8222 x=2415 y=854 width=51 height=38 xoffset=4 yoffset=137 xadvance=64 page=0 chnl=15
+char id=8226 x=2478 y=854 width=59 height=60 xoffset=9 yoffset=77 xadvance=76 page=0 chnl=15
+char id=8364 x=2549 y=854 width=93 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15
+char id=8627 x=2654 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=8679 x=2666 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9003 x=2678 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9251 x=2690 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9654 x=2702 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9664 x=2714 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9675 x=2726 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9679 x=2738 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=9881 x=2750 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10003 x=2762 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10004 x=2774 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=10005 x=2786 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=65039 x=2798 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=127783 x=2810 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
+char id=128293 x=2822 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/Tektur-Variable.png b/selfdrive/assets/fonts/Tektur-Variable.png
new file mode 100644
index 000000000..1d876538c
Binary files /dev/null and b/selfdrive/assets/fonts/Tektur-Variable.png differ
diff --git a/selfdrive/assets/fonts/Tektur-Variable.ttf b/selfdrive/assets/fonts/Tektur-Variable.ttf
new file mode 100644
index 000000000..d1cf18b3a
Binary files /dev/null and b/selfdrive/assets/fonts/Tektur-Variable.ttf differ
diff --git a/selfdrive/assets/fonts/process.py b/selfdrive/assets/fonts/process.py
new file mode 100755
index 000000000..0de61d191
--- /dev/null
+++ b/selfdrive/assets/fonts/process.py
@@ -0,0 +1,196 @@
+#!/usr/bin/env python3
+import os
+from contextlib import contextmanager
+from pathlib import Path
+import json
+
+
+@contextmanager
+def _quiet_fds(*fds):
+ # mute the raylib load banner (printed on first native use, before any log level applies)
+ saved = [os.dup(fd) for fd in fds]
+ devnull = os.open(os.devnull, os.O_WRONLY)
+ try:
+ for fd in fds:
+ os.dup2(devnull, fd)
+ yield
+ finally:
+ for fd, s in zip(fds, saved):
+ os.dup2(s, fd)
+ os.close(s)
+ os.close(devnull)
+
+
+with _quiet_fds(1, 2):
+ import pyray as rl
+ rl.set_trace_log_level(rl.TraceLogLevel.LOG_ERROR) # first native call: triggers the banner
+
+FONT_DIR = Path(__file__).resolve().parent
+SELFDRIVE_DIR = FONT_DIR.parents[1]
+TRANSLATIONS_DIR = SELFDRIVE_DIR / "ui" / "translations"
+LANGUAGES_FILE = TRANSLATIONS_DIR / "languages.json"
+
+GLYPH_PADDING = 6
+EXTRA_CHARS = "–‑✓×°§•X⚙✕◀▶✔⌫⇧␣○●↳çêüñ–‑✓×°§•€£¥"
+UNIFONT_LANGUAGES = {"ar", "th", "zh-CHT", "zh-CHS", "ko", "ja"}
+
+
+def _load_font_data_arity() -> int:
+ # The C signature of LoadFontData differs between raylib builds; the pyray wrapper is a
+ # *args shim, so ask cffi for the real function type instead of catching arity errors.
+ import raylib as _raylib
+ return len(_raylib.ffi.typeof(_raylib.rl.LoadFontData).args)
+
+
+def _languages():
+ if not LANGUAGES_FILE.exists():
+ return {}
+ with LANGUAGES_FILE.open(encoding="utf-8") as f:
+ return json.load(f)
+
+
+def _char_sets():
+ base = set(map(chr, range(32, 127))) | set(EXTRA_CHARS)
+ unifont = set(base)
+
+ for language, code in _languages().items():
+ unifont.update(language)
+ po_path = TRANSLATIONS_DIR / f"app_{code}.po"
+ try:
+ chars = set(po_path.read_text(encoding="utf-8"))
+ except FileNotFoundError:
+ continue
+ (unifont if code in UNIFONT_LANGUAGES else base).update(chars)
+
+ return tuple(sorted(ord(c) for c in base)), tuple(sorted(ord(c) for c in unifont))
+
+
+def _glyph_metrics(glyphs, rects, glyph_count):
+ entries = []
+ min_offset_y, max_extent = None, 0
+ for idx in range(glyph_count):
+ glyph = glyphs[idx]
+ rect = rects[idx]
+ # Take the codepoint from the glyph itself: the 7-arg LoadFontData returns a
+ # compacted array of only the glyphs it found, so positional pairing with the
+ # requested codepoint list would misattribute (and previously overran) entries.
+ codepoint = glyph.value
+ width = int(round(rect.width))
+ height = int(round(rect.height))
+ offset_y = int(round(glyph.offsetY))
+ min_offset_y = offset_y if min_offset_y is None else min(min_offset_y, offset_y)
+ max_extent = max(max_extent, offset_y + height)
+ entries.append({
+ "id": codepoint,
+ "x": int(round(rect.x)),
+ "y": int(round(rect.y)),
+ "width": width,
+ "height": height,
+ "xoffset": int(round(glyph.offsetX)),
+ "yoffset": offset_y,
+ "xadvance": int(round(glyph.advanceX)),
+ })
+
+ if min_offset_y is None:
+ raise RuntimeError("No glyphs were generated")
+
+ line_height = int(round(max_extent - min_offset_y))
+ base = int(round(max_extent))
+ return entries, line_height, base
+
+
+def _write_bmfont(path: Path, font_size: int, face: str, atlas_name: str, line_height: int, base: int, atlas_size, entries):
+ # TODO: why doesn't raylib calculate these metrics correctly?
+ if line_height != font_size:
+ line_height = font_size
+ lines = [
+ f"info face=\"{face}\" size=-{font_size} bold=0 italic=0 charset=\"\" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0",
+ f"common lineHeight={line_height} base={base} scaleW={atlas_size[0]} scaleH={atlas_size[1]} pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4",
+ f"page id=0 file=\"{atlas_name}\"",
+ f"chars count={len(entries)}",
+ ]
+ for entry in entries:
+ lines.append(
+ ("char id={id:<4} x={x:<5} y={y:<5} width={width:<5} height={height:<5} " +
+ "xoffset={xoffset:<5} yoffset={yoffset:<5} xadvance={xadvance:<5} page=0 chnl=15").format(**entry)
+ )
+ path.write_text("\n".join(lines) + "\n")
+
+
+def _looks_like_lfs_pointer(data: bytes) -> bool:
+ head = data[:256]
+ return b"git-lfs.github.com/spec/v1" in head and b"oid sha256:" in head
+
+
+def _can_reuse_prebuilt(font_path: Path) -> bool:
+ return (FONT_DIR / f"{font_path.stem}.fnt").exists() and (FONT_DIR / f"{font_path.stem}.png").exists()
+
+
+def _process_font(font_path: Path, codepoints: tuple[int, ...]):
+ font_size = {
+ "unifont.otf": 16, # unifont is only 16x8 or 16x16 pixels per glyph
+ }.get(font_path.name, 200)
+
+ data = font_path.read_bytes()
+ file_buf = rl.ffi.new("unsigned char[]", data)
+ cp_buffer = rl.ffi.new("int[]", codepoints)
+ cp_ptr = rl.ffi.cast("int *", cp_buffer)
+ args = [rl.ffi.cast("unsigned char *", file_buf), len(data), font_size, cp_ptr, len(codepoints), rl.FontType.FONT_DEFAULT]
+ glyph_count_ptr = None
+ if _load_font_data_arity() == 7:
+ # IQ.OS >= 4.1 wheel: LoadFontData grew an int *glyphCount out-param AND returns
+ # only the glyphs it actually loaded (fewer than codepointCount when some are
+ # missing). We MUST read that count — using len(codepoints) below would index
+ # past the glyph/rect arrays and segfault. The PC pypi wheel (raylib <= 5.5) is
+ # the 6-arg version that returns codepointCount glyphs.
+ glyph_count_ptr = rl.ffi.new("int *", 0)
+ args.append(glyph_count_ptr)
+ glyphs = rl.load_font_data(*args)
+ if glyphs == rl.ffi.NULL:
+ if _can_reuse_prebuilt(font_path):
+ reason = "raylib failed to load font data"
+ if _looks_like_lfs_pointer(data):
+ reason += " (file looks like a Git LFS pointer, not real font data)"
+ print(f"WARNING: {reason}; reusing prebuilt atlas for {font_path.name}")
+ return
+ reason = f"raylib failed to load font data for {font_path.name}"
+ if _looks_like_lfs_pointer(data):
+ reason += " (file looks like a Git LFS pointer, not real font data)"
+ raise RuntimeError(reason)
+
+ # Actual number of glyphs in the returned array (out-param on 7-arg raylib, else
+ # codepointCount). Everything downstream must use this, not len(codepoints).
+ glyph_count = glyph_count_ptr[0] if glyph_count_ptr is not None else len(codepoints)
+
+ rects_ptr = rl.ffi.new("Rectangle **")
+ image = rl.gen_image_font_atlas(glyphs, rects_ptr, glyph_count, font_size, GLYPH_PADDING, 0)
+ if image.width == 0 or image.height == 0:
+ if _can_reuse_prebuilt(font_path):
+ print(f"WARNING: raylib returned an empty atlas; reusing prebuilt atlas for {font_path.name}")
+ return
+ raise RuntimeError(f"raylib returned an empty atlas for {font_path.name}")
+
+ rects = rects_ptr[0]
+ atlas_name = f"{font_path.stem}.png"
+ atlas_path = FONT_DIR / atlas_name
+ entries, line_height, base = _glyph_metrics(glyphs, rects, glyph_count)
+
+ if not rl.export_image(image, atlas_path.as_posix()):
+ raise RuntimeError("Failed to export atlas image")
+
+ _write_bmfont(FONT_DIR / f"{font_path.stem}.fnt", font_size, font_path.stem, atlas_name, line_height, base, (image.width, image.height), entries)
+
+
+def main():
+ base_cp, unifont_cp = _char_sets()
+ fonts = sorted(FONT_DIR.glob("*.ttf")) + sorted(FONT_DIR.glob("*.otf"))
+ for font in fonts:
+ if "emoji" in font.name.lower():
+ continue
+ glyphs = unifont_cp if font.stem.lower().startswith("unifont") else base_cp
+ _process_font(font, glyphs)
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/selfdrive/assets/fonts/unifont.fnt b/selfdrive/assets/fonts/unifont.fnt
new file mode 100644
index 000000000..900d1957e
--- /dev/null
+++ b/selfdrive/assets/fonts/unifont.fnt
@@ -0,0 +1,1373 @@
+info face="unifont" size=-16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
+common lineHeight=16 base=16 scaleW=2048 scaleH=1024 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
+page id=0 file="unifont.png"
+chars count=1369
+char id=10 x=6 y=6 width=16 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32 x=34 y=6 width=8 height=16 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
+char id=33 x=54 y=6 width=1 height=10 xoffset=4 yoffset=4 xadvance=8 page=0 chnl=15
+char id=34 x=67 y=6 width=5 height=4 xoffset=2 yoffset=2 xadvance=8 page=0 chnl=15
+char id=35 x=84 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=36 x=102 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=37 x=121 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=38 x=140 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=39 x=159 y=6 width=1 height=4 xoffset=4 yoffset=2 xadvance=8 page=0 chnl=15
+char id=40 x=172 y=6 width=3 height=12 xoffset=3 yoffset=3 xadvance=8 page=0 chnl=15
+char id=41 x=187 y=6 width=3 height=12 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15
+char id=42 x=202 y=6 width=7 height=7 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=43 x=221 y=6 width=7 height=7 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=44 x=240 y=6 width=2 height=4 xoffset=3 yoffset=12 xadvance=8 page=0 chnl=15
+char id=45 x=254 y=6 width=4 height=1 xoffset=2 yoffset=9 xadvance=8 page=0 chnl=15
+char id=46 x=270 y=6 width=2 height=2 xoffset=3 yoffset=12 xadvance=8 page=0 chnl=15
+char id=47 x=284 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=48 x=302 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=49 x=320 y=6 width=5 height=10 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15
+char id=50 x=337 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=51 x=355 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=52 x=373 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=53 x=391 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=54 x=409 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=55 x=427 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=56 x=445 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=57 x=463 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=58 x=481 y=6 width=2 height=7 xoffset=3 yoffset=6 xadvance=8 page=0 chnl=15
+char id=59 x=495 y=6 width=2 height=9 xoffset=3 yoffset=6 xadvance=8 page=0 chnl=15
+char id=60 x=509 y=6 width=5 height=9 xoffset=2 yoffset=5 xadvance=8 page=0 chnl=15
+char id=61 x=526 y=6 width=6 height=5 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=62 x=544 y=6 width=5 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=63 x=561 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=64 x=579 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=65 x=597 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=66 x=615 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=67 x=633 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=68 x=651 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=69 x=669 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=70 x=687 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=71 x=705 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=72 x=723 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=73 x=741 y=6 width=5 height=10 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15
+char id=74 x=758 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=75 x=777 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=76 x=795 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=77 x=813 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=78 x=831 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=79 x=849 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=80 x=867 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=81 x=885 y=6 width=7 height=11 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=82 x=904 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=83 x=922 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=84 x=940 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=85 x=959 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=86 x=977 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=87 x=996 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=88 x=1014 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=89 x=1032 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=90 x=1051 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=91 x=1069 y=6 width=3 height=12 xoffset=4 yoffset=3 xadvance=8 page=0 chnl=15
+char id=92 x=1084 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=93 x=1102 y=6 width=3 height=12 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=94 x=1117 y=6 width=6 height=3 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=95 x=1135 y=6 width=7 height=1 xoffset=1 yoffset=14 xadvance=8 page=0 chnl=15
+char id=96 x=1154 y=6 width=3 height=3 xoffset=2 yoffset=1 xadvance=8 page=0 chnl=15
+char id=97 x=1169 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=98 x=1187 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=99 x=1205 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=100 x=1223 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=101 x=1241 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=102 x=1259 y=6 width=5 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=103 x=1276 y=6 width=6 height=11 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=104 x=1294 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=105 x=1312 y=6 width=5 height=11 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15
+char id=106 x=1329 y=6 width=5 height=13 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=107 x=1346 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=108 x=1364 y=6 width=5 height=11 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15
+char id=109 x=1381 y=6 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=110 x=1400 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=111 x=1418 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=112 x=1436 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=113 x=1454 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=114 x=1472 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=115 x=1490 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=116 x=1508 y=6 width=5 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=117 x=1525 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=118 x=1543 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=119 x=1561 y=6 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=120 x=1580 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=121 x=1598 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=122 x=1616 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=123 x=1634 y=6 width=4 height=13 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15
+char id=124 x=1650 y=6 width=1 height=14 xoffset=4 yoffset=2 xadvance=8 page=0 chnl=15
+char id=125 x=1663 y=6 width=4 height=13 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15
+char id=126 x=1679 y=6 width=7 height=3 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=163 x=1698 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=165 x=1717 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=167 x=1736 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=176 x=1754 y=6 width=4 height=4 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15
+char id=177 x=1770 y=6 width=7 height=9 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=215 x=1789 y=6 width=6 height=5 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=231 x=1807 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=234 x=1825 y=6 width=6 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=241 x=1843 y=6 width=6 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=252 x=1861 y=6 width=6 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=1059 x=1879 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1072 x=1898 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1082 x=1916 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1085 x=1934 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1088 x=1952 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1089 x=1970 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1100 x=1988 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1111 x=2006 y=6 width=5 height=11 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1548 x=2023 y=6 width=2 height=4 xoffset=3 yoffset=7 xadvance=8 page=0 chnl=15
+char id=1563 x=6 y=34 width=2 height=5 xoffset=3 yoffset=7 xadvance=8 page=0 chnl=15
+char id=1567 x=20 y=34 width=7 height=9 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1569 x=39 y=34 width=4 height=5 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15
+char id=1570 x=55 y=34 width=7 height=10 xoffset=1 yoffset=1 xadvance=8 page=0 chnl=15
+char id=1571 x=74 y=34 width=3 height=11 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=15
+char id=1572 x=89 y=34 width=6 height=13 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=1573 x=107 y=34 width=3 height=13 xoffset=3 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1574 x=122 y=34 width=6 height=11 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1575 x=140 y=34 width=1 height=8 xoffset=4 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1576 x=153 y=34 width=6 height=7 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=1577 x=171 y=34 width=4 height=7 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1578 x=187 y=34 width=6 height=7 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1579 x=205 y=34 width=6 height=9 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=1580 x=223 y=34 width=6 height=8 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1581 x=241 y=34 width=6 height=8 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1582 x=259 y=34 width=6 height=11 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=1583 x=277 y=34 width=6 height=5 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1584 x=295 y=34 width=6 height=7 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1585 x=313 y=34 width=6 height=7 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1586 x=331 y=34 width=6 height=10 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=1587 x=349 y=34 width=7 height=7 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1588 x=368 y=34 width=7 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=1589 x=387 y=34 width=7 height=6 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1590 x=406 y=34 width=7 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=1591 x=425 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1592 x=443 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1593 x=461 y=34 width=6 height=9 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=1594 x=479 y=34 width=6 height=12 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1600 x=497 y=34 width=8 height=1 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15
+char id=1601 x=517 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1602 x=535 y=34 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=1603 x=553 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1604 x=571 y=34 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=1605 x=589 y=34 width=5 height=8 xoffset=2 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1606 x=606 y=34 width=6 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=1607 x=624 y=34 width=4 height=5 xoffset=2 yoffset=6 xadvance=8 page=0 chnl=15
+char id=1608 x=640 y=34 width=6 height=8 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=1609 x=658 y=34 width=6 height=7 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1610 x=676 y=34 width=6 height=8 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15
+char id=1611 x=694 y=34 width=4 height=4 xoffset=2 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1613 x=710 y=34 width=4 height=4 xoffset=2 yoffset=10 xadvance=0 page=0 chnl=15
+char id=1614 x=726 y=34 width=4 height=2 xoffset=2 yoffset=2 xadvance=0 page=0 chnl=15
+char id=1615 x=742 y=34 width=5 height=5 xoffset=2 yoffset=0 xadvance=0 page=0 chnl=15
+char id=1616 x=759 y=34 width=4 height=2 xoffset=2 yoffset=14 xadvance=0 page=0 chnl=15
+char id=1617 x=775 y=34 width=5 height=4 xoffset=1 yoffset=3 xadvance=0 page=0 chnl=15
+char id=1642 x=792 y=34 width=5 height=10 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=3607 x=809 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=3618 x=827 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=3652 x=845 y=34 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15
+char id=8209 x=863 y=34 width=4 height=1 xoffset=2 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8211 x=879 y=34 width=6 height=1 xoffset=1 yoffset=9 xadvance=8 page=0 chnl=15
+char id=8220 x=897 y=34 width=6 height=4 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=8221 x=915 y=34 width=6 height=4 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=8226 x=933 y=34 width=5 height=5 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=8230 x=950 y=34 width=7 height=2 xoffset=1 yoffset=12 xadvance=8 page=0 chnl=15
+char id=8364 x=969 y=34 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=8627 x=987 y=34 width=5 height=12 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=15
+char id=8679 x=1004 y=34 width=7 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15
+char id=9003 x=1023 y=34 width=8 height=5 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
+char id=9251 x=1043 y=34 width=6 height=2 xoffset=1 yoffset=12 xadvance=8 page=0 chnl=15
+char id=9654 x=1061 y=34 width=6 height=6 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=9664 x=1079 y=34 width=6 height=6 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15
+char id=9675 x=1097 y=34 width=7 height=7 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=9679 x=1116 y=34 width=7 height=7 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15
+char id=9881 x=1135 y=34 width=13 height=13 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=10003 x=1160 y=34 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15
+char id=10004 x=1179 y=34 width=15 height=11 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15
+char id=10005 x=1206 y=34 width=11 height=11 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12289 x=1229 y=34 width=4 height=4 xoffset=3 yoffset=10 xadvance=16 page=0 chnl=15
+char id=12290 x=1245 y=34 width=4 height=4 xoffset=3 yoffset=10 xadvance=16 page=0 chnl=15
+char id=12300 x=1261 y=34 width=5 height=11 xoffset=8 yoffset=0 xadvance=16 page=0 chnl=15
+char id=12301 x=1278 y=34 width=5 height=11 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12354 x=1295 y=34 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12356 x=1318 y=34 width=12 height=9 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12358 x=1342 y=34 width=8 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12360 x=1362 y=34 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12362 x=1385 y=34 width=12 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12363 x=1409 y=34 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12364 x=1433 y=34 width=13 height=13 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12365 x=1458 y=34 width=9 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12367 x=1479 y=34 width=6 height=14 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12368 x=1497 y=34 width=10 height=14 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12369 x=1519 y=34 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12371 x=1543 y=34 width=10 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12373 x=1565 y=34 width=10 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12375 x=1587 y=34 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12376 x=1609 y=34 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12377 x=1631 y=34 width=12 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12378 x=1655 y=34 width=13 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12379 x=1680 y=34 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12381 x=1704 y=34 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12383 x=1727 y=34 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12384 x=1750 y=34 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12385 x=1774 y=34 width=11 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12387 x=1797 y=34 width=10 height=8 xoffset=2 yoffset=7 xadvance=16 page=0 chnl=15
+char id=12388 x=1819 y=34 width=12 height=9 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12389 x=1843 y=34 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12390 x=1868 y=34 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12391 x=1892 y=34 width=13 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12392 x=1917 y=34 width=9 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12393 x=1938 y=34 width=11 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12394 x=1961 y=34 width=11 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12395 x=1984 y=34 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12398 x=2007 y=34 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12399 x=6 y=62 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12400 x=29 y=62 width=13 height=13 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12403 x=54 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12408 x=78 y=62 width=12 height=6 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15
+char id=12409 x=102 y=62 width=12 height=8 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12411 x=126 y=62 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12414 x=149 y=62 width=9 height=13 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12415 x=170 y=62 width=13 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12416 x=195 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12417 x=219 y=62 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12418 x=243 y=62 width=10 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12420 x=265 y=62 width=12 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12423 x=289 y=62 width=8 height=11 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12424 x=309 y=62 width=10 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12425 x=331 y=62 width=8 height=14 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12426 x=351 y=62 width=8 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12427 x=371 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12428 x=393 y=62 width=13 height=13 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12431 x=418 y=62 width=12 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12434 x=442 y=62 width=11 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12435 x=465 y=62 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12449 x=488 y=62 width=9 height=8 xoffset=2 yoffset=7 xadvance=16 page=0 chnl=15
+char id=12450 x=509 y=62 width=10 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12451 x=531 y=62 width=8 height=10 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=15
+char id=12452 x=551 y=62 width=9 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12454 x=572 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12455 x=594 y=62 width=9 height=7 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=15
+char id=12456 x=615 y=62 width=11 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12457 x=638 y=62 width=8 height=10 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=15
+char id=12458 x=658 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12459 x=681 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12460 x=703 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12461 x=727 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12463 x=750 y=62 width=9 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12464 x=771 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12467 x=795 y=62 width=10 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12468 x=817 y=62 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12470 x=842 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12471 x=866 y=62 width=10 height=11 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12472 x=888 y=62 width=11 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12473 x=911 y=62 width=10 height=10 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12474 x=933 y=62 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12475 x=958 y=62 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12476 x=981 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12477 x=1005 y=62 width=9 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12479 x=1026 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12480 x=1048 y=62 width=13 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12481 x=1073 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12483 x=1096 y=62 width=8 height=8 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=15
+char id=12484 x=1116 y=62 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12486 x=1139 y=62 width=11 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12487 x=1162 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12488 x=1186 y=62 width=7 height=13 xoffset=4 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12489 x=1205 y=62 width=9 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12490 x=1226 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12491 x=1249 y=62 width=11 height=8 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12492 x=1272 y=62 width=10 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12493 x=1294 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12494 x=1317 y=62 width=8 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12496 x=1337 y=62 width=13 height=11 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12497 x=1362 y=62 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12499 x=1387 y=62 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12501 x=1409 y=62 width=9 height=11 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12502 x=1430 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12503 x=1454 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12505 x=1478 y=62 width=13 height=9 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12506 x=1503 y=62 width=13 height=9 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12507 x=1528 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12508 x=1550 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12509 x=1574 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=12510 x=1598 y=62 width=11 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12511 x=1621 y=62 width=8 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12512 x=1641 y=62 width=11 height=11 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12513 x=1664 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12514 x=1686 y=62 width=11 height=10 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12515 x=1709 y=62 width=9 height=9 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=15
+char id=12517 x=1730 y=62 width=9 height=6 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=15
+char id=12518 x=1751 y=62 width=11 height=7 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15
+char id=12519 x=1774 y=62 width=7 height=8 xoffset=4 yoffset=6 xadvance=16 page=0 chnl=15
+char id=12521 x=1793 y=62 width=10 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12522 x=1815 y=62 width=7 height=13 xoffset=4 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12523 x=1834 y=62 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12524 x=1857 y=62 width=9 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=12525 x=1878 y=62 width=10 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12527 x=1900 y=62 width=10 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15
+char id=12531 x=1922 y=62 width=10 height=10 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15
+char id=12539 x=1944 y=62 width=4 height=4 xoffset=5 yoffset=6 xadvance=16 page=0 chnl=15
+char id=12540 x=1960 y=62 width=12 height=2 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15
+char id=19968 x=1984 y=62 width=15 height=1 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15
+char id=19978 x=2011 y=62 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=19979 x=6 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=19981 x=33 y=90 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=19982 x=59 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=19987 x=85 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=19988 x=112 y=90 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20001 x=139 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20006 x=166 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20010 x=193 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20013 x=220 y=90 width=11 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20026 x=243 y=90 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20027 x=268 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20040 x=295 y=90 width=13 height=15 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20063 x=320 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20064 x=347 y=90 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20102 x=371 y=90 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20104 x=395 y=90 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20108 x=421 y=90 width=15 height=10 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=15
+char id=20110 x=448 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20123 x=475 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20134 x=502 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20139 x=529 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20154 x=556 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20160 x=583 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20165 x=610 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20170 x=637 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20171 x=664 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20173 x=691 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20174 x=717 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20181 x=744 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20182 x=771 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20184 x=798 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20195 x=825 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20197 x=852 y=90 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20204 x=877 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20214 x=903 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20219 x=930 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20241 x=957 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20248 x=984 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20250 x=1011 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20256 x=1038 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20301 x=1065 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20302 x=1092 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20307 x=1119 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20309 x=1146 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20316 x=1173 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20339 x=1200 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20341 x=1227 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20351 x=1254 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20358 x=1281 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20363 x=1308 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20379 x=1334 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20391 x=1361 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20418 x=1387 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20445 x=1414 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20449 x=1441 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20491 x=1468 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20497 x=1494 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20505 x=1520 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20559 x=1547 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20572 x=1573 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20596 x=1600 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20597 x=1627 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20633 x=1654 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20648 x=1681 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20659 x=1708 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20677 x=1735 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20687 x=1762 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20778 x=1789 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20786 x=1816 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20805 x=1843 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20811 x=1870 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20813 x=1897 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20837 x=1924 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20839 x=1951 y=90 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20840 x=1976 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20844 x=2003 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20849 x=6 y=118 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20851 x=32 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20856 x=59 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20869 x=86 y=118 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20877 x=111 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=20915 x=138 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20934 x=165 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20986 x=192 y=118 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20987 x=217 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20998 x=244 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=20999 x=271 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21015 x=297 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21017 x=323 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21021 x=349 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21033 x=375 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21035 x=401 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21040 x=427 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21046 x=453 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21049 x=479 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21051 x=505 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21063 x=531 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21066 x=557 y=118 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21069 x=582 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21147 x=609 y=118 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21151 x=633 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21152 x=659 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21160 x=685 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21161 x=711 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21177 x=737 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21205 x=763 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21247 x=789 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21253 x=815 y=118 width=14 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21270 x=841 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21306 x=868 y=118 width=14 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21319 x=894 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21332 x=921 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21335 x=948 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21345 x=975 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21363 x=1002 y=118 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21368 x=1027 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21378 x=1053 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21407 x=1080 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21442 x=1107 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21450 x=1134 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21453 x=1161 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21457 x=1188 y=118 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21462 x=1214 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21463 x=1241 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21482 x=1268 y=118 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21487 x=1293 y=118 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21491 x=1319 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21495 x=1346 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21507 x=1373 y=118 width=14 height=15 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21512 x=1399 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21516 x=1426 y=118 width=12 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21517 x=1450 y=118 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21518 x=1475 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21521 x=1502 y=118 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21527 x=1527 y=118 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21542 x=1552 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21547 x=1579 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21551 x=1606 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21576 x=1632 y=118 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21578 x=1659 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21592 x=1686 y=118 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21608 x=1711 y=118 width=13 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21619 x=1736 y=118 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21697 x=1762 y=118 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21709 x=1787 y=118 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21729 x=1812 y=118 width=11 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21738 x=1835 y=118 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21839 x=1861 y=118 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=21855 x=1885 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21892 x=1912 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=21966 x=1939 y=118 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=22120 x=1965 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=22238 x=1992 y=118 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=22240 x=2016 y=118 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=22270 x=6 y=146 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=22294 x=31 y=146 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22312 x=56 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22320 x=83 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22336 x=110 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22411 x=137 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22577 x=164 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22580 x=191 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22679 x=218 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22686 x=245 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22768 x=271 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22791 x=298 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22793 x=325 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22806 x=352 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22810 x=378 y=146 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22823 x=402 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22825 x=429 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=22833 x=456 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22836 x=483 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22888 x=510 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22909 x=537 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22914 x=564 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=22987 x=590 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23384 x=617 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23398 x=644 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23416 x=671 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23433 x=698 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23436 x=725 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23450 x=752 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23454 x=779 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23455 x=806 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23460 x=833 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23481 x=860 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23494 x=887 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23519 x=914 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23526 x=941 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23545 x=968 y=146 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23548 x=994 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=23550 x=1021 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23558 x=1048 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23559 x=1075 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23560 x=1102 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23565 x=1129 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23567 x=1156 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23578 x=1183 y=146 width=11 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23601 x=1206 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=23627 x=1233 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=23631 x=1260 y=146 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24033 x=1286 y=146 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24037 x=1313 y=146 width=15 height=12 xoffset=0 yoffset=2 xadvance=16 page=0 chnl=15
+char id=24038 x=1340 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24046 x=1367 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24050 x=1394 y=146 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24067 x=1418 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24102 x=1445 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24110 x=1472 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24111 x=1498 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24115 x=1525 y=146 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24118 x=1551 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24120 x=1578 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24149 x=1605 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24179 x=1632 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24180 x=1659 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24182 x=1686 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24191 x=1713 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24195 x=1739 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24207 x=1766 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24212 x=1793 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24230 x=1820 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24288 x=1847 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24291 x=1874 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24310 x=1901 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24314 x=1928 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24320 x=1955 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24335 x=1982 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24341 x=2009 y=146 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24367 x=6 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24398 x=33 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24403 x=60 y=174 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24405 x=84 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24433 x=111 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24448 x=138 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24453 x=165 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24460 x=192 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24467 x=219 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24471 x=246 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24478 x=273 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24481 x=300 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24517 x=327 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=24536 x=354 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24540 x=381 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24555 x=408 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24590 x=435 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24613 x=462 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24615 x=489 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24744 x=516 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24773 x=543 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24800 x=570 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24847 x=597 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=24907 x=624 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25033 x=651 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25104 x=678 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25105 x=705 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25110 x=732 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25143 x=759 y=174 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25147 x=783 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25152 x=810 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25163 x=837 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25165 x=864 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25171 x=891 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25195 x=918 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25197 x=944 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25214 x=971 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25215 x=997 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25233 x=1024 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25246 x=1050 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25253 x=1077 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25276 x=1104 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25289 x=1130 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25298 x=1157 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25321 x=1184 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25324 x=1211 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25345 x=1238 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25351 x=1265 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25353 x=1292 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25442 x=1319 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25454 x=1346 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25475 x=1373 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25480 x=1400 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25509 x=1427 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25511 x=1454 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25512 x=1481 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25551 x=1508 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25552 x=1535 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25563 x=1562 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25588 x=1589 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25622 x=1616 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25645 x=1643 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25658 x=1670 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25668 x=1697 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25671 x=1724 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25799 x=1751 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25805 x=1778 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25847 x=1805 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25903 x=1832 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25910 x=1859 y=174 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25913 x=1885 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25928 x=1912 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25943 x=1939 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25968 x=1966 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=25991 x=1993 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26009 x=2020 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26032 x=6 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26041 x=33 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26044 x=60 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26080 x=87 y=202 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26082 x=113 y=202 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26085 x=139 y=202 width=9 height=15 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26102 x=160 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26126 x=186 y=202 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26159 x=211 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26174 x=238 y=202 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26178 x=265 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26222 x=291 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26242 x=318 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26354 x=345 y=202 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26356 x=370 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26367 x=397 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26368 x=424 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26371 x=451 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26377 x=478 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26397 x=505 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26399 x=532 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26410 x=558 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26412 x=585 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26426 x=612 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26435 x=639 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26438 x=666 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26465 x=693 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26469 x=720 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26495 x=747 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26524 x=774 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=26597 x=801 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26631 x=828 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26657 x=855 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26679 x=882 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26684 x=909 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26725 x=936 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26751 x=963 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26781 x=990 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26816 x=1017 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26908 x=1044 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26989 x=1071 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=26997 x=1098 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27161 x=1125 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27169 x=1152 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27171 x=1179 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27231 x=1206 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27298 x=1233 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27396 x=1260 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27402 x=1287 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27426 x=1314 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27454 x=1341 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27489 x=1368 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27490 x=1395 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27491 x=1422 y=202 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=27492 x=1449 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27573 x=1476 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27599 x=1503 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27714 x=1530 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27770 x=1556 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27794 x=1583 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27809 x=1610 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=27833 x=1637 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27861 x=1663 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27880 x=1690 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27969 x=1717 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=27979 x=1744 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28040 x=1770 y=202 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28155 x=1795 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=28168 x=1822 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28187 x=1849 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28201 x=1876 y=202 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=28204 x=1903 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28216 x=1930 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28304 x=1957 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=28310 x=1984 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28331 x=2011 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28436 x=6 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28459 x=32 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28608 x=59 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28779 x=86 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28783 x=113 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28857 x=140 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28858 x=166 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28909 x=192 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=28961 x=219 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29022 x=245 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29031 x=272 y=230 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=29060 x=298 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29105 x=325 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29128 x=352 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29255 x=379 y=230 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29256 x=404 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29260 x=431 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29305 x=458 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29366 x=485 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29616 x=512 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=29694 x=539 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=29983 x=566 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=29992 x=593 y=230 width=13 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=30001 x=618 y=230 width=11 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30005 x=641 y=230 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30011 x=666 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=30028 x=693 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=30041 x=720 y=230 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30059 x=745 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30070 x=772 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30330 x=799 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30331 x=826 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30332 x=853 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30340 x=880 y=230 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30417 x=905 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30424 x=932 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30435 x=959 y=230 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=30436 x=986 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30446 x=1013 y=230 width=11 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=30456 x=1036 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30475 x=1062 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30528 x=1089 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30693 x=1116 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30697 x=1142 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30721 x=1169 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=30830 x=1196 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30906 x=1223 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=30908 x=1250 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=31034 x=1277 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=31163 x=1304 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31227 x=1331 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31232 x=1358 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31243 x=1385 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=31278 x=1412 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31281 x=1439 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31283 x=1466 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31309 x=1493 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31337 x=1520 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31354 x=1547 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31389 x=1574 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31435 x=1601 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31471 x=1628 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31508 x=1655 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31558 x=1682 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31561 x=1709 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31572 x=1736 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31616 x=1763 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31639 x=1790 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31649 x=1817 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31867 x=1844 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=31995 x=1871 y=230 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32000 x=1896 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32004 x=1923 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32005 x=1949 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32013 x=1976 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32020 x=2003 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32026 x=6 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32034 x=33 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32039 x=60 y=258 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32048 x=85 y=258 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32066 x=111 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32076 x=138 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32085 x=165 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32113 x=192 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32118 x=219 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32153 x=246 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32154 x=273 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32173 x=300 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32178 x=327 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32202 x=354 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32218 x=380 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32232 x=407 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32244 x=434 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32294 x=461 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32305 x=488 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32321 x=515 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32380 x=542 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32396 x=569 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32418 x=596 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32423 x=623 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32435 x=650 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32437 x=677 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32447 x=704 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32451 x=731 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32456 x=758 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32476 x=785 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32477 x=812 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32479 x=839 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32487 x=866 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32493 x=893 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32500 x=920 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32534 x=947 y=258 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32593 x=973 y=258 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=32622 x=998 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32722 x=1025 y=258 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=32773 x=1050 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=32780 x=1077 y=258 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=33021 x=1102 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33067 x=1129 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33073 x=1156 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33258 x=1183 y=258 width=9 height=16 xoffset=3 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33267 x=1204 y=258 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=33287 x=1231 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33322 x=1258 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33324 x=1285 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33391 x=1312 y=258 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15
+char id=33509 x=1337 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34101 x=1364 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34255 x=1391 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34399 x=1418 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34562 x=1445 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34892 x=1472 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34920 x=1499 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=34987 x=1526 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35013 x=1553 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35037 x=1580 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35041 x=1607 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35069 x=1634 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35201 x=1661 y=258 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35211 x=1686 y=258 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35215 x=1713 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35222 x=1740 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35258 x=1767 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35261 x=1794 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35264 x=1821 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35265 x=1848 y=258 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35266 x=1875 y=258 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35268 x=1902 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35270 x=1929 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35272 x=1956 y=258 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35282 x=1981 y=258 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35299 x=2006 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35328 x=6 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35330 x=33 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35336 x=60 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35338 x=87 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35347 x=114 y=286 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35352 x=140 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35373 x=167 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35430 x=194 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35442 x=221 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35443 x=248 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35468 x=275 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35469 x=302 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35486 x=329 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35492 x=356 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35498 x=383 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35501 x=410 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35506 x=437 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35531 x=464 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35686 x=491 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35696 x=518 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35712 x=545 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35722 x=572 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35731 x=599 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35745 x=626 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35746 x=653 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35748 x=680 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35753 x=707 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35757 x=734 y=286 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35758 x=760 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35760 x=787 y=286 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35774 x=814 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35775 x=841 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35797 x=868 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35814 x=895 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35821 x=922 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35823 x=949 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35828 x=976 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35831 x=1003 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35835 x=1030 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=35843 x=1057 y=286 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=35937 x=1083 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36028 x=1110 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36039 x=1137 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36074 x=1164 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36133 x=1191 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36134 x=1218 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36136 x=1245 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36148 x=1272 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36196 x=1299 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36208 x=1326 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36215 x=1353 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36229 x=1380 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36234 x=1407 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36305 x=1434 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36317 x=1461 y=286 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36335 x=1488 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36367 x=1515 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36393 x=1542 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36554 x=1569 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36575 x=1596 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36578 x=1623 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36617 x=1650 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36628 x=1677 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36635 x=1704 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36655 x=1731 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36664 x=1758 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36681 x=1785 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36710 x=1812 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36716 x=1839 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36719 x=1866 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36733 x=1893 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36741 x=1920 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36742 x=1947 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36753 x=1974 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36755 x=2001 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36796 x=6 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36798 x=33 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36807 x=60 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36814 x=87 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36817 x=114 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36820 x=141 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36825 x=168 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36827 x=195 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36828 x=222 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36830 x=249 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36831 x=276 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36861 x=303 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36866 x=330 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36873 x=357 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36879 x=384 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36889 x=411 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36890 x=438 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36895 x=465 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36899 x=492 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36913 x=519 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36914 x=546 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36920 x=573 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36926 x=600 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36933 x=627 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36938 x=654 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36939 x=681 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=36942 x=708 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36947 x=735 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36948 x=762 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36949 x=789 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36951 x=816 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36960 x=843 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36969 x=870 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36978 x=897 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36984 x=924 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36986 x=951 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=36991 x=978 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37096 x=1005 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37117 x=1032 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37197 x=1059 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=37325 x=1086 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37326 x=1113 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=37327 x=1140 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=37329 x=1167 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37397 x=1194 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37636 x=1221 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37679 x=1248 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37682 x=1275 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37749 x=1302 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37857 x=1329 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=37912 x=1356 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38000 x=1383 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38047 x=1410 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38053 x=1436 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38062 x=1462 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38169 x=1489 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38272 x=1516 y=314 width=12 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38281 x=1540 y=314 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38283 x=1565 y=314 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38291 x=1589 y=314 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38306 x=1613 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38321 x=1638 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38364 x=1663 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38376 x=1688 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38381 x=1713 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38382 x=1738 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38405 x=1763 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38480 x=1788 y=314 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38500 x=1814 y=314 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38542 x=1840 y=314 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38544 x=1866 y=314 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38577 x=1892 y=314 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38598 x=1918 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38626 x=1945 y=314 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38651 x=1971 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38656 x=1998 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38750 x=6 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38754 x=33 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38899 x=60 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38917 x=87 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38920 x=114 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38928 x=141 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38936 x=168 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=38957 x=195 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=38988 x=222 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39006 x=249 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39023 x=276 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39033 x=303 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39035 x=330 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39044 x=357 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39046 x=384 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39057 x=411 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39064 x=438 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39080 x=465 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39118 x=492 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15
+char id=39165 x=519 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39381 x=546 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39387 x=572 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39443 x=599 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39511 x=626 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39542 x=653 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39550 x=680 y=342 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39564 x=705 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39636 x=732 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=39640 x=759 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=40613 x=786 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=40614 x=813 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=40636 x=840 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=40664 x=867 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=40670 x=894 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
+char id=44032 x=921 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44033 x=947 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44036 x=973 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44048 x=999 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44049 x=1025 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44050 x=1051 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44057 x=1077 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44060 x=1103 y=342 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44144 x=1128 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44148 x=1152 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44160 x=1176 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44163 x=1200 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44172 x=1224 y=342 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44192 x=1249 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44200 x=1275 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44201 x=1299 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44208 x=1323 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44221 x=1347 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44228 x=1371 y=342 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44256 x=1396 y=342 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=44277 x=1423 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44284 x=1450 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44288 x=1477 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44305 x=1504 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44396 x=1531 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44397 x=1558 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44428 x=1585 y=342 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44480 x=1610 y=342 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44508 x=1635 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44536 x=1662 y=342 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=44537 x=1689 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44544 x=1716 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44552 x=1743 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44553 x=1770 y=342 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44592 x=1797 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44596 x=1821 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44620 x=1845 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44637 x=1871 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44732 x=1897 y=342 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=44760 x=1921 y=342 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45124 x=1946 y=342 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=45208 x=1973 y=342 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45236 x=1999 y=342 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45253 x=6 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45348 x=31 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45380 x=56 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45432 x=80 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=45458 x=107 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45580 x=134 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45716 x=161 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45733 x=188 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45768 x=215 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45772 x=239 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45776 x=263 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45796 x=287 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45800 x=313 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45803 x=339 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45804 x=365 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45813 x=391 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45817 x=417 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45824 x=443 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45841 x=468 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45908 x=493 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45936 x=517 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=45944 x=542 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46020 x=567 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=46021 x=594 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46041 x=621 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46104 x=648 y=370 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46108 x=673 y=370 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46112 x=698 y=370 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46120 x=723 y=370 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46121 x=748 y=370 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46160 x=773 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46177 x=800 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46244 x=827 y=370 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46300 x=852 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=46304 x=879 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46308 x=906 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46321 x=933 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46356 x=960 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46377 x=984 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46384 x=1008 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46412 x=1034 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46500 x=1059 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46523 x=1083 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46608 x=1107 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=46972 x=1134 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=46988 x=1160 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47000 x=1186 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47004 x=1211 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47049 x=1236 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47084 x=1262 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47100 x=1286 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47112 x=1310 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47140 x=1335 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47141 x=1359 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47196 x=1383 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=47197 x=1410 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47217 x=1437 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47308 x=1464 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=47344 x=1491 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47448 x=1518 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47476 x=1545 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=47480 x=1572 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47484 x=1599 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47492 x=1626 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47532 x=1653 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47540 x=1677 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47548 x=1701 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47553 x=1725 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47560 x=1749 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47561 x=1775 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47564 x=1801 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47566 x=1827 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47568 x=1853 y=370 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47700 x=1879 y=370 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47728 x=1904 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47732 x=1928 y=370 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47784 x=1952 y=370 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=47924 x=1979 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47928 x=2006 y=370 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47931 x=6 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=47941 x=33 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48064 x=60 y=398 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=48120 x=87 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48128 x=111 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48141 x=135 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48143 x=159 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48148 x=183 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48150 x=209 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48155 x=235 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48156 x=261 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48159 x=287 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48169 x=313 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48260 x=339 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48264 x=363 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48277 x=387 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48279 x=411 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48320 x=435 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48372 x=459 y=398 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=48373 x=486 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48376 x=513 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48389 x=540 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48512 x=567 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48513 x=594 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48516 x=621 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48520 x=648 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48652 x=675 y=398 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=48708 x=702 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48736 x=726 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=48744 x=752 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49324 x=778 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49325 x=804 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49345 x=830 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49352 x=856 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49353 x=881 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49373 x=906 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49399 x=931 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49436 x=957 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49440 x=981 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49444 x=1005 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49457 x=1029 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49464 x=1053 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49472 x=1078 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49483 x=1103 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49496 x=1128 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49548 x=1152 y=398 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=49549 x=1179 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49688 x=1206 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49692 x=1233 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49704 x=1260 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49828 x=1287 y=398 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=49845 x=1314 y=398 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49884 x=1341 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49885 x=1365 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49888 x=1389 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=49892 x=1413 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50500 x=1437 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50504 x=1463 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50506 x=1489 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50508 x=1515 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50526 x=1541 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50529 x=1567 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50545 x=1592 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50556 x=1617 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50557 x=1643 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50577 x=1669 y=398 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50612 x=1695 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50616 x=1719 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50620 x=1743 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50629 x=1767 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50630 x=1791 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50631 x=1816 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50632 x=1840 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50640 x=1865 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50644 x=1890 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50668 x=1915 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50672 x=1939 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50676 x=1963 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50689 x=1987 y=398 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50696 x=2011 y=398 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50724 x=6 y=426 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=50728 x=33 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50732 x=60 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50741 x=87 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50752 x=114 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50756 x=141 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50812 x=168 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50836 x=193 y=426 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=50857 x=220 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50864 x=247 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50868 x=274 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50880 x=301 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50892 x=328 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50896 x=353 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50920 x=378 y=426 width=14 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50948 x=404 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=50976 x=429 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51004 x=456 y=426 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=51008 x=483 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51012 x=510 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51020 x=537 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51025 x=564 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51032 x=591 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51060 x=616 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51064 x=640 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51068 x=664 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51069 x=688 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51076 x=712 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51077 x=736 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51080 x=760 y=426 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51088 x=785 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51089 x=811 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51096 x=837 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51109 x=863 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51116 x=889 y=426 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51200 x=914 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51201 x=938 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51204 x=962 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51208 x=986 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51217 x=1010 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51221 x=1034 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51228 x=1058 y=426 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51256 x=1083 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51312 x=1107 y=426 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=51333 x=1134 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51339 x=1161 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51340 x=1188 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51452 x=1215 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51456 x=1242 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51469 x=1269 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51473 x=1296 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51593 x=1323 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51608 x=1350 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51648 x=1377 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51649 x=1401 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51652 x=1425 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51656 x=1449 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51664 x=1473 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51665 x=1497 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=51901 x=1521 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52264 x=1548 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52265 x=1574 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52280 x=1600 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52286 x=1626 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52376 x=1652 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52397 x=1676 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52488 x=1700 y=426 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=52572 x=1727 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52628 x=1752 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52649 x=1779 y=426 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52712 x=1806 y=426 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52824 x=1831 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52825 x=1855 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52852 x=1879 y=426 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52884 x=1905 y=426 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52888 x=1930 y=426 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52896 x=1955 y=426 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52964 x=1980 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=52968 x=2004 y=426 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53020 x=6 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53028 x=30 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53076 x=54 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=53356 x=81 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=53412 x=108 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53448 x=132 y=454 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53469 x=158 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53552 x=183 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53580 x=207 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53596 x=232 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53664 x=257 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=53804 x=284 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=53944 x=311 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=53948 x=338 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54000 x=365 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54001 x=389 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54028 x=413 y=454 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54032 x=439 y=454 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54047 x=465 y=454 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54056 x=491 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54168 x=516 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54200 x=541 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54217 x=565 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54252 x=589 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=54256 x=616 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54364 x=643 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=54408 x=670 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54532 x=697 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=54596 x=724 y=454 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54616 x=748 y=454 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54617 x=774 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54620 x=801 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54624 x=828 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54632 x=855 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54633 x=882 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54635 x=909 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54637 x=936 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54644 x=963 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54665 x=988 y=454 width=14 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54693 x=1014 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54744 x=1041 y=454 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54788 x=1066 y=454 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54812 x=1091 y=454 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54840 x=1116 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=54856 x=1143 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54868 x=1170 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54869 x=1197 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54872 x=1224 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54876 x=1251 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54924 x=1278 y=454 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=54952 x=1303 y=454 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15
+char id=54980 x=1330 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=55092 x=1357 y=454 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15
+char id=65288 x=1384 y=454 width=5 height=14 xoffset=7 yoffset=1 xadvance=16 page=0 chnl=15
+char id=65289 x=1401 y=454 width=5 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15
+char id=65292 x=1418 y=454 width=2 height=5 xoffset=4 yoffset=10 xadvance=16 page=0 chnl=15
+char id=65306 x=1432 y=454 width=2 height=7 xoffset=5 yoffset=5 xadvance=16 page=0 chnl=15
+char id=65307 x=1446 y=454 width=2 height=10 xoffset=5 yoffset=5 xadvance=16 page=0 chnl=15
+char id=65311 x=1460 y=454 width=9 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15
+char id=128293 x=1481 y=454 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15
diff --git a/selfdrive/assets/fonts/unifont.otf b/selfdrive/assets/fonts/unifont.otf
new file mode 100644
index 000000000..537b53eaa
Binary files /dev/null and b/selfdrive/assets/fonts/unifont.otf differ
diff --git a/selfdrive/assets/fonts/unifont.png b/selfdrive/assets/fonts/unifont.png
new file mode 100644
index 000000000..63f6e2cd8
Binary files /dev/null and b/selfdrive/assets/fonts/unifont.png differ
diff --git a/selfdrive/assets/icons/.gitattributes b/selfdrive/assets/icons/.gitattributes
new file mode 100644
index 000000000..202d2b7a0
--- /dev/null
+++ b/selfdrive/assets/icons/.gitattributes
@@ -0,0 +1,6 @@
+*.png -filter -diff -merge -text
+*/*.png -filter -diff -merge -text
+*/*/*.png -filter -diff -merge -text
+*.svg -filter -diff -merge text eol=lf
+*/*.svg -filter -diff -merge text eol=lf
+*/*/*.svg -filter -diff -merge text eol=lf
diff --git a/selfdrive/assets/icons/arrow-right.png b/selfdrive/assets/icons/arrow-right.png
new file mode 100644
index 000000000..704029383
Binary files /dev/null and b/selfdrive/assets/icons/arrow-right.png differ
diff --git a/selfdrive/assets/icons/backspace.png b/selfdrive/assets/icons/backspace.png
new file mode 100644
index 000000000..0de132aab
Binary files /dev/null and b/selfdrive/assets/icons/backspace.png differ
diff --git a/selfdrive/assets/icons/calibration.png b/selfdrive/assets/icons/calibration.png
new file mode 100644
index 000000000..c4ee0d63d
Binary files /dev/null and b/selfdrive/assets/icons/calibration.png differ
diff --git a/selfdrive/assets/icons/camera.png b/selfdrive/assets/icons/camera.png
new file mode 100644
index 000000000..544ebe90e
Binary files /dev/null and b/selfdrive/assets/icons/camera.png differ
diff --git a/selfdrive/assets/icons/capslock-fill.png b/selfdrive/assets/icons/capslock-fill.png
new file mode 100644
index 000000000..e52f3ec2f
Binary files /dev/null and b/selfdrive/assets/icons/capslock-fill.png differ
diff --git a/selfdrive/assets/icons/checkmark.png b/selfdrive/assets/icons/checkmark.png
new file mode 100644
index 000000000..c1886defd
Binary files /dev/null and b/selfdrive/assets/icons/checkmark.png differ
diff --git a/selfdrive/assets/icons/checkmark.svg b/selfdrive/assets/icons/checkmark.svg
new file mode 100644
index 000000000..bb04a2b12
--- /dev/null
+++ b/selfdrive/assets/icons/checkmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/icons/chevron_right.png b/selfdrive/assets/icons/chevron_right.png
new file mode 100644
index 000000000..a3aaa7648
Binary files /dev/null and b/selfdrive/assets/icons/chevron_right.png differ
diff --git a/selfdrive/assets/icons/chffr_wheel.png b/selfdrive/assets/icons/chffr_wheel.png
new file mode 100644
index 000000000..3f09a35a7
Binary files /dev/null and b/selfdrive/assets/icons/chffr_wheel.png differ
diff --git a/selfdrive/assets/icons/circled_check.png b/selfdrive/assets/icons/circled_check.png
new file mode 100644
index 000000000..a29a613bf
Binary files /dev/null and b/selfdrive/assets/icons/circled_check.png differ
diff --git a/selfdrive/assets/icons/circled_check.svg b/selfdrive/assets/icons/circled_check.svg
new file mode 100644
index 000000000..03cc81109
--- /dev/null
+++ b/selfdrive/assets/icons/circled_check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/circled_slash.png b/selfdrive/assets/icons/circled_slash.png
new file mode 100644
index 000000000..cf22b9c19
Binary files /dev/null and b/selfdrive/assets/icons/circled_slash.png differ
diff --git a/selfdrive/assets/icons/circled_slash.svg b/selfdrive/assets/icons/circled_slash.svg
new file mode 100644
index 000000000..5f22233ef
--- /dev/null
+++ b/selfdrive/assets/icons/circled_slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/icons/close.png b/selfdrive/assets/icons/close.png
new file mode 100644
index 000000000..9c39fce89
Binary files /dev/null and b/selfdrive/assets/icons/close.png differ
diff --git a/selfdrive/assets/icons/close.svg b/selfdrive/assets/icons/close.svg
new file mode 100644
index 000000000..6927cede0
--- /dev/null
+++ b/selfdrive/assets/icons/close.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/icons/close2.png b/selfdrive/assets/icons/close2.png
new file mode 100644
index 000000000..055a2970f
Binary files /dev/null and b/selfdrive/assets/icons/close2.png differ
diff --git a/selfdrive/assets/icons/close2.svg b/selfdrive/assets/icons/close2.svg
new file mode 100644
index 000000000..be1385848
--- /dev/null
+++ b/selfdrive/assets/icons/close2.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/couch.png b/selfdrive/assets/icons/couch.png
new file mode 100644
index 000000000..bde02c0b7
Binary files /dev/null and b/selfdrive/assets/icons/couch.png differ
diff --git a/selfdrive/assets/icons/couch.svg b/selfdrive/assets/icons/couch.svg
new file mode 100644
index 000000000..6317cf92f
--- /dev/null
+++ b/selfdrive/assets/icons/couch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/icons/disengage_on_accelerator.png b/selfdrive/assets/icons/disengage_on_accelerator.png
new file mode 100644
index 000000000..181491c05
Binary files /dev/null and b/selfdrive/assets/icons/disengage_on_accelerator.png differ
diff --git a/selfdrive/assets/icons/disengage_on_accelerator.svg b/selfdrive/assets/icons/disengage_on_accelerator.svg
new file mode 100644
index 000000000..d90ba8ca5
--- /dev/null
+++ b/selfdrive/assets/icons/disengage_on_accelerator.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/driver_face.png b/selfdrive/assets/icons/driver_face.png
new file mode 100644
index 000000000..e2d943e53
Binary files /dev/null and b/selfdrive/assets/icons/driver_face.png differ
diff --git a/selfdrive/assets/icons/experimental.png b/selfdrive/assets/icons/experimental.png
new file mode 100644
index 000000000..fcb1e086a
Binary files /dev/null and b/selfdrive/assets/icons/experimental.png differ
diff --git a/selfdrive/assets/icons/experimental.svg b/selfdrive/assets/icons/experimental.svg
new file mode 100644
index 000000000..2be14b808
--- /dev/null
+++ b/selfdrive/assets/icons/experimental.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/selfdrive/assets/icons/experimental_grey.png b/selfdrive/assets/icons/experimental_grey.png
new file mode 100644
index 000000000..9be4bd720
Binary files /dev/null and b/selfdrive/assets/icons/experimental_grey.png differ
diff --git a/selfdrive/assets/icons/experimental_grey.svg b/selfdrive/assets/icons/experimental_grey.svg
new file mode 100644
index 000000000..0f77bb008
--- /dev/null
+++ b/selfdrive/assets/icons/experimental_grey.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/experimental_white.png b/selfdrive/assets/icons/experimental_white.png
new file mode 100644
index 000000000..4751ee527
Binary files /dev/null and b/selfdrive/assets/icons/experimental_white.png differ
diff --git a/selfdrive/assets/icons/experimental_white.svg b/selfdrive/assets/icons/experimental_white.svg
new file mode 100644
index 000000000..d5052e9d2
--- /dev/null
+++ b/selfdrive/assets/icons/experimental_white.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/eye_closed.png b/selfdrive/assets/icons/eye_closed.png
new file mode 100644
index 000000000..910363f75
Binary files /dev/null and b/selfdrive/assets/icons/eye_closed.png differ
diff --git a/selfdrive/assets/icons/eye_closed.svg b/selfdrive/assets/icons/eye_closed.svg
new file mode 100644
index 000000000..47410a035
--- /dev/null
+++ b/selfdrive/assets/icons/eye_closed.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/selfdrive/assets/icons/eye_open.png b/selfdrive/assets/icons/eye_open.png
new file mode 100644
index 000000000..55b505658
Binary files /dev/null and b/selfdrive/assets/icons/eye_open.png differ
diff --git a/selfdrive/assets/icons/eye_open.svg b/selfdrive/assets/icons/eye_open.svg
new file mode 100644
index 000000000..16d34f080
--- /dev/null
+++ b/selfdrive/assets/icons/eye_open.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/eyes_crossed.png b/selfdrive/assets/icons/eyes_crossed.png
new file mode 100644
index 000000000..9b800c4c7
Binary files /dev/null and b/selfdrive/assets/icons/eyes_crossed.png differ
diff --git a/selfdrive/assets/icons/eyes_open.png b/selfdrive/assets/icons/eyes_open.png
new file mode 100644
index 000000000..5e6cf7583
Binary files /dev/null and b/selfdrive/assets/icons/eyes_open.png differ
diff --git a/selfdrive/assets/icons/iq/ATTRIBUTION.txt b/selfdrive/assets/icons/iq/ATTRIBUTION.txt
new file mode 100644
index 000000000..122dcc6a5
--- /dev/null
+++ b/selfdrive/assets/icons/iq/ATTRIBUTION.txt
@@ -0,0 +1,6 @@
+Icons in this directory are derived from Lucide (https://lucide.dev),
+licensed under the ISC License. Stroke color was modified (white, or a
+teal gradient for the offroad launcher tiles) and rasterized to PNG.
+
+Lucide © Lucide Contributors — ISC License
+https://github.com/lucide-icons/lucide/blob/main/LICENSE
diff --git a/selfdrive/assets/icons/iq/back.png b/selfdrive/assets/icons/iq/back.png
new file mode 100644
index 000000000..a3d5a7945
Binary files /dev/null and b/selfdrive/assets/icons/iq/back.png differ
diff --git a/selfdrive/assets/icons/iq/battery.png b/selfdrive/assets/icons/iq/battery.png
new file mode 100644
index 000000000..f6af3804c
Binary files /dev/null and b/selfdrive/assets/icons/iq/battery.png differ
diff --git a/selfdrive/assets/icons/iq/battery_charging.png b/selfdrive/assets/icons/iq/battery_charging.png
new file mode 100644
index 000000000..8d3bf3b3c
Binary files /dev/null and b/selfdrive/assets/icons/iq/battery_charging.png differ
diff --git a/selfdrive/assets/icons/iq/bell-slash.png b/selfdrive/assets/icons/iq/bell-slash.png
new file mode 100644
index 000000000..3164064c9
Binary files /dev/null and b/selfdrive/assets/icons/iq/bell-slash.png differ
diff --git a/selfdrive/assets/icons/iq/bell.png b/selfdrive/assets/icons/iq/bell.png
new file mode 100644
index 000000000..675b3ab95
Binary files /dev/null and b/selfdrive/assets/icons/iq/bell.png differ
diff --git a/selfdrive/assets/icons/iq/bookmark.png b/selfdrive/assets/icons/iq/bookmark.png
new file mode 100644
index 000000000..7ccd1bfdb
Binary files /dev/null and b/selfdrive/assets/icons/iq/bookmark.png differ
diff --git a/selfdrive/assets/icons/iq/chevron_down.png b/selfdrive/assets/icons/iq/chevron_down.png
new file mode 100644
index 000000000..dc924d971
Binary files /dev/null and b/selfdrive/assets/icons/iq/chevron_down.png differ
diff --git a/selfdrive/assets/icons/iq/chevron_right.png b/selfdrive/assets/icons/iq/chevron_right.png
new file mode 100644
index 000000000..89a48e804
Binary files /dev/null and b/selfdrive/assets/icons/iq/chevron_right.png differ
diff --git a/selfdrive/assets/icons/iq/close.png b/selfdrive/assets/icons/iq/close.png
new file mode 100644
index 000000000..a5114aa56
Binary files /dev/null and b/selfdrive/assets/icons/iq/close.png differ
diff --git a/selfdrive/assets/icons/iq/home.png b/selfdrive/assets/icons/iq/home.png
new file mode 100644
index 000000000..47eb08ae4
Binary files /dev/null and b/selfdrive/assets/icons/iq/home.png differ
diff --git a/selfdrive/assets/icons/iq/moon.png b/selfdrive/assets/icons/iq/moon.png
new file mode 100644
index 000000000..b72052da3
Binary files /dev/null and b/selfdrive/assets/icons/iq/moon.png differ
diff --git a/selfdrive/assets/icons/iq/pin.png b/selfdrive/assets/icons/iq/pin.png
new file mode 100644
index 000000000..71d34fd1e
Binary files /dev/null and b/selfdrive/assets/icons/iq/pin.png differ
diff --git a/selfdrive/assets/icons/iq/play.png b/selfdrive/assets/icons/iq/play.png
new file mode 100644
index 000000000..2f94e24e6
Binary files /dev/null and b/selfdrive/assets/icons/iq/play.png differ
diff --git a/selfdrive/assets/icons/iq/power.png b/selfdrive/assets/icons/iq/power.png
new file mode 100644
index 000000000..517d316b8
Binary files /dev/null and b/selfdrive/assets/icons/iq/power.png differ
diff --git a/selfdrive/assets/icons/iq/recent.png b/selfdrive/assets/icons/iq/recent.png
new file mode 100644
index 000000000..6811dc96c
Binary files /dev/null and b/selfdrive/assets/icons/iq/recent.png differ
diff --git a/selfdrive/assets/icons/iq/restart.png b/selfdrive/assets/icons/iq/restart.png
new file mode 100644
index 000000000..d42e857f2
Binary files /dev/null and b/selfdrive/assets/icons/iq/restart.png differ
diff --git a/selfdrive/assets/icons/iq/rotate-ccw.png b/selfdrive/assets/icons/iq/rotate-ccw.png
new file mode 100644
index 000000000..0c7fc6e21
Binary files /dev/null and b/selfdrive/assets/icons/iq/rotate-ccw.png differ
diff --git a/selfdrive/assets/icons/iq/rotate-ccw.svg b/selfdrive/assets/icons/iq/rotate-ccw.svg
new file mode 100644
index 000000000..e3d11dbe9
--- /dev/null
+++ b/selfdrive/assets/icons/iq/rotate-ccw.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/iq/rotate-cw.png b/selfdrive/assets/icons/iq/rotate-cw.png
new file mode 100644
index 000000000..0619daf98
Binary files /dev/null and b/selfdrive/assets/icons/iq/rotate-cw.png differ
diff --git a/selfdrive/assets/icons/iq/rotate-cw.svg b/selfdrive/assets/icons/iq/rotate-cw.svg
new file mode 100644
index 000000000..c27d8820d
--- /dev/null
+++ b/selfdrive/assets/icons/iq/rotate-cw.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/iq/search.png b/selfdrive/assets/icons/iq/search.png
new file mode 100644
index 000000000..6514ca683
Binary files /dev/null and b/selfdrive/assets/icons/iq/search.png differ
diff --git a/selfdrive/assets/icons/iq/sec_maintenance.png b/selfdrive/assets/icons/iq/sec_maintenance.png
new file mode 100644
index 000000000..66355b840
Binary files /dev/null and b/selfdrive/assets/icons/iq/sec_maintenance.png differ
diff --git a/selfdrive/assets/icons/iq/sec_system.png b/selfdrive/assets/icons/iq/sec_system.png
new file mode 100644
index 000000000..eb8666021
Binary files /dev/null and b/selfdrive/assets/icons/iq/sec_system.png differ
diff --git a/selfdrive/assets/icons/iq/signal.png b/selfdrive/assets/icons/iq/signal.png
new file mode 100644
index 000000000..7b1d4dab3
Binary files /dev/null and b/selfdrive/assets/icons/iq/signal.png differ
diff --git a/selfdrive/assets/icons/iq/square-parking.png b/selfdrive/assets/icons/iq/square-parking.png
new file mode 100644
index 000000000..d8b44ed0d
Binary files /dev/null and b/selfdrive/assets/icons/iq/square-parking.png differ
diff --git a/selfdrive/assets/icons/iq/square-parking.svg b/selfdrive/assets/icons/iq/square-parking.svg
new file mode 100644
index 000000000..b7642a15b
--- /dev/null
+++ b/selfdrive/assets/icons/iq/square-parking.svg
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/selfdrive/assets/icons/iq/tile_nav.png b/selfdrive/assets/icons/iq/tile_nav.png
new file mode 100644
index 000000000..974c7fe0c
Binary files /dev/null and b/selfdrive/assets/icons/iq/tile_nav.png differ
diff --git a/selfdrive/assets/icons/iq/tile_routes.png b/selfdrive/assets/icons/iq/tile_routes.png
new file mode 100644
index 000000000..d58b6569e
Binary files /dev/null and b/selfdrive/assets/icons/iq/tile_routes.png differ
diff --git a/selfdrive/assets/icons/iq/tile_settings.png b/selfdrive/assets/icons/iq/tile_settings.png
new file mode 100644
index 000000000..2078f1b81
Binary files /dev/null and b/selfdrive/assets/icons/iq/tile_settings.png differ
diff --git a/selfdrive/assets/icons/iq/tile_stats.png b/selfdrive/assets/icons/iq/tile_stats.png
new file mode 100644
index 000000000..2e746eacd
Binary files /dev/null and b/selfdrive/assets/icons/iq/tile_stats.png differ
diff --git a/selfdrive/assets/icons/iq/trash.png b/selfdrive/assets/icons/iq/trash.png
new file mode 100644
index 000000000..ec5d7282d
Binary files /dev/null and b/selfdrive/assets/icons/iq/trash.png differ
diff --git a/selfdrive/assets/icons/iq/wifi.png b/selfdrive/assets/icons/iq/wifi.png
new file mode 100644
index 000000000..553eaa010
Binary files /dev/null and b/selfdrive/assets/icons/iq/wifi.png differ
diff --git a/selfdrive/assets/icons/iq/work.png b/selfdrive/assets/icons/iq/work.png
new file mode 100644
index 000000000..e8fb476a4
Binary files /dev/null and b/selfdrive/assets/icons/iq/work.png differ
diff --git a/selfdrive/assets/icons/lead_orb.png b/selfdrive/assets/icons/lead_orb.png
new file mode 100644
index 000000000..8146527b4
Binary files /dev/null and b/selfdrive/assets/icons/lead_orb.png differ
diff --git a/selfdrive/assets/icons/link.png b/selfdrive/assets/icons/link.png
new file mode 100644
index 000000000..218c03a98
Binary files /dev/null and b/selfdrive/assets/icons/link.png differ
diff --git a/selfdrive/assets/icons/live_view.png b/selfdrive/assets/icons/live_view.png
new file mode 100644
index 000000000..e85ccfb5b
Binary files /dev/null and b/selfdrive/assets/icons/live_view.png differ
diff --git a/selfdrive/assets/icons/lock_closed.png b/selfdrive/assets/icons/lock_closed.png
new file mode 100644
index 000000000..05afcaef9
Binary files /dev/null and b/selfdrive/assets/icons/lock_closed.png differ
diff --git a/selfdrive/assets/icons/lock_closed.svg b/selfdrive/assets/icons/lock_closed.svg
new file mode 100644
index 000000000..923344f75
--- /dev/null
+++ b/selfdrive/assets/icons/lock_closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/icons/menu.png b/selfdrive/assets/icons/menu.png
new file mode 100644
index 000000000..837cf5831
Binary files /dev/null and b/selfdrive/assets/icons/menu.png differ
diff --git a/selfdrive/assets/icons/metric.png b/selfdrive/assets/icons/metric.png
new file mode 100644
index 000000000..eaa2438fa
Binary files /dev/null and b/selfdrive/assets/icons/metric.png differ
diff --git a/selfdrive/assets/icons/microphone.png b/selfdrive/assets/icons/microphone.png
new file mode 100644
index 000000000..787ad86e0
Binary files /dev/null and b/selfdrive/assets/icons/microphone.png differ
diff --git a/selfdrive/assets/icons/minus.png b/selfdrive/assets/icons/minus.png
new file mode 100644
index 000000000..e5327c0d3
Binary files /dev/null and b/selfdrive/assets/icons/minus.png differ
diff --git a/selfdrive/assets/icons/monitoring.png b/selfdrive/assets/icons/monitoring.png
new file mode 100644
index 000000000..05f78811e
Binary files /dev/null and b/selfdrive/assets/icons/monitoring.png differ
diff --git a/selfdrive/assets/icons/network.png b/selfdrive/assets/icons/network.png
new file mode 100644
index 000000000..116d47ecf
Binary files /dev/null and b/selfdrive/assets/icons/network.png differ
diff --git a/selfdrive/assets/icons/network.svg b/selfdrive/assets/icons/network.svg
new file mode 100644
index 000000000..2c0817d9e
--- /dev/null
+++ b/selfdrive/assets/icons/network.svg
@@ -0,0 +1 @@
+
diff --git a/selfdrive/assets/icons/road.png b/selfdrive/assets/icons/road.png
new file mode 100644
index 000000000..5868ed1cc
Binary files /dev/null and b/selfdrive/assets/icons/road.png differ
diff --git a/selfdrive/assets/icons/settings.png b/selfdrive/assets/icons/settings.png
new file mode 100644
index 000000000..d0c90a620
Binary files /dev/null and b/selfdrive/assets/icons/settings.png differ
diff --git a/selfdrive/assets/icons/shell.png b/selfdrive/assets/icons/shell.png
new file mode 100644
index 000000000..e28040fc5
Binary files /dev/null and b/selfdrive/assets/icons/shell.png differ
diff --git a/selfdrive/assets/icons/shell.svg b/selfdrive/assets/icons/shell.svg
new file mode 100644
index 000000000..e33d5a436
--- /dev/null
+++ b/selfdrive/assets/icons/shell.svg
@@ -0,0 +1 @@
+
diff --git a/selfdrive/assets/icons/shift-fill.png b/selfdrive/assets/icons/shift-fill.png
new file mode 100644
index 000000000..7cf0d2527
Binary files /dev/null and b/selfdrive/assets/icons/shift-fill.png differ
diff --git a/selfdrive/assets/icons/shift.png b/selfdrive/assets/icons/shift.png
new file mode 100644
index 000000000..5847339e6
Binary files /dev/null and b/selfdrive/assets/icons/shift.png differ
diff --git a/selfdrive/assets/icons/speed_limit.png b/selfdrive/assets/icons/speed_limit.png
new file mode 100644
index 000000000..0aa7038f9
Binary files /dev/null and b/selfdrive/assets/icons/speed_limit.png differ
diff --git a/selfdrive/assets/icons/triangle.png b/selfdrive/assets/icons/triangle.png
new file mode 100644
index 000000000..86f9156ce
Binary files /dev/null and b/selfdrive/assets/icons/triangle.png differ
diff --git a/selfdrive/assets/icons/triangle.svg b/selfdrive/assets/icons/triangle.svg
new file mode 100644
index 000000000..ef10e16e2
--- /dev/null
+++ b/selfdrive/assets/icons/triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/icons/warning.png b/selfdrive/assets/icons/warning.png
new file mode 100644
index 000000000..50fe82112
Binary files /dev/null and b/selfdrive/assets/icons/warning.png differ
diff --git a/selfdrive/assets/icons/wifi_strength_full.png b/selfdrive/assets/icons/wifi_strength_full.png
new file mode 100644
index 000000000..58d3feedc
Binary files /dev/null and b/selfdrive/assets/icons/wifi_strength_full.png differ
diff --git a/selfdrive/assets/icons/wifi_strength_full.svg b/selfdrive/assets/icons/wifi_strength_full.svg
new file mode 100644
index 000000000..96af03799
--- /dev/null
+++ b/selfdrive/assets/icons/wifi_strength_full.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/selfdrive/assets/icons/wifi_strength_high.png b/selfdrive/assets/icons/wifi_strength_high.png
new file mode 100644
index 000000000..327a75b2a
Binary files /dev/null and b/selfdrive/assets/icons/wifi_strength_high.png differ
diff --git a/selfdrive/assets/icons/wifi_strength_high.svg b/selfdrive/assets/icons/wifi_strength_high.svg
new file mode 100644
index 000000000..63fc8bc0b
--- /dev/null
+++ b/selfdrive/assets/icons/wifi_strength_high.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/selfdrive/assets/icons/wifi_strength_low.png b/selfdrive/assets/icons/wifi_strength_low.png
new file mode 100644
index 000000000..5464acfd2
Binary files /dev/null and b/selfdrive/assets/icons/wifi_strength_low.png differ
diff --git a/selfdrive/assets/icons/wifi_strength_low.svg b/selfdrive/assets/icons/wifi_strength_low.svg
new file mode 100644
index 000000000..5bc67bed5
--- /dev/null
+++ b/selfdrive/assets/icons/wifi_strength_low.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/selfdrive/assets/icons/wifi_strength_medium.png b/selfdrive/assets/icons/wifi_strength_medium.png
new file mode 100644
index 000000000..5340423e5
Binary files /dev/null and b/selfdrive/assets/icons/wifi_strength_medium.png differ
diff --git a/selfdrive/assets/icons/wifi_strength_medium.svg b/selfdrive/assets/icons/wifi_strength_medium.svg
new file mode 100644
index 000000000..9030dbc56
--- /dev/null
+++ b/selfdrive/assets/icons/wifi_strength_medium.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/selfdrive/assets/icons/wifi_uploading.png b/selfdrive/assets/icons/wifi_uploading.png
new file mode 100644
index 000000000..e0aa598fb
Binary files /dev/null and b/selfdrive/assets/icons/wifi_uploading.png differ
diff --git a/selfdrive/assets/icons/wifi_uploading.svg b/selfdrive/assets/icons/wifi_uploading.svg
new file mode 100644
index 000000000..1c1c9af45
--- /dev/null
+++ b/selfdrive/assets/icons/wifi_uploading.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/selfdrive/assets/icons_mici/adb_short.png b/selfdrive/assets/icons_mici/adb_short.png
new file mode 100644
index 000000000..162b4e71d
Binary files /dev/null and b/selfdrive/assets/icons_mici/adb_short.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle.png b/selfdrive/assets/icons_mici/buttons/button_circle.png
new file mode 100644
index 000000000..817d79f95
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle_disabled.png b/selfdrive/assets/icons_mici/buttons/button_circle_disabled.png
new file mode 100644
index 000000000..52fb7f4e3
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle_hover.png b/selfdrive/assets/icons_mici/buttons/button_circle_hover.png
new file mode 100644
index 000000000..b098870b7
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle_hover.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png b/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png
new file mode 100644
index 000000000..90a5af125
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle_red.png b/selfdrive/assets/icons_mici/buttons/button_circle_red.png
new file mode 100644
index 000000000..e4c06b4e3
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle_red.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle_red_hover.png b/selfdrive/assets/icons_mici/buttons/button_circle_red_hover.png
new file mode 100644
index 000000000..e42e22982
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle_red_hover.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png b/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png
new file mode 100644
index 000000000..8349feb40
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_rectangle.png b/selfdrive/assets/icons_mici/buttons/button_rectangle.png
new file mode 100644
index 000000000..0a68722c4
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_rectangle.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_rectangle_disabled.png b/selfdrive/assets/icons_mici/buttons/button_rectangle_disabled.png
new file mode 100644
index 000000000..e4ef99b82
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_rectangle_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_rectangle_hover.png b/selfdrive/assets/icons_mici/buttons/button_rectangle_hover.png
new file mode 100644
index 000000000..6c98434f5
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_rectangle_hover.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_rectangle_pressed.png b/selfdrive/assets/icons_mici/buttons/button_rectangle_pressed.png
new file mode 100644
index 000000000..43ed496ad
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_rectangle_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_side_back.png b/selfdrive/assets/icons_mici/buttons/button_side_back.png
new file mode 100644
index 000000000..61f7be9f4
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_side_back.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_side_back_pressed.png b/selfdrive/assets/icons_mici/buttons/button_side_back_pressed.png
new file mode 100644
index 000000000..cc9e50ece
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_side_back_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_side_check.png b/selfdrive/assets/icons_mici/buttons/button_side_check.png
new file mode 100644
index 000000000..b73e008a3
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_side_check.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/button_side_check_pressed.png b/selfdrive/assets/icons_mici/buttons/button_side_check_pressed.png
new file mode 100644
index 000000000..9af6c6ee8
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/button_side_check_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/slider_bg.png b/selfdrive/assets/icons_mici/buttons/slider_bg.png
new file mode 100644
index 000000000..cf1c7d67b
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/slider_bg.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/toggle_dot_disabled.png b/selfdrive/assets/icons_mici/buttons/toggle_dot_disabled.png
new file mode 100644
index 000000000..03aa4cd1b
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/toggle_dot_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png b/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png
new file mode 100644
index 000000000..0f8062054
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/toggle_pill_disabled.png b/selfdrive/assets/icons_mici/buttons/toggle_pill_disabled.png
new file mode 100644
index 000000000..e6008661d
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/toggle_pill_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png b/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png
new file mode 100644
index 000000000..2a5612a19
Binary files /dev/null and b/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png differ
diff --git a/selfdrive/assets/icons_mici/exclamation_point.png b/selfdrive/assets/icons_mici/exclamation_point.png
new file mode 100644
index 000000000..7a5773d7a
Binary files /dev/null and b/selfdrive/assets/icons_mici/exclamation_point.png differ
diff --git a/selfdrive/assets/icons_mici/experimental_mode.png b/selfdrive/assets/icons_mici/experimental_mode.png
new file mode 100644
index 000000000..db699bc8d
Binary files /dev/null and b/selfdrive/assets/icons_mici/experimental_mode.png differ
diff --git a/selfdrive/assets/icons_mici/experimental_mode_mici.png b/selfdrive/assets/icons_mici/experimental_mode_mici.png
new file mode 100644
index 000000000..e741b4053
Binary files /dev/null and b/selfdrive/assets/icons_mici/experimental_mode_mici.png differ
diff --git a/selfdrive/assets/icons_mici/experimental_mode_tizi.png b/selfdrive/assets/icons_mici/experimental_mode_tizi.png
new file mode 100644
index 000000000..6045b7ac9
Binary files /dev/null and b/selfdrive/assets/icons_mici/experimental_mode_tizi.png differ
diff --git a/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png b/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png
new file mode 100644
index 000000000..9116fb492
Binary files /dev/null and b/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png differ
diff --git a/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png b/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png
new file mode 100644
index 000000000..8b466cdf4
Binary files /dev/null and b/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png differ
diff --git a/selfdrive/assets/icons_mici/iqstandard_mode_mici.png b/selfdrive/assets/icons_mici/iqstandard_mode_mici.png
new file mode 100644
index 000000000..ae98bbb6e
Binary files /dev/null and b/selfdrive/assets/icons_mici/iqstandard_mode_mici.png differ
diff --git a/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png b/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png
new file mode 100644
index 000000000..8b2a2868a
Binary files /dev/null and b/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png differ
diff --git a/selfdrive/assets/icons_mici/microphone.png b/selfdrive/assets/icons_mici/microphone.png
new file mode 100644
index 000000000..c64f871d8
Binary files /dev/null and b/selfdrive/assets/icons_mici/microphone.png differ
diff --git a/selfdrive/assets/icons_mici/models.png b/selfdrive/assets/icons_mici/models.png
new file mode 100644
index 000000000..17d57e625
Binary files /dev/null and b/selfdrive/assets/icons_mici/models.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/big_alert.png b/selfdrive/assets/icons_mici/offroad_alerts/big_alert.png
new file mode 100644
index 000000000..a4f6a50da
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/big_alert.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/big_alert_pressed.png b/selfdrive/assets/icons_mici/offroad_alerts/big_alert_pressed.png
new file mode 100644
index 000000000..1c97c3326
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/big_alert_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png b/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png
new file mode 100644
index 000000000..76a73bbd2
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/medium_alert.png b/selfdrive/assets/icons_mici/offroad_alerts/medium_alert.png
new file mode 100644
index 000000000..4fe8a188c
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/medium_alert.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/medium_alert_pressed.png b/selfdrive/assets/icons_mici/offroad_alerts/medium_alert_pressed.png
new file mode 100644
index 000000000..8b531f048
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/medium_alert_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/orange_warning.png b/selfdrive/assets/icons_mici/offroad_alerts/orange_warning.png
new file mode 100644
index 000000000..ff1f7cdf6
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/orange_warning.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/red_warning.png b/selfdrive/assets/icons_mici/offroad_alerts/red_warning.png
new file mode 100644
index 000000000..a726f528a
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/red_warning.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/small_alert.png b/selfdrive/assets/icons_mici/offroad_alerts/small_alert.png
new file mode 100644
index 000000000..83a1e72ea
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/small_alert.png differ
diff --git a/selfdrive/assets/icons_mici/offroad_alerts/small_alert_pressed.png b/selfdrive/assets/icons_mici/offroad_alerts/small_alert_pressed.png
new file mode 100644
index 000000000..50921ce6c
Binary files /dev/null and b/selfdrive/assets/icons_mici/offroad_alerts/small_alert_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/blind_spot_left.png b/selfdrive/assets/icons_mici/onroad/blind_spot_left.png
new file mode 100644
index 000000000..e50c22c89
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/blind_spot_left.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/blind_spot_right.png b/selfdrive/assets/icons_mici/onroad/blind_spot_right.png
new file mode 100644
index 000000000..af306b538
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/blind_spot_right.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/bookmark.png b/selfdrive/assets/icons_mici/onroad/bookmark.png
new file mode 100644
index 000000000..929654f01
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/bookmark.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/bookmark_fill.png b/selfdrive/assets/icons_mici/onroad/bookmark_fill.png
new file mode 100644
index 000000000..c52fe2ac2
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/bookmark_fill.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_background.png b/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_background.png
new file mode 100644
index 000000000..b464f3c10
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_background.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png b/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png
new file mode 100644
index 000000000..1f36e9cb2
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_person.png b/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_person.png
new file mode 100644
index 000000000..223ff6979
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_person.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/eye_fill.png b/selfdrive/assets/icons_mici/onroad/eye_fill.png
new file mode 100644
index 000000000..438b3bc8c
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/eye_fill.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/eye_orange.png b/selfdrive/assets/icons_mici/onroad/eye_orange.png
new file mode 100644
index 000000000..8cd929707
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/eye_orange.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/glasses.png b/selfdrive/assets/icons_mici/onroad/glasses.png
new file mode 100644
index 000000000..8de9c4395
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/glasses.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/onroad_fade.png b/selfdrive/assets/icons_mici/onroad/onroad_fade.png
new file mode 100644
index 000000000..de0388580
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/onroad_fade.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/turn_signal_left.png b/selfdrive/assets/icons_mici/onroad/turn_signal_left.png
new file mode 100644
index 000000000..bb7e5970d
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/turn_signal_left.png differ
diff --git a/selfdrive/assets/icons_mici/onroad/turn_signal_right.png b/selfdrive/assets/icons_mici/onroad/turn_signal_right.png
new file mode 100644
index 000000000..91304ea47
Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/turn_signal_right.png differ
diff --git a/selfdrive/assets/icons_mici/settings.png b/selfdrive/assets/icons_mici/settings.png
new file mode 100644
index 000000000..91a4a1ca6
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings.png differ
diff --git a/selfdrive/assets/icons_mici/settings/brightness.png b/selfdrive/assets/icons_mici/settings/brightness.png
new file mode 100644
index 000000000..283a514a4
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/brightness.png differ
diff --git a/selfdrive/assets/icons_mici/settings/camera.png b/selfdrive/assets/icons_mici/settings/camera.png
new file mode 100644
index 000000000..2c43fa32c
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/camera.png differ
diff --git a/selfdrive/assets/icons_mici/settings/developer/ssh.png b/selfdrive/assets/icons_mici/settings/developer/ssh.png
new file mode 100644
index 000000000..a99becf24
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/developer/ssh.png differ
diff --git a/selfdrive/assets/icons_mici/settings/developer_icon.png b/selfdrive/assets/icons_mici/settings/developer_icon.png
new file mode 100644
index 000000000..b6e74098d
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/developer_icon.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/cameras.png b/selfdrive/assets/icons_mici/settings/device/cameras.png
new file mode 100644
index 000000000..d51a1f1fa
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/cameras.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/fcc_logo.png b/selfdrive/assets/icons_mici/settings/device/fcc_logo.png
new file mode 100644
index 000000000..818a40d64
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/fcc_logo.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/info.png b/selfdrive/assets/icons_mici/settings/device/info.png
new file mode 100644
index 000000000..05cfb723e
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/info.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/language.png b/selfdrive/assets/icons_mici/settings/device/language.png
new file mode 100644
index 000000000..c1e660268
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/language.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/lkas.png b/selfdrive/assets/icons_mici/settings/device/lkas.png
new file mode 100644
index 000000000..b6b10c8d2
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/lkas.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/pair.png b/selfdrive/assets/icons_mici/settings/device/pair.png
new file mode 100644
index 000000000..0c9a19c44
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/pair.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/power.png b/selfdrive/assets/icons_mici/settings/device/power.png
new file mode 100644
index 000000000..2b06febc1
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/power.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/reboot.png b/selfdrive/assets/icons_mici/settings/device/reboot.png
new file mode 100644
index 000000000..a107f9ebe
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/reboot.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/uninstall.png b/selfdrive/assets/icons_mici/settings/device/uninstall.png
new file mode 100644
index 000000000..6db14985d
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/uninstall.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/up_to_date.png b/selfdrive/assets/icons_mici/settings/device/up_to_date.png
new file mode 100644
index 000000000..ed87ba667
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/up_to_date.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device/update.png b/selfdrive/assets/icons_mici/settings/device/update.png
new file mode 100644
index 000000000..277d27ea9
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device/update.png differ
diff --git a/selfdrive/assets/icons_mici/settings/device_icon.png b/selfdrive/assets/icons_mici/settings/device_icon.png
new file mode 100644
index 000000000..d56e6679d
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/device_icon.png differ
diff --git a/selfdrive/assets/icons_mici/settings/firehose.png b/selfdrive/assets/icons_mici/settings/firehose.png
new file mode 100644
index 000000000..c1e53f9b5
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/firehose.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/backspace.png b/selfdrive/assets/icons_mici/settings/keyboard/backspace.png
new file mode 100644
index 000000000..ebea79638
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/backspace.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/caps_lock.png b/selfdrive/assets/icons_mici/settings/keyboard/caps_lock.png
new file mode 100644
index 000000000..97c29255f
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/caps_lock.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/caps_lower.png b/selfdrive/assets/icons_mici/settings/keyboard/caps_lower.png
new file mode 100644
index 000000000..e2e4526f4
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/caps_lower.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/caps_upper.png b/selfdrive/assets/icons_mici/settings/keyboard/caps_upper.png
new file mode 100644
index 000000000..348a4c14f
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/caps_upper.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/confirm.png b/selfdrive/assets/icons_mici/settings/keyboard/confirm.png
new file mode 100644
index 000000000..3c18b1c2b
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/confirm.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/enter.png b/selfdrive/assets/icons_mici/settings/keyboard/enter.png
new file mode 100644
index 000000000..b853d98d7
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/enter.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png b/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png
new file mode 100644
index 000000000..df54c043c
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/keyboard_background.png b/selfdrive/assets/icons_mici/settings/keyboard/keyboard_background.png
new file mode 100644
index 000000000..ee795581a
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/keyboard_background.png differ
diff --git a/selfdrive/assets/icons_mici/settings/keyboard/space.png b/selfdrive/assets/icons_mici/settings/keyboard/space.png
new file mode 100644
index 000000000..0d5bc90ef
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/keyboard/space.png differ
diff --git a/selfdrive/assets/icons_mici/settings/konn3kt_icon.png b/selfdrive/assets/icons_mici/settings/konn3kt_icon.png
new file mode 100644
index 000000000..c34731e38
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/konn3kt_icon.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/cell_strength_full.png b/selfdrive/assets/icons_mici/settings/network/cell_strength_full.png
new file mode 100644
index 000000000..6899a72ce
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/cell_strength_full.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/cell_strength_high.png b/selfdrive/assets/icons_mici/settings/network/cell_strength_high.png
new file mode 100644
index 000000000..751ce84ac
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/cell_strength_high.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/cell_strength_low.png b/selfdrive/assets/icons_mici/settings/network/cell_strength_low.png
new file mode 100644
index 000000000..ff7d21692
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/cell_strength_low.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/cell_strength_medium.png b/selfdrive/assets/icons_mici/settings/network/cell_strength_medium.png
new file mode 100644
index 000000000..c69d66750
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/cell_strength_medium.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/cell_strength_none.png b/selfdrive/assets/icons_mici/settings/network/cell_strength_none.png
new file mode 100644
index 000000000..63846f360
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/cell_strength_none.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/connect_button.png b/selfdrive/assets/icons_mici/settings/network/new/connect_button.png
new file mode 100644
index 000000000..88967f7f4
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/connect_button.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/connect_button_pressed.png b/selfdrive/assets/icons_mici/settings/network/new/connect_button_pressed.png
new file mode 100644
index 000000000..fd9c2e22f
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/connect_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/forget_button.png b/selfdrive/assets/icons_mici/settings/network/new/forget_button.png
new file mode 100644
index 000000000..cec31dcc8
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/forget_button.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/forget_button_pressed.png b/selfdrive/assets/icons_mici/settings/network/new/forget_button_pressed.png
new file mode 100644
index 000000000..b12fb37a9
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/forget_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/full_connect_button.png b/selfdrive/assets/icons_mici/settings/network/new/full_connect_button.png
new file mode 100644
index 000000000..8dd295bf9
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/full_connect_button.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/full_connect_button_pressed.png b/selfdrive/assets/icons_mici/settings/network/new/full_connect_button_pressed.png
new file mode 100644
index 000000000..cf39bc9fe
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/full_connect_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/lock.png b/selfdrive/assets/icons_mici/settings/network/new/lock.png
new file mode 100644
index 000000000..a7463eee0
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/lock.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/trash.png b/selfdrive/assets/icons_mici/settings/network/new/trash.png
new file mode 100644
index 000000000..8805ac133
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/trash.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/new/wifi_selected.png b/selfdrive/assets/icons_mici/settings/network/new/wifi_selected.png
new file mode 100644
index 000000000..18b593b7a
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/new/wifi_selected.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/tethering.png b/selfdrive/assets/icons_mici/settings/network/tethering.png
new file mode 100644
index 000000000..239a2ce3b
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/tethering.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/wifi_strength_full.png b/selfdrive/assets/icons_mici/settings/network/wifi_strength_full.png
new file mode 100644
index 000000000..8297266f8
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/wifi_strength_full.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/wifi_strength_low.png b/selfdrive/assets/icons_mici/settings/network/wifi_strength_low.png
new file mode 100644
index 000000000..93e66dc9e
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/wifi_strength_low.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/wifi_strength_medium.png b/selfdrive/assets/icons_mici/settings/network/wifi_strength_medium.png
new file mode 100644
index 000000000..e5145cf32
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/wifi_strength_medium.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/wifi_strength_none.png b/selfdrive/assets/icons_mici/settings/network/wifi_strength_none.png
new file mode 100644
index 000000000..641c2cd5e
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/wifi_strength_none.png differ
diff --git a/selfdrive/assets/icons_mici/settings/network/wifi_strength_slash.png b/selfdrive/assets/icons_mici/settings/network/wifi_strength_slash.png
new file mode 100644
index 000000000..dfb36eba8
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/network/wifi_strength_slash.png differ
diff --git a/selfdrive/assets/icons_mici/settings/sd_card.png b/selfdrive/assets/icons_mici/settings/sd_card.png
new file mode 100644
index 000000000..46c9fae99
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/sd_card.png differ
diff --git a/selfdrive/assets/icons_mici/settings/software.png b/selfdrive/assets/icons_mici/settings/software.png
new file mode 100644
index 000000000..3dfd60589
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/software.png differ
diff --git a/selfdrive/assets/icons_mici/settings/trips.png b/selfdrive/assets/icons_mici/settings/trips.png
new file mode 100644
index 000000000..a3cd01ae2
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/trips.png differ
diff --git a/selfdrive/assets/icons_mici/settings/vehicle.png b/selfdrive/assets/icons_mici/settings/vehicle.png
new file mode 100644
index 000000000..7f7fd2721
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/vehicle.png differ
diff --git a/selfdrive/assets/icons_mici/settings/vertical_scroll_indicator.png b/selfdrive/assets/icons_mici/settings/vertical_scroll_indicator.png
new file mode 100644
index 000000000..f0e966354
Binary files /dev/null and b/selfdrive/assets/icons_mici/settings/vertical_scroll_indicator.png differ
diff --git a/selfdrive/assets/icons_mici/setup/back_new.png b/selfdrive/assets/icons_mici/setup/back_new.png
new file mode 100644
index 000000000..2c08818fd
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/back_new.png differ
diff --git a/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_check.png b/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_check.png
new file mode 100644
index 000000000..f6ef2063e
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_check.png differ
diff --git a/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_question.png b/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_question.png
new file mode 100644
index 000000000..c0abb7b14
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_question.png differ
diff --git a/selfdrive/assets/icons_mici/setup/green_button.png b/selfdrive/assets/icons_mici/setup/green_button.png
new file mode 100644
index 000000000..6432d23bb
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/green_button.png differ
diff --git a/selfdrive/assets/icons_mici/setup/green_button_pressed.png b/selfdrive/assets/icons_mici/setup/green_button_pressed.png
new file mode 100644
index 000000000..ac85054f6
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/green_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/setup/green_dm.png b/selfdrive/assets/icons_mici/setup/green_dm.png
new file mode 100644
index 000000000..863cc1a12
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/green_dm.png differ
diff --git a/selfdrive/assets/icons_mici/setup/green_info.png b/selfdrive/assets/icons_mici/setup/green_info.png
new file mode 100644
index 000000000..fcd53b299
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/green_info.png differ
diff --git a/selfdrive/assets/icons_mici/setup/medium_button_bg.png b/selfdrive/assets/icons_mici/setup/medium_button_bg.png
new file mode 100644
index 000000000..8cbcf2329
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/medium_button_bg.png differ
diff --git a/selfdrive/assets/icons_mici/setup/medium_button_pressed_bg.png b/selfdrive/assets/icons_mici/setup/medium_button_pressed_bg.png
new file mode 100644
index 000000000..905c6c92e
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/medium_button_pressed_bg.png differ
diff --git a/selfdrive/assets/icons_mici/setup/orange_dm.png b/selfdrive/assets/icons_mici/setup/orange_dm.png
new file mode 100644
index 000000000..87ffdaf1f
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/orange_dm.png differ
diff --git a/selfdrive/assets/icons_mici/setup/red_warning.png b/selfdrive/assets/icons_mici/setup/red_warning.png
new file mode 100644
index 000000000..ea712d50f
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/red_warning.png differ
diff --git a/selfdrive/assets/icons_mici/setup/reset/small_button.png b/selfdrive/assets/icons_mici/setup/reset/small_button.png
new file mode 100644
index 000000000..15d1215ef
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/reset/small_button.png differ
diff --git a/selfdrive/assets/icons_mici/setup/reset/small_button_pressed.png b/selfdrive/assets/icons_mici/setup/reset/small_button_pressed.png
new file mode 100644
index 000000000..44cbbd195
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/reset/small_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/setup/reset/wide_button.png b/selfdrive/assets/icons_mici/setup/reset/wide_button.png
new file mode 100644
index 000000000..6b0980104
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/reset/wide_button.png differ
diff --git a/selfdrive/assets/icons_mici/setup/reset/wide_button_pressed.png b/selfdrive/assets/icons_mici/setup/reset/wide_button_pressed.png
new file mode 100644
index 000000000..e5d9f4259
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/reset/wide_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/setup/restore.png b/selfdrive/assets/icons_mici/setup/restore.png
new file mode 100644
index 000000000..ef840da97
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/restore.png differ
diff --git a/selfdrive/assets/icons_mici/setup/scroll_down_indicator.png b/selfdrive/assets/icons_mici/setup/scroll_down_indicator.png
new file mode 100644
index 000000000..be7ddc41a
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/scroll_down_indicator.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_button.png b/selfdrive/assets/icons_mici/setup/small_button.png
new file mode 100644
index 000000000..eb9754d50
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_button.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_button_disabled.png b/selfdrive/assets/icons_mici/setup/small_button_disabled.png
new file mode 100644
index 000000000..d307d5478
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_button_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_button_pressed.png b/selfdrive/assets/icons_mici/setup/small_button_pressed.png
new file mode 100644
index 000000000..b31ba01fb
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_red_pill.png b/selfdrive/assets/icons_mici/setup/small_red_pill.png
new file mode 100644
index 000000000..e8b38046d
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_red_pill.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_red_pill_pressed.png b/selfdrive/assets/icons_mici/setup/small_red_pill_pressed.png
new file mode 100644
index 000000000..2e6aca32f
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_red_pill_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_slider/slider_arrow.png b/selfdrive/assets/icons_mici/setup/small_slider/slider_arrow.png
new file mode 100644
index 000000000..7c9e6f74c
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_slider/slider_arrow.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_slider/slider_bg.png b/selfdrive/assets/icons_mici/setup/small_slider/slider_bg.png
new file mode 100644
index 000000000..291dbd607
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_slider/slider_bg.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_slider/slider_bg_larger.png b/selfdrive/assets/icons_mici/setup/small_slider/slider_bg_larger.png
new file mode 100644
index 000000000..9a4e96af2
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_slider/slider_bg_larger.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_slider/slider_black_rounded_rectangle.png b/selfdrive/assets/icons_mici/setup/small_slider/slider_black_rounded_rectangle.png
new file mode 100644
index 000000000..1c7e3b09b
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_slider/slider_black_rounded_rectangle.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png b/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png
new file mode 100644
index 000000000..c74e4c8e3
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png differ
diff --git a/selfdrive/assets/icons_mici/setup/small_slider/slider_red_circle.png b/selfdrive/assets/icons_mici/setup/small_slider/slider_red_circle.png
new file mode 100644
index 000000000..cec31dcc8
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/small_slider/slider_red_circle.png differ
diff --git a/selfdrive/assets/icons_mici/setup/smaller_button.png b/selfdrive/assets/icons_mici/setup/smaller_button.png
new file mode 100644
index 000000000..35293936a
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/smaller_button.png differ
diff --git a/selfdrive/assets/icons_mici/setup/smaller_button_disabled.png b/selfdrive/assets/icons_mici/setup/smaller_button_disabled.png
new file mode 100644
index 000000000..d10e0fe33
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/smaller_button_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/setup/smaller_button_pressed.png b/selfdrive/assets/icons_mici/setup/smaller_button_pressed.png
new file mode 100644
index 000000000..58d24382a
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/smaller_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/setup/warning.png b/selfdrive/assets/icons_mici/setup/warning.png
new file mode 100644
index 000000000..0113ceb76
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/warning.png differ
diff --git a/selfdrive/assets/icons_mici/setup/widish_button.png b/selfdrive/assets/icons_mici/setup/widish_button.png
new file mode 100644
index 000000000..ffaecc673
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/widish_button.png differ
diff --git a/selfdrive/assets/icons_mici/setup/widish_button_disabled.png b/selfdrive/assets/icons_mici/setup/widish_button_disabled.png
new file mode 100644
index 000000000..d192accff
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/widish_button_disabled.png differ
diff --git a/selfdrive/assets/icons_mici/setup/widish_button_pressed.png b/selfdrive/assets/icons_mici/setup/widish_button_pressed.png
new file mode 100644
index 000000000..72a4c3181
Binary files /dev/null and b/selfdrive/assets/icons_mici/setup/widish_button_pressed.png differ
diff --git a/selfdrive/assets/icons_mici/speedometer.png b/selfdrive/assets/icons_mici/speedometer.png
new file mode 100644
index 000000000..105c8f070
Binary files /dev/null and b/selfdrive/assets/icons_mici/speedometer.png differ
diff --git a/selfdrive/assets/icons_mici/ssh_short.png b/selfdrive/assets/icons_mici/ssh_short.png
new file mode 100644
index 000000000..128d8d5a4
Binary files /dev/null and b/selfdrive/assets/icons_mici/ssh_short.png differ
diff --git a/selfdrive/assets/icons_mici/tethering_short.png b/selfdrive/assets/icons_mici/tethering_short.png
new file mode 100644
index 000000000..0b905f2f2
Binary files /dev/null and b/selfdrive/assets/icons_mici/tethering_short.png differ
diff --git a/selfdrive/assets/icons_mici/turn_intent_left.png b/selfdrive/assets/icons_mici/turn_intent_left.png
new file mode 100644
index 000000000..3815158c9
Binary files /dev/null and b/selfdrive/assets/icons_mici/turn_intent_left.png differ
diff --git a/selfdrive/assets/icons_mici/turn_intent_right.png b/selfdrive/assets/icons_mici/turn_intent_right.png
new file mode 100644
index 000000000..0afe64541
Binary files /dev/null and b/selfdrive/assets/icons_mici/turn_intent_right.png differ
diff --git a/selfdrive/assets/icons_mici/wheel.png b/selfdrive/assets/icons_mici/wheel.png
new file mode 100644
index 000000000..c5a0acf2c
Binary files /dev/null and b/selfdrive/assets/icons_mici/wheel.png differ
diff --git a/selfdrive/assets/icons_mici/wheel_critical.png b/selfdrive/assets/icons_mici/wheel_critical.png
new file mode 100644
index 000000000..3c399916d
Binary files /dev/null and b/selfdrive/assets/icons_mici/wheel_critical.png differ
diff --git a/selfdrive/assets/images/Background.png b/selfdrive/assets/images/Background.png
new file mode 100644
index 000000000..8cde2812e
Binary files /dev/null and b/selfdrive/assets/images/Background.png differ
diff --git a/selfdrive/assets/images/button_continue_triangle.png b/selfdrive/assets/images/button_continue_triangle.png
new file mode 100644
index 000000000..eeacfeb83
Binary files /dev/null and b/selfdrive/assets/images/button_continue_triangle.png differ
diff --git a/selfdrive/assets/images/button_continue_triangle.svg b/selfdrive/assets/images/button_continue_triangle.svg
new file mode 100644
index 000000000..814b36c4b
--- /dev/null
+++ b/selfdrive/assets/images/button_continue_triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/images/button_flag.png b/selfdrive/assets/images/button_flag.png
new file mode 100644
index 000000000..cac4db6d4
Binary files /dev/null and b/selfdrive/assets/images/button_flag.png differ
diff --git a/selfdrive/assets/images/button_home.png b/selfdrive/assets/images/button_home.png
new file mode 100644
index 000000000..9f52faf9e
Binary files /dev/null and b/selfdrive/assets/images/button_home.png differ
diff --git a/selfdrive/assets/images/button_settings.png b/selfdrive/assets/images/button_settings.png
new file mode 100644
index 000000000..e04262b88
Binary files /dev/null and b/selfdrive/assets/images/button_settings.png differ
diff --git a/selfdrive/assets/images/k3_spinner.png b/selfdrive/assets/images/k3_spinner.png
new file mode 100644
index 000000000..b7eb9cc64
Binary files /dev/null and b/selfdrive/assets/images/k3_spinner.png differ
diff --git a/selfdrive/assets/images/spinner_comma.png b/selfdrive/assets/images/spinner_comma.png
new file mode 100644
index 000000000..d9f6543b8
Binary files /dev/null and b/selfdrive/assets/images/spinner_comma.png differ
diff --git a/selfdrive/assets/images/spinner_track.png b/selfdrive/assets/images/spinner_track.png
new file mode 100644
index 000000000..931c17e83
Binary files /dev/null and b/selfdrive/assets/images/spinner_track.png differ
diff --git a/selfdrive/assets/offroad/fcc.html b/selfdrive/assets/offroad/fcc.html
new file mode 100644
index 000000000..960a7a06c
--- /dev/null
+++ b/selfdrive/assets/offroad/fcc.html
@@ -0,0 +1,55 @@
+
+
+ Supplier's Declaration of Conformity: 47 CFR § 2.1077 Compliance Information
+
+ Unique Identifier
+ comma three
+
+ Authorized Components
+
+ Thundersoft TurboX D845 SOM
+ FCC ID: 2AOHHTURBOXSOMD845
+
+ Quectel/EG25-G
+ FCC ID: XMR201903EG25G
+ This device complies with Part 15 of the FCC Rules.
+ Operation is subject to the following two conditions:
+
+ (1) this device may not cause harmful interference, and
+ (2) this device must accept any interference received, including interference that may cause undesired operation.
+
+ The following test reports are subject to this declaration:
+ Test report number: HR20191001605
+ Issue date: 2019-2-21
+
+ The following manufacturer/importer/entity (located in the USA) is responsible for this declaration:
+ Company name: Quectel Wireless Solutions Co., Ltd.
+ Name/Title (legal representative): Yin JiXiong
+ Address: 7th Floor, Hongye Building, No.1801 Hongmei Road, Xuhui District, Shanghai 200233, China
+ Phone: +8602150086326 Extension: 800
+ Fax: +862153253668
+ E-mail: johnny.xiang@quectel.com
+
+
+ Responsible Party - U.S. Contact Information
+ comma.ai
+ 501 W Broadway St
+ STE A #403
+ San Diego, California
+ 92101
+ United States
+ support@comma.ai
+
+ FCC Compliance Statement
+ This device complies with part 15 of the FCC Rules. Operation is subject to the following two conditions: (1) This device may not cause harmful interference, and (2) this device must accept any interference received, including interference that may cause undesired operation. Note: This equipment has been tested and found to comply with the limits for a Class B digital device, pursuant to part 15 of the FCC Rules. These limits are designed to provide reasonable protection against harmful interference in a residential installation.
+ This equipment generates, uses, and can radiate radio frequency energy and, if not installed and used in accordance with the instructions, may cause harmful interference to radio communications. However, there is no guarantee that interference will not occur in a particular installation.
+ If this equipment does cause harmful interference to radio or television reception, which can be determined by turning the equipment off and on, the user is encouraged to try to correct the interference by one or more of the following measures:
+ Reorient or relocate the receiving antenna.
+ Increase the separation between the equipment and receiver.
+ Connect the equipment to an outlet on a circuit different from that to which the receiver is connected.
+ Consult the dealer or an experienced radio/TV technician for help.
+ Changes or modifications to this product not expressly approved by the party responsible for compliance could void the electromagnetic compatibility (EMC) and wireless compliance and negate your authority to operate the product.
+ This product has demonstrated EMC compliance under conditions that included the use of compliant peripheral devices and shielded cables between system components. It is important that you use compliant peripheral devices and shielded cables between system components to reduce the possibility of causing interference to radios, televisions, and other electronic devices.
+ The radiated output power of this device meets the limits of FCC/IC radio frequency exposure limits. This device should be operated with a minimum separation distance of 20 cm (8 inches) between the equipment and a person's body.
+
+